#include "stdafx.h" #include "..\..\..\Minecraft.World\StringHelpers.h" #include "..\..\..\Minecraft.World\net.minecraft.world.item.h" #include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" #include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" #include "AddItemRuleDefinition.h" #include "AddEnchantmentRuleDefinition.h" AddItemRuleDefinition::AddItemRuleDefinition() { m_itemId = m_quantity = m_auxValue = m_dataTag = 0; m_slot = -1; } void AddItemRuleDefinition::writeAttributes(DataOutputStream *dos, UINT numAttrs) { GameRuleDefinition::writeAttributes(dos, numAttrs + 5); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_itemId); dos->writeUTF( _toString( m_itemId ) ); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_quantity); dos->writeUTF( _toString( m_quantity ) ); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_auxValue); dos->writeUTF( _toString( m_auxValue ) ); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_dataTag); dos->writeUTF( _toString( m_dataTag ) ); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_slot); dos->writeUTF( _toString( m_slot ) ); } void AddItemRuleDefinition::getChildren(vector *children) { GameRuleDefinition::getChildren( children ); for (AUTO_VAR(it, m_enchantments.begin()); it != m_enchantments.end(); it++) children->push_back( *it ); } GameRuleDefinition *AddItemRuleDefinition::addChild(ConsoleGameRules::EGameRuleType ruleType) { GameRuleDefinition *rule = NULL; if(ruleType == ConsoleGameRules::eGameRuleType_AddEnchantment) { rule = new AddEnchantmentRuleDefinition(); m_enchantments.push_back((AddEnchantmentRuleDefinition *)rule); } else { #ifndef _CONTENT_PACKAGE //wprintf(L"AddItemRuleDefinition: Attempted to add invalid child rule - %d\n", ruleType ); #endif } return rule; } void AddItemRuleDefinition::addAttribute(const wstring &attributeName, const wstring &attributeValue) { if(attributeName.compare(L"itemId") == 0) { int value = _fromString(attributeValue); m_itemId = value; //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter itemId=%d\n",m_itemId); } else if(attributeName.compare(L"quantity") == 0) { int value = _fromString(attributeValue); m_quantity = value; //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter quantity=%d\n",m_quantity); } else if(attributeName.compare(L"auxValue") == 0) { int value = _fromString(attributeValue); m_auxValue = value; //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter auxValue=%d\n",m_auxValue); } else if(attributeName.compare(L"dataTag") == 0) { int value = _fromString(attributeValue); m_dataTag = value; //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter dataTag=%d\n",m_dataTag); } else if(attributeName.compare(L"slot") == 0) { int value = _fromString(attributeValue); m_slot = value; //app.DebugPrintf(2,"AddItemRuleDefinition: Adding parameter slot=%d\n",m_slot); } else { GameRuleDefinition::addAttribute(attributeName, attributeValue); } } bool AddItemRuleDefinition::addItemToContainer(std::shared_ptr container, int slotId) { bool added = false; if(Item::items[m_itemId] != NULL) { int quantity = min(m_quantity, Item::items[m_itemId]->getMaxStackSize()); std::shared_ptr newItem = std::shared_ptr(new ItemInstance(m_itemId,quantity,m_auxValue) ); newItem->set4JData(m_dataTag); for(AUTO_VAR(it, m_enchantments.begin()); it != m_enchantments.end(); ++it) { (*it)->enchantItem(newItem); } if(m_slot >= 0 && m_slot < container->getContainerSize() ) { container->setItem( m_slot, newItem ); added = true; } else if(slotId >= 0 && slotId < container->getContainerSize() ) { container->setItem( slotId, newItem ); added = true; } else if(std::dynamic_pointer_cast(container) != NULL) { added = std::dynamic_pointer_cast(container)->add(newItem); } } return added; }