In memory of Gilded Rose Quartz

- Added the Extendo Grip
- Cart assemblers now center a held minecart on their position
- Fixed Minecart contraptions facing backwards upon assembly
This commit is contained in:
simibubi 2020-06-06 22:36:58 +02:00
parent b70343b32c
commit 34a16b05bf
27 changed files with 820 additions and 67 deletions

View File

@ -324,8 +324,8 @@ c60c3115fd6eeaa3a696428a87a74d184ab7d62d assets\create\blockstates\weathered_lim
c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets\create\blockstates\weathered_limestone_pillar.json
7f39521b211441f5c3e06d60c5978cebe16cacfb assets\create\blockstates\zinc_block.json
b7181bcd8182b2f17088e5aa881f374c9c65470c assets\create\blockstates\zinc_ore.json
32c39a2fb42bb9ca9c6d51ca521ea36791b32448 assets\create\lang\en_ud.json
00207f0dea9dd779d33cb1ddd2690d1185caeb94 assets\create\lang\en_us.json
4311c87a21caccb97b693bf914c8ce79de3f814b assets\create\lang\en_ud.json
f7cd2198ffae7a8dea1902b242aa56110ca28885 assets\create\lang\en_us.json
846200eb548d3bfa2e77b41039de159b4b6cfb45 assets\create\models\block\acacia_window.json
1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets\create\models\block\acacia_window_pane_noside.json
1763ea2c9b981d187f5031ba608f3d5d3be3986a assets\create\models\block\acacia_window_pane_noside_alt.json
@ -990,6 +990,7 @@ e974cd23a5456baef8b634f2d21fd8c3822931ab assets\create\models\item\dolomite_pill
f2d6b88c3174de01e16da555236727efc33b490c assets\create\models\item\encased_belt.json
250bd0716cc1f04b03892ab74eb0b3a0f32a6158 assets\create\models\item\encased_fan.json
e0f9ad7e7d790e9e21a38fa57395fd3ff892359b assets\create\models\item\encased_shaft.json
68833e2a7836c73776551565783a1d175b715c66 assets\create\models\item\extendo_grip.json
956646df2a75ed651eabb403a3f9e1024538cd56 assets\create\models\item\extractor.json
efcbd30ad7a7658c02a3dc3de5fa0f21d7f49b54 assets\create\models\item\fancy_andesite_bricks.json
7ccd312084128c356307c7ca6e52c65d0a18907b assets\create\models\item\fancy_andesite_bricks_slab.json
@ -1270,7 +1271,9 @@ d1fbc14303c7327e9fc02e505e7e434591b7f785 data\create\advancements\crushing_wheel
0761f3e12d587fec7a2ddf326b43969d262771e3 data\create\advancements\deforester.json
e4e3c1bd7ecf501b40cffc26d8ad145ab4e89118 data\create\advancements\deployer.json
7280e15d67926f5911b6d75b62369d86fc98af27 data\create\advancements\drill.json
77edd30e3d60b4d492662c673387910f66b5a276 data\create\advancements\dual_extendo_grip.json
04eaf829696d735244c0e4798dd3bdeb26e13a32 data\create\advancements\electron_tube.json
31c9541b0be08cde351b9a07696bd675514bbcb8 data\create\advancements\extendo_grip.json
69e96e926a4d72e59cc6390c25f064166ddb62d2 data\create\advancements\fist_bump.json
62f3610188f7dbd3900ab305edc2d06282705a38 data\create\advancements\goggles.json
7e12b7ccb198ef0db7964b8cbef152d8347e333c data\create\advancements\its_alive.json

View File

@ -349,6 +349,7 @@
"item.create.dough": "\u0265bno\u15E1",
"item.create.electron_tube": "\u01DDqn\u27D8 uo\u0279\u0287\u0254\u01DD\u05DF\u018E",
"item.create.empty_schematic": "\u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S \u028E\u0287d\u026F\u018E",
"item.create.extendo_grip": "d\u0131\u0279\u2141 opu\u01DD\u0287x\u018E",
"item.create.filter": "\u0279\u01DD\u0287\u05DF\u0131\u2132",
"item.create.furnace_minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W \u01DD\u0254\u0250u\u0279n\u2132",
"item.create.goggles": "s\u01DD\u05DFbbo\u2141 s,\u0279\u01DD\u01DDu\u0131bu\u018E",

View File

@ -354,6 +354,7 @@
"item.create.dough": "Dough",
"item.create.electron_tube": "Electron Tube",
"item.create.empty_schematic": "Empty Schematic",
"item.create.extendo_grip": "Extendo Grip",
"item.create.filter": "Filter",
"item.create.furnace_minecart_contraption": "Furnace Minecart Contraption",
"item.create.goggles": "Engineer's Goggles",
@ -461,6 +462,10 @@
"advancement.create.wand_of_symmetry.desc": "Craft a Staff of Symmetry.",
"advancement.create.deforester": "Radiant Chopping",
"advancement.create.deforester.desc": "Craft a Deforester, and say goodbye to the local forest.",
"advancement.create.extendo_grip": "Boioioing!",
"advancement.create.extendo_grip.desc": "Get hold of an Extendo Grip.",
"advancement.create.dual_extendo_grip": "Ultimate Boing-age",
"advancement.create.dual_extendo_grip.desc": "Dual wield Extendo Grips for super-human reach.",
"advancement.create.eob": "End of Beta",
"advancement.create.eob.desc": "Expect more content here in the future. <3",
@ -865,6 +870,11 @@
"item.create.deforester.tooltip": "DEFORESTER",
"item.create.deforester.tooltip.summary": "A _radiant_ _axe_ able to chop down trees in a split second.",
"item.create.extendo_grip.tooltip": "EXTENDO GRIP",
"item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.",
"item.create.extendo_grip.tooltip.condition1": "When in Off-Hand",
"item.create.extendo_grip.tooltip.behaviour1": "Increases _reach_ _distance_ of items used in the _Main-Hand_.",
"item.create.filter.tooltip": "FILTER",
"item.create.filter.tooltip.summary": "_Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ _items_ or several _nested_ _filters_.",
"item.create.filter.tooltip.condition1": "When in filter slot",
@ -1310,15 +1320,6 @@
"item.create.crafter_slot_cover.tooltip": "SLOT COVER",
"item.create.crafter_slot_cover.tooltip.summary": "Used to mark a _Mechanical_ _Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients_ _are_ _diagonal_ to each other.",
"tool.create.shadow_steel.tooltip": "SHADOW STEEL TOOLS",
"tool.create.shadow_steel.tooltip.summary": "A fast and powerful tool that _destroys_ _drops_ from any block or entity. Killed mobs can drop _more_ _experience_ based on the _Looting_ modifier of this tool.",
"tool.create.blazing.tooltip": "BLAZING TOOLS",
"tool.create.blazing.tooltip.summary": "This tool will _melt_ _broken_ _blocks_ and _ignite_ _attacked_ _mobs_. It will not lose Durability while being used in the _Nether_.",
"tool.create.rose_quartz.tooltip": "ROSE QUARTZ TOOLS",
"tool.create.rose_quartz.tooltip.summary": "This tool grants you a _greater_ _reach_ for _breaking_ _blocks_ or _placing_ _blocks_ from the off-hand.",
"create.tooltip.wip": "WIP",
"create.tooltip.workInProgress": "Work in progress!",
"create.tooltip.randomWipDescription0": "Please keep this item away from children.",

View File

@ -0,0 +1,3 @@
{
"parent": "create:item/extendo_grip/item"
}

View File

@ -0,0 +1,28 @@
{
"parent": "create:extendo_grip",
"display": {
"icon": {
"item": "create:extendo_grip"
},
"title": {
"translate": "advancement.create.dual_extendo_grip"
},
"description": {
"translate": "advancement.create.dual_extendo_grip.desc"
},
"frame": "goal",
"show_toast": true,
"announce_to_chat": true,
"hidden": true
},
"criteria": {
"0": {
"trigger": "create:giga_extendo"
}
},
"requirements": [
[
"0"
]
]
}

View File

@ -0,0 +1,28 @@
{
"parent": "create:brass",
"display": {
"icon": {
"item": "create:extendo_grip"
},
"title": {
"translate": "advancement.create.extendo_grip"
},
"description": {
"translate": "advancement.create.extendo_grip.desc"
},
"frame": "task",
"show_toast": true,
"announce_to_chat": false,
"hidden": false
},
"criteria": {
"0": {
"trigger": "create:extendo"
}
},
"requirements": [
[
"0"
]
]
}

View File

@ -24,6 +24,8 @@ import com.simibubi.create.content.curiosities.symmetry.SymmetryWandItem;
import com.simibubi.create.content.curiosities.symmetry.client.SymmetryWandModel;
import com.simibubi.create.content.curiosities.tools.DeforesterItem;
import com.simibubi.create.content.curiosities.tools.DeforesterModel;
import com.simibubi.create.content.curiosities.tools.ExtendoGripItem;
import com.simibubi.create.content.curiosities.tools.ExtendoGripModel;
import com.simibubi.create.content.curiosities.tools.SandPaperItem;
import com.simibubi.create.content.curiosities.tools.SandPaperItemRenderer.SandPaperModel;
import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperItem;
@ -52,8 +54,8 @@ public class AllItems {
REGISTRATE.startSection(MATERIALS);
}
public static final ItemEntry<Item>
COPPER_NUGGET = taggedIngredient("copper_nugget", forgeItemTag("nuggets/copper")),
public static final ItemEntry<Item> COPPER_NUGGET =
taggedIngredient("copper_nugget", forgeItemTag("nuggets/copper")),
ZINC_NUGGET = taggedIngredient("zinc_nugget", forgeItemTag("nuggets/zinc")),
BRASS_NUGGET = taggedIngredient("brass_nugget", forgeItemTag("nuggets/brass")),
@ -63,9 +65,9 @@ public class AllItems {
GOLDEN_SHEET = taggedIngredient("golden_sheet", forgeItemTag("plates/gold")),
LAPIS_SHEET = ingredient("lapis_sheet"),
CRUSHED_IRON = taggedIngredient("crushed_iron_ore", AllItemTags.CRUSHED_ORES.tag),
CRUSHED_IRON = taggedIngredient("crushed_iron_ore", AllItemTags.CRUSHED_ORES.tag),
CRUSHED_GOLD = taggedIngredient("crushed_gold_ore", AllItemTags.CRUSHED_ORES.tag),
CRUSHED_COPPER = taggedIngredient("crushed_copper_ore", AllItemTags.CRUSHED_ORES.tag),
CRUSHED_COPPER = taggedIngredient("crushed_copper_ore", AllItemTags.CRUSHED_ORES.tag),
CRUSHED_ZINC = taggedIngredient("crushed_zinc_ore", AllItemTags.CRUSHED_ORES.tag),
CRUSHED_BRASS = taggedIngredient("crushed_brass", AllItemTags.CRUSHED_ORES.tag),
@ -74,14 +76,10 @@ public class AllItems {
ZINC_INGOT = taggedIngredient("zinc_ingot", forgeItemTag("ingots/zinc")),
BRASS_INGOT = taggedIngredient("brass_ingot", forgeItemTag("ingots/brass")),
WHEAT_FLOUR = ingredient("wheat_flour"),
DOUGH = ingredient("dough"),
POWDERED_OBSIDIAN = ingredient("powdered_obsidian"),
ROSE_QUARTZ = ingredient("rose_quartz"),
POLISHED_ROSE_QUARTZ = ingredient("polished_rose_quartz"),
PROPELLER = ingredient("propeller"),
WHISK = ingredient("whisk"),
BRASS_HAND = ingredient("brass_hand"),
WHEAT_FLOUR = ingredient("wheat_flour"), DOUGH = ingredient("dough"),
POWDERED_OBSIDIAN = ingredient("powdered_obsidian"), ROSE_QUARTZ = ingredient("rose_quartz"),
POLISHED_ROSE_QUARTZ = ingredient("polished_rose_quartz"), PROPELLER = ingredient("propeller"),
WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"),
CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover");
public static final ItemEntry<ChromaticCompoundItem> CHROMATIC_COMPOUND =
@ -115,9 +113,10 @@ public class AllItems {
.lang("Mechanical Belt")
.register();
public static final ItemEntry<VerticalGearboxItem> VERTICAL_GEARBOX = REGISTRATE.item("vertical_gearbox", VerticalGearboxItem::new)
.model(AssetLookup.<VerticalGearboxItem>customItemModel("gearbox", "item_vertical"))
.register();
public static final ItemEntry<VerticalGearboxItem> VERTICAL_GEARBOX =
REGISTRATE.item("vertical_gearbox", VerticalGearboxItem::new)
.model(AssetLookup.<VerticalGearboxItem>customItemModel("gearbox", "item_vertical"))
.register();
public static final ItemEntry<SuperGlueItem> SUPER_GLUE = REGISTRATE.item("super_glue", SuperGlueItem::new)
.register();
@ -196,6 +195,11 @@ public class AllItems {
.model(AssetLookup.itemModelWithPartials())
.register();
public static final ItemEntry<ExtendoGripItem> EXTENDO_GRIP = REGISTRATE.item("extendo_grip", ExtendoGripItem::new)
.transform(CreateRegistrate.customRenderedItem(() -> ExtendoGripModel::new))
.model(AssetLookup.itemModelWithPartials())
.register();
// Schematics
static {
@ -227,7 +231,7 @@ public class AllItems {
.tag(tag)
.register();
}
// Load this class
public static void register() {}

View File

@ -10,6 +10,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.structureMovement.ChassisRangeDisplay;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer;
import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler;
import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler;
import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler;
import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperRenderHandler;
import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler;
@ -107,6 +108,7 @@ public class CreateClient {
BlockzapperRenderHandler.tick();
KineticDebugger.tick();
ZapperRenderHandler.tick();
ExtendoGripRenderHandler.tick();
outliner.tickOutlines();
}

View File

@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con
import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity.CartMovementMode;
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.VecHelper;
import net.minecraft.block.AbstractRailBlock;
import net.minecraft.block.Block;
@ -26,6 +27,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.shapes.VoxelShapes;
@ -61,10 +63,12 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
boolean alongX = context.getPlacementHorizontalFacing().getAxis() == Axis.X;
boolean powered = context.getWorld().isBlockPowered(context.getPos());
return super.getStateForPlacement(context).with(POWERED, Boolean.valueOf(powered)).with(RAIL_SHAPE,
alongX ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH);
boolean alongX = context.getPlacementHorizontalFacing()
.getAxis() == Axis.X;
boolean powered = context.getWorld()
.isBlockPowered(context.getPos());
return super.getStateForPlacement(context).with(POWERED, Boolean.valueOf(powered))
.with(RAIL_SHAPE, alongX ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH);
}
@Override
@ -76,16 +80,18 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
public void onMinecartPass(BlockState state, World world, BlockPos pos, AbstractMinecartEntity cart) {
if (!cart.canBeRidden() && !(cart instanceof FurnaceMinecartEntity))
return;
withTileEntityDo(world, pos, te -> {
if(te.isMinecartUpdateValid()) {
if (te.isMinecartUpdateValid()) {
if (state.get(POWERED)) {
assemble(world, pos, cart);
cart.setVelocity(cart.getAdjustedHorizontalFacing().getXOffset(), cart.getAdjustedHorizontalFacing().getYOffset(), cart.getAdjustedHorizontalFacing().getZOffset());
}
else {
Direction facing = cart.getAdjustedHorizontalFacing();
cart.setVelocity(facing.getXOffset(), facing.getYOffset(), facing.getZOffset());
} else {
disassemble(world, pos, cart);
cart.setVelocity(0, 0, 0);
Vec3d diff = VecHelper.getCenterOf(pos)
.subtract(cart.getPositionVec());
cart.setVelocity(diff.x / 16f, 0, diff.z / 16f);
}
te.resetTicksSinceMinecartUpdate();
}
@ -93,7 +99,8 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
}
protected void assemble(World world, BlockPos pos, AbstractMinecartEntity cart) {
if (!cart.getPassengers().isEmpty())
if (!cart.getPassengers()
.isEmpty())
return;
MountedContraption contraption = MountedContraption.assembleMinecart(world, pos);
@ -102,16 +109,15 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
if (contraption.blocks.size() == 1)
return;
int yawFromVector = (int) (ContraptionEntity.yawFromVector(cart.getMotion()) + .5d);
yawFromVector = ((yawFromVector + 45) / 90) * 90;
float initialAngle = yawFromVector;
Direction facing = cart.getAdjustedHorizontalFacing();
float initialAngle = facing.getHorizontalAngle();
withTileEntityDo(world, pos, te -> contraption.rotationMode = CartMovementMode.values()[te.movementMode.value]);
ContraptionEntity entity = ContraptionEntity.createMounted(world, contraption, initialAngle);
ContraptionEntity entity = ContraptionEntity.createMounted(world, contraption, initialAngle, facing);
entity.setPosition(pos.getX(), pos.getY(), pos.getZ());
world.addEntity(entity);
entity.startRiding(cart);
if (cart instanceof FurnaceMinecartEntity) {
CompoundNBT nbt = cart.serializeNBT();
nbt.putDouble("PushZ", 0);
@ -121,12 +127,14 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
}
protected void disassemble(World world, BlockPos pos, AbstractMinecartEntity cart) {
if (cart.getPassengers().isEmpty())
if (cart.getPassengers()
.isEmpty())
return;
if (!(cart.getPassengers().get(0) instanceof ContraptionEntity))
if (!(cart.getPassengers()
.get(0) instanceof ContraptionEntity))
return;
cart.removePassengers();
if (cart instanceof FurnaceMinecartEntity) {
CompoundNBT nbt = cart.serializeNBT();
nbt.putDouble("PushZ", cart.getMotion().x);
@ -137,7 +145,7 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
boolean isMoving) {
super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving);
if (worldIn.isRemote)
@ -157,12 +165,12 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.CART_ASSEMBLER
.get(state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? Direction.Axis.Z : Direction.Axis.X);
.get(state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? Direction.Axis.Z : Direction.Axis.X);
}
@Override
public VoxelShape getCollisionShape(BlockState state, IBlockReader worldIn, BlockPos pos,
ISelectionContext context) {
ISelectionContext context) {
if (context.getEntity() instanceof AbstractMinecartEntity)
return VoxelShapes.empty();
return VoxelShapes.fullCube();
@ -189,10 +197,10 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
builder.add(BlockStateProperties.HORIZONTAL_AXIS);
super.fillStateContainer(builder);
}
@Override
public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_,
ISelectionContext p_220053_4_) {
ISelectionContext p_220053_4_) {
return VoxelShapes.empty();
}
@ -200,7 +208,8 @@ public class CartAssemblerBlock extends AbstractRailBlock implements ITE<CartAss
public static BlockState createAnchor(BlockState state) {
Axis axis = state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? Axis.Z : Axis.X;
return AllBlocks.MINECART_ANCHOR.getDefaultState().with(BlockStateProperties.HORIZONTAL_AXIS, axis);
return AllBlocks.MINECART_ANCHOR.getDefaultState()
.with(BlockStateProperties.HORIZONTAL_AXIS, axis);
}
@Override

View File

@ -0,0 +1,95 @@
package com.simibubi.create.content.curiosities.tools;
import java.util.UUID;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.advancement.AllTriggers;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.Rarity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber
public class ExtendoGripItem extends Item {
static Multimap<String, AttributeModifier> rangeModifier;
static Multimap<String, AttributeModifier> doubleRangeModifier;
static {
// Holding an ExtendoGrip
rangeModifier = HashMultimap.create();
rangeModifier.put(PlayerEntity.REACH_DISTANCE.getName(),
new AttributeModifier(UUID.fromString("7f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 3,
AttributeModifier.Operation.ADDITION));
// Holding two ExtendoGrips o.O
doubleRangeModifier = HashMultimap.create();
doubleRangeModifier.put(PlayerEntity.REACH_DISTANCE.getName(),
new AttributeModifier(UUID.fromString("8f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 5,
AttributeModifier.Operation.ADDITION));
}
public ExtendoGripItem(Properties properties) {
super(properties.maxStackSize(1)
.rarity(Rarity.UNCOMMON));
}
@SubscribeEvent
public static void holdingExtendoGripIncreasesRange(LivingUpdateEvent event) {
if (!(event.getEntity() instanceof PlayerEntity))
return;
if (event.isCanceled())
return;
PlayerEntity player = (PlayerEntity) event.getEntityLiving();
String marker = "createExtendo";
String dualMarker = "createDualExtendo";
CompoundNBT persistentData = player.getPersistentData();
boolean inOff = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemOffhand());
boolean inMain = AllItems.EXTENDO_GRIP.isIn(player.getHeldItemMainhand());
boolean holdingDualExtendo = inOff && inMain;
boolean holdingExtendo = inOff ^ inMain;
holdingExtendo &= !holdingDualExtendo;
boolean wasHoldingExtendo = persistentData.contains(marker);
boolean wasHoldingDualExtendo = persistentData.contains(dualMarker);
if (holdingExtendo != wasHoldingExtendo) {
if (!holdingExtendo) {
player.getAttributes()
.removeAttributeModifiers(rangeModifier);
persistentData.remove(marker);
} else {
if (player instanceof ServerPlayerEntity)
AllTriggers.EXTENDO.trigger((ServerPlayerEntity) player);
player.getAttributes()
.applyAttributeModifiers(rangeModifier);
persistentData.putBoolean(marker, true);
}
}
if (holdingDualExtendo != wasHoldingDualExtendo) {
if (!holdingDualExtendo) {
player.getAttributes()
.removeAttributeModifiers(doubleRangeModifier);
persistentData.remove(dualMarker);
} else {
if (player instanceof ServerPlayerEntity)
AllTriggers.GIGA_EXTENDO.trigger((ServerPlayerEntity) player);
player.getAttributes()
.applyAttributeModifiers(doubleRangeModifier);
persistentData.putBoolean(dualMarker, true);
}
}
}
}

View File

@ -0,0 +1,113 @@
package com.simibubi.create.content.curiosities.tools;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer;
import com.simibubi.create.foundation.item.PartialItemModelRenderer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
public class ExtendoGripItemRenderer extends CustomRenderedItemModelRenderer<ExtendoGripModel> {
@Override
protected void render(ItemStack stack, ExtendoGripModel model, PartialItemModelRenderer renderer, MatrixStack ms,
IRenderTypeBuffer buffer, int light, int overlay) {
MatrixStacker stacker = MatrixStacker.of(ms);
float animation = 0.25f;
TransformType perspective = model.getCurrentPerspective();
boolean leftHand = perspective == TransformType.FIRST_PERSON_LEFT_HAND;
boolean rightHand = perspective == TransformType.FIRST_PERSON_RIGHT_HAND;
if (leftHand || rightHand)
animation = MathHelper.lerp(Minecraft.getInstance()
.getRenderPartialTicks(), ExtendoGripRenderHandler.lastMainHandAnimation,
ExtendoGripRenderHandler.mainHandAnimation);
animation = animation * animation * animation;
Vec3d rotationOffset = new Vec3d(0, 1 / 2f, 1 / 2f);
float extensionAngle = MathHelper.lerp(animation, 24f, 156f);
float halfAngle = extensionAngle / 2;
float oppositeAngle = 180 - extensionAngle;
// grip
renderer.renderSolid(model.getBakedModel(), light);
// bits
ms.push();
ms.translate(0, 1 / 16f, -7 / 16f);
ms.scale(1, 1, 1 + animation);
ms.push();
stacker.rotateX(-halfAngle)
.translate(rotationOffset);
renderer.renderSolid(model.getPartial("thin_short"), light);
stacker.translateBack(rotationOffset);
ms.translate(0, 5.5f / 16f, 0);
stacker.rotateX(-oppositeAngle)
.translate(rotationOffset);
renderer.renderSolid(model.getPartial("wide_long"), light);
stacker.translateBack(rotationOffset);
ms.translate(0, 11 / 16f, 0);
stacker.rotateX(oppositeAngle)
.translate(rotationOffset);
ms.translate(0, 0.5f / 16f, 0);
renderer.renderSolid(model.getPartial("thin_short"), light);
stacker.translateBack(rotationOffset);
ms.pop();
ms.push();
stacker.rotateX(-180 + halfAngle)
.translate(rotationOffset);
renderer.renderSolid(model.getPartial("wide_short"), light);
stacker.translateBack(rotationOffset);
ms.translate(0, 5.5f / 16f, 0);
stacker.rotateX(oppositeAngle)
.translate(rotationOffset);
renderer.renderSolid(model.getPartial("thin_long"), light);
stacker.translateBack(rotationOffset);
ms.translate(0, 11 / 16f, 0);
stacker.rotateX(-oppositeAngle)
.translate(rotationOffset);
ms.translate(0, 0.5f / 16f, 0);
renderer.renderSolid(model.getPartial("wide_short"), light);
stacker.translateBack(rotationOffset);
// hand
ms.translate(0, 5.5f / 16f, 0);
stacker.rotateX(180 - halfAngle)
.rotateY(180);
ms.translate(0, 0, -4 / 16f);
ms.scale(1, 1, 1 / (1 + animation));
renderer.renderSolid((leftHand || rightHand) ? ExtendoGripRenderHandler.pose.get()
: AllBlockPartials.DEPLOYER_HAND_POINTING.get(), light);
ms.pop();
ms.pop();
// cog
ms.push();
float angle = AnimationTickHolder.getRenderTick() * -2;
if (leftHand || rightHand)
angle += 360 * animation;
angle %= 360;
float offset = 1 / 16f;
rotationOffset = new Vec3d(0, offset, 0);
stacker.translate(rotationOffset)
.rotateZ(angle)
.translateBack(rotationOffset);
renderer.renderSolid(model.getPartial("cog"), light);
ms.pop();
}
}

View File

@ -0,0 +1,20 @@
package com.simibubi.create.content.curiosities.tools;
import com.simibubi.create.foundation.block.render.CustomRenderedItemModel;
import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer;
public class ExtendoGripModel extends CustomRenderedItemModel {
public ExtendoGripModel(IBakedModel template) {
super(template, "extendo_grip");
addPartials("cog", "thin_short", "wide_short", "thin_long", "wide_long");
}
@Override
public ItemStackTileEntityRenderer createRenderer() {
return new ExtendoGripItemRenderer();
}
}

View File

@ -0,0 +1,139 @@
package com.simibubi.create.content.curiosities.tools;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllItems;
import com.simibubi.create.foundation.utility.MatrixStacker;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.renderer.FirstPersonRenderer;
import net.minecraft.client.renderer.entity.PlayerRenderer;
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand;
import net.minecraft.util.HandSide;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber
public class ExtendoGripRenderHandler {
public static float mainHandAnimation;
public static float lastMainHandAnimation;
public static AllBlockPartials pose = AllBlockPartials.DEPLOYER_HAND_PUNCHING;
public static void tick() {
lastMainHandAnimation = mainHandAnimation;
mainHandAnimation *= MathHelper.clamp(mainHandAnimation, 0.8f, 0.99f);
Minecraft mc = Minecraft.getInstance();
ClientPlayerEntity player = mc.player;
pose = AllBlockPartials.DEPLOYER_HAND_PUNCHING;
if (!AllItems.EXTENDO_GRIP.isIn(player.getHeldItemOffhand()))
return;
ItemStack main = player.getHeldItemMainhand();
if (main.isEmpty())
return;
if (!(main.getItem() instanceof BlockItem))
return;
if (!Minecraft.getInstance()
.getItemRenderer()
.getItemModelWithOverrides(main, null, null)
.isGui3d())
return;
pose = AllBlockPartials.DEPLOYER_HAND_HOLDING;
}
@SubscribeEvent
public static void onRenderPlayerHand(RenderHandEvent event) {
ItemStack heldItem = event.getItemStack();
Minecraft mc = Minecraft.getInstance();
ClientPlayerEntity player = mc.player;
boolean rightHand = event.getHand() == Hand.MAIN_HAND ^ player.getPrimaryHand() == HandSide.LEFT;
ItemStack offhandItem = player.getHeldItemOffhand();
boolean notInOffhand = !AllItems.EXTENDO_GRIP.isIn(offhandItem);
if (notInOffhand && !AllItems.EXTENDO_GRIP.isIn(heldItem))
return;
MatrixStack ms = event.getMatrixStack();
MatrixStacker msr = MatrixStacker.of(ms);
AbstractClientPlayerEntity abstractclientplayerentity = mc.player;
mc.getTextureManager()
.bindTexture(abstractclientplayerentity.getLocationSkin());
float f = rightHand ? 1.0F : -1.0F;
float swingProgress = event.getSwingProgress();
float f3 = 0.4F * MathHelper.sin(((float) Math.PI * 2F));
boolean blockItem = heldItem.getItem() instanceof BlockItem;
float equipProgress = blockItem ? 0 : event.getEquipProgress() / 4;
ms.push();
if (event.getHand() == Hand.MAIN_HAND) {
if (1 - swingProgress > mainHandAnimation && swingProgress > 0)
mainHandAnimation = 0.95f;
float animation = MathHelper.lerp(Minecraft.getInstance()
.getRenderPartialTicks(), ExtendoGripRenderHandler.lastMainHandAnimation,
ExtendoGripRenderHandler.mainHandAnimation);
animation = animation * animation * animation;
ms.translate(f * (0.64000005F - .1f), f3 + -0.4F + equipProgress * -0.6F, -0.71999997F + .3f);
ms.push();
msr.rotateY(f * 75.0F);
ms.translate(f * -1.0F, 3.6F, 3.5F);
msr.rotateZ(f * 120)
.rotateX(200)
.rotateY(f * -135.0F);
ms.translate(f * 5.6F, 0.0F, 0.0F);
msr.rotateY(f * 40.0F);
ms.translate(0.05f, -0.3f, -0.3f);
PlayerRenderer playerrenderer = (PlayerRenderer) mc.getRenderManager()
.getRenderer(player);
if (rightHand)
playerrenderer.renderRightArm(event.getMatrixStack(), event.getBuffers(), event.getLight(), player);
else
playerrenderer.renderLeftArm(event.getMatrixStack(), event.getBuffers(), event.getLight(), player);
ms.pop();
// Render gun
ms.push();
ms.translate(f * -0.1f, 0, -0.3f);
FirstPersonRenderer firstPersonRenderer = mc.getFirstPersonRenderer();
TransformType transform =
rightHand ? TransformType.FIRST_PERSON_RIGHT_HAND : TransformType.FIRST_PERSON_LEFT_HAND;
firstPersonRenderer.renderItem(mc.player, notInOffhand ? heldItem : offhandItem, transform, !rightHand,
event.getMatrixStack(), event.getBuffers(), event.getLight());
if (!notInOffhand) {
ForgeHooksClient.handleCameraTransforms(ms, mc.getItemRenderer()
.getItemModelWithOverrides(offhandItem, null, null), transform, false);
ms.translate(f * -.05f, .15f, -1.2f);
ms.translate(0, 0, -animation * 2.25f);
if (blockItem && mc.getItemRenderer()
.getItemModelWithOverrides(heldItem, null, null)
.isGui3d()) {
msr.rotateY(45);
ms.translate(0.15f, -0.15f, -.05f);
ms.scale(1.25f, 1.25f, 1.25f);
}
firstPersonRenderer.renderItem(mc.player, heldItem, transform, !rightHand, event.getMatrixStack(),
event.getBuffers(), event.getLight());
}
ms.pop();
}
ms.pop();
event.setCanceled(true);
}
}

View File

@ -141,6 +141,8 @@ public class ZapperRenderHandler {
ItemStack heldItem = event.getItemStack();
if (!(heldItem.getItem() instanceof ZapperItem))
return;
if (event.isCanceled())
return;
Minecraft mc = Minecraft.getInstance();
boolean rightHand = event.getHand() == Hand.MAIN_HAND ^ mc.player.getPrimaryHand() == HandSide.LEFT;
@ -164,11 +166,12 @@ public class ZapperRenderHandler {
float f2 = -0.3F * MathHelper.sin(f1 * (float) Math.PI);
float f3 = 0.4F * MathHelper.sin(f1 * ((float) Math.PI * 2F));
float f4 = -0.4F * MathHelper.sin(event.getSwingProgress() * (float) Math.PI);
float f5 = MathHelper.sin(event.getSwingProgress() * event.getSwingProgress() * (float) Math.PI);
float f6 = MathHelper.sin(f1 * (float) Math.PI);
ms.translate(f * (f2 + 0.64000005F - .1f), f3 + -0.4F + equipProgress * -0.6F,
f4 + -0.71999997F + .3f + recoil);
ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * 75.0F));
float f5 = MathHelper.sin(event.getSwingProgress() * event.getSwingProgress() * (float) Math.PI);
float f6 = MathHelper.sin(f1 * (float) Math.PI);
ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * f6 * 70.0F));
ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(f * f5 * -20.0F));
AbstractClientPlayerEntity abstractclientplayerentity = mc.player;
@ -180,6 +183,7 @@ public class ZapperRenderHandler {
ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * -135.0F));
ms.translate(f * 5.6F, 0.0F, 0.0F);
ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(f * 40.0F));
PlayerRenderer playerrenderer = (PlayerRenderer) mc.getRenderManager()
.getRenderer(abstractclientplayerentity);
if (rightHand) {

View File

@ -186,6 +186,16 @@ public class AllAdvancements implements IDataProvider {
.withParent(brass_casing)
.register(t, id + ":crafter");
Advancement extendo_grip =
advancement("extendo_grip", AllItems.EXTENDO_GRIP.get(), TaskType.NORMAL).withParent(root)
.withCriterion("0", AllTriggers.EXTENDO.instance())
.register(t, id + ":extendo_grip");
Advancement dual_extendo_grip =
advancement("dual_extendo_grip", AllItems.EXTENDO_GRIP.get(), TaskType.SECRET).withParent(extendo_grip)
.withCriterion("0", AllTriggers.GIGA_EXTENDO.instance())
.register(t, id + ":dual_extendo_grip");
Advancement deployer =
kinecticAdvancement("deployer", AllBlocks.DEPLOYER.get(), TaskType.GOAL).withParent(brass_casing)
.register(t, id + ":deployer");
@ -208,9 +218,9 @@ public class AllAdvancements implements IDataProvider {
itemAdvancement("shadow_steel", AllItems.SHADOW_STEEL, TaskType.GOAL).withParent(chromatic_compound)
.register(t, id + ":shadow_steel");
Advancement refined_radiance = itemAdvancement("refined_radiance", AllItems.REFINED_RADIANCE, TaskType.GOAL)
.withParent(chromatic_compound)
.register(t, id + ":refined_radiance");
Advancement refined_radiance =
itemAdvancement("refined_radiance", AllItems.REFINED_RADIANCE, TaskType.GOAL).withParent(chromatic_compound)
.register(t, id + ":refined_radiance");
Advancement deforester =
itemAdvancement("deforester", AllItems.DEFORESTER, TaskType.NORMAL).withParent(refined_radiance)

View File

@ -31,6 +31,8 @@ public class AllTriggers {
BASIN_THROW = simple("basin"),
PRESS_COMPACT = simple("compact"),
UPGRADED_ZAPPER = simple("upgraded_zapper"),
EXTENDO = simple("extendo"),
GIGA_EXTENDO = simple("giga_extendo"),
MIXER_MIX = simple("mixer");
private static SimpleTrigger simple(String id) {

View File

@ -81,6 +81,10 @@
"advancement.create.wand_of_symmetry.desc": "Craft a Staff of Symmetry.",
"advancement.create.deforester": "Radiant Chopping",
"advancement.create.deforester.desc": "Craft a Deforester, and say goodbye to the local forest.",
"advancement.create.extendo_grip": "Boioioing!",
"advancement.create.extendo_grip.desc": "Get hold of an Extendo Grip.",
"advancement.create.dual_extendo_grip": "Ultimate Boing-age",
"advancement.create.dual_extendo_grip.desc": "Dual wield Extendo Grips for super-human reach.",
"advancement.create.eob": "End of Beta",
"advancement.create.eob.desc": "Expect more content here in the future. <3"

View File

@ -45,7 +45,12 @@
"item.create.deforester.tooltip": "DEFORESTER",
"item.create.deforester.tooltip.summary": "A _radiant_ _axe_ able to chop down trees in a split second.",
"item.create.extendo_grip.tooltip": "EXTENDO GRIP",
"item.create.extendo_grip.tooltip.summary": "Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.",
"item.create.extendo_grip.tooltip.condition1": "When in Off-Hand",
"item.create.extendo_grip.tooltip.behaviour1": "Increases _reach_ _distance_ of items used in the _Main-Hand_.",
"item.create.filter.tooltip": "FILTER",
"item.create.filter.tooltip.summary": "_Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ _items_ or several _nested_ _filters_.",
"item.create.filter.tooltip.condition1": "When in filter slot",
@ -491,15 +496,6 @@
"item.create.crafter_slot_cover.tooltip": "SLOT COVER",
"item.create.crafter_slot_cover.tooltip.summary": "Used to mark a _Mechanical_ _Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients_ _are_ _diagonal_ to each other.",
"tool.create.shadow_steel.tooltip": "SHADOW STEEL TOOLS",
"tool.create.shadow_steel.tooltip.summary": "A fast and powerful tool that _destroys_ _drops_ from any block or entity. Killed mobs can drop _more_ _experience_ based on the _Looting_ modifier of this tool.",
"tool.create.blazing.tooltip": "BLAZING TOOLS",
"tool.create.blazing.tooltip.summary": "This tool will _melt_ _broken_ _blocks_ and _ignite_ _attacked_ _mobs_. It will not lose Durability while being used in the _Nether_.",
"tool.create.rose_quartz.tooltip": "ROSE QUARTZ TOOLS",
"tool.create.rose_quartz.tooltip.summary": "This tool grants you a _greater_ _reach_ for _breaking_ _blocks_ or _placing_ _blocks_ from the off-hand.",
"create.tooltip.wip": "WIP",
"create.tooltip.workInProgress": "Work in progress!",

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,65 @@
{
"credit": "Made with Blockbench",
"parent": "create:item/extendo_grip/item",
"textures": {
"cog": "block/stripped_dark_oak_log"
},
"elements": [
{
"name": "Cog",
"from": [7, 5, 3],
"to": [9, 13, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [7.5, 11.5, 9]},
"faces": {
"north": {"uv": [4, 4, 5, 9], "texture": "#cog"},
"east": {"uv": [4, 6, 6, 11], "texture": "#cog"},
"south": {"uv": [6, 7, 8, 12], "texture": "#cog"},
"west": {"uv": [5, 3, 7, 8], "texture": "#cog"},
"up": {"uv": [4, 6, 5, 8], "rotation": 180, "texture": "#cog"},
"down": {"uv": [5, 6, 6, 8], "rotation": 180, "texture": "#cog"}
}
},
{
"name": "Cog",
"from": [4, 8, 3],
"to": [12, 10, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 5]},
"faces": {
"north": {"uv": [4, 4, 5, 9], "rotation": 270, "texture": "#cog"},
"east": {"uv": [4, 6, 5, 8], "rotation": 270, "texture": "#cog"},
"south": {"uv": [6, 7, 8, 12], "rotation": 90, "texture": "#cog"},
"west": {"uv": [5, 6, 6, 8], "rotation": 270, "texture": "#cog"},
"up": {"uv": [5, 3, 7, 8], "rotation": 90, "texture": "#cog"},
"down": {"uv": [4, 6, 6, 11], "rotation": 90, "texture": "#cog"}
}
},
{
"name": "Cog",
"from": [7, 5, 3],
"to": [9, 13, 5],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 9, 5]},
"faces": {
"north": {"uv": [4, 4, 5, 9], "rotation": 180, "texture": "#cog"},
"east": {"uv": [5, 3, 7, 8], "rotation": 180, "texture": "#cog"},
"south": {"uv": [6, 7, 8, 12], "rotation": 180, "texture": "#cog"},
"west": {"uv": [4, 6, 6, 11], "rotation": 180, "texture": "#cog"},
"up": {"uv": [5, 6, 6, 8], "texture": "#cog"},
"down": {"uv": [4, 6, 5, 8], "texture": "#cog"}
}
},
{
"name": "Cog",
"from": [7, 5, 3],
"to": [9, 13, 5],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 9, 5]},
"faces": {
"north": {"uv": [4, 4, 5, 9], "rotation": 180, "texture": "#cog"},
"east": {"uv": [5, 3, 7, 8], "rotation": 180, "texture": "#cog"},
"south": {"uv": [6, 7, 8, 12], "rotation": 180, "texture": "#cog"},
"west": {"uv": [4, 6, 6, 11], "rotation": 180, "texture": "#cog"},
"up": {"uv": [5, 6, 6, 8], "texture": "#cog"},
"down": {"uv": [4, 6, 5, 8], "texture": "#cog"}
}
}
]
}

View File

@ -0,0 +1,113 @@
{
"credit": "Made with Blockbench",
"textures": {
"3": "create:block/mechanical_press_pole",
"4": "create:item/extendo_grip",
"particle": "texture"
},
"elements": [
{
"from": [7, 3.8, 11.4],
"to": [9, 9.8, 14.4],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8.5, 4.5, 14]},
"faces": {
"north": {"uv": [4, 6, 6, 12], "texture": "#4"},
"east": {"uv": [3, 6, 6, 12], "texture": "#4"},
"south": {"uv": [4, 6, 6, 12], "texture": "#4"},
"west": {"uv": [3, 6, 6, 12], "texture": "#4"},
"up": {"uv": [0, 0, 2, 3], "rotation": 180, "texture": "#4"},
"down": {"uv": [10, 3, 12, 6], "texture": "#4"}
}
},
{
"from": [7.5, 4.8, 9.4],
"to": [8.5, 10.8, 12.4],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 5.5, 12]},
"faces": {
"north": {"uv": [14, 6, 15, 12], "texture": "#4"},
"east": {"uv": [14, 6, 17, 12], "texture": "#4"},
"west": {"uv": [14, 6, 17, 12], "texture": "#4"},
"down": {"uv": [14, 6, 15, 9], "texture": "#4"}
}
},
{
"from": [6, 8, 7],
"to": [10, 11, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [9, 8.5, 9.5]},
"faces": {
"north": {"uv": [14, 0, 18, 3], "rotation": 180, "texture": "#4"},
"east": {"uv": [10, 3, 16, 6], "texture": "#4"},
"south": {"uv": [12, 0, 16, 3], "rotation": 180, "texture": "#4"},
"west": {"uv": [10, 3, 16, 6], "rotation": 180, "texture": "#4"},
"up": {"uv": [10, 0, 16, 4], "rotation": 90, "texture": "#4"},
"down": {"uv": [10, 0, 16, 4], "rotation": 270, "texture": "#4"}
}
},
{
"from": [5, 7, 5],
"to": [11, 11, 7],
"rotation": {"angle": 0, "axis": "y", "origin": [9, 8.5, 7.5]},
"faces": {
"north": {"uv": [12, 0, 16, 6], "rotation": 90, "texture": "#4"},
"east": {"uv": [12, 2, 14, 6], "texture": "#4"},
"south": {"uv": [12, 0, 16, 6], "rotation": 90, "texture": "#4"},
"west": {"uv": [14, 1, 16, 5], "rotation": 180, "texture": "#4"},
"up": {"uv": [14, 0, 16, 6], "rotation": 90, "texture": "#4"},
"down": {"uv": [12, 0, 14, 6], "rotation": 270, "texture": "#4"}
}
},
{
"name": "Cap",
"from": [5, 6, 1],
"to": [11, 12, 3],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 9, 16]},
"faces": {
"north": {"uv": [10, 6, 16, 12], "texture": "#3"},
"east": {"uv": [0, 14, 6, 16], "rotation": 90, "texture": "#3"},
"south": {"uv": [10, 6, 16, 12], "texture": "#3"},
"west": {"uv": [0, 14, 6, 16], "rotation": 90, "texture": "#3"},
"up": {"uv": [0, 14, 6, 16], "rotation": 180, "texture": "#3"},
"down": {"uv": [0, 14, 6, 16], "texture": "#3"}
}
}
],
"display": {
"thirdperson_righthand": {
"translation": [0, 0.5, -0.5],
"scale": [0.55, 0.55, 0.55]
},
"thirdperson_lefthand": {
"translation": [0, 0.5, -0.5],
"scale": [0.55, 0.55, 0.55]
},
"firstperson_righthand": {
"rotation": [11, 11, 0],
"translation": [0.25, 2.25, 2.75],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"rotation": [11, 11, 0],
"translation": [0.25, 2.25, 2.75],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"rotation": [0, 0, 90],
"translation": [0, -0.75, 4],
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [-23, 145, 0],
"translation": [4, -2.25, 0],
"scale": [0.625, 0.625, 0.625]
},
"head": {
"rotation": [0, 180, 0],
"translation": [0, 13, 7]
},
"fixed": {
"rotation": [0, 90, 0],
"translation": [4.75, 0, 0],
"scale": [0.5, 0.5, 0.5]
}
}
}

View File

@ -0,0 +1,21 @@
{
"textures": {
"4": "create:item/extendo_grip"
},
"elements": [
{
"name": "thin_long",
"from": [7, -1, -1],
"to": [9, 12, 1],
"rotation": {"angle": 0, "axis": "x", "origin": [10.5, 9, 0]},
"faces": {
"north": {"uv": [4, 0, 6, 13], "texture": "#4"},
"east": {"uv": [4, 0, 6, 13], "texture": "#4"},
"south": {"uv": [4, 0, 6, 13], "texture": "#4"},
"west": {"uv": [4, 0, 6, 13], "texture": "#4"},
"up": {"uv": [6, 9, 8, 11], "rotation": 180, "texture": "#4"},
"down": {"uv": [6, 14, 8, 16], "rotation": 180, "texture": "#4"}
}
}
]
}

View File

@ -0,0 +1,21 @@
{
"textures": {
"4": "create:item/extendo_grip"
},
"elements": [
{
"name": "thin_short",
"from": [7, -1, -1],
"to": [9, 6, 1],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0]},
"faces": {
"north": {"uv": [6, 9, 8, 16], "rotation": 180, "texture": "#4"},
"east": {"uv": [6, 9, 8, 16], "rotation": 180, "texture": "#4"},
"south": {"uv": [6, 9, 8, 16], "rotation": 180, "texture": "#4"},
"west": {"uv": [6, 9, 8, 16], "rotation": 180, "texture": "#4"},
"up": {"uv": [6, 14, 8, 16], "rotation": 180, "texture": "#4"},
"down": {"uv": [6, 9, 8, 11], "rotation": 180, "texture": "#4"}
}
}
]
}

View File

@ -0,0 +1,21 @@
{
"textures": {
"4": "create:item/extendo_grip"
},
"elements": [
{
"name": "wide_long",
"from": [6, -1, -1],
"to": [10, 12, 1],
"rotation": {"angle": 0, "axis": "x", "origin": [10, 4.5, -4.5]},
"faces": {
"north": {"uv": [0, 0, 4, 13], "texture": "#4"},
"east": {"uv": [3, 0, 5, 13], "rotation": 180, "texture": "#4"},
"south": {"uv": [0, 0, 4, 13], "texture": "#4"},
"west": {"uv": [4, 0, 6, 13], "rotation": 180, "texture": "#4"},
"up": {"uv": [0, 13, 4, 15], "rotation": 180, "texture": "#4"},
"down": {"uv": [0, 13, 4, 15], "texture": "#4"}
}
}
]
}

View File

@ -0,0 +1,21 @@
{
"textures": {
"4": "create:item/extendo_grip"
},
"elements": [
{
"name": "wide_short",
"from": [6, -1, -1],
"to": [10, 6, 1],
"rotation": {"angle": 0, "axis": "x", "origin": [8, 8, 0]},
"faces": {
"north": {"uv": [6, 0, 10, 7], "texture": "#4"},
"east": {"uv": [6, 9, 8, 16], "texture": "#4"},
"south": {"uv": [6, 0, 10, 7], "texture": "#4"},
"west": {"uv": [6, 9, 8, 16], "rotation": 180, "texture": "#4"},
"up": {"uv": [6, 7, 10, 9], "rotation": 180, "texture": "#4"},
"down": {"uv": [6, 7, 10, 9], "rotation": 180, "texture": "#4"}
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

View File

@ -0,0 +1,28 @@
{
"type": "create:mechanical_crafting",
"pattern": [
" L ",
" R ",
"SSS",
"SSS",
" H "
],
"key": {
"L": {
"tag": "forge:ingots/brass"
},
"R": {
"item": "create:cogwheel"
},
"S": {
"tag": "forge:rods/wooden"
},
"H": {
"item": "create:brass_hand"
}
},
"result": {
"item": "create:extendo_grip",
"count": 1
}
}