diff options
Diffstat (limited to '')
-rw-r--r-- | source/cWindow.cpp | 129 |
1 files changed, 70 insertions, 59 deletions
diff --git a/source/cWindow.cpp b/source/cWindow.cpp index a7eceac27..f3b4bc883 100644 --- a/source/cWindow.cpp +++ b/source/cWindow.cpp @@ -8,8 +8,8 @@ #include "cPickup.h" #include "cInventory.h" #include "cWindowOwner.h" +#include "items/Item.h" -#include "packets/cPacket_WindowClick.h" #include "packets/cPacket_WholeInventory.h" #include "packets/cPacket_WindowOpen.h" #include "packets/cPacket_WindowClose.h" @@ -84,11 +84,15 @@ cItem* cWindow::GetDraggingItem( cPlayer * a_Player /* = 0 */ ) -void cWindow::Clicked( cPacket_WindowClick* a_ClickPacket, cPlayer & a_Player ) +void cWindow::Clicked( + cPlayer & a_Player, + int a_WindowID, short a_SlotNum, bool a_IsRightClick, bool a_IsShiftPressed, + const cItem & a_HeldItem +) { - if (a_ClickPacket->m_WindowID != m_WindowID) + if (a_WindowID != m_WindowID) { - LOG("WRONG WINDOW ID! (exp %d, got %d)", m_WindowID, a_ClickPacket->m_WindowID); + LOG("WRONG WINDOW ID! (exp %d, got %d) received from \"%s\"", m_WindowID, a_WindowID, a_Player.GetName().c_str()); return; } @@ -101,111 +105,118 @@ void cWindow::Clicked( cPacket_WindowClick* a_ClickPacket, cPlayer & a_Player ) } } bool bAsync = false; - if (a_ClickPacket->m_SlotNum == -999) // Outside window click + if (a_SlotNum == -999) // Outside window click { - if (a_ClickPacket->m_RightMouse) + if (a_IsRightClick) { - a_Player.TossItem( true ); + a_Player.TossItem(true); } else { - a_Player.TossItem( true, m_DraggingItem->m_ItemCount ); + a_Player.TossItem(true, m_DraggingItem->m_ItemCount); } } - else if (GetSlot(a_ClickPacket->m_SlotNum) != NULL) + else if (GetSlot(a_SlotNum) != NULL) { - cItem * Item = GetSlot(a_ClickPacket->m_SlotNum); - if ( - (a_ClickPacket->m_ItemID != Item->m_ItemID) || - (a_ClickPacket->m_ItemCount != Item->m_ItemCount) || - (a_ClickPacket->m_ItemUses != Item->m_ItemHealth) - ) + cItem * Item = GetSlot(a_SlotNum); + if (!Item->IsEqual(a_HeldItem)) { - if (!((a_ClickPacket->m_ItemID == -1 || a_ClickPacket->m_ItemID == 0) && (Item->m_ItemID == -1 || Item->m_ItemID == 0 )) ) - { - LOGD("My ID: %i Their ID: %i", Item->m_ItemID, a_ClickPacket->m_ItemID ); - LOGD("My Count: %i Their Count: %i", Item->m_ItemCount, a_ClickPacket->m_ItemCount ); - LOGD("My Uses: %i Their Uses: %i", Item->m_ItemHealth, a_ClickPacket->m_ItemUses ); - bAsync = true; - } + LOGD("*** Window lost sync ***"); + LOGD("My Type: %i Their Type: %i", Item->m_ItemID, a_HeldItem.m_ItemID); + LOGD("My Count: %i Their Count: %i", Item->m_ItemCount, a_HeldItem.m_ItemCount); + LOGD("My Dmg: %i Their Dmg: %i", Item->m_ItemHealth, a_HeldItem.m_ItemHealth); + bAsync = true; } } - if (m_DraggingItem && (a_ClickPacket->m_SlotNum > -1) && (a_ClickPacket->m_SlotNum < m_NumSlots)) + if (m_DraggingItem && (a_SlotNum > -1) && (a_SlotNum < m_NumSlots)) { - if (a_ClickPacket->m_RightMouse == 0) + if (!a_IsRightClick) { - if (!m_DraggingItem->Equals(m_Slots[a_ClickPacket->m_SlotNum])) + // Left-clicked + if (!m_DraggingItem->IsEqual(m_Slots[a_SlotNum])) { + // Switch contents cItem tmp(*m_DraggingItem); - *m_DraggingItem = m_Slots[a_ClickPacket->m_SlotNum]; - m_Slots[a_ClickPacket->m_SlotNum] = tmp; // Switch contents + *m_DraggingItem = m_Slots[a_SlotNum]; + m_Slots[a_SlotNum] = tmp; } else { - int FreeSlots = 64 - m_Slots[a_ClickPacket->m_SlotNum].m_ItemCount; + // Same type, add items: + cItemHandler * Handler = ItemHandler(m_DraggingItem->m_ItemID); + int FreeSlots = Handler->GetMaxStackSize() - m_Slots[a_SlotNum].m_ItemCount; + if (FreeSlots < 0) + { + ASSERT(!"Bad item stack size - where did we get more items in a slot than allowed?"); + FreeSlots = 0; + } int Filling = (FreeSlots > m_DraggingItem->m_ItemCount) ? m_DraggingItem->m_ItemCount : FreeSlots; - m_Slots[a_ClickPacket->m_SlotNum].m_ItemCount += (char)Filling; + m_Slots[a_SlotNum].m_ItemCount += (char)Filling; m_DraggingItem->m_ItemCount -= (char)Filling; - if( m_DraggingItem->m_ItemCount <= 0 ) + if (m_DraggingItem->m_ItemCount <= 0) + { m_DraggingItem->Empty(); + } } } - else // Right clicked + else { - if( m_DraggingItem->m_ItemID <= 0 ) // Empty? + // Right clicked + if (m_DraggingItem->m_ItemID <= 0) // Empty-handed? { - m_DraggingItem->m_ItemCount = (char)(((float)m_Slots[a_ClickPacket->m_SlotNum].m_ItemCount)/2.f + 0.5f); - m_Slots[a_ClickPacket->m_SlotNum].m_ItemCount -= m_DraggingItem->m_ItemCount; - m_DraggingItem->m_ItemID = m_Slots[a_ClickPacket->m_SlotNum].m_ItemID; - m_DraggingItem->m_ItemHealth = m_Slots[a_ClickPacket->m_SlotNum].m_ItemHealth; + m_DraggingItem->m_ItemCount = (char)(((float)m_Slots[a_SlotNum].m_ItemCount) / 2.f + 0.5f); + m_Slots[a_SlotNum].m_ItemCount -= m_DraggingItem->m_ItemCount; + m_DraggingItem->m_ItemID = m_Slots[a_SlotNum].m_ItemID; + m_DraggingItem->m_ItemHealth = m_Slots[a_SlotNum].m_ItemHealth; - if( m_Slots[a_ClickPacket->m_SlotNum].m_ItemCount <= 0 ) + if (m_Slots[a_SlotNum].m_ItemCount <= 0) { - m_Slots[a_ClickPacket->m_SlotNum].Empty(); + m_Slots[a_SlotNum].Empty(); } } - else if( m_Slots[a_ClickPacket->m_SlotNum].m_ItemID <= 0 || m_DraggingItem->Equals( m_Slots[a_ClickPacket->m_SlotNum] ) ) - { // Drop one item in slot - if( m_DraggingItem->m_ItemCount > 0 && m_Slots[a_ClickPacket->m_SlotNum].m_ItemCount < 64 ) + else if ((m_Slots[a_SlotNum].m_ItemID <= 0) || m_DraggingItem->IsEqual(m_Slots[a_SlotNum])) + { + // Drop one item in slot + cItemHandler * Handler = ItemHandler(m_Slots[a_SlotNum].m_ItemID); + if ((m_DraggingItem->m_ItemCount > 0) && (m_Slots[a_SlotNum].m_ItemCount < Handler->GetMaxStackSize())) { - m_Slots[a_ClickPacket->m_SlotNum].m_ItemID = m_DraggingItem->m_ItemID; - m_Slots[a_ClickPacket->m_SlotNum].m_ItemCount++; - m_Slots[a_ClickPacket->m_SlotNum].m_ItemHealth = m_DraggingItem->m_ItemHealth; + m_Slots[a_SlotNum].m_ItemID = m_DraggingItem->m_ItemID; + m_Slots[a_SlotNum].m_ItemCount++; + m_Slots[a_SlotNum].m_ItemHealth = m_DraggingItem->m_ItemHealth; m_DraggingItem->m_ItemCount--; } - if( m_DraggingItem->m_ItemCount <= 0 ) + if (m_DraggingItem->m_ItemCount <= 0) { m_DraggingItem->Empty(); } } - else if( !m_DraggingItem->Equals( m_Slots[a_ClickPacket->m_SlotNum]) ) // Swap contents + else if (!m_DraggingItem->IsEqual(m_Slots[a_SlotNum])) { + // Swap contents cItem tmp( *m_DraggingItem ); - *m_DraggingItem = m_Slots[a_ClickPacket->m_SlotNum]; - m_Slots[a_ClickPacket->m_SlotNum] = tmp; // Switch contents + *m_DraggingItem = m_Slots[a_SlotNum]; + m_Slots[a_SlotNum] = tmp; } } - if( bAsync ) + if (bAsync) { - LOG("Window is not synchonous with client. Sending whole window. ID: %i", m_WindowID); - for( std::list< cPlayer* >::iterator itr = m_OpenedBy.begin(); itr != m_OpenedBy.end(); ++itr ) + // TODO: Handle this thread-safely (m_OpenedBy may change by another cSocketThread + for (cPlayerList::iterator itr = m_OpenedBy.begin(); itr != m_OpenedBy.end(); ++itr) { - SendWholeWindow( (*itr)->GetClientHandle() ); + SendWholeWindow((*itr)->GetClientHandle()); } - if( m_bInventoryVisible || m_OpenedBy.size() == 0 ) + if (m_bInventoryVisible || m_OpenedBy.empty()) { a_Player.GetInventory().SendWholeInventory( a_Player.GetClientHandle() ); } } } - else if( m_bInventoryVisible ) // Click in player inventory + else if (m_bInventoryVisible) // Click in player inventory { - a_ClickPacket->m_WindowID = 0; - a_ClickPacket->m_SlotNum -= (short)(m_NumSlots - 9); - cWindow* Window = a_Player.GetInventory().GetWindow(); - if( Window ) + cWindow * Window = a_Player.GetInventory().GetWindow(); + if (Window) { - Window->Clicked( a_ClickPacket, a_Player ); + Window->Clicked(a_Player, a_WindowID, a_SlotNum - 9, a_IsRightClick, a_IsShiftPressed, a_HeldItem); } } if (m_DraggingItem != NULL) |