Пример #1
0
void WorldSession::HandleAddDynamicTargetOpcode(WorldPacket & recvPacket)
{
	uint64 guid;
	uint32 spellid;
	uint32 flags;
	recvPacket >> guid >> spellid >> flags;
	
	SpellEntry * sp = dbcSpell.LookupEntryForced(spellid);
	if ( !sp ) 
		return;
	// Summoned Elemental's Freeze
    if (spellid == 33395)
    {
        if (!_player->m_Summon)
            return;
    }
    else if ( guid != _player->m_CurrentCharm )
    {
        return;
    }
	
	/* burlex: this is.. strange */
	SpellCastTargets targets;
	targets.m_targetMask = flags;

	if(flags == 0)
		targets.m_unitTarget = guid;
	else if(flags & TARGET_FLAG_UNIT)
	{
		WoWGuid guid;
//		recvPacket >> flags;		// skip one byte
		recvPacket >> guid;
		targets.m_unitTarget = guid.GetOldGuid();
	}
Пример #2
0
void WorldSession::HandleEquipmentSetSave(WorldPacket& data)
{
    CHECK_INWORLD_RETURN LOG_DEBUG("Received CMSG_EQUIPMENT_SET_SAVE");

    WoWGuid GUID;
    uint32 setGUID;

    data >> GUID;

    setGUID = Arcemu::Util::GUID_LOPART(GUID.GetOldGuid());

    if (setGUID == 0)
        setGUID = objmgr.GenerateEquipmentSetID();

    Arcemu::EquipmentSet* set = new Arcemu::EquipmentSet();

    set->SetGUID = setGUID;

    data >> set->SetID;
    data >> set->SetName;
    data >> set->IconName;

    for (uint32 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
    {
        GUID.Clear();
        data >> GUID;
        set->ItemGUID[i] = Arcemu::Util::GUID_LOPART(GUID.GetOldGuid());
    }

    bool success;
    success = _player->GetItemInterface()->m_EquipmentSets.AddEquipmentSet(set->SetGUID, set);

    if (success)
    {
        LOG_DEBUG("Player %u successfully stored equipment set %u at slot %u ", _player->getGuidLow(), set->SetGUID, set->SetID);
        _player->SendEquipmentSetSaved(set->SetID, set->SetGUID);
    }
    else
    {
        LOG_DEBUG("Player %u couldn't store equipment set %u at slot %u ", _player->getGuidLow(), set->SetGUID, set->SetID);
    }
}
Пример #3
0
void WorldSession::HandleEquipmentSetDelete(WorldPacket& data)
{
    CHECK_INWORLD_RETURN LOG_DEBUG("Received CMSG_EQUIPMENT_SET_DELETE");

    WoWGuid setGUID;
    bool success;

    data >> setGUID;

    uint32 GUID = Arcemu::Util::GUID_LOPART(setGUID.GetOldGuid());

    success = _player->GetItemInterface()->m_EquipmentSets.DeleteEquipmentSet(GUID);

    if (success)
    {
        LOG_DEBUG("Equipmentset with GUID %u was successfully deleted.", GUID);
    }
    else
    {
        LOG_DEBUG("Equipmentset with GUID %u couldn't be deleted.", GUID);
    }

}
Пример #4
0
void WorldSession::HandleEquipmentSetUse(WorldPacket& data)
{
    CHECK_INWORLD_RETURN LOG_DEBUG("Received CMSG_EQUIPMENT_SET_USE");

    WoWGuid GUID;
    int8 SrcBagID;
    uint8 SrcSlotID;
    uint8 result = 0;

    for (int8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
    {
        uint64 ItemGUID = 0;

        GUID.Clear();

        data >> GUID;
        data >> SrcBagID;
        data >> SrcSlotID;

        ItemGUID = GUID.GetOldGuid();

        // Let's see if we even have this item
        auto item = _player->GetItemInterface()->GetItemByGUID(ItemGUID);
        if (item == nullptr)
        {
            // Nope we don't probably WPE hack :/
            result = 1;
            continue;
        }

        int8 dstslot = i;
        int8 dstbag = static_cast<int8>(INVALID_BACKPACK_SLOT);

        // This is the best case, we already have the item equipped
        if ((SrcBagID == dstbag) && (SrcSlotID == dstslot))
            continue;

        // Let's see if we have an item in the destination slot
        auto dstslotitem = _player->GetItemInterface()->GetInventoryItem(dstslot);

        if (dstslotitem == nullptr)
        {
            // we have no item equipped in the slot, so let's equip
            AddItemResult additemresult;
            int8 EquipError = _player->GetItemInterface()->CanEquipItemInSlot(dstbag, dstslot, item->getItemProperties(), false, false);
            if (EquipError == INV_ERR_OK)
            {
                dstslotitem = _player->GetItemInterface()->SafeRemoveAndRetreiveItemFromSlot(SrcBagID, SrcSlotID, false);
                additemresult = _player->GetItemInterface()->SafeAddItem(item, dstbag, dstslot);

                if (additemresult != ADD_ITEM_RESULT_OK)
                {
                    // We failed for w/e reason, so let's revert
                    auto check = _player->GetItemInterface()->SafeAddItem(item, SrcBagID, SrcSlotID);
                    if (!check)
                    {
                        LOG_ERROR("HandleEquipmentSetUse", "Error while adding item %u to player %s twice", item->getEntry(), _player->GetNameString());
                        result = 0;
                    }
                    else
                        result = 1;
                }
            }
            else
            {
                result = 1;
            }

        }
        else
        {
            // There is something equipped so we need to swap
            if (!_player->GetItemInterface()->SwapItems(INVALID_BACKPACK_SLOT, dstslot, SrcBagID, SrcSlotID))
                result = 1;
        }

    }

    _player->SendEquipmentSetUseResult(result);
}
Пример #5
0
void WorldSession::HandleChangeVehicleSeat( WorldPacket &recv_data ){
	if( _player->GetCurrentVehicle() == NULL )
		return;

	switch( recv_data.GetOpcode() ){
		case CMSG_REQUEST_VEHICLE_PREV_SEAT:
			_player->GetCurrentVehicle()->MovePassengerToPrevSeat( _player );
			break;

		case CMSG_REQUEST_VEHICLE_NEXT_SEAT:
			_player->GetCurrentVehicle()->MovePassengerToNextSeat( _player );
			break;

		// Used when switching from a normal seat to a controlling seat, or to an accessory
		case CMSG_REQUEST_VEHICLE_SWITCH_SEAT:{
			WoWGuid vehicle;
			uint8 seat = 0;
			
			recv_data >> vehicle;
			recv_data >> seat;

			if( vehicle.GetOldGuid() == _player->GetCurrentVehicle()->GetOwner()->GetGUID() ){
				_player->GetCurrentVehicle()->MovePassengerToSeat( _player, seat );
			}else{
				Unit *u = _player->GetMapMgr()->GetUnit( vehicle.GetOldGuid() );
				if( u == NULL )
					return;

				if( u->GetVehicleComponent() == NULL )
					return;

				// Has to be same vehicle, or an accessory of the vehicle
				if( _player->GetVehicleBase()->GetGUID() != u->GetVehicleBase()->GetGUID() )
					return;

				_player->GetCurrentVehicle()->EjectPassenger( _player );
				u->GetVehicleComponent()->AddPassengerToSeat( _player, seat );
			}

			break;}

	    // Used when switching from controlling seat to accessory, or from accessory to accessory
		case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE:{
			WoWGuid src_guid;
			WoWGuid dst_guid;
			uint8 seat = 0;			

			recv_data >> src_guid;
			
			Unit *src_vehicle = _player->GetMapMgr()->GetUnit( src_guid.GetOldGuid() );
			if( src_vehicle == NULL )
				return;
			if(_player->GetVehicleBase())
				ReadMovementInfo(recv_data, &_player->GetVehicleBase()->movement_info);
			recv_data >> dst_guid;
			recv_data >> seat;
			
			if( src_vehicle->GetVehicleComponent() == NULL )
				return;
			
			if( src_vehicle->GetGUID() != _player->GetCurrentVehicle()->GetOwner()->GetGUID() )
				return;
			
			Unit *dst_vehicle = _player->GetMapMgr()->GetUnit( dst_guid.GetOldGuid() );
			if( dst_vehicle == NULL )
				return;
			
			if( dst_vehicle->GetVehicleComponent() == NULL )
				return;
			
			if( src_vehicle->GetGUID() == dst_vehicle->GetGUID() ){
				src_vehicle->GetVehicleComponent()->MovePassengerToSeat( _player, seat );
			}else{
				// Has to be the same vehicle or an accessory of the vehicle
				if( src_vehicle->GetVehicleBase()->GetGUID() != dst_vehicle->GetVehicleBase()->GetGUID() )
					return;

				_player->GetCurrentVehicle()->EjectPassenger( _player );
				dst_vehicle->GetVehicleComponent()->AddPassengerToSeat( _player, seat );
			}

			break;}
	}
}
Пример #6
0
void WorldSession::HandleChangeVehicleSeat( WorldPacket &recv_data ){
	if( _player->GetCurrentVehicle() == NULL )
		return;

	switch( recv_data.GetOpcode() ){
		case CMSG_REQUEST_VEHICLE_PREV_SEAT:
			_player->GetCurrentVehicle()->MovePassengerToPrevSeat( _player );
			break;

		case CMSG_REQUEST_VEHICLE_NEXT_SEAT:
			_player->GetCurrentVehicle()->MovePassengerToNextSeat( _player );
			break;

		case CMSG_REQUEST_VEHICLE_SWITCH_SEAT:{
			WoWGuid vehicle;
			uint8 seat = 0;
			
			recv_data >> vehicle;
			recv_data >> seat;

			if( vehicle.GetOldGuid() == _player->GetCurrentVehicle()->GetOwner()->GetGUID() ){
				_player->GetCurrentVehicle()->MovePassengerToSeat( _player, seat );
			}else{
				Unit *u = _player->GetMapMgr()->GetUnit( vehicle.GetOldGuid() );
				if( u == NULL )
					return;

				if( u->GetVehicleComponent() == NULL )
					return;

				// We can only switch to accessory or back to the parent vehicle
				if( !_player->GetCurrentVehicle()->HasAccessoryWithGUID( vehicle.GetOldGuid() ) && 
					!u->GetVehicleComponent()->HasAccessoryWithGUID( _player->GetCurrentVehicle()->GetOwner()->GetGUID() ) )
					return;

				_player->GetCurrentVehicle()->EjectPassenger( _player );
				u->GetVehicleComponent()->AddPassengerToSeat( _player, seat );
			}

			break;}


		case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE:{
			WoWGuid src_guid;
			WoWGuid dst_guid;
			uint8 seat = 0;			
			MovementInfo mov;

			recv_data >> src_guid;
 			mov.init( recv_data );
			recv_data >> dst_guid;
			recv_data >> seat;
			
			Unit *src_vehicle = _player->GetMapMgr()->GetUnit( src_guid.GetOldGuid() );
			if( src_vehicle == NULL )
				return;
			
			if( src_vehicle->GetVehicleComponent() == NULL )
				return;
			
			if( src_vehicle->GetGUID() != _player->GetCurrentVehicle()->GetOwner()->GetGUID() )
				return;
			
			Unit *dst_vehicle = _player->GetMapMgr()->GetUnit( dst_guid.GetOldGuid() );
			if( dst_vehicle == NULL )
				return;
			
			if( dst_vehicle->GetVehicleComponent() == NULL )
				return;
			
			if( src_vehicle->GetGUID() == dst_vehicle->GetGUID() ){
				src_vehicle->GetVehicleComponent()->MovePassengerToSeat( _player, seat );
			}else{
				// We can only switch to accessory or back to parent vehicle
				if( !src_vehicle->GetVehicleComponent()->HasAccessoryWithGUID( dst_vehicle->GetGUID() ) && 
					!dst_vehicle->GetVehicleComponent()->HasAccessoryWithGUID( src_vehicle->GetGUID() ) )
					return;

				_player->GetCurrentVehicle()->EjectPassenger( _player );
				dst_vehicle->GetVehicleComponent()->AddPassengerToSeat( _player, seat );
			}

			break;}
	}
}