[8256] Restore DB script loading broken after [8252].

Also propetly decrease scheduled DB script actions at map unloading.
Some code style restore.
This commit is contained in:
VladimirMangos 2009-07-27 11:30:02 +04:00
parent c3d26f6fa2
commit c547a27dad
3 changed files with 148 additions and 144 deletions

View file

@ -55,6 +55,9 @@ struct ScriptAction
Map::~Map() Map::~Map()
{ {
UnloadAll(true); UnloadAll(true);
if(!m_scriptSchedule.empty())
sWorld.DecreaseScheduledScriptCount(m_scriptSchedule.size());
} }
bool Map::ExistMap(uint32 mapid,int gx,int gy) 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.ownerGUID = ownerGUID;
sa.script = &iter->second; sa.script = &iter->second;
m_scriptSchedule.insert(std::pair<time_t, ScriptAction>(sWorld.GetGameTime() + iter->first, sa)); m_scriptSchedule.insert(std::pair<time_t, ScriptAction>(time_t(sWorld.GetGameTime() + iter->first), sa));
if (iter->first == 0) if (iter->first == 0)
immedScript = true; immedScript = true;
@ -2678,7 +2681,7 @@ void Map::ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* sou
sa.ownerGUID = ownerGUID; sa.ownerGUID = ownerGUID;
sa.script = &script; sa.script = &script;
m_scriptSchedule.insert(std::pair<time_t, ScriptAction>(sWorld.GetGameTime() + delay, sa)); m_scriptSchedule.insert(std::pair<time_t, ScriptAction>(time_t(sWorld.GetGameTime() + delay), sa));
sWorld.IncreaseScheduledScriptsCount(); sWorld.IncreaseScheduledScriptsCount();
@ -2706,7 +2709,7 @@ void Map::ScriptsProcess()
{ {
switch(GUID_HIPART(step.sourceGUID)) switch(GUID_HIPART(step.sourceGUID))
{ {
case HIGHGUID_ITEM: case HIGHGUID_ITEM:
// case HIGHGUID_CONTAINER: ==HIGHGUID_ITEM // case HIGHGUID_CONTAINER: ==HIGHGUID_ITEM
{ {
Player* player = HashMapHolder<Player>::Find(step.ownerGUID); Player* player = HashMapHolder<Player>::Find(step.ownerGUID);
@ -2714,27 +2717,27 @@ void Map::ScriptsProcess()
source = player->GetItemByGuid(step.sourceGUID); source = player->GetItemByGuid(step.sourceGUID);
break; break;
} }
case HIGHGUID_UNIT: case HIGHGUID_UNIT:
source = HashMapHolder<Creature>::Find(step.sourceGUID); source = HashMapHolder<Creature>::Find(step.sourceGUID);
break; break;
case HIGHGUID_PET: case HIGHGUID_PET:
source = HashMapHolder<Pet>::Find(step.sourceGUID); source = HashMapHolder<Pet>::Find(step.sourceGUID);
break; break;
case HIGHGUID_VEHICLE: case HIGHGUID_VEHICLE:
source = HashMapHolder<Vehicle>::Find(step.sourceGUID); source = HashMapHolder<Vehicle>::Find(step.sourceGUID);
break; break;
case HIGHGUID_PLAYER: case HIGHGUID_PLAYER:
source = HashMapHolder<Player>::Find(step.sourceGUID); source = HashMapHolder<Player>::Find(step.sourceGUID);
break; break;
case HIGHGUID_GAMEOBJECT: case HIGHGUID_GAMEOBJECT:
source = HashMapHolder<GameObject>::Find(step.sourceGUID); source = HashMapHolder<GameObject>::Find(step.sourceGUID);
break; break;
case HIGHGUID_CORPSE: case HIGHGUID_CORPSE:
source = HashMapHolder<Corpse>::Find(step.sourceGUID); source = HashMapHolder<Corpse>::Find(step.sourceGUID);
break; break;
default: default:
sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.sourceGUID)); sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.sourceGUID));
break; break;
} }
} }
@ -2746,27 +2749,27 @@ void Map::ScriptsProcess()
{ {
switch(GUID_HIPART(step.targetGUID)) switch(GUID_HIPART(step.targetGUID))
{ {
case HIGHGUID_UNIT: case HIGHGUID_UNIT:
target = HashMapHolder<Creature>::Find(step.targetGUID); target = HashMapHolder<Creature>::Find(step.targetGUID);
break; break;
case HIGHGUID_PET: case HIGHGUID_PET:
target = HashMapHolder<Pet>::Find(step.targetGUID); target = HashMapHolder<Pet>::Find(step.targetGUID);
break; break;
case HIGHGUID_VEHICLE: case HIGHGUID_VEHICLE:
target = HashMapHolder<Vehicle>::Find(step.targetGUID); target = HashMapHolder<Vehicle>::Find(step.targetGUID);
break; break;
case HIGHGUID_PLAYER: // empty GUID case also case HIGHGUID_PLAYER: // empty GUID case also
target = HashMapHolder<Player>::Find(step.targetGUID); target = HashMapHolder<Player>::Find(step.targetGUID);
break; break;
case HIGHGUID_GAMEOBJECT: case HIGHGUID_GAMEOBJECT:
target = HashMapHolder<GameObject>::Find(step.targetGUID); target = HashMapHolder<GameObject>::Find(step.targetGUID);
break; break;
case HIGHGUID_CORPSE: case HIGHGUID_CORPSE:
target = HashMapHolder<Corpse>::Find(step.targetGUID); target = HashMapHolder<Corpse>::Find(step.targetGUID);
break; break;
default: default:
sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.targetGUID)); sLog.outError("*_script source with unsupported high guid value %u",GUID_HIPART(step.targetGUID));
break; break;
} }
} }
@ -2774,7 +2777,7 @@ void Map::ScriptsProcess()
switch (step.script->command) switch (step.script->command)
{ {
case SCRIPT_COMMAND_TALK: case SCRIPT_COMMAND_TALK:
{ {
if(!source) if(!source)
{ {
@ -2793,106 +2796,106 @@ void Map::ScriptsProcess()
//datalong 0=normal say, 1=whisper, 2=yell, 3=emote text //datalong 0=normal say, 1=whisper, 2=yell, 3=emote text
switch(step.script->datalong) switch(step.script->datalong)
{ {
case 0: // Say case 0: // Say
((Creature *)source)->Say(step.script->dataint, LANG_UNIVERSAL, unit_target); ((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);
break; break;
} case 1: // Whisper
((Creature *)source)->Whisper(step.script->dataint,unit_target); if(!unit_target)
break; {
case 2: // Yell sLog.outError("SCRIPT_COMMAND_TALK attempt to whisper (%u) NULL, skipping.",step.script->datalong);
((Creature *)source)->Yell(step.script->dataint, LANG_UNIVERSAL, unit_target); break;
break; }
case 3: // Emote text ((Creature *)source)->Whisper(step.script->dataint,unit_target);
((Creature *)source)->TextEmote(step.script->dataint, unit_target); break;
break; case 2: // Yell
default: ((Creature *)source)->Yell(step.script->dataint, LANG_UNIVERSAL, unit_target);
break; // must be already checked at load break;
case 3: // Emote text
((Creature *)source)->TextEmote(step.script->dataint, unit_target);
break;
default:
break; // must be already checked at load
} }
break; break;
} }
case SCRIPT_COMMAND_EMOTE: case SCRIPT_COMMAND_EMOTE:
if(!source) if(!source)
{ {
sLog.outError("SCRIPT_COMMAND_EMOTE call for NULL creature."); sLog.outError("SCRIPT_COMMAND_EMOTE call for NULL creature.");
break; break;
} }
if(source->GetTypeId()!=TYPEID_UNIT) if(source->GetTypeId()!=TYPEID_UNIT)
{ {
sLog.outError("SCRIPT_COMMAND_EMOTE call for non-creature (TypeId: %u), skipping.",source->GetTypeId()); sLog.outError("SCRIPT_COMMAND_EMOTE call for non-creature (TypeId: %u), skipping.",source->GetTypeId());
break; break;
} }
((Creature *)source)->HandleEmoteCommand(step.script->datalong); ((Creature *)source)->HandleEmoteCommand(step.script->datalong);
break;
case SCRIPT_COMMAND_FIELD_SET:
if(!source)
{
sLog.outError("SCRIPT_COMMAND_FIELD_SET call for NULL object.");
break; break;
} case SCRIPT_COMMAND_FIELD_SET:
if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) if(!source)
{ {
sLog.outError("SCRIPT_COMMAND_FIELD_SET call for wrong field %u (max count: %u) in object (TypeId: %u).", sLog.outError("SCRIPT_COMMAND_FIELD_SET call for NULL object.");
step.script->datalong,source->GetValuesCount(),source->GetTypeId()); break;
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); 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; break;
} case SCRIPT_COMMAND_MOVE_TO:
if(!source)
{
sLog.outError("SCRIPT_COMMAND_MOVE_TO call for NULL creature.");
break;
}
if(source->GetTypeId()!=TYPEID_UNIT) if(source->GetTypeId()!=TYPEID_UNIT)
{ {
sLog.outError("SCRIPT_COMMAND_MOVE_TO call for non-creature (TypeId: %u), skipping.",source->GetTypeId()); 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; break;
} case SCRIPT_COMMAND_FLAG_SET:
((Creature*)source)->SendMonsterMoveWithSpeed(step.script->x, step.script->y, step.script->z, step.script->datalong2 ); if(!source)
((Creature*)source)->GetMap()->CreatureRelocation(((Creature*)source), step.script->x, step.script->y, step.script->z, 0); {
break; sLog.outError("SCRIPT_COMMAND_FLAG_SET call for NULL object.");
case SCRIPT_COMMAND_FLAG_SET: break;
if(!source) }
{ if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount())
sLog.outError("SCRIPT_COMMAND_FLAG_SET call for NULL object."); {
break; 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());
if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) break;
{ }
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); 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.");
break; break;
} case SCRIPT_COMMAND_FLAG_REMOVE:
if(step.script->datalong <= OBJECT_FIELD_ENTRY || step.script->datalong >= source->GetValuesCount()) if(!source)
{ {
sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE call for wrong field %u (max count: %u) in object (TypeId: %u).", sLog.outError("SCRIPT_COMMAND_FLAG_REMOVE call for NULL object.");
step.script->datalong,source->GetValuesCount(),source->GetTypeId()); 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; break;
}
source->RemoveFlag(step.script->datalong, step.script->datalong2); case SCRIPT_COMMAND_TELEPORT_TO:
break;
case SCRIPT_COMMAND_TELEPORT_TO:
{ {
// accept player in any one from target/source arg // accept player in any one from target/source arg
if (!target && !source) if (!target && !source)
@ -2914,7 +2917,7 @@ void Map::ScriptsProcess()
break; break;
} }
case SCRIPT_COMMAND_TEMP_SUMMON_CREATURE: case SCRIPT_COMMAND_TEMP_SUMMON_CREATURE:
{ {
if(!step.script->datalong) // creature not specified if(!step.script->datalong) // creature not specified
{ {
@ -2951,7 +2954,7 @@ void Map::ScriptsProcess()
break; break;
} }
case SCRIPT_COMMAND_RESPAWN_GAMEOBJECT: case SCRIPT_COMMAND_RESPAWN_GAMEOBJECT:
{ {
if(!step.script->datalong) // gameobject not specified if(!step.script->datalong) // gameobject not specified
{ {
@ -3011,7 +3014,7 @@ void Map::ScriptsProcess()
go->GetMap()->Add(go); go->GetMap()->Add(go);
break; break;
} }
case SCRIPT_COMMAND_OPEN_DOOR: case SCRIPT_COMMAND_OPEN_DOOR:
{ {
if(!step.script->datalong) // door not specified if(!step.script->datalong) // door not specified
{ {
@ -3067,7 +3070,7 @@ void Map::ScriptsProcess()
((GameObject*)target)->UseDoorOrButton(time_to_close); ((GameObject*)target)->UseDoorOrButton(time_to_close);
break; break;
} }
case SCRIPT_COMMAND_CLOSE_DOOR: case SCRIPT_COMMAND_CLOSE_DOOR:
{ {
if(!step.script->datalong) // guid for door not specified if(!step.script->datalong) // guid for door not specified
{ {
@ -3124,7 +3127,7 @@ void Map::ScriptsProcess()
break; break;
} }
case SCRIPT_COMMAND_QUEST_EXPLORED: case SCRIPT_COMMAND_QUEST_EXPLORED:
{ {
if(!source) if(!source)
{ {
@ -3181,7 +3184,7 @@ void Map::ScriptsProcess()
break; break;
} }
case SCRIPT_COMMAND_ACTIVATE_OBJECT: case SCRIPT_COMMAND_ACTIVATE_OBJECT:
{ {
if(!source) if(!source)
{ {
@ -3215,7 +3218,7 @@ void Map::ScriptsProcess()
break; break;
} }
case SCRIPT_COMMAND_REMOVE_AURA: case SCRIPT_COMMAND_REMOVE_AURA:
{ {
Object* cmdTarget = step.script->datalong2 ? source : target; Object* cmdTarget = step.script->datalong2 ? source : target;
@ -3235,7 +3238,7 @@ void Map::ScriptsProcess()
break; break;
} }
case SCRIPT_COMMAND_CAST_SPELL: case SCRIPT_COMMAND_CAST_SPELL:
{ {
if(!source) if(!source)
{ {
@ -3281,7 +3284,7 @@ void Map::ScriptsProcess()
break; break;
} }
case SCRIPT_COMMAND_PLAY_SOUND: case SCRIPT_COMMAND_PLAY_SOUND:
{ {
if(!source) if(!source)
{ {
@ -3322,9 +3325,9 @@ void Map::ScriptsProcess()
pSource->PlayDirectSound(step.script->datalong,pTarget); pSource->PlayDirectSound(step.script->datalong,pTarget);
break; break;
} }
default: default:
sLog.outError("Unknown script command %u called.",step.script->command); sLog.outError("Unknown script command %u called.",step.script->command);
break; break;
} }
m_scriptSchedule.erase(iter); m_scriptSchedule.erase(iter);

View file

@ -485,7 +485,8 @@ class World
uint32 IncreaseScheduledScriptsCount() { return (uint32)++m_scheduledScripts; } uint32 IncreaseScheduledScriptsCount() { return (uint32)++m_scheduledScripts; }
uint32 DecreaseScheduledScriptCount() { 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 // for max speed access
static float GetMaxVisibleDistanceForCreature() { return m_MaxVisibleDistanceForCreature; } static float GetMaxVisibleDistanceForCreature() { return m_MaxVisibleDistanceForCreature; }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8255" #define REVISION_NR "8256"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__