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

122 lines
4.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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<GUILDGUID, INT> GUILD_COUNT;
typedef std::pair<DWORD, DWORD> OUTSIDER; //<key, count>
typedef STLX_LIST<OUTSIDER> OUTSIDERS;
typedef OUTSIDERS::iterator OUTSIDERS_IT;
typedef std::pair<GUILDGUID, GUILDGUID> 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<WORD, sDOMINATION_EVENT_INFO> 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<BOOL, INT> _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_;
};