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:
尚美 2025-08-24 11:27:18 +08:00
parent 325a393ff3
commit 62b82c9f8a
23 changed files with 4456 additions and 3907 deletions

View File

@ -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"

View File

@ -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>

View File

@ -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

View File

@ -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 IDBATTLEGROUND_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 IDBATTLEGROUND_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 IDBATTLEGROUND_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
*
*
: //
: check1check2
: 使 EventProcessor
*/
void UpdateActive(Object* obj, bool kill = false);
/**
* @brief :
* @param obj
* @param kill false
*
*
:
: StopGUIDStopPlayerKills等
:
*/
void UpdatePhase(Object* obj, bool kill = false);
/**
* @brief :
* @param ID ID
* @param value
*
*
* : 使Entryentry = -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;
};

View File

@ -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"

View File

@ -4,7 +4,7 @@
#include "GameEventMgr.h"
#include "mod_CustomGameEventMgr.h"
#include "../Event.h"
#include "../mod_CustomWorldData/mod_CustomWorldData.h"
#include "SA.h"

View File

@ -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;

View File

@ -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"

View File

@ -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"

View File

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

View File

@ -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();

View File

@ -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;

View File

@ -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"

View File

@ -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"

View File

@ -6,7 +6,7 @@
#include "PlayerScript.h"
#include "../mod_CommonFunc/CommonFunc.h"
#include "../mod_CustomEvent/Event.h"
#include <WorldSessionMgr.h>
//LM三个BOSS的entry

View File

@ -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;

View File

@ -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;

View File

@ -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>

View File

@ -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>

File diff suppressed because it is too large Load Diff

View 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 IDBATTLEGROUND_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 IDBATTLEGROUND_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 IDBATTLEGROUND_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
*
*
: //
: check1check2
: 使 EventProcessor
*/
void UpdateActive(Object* triggerObj, Player* executor, bool kill);
/**
* @brief :
* @param obj
* @param kill false
*
*
:
: StopGUIDStopPlayerKills等
:
*/
void UpdatePhase(Object* obj, bool kill = false);
/**
* @brief :
* @param ID ID
* @param value
*
*
* : 使Entryentry = -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;
};

View File

@ -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>
// 全局触发器数据容器实例