aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Common/GameRules/AddItemRuleDefinition.cpp
blob: 6b99c59ef15efa8ff2b9f8b58896f5feb2f84b45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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<GameRuleDefinition *> *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<int>(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<int>(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<int>(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<int>(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<int>(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> 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<ItemInstance> newItem = std::shared_ptr<ItemInstance>(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(dynamic_pointer_cast<Inventory>(container) != NULL)
		{
			added = dynamic_pointer_cast<Inventory>(container)->add(newItem);
		}
	}
	return added;
}