aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/SimpleContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/SimpleContainer.cpp')
-rw-r--r--Minecraft.World/SimpleContainer.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/Minecraft.World/SimpleContainer.cpp b/Minecraft.World/SimpleContainer.cpp
new file mode 100644
index 00000000..e29bc790
--- /dev/null
+++ b/Minecraft.World/SimpleContainer.cpp
@@ -0,0 +1,110 @@
+#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 );
+}
+
+shared_ptr<ItemInstance> SimpleContainer::getItem(unsigned int slot)
+{
+ return (*items)[slot];
+}
+
+shared_ptr<ItemInstance> SimpleContainer::removeItem(unsigned int slot, int count)
+{
+ if ((*items)[slot] != NULL) {
+ if ((*items)[slot]->count <= count)
+ {
+ shared_ptr<ItemInstance> item = (*items)[slot];
+ (*items)[slot] = nullptr;
+ this->setChanged();
+ return item;
+ }
+ else
+ {
+ shared_ptr<ItemInstance> i = (*items)[slot]->remove(count);
+ if ((*items)[slot]->count == 0) (*items)[slot] = nullptr;
+ this->setChanged();
+ return i;
+ }
+ }
+ return nullptr;
+}
+
+shared_ptr<ItemInstance> SimpleContainer::removeItemNoUpdate(int slot)
+{
+ if ((*items)[slot] != NULL)
+ {
+ shared_ptr<ItemInstance> item = (*items)[slot];
+ (*items)[slot] = nullptr;
+ return item;
+ }
+ return nullptr;
+}
+
+void SimpleContainer::setItem(unsigned int slot, shared_ptr<ItemInstance> item)
+{
+ (*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
+}
+
+bool SimpleContainer::stillValid(shared_ptr<Player> player)
+{
+ return true;
+} \ No newline at end of file