2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "net.minecraft.world.ContainerListener.h"
# include "net.minecraft.world.item.h"
# include "SimpleContainer.h"
SimpleContainer : : SimpleContainer ( int name , int size )
{
this - > name = name ;
this - > size = size ;
items = new ItemInstanceArray ( size ) ;
listeners = NULL ;
}
void SimpleContainer : : addListener ( net_minecraft_world : : ContainerListener * listener )
{
if ( listeners = = NULL ) listeners = new vector < net_minecraft_world : : ContainerListener * > ( ) ;
listeners - > push_back ( listener ) ;
}
void SimpleContainer : : removeListener ( net_minecraft_world : : ContainerListener * listener )
{
// 4J Java has a remove function on lists that will find the first occurence of
// an object and remove it. We need to replicate that ourselves
vector < net_minecraft_world : : ContainerListener * > : : iterator it = listeners - > begin ( ) ;
vector < net_minecraft_world : : ContainerListener * > : : iterator itEnd = listeners - > end ( ) ;
while ( it ! = itEnd & & * it ! = listener )
it + + ;
if ( it ! = itEnd )
listeners - > erase ( it ) ;
}
2026-03-02 15:58:20 +07:00
std : : shared_ptr < ItemInstance > SimpleContainer : : getItem ( unsigned int slot )
2026-03-01 12:16:08 +08:00
{
return ( * items ) [ slot ] ;
}
2026-03-02 15:58:20 +07:00
std : : shared_ptr < ItemInstance > SimpleContainer : : removeItem ( unsigned int slot , int count )
2026-03-01 12:16:08 +08:00
{
if ( ( * items ) [ slot ] ! = NULL ) {
if ( ( * items ) [ slot ] - > count < = count )
{
2026-03-02 15:58:20 +07:00
std : : shared_ptr < ItemInstance > item = ( * items ) [ slot ] ;
2026-03-01 12:16:08 +08:00
( * items ) [ slot ] = nullptr ;
this - > setChanged ( ) ;
return item ;
}
else
{
2026-03-02 15:58:20 +07:00
std : : shared_ptr < ItemInstance > i = ( * items ) [ slot ] - > remove ( count ) ;
2026-03-01 12:16:08 +08:00
if ( ( * items ) [ slot ] - > count = = 0 ) ( * items ) [ slot ] = nullptr ;
this - > setChanged ( ) ;
return i ;
}
}
return nullptr ;
}
2026-03-02 15:58:20 +07:00
std : : shared_ptr < ItemInstance > SimpleContainer : : removeItemNoUpdate ( int slot )
2026-03-01 12:16:08 +08:00
{
if ( ( * items ) [ slot ] ! = NULL )
{
2026-03-02 15:58:20 +07:00
std : : shared_ptr < ItemInstance > item = ( * items ) [ slot ] ;
2026-03-01 12:16:08 +08:00
( * items ) [ slot ] = nullptr ;
return item ;
}
return nullptr ;
}
2026-03-02 15:58:20 +07:00
void SimpleContainer : : setItem ( unsigned int slot , std : : shared_ptr < ItemInstance > item )
2026-03-01 12:16:08 +08:00
{
( * items ) [ slot ] = item ;
if ( item ! = NULL & & item - > count > getMaxStackSize ( ) ) item - > count = getMaxStackSize ( ) ;
this - > setChanged ( ) ;
}
unsigned int SimpleContainer : : getContainerSize ( )
{
return size ;
}
int SimpleContainer : : getName ( )
{
return name ;
}
int SimpleContainer : : getMaxStackSize ( )
{
return Container : : LARGE_MAX_STACK_SIZE ;
}
void SimpleContainer : : setChanged ( )
{
// 4J - removing this as we don't seem to have any implementation of a listener containerChanged function, and shared_from_this is proving tricky to add to containers
#if 0
if ( listeners ! = NULL ) for ( unsigned int i = 0 ; i < listeners - > size ( ) ; i + + )
{
listeners - > at ( i ) - > containerChanged ( shared_from_this ( ) ) ;
}
# endif
}
2026-03-02 15:58:20 +07:00
bool SimpleContainer : : stillValid ( std : : shared_ptr < Player > player )
2026-03-01 12:16:08 +08:00
{
return true ;
}