1、新增文件 SmEvent.h SmEvent.cpp,用作替换event,测试是否文件问题导致的无法显示鼠标智能提示
2、事件相关常量移入FunctionCollection 3、BattleIC.cpp 优化移除转换提示 int - float 4、清空event.h和event.cpp代码 5、移除一些不必要的 Event.h 头文件调用 6、mod_GhostScripts_Load.cpp 代码中合并事件注册脚本 7、
This commit is contained in:
parent
325a393ff3
commit
62b82c9f8a
@ -16,7 +16,7 @@
|
||||
#include "mod_Switch/Switch.h"
|
||||
#include "mod_GCAddon/GCAddon.h"
|
||||
#include "mod_ItemSet/ItemSet.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include "mod_Recovery/Recovery.h"
|
||||
#include "mod_String/mod_String.h"
|
||||
#include "mod_TalentReq/TalentReq.h"
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
#include "CustomPlayerDataManager.h"
|
||||
#include "mod_Recruit/Recruit.h"
|
||||
#include "mod_CommonFunc/CommonFunc.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include <SpellMgr.h>
|
||||
#include <BanMgr.h>
|
||||
#include <GuildWarManager.h>
|
||||
|
||||
@ -7,12 +7,13 @@
|
||||
#include "BattlegroundIC.h"
|
||||
#include <Chat.h>
|
||||
|
||||
#include "../Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include "../mod_CommonFunc/CommonFunc.h"
|
||||
#include "../mod_Reward/Reward.h"
|
||||
#include <Reward.h>
|
||||
#include <CommonFunc.h>
|
||||
#include <mod_CustomGameObject.h>
|
||||
#include "FunctionCollection.h"
|
||||
|
||||
int BGICSort(const std::pair<uint64, BGICPlayerScore>& x, const std::pair<uint64, BGICPlayerScore>& y)
|
||||
{
|
||||
@ -97,13 +98,13 @@ void BGIC::InitParams(uint32 eventId, Map* map)
|
||||
_PosionNpcPosVec.push_back(i);
|
||||
|
||||
|
||||
_DieLootItemMap.insert(std::make_pair(25, 100));
|
||||
_DieLootItemMap.insert({ 25u, 100.0f });
|
||||
|
||||
// 为传送载具指定正确的地图
|
||||
if (gunshipHorde = sTransportMgr->CreateTransport(GO_HORDE_GUNSHIP, 0, map))
|
||||
if ((gunshipHorde = sTransportMgr->CreateTransport(GO_HORDE_GUNSHIP, 0, map)) != nullptr)
|
||||
gunshipHorde->EnableMovement(true);
|
||||
|
||||
if (gunshipAlliance = sTransportMgr->CreateTransport(GO_ALLIANCE_GUNSHIP, 0, map))
|
||||
if ((gunshipAlliance = sTransportMgr->CreateTransport(GO_ALLIANCE_GUNSHIP, 0, map)) != nullptr)
|
||||
gunshipAlliance->EnableMovement(true);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,746 +0,0 @@
|
||||
#pragma once
|
||||
#include <CustomPlayerDataManager.h>
|
||||
//#include "mod_CustomData/mod_CustomPlayerData/mod_CustomPlayerData.h"
|
||||
|
||||
#define EventFactionId uint32 // 事件队伍ID类型定义
|
||||
|
||||
#define EVENT_ID_QUICK_RESPONSE 161 // 抢答事件ID
|
||||
|
||||
// 假人更新
|
||||
#define EVENT_ID_FAKE_PLAYER_UPDATE_ZONE_ID 71 // 假人更新区域ID的事件ID
|
||||
#define EVENT_ID_FAKE_PLAYER_LOGIN_OR_LOGOUT 72 // 假人登录或登出的事件ID
|
||||
#define EVENT_ID_FAKE_PLAYER_LEVEL_UP 73 // 假人升级的事件ID
|
||||
|
||||
//大逃杀
|
||||
#define UKBG_EVENT_ID 0 // 大逃杀事件的ID
|
||||
#define UKBG_LENGTH 18000 // 大逃杀事件的持续时间(单位可能是秒或毫秒)
|
||||
#define UKBG_H_REWID 32 // 大逃杀高级奖励ID
|
||||
#define UKBG_M_REWID 33 // 大逃杀中级奖励ID
|
||||
#define UKBG_L_REWID 33 // 大逃杀低级奖励ID
|
||||
|
||||
// 狭路相逢
|
||||
#define NARROW_EVENT_ID 0 // 狭路相逢事件的ID
|
||||
#define NARROW_EVENT_DEFENSE_POSID 2 // 狭路相逢防守方位置ID
|
||||
#define NARROW_EVENT_OFFENSE_POSID 3 // 狭路相逢进攻方位置ID
|
||||
#define NARROW_EVENT_DEBUFF_ID 60001 // 狭路相逢事件中使用的减益效果ID
|
||||
|
||||
// 征服之岛
|
||||
#define BGIC_EVENT_ID 160 // 征服之岛战场事件ID
|
||||
#define BGIC_EVENT_MAP 628 // 征服之岛战场地图ID
|
||||
#define BGIC_SSS_REWARD_ID 1 // 征服之岛特殊奖励ID
|
||||
#define BGIC_REWARD_ID 2 // 征服之岛普通奖励ID
|
||||
#define BGIC_DISPLAY_MAX 10 // 征服之岛排行榜显示最大人数
|
||||
#define BGIC_STOP_KILLS 50 // 征服之岛结束所需的击杀数
|
||||
|
||||
// 争霸赛事件 mod-ArenaContest
|
||||
#define EVENT_ID_ARENA_CONTEST_SIGNUP 74 // 争霸赛报名事件ID
|
||||
#define EVENT_ID_ARENA_CONTEST_START 75 // 争霸赛开始事件ID
|
||||
|
||||
struct PosTemplate
|
||||
{
|
||||
uint32 map;
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
float o;
|
||||
};
|
||||
extern std::unordered_map<uint32, PosTemplate> PosMap;
|
||||
|
||||
enum GroupTypes
|
||||
{
|
||||
C_GT_ONE_ALL,
|
||||
C_GT_ONE_A,
|
||||
C_GT_ONE_H,
|
||||
C_GT_RANDOM_A_H,
|
||||
C_GT_RANDOM_PLAYER,
|
||||
};
|
||||
|
||||
enum RejoinTypes
|
||||
{
|
||||
C_RT_BANED,
|
||||
C_RT_KEEP_GROUP,
|
||||
C_RT_REDIS_GROUP,
|
||||
};
|
||||
|
||||
enum EventTypes
|
||||
{
|
||||
C_ET_NONE = 0, // 默认值,表示无事件或错误
|
||||
C_ET_WS, // 战场 - 战歌
|
||||
C_ET_AB, // 战场 - 阿拉希
|
||||
C_ET_EY, // 战场 - 风暴之眼
|
||||
C_ET_SA, // 战场 - 远古海滩
|
||||
C_ET_AV, // 战场 - 奥山
|
||||
C_ET_IC, // 战场 - 征服之岛
|
||||
C_ET_TELE, // 仅传送
|
||||
C_ET_LINE, // 对线
|
||||
C_ET_FACTION, // 自定义阵营
|
||||
C_ET_GUILD, // 公会
|
||||
C_ET_SINGLE // 单人
|
||||
};
|
||||
|
||||
struct EventPhaseFactionTemplate
|
||||
{
|
||||
uint8 Phase;
|
||||
uint32 Faction;
|
||||
uint32 GraveyardPos;
|
||||
uint32 GraveyardSafe;
|
||||
uint32 GraveyardHealer;
|
||||
uint32 StopTelePos;
|
||||
uint32 StopPlayerKills;
|
||||
uint32 StopPlayerKilleds;
|
||||
std::string GraveyardSafeNotice;
|
||||
std::string StopNotice;
|
||||
};
|
||||
|
||||
struct EventPhaseTemplate
|
||||
{
|
||||
uint8 Phase;
|
||||
int64 StopGUID;
|
||||
};
|
||||
|
||||
#define ALT_GUID_MAX 5
|
||||
|
||||
|
||||
struct EventAltTemplate
|
||||
{
|
||||
int64 GUID;
|
||||
uint32 AltFlag;
|
||||
std::string NoticeText;
|
||||
int64 TargetEntry[ALT_GUID_MAX];
|
||||
uint32 TargetCount[ALT_GUID_MAX];
|
||||
uint32 TargetKillCount[ALT_GUID_MAX];
|
||||
};
|
||||
|
||||
struct EventAltFactionTemplate
|
||||
{
|
||||
int64 GUID;
|
||||
EventFactionId Faction;
|
||||
uint32 Kills;
|
||||
uint32 Killeds;
|
||||
};
|
||||
|
||||
// _事件_结束条件配置
|
||||
struct EventStopTemplate
|
||||
{
|
||||
EventFactionId Faction;
|
||||
TypeID StopType;
|
||||
uint32 Param;
|
||||
uint32 Weight;
|
||||
};
|
||||
|
||||
struct EventKillInfoTemplate
|
||||
{
|
||||
uint32 Kills;
|
||||
uint32 Killeds;
|
||||
};
|
||||
|
||||
#define WORLDSTATE_ENTRY_MAX 3
|
||||
|
||||
struct EventWorldStateTemplate
|
||||
{
|
||||
uint32 ID;
|
||||
int32 InitValue;
|
||||
int64 Entry[WORLDSTATE_ENTRY_MAX];
|
||||
int32 Step[WORLDSTATE_ENTRY_MAX];
|
||||
int32 NoticeValue;
|
||||
std::string NoticeT;
|
||||
};
|
||||
|
||||
struct EventWorldStateFactionTemplate
|
||||
{
|
||||
uint32 ID;
|
||||
uint32 Faction;
|
||||
bool Kill;
|
||||
int32 Step;
|
||||
int32 NoticeValue;
|
||||
std::string NoticeText;
|
||||
};
|
||||
|
||||
#define MAX_SPAWNNOTICE_COUNT 3
|
||||
|
||||
struct EventSpawnTemplate
|
||||
{
|
||||
int64 Entry;
|
||||
uint32 Phase;
|
||||
uint32 SpawnTime;
|
||||
uint32 PosId;
|
||||
uint32 Duration;
|
||||
uint32 NoticeTime[MAX_SPAWNNOTICE_COUNT];
|
||||
std::string SpawnNotice[MAX_SPAWNNOTICE_COUNT];
|
||||
};
|
||||
|
||||
struct EventListTemplate
|
||||
{
|
||||
std::string EventName;
|
||||
std::string StartTime;
|
||||
std::string Occurence;
|
||||
std::string Length;
|
||||
EventTypes EventType;
|
||||
};
|
||||
|
||||
extern std::unordered_map<uint32, EventListTemplate> EventListMap;
|
||||
|
||||
/// <summary>
|
||||
/// 改造事件初始化
|
||||
/// </summary>
|
||||
|
||||
struct EventTeamConfig
|
||||
{
|
||||
uint32 teamId;
|
||||
std::string teamName;
|
||||
uint32 startPosId;
|
||||
uint32 stopPosId;
|
||||
};
|
||||
|
||||
struct EventConfig
|
||||
{
|
||||
std::string eventName;
|
||||
std::string noticeText;
|
||||
std::string gossipText;
|
||||
int32 zoneId;
|
||||
|
||||
std::string eventType; // 这里暂时用字符串表示,稍后将根据实际情况转换为枚举
|
||||
std::string groupType; // 组队类型,暂时用字符串表示,稍后将根据实际情况转换为枚举
|
||||
std::string rejoinType; // 重新加入类型,暂时用字符串表示,稍后将根据实际情况转换为枚举
|
||||
|
||||
uint32 winRewId;
|
||||
uint32 losRewId;
|
||||
uint32 damageForRew;
|
||||
uint32 healForRew;
|
||||
uint32 killsForRew;
|
||||
uint32 killedForRew;
|
||||
|
||||
std::vector<EventTeamConfig> teams; // _事件_队伍配置
|
||||
std::vector<EventStopTemplate> stopConditions; // _事件_结束条件配置
|
||||
std::vector<EventAltTemplate> activationConditions; // _事件_生物或物体激活条件配置
|
||||
std::vector<EventAltFactionTemplate> AltFactionVec; // _事件_生物或物体激活条件队伍配置
|
||||
std::vector<EventPhaseTemplate> PhaseVec; // _事件_阶段生物或物体配置
|
||||
std::vector<EventPhaseFactionTemplate> phaseFactions; // _事件_阶段队伍配置
|
||||
std::vector<EventWorldStateTemplate> worldStates; // _事件_世界状态配置
|
||||
std::vector<EventWorldStateFactionTemplate> WorldStateFactionVec; // _事件_世界状态队伍配置
|
||||
std::vector<EventSpawnTemplate> spawns; // _事件_生物或物体刷新配置
|
||||
};
|
||||
|
||||
extern std::unordered_map<uint32, EventConfig> eventConfigs;
|
||||
|
||||
class Event
|
||||
{
|
||||
public:
|
||||
static Event* instance()
|
||||
{
|
||||
static Event instance;
|
||||
return &instance;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* 将事件类型枚举转换为战场类型ID
|
||||
* @param eventType 事件类型枚举值(如C_ET_WS, C_ET_AB等)
|
||||
* @return 对应的战场类型ID,如果不是战场事件则返回BATTLEGROUND_TYPE_NONE
|
||||
*
|
||||
* 功能:提供EventTypes到BattlegroundTypeId的映射转换
|
||||
* 映射关系:
|
||||
* - C_ET_WS -> BATTLEGROUND_WS (战歌峡谷)
|
||||
* - C_ET_AB -> BATTLEGROUND_AB (阿拉希盆地)
|
||||
* - C_ET_EY -> BATTLEGROUND_EY (风暴之眼)
|
||||
* - C_ET_SA -> BATTLEGROUND_SA (远古海滩)
|
||||
* - C_ET_AV -> BATTLEGROUND_AV (奥特兰克山谷)
|
||||
* - C_ET_IC -> BATTLEGROUND_IC (征服之岛)
|
||||
*/
|
||||
BattlegroundTypeId ConvertEventTypeToBattlegroundType(EventTypes eventType) const;
|
||||
|
||||
/**
|
||||
* 获取当前事件对应的战场类型ID
|
||||
* @return 战场类型ID,如果不是战场事件则返回BATTLEGROUND_TYPE_NONE
|
||||
*
|
||||
* 功能:从事件配置中读取事件类型字符串,转换为对应的战场类型ID
|
||||
* 处理流程:
|
||||
* 1. 从eventConfigs中获取当前事件的配置信息
|
||||
* 2. 读取事件类型字符串(如"战场 - 战歌")
|
||||
* 3. 调用ConvertStringToEventType转换为枚举值
|
||||
* 4. 调用ConvertEventTypeToBattlegroundType转换为战场类型ID
|
||||
*
|
||||
* 用途:在StartCall函数中判断当前事件是否为战场事件,
|
||||
* 如果是则进行精确的队列检查,避免重复弹窗
|
||||
*/
|
||||
BattlegroundTypeId GetEventBattlegroundType() const;
|
||||
|
||||
/**
|
||||
* @brief 初始化与重载事件配置表
|
||||
* 从数据库或配置文件加载事件相关配置参数
|
||||
*/
|
||||
void LoadEventConfigs(bool forceReset);
|
||||
|
||||
/**
|
||||
* @brief 根据事件ID获取事件类型
|
||||
* @param eventId 事件唯一标识符
|
||||
* @return EventTypes 返回对应的事件类型枚举
|
||||
*/
|
||||
EventTypes GetEventTypeByEventId(uint32 eventId);
|
||||
|
||||
/**
|
||||
* @brief 重置事件状态
|
||||
* 清理所有事件相关数据,恢复到初始状态
|
||||
*/
|
||||
void Reset();
|
||||
|
||||
/**
|
||||
* @brief 初始化事件参数
|
||||
* @param eventId 要初始化的事件ID
|
||||
*/
|
||||
void InitParams(uint32 eventId);
|
||||
|
||||
/**
|
||||
* @brief 加载位置数据
|
||||
* 从配置中加载传送点、出生点等位置信息
|
||||
*/
|
||||
void LoadPos();
|
||||
|
||||
/**
|
||||
* @brief 启动指定事件
|
||||
* @param eventId 要启动的事件ID
|
||||
*/
|
||||
void Start(uint32 eventId);
|
||||
|
||||
/**
|
||||
* @brief 停止指定事件
|
||||
* @param eventId 要停止的事件ID
|
||||
*/
|
||||
void Stop(uint32 eventId);
|
||||
|
||||
/**
|
||||
* @brief 处理玩家接受邀请
|
||||
* @param player 接受邀请的玩家
|
||||
* @param menuId 菜单选项ID
|
||||
* @return bool 是否成功接受邀请
|
||||
*/
|
||||
bool AcceptInvitation(Player* player, uint32 menuId);
|
||||
|
||||
/**
|
||||
* @brief 检查玩家是否可以获得奖励
|
||||
* @param pl 要检查的玩家
|
||||
* @return bool 是否符合奖励条件
|
||||
*/
|
||||
bool CanRew(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 事件主更新循环
|
||||
* @param map 当前地图指针
|
||||
* @param diff 距离上次更新的时间差(毫秒)
|
||||
*/
|
||||
void Update(Map* map, uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 更新复活相关逻辑
|
||||
* @param diff 时间差(毫秒)
|
||||
*/
|
||||
void UpdateRevive(uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 更新安全区域逻辑
|
||||
* @param diff 时间差(毫秒)
|
||||
*/
|
||||
void UpdateSafe(uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 获取阵营剩余权重值
|
||||
* @param faction 阵营ID
|
||||
* @return int32 剩余权重,负数表示超载
|
||||
*/
|
||||
int32 GetWeightLeft(EventFactionId faction);
|
||||
|
||||
/**
|
||||
* @brief 计算玩家到指定位置的距离
|
||||
* @param player 玩家对象
|
||||
* @param pos 位置ID
|
||||
* @return float 距离值
|
||||
*/
|
||||
float GetDistance(Player* player, uint32 pos);
|
||||
|
||||
/**
|
||||
* @brief 传送玩家到指定位置
|
||||
* @param player 要传送的玩家
|
||||
* @param pos 目标位置ID
|
||||
*/
|
||||
void Tele(Player* player, uint32 pos);
|
||||
|
||||
/**
|
||||
* @brief 传送玩家到墓地
|
||||
* @param player 要传送的玩家
|
||||
*/
|
||||
void TeleToGraveyard(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 复活所有玩家
|
||||
* @param start 是否为事件开始时的复活
|
||||
*/
|
||||
void ReviveAll(bool start);
|
||||
|
||||
/**
|
||||
* 检查玩家是否在指定类型的战场队列中
|
||||
* @param player 要检查的玩家对象
|
||||
* @param bgTypeId 战场类型ID(如BATTLEGROUND_WS表示战歌峡谷)
|
||||
* @return true表示玩家在该战场队列中,false表示不在
|
||||
*
|
||||
* 功能:遍历玩家的所有战场队列槽位(最多2个),检查是否有匹配的战场类型
|
||||
* 用途:避免向已经在相同战场队列中的玩家发送重复的事件弹窗
|
||||
* 例如:玩家已经在战歌峡谷队列中,就不会收到战歌峡谷的事件弹窗
|
||||
* 但仍然可以收到阿拉希盆地的事件弹窗
|
||||
*/
|
||||
bool IsPlayerInSpecificBattlegroundQueue(Player* player, BattlegroundTypeId bgTypeId);
|
||||
|
||||
/**
|
||||
* @brief 玩家弹窗事件
|
||||
* 发送事件开始通知,邀请符合条件的玩家参与
|
||||
*/
|
||||
void StartCall();
|
||||
|
||||
/**
|
||||
* @brief 发放奖励并重置状态
|
||||
* 计算并发放事件奖励,重置相关数据
|
||||
*/
|
||||
void RewAndRest();
|
||||
|
||||
/**
|
||||
* @brief 玩家加入事件
|
||||
* @param pl 要加入的玩家
|
||||
*/
|
||||
void Join(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 获取玩家所属子组/阵营
|
||||
* @param pl 玩家对象
|
||||
* @return EventFactionId 玩家的阵营ID
|
||||
*/
|
||||
EventFactionId Subgroup(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 玩家离开事件
|
||||
* @param pl 要离开的玩家
|
||||
*/
|
||||
void Leave(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 处理玩家死亡传送
|
||||
* @param pl 死亡的玩家
|
||||
*/
|
||||
void DieTele(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 安全传送玩家
|
||||
* @param pl 要传送的玩家
|
||||
*/
|
||||
void SafeTele(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 更新事件目标的击杀/交互计数,并在达到条件时激活相关对象
|
||||
* @param obj 游戏对象
|
||||
* @param kill 是否为击杀事件,默认false
|
||||
*
|
||||
* 主要逻辑:
|
||||
计数更新: 根据对象类型(单位/游戏对象/玩家)更新击杀计数
|
||||
条件检查: 检查是否所有目标都已完成(check1)和阵营条件(check2)
|
||||
对象激活: 当条件满足时,使用 EventProcessor 延迟修改对象状态
|
||||
*/
|
||||
void UpdateActive(Object* obj, bool kill = false);
|
||||
|
||||
/**
|
||||
* @brief 功能: 管理事件阶段转换
|
||||
* @param obj 触发阶段变化的对象
|
||||
* @param kill 是否为击杀触发,默认false
|
||||
*
|
||||
* 核心机制:
|
||||
阶段检查: 验证下一阶段是否存在
|
||||
停止条件: 根据对象类型重置停止条件(StopGUID、StopPlayerKills等)
|
||||
阶段推进: 当所有停止条件满足时,推进到下一阶段并传送玩家
|
||||
*/
|
||||
void UpdatePhase(Object* obj, bool kill = false);
|
||||
|
||||
/**
|
||||
* @brief 功能: 更新游戏世界状态值
|
||||
* @param ID 世界状态ID
|
||||
* @param value 新的状态值
|
||||
*
|
||||
* 处理流程:
|
||||
* 类型区分: 游戏对象使用负数Entry(entry = -entry)
|
||||
状态更新: 通过 sWorldState->setWorldState() 更新全局状态
|
||||
递归调用: 调用重载版本 UpdateWorldState(itr->ID, value) 进行进一步处理
|
||||
通知机制: 在达到特定值时发送屏幕消息
|
||||
*/
|
||||
void UpdateWorldState(uint32 ID, uint32 value);
|
||||
|
||||
/**
|
||||
* @brief 初始化世界状态
|
||||
* 设置事件相关的所有世界状态初始值
|
||||
*/
|
||||
void InitWorldState();
|
||||
|
||||
/**
|
||||
* @brief 根据对象更新世界状态
|
||||
* @param obj 触发更新的对象
|
||||
* @param kill 是否为击杀事件,默认false
|
||||
*/
|
||||
void UpdateWorldState(Object* obj, bool kill = false);
|
||||
|
||||
// 专门的事件玩家复活函数
|
||||
void ReviveEventPlayers();
|
||||
|
||||
/**
|
||||
* @brief 更新生物刷新逻辑
|
||||
* @param diff 时间差(毫秒)
|
||||
*/
|
||||
void UpdateSpawn(uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 功能: 处理事件完成条件并检查是否应该停止事件
|
||||
* @param obj 要处理的游戏对象
|
||||
*
|
||||
* 主要作用:
|
||||
参数重置: 将匹配的停止条件参数重置为0
|
||||
事件终止: 当所有阵营的停止条件都满足时,调用 sCustomGameEventMgr->StopEvent() 结束事件
|
||||
*/
|
||||
void Process(Object* obj);
|
||||
|
||||
/**
|
||||
* @brief 获取指定阵营的成员数量
|
||||
* @param faction 阵营ID
|
||||
* @return uint32 该阵营的玩家数量
|
||||
*/
|
||||
uint32 GetFactionMembers(EventFactionId faction);
|
||||
|
||||
/**
|
||||
* @brief 处理玩家死亡传送逻辑
|
||||
* @param player 死亡的玩家
|
||||
* @return bool 是否成功处理传送
|
||||
*/
|
||||
bool DiedTele(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 发送区域灵魂医者查询包
|
||||
* @param player 目标玩家
|
||||
* @return bool 是否成功发送
|
||||
*/
|
||||
bool SendAreaSpiritHealerQueryOpcode(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 添加事件到玩家列表
|
||||
* @param player 玩家对象
|
||||
* @param obj 相关游戏对象
|
||||
* @param isBG 是否为战场事件,默认false
|
||||
*/
|
||||
void AddEventList(Player* player, Object* obj, bool isBG = false);
|
||||
|
||||
/**
|
||||
* @brief 获取传送位置坐标
|
||||
* @param posId 位置ID
|
||||
* @param map 地图ID(引用返回)
|
||||
* @param x X坐标(引用返回)
|
||||
* @param y Y坐标(引用返回)
|
||||
* @param z Z坐标(引用返回)
|
||||
* @param o 朝向(引用返回)
|
||||
*/
|
||||
void GetTelePos(uint32 posId, uint32& map, float& x, float& y, float& z, float& o);
|
||||
|
||||
/**
|
||||
* @brief 游戏对象未知检查1
|
||||
* @param target 目标单位
|
||||
* @param gob 游戏对象指针
|
||||
* @return bool 检查结果
|
||||
*/
|
||||
bool GobUnk1Check(Unit* target, GameObject* const gob);
|
||||
|
||||
/**
|
||||
* @brief IP地址检查
|
||||
* @param player 要检查的玩家
|
||||
* @return bool IP检查是否通过
|
||||
*/
|
||||
bool IpCheck(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 检查固定时间战场是否激活
|
||||
* @param bgTypeId 战场类型ID
|
||||
* @return bool 是否处于激活状态
|
||||
*/
|
||||
bool IsFixedTimeBgActive(BattlegroundTypeId bgTypeId);
|
||||
|
||||
/**
|
||||
* @brief 获取区域ID
|
||||
* @return int32 当前事件的区域ID
|
||||
*/
|
||||
int32 GetZoneId() { return _ZoneId; }
|
||||
|
||||
/**
|
||||
* @brief 召唤灵魂医者
|
||||
* 在指定位置生成灵魂医者NPC
|
||||
*/
|
||||
void SummonSoulHealer();
|
||||
|
||||
/**
|
||||
* @brief 发送屏幕消息
|
||||
* @param text 要显示的消息文本
|
||||
* @param faction 目标阵营,0表示所有阵营
|
||||
* @param onlydead 是否只发送给死亡玩家,默认false
|
||||
*/
|
||||
void SendScreenMessage(std::string text, EventFactionId faction = 0, bool onlydead = false);
|
||||
|
||||
/**
|
||||
* @brief 验证事件是否有效
|
||||
* @return bool 事件配置是否有效
|
||||
* 检查事件ID是否为0(无效事件)
|
||||
* 检查事件类型是否小于最小值 C_ET_LINE
|
||||
* 排除特定的背景事件ID BGIC_EVENT_ID
|
||||
*/
|
||||
bool Valid() { if (_EventId == 0 || _EventType < C_ET_LINE || _EventId == BGIC_EVENT_ID) return false; return true; }
|
||||
|
||||
// 热重载(不影响运行中的事件)
|
||||
void HotReloadConfigs();
|
||||
|
||||
// 完全重载(重置所有事件)
|
||||
void FullReloadConfigs();
|
||||
|
||||
private:
|
||||
/*_game_event*/
|
||||
uint32 _EventId; //事件ID
|
||||
std::string _EventName; //事件名称
|
||||
EventTypes _EventType; //事件类型
|
||||
GroupTypes _GroupType;
|
||||
RejoinTypes _RejoinType;
|
||||
std::string _NoticeText;
|
||||
std::string _GossipText;
|
||||
int32 _ZoneId;
|
||||
Map* _Map;
|
||||
uint8 _Phase;
|
||||
bool _RandomAH;
|
||||
uint32 _WinRewId;
|
||||
uint32 _LosRewId;
|
||||
uint32 _DamageForRew;
|
||||
uint32 _HealForRew;
|
||||
uint32 _KillsForRew;
|
||||
uint32 _KilledForRew;
|
||||
|
||||
//Start
|
||||
std::unordered_map<EventFactionId, std::string> _FactionNameMap;
|
||||
std::unordered_map<EventFactionId, uint32> _StartPosMap;
|
||||
std::unordered_map<EventFactionId, uint32> _StopPosMap;
|
||||
std::unordered_map<uint32, EventFactionId>_GroupMap;
|
||||
std::vector<EventFactionId> _FactionVec;
|
||||
std::unordered_map<ObjectGuid, EventFactionId>_PlayersMap;
|
||||
std::unordered_map<EventFactionId, EventKillInfoTemplate> _KillInfoMap;
|
||||
|
||||
//Stop
|
||||
std::vector<EventStopTemplate>_StopVec;
|
||||
|
||||
//Alt
|
||||
std::vector<EventAltTemplate>_AltVec;
|
||||
std::vector<EventAltFactionTemplate>_AltFactionVec;
|
||||
std::vector<int64>_AltedVec;
|
||||
|
||||
// 阶段队伍配置
|
||||
std::vector<EventPhaseFactionTemplate> _PhaseFactionVec;
|
||||
|
||||
// 阶段配置
|
||||
std::vector<EventPhaseTemplate> _PhaseVec;
|
||||
|
||||
//Healer
|
||||
std::unordered_map<EventFactionId, ObjectGuid /*const*/> _HealerMap; //移除const
|
||||
|
||||
// 世界状态配置
|
||||
std::vector<EventWorldStateTemplate> _WorldStateVec;
|
||||
|
||||
// 处理世界状态队伍配置
|
||||
std::vector<EventWorldStateFactionTemplate> _WorldStateFactionVec;
|
||||
|
||||
// 生物或物体刷新配置
|
||||
std::vector<EventSpawnTemplate> _SpawnVec;
|
||||
uint32 _UpdateSpawnTimer;
|
||||
|
||||
uint32 _UpdateSafeTimer;
|
||||
uint32 _UpdateReviveTimer;
|
||||
bool _SoulVisual;
|
||||
|
||||
bool _DelayStartCall;
|
||||
bool _DelayStopCall;
|
||||
uint32 _UpdateDelayNotice;
|
||||
EventFactionId _WinFaction;
|
||||
|
||||
bool _DelayRewardCall = false; // 延迟弹窗
|
||||
uint32 _DelayRewardTimer = 0; // 延迟弹窗
|
||||
public:
|
||||
uint32 GetPhaseGraveyardPos(EventFactionId faction)
|
||||
{
|
||||
for (auto itr = _PhaseFactionVec.begin(); itr != _PhaseFactionVec.end(); itr++)
|
||||
if (itr->Faction == faction && itr->Phase == _Phase)
|
||||
return itr->GraveyardPos;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void GetKillInfo(EventFactionId faction, uint32 &Kills, uint32 &Killeds)
|
||||
{
|
||||
auto itr = _KillInfoMap.find(faction);
|
||||
if (itr != _KillInfoMap.end())
|
||||
{
|
||||
Kills = itr->second.Kills;
|
||||
Killeds = itr->second.Killeds;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateKillInfo(Player* player, bool kill)
|
||||
{
|
||||
// 一次性获取 CustomPlayerData 对象
|
||||
auto playerData = g_CustomPlayerDataManager.GetOrCreatePlayerData(player->GetGUID().GetCounter());
|
||||
if (!playerData)
|
||||
return;
|
||||
|
||||
auto itr = _KillInfoMap.find(playerData->GetEventFaction());
|
||||
if (itr != _KillInfoMap.end())
|
||||
{
|
||||
if (kill)
|
||||
itr->second.Kills++;
|
||||
else
|
||||
itr->second.Killeds++;
|
||||
}
|
||||
}
|
||||
};
|
||||
#define sEvent Event::instance()
|
||||
|
||||
// 延迟修改生物标志的事件类
|
||||
class DelayedUnitFlagEvent : public BasicEvent
|
||||
{
|
||||
public:
|
||||
DelayedUnitFlagEvent(Unit& unit, uint16 index, uint32 value) :
|
||||
_unit(unit), _index(index), _value(value) {}
|
||||
|
||||
bool Execute(uint64, uint32) override
|
||||
{
|
||||
// 确保单位仍然有效且不在战斗中
|
||||
if (_unit.IsAlive() && !_unit.IsInCombat())
|
||||
_unit.SetUInt32Value(_index, _value);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Unit& _unit;
|
||||
uint16 _index;
|
||||
uint32 _value;
|
||||
};
|
||||
|
||||
// 延迟修改游戏对象标志的事件类
|
||||
class DelayedGameObjectFlagEvent : public BasicEvent
|
||||
{
|
||||
public:
|
||||
DelayedGameObjectFlagEvent(GameObject& go, uint16 index, uint32 value) :
|
||||
_go(go), _index(index), _value(value) {}
|
||||
|
||||
bool Execute(uint64, uint32) override
|
||||
{
|
||||
_go.SetUInt32Value(_index, _value);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
GameObject& _go;
|
||||
uint16 _index;
|
||||
uint32 _value;
|
||||
};
|
||||
@ -19,7 +19,7 @@
|
||||
|
||||
#include "mod_CustomEvent/FixedTimeBG/FixedTimeBG.h"
|
||||
#include "mod_CommonFunc/CommonFunc.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
|
||||
#include "mod_DataLoader/DataLoader.h"
|
||||
#include "mod_Reward/Reward.h"
|
||||
#include "mod_Requirement/Requirement.h"
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
#include "GameEventMgr.h"
|
||||
#include "mod_CustomGameEventMgr.h"
|
||||
|
||||
#include "../Event.h"
|
||||
|
||||
#include "../mod_CustomWorldData/mod_CustomWorldData.h"
|
||||
#include "SA.h"
|
||||
|
||||
|
||||
@ -4,13 +4,14 @@
|
||||
#include "CreatureScript.h"
|
||||
#include "Chat.h"
|
||||
|
||||
#include "../Event.h"
|
||||
|
||||
#include "../mod_CommonFunc/CommonFunc.h"
|
||||
#include "../mod_Reward/Reward.h"
|
||||
#include "../mod_CustomWorldData/mod_CustomWorldData.h"
|
||||
#include <mod_CustomObjectMgr.h>
|
||||
#include "UnknownBG.h"
|
||||
#include <WorldSessionMgr.h>
|
||||
#include "FunctionCollection.h"
|
||||
|
||||
std::vector<UkBGTemplate> UkBGVec;
|
||||
uint32 UKBG_KILLEDSEQUENCE;
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
#include "mod_ResetInstance/ResetInstance.h"
|
||||
#include "mod_CustomEvent/FixedTimeBG/FixedTimeBG.h"
|
||||
#include "mod_ServerAnnounce/ServerAnnounce.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include "mod_scripts/CustomScripts.h"
|
||||
#include "mod_FakePlayers/FakePlayers.h"
|
||||
#include "mod_SpellMod/SpellMod.h"
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
#include "mod_String/mod_String.h"
|
||||
#include "mod_CharNameMod/CharNameMod.h"
|
||||
#include "mod_FunctionCollection/FunctionCollection.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
|
||||
#include "mod_MainFunc/MainFunc.h"
|
||||
#include "mod_CustomPlayerDataManager/CustomPlayerDataManager.h"
|
||||
|
||||
|
||||
@ -8,8 +8,48 @@
|
||||
#define SENDER_RESET_INS 8888
|
||||
#define SENDER_VIP_CURR 8000
|
||||
#define SENDER_VIP_UP 8001
|
||||
#define SENDER_CUSTOM_EVENT_ACTIVE 9008
|
||||
|
||||
#define SENDER_CUSTOM_EVENT_DEACTIVE 9009
|
||||
#define SENDER_ALT_CLASS 8002
|
||||
#define SENDER_RANK 9001
|
||||
#define SENDER_FACTION 9002
|
||||
|
||||
#define EVENT_ID_QUICK_RESPONSE 161 // 抢答事件ID
|
||||
|
||||
// 假人更新
|
||||
#define EVENT_ID_FAKE_PLAYER_UPDATE_ZONE_ID 71 // 假人更新区域ID的事件ID
|
||||
#define EVENT_ID_FAKE_PLAYER_LOGIN_OR_LOGOUT 72 // 假人登录或登出的事件ID
|
||||
#define EVENT_ID_FAKE_PLAYER_LEVEL_UP 73 // 假人升级的事件ID
|
||||
|
||||
//大逃杀
|
||||
#define UKBG_EVENT_ID 0 // 大逃杀事件的ID
|
||||
#define UKBG_LENGTH 18000 // 大逃杀事件的持续时间(单位可能是秒或毫秒)
|
||||
#define UKBG_H_REWID 32 // 大逃杀高级奖励ID
|
||||
#define UKBG_M_REWID 33 // 大逃杀中级奖励ID
|
||||
#define UKBG_L_REWID 33 // 大逃杀低级奖励ID
|
||||
|
||||
// 狭路相逢
|
||||
#define NARROW_EVENT_ID 0 // 狭路相逢事件的ID
|
||||
#define NARROW_EVENT_DEFENSE_POSID 2 // 狭路相逢防守方位置ID
|
||||
#define NARROW_EVENT_OFFENSE_POSID 3 // 狭路相逢进攻方位置ID
|
||||
#define NARROW_EVENT_DEBUFF_ID 60001 // 狭路相逢事件中使用的减益效果ID
|
||||
|
||||
// 征服之岛
|
||||
#define BGIC_EVENT_ID 160 // 征服之岛战场事件ID
|
||||
#define BGIC_EVENT_MAP 628 // 征服之岛战场地图ID
|
||||
#define BGIC_SSS_REWARD_ID 1 // 征服之岛特殊奖励ID
|
||||
#define BGIC_REWARD_ID 2 // 征服之岛普通奖励ID
|
||||
#define BGIC_DISPLAY_MAX 10 // 征服之岛排行榜显示最大人数
|
||||
#define BGIC_STOP_KILLS 50 // 征服之岛结束所需的击杀数
|
||||
|
||||
// 争霸赛事件 mod-ArenaContest
|
||||
#define EVENT_ID_ARENA_CONTEST_SIGNUP 74 // 争霸赛报名事件ID
|
||||
#define EVENT_ID_ARENA_CONTEST_START 75 // 争霸赛开始事件ID
|
||||
|
||||
#define SENDER_CUSTOM_EVENT_ACTIVE 9008
|
||||
|
||||
// 定义最大的坐骑法术数量
|
||||
#define MAX_MOUNT_SPELLS 8
|
||||
|
||||
// 存储坐骑法术的数组
|
||||
inline uint32 MountSpells[MAX_MOUNT_SPELLS] = { 95001, 95002, 95003, 95004, 95005, 95006, 95007, 95008 };
|
||||
|
||||
@ -14,8 +14,8 @@ void AddSC_custom_commandscript();
|
||||
void AddSC_QQMsg();
|
||||
void AddSC_ArenaDuel();
|
||||
void AddSC_BGICScript();
|
||||
void AddSC_CustomEventScript();
|
||||
void AddCustomEventScript();//事件脚本
|
||||
void AddSC_CustomEventScript(); // 自定义事件脚本
|
||||
|
||||
//void AddSC_Gurubashi();
|
||||
void AddSC_SATrigger();
|
||||
void AddSC_UkBG();
|
||||
@ -130,8 +130,8 @@ void Addmod_GhostScriptsScripts(){
|
||||
AddSC_QQMsg();
|
||||
AddSC_ArenaDuel();
|
||||
AddSC_BGICScript();
|
||||
AddSC_CustomEventScript();
|
||||
AddCustomEventScript();//事件脚本
|
||||
AddSC_CustomEventScript(); // 自定义事件脚本
|
||||
|
||||
//AddSC_Gurubashi();
|
||||
AddSC_SATrigger();
|
||||
AddSC_UkBG();
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
#include "GameTime.h"
|
||||
|
||||
#include "mod_Instance/InstanceDieTele.h"
|
||||
#include <Event.h>
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
|
||||
std::unordered_map<uint32, InstanceDieTeleTemplate> InstanceDieTeleMap;
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
#include "mod_Lottery/Lottery.h"
|
||||
#include "mod_CommonFunc/CommonFunc.h"
|
||||
#include "mod_Recruit/Recruit.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include "mod_Requirement/Requirement.h"
|
||||
#include "mod_Reward/Reward.h"
|
||||
#include "mod_Quest/QuestMod.h"
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
#include "ScriptedCreature.h"
|
||||
#include <GridNotifiers.h>
|
||||
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include <mod_CustomObjectMgr.h>
|
||||
#include "mod_NPC/NPC.h"
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
#include "PlayerScript.h"
|
||||
|
||||
#include "../mod_CommonFunc/CommonFunc.h"
|
||||
#include "../mod_CustomEvent/Event.h"
|
||||
|
||||
#include <WorldSessionMgr.h>
|
||||
|
||||
//LM三个BOSS的entry
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
#include "mod_FunctionCollection/FunctionCollection.h"
|
||||
#include "mod_Reward/Reward.h"
|
||||
#include "mod_Requirement/Requirement.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include "mod_Quest/QuestMod.h"
|
||||
|
||||
std::unordered_map<uint32, QuestModTemplate> QuestModMap;
|
||||
|
||||
@ -10,10 +10,12 @@
|
||||
#include "mod_CommonFunc/CommonFunc.h"
|
||||
#include "mod_Reward/Reward.h"
|
||||
#include "mod_Switch/Switch.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
|
||||
#include <mod_CustomGameEventMgr.h>
|
||||
#include "mod_QuickResponse/QuickResponse.h"
|
||||
#include <WorldSessionMgr.h>
|
||||
#include "FunctionCollection.h"
|
||||
|
||||
using namespace Acore::ChatCommands;
|
||||
|
||||
std::vector<QuickResponseTemplate> QuickResponseVec;
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
#include "AllCreatureScript.h"
|
||||
|
||||
#include "mod_Scripts/CustomScripts.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include "mod_CustomWorldData/mod_CustomWorldData.h"
|
||||
#include "mod_CustomObjectMgr/mod_CustomObjectMgr.h"
|
||||
#include <mod_CustomCreature/mod_CustomCreature.h>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
#include "Player.h"
|
||||
|
||||
#include "mod_Scripts/CustomScripts.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include "mod_CustomWorldData/mod_CustomWorldData.h"
|
||||
#include <WorldSessionMgr.h>
|
||||
#include <Scripting/ScriptMgrMacros.h>
|
||||
|
||||
3663
modules/mod_GhostScripts/src/mod_SmEvent/SmEvent.cpp
Normal file
3663
modules/mod_GhostScripts/src/mod_SmEvent/SmEvent.cpp
Normal file
File diff suppressed because it is too large
Load Diff
711
modules/mod_GhostScripts/src/mod_SmEvent/SmEvent.h
Normal file
711
modules/mod_GhostScripts/src/mod_SmEvent/SmEvent.h
Normal file
@ -0,0 +1,711 @@
|
||||
#pragma once
|
||||
|
||||
#define EventFactionId uint32 // 事件队伍ID类型定义
|
||||
|
||||
struct PosTemplate
|
||||
{
|
||||
uint32 map;
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
float o;
|
||||
};
|
||||
|
||||
extern std::unordered_map<uint32, PosTemplate> PosMap;
|
||||
|
||||
enum class GroupTypes
|
||||
{
|
||||
C_GT_ONE_ALL,
|
||||
C_GT_ONE_A,
|
||||
C_GT_ONE_H,
|
||||
C_GT_RANDOM_A_H,
|
||||
C_GT_RANDOM_PLAYER
|
||||
};
|
||||
|
||||
enum class RejoinTypes
|
||||
{
|
||||
C_RT_BANED,
|
||||
C_RT_KEEP_GROUP,
|
||||
C_RT_REDIS_GROUP
|
||||
};
|
||||
|
||||
enum class EventTypes
|
||||
{
|
||||
C_ET_NONE = 0, // 默认值,表示无事件或错误
|
||||
C_ET_WS, // 战场 - 战歌
|
||||
C_ET_AB, // 战场 - 阿拉希
|
||||
C_ET_EY, // 战场 - 风暴之眼
|
||||
C_ET_SA, // 战场 - 远古海滩
|
||||
C_ET_AV, // 战场 - 奥山
|
||||
C_ET_IC, // 战场 - 征服之岛
|
||||
C_ET_TELE, // 仅传送
|
||||
C_ET_LINE, // 对线
|
||||
C_ET_FACTION, // 自定义阵营
|
||||
C_ET_GUILD, // 公会
|
||||
C_ET_SINGLE // 单人
|
||||
};
|
||||
|
||||
struct EventPhaseFactionTemplate
|
||||
{
|
||||
uint8 Phase;
|
||||
uint32 Faction;
|
||||
uint32 GraveyardPos;
|
||||
uint32 GraveyardSafe;
|
||||
uint32 GraveyardHealer;
|
||||
uint32 StopTelePos;
|
||||
uint32 StopPlayerKills;
|
||||
uint32 StopPlayerKilleds;
|
||||
std::string GraveyardSafeNotice;
|
||||
std::string StopNotice;
|
||||
};
|
||||
|
||||
struct EventPhaseTemplate
|
||||
{
|
||||
uint8 Phase;
|
||||
uint32 StopGUID;
|
||||
};
|
||||
|
||||
#define ALT_GUID_MAX 5
|
||||
|
||||
|
||||
struct EventAltTemplate
|
||||
{
|
||||
int64 GUID;
|
||||
uint32 AltFlag;
|
||||
std::string NoticeText;
|
||||
int64 TargetEntry[ALT_GUID_MAX];
|
||||
uint32 TargetCount[ALT_GUID_MAX];
|
||||
uint32 TargetKillCount[ALT_GUID_MAX];
|
||||
};
|
||||
|
||||
struct EventAltFactionTemplate
|
||||
{
|
||||
int64 GUID;
|
||||
EventFactionId Faction;
|
||||
uint32 Kills;
|
||||
uint32 Killeds;
|
||||
};
|
||||
|
||||
// _事件_结束条件配置
|
||||
struct EventStopTemplate
|
||||
{
|
||||
EventFactionId Faction;
|
||||
TypeID StopType;
|
||||
uint32 Param;
|
||||
uint32 Weight;
|
||||
};
|
||||
|
||||
struct EventKillInfoTemplate
|
||||
{
|
||||
uint32 Kills;
|
||||
uint32 Killeds;
|
||||
};
|
||||
|
||||
#define WORLDSTATE_ENTRY_MAX 3
|
||||
|
||||
struct EventWorldStateTemplate
|
||||
{
|
||||
uint32 ID;
|
||||
int32 InitValue;
|
||||
int64 Entry[WORLDSTATE_ENTRY_MAX];
|
||||
int32 Step[WORLDSTATE_ENTRY_MAX];
|
||||
int32 NoticeValue;
|
||||
std::string NoticeT;
|
||||
};
|
||||
|
||||
struct EventWorldStateFactionTemplate
|
||||
{
|
||||
uint32 ID;
|
||||
uint32 Faction;
|
||||
bool Kill;
|
||||
int32 Step;
|
||||
int32 NoticeValue;
|
||||
std::string NoticeText;
|
||||
};
|
||||
|
||||
#define MAX_SPAWNNOTICE_COUNT 3
|
||||
|
||||
struct EventSpawnTemplate
|
||||
{
|
||||
int64 Entry;
|
||||
uint32 Phase;
|
||||
uint32 SpawnTime;
|
||||
uint32 PosId;
|
||||
uint32 Duration;
|
||||
uint32 NoticeTime[MAX_SPAWNNOTICE_COUNT];
|
||||
std::string SpawnNotice[MAX_SPAWNNOTICE_COUNT];
|
||||
};
|
||||
|
||||
struct EventListTemplate
|
||||
{
|
||||
std::string EventName;
|
||||
std::string StartTime;
|
||||
std::string Occurence;
|
||||
std::string Length;
|
||||
EventTypes EventType;
|
||||
};
|
||||
|
||||
extern std::unordered_map<uint32, EventListTemplate> EventListMap;
|
||||
|
||||
/// <summary>
|
||||
/// 改造事件初始化
|
||||
/// </summary>
|
||||
struct EventTeamConfig
|
||||
{
|
||||
uint32 teamId;
|
||||
std::string teamName;
|
||||
uint32 startPosId;
|
||||
uint32 stopPosId;
|
||||
};
|
||||
|
||||
struct EventConfig
|
||||
{
|
||||
std::string eventName;
|
||||
std::string noticeText;
|
||||
std::string gossipText;
|
||||
int32 zoneId;
|
||||
|
||||
std::string eventType; // 这里暂时用字符串表示,稍后将根据实际情况转换为枚举
|
||||
std::string groupType; // 组队类型,暂时用字符串表示,稍后将根据实际情况转换为枚举
|
||||
std::string rejoinType; // 重新加入类型,暂时用字符串表示,稍后将根据实际情况转换为枚举
|
||||
|
||||
uint32 winRewId;
|
||||
uint32 losRewId;
|
||||
uint32 damageForRew;
|
||||
uint32 healForRew;
|
||||
uint32 killsForRew;
|
||||
uint32 killedForRew;
|
||||
|
||||
std::vector<EventTeamConfig> teams; // _事件_队伍配置
|
||||
std::vector<EventStopTemplate> stopConditions; // _事件_结束条件配置
|
||||
std::vector<EventAltTemplate> activationConditions; // _事件_生物或物体激活条件配置
|
||||
std::vector<EventAltFactionTemplate> AltFactionVec; // _事件_生物或物体激活条件队伍配置
|
||||
std::vector<EventPhaseTemplate> PhaseVec; // _事件_阶段生物或物体配置
|
||||
std::vector<EventPhaseFactionTemplate> phaseFactions; // _事件_阶段队伍配置
|
||||
std::vector<EventWorldStateTemplate> worldStates; // _事件_世界状态配置
|
||||
std::vector<EventWorldStateFactionTemplate> WorldStateFactionVec; // _事件_世界状态队伍配置
|
||||
std::vector<EventSpawnTemplate> spawns; // _事件_生物或物体刷新配置
|
||||
};
|
||||
|
||||
extern std::unordered_map<uint32, EventConfig> eventConfigs;
|
||||
|
||||
class Event
|
||||
{
|
||||
public:
|
||||
static Event* instance()
|
||||
{
|
||||
static Event instance;
|
||||
return &instance;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* 将事件类型枚举转换为战场类型ID
|
||||
* @param eventType 事件类型枚举值(如C_ET_WS, C_ET_AB等)
|
||||
* @return 对应的战场类型ID,如果不是战场事件则返回BATTLEGROUND_TYPE_NONE
|
||||
*
|
||||
* 功能:提供EventTypes到BattlegroundTypeId的映射转换
|
||||
* 映射关系:
|
||||
* - C_ET_WS -> BATTLEGROUND_WS (战歌峡谷)
|
||||
* - C_ET_AB -> BATTLEGROUND_AB (阿拉希盆地)
|
||||
* - C_ET_EY -> BATTLEGROUND_EY (风暴之眼)
|
||||
* - C_ET_SA -> BATTLEGROUND_SA (远古海滩)
|
||||
* - C_ET_AV -> BATTLEGROUND_AV (奥特兰克山谷)
|
||||
* - C_ET_IC -> BATTLEGROUND_IC (征服之岛)
|
||||
*/
|
||||
BattlegroundTypeId ConvertEventTypeToBattlegroundType(EventTypes eventType) const;
|
||||
|
||||
/**
|
||||
* 获取当前事件对应的战场类型ID
|
||||
* @return 战场类型ID,如果不是战场事件则返回BATTLEGROUND_TYPE_NONE
|
||||
*
|
||||
* 功能:从事件配置中读取事件类型字符串,转换为对应的战场类型ID
|
||||
* 处理流程:
|
||||
* 1. 从eventConfigs中获取当前事件的配置信息
|
||||
* 2. 读取事件类型字符串(如"战场 - 战歌")
|
||||
* 3. 调用ConvertStringToEventType转换为枚举值
|
||||
* 4. 调用ConvertEventTypeToBattlegroundType转换为战场类型ID
|
||||
*
|
||||
* 用途:在StartCall函数中判断当前事件是否为战场事件,
|
||||
* 如果是则进行精确的队列检查,避免重复弹窗
|
||||
*/
|
||||
BattlegroundTypeId GetEventBattlegroundType() const;
|
||||
|
||||
/**
|
||||
* @brief 初始化与重载事件配置表
|
||||
* 从数据库或配置文件加载事件相关配置参数
|
||||
*/
|
||||
void LoadEventConfigs(bool forceReset);
|
||||
|
||||
/**
|
||||
* @brief 根据事件ID获取事件类型
|
||||
* @param eventId 事件唯一标识符
|
||||
* @return EventTypes 返回对应的事件类型枚举
|
||||
*/
|
||||
EventTypes GetEventTypeByEventId(uint32 eventId);
|
||||
|
||||
/**
|
||||
* @brief 重置事件状态
|
||||
* 清理所有事件相关数据,恢复到初始状态
|
||||
*/
|
||||
void Reset();
|
||||
|
||||
/**
|
||||
* @brief 初始化事件参数
|
||||
* @param eventId 要初始化的事件ID
|
||||
*/
|
||||
void InitParams(uint32 eventId);
|
||||
|
||||
/**
|
||||
* @brief 加载位置数据
|
||||
* 从配置中加载传送点、出生点等位置信息
|
||||
*/
|
||||
void LoadPos();
|
||||
|
||||
/**
|
||||
* @brief 启动指定事件
|
||||
* @param eventId 要启动的事件ID
|
||||
*/
|
||||
void Start(uint16 eventId);
|
||||
|
||||
/**
|
||||
* @brief 停止指定事件
|
||||
* @param eventId 要停止的事件ID
|
||||
*/
|
||||
void Stop(uint16 eventId);
|
||||
|
||||
/**
|
||||
* @brief 处理玩家接受邀请
|
||||
* @param player 接受邀请的玩家
|
||||
* @param menuId 菜单选项ID
|
||||
* @return bool 是否成功接受邀请
|
||||
*/
|
||||
bool AcceptInvitation(Player* player, uint32 menuId);
|
||||
|
||||
/**
|
||||
* @brief 检查玩家是否可以获得奖励
|
||||
* @param pl 要检查的玩家
|
||||
* @return bool 是否符合奖励条件
|
||||
*/
|
||||
bool CanRew(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 事件主更新循环
|
||||
* @param map 当前地图指针
|
||||
* @param diff 距离上次更新的时间差(毫秒)
|
||||
*/
|
||||
void Update(Map* map, uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 更新复活相关逻辑
|
||||
* @param diff 时间差(毫秒)
|
||||
*/
|
||||
void UpdateRevive(uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 更新安全区域逻辑
|
||||
* @param diff 时间差(毫秒)
|
||||
*/
|
||||
void UpdateSafe(uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 获取阵营剩余权重值
|
||||
* @param faction 阵营ID
|
||||
* @return int32 剩余权重,负数表示超载
|
||||
*/
|
||||
int32 GetWeightLeft(EventFactionId faction);
|
||||
|
||||
/**
|
||||
* @brief 计算玩家到指定位置的距离
|
||||
* @param player 玩家对象
|
||||
* @param pos 位置ID
|
||||
* @return float 距离值
|
||||
*/
|
||||
float GetDistance(Player* player, uint32 pos);
|
||||
|
||||
/**
|
||||
* @brief 传送玩家到指定位置
|
||||
* @param player 要传送的玩家
|
||||
* @param pos 目标位置ID
|
||||
*/
|
||||
void Tele(Player* player, uint32 pos);
|
||||
|
||||
/**
|
||||
* @brief 传送玩家到墓地
|
||||
* @param player 要传送的玩家
|
||||
*/
|
||||
void TeleToGraveyard(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 复活所有玩家
|
||||
* @param start 是否为事件开始时的复活
|
||||
*/
|
||||
void ReviveAll(bool start);
|
||||
|
||||
/**
|
||||
* 检查玩家是否在指定类型的战场队列中
|
||||
* @param player 要检查的玩家对象
|
||||
* @param bgTypeId 战场类型ID(如BATTLEGROUND_WS表示战歌峡谷)
|
||||
* @return true表示玩家在该战场队列中,false表示不在
|
||||
*
|
||||
* 功能:遍历玩家的所有战场队列槽位(最多2个),检查是否有匹配的战场类型
|
||||
* 用途:避免向已经在相同战场队列中的玩家发送重复的事件弹窗
|
||||
* 例如:玩家已经在战歌峡谷队列中,就不会收到战歌峡谷的事件弹窗
|
||||
* 但仍然可以收到阿拉希盆地的事件弹窗
|
||||
*/
|
||||
bool IsPlayerInSpecificBattlegroundQueue(Player* player, BattlegroundTypeId bgTypeId);
|
||||
|
||||
/**
|
||||
* @brief 玩家弹窗事件
|
||||
* 发送事件开始通知,邀请符合条件的玩家参与
|
||||
*/
|
||||
void StartCall();
|
||||
|
||||
/**
|
||||
* @brief 发放奖励并重置状态
|
||||
* 计算并发放事件奖励,重置相关数据
|
||||
*/
|
||||
void RewAndRest();
|
||||
|
||||
/**
|
||||
* @brief 玩家加入事件
|
||||
* @param pl 要加入的玩家
|
||||
*/
|
||||
void Join(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 获取玩家所属子组/阵营
|
||||
* @param pl 玩家对象
|
||||
* @return EventFactionId 玩家的阵营ID
|
||||
*/
|
||||
EventFactionId Subgroup(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 玩家离开事件
|
||||
* @param pl 要离开的玩家
|
||||
*/
|
||||
void Leave(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 处理玩家死亡传送
|
||||
* @param pl 死亡的玩家
|
||||
*/
|
||||
void DieTele(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 安全传送玩家
|
||||
* @param pl 要传送的玩家
|
||||
*/
|
||||
void SafeTele(Player* pl);
|
||||
|
||||
/**
|
||||
* @brief 更新事件目标的击杀/交互计数,并在达到条件时激活相关对象
|
||||
* @param obj 游戏对象
|
||||
* @param kill 是否为击杀事件,默认false
|
||||
*
|
||||
* 主要逻辑:
|
||||
计数更新: 根据对象类型(单位/游戏对象/玩家)更新击杀计数
|
||||
条件检查: 检查是否所有目标都已完成(check1)和阵营条件(check2)
|
||||
对象激活: 当条件满足时,使用 EventProcessor 延迟修改对象状态
|
||||
*/
|
||||
void UpdateActive(Object* triggerObj, Player* executor, bool kill);
|
||||
|
||||
/**
|
||||
* @brief 功能: 管理事件阶段转换
|
||||
* @param obj 触发阶段变化的对象
|
||||
* @param kill 是否为击杀触发,默认false
|
||||
*
|
||||
* 核心机制:
|
||||
阶段检查: 验证下一阶段是否存在
|
||||
停止条件: 根据对象类型重置停止条件(StopGUID、StopPlayerKills等)
|
||||
阶段推进: 当所有停止条件满足时,推进到下一阶段并传送玩家
|
||||
*/
|
||||
void UpdatePhase(Object* obj, bool kill = false);
|
||||
|
||||
/**
|
||||
* @brief 功能: 更新游戏世界状态值
|
||||
* @param ID 世界状态ID
|
||||
* @param value 新的状态值
|
||||
*
|
||||
* 处理流程:
|
||||
* 类型区分: 游戏对象使用负数Entry(entry = -entry)
|
||||
状态更新: 通过 sWorldState->setWorldState() 更新全局状态
|
||||
递归调用: 调用重载版本 UpdateWorldState(itr->ID, value) 进行进一步处理
|
||||
通知机制: 在达到特定值时发送屏幕消息
|
||||
*/
|
||||
void UpdateWorldState(uint32 ID, uint32 value);
|
||||
|
||||
/**
|
||||
* @brief 初始化世界状态
|
||||
* 设置事件相关的所有世界状态初始值
|
||||
*/
|
||||
void InitWorldState();
|
||||
|
||||
/**
|
||||
* @brief 根据对象更新世界状态
|
||||
* @param obj 触发更新的对象
|
||||
* @param kill 是否为击杀事件,默认false
|
||||
*/
|
||||
void UpdateWorldState(Object* obj, bool kill = false);
|
||||
|
||||
// 专门的事件玩家复活函数
|
||||
void ReviveEventPlayers();
|
||||
|
||||
/**
|
||||
* @brief 更新生物刷新逻辑
|
||||
* @param diff 时间差(毫秒)
|
||||
*/
|
||||
void UpdateSpawn(uint32 diff);
|
||||
|
||||
/**
|
||||
* @brief 功能: 处理事件完成条件并检查是否应该停止事件
|
||||
* @param obj 要处理的游戏对象
|
||||
*
|
||||
* 主要作用:
|
||||
参数重置: 将匹配的停止条件参数重置为0
|
||||
事件终止: 当所有阵营的停止条件都满足时,调用 sCustomGameEventMgr->StopEvent() 结束事件
|
||||
*/
|
||||
void Process(Object* obj);
|
||||
|
||||
/**
|
||||
* @brief 获取指定阵营的成员数量
|
||||
* @param faction 阵营ID
|
||||
* @return uint32 该阵营的玩家数量
|
||||
*/
|
||||
uint32 GetFactionMembers(EventFactionId faction);
|
||||
|
||||
/**
|
||||
* @brief 处理玩家死亡传送逻辑
|
||||
* @param player 死亡的玩家
|
||||
* @return bool 是否成功处理传送
|
||||
*/
|
||||
bool DiedTele(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 发送区域灵魂医者查询包
|
||||
* @param player 目标玩家
|
||||
* @return bool 是否成功发送
|
||||
*/
|
||||
bool SendAreaSpiritHealerQueryOpcode(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 添加事件到玩家列表
|
||||
* @param player 玩家对象
|
||||
* @param obj 相关游戏对象
|
||||
* @param isBG 是否为战场事件,默认false
|
||||
*/
|
||||
void AddEventList(Player* player, Object* obj, bool isBG = false);
|
||||
|
||||
/**
|
||||
* @brief 获取传送位置坐标
|
||||
* @param posId 位置ID
|
||||
* @param map 地图ID(引用返回)
|
||||
* @param x X坐标(引用返回)
|
||||
* @param y Y坐标(引用返回)
|
||||
* @param z Z坐标(引用返回)
|
||||
* @param o 朝向(引用返回)
|
||||
*/
|
||||
void GetTelePos(uint32 posId, uint32& map, float& x, float& y, float& z, float& o);
|
||||
|
||||
/**
|
||||
* @brief 游戏对象未知检查1
|
||||
* @param target 目标单位
|
||||
* @param gob 游戏对象指针
|
||||
* @return bool 检查结果
|
||||
*/
|
||||
bool GobUnk1Check(Unit* target, GameObject* const gob);
|
||||
|
||||
/**
|
||||
* @brief IP地址检查
|
||||
* @param player 要检查的玩家
|
||||
* @return bool IP检查是否通过
|
||||
*/
|
||||
bool IpCheck(Player* player);
|
||||
|
||||
/**
|
||||
* @brief 检查固定时间战场是否激活
|
||||
* @param bgTypeId 战场类型ID
|
||||
* @return bool 是否处于激活状态
|
||||
*/
|
||||
bool IsFixedTimeBgActive(BattlegroundTypeId bgTypeId);
|
||||
|
||||
/**
|
||||
* @brief 获取区域ID
|
||||
* @return int32 当前事件的区域ID
|
||||
*/
|
||||
int32 GetZoneId() { return _ZoneId; }
|
||||
|
||||
// 地图ID比较方法
|
||||
bool IsPlayerInEventMap(Player* player) const
|
||||
{
|
||||
return _Map && player->GetMap() == _Map;
|
||||
}
|
||||
|
||||
// 或者直接获取事件地图名称
|
||||
const char* GetEventMapName() const
|
||||
{
|
||||
return _Map ? _Map->GetMapName() : "未知地图";
|
||||
}
|
||||
|
||||
// 添加获取事件名称的方法
|
||||
const std::string& GetEventName() const { return _EventName; }
|
||||
|
||||
/**
|
||||
* @brief 召唤灵魂医者
|
||||
* 在指定位置生成灵魂医者NPC
|
||||
*/
|
||||
void SummonSoulHealer();
|
||||
|
||||
/**
|
||||
* @brief 发送屏幕消息
|
||||
* @param text 要显示的消息文本
|
||||
* @param faction 目标阵营,0表示所有阵营
|
||||
* @param onlydead 是否只发送给死亡玩家,默认false
|
||||
*/
|
||||
void SendScreenMessage(std::string text, EventFactionId faction = 0, bool onlydead = false);
|
||||
|
||||
// 检查生物是否自定义事件中设定的
|
||||
bool IsEventCreature(uint32 entry) const;
|
||||
|
||||
// 更新击杀信息
|
||||
void UpdateKillInfo(Player* player, bool kill);
|
||||
|
||||
// 获取击杀信息
|
||||
void GetKillInfo(EventFactionId faction, uint32& Kills, uint32& Killeds);
|
||||
|
||||
// 获取事件阵营的相应墓地位置
|
||||
uint32 GetPhaseGraveyardPos(EventFactionId faction);
|
||||
|
||||
// 事件过滤函数
|
||||
bool ShouldProcessEventCreature(Player* player, Creature* creature);
|
||||
|
||||
/**
|
||||
* @brief 验证事件是否有效
|
||||
* @return bool 事件配置是否有效
|
||||
* 检查事件ID是否为0(无效事件)
|
||||
* 检查事件类型是否小于最小值 C_ET_LINE
|
||||
* 排除特定的背景事件ID BGIC_EVENT_ID
|
||||
*/
|
||||
bool Valid();
|
||||
|
||||
// 热重载(不影响运行中的事件)
|
||||
void HotReloadConfigs();
|
||||
|
||||
// 完全重载(重置所有事件)
|
||||
void FullReloadConfigs();
|
||||
|
||||
// 【测试用】检查数据加载
|
||||
void DebugStopConditions();
|
||||
|
||||
private:
|
||||
/*_game_event*/
|
||||
uint32 _EventId; //事件ID
|
||||
std::string _EventName; //事件名称
|
||||
EventTypes _EventType; //事件类型
|
||||
GroupTypes _GroupType;
|
||||
RejoinTypes _RejoinType;
|
||||
std::string _NoticeText;
|
||||
std::string _GossipText;
|
||||
int32 _ZoneId;
|
||||
Map* _Map;
|
||||
uint8 _Phase;
|
||||
bool _RandomAH;
|
||||
uint32 _WinRewId;
|
||||
uint32 _LosRewId;
|
||||
uint32 _DamageForRew;
|
||||
uint32 _HealForRew;
|
||||
uint32 _KillsForRew;
|
||||
uint32 _KilledForRew;
|
||||
|
||||
//Start
|
||||
std::unordered_map<EventFactionId, std::string> _FactionNameMap;
|
||||
std::unordered_map<EventFactionId, uint32> _StartPosMap;
|
||||
std::unordered_map<EventFactionId, uint32> _StopPosMap;
|
||||
std::unordered_map<uint32, EventFactionId>_GroupMap;
|
||||
std::vector<EventFactionId> _FactionVec;
|
||||
std::unordered_map<ObjectGuid, EventFactionId>_PlayersMap;
|
||||
std::unordered_map<EventFactionId, EventKillInfoTemplate> _KillInfoMap;
|
||||
|
||||
//Stop
|
||||
std::vector<EventStopTemplate>_StopVec;
|
||||
|
||||
//Alt
|
||||
std::vector<EventAltTemplate>_AltVec;
|
||||
std::vector<EventAltFactionTemplate>_AltFactionVec;
|
||||
std::vector<int64>_AltedVec;
|
||||
|
||||
// 阶段队伍配置
|
||||
std::vector<EventPhaseFactionTemplate> _PhaseFactionVec;
|
||||
|
||||
// 阶段配置
|
||||
std::vector<EventPhaseTemplate> _PhaseVec;
|
||||
|
||||
//Healer
|
||||
std::unordered_map<EventFactionId, ObjectGuid /*const*/> _HealerMap; //移除const
|
||||
|
||||
// 世界状态配置
|
||||
std::vector<EventWorldStateTemplate> _WorldStateVec;
|
||||
|
||||
// 处理世界状态队伍配置
|
||||
std::vector<EventWorldStateFactionTemplate> _WorldStateFactionVec;
|
||||
|
||||
// 生物或物体刷新配置
|
||||
std::vector<EventSpawnTemplate> _SpawnVec;
|
||||
uint32 _UpdateSpawnTimer;
|
||||
|
||||
uint32 _UpdateSafeTimer;
|
||||
uint32 _UpdateReviveTimer;
|
||||
bool _SoulVisual;
|
||||
|
||||
bool _DelayStartCall;
|
||||
bool _DelayStopCall;
|
||||
uint32 _UpdateDelayNotice;
|
||||
EventFactionId _WinFaction;
|
||||
|
||||
bool _DelayRewardCall = false; // 延迟弹窗
|
||||
uint32 _DelayRewardTimer = 0; // 延迟弹窗
|
||||
|
||||
bool _isStopping = false; // 事件结束重复调用检查
|
||||
};
|
||||
#define sEvent Event::instance()
|
||||
|
||||
// 延迟修改生物标志的事件类
|
||||
class DelayedUnitFlagEvent : public BasicEvent
|
||||
{
|
||||
public:
|
||||
DelayedUnitFlagEvent(Unit& unit, uint16 index, uint32 value) :
|
||||
_unit(unit), _index(index), _value(value) {}
|
||||
|
||||
bool Execute(uint64, uint32) override
|
||||
{
|
||||
// 确保单位仍然有效且不在战斗中
|
||||
if (_unit.IsAlive() && !_unit.IsInCombat())
|
||||
_unit.SetUInt32Value(_index, _value);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
Unit& _unit;
|
||||
uint16 _index;
|
||||
uint32 _value;
|
||||
};
|
||||
|
||||
// 延迟修改游戏对象标志的事件类
|
||||
class DelayedGameObjectFlagEvent : public BasicEvent
|
||||
{
|
||||
public:
|
||||
DelayedGameObjectFlagEvent(GameObject& go, uint16 index, uint32 value) :
|
||||
_go(go), _index(index), _value(value) {}
|
||||
|
||||
bool Execute(uint64, uint32) override
|
||||
{
|
||||
_go.SetUInt32Value(_index, _value);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
GameObject& _go;
|
||||
uint16 _index;
|
||||
uint32 _value;
|
||||
};
|
||||
@ -1,19 +1,19 @@
|
||||
// modules/mod_GhostScripts/src/mod_Trigger/Trigger.cpp
|
||||
|
||||
#include "Player.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "CreatureScript.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "Chat.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "Log.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "Config.h"
|
||||
#include "CommandScript.h"
|
||||
#include "Trigger.h"
|
||||
#include "mod_CustomEvent/Event.h"
|
||||
#include <numeric>
|
||||
#include <chrono>
|
||||
#include "Player.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "CreatureScript.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "Chat.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "Log.h"
|
||||
#include "ObjectAccessor.h"
|
||||
#include "Config.h"
|
||||
#include "CommandScript.h"
|
||||
#include "Trigger.h"
|
||||
#include "SmEvent.h" // 新事件文件测试智能提示是否OK
|
||||
#include <numeric>
|
||||
#include <chrono>
|
||||
#include <Requirement.h>
|
||||
|
||||
// 全局触发器数据容器实例
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user