void WorldSession::SendInnkeeperBind(Creature* pCreature) { if(!_player->IsInWorld()) return; WorldPacket data; if(!_player->bHasBindDialogOpen) { data.Initialize(SMSG_GOSSIP_COMPLETE); SendPacket(&data); data.Initialize(SMSG_BINDER_CONFIRM); data << pCreature->GetGUID() << _player->GetZoneId(); SendPacket(&data); _player->bHasBindDialogOpen = true; return; } // Add a hearthstone if they don't have one if(!_player->GetItemInterface()->GetItemCount(6948, true)) { // We don't have a hearthstone. Add one. if(_player->GetItemInterface()->CalculateFreeSlots(NULL) > 0) { /*data.Initialize(SMSG_ITEM_PUSH_RESULT); data.Initialize( SMSG_ITEM_PUSH_RESULT ); data << GetPlayer()->GetGUID(); data << uint32(0x01) << uint32(0x00) << uint32(0x01) << uint8(0xFF); data << uint32(6948) << uint64(0); SendPacket(&data);*/ BuildItemPushResult(&data, _player->GetGUID(), ITEM_PUSH_TYPE_RECEIVE, 1, 6948, 0); SendPacket(&data); Item *item = objmgr.CreateItem( 6948, _player); _player->GetItemInterface()->AddItemToFreeSlot(item); } } _player->bHasBindDialogOpen = false; _player->SetBindPoint(_player->GetPositionX(),_player->GetPositionY(),_player->GetPositionZ(),_player->GetMapId(),_player->GetZoneId()); data.Initialize(SMSG_BINDPOINTUPDATE); data << _player->GetBindPositionX() << _player->GetBindPositionY() << _player->GetBindPositionZ() << _player->GetBindMapId() << _player->GetBindZoneId(); SendPacket( &data ); data.Initialize(SMSG_PLAYERBOUND); data << pCreature->GetGUID() << _player->GetBindZoneId(); SendPacket(&data); data.Initialize(SMSG_GOSSIP_COMPLETE); SendPacket(&data); #define BIND_SPELL_ID 3286 data.Initialize( SMSG_SPELL_START ); data << pCreature->GetNewGUID(); data << pCreature->GetNewGUID(); data << uint32(BIND_SPELL_ID); data << uint16(0); data << uint32(0); data << uint16(2); data << _player->GetGUID(); _player->SendMessageToSet(&data, true); data.Initialize( SMSG_SPELL_GO ); data << pCreature->GetNewGUID(); data << pCreature->GetNewGUID(); data << uint32(BIND_SPELL_ID); // spellID data << uint8(0) << uint8(1); // flags data << uint8(1); // amount of targets data << _player->GetGUID(); data << uint8(0); data << uint16(2); data << _player->GetGUID(); _player->SendMessageToSet( &data, true ); }
void WorldSession::HandleAutostoreLootItemOpcode( WorldPacket & recv_data ) { if(!_player->IsInWorld()) return; // uint8 slot = 0; uint32 itemid = 0; uint32 amt = 1; uint8 lootSlot = 0; uint8 error = 0; SlotResult slotresult; Item *add; Loot *pLoot = NULL; if(_player->isCasting()) _player->InterruptSpell(); GameObject * pGO = NULL; Creature * pCreature = NULL; if(UINT32_LOPART(GUID_HIPART(GetPlayer()->GetLootGUID())) == HIGHGUID_UNIT) { pCreature = _player->GetMapMgr()->GetCreature((uint32)GetPlayer()->GetLootGUID()); if (!pCreature)return; pLoot=&pCreature->loot; } else if(UINT32_LOPART(GUID_HIPART(_player->GetLootGUID())) == HIGHGUID_GAMEOBJECT) { pGO = _player->GetMapMgr()->GetGameObject((uint32)GetPlayer()->GetLootGUID()); if(!pGO)return; pLoot=&pGO->loot; }else if( (UINT32_LOPART(GUID_HIPART(_player->GetLootGUID())) == HIGHGUID_ITEM) ) { Item *pItem = _player->GetItemInterface()->GetItemByGUID(_player->GetLootGUID()); if(!pItem) return; pLoot = pItem->loot; } if(!pLoot) return; recv_data >> lootSlot; if (lootSlot >= pLoot->items.size()) { sLog.outDebug("AutoLootItem: Player %s might be using a hack! (slot %d, size %d)", GetPlayer()->GetName(), lootSlot, pLoot->items.size()); return; } amt = pLoot->items.at(lootSlot).iItemsCount; if (!amt)//Test for party loot { GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL,INV_ERR_ALREADY_LOOTED); return; } itemid = pLoot->items.at(lootSlot).item.itemid; ItemPrototype* it = ItemPrototypeStorage.LookupEntry(itemid); if((error = _player->GetItemInterface()->CanReceiveItem(it, 1))) { _player->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, error); return; } if(pGO) CALL_GO_SCRIPT_EVENT(pGO, OnLootTaken)(_player, it); else if(pCreature) CALL_SCRIPT_EVENT(pCreature, OnLootTaken)(_player, it); add = GetPlayer()->GetItemInterface()->FindItemLessMax(itemid, amt, false); sHookInterface.OnLoot(_player, pCreature, 0, itemid); if (!add) { slotresult = GetPlayer()->GetItemInterface()->FindFreeInventorySlot(it); if(!slotresult.Result) { GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_INVENTORY_FULL); return; } sLog.outDebug("AutoLootItem MISC"); Item *item = objmgr.CreateItem( itemid, GetPlayer()); item->SetUInt32Value(ITEM_FIELD_STACK_COUNT,amt); uint32 rndprop=pLoot->items.at(lootSlot).iRandomProperty; if(rndprop) item->SetUInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID,rndprop); item->ApplyRandomProperties(); GetPlayer()->GetItemInterface()->SafeAddItem(item,slotresult.ContainerSlot, slotresult.Slot); if (it->Class == 12) // Quest item sQuestMgr.OnPlayerItemPickup(GetPlayer(),item); } else { add->SetCount(add->GetUInt32Value(ITEM_FIELD_STACK_COUNT) + amt); add->m_isDirty = true; if (it->Class == 12) // Quest item sQuestMgr.OnPlayerItemPickup(GetPlayer(),add); } pLoot->items.at(lootSlot).iItemsCount=0; // this gets sent to all looters WorldPacket data(1); data.SetOpcode(SMSG_LOOT_REMOVED); data << lootSlot; Player * plr; for(LooterSet::iterator itr = pLoot->looters.begin(); itr != pLoot->looters.end(); ++itr) { if((plr = _player->GetMapMgr()->GetPlayer(*itr))) plr->GetSession()->SendPacket(&data); } WorldPacket idata; if(it->Class == ITEM_CLASS_QUEST) { uint32 pcount = _player->GetItemInterface()->GetItemCount(it->ItemId, true); BuildItemPushResult(&idata, _player->GetGUID(), ITEM_PUSH_TYPE_LOOT, amt, itemid, pLoot->items.at(lootSlot).iRandomProperty,0xFF,0,0xFFFFFFFF,pcount); } else BuildItemPushResult(&idata, _player->GetGUID(), ITEM_PUSH_TYPE_LOOT, amt, itemid, pLoot->items.at(lootSlot).iRandomProperty); if(_player->InGroup()) _player->GetGroup()->SendPacketToAll(&idata); else SendPacket(&idata); }