diff options
author | megamage <none@none> | 2009-01-03 11:18:19 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-01-03 11:18:19 -0600 |
commit | 9dfcd5ba5e0b801f39a2a4c1b71154d9724f7935 (patch) | |
tree | 627370d0f5859d4635026f731a8c38244d054411 /src/game/World.cpp | |
parent | 9438625a19c070ec20d392fa57f1de6a61b7b985 (diff) | |
parent | 59f85167ab387a8e8b69aaf1d65f9b6994de9ca0 (diff) |
*Merge with Trinity 768.
--HG--
branch : trunk
Diffstat (limited to 'src/game/World.cpp')
-rw-r--r-- | src/game/World.cpp | 96 |
1 files changed, 92 insertions, 4 deletions
diff --git a/src/game/World.cpp b/src/game/World.cpp index 028ec804ab4..9bb936be6af 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 ); @@ -1398,6 +1399,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"); @@ -1656,7 +1660,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; @@ -1685,7 +1689,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; @@ -1742,12 +1746,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; } @@ -2316,6 +2330,80 @@ void World::ScriptsProcess() break; } + case SCRIPT_COMMAND_CALLSCRIPT_TO_UNIT: + { + if(!step.script->datalong || !step.script->datalong2) + { + sLog.outError("SCRIPT_COMMAND_CALLSCRIPT calls invallid db_script_id or lowguid not present: skipping."); + break; + } + Creature* target = NULL; + + if(source) //using grid searcher + { + CellPair p(Trinity::ComputeCellPair(((Unit*)source)->GetPositionX(), ((Unit*)source)->GetPositionY())); + Cell cell(p); + cell.data.Part.reserved = ALL_DISTRICT; + + //sLog.outDebug("Attempting to find Creature: Db GUID: %i", step.script->datalong); + Trinity::CreatureWithDbGUIDCheck target_check(((Unit*)source), step.script->datalong); + Trinity::CreatureSearcher<Trinity::CreatureWithDbGUIDCheck> checker(target,target_check); + + TypeContainerVisitor<Trinity::CreatureSearcher <Trinity::CreatureWithDbGUIDCheck>, GridTypeMapContainer > unit_checker(checker); + CellLock<GridReadGuard> cell_lock(cell, p); + cell_lock->Visit(cell_lock, unit_checker, *(((Unit*)source)->GetMap())); + } + else //check hashmap holders + { + if(CreatureData const* data = objmgr.GetCreatureData(step.script->datalong)) + 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) + { + case 1: + datamap = sQuestEndScripts; + break; + case 2: + datamap = sQuestStartScripts; + break; + case 3: + datamap = sSpellScripts; + break; + case 4: + datamap = sGameObjectScripts; + break; + case 5: + datamap = sEventScripts; + break; + case 6: + datamap = sWaypointScripts; + break; + default: + 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; |