I'm really not sure why, or how, this is happening, but i would say, 1 out of every 50 deaths result in the player being in a mix of dead and alive. They can cast spells, but they can't do melee damage (hunters shots count as melee), they can't move, but they can blink/charge, they have ~100-200hp and are about to die when it happens. With a patch for instant respawn in FFA a selected zone, there are about 2-4 deaths per second when I have about 70 players online so this is happening alot, the only way to fix the player is to revive them as a GM, or the player can relog and they are back to normal. Sometimes a sheep, or hex will also take them out of the phase of dead and alive.
This has also happened once to a player in the arena, where the Avoid GY check doesn't even get ran, so thats leading me to think its not 100% my code, maybe my code is causing it to happen alot more though, not sure.
I think it might have something to do with this file, but I'm not sure. These are the edits I have made to player.cpp:
http://bphelpsen.pastebin.com/f452a5a76
I think its happening in "void Player::RepopAtGraveyard()" but i have looked over it and can't seem to find what might cause it.
void Player::RepopAtGraveyard()
{
// note: this can be called also when the player is alive
// for example from WorldSession::HandleMovementOpcodes
AreaTableEntry const *zone = GetAreaEntryByAreaID(GetAreaId());
// Such zones are considered unreachable as a ghost and the player must be automatically revived
if ((!isAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) || GetTransport())
{
ResurrectPlayer(0.5f);
SpawnCorpseBones();
}
WorldSafeLocsEntry const *ClosestGrave = NULL;
// Special handle for battleground maps
if( BattleGround *bg = GetBattleGround() )
ClosestGrave = bg->GetClosestGraveYard(this);
else
ClosestGrave = sObjectMgr.GetClosestGraveYard( GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam() );
// stop countdown until repop
m_deathTimer = 0;
// !-Phelps
// Custom Avoid GY Checks
// this matches player being in Dire Maul - The Maul (FFA-PvP)
if (sMapMgr.GetZoneId(GetMapId(),GetPositionX(),GetPositionY(),GetPositionZ()) == 2557){
TeleportTo(1, -3761.428223, 1137.259277, 131.261383, 4.729075);
ResurrectPlayer(1.0f);
UninviteFromGroup();
SpawnCorpseBones();
//RemoveArenaSpellCooldowns(); - too much burst for everyone in ffa
}
// match player in Circle of Blood and send to proper faction base
else if (sMapMgr.GetZoneId(GetMapId(),GetPositionX(),GetPositionY(),GetPositionZ()) == 3522){
switch (GetTeam()) {
case HORDE:
TeleportTo(530, 2907.686, 5973.359, 2.200, 4.050);
break;
case ALLIANCE:
TeleportTo(530, 2771.037, 5884.949, 2.726, 0.937);
break;
default:
TeleportTo(530, 2838.707, 5928.274, 0.892, 5.606);
break;
}
ResurrectPlayer(1.0f);
SpawnCorpseBones();
}
// if no grave found, and not in a custom GY zone, stay at the current location
// and don't show spirit healer location
if(ClosestGrave)
{
TeleportTo(ClosestGrave->map_id, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation());
if(isDead()) // not send if alive, because it used in TeleportTo()
{
WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // show spirit healer position on minimap
data << ClosestGrave->map_id;
data << ClosestGrave->x;
data << ClosestGrave->y;
data << ClosestGrave->z;
GetSession()->SendPacket(&data);
}
}
}