Something went wrong. Try again.
the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
Something went wrong. Try again.
9.5 kB · 418 lines
C++
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418#include "stdafx.h"#include "net.minecraft.world.item.h"#include "FireworksRecipe.h"
DWORD FireworksRecipe::tlsIdx = 0;FireworksRecipe::ThreadStorage *FireworksRecipe::tlsDefault = NULL;
FireworksRecipe::ThreadStorage::ThreadStorage(){ resultItem = nullptr;}
void FireworksRecipe::CreateNewThreadStorage(){ ThreadStorage *tls = new ThreadStorage(); if(tlsDefault == NULL ) { tlsIdx = TlsAlloc(); tlsDefault = tls; } TlsSetValue(tlsIdx, tls);}
void FireworksRecipe::UseDefaultThreadStorage(){ TlsSetValue(tlsIdx, tlsDefault);}
void FireworksRecipe::ReleaseThreadStorage(){ ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); if( tls == tlsDefault ) return;
delete tls;}
void FireworksRecipe::setResultItem(shared_ptr<ItemInstance> item){ ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); tls->resultItem = item;}
FireworksRecipe::FireworksRecipe(){ //resultItem = nullptr;}
bool FireworksRecipe::matches(shared_ptr<CraftingContainer> craftSlots, Level *level){ shared_ptr<ItemInstance> resultItem = nullptr;
int paperCount = 0; int sulphurCount = 0; int colorCount = 0; int chargeCount = 0; int chargeComponents = 0; int typeComponents = 0;
for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) { shared_ptr<ItemInstance> item = craftSlots->getItem(slot); if (item == NULL) continue;
if (item->id == Item::gunpowder_Id) { sulphurCount++; } else if (item->id == Item::fireworksCharge_Id) { chargeCount++; } else if (item->id == Item::dye_powder_Id) { colorCount++; } else if (item->id == Item::paper_Id) { paperCount++; } else if (item->id == Item::yellowDust_Id) { // glowstone dust gives flickering chargeComponents++; } else if (item->id == Item::diamond_Id) { // diamonds give trails chargeComponents++; } else if (item->id == Item::fireball_Id) { // fireball gives larger explosion typeComponents++; } else if (item->id == Item::feather_Id) { // burst typeComponents++; } else if (item->id == Item::goldNugget_Id) { // star typeComponents++; } else if (item->id == Item::skull_Id) { // creeper typeComponents++; } else { setResultItem(resultItem); return false; } } chargeComponents += colorCount + typeComponents;
if (sulphurCount > 3 || paperCount > 1) { setResultItem(resultItem); return false; }
// create fireworks if (sulphurCount >= 1 && paperCount == 1 && chargeComponents == 0) { resultItem = shared_ptr<ItemInstance>( new ItemInstance(Item::fireworks) ); if (chargeCount > 0) { CompoundTag *itemTag = new CompoundTag(); CompoundTag *fireTag = new CompoundTag(FireworksItem::TAG_FIREWORKS); ListTag<CompoundTag> *expTags = new ListTag<CompoundTag>(FireworksItem::TAG_EXPLOSIONS);
for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) { shared_ptr<ItemInstance> item = craftSlots->getItem(slot); if (item == NULL || item->id != Item::fireworksCharge_Id) continue;
if (item->hasTag() && item->getTag()->contains(FireworksItem::TAG_EXPLOSION)) { expTags->add((CompoundTag *)item->getTag()->getCompound(FireworksItem::TAG_EXPLOSION)->copy()); } }
fireTag->put(FireworksItem::TAG_EXPLOSIONS, expTags); fireTag->putByte(FireworksItem::TAG_FLIGHT, (byte) sulphurCount); itemTag->put(FireworksItem::TAG_FIREWORKS, fireTag);
resultItem->setTag(itemTag); } setResultItem(resultItem); return true; } // create firecharge if (sulphurCount == 1 && paperCount == 0 && chargeCount == 0 && colorCount > 0 && typeComponents <= 1) {
resultItem = shared_ptr<ItemInstance>( new ItemInstance(Item::fireworksCharge) ); CompoundTag *itemTag = new CompoundTag(); CompoundTag *expTag = new CompoundTag(FireworksItem::TAG_EXPLOSION);
byte type = 0;
vector<int> colors; for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) { shared_ptr<ItemInstance> item = craftSlots->getItem(slot); if (item == NULL) continue;
if (item->id == Item::dye_powder_Id) { colors.push_back(DyePowderItem::COLOR_RGB[item->getAuxValue()]); } else if (item->id == Item::yellowDust_Id) { // glowstone dust gives flickering expTag->putBoolean(FireworksItem::TAG_E_FLICKER, true); } else if (item->id == Item::diamond_Id) { // diamonds give trails expTag->putBoolean(FireworksItem::TAG_E_TRAIL, true); } else if (item->id == Item::fireball_Id) { type = FireworksItem::TYPE_BIG; } else if (item->id == Item::feather_Id) { type = FireworksItem::TYPE_BURST; } else if (item->id == Item::goldNugget_Id) { type = FireworksItem::TYPE_STAR; } else if (item->id == Item::skull_Id) { type = FireworksItem::TYPE_CREEPER; } } intArray colorArray(colors.size()); for (int i = 0; i < colorArray.length; i++) { colorArray[i] = colors.at(i); } expTag->putIntArray(FireworksItem::TAG_E_COLORS, colorArray);
expTag->putByte(FireworksItem::TAG_E_TYPE, type);
itemTag->put(FireworksItem::TAG_EXPLOSION, expTag); resultItem->setTag(itemTag); setResultItem(resultItem); return true; } // apply fade colors to firecharge if (sulphurCount == 0 && paperCount == 0 && chargeCount == 1 && colorCount > 0 && colorCount == chargeComponents) {
vector<int> colors; for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) { shared_ptr<ItemInstance> item = craftSlots->getItem(slot); if (item == NULL) continue;
if (item->id == Item::dye_powder_Id) { colors.push_back(DyePowderItem::COLOR_RGB[item->getAuxValue()]); } else if (item->id == Item::fireworksCharge_Id) { resultItem = item->copy(); resultItem->count = 1; } } intArray colorArray(colors.size()); for (int i = 0; i < colorArray.length; i++) { colorArray[i] = colors.at(i); } if (resultItem != NULL && resultItem->hasTag()) { CompoundTag *compound = resultItem->getTag()->getCompound(FireworksItem::TAG_EXPLOSION); if (compound == NULL) { delete colorArray.data; setResultItem(resultItem); return false; } compound->putIntArray(FireworksItem::TAG_E_FADECOLORS, colorArray); } else { delete colorArray.data; setResultItem(resultItem); return false; } setResultItem(resultItem); return true; } setResultItem(resultItem); return false;}
shared_ptr<ItemInstance> FireworksRecipe::assemble(shared_ptr<CraftingContainer> craftSlots){ ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); return tls->resultItem->copy(); //return resultItem->copy();}
int FireworksRecipe::size(){ return 10;}
const ItemInstance *FireworksRecipe::getResultItem(){ ThreadStorage *tls = (ThreadStorage *)TlsGetValue(tlsIdx); return tls->resultItem.get(); //return resultItem.get();}
void FireworksRecipe::updatePossibleRecipes(shared_ptr<CraftingContainer> craftSlots, bool *firework, bool *charge, bool *fade){ *firework = false; *charge = false; *fade = false;
int paperCount = 0; int sulphurCount = 0; int colorCount = 0; int chargeCount = 0; int chargeComponents = 0; int typeComponents = 0;
for (int slot = 0; slot < craftSlots->getContainerSize(); slot++) { shared_ptr<ItemInstance> item = craftSlots->getItem(slot); if (item == NULL) continue;
if (item->id == Item::gunpowder_Id) { sulphurCount++; } else if (item->id == Item::fireworksCharge_Id) { chargeCount++; } else if (item->id == Item::dye_powder_Id) { colorCount++; } else if (item->id == Item::paper_Id) { paperCount++; } else if (item->id == Item::yellowDust_Id) { // glowstone dust gives flickering chargeComponents++; } else if (item->id == Item::diamond_Id) { // diamonds give trails chargeComponents++; } else if (item->id == Item::fireball_Id) { // fireball gives larger explosion typeComponents++; } else if (item->id == Item::feather_Id) { // burst typeComponents++; } else if (item->id == Item::goldNugget_Id) { // star typeComponents++; } else if (item->id == Item::skull_Id) { // creeper typeComponents++; } else { return; } } chargeComponents += colorCount + typeComponents;
if (sulphurCount > 3 || paperCount > 1) { return; }
// create fireworks if ( paperCount <= 1 && chargeComponents == 0 ) { *firework = true; } // create firecharge if ( sulphurCount <= 1 && colorCount >= 0 && paperCount == 0 && chargeCount == 0 && typeComponents <= 1 ) { *charge = true; } // apply fade colors to firecharge if ( sulphurCount == 0 && paperCount == 0 && chargeCount <= 1 && colorCount >= 0 ) { *fade = true; }}
bool FireworksRecipe::isValidIngredient(shared_ptr<ItemInstance> item, bool firework, bool charge, bool fade){ bool valid = false; switch(item->id) { case Item::gunpowder_Id: valid = firework || charge; break; case Item::fireworksCharge_Id: valid = firework || fade; break; case Item::dye_powder_Id: valid = charge || fade; break; case Item::paper_Id: valid = firework; break; case Item::yellowDust_Id: valid = charge; break; case Item::diamond_Id: valid = charge; break; case Item::fireball_Id: valid = charge; break; case Item::feather_Id: valid = charge; break; case Item::goldNugget_Id: valid = charge; break; case Item::skull_Id: valid = charge; break; } return valid;}