#loader contenttweaker import mods.contenttweaker.VanillaFactory.createItem; import mods.contenttweaker.IItemUse; import mods.contenttweaker.MutableItemStack; import mods.contenttweaker.World; import mods.contenttweaker.Player; import mods.contenttweaker.BlockPos; import mods.contenttweaker.Hand; import mods.contenttweaker.Facing; import mods.contenttweaker.ActionResult; import crafttweaker.util.Position3f; import crafttweaker.block.IBlockDefinition; import crafttweaker.block.IBlockState; import crafttweaker.block.IBlock; import crafttweaker.data.IData; import crafttweaker.entity.IEntityEquipmentSlot; function isFrameable(block as IBlockDefinition) as bool { if (isNull(block) || isNull(block.id)) return false; // how return block.id.startsWith("framedcompactdrawers") || block.id == "storagedrawers:customdrawers" || block.id == "storagedrawers:customtrim" || block.id == "storagedrawers:basicdrawers" || block.id == "storagedrawers:trim" || block.id == "storagedrawers:compdrawers" || block.id == "storagedrawers:controller" || block.id == "storagedrawers:controllerslave"; } function isReframing(block as IBlockDefinition) as bool { if (isNull(block) || isNull(block.id)) return false; // how return block.id.startsWith("framedcompactdrawers") || block.id == "storagedrawers:customdrawers" || block.id == "storagedrawers:customtrim"; } function orElse(tag as IData, other as IData) as IData { return isNull(tag) ? other : tag; } function makeFramedState(state as IBlockState) as IBlockState { val id as string = state.block.definition.id; if id == "storagedrawers:trim" { return .block.definition.defaultState; } return (id == "storagedrawers:basicdrawers" ? : id == "storagedrawers:compdrawers" ? : id == "storagedrawers:controllerslave" ? : ) .block.definition.getStateFromMeta(id == "storagedrawers:controller" ? state.meta - 2 : state.meta); } function overrideData(data as IData) as IData { if isNull(data) return data; if !isNull(data as IData[string]) { val dataMap = data as IData[string]; val built as IData[string] = {}; // because for some reason strings as maps convert to // a singleton map mapping themselves to themselves. val dataString = data as string; if (dataMap has dataString && dataMap[dataString] as string == dataString) { return 0 as IData; } for k, v in dataMap { built[k] = overrideData(v); } val ret as any[any] = built; return ret as IData; } if !isNull(data as [IData]) { var built = [] as IData; for v in data as [IData] { built += [overrideData(v)]; } return built; } return "" as IData; } val hft = createItem("hand_framing_tool"); hft.maxStackSize = 1; hft.onItemUse = function(player as Player, world as World, pos as BlockPos, hand as Hand, facing as Facing, blockHit as Position3f) { val ctstate = world.getBlockState(pos); val definition as IBlockDefinition = ctstate.block.definition; if isFrameable(definition) { var state as IBlockState = definition.getStateFromMeta(ctstate.meta); var tag as IData = player.currentItem.tag; if (isNull(tag) || isNull(tag.MatS)) return ActionResult.fail(); if !isReframing(definition) { val stickCount = orElse(tag.sticks, 0) as int; if (stickCount < 8) return ActionResult.fail(); tag += { "sticks": stickCount - 8 } as IData; state = makeFramedState(state); } val block as IBlock = world.getBlock(pos); var blockTag as IData = orElse(block.data, {}) + { "MatS": tag.MatS, "MatF": orElse(tag.MatF, ""), "MatT": orElse(tag.MatT, "") }; world.setBlockState(definition.getStateFromMeta(ctstate.meta), overrideData(block.data), pos); // clear storage world.setBlockState(, pos); // ensure re-render world.setBlockState(state, blockTag, pos); player.setItemToSlot(hand == Hand.main() ? IEntityEquipmentSlot.mainHand() : IEntityEquipmentSlot.offhand(), player.currentItem.withTag(tag)); return ActionResult.success(); } return ActionResult.pass(); } as IItemUse; hft.register();