Esempio n. 1
0
bool ChatHandler::HandleKillCommand(const char *args, WorldSession *m_session)
{
    Unit* unit = getSelectedUnit(m_session);
    if(!unit)
        return true;

    sWorld.LogGM(m_session, "used kill command on %s %s", unit->IsPlayer() ? "Player" : "Creature", unit->GetName());

    if(unit->IsPlayer())
    {
        // If we're killing a player, send a message indicating a gm killed them.
        BlueSystemMessageToPlr(TO_PLAYER(unit), "%s killed you with a GM command.", m_session->GetPlayer()->GetName());
        TO_PLAYER(unit)->SetUInt32Value(UNIT_FIELD_HEALTH, 0); // Die, insect
        TO_PLAYER(unit)->KillPlayer();
        GreenSystemMessage(m_session, "Killed player %s.", unit->GetName());
    }
    else if(isTargetDummy(unit->GetEntry()))
        RedSystemMessage(m_session, "Target cannot be killed.");
    else
    {
        m_session->GetPlayer()->DealDamage(unit, 0xFFFFFFFF, 0, 0, 0);
        GreenSystemMessage(m_session, "Killed unit %s.", unit->GetName());
    }
    return true;
}
Esempio n. 2
0
/// Where we check if we object A can attack object B. This is used in many feature's
/// Including the spell class, the player class, and the AI interface class.
int intisAttackable(Object* objA, Object* objB, bool CheckStealth)// A can attack B?
{
	// can't attack self.. this causes problems with buffs if we don't have it :p
	if( !objA || !objB || objA == objB )
		return 0;

	// can't attack corpses neither...
	if( objA->GetTypeId() == TYPEID_CORPSE || objB->GetTypeId() == TYPEID_CORPSE )
		return 0;

	// Dead people can't attack anything.
	if( (objA->IsUnit() && !TO_UNIT(objA)->isAlive()) || (objB->IsUnit() && !TO_UNIT(objB)->isAlive()) )
		return 0;

	// Checks for untouchable, unattackable
	if( objA->IsUnit() && (objA->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_9) ||
		objA->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNTED_TAXI) || objA->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)))
		return 0;

	if( objB->IsUnit() && (objB->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_9) ||
		objB->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNTED_TAXI) || objB->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)))
		return 0;

	if(!objA->PhasedCanInteract(objB))
		return 0;

	// we cannot attack sheathed units. Maybe checked in other places too ?
	// !! warning, this presumes that objA is attacking ObjB
	if( CheckStealth && objB->IsUnit() && TO_UNIT(objB)->InStealth() )
		return 0;

	// Get players (or owners of pets/totems)
	Player* player_objA = GetPlayerFromObject(objA);
	Player* player_objB = GetPlayerFromObject(objB);
	if(objA->IsUnit() && objB->IsVehicle())
		if(TO_VEHICLE(objB)->GetPassengerSlot(TO_UNIT(objA)) != -1)
			return 0;
	else if(objB->IsUnit() && objA->IsVehicle())
		if(TO_VEHICLE(objA)->GetPassengerSlot(TO_UNIT(objB)) != -1)
			return 0;

	// Disable GM attacking.
	if(player_objA && player_objB && player_objA->bGMTagOn)
		return -1;

	// Disable GM attacking.
	if(player_objA && !player_objB && player_objA->bGMTagOn)
		return -1;

	// Don't allow players to attack GMs
	if(player_objA && player_objB && player_objB->bGMTagOn)
		return -1;

	// Creatures cannot attack a GM with tag on.
	if(!player_objA && player_objB && player_objB->bGMTagOn)
		return -1;

	if(objA->IsCreature() && isTargetDummy(objA->GetEntry()))
		return 0; // Bwahahaha

	if( player_objA && player_objB )
	{
		if(player_objA->DuelingWith == player_objB && player_objA->GetDuelState() == DUEL_STATE_STARTED )
			return 1;
	}
	else if(player_objA)
	{
		if(objB->IsPet() && TO_PET(objB)->GetOwner() == player_objA && player_objA->DuelingWith == player_objB)
			return 1;
	}
	else if(player_objB)
	{
		if(objA->IsPet() && TO_PET(objA)->GetOwner() == player_objB && player_objB->DuelingWith == player_objA)
			return 1;
	}
	else if(player_objA == NULL && player_objB == NULL) // Ignore players, we have critters in sanctuaries
	{
		// Do not let units attack each other in sanctuary
		// We know they aren't dueling
		if( (objA->GetAreaID() && sWorld.IsSanctuaryArea(objA->GetAreaID()))
			|| objB->GetAreaID() && sWorld.IsSanctuaryArea(objB->GetAreaID()))
			return 0;

		if(sWorld.FunServerMall != -1 && (objA->GetAreaID() == (uint32)sWorld.FunServerMall
			|| objB->GetAreaID() == (uint32)sWorld.FunServerMall))
			return 0;
	}

	if(objA->IsCreature())
	{
		if(objA->IsPet())
		{
			if(player_objB)
			{
				if(TO_PET(objA)->GetOwner())
				{
					if(TO_PET(objA)->GetOwner()->IsPvPFlagged() && !player_objB->IsPvPFlagged())
						return 0;
					if(!TO_PET(objA)->GetOwner()->IsPvPFlagged() && !player_objB->IsPvPFlagged())
						return 0;
					// the target is PvP, its okay.
				}
				else
					return 0;
			}
		}
		else if(TO_CREATURE(objA)->IsTotem())
		{
			if(player_objB)
			{
				if(TO_CREATURE(objA)->GetSummonOwner())
				{
					if(TO_PET(objA)->GetSummonOwner()->IsPvPFlagged() && !player_objB->IsPvPFlagged())
						return 0;
					if(!TO_PET(objA)->GetSummonOwner()->IsPvPFlagged() && !player_objB->IsPvPFlagged())
						return 0;
					// the target is PvP, its okay.
				}
				else
					return 0;
			}
		}
	}

	// We do need all factiondata for this
	if( objB->m_factionDBC == NULL || objA->m_factionDBC == NULL || objB->m_faction == NULL || objA->m_faction == NULL
		|| (((objA->IsPlayer() && !TO_PLAYER(objA)->IsFFAPvPFlagged()) ? true : false)
		&&  ((objB->IsPlayer() && !TO_PLAYER(objB)->IsFFAPvPFlagged()) ? true : false)
		&& (objB->m_factionDBC == objA->m_factionDBC || objB->m_faction == objA->m_faction)))
		return 0;

	if( player_objA && player_objB )
	{
		if(sWorld.FunServerMall != -1 && (player_objA->GetAreaID() == (uint32)sWorld.FunServerMall
			|| player_objB->GetAreaID() == (uint32)sWorld.FunServerMall))
			return 0;

		if(player_objA->IsPvPFlagged() && !player_objB->IsPvPFlagged() && player_objA->DuelingWith != player_objB)
			return 0;
		if(!player_objA->IsPvPFlagged() && !player_objB->IsPvPFlagged() && player_objA->DuelingWith != player_objB)
			return 0;

		//These area's are sanctuaries
		if( sWorld.IsSanctuaryArea(player_objA->GetPlayerAreaID()) || sWorld.IsSanctuaryArea(player_objB->GetPlayerAreaID()) )
			return 0;

		// Players with feign death flags can't be attacked
		// But they can be attacked by another players. -- Dvlpr
		// WARNING: This presumes, that objA attacks objb!!!
		if( (objA->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH) || objB->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH)) && !objA->IsPlayer() )
			return 0;

		//Handle BG's
		if( player_objA->m_bg != NULL)
		{
			//Handle ffa_PVP
			if( player_objA->HasFlag(PLAYER_FLAGS,PLAYER_FLAG_FREE_FOR_ALL_PVP) && player_objA->HasFlag(PLAYER_FLAGS,PLAYER_FLAG_FREE_FOR_ALL_PVP))
			{
				if( player_objA->GetGroup() == player_objB->GetGroup() )
					return 0;
				else
					return 1;
			}
			//Handle Arenas
			if( player_objA->GetTeam() != player_objB->GetTeam() )
				return 1;
		}

		if(player_objA->IsFFAPvPFlagged() && player_objB->IsFFAPvPFlagged())
		{
			if( player_objA->GetGroup() && player_objA->GetGroup() == player_objB->GetGroup() )
				return 0;

			if( player_objA == player_objB ) // Totems...
				return 0;

			return 1;		// can hurt each other in FFA pvp
		}

		if( player_objA->GetAreaDBC() != NULL )
		{
			if( player_objA->GetAreaDBC()->AreaFlags & 0x800 )
				return 0;
		}

		return 1; // Skip the rest of this, it's all faction shit.
	}

	// same faction can't kill each other.
	if(objA->m_faction == objB->m_faction)
		return 0;

	// moved this from IsHostile();
	// by doing so we skip a hell of a lot redundant checks, which we already passed in this routine.
	uint32 faction = objB->m_faction->Mask;
	uint32 host = objA->m_faction->HostileMask;
	bool hostile = false;
	if(faction & host)
	{
		hostile = true;
		// check friend/enemy list
		for(uint32 i = 0; i < 4; i++)
		{
			if(objA->m_faction->EnemyFactions[i] == objB->m_faction->Faction)
				hostile = true;

			if(objA->m_faction->FriendlyFactions[i] == objB->m_faction->Faction)
				hostile = false;
		}
	}

	// Reputation System Checks
	if(player_objA)
	{
		if(objB->m_factionDBC->RepListId >= 0)
			hostile = player_objA->IsHostileBasedOnReputation( objB->m_factionDBC );

		if(hostile == false)
		{
			if(objB->m_factionDBC->RepListId == -1 && objB->m_faction->HostileMask == 0 && objB->m_faction->FriendlyMask == 0)
				hostile = true;

			if(player_objA->bGMTagOn)
				hostile = true;
		}
	}
	else if(player_objB)
	{
		if(objA->m_factionDBC->RepListId >= 0)
			hostile = player_objB->IsHostileBasedOnReputation( objA->m_factionDBC );

		if(hostile == false)
			if(objA->m_factionDBC->RepListId == -1 && objA->m_faction->HostileMask == 0 && objA->m_faction->FriendlyMask == 0)
				hostile = true;
	}

	return (hostile ? 1 : 0);
}