252 std::shared_ptr<Window> window =
GetWindow(transaction->GetContainerId());
258 std::map<short, Slot> changed_slots;
265 transaction->GetSlotNum() == 0)
267#if PROTOCOL_VERSION < 775
268 if (transaction->GetClickType() != 0 && transaction->GetClickType() != 1)
270 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
271 throw std::runtime_error(
"Non supported transaction type created");
274 if (transaction->GetContainerInput() != 0 && transaction->GetContainerInput() != 1)
276 LOG_ERROR(
"Transaction type '" << transaction->GetContainerInput() <<
"' not implemented.");
277 throw std::runtime_error(
"Non supported transaction type created");
281 if (transaction->GetButtonNum() != 0 && transaction->GetButtonNum() != 1)
283 LOG_ERROR(
"Transaction button num '" << transaction->GetButtonNum() <<
"' not supported.");
284 throw std::runtime_error(
"Non supported transaction button created");
287 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
300 carried_item = clicked_slot;
301 carried_item.SetItemCount(
cursor.GetItemCount() + clicked_slot.GetItemCount());
302 changed_slots[0] =
Slot();
305 Slot cloned_slot = window->GetSlot(i);
306 cloned_slot.SetItemCount(cloned_slot.GetItemCount() - 1);
307 changed_slots[i] = cloned_slot;
312 else if (transaction->GetSlotNum() == -999)
314#if PROTOCOL_VERSION < 775
315 switch (transaction->GetClickType())
317 switch (transaction->GetContainerInput())
322 switch (transaction->GetButtonNum())
326 carried_item =
Slot();
332 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
344#if PROTOCOL_VERSION < 775
345 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
347 LOG_ERROR(
"Transaction type '" << transaction->GetContainerInput() <<
"' not implemented.");
349 throw std::runtime_error(
"Non supported transaction type created");
357#if PROTOCOL_VERSION < 775
358 switch (transaction->GetClickType())
360 switch (transaction->GetContainerInput())
365 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
366 switch (transaction->GetButtonNum())
374 const int sum_count =
cursor.GetItemCount() + clicked_slot.GetItemCount();
377 carried_item = clicked_slot;
378 carried_item.SetItemCount(std::max(0, sum_count - max_stack_size));
380 changed_slots = { {transaction->GetSlotNum(),
cursor} };
381 changed_slots.at(transaction->GetSlotNum()).SetItemCount(std::min(max_stack_size, sum_count));
386 carried_item = clicked_slot;
388 changed_slots = { {transaction->GetSlotNum(),
cursor} };
397 const int new_quantity = clicked_slot.GetItemCount() / 2;
398 carried_item = clicked_slot;
399 carried_item.SetItemCount(clicked_slot.GetItemCount() - new_quantity);
400 changed_slots = { {transaction->GetSlotNum(), clicked_slot} };
401 changed_slots.at(transaction->GetSlotNum()).SetItemCount(new_quantity);
408 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
410 changed_slots = { {transaction->GetSlotNum(),
cursor} };
411 changed_slots.at(transaction->GetSlotNum()).SetItemCount(1);
417 const bool transfer = clicked_slot.GetItemCount() < max_stack_size;
419 carried_item = clicked_slot;
420 carried_item.SetItemCount(transfer ?
cursor.GetItemCount() - 1 :
cursor.GetItemCount());
422 changed_slots = { {transaction->GetSlotNum(),
cursor} };
423 changed_slots.at(transaction->GetSlotNum()).SetItemCount(transfer ? clicked_slot.GetItemCount() + 1 : clicked_slot.GetItemCount());
429 carried_item = clicked_slot;
431 changed_slots = { {transaction->GetSlotNum(),
cursor} };
442#if PROTOCOL_VERSION < 775
443 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
445 LOG_ERROR(
"Transaction type '" << transaction->GetContainerInput() <<
"' not implemented.");
447 throw std::runtime_error(
"Non supported transaction type created");
453#if PROTOCOL_VERSION < 755
454 transaction->SetCarriedItem(window->GetSlot(transaction->GetSlotNum()));
455 output.changed_slots = changed_slots;
456 output.carried_item = carried_item;
458 transaction->SetUid(window->GetNextTransactionId());
459#elif PROTOCOL_VERSION < 770
460 transaction->SetCarriedItem(carried_item);
461 transaction->SetChangedSlots(changed_slots);
462#if PROTOCOL_VERSION > 755
463 transaction->SetStateId(window->GetStateId());
466 transaction->SetCarriedItem(
static_cast<HashedSlot>(carried_item));
467 std::map<short, HashedSlot> hashed_changed_slots;
468 for (
const auto& [k, v] : changed_slots)
470 hashed_changed_slots[k] =
static_cast<HashedSlot>(v);
472 transaction->SetChangedSlots(hashed_changed_slots);
473 transaction->SetStateId(window->GetStateId());
475 output.changed_slots = changed_slots;
476 output.carried_item = carried_item;