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/KDSpring/KDSpring.lua

488 lines
14 KiB

require( "common" )
require( "KQ/KDSpring/KDSpring_Data" )
require( "KQ/KDSpring/KDSpring_StepFunc" )
------------------------------------------------------------------------------------------
-- 킹덤 퀘스트 데이터 초기화 --
------------------------------------------------------------------------------------------
function KF_INIT( Field, KSMemory, nCurSec )
cExecCheck "KF_INIT"
if Field == nil
then -- 필드 이름 확인
return
end
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return
end
if nCurSec == nil
then -- 시간 확인
return
end
-- 킹덤 퀘스트 필드 스크립트 설정
cSetFieldScript( Field, KQ_SCRIPT_NAME )
cFieldScriptFunc( Field, "MapLogin", "KF_MAP_LOGIN" ) -- 캐릭터 맵로그인시 호출되는 함수 설정
-- 진행 정보 초기화
KSMemory["FIELD_NAME"] = Field
KSMemory["WORK_TICK"] = 0
KSMemory["STEP_NO"] = 1
KSMemory["STEP_NEXT_TIME"] = nCurSec + KQ_STEP[1]["KS_NEXT_TIME"]
KSMemory["MSG_NO"] = 1
KSMemory["MSG_NEXT_TIME"] = 1
KSMemory["GAME_TYPE"] = KQ_GAME_TYEP["KGT_NORMAL"]
-- 깃발 정보 초기화
KSMemory["FLAG_INFO"] = {}
KSMemory["FLAG_INFO"]["FHND"] = KQ_INVALID_HANDLE
KSMemory["FLAG_INFO"]["FINDEX"] = ""
KSMemory["FLAG_INFO"]["FPHND"] = KQ_INVALID_HANDLE
KSMemory["FLAG_INFO"]["FPICK_TIME"] = 0
KSMemory["FLAG_INFO"]["FREGEN_TIME"] = 0
KSMemory["FLAG_INFO"]["FREGEN_X"] = KQ_FLAG_POINT["KFP_X"]
KSMemory["FLAG_INFO"]["FREGEN_Y"] = KQ_FLAG_POINT["KFP_Y"]
-- 플레이어 리스트 초기화
KSMemory["PLAYER_LIST"] = {}
-- KSMemory["PLAYER_LIST"][n] = {}
-- KSMemory["PLAYER_LIST"][n]["PHND"] = KQ_INVALID_HANDLE
-- KSMemory["PLAYER_LIST"][n]["PREG_NO"] = KQ_INVALID_HANDLE
-- KSMemory["PLAYER_LIST"][n]["PNAME"] = ""
-- KSMemory["PLAYER_LIST"][n]["PTEAM_NO"] = 0
-- KSMemory["PLAYER_LIST"][n]["PIS_MAP"] = false
-- KSMemory["PLAYER_LIST"][n]["PPICK_TIME"] = 0
-- 팀 정보 초기화
KSMemory["TEAM_LIST"] =
{
{ -- RED TEAM
TSCORE = 0,
TPOINT_HND = KQ_INVALID_HANDLE,
TMEMBER_LIST = {},
},
{ -- BLUE TEAM
TSCORE = 0,
TPOINT_HND = KQ_INVALID_HANDLE,
TMEMBER_LIST = {},
},
}
-- 몬스터 정보
KSMemory["MOB_LIST"] = {}
-- KSMemory["MOB_LIST"][n] = {}
-- KSMemory["MOB_LIST"][n]["MHND"] = KQ_INVALID_HANDLE
-- KSMemory["MOB_LIST"][n]["MREGEN_TIME"] = 0
-- 문 소환
KSMemory["DOOR_LIST"] = {}
for i = 1, #KQ_DOOR
do
KSMemory["DOOR_LIST"][i] = cDoorBuild( KSMemory["FIELD_NAME"], KQ_DOOR[i]["KD_INDEX"], KQ_DOOR[i]["KD_X"], KQ_DOOR[i]["KD_Y"], KQ_DOOR[i]["KD_DIR"], KQ_DOOR[i]["KD_SCALE"] )
cDoorAction( KSMemory["DOOR_LIST"][i], KQ_DOOR[i]["KD_BLOCK"], "open" )
end
end
------------------------------------------------------------------------------------------
-- 맵 로그인 --
------------------------------------------------------------------------------------------
function KF_MAP_LOGIN( Field, Handle )
cExecCheck "KF_MAP_LOGIN"
local KSMemory = InstanceField[Field] -- 킹덤 퀘스트 버퍼
local nCurSec = cCurSec(); -- 현재 시간(초)
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return
end
if Handle == nil
then -- 플레이어 핸들 확인
return
end
if nCurSec == nil
then -- 시간 확인
nCurSec = 0
end
local nAdminLevel = cGetAdminLevel( Handle ) -- 운영자 레벨
local nCharNo = cGetCharNo( Handle ) -- 캐릭터 번호
local TeamInfo = KSMemory["TEAM_LIST"] -- 킹덤 퀘스트 버퍼 : 팀 정보
if nAdminLevel > 0
then -- 운영자 레벨 확인
if cAbstateRestTime( Handle, "StaGMHideMode" ) ~= nil
then -- Hide 상태 확인
return
end
end
if nCharNo == nil
then -- 캐릭터 번호 확인
return
end
if TeamInfo == nil
then -- 팀 정보 확인
return
end
local bLinkto = false -- 팀 위치로 이동
local bNewPlayer = true -- 새로 들어온 플레이어
local nPlayerNum = #KSMemory["PLAYER_LIST"] -- 참여 플레이어 수
local nPlayerIndex = nPlayerNum + 1 -- 플레이어 목록에 새로 추가될 인덱스
local nTeamNo = KQ_TEAM_NO["KTN_DEFAULT"] -- 팀 번호
for i = 1, nPlayerNum
do -- 플레이어 목록 탐색
if KSMemory["PLAYER_LIST"][i]["PREG_NO"] == nCharNo
then -- 플레이어 목록에 존재하는 플레이어
bNewPlayer = false
nPlayerIndex = i
nTeamNo = KSMemory["PLAYER_LIST"][i]["PTEAM_NO"]
if KSMemory["PLAYER_LIST"][i]["PHND"] ~= Handle
then -- 서버 재접속으로 핸들이 바뀐 플레이어
cAssertLog( "Handle Change" )
KSMemory["PLAYER_LIST"][i]["PHND"] = Handle
for j = 1, #TeamInfo[nTeamNo]
do -- 팀 목록 탐색
if TeamInfo[nTeamNo]["TMEMBER_LIST"][j] == KSMemory["PLAYER_LIST"][i]["PHND"]
then -- 팀 멤버 확인
TeamInfo[nTeamNo]["TMEMBER_LIST"][j] = Handle
end
end
end
KSMemory["PLAYER_LIST"][i]["PPICK_TIME"] = nCurSec + KQ_PLAYER_PICK_DELAY -- 깃발 획득 가능 시간
if KSMemory["PLAYER_LIST"][i]["PIS_MAP"] == false
then -- 킹퀘 앱에 있었는지 확인
bLinkto = true
KSMemory["PLAYER_LIST"][i]["PIS_MAP"] = true
end
break
end
end
if bNewPlayer == true and -- 새로 들어온 플레이어
nPlayerNum >= KQ_MAX_PLAYER -- 참가 플레이어의 수
then -- 참가 플레이어 최대 수 확인
cLinkTo( Handle, KQ_RETURN_MAP["KRM_INDEX"], KQ_RETURN_MAP["KRM_X"],KQ_RETURN_MAP["KRM_Y"] )
return
end
if bNewPlayer == true
then -- 새로 들어온 플레이어
KSMemory["PLAYER_LIST"][nPlayerIndex] = {}
KSMemory["PLAYER_LIST"][nPlayerIndex]["PHND"] = Handle -- 핸들
KSMemory["PLAYER_LIST"][nPlayerIndex]["PREG_NO"] = nCharNo -- 캐릭터 번호
KSMemory["PLAYER_LIST"][nPlayerIndex]["PNAME"] = cGetPlayerName( Handle ) -- 캐릭터 이름
KSMemory["PLAYER_LIST"][nPlayerIndex]["PTEAM_NO"] = KQ_TEAM_NO["KTN_DEFAULT"] -- 팀 번호
KSMemory["PLAYER_LIST"][nPlayerIndex]["PIS_MAP"] = true -- 맵에 존재하는지
KSMemory["PLAYER_LIST"][nPlayerIndex]["PPICK_TIME"] = nCurSec + KQ_PLAYER_PICK_DELAY -- 깃발 획득 가능 시간
-- 파티 해제
cPartyLeave( Handle )
end
-- 점수 정보 보내기
cScoreInfo( Handle, #KQ_TEAM, TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TSCORE"], TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TSCORE"] )
-- 맵 로그인시 상태이상 걸기
cSetAbstate( Handle, KQ_MAPLOGIN_ABSTATE["KMA_INDEX"], KQ_MAPLOGIN_ABSTATE["KMA_STR"], KQ_MAPLOGIN_ABSTATE["KMA_KEEPTIME"] )
if nTeamNo == KQ_TEAM_NO["KTN_DEFAULT"]
then -- 팀 번호 확인
local RedMemberNum = #TeamInfo[KQ_TEAM_NO["KTN_RED"]]["TMEMBER_LIST"]
local BlueMemberNum = #TeamInfo[KQ_TEAM_NO["KTN_BLUE"]]["TMEMBER_LIST"]
if RedMemberNum > 0 or BlueMemberNum > 0
then -- 팀 배정 여부 확인
if cPermileRate( 500 ) == 1
then -- 랜덤하게 팀 번호 설정
nTeamNo = KQ_TEAM_NO["KTN_RED"]
if RedMemberNum > BlueMemberNum
then -- 레드팀 인원이 블루팀보다 많을 경우
nTeamNo = KQ_TEAM_NO["KTN_BLUE"]
end
else
nTeamNo = KQ_TEAM_NO["KTN_BLUE"]
if BlueMemberNum > RedMemberNum
then -- 블루팀 인원이 레드팀보다 많을 경우
nTeamNo = KQ_TEAM_NO["KTN_RED"]
end
end
local nIndex = (#TeamInfo[nTeamNo]["TMEMBER_LIST"] + 1)
-- 팀 멤버에 추가
TeamInfo[nTeamNo]["TMEMBER_LIST"][nIndex] = Handle
KSMemory["PLAYER_LIST"][nPlayerIndex]["PTEAM_NO"] = nTeamNo
-- 파티 참가
cPartyJoin( TeamInfo[nTeamNo]["TMEMBER_LIST"][1], Handle )
-- 팀 시작점으로 이동
cLinkTo( Handle, KSMemory["FIELD_NAME"], KQ_TEAM[nTeamNo]["KT_POINT_X"], KQ_TEAM[nTeamNo]["KT_POINT_Y"] )
end
return
end
if bLinkto == true and -- 팀 위치로 이동
KQ_STEP[KSMemory["STEP_NO"]]["KS_LINKTO_TEAM"] == true -- 스탭 정보 : 팀 위치로 이동
then -- 플레이어 팀 위치로 이동
cLinkTo( Handle, KSMemory["FIELD_NAME"], KQ_TEAM[nTeamNo]["KT_POINT_X"], KQ_TEAM[nTeamNo]["KT_POINT_Y"] )
return
end
for j = 1, #KQ_TEAM[nTeamNo]["KT_UNIFORM"]
do -- 팀 유니폼 입히기
cViewSlotEquip( Handle, KQ_TEAM[nTeamNo]["KT_UNIFORM"][j] )
end
if KQ_STEP[KSMemory["STEP_NO"]]["KS_TIMER"] == true
then -- 타이머 표시 여부 확인
local nTime = (KSMemory["STEP_NEXT_TIME"] - nCurSec)
cTimer_Obj( Handle, nTime )
end
end
------------------------------------------------------------------------------------------
-- 메세지 전송 --
------------------------------------------------------------------------------------------
function KF_MESSAGE( KSMemory, nCurSec )
cExecCheck "KF_MESSAGE"
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return false
end
if nCurSec == nil
then -- 시간 확인
return false
end
if KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"] == nil
then -- 해당 스탭 메시지 정보 확인
return true
end
if KSMemory["MSG_NEXT_TIME"] > nCurSec
then -- 메시지 출력 시간 확인
return true
end
local MsgData = KQ_MSG[KQ_STEP[KSMemory["STEP_NO"]]["KS_MSG"]] -- 메시지 정보
local MsgStep = KSMemory["MSG_NO"] -- 메시지 단계
if MsgData == nil
then -- 메시지 정보 확인
return false
end
if MsgStep == nil
then -- 메시지 단계 확인
return false
end
if #MsgData < MsgStep
then --메시지 단계 최대치 확인
return true
end
if MsgData[MsgStep]["KM_TYPE"] == KQ_MSG_TYPE["KMT_SHN"]
then -- ScriptMessage
cScriptMessage( KSMemory["FIELD_NAME"], MsgData[MsgStep]["KM_INDEX"], MsgData[MsgStep]["KM_VAL"] )
elseif MsgData[MsgStep]["KM_TYPE"] == KQ_MSG_TYPE["KMT_TXT"]
then -- Notice
cNotice( KSMemory["FIELD_NAME"], MsgData[MsgStep]["KM_FILE_NAME"], MsgData[MsgStep]["KM_INDEX"] )
end
-- 메시지 다음 단계 설정
MsgStep = MsgStep + 1
if #MsgData < MsgStep
then -- 모든 메시지 처리
KSMemory["MSG_NO"] = 1
KSMemory["MSG_NEXT_TIME"] = KSMemory["STEP_NEXT_TIME"]
else -- 다음 단계 설정
KSMemory["MSG_NO"] = MsgStep
KSMemory["MSG_NEXT_TIME"] = nCurSec + MsgData[MsgStep]["KM_TIME"]
end
end
------------------------------------------------------------------------------------------
-- 깃발 오브젝트 루틴 --
------------------------------------------------------------------------------------------
function KF_FLGAG_OBJECT( Handle, Field )
cExecCheck "KF_FLGAG_OBJECT"
local KSMemory = InstanceField[Field] -- 킹덤 퀘스트 버퍼
local nCurSec = cCurSec() -- 현재 시간(초)
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
return ReturnAI.END
end
if KSMemory["FLAG_INFO"] == nil
then -- 킹덤 퀘스트 버퍼 : 깃발 정보 확인
return ReturnAI.END
end
if KSMemory["FLAG_INFO"]["FPHND"] ~= KQ_INVALID_HANDLE
then -- 킹덤 퀘스트 버퍼 : 누군가 깃발을 가지고 있을 경우
cNPCVanish( Handle )
return ReturnAI.END
end
if KSMemory["PLAYER_LIST"] == nil
then -- 킹덤 퀘스트 버퍼 : 플레이어 정보 확인
return ReturnAI.END
end
if nCurSec == nil
then -- 시간 변수 확인
return ReturnAI.END
end
if nCurSec < KSMemory["FLAG_INFO"]["FPICK_TIME"]
then -- 시간 확인
return ReturnAI.END
end
local nCheckDist = KQ_FLAG["KF_CHECK_DIST"] -- 깃발 체크 거리(기본 깃발 오브젝트 거리)
if KSMemory["FLAG_INFO"]["FINDEX"] == KQ_FLAG_POINT["KFP_INDEX"]
then -- 깃발 종류 확인 ( 깃발 오브젝트, 깃발 포인트 오브젝트 )
nCheckDist = KQ_FLAG_POINT["KFP_CHECK_DIST"]
end
-- 깃발 체크 거리 안에 있는 플레이어 리스트 가져오기
local PlayerList = { cNearObjectList( Handle, nCheckDist, ObjectType["Player"] ) }
for i = 1, #PlayerList
do
for j = 1, #KSMemory["PLAYER_LIST"]
do
if KSMemory["PLAYER_LIST"][j]["PHND"] == PlayerList[i] and -- 핸들
KSMemory["PLAYER_LIST"][j]["PTEAM_NO"] ~= KQ_TEAM_NO["KTN_DEFAULT"] and -- 팀 번호
KSMemory["PLAYER_LIST"][j]["PPICK_TIME"] <= nCurSec -- 깃발 획득가능 시간
then -- 깃발 획득 가능 초건 확인
-- 깃발 정보 설정
KSMemory["FLAG_INFO"]["FHND"] = KQ_INVALID_HANDLE -- 깃발 핸들
KSMemory["FLAG_INFO"]["FPHND"] = PlayerList[i] -- 깃발 획득 플레이어 핸들
-- 깃발 상태이상 걸기
for k = 1, #KQ_FLAG_ABSTATE
do
cSetAbstate( KSMemory["FLAG_INFO"]["FPHND"], KQ_FLAG_ABSTATE[k]["KFA_INDEX"], KQ_FLAG_ABSTATE[k]["KFA_STR"], KQ_FLAG_ABSTATE[k]["KFA_KEEPTIME"] )
end
-- 깃발 획득 알림
cScriptMessage( KSMemory["FIELD_NAME"], KQ_FLAG_SCRIPT_MSG["KFSM_HAVE"], KSMemory["PLAYER_LIST"][j]["PNAME"] )
-- 리젠 포인트 생성
local nTeamNo = KSMemory["PLAYER_LIST"][j]["PTEAM_NO"]
if nTeamNo ~= nil
then -- 팀 번호 확인
if KSMemory["TEAM_LIST"][nTeamNo]["TPOINT_HND"] == KQ_INVALID_HANDLE
then -- 리젠 포인트 핸드 확인
KSMemory["TEAM_LIST"][nTeamNo]["TPOINT_HND"] = cMobRegen_XY( Field, KQ_TEAM[nTeamNo]["KT_POINT_INDEX"], KQ_TEAM[nTeamNo]["KT_POINT_X"], KQ_TEAM[nTeamNo]["KT_POINT_Y"], 0 )
end
for k = 1, #KSMemory["TEAM_LIST"][nTeamNo]["TMEMBER_LIST"]
do
cPlaySound( KSMemory["TEAM_LIST"][nTeamNo]["TMEMBER_LIST"][k], KQ_SOUND["KS_GETFLAG"] );
end
end
-- 깃발 삭제
cNPCVanish( Handle )
return ReturnAI.END
end
end
end
return ReturnAI.END
end
------------------------------------------------------------------------------------------
-- 메인 함수 --
------------------------------------------------------------------------------------------
function Main( Field )
cExecCheck "Main"
local nCurSec = cCurSec() -- 현재 시간(초)
local KSMemory = InstanceField[Field] -- 킹덤 퀘스트 버퍼
if KSMemory == nil
then -- 킹덤 퀘스트 버퍼 확인
-- 킹덤 퀘스트 버퍼 초기화
InstanceField[Field] = {}
KSMemory = InstanceField[Field]
KF_INIT( Field, KSMemory, nCurSec )
end
if KSMemory["STEP_NO"] == nil
then -- 처리 단계 확인
return
end
if KQ_STEP[KSMemory["STEP_NO"]]["KS_FUNC"]( KSMemory, nCurSec ) == false
then -- 스탭 함수 실행 실패
cLinkToAll( KSMemory["FIELD_NAME"], KQ_RETURN_MAP["KRM_INDEX"], KQ_RETURN_MAP["KRM_X"], KQ_RETURN_MAP["KRM_Y"] )
cEndOfKingdomQuest( KSMemory["FIELD_NAME"] )
end
end