the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2
3#include "net.minecraft.world.entity.item.h"
4#include "net.minecraft.world.item.h"
5#include "net.minecraft.world.phys.h"
6#include "net.minecraft.world.level.h"
7#include "net.minecraft.world.entity.player.h"
8#include "net.minecraft.world.entity.h"
9#include "net.minecraft.world.level.tile.h"
10#include "net.minecraft.world.level.saveddata.h"
11#include "com.mojang.nbt.h"
12#include "ItemFrame.h"
13
14
15
16
17// 4J - added for common ctor code
18void ItemFrame::_init()
19{
20 // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that
21 // the derived version of the function is called
22 this->defineSynchedData();
23
24 dropChance = 1;
25}
26
27ItemFrame::ItemFrame(Level *level) : HangingEntity( level )
28{
29 _init();
30}
31
32ItemFrame::ItemFrame(Level *level, int xTile, int yTile, int zTile, int dir) : HangingEntity( level, xTile, yTile, zTile, dir )
33{
34 _init();
35 setDir(dir);
36}
37
38void ItemFrame::defineSynchedData()
39{
40 getEntityData()->defineNULL(DATA_ITEM, NULL);
41 getEntityData()->define(DATA_ROTATION, (byte) 0);
42}
43
44bool ItemFrame::shouldRenderAtSqrDistance(double distance)
45{
46 double size = 16;
47 size *= 64.0f * viewScale;
48 return distance < size * size;
49}
50
51void ItemFrame::dropItem(shared_ptr<Entity> causedBy)
52{
53 shared_ptr<ItemInstance> item = getItem();
54
55 if (causedBy != NULL && causedBy->instanceof(eTYPE_PLAYER))
56 {
57 if (dynamic_pointer_cast<Player>(causedBy)->abilities.instabuild)
58 {
59 removeFramedMap(item);
60 return;
61 }
62 }
63
64 spawnAtLocation( shared_ptr<ItemInstance>(new ItemInstance(Item::frame) ), 0);
65 if ( (item != NULL) && (random->nextFloat() < dropChance) )
66 {
67 item = item->copy();
68 removeFramedMap(item);
69 spawnAtLocation(item, 0);
70 }
71}
72
73void ItemFrame::removeFramedMap(shared_ptr<ItemInstance> item)
74{
75 if (item == NULL) return;
76 if (item->id == Item::map_Id)
77 {
78 shared_ptr<MapItemSavedData> mapItemSavedData = Item::map->getSavedData(item, level);
79 mapItemSavedData->removeItemFrameDecoration(item);
80 //mapItemSavedData.decorations.remove("frame-" + entityId);
81 }
82 item->setFramed(nullptr);
83}
84
85shared_ptr<ItemInstance> ItemFrame::getItem()
86{
87 return getEntityData()->getItemInstance(DATA_ITEM);
88}
89
90void ItemFrame::setItem(shared_ptr<ItemInstance> item)
91{
92 if(item != NULL)
93 {
94 item = item->copy();
95 item->count = 1;
96
97 item->setFramed(dynamic_pointer_cast<ItemFrame>( shared_from_this() ));
98 }
99 getEntityData()->set(DATA_ITEM, item);
100 getEntityData()->markDirty(DATA_ITEM);
101}
102
103int ItemFrame::getRotation()
104{
105 return getEntityData()->getByte(DATA_ROTATION);
106}
107
108void ItemFrame::setRotation(int rotation)
109{
110 getEntityData()->set(DATA_ROTATION, (byte) (rotation % 4));
111}
112
113void ItemFrame::addAdditonalSaveData(CompoundTag *tag)
114{
115 if (getItem() != NULL)
116 {
117 tag->putCompound(L"Item", getItem()->save(new CompoundTag()));
118 tag->putByte(L"ItemRotation", (byte) getRotation());
119 tag->putFloat(L"ItemDropChance", dropChance);
120 }
121 HangingEntity::addAdditonalSaveData(tag);
122}
123
124void ItemFrame::readAdditionalSaveData(CompoundTag *tag)
125{
126 CompoundTag *itemTag = tag->getCompound(L"Item");
127 if (itemTag != NULL && !itemTag->isEmpty())
128 {
129 setItem(ItemInstance::fromTag(itemTag));
130 setRotation(tag->getByte(L"ItemRotation"));
131
132 if (tag->contains(L"ItemDropChance")) dropChance = tag->getFloat(L"ItemDropChance");
133 }
134 HangingEntity::readAdditionalSaveData(tag);
135}
136
137bool ItemFrame::interact(shared_ptr<Player> player)
138{
139 if(!player->isAllowedToInteract(shared_from_this()))
140 {
141 return false;
142 }
143
144 if (getItem() == NULL)
145 {
146 shared_ptr<ItemInstance> item = player->getCarriedItem();
147
148 if (item != NULL)
149 {
150 if (!level->isClientSide)//isClientSide)
151 {
152 setItem(item);
153
154 if (!player->abilities.instabuild)
155 {
156 if (--item->count <= 0)
157 {
158 player->inventory->setItem(player->inventory->selected, nullptr);
159 }
160 }
161 }
162 }
163 }
164 else
165 {
166 if (!level->isClientSide)//isClientSide)
167 {
168 setRotation(getRotation() + 1);
169 }
170 }
171
172 return true;
173}