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.
 
 

1205 lines
24 KiB

--------------------------------------------------------------------------------
-- Seiren Castle Routine --
--------------------------------------------------------------------------------
function DummyRoutineFunc( )
cExecCheck "DummyRoutineFunc"
end
function PlayerMapLogin( MapIndex, Handle )
cExecCheck "PlayerMapLogin"
if MapIndex == nil
then
DebugLog( "PlayerMapLogin::MapIndex == nil")
return
end
if Handle == nil
then
DebugLog( "PlayerMapLogin::Handle == nil")
return
end
local Var = InstanceField[ MapIndex ]
if Var == nil
then
DebugLog( "PlayerMapLogin::Var == nil")
return
end
-- 첫 플레이어의 맵 로그인 체크
Var["bPlayerMapLogin"] = true
end
--------------------------------------------------------------------------------
-- Routine Function
--------------------------------------------------------------------------------
function Routine_Normal( Handle, MapIndex )
cExecCheck "Routine_Normal"
-- 함수 인자 확인
if Handle == nil
then
ErrorLog( "Routine_Normal::Handle == nil" )
return ReturnAI["END"]
end
if MapIndex == nil
then
ErrorLog( "Routine_Normal::MapIndex == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 필드 버퍼 확인
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Routine_Normal::Var == nil"..MapIndex )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 0.2초마다 확인하는 루틴
if Var["RoutineTime"][ Handle ] <= cCurrentSecond()
then
Var["RoutineTime"][ Handle ] = cCurrentSecond() + 0.2
else
return ReturnAI["CPP"]
end
-- 보스 몬스터가 죽었는지 확인
if cIsObjectDead( Handle ) == nil
then
return ReturnAI["CPP"]
end
-- 보스 몬스터가 할 일이 끝났으면, 보스 몬스터의 버퍼를 nil 로 초기화 해준다
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
return ReturnAI["CPP"]
end
function Routine_DropItem( Handle, MapIndex )
cExecCheck "Routine_DropItem"
-- 함수 인자 확인
if Handle == nil
then
ErrorLog( "Routine_DropItem::Handle == nil" )
return ReturnAI["END"]
end
if MapIndex == nil
then
ErrorLog( "Routine_DropItem::MapIndex == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 필드 버퍼 확인
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Routine_DropItem::Var == nil"..MapIndex )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 0.2초마다 확인하는 루틴
if Var["RoutineTime"][ Handle ] <= cCurrentSecond()
then
Var["RoutineTime"][ Handle ] = cCurrentSecond() + 0.2
else
return ReturnAI["CPP"]
end
-- 보스 몬스터가 죽었는지 확인
if cIsObjectDead( Handle ) == nil
then
return ReturnAI["CPP"]
end
-- 보스 몬스터의 버퍼가 있는지 확인
if Var["Enemy"][ Handle ] == nil
then
ErrorLog( "Routine_DropItem::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 보스 몬스터의 정보가 있는지 확인
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
if CurBossInfo == nil
then
ErrorLog( "Routine_DropItem::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 아이템 드랍 정보가 있는지 확인
local CurItemDeopList = CurBossInfo[ "ItemDropList" ]
if CurItemDeopList == nil
then
ErrorLog( "Routine_DropItem::CurItemDeopList == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 드랍 확률 합
local nMaxDropRate = 0
for i = 1, #CurItemDeopList
do
nMaxDropRate = nMaxDropRate + CurItemDeopList[ i ]["DropRate"]
end
-- 드랍 확률
local nCurDropRate = cRandomInt( 1, nMaxDropRate )
for i = 1, #CurItemDeopList
do
nCurDropRate = nCurDropRate - CurItemDeopList[ i ]["DropRate"]
-- 아이템 드랍
if nCurDropRate <= 0
then
cDropItem( CurItemDeopList[ i ]["Index"], Handle, Handle, 1000000, true )
break
end
end
-- 보스 몬스터가 할 일이 끝났으면, 보스 몬스터의 버퍼를 nil 로 초기화 해준다
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
return ReturnAI["CPP"]
end
function Routine_PortalRegen( Handle, MapIndex )
cExecCheck "Routine_PortalRegen"
-- 함수 인자 확인
if Handle == nil
then
ErrorLog( "Routine_PortalRegen::Handle == nil" )
return ReturnAI["END"]
end
if MapIndex == nil
then
ErrorLog( "Routine_PortalRegen::MapIndex == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 필드 버퍼 확인
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Routine_PortalRegen::Var == nil"..MapIndex )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 0.2초마다 확인하는 루틴
if Var["RoutineTime"][ Handle ] <= cCurrentSecond()
then
Var["RoutineTime"][ Handle ] = cCurrentSecond() + 0.2
else
return ReturnAI["CPP"]
end
-- 보스 몬스터가 죽었는지 확인
if cIsObjectDead( Handle ) == nil
then
return ReturnAI["CPP"]
end
-- 보스 몬스터의 버퍼가 있는지 확인
if Var["Enemy"][ Handle ] == nil
then
ErrorLog( "Routine_PortalRegen::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 보스 몬스터의 정보가 있는지 확인
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
if CurBossInfo == nil
then
ErrorLog( "Routine_PortalRegen::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 확인 대상이 있을때, 대상도 죽었는지 확인
if CurBossInfo["BossDeadCheck"] ~= nil
then
local DeadBossHandle = Var["Enemy"][ CurBossInfo["BossDeadCheck"] ]
if DeadBossHandle ~= nil
then
if cIsObjectDead( DeadBossHandle ) == nil
then
return ReturnAI["CPP"]
end
end
end
-- 생성할 포탈 정보가 있는지 확인
local CurRegenPortalName = CurBossInfo["PortalName"]
local CurRegenPortal = RegenInfo["Stuff"][ CurRegenPortalName ]
if CurRegenPortal == nil
then
ErrorLog( "Routine_PortalRegen::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
return ReturnAI["END"]
end
-- 포탈이 생성되어 있는지 확인
if Var["Portal"][ CurRegenPortalName ] == nil
then
-- 포탈 생성 / 포탈 정보 설정
local nPortalHandle = cDoorBuild( Var["MapIndex"], CurRegenPortal["Index"], CurRegenPortal["x"], CurRegenPortal["y"], CurRegenPortal["dir"], CurRegenPortal["scale"] )
if nPortalHandle == nil
then
ErrorLog( "Routine_PortalRegen::Portal was not created. : "..CurRegenPortalName )
else
if cSetAIScript ( MainLuaScriptPath, nPortalHandle ) == nil
then
ErrorLog( "Routine_PortalRegen::cSetAIScript ( MainLuaScriptPath, nPortalHandle ) == nil" )
end
if cAIScriptFunc( nPortalHandle, "NPCClick", "Click_Portal" ) == nil
then
ErrorLog( "Routine_PortalRegen::cAIScriptFunc( nPortalHandle, \"NPCClick\", \"Click_Portal\" )" )
end
Var["Portal"][ nPortalHandle ] = {}
Var["Portal"][ nPortalHandle ]["Info"] = PortalInfo[ CurRegenPortalName ]
Var["Portal"][ nPortalHandle ]["Use"] = false
Var["Portal"][ CurRegenPortalName ] = nPortalHandle
end
end
-- 보스 몬스터가 할 일이 끝났으면, 보스 몬스터의 버퍼를 nil 로 초기화 해준다
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
return ReturnAI["CPP"]
end
function Routine_Hayreddin( Handle, MapIndex )
cExecCheck "Routine_Hayreddin"
-- 함수 인자 확인
if Handle == nil
then
ErrorLog( "Routine_Hayreddin::Handle == nil" )
return ReturnAI["END"]
end
if MapIndex == nil
then
ErrorLog( "Routine_Hayreddin::MapIndex == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 필드 버퍼 확인
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Routine_Hayreddin::Var == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 하이레딘 죽었는지 확인
if cIsObjectDead( Handle ) ~= nil
then
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 하이레딘 버퍼가 있는지 확인
if Var["Enemy"][ Handle ] == nil
then
ErrorLog( "Routine_Hayreddin::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 하이레딘 정보가 있는지 확인
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
if CurBossInfo == nil
then
ErrorLog( "Routine_Hayreddin::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 하이레딘 페이즈 번호 확인
local PhaseNumber = Var["Enemy"][ Handle ]["Phase"]
if PhaseNumber == nil
then
ErrorLog( "Routine_Hayreddin::PhaseNumber == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 하이레딘 페이즈 정보 확인
local PhaseInfo = CurBossInfo["Phase"]
if PhaseInfo == nil
then
ErrorLog( "Routine_Hayreddin::PhaseInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 하이레딘 진행된 페이즈 번호 확인
if PhaseNumber < 0 or PhaseNumber > #PhaseInfo
then
return ReturnAI["END"]
end
-- 현재 페이즈 정보 확인
local CurPhaseInfo = PhaseInfo[ PhaseNumber ]
if CurPhaseInfo == nil
then
ErrorLog( "Routine_Hayreddin::CurPhaseInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["CPP"]
end
-- HP 조건 확인
if CurPhaseInfo["Condition_HPRate"] ~= nil
then
-- 하이레딘 HP 정보
local nCurHP, nMaxHP = cObjectHP( Handle )
if nCurHP == nil or nMaxHP == nil
then
ErrorLog( "Routine_Hayreddin::nCurHP == nil or nMaxHP == nil" )
return ReturnAI["CPP"]
end
local nCurHPRate = nCurHP / nMaxHP * 100
if nCurHPRate > CurPhaseInfo["Condition_HPRate"]
then
return ReturnAI["CPP"]
end
end
-- 위치 조건 확인
if CurPhaseInfo["Condition_Locate"] ~= nil
then
-- 하이레딘 위치 정보
local Loc_x, Loc_y = cObjectLocate( Handle )
if Loc_x == nil or Loc_y == nil
then
ErrorLog( "Routine_Hayreddin::Loc_x == nil or Loc_y == nil" )
return ReturnAI["CPP"]
end
local DistSquar = cDistanceSquar( Loc_x, Loc_y, CurPhaseInfo["Condition_Locate"]["x"], CurPhaseInfo["Condition_Locate"]["y"] )
if DistSquar > 10 * 10
then
return ReturnAI["END"]
end
end
-- 하이레딘 도주
if CurPhaseInfo["RunTo"] ~= nil
then
cRunTo( Handle, CurPhaseInfo["RunTo"]["x"], CurPhaseInfo["RunTo"]["y"], 1000 )
end
-- 다이얼 로그 출력
if CurPhaseInfo["DialogInfo"] ~= nil
then
cMobDialog( Var["MapIndex"], CurPhaseInfo["DialogInfo"]["SpeakerIndex"], ChatInfo["ScriptFileName"], CurPhaseInfo["DialogInfo"]["Index"] )
end
-- 문 열기
if CurPhaseInfo["DoorOpen"] ~= nil
then
local nCurDoorHandle = Var["Door"][ CurPhaseInfo["DoorOpen"] ]
if nCurDoorHandle ~= nil
then
if Var["Door"][ nCurDoorHandle ] ~= nil
then
cDoorAction( nCurDoorHandle, Var["Door"][ nCurDoorHandle ]["Info"]["Block"], "open" )
Var["Door"][ nCurDoorHandle ]["IsOpen"] = true
end
end
end
-- 하이레딘 삭제
if CurPhaseInfo["BossVanish"] == true
then
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 다음 페이즈 설정
Var["Enemy"][ Handle ]["Phase"] = PhaseNumber + 1
return ReturnAI["END"]
end
function Routine_Freloan( Handle, MapIndex )
cExecCheck "Routine_Freloan"
-- 함수 인자 확인
if Handle == nil
then
ErrorLog( "Routine_Freloan::Handle == nil" )
return ReturnAI["END"]
end
if MapIndex == nil
then
ErrorLog( "Routine_Freloan::MapIndex == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 현재 시간
local CurSec = cCurrentSecond()
if CurSec == nil
then
ErrorLog( "Routine_Freloan::Var == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 필드 버퍼 확인
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Routine_Freloan::Var == nil" )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 프렐로안 죽었는지 확인
if cIsObjectDead( Handle ) ~= nil
then
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 프렐로안 버퍼가 있는지 확인
if Var["Enemy"][ Handle ] == nil
then
ErrorLog( "Routine_Freloan::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 프렐로안 정보가 있는지 확인
local CurBossInfo = Var["Enemy"][ Handle ]["Info"]
if CurBossInfo == nil
then
ErrorLog( "Routine_Hayreddin::CurBossInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 프렐로안 페이즈 번호 확인
local PhaseNumber = Var["Enemy"][ Handle ]["Phase"]
if PhaseNumber == nil
then
ErrorLog( "Routine_Freloan::PhaseNumber == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 프렐로안 페이즈 정보 확인
local PhaseInfo = CurBossInfo["Phase"]
if PhaseInfo == nil
then
ErrorLog( "Routine_Freloan::PhaseInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["END"]
end
-- 프렐로안 진행된 페이즈 번호 확인
if PhaseNumber < 0 or PhaseNumber > #PhaseInfo
then
return ReturnAI["END"]
end
-- 0.2초마다 체크하는 루틴
if Var["RoutineTime"][ Handle ] <= CurSec
then
Var["RoutineTime"][ Handle ] = CurSec + 0.2
else
return ReturnAI["CPP"]
end
-- 현재 페이즈 정보 확인
local CurPhaseInfo = PhaseInfo[ PhaseNumber ]
if CurPhaseInfo == nil
then
ErrorLog( "Routine_Freloan::CurPhaseInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["CPP"]
end
-- 프렐로안 HP 정보
local nCurHP, nMaxHP = cObjectHP( Handle )
if nCurHP == nil or nMaxHP == nil
then
ErrorLog( "Routine_Freloan::nCurHP == nil or nMaxHP == nil" )
return ReturnAI["CPP"]
end
local nCurHPRate = nCurHP / nMaxHP * 100
-- 어그로가 풀렸을 경우
if cAggroListSize( Handle ) == 0
then
if PhaseNumber == 1
then
return ReturnAI["CPP"]
end
-- HP 조건 확인
if nCurHPRate > CurPhaseInfo["Condition_HPRate"]
then
Var["Enemy"][ Handle ]["Phase"] = PhaseNumber - 1
-- 어그로 풀리면 페이즈 스킬 사용 정보 초기화
Var["Enemy"][ Handle ]["UseSkillSec"] = nil
Var["Enemy"][ Handle ]["SummonChief"] = nil
Var["Enemy"][ Handle ]["SummonSec"] = nil
end
return ReturnAI["CPP"]
end
-- 스킬 사용
if CurPhaseInfo["UseSkill"] ~= nil
then
if Var["Enemy"][ Handle ]["UseSkillSec"] == nil
then
Var["Enemy"][ Handle ]["UseSkillSec"] = CurSec
end
-- 스킬 사용 시간 확인
if Var["Enemy"][ Handle ]["UseSkillSec"] <= CurSec
then
if cSkillBlast( Handle, Handle, CurPhaseInfo["UseSkill"]["Index"] ) == 1
then
Var["Enemy"][ Handle ]["UseSkillSec"] = CurSec + CurPhaseInfo["UseSkill"]["Interval"]
end
end
end
-- 치프 소환
if CurPhaseInfo["Summon_Chief"] ~= nil
then
local SummonChiefInfo = Var["Enemy"][ Handle ]["SummonChief"]
if SummonChiefInfo == nil
then
Var["Enemy"][ Handle ]["SummonChief"] = {}
SummonChiefInfo = Var["Enemy"][ Handle ]["SummonChief"]
SummonChiefInfo["SummonStep"] = 1
SummonChiefInfo["SummonList"] = {}
-- 소환 순서 만들기
local TmpList = {}
local SummonMax = #CurPhaseInfo["Summon_Chief"]
for i = 1, SummonMax
do
TmpList[ i ] = i
end
for i = SummonMax, 1, -1
do
local Index = cRandomInt( 1, i )
SummonChiefInfo["SummonList"][ i ] = TmpList[ Index ]
for j = Index, (SummonMax - 1)
do
TmpList[ j ] = TmpList[ j + 1 ]
TmpList[ j + 1 ] = nil
end
end
end
-- 치프 소환할지 확인
local NextBossSummon = false
if SummonChiefInfo["Handle"] == nil
then
NextBossSummon = true
else
-- 소환된 치프가 죽으면 다음 치프 소환
if cIsObjectDead( SummonChiefInfo["Handle"] ) == 1
then
SummonChiefInfo["Handle"] = nil
NextBossSummon = true
end
end
-- 치프를 모두 소환 했는지 확인
if SummonChiefInfo["SummonStep"] > #SummonChiefInfo["SummonList"]
then
NextBossSummon = false
end
-- 치프 소환
if NextBossSummon == true
then
if cSkillBlast( Handle, Handle, CurPhaseInfo["Summon_Chief"]["SkillIndex"] ) == 1
then
local SummonIndex = SummonChiefInfo["SummonList"][ SummonChiefInfo["SummonStep"] ]
if SummonIndex <= #CurPhaseInfo["Summon_Chief"]
then
local CurRegenChief = CurPhaseInfo["Summon_Chief"][ SummonIndex ]
SummonChiefInfo["Handle"] = cMobRegen_XY( Var["MapIndex"], CurRegenChief["Index"], CurRegenChief["x"], CurRegenChief["y"], CurRegenChief["dir"] )
SummonChiefInfo["SummonStep"] = SummonChiefInfo["SummonStep"] + 1
cRunTo( SummonChiefInfo["Handle"], CurRegenChief["RunTo"]["x"], CurRegenChief["RunTo"]["y"], 1000 )
end
end
end
end
-- 다리 소환
if CurPhaseInfo["Summon_Leg"] ~= nil
then
if Var["Enemy"][ Handle ]["SummonSec"] == nil
then
Var["Enemy"][ Handle ]["SummonSec"] = CurSec
end
-- 소환 시간 확인
if Var["Enemy"][ Handle ]["SummonSec"] <= CurSec
then
local TargetHandle = cTargetHandle( Handle )
if TargetHandle ~= nil
then
if cSkillBlast( Handle, TargetHandle, CurPhaseInfo["Summon_Leg"]["SkillIndex"] ) == 1
then
for i = 1, #CurPhaseInfo["Summon_Leg"]
do
local CurRegenLeg = CurPhaseInfo["Summon_Leg"][ i ]
cMobRegen_XY( Var["MapIndex"], CurRegenLeg["Index"], CurRegenLeg["x"], CurRegenLeg["y"], CurRegenLeg["dir"] )
end
Var["Enemy"][ Handle ]["SummonSec"] = CurSec + CurPhaseInfo["Summon_Leg"]["Interval"]
end
end
end
end
-- 다음 단계 번호 설정
local NextPhaseNumber = PhaseNumber + 1
if NextPhaseNumber < 0 or NextPhaseNumber > #PhaseInfo
then
return ReturnAI["CPP"]
end
-- 다음 단계 정보 확인
local NextPhaseInfo = PhaseInfo[ NextPhaseNumber ]
if NextPhaseInfo == nil
then
ErrorLog( "Routine_Freloan::NextPhaseInfo == nil" )
EnemyBufferClear( Var, Handle )
cAIScriptSet( Handle )
cNPCVanish( Handle )
return ReturnAI["CPP"]
end
-- HP 조건 확인
if nCurHPRate > NextPhaseInfo["Condition_HPRate"]
then
return ReturnAI["CPP"]
end
-- 다음 페이즈 설정
Var["Enemy"][ Handle ]["Phase"] = NextPhaseNumber
Var["Enemy"][ Handle ]["UseSkillSec"] = nil
Var["Enemy"][ Handle ]["SummonChief"] = nil
Var["Enemy"][ Handle ]["SummonSec"] = nil
return ReturnAI["END"]
end
--------------------------------------------------------------------------------
-- Click Function
--------------------------------------------------------------------------------
function Click_Door( NPCHandle, PlyHandle, RegistNumber )
cExecCheck "Click_Door"
DebugLog( "Click_Door::Start" )
if NPCHandle == nil
then
ErrorLog( "Click_Door::NPCHandle == nil" )
return
end
if PlyHandle == nil
then
ErrorLog( "Click_Door::PlyHandle == nil" )
return
end
local MapIndex = cGetCurMapIndex( NPCHandle )
if MapIndex == nil
then
ErrorLog( "Click_Door::MapIndex == nil" )
return
end
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Click_Door::Var == nil" )
return
end
if Var["Door"] == nil
then
ErrorLog( "Click_Door::Var[\"Door\"] == nil" )
return
end
if Var["Door"][ NPCHandle ] == nil
then
ErrorLog( "Click_Door::Var[\"Door\"][NPCHandle] == nil" )
return
end
if Var["Door"][ NPCHandle ]["IsOpen"] == true
then
return
end
-- 플레이어가 열쇠를 가지고 있는지 확인
local ItemLot, bLocked = cGetItemLot( PlyHandle, Var["Door"][ NPCHandle ]["Info"]["NeedItem"] )
if bLocked == nil
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
if bLocked == 1
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
if ItemLot == nil
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
if ItemLot < 1
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
-- 캐스팅 시작
cCastingBar( PlyHandle, NPCHandle, (Var["Door"][ NPCHandle ]["Info"]["CastingTime"] * 1000), Var["Door"][ NPCHandle ]["Info"]["CastingAni"] )
DebugLog( "Click_Door::End" )
end
function Click_Portal( NPCHandle, PlyHandle, RegistNumber )
cExecCheck "Click_Portal"
DebugLog( "Click_Portal::Start" )
if NPCHandle == nil
then
ErrorLog( "Click_Portal::NPCHandle == nil" )
return
end
if PlyHandle == nil
then
ErrorLog( "Click_Portal::PlyHandle == nil" )
return
end
local MapIndex = cGetCurMapIndex( NPCHandle )
if MapIndex == nil
then
ErrorLog( "Click_Portal::MapIndex == nil" )
return
end
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Click_Portal::Var == nil" )
return
end
if Var["Portal"] == nil
then
ErrorLog( "Click_Portal::Var[\"Portal\"] == nil" )
return
end
if Var["Portal"][ NPCHandle ] == nil
then
ErrorLog( "Click_Portal::Var[\"Portal\"][NPCHandle] == nil" )
return
end
local CurPortalInfo = Var["Portal"][ NPCHandle ]["Info"]
if CurPortalInfo == nil
then
ErrorLog( "Click_Portal::Var[\"Portal\"][NPCHandle] == nil" )
return
end
-- 설정된 위치로 이동
cCastTeleport( PlyHandle, "SpecificCoord", CurPortalInfo["x"], CurPortalInfo["y"] );
Var["Portal"][ NPCHandle ]["Use"] = true
DebugLog( "Click_Portal::End" )
end
function Click_ExitGate( NPCHandle, PlyHandle, RegistNumber )
cExecCheck "ExitGateClick"
DebugLog( "ExitGateClick::Start" )
if NPCHandle == nil
then
ErrorLog( "ExitGateClick::NPCHandle == nil" )
return
end
if PlyHandle == nil
then
ErrorLog( "ExitGateClick::PlyHandle == nil" )
return
end
cLinkTo( PlyHandle, LinkInfo["ReturnMap"]["MapIndex"], LinkInfo["ReturnMap"]["x"], LinkInfo["ReturnMap"]["y"] )
DebugLog( "ExitGateClick::End" )
end
--------------------------------------------------------------------------------
-- Menu Function
--------------------------------------------------------------------------------
function Menu_Door( NPCHandle, PlyHandle, RegistNumber, Menu )
cExecCheck "Menu_Door"
DebugLog( "Menu_Door::Start" )
if NPCHandle == nil
then
ErrorLog( "Menu_Door::NPCHandle == nil" )
return
end
if PlyHandle == nil
then
ErrorLog( "Menu_Door::PlyHandle == nil" )
return
end
local MapIndex = cGetCurMapIndex( NPCHandle )
if MapIndex == nil
then
ErrorLog( "Menu_Door::MapIndex == nil" )
return
end
local Var = InstanceField[ MapIndex ]
if Var == nil
then
ErrorLog( "Menu_Door::Var == nil" )
return
end
if Var["Door"] == nil
then
ErrorLog( "Menu_Door::Var[\"Door\"] == nil" )
return
end
if Var["Door"][ NPCHandle ] == nil
then
ErrorLog( "Menu_Door::Var[\"Door\"][NPCHandle] == nil" )
return
end
if Var["Door"][ NPCHandle ]["IsOpen"] == true
then
return
end
-- 플레이어가 열쇠를 가지고 있는지 확인
local ItemLot, bLocked = cGetItemLot( PlyHandle, Var["Door"][ NPCHandle ]["Info"]["NeedItem"] )
if bLocked == nil
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
if bLocked == 1
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
if ItemLot == nil
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
if ItemLot < 1
then
cNotice_Obj( PlyHandle, ChatInfo["ScriptFileName"], ChatInfo["SystemMessage"]["Error_DoorOpen"] )
return
end
-- 열쇠 파괴, 문 열기
if cInvenItemDestroy( PlyHandle, Var["Door"][ NPCHandle ]["Info"]["NeedItem"], -1 ) ~= 1
then
return
end
cDoorAction( NPCHandle, Var["Door"][ NPCHandle ]["Info"]["Block"], "open" )
Var["Door"][ NPCHandle ]["IsOpen"] = true
DebugLog( "Menu_Door::End" )
end