Core/Player: Fixed interaction rules with dead creatures
This commit is contained in:
@@ -2649,18 +2649,7 @@ void Player::ResetAllPowers()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::CanInteractWithNPCs(bool alive) const
|
Creature* Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask)
|
||||||
{
|
|
||||||
if (alive && !isAlive())
|
|
||||||
return false;
|
|
||||||
if (isInFlight())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Creature*
|
|
||||||
Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask)
|
|
||||||
{
|
{
|
||||||
// unit checks
|
// unit checks
|
||||||
if (!guid)
|
if (!guid)
|
||||||
@@ -2669,43 +2658,46 @@ Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask)
|
|||||||
if (!IsInWorld())
|
if (!IsInWorld())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (isInFlight())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
// exist (we need look pets also for some interaction (quest/etc)
|
// exist (we need look pets also for some interaction (quest/etc)
|
||||||
Creature *unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*this,guid);
|
Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid);
|
||||||
if (!unit)
|
if (!creature)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// player check
|
// Deathstate checks
|
||||||
if (!CanInteractWithNPCs(!unit->isSpiritService()))
|
if (!isAlive() && !(creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_GHOST))
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// appropriate npc type
|
|
||||||
if (npcflagmask && !unit->HasFlag(UNIT_NPC_FLAGS, npcflagmask))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// alive or spirit healer
|
// alive or spirit healer
|
||||||
if (!unit->isAlive() && (!unit->isSpiritService() || isAlive()))
|
if (!creature->isAlive() && !(creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_DEAD_INTERACT))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
// appropriate npc type
|
||||||
|
if (npcflagmask && !creature->HasFlag(UNIT_NPC_FLAGS, npcflagmask))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// not allow interaction under control, but allow with own pets
|
// not allow interaction under control, but allow with own pets
|
||||||
if (unit->GetCharmerGUID())
|
if (creature->GetCharmerGUID())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// not enemy
|
// not enemy
|
||||||
if (unit->IsHostileTo(this))
|
if (creature->IsHostileTo(this))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// not unfriendly
|
// not unfriendly
|
||||||
if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(unit->getFaction()))
|
if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(creature->getFaction()))
|
||||||
if (factionTemplate->faction)
|
if (factionTemplate->faction)
|
||||||
if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
|
if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
|
||||||
if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
|
if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// not too far
|
// not too far
|
||||||
if (!unit->IsWithinDistInMap(this,INTERACTION_DISTANCE))
|
if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return unit;
|
return creature;
|
||||||
}
|
}
|
||||||
|
|
||||||
GameObject* Player::GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const
|
GameObject* Player::GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const
|
||||||
|
|||||||
@@ -1082,7 +1082,6 @@ class Player : public Unit, public GridObject<Player>
|
|||||||
void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time);
|
void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time);
|
||||||
|
|
||||||
Creature* GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask);
|
Creature* GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask);
|
||||||
bool CanInteractWithNPCs(bool alive = true) const;
|
|
||||||
GameObject* GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const;
|
GameObject* GetGameObjectIfCanInteractWith(uint64 guid, GameobjectTypes type) const;
|
||||||
|
|
||||||
bool ToggleAFK();
|
bool ToggleAFK();
|
||||||
|
|||||||
@@ -2154,7 +2154,7 @@ enum CreatureTypeFlags
|
|||||||
CREATURE_TYPEFLAGS_UNK5 = 0x000010,
|
CREATURE_TYPEFLAGS_UNK5 = 0x000010,
|
||||||
CREATURE_TYPEFLAGS_UNK6 = 0x000020,
|
CREATURE_TYPEFLAGS_UNK6 = 0x000020,
|
||||||
CREATURE_TYPEFLAGS_UNK7 = 0x000040,
|
CREATURE_TYPEFLAGS_UNK7 = 0x000040,
|
||||||
CREATURE_TYPEFLAGS_UNK8 = 0x000080,
|
CREATURE_TYPEFLAGS_DEAD_INTERACT = 0x000080, // Player can interact with the creature if its dead (not player dead)
|
||||||
CREATURE_TYPEFLAGS_HERBLOOT = 0x000100, // Can be looted by herbalist
|
CREATURE_TYPEFLAGS_HERBLOOT = 0x000100, // Can be looted by herbalist
|
||||||
CREATURE_TYPEFLAGS_MININGLOOT = 0x000200, // Can be looted by miner
|
CREATURE_TYPEFLAGS_MININGLOOT = 0x000200, // Can be looted by miner
|
||||||
CREATURE_TYPEFLAGS_UNK11 = 0x000400,
|
CREATURE_TYPEFLAGS_UNK11 = 0x000400,
|
||||||
|
|||||||
Reference in New Issue
Block a user