- implemented separated inventory for creative mode (cSurvivalInventory and cCreativeInventory)
(Separation is not perfect yet, because maybe there are some mayor changes needed :D) - implemented CreativeInventoryAction (was mistakenly called CreateInventoryAction) -> Fixed meta data for creative selected blocks ->->Slabs/Steps are now placed correctly - slabs can now be build to a double slab - fixed a bug in the inventory which put items with different meta values in the same slot git-svn-id: http://mc-server.googlecode.com/svn/trunk@160 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
@@ -18,8 +18,6 @@ cInventory::~cInventory()
|
||||
{
|
||||
delete [] m_Slots;
|
||||
delete m_EquippedItem;
|
||||
if( GetWindow() ) GetWindow()->Close( *m_Owner );
|
||||
CloseWindow();
|
||||
}
|
||||
|
||||
cInventory::cInventory(cPlayer* a_Owner)
|
||||
@@ -37,155 +35,6 @@ cInventory::cInventory(cPlayer* a_Owner)
|
||||
|
||||
m_EquippedItem = new cItem();
|
||||
m_EquippedSlot = 0;
|
||||
|
||||
if( !GetWindow() )
|
||||
{
|
||||
cWindow* Window = new cWindow( this, false );
|
||||
Window->SetSlots( m_Slots, c_NumSlots );
|
||||
Window->SetWindowID( 0 );
|
||||
OpenWindow( Window );
|
||||
}
|
||||
}
|
||||
|
||||
void cInventory::Clear()
|
||||
{
|
||||
for(unsigned int i = 0; i < c_NumSlots; i++)
|
||||
m_Slots[i].Empty();
|
||||
}
|
||||
|
||||
cItem* cInventory::GetSlotsForType( int a_Type )
|
||||
{
|
||||
switch( a_Type )
|
||||
{
|
||||
case -1:
|
||||
return m_MainSlots;
|
||||
case -2:
|
||||
return m_CraftSlots;
|
||||
case -3:
|
||||
return m_ArmorSlots;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cInventory::GetSlotCountForType( int a_Type )
|
||||
{
|
||||
switch( a_Type )
|
||||
{
|
||||
case -1:
|
||||
return 36;
|
||||
case -2:
|
||||
case -3:
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cInventory::Clicked( cPacket_WindowClick* a_ClickPacket )
|
||||
{
|
||||
bool bDontCook = false;
|
||||
if( GetWindow() )
|
||||
{
|
||||
// Override for craft result slot
|
||||
if( a_ClickPacket->m_SlotNum == (short)c_CraftOffset )
|
||||
{
|
||||
LOG("In craft slot: %i x %i !!", m_Slots[c_CraftOffset].m_ItemID, m_Slots[c_CraftOffset].m_ItemCount );
|
||||
cItem* DraggingItem = GetWindow()->GetDraggingItem();
|
||||
if( DraggingItem->IsEmpty() )
|
||||
{
|
||||
*DraggingItem = m_Slots[c_CraftOffset];
|
||||
m_Slots[c_CraftOffset].Empty();
|
||||
}
|
||||
else if( DraggingItem->Equals( m_Slots[c_CraftOffset] ) )
|
||||
{
|
||||
if( DraggingItem->m_ItemCount + m_Slots[c_CraftOffset].m_ItemCount <= 64 )
|
||||
{
|
||||
DraggingItem->m_ItemCount += m_Slots[c_CraftOffset].m_ItemCount;
|
||||
m_Slots[0].Empty();
|
||||
}
|
||||
else
|
||||
{
|
||||
bDontCook = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bDontCook = true;
|
||||
}
|
||||
LOG("Dragging Dish %i", DraggingItem->m_ItemCount );
|
||||
}
|
||||
else
|
||||
{
|
||||
GetWindow()->Clicked( a_ClickPacket, *m_Owner );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG("No Inventory window! WTF");
|
||||
}
|
||||
|
||||
if( a_ClickPacket->m_SlotNum >= (short)c_CraftOffset && a_ClickPacket->m_SlotNum < (short)(c_CraftOffset+c_CraftSlots+1) )
|
||||
{
|
||||
cItem CookedItem;
|
||||
if( a_ClickPacket->m_SlotNum == 0 && !bDontCook )
|
||||
{
|
||||
CookedItem = cRoot::Get()->GetRecipeChecker()->CookIngredients( m_Slots+c_CraftOffset+1, 2, 2, true );
|
||||
}
|
||||
else
|
||||
{
|
||||
CookedItem = cRoot::Get()->GetRecipeChecker()->CookIngredients( m_Slots+c_CraftOffset+1, 2, 2 );
|
||||
}
|
||||
m_Slots[c_CraftOffset] = CookedItem;
|
||||
LOG("You cooked: %i x %i !!", m_Slots[c_CraftOffset].m_ItemID, m_Slots[c_CraftOffset].m_ItemCount );
|
||||
SendWholeInventory( m_Owner->GetClientHandle() );
|
||||
}
|
||||
SendSlot( 0 );
|
||||
}
|
||||
|
||||
bool cInventory::AddToBar( cItem & a_Item, const int a_Offset, const int a_Size, bool* a_bChangedSlots, int a_Mode /* = 0 */ )
|
||||
{
|
||||
// Fill already present stacks
|
||||
if( a_Mode < 2 )
|
||||
{
|
||||
for(int i = 0; i < a_Size; i++)
|
||||
{
|
||||
if( m_Slots[i + a_Offset].m_ItemID == a_Item.m_ItemID && m_Slots[i + a_Offset].m_ItemCount < 64 )
|
||||
{
|
||||
int NumFree = 64 - m_Slots[i + a_Offset].m_ItemCount;
|
||||
if( NumFree >= a_Item.m_ItemCount )
|
||||
{
|
||||
|
||||
//printf("1. Adding %i items ( free: %i )\n", a_Item.m_ItemCount, NumFree );
|
||||
m_Slots[i + a_Offset].m_ItemCount += a_Item.m_ItemCount;
|
||||
a_Item.m_ItemCount = 0;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
//printf("2. Adding %i items\n", NumFree );
|
||||
m_Slots[i + a_Offset].m_ItemCount += (char)NumFree;
|
||||
a_Item.m_ItemCount -= (char)NumFree;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( a_Mode > 0 )
|
||||
{
|
||||
// If we got more left, find first empty slot
|
||||
for(int i = 0; i < a_Size && a_Item.m_ItemCount > 0; i++)
|
||||
{
|
||||
if( m_Slots[i + a_Offset].m_ItemID == -1 )
|
||||
{
|
||||
m_Slots[i + a_Offset] = a_Item;
|
||||
a_Item.m_ItemCount = 0;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cInventory::AddItem( cItem & a_Item )
|
||||
@@ -274,6 +123,40 @@ bool cInventory::RemoveItem( cItem & a_Item )
|
||||
return false;
|
||||
}
|
||||
|
||||
void cInventory::Clear()
|
||||
{
|
||||
for(unsigned int i = 0; i < c_NumSlots; i++)
|
||||
m_Slots[i].Empty();
|
||||
}
|
||||
|
||||
cItem* cInventory::GetSlotsForType( int a_Type )
|
||||
{
|
||||
switch( a_Type )
|
||||
{
|
||||
case -1:
|
||||
return m_MainSlots;
|
||||
case -2:
|
||||
return m_CraftSlots;
|
||||
case -3:
|
||||
return m_ArmorSlots;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cInventory::GetSlotCountForType( int a_Type )
|
||||
{
|
||||
switch( a_Type )
|
||||
{
|
||||
case -1:
|
||||
return 36;
|
||||
case -2:
|
||||
case -3:
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
cItem* cInventory::GetSlot( int a_SlotNum )
|
||||
{
|
||||
if( a_SlotNum < 0 || a_SlotNum >= (short)c_NumSlots ) return 0;
|
||||
@@ -328,18 +211,51 @@ void cInventory::SendSlot( int a_SlotNum )
|
||||
}
|
||||
}
|
||||
|
||||
void cInventory::DrawInventory()
|
||||
bool cInventory::AddToBar( cItem & a_Item, const int a_Offset, const int a_Size, bool* a_bChangedSlots, int a_Mode /* = 0 */ )
|
||||
{
|
||||
printf("%i %i %i %i\n", m_ArmorSlots[0].m_ItemCount, m_ArmorSlots[1].m_ItemCount, m_CraftSlots[0].m_ItemCount, m_CraftSlots[1].m_ItemCount );
|
||||
printf("%i %i %i %i\n", m_ArmorSlots[2].m_ItemCount, m_ArmorSlots[3].m_ItemCount, m_CraftSlots[2].m_ItemCount, m_CraftSlots[3].m_ItemCount );
|
||||
for(int y = 0; y < 4; y++)
|
||||
// Fill already present stacks
|
||||
if( a_Mode < 2 )
|
||||
{
|
||||
for(int x = 0; x < 9; x++)
|
||||
for(int i = 0; i < a_Size; i++)
|
||||
{
|
||||
printf("%i ", m_MainSlots[x + y*9].m_ItemCount );
|
||||
if( m_Slots[i + a_Offset].m_ItemID == a_Item.m_ItemID && m_Slots[i + a_Offset].m_ItemCount < 64 && m_Slots[i + a_Offset].m_ItemHealth == a_Item.m_ItemHealth )
|
||||
{
|
||||
int NumFree = 64 - m_Slots[i + a_Offset].m_ItemCount;
|
||||
if( NumFree >= a_Item.m_ItemCount )
|
||||
{
|
||||
|
||||
//printf("1. Adding %i items ( free: %i )\n", a_Item.m_ItemCount, NumFree );
|
||||
m_Slots[i + a_Offset].m_ItemCount += a_Item.m_ItemCount;
|
||||
a_Item.m_ItemCount = 0;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
//printf("2. Adding %i items\n", NumFree );
|
||||
m_Slots[i + a_Offset].m_ItemCount += (char)NumFree;
|
||||
a_Item.m_ItemCount -= (char)NumFree;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if( a_Mode > 0 )
|
||||
{
|
||||
// If we got more left, find first empty slot
|
||||
for(int i = 0; i < a_Size && a_Item.m_ItemCount > 0; i++)
|
||||
{
|
||||
if( m_Slots[i + a_Offset].m_ItemID == -1 )
|
||||
{
|
||||
m_Slots[i + a_Offset] = a_Item;
|
||||
a_Item.m_ItemCount = 0;
|
||||
a_bChangedSlots[i + a_Offset] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void cInventory::SaveToJson(Json::Value & a_Value)
|
||||
|
||||
Reference in New Issue
Block a user