[7634] Fixed: select non-despawnable gameobjects base at appropriate for gameobject type dataN fields.

Many in world gameobject that unexpected daspawned before must now work in more expected way.

In tests i not found any damage to bg gameobject work, and at least this restore expected work for non-bg dorrs//buttons broken
after half-year ago patch (that has been reverted partly in this commit)

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
VladimirMangos 2009-04-08 05:35:53 +04:00
parent 863a747251
commit 3226a22e29
3 changed files with 37 additions and 26 deletions

View file

@ -586,37 +586,34 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
if (!Create(guid,entry, map, phaseMask, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state) ) if (!Create(guid,entry, map, phaseMask, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state) )
return false; return false;
switch(GetGOInfo()->type) if(!GetDespawnPossibility())
{ {
case GAMEOBJECT_TYPE_DOOR: SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NODESPAWN);
case GAMEOBJECT_TYPE_BUTTON: m_spawnedByDefault = true;
/* this code (in comment) isn't correct because in battlegrounds we need despawnable doors and buttons, pls remove m_respawnDelayTime = 0;
SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NODESPAWN); m_respawnTime = 0;
}
else
{
if(data->spawntimesecs >= 0)
{
m_spawnedByDefault = true; m_spawnedByDefault = true;
m_respawnDelayTime = 0; m_respawnDelayTime = data->spawntimesecs;
m_respawnTime = 0; m_respawnTime = objmgr.GetGORespawnTime(m_DBTableGuid, map->GetInstanceId());
break;*/
default:
if(data->spawntimesecs >= 0)
{
m_spawnedByDefault = true;
m_respawnDelayTime = data->spawntimesecs;
m_respawnTime = objmgr.GetGORespawnTime(m_DBTableGuid, map->GetInstanceId());
// ready to respawn // ready to respawn
if(m_respawnTime && m_respawnTime <= time(NULL)) if(m_respawnTime && m_respawnTime <= time(NULL))
{
m_respawnTime = 0;
objmgr.SaveGORespawnTime(m_DBTableGuid,GetInstanceId(),0);
}
}
else
{ {
m_spawnedByDefault = false;
m_respawnDelayTime = -data->spawntimesecs;
m_respawnTime = 0; m_respawnTime = 0;
objmgr.SaveGORespawnTime(m_DBTableGuid,GetInstanceId(),0);
} }
break; }
else
{
m_spawnedByDefault = false;
m_respawnDelayTime = -data->spawntimesecs;
m_respawnTime = 0;
}
} }
return true; return true;

View file

@ -479,6 +479,20 @@ class MANGOS_DLL_SPEC GameObject : public WorldObject
} }
} }
bool GetDespawnPossibility() const
{
switch(GetGoType())
{
case GAMEOBJECT_TYPE_DOOR: return GetGOInfo()->door.noDamageImmune;
case GAMEOBJECT_TYPE_BUTTON: return GetGOInfo()->button.noDamageImmune;
case GAMEOBJECT_TYPE_QUESTGIVER: return GetGOInfo()->questgiver.noDamageImmune;
case GAMEOBJECT_TYPE_GOOBER: return GetGOInfo()->goober.noDamageImmune;
case GAMEOBJECT_TYPE_FLAGSTAND: return GetGOInfo()->flagstand.noDamageImmune;
case GAMEOBJECT_TYPE_FLAGDROP: return GetGOInfo()->flagdrop.noDamageImmune;
default: return true;
}
}
time_t GetRespawnTime() const { return m_respawnTime; } time_t GetRespawnTime() const { return m_respawnTime; }
time_t GetRespawnTimeEx() const time_t GetRespawnTimeEx() const
{ {

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 "7633" #define REVISION_NR "7634"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__