SHOW:
|
|
- or go back to the newest paste.
1 | - | void WorldSession::SendListInventory(uint64 vendorGuid, uint32 vendorEntry) |
1 | + | std::vector<uint32> vendorItems = { |
2 | 25, | |
3 | 25, | |
4 | 25, | |
5 | - | Creature* vendor = GetPlayer()->GetNPCIfCanInteractWith(vendorGuid, UNIT_NPC_FLAG_VENDOR); |
5 | + | }; |
6 | ||
7 | void SendListInventoryCustom(Player* player, uint64 vendorGuid, uint32 vendorEntry) | |
8 | { | |
9 | - | _player->SendSellError(SELL_ERR_CANT_FIND_VENDOR, NULL, 0); |
9 | + | |
10 | ||
11 | Creature* vendor = player->GetNPCIfCanInteractWith(vendorGuid, UNIT_NPC_FLAG_VENDOR); | |
12 | if (!vendor) | |
13 | { | |
14 | - | if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) |
14 | + | |
15 | - | GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); |
15 | + | player->SendSellError(SELL_ERR_CANT_FIND_VENDOR, NULL, 0); |
16 | return; | |
17 | } | |
18 | ||
19 | // remove fake death | |
20 | if (player->HasUnitState(UNIT_STATE_DIED)) | |
21 | player->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); | |
22 | - | //VendorItemData const* items = vendorEntry ? sObjectMgr->GetNpcVendorItemList(vendorEntry) : vendor->GetVendorItems(); |
22 | + | |
23 | - | VendorItemData const* vendorItems = vendorEntry ? sObjectMgr->GetNpcVendorItemList(vendorEntry) : vendor->GetVendorItems(); |
23 | + | |
24 | - | /*if (!vendorItems) |
24 | + | |
25 | - | { |
25 | + | |
26 | - | WorldPacket data(SMSG_LIST_INVENTORY, 8 + 1 + 1);*/ |
26 | + | |
27 | - | uint16 rawItemCount = vendorItems ? vendorItems->GetItemCount() : 0; |
27 | + | |
28 | //VendorItemData const* items = vendorEntry ? sObjectMgr->GetNpcVendorItemList(vendorEntry) : vendor->GetVendorItems(); | |
29 | // VendorItemData const* vendorItems = vendorEntry ? sObjectMgr->GetNpcVendorItemList(vendorEntry) : vendor->GetVendorItems(); | |
30 | /*if (!vendorItems) | |
31 | { | |
32 | WorldPacket data(SMSG_LIST_INVENTORY, 8 + 1 + 1);*/ | |
33 | - | SetCurrentVendor(vendorEntry, GUID_LOPART(vendorGuid), GUID_HIPART(vendorGuid)); |
33 | + | uint16 rawItemCount = vendorItems.size(); // vendorItems ? vendorItems->GetItemCount() : 0; |
34 | ||
35 | - | const float discountMod = _player->GetReputationPriceDiscount(vendor); |
35 | + | |
36 | std::vector<bool> enablers; | |
37 | enablers.reserve(2 * rawItemCount); | |
38 | ||
39 | SetCurrentVendor(vendorEntry, GUID_LOPART(vendorGuid), GUID_HIPART(vendorGuid)); | |
40 | ||
41 | const float discountMod = player->GetReputationPriceDiscount(vendor); | |
42 | uint16 count = 0; | |
43 | for (uint16 slot = 0; slot < rawItemCount; ++slot) | |
44 | - | VendorItem const* vendorItem = vendorItems->GetItem(slot); |
44 | + | |
45 | - | if (!vendorItem) continue; |
45 | + | |
46 | { | |
47 | - | if (vendorItem->Type == ITEM_VENDOR_TYPE_ITEM) |
47 | + | |
48 | break; | |
49 | - | ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(vendorItem->item); |
49 | + | |
50 | // VendorItem const* vendorItem = vendorItems->GetItem(slot); | |
51 | // if (!vendorItem) continue; | |
52 | ||
53 | // if (vendorItem->Type == ITEM_VENDOR_TYPE_ITEM) | |
54 | - | if (!_player->isGameMaster()) // ignore conditions if GM on |
54 | + | |
55 | ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(vendorItems[slot]); | |
56 | if (!itemTemplate) | |
57 | - | if (!(itemTemplate->AllowableClass & _player->getClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP) |
57 | + | |
58 | ||
59 | /* | |
60 | uint32 leftInStock = !vendorItem->maxcount ? 0xFFFFFFFF : vendor->GetVendorItemCurrentCount(vendorItem); | |
61 | - | if ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && _player->GetTeam() == ALLIANCE) || |
61 | + | if (!player->isGameMaster()) // ignore conditions if GM on |
62 | - | (itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && _player->GetTeam() == HORDE)) |
62 | + | |
63 | // Respect allowed class | |
64 | if (!(itemTemplate->AllowableClass & player->getClassMask()) && itemTemplate->Bonding == BIND_WHEN_PICKED_UP) | |
65 | continue; | |
66 | ||
67 | // Only display items in vendor lists for the team the player is on | |
68 | if ((itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_HORDE_ONLY && player->GetTeam() == ALLIANCE) || | |
69 | (itemTemplate->Flags2 & ITEM_FLAGS_EXTRA_ALLIANCE_ONLY && player->GetTeam() == HORDE)) | |
70 | continue; | |
71 | - | if (!sConditionMgr->IsObjectMeetToConditions(_player, vendor, conditions)) |
71 | + | |
72 | // Items sold out are not displayed in list | |
73 | if (leftInStock == 0) | |
74 | continue; | |
75 | } | |
76 | ||
77 | ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(vendor->GetEntry(), vendorItem->item); | |
78 | if (!sConditionMgr->IsObjectMeetToConditions(player, vendor, conditions)) | |
79 | - | if (int32 priceMod = _player->GetTotalAuraModifier(SPELL_AURA_MOD_VENDOR_ITEMS_PRICES)) |
79 | + | |
80 | TC_LOG_DEBUG("condition", "SendListInventory: conditions not met for creature entry %u item %u", vendor->GetEntry(), vendorItem->item); | |
81 | continue; | |
82 | } | |
83 | ||
84 | int32 price = vendorItem->IsGoldRequired(itemTemplate) ? uint32(floor(itemTemplate->BuyPrice * discountMod)) : 0; | |
85 | ||
86 | if (int32 priceMod = player->GetTotalAuraModifier(SPELL_AURA_MOD_VENDOR_ITEMS_PRICES)) | |
87 | price -= CalculatePct(price, priceMod); | |
88 | */ | |
89 | ||
90 | ++count; | |
91 | itemsData << uint32(slot + 1); // client expects counting to start at 1 | |
92 | itemsData << uint32(itemTemplate->MaxDurability); | |
93 | ||
94 | /* | |
95 | if (vendorItem->ExtendedCost != 0) | |
96 | - | itemsData << uint32(vendorItem->Type); // 1 is items, 2 is currency |
96 | + | |
97 | - | itemsData << uint32(price); |
97 | + | |
98 | itemsData << uint32(vendorItem->ExtendedCost); | |
99 | } | |
100 | - | itemsData << int32(leftInStock); |
100 | + | |
101 | */ | |
102 | enablers.push_back(1); | |
103 | enablers.push_back(1); // unk bit | |
104 | ||
105 | itemsData << uint32(vendorItems[slot]); | |
106 | itemsData << uint32(1); // 1 is items, 2 is currency | |
107 | itemsData << uint32(0); | |
108 | itemsData << uint32(itemTemplate->DisplayInfoID); | |
109 | // if (!unk "enabler") data << uint32(something); | |
110 | itemsData << int32(0xFFFFFFFF); | |
111 | itemsData << uint32(itemTemplate->BuyCount); | |
112 | } | |
113 | /* | |
114 | else if (vendorItem->Type == ITEM_VENDOR_TYPE_CURRENCY) | |
115 | { | |
116 | CurrencyTypesEntry const* currencyTemplate = sCurrencyTypesStore.LookupEntry(vendorItem->item); | |
117 | if (!currencyTemplate) | |
118 | continue; | |
119 | ||
120 | if (vendorItem->ExtendedCost == 0) | |
121 | continue; // there's no price defined for currencies, only extendedcost is used | |
122 | ||
123 | ++count; | |
124 | itemsData << uint32(slot + 1); // client expects counting to start at 1 | |
125 | itemsData << uint32(0); // max durability | |
126 | ||
127 | if (vendorItem->ExtendedCost != 0) | |
128 | { | |
129 | enablers.push_back(0); | |
130 | itemsData << uint32(vendorItem->ExtendedCost); | |
131 | } | |
132 | else | |
133 | enablers.push_back(1); | |
134 | ||
135 | enablers.push_back(1); // unk bit | |
136 | ||
137 | itemsData << uint32(vendorItem->item); | |
138 | itemsData << uint32(vendorItem->Type); // 1 is items, 2 is currency | |
139 | itemsData << uint32(0); // price, only seen currency types that have Extended cost | |
140 | itemsData << uint32(0); // displayId | |
141 | // if (!unk "enabler") data << uint32(something); | |
142 | itemsData << int32(-1); | |
143 | itemsData << uint32(vendorItem->maxcount); | |
144 | } | |
145 | */ | |
146 | // else error | |
147 | } | |
148 | ||
149 | ObjectGuid guid = vendorGuid; | |
150 | ||
151 | WorldPacket data(SMSG_LIST_INVENTORY, 12 + itemsData.size()); | |
152 | ||
153 | data.WriteBit(guid[1]); | |
154 | data.WriteBit(guid[0]); | |
155 | ||
156 | data.WriteBits(count, 21); // item count | |
157 | ||
158 | data.WriteBit(guid[3]); | |
159 | data.WriteBit(guid[6]); | |
160 | data.WriteBit(guid[5]); | |
161 | data.WriteBit(guid[2]); | |
162 | data.WriteBit(guid[7]); | |
163 | ||
164 | for (std::vector<bool>::const_iterator itr = enablers.begin(); itr != enablers.end(); ++itr) | |
165 | data.WriteBit(*itr); | |
166 | ||
167 | data.WriteBit(guid[4]); | |
168 | ||
169 | data.FlushBits(); | |
170 | data.append(itemsData); | |
171 | ||
172 | - | SendPacket(&data); |
172 | + | |
173 | data.WriteByteSeq(guid[4]); | |
174 | data.WriteByteSeq(guid[1]); | |
175 | data.WriteByteSeq(guid[0]); | |
176 | data.WriteByteSeq(guid[6]); | |
177 | ||
178 | data << uint8(count == 0); // unk byte, item count 0: 1, item count != 0: 0 or some "random" value below 300 | |
179 | ||
180 | data.WriteByteSeq(guid[2]); | |
181 | data.WriteByteSeq(guid[3]); | |
182 | data.WriteByteSeq(guid[7]); | |
183 | ||
184 | player->GetSession()->SendPacket(&data); | |
185 | } |