------------------------------------------------------------------------------------------ -- 팀 나누기 대기 -- ------------------------------------------------------------------------------------------ function SF_DIVIDE_TEAM_WAIT( KSMemory, nCurSec ) cExecCheck "SF_DIVIDE_TEAM_WAIT" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end if #KSMemory["PLAYER_LIST"] >= KQ_MAX_PLAYER then -- 게임 참여 인원 확인 KSMemory["STEP_NEXT_TIME"] = nCurSec -- 다음 단계(팀 나누기)로 진행하기 위해 시간 설정 end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 for i = 1, #KSMemory["PLAYER_LIST"] do -- 모든 플레이어 파티 해제 cPartyLeave( KSMemory["PLAYER_LIST"][i]["PHND"] ) end if #KQ_STEP >= (KSMemory["STEP_NO"] + 1) then -- 다음 단계 확인 -- 단계 설정 KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계 KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간 local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보 if MsgIndex ~= nil then -- 메세지 인덱스 확인 local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보 if MsgData ~= nil then -- 메세지 정보 학인 KSMemory["MSG_NO"] = 1 -- 메세지 단계 KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간 end end end end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) return true end ------------------------------------------------------------------------------------------ -- 팀 나누기 -- ------------------------------------------------------------------------------------------ function SF_DIVIDE_TEAM( KSMemory, nCurSec ) cExecCheck "SF_DIVIDE_TEAM" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 local nConnectNum = #KSMemory["PLAYER_LIST"] -- 킹덤 퀘스트 맵에 접속해있는 플레이어 수 -- 게임 참가 플레이어 확인 for i = 1, nConnectNum do if cIsInMap( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"] ) == nil then -- 킹덤 퀘스트 맵에 접속해있는지 확인 nConnectNum = nConnectNum - 1 KSMemory["PLAYER_LIST"][i]["PIS_MAP"] = false end end if nConnectNum <= 1 then -- 킹덤 퀘스트맵에 접속해있는 플레이어 수 확인 return false end -- 문 닫기 for i = 1, #KSMemory["DOOR_LIST"] do cDoorAction( KSMemory["DOOR_LIST"][i], KQ_DOOR[i]["KD_BLOCK"], "close" ) end for i = 1, #KQ_NPC do -- NPC 소환 cNPCRegen( KSMemory["FIELD_NAME"], KQ_NPC[i] ) end local TeamInfo = KSMemory["TEAM_LIST"] -- 팀 정보 local nTeamNo = KQ_TEAM_NO["KTN_DEFAULT"] -- 팀 번호 local nTeamMemberMaxNum = nConnectNum / 2 -- 팀 멤버 최대맴수 if TeamInfo == nil then -- 팀 정보 확인 return false end -- 게임 참가 플레이어 팀 나누기 for i = 1, #KSMemory["PLAYER_LIST"] do if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == true then -- 킹덤 퀘스트맵에 접속해있는 플레이어 -- 50% 확률로 팀 설정 if cPermileRate( 500 ) == 1 then -- 레드 팀 nTeamNo = KQ_TEAM_NO["KTN_RED"] if #TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TMEMBER_LIST"] >= nTeamMemberMaxNum then -- 레드 팀 멤버 수 확인 if #TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TMEMBER_LIST"] < nTeamMemberMaxNum then -- 블루 팀 멤버 수 확인 nTeamNo = KQ_TEAM_NO["KTN_BLUE"] end end else -- 블루 팀 nTeamNo = KQ_TEAM_NO["KTN_BLUE"] if #TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TMEMBER_LIST"] >= nTeamMemberMaxNum then -- 블루 팀 멤버 수 확인 if #TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TMEMBER_LIST"] < nTeamMemberMaxNum then -- 레드 팀 멤버 수 확인 nTeamNo = KQ_TEAM_NO["KTN_RED"] end end end local nIndex = (#TeamInfo[nTeamNo]["TMEMBER_LIST"] + 1) -- 팀 멤버 리스트 인덱스 TeamInfo[nTeamNo]["TMEMBER_LIST"][nIndex] = KSMemory["PLAYER_LIST"][i]["PHND"] -- 팀 멤버 리스트 KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] = nTeamNo -- 플레이어 팀 번호 if nIndex > 1 then -- 파티 참가 cPartyJoin( TeamInfo[nTeamNo]["TMEMBER_LIST"][1], TeamInfo[nTeamNo]["TMEMBER_LIST"][nIndex] ) end -- for j = 1, #KQ_TEAM[nTeamNo]["KT_UNIFORM"] -- do -- 유니폼 설정 -- cViewSlotEquip( TeamInfo[nTeamNo]["TMEMBER_LIST"][nIndex], KQ_TEAM[nTeamNo]["KT_UNIFORM"][j] ) -- end end end -- 게임 참가자 팀 위치로 이동 for i = 1, #KSMemory["PLAYER_LIST"] do nTeamNo = KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] if nTeamNo ~= KQ_TEAM_NO["KTN_DEFAULT"] then -- 팀 번호 확인 cLinkTo( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"], KQ_TEAM[nTeamNo]["KT_POINT_X"], KQ_TEAM[nTeamNo]["KT_POINT_Y"] ) end end if #KQ_STEP >= (KSMemory["STEP_NO"] + 1) then -- 다음 단계 확인 -- 단계 설정 KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계 KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간 local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보 if MsgIndex ~= nil then -- 메세지 인덱스 확인 local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보 if MsgData ~= nil then -- 메세지 정보 학인 KSMemory["MSG_NO"] = 1 -- 메세지 단계 KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간 end end end end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) return true end ------------------------------------------------------------------------------------------ -- 시작 대기 -- ------------------------------------------------------------------------------------------ function SF_START_WAIT( KSMemory, nCurSec ) cExecCheck "SF_START_WAIT" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 if KSMemory["FLAG_INFO"] == nil then -- 깃발 정보 확인 return false end cStartMsg_AllInMap( KSMemory["FIELD_NAME"] ) -- 킹퀘 시작 카운트 다운 -- 아이템 몬스터 소환 for i = 1, #KQ_ITEM_MOB do KSMemory["MOB_LIST"][i] = {} KSMemory["MOB_LIST"][i]["MHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_ITEM_MOB[i]["KIM_INDEX"], KQ_ITEM_MOB[i]["KIM_X"], KQ_ITEM_MOB[i]["KIM_Y"], KQ_ITEM_MOB[i]["KIM_DIR"] ) KSMemory["MOB_LIST"][i]["MREGEN_TIME"] = 0 end local nNextStep = KSMemory["STEP_NO"] + 1 -- 다음 단계 -- 깃발 소환 KSMemory["FLAG_INFO"]["FHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_FLAG_POINT["KFP_INDEX"], KQ_FLAG_POINT["KFP_X"], KQ_FLAG_POINT["KFP_Y"], KQ_FLAG_POINT["KFP_DIR"] ) if KSMemory["FLAG_INFO"]["FHND"] == nil then nNextStep = 10 -- SF_END_WAIT else KSMemory["FLAG_INFO"]["FINDEX"] = KQ_FLAG_POINT["KFP_INDEX"] -- 깃발 루아 스크립트 설정 cSetAIScript( KQ_SCRIPT_NAME, KSMemory["FLAG_INFO"]["FHND"] ) cAIScriptFunc( KSMemory["FLAG_INFO"]["FHND"], "Entrance", "KF_FLGAG_OBJECT" ) end if #KQ_STEP >= nNextStep then -- 다음 단계 확인 -- 단계 설정 KSMemory["STEP_NO"] = nNextStep -- 다음 단계 KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간 local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보 if MsgIndex ~= nil then -- 메세지 인덱스 확인 local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보 if MsgData ~= nil then -- 메세지 정보 학인 KSMemory["MSG_NO"] = 1 -- 메세지 단계 KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간 end end end end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) return true end ------------------------------------------------------------------------------------------ -- 시작 -- ------------------------------------------------------------------------------------------ function SF_START( KSMemory, nCurSec ) cExecCheck "SF_START" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 -- 문 열기 for i = 1, #KSMemory["DOOR_LIST"] do cDoorAction( KSMemory["DOOR_LIST"][i], KQ_DOOR[i]["KD_BLOCK"], "open" ) end if #KQ_STEP >= (KSMemory["STEP_NO"] + 1) then -- 다음 단계 확인 -- 단계 설정 KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계 KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간 -- 타이머 표시 cTimer( KSMemory["FIELD_NAME"], KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] ) local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보 if MsgIndex ~= nil then -- 메세지 인덱스 확인 local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보 if MsgData ~= nil then -- 메세지 정보 학인 KSMemory["MSG_NO"] = 1 -- 메세지 단계 KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간 end end end end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) end ------------------------------------------------------------------------------------------ -- 진행 -- ------------------------------------------------------------------------------------------ function SF_ROUTINE( KSMemory, nCurSec ) cExecCheck "SF_ROUTINE" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end local TeamInfo = KSMemory["TEAM_LIST"] local FlagInfo = KSMemory["FLAG_INFO"] if TeamInfo == nil then return false end if FlagInfo == nil then return false end -- 깃발 들고 있는 플레이어 확인 FLAG_PLAYER_CHECK( KSMemory, nCurSec ) if FlagInfo["FREGEN_TIME"] ~= 0 then -- 깃발 포인트 리젠 대기 중 if nCurSec >= FlagInfo["FREGEN_TIME"] then -- 깃발 리젠 시간 확인 -- 깃발 소환 FlagInfo["FHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_FLAG_POINT["KFP_INDEX"], KQ_FLAG_POINT["KFP_X"], KQ_FLAG_POINT["KFP_Y"], KQ_FLAG_POINT["KFP_DIR"] ) if FlagInfo["FHND"] == nil then FlagInfo["FHND"] = KQ_INVALID_HANDLE else -- 깃발 루아 스크립트 설정 cSetAIScript( KQ_SCRIPT_NAME, FlagInfo["FHND"] ) cAIScriptFunc( FlagInfo["FHND"], "Entrance", "KF_FLGAG_OBJECT" ) -- 깃발 정보 초기화 FlagInfo["FPHND"] = KQ_INVALID_HANDLE FlagInfo["FINDEX"] = KQ_FLAG_POINT["KFP_INDEX"] FlagInfo["FPICK_TIME"] = 0 FlagInfo["FREGEN_TIME"] = 0 FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"] FlagInfo["FREGEN_Y"] = KQ_FLAG_POINT["KFP_Y"] -- 깃발 소환 알림 cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_REGEN02"] ) end end end if FlagInfo["FHND"] == KQ_INVALID_HANDLE and -- 깃발 핸들 FlagInfo["FPHND"] == KQ_INVALID_HANDLE and -- 깃발 획득 플레이어 핸들 FlagInfo["FREGEN_TIME"] == 0 -- 깃발 리젠 타임 then -- 킹덤 퀘스트 맵에 깃발이 존재하지는 확인 FlagInfo["FREGEN_TIME"] = KQ_FLAG_POINT["KFP_REGEN_TIME"] + nCurSec end if KSMemory["WORK_TICK"] <= nCurSec then -- 일정 시간마다 처리되는 작업(1초에 한번) if FlagInfo["FHND"] ~= KQ_INVALID_HANDLE or -- 깃발 FlagInfo["FPHND"] ~= KQ_INVALID_HANDLE -- 깃발 획득 플레이어 then local MapMarkTable = {} local mmData = {} mmData["Group"] = 0 mmData["x"] = FlagInfo["FREGEN_X"] mmData["y"] = FlagInfo["FREGEN_Y"] mmData["KeepTime"] = 1000 mmData["IconIndex"] = KQ_FLAG_ICON MapMarkTable[mmData["Group"]] = mmData -- 깃발 마킹 정보 알림 cMapMark( KSMemory["FIELD_NAME"], MapMarkTable ) end -- 게임 참가 플레이어 킹덤 퀘스트맵 접속 여부 확인 local nLogOut_RedTeam = 0 -- 레드 팀 접속하지 않은 멤버 수 local nLogOut_BlueTeam = 0 -- 블루 팀 접속하지 않은 멤버 수 for i = 1, #KSMemory["PLAYER_LIST"] do if KSMemory["PLAYER_LIST"] [i]["PIS_MAP"] == true then -- 킹덤 퀘스트맵에 접속해있는 플레이어 if cIsInMap( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"] ) == nil then -- 킹덤 퀘스트맵에 접속해있는지 확인 KSMemory["PLAYER_LIST"][i]["PIS_MAP"] = false end end if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == false then -- 킹덤 퀘스트맵에 접속하지 않은 팀원 if KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_RED"] then nLogOut_RedTeam = nLogOut_RedTeam + 1 elseif KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_BLUE"] then nLogOut_BlueTeam = nLogOut_BlueTeam + 1 end end end if nLogOut_RedTeam >= #TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TMEMBER_LIST"] or -- 레드 팀 nLogOut_BlueTeam >= #TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TMEMBER_LIST"] -- 블루 팀 then -- 킹덤 퀘스트맵에 접속하지 않은 멤버 수 확인 TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] = 0 TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] = 0 KSMemory["GAME_TYPE"] = KQ_GAME_TYEP["KGT_EXTRATIME"] KSMemory["STEP_NEXT_TIME"] = 0 end -- 몬스터 확인( 아이템 몬스터 ) for i = 1, #KSMemory["MOB_LIST"] do if cIsObjectDead( KSMemory["MOB_LIST"][i]["MHND"] ) ~= nil then -- 몬스터 죽었는지 확인 if KSMemory["MOB_LIST"][i]["MREGEN_TIME"] == 0 then -- 리젠 시간 설정 KSMemory["MOB_LIST"][i]["MREGEN_TIME"] = KQ_ITEM_MOB[i]["KIM_REGEN_TICK"] + nCurSec else -- 리젠 시간 확인 if KSMemory["MOB_LIST"][i]["MREGEN_TIME"] <= nCurSec then -- 몬스터 리젠 KSMemory["MOB_LIST"][i]["KSMM_HND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_ITEM_MOB[i]["KIM_INDEX"], KQ_ITEM_MOB[i]["KIM_X"], KQ_ITEM_MOB[i]["KIM_Y"], KQ_ITEM_MOB[i]["KIM_DIR"] ) KSMemory["MOB_LIST"][i]["MREGEN_TIME"] = 0 end end end end -- 다음 시간 설정 KSMemory["WORK_TICK"] = nCurSec + 1 end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 if FlagInfo["FPHND"] ~= KQ_INVALID_HANDLE then -- 깃발 상태이상 해제 for k = 1, #KQ_FLAG_ABSTATE do cResetAbstate( FlagInfo["FPHND"], KQ_FLAG_ABSTATE[k]["KFA_INDEX"] ) end end if FlagInfo["FHND"] ~= KQ_INVALID_HANDLE then -- 깃발 오브젝트 삭제 cNPCVanish( FlagInfo["FHND"] ) end -- 깃발 정보 초기화 FlagInfo["FHND"] = KQ_INVALID_HANDLE FlagInfo["FPHND"] = KQ_INVALID_HANDLE FlagInfo["FINDEX"] = "" FlagInfo["FPICK_TIME"] = 0 FlagInfo["FREGEN_TIME"] = 0 FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"] FlagInfo["FREGEN_Y"] = KQ_FLAG_POINT["KFP_Y"] -- 몬스터 삭제( 아이템 몬스터 ) for i = 1, #KSMemory["MOB_LIST"] do cNPCVanish( KSMemory["MOB_LIST"][i]["MHND"] ) KSMemory["MOB_LIST"][i] = nil end -- 팀별 득점 포인트 삭제 for i = 1, #TeamInfo do if TeamInfo[i]["TPOINT_HND"] ~= KQ_INVALID_HANDLE then -- 득점 포인트 핸들 확인 cNPCVanish( TeamInfo[i]["TPOINT_HND"] ) TeamInfo[i]["TPOINT_HND"] = KQ_INVALID_HANDLE end end cTimer( KSMemory["FIELD_NAME"], 0 ) local nNextStep = 10 -- SF_END_WAIT if KSMemory["GAME_TYPE"] == KQ_GAME_TYEP["KGT_NORMAL"] and -- 일반 경기 TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] == TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] -- 무승부 then nNextStep = KSMemory["STEP_NO"] + 1 -- SF_EXTRATIME_INIT else for i = 1, #KSMemory["PLAYER_LIST"] do cSetAbstate( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_STUN_ABSTATE["KSA_INDEX"], KQ_STUN_ABSTATE["KSA_STR"], KQ_STUN_ABSTATE["KSA_KEEPTIME"] ) end end if KSMemory["STEP_NEXT_TIME"] ~= 0 then cScriptMessage( KSMemory["FIELD_NAME"], KQ_MSG["KM_GAME_TIME"][1]["KM_INDEX"] ) end if #KQ_STEP >= nNextStep then -- 다음 단계 확인 -- 단계 설정 KSMemory["STEP_NO"] = nNextStep -- 다음 단계 KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간 local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보 if MsgIndex ~= nil then -- 메세지 인덱스 확인 local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보 if MsgData ~= nil then -- 메세지 정보 학인 KSMemory["MSG_NO"] = 1 -- 메세지 단계 KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간 end end end end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) return true end ------------------------------------------------------------------------------------------ -- 연장전 진행을 위한 초기화 -- ------------------------------------------------------------------------------------------ function SF_EXTRATIME_INIT( KSMemory, nCurSec ) cExecCheck "SF_EXTRATIME_INIT" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 -- 문 닫기 for i = 1, #KSMemory["DOOR_LIST"] do cDoorAction( KSMemory["DOOR_LIST"][i], KQ_DOOR[i]["KD_BLOCK"], "close" ) end -- 팀위치로 이동 for i = 1, #KSMemory["PLAYER_LIST"] do local nTeamNo = KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] -- 팀 번호 if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == true then -- 킹덤 퀘스트맵에 접속해있는지 확인 cLinkTo( KSMemory["PLAYER_LIST"][i]["PHND"], KSMemory["FIELD_NAME"], KQ_TEAM[nTeamNo]["KT_POINT_X"], KQ_TEAM[nTeamNo]["KT_POINT_Y"] ) end end -- 연장전 설정 KSMemory["GAME_TYPE"] = KQ_GAME_TYEP["KGT_EXTRATIME"] if #KQ_STEP >= (KSMemory["STEP_NO"] + 1) then -- 다음 단계 확인 -- 단계 설정 KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계 KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간 local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보 if MsgIndex ~= nil then -- 메세지 인덱스 확인 local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보 if MsgData ~= nil then -- 메세지 정보 학인 KSMemory["MSG_NO"] = 1 -- 메세지 단계 KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간 end end end end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) return true end ------------------------------------------------------------------------------------------ -- 게임 끝 대기 -- ------------------------------------------------------------------------------------------ function SF_END_WAIT( KSMemory, nCurSec ) cExecCheck "SF_END_WAIT" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 local TeamInfo = KSMemory["TEAM_LIST"] -- 팀 정보 local RedTeamResult = nil -- 레드 팀 결과 정보 local BlueTeamResult = nil -- 블루 팀 결과 정보 local PlayerReward = nil -- 플레이어 결과 정보 if TeamInfo == nil then -- 팀 정보 확인 return false end if TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] == TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] then -- 무승부 RedTeamResult = KQ_RESULT["KR_DRAW"] BlueTeamResult = KQ_RESULT["KR_DRAW"] elseif TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"] > TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] then -- 레드팀 승리 RedTeamResult = KQ_RESULT["KR_WIN"] BlueTeamResult = KQ_RESULT["KR_LOSE"] else -- 블루팀 승리 RedTeamResult = KQ_RESULT["KR_LOSE"] BlueTeamResult = KQ_RESULT["KR_WIN"] end -- 게임 결과 처리 for i = 1, #KSMemory["PLAYER_LIST"] do if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == true then -- 킹덤 퀘스트맵에 접속해있는지 확인 if KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_RED"] then -- 레드 팀 PlayerReward = RedTeamResult elseif KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == KQ_TEAM_NO["KTN_BLUE"] then -- 블루 팀 PlayerReward = BlueTeamResult end cPartyLeave( KSMemory["PLAYER_LIST"][i]["PHND"] ) -- 파티 해제 cViewSlotUnEquipAll( KSMemory["PLAYER_LIST"][i]["PHND"] ) -- 코스튬 해제 cResetAbstate( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_MAPLOGIN_ABSTATE["KMA_INDEX"] ) -- 이동 속도 증가 상태이상 제거 cKQRewardIndex( KSMemory["PLAYER_LIST"][i]["PHND"], PlayerReward["KRE_REWAED"] ) -- 보상 cEffectMsg( KSMemory["PLAYER_LIST"][i]["PHND"], PlayerReward["KRE_EFFECT_MSG"] ) -- 이펙트 메세지 cEmoticon( KSMemory["PLAYER_LIST"][i]["PHND"], PlayerReward["KRE_EMOTICON"] ) -- 이모션 end -- 팀 번호 초기화 KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] = KQ_TEAM_NO["KTN_DEFAULT"] end -- 팀 정보 초기화 for i = 1, #KSMemory["TEAM_LIST"] do KSMemory["TEAM_LIST"][i]["TSCORE"] = 0 KSMemory["TEAM_LIST"][i]["TPOINT_HND"] = KQ_INVALID_HANDLE KSMemory["TEAM_LIST"][i]["TMEMBER_LIST"] = nil KSMemory["TEAM_LIST"][i]["TMEMBER_LIST"] = {} end -- 타이머 초기화 cTimer( KSMemory["FIELD_NAME"], 0 ) if #KQ_STEP >= (KSMemory["STEP_NO"] + 1) then -- 다음 단계 확인 -- 단계 설정 KSMemory["STEP_NO"] = KSMemory["STEP_NO"] + 1 -- 다음 단계 KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[KSMemory["STEP_NO"]]["KS_NEXT_TIME"] -- 다음 단계 진행 시간 local MsgIndex = KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] -- 메세지 정보 if MsgIndex ~= nil then -- 메세지 인덱스 확인 local MsgData = KQ_MSG[MsgIndex] -- 메세지 정보 if MsgData ~= nil then -- 메세지 정보 학인 KSMemory["MSG_NO"] = 1 -- 메세지 단계 KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[1]["KM_TIME"] -- 메세지 출력 시간 end end end end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) end ------------------------------------------------------------------------------------------ -- 게임 끝 -- ------------------------------------------------------------------------------------------ function SF_END( KSMemory, nCurSec ) cExecCheck "SF_END" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end if KSMemory["STEP_NEXT_TIME"] <= nCurSec then -- 현재 단계 진행 시간 확인 -- 마을로 이동 cLinkToAll( KSMemory["FIELD_NAME"], KQ_RETURN_MAP["KRM_INDEX"], KQ_RETURN_MAP["KRM_X"], KQ_RETURN_MAP["KRM_Y"] ) -- 킹덤 퀘스트 종료 cEndOfKingdomQuest( KSMemory["FIELD_NAME"] ) -- 다음 단계 설정 KSMemory["STEP_NO"] = nil KSMemory["STEP_NEXT_TIME"] = nil return true end -- 메시지 출력 KF_MESSAGE( KSMemory, nCurSec ) return true end ------------------------------------------------------------------------------------------ -- 플레이어 깃발 확인 -- ------------------------------------------------------------------------------------------ function FLAG_PLAYER_CHECK( KSMemory, nCurSec ) cExecCheck "FLAG_PLAYER_CHECK" if KSMemory == nil then -- 킹덤 퀘스트 버퍼 확인 return false end if nCurSec == nil then -- 시간 확인 return false end local TeamInfo = KSMemory["TEAM_LIST"] local FlagInfo = KSMemory["FLAG_INFO"] if TeamInfo == nil then -- 팀 정보 확인 return end if FlagInfo == nil then -- 깃발 정보 확인 return end if FlagInfo["FREGEN_TIME"] ~= 0 then -- 깃발 리젠 타임 확인 return end if FlagInfo["FPHND"] == KQ_INVALID_HANDLE then -- 깃발 획득 플레이어 확인 return end local PlayerInfo = nil -- 플레이어 정보 local PlayerMaxNum = #KSMemory["PLAYER_LIST"] -- 게임 참가 플레이어 수 -- 깃발 획득 플레이어 찾기 for i = 1, PlayerMaxNum do if FlagInfo["FPHND"] == KSMemory["PLAYER_LIST"][i]["PHND"] then PlayerInfo = KSMemory["PLAYER_LIST"][i] end end if PlayerInfo == nil then -- 플레이어 정보 확인 return end if cIsInMap( PlayerInfo["PHND"], KSMemory["FIELD_NAME"] ) == nil then -- 킹덤 퀘스트맵에 접속해있지 않을 경우 -- 마지막 위치에 깃발 소환 FlagInfo["FHND"] = cMobRegen_XY( KSMemory["FIELD_NAME"], KQ_FLAG["KF_INDEX"], FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"], 0 ) if FlagInfo["FHND"] == nil then FlagInfo["FHND"] = KQ_INVALID_HANDLE else -- 깃발 루아 스크립트 설정 cSetAIScript( KQ_SCRIPT_NAME, FlagInfo["FHND"] ) cAIScriptFunc( FlagInfo["FHND"], "Entrance", "KF_FLGAG_OBJECT" ) -- 깃발 드랍 알림 cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_DROP"], PlayerInfo["PNAME"] ) -- 깃발 정보 설정 FlagInfo["FPHND"] = KQ_INVALID_HANDLE FlagInfo["FINDEX"] = KQ_FLAG["KF_INDEX"] FlagInfo["FPICK_TIME"] = nCurSec + KQ_FLAG["KF_PICK_DELAY"] FlagInfo["FREGEN_TIME"] = 0 -- 득점 포인트 삭제 if TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ~= KQ_INVALID_HANDLE then cNPCVanish( TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ) TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] = KQ_INVALID_HANDLE end end else -- 깃발 상태이상 지속시간 local RestTime = cAbstateRestTime( PlayerInfo["PHND"], KQ_FLAG_ABSTATE[1]["KFA_INDEX"] ) if RestTime == nil then -- 깃발 상태이상 지속시간 확인 -- 깃발 화살표 상태이상 제거 cResetAbstate( FlagInfo["FPHND"], KQ_FLAG_ABSTATE[2]["KFA_INDEX"] ) -- 깃발 소환 FlagInfo["FHND"] = cMobRegen_Obj( KQ_FLAG["KF_INDEX"], PlayerInfo["PHND"] ) if FlagInfo["FHND"] == nil then FlagInfo["FHND"] = KQ_INVALID_HANDLE else -- 깃발 루아 스크립트 설정 cSetAIScript( KQ_SCRIPT_NAME, FlagInfo["FHND"] ) cAIScriptFunc( FlagInfo["FHND"], "Entrance", "KF_FLGAG_OBJECT" ) -- 깃발 드랍 알림 cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_DROP"], PlayerInfo["PNAME"] ) -- 깃발 정보 설정 FlagInfo["FPHND"] = KQ_INVALID_HANDLE FlagInfo["FINDEX"] = KQ_FLAG["KF_INDEX"] FlagInfo["FPICK_TIME"] = nCurSec + KQ_FLAG["KF_PICK_DELAY"] FlagInfo["FREGEN_TIME"] = 0 -- 깃발 위치 설정 FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"] = cObjectLocate( PlayerInfo["PHND"] ) if FlagInfo["FREGEN_X"] == nil or FlagInfo["FREGEN_Y"] == nil then -- 플레이어 위치 정보 확인 FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"] FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_Y"] end -- 득점 포인트 삭제 if TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ~= KQ_INVALID_HANDLE then cNPCVanish( TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ) TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] = KQ_INVALID_HANDLE end end else if TeamInfo[PlayerInfo["PTEAM_NO"]] ~= nil then -- 플레이어 정보 확인 -- 플레이어 위치 FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"] = cObjectLocate( PlayerInfo["PHND"] ) if FlagInfo["FREGEN_X"] == nil or FlagInfo["FREGEN_Y"] == nil then -- 플레이어 위치 정보 확인 FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"] FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_Y"] end -- 스코어 포인트 거리 local Dist = cDistanceSquar( KQ_TEAM[PlayerInfo["PTEAM_NO"]]["KT_POINT_X"], KQ_TEAM[PlayerInfo["PTEAM_NO"]]["KT_POINT_Y"], FlagInfo["FREGEN_X"], FlagInfo["FREGEN_Y"] ) local CheckDist = ( KQ_TEAM_POINT_CHECK_DIST * KQ_TEAM_POINT_CHECK_DIST ) if Dist <= CheckDist then -- 스코어 포인트 거리 확인 -- 깃발 해제 for k = 1, #KQ_FLAG_ABSTATE do cResetAbstate( PlayerInfo["PHND"], KQ_FLAG_ABSTATE[k]["KFA_INDEX"] ) end -- 깃발 정보 초기화 및 리젠 시간 설정 FlagInfo["FHND"] = KQ_INVALID_HANDLE FlagInfo["FPHND"] = KQ_INVALID_HANDLE FlagInfo["FINDEX"] = "" FlagInfo["FPICK_TIME"] = 0 FlagInfo["FREGEN_TIME"] = nCurSec + KQ_FLAG_POINT["KFP_REGEN_TIME"] FlagInfo["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"] FlagInfo["FREGEN_Y"] = KQ_FLAG_POINT["KFP_Y"] -- 득점 TeamInfo[PlayerInfo["PTEAM_NO"]]["TSCORE"] = TeamInfo[PlayerInfo["PTEAM_NO"]]["TSCORE"] + 1 -- 팀 정보 알림 cScoreInfo_AllInMap( KSMemory["FIELD_NAME"], #KQ_TEAM , TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"], TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] ) -- 득점 포인트 삭제 if TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ~= KQ_INVALID_HANDLE then cNPCVanish( TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] ) TeamInfo[PlayerInfo["PTEAM_NO"]]["TPOINT_HND"] = KQ_INVALID_HANDLE end -- 연장전에서 득점시, 바로 경기 종료 if KSMemory["GAME_TYPE"] == KQ_GAME_TYEP["KGT_EXTRATIME"] then KSMemory["STEP_NEXT_TIME"] = 0 else -- 득점 알림 if PlayerInfo["PTEAM_NO"] == KQ_TEAM_NO["KTN_RED"] then -- 레드 팀 cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_POINT_RED"], PlayerInfo["PNAME"] ) elseif PlayerInfo["PTEAM_NO"] == KQ_TEAM_NO["KTN_BLUE"] then -- 블루 팀 cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_POINT_BLUE"], PlayerInfo["PNAME"] ) end -- 득,실점 사운드 for i = 1, #KSMemory["PLAYER_LIST"] do if KSMemory["PLAYER_LIST"][i]["PTEAM_NO"] == PlayerInfo["PTEAM_NO"] then cPlaySound( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_SOUND["KS_GETPOINT"] ); else cPlaySound( KSMemory["PLAYER_LIST"][i]["PHND"], KQ_SOUND["KS_LOSEPOINT"] ); end end -- 깃발 생성 관련 메세지 알림 cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_REGEN01"] ) end end end end end end -- 킹덤 퀘스트 단계별 데이터 KQ_STEP = { -------------------------------------------------------------------------------------------- -- 진행 함수, 다음 진행 시간, 메시지 데이터( KDSpring_Data ) -------------------------------------------------------------------------------------------- { KS_FUNC = SF_DIVIDE_TEAM_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 30, KS_MSG = nil }, -- 1 팀 나누기 대기 { KS_FUNC = SF_DIVIDE_TEAM, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 5, KS_MSG = "KM_DIVIDE_TEAM" }, -- 2 팀 나누기 { KS_FUNC = SF_START_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 55, KS_MSG = "KM_START_WAIT" }, -- 3 게임 시작 대기 { KS_FUNC = SF_START, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 5, KS_MSG = nil }, -- 4 게임 시작 { KS_FUNC = SF_ROUTINE, KS_TIMER = true, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 600, KS_MSG = nil }, -- 5 게임 진행 -- 연장전 { KS_FUNC = SF_EXTRATIME_INIT, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 10, KS_MSG = "KM_EXTRA_TIME_WAIT" }, -- 6 연장전 시작을 위한 초기화 { KS_FUNC = SF_START_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 10, KS_MSG = nil }, -- 7 연장전 게임 시작 대기 { KS_FUNC = SF_START, KS_TIMER = false, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 5, KS_MSG = nil }, -- 8 연장전 게임 시작 { KS_FUNC = SF_ROUTINE, KS_TIMER = true, KS_LINKTO_TEAM = true, KS_NEXT_TIME = 180, KS_MSG = nil }, -- 9 연장전 게임 진행 { KS_FUNC = SF_END_WAIT, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 2, KS_MSG = nil }, -- 10 게임 종료 대기 { KS_FUNC = SF_END, KS_TIMER = false, KS_LINKTO_TEAM = false, KS_NEXT_TIME = 60, KS_MSG = "KM_END" }, -- 11 게임 종료 }