#pragma once /*区域占领战情报管理*/ #include "DominationInfoParser.h" #include "SystemMemo.h" class DominationArea; //<区域占领地图代码,占领前区域信息> typedef STLX_HASH_MAP AreaInfoMap; typedef AreaInfoMap::iterator AreaInfoMapIterator; typedef AreaInfoMap::const_iterator ConstAreaInfoMapIterator; //<行会,区域占领地图码> typedef STLX_MULTIMAP 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 AreaInGuildMapPair; //<占领战脚本地图> typedef DominationInfoParser::DOMINATION_SCRIPT_INFO_MAP ScriptDataMap; typedef ScriptDataMap::iterator ScriptDataMapIterator; class GameGuild; class GameDominationManager : public util::Singleton { 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 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_; }