Files
Sun1602/Server/GameServer/GameDominationManager.h
2022-10-26 12:25:11 +08:00

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_;
}