You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
SigFiesta/LuaScript/AIScript/E_CacaoBud.lua

401 lines
7.6 KiB

require( "common" )
EVENT_DATA =
{ ----------------------
--[[ 1~ 40 ]]
{
--[[최소레벨]] MinLev = 1,
--[[최대레벨]] MaxLev = 40,
--[[ 소환몹 ]] MobIndex = "E_CaCaoSlime",
--[[공격모션]] AniIndex = "Slime_Attack1_1",
--[[ 장소 ]] MapIndex = "RouCos02",
--[[성공몹챗]] SucChat = "My favorite fruit! Raise some more and eat it later.",
--[[실패몹챗]] FailChat = "Well. That was nothing worth keeping.",
},
--[[ 41~ 80 ]]
{
--[[최소레벨]] MinLev = 41,
--[[최대레벨]] MaxLev = 80,
--[[ 소환몹 ]] MobIndex = "E_CaCaoPrisoner",
--[[공격모션]] AniIndex = "Prisoner_Attack1_1",
--[[ 장소 ]] MapIndex = "EldCem01",
--[[성공몹챗]] SucChat = "What is this? Would it grow a Cacao fruit?",
--[[실패몹챗]] FailChat = "Hmm.. Well that was a failed attempt.",
},
--[[ 81~115 ]]
{
--[[최소레벨]] MinLev = 81,
--[[최대레벨]] MaxLev = 125,
--[[ 소환몹 ]] MobIndex = "E_CaCaoMineMole",
--[[공격모션]] AniIndex = "Mole_attack",
--[[ 장소 ]] MapIndex = "UrgFire01",
--[[성공몹챗]] SucChat = "Wow, that's great. I was hungry. Raise it well.",
--[[실패몹챗]] FailChat = "Yuck! What flavor is this suppose to be?",
},
} ----------------------
EVENT_FAIL_MAP = "ValenCaCao_UseFail_Map"
EVENT_FAIL_ITEM = "ValenCaCao_UseFail_Item"
EVENT_MOB_REGEN_DIST = 600
EVENT_MOB_STOP_INTERVAL = 40
EVENT_MOB_STOP_CHK_DIST = ((EVENT_MOB_STOP_INTERVAL + 10) * (EVENT_MOB_STOP_INTERVAL + 10))
EVENT_SUC_PERCENT = 50
EVENT_SUC_DROP_ITEM = "E_CacaoBean"
EVENT_MOB_DEF_DEAD_TIME = 50
EVENT_MOB_END_DEAD_TIME = 5
MemBlock = {}
function E_CacaoBud( Handle, MapIndex )
cExecCheck( "E_CacaoBud" )
if cIsObjectDead( Handle ) == 1 then
cAIScriptSet( Handle )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
local Var = MemBlock[Handle]
if Var ~= nil then
-- 기존 마스터 번호랑 지금 번호랑 다르면 초기화
local CurMaster = cGetMaster( Handle )
if CurMaster == nil then
cAIScriptSet( Handle )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
if Var["Master"] ~= CurMaster then
MemBlock[Handle] = nil
return ReturnAI["END"]
end
if cPlayerExist( Var["Master"] ) == nil then
cAIScriptSet( Handle )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
end
if Var == nil then
MemBlock[Handle] = {}
Var = MemBlock[Handle]
Var["MapIndex"] = MapIndex
Var["Handle"] = Handle
-- 마스터 체크
-- 실패시 메시지 대상 알기 위해 마스터핸들부터 구함
Var["Master"] = cGetMaster( Var["Handle"] )
if Var["Master"] == nil then
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
-- 맵 체크
for i = 1, #EVENT_DATA do
if Var["MapIndex"] == EVENT_DATA[i]["MapIndex"] then
Var["GroupNum"] = i
break
end
end
if Var["GroupNum"] == nil then
cScriptMessage_Obj( Var["Master"], EVENT_FAIL_MAP )
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
-- 마스터 레벨 체크
local MasterLv = cGetLevel( Var["Master"] )
if MasterLv == nil then
cScriptMessage_Obj( Var["Master"], EVENT_FAIL_ITEM )
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
if MasterLv < EVENT_DATA[Var["GroupNum"]]["MinLev"] or
MasterLv > EVENT_DATA[Var["GroupNum"]]["MaxLev"] then
cScriptMessage_Obj( Var["Master"], EVENT_FAIL_MAP )
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
-- 소환된 카카오씨앗의 좌표
-- 부터 특정 거리의 랜덤 방향의 좌표를 구하고
-- 그 좌표에 이벤트몹을 소환하고
-- 카카오씨앗으로 이벤트몹 이동
local dir = cRandomInt( 1, 90 ) * 4
local locX, locY = cGetAroundCoord( Var["Handle"], dir, EVENT_MOB_REGEN_DIST )
if locX == nil or locY == nil then
cScriptMessage_Obj( Var["Master"], EVENT_FAIL_ITEM )
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
Var["EventMob"] = cMobRegen_XY( Var["MapIndex"], EVENT_DATA[Var["GroupNum"]]["MobIndex"], locX, locY, dir )
if Var["EventMob"] == nil then
cScriptMessage_Obj( Var["Master"], EVENT_FAIL_ITEM )
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
if cAIScriptSet( Var["EventMob"], Var["Handle"] ) == nil then
cScriptMessage_Obj( Var["Master"], EVENT_FAIL_ITEM )
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
cNPCVanish( Var["EventMob"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
if cAIScriptFunc( Var["EventMob"], "Entrance", "EventMobMain" ) == nil then
cScriptMessage_Obj( Var["Master"], EVENT_FAIL_ITEM )
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
cNPCVanish( Var["EventMob"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
MemBlock[Var["EventMob"]] = {}
MemBlock[Var["EventMob"]]["DeadTime"] = cCurrentSecond() + EVENT_MOB_DEF_DEAD_TIME
cFollow( Var["EventMob"], Var["Handle"], EVENT_MOB_STOP_INTERVAL, 10000 )
-- 필요한 변수 초기화
Var["ChkTime"] = cCurrentSecond()
Var["EventStep"] = 1
Var["EventMobRegenX"] = locX
Var["EventMobRegenY"] = locY
end
-- 이벤트몹 체크
if Var["EventMob"] == nil then
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
if cIsObjectDead( Var["EventMob"] ) == 1 then
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
local CurSec = cCurrentSecond()
-- 거리 체크하며 대기
if Var["EventStep"] == 1 then
if Var["ChkTime"] <= CurSec then
Var["ChkTime"] = CurSec + 1
if cDistanceSquar( Var["Handle"], Var["EventMob"] ) <= EVENT_MOB_STOP_CHK_DIST then
cAnimate( Var["EventMob"], "start", EVENT_DATA[Var["GroupNum"]]["AniIndex"] )
Var["ChkTime"] = CurSec + 2
Var["EventStep"] = Var["EventStep"] + 1
end
end
-- 성공 실패 체크
elseif Var["EventStep"] == 2 then
if Var["ChkTime"] <= CurSec then
local rndNum = cRandomInt( 1, 100 )
if rndNum >= EVENT_SUC_PERCENT then
-- 성공
cNPCChatTest( Var["EventMob"], EVENT_DATA[Var["GroupNum"]]["SucChat"] )
cDropItem( EVENT_SUC_DROP_ITEM, Var["Handle"], Var["Master"], 1000000 )
else
-- 실패
cNPCChatTest( Var["EventMob"], EVENT_DATA[Var["GroupNum"]]["FailChat"] )
end
cAnimate( Var["EventMob"], "stop" )
Var["ChkTime"] = CurSec + 2
Var["EventStep"] = Var["EventStep"] + 1
end
-- 몹 원위치, 종료
elseif Var["EventStep"] == 3 then
if Var["ChkTime"] <= CurSec then
cRunTo( Var["EventMob"], Var["EventMobRegenX"], Var["EventMobRegenY"] )
MemBlock[Var["EventMob"]]["DeadTime"] = CurSec + EVENT_MOB_END_DEAD_TIME
cAIScriptSet( Var["Handle"] )
cNPCVanish( Var["Handle"] )
MemBlock[Handle] = nil
end
end
return ReturnAI["END"]
end
-- 이벤트몹 처리 함수
-- 아무 처리 안하고 DeadTime이 설정되면 DeadTime 이후에 제거
function EventMobMain( Handle, MapIndex )
cExecCheck( "EventMobMain" )
if cIsObjectDead( Handle ) == 1 then
cAIScriptSet( Handle )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
local Var = MemBlock[Handle]
if Var == nil then
cAIScriptSet( Handle )
cNPCVanish( Handle )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
if Var["DeadTime"] ~= nil then
if Var["DeadTime"] <= cCurrentSecond() then
cAIScriptSet( Handle )
cNPCVanish( Handle )
MemBlock[Handle] = nil
return ReturnAI["END"]
end
end
return ReturnAI["END"]
end