261 std::shared_ptr<Window> window =
GetWindow(transaction->GetContainerId());
267 std::map<short, Slot> changed_slots;
274 transaction->GetSlotNum() == 0)
276#if PROTOCOL_VERSION < 775
277 if (transaction->GetClickType() != 0 && transaction->GetClickType() != 1)
279 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
280 throw std::runtime_error(
"Non supported transaction type created");
283 if (transaction->GetContainerInput() != 0 && transaction->GetContainerInput() != 1)
285 LOG_ERROR(
"Transaction type '" << transaction->GetContainerInput() <<
"' not implemented.");
286 throw std::runtime_error(
"Non supported transaction type created");
290 if (transaction->GetButtonNum() != 0 && transaction->GetButtonNum() != 1)
292 LOG_ERROR(
"Transaction button num '" << transaction->GetButtonNum() <<
"' not supported.");
293 throw std::runtime_error(
"Non supported transaction button created");
296 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
309 carried_item = clicked_slot;
310 carried_item.SetItemCount(
cursor.GetItemCount() + clicked_slot.GetItemCount());
311 changed_slots[0] =
Slot();
314 Slot cloned_slot = window->GetSlot(i);
315 cloned_slot.SetItemCount(cloned_slot.GetItemCount() - 1);
316 changed_slots[i] = cloned_slot;
321 else if (transaction->GetSlotNum() == -999)
323#if PROTOCOL_VERSION < 775
324 switch (transaction->GetClickType())
326 switch (transaction->GetContainerInput())
331 switch (transaction->GetButtonNum())
335 carried_item =
Slot();
341 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
353#if PROTOCOL_VERSION < 775
354 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
356 LOG_ERROR(
"Transaction type '" << transaction->GetContainerInput() <<
"' not implemented.");
358 throw std::runtime_error(
"Non supported transaction type created");
366#if PROTOCOL_VERSION < 775
367 switch (transaction->GetClickType())
369 switch (transaction->GetContainerInput())
374 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
375 switch (transaction->GetButtonNum())
383 const int sum_count =
cursor.GetItemCount() + clicked_slot.GetItemCount();
386 carried_item = clicked_slot;
387 carried_item.SetItemCount(std::max(0, sum_count - max_stack_size));
389 changed_slots = { {transaction->GetSlotNum(),
cursor} };
390 changed_slots.at(transaction->GetSlotNum()).SetItemCount(std::min(max_stack_size, sum_count));
395 carried_item = clicked_slot;
397 changed_slots = { {transaction->GetSlotNum(),
cursor} };
406 const int new_quantity = clicked_slot.GetItemCount() / 2;
407 carried_item = clicked_slot;
408 carried_item.SetItemCount(clicked_slot.GetItemCount() - new_quantity);
409 changed_slots = { {transaction->GetSlotNum(), clicked_slot} };
410 changed_slots.at(transaction->GetSlotNum()).SetItemCount(new_quantity);
417 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
419 changed_slots = { {transaction->GetSlotNum(),
cursor} };
420 changed_slots.at(transaction->GetSlotNum()).SetItemCount(1);
426 const bool transfer = clicked_slot.GetItemCount() < max_stack_size;
428 carried_item = clicked_slot;
429 carried_item.SetItemCount(transfer ?
cursor.GetItemCount() - 1 :
cursor.GetItemCount());
431 changed_slots = { {transaction->GetSlotNum(),
cursor} };
432 changed_slots.at(transaction->GetSlotNum()).SetItemCount(transfer ? clicked_slot.GetItemCount() + 1 : clicked_slot.GetItemCount());
438 carried_item = clicked_slot;
440 changed_slots = { {transaction->GetSlotNum(),
cursor} };
451#if PROTOCOL_VERSION < 775
452 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
454 LOG_ERROR(
"Transaction type '" << transaction->GetContainerInput() <<
"' not implemented.");
456 throw std::runtime_error(
"Non supported transaction type created");
462#if PROTOCOL_VERSION < 755
463 transaction->SetCarriedItem(window->GetSlot(transaction->GetSlotNum()));
464 output.changed_slots = changed_slots;
465 output.carried_item = carried_item;
467 transaction->SetUid(window->GetNextTransactionId());
468#elif PROTOCOL_VERSION < 770
469 transaction->SetCarriedItem(carried_item);
470 transaction->SetChangedSlots(changed_slots);
471#if PROTOCOL_VERSION > 755
472 transaction->SetStateId(window->GetStateId());
475 transaction->SetCarriedItem(
static_cast<HashedSlot>(carried_item));
476 std::map<short, HashedSlot> hashed_changed_slots;
477 for (
const auto& [k, v] : changed_slots)
479 hashed_changed_slots[k] =
static_cast<HashedSlot>(v);
481 transaction->SetChangedSlots(hashed_changed_slots);
482 transaction->SetStateId(window->GetStateId());
484 output.changed_slots = changed_slots;
485 output.carried_item = carried_item;