diff options
author | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
commit | e585187b248f48b3c6e9247b49fa07c6565d65e5 (patch) | |
tree | 637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/game/Corpse.cpp | |
parent | 26b5e033ffde3d161382fc9addbfa99738379641 (diff) |
*Backed out changeset 3be01fb200a5
--HG--
branch : trunk
Diffstat (limited to 'src/game/Corpse.cpp')
-rw-r--r-- | src/game/Corpse.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp index 350e314152d..16e52ef46aa 100644 --- a/src/game/Corpse.cpp +++ b/src/game/Corpse.cpp @@ -17,6 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "Common.h" #include "Corpse.h" #include "Player.h" @@ -26,65 +27,87 @@ #include "Opcodes.h" #include "GossipDef.h" #include "World.h" + Corpse::Corpse(CorpseType type) : WorldObject() , m_type(type) { m_objectType |= TYPEMASK_CORPSE; m_objectTypeId = TYPEID_CORPSE; + m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION); + m_valuesCount = CORPSE_END; + m_time = time(NULL); + lootForBody = false; + if(type != CORPSE_BONES) m_isWorldObject = true; } + Corpse::~Corpse() { } + void Corpse::AddToWorld() { ///- Register the corpse for guid lookup if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this); + Object::AddToWorld(); } + void Corpse::RemoveFromWorld() { ///- Remove the corpse from the accessor if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this); + Object::RemoveFromWorld(); } + bool Corpse::Create( uint32 guidlow, Map *map ) { SetMap(map); Object::_Create(guidlow, 0, HIGHGUID_CORPSE); return true; } + bool Corpse::Create( uint32 guidlow, Player *owner) { ASSERT(owner); + Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation()); + if(!IsPositionValid()) { sLog.outError("Corpse (guidlow %d, owner %s) not created. Suggested coordinates isn't valid (X: %f Y: %f)", guidlow, owner->GetName(), owner->GetPositionX(), owner->GetPositionY()); return false; } + //we need to assign owner's map for corpse //in other way we will get a crash in Corpse::SaveToDB() SetMap(owner->GetMap()); + WorldObject::_Create(guidlow, HIGHGUID_CORPSE, owner->GetPhaseMask()); + SetFloatValue( OBJECT_FIELD_SCALE_X, 1 ); SetUInt64Value( CORPSE_FIELD_OWNER, owner->GetGUID() ); + m_grid = Trinity::ComputeGridPair(GetPositionX(), GetPositionY()); + return true; } + void Corpse::SaveToDB() { // prevent DB data inconsistence problems and duplicates CharacterDatabase.BeginTransaction(); DeleteFromDB(); + std::ostringstream ss; ss << "INSERT INTO corpse (guid,player,position_x,position_y,position_z,orientation,zone,map,data,time,corpse_type,instance,phaseMask) VALUES (" << GetGUIDLow() << ", " @@ -105,17 +128,21 @@ void Corpse::SaveToDB() CharacterDatabase.Execute( ss.str().c_str() ); CharacterDatabase.CommitTransaction(); } + void Corpse::DeleteBonesFromWorld() { assert(GetType() == CORPSE_BONES); Corpse* corpse = ObjectAccessor::GetCorpse(*this, GetGUID()); + if (!corpse) { sLog.outError("Bones %u not found in world.", GetGUIDLow()); return; } + AddObjectToRemoveList(); } + void Corpse::DeleteFromDB() { if(GetType() == CORPSE_BONES) @@ -125,6 +152,7 @@ void Corpse::DeleteFromDB() // all corpses (not bones) CharacterDatabase.PExecute("DELETE FROM corpse WHERE player = '%d' AND corpse_type <> '0'", GUID_LOPART(GetOwnerGUID())); } + /* bool Corpse::LoadFromDB(uint32 guid, QueryResult *result, uint32 InstanceId) { @@ -132,22 +160,29 @@ bool Corpse::LoadFromDB(uint32 guid, QueryResult *result, uint32 InstanceId) if (!external) // 0 1 2 3 4 5 6 7 8 9 result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,data,time,corpse_type,instance,phaseMask FROM corpse WHERE guid = '%u'",guid); + if( !result ) { sLog.outError("Corpse (GUID: %u) not found in table `corpse`, can't load. ",guid); return false; } + Field *fields = result->Fetch(); + if(!LoadFromDB(guid, fields)) { if (!external) delete result; + return false; } + if (!external) delete result; + return true; }*/ + bool Corpse::LoadFromDB(uint32 guid, Field *fields) { // 0 1 2 3 4 5 6 7 8 9 @@ -157,39 +192,52 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields) float positionZ = fields[2].GetFloat(); float ort = fields[3].GetFloat(); uint32 mapid = fields[4].GetUInt32(); + Object::_Create(guid, 0, HIGHGUID_CORPSE); + if(!LoadValues( fields[5].GetString() )) { sLog.outError("Corpse #%d have broken data in `data` field. Can't be loaded.",guid); return false; } + m_time = time_t(fields[6].GetUInt64()); m_type = CorpseType(fields[7].GetUInt32()); + if(m_type >= MAX_CORPSE_TYPE) { sLog.outError("Corpse (guidlow %d, owner %d) have wrong corpse type, not load.",GetGUIDLow(),GUID_LOPART(GetOwnerGUID())); return false; } + if(m_type != CORPSE_BONES) m_isWorldObject = true; + uint32 instanceid = fields[8].GetUInt32(); + uint32 phaseMask = fields[9].GetUInt32(); + // overwrite possible wrong/corrupted guid SetUInt64Value(OBJECT_FIELD_GUID, MAKE_NEW_GUID(guid, 0, HIGHGUID_CORPSE)); + // place SetLocationInstanceId(instanceid); SetLocationMapId(mapid); SetPhaseMask(phaseMask, false); Relocate(positionX, positionY, positionZ, ort); + if(!IsPositionValid()) { sLog.outError("Corpse (guidlow %d, owner %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)", GetGUIDLow(), GUID_LOPART(GetOwnerGUID()), GetPositionX(), GetPositionY()); return false; } + m_grid = Trinity::ComputeGridPair(GetPositionX(), GetPositionY()); + return true; } + bool Corpse::isVisibleForInState(Player const* u, bool inVisibleList) const { return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u->m_seer, World::GetMaxVisibleDistanceForObject() + (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); |