mirror of
https://github.com/mangosfour/server.git
synced 2025-12-17 07:37:03 +00:00
[6882] Make corpse erase async.
This commit is contained in:
parent
4df03b8561
commit
e81af0b739
2 changed files with 42 additions and 39 deletions
|
|
@ -29,49 +29,52 @@
|
||||||
#include "ObjectDefines.h"
|
#include "ObjectDefines.h"
|
||||||
#include "Corpse.h"
|
#include "Corpse.h"
|
||||||
|
|
||||||
|
static void CorpsesEraseCallBack(QueryResult *result, bool bones)
|
||||||
|
{
|
||||||
|
if(!result)
|
||||||
|
return;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Field *fields = result->Fetch();
|
||||||
|
uint32 guidlow = fields[0].GetUInt32();
|
||||||
|
float positionX = fields[1].GetFloat();
|
||||||
|
float positionY = fields[2].GetFloat();
|
||||||
|
uint32 mapid = fields[3].GetUInt32();
|
||||||
|
uint64 player_guid = MAKE_NEW_GUID(fields[4].GetUInt32(), 0, HIGHGUID_PLAYER);
|
||||||
|
|
||||||
|
uint64 guid = MAKE_NEW_GUID(guidlow, 0, HIGHGUID_CORPSE);
|
||||||
|
|
||||||
|
sLog.outDebug("[Global event] Removing %s %u (X:%f Y:%f Map:%u).",(bones?"bones":"corpse"),guidlow,positionX,positionY,mapid);
|
||||||
|
|
||||||
|
/// Resurrectable - convert corpses to bones
|
||||||
|
if(!bones)
|
||||||
|
{
|
||||||
|
if(!ObjectAccessor::Instance().ConvertCorpseForPlayer(player_guid))
|
||||||
|
{
|
||||||
|
sLog.outDebug("Corpse %u not found in world. Delete from DB.",guidlow);
|
||||||
|
CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
///- or delete bones
|
||||||
|
{
|
||||||
|
MapManager::Instance().RemoveBonesFromMap(mapid, guid, positionX, positionY);
|
||||||
|
|
||||||
|
///- remove bones from the database
|
||||||
|
CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow);
|
||||||
|
}
|
||||||
|
} while (result->NextRow());
|
||||||
|
|
||||||
|
delete result;
|
||||||
|
}
|
||||||
|
|
||||||
/// Handle periodic erase of corpses and bones
|
/// Handle periodic erase of corpses and bones
|
||||||
static void CorpsesErase(bool bones,uint32 delay)
|
static void CorpsesErase(bool bones,uint32 delay)
|
||||||
{
|
{
|
||||||
///- Get the list of eligible corpses/bones to be removed
|
///- Get the list of eligible corpses/bones to be removed
|
||||||
//No SQL injection (uint32 and enum)
|
//No SQL injection (uint32 and enum)
|
||||||
QueryResult *result = CharacterDatabase.PQuery("SELECT guid,position_x,position_y,map,player FROM corpse WHERE UNIX_TIMESTAMP()-time > '%u' AND corpse_type %s '0'", delay, (bones ? "=" : "<>") );
|
CharacterDatabase.AsyncPQuery(&CorpsesEraseCallBack, bones, "SELECT guid,position_x,position_y,map,player FROM corpse WHERE UNIX_TIMESTAMP()-time > '%u' AND corpse_type %s '0'", delay, (bones ? "=" : "<>"));
|
||||||
|
|
||||||
if(result)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
Field *fields = result->Fetch();
|
|
||||||
uint32 guidlow = fields[0].GetUInt32();
|
|
||||||
float positionX = fields[1].GetFloat();
|
|
||||||
float positionY = fields[2].GetFloat();
|
|
||||||
uint32 mapid = fields[3].GetUInt32();
|
|
||||||
uint64 player_guid = MAKE_NEW_GUID(fields[4].GetUInt32(), 0, HIGHGUID_PLAYER);
|
|
||||||
|
|
||||||
uint64 guid = MAKE_NEW_GUID(guidlow, 0, HIGHGUID_CORPSE);
|
|
||||||
|
|
||||||
sLog.outDebug("[Global event] Removing %s %u (X:%f Y:%f Map:%u).",(bones?"bones":"corpse"),guidlow,positionX,positionY,mapid);
|
|
||||||
|
|
||||||
/// Resurrectable - convert corpses to bones
|
|
||||||
if(!bones)
|
|
||||||
{
|
|
||||||
if(!ObjectAccessor::Instance().ConvertCorpseForPlayer(player_guid))
|
|
||||||
{
|
|
||||||
sLog.outDebug("Corpse %u not found in world. Delete from DB.",guidlow);
|
|
||||||
CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
///- or delete bones
|
|
||||||
{
|
|
||||||
MapManager::Instance().RemoveBonesFromMap(mapid, guid, positionX, positionY);
|
|
||||||
|
|
||||||
///- remove bones from the database
|
|
||||||
CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow);
|
|
||||||
}
|
|
||||||
} while (result->NextRow());
|
|
||||||
|
|
||||||
delete result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// not thread guarded variant for call from other thread
|
/// not thread guarded variant for call from other thread
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "6881"
|
#define REVISION_NR "6882"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue