diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/ObjectMgr.cpp | 36 | ||||
-rw-r--r-- | src/game/ObjectMgr.h | 8 | ||||
-rw-r--r-- | src/game/Transports.cpp | 29 | ||||
-rw-r--r-- | src/game/Transports.h | 9 | ||||
-rw-r--r-- | src/game/World.cpp | 45 | ||||
-rw-r--r-- | src/game/World.h | 1 |
6 files changed, 102 insertions, 26 deletions
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 594cfaf0877..8d14db9e377 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -7541,3 +7541,39 @@ ObjectMgr::ScriptNameMap & GetScriptNames() { return objmgr.GetScriptNames(); } + +void ObjectMgr::LoadTransportEvents() +{ + + QueryResult *result = WorldDatabase.Query("SELECT entry, waypoint_id, event_id FROM transport_events"); + + if( !result ) + { + barGoLink bar1( 1 ); + bar1.step(); + sLog.outString( "\n>> Transport events table is empty \n" ); + return; + } + + barGoLink bar1( result->GetRowCount() ); + + do + { + bar1.step(); + + Field *fields = result->Fetch(); + + //Load event values + uint32 entry = fields[0].GetUInt32(); + uint32 waypoint_id = fields[1].GetUInt32(); + uint32 event_id = fields[2].GetUInt32(); + + uint32 event_count = (entry*100)+waypoint_id; + TransportEventMap[event_count] = event_id; + } + while(result->NextRow()); + + sLog.outString( "\n>> Loaded %u transport events \n", result->GetRowCount() ); + + delete result; +}
\ No newline at end of file diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index 4a35f98b679..cca03ae39a3 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -321,7 +321,9 @@ class ObjectMgr typedef std::vector<std::string> ScriptNameMap; - Player* GetPlayer(const char* name) const { return ObjectAccessor::Instance().FindPlayerByName(name);} + UNORDERED_MAP<uint32, uint32> TransportEventMap; + + Player* GetPlayer(const char* name) const { return ObjectAccessor::Instance().FindPlayerByName(name);} Player* GetPlayer(uint64 guid) const { return ObjectAccessor::FindPlayer(guid); } static GameObjectInfo const *GetGameObjectInfo(uint32 id) { return sGOStorage.LookupEntry<GameObjectInfo>(id); } @@ -533,6 +535,8 @@ class ObjectMgr void LoadEventScripts(); void LoadSpellScripts(); void LoadWaypointScripts(); + + void LoadTransportEvents(); bool LoadTrinityStrings(DatabaseType& db, char const* table, int32 min_value, int32 max_value); bool LoadTrinityStrings() { return LoadTrinityStrings(WorldDatabase,"trinity_string",MIN_TRINITY_STRING_ID,MAX_TRINITY_STRING_ID); } @@ -588,7 +592,7 @@ class ObjectMgr void LoadNpcTextId(); void LoadVendors(); void LoadTrainerSpell(); - + std::string GeneratePetName(uint32 entry); uint32 GetBaseXP(uint32 level); diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp index 21d3d3b1f27..cccf50ad0fb 100644 --- a/src/game/Transports.cpp +++ b/src/game/Transports.cpp @@ -29,6 +29,8 @@ #include "Database/DBCStores.h" #include "ProgressBar.h" +#include "World.h" + void MapManager::LoadTransports() { QueryResult *result = WorldDatabase.Query("SELECT entry, name, period FROM transports"); @@ -316,7 +318,7 @@ bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) if (keyFrames[keyFrames.size() - 1].mapid != keyFrames[0].mapid) teleport = true; - WayPoint pos(keyFrames[0].mapid, keyFrames[0].x, keyFrames[0].y, keyFrames[0].z, teleport); + WayPoint pos(keyFrames[0].mapid, keyFrames[0].x, keyFrames[0].y, keyFrames[0].z, teleport, 0); m_WayPoints[0] = pos; t += keyFrames[0].delay * 1000; @@ -350,7 +352,7 @@ bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) } // sLog.outString("T: %d, D: %f, x: %f, y: %f, z: %f", t, d, newX, newY, newZ); - WayPoint pos(keyFrames[i].mapid, newX, newY, newZ, teleport); + WayPoint pos(keyFrames[i].mapid, newX, newY, newZ, teleport, i); if (teleport) m_WayPoints[t] = pos; } @@ -396,13 +398,13 @@ bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) cM = keyFrames[i + 1].mapid; } - WayPoint pos(keyFrames[i + 1].mapid, keyFrames[i + 1].x, keyFrames[i + 1].y, keyFrames[i + 1].z, teleport); + WayPoint pos(keyFrames[i + 1].mapid, keyFrames[i + 1].x, keyFrames[i + 1].y, keyFrames[i + 1].z, teleport, i); // sLog.outString("T: %d, x: %f, y: %f, z: %f, t:%d", t, pos.x, pos.y, pos.z, teleport); - +/* if(keyFrames[i+1].delay > 5) pos.delayed = true; - +*/ //if (teleport) m_WayPoints[t] = pos; @@ -485,6 +487,13 @@ bool Transport::RemovePassenger(Player* passenger) return true; } +void Transport::CheckForEvent(uint32 entry, uint32 wp_id) +{ + uint32 key = entry*100+wp_id; + if(objmgr.TransportEventMap.find(key) != objmgr.TransportEventMap.end()) + sWorld.ScriptsStart(sEventScripts, objmgr.TransportEventMap[key], this, NULL); +} + void Transport::Update(uint32 /*p_time*/) { if (m_WayPoints.size() <= 1) @@ -506,7 +515,7 @@ void Transport::Update(uint32 /*p_time*/) //MapManager::Instance().GetMap(m_curr->second.mapid)->GameobjectRelocation((GameObject *)this, m_curr->second.x, m_curr->second.y, m_curr->second.z, this->m_orientation); Relocate(m_curr->second.x, m_curr->second.y, m_curr->second.z); } - +/* if(m_curr->second.delayed) { switch (GetEntry()) @@ -526,7 +535,7 @@ void Transport::Update(uint32 /*p_time*/) SendPlaySound(5154, false); break; // ShipDocked } } - +*/ /* for(PlayerSet::iterator itr = m_passengers.begin(); itr != m_passengers.end();) { @@ -547,5 +556,9 @@ void Transport::Update(uint32 /*p_time*/) if ((sLog.getLogFilter() & LOG_FILTER_TRANSPORT_MOVES)==0) sLog.outDetail("%s moved to %f %f %f %d", this->m_name.c_str(), m_curr->second.x, m_curr->second.y, m_curr->second.z, m_curr->second.mapid); - } + + //Transport Event System + CheckForEvent(this->GetEntry(), m_curr->second.id); + sLog.outDetail("%s is at wp id: %u", this->m_name.c_str(), m_curr->second.id); + } } diff --git a/src/game/Transports.h b/src/game/Transports.h index 0e39d57c089..5fb15dbe98f 100644 --- a/src/game/Transports.h +++ b/src/game/Transports.h @@ -78,6 +78,7 @@ class Transport : private GameObject void Update(uint32 p_time); bool AddPassenger(Player* passenger); bool RemovePassenger(Player* passenger); + void CheckForEvent(uint32 entry, uint32 wp_id); typedef std::set<Player*> PlayerSet; PlayerSet const& GetPassengers() const { return m_passengers; } @@ -86,15 +87,15 @@ class Transport : private GameObject private: struct WayPoint { - WayPoint() : mapid(0), x(0), y(0), z(0), teleport(false) {} - WayPoint(uint32 _mapid, float _x, float _y, float _z, bool _teleport) : - mapid(_mapid), x(_x), y(_y), z(_z), teleport(_teleport), delayed(false) {} + WayPoint() : mapid(0), x(0), y(0), z(0), teleport(false), id(0) {} + WayPoint(uint32 _mapid, float _x, float _y, float _z, bool _teleport, uint32 _id) : + mapid(_mapid), x(_x), y(_y), z(_z), teleport(_teleport), id(_id) {} uint32 mapid; float x; float y; float z; bool teleport; - bool delayed; + uint32 id; }; typedef std::map<uint32, WayPoint> WayPointMap; diff --git a/src/game/World.cpp b/src/game/World.cpp index d97cd327072..d525945bd20 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -63,6 +63,7 @@ #include "Util.h" #include "Language.h" #include "CreatureGroups.h" +#include "Transports.h" INSTANTIATE_SINGLETON_1( World ); @@ -1356,6 +1357,9 @@ void World::SetInitialWorldSettings() //Not sure if this can be moved up in the sequence (with static data loading) as it uses MapManager sLog.outString( "Loading Transports..." ); MapManager::Instance().LoadTransports(); + + sLog.outString( "Loading Transports Events..." ); + objmgr.LoadTransportEvents(); sLog.outString("Deleting expired bans..." ); loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate"); @@ -1614,7 +1618,7 @@ void World::ScriptsStart(ScriptMapMap const& scripts, uint32 id, Object* source, return; // prepare static data - uint64 sourceGUID = source->GetGUID(); + uint64 sourceGUID = source ? source->GetGUID() : (uint64)0; //some script commands doesn't have source uint64 targetGUID = target ? target->GetGUID() : (uint64)0; uint64 ownerGUID = (source->GetTypeId()==TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : (uint64)0; @@ -1643,7 +1647,7 @@ void World::ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* s // NOTE: script record _must_ exist until command executed // prepare static data - uint64 sourceGUID = source->GetGUID(); + uint64 sourceGUID = source ? source->GetGUID() : (uint64)0; uint64 targetGUID = target ? target->GetGUID() : (uint64)0; uint64 ownerGUID = (source->GetTypeId()==TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : (uint64)0; @@ -1697,12 +1701,22 @@ void World::ScriptsProcess() source = HashMapHolder<Player>::Find(step.sourceGUID); break; case HIGHGUID_GAMEOBJECT: - source = HashMapHolder<GameObject>::Find(step.sourceGUID); + source = HashMapHolder<GameObject>::Find(step.sourceGUID); break; case HIGHGUID_CORPSE: source = HashMapHolder<Corpse>::Find(step.sourceGUID); break; - default: + case HIGHGUID_MO_TRANSPORT: + for (MapManager::TransportSet::iterator iter = MapManager::Instance().m_Transports.begin(); iter != MapManager::Instance().m_Transports.end(); ++iter) + { + if((*iter)->GetGUID() == step.sourceGUID) + { + source = reinterpret_cast<Object*>(*iter); + break; + } + } + break; + default: sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.sourceGUID)); break; } @@ -2294,11 +2308,12 @@ void World::ScriptsProcess() else //check hashmap holders { if(CreatureData const* data = objmgr.GetCreatureData(step.script->datalong)) - ObjectAccessor::GetObjectInWorld<Creature>(data->mapid, data->posX, data->posY, MAKE_NEW_GUID(step.script->datalong, data->id, HIGHGUID_UNIT), target); + target = ObjectAccessor::GetObjectInWorld<Creature>(data->mapid, data->posX, data->posY, MAKE_NEW_GUID(step.script->datalong, data->id, HIGHGUID_UNIT), target); } if(!target) break; + //Lets choose our ScriptMap map ScriptMapMap datamap; switch(step.script->dataint) @@ -2322,19 +2337,25 @@ void World::ScriptsProcess() datamap = sWaypointScripts; break; default: - { - sLog.outError("SCRIPT_COMMAND_CALLSCRIPT ERROR: no scriptmap present... ignoring"); - m_scriptSchedule.erase(iter); - return; - } + sLog.outError("SCRIPT_COMMAND_CALLSCRIPT ERROR: no scriptmap present... ignoring"); + m_scriptSchedule.erase(iter); + return; } - uint32 script_id = step.script->datalong2; - m_scriptSchedule.erase(iter); ScriptsStart(datamap, script_id, target, NULL); + return; } + case SCRIPT_COMMAND_PLAYSOUND: + { + if(!source) + break; + //datalong sound_id, datalong2 onlyself + ((WorldObject*)source)->SendPlaySound(step.script->datalong, step.script->datalong2); + break; + } + default: sLog.outError("Unknown script command %u called.",step.script->command); break; diff --git a/src/game/World.h b/src/game/World.h index ec3e4ec50b5..aca311335df 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -327,6 +327,7 @@ enum RealmZone #define SCRIPT_COMMAND_CAST_SPELL 15 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id #define SCRIPT_COMMAND_LOAD_PATH 16 // source = unit, path = datalong, repeatable datalong2 #define SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT 17 // datalong scriptid, lowguid datalong2, dataint table +#define SCRIPT_COMMAND_PLAYSOUND 18 // datalong soundid, datalong2 play only self /// Storage class for commands issued for delayed execution |