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/KQ/KDEgg/KDEggObjectRoutine.lua

407 lines
7.6 KiB

--[[***** *****]]--
--[[***** 지뢰 처리 루틴 메인 *****]]--
--[[***** : *****]]--
--[[***** *****]]--
MineMemory = {} -- 개별 메모리로 처리
function MineRoutine( Handle, MapIndex )
cExecCheck( "MineRoutine" )
local Var = MineMemory[Handle]
if Var == nil then
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
if Var["Master"] == nil then
cAIScriptSet( Handle )
cNPCVanish( Handle )
MineMemory[Handle] = nil
return ReturnAI["END"]
end
if cPlayerExist( Var["Master"] ) == nil then
cAIScriptSet( Handle )
cNPCVanish( Var["Handle"] )
MineMemory[Handle] = nil
return ReturnAI["END"]
end
if cIsObjectDead( Handle ) then
cAIScriptSet( Handle )
MineMemory[Handle] = nil
return ReturnAI["END"]
end
if InstanceField[MapIndex] == nil then
MineMemory[Handle] = nil
return ReturnAI["END"]
end
local CurSec = cCurrentSecond()
if Var["BoomFlag"] ~= nil then
if Var["RegenTime"] + Var["Data"]["HitTime"] < CurSec then
if InstanceField[MapIndex]["WaveRunner"] ~= nil then
local ObjList = { cNearObjectList( Var["Handle"], Var["Data"]["Range"], ObjectType["Mob"] ) }
for index, value in pairs( ObjList ) do
local obj = InstanceField[MapIndex]["WaveRunner"][value]
if obj ~= nil and cIsObjectDead( value ) == nil then
cDamaged( value, Var["Data"]["Damage"], Var["Master"] )
local Abstate = AbstateTypeTable[Var["Data"]["AbstateType"]]
if Abstate ~= nil then
cSetAbstate( value, Abstate["Index"], 1, Abstate["KeepTime"], Var["Handle"] )
end
end
end
end
Var["BoomFlag"] = nil
end
end
if Var["RegenTime"] + Var["Data"]["LifeTime"] < CurSec then
MineMemory[Handle] = nil
end
return ReturnAI["END"]
end
--[[***** *****]]--
--[[***** 메인오브젝트 처리 루틴 메인 *****]]--
--[[***** : *****]]--
--[[***** *****]]--
function MainObjRoutine( Handle, MapIndex )
cExecCheck( "MainObjRoutine" )
if InstanceField[MapIndex] == nil then
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
local Var = InstanceField[MapIndex]["MainObj"]
if Var == nil then
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
if cIsObjectDead( Handle ) then
cAIScriptSet( Handle )
InstanceField[MapIndex]["MainObj"] = nil
return ReturnAI["END"]
end
if InstanceField[Var["MapIndex"]]["WaveRunner"] == nil then
return ReturnAI["END"]
end
-- 체크 딜레이
local CurSec = cCurrentSecond()
if Var["LastCheckTime"] + DEF_TYPE_CHK_DLY > CurSec then
return
end
Var["LastCheckTime"] = CurSec
local ObjList = { cNearObjectList( Var["Handle"], Var["Data"]["DamageRange"], ObjectType["Mob"] ) }
local tmpHP = Var["CurHP"]
for index, value in pairs( ObjList ) do
local obj = InstanceField[Var["MapIndex"]]["WaveRunner"][value]
if obj ~= nil then
Var["CurHP"] = Var["CurHP"] - obj["Damage"]
-- 웨이브몹 제거
InstanceField[Var["MapIndex"]]["WaveRunner"][value] = nil
cAIScriptSet( value )
cNPCVanish( value )
if Var["CurHP"] <= 0 then
break
end
end
end
-- hp 변화가 있는지 체크
if tmpHP == Var["CurHP"] then
return ReturnAI["END"]
end
if Var["CurHP"] >= 0 then
local hprate = 0
hprate = (Var["CurHP"] / MainDefenceObject["HP"]) * 100
hprate = math.floor( hprate )
cScriptMessage( Var["MapIndex"], AnnounceInfo["KDEgg_EggHp"], hprate )
end
return ReturnAI["END"]
end
--[[***** *****]]--
--[[***** 몹 처리 루틴 메인 *****]]--
--[[***** : *****]]--
--[[***** *****]]--
function MobRoutine( Handle, MapIndex )
cExecCheck( "MobRoutine" )
if InstanceField[MapIndex] == nil then
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
if InstanceField[MapIndex]["WaveRunner"] == nil then
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
local Var = InstanceField[MapIndex]["WaveRunner"][Handle]
if Var == nil then
cAIScriptSet( Handle )
return ReturnAI["END"]
end
if cIsObjectDead( Handle ) then
if Var["MobChatType"] ~= nil then
if Var["MobChatType"]["DieChatRate"] ~= nil and Var["MobChatType"]["Die"] ~= nil then
if cRandomInt( 1, 100 ) < Var["MobChatType"]["DieChatRate"] then
local MobChatNum = cRandomInt( 1, #Var["MobChatType"]["Die"] )
cMobChat( Var["Handle"], Var["MobChatType"]["Die"][MobChatNum]["FileName"], Var["MobChatType"]["Die"][MobChatNum]["Index"] )
end
end
end
cAIScriptSet( Handle )
InstanceField[MapIndex]["WaveRunner"][Handle] = nil
return ReturnAI["END"]
end
MobChatProcess ( Var )
PathTypeProcess ( Var ) -- 경로가 존재하는경우 처리
return ReturnAI["END"]
end
-- 이동 상태값 flag
MOVESTATE = {}
MOVESTATE["STOP"] = "STOP"
MOVESTATE["MOVE"] = "MOVE"
--[[ ]]--
--[[ PathType에 따라 몹 이동 처리 ]]--
--[[ ]]--
function PathTypeProcess( Var )
cExecCheck( "PathTypeProcess" )
if Var == nil then
return
end
if Var["PathType"] == nil then
return
end
if Var["PathProgress"] == nil then
local PathProgress = {}
PathProgress["GoalCheckTime"] = cCurrentSecond()
PathProgress["CurPathStep"] = 1
PathProgress["CurMoveState"] = MOVESTATE["STOP"]
Var["PathProgress"] = PathProgress
end
if Var["PathProgress"]["CurPathStep"] > #Var["PathType"] then
Var["PathType"] = nil
Var["PathProgress"] = nil
return
end
if Var["PathProgress"]["CurMoveState"] == MOVESTATE["STOP"] then
if cWillMovement( Var["Handle"] ) == nil then
return
end
cRunTo( Var["Handle"],
Var["PathType"][Var["PathProgress"]["CurPathStep"]]["x"],
Var["PathType"][Var["PathProgress"]["CurPathStep"]]["y"],
1000 )
Var["PathProgress"]["CurMoveState"] = MOVESTATE["MOVE"]
end
if Var["PathProgress"]["CurMoveState"] == MOVESTATE["MOVE"] then
if cWillMovement( Var["Handle"] ) == nil then -- 움직일 수 없는 상태
Var["PathProgress"]["CurMoveState"] = MOVESTATE["STOP"]
return
end
end
local CurSec = cCurrentSecond()
if Var["PathProgress"]["GoalCheckTime"] + PATHTYPE_CHK_DLY > CurSec then
return
end
Var["PathProgress"]["GoalCheckTime"] = CurSec
-- 목표점 체크
local curr = {}
local goal = {}
curr["x"], curr["y"] = cObjectLocate( Var["Handle"] )
goal["x"] = Var["PathType"][Var["PathProgress"]["CurPathStep"]]["x"]
goal["y"] = Var["PathType"][Var["PathProgress"]["CurPathStep"]]["y"]
local dx = goal["x"] - curr["x"]
local dy = goal["y"] - curr["y"]
local distsquar = dx * dx + dy * dy
if distsquar < PATHTYPE_GAP then
Var["PathProgress"]["CurPathStep"] = Var["PathProgress"]["CurPathStep"] + 1
Var["PathProgress"]["CurMoveState"] = MOVESTATE["STOP"]
return
end
curr["x"], curr["y"] = cMove2Where( Var["Handle"] )
if curr["x"] ~= goal["x"] and curr["y"] ~= goal["y"] then
cRunTo( Var["Handle"],
Var["PathType"][Var["PathProgress"]["CurPathStep"]]["x"],
Var["PathType"][Var["PathProgress"]["CurPathStep"]]["y"],
1000 )
end
return
end
--[[ ]]--
--[[ MobChatType에 따라 몹챗 처리 ]]--
--[[ ]]--
function MobChatProcess( Var )
cExecCheck( "MobChatProcess" )
if Var == nil then
return
end
if Var["MobChatType"] == nil then
return
end
if Var["MobChatTime"] == nil then
return
end
local CurSec = cCurrentSecond()
if Var["MobChatTime"] <= CurSec then
local MobChatNum = cRandomInt( 1, #Var["MobChatType"]["Normal"] )
cMobChat( Var["Handle"], Var["MobChatType"]["Normal"][MobChatNum]["FileName"], Var["MobChatType"]["Normal"][MobChatNum]["Index"] )
Var["MobChatTime"] = nil
end
end