361 lines
13 KiB
C++
361 lines
13 KiB
C++
#pragma once
|
|
|
|
/*区域占领战情报管理*/
|
|
#include "DominationInfoParser.h"
|
|
#include "SystemMemo.h"
|
|
|
|
class DominationArea;
|
|
|
|
//<区域占领地图代码,占领前区域信息>
|
|
typedef STLX_HASH_MAP<MAPCODE, DominationArea*> AreaInfoMap;
|
|
typedef AreaInfoMap::iterator AreaInfoMapIterator;
|
|
typedef AreaInfoMap::const_iterator ConstAreaInfoMapIterator;
|
|
|
|
//<行会,区域占领地图码>
|
|
typedef STLX_MULTIMAP<GUILDGUID, MAPCODE> AreaInGuildMap;
|
|
typedef AreaInGuildMap::iterator AreaInGuildMapIterator;
|
|
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
|
|
typedef AreaInGuildMap::const_iterator ConstAreaInGuildMapIterator;
|
|
#endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION
|
|
typedef std::pair<AreaInGuildMapIterator, AreaInGuildMapIterator> AreaInGuildMapPair;
|
|
|
|
//<占领战脚本地图>
|
|
typedef DominationInfoParser::DOMINATION_SCRIPT_INFO_MAP ScriptDataMap;
|
|
typedef ScriptDataMap::iterator ScriptDataMapIterator;
|
|
|
|
class GameGuild;
|
|
|
|
class GameDominationManager : public util::Singleton<GameDominationManager>
|
|
{
|
|
public:
|
|
enum LoadingStatus
|
|
{
|
|
INFO_IS_EMPTY, //占领前数据为空
|
|
AREAINFO_LOADING, //占领战地域数据加载中
|
|
AREAINFO_LOAD_SUCCESS, //占领战区域数据加载成功
|
|
AUCTIONINFO_LOADING, //占领战拍卖数据加载中
|
|
AUCTIONINFO_LOAD_SUCCESS, //占领战拍卖数据加载成功
|
|
INFO_LOAD_SUCCESS, //所有占领战数据加载成功
|
|
};
|
|
|
|
GameDominationManager();
|
|
~GameDominationManager();
|
|
|
|
//确认占领信息加载计时器
|
|
bool DominationTimerIsExpired();
|
|
|
|
//本地信息加载处理器
|
|
void LoadProcess();
|
|
|
|
//拍卖信息设置
|
|
void SetAuctionData(MAPCODE map_code, const DominationAuctionInfo* auction_info, int data_count);
|
|
|
|
//拍卖信息Update
|
|
bool UpdateAuctionData(Player* player, MAPCODE map_code, const DominationAuctionInfo& auction_info);
|
|
|
|
//请求拍卖列表
|
|
void ResponseAuctionApply(Player* player, MAPCODE map_code)const;
|
|
|
|
//占领战情报请求
|
|
const DOMINATION_INFO* GetDominationInfo(MAPCODE map_code)const;
|
|
|
|
//初始化该地区拍卖信息
|
|
void ClearAuctionInfo(MAPCODE map_code);
|
|
|
|
//相当于MAPCODE地区的公会投标金
|
|
MONEY GetTenderCost(MAPCODE map_code, GUILDGUID guild_guid)const;
|
|
|
|
//MAPCODE地区最高招标金额
|
|
MONEY GetBestTenderCost(MAPCODE map_code)const;
|
|
|
|
//寻找相当于MAPCODE的占领地区信息
|
|
const DominationArea* FindAreaInfo(MAPCODE map_code)const;
|
|
|
|
//访问属于MAPCODE的占领地区信息
|
|
DominationArea* GetAreaInfo(MAPCODE map_code);
|
|
|
|
//占领战信息Update Game->Guild->DBP
|
|
void SendUpdateDominationInfo(const DOMINATION_INFO& domination_info,
|
|
eDOMINATION_EVENT_TYPE event_type)const;
|
|
|
|
//占领战信息设置:根据Event Type设置信息后,调用SendUpdateDominationInfo
|
|
void SetDominationGuildInfo(MAPCODE map_code, eDOMINATION_EVENT_TYPE event_type,
|
|
DOMINATION_REWARD_EVENT_INFO reward_event);
|
|
void SetDominationGuildInfo(MAPCODE map_code, eDOMINATION_EVENT_TYPE event_type);
|
|
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
|
|
void SetDominationGuildInfo(MAPCODE map_code, eDOMINATION_EVENT_TYPE event_type,
|
|
DOMINATION_REWARD_EVENT_INFO reward_event, Player* player);
|
|
#endif // _NA_006826_20130722_DOMINATION_RENEWAL
|
|
|
|
//获得当前时间
|
|
void GetCurrentDateTime(TCHAR* OUT result_time, size_t time_length) const;
|
|
|
|
//占领前信息更新:按活动控制
|
|
void UpdateDominationInfo(const DOMINATION_INFO& domination_info, eDOMINATION_EVENT_TYPE event_type);
|
|
|
|
//获得属于MAPCODE地区的公会信息
|
|
void GetInGuildInfo(MAPCODE map_code, DOMINATION_GUILD_INFO& guild_info);
|
|
|
|
//获得玩家迷你地图上显示的占领战信息
|
|
BYTE GetMiniMapInfo(DOMINATION_GUILD_INFO* guild_info, BYTE max_count)const;
|
|
|
|
//获得相当于MAPCODE地区的防壁信息:回车价格为总积分值
|
|
BYTE GetDefenseWall(MAPCODE map_code, BYTE* deffens_wall);
|
|
|
|
//设置与MAPCODE对应的区域的防壁信息
|
|
void SetDefenseWall(MAPCODE map_code, const BYTE* deffens_wall);
|
|
|
|
//隔墙数据校验:确认当前房间墙壁的安装价格是否比总积分高
|
|
bool CheckDefenseWall(MAPCODE map_code, const BYTE* deffens_wall);
|
|
|
|
//公会信息变更占领地区信息变更
|
|
void ChangeGuildMark(GUILDGUID guild_guid, GUILDMARKIDX pattern_index, GUILDMARKIDX background_index);
|
|
void ChangeGuildName(GUILDGUID guild_guid, TCHAR* guild_name);
|
|
void ChangeGuildMaster(GUILDGUID guild_guid, TCHAR* master_name);
|
|
|
|
//处理所有公会占领地选项(一个公会成员,所有占领地):公会成员首次进入,加入时,退出时
|
|
void ApplyAllRewardOption(Player* const player, const bool is_add = true);
|
|
|
|
// 场景奖励处理:进入场景,退出,加入行会,退出时
|
|
void ApplyRewardField(Player* const player, const MAPCODE map_code, const bool is_add = true) const;
|
|
|
|
//传送占领地区信息:首次登录,加入公会时
|
|
void SendAreaInfoToPlayer(Player* player, bool reward_flag = true);
|
|
|
|
//占领战进行后反映结果
|
|
void SendAreaInfoToGuild(GUILDGUID guild_guid);
|
|
|
|
//占领塔,公会内信息管理请求时显示的信息确认
|
|
void CheckNotice(Player* player, MAPCODE map_code, MSG_CG_DOMINATION_NOTICE_ACK& msg);
|
|
|
|
//MAPCODE地区攻击公会选定及通知
|
|
void SetDominationInfoDisGuild(MAPCODE map_code);
|
|
|
|
//MAPCODE地区拍卖信息初始化:Game->Guild->DBP
|
|
void SendInitActionInfo(MAPCODE map_code);
|
|
|
|
//向该玩家发送相当于MAPCODE的占领公告信息.
|
|
void SendDominationNotice(Player* player, MAPCODE map_code);
|
|
|
|
//检查是否可以根据防墙数据的变更保存
|
|
RC::eDOMINATION_RESULT CanSaveGateState(Player* player, MAPCODE map_code, const BYTE* deffens_wall);
|
|
|
|
//对该玩家奖励道具并通知
|
|
RC::eITEM_RESULT RewardItem(Player* player, int amount_cost, SLOTCODE item_code);
|
|
|
|
//相当于GUILGUID的公会占领的地区数量
|
|
WORD GetAreaCount(const GUILDGUID guild_guid);
|
|
|
|
//删除竞拍投标项目
|
|
bool RemoveAuctionItem(Player* player, POSTYPE token_pos = 0, int amount_cost = 0, SLOTCODE item_code = 0) const;
|
|
|
|
//检查拍卖物品的有效性
|
|
bool CheckDominationTokken(Player* player, int amount_token, POSTYPE pos, MAPCODE map_code) const;
|
|
|
|
//地区占领战地区对吗?
|
|
bool IsDominationArea(MAPCODE map_code)const;
|
|
|
|
//公会信息内占领战参与相关信息更新
|
|
//_NA_20100604_BETTER_DOMINATION_MANAGER
|
|
void UpdateGuildInfoByDomination(const GUILDGUID guild_guid, const eDOMINATION_ADD_GUILD_INFO_TYPE type);
|
|
|
|
//拍卖能投标吗
|
|
#ifdef _CH_20100420_CHANGE_DOMINATION_APPLY_WAY
|
|
RC::eDOMINATION_RESULT CanEntryAuctionCost(Player* player, MAPCODE map_code, int entry_money = 0, POSTYPE pos = 0) const;
|
|
#else
|
|
RC::eDOMINATION_RESULT CanEntryAuctionCost(Player* player, MAPCODE map_code, MONEY entry_money) const;
|
|
#endif
|
|
|
|
|
|
//_NA_0_20100208_DOMINATION_AREA_INFO
|
|
void SerializeAreaInfo(const GUILDGUID guild_guid, DOMINATION_STATE_TOTAL_INFO& OUT state_total_info);
|
|
|
|
//_NA_20100812_INTEGRATE_SYSTEM_MEMO_DOMINATION
|
|
//获取系统备注实例
|
|
SystemMemo* GetSystemMemo();
|
|
//发送奖励备忘录
|
|
bool SendRewardMemo(const DOMINATION_INFO* domination_info, MAPCODE map_code);
|
|
//_NA_20110216_INCREASE_DOMINATION_DEFFENSEWALL_POINT
|
|
//增加防壁点数.
|
|
bool IncreaseDeffenseWallPoint(Player* player, SLOTCODE item_code, MAPCODE map_code);
|
|
|
|
//能否增加防壁点数?
|
|
RC::eDOMINATION_RESULT CanIncreaseDeffenseWallPoint(Player* player, MAPCODE map_code);
|
|
|
|
//_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
|
|
//占领前发送成员列表:在发送的分组中,客户端决定显示列表窗口的flag存在
|
|
void SendMemberList(Player* player, MAPCODE map_code)const;
|
|
|
|
//占领战是否可以参与?
|
|
RC::eDOMINATION_RESULT CanJoinMember(Player* player, MAPCODE map_code)const;
|
|
|
|
//制作占领战参与成员数据
|
|
bool MakeMemberInfo(Player* player, MAPCODE map_code, DominationMemberInfo& OUT info)const;
|
|
|
|
//清除占领战成员列表
|
|
void InitMemberList();
|
|
|
|
//占领地区参与成员对吗?
|
|
bool IsJoinMember(CHARGUID char_guid, MAPCODE map_code)const;
|
|
|
|
//确认是否进入占领战地图
|
|
bool CanEnterDominationField(Player* player, MAPCODE map_code)const;
|
|
|
|
//能否删除占领战参与成员
|
|
bool IsDeleteMember(MAPCODE map_code) const;
|
|
|
|
void DeleteMemberList(MAPCODE map_code);
|
|
void GuildMasterNameChange(GUILDGUID guild_guid, CHARGUID char_guid, const TCHAR* character_name);
|
|
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
|
|
bool CheckDominationIsProgressing();
|
|
void ChangeAreaProgressState(MAPCODE map_code, const eDOMINATION_PROGRESS_STATE area_state);
|
|
void ChangeAllAreaProgressState(const eDOMINATION_PROGRESS_STATE area_state);
|
|
// 占领区地图NPC死亡时的处理
|
|
void OnDeadDominationMapNPC(const MAPCODE map_code, const MONSTERCODE monster_code);
|
|
#endif //_NA_006826_20130722_DOMINATION_RENEWAL
|
|
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
|
|
//保存大陆的领主信息.
|
|
void SetDominationContinentLordInfo(const sDOMINATION_CONTINENT_LORD_INFO lord_info);
|
|
//获取大陆领主信息.
|
|
const sDOMINATION_CONTINENT_LORD_INFO* GetDominationContinentLordInfo(int continent) const;
|
|
#endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION
|
|
#ifdef _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD
|
|
// 公会占领地选项适用于所有公会成员.
|
|
void ApplyAllMemberRewardOption(const GUILDGUID guild_guid, const bool is_add);
|
|
#endif // _NA_007488_20140811_MONDSCHUEN_INITIALIZE_N_REWARD
|
|
|
|
#ifdef _NA_008334_20150608_SONNENSCHEIN
|
|
VOID GetGuildTakenMaps(GUILDGUID guild_guid, OUT DominationInfoParser::TakenMaps* taken_maps);
|
|
#endif //_NA_008334_20150608_SONNENSCHEIN
|
|
|
|
private:
|
|
//初始化
|
|
void _Initialize();
|
|
|
|
//以脚本数据为基准生成占领区Map
|
|
void _CreateArea();
|
|
|
|
//占领地区信息载荷状态检查及再申请
|
|
void _RequestAreaInfoLoad()const;
|
|
|
|
//占领区基本信息insert
|
|
void _SetDominationInfo(const DOMINATION_INFO& domination_info);
|
|
|
|
//脚本确认
|
|
bool _IsLoadedScript()const;
|
|
|
|
//占领战信息UPDATE
|
|
void _UpdateDominationInfo(const DOMINATION_INFO& domination_info);
|
|
|
|
//可以竞拍投标的地区吗??
|
|
bool _IsAvailableAuctionArea(MAPCODE map_code)const;
|
|
|
|
//获得当前占领战活动
|
|
eDOMINATION_EVENT_STATE _GetCurrentDominationEvent(MAPCODE map_code)const;
|
|
|
|
//是可以拍卖的时间吗?
|
|
bool _IsApplyAuction(Player* player, eDOMINATION_EVENT_STATE event_type)const;
|
|
|
|
//可以竞拍下注吗?
|
|
bool _CanAuctionBatting(Player* player, MAPCODE map_code)const;
|
|
|
|
//请求拍卖列表
|
|
BYTE _GetAuctionList(MAPCODE map_code, DOMINATION_ACTION_INFO* auction_list, BYTE max_count)const;
|
|
|
|
//请求GUILDMEMBER信息
|
|
GameGuildMember* _GetGuildMemberInfo(Player* player)const;
|
|
|
|
//选定公会信息从投标列表中删除:为了制作奖励列表
|
|
void _DeleteGuildInfoInAuction(const DOMINATION_INFO& domination_info);
|
|
|
|
//删除攻击公会信息
|
|
void _RemoveDisGuildInfo(MAPCODE map_code, bool is_swap = false);
|
|
|
|
//AreaInGuildMap管理
|
|
void _InsertGuildAreaInfo(const MAPCODE map_code, GUILDGUID win_guild_guid);
|
|
void _RemoveGuildAreaInfo(const MAPCODE map_code, GUILDGUID loser_guild_guid);
|
|
#ifdef _NA_007128_20140326_MONDSCHIEN_DOMINATION
|
|
void _RemoveGuildAreaInfoFromMapCode(const MAPCODE map_code);
|
|
//有占领地的公会吗?
|
|
bool _IsAreaInGuild(const GUILDGUID guild_guid) const;
|
|
//保存大陆领主的信息。<大陆号,频道信息>
|
|
typedef STLX_MULTIMAP<int, sDOMINATION_CONTINENT_LORD_INFO> ContinentLordInfos;
|
|
ContinentLordInfos continent_lord_infos_;
|
|
#endif //_NA_007128_20140326_MONDSCHIEN_DOMINATION
|
|
|
|
//向公会成员处理占领战奖励选项
|
|
void _ApplyRewardOption(
|
|
Player* const player, const MAPCODE map_code, const bool is_add = true) const;
|
|
|
|
//场景相关奖励选项处理
|
|
void _AcceptRewardField(
|
|
Player* const player, const MAPCODE map_code, const bool is_add = true) const;
|
|
|
|
//占领战结束后通知胜败行会结果
|
|
void _ResultNotify(MAPCODE map_code, GUILDGUID win_guild_guid, GUILDGUID lose_guild_guid);
|
|
#ifdef _NA_006826_20130722_DOMINATION_RENEWAL
|
|
void _ResultNotifyAllUser(MAPCODE map_code, GUILDGUID win_guild_guid, GUILDGUID lose_guild_guid);
|
|
#endif // _NA_006826_20130722_DOMINATION_RENEWAL
|
|
|
|
//获得相当于MAPCODE的整个地区的防壁点
|
|
int _GetDefenseWallTotalPoint(MAPCODE map_code);
|
|
|
|
//确认占领战是否可进入玩家:玩家当前位置,行会有无,当前活动时间
|
|
bool _IsEnterArea(Player* player, eDOMINATION_EVENT_STATE current_event)const;
|
|
|
|
//占领战城门管理功能是否可用确认:只有占领帮主才可以,占领战中不可以
|
|
bool _IsGateManage(Player* player, eDOMINATION_EVENT_STATE current_event, MAPCODE map_code );
|
|
|
|
//要求归还拍卖金额
|
|
void _ReturnDominationActionHeim(const DOMINATION_INFO& domination_info);
|
|
|
|
//初始化相当于MAPCODE的地区防壁点
|
|
void _InitDefenseWall(MAPCODE map_code);
|
|
|
|
//占领区信息Delete
|
|
void _DeleteArea();
|
|
|
|
//占领前确认信息载荷状态
|
|
bool _CheckLoadedStatus();
|
|
|
|
//DominationField信息内占领公会信息设置
|
|
void _InsertDomiationInfo();
|
|
|
|
//GUILGUID的公会是否存在参与占领战的明细?:真(存在)/假(不存在)
|
|
MAPCODE _DidApplyGuild(GUILDGUID guild_guid)const;
|
|
|
|
//_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
|
|
//玩家现在可以申请参与占领战吗??
|
|
bool _IsJoinMember(Player* player, MAPCODE map_code)const;
|
|
|
|
//玩家是否存在参与占领战的明细?:return 0没有参加地区
|
|
MAPCODE _DidJoinArea(CHARGUID member_guid)const;
|
|
|
|
//决定是否将参与占领战的成员列表显示在客户端窗口
|
|
bool _IsShowMemberList(MAPCODE map_code)const;
|
|
|
|
//_NA_20110216_INCREASE_DOMINATION_DEFFENSEWALL_POINT
|
|
//删除和通知所需物品
|
|
bool RemovePointItem(Player* player, SLOTCODE item_code);
|
|
|
|
#ifdef _NA_000000_20130429_DOMINATION_PENALTY
|
|
void ProcessDominationPenalty(GUILDGUID guild_guid, MAPCODE map_code, int penalty_days);
|
|
#endif //_NA_000000_20130429_DOMINATION_PENALTY
|
|
|
|
private:
|
|
util::Timer domination_update_timer_;//占领地区前的基本信息和拍卖信息Update Time
|
|
AreaInGuildMap area_in_guild_map;//公会-占领地图结构MAP
|
|
AreaInfoMap area_info_map_;//占领区数据MAP
|
|
bool is_initialize_;//区域占领战初始化状态
|
|
SystemMemo system_memo_;//系统记录
|
|
//_NA_20110406_CHANGE_RULE_FOR_DOMINATION_JOIN
|
|
bool is_init_member_;
|
|
};
|
|
|
|
inline SystemMemo*
|
|
GameDominationManager::GetSystemMemo()
|
|
{
|
|
return &system_memo_;
|
|
}
|
|
|