From c547a27dad7d3bfb0d41ef4191e6477ab5177ff5 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Mon, 27 Jul 2009 11:30:02 +0400 Subject: [PATCH] [8256] Restore DB script loading broken after [8252]. Also propetly decrease scheduled DB script actions at map unloading. Some code style restore. --- src/game/Map.cpp | 287 ++++++++++++++++++++------------------- src/game/World.h | 3 +- src/shared/revision_nr.h | 2 +- 3 files changed, 148 insertions(+), 144 deletions(-) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index c9aefb819..d099f58a8 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -55,6 +55,9 @@ struct ScriptAction Map::~Map() { UnloadAll(true); + + if(!m_scriptSchedule.empty()) + sWorld.DecreaseScheduledScriptCount(m_scriptSchedule.size()); } bool Map::ExistMap(uint32 mapid,int gx,int gy) @@ -2652,7 +2655,7 @@ void Map::ScriptsStart(ScriptMapMap const& scripts, uint32 id, Object* source, O sa.ownerGUID = ownerGUID; sa.script = &iter->second; - m_scriptSchedule.insert(std::pair(sWorld.GetGameTime() + iter->first, sa)); + m_scriptSchedule.insert(std::pair(time_t(sWorld.GetGameTime() + iter->first), sa)); if (iter->first == 0) immedScript = true; @@ -2678,7 +2681,7 @@ void Map::ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* sou sa.ownerGUID = ownerGUID; sa.script = &script; - m_scriptSchedule.insert(std::pair(sWorld.GetGameTime() + delay, sa)); + m_scriptSchedule.insert(std::pair(time_t(sWorld.GetGameTime() + delay), sa)); sWorld.IncreaseScheduledScriptsCount(); @@ -2706,7 +2709,7 @@ void Map::ScriptsProcess() { switch(GUID_HIPART(step.sourceGUID)) { - case HIGHGUID_ITEM: + case HIGHGUID_ITEM: // case HIGHGUID_CONTAINER: ==HIGHGUID_ITEM { Player* player = HashMapHolder::Find(step.ownerGUID); @@ -2714,27 +2717,27 @@ void Map::ScriptsProcess() source = player->GetItemByGuid(step.sourceGUID); break; } - case HIGHGUID_UNIT: - source = HashMapHolder::Find(step.sourceGUID); - break; - case HIGHGUID_PET: - source = HashMapHolder::Find(step.sourceGUID); - break; - case HIGHGUID_VEHICLE: - source = HashMapHolder::Find(step.sourceGUID); - break; - case HIGHGUID_PLAYER: - source = HashMapHolder::Find(step.sourceGUID); - break; - case HIGHGUID_GAMEOBJECT: - source = HashMapHolder::Find(step.sourceGUID); - break; - case HIGHGUID_CORPSE: - source = HashMapHolder::Find(step.sourceGUID); - break; - default: - sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.sourceGUID)); - break; + case HIGHGUID_UNIT: + source = HashMapHolder::Find(step.sourceGUID); + break; + case HIGHGUID_PET: + source = HashMapHolder::Find(step.sourceGUID); + break; + case HIGHGUID_VEHICLE: + source = HashMapHolder::Find(step.sourceGUID); + break; + case HIGHGUID_PLAYER: + source = HashMapHolder::Find(step.sourceGUID); + break; + case HIGHGUID_GAMEOBJECT: + source = HashMapHolder::Find(step.sourceGUID); + break; + case HIGHGUID_CORPSE: + source = HashMapHolder::Find(step.sourceGUID); + break; + default: + sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.sourceGUID)); + break; } } @@ -2746,27 +2749,27 @@ void Map::ScriptsProcess() { switch(GUID_HIPART(step.targetGUID)) { - case HIGHGUID_UNIT: - target = HashMapHolder::Find(step.targetGUID); - break; - case HIGHGUID_PET: - target = HashMapHolder::Find(step.targetGUID); - break; - case HIGHGUID_VEHICLE: - target = HashMapHolder::Find(step.targetGUID); - break; - case HIGHGUID_PLAYER: // empty GUID case also - target = HashMapHolder::Find(step.targetGUID); - break; - case HIGHGUID_GAMEOBJECT: - target = HashMapHolder::Find(step.targetGUID); - break; - case HIGHGUID_CORPSE: - target = HashMapHolder::Find(step.targetGUID); - break; - default: - sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.targetGUID)); - break; + case HIGHGUID_UNIT: + target = HashMapHolder::Find(step.targetGUID); + break; + case HIGHGUID_PET: + target = HashMapHolder::Find(step.targetGUID); + break; + case HIGHGUID_VEHICLE: + target = HashMapHolder::Find(step.targetGUID); + break; + case HIGHGUID_PLAYER: // empty GUID case also + target = HashMapHolder::Find(step.targetGUID); + break; + case HIGHGUID_GAMEOBJECT: + target = HashMapHolder::Find(step.targetGUID); + break; + case HIGHGUID_CORPSE: + target = HashMapHolder::Find(step.targetGUID); + break; + default: + sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.targetGUID)); + break; } } @@ -2774,7 +2777,7 @@ void Map::ScriptsProcess() switch (step.script->command) { - case SCRIPT_COMMAND_TALK: + case SCRIPT_COMMAND_TALK: { if(!source) { @@ -2793,106 +2796,106 @@ void Map::ScriptsProcess() //datalong 0=normal say, 1=whisper, 2=yell, 3=emote text switch(step.script->datalong) { - case 0: // Say - ((Creature *)source)->Say(step.script->dataint, LANG_UNIVERSAL, unit_target); - break; - case 1: // Whisper - if(!unit_target) - { - sLog.outError("SCRIPT_COMMAND_TALK attempt to whisper (%u) NULL, skipping.",step.script->datalong); + case 0: // Say + ((Creature *)source)->Say(step.script->dataint, LANG_UNIVERSAL, unit_target); break; - } - ((Creature *)source)->Whisper(step.script->dataint,unit_target); - break; - case 2: // Yell - ((Creature *)source)->Yell(step.script->dataint, LANG_UNIVERSAL, unit_target); - break; - case 3: // Emote text - ((Creature *)source)->TextEmote(step.script->dataint, unit_target); - break; - default: - break; // must be already checked at load + case 1: // Whisper + if(!unit_target) + { + sLog.outError("SCRIPT_COMMAND_TALK attempt to whisper (%u) NULL, skipping.",step.script->datalong); + break; + } + ((Creature *)source)->Whisper(step.script->dataint,unit_target); + break; + case 2: // Yell + ((Creature *)source)->Yell(step.script->dataint, LANG_UNIVERSAL, unit_target); + break; + case 3: // Emote text + ((Creature *)source)->TextEmote(step.script->dataint, unit_target); + break; + default: + break; // must be already checked at load } break; } - case SCRIPT_COMMAND_EMOTE: - if(!source) - { - sLog.outError("SCRIPT_COMMAND_EMOTE call for NULL creature."); - break; - } + case SCRIPT_COMMAND_EMOTE: + if(!source) + { + sLog.outError("SCRIPT_COMMAND_EMOTE call for NULL creature."); + break; + } - if(source->GetTypeId()!=TYPEID_UNIT) - { - sLog.outError("SCRIPT_COMMAND_EMOTE call for non-creature (TypeId: %u), skipping.",source->GetTypeId()); - break; - } + if(source->GetTypeId()!=TYPEID_UNIT) + { + sLog.outError("SCRIPT_COMMAND_EMOTE call for non-creature (TypeId: %u), skipping.",source->GetTypeId()); + break; + } - ((Creature *)source)->HandleEmoteCommand(step.script->datalong); - break; - case SCRIPT_COMMAND_FIELD_SET: - if(!source) - { - sLog.outError("SCRIPT_COMMAND_FIELD_SET call for NULL object."); + ((Creature *)source)->HandleEmoteCommand(step.script->datalong); break; - } - if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) - { - sLog.outError("SCRIPT_COMMAND_FIELD_SET call for wrong field %u (max count: %u) in object (TypeId: %u).", - step.script->datalong,source->GetValuesCount(),source->GetTypeId()); - break; - } + case SCRIPT_COMMAND_FIELD_SET: + if(!source) + { + sLog.outError("SCRIPT_COMMAND_FIELD_SET call for NULL object."); + break; + } + if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) + { + sLog.outError("SCRIPT_COMMAND_FIELD_SET call for wrong field %u (max count: %u) in object (TypeId: %u).", + step.script->datalong,source->GetValuesCount(),source->GetTypeId()); + break; + } - source->SetUInt32Value(step.script->datalong, step.script->datalong2); - break; - case SCRIPT_COMMAND_MOVE_TO: - if(!source) - { - sLog.outError("SCRIPT_COMMAND_MOVE_TO call for NULL creature."); + source->SetUInt32Value(step.script->datalong, step.script->datalong2); break; - } + case SCRIPT_COMMAND_MOVE_TO: + if(!source) + { + sLog.outError("SCRIPT_COMMAND_MOVE_TO call for NULL creature."); + break; + } - if(source->GetTypeId()!=TYPEID_UNIT) - { - sLog.outError("SCRIPT_COMMAND_MOVE_TO call for non-creature (TypeId: %u), skipping.",source->GetTypeId()); + if(source->GetTypeId()!=TYPEID_UNIT) + { + sLog.outError("SCRIPT_COMMAND_MOVE_TO call for non-creature (TypeId: %u), skipping.",source->GetTypeId()); + break; + } + ((Creature*)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, step.script->datalong2 ); + ((Creature*)source)->GetMap()->CreatureRelocation(((Creature*)source), step.script->x, step.script->y, step.script->z, 0); break; - } - ((Creature*)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, step.script->datalong2 ); - ((Creature*)source)->GetMap()->CreatureRelocation(((Creature*)source), step.script->x, step.script->y, step.script->z, 0); - break; - case SCRIPT_COMMAND_FLAG_SET: - if(!source) - { - sLog.outError("SCRIPT_COMMAND_FLAG_SET call for NULL object."); - break; - } - if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) - { - sLog.outError("SCRIPT_COMMAND_FLAG_SET call for wrong field %u (max count: %u) in object (TypeId: %u).", - step.script->datalong,source->GetValuesCount(),source->GetTypeId()); - break; - } + case SCRIPT_COMMAND_FLAG_SET: + if(!source) + { + sLog.outError("SCRIPT_COMMAND_FLAG_SET call for NULL object."); + break; + } + if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) + { + sLog.outError("SCRIPT_COMMAND_FLAG_SET call for wrong field %u (max count: %u) in object (TypeId: %u).", + step.script->datalong,source->GetValuesCount(),source->GetTypeId()); + break; + } - source->SetFlag(step.script->datalong, step.script->datalong2); - break; - case SCRIPT_COMMAND_FLAG_REMOVE: - if(!source) - { - sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE call for NULL object."); + source->SetFlag(step.script->datalong, step.script->datalong2); break; - } - if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) - { - sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE call for wrong field %u (max count: %u) in object (TypeId: %u).", - step.script->datalong,source->GetValuesCount(),source->GetTypeId()); + case SCRIPT_COMMAND_FLAG_REMOVE: + if(!source) + { + sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE call for NULL object."); + break; + } + if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) + { + sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE call for wrong field %u (max count: %u) in object (TypeId: %u).", + step.script->datalong,source->GetValuesCount(),source->GetTypeId()); + break; + } + + source->RemoveFlag(step.script->datalong, step.script->datalong2); break; - } - source->RemoveFlag(step.script->datalong, step.script->datalong2); - break; - - case SCRIPT_COMMAND_TELEPORT_TO: + case SCRIPT_COMMAND_TELEPORT_TO: { // accept player in any one from target/source arg if (!target && !source) @@ -2914,7 +2917,7 @@ void Map::ScriptsProcess() break; } - case SCRIPT_COMMAND_TEMP_SUMMON_CREATURE: + case SCRIPT_COMMAND_TEMP_SUMMON_CREATURE: { if(!step.script->datalong) // creature not specified { @@ -2951,7 +2954,7 @@ void Map::ScriptsProcess() break; } - case SCRIPT_COMMAND_RESPAWN_GAMEOBJECT: + case SCRIPT_COMMAND_RESPAWN_GAMEOBJECT: { if(!step.script->datalong) // gameobject not specified { @@ -3011,7 +3014,7 @@ void Map::ScriptsProcess() go->GetMap()->Add(go); break; } - case SCRIPT_COMMAND_OPEN_DOOR: + case SCRIPT_COMMAND_OPEN_DOOR: { if(!step.script->datalong) // door not specified { @@ -3067,7 +3070,7 @@ void Map::ScriptsProcess() ((GameObject*)target)->UseDoorOrButton(time_to_close); break; } - case SCRIPT_COMMAND_CLOSE_DOOR: + case SCRIPT_COMMAND_CLOSE_DOOR: { if(!step.script->datalong) // guid for door not specified { @@ -3124,7 +3127,7 @@ void Map::ScriptsProcess() break; } - case SCRIPT_COMMAND_QUEST_EXPLORED: + case SCRIPT_COMMAND_QUEST_EXPLORED: { if(!source) { @@ -3181,7 +3184,7 @@ void Map::ScriptsProcess() break; } - case SCRIPT_COMMAND_ACTIVATE_OBJECT: + case SCRIPT_COMMAND_ACTIVATE_OBJECT: { if(!source) { @@ -3215,7 +3218,7 @@ void Map::ScriptsProcess() break; } - case SCRIPT_COMMAND_REMOVE_AURA: + case SCRIPT_COMMAND_REMOVE_AURA: { Object* cmdTarget = step.script->datalong2 ? source : target; @@ -3235,7 +3238,7 @@ void Map::ScriptsProcess() break; } - case SCRIPT_COMMAND_CAST_SPELL: + case SCRIPT_COMMAND_CAST_SPELL: { if(!source) { @@ -3281,7 +3284,7 @@ void Map::ScriptsProcess() break; } - case SCRIPT_COMMAND_PLAY_SOUND: + case SCRIPT_COMMAND_PLAY_SOUND: { if(!source) { @@ -3322,9 +3325,9 @@ void Map::ScriptsProcess() pSource->PlayDirectSound(step.script->datalong,pTarget); break; } - default: - sLog.outError("Unknown script command %u called.",step.script->command); - break; + default: + sLog.outError("Unknown script command %u called.",step.script->command); + break; } m_scriptSchedule.erase(iter); diff --git a/src/game/World.h b/src/game/World.h index e916ad307..e4ff977f5 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -485,7 +485,8 @@ class World uint32 IncreaseScheduledScriptsCount() { return (uint32)++m_scheduledScripts; } uint32 DecreaseScheduledScriptCount() { return (uint32)--m_scheduledScripts; } - bool IsScriptScheduled() const { return m_scheduledScripts == 0; } + uint32 DecreaseScheduledScriptCount(size_t count) { return (uint32)(m_scheduledScripts -= count); } + bool IsScriptScheduled() const { return m_scheduledScripts > 0; } // for max speed access static float GetMaxVisibleDistanceForCreature() { return m_MaxVisibleDistanceForCreature; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 16b6d8d77..cedadc5c5 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8255" + #define REVISION_NR "8256" #endif // __REVISION_NR_H__