252 std::shared_ptr<Window> window =
GetWindow(transaction->GetContainerId());
258 std::map<short, Slot> changed_slots;
265 transaction->GetSlotNum() == 0)
267 if (transaction->GetClickType() != 0 && transaction->GetClickType() != 1)
269 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
270 throw std::runtime_error(
"Non supported transaction type created");
273 if (transaction->GetButtonNum() != 0 && transaction->GetButtonNum() != 1)
275 LOG_ERROR(
"Transaction button num '" << transaction->GetButtonNum() <<
"' not supported.");
276 throw std::runtime_error(
"Non supported transaction button created");
279 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
292 carried_item = clicked_slot;
293 carried_item.SetItemCount(
cursor.GetItemCount() + clicked_slot.GetItemCount());
294 changed_slots[0] =
Slot();
297 Slot cloned_slot = window->GetSlot(i);
298 cloned_slot.SetItemCount(cloned_slot.GetItemCount() - 1);
299 changed_slots[i] = cloned_slot;
304 else if (transaction->GetSlotNum() == -999)
306 switch (transaction->GetClickType())
310 switch (transaction->GetButtonNum())
314 carried_item =
Slot();
320 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
332 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
333 throw std::runtime_error(
"Non supported transaction type created");
341 switch (transaction->GetClickType())
345 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
346 switch (transaction->GetButtonNum())
354 const int sum_count =
cursor.GetItemCount() + clicked_slot.GetItemCount();
357 carried_item = clicked_slot;
358 carried_item.SetItemCount(std::max(0, sum_count - max_stack_size));
360 changed_slots = { {transaction->GetSlotNum(),
cursor} };
361 changed_slots.at(transaction->GetSlotNum()).SetItemCount(std::min(max_stack_size, sum_count));
366 carried_item = clicked_slot;
368 changed_slots = { {transaction->GetSlotNum(),
cursor} };
377 const int new_quantity = clicked_slot.GetItemCount() / 2;
378 carried_item = clicked_slot;
379 carried_item.SetItemCount(clicked_slot.GetItemCount() - new_quantity);
380 changed_slots = { {transaction->GetSlotNum(), clicked_slot} };
381 changed_slots.at(transaction->GetSlotNum()).SetItemCount(new_quantity);
388 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
390 changed_slots = { {transaction->GetSlotNum(),
cursor} };
391 changed_slots.at(transaction->GetSlotNum()).SetItemCount(1);
397 const bool transfer = clicked_slot.GetItemCount() < max_stack_size;
399 carried_item = clicked_slot;
400 carried_item.SetItemCount(transfer ?
cursor.GetItemCount() - 1 :
cursor.GetItemCount());
402 changed_slots = { {transaction->GetSlotNum(),
cursor} };
403 changed_slots.at(transaction->GetSlotNum()).SetItemCount(transfer ? clicked_slot.GetItemCount() + 1 : clicked_slot.GetItemCount());
409 carried_item = clicked_slot;
411 changed_slots = { {transaction->GetSlotNum(),
cursor} };
422 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
423 throw std::runtime_error(
"Non supported transaction type created");
429#if PROTOCOL_VERSION < 755
430 transaction->SetCarriedItem(window->GetSlot(transaction->GetSlotNum()));
431 output.changed_slots = changed_slots;
432 output.carried_item = carried_item;
434 transaction->SetUid(window->GetNextTransactionId());
435#elif PROTOCOL_VERSION < 770
436 transaction->SetCarriedItem(carried_item);
437 transaction->SetChangedSlots(changed_slots);
438#if PROTOCOL_VERSION > 755
439 transaction->SetStateId(window->GetStateId());
442 transaction->SetCarriedItem(
static_cast<HashedSlot>(carried_item));
443 std::map<short, HashedSlot> hashed_changed_slots;
444 for (
const auto& [k, v] : changed_slots)
446 hashed_changed_slots[k] =
static_cast<HashedSlot>(v);
448 transaction->SetChangedSlots(hashed_changed_slots);
449 transaction->SetStateId(window->GetStateId());
451 output.changed_slots = changed_slots;
452 output.carried_item = carried_item;