aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bindings/scripts/scripts/world/go_scripts.cpp13
-rw-r--r--src/game/ObjectMgr.cpp34
-rw-r--r--src/game/ObjectMgr.h1
-rw-r--r--src/game/Wintergrasp.cpp158
-rw-r--r--src/game/Wintergrasp.h13
5 files changed, 180 insertions, 39 deletions
diff --git a/src/bindings/scripts/scripts/world/go_scripts.cpp b/src/bindings/scripts/scripts/world/go_scripts.cpp
index 012ea4d911d..d750a3677d1 100644
--- a/src/bindings/scripts/scripts/world/go_scripts.cpp
+++ b/src/bindings/scripts/scripts/world/go_scripts.cpp
@@ -471,14 +471,6 @@ bool GOHello_go_bashir_crystalforge(Player* pPlayer, GameObject* pGO)
return false;
}
-bool GOHello_go_wg2voa_portal(Player* pPlayer, GameObject* pGO)
-{
- // teleport player inside VoA if faction controls WG, core has already set faction for this GO
- pPlayer->TeleportTo(571,5405.61,2854.35,418.90,2.4636);
- pPlayer->SetPvP(false);
- return false;
-}
-
/*######
## matrix_punchograph
######*/
@@ -685,11 +677,6 @@ void AddSC_go_scripts()
newscript->RegisterSelf();
newscript = new Script;
- newscript->Name = "go_wg2voa_portal";
- newscript->pGOHello = &GOHello_go_wg2voa_portal;
- newscript->RegisterSelf();
-
- newscript = new Script;
newscript->Name = "go_matrix_punchograph";
newscript->pGOHello = &GOHello_go_matrix_punchograph;
newscript->RegisterSelf();
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 0cb124e4a8b..f63074f044b 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -1464,6 +1464,40 @@ uint32 ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, float y, float
return guid;
}
+bool ObjectMgr::MoveCreData(uint32 guid, uint32 mapId, Position pos)
+{
+ CreatureData& data = NewOrExistCreatureData(guid);
+ if (!data.id)
+ return false;
+
+ RemoveCreatureFromGrid(guid, &data);
+ if (data.posX == pos.GetPositionX() && data.posY == pos.GetPositionY() && data.posZ == pos.GetPositionZ())
+ return true;
+ data.posX = pos.GetPositionX();
+ data.posY = pos.GetPositionY();
+ data.posZ = pos.GetPositionZ();
+ data.orientation = pos.GetOrientation();
+ AddCreatureToGrid(guid, &data);
+
+ // Spawn if necessary (loaded grids only)
+ if(Map* map = const_cast<Map*>(MapManager::Instance().CreateBaseMap(mapId)))
+ {
+ // We use spawn coords to spawn
+ if(!map->Instanceable() && map->IsLoaded(data.posX, data.posY))
+ {
+ Creature *creature = new Creature;
+ if(!creature->LoadFromDB(guid, map))
+ {
+ sLog.outError("AddCreature: cannot add creature entry %u to map", guid);
+ delete creature;
+ return false;
+ }
+ map->Add(creature);
+ }
+ }
+ return true;
+}
+
uint32 ObjectMgr::AddCreData(uint32 entry, uint32 team, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay)
{
CreatureInfo const *cInfo = GetCreatureTemplate(entry);
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 6f6ca30cdeb..0ca6a5f2422 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -758,6 +758,7 @@ class ObjectMgr
void RemoveGameobjectFromGrid(uint32 guid, GameObjectData const* data);
uint32 AddGOData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0, float rotation0 = 0, float rotation1 = 0, float rotation2 = 0, float rotation3 = 0);
uint32 AddCreData(uint32 entry, uint32 team, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0);
+ bool MoveCreData(uint32 guid, uint32 map, Position pos);
// reserved names
void LoadReservedPlayersNames();
diff --git a/src/game/Wintergrasp.cpp b/src/game/Wintergrasp.cpp
index ce366c53cda..359d58d4a92 100644
--- a/src/game/Wintergrasp.cpp
+++ b/src/game/Wintergrasp.cpp
@@ -22,6 +22,7 @@
#include "ObjectMgr.h"
#include "World.h"
#include "Chat.h"
+#include "MapManager.h"
typedef uint32 TeamPair[2];
@@ -45,14 +46,7 @@ const TeamPair CreatureEntryPair[] =
{
{32307, 32308}, // Guards
{30739, 30740}, // Champions
- {31101, 31051}, // Hoodoo Master & Sorceress
- {31102, 31052}, // Vieron Blazefeather & Bowyer
{32296, 32294}, // Quartermaster
- {31107, 31109}, // Lieutenant & Senior Demolitionist
- {31151, 31153}, // Tactical Officer
- {31106, 31108}, // Siegesmith & Siege Master
- {31053, 31054}, // Primalist & Anchorite
- {31091, 31036}, // Commander
{32615, 32626}, // Warbringer & Brigadier General
{0,0} // Do not delete Used in LoadTeamPair
};
@@ -74,12 +68,12 @@ void LoadTeamPair(TeamPairMap &pairMap, const TeamPair *pair)
}
}
-void RespawnCreatureIfNeeded(Creature *cr, uint32 guid)
+void RespawnCreatureIfNeeded(Creature *cr, uint32 entry)
{
if (cr)
{
- cr->SetOriginalEntry(guid);
- if (guid != cr->GetEntry() || !cr->isAlive())
+ cr->SetOriginalEntry(entry);
+ if (entry != cr->GetEntry() || !cr->isAlive())
cr->Respawn(true);
cr->SetVisibility(VISIBILITY_ON);
}
@@ -119,17 +113,18 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
std::list<uint32> engGuids;
std::list<uint32> spiritGuids;
- // Store Eng and spirit guide guids for later use
- QueryResult *result = WorldDatabase.PQuery("SELECT guid, id FROM creature"
- " WHERE creature.map=571 AND creature.id IN (%u, %u, %u, %u);",
- CRE_ENG_A, CRE_ENG_H, CRE_SPI_A, CRE_SPI_H);
-
+ // Store Eng, spirit guide guids and questgiver for later use
+ QueryResult *result = WorldDatabase.PQuery("SELECT guid, id FROM creature WHERE creature.map=571"
+ " AND creature.id IN (%u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u);",
+ CRE_ENG_A, CRE_ENG_H, CRE_SPI_A, CRE_SPI_H, 31101, 31051, 31102, 31052,
+ 31107, 31109, 31151, 31153, 31106, 31108, 31053, 31054, 31091, 31036);
if (!result)
sLog.outError("Cannot find siege workshop master or spirit guides in creature!");
else
{
do
{
+ Position posHorde, posAlli;
Field *fields = result->Fetch();
switch(fields[1].GetUInt32())
{
@@ -141,6 +136,78 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
case CRE_SPI_H:
spiritGuids.push_back(fields[0].GetUInt32());
break;
+ case 31051:
+ posHorde.Relocate(5081.7, 2173.73, 365.878, 0.855211);
+ posAlli.Relocate(5296.56, 2789.87, 409.275, 0.733038);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31101:
+ posHorde.Relocate(5296.56, 2789.87, 409.275, 0.733038);
+ posAlli.Relocate(5016.57, 3677.53, 362.982, 5.7525);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31052:
+ posHorde.Relocate(5100.07, 2168.89, 365.779, 1.97222);
+ posAlli.Relocate(5298.43, 2738.76, 409.316, 3.97174);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31102:
+ posHorde.Relocate(5298.43, 2738.76, 409.316, 3.97174);
+ posAlli.Relocate(5030.44, 3659.82, 363.194, 1.83336);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31109:
+ posHorde.Relocate(5080.4, 2199, 359.489, 2.96706);
+ posAlli.Relocate(5234.97, 2883.4, 409.275, 4.29351);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31107:
+ posHorde.Relocate(5234.97, 2883.4, 409.275, 4.29351);
+ posAlli.Relocate(5008.64, 3659.91, 361.07, 4.0796);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31153:
+ posHorde.Relocate(5088.49, 2188.18, 365.647, 5.25344);
+ posAlli.Relocate(5366.13, 2833.4, 409.323, 3.14159);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31151:
+ posHorde.Relocate(5366.13, 2833.4, 409.323, 3.14159);
+ posAlli.Relocate(5032.33, 3680.7, 363.018, 3.43167);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31108:
+ posHorde.Relocate(5095.67, 2193.28, 365.924, 4.93928);
+ posAlli.Relocate(5295.56, 2926.67, 409.275, 0.872665);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31106:
+ posHorde.Relocate(5295.56, 2926.67, 409.275, 0.872665);
+ posAlli.Relocate(5032.66, 3674.28, 363.053, 2.9447);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31054:
+ posHorde.Relocate(5088.61, 2167.66, 365.689, 0.680678);
+ posAlli.Relocate(5371.4, 3026.51, 409.206, 3.25003);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31053:
+ posHorde.Relocate(5371.4, 3026.51, 409.206, 3.25003);
+ posAlli.Relocate(5032.44, 3668.66, 363.11, 2.87402);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31036:
+ posHorde.Relocate(5078.28, 2183.7, 365.029, 1.46608);
+ posAlli.Relocate(5359.13, 2837.99, 409.364, 4.69893);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ case 31091:
+ posHorde.Relocate(5359.13, 2837.99, 409.364, 4.69893);
+ posAlli.Relocate(5022.43, 3659.91, 361.61, 1.35426);
+ LoadQuestGiverMap(fields[0].GetUInt32(), posHorde, posAlli);
+ break;
+ default:
+ break;
}
}while(result->NextRow());
delete result;
@@ -388,7 +455,6 @@ bool OPvPWintergrasp::SetupOutdoorPvP()
m_customHonorReward[DAMAGED_BUILDING] = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_DAMAGED_BUILDING);
m_customHonorReward[INTACT_BUILDING] = sWorld.getConfig(CONFIG_OUTDOORPVP_WINTERGRASP_INTACT_BUILDING);
}
-
RemoveOfflinePlayerWGAuras();
RegisterZone(ZONE_WINTERGRASP);
@@ -603,6 +669,7 @@ WintergraspCreType OPvPWintergrasp::GetCreatureType(uint32 entry) const
case 31106:case 31108: // Siegesmith & Siege Master
case 31053:case 31054: // Primalist & Anchorite
case 31091:case 31036: // Commander
+ return CREATURE_QUESTGIVER;
case 32615:case 32626: // Warbringer && Brigadier General
case 32296:case 32294: // Quartermaster
case 30870:case 30869: // Flight Masters
@@ -668,6 +735,9 @@ void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add)
SendUpdateWorldState(VehNumWorldState[team], m_vehicles[team].size());
break;
}
+ case CREATURE_QUESTGIVER:
+ m_questgivers[creature->GetDBTableGUIDLow()] = creature;
+ break;
case CREATURE_ENGINEER:
for (OutdoorPvP::OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr)
{
@@ -693,10 +763,13 @@ void OPvPWintergrasp::OnCreatureCreate(Creature *creature, bool add)
case CREATURE_SPIRIT_HEALER:
case CREATURE_TURRET:
case CREATURE_OTHER:
- UpdateCreatureInfo(creature);
+ if (add)
+ UpdateCreatureInfo(creature);
default:
- if (add) m_creatures.insert(creature);
- else m_creatures.erase(creature);
+ if (add)
+ m_creatures.insert(creature);
+ else
+ m_creatures.erase(creature);
break;
}
}
@@ -740,6 +813,8 @@ void OPvPWintergrasp::UpdateAllWorldObject()
UpdateGameObjectInfo(*itr);
for (CreatureSet::iterator itr = m_creatures.begin(); itr != m_creatures.end(); ++itr)
UpdateCreatureInfo(*itr);
+ for (QuestGiverMap::iterator itr = m_questgivers.begin(); itr != m_questgivers.end(); ++itr)
+ UpdateQuestGiverPosition((*itr).first, (*itr).second);
// rebuild and update building states
RebuildAllBuildings();
@@ -817,7 +892,7 @@ void OPvPWintergrasp::BroadcastStateChange(BuildingState *state) const
}
// Called at Start and Battle End
-bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature) const
+bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature)
{
if (!creature)
return false;
@@ -834,8 +909,7 @@ bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature) const
}
else
{
- if (creature->IsVehicle())
- creature->GetVehicleKit()->RemoveAllPassengers();
+ creature->GetVehicleKit()->RemoveAllPassengers();
creature->SetVisibility(VISIBILITY_OFF);
creature->setFaction(35);
}
@@ -888,6 +962,37 @@ bool OPvPWintergrasp::UpdateCreatureInfo(Creature *creature) const
}
}
+bool OPvPWintergrasp::UpdateQuestGiverPosition(uint32 guid, Creature *creature)
+{
+ Position pos = m_qgPosMap[std::pair<uint32, bool>(guid, getDefenderTeam() == TEAM_HORDE)];
+ if (!pos.GetPositionX())
+ return false;
+
+ if (creature)
+ {
+ // if not questgiver or position is the same, do nothing
+ if (creature->GetPositionX() == pos.GetPositionX() &&
+ creature->GetPositionY() == pos.GetPositionY() &&
+ creature->GetPositionZ() == pos.GetPositionZ())
+ return false;
+
+ creature->CombatStop(true);
+ creature->getHostilRefManager().deleteReferences();
+ creature->SetHomePosition(pos);
+ creature->DestroyForNearbyPlayers();
+ if (!creature->GetMap()->IsLoaded(pos.GetPositionX(), pos.GetPositionY()))
+ creature->GetMap()->LoadGrid(pos.GetPositionX(), pos.GetPositionY());
+ creature->GetMap()->CreatureRelocation(creature, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation());
+ if (!creature->isAlive())
+ creature->Respawn(true);
+ }
+ else
+ {
+ objmgr.MoveCreData(guid, 571, pos);
+ }
+ return true;
+}
+
// Return false = Need to rebuild at battle End/Start
// true = no need to rebuild (ie: Banners or teleporters)
bool OPvPWintergrasp::UpdateGameObjectInfo(GameObject *go) const
@@ -1606,6 +1711,15 @@ void OPvPWintergrasp::RewardMarkOfHonor(Player *plr, uint32 count)
plr->SendNewItem(item, count, true, false);
}
+void OPvPWintergrasp::LoadQuestGiverMap(uint32 guid, Position posHorde, Position posAlli)
+{
+ m_qgPosMap[std::pair<uint32, bool>(guid, true)] = posHorde,
+ m_qgPosMap[std::pair<uint32, bool>(guid, false)] = posAlli,
+ m_questgivers[guid] = NULL;
+ if (getDefenderTeam() == TEAM_ALLIANCE)
+ objmgr.MoveCreData(guid, 571, posAlli);
+}
+
SiegeWorkshop *OPvPWintergrasp::GetWorkshop(uint32 lowguid) const
{
if (OPvPCapturePoint *cp = GetCapturePoint(lowguid))
diff --git a/src/game/Wintergrasp.h b/src/game/Wintergrasp.h
index e15859f7c32..73739a44695 100644
--- a/src/game/Wintergrasp.h
+++ b/src/game/Wintergrasp.h
@@ -113,6 +113,7 @@ enum WintergraspCreType
CREATURE_SPECIAL,
CREATURE_SPIRIT_GUIDE,
CREATURE_SPIRIT_HEALER,
+ CREATURE_QUESTGIVER,
};
enum BuildingType
@@ -179,6 +180,8 @@ class OPvPWintergrasp : public OutdoorPvP
typedef std::map<uint32, BuildingState *> BuildingStateMap;
typedef std::set<Creature*> CreatureSet;
typedef std::set<GameObject*> GameObjectSet;
+ typedef std::map<std::pair<uint32, bool>, Position> QuestGiverPositionMap;
+ typedef std::map<uint32, Creature*> QuestGiverMap;
public:
OPvPWintergrasp();
bool SetupOutdoorPvP();
@@ -242,8 +245,10 @@ class OPvPWintergrasp : public OutdoorPvP
CreatureSet m_creatures;
CreatureSet m_vehicles[2];
GameObjectSet m_gobjects;
+ QuestGiverMap m_questgivers;
TeamPairMap m_creEntryPair, m_goDisplayPair;
+ QuestGiverPositionMap m_qgPosMap;
bool m_wartime;
bool m_changeDefender;
@@ -268,7 +273,7 @@ class OPvPWintergrasp : public OutdoorPvP
void UpdateTenacityStack();
void CastTenacity(Unit *utr, int32 newStack);
void UpdateAllWorldObject();
- bool UpdateCreatureInfo(Creature *creature) const;
+ bool UpdateCreatureInfo(Creature *creature);
bool UpdateGameObjectInfo(GameObject *go) const;
bool CanBuildVehicle(SiegeWorkshop *workshop) const;
@@ -276,12 +281,12 @@ class OPvPWintergrasp : public OutdoorPvP
void RebuildAllBuildings();
- void LieutenantCastSpell(TeamId team, int32 spellId) const;
- void VehicleCastSpell(TeamId team, int32 spellId) const;
-
void SendInitWorldStatesTo(Player *player = NULL) const;
void RemoveOfflinePlayerWGAuras();
void RewardMarkOfHonor(Player *player, uint32 count);
+ void MoveQuestGiver(uint32 guid);
+ void LoadQuestGiverMap(uint32 guid, Position posHorde, Position posAlli);
+ bool UpdateQuestGiverPosition(uint32 guid, Creature *creature);
};
class SiegeWorkshop : public OPvPCapturePoint