Files
2022-10-26 12:25:11 +08:00

147 lines
4.7 KiB
C++

#pragma once
#ifdef _NA_008334_20150608_SONNENSCHEIN
#include <World/ChaosZoneSystem/ChaosZone.h>
//_NA_008801_20160429_ADD_GUILDMISSION_TIMEINFO_SCRIPT
#include "ChaosZoneSystem/OneDaysGuildMissioninfoParser.h"
struct SScheinRewardInfo;
class SonnenScheinRewardStatus
{
public:
SonnenScheinRewardStatus():
reward_phase_(0), MAX_REWARD_PHASE(0) {cur_target_list_.clear();}
~SonnenScheinRewardStatus() {}
VOID Init();
VOID SetMaxRewardPhase(BYTE phase) {MAX_REWARD_PHASE = phase;}
BYTE GetMaxRewardPhase() {return MAX_REWARD_PHASE;}
VOID IncreaseRewardPhase();
//현재 단계를 마지막단계로 바로올린다
VOID SetLastRewardPhase() {reward_phase_ = GetMaxRewardPhase(); }
BYTE GetCurRewardPhase() {return reward_phase_;}
VOID InputTargetList(const SScheinRewardInfo* info);
BOOL PopTarget(MONSTERCODE target_code);
// 단계를 넘어가기 위한 타겟 모두 제거되었는가
BOOL IsTargetAllDeath();
VOID SetCurTargetType(BYTE target_type) {cur_target_type_ = target_type;}
BYTE GetCurTargetType() {return cur_target_type_;}
private:
VOID _PushTarget(MONSTERCODE target_code);
private:
// 소넨샤인 보상 최고등급값
BYTE MAX_REWARD_PHASE;
BYTE reward_phase_;
//현 단계에서 다음단계로 넘어가기 위한 타겟정보를 기억한다
BYTE cur_target_type_;
std::vector<MONSTERCODE> cur_target_list_;
};
class SonnenSchein : public ChaosZone
{
enum
{
UPDATE_TIME = 500, //0.5초마다 업데이트 진행
ROOM_DESTROY_TIME = 5 * 60 * 1000, //5분, End상태이후 방 소멸 유예시간
// 10초, 각인 후, 플레이어 강퇴 대기시간(stampSuccess -> kick user)
// 10초, END상태 이후, 유저 강제퇴장까지의 대기시간
ROOM_END_WAIT_TIME = 10 * 1000,
TIME_SYNC_CYCLE = 30 * 1000, // 시간동기화 주기
};
public:
SonnenSchein() : creater_char_guid_(0)
, room_guild_guid_(0)
, stamp_start_time_(0)
, event_loaded_(FALSE)
, is_process_phase_update_(FALSE) {}
virtual ~SonnenSchein() {}
virtual void Init(GameInstanceDungeon* const instance_dungeon);
virtual void Release();
virtual void Update();
VOID SetSonnenScheinRewardPhase();
//SonnenSchein방을 처음 생성한 플레이어를 기억한다
VOID SetInitialCreater(CHARGUID char_guid, GUILDGUID guild_guid);
virtual bool EnterPlayer(Player* const player);
virtual void LeavePlayer(Player* const player);
virtual void EnterTeam(const ChaosZoneTeam team_key, const BYTE player_count,
DWORD* user_key_list) {}
virtual void DeadCharacter(Character* const dead_character, Character* const kill_character);
virtual eUSER_RELATION_TYPE IsFriendPVP(Player* attacker,Player* target);
virtual RC::eSTATUS_RESULT ResurrectionAtSafezone( Player *player );
GUILDGUID GetRoomGuildGuid() {return room_guild_guid_;}
//각인 관련--------------------------------------------------------------------------------
//각인 성공 처리
VOID SuccessStamp(Player* player);
VOID SetStampStartTime();
VOID InitStampCheckTime() {stamp_start_time_ = 0;}
VOID SetEventState(const eSONNENSCHEIN_EVENT_STATE& state);
const eSONNENSCHEIN_EVENT_STATE GetEventState() {return event_state_;}
private:
//입장하려는 플레이어의 길드 체크
BOOL _CheckEnterPlayerGuild(Player* enter_player);
//Starting Area의 ID를 구한다
WzID _GetStartingArea();
VOID _IncreaseRewardPhase();
VOID _SetNextPhaseTargetInfo();
VOID _UpdateCurEventState();
VOID _SendTimeSync();
VOID _SendTimeSyncForPlayer(Player* player);
VOID _SetRunTime();
DWORD _GetRunTime(const WORD& day_of_week, const DWORD time) const;
VOID _WriteSonnenScheinLog();
private:
eSONNENSCHEIN_EVENT_STATE event_state_; //sonnenschein 상태
GuildMissionTimeInfo event_info_; // 점령전(몬트샤인) 이벤트정보
BOOL event_loaded_;
CHARGUID creater_char_guid_;
GUILDGUID room_guild_guid_;
PLAYER_HASH player_hash_; // 입장 멤버
// 시간 관련
DWORD stamp_start_time_; // 각인 시작 시간
DWORD run_time_; // 소넨샤인 진행 시간
util::Timer update_timer_; // 업데이트 주기 조절
util::Timer room_destroy_timer_; //End상태 이후, 방 소멸까지의 유예시간
util::Timer kick_user_wait_timer_; //End상태 이후 플레이어 강제퇴장까지의 대기시간
util::Timer stamp_success_wait_timer_; // 각인성공 -> 플레이어 강퇴 간의 대기시간
util::Timer time_sync_cycle_; // 클라와 시간동기화 위한 타이머
util::Timer sonnenschein_run_timer_; // 소넨샤인 진행 타이머
// 보상관련처리
SonnenScheinRewardStatus reward_status_;
// GM명령어를 위한 변수
// 소넨샤인 등급 업데이트 여부 플래그
BOOL is_process_phase_update_;
};
#endif //_NA_008334_20150608_SONNENSCHEIN