the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 173 lines 3.9 kB view raw
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}