aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlinencloth <none@none>2010-10-24 02:55:50 +0200
committerlinencloth <none@none>2010-10-24 02:55:50 +0200
commit07fa1bcbdfe65def200c640a6f3e52b755c3b603 (patch)
treef2bd8f5b7caadae27b97c97375da1a78c30b4194 /src
parent153352aac073b1bd4c1b6fb6515b3de6fa4ae1f4 (diff)
Core/Creature: Implement FarTeleportTo (teleport to an other map)
Core/Transport: Cleanup and optimize transport and passenger handling - Only transports will be active objects - Reduced cpu and memory usage - Using FarTeleportTo for creature passengers at transport teleportation - Creatures won't be recreated on teleport --HG-- branch : trunk
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Chat/Commands/Level2.cpp14
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.cpp17
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.h2
-rwxr-xr-xsrc/server/game/Entities/Transport/Transport.cpp114
-rwxr-xr-xsrc/server/game/Entities/Transport/Transport.h17
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp4
-rwxr-xr-xsrc/server/game/Maps/MapManager.cpp3
-rwxr-xr-xsrc/server/game/Maps/MapManager.h5
-rwxr-xr-xsrc/server/game/World/World.cpp6
9 files changed, 73 insertions, 109 deletions
diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp
index 8bb73d2c4dd..2e52a9e5c96 100755
--- a/src/server/game/Chat/Commands/Level2.cpp
+++ b/src/server/game/Chat/Commands/Level2.cpp
@@ -965,22 +965,8 @@ bool ChatHandler::HandleNpcAddCommand(const char* args)
{
uint32 tguid = chr->GetTransport()->AddNPCPassenger(0, id, chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
if (tguid > 0)
- {
WorldDatabase.PQuery("INSERT INTO creature_transport (guid, npc_entry, transport_entry, TransOffsetX, TransOffsetY, TransOffsetZ, TransOffsetO) values (%u, %u, %f, %f, %f, %f, %u)", tguid, id, chr->GetTransport()->GetEntry(), chr->GetTransOffsetX(), chr->GetTransOffsetY(), chr->GetTransOffsetZ(), chr->GetTransOffsetO());
- TransportCreatureProto *transportCreatureProto = new TransportCreatureProto;
- transportCreatureProto->guid = tguid;
- transportCreatureProto->npc_entry = id;
- uint32 transportEntry = chr->GetTransport()->GetEntry();
- transportCreatureProto->TransOffsetX = chr->GetTransOffsetX();
- transportCreatureProto->TransOffsetY = chr->GetTransOffsetY();
- transportCreatureProto->TransOffsetZ = chr->GetTransOffsetZ();
- transportCreatureProto->TransOffsetO = chr->GetTransOffsetO();
- transportCreatureProto->emote = 0;
-
- sMapMgr.m_TransportNPCMap[transportEntry].insert(transportCreatureProto);
- sMapMgr.m_TransportNPCs.insert(transportCreatureProto);
- }
return true;
}
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 26f0a03f60c..16a84e533ad 100755
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -2454,3 +2454,20 @@ time_t Creature::GetLinkedCreatureRespawnTime() const
return 0;
}
+
+void Creature::FarTeleportTo(Map* map, float X, float Y, float Z, float O)
+{
+ InterruptNonMeleeSpells(true);
+ CombatStop();
+ ClearComboPointHolders();
+ DeleteThreatList();
+ GetMotionMaster()->Clear(false);
+ DestroyForNearbyPlayers();
+
+ RemoveFromWorld();
+ ResetMap();
+ SetMap(map);
+ AddToWorld();
+
+ SetPosition(X, Y, Z, O, true);
+}
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 6e9dfd177d8..5700c161e90 100755
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -674,6 +674,8 @@ class Creature : public Unit, public GridObject<Creature>
void SetGUIDTransport(uint32 guid) { guid_transport=guid; }
uint32 GetGUIDTransport() { return guid_transport; }
+
+ void FarTeleportTo(Map* map, float X, float Y, float Z, float O);
protected:
bool CreateFromProto(uint32 guidlow, uint32 Entry, uint32 vehId, uint32 team, const CreatureData *data = NULL);
bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL);
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 7c06cfcd2b0..fdeba5ef755 100755
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -108,12 +108,6 @@ void MapManager::LoadTransports()
t->SetMap(sMapMgr.CreateMap(mapid, t, 0));
t->AddToWorld();
- for (TransportNPCSet::const_iterator i = m_TransportNPCMap[entry].begin(); i != m_TransportNPCMap[entry].end(); ++i)
- {
- TransportCreatureProto *proto = (*i);
- t->AddNPCPassenger(proto->guid, proto->npc_entry, proto->TransOffsetX, proto->TransOffsetY, proto->TransOffsetZ, proto->TransOffsetO, proto->emote);
- }
-
++count;
}
while (result->NextRow());
@@ -161,18 +155,23 @@ void MapManager::LoadTransportNPCs()
{
bar.step();
Field *fields = result->Fetch();
- TransportCreatureProto *transportCreatureProto = new TransportCreatureProto;
- transportCreatureProto->guid = fields[0].GetUInt32();
- transportCreatureProto->npc_entry = fields[1].GetUInt32();
+ uint32 guid = fields[0].GetUInt32();
+ uint32 entry = fields[1].GetUInt32();
uint32 transportEntry = fields[2].GetUInt32();
- transportCreatureProto->TransOffsetX = fields[3].GetFloat();
- transportCreatureProto->TransOffsetY = fields[4].GetFloat();
- transportCreatureProto->TransOffsetZ = fields[5].GetFloat();
- transportCreatureProto->TransOffsetO = fields[6].GetFloat();
- transportCreatureProto->emote = fields[7].GetUInt32();
+ float tX = fields[3].GetFloat();
+ float tY = fields[4].GetFloat();
+ float tZ = fields[5].GetFloat();
+ float tO = fields[6].GetFloat();
+ uint32 anim = fields[7].GetUInt32();
- m_TransportNPCs.insert(transportCreatureProto);
- m_TransportNPCMap[transportEntry].insert(transportCreatureProto);
+ for (MapManager::TransportSet::iterator itr = m_Transports.begin(); itr != m_Transports.end(); ++itr)
+ {
+ if ((*itr)->GetEntry() == transportEntry)
+ {
+ (*itr)->AddNPCPassenger(guid, entry, tX, tY, tZ, tO, anim);
+ break;
+ }
+ }
count++;
} while (result->NextRow());
@@ -187,14 +186,9 @@ Transport::Transport(uint32 period, uint32 script) : GameObject(), m_period(peri
Transport::~Transport()
{
- std::set<uint64>::iterator it2;
- for (std::set<uint64>::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();)
- {
- it2 = itr;
- ++itr;
- if (Creature *npc = Creature::GetCreature(*this, *it2))
- npc->AddObjectToRemoveList();
- }
+ for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();)
+ (*(itr++))->ForcedDespawn();
+
m_NPCPassengerSet.clear();
m_WayPoints.clear();
@@ -242,6 +236,8 @@ bool Transport::Create(uint32 guidlow, uint32 entry, uint32 mapid, float x, floa
if (dynflags)
SetUInt32Value(GAMEOBJECT_DYNAMIC, MAKE_PAIR32(0, dynflags));
+ setActive(true);
+
SetName(goinfo->name);
SetZoneScript();
@@ -513,18 +509,6 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
//we need to create and save new Map object with 'newMapid' because if not done -> lead to invalid Map object reference...
//player far teleport would try to create same instance, but we need it NOW for transport...
- // Clear all NPCs on the transport
- for (std::set<uint64>::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();)
- {
- std::set<uint64>::iterator it2 = itr;
- ++itr;
-
- uint64 guid = (*it2);
- if (Creature *npc = Creature::GetCreature(*this, guid))
- npc->AddObjectToRemoveList();
- }
- m_NPCPassengerSet.clear();
-
RemoveFromWorld();
ResetMap();
Map * newMap = sMapMgr.CreateMap(newMapid, this, 0);
@@ -532,17 +516,18 @@ void Transport::TeleportTransport(uint32 newMapid, float x, float y, float z)
ASSERT (GetMap());
AddToWorld();
+ setActive(true);
+
if (oldMap != newMap)
{
UpdateForMap(oldMap);
UpdateForMap(newMap);
}
- for (std::set<TransportCreatureProto *>::const_iterator i = sMapMgr.m_TransportNPCMap[GetEntry()].begin(); i != sMapMgr.m_TransportNPCMap[GetEntry()].end(); ++i)
- {
- TransportCreatureProto *proto = (*i);
- AddNPCPassenger(proto->guid, proto->npc_entry, proto->TransOffsetX, proto->TransOffsetY, proto->TransOffsetZ, proto->TransOffsetO, proto->emote);
- }
+ for (CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end(); ++itr)
+ (*itr)->FarTeleportTo(newMap, x, y, z, (*itr)->GetOrientation());
+
+ UpdateNPCPositions();
}
bool Transport::AddPassenger(Player* passenger)
@@ -665,7 +650,7 @@ uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y,
Map* map = GetMap();
Creature* pCreature = new Creature;
- if (!pCreature->Create(sObjectMgr.GenerateLowGuid(HIGHGUID_UNIT), GetMap(), GetPhaseMask(), entry, 0, GetGOInfo()->faction, 0, 0, 0, 0))
+ if (!pCreature->Create(sObjectMgr.GenerateLowGuid(HIGHGUID_UNIT), map, GetPhaseMask(), entry, 0, GetGOInfo()->faction, 0, 0, 0, 0))
{
delete pCreature;
return 0;
@@ -675,7 +660,6 @@ uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y,
pCreature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
pCreature->m_movementInfo.guid = GetGUID();
pCreature->m_movementInfo.t_pos.Relocate(x, y, z, o);
- pCreature->setActive(true);
if (anim)
pCreature->SetUInt32Value(UNIT_NPC_EMOTESTATE, anim);
@@ -686,6 +670,8 @@ uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y,
z + GetPositionZ() ,
o + GetOrientation());
+ pCreature->SetHomePosition(pCreature->GetPositionX(), pCreature->GetPositionY(), pCreature->GetPositionZ(), pCreature->GetOrientation());
+
if(!pCreature->IsPositionValid())
{
sLog.outError("Creature (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",pCreature->GetGUIDLow(),pCreature->GetEntry(),pCreature->GetPositionX(),pCreature->GetPositionY());
@@ -693,13 +679,12 @@ uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y,
return 0;
}
- pCreature->AIM_Initialize();
-
map->Add(pCreature);
- m_NPCPassengerSet.insert(pCreature->GetGUID());
+ m_NPCPassengerSet.insert(pCreature);
+
if (tguid == 0)
{
- currenttguid++;
+ ++currenttguid;
tguid = currenttguid;
}
else
@@ -723,30 +708,17 @@ void Transport::UpdatePosition(MovementInfo* mi)
void Transport::UpdateNPCPositions()
{
- if (m_NPCPassengerSet.size() > 0)
+ // We update the positions of all NPCs
+ for(CreatureSet::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();)
{
- // We update the positions of all NPCs
- for(std::set<uint64>::iterator itr = m_NPCPassengerSet.begin(); itr != m_NPCPassengerSet.end();)
- {
- std::set<uint64>::iterator it2 = itr;
- ++itr;
-
- uint64 guid = (*it2);
- if (Creature* npc = Creature::GetCreature(*this, guid))
- {
- float x, y, z, o;
- o = GetOrientation() + npc->m_movementInfo.t_pos.m_orientation;
- x = GetPositionX() + (npc->m_movementInfo.t_pos.m_positionX * cos(GetOrientation()) + npc->m_movementInfo.t_pos.m_positionY * sin(GetOrientation() + M_PI));
- y = GetPositionY() + (npc->m_movementInfo.t_pos.m_positionY * cos(GetOrientation()) + npc->m_movementInfo.t_pos.m_positionX * sin(GetOrientation()));
- z = GetPositionZ() + npc->m_movementInfo.t_pos.m_positionZ;
- npc->SetPosition(x, y, z,o);
- npc->SetHomePosition(x,y,z,o);
- }
- else
- {
- m_NPCPassengerSet.erase(guid);
- continue;
- }
- }
+ Creature* npc = *(itr++);
+
+ float x, y, z, o;
+ o = GetOrientation() + npc->m_movementInfo.t_pos.m_orientation;
+ x = GetPositionX() + (npc->m_movementInfo.t_pos.m_positionX * cos(GetOrientation()) + npc->m_movementInfo.t_pos.m_positionY * sin(GetOrientation() + M_PI));
+ y = GetPositionY() + (npc->m_movementInfo.t_pos.m_positionY * cos(GetOrientation()) + npc->m_movementInfo.t_pos.m_positionX * sin(GetOrientation()));
+ z = GetPositionZ() + npc->m_movementInfo.t_pos.m_positionZ;
+ npc->SetHomePosition(x, y, z, o);
+ GetMap()->CreatureRelocation(npc, x, y, z, o);
}
}
diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h
index bc6cf5be361..b8dfb1fc2b2 100755
--- a/src/server/game/Entities/Transport/Transport.h
+++ b/src/server/game/Entities/Transport/Transport.h
@@ -25,18 +25,6 @@
#include <set>
#include <string>
-struct TransportCreatureProto
-{
- uint32 guid;
- uint32 transport_entry;
- uint32 npc_entry;
- float TransOffsetX;
- float TransOffsetY;
- float TransOffsetZ;
- float TransOffsetO;
- uint32 emote;
-};
-
class Transport : public GameObject
{
public:
@@ -49,10 +37,13 @@ class Transport : public GameObject
bool AddPassenger(Player* passenger);
bool RemovePassenger(Player* passenger);
+ void RemovePassenger(Creature* passenger) { m_NPCPassengerSet.erase(passenger); }
+
typedef std::set<Player*> PlayerSet;
PlayerSet const& GetPassengers() const { return m_passengers; }
- mutable std::set<uint64> m_NPCPassengerSet;
+ typedef std::set<Creature*> CreatureSet;
+ CreatureSet m_NPCPassengerSet;
uint32 AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim=0);
void UpdatePosition(MovementInfo *mi);
void UpdateNPCPositions();
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 5981c8ea9af..d04efc0b408 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13564,6 +13564,10 @@ void Unit::CleanupsBeforeDelete(bool finalCleanup)
DeleteThreatList();
getHostileRefManager().setOnlineOfflineState(false);
GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
+
+ if (Creature* thisCreature = ToCreature())
+ if (GetTransport())
+ GetTransport()->RemovePassenger(thisCreature);
}
void Unit::UpdateCharmAI()
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index 14620c2a9f8..a71addd3469 100755
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -53,9 +53,6 @@ MapManager::~MapManager()
delete *i;
}
- for (TransportNPCSet::iterator i = m_TransportNPCs.begin(); i != m_TransportNPCs.end(); ++i)
- delete *i;
-
Map::DeleteStateMachine();
}
diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h
index 385c485bffd..d34a04f1d00 100755
--- a/src/server/game/Maps/MapManager.h
+++ b/src/server/game/Maps/MapManager.h
@@ -132,11 +132,6 @@ class MapManager
typedef std::map<uint32, TransportSet> TransportMap;
TransportMap m_TransportsByMap;
- typedef std::set<TransportCreatureProto *> TransportNPCSet;
- TransportNPCSet m_TransportNPCs;
- typedef std::map<uint32, TransportNPCSet> TransportNPCMap;
- TransportNPCMap m_TransportNPCMap;
-
bool CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck = false);
uint32 GenerateInstanceId() { return ++i_MaxInstanceId; }
void InitMaxInstanceId();
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index f6d11738d0a..efc2690a6e8 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1711,12 +1711,12 @@ void World::SetInitialWorldSettings()
sLog.outString("Starting Outdoor PvP System");
sOutdoorPvPMgr.InitOutdoorPvP();
- sLog.outString("Loading Transport NPCs...");
- sMapMgr.LoadTransportNPCs();
-
sLog.outString("Loading Transports...");
sMapMgr.LoadTransports();
+ sLog.outString("Loading Transport NPCs...");
+ sMapMgr.LoadTransportNPCs();
+
sLog.outString("Deleting expired bans...");
LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate<>bandate");