-------------------------------------------------------------------------------- -- KDArena Routine -- -------------------------------------------------------------------------------- function DummyRoutineFunc( ) cExecCheck "DummyRoutineFunc" end ---------------------------------------------------------------------- -- MapLogin Function ---------------------------------------------------------------------- function PlayerMapLogin( MapIndex, Handle ) cExecCheck "PlayerMapLogin" -- 사용할 데이터 : 킹덤 퀘스트 정보, 현재시간, 플레이어 팀 번호, 플레이어 캐릭 번호 local Var = InstanceField[ MapIndex ] local CurSec = cCurrentSecond() local TeamNumber = cGetKQTeamType( Handle ) + 1 local CharNo = cGetCharNo( Handle ) DebugLog( "TeamNumer : "..TeamNumber ) if Var == nil then return end if CurSec == nil then return end if TeamNumber == nil then return end if CharNo == nil then return end -- 플레이어 수, 핸들, 추가 여부, local PlayerCount = #Var[ "Player" ] local OldHandle = 0 local PlayerInsert = true -- 플레이어 목록 찾기 for i = 1, PlayerCount do if CharNo == Var[ "Player" ][ i ][ "CharNo" ] then -- 플레이어 추가 여부, 핸들 설정 PlayerInsert = false OldHandle = Var[ "Player" ][ i ][ "Handle" ] Var[ "Player" ][ i ][ "Handle" ] = Handle Var[ "Player" ][ i ][ "FlagPickSec" ] = CurSec + ArenaFlag[ "PickDelay" ] Var[ "Player" ][ i ][ "InMap" ] = true -- 플레이어 팀 번호가 다를 경우 if TeamNumber ~= Var[ "Player" ][ i ][ "TeamNumber" ] then -- 팀 정보 local DelTeamNumber = Var[ "Player" ][ i ][ "TeamNumber" ] local TeamMemberCount = #Var[ "Team" ][ DelTeamNumber ][ "Member" ] -- 팀 멤버 목록에서 삭제 for DelMemberIndex = 1, TeamMemberCount do if Var[ "Team" ][ DelTeamNumber ][ "Member" ] == OldHandle then for MoveIndex = DelMemberIndex, ( TeamMemberCount - 1 ) do Var[ "Team" ][ DelTeamNumber ][ "Member" ][ MoveIndex ] = Var[ "Team" ][ DelTeamNumber ][ "Member" ][ ( MoveIndex + 1 ) ] end Var[ "Team" ][ DelTeamNumber ][ "Member" ][ TeamMemberCount ] = nil break end end -- 플레이어 목록에서 삭제 for MoveIndex = i, ( PlayerCount - 1 ) do Var[ "Player" ][ MoveIndex ] = Var[ "Player" ][ ( MoveIndex + 1 ) ] end Var[ "Player" ][ PlayerCount ] = nil return end break end end if PlayerInsert == true then ------------------------------------------------------------ -- 플레이어 정보 추가 ------------------------------------------------------------ if TeamNumber >= DEF_TEAM then return end local P_InsertIndex = ( PlayerCount + 1 ) local T_InsertIndex = ( #Var[ "Team" ][ TeamNumber ][ "Member" ] + 1 ) -- 플레이어 목록에 추가 Var[ "Player" ][ P_InsertIndex ] = {} Var[ "Player" ][ P_InsertIndex ][ "Handle" ] = Handle Var[ "Player" ][ P_InsertIndex ][ "CharNo" ] = CharNo Var[ "Player" ][ P_InsertIndex ][ "FlagPickSec" ] = CurSec + ArenaFlag[ "PickDelay" ] Var[ "Player" ][ P_InsertIndex ][ "InMap" ] = true Var[ "Player" ][ P_InsertIndex ][ "TeamNumber" ] = TeamNumber -- 팀 멤버 목록에 추가 Var["Team"][ TeamNumber ][ "Member" ][ T_InsertIndex ] = Handle elseif OldHandle ~= Handle then ------------------------------------------------------------ -- 플레이어 정보 수정 ------------------------------------------------------------ local MemberCount = #Var["Team"][ TeamNumber ][ "Member" ] -- 팀 멤버 정보 수정 for i = 1, MemberCount do if OldHandle == Var["Team"][ TeamNumber ][ "Member" ][ i ] then Var["Team"][ TeamNumber ][ "Member" ][ i ] = Handle break end end end -- 팀 유니폼 착용 for i = 1, #TeamUniform[ TeamNumber ] do cViewSlotEquip( Handle, TeamUniform[ TeamNumber ][ i ] ) end -- 게임이 진행 중이 아니면 함수 종료 if Var[ "KQLimitTime" ] <= 0 then return end -- 아레나 점수, 시간 정보 전송 cScoreInfo( Handle, #TeamNumberList, Var[ "Team" ][ RED_TEAM ][ "Score" ], Var[ "Team" ][ BLUE_TEAM ][ "Score" ] ) cTimer_Obj( Handle, ( Var[ "KQLimitTime" ] - CurSec ) ) end ---------------------------------------------------------------------- -- Click Functions ---------------------------------------------------------------------- function ArenaGate_Click( NPCHandle, PlayerHandle, PlayerCharNo, Arg ) cExecCheck "ArenaGate_Click" -- 맵인덱스 가져오기 local NPCMapIndex = cGetCurMapIndex( NPCHandle ) if NPCMapIndex == nil then return end -- 사용할 데이터 : 킹덤 퀘스트 정보 local Var = InstanceField[ NPCMapIndex ] if Var == nil then return end if Var[ "ArenaGate" ] == nil then return end -- 게이트 정보 찾기 local WarpInfo = nil for i = 1, Var[ "ArenaGate" ][ "Count" ] do if Var[ "ArenaGate" ][ i ] == NPCHandle then WarpInfo = WarpGate[ i ] if WarpInfo == nil then return end break end end -- 플레이어 팀 확인 for i = 1, #Var[ "Player" ] do if Var[ "Player" ][ i ][ "CharNo" ] == PlayerCharNo then if Var[ "Player" ][ i ][ "TeamNumber" ] == WarpInfo[ "Team" ] then cCastTeleport( PlayerHandle, "SpecificCoord", WarpInfo[ "X" ], WarpInfo[ "Y" ] ); end end end end ---------------------------------------------------------------------- -- Entrance Functions ---------------------------------------------------------------------- function ArenaFlag_Entrance( Handle, MapIndex ) cExecCheck "ArenaFlag_Entrance" -- 사용할 데이터 : 킹덤 퀘스트 정보, 현재시간 local Var = InstanceField[ MapIndex ] local CurSec = cCurrentSecond() if Var == nil then return ReturnAI[ "END" ] end if CurSec == nil then return ReturnAI[ "END" ] end if Var[ "KQLimitTime" ] == 0 then return ReturnAI[ "END" ] end local ArenaFlagInfo = Var[ "ArenaFlag" ] if ArenaFlagInfo == nil then return ReturnAI[ "END" ] end -- 팀 번호 찾기 local FlagTeamNumber = DEF_TEAM for i = 1, #TeamNumberList do if ArenaFlagInfo[ TeamNumberList[ i ] ][ "Handle" ] == Handle then FlagTeamNumber = TeamNumberList[ i ] end end if FlagTeamNumber == DEF_TEAM then return ReturnAI[ "END" ] end ------------------------------------------------------------ -- 드랍 30 초 후 이젠 위치로 이동 ------------------------------------------------------------ if ArenaFlagInfo[ FlagTeamNumber ][ "Drop_LifeTime" ] ~= nil then if ArenaFlagInfo[ FlagTeamNumber ][ "Drop_LifeTime" ] <= CurSec then local Regen_Flag = RegenInfo[ "NPC" ][ "ArenaFlag" ][ FlagTeamNumber ] local Regen_Handle = nil -- 깃발 삭제 cNPCVanish( Handle ) ArenaFlagInfo[ FlagTeamNumber ][ "Handle" ] = nil -- 깃발 소환 Regen_Handle = cMobRegen_XY( Var[ "MapIndex" ], Regen_Flag[ "Index" ], Regen_Flag[ "X" ], Regen_Flag[ "Y" ], Regen_Flag[ "Dir" ] ) if Regen_Handle ~= nil then cSetAIScript ( MainLuaScriptPath, Regen_Handle ) cAIScriptFunc( Regen_Handle, "Entrance", "ArenaFlag_Entrance" ) ArenaFlagInfo[ FlagTeamNumber ][ "Handle" ] = Regen_Handle ArenaFlagInfo[ FlagTeamNumber ][ "PlayerHandle" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "PlayerTeam" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "Drop_LifeTime" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "X" ] = Regen_Flag[ "X" ] ArenaFlagInfo[ FlagTeamNumber ][ "Y" ] = Regen_Flag[ "Y" ] ArenaFlagInfo[ FlagTeamNumber ][ "GoalConditionNoticeTime"] = nil ArenaFlagInfo[ FlagTeamNumber ][ "Penalty"] = nil end -- 깃발 회수 알림 cScriptMessage( Var[ "MapIndex" ], ArenaFlag[ FlagTeamNumber ][ "ScriptMsg" ][ "Return_Flag" ] ) return ReturnAI[ "END" ] end end ------------------------------------------------------------ -- 근처에 플레이어가 있을 경우 ------------------------------------------------------------ local PlayerList = { cNearObjectList( Handle, ArenaFlag[ "CheckDistance_Falg" ], ObjectType[ "Player" ] ) } for i = 1, #PlayerList do -- 아레나에 참여중인 플레이어 목록과 비교 for PlayerIndex = 1, #Var[ "Player" ] do -- 핸들, 깃발 획득 가능 시간 비교 if Var[ "Player" ][ PlayerIndex ][ "Handle" ] == PlayerList[ i ] and Var[ "Player" ][ PlayerIndex ][ "FlagPickSec" ] <= CurSec then -- 상태이상 확인( 은신, 폴리모프 ) local bAbstateCheck = false for j = 1, #ArenaFlag[ "Drop_Abstate" ] do if cAbstateRestTime( PlayerList[ i ], ArenaFlag[ "Drop_Abstate" ][ j ] ) ~= nil then bAbstateCheck = true break end end if bAbstateCheck == false then if Var[ "Player" ][ PlayerIndex ][ "TeamNumber" ] == FlagTeamNumber then if ArenaFlagInfo[ FlagTeamNumber ][ "Drop_LifeTime" ] ~= nil then ------------------------------------------------------------ -- 아군 : 깃발 리젠 포인트에 소환 ------------------------------------------------------------ local Regen_Flag = RegenInfo[ "NPC" ][ "ArenaFlag" ][ FlagTeamNumber ] local Regen_Handle = nil -- 깃발 삭제 cNPCVanish( Handle ) ArenaFlagInfo[ FlagTeamNumber ][ "Handle" ] = nil -- 깃발 소환 Regen_Handle = cMobRegen_XY( Var[ "MapIndex" ], Regen_Flag[ "Index" ], Regen_Flag[ "X" ], Regen_Flag[ "Y" ], Regen_Flag[ "Dir" ] ) if Regen_Handle ~= nil then cSetAIScript ( MainLuaScriptPath, Regen_Handle ) cAIScriptFunc( Regen_Handle, "Entrance", "ArenaFlag_Entrance" ) ArenaFlagInfo[ FlagTeamNumber ][ "Handle" ] = Regen_Handle ArenaFlagInfo[ FlagTeamNumber ][ "PlayerHandle" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "PlayerTeam" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "Drop_LifeTime" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "X" ] = Regen_Flag[ "X" ] ArenaFlagInfo[ FlagTeamNumber ][ "Y" ] = Regen_Flag[ "Y" ] ArenaFlagInfo[ FlagTeamNumber ][ "GoalConditionNoticeTime" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "Penalty"] = nil end -- 깃발 회수 알림 cScriptMessage( Var[ "MapIndex" ], ArenaFlag[ FlagTeamNumber ][ "ScriptMsg" ][ "Return_Flag" ] ) return ReturnAI[ "END" ] end else ------------------------------------------------------------ -- 적군 : 깃발 획득 ------------------------------------------------------------ -- local FlagData = ArenaFlag[ FlagTeamNumber ] local PenaltyData = ArenaFlag["Penalty"] local Player_X, Player_Y = cObjectLocate( Handle ) if X == nil or Y == nil then Player_X = 0 Player_Y = 0 end -- 깃발 정보 설정 ArenaFlagInfo[ FlagTeamNumber ][ "Handle" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "PlayerHandle" ] = Var[ "Player" ][ PlayerIndex ][ "Handle" ] ArenaFlagInfo[ FlagTeamNumber ][ "PlayerTeam" ] = Var[ "Player" ][ PlayerIndex ][ "TeamNumber" ] ArenaFlagInfo[ FlagTeamNumber ][ "Drop_LifeTime" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "X" ] = Player_X ArenaFlagInfo[ FlagTeamNumber ][ "Y" ] = Player_Y ArenaFlagInfo[ FlagTeamNumber ][ "GoalConditionNoticeTime" ] = nil ArenaFlagInfo[ FlagTeamNumber ][ "Penalty"] = {} ArenaFlagInfo[ FlagTeamNumber ][ "Penalty"]["Step"] = 1 ArenaFlagInfo[ FlagTeamNumber ][ "Penalty"]["CheckTime"] = CurSec + PenaltyData["Step"][ 1 ]["CheckTick"] -- 깃발 획득자 상태이상 걸기 cSetAbstate( PlayerList[i], FlagData["Abstate"]["Index"], FlagData["Abstate"]["Str"], FlagData["Abstate"]["KeepTime"] ) -- 깃발 획득자 패널티 부여 for PenaltyIndex = 1, #PenaltyData["Abstate"] do cSetAbstate( PlayerList[i], PenaltyData["Abstate"][PenaltyIndex]["Index"], PenaltyData["Abstate"][PenaltyIndex]["Str"], PenaltyData["Abstate"][PenaltyIndex]["KeepTime"] ) end -- 목적지 방향 표시 cDirectionalArrow( PlayerList[ i ], ArenaFlag[ FlagTeamNumber ][ "GoalPoint" ][ "X" ], ArenaFlag[ FlagTeamNumber ][ "GoalPoint" ][ "Y" ] ) -- 깃발 획득 알리기 local PlayerName = cGetPlayerName( PlayerList[ i ] ) if PlayerName == nil then PlayerName = "" end cScriptMessage( Var[ "MapIndex" ], ArenaFlag[ FlagTeamNumber ][ "ScriptMsg" ][ "Have_Flag" ], PlayerName ) cNPCVanish( Handle ) return ReturnAI[ "END" ] end end break end end end return ReturnAI[ "END" ] end function ArenaStone_Entrance( Handle, MapIndex ) cExecCheck "ArenaStone_Entrance" -- 사용할 데이터 : 킹덤 퀘스트 정보, 현재시간 local Var = InstanceField[ MapIndex ] local CurSec = cCurrentSecond() if Var == nil then return ReturnAI[ "END" ] end if CurSec == nil then return ReturnAI[ "END" ] end if Var[ "ArenaStone" ] == nil then return ReturnAI[ "END" ] end if Var[ "ArenaStone" ][ "SkillUseTime" ] == nil then return ReturnAI[ "END" ] end if Var[ "ArenaStone" ][ "SkillUseTime" ][ Handle ] == nil then -- 스킬 사용시간이 설정되어있지 않으면 설정해준다. Var[ "ArenaStone" ][ "SkillUseTime" ][ Handle ] = CurSec + ArenaStone[ "IntervalTime" ] return ReturnAI[ "END" ] end -- 스킬 사용시간 확인 if Var[ "ArenaStone" ][ "SkillUseTime" ][ Handle ] <= CurSec then -- 스킬 사용 cSkillBlast( Handle, Handle, ArenaStone[ "SkillIndex" ] ) -- 다음 스킬 사용시간 설정 Var[ "ArenaStone" ][ "SkillUseTime" ][ Handle ] = CurSec + ArenaStone[ "IntervalTime" ] end return ReturnAI[ "END" ] end function ArenaCrystal_Entrance( Handle, MapIndex ) cExecCheck "ArenaCrystal" -- 사용할 데이터 : 킹덤 퀘스트 정보, 현재시간, 크리스탈 HP 정보 local Var = InstanceField[ MapIndex ] local CurSec = cCurrentSecond() local CurHP, MaHP = cObjectHP( Handle ) if Var == nil then return ReturnAI[ "END" ] end if CurSec == nil then return ReturnAI[ "END" ] end if CurHP == nil then return returnAI[ "END" ] end if Var[ "ArenaCrystal" ] == nil then return ReturnAI[ "END" ] end -- 크리스탈 HP 에 따른 처리 if CurHP > 1 then ------------------------------------------------------------ -- 일정 간격으로 사용하는 스킬 ------------------------------------------------------------ if Var[ "ArenaCrystal" ][ "SkillUseTime" ] == nil then -- 스킬 사용시간이 설정되어있지 않으면 설정해준다. Var[ "ArenaCrystal" ][ "SkillUseTime" ] = CurSec + ArenaCrystal[ "Routine" ][ "BlastTime" ] return ReturnAI[ "END" ] end -- 스킬 사용시간 확인 if Var[ "ArenaCrystal" ][ "SkillUseTime" ] <= CurSec then -- 크리스탈 위치 가져오기 local X, Y = cObjectLocate( Handle ) if X == nil or Y == nil then return ReturnAI[ "END" ] end -- 스킬 사용 --cMagicFieldSpread( Handle, X, Y, 0, ArenaCrystal[ "Routine" ][ "MagicField" ], 0 ) cSkillBlast( Handle, Handle, ArenaCrystal[ "Routine" ][ "SkillIndex" ] ) -- 다음 스킬 사용시간 설정 Var[ "ArenaCrystal" ][ "SkillUseTime" ] = CurSec + ArenaCrystal[ "Routine" ][ "BlastTime" ] end else ------------------------------------------------------------ -- 죽을때 사용하는 스킬 ------------------------------------------------------------ if Var[ "ArenaCrystal" ][ "SkillUseTime" ] ~= nil then if Var[ "ArenaCrystal" ][ "SkillUseTime" ] <= CurSec then -- 스킬사용 cSkillBlast( Handle, Handle, ArenaCrystal[ "Dead" ][ "SkillIndex" ] ) Var[ "ArenaCrystal" ][ "SkillUseTime" ] = nil Var[ "ArenaCrystal" ][ "VanishTime" ] = CurSec + ArenaCrystal[ "Dead" ][ "BlastTime" ] end end -- 소멸시간 확인 if Var[ "ArenaCrystal" ][ "VanishTime" ] ~= nil then if Var[ "ArenaCrystal" ][ "VanishTime" ] <= CurSec then -- 핸들 초기화 Var[ "ArenaCrystal" ][ "Handle" ] = nil -- 스크립트 해제, 오브젝트 소멸 cAIScriptSet( Handle ) cKillObject( Handle ) end end end return ReturnAI[ "END" ] end