From aab1b9d2d6ef0f1017ae68a1a1c53bf35db996f5 Mon Sep 17 00:00:00 2001 From: Viste Date: Wed, 13 Jan 2021 07:26:29 +0300 Subject: [PATCH 1/2] Core/Battlefield: some wintergrasp work thx to ccrs --- src/server/game/Entities/Object/Object.cpp | 4 + src/server/game/Entities/Player/Player.cpp | 80 +- src/server/game/Entities/Player/Player.h | 3 +- src/server/game/Spells/SpellEffects.cpp | 2 +- .../scripts/Northrend/zone_wintergrasp.cpp | 703 +++++++----------- src/server/shared/DataStores/DBCEnums.h | 58 +- src/server/shared/SharedDefines.h | 27 +- .../worldserver/CommandLine/CliRunnable.cpp | 2 +- .../worldserver/RemoteAccess/RASession.cpp | 2 +- 9 files changed, 382 insertions(+), 499 deletions(-) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 8ff105ef15e90..2d39b9701dc87 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1018,6 +1018,8 @@ void WorldObject::setActive(bool on) map->AddToActive(ToCreature()); else if (GetTypeId() == TYPEID_DYNAMICOBJECT) map->AddToActive((DynamicObject*)this); + else if (GetTypeId() == TYPEID_GAMEOBJECT) + map->AddToActive((GameObject*)this); } else { @@ -1025,6 +1027,8 @@ void WorldObject::setActive(bool on) map->RemoveFromActive(ToCreature()); else if (GetTypeId() == TYPEID_DYNAMICOBJECT) map->RemoveFromActive((DynamicObject*)this); + else if (GetTypeId() == TYPEID_GAMEOBJECT) + map->RemoveFromActive((GameObject*)this); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c24f69a20cae1..d3d0b6be665f5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6572,6 +6572,42 @@ void Player::RewardReputation(Quest const* quest) } } +/* + * If in a battleground or battlefield player dies, and an enemy removes the insignia, the player's bones is lootable + * Called by remove insignia spell effect + */ +void Player::RemovePVPInsignia(Player* looter) +{ + // If player is not in battleground and not in battlefield + if (!GetBattlegroundId() && !sBattlefieldMgr->GetEnabledBattlefield(GetZoneId())) + return; + + // If not released spirit, do it ! + if (m_deathTimer > 0) + { + m_deathTimer = 0; + BuildPlayerRepop(); + RepopAtGraveyard(); + } + + _corpseLocation.WorldRelocate(); + + // We have to convert player corpse to bones, not to be able to resurrect there + // SpawnCorpseBones isn't handy, 'cos it saves player + Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true); + if (!bones) + return; + + // Now we must make bones lootable, and send player loot + bones->SetFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE); + + // We store the level of our player in the gold field + // We retrieve this information at Player::SendLoot() + bones->loot.gold = getLevel(); + bones->lootRecipient = looter; + looter->SendLoot(bones->GetGUID(), LOOT_INSIGNIA); +} + void Player::UpdateHonorFields() { /// called when rewarding honor and at each save @@ -8203,40 +8239,6 @@ bool Player::CheckAmmoCompatibility(ItemTemplate const* ammo_proto) const return true; } -/* If in a battleground a player dies, and an enemy removes the insignia, the player's bones is lootable - Called by remove insignia spell effect */ -void Player::RemovedInsignia(Player* looterPlr) -{ - // If player is not in battleground and not in worldpvpzone - if (!GetBattlegroundId() && !IsInWorldPvpZone()) - return; - - // If not released spirit, do it ! - if (m_deathTimer > 0) - { - m_deathTimer = 0; - BuildPlayerRepop(); - RepopAtGraveyard(); - } - - _corpseLocation.WorldRelocate(); - - // We have to convert player corpse to bones, not to be able to resurrect there - // SpawnCorpseBones isn't handy, 'cos it saves player while he in BG - Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true); - if (!bones) - return; - - // Now we must make bones lootable, and send player loot - bones->SetFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE); - - // We store the level of our player in the gold field - // We retrieve this information at Player::SendLoot() - bones->loot.gold = GetLevel(); - bones->lootRecipient = looterPlr; - looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA); -} - void Player::SendLootRelease(ObjectGuid guid) const { WorldPacket data(SMSG_LOOT_RELEASE_RESPONSE, (8+1)); @@ -8431,7 +8433,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) } } } - else if (guid.IsCorpse()) // remove insignia + else if (guid.IsCorpse()) // remove insignia { Corpse* bones = ObjectAccessor::GetCorpse(*this, guid); @@ -8445,7 +8447,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) if (loot->loot_type == LOOT_NONE) { - uint32 pLevel = bones->loot.gold; + float playerLevel = bones->loot.gold; bones->loot.clear(); // For AV Achievement @@ -8455,12 +8457,12 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) loot->FillLoot(PLAYER_CORPSE_LOOT_ENTRY, LootTemplates_Creature, this, true); } // For wintergrasp Quests - else if (GetZoneId() == AREA_WINTERGRASP) + else if (GetZoneId() == BATTLEFIELD_ZONEID_WINTERGRASP) loot->FillLoot(PLAYER_CORPSE_LOOT_ENTRY, LootTemplates_Creature, this, true); // It may need a better formula // Now it works like this: lvl10: ~6copper, lvl70: ~9silver - bones->loot.gold = uint32(urand(50, 150) * 0.016f * std::pow(float(pLevel) / 5.76f, 2.5f) * CONF_GET_FLOAT("Rate.Drop.Money")); + bones->loot.gold = uint32(urand(50, 150) * 0.016f * std::pow(playerLevel / 5.76f, 2.5f) * CONF_GET_FLOAT("Rate.Drop.Money")); } if (bones->lootRecipient != this) @@ -8673,7 +8675,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId) Battleground* battleground = GetBattleground(); OutdoorPvP* outdoorPvP = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneId); InstanceScript* instance = GetInstanceScript(); - Battlefield* battlefield = sBattlefieldMgr->GetBattlefieldToZoneId(zoneId); + Battlefield* battlefield = sBattlefieldMgr->GetBattlefield(zoneId); LOG_DEBUG("network", "Player::SendInitWorldStates: Sending SMSG_INIT_WORLD_STATES for Map: %u, Zone: %u", mapId, zoneId); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5f8fef09f9c47..8cf7b85be9e50 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1629,8 +1629,6 @@ class WH_GAME_API Player : public Unit, public GridObject ObjectGuid GetLootGUID() const { return m_lootGuid; } void SetLootGUID(ObjectGuid guid) { m_lootGuid = guid; } - void RemovedInsignia(Player* looterPlr); - WorldSession* GetSession() const { return m_session; } void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override; @@ -1775,6 +1773,7 @@ class WH_GAME_API Player : public Unit, public GridObject /*** PVP SYSTEM ***/ /*********************************************************/ void SetArenaFaction(uint8 arenaFaction) { SetByteValue(PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_ARENA_FACTION, arenaFaction); } + void RemovePVPInsignia(Player* looter); void UpdateHonorFields(); bool RewardHonor(Unit* victim, uint32 groupsize, int32 honor = -1, bool pvptoken = false); uint32 GetHonorPoints() const { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index b3e25aab48adf..03a104ed903f8 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4964,7 +4964,7 @@ void Spell::EffectSkinPlayerCorpse(SpellEffIndex /*effIndex*/) if (!player || !target || target->IsAlive()) return; - target->RemovedInsignia(player); + target->RemovePVPInsignia(player); } void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex) diff --git a/src/server/scripts/Northrend/zone_wintergrasp.cpp b/src/server/scripts/Northrend/zone_wintergrasp.cpp index f3e99bc1db621..b8a6e7afc1863 100644 --- a/src/server/scripts/Northrend/zone_wintergrasp.cpp +++ b/src/server/scripts/Northrend/zone_wintergrasp.cpp @@ -18,65 +18,73 @@ #include "ScriptMgr.h" #include "Battlefield.h" #include "BattlefieldMgr.h" -#include "Battlefield/BattlefieldWG.h" -#include "DBCStores.h" +#include "BattlefieldWG.h" +#include "ConditionMgr.h" +#include "Creature.h" +#include "DBCStructure.h" #include "GameObject.h" #include "GameObjectAI.h" -#include "GameTime.h" -#include "ObjectMgr.h" #include "Player.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -#include "ScriptSystem.h" -#include "SpellAuras.h" +#include "SharedDefines.h" +#include "SpellAuraDefines.h" #include "SpellAuraEffects.h" +#include "SpellInfo.h" #include "SpellScript.h" +#include "Timer.h" +#include "Unit.h" #include "Vehicle.h" -#include "WorldSession.h" +#include -#define GOSSIP_HELLO_DEMO1 "Build catapult." -#define GOSSIP_HELLO_DEMO2 "Build demolisher." -#define GOSSIP_HELLO_DEMO3 "Build siege engine." -#define GOSSIP_HELLO_DEMO4 "I cannot build more!" - -enum WGqueuenpctext +enum ZoneWintergraspNPCTexts { - WG_NPCQUEUE_TEXT_H_NOWAR = 14775, - WG_NPCQUEUE_TEXT_H_QUEUE = 14790, - WG_NPCQUEUE_TEXT_H_WAR = 14777, - WG_NPCQUEUE_TEXT_A_NOWAR = 14782, - WG_NPCQUEUE_TEXT_A_QUEUE = 14791, - WG_NPCQUEUE_TEXT_A_WAR = 14781, - WG_NPCQUEUE_TEXTOPTION_JOIN = 20077, + NPC_TEXT_HORDE_HOW_CAN_I_HELP = 13759, + NPC_TEXT_HORDE_SORRY_ONLY_OFFICER = 13761, + NPC_TEXT_ALLIANCE_HOW_CAN_I_HELP = 13798, + NPC_TEXT_ALLIANCE_SORRY_ONLY_OFFICER = 14172, + NPC_TEXT_SORRY_USED_ALL_PARTS = 13786, + + NPC_TEXT_HORDE_NOWAR = 14775, + NPC_TEXT_HORDE_QUEUE = 14790, + NPC_TEXT_HORDE_WAR = 14777, + NPC_TEXT_ALLIANCE_NOWAR = 14782, + NPC_TEXT_ALLIANCE_QUEUE = 14791, + NPC_TEXT_ALLIANCE_WAR = 14781 }; -enum Spells +enum ZoneWintergraspGossipMenuIds { - // Demolisher engineers spells - SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE = 61409, - SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE = 56662, - SPELL_BUILD_CATAPULT_FORCE = 56664, - SPELL_BUILD_DEMOLISHER_FORCE = 56659, - SPELL_ACTIVATE_CONTROL_ARMS = 49899, - SPELL_RIDE_WG_VEHICLE = 60968, - - SPELL_VEHICLE_TELEPORT = 49759, - - // Spirit guide - SPELL_CHANNEL_SPIRIT_HEAL = 22011, + GOSSIP_MENU_ENGINEER_HORDE = 9904, + GOSSIP_MENU_ENGINEER_ALLIANCE = 9923, }; -enum CreatureIds +enum ZoneWintergraspGossipMenuOptionIds { - NPC_GOBLIN_MECHANIC = 30400, - NPC_GNOMISH_ENGINEER = 30499, + GOSSIP_MENU_OPTION_ENGINEER_CATAPULT = 0, + GOSSIP_MENU_OPTION_ENGINEER_DEMOLISHER = 1, + GOSSIP_MENU_OPTION_ENGINEER_SIEGE_ENGINE = 2 +}; - NPC_WINTERGRASP_CONTROL_ARMS = 27852, +enum ZoneWintergraspSpells +{ + SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE = 61409, // Demolisher engineers spells + SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE = 56662, + SPELL_BUILD_CATAPULT_FORCE = 56664, + SPELL_BUILD_DEMOLISHER_FORCE = 56659, + SPELL_ACTIVATE_CONTROL_ARMS = 49899, + SPELL_RIDE_WINTERGRASP_VEHICLE = 60968, + SPELL_VEHICLE_TELEPORT = 49759, + SPELL_CHANNEL_SPIRIT_HEAL = 22011, // Spirit guide + SPELL_WINTERGRASP_TELEPORT_TRIGGER = 54643, +}; - NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC = 23472, +enum ZoneWintergraspCreatureEntries +{ + NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC = 23472, }; -enum QuestIds +enum ZoneWintergraspQuestIds { QUEST_BONES_AND_ARROWS_HORDE_ATT = 13193, QUEST_JINXING_THE_WALLS_HORDE_ATT = 13202, @@ -107,9 +115,7 @@ enum QuestIds QUEST_A_RARE_HERB_ALLIANCE_DEF = 13156, }; -uint8 const MAX_WINTERGRASP_VEHICLES = 4; - -uint32 const vehiclesList[MAX_WINTERGRASP_VEHICLES] = +static std::vector const wintergraspVehicleIds = { NPC_WINTERGRASP_CATAPULT, NPC_WINTERGRASP_DEMOLISHER, @@ -117,441 +123,246 @@ uint32 const vehiclesList[MAX_WINTERGRASP_VEHICLES] = NPC_WINTERGRASP_SIEGE_ENGINE_HORDE }; -class npc_wg_demolisher_engineer : public CreatureScript +struct npc_wg_demolisher_engineer : public ScriptedAI { - public: - npc_wg_demolisher_engineer() : CreatureScript("npc_wg_demolisher_engineer") { } + npc_wg_demolisher_engineer(Creature* creature) : ScriptedAI(creature) + { + } - struct npc_wg_demolisher_engineerAI : public ScriptedAI - { - npc_wg_demolisher_engineerAI(Creature* creature) : ScriptedAI(creature) { } + void Reset() override + { + } - bool OnGossipHello(Player* player) override + bool GossipHello(Player* player) override + { + if (CanBuild()) + { + if (player->HasAura(SPELL_WINTERGRASP_CORPORAL)) { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); - - if (CanBuild()) - { - if (player->HasAura(SPELL_CORPORAL)) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - else if (player->HasAura(SPELL_LIEUTENANT)) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - } - } - else - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_HELLO_DEMO4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - - SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); + AddGossipItemFor(player, me->GetEntry() == NPC_WINTERGRASP_GOBLIN_MECHANIC ? GOSSIP_MENU_ENGINEER_HORDE : GOSSIP_MENU_ENGINEER_ALLIANCE, GOSSIP_MENU_OPTION_ENGINEER_CATAPULT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + SendGossipMenuFor(player, me->GetEntry() == NPC_WINTERGRASP_GOBLIN_MECHANIC ? NPC_TEXT_HORDE_HOW_CAN_I_HELP : NPC_TEXT_ALLIANCE_HOW_CAN_I_HELP, me); return true; } - - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + else if (player->HasAura(SPELL_WINTERGRASP_LIEUTENANT)) { - uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - CloseGossipMenuFor(player); - - if (CanBuild()) - { - switch (action - GOSSIP_ACTION_INFO_DEF) - { - case 0: - DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true); - break; - case 1: - DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true); - break; - case 2: - DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); - break; - } - if (Creature* controlArms = me->FindNearestCreature(NPC_WINTERGRASP_CONTROL_ARMS, 30.0f, true)) - DoCast(controlArms, SPELL_ACTIVATE_CONTROL_ARMS, true); - } + AddGossipItemFor(player, me->GetEntry() == NPC_WINTERGRASP_GOBLIN_MECHANIC ? GOSSIP_MENU_ENGINEER_HORDE : GOSSIP_MENU_ENGINEER_ALLIANCE, GOSSIP_MENU_OPTION_ENGINEER_CATAPULT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + AddGossipItemFor(player, me->GetEntry() == NPC_WINTERGRASP_GOBLIN_MECHANIC ? GOSSIP_MENU_ENGINEER_HORDE : GOSSIP_MENU_ENGINEER_ALLIANCE, GOSSIP_MENU_OPTION_ENGINEER_DEMOLISHER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + AddGossipItemFor(player, me->GetEntry() == NPC_WINTERGRASP_GOBLIN_MECHANIC ? GOSSIP_MENU_ENGINEER_HORDE : GOSSIP_MENU_ENGINEER_ALLIANCE, GOSSIP_MENU_OPTION_ENGINEER_SIEGE_ENGINE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + SendGossipMenuFor(player, me->GetEntry() == NPC_WINTERGRASP_GOBLIN_MECHANIC ? NPC_TEXT_HORDE_HOW_CAN_I_HELP : NPC_TEXT_ALLIANCE_HOW_CAN_I_HELP, me); return true; } - - private: - bool CanBuild() const + else { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return false; - - switch (me->GetEntry()) - { - case NPC_GOBLIN_MECHANIC: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); - case NPC_GNOMISH_ENGINEER: - return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); - default: - return false; - } + SendGossipMenuFor(player, me->GetEntry() == NPC_WINTERGRASP_GOBLIN_MECHANIC ? NPC_TEXT_HORDE_SORRY_ONLY_OFFICER : NPC_TEXT_ALLIANCE_SORRY_ONLY_OFFICER, me); + return true; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_wg_demolisher_engineerAI(creature); } -}; -class npc_wg_spirit_guide : public CreatureScript -{ - public: - npc_wg_spirit_guide() : CreatureScript("npc_wg_spirit_guide") { } + SendGossipMenuFor(player, NPC_TEXT_SORRY_USED_ALL_PARTS, me); + return true; + } - struct npc_wg_spirit_guideAI : public ScriptedAI - { - npc_wg_spirit_guideAI(Creature* creature) : ScriptedAI(creature) { } + bool GossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + CloseGossipMenuFor(player); - void UpdateAI(uint32 /*diff*/) override - { - if (!me->HasUnitState(UNIT_STATE_CASTING)) - DoCast(me, SPELL_CHANNEL_SPIRIT_HEAL); - } + if (CanBuild()) + { + uint32 const selection = action - GOSSIP_ACTION_INFO_DEF; + if (selection >= 0 && selection < 3) + player->CastSpell(player, SPELL_ACTIVATE_CONTROL_ARMS, true); - bool OnGossipHello(Player* player) override + switch (selection) { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - GraveyardVect graveyard = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < graveyard.size(); i++) - if (graveyard[i]->GetControlTeamId() == player->GetTeamId()) - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetWarheadString(((BfGraveyardWG*)graveyard[i])->GetTextId()), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + i); - - SendGossipMenuFor(player, player->GetGossipTextId(me), me->GetGUID()); - return true; + case 0: + DoCast(player, SPELL_BUILD_CATAPULT_FORCE, true); + break; + case 1: + DoCast(player, SPELL_BUILD_DEMOLISHER_FORCE, true); + break; + case 2: + DoCast(player, player->GetTeamId() == TEAM_ALLIANCE ? SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE : SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, true); + break; + default: + break; } + } + return true; + } - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override - { - uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp) - { - GraveyardVect gy = wintergrasp->GetGraveyardVector(); - for (uint8 i = 0; i < gy.size(); i++) - if (action - GOSSIP_ACTION_INFO_DEF == i && gy[i]->GetControlTeamId() == player->GetTeamId()) - if (WorldSafeLocsEntry const* safeLoc = sWorldSafeLocsStore.LookupEntry(gy[i]->GetGraveyardId())) - player->TeleportTo(safeLoc->Continent, safeLoc->Loc.X, safeLoc->Loc.Y, safeLoc->Loc.Z, 0); - } - return true; - } - }; +private: + bool CanBuild() const + { + Battlefield* wintergrasp = sBattlefieldMgr->GetEnabledBattlefield(me->GetZoneId()); + if (!wintergrasp || !wintergrasp->IsWarTime()) + return false; - CreatureAI* GetAI(Creature* creature) const override + switch (me->GetEntry()) { - return new npc_wg_spirit_guideAI(creature); + case NPC_WINTERGRASP_GOBLIN_MECHANIC: + //return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H)); + case NPC_WINTERGRASP_GNOMISH_ENGINEER: + //return (wintergrasp->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) > wintergrasp->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A)); + default: + return false; } + } }; -enum WGQueue -{ - SPELL_FROST_ARMOR = 12544 -}; - -class npc_wg_queue : public CreatureScript +struct go_wg_vehicle_teleporter : public GameObjectAI { - public: - npc_wg_queue() : CreatureScript("npc_wg_queue") { } + go_wg_vehicle_teleporter(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(1000) { } - struct npc_wg_queueAI : public ScriptedAI + void UpdateAI(uint32 diff) + { + _checkTimer.Update(diff); + if (_checkTimer.Passed()) { - npc_wg_queueAI(Creature* creature) : ScriptedAI(creature) + Battlefield* wintergrasp = sBattlefieldMgr->GetEnabledBattlefield(me->GetZoneId()); + if (!wintergrasp || !wintergrasp->IsWarTime()) { - FrostArmor_Timer = 0; + _checkTimer.Reset(60000); + return; } - uint32 FrostArmor_Timer; - - void Reset() override + Creature* teleportTrigger = me->FindNearestCreature(NPC_WORLD_TRIGGER_LARGE_AOI_NOT_IMMUNE_PC_NPC, 5.0f, true); + if (!teleportTrigger) { - FrostArmor_Timer = 0; + _checkTimer.Reset(60000); + return; } - void JustEngagedWith(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override + for (uint32 entry : wintergraspVehicleIds) { - if (FrostArmor_Timer <= diff) - { - DoCast(me, SPELL_FROST_ARMOR); - FrostArmor_Timer = 180000; - } - else FrostArmor_Timer -= diff; - - DoMeleeAttackIfReady(); + if (Creature* vehicle = me->FindNearestCreature(entry, 5.0f, true)) + HandleTeleport(vehicle, teleportTrigger, wintergrasp); } - bool OnGossipHello(Player* player) override - { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetWarheadString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, me->GetGUID()); - } - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - player->SendUpdateWorldState(4354, GameTime::GetGameTime() + timer); - if (timer < 15 * MINUTE) - { - AddGossipItemFor(player, GOSSIP_ICON_CHAT, player->GetSession()->GetWarheadString(WG_NPCQUEUE_TEXTOPTION_JOIN), GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, me->GetGUID()); - } - else - SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_NOWAR : WG_NPCQUEUE_TEXT_A_NOWAR, me->GetGUID()); - } - return true; - } - - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override - { - CloseGossipMenuFor(player); - - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (!wintergrasp) - return true; - - if (wintergrasp->IsWarTime()) - wintergrasp->InvitePlayerToWar(player); - else - { - uint32 timer = wintergrasp->GetTimer() / 1000; - if (timer < 15 * MINUTE) - wintergrasp->InvitePlayerToQueue(player); - } - return true; - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_wg_queueAI(creature); + _checkTimer.Reset(2000); } -}; - -class go_wg_vehicle_teleporter : public GameObjectScript -{ - public: - go_wg_vehicle_teleporter() : GameObjectScript("go_wg_vehicle_teleporter") { } - - struct go_wg_vehicle_teleporterAI : public GameObjectAI - { - go_wg_vehicle_teleporterAI(GameObject* gameObject) : GameObjectAI(gameObject), _checkTimer(0) { } + } - bool IsFriendly(Unit* passenger) - { - return ((me->GetFaction() == FACTION_HORDE_GENERIC_WG && passenger->GetFaction() == HORDE) || - (me->GetFaction() == FACTION_ALLIANCE_GENERIC_WG && passenger->GetFaction() == ALLIANCE)); - } +private: + void HandleTeleport(Creature* vehicle, Creature* teleportTrigger, Battlefield* wintergrasp) + { + if (vehicle->HasAura(SPELL_VEHICLE_TELEPORT)) + return; - Creature* GetValidVehicle(Creature* cVeh) - { - if (!cVeh->HasAura(SPELL_VEHICLE_TELEPORT)) - if (Vehicle* vehicle = cVeh->GetVehicleKit()) - if (Unit* passenger = vehicle->GetPassenger(0)) - if (IsFriendly(passenger)) - if (Creature* teleportTrigger = passenger->SummonTrigger(me->GetPositionX()-60.0f, me->GetPositionY(), me->GetPositionZ()+1.0f, cVeh->GetOrientation(), 1s)) - return teleportTrigger; - - return nullptr; - } + Player* owner = vehicle->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (!owner) + return; - void UpdateAI(uint32 diff) - { - _checkTimer += diff; - if (_checkTimer >= 1000) - { - for (uint8 i = 0; i < MAX_WINTERGRASP_VEHICLES; i++) - if (Creature* vehicleCreature = me->FindNearestCreature(vehiclesList[i], 3.0f, true)) - if (Creature* teleportTrigger = GetValidVehicle(vehicleCreature)) - teleportTrigger->CastSpell(vehicleCreature, SPELL_VEHICLE_TELEPORT, true); + if (wintergrasp->GetAttackingTeamId() != owner->GetTeamId()) + return; - _checkTimer = 0; - } - } - private: - uint32 _checkTimer; - }; + teleportTrigger->CastSpell(vehicle, SPELL_VEHICLE_TELEPORT, true); + } - GameObjectAI* GetAI(GameObject* go) const override - { - return new go_wg_vehicle_teleporterAI(go); - } + TimeTracker _checkTimer; }; -class spell_wintergrasp_force_building : public SpellScriptLoader +// 56659 - Build Demolisher (Force) +// 56662 - Build Siege Vehicle (Force) +// 56664 - Build Catapult (Force) +// 61409 - Build Siege Vehicle (Force) +class spell_wintergrasp_force_building : public SpellScript { - public: - spell_wintergrasp_force_building() : SpellScriptLoader("spell_wintergrasp_force_building") { } - - class spell_wintergrasp_force_building_SpellScript : public SpellScript - { - PrepareSpellScript(spell_wintergrasp_force_building_SpellScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo( - { - SPELL_BUILD_CATAPULT_FORCE, - SPELL_BUILD_DEMOLISHER_FORCE, - SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, - SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE - }); - } + PrepareSpellScript(spell_wintergrasp_force_building); - void HandleScript(SpellEffIndex effIndex) + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( { - PreventHitDefaultEffect(effIndex); - GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), false); - } + SPELL_BUILD_CATAPULT_FORCE, + SPELL_BUILD_DEMOLISHER_FORCE, + SPELL_BUILD_SIEGE_VEHICLE_FORCE_HORDE, + SPELL_BUILD_SIEGE_VEHICLE_FORCE_ALLIANCE + }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), false); + } - SpellScript* GetSpellScript() const override - { - return new spell_wintergrasp_force_building_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_force_building::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; -class spell_wintergrasp_grab_passenger : public SpellScriptLoader +// 61178 - Grab Passenger +class spell_wintergrasp_grab_passenger : public SpellScript { - public: - spell_wintergrasp_grab_passenger() : SpellScriptLoader("spell_wintergrasp_grab_passenger") { } - - class spell_wintergrasp_grab_passenger_SpellScript : public SpellScript - { - PrepareSpellScript(spell_wintergrasp_grab_passenger_SpellScript); + PrepareSpellScript(spell_wintergrasp_grab_passenger); - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Player* target = GetHitPlayer()) - target->CastSpell(GetCaster(), SPELL_RIDE_WG_VEHICLE, false); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_grab_passenger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* target = GetHitPlayer()) + target->CastSpell(GetCaster(), SPELL_RIDE_WINTERGRASP_VEHICLE, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_wintergrasp_grab_passenger_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_grab_passenger::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; -class achievement_wg_didnt_stand_a_chance : public AchievementCriteriaScript +// 54640 - Teleport (Used also in Strand of the Ancients) +class spell_wintergrasp_defender_teleport : public SpellScript { - public: - achievement_wg_didnt_stand_a_chance() : AchievementCriteriaScript("achievement_wg_didnt_stand_a_chance") { } + PrepareSpellScript(spell_wintergrasp_defender_teleport); - bool OnCheck(Player* source, Unit* target) override + SpellCastResult CheckCast() + { + if (Player* target = GetExplTargetUnit()->ToPlayer()) { - if (!target) - return false; - - if (Player* victim = target->ToPlayer()) + if (target->GetZoneId() == BATTLEFIELD_ZONEID_WINTERGRASP) { - if (!victim->IsMounted()) - return false; - - if (Vehicle* vehicle = source->GetVehicle()) - if (vehicle->GetVehicleInfo()->ID == 244) // Wintergrasp Tower Cannon - return true; - } - - return false; - } -}; - -enum WgTeleport -{ - SPELL_WINTERGRASP_TELEPORT_TRIGGER = 54643, -}; + if (Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefield(target->GetZoneId())) + { + if (wintergrasp->GetControllingTeam() != PVP_TEAM_NEUTRAL && target->GetTeamId() != wintergrasp->GetControllingTeamId()) + return SPELL_FAILED_BAD_TARGETS; -class spell_wintergrasp_defender_teleport : public SpellScriptLoader -{ - public: - spell_wintergrasp_defender_teleport() : SpellScriptLoader("spell_wintergrasp_defender_teleport") { } + if (target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER)) + return SPELL_FAILED_BAD_TARGETS; - class spell_wintergrasp_defender_teleport_SpellScript : public SpellScript - { - PrepareSpellScript(spell_wintergrasp_defender_teleport_SpellScript); + return SPELL_CAST_OK; + } - SpellCastResult CheckCast() - { - if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) - if (Player* target = GetExplTargetUnit()->ToPlayer()) - // check if we are in Wintergrasp at all, SotA uses same teleport spells - if ((target->GetZoneId() == AREA_WINTERGRASP && target->GetTeamId() != wg->GetDefenderTeam()) || target->HasAura(SPELL_WINTERGRASP_TELEPORT_TRIGGER)) - return SPELL_FAILED_BAD_TARGETS; - return SPELL_CAST_OK; + return SPELL_FAILED_DONT_REPORT; } + } - void Register() override - { - OnCheckCast += SpellCheckCastFn(spell_wintergrasp_defender_teleport_SpellScript::CheckCast); - } - }; + return SPELL_CAST_OK; + } - SpellScript* GetSpellScript() const override - { - return new spell_wintergrasp_defender_teleport_SpellScript(); - } + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_wintergrasp_defender_teleport::CheckCast); + } }; -class spell_wintergrasp_defender_teleport_trigger : public SpellScriptLoader +// 54643 - Teleport +class spell_wintergrasp_defender_teleport_trigger : public SpellScript { - public: - spell_wintergrasp_defender_teleport_trigger() : SpellScriptLoader("spell_wintergrasp_defender_teleport_trigger") { } + PrepareSpellScript(spell_wintergrasp_defender_teleport_trigger); - class spell_wintergrasp_defender_teleport_trigger_SpellScript : public SpellScript - { - PrepareSpellScript(spell_wintergrasp_defender_teleport_trigger_SpellScript); - - void HandleDummy(SpellEffIndex /*effindex*/) - { - if (Unit* target = GetHitUnit()) - { - WorldLocation loc = target->GetWorldLocation(); - SetExplTargetDest(loc); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_defender_teleport_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleDummy(SpellEffIndex /*effindex*/) + { + if (Unit* target = GetHitUnit()) { - return new spell_wintergrasp_defender_teleport_trigger_SpellScript(); + WorldLocation destination = target->GetWorldLocation(); + SetExplTargetDest(destination); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_wintergrasp_defender_teleport_trigger::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; // 58549 Tenacity @@ -599,15 +410,66 @@ class spell_wintergrasp_tenacity_refresh : public AuraScript } }; +// 2584 - Waiting to Resurrect +class spell_wintergrasp_waiting_to_resurrect : public AuraScript +{ + PrepareAuraScript(spell_wintergrasp_waiting_to_resurrect); + + bool Load() override + { + Unit* owner = GetUnitOwner(); + return owner && owner->GetTypeId() == TYPEID_PLAYER && owner->GetZoneId() == BATTLEFIELD_ZONEID_WINTERGRASP; + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* owner = GetUnitOwner(); + if (!owner) + return; + + if (Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefield(owner->GetZoneId())) + wintergrasp->HandleRemovePlayerFromResurrectionQueue(owner->ToPlayer()); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_wintergrasp_waiting_to_resurrect::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +class achievement_wg_didnt_stand_a_chance : public AchievementCriteriaScript +{ + public: + achievement_wg_didnt_stand_a_chance() : AchievementCriteriaScript("achievement_wg_didnt_stand_a_chance") { } + + bool OnCheck(Player* source, Unit* target) override + { + if (!target) + return false; + + if (Player* victim = target->ToPlayer()) + { + if (!victim->IsMounted()) + return false; + + if (Vehicle* vehicle = source->GetVehicle()) + if (vehicle->GetVehicleInfo()->m_ID == 244) // Wintergrasp Tower Cannon + return true; + } + + return false; + } +}; + class condition_is_wintergrasp_horde : public ConditionScript { public: condition_is_wintergrasp_horde() : ConditionScript("condition_is_wintergrasp_horde") { } - bool OnConditionCheck(Condition const* /* condition */, ConditionSourceInfo& /* sourceInfo */) + bool OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/) { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp && wintergrasp->IsEnabled() && wintergrasp->GetDefenderTeam() == TEAM_HORDE) + Battlefield* wintergrasp = sBattlefieldMgr->GetEnabledBattlefield(BATTLEFIELD_BATTLEID_WINTERGRASP); + if (wintergrasp && wintergrasp->GetControllingTeam() == PVP_TEAM_HORDE) return true; return false; } @@ -618,10 +480,10 @@ class condition_is_wintergrasp_alliance : public ConditionScript public: condition_is_wintergrasp_alliance() : ConditionScript("condition_is_wintergrasp_alliance") { } - bool OnConditionCheck(Condition const* /* condition */, ConditionSourceInfo& /* sourceInfo */) + bool OnConditionCheck(Condition const* /*condition*/, ConditionSourceInfo& /*sourceInfo*/) { - Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG); - if (wintergrasp && wintergrasp->IsEnabled() && wintergrasp->GetDefenderTeam() == TEAM_ALLIANCE) + Battlefield* wintergrasp = sBattlefieldMgr->GetEnabledBattlefield(BATTLEFIELD_BATTLEID_WINTERGRASP); + if (wintergrasp && wintergrasp->GetControllingTeam() == PVP_TEAM_ALLIANCE) return true; return false; } @@ -629,16 +491,15 @@ class condition_is_wintergrasp_alliance : public ConditionScript void AddSC_wintergrasp() { - new npc_wg_queue(); - new npc_wg_spirit_guide(); - new npc_wg_demolisher_engineer(); - new go_wg_vehicle_teleporter(); - new spell_wintergrasp_force_building(); - new spell_wintergrasp_grab_passenger(); + RegisterCreatureAI(npc_wg_demolisher_engineer); + RegisterGameObjectAI(go_wg_vehicle_teleporter); + RegisterSpellScript(spell_wintergrasp_force_building); + RegisterSpellScript(spell_wintergrasp_grab_passenger); + RegisterSpellScript(spell_wintergrasp_defender_teleport); + RegisterSpellScript(spell_wintergrasp_defender_teleport_trigger); + RegisterAuraScript(spell_wintergrasp_tenacity_refresh); + RegisterAuraScript(spell_wintergrasp_waiting_to_resurrect); new achievement_wg_didnt_stand_a_chance(); - new spell_wintergrasp_defender_teleport(); - new spell_wintergrasp_defender_teleport_trigger(); - RegisterSpellScript(spell_wintergrasp_tenacity_refresh); new condition_is_wintergrasp_horde(); new condition_is_wintergrasp_alliance(); -} +} \ No newline at end of file diff --git a/src/server/shared/DataStores/DBCEnums.h b/src/server/shared/DataStores/DBCEnums.h index 47d2a27f68369..cc9de2de4de59 100644 --- a/src/server/shared/DataStores/DBCEnums.h +++ b/src/server/shared/DataStores/DBCEnums.h @@ -245,35 +245,35 @@ enum AchievementCategory enum AreaFlags { - AREA_FLAG_UNK0 = 0x00000001, // Unknown - AREA_FLAG_UNK1 = 0x00000002, // Razorfen Downs, Naxxramas and Acherus: The Ebon Hold (3.3.5a) - AREA_FLAG_UNK2 = 0x00000004, // Only used for areas on map 571 (development before) - AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // city and city subzones - AREA_FLAG_UNK3 = 0x00000010, // can't find common meaning - AREA_FLAG_SLAVE_CAPITAL2 = 0x00000020, // slave capital city flag? - AREA_FLAG_ALLOW_DUELS = 0x00000040, // allow to duel here - AREA_FLAG_ARENA = 0x00000080, // arena, both instanced and world arenas - AREA_FLAG_CAPITAL = 0x00000100, // main capital city flag - AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?) - AREA_FLAG_OUTLAND = 0x00000400, // expansion zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag) - AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled) - AREA_FLAG_NEED_FLY = 0x00001000, // Respawn alive at the graveyard without corpse - AREA_FLAG_UNUSED1 = 0x00002000, // Unused in 3.3.5a - AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag) - AREA_FLAG_OUTDOOR_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area) - AREA_FLAG_ARENA_INSTANCE = 0x00010000, // used by instanced arenas only - AREA_FLAG_UNUSED2 = 0x00020000, // Unused in 3.3.5a - AREA_FLAG_CONTESTED_AREA = 0x00040000, // On PvP servers these areas are considered contested, even though the zone it is contained in is a Horde/Alliance territory. - AREA_FLAG_UNK4 = 0x00080000, // Valgarde and Acherus: The Ebon Hold - AREA_FLAG_LOWLEVEL = 0x00100000, // used for some starting areas with ExplorationLevel <= 15 - AREA_FLAG_TOWN = 0x00200000, // small towns with Inn - AREA_FLAG_REST_ZONE_HORDE = 0x00400000, // Instead of using areatriggers, the zone will act as one for Horde players (Warsong Hold, Acherus: The Ebon Hold, New Agamand Inn, Vengeance Landing Inn, Sunreaver Pavilion, etc) - AREA_FLAG_REST_ZONE_ALLIANCE = 0x00800000, // Instead of using areatriggers, the zone will act as one for Alliance players (Valgarde, Acherus: The Ebon Hold, Westguard Inn, Silver Covenant Pavilion, etc) - AREA_FLAG_WINTERGRASP = 0x01000000, // Wintergrasp and it's subzones - AREA_FLAG_INSIDE = 0x02000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors - AREA_FLAG_OUTSIDE = 0x04000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors - AREA_FLAG_WINTERGRASP_2 = 0x08000000, // Can Hearth And Resurrect From Area - AREA_FLAG_NO_FLY_ZONE = 0x20000000 // Marks zones where you cannot fly + AREA_FLAG_UNK0 = 0x00000001, // Unknown + AREA_FLAG_UNK1 = 0x00000002, // Razorfen Downs, Naxxramas and Acherus: The Ebon Hold (3.3.5a) + AREA_FLAG_UNK2 = 0x00000004, // Only used for areas on map 571 (development before) + AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // city and city subzones + AREA_FLAG_UNK3 = 0x00000010, // can't find common meaning + AREA_FLAG_SLAVE_CAPITAL2 = 0x00000020, // slave capital city flag? + AREA_FLAG_ALLOW_DUELS = 0x00000040, // allow to duel here + AREA_FLAG_ARENA = 0x00000080, // arena, both instanced and world arenas + AREA_FLAG_CAPITAL = 0x00000100, // main capital city flag + AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?) + AREA_FLAG_OUTLAND = 0x00000400, // expansion zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag) + AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled) + AREA_FLAG_NEED_FLY = 0x00001000, // Respawn alive at the graveyard without corpse + AREA_FLAG_UNUSED1 = 0x00002000, // Unused in 3.3.5a + AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag) + AREA_FLAG_OUTDOOR_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area) + AREA_FLAG_ARENA_INSTANCE = 0x00010000, // used by instanced arenas only + AREA_FLAG_UNUSED2 = 0x00020000, // Unused in 3.3.5a + AREA_FLAG_CONTESTED_AREA = 0x00040000, // On PvP servers these areas are considered contested, even though the zone it is contained in is a Horde/Alliance territory. + AREA_FLAG_UNK4 = 0x00080000, // Valgarde and Acherus: The Ebon Hold + AREA_FLAG_LOWLEVEL = 0x00100000, // used for some starting areas with area_level <= 15 + AREA_FLAG_TOWN = 0x00200000, // small towns with Inn + AREA_FLAG_REST_ZONE_HORDE = 0x00400000, // Instead of using areatriggers, the zone will act as one for Horde players (Warsong Hold, Acherus: The Ebon Hold, New Agamand Inn, Vengeance Landing Inn, Sunreaver Pavilion, etc) + AREA_FLAG_REST_ZONE_ALLIANCE = 0x00800000, // Instead of using areatriggers, the zone will act as one for Alliance players (Valgarde, Acherus: The Ebon Hold, Westguard Inn, Silver Covenant Pavilion, etc) + AREA_FLAG_WINTERGRASP = 0x01000000, // Wintergrasp and it's subzones + AREA_FLAG_INSIDE = 0x02000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors + AREA_FLAG_OUTSIDE = 0x04000000, // used for determinating spell related inside/outside questions in Map::IsOutdoors + AREA_FLAG_CAN_HEARTH_AND_RESURRECT = 0x08000000, // Can Hearth And Resurrect From Area + AREA_FLAG_NO_FLY_ZONE = 0x20000000 // Marks zones where you cannot fly }; enum Difficulty : uint8 diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 0cdc479238d45..901e65f988f66 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -3471,12 +3471,24 @@ enum ComplaintStatus : uint8 enum PvPTeamId { - PVP_TEAM_HORDE = 0, // Battleground: Horde, Arena: Green - PVP_TEAM_ALLIANCE = 1, // Battleground: Alliance, Arena: Gold - PVP_TEAM_NEUTRAL = 2 // Battleground: Neutral, Arena: None + PVP_TEAM_HORDE = 0, // Battleground/Battlefield: Horde, Arena: Green + PVP_TEAM_ALLIANCE = 1, // Battleground/Battlefield: Alliance, Arena: Gold + PVP_TEAM_NEUTRAL = 2 // Battleground/Battlefield: Neutral, Arena: None }; -uint8 constexpr PVP_TEAMS_COUNT = 2; +static uint8 constexpr PVP_TEAMS_COUNT = 2; + +constexpr TeamId TeamIdByPvPTeamId(PvPTeamId value) +{ + switch (value) + { + case PVP_TEAM_HORDE: return TEAM_HORDE; + case PVP_TEAM_ALLIANCE: return TEAM_ALLIANCE; + case PVP_TEAM_NEUTRAL: return TEAM_NEUTRAL; + default: break; + } + return TEAM_NEUTRAL; +} // indexes of BattlemasterList.dbc enum BattlegroundTypeId : uint32 @@ -3497,7 +3509,7 @@ enum BattlegroundTypeId : uint32 BATTLEGROUND_RB = 32 // Random Battleground }; -#define MAX_BATTLEGROUND_TYPE_ID 33 +static uint32 constexpr MAX_BATTLEGROUND_TYPE_ID = 33; enum BattlefieldBattleId : uint8 { @@ -3505,6 +3517,11 @@ enum BattlefieldBattleId : uint8 BATTLEFIELD_BATTLEID_MAX = 2 }; +enum BattlefieldZoneId : uint32 +{ + BATTLEFIELD_ZONEID_WINTERGRASP = 4197 // Wintergrasp battle +}; + enum MailResponseType { MAIL_SEND = 0, diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp index 7fb3854b9963a..b5c498a37473d 100644 --- a/src/server/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/worldserver/CommandLine/CliRunnable.cpp @@ -37,7 +37,7 @@ #include #endif -static constexpr char CLI_PREFIX[] = "TC> "; +static constexpr char CLI_PREFIX[] = "Warhead> "; static inline void PrintCliPrefix() { diff --git a/src/server/worldserver/RemoteAccess/RASession.cpp b/src/server/worldserver/RemoteAccess/RASession.cpp index d026184d6cd6f..18d30bd639015 100644 --- a/src/server/worldserver/RemoteAccess/RASession.cpp +++ b/src/server/worldserver/RemoteAccess/RASession.cpp @@ -79,7 +79,7 @@ void RASession::Start() // Read commands for (;;) { - Send("TC>"); + Send("Warhead>"); std::string command = ReadString(); if (ProcessCommand(command)) From cf0bcd98422150e152309767ed928f9790e87e2a Mon Sep 17 00:00:00 2001 From: Viste Date: Wed, 13 Jan 2021 08:04:43 +0300 Subject: [PATCH 2/2] Core/WG: upd --- src/server/game/Handlers/MiscHandler.cpp | 2 +- src/server/scripts/Spells/spell_generic.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 472faaac4a8a6..43600111681c4 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1461,7 +1461,7 @@ void WorldSession::HandleHearthAndResurrect(WorldPacket& /*recvData*/) } AreaTableEntry const* atEntry = sAreaTableStore.LookupEntry(_player->GetAreaId()); - if (!atEntry || !(atEntry->Flags & AREA_FLAG_WINTERGRASP_2)) + if (!atEntry || !(atEntry->Flags & AREA_FLAG_CAN_HEARTH_AND_RESURRECT)) return; _player->BuildPlayerRepop(); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index f35f0b8d03762..046ada1d5bea1 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -23,6 +23,8 @@ */ #include "ScriptMgr.h" +#include "Battlefield.h" +#include "BattlefieldMgr.h" #include "Battleground.h" #include "CellImpl.h" #include "DBCStores.h" @@ -2088,7 +2090,12 @@ class spell_gen_mount : public SpellScript SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(_mount150); uint32 zoneid, areaid; target->GetZoneAndAreaId(zoneid, areaid); - bool const canFly = spellInfo && (spellInfo->CheckLocation(target->GetMapId(), zoneid, areaid, target) == SPELL_CAST_OK); + bool canFly = spellInfo && (spellInfo->CheckLocation(target->GetMapId(), zoneid, areaid, target) == SPELL_CAST_OK); + + // Check Battlefield flying mount status + Battlefield* battlefield = sBattlefieldMgr->GetBattlefield(target->GetZoneId()); + if (canFly && battlefield && !battlefield->IsFlyingMountAllowed()) + canFly = false; uint32 mount = 0; switch (target->GetBaseSkillValue(SKILL_RIDING))