#pragma once //============================================================================================================================= /* DOMINATION_EVENT_END: 允许进入(会馆状态) DOMINATION_EVENT_SYSTEM_RESET: 入口块 驱逐当前用户 攻击公会设置 场销毁、创建(触发设置) DOMINATION_EVENT_WAIT: 可以入学 战争定时器时间设置(停止状态) - 同步进入用户的时间 DOMINATION_EVENT_START: 可以入学 开始战争计时器 - 同步进入用户的时间 // 状态值 DOMINATION_EVENT_ACTION_START : 拍卖时间 [可以拍卖,可以设置门,允许入场(周三)] DOMINATION_EVENT_ACTION_END :拍卖结束[不允许拍卖,可以设置门,允许入场(周三)] DOMINATION_EVENT_SELECT_ATTACKGUILD:攻击公会选择[不允许拍卖,可以设置门,允许入场(周三)] DOMINATION_EVENT_SELECT_ATTACKGUILD_END:攻击公会选择结束[不允许拍卖,可以设置门,允许进入(周三)] DOMINATION_EVENT_SYSTEM_RESET : 系统重置[无拍卖,无门设置,无入场(官方,周三)] DOMINATION_EVENT_WAIT:等待战争[不允许拍卖,不允许设置门,允许入场(关闭,周三)] DOMINATION_EVENT_START:战争开始[无法拍卖,不允许设置大门,允许入场(关闭,周三)] DOMINATION_EVENT_END :战争结束[可以拍卖,可以设置门,允许入场(周三)] DOMINATION_EVENT_ACTION_START2 :不存在的状态 DOMINATION_EVENT_MAX : 异常状态 */ //============================================================================================================================= #include "ZoneInterface.h" typedef std::pair GUILD_COUNT; typedef std::pair OUTSIDER; // typedef STLX_LIST OUTSIDERS; typedef OUTSIDERS::iterator OUTSIDERS_IT; typedef std::pair KICK_GUILD; class DominationField : public ZoneInterface { _DECLARE_POOL(DominationField) enum { empty_guild_idx = -1 }; enum { offense_guild, defense_guild, max_guild }; enum { OUTSIDER_UPDATE_TIME = 100, EVENT_UPDATE_TIME = 500, KICK_TIME = 10 * 1000 }; //0.1 秒、0.5 秒、10 秒 public: DominationField(void); virtual ~DominationField(void); VOID Create(KEYTYPE key, MAPCODE MapCode, ServerSession* pServerSession); inline virtual eZONETYPE GetType() { return eZONETYPE_DOMINATION_FIELD; } virtual BOOL Process(); virtual VOID ReadyUser(User * pUser, eSEND_TYPE type, MAPCODE FieldCode = 0, DWORD dwAreaID = 0, WzVector * pwvStartPos = NULL, bool bFirstJoin = false); VOID SetGuildGuid(GUILDGUID offense, GUILDGUID defense, eDOMINATION_EVENT_TYPE eSetType); VOID KickUser(DWORD playerKey); protected: virtual VOID On_create(); virtual VOID On_destroy(); virtual VOID On_readyuser(User* pUser); virtual VOID On_enteruser(User* pUser); virtual VOID On_leaveuser(User* pUser); virtual RC::eROOM_RESULT _CanJoinEach(User* pUser, eZONEPUBLIC RoomPublic, TCHAR* pszRoomPWD); private: #ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION typedef STLX_MULTIMAP EventInfos; //从解析器中检索当前字段的预占事件并将其存储在 EventInfos 中 VOID _SetEventInfos(MAPCODE map_code); //从您的 EventInfos 中获取征服战争的当前状态 eDOMINATION_EVENT_STATE _GetCurEventState(const WORD day_of_week, const DWORD time) const; EventInfos event_infos_; #endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION RC::eROOM_RESULT _GuildCount(User* pUser, INT count = 1); std::pair _Counting(GUILDGUID guildGuid, INT count); BOOL _ReturnToEntrance(User* pUser); INT _GetGuildCountIndex(GUILDGUID guildGuid); VOID _ReSetDomination(); VOID _KickUser(GUILDGUID guildGuid); VOID _UpdateTimeEvent(); BYTE _CountingPlayer(GUILDGUID guild_guid); #ifdef _NA_006826_20130722_DOMINATION_RENEWAL void _KickUsers_ExceptWinGuild(GUILDGUID winner_guild); #endif //_NA_006826_20130722_DOMINATION_RENEWAL public: static BOOL is_gm_observer; // 你打算让 gm 成为观察员吗? 与 gm 命令一起使用. private: GUILD_COUNT guild_count_[max_guild]; OUTSIDERS outSider_; // 错误的用户 OUTSIDERS outSiderOb_; // 观察员用户 (GM) util::Timer outsider_updatetimer_; // outSider_ 处理计时器 //_0_20100419_DOMINATION_RETURN_TO_ENTRANCE_BUG BOOL bReCreate_; util::Timer kickTimer_; // 退休等待时间(10秒), KICK_GUILD pairKickGuild_; util::Timer eventUpdateTimer_; // 以分钟为单位的事件(以秒为单位检查) eDOMINATION_EVENT_STATE curEventState_; };