249 std::shared_ptr<Window> window =
GetWindow(transaction->GetContainerId());
255 std::map<short, Slot> changed_slots;
262 transaction->GetSlotNum() == 0)
264 if (transaction->GetClickType() != 0 && transaction->GetClickType() != 1)
266 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
267 throw std::runtime_error(
"Non supported transaction type created");
270 if (transaction->GetButtonNum() != 0 && transaction->GetButtonNum() != 1)
272 LOG_ERROR(
"Transaction button num '" << transaction->GetButtonNum() <<
"' not supported.");
273 throw std::runtime_error(
"Non supported transaction button created");
276 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
289 carried_item = clicked_slot;
290 carried_item.SetItemCount(
cursor.GetItemCount() + clicked_slot.GetItemCount());
291 changed_slots[0] =
Slot();
294 Slot cloned_slot = window->GetSlot(i);
295 cloned_slot.SetItemCount(cloned_slot.GetItemCount() - 1);
296 changed_slots[i] = cloned_slot;
301 else if (transaction->GetSlotNum() == -999)
303 switch (transaction->GetClickType())
307 switch (transaction->GetButtonNum())
311 carried_item =
Slot();
317 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
329 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
330 throw std::runtime_error(
"Non supported transaction type created");
338 switch (transaction->GetClickType())
342 const Slot clicked_slot = window->GetSlot(transaction->GetSlotNum());
343 switch (transaction->GetButtonNum())
351 const int sum_count =
cursor.GetItemCount() + clicked_slot.GetItemCount();
354 carried_item = clicked_slot;
355 carried_item.SetItemCount(std::max(0, sum_count - max_stack_size));
357 changed_slots = { {transaction->GetSlotNum(),
cursor} };
358 changed_slots.at(transaction->GetSlotNum()).SetItemCount(std::min(max_stack_size, sum_count));
363 carried_item = clicked_slot;
365 changed_slots = { {transaction->GetSlotNum(),
cursor} };
374 const int new_quantity = clicked_slot.GetItemCount() / 2;
375 carried_item = clicked_slot;
376 carried_item.SetItemCount(clicked_slot.GetItemCount() - new_quantity);
377 changed_slots = { {transaction->GetSlotNum(), clicked_slot} };
378 changed_slots.at(transaction->GetSlotNum()).SetItemCount(new_quantity);
385 carried_item.SetItemCount(
cursor.GetItemCount() - 1);
387 changed_slots = { {transaction->GetSlotNum(),
cursor} };
388 changed_slots.at(transaction->GetSlotNum()).SetItemCount(1);
394 const bool transfer = clicked_slot.GetItemCount() < max_stack_size;
396 carried_item = clicked_slot;
397 carried_item.SetItemCount(transfer ?
cursor.GetItemCount() - 1 :
cursor.GetItemCount());
399 changed_slots = { {transaction->GetSlotNum(),
cursor} };
400 changed_slots.at(transaction->GetSlotNum()).SetItemCount(transfer ? clicked_slot.GetItemCount() + 1 : clicked_slot.GetItemCount());
406 carried_item = clicked_slot;
408 changed_slots = { {transaction->GetSlotNum(),
cursor} };
419 LOG_ERROR(
"Transaction type '" << transaction->GetClickType() <<
"' not implemented.");
420 throw std::runtime_error(
"Non supported transaction type created");
426#if PROTOCOL_VERSION > 754
427 transaction->SetCarriedItem(carried_item);
428 transaction->SetChangedSlots(changed_slots);
429#if PROTOCOL_VERSION > 755
430 transaction->SetStateId(window->GetStateId());
433 transaction->SetCarriedItem(window->GetSlot(transaction->GetSlotNum()));
434 output.changed_slots = changed_slots;
435 output.carried_item = carried_item;
437 transaction->SetUid(window->GetNextTransactionId());