require( "common" ) LoussierMemBlock = {} function AdlFH_Loussier( Handle, MapIndex ) cExecCheck "AdlFH_Loussier" local Var = LoussierMemBlock[Handle] if cIsObjectDead( Handle ) then -- 죽었음 cAIScriptSet( Handle ) -- 스크립트 없앰 LoussierMemBlock[Handle] = nil -- 메모리해제 cMobDialog( MapIndex, DialogInfo.Loussier_Death[1].Portrait, DialogInfo.Loussier_Death[1].FileName, DialogInfo.Loussier_Death[1].Index ) cDebugLog( "AdlF_Loussier Dead" ) return ReturnAI.END end local cursec = cCurrentSecond() if Var == nil then LoussierMemBlock[Handle] = {} Var = LoussierMemBlock[Handle] Var.Handle = Handle Var.MapIndex = MapIndex Var.MoveToChkTime = nil Var.MoveTo = nil Var.CurSec = cursec Var.StepFunc = Loussier_Default cAIScriptFunc( Var.Handle, "NPCClick", "Loussier_Click" ) cAIScriptFunc( Var.Handle, "NPCMenu", "Loussier_Menu" ) cSetNPCParam ( Var.Handle, "HPRegen", RegenInfo.Loussier.HPRegen ) end if Var.CurSec < cursec then Var.CurSec = cursec + 0.5 local PlayerList = { cGetPlayerList( Var.MapIndex ) } for i=1, #PlayerList do if cDistanceSquar( Var.Handle, PlayerList[i] ) < 160000 then cSetAbstate( PlayerList[i], LOUSSIBUF, 1, 999 ) end end end return Var.StepFunc( Var ) end function Loussier_Default( Var ) if Var == nil then return ReturnAI.CPP end if InstanceField[Var.MapIndex] == nil then return ReturnAI.CPP end local Field = InstanceField[Var.MapIndex] -- 소환마법석 작동 이후에는 아무 행동을 하지 않도록 함 if Field.SummonStone_Active ~= nil then return ReturnAI.END end -- 루시에 관련 연출 중일때는 아무 행동을 하지 않도록 함 if Field.Loussier_Stop ~= nil then return ReturnAI.END end -- 소환마법석 캐스팅중에는 아무 행동을 하지 않도록 함 if Var.StepFunc == LoussierSummonStoneCasting then return ReturnAI.END end return ReturnAI.CPP end function MoveToPlayer( Var ) cExecCheck "MoveToPlayer" if Var == nil then Var.StepFunc = Loussier_Default return ReturnAI.CPP end -- 목표가 있는지 체크 if Var.MoveTo == nil then Var.StepFunc = Loussier_Default return ReturnAI.CPP end -- 이동처리가 필요한 거리면 1초 단위로 목표점을 바꿔주며 이동 local CurSec = cCurrentSecond() if Var.MoveToChkTime == nil or Var.MoveToChkTime <= CurSec then if cFollow( Var.Handle, Var.MoveTo, 100, 1000 ) == nil then Var.StepFunc = Loussier_Default Var.MoveTo = nil return ReturnAI.CPP end Var.MoveToChkTime = CurSec + 1 end return ReturnAI.CPP end function Loussier_Click(NPCHandle, PlyHandle, RegistNumber) cExecCheck "Loussier_Click" local Var = LoussierMemBlock[NPCHandle] if Var == nil then cDebugLog( "Loussier_Click : nil NPC " .. NPCHandle ) return 0 end if InstanceField[Var.MapIndex] == nil then return end local Field = InstanceField[Var.MapIndex] -- 소환마법석 작동 이후에는 아무 행동을 하지 않도록 함 if Field.SummonStone_Active ~= nil then return end -- 루시에 관련 연출 중일때는 아무 행동을 하지 않도록 함 if Field.Loussier_Stop ~= nil then return end -- 소환마법석 캐스팅중에는 아무 행동을 하지 않도록 함 if Var.StepFunc == LoussierSummonStoneCasting then return end cNPCMenuOpen( NPCHandle, PlyHandle ) end function Loussier_Menu(NPCHandle, PlyHandle, RegistNumber, Menu) cExecCheck "Loussier_Menu" local Var = LoussierMemBlock[NPCHandle] if Var == nil then cDebugLog( "Loussier_Menu : nil NPC " .. NPCHandle ) return end if Menu == 1 then LussierFollow( NPCHandle, PlyHandle, RegistNumber ) elseif Menu == 2 then LussierWait( NPCHandle, PlyHandle, RegistNumber ) elseif Menu == 3 then LussierSummonStone( NPCHandle, PlyHandle, RegistNumber ) else cDebugLog( "Loussier_Menu : Invalid Menu " .. Menu ) end end -- 따라가기 설정 function LussierFollow( NPCHandle, PlyHandle, RegistNumber ) cExecCheck "LussierFollow" local Var = LoussierMemBlock[NPCHandle] if Var == nil then cDebugLog( "LussierFollow : nil NPC " .. NPCHandle ) return end Var.StepFunc = MoveToPlayer Var.MoveTo = PlyHandle cScriptMessage( Var.MapIndex, AnnounceInfo.AdlF_Loussier_Follow, cGetPlayerName( PlyHandle ) ) end -- 따라가기 해제 function LussierWait( NPCHandle, PlyHandle, RegistNumber ) cExecCheck "LussierWait" local Var = LoussierMemBlock[NPCHandle] if Var == nil then cDebugLog( "LussierWait : nil NPC " .. NPCHandle ) return end Var.StepFunc = Loussier_Default Var.MoveTo = nil end -- 소환석 작동 function LussierSummonStone( NPCHandle, PlyHandle, RegistNumber ) cExecCheck "LussierSummonStone" local Var = LoussierMemBlock[NPCHandle] if Var == nil then cDebugLog( "LussierWait : nil NPC " .. NPCHandle ) return end if cGetAreaObject( Var.MapIndex, AreaIndex.Zone3_2, NPCHandle ) == nil then cScriptMessage( Var.MapIndex, AnnounceInfo.AdlF_Loussier_RStone ) return end Var.StepFunc = LoussierSummonStoneCastingStart end function LoussierSummonStoneCastingStart( Var ) cExecCheck "LoussierSummonStoneCastingStart" if Var == nil then return ReturnAI.CPP end -- 필드 전역변수 if InstanceField[Var.MapIndex] == nil then Var.StepFunc = Loussier_Default return ReturnAI.CPP end local Field = InstanceField[Var.MapIndex] if Field.SummonStone_Active ~= nil then Var.StepFunc = Loussier_Default return ReturnAI.CPP end if Field.SummonStone == nil then Var.StepFunc = Loussier_Default return ReturnAI.CPP end if cDistanceSquar( Var.Handle, Field.SummonStone ) <= 30000 then cSkillBlast( Var.Handle, Field.SummonStone, "AdlF_Loussier_Skill04_N" ) Var.StepFunc = LoussierSummonStoneCasting return ReturnAI.CPP else if cFollow( Var.Handle, Field.SummonStone, 170, 10000 ) == nil then Var.StepFunc = Loussier_Default Var.MoveTo = nil return ReturnAI.CPP end end return ReturnAI.END end function LoussierSummonStoneCasting( Var ) if Var == nil then return ReturnAI.CPP end -- 필드 전역변수 if InstanceField[Var.MapIndex] == nil then Var.StepFunc = Loussier_Default return ReturnAI.CPP end local Field = InstanceField[Var.MapIndex] local CurSec = cCurrentSecond() if Var.Casting_Step == nil then Var.Casting_Step = 1 Var.Casting_Step_Delay = CurSec + 2 return ReturnAI.CPP end if Var.Casting_Step == 1 then if Var.Casting_Step_Delay > CurSec then return ReturnAI.END end Field.SummonStone_Active= "Loussier" Var.Casting_Step = 2 Var.Casting_Step_Delay = CurSec return ReturnAI.CPP end Var.Casting_Step = nil Var.Casting_Step_Delay = nil Var.StepFunc = Loussier_Default return ReturnAI.END end