diff --git a/build.gradle b/build.gradle index 1c8e7c0e4..41764da9f 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle' apply plugin: 'eclipse' apply plugin: 'maven-publish' -version = '0.0.3' +version = '0.0.4' group = 'com.simibubi.create' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'create' @@ -25,7 +25,7 @@ minecraft { // stable_# Stables are built at the discretion of the MCP team. // Use non-default mappings at your own risk. they may not always work. // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'snapshot', version: '20190717-1.14.3' + mappings channel: 'snapshot', version: '20190725-1.14.3' // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. // accessTransformer = file('build/resources/main/META-INF/accesstransformer.cfg') @@ -89,7 +89,7 @@ dependencies { // Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed // that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. // The userdev artifact is a special name and will get all sorts of transformations applied to it. - minecraft 'net.minecraftforge:forge:1.14.3-27.0.60' + minecraft 'net.minecraftforge:forge:1.14.4-28.0.14' // You may put jars on which you depend on in ./libs or you may define them like so.. // compile "some.group:artifact:version:classifier" diff --git a/src/main/java/com/simibubi/create/AdvancementListener.java b/src/main/java/com/simibubi/create/AdvancementListener.java new file mode 100644 index 000000000..050449124 --- /dev/null +++ b/src/main/java/com/simibubi/create/AdvancementListener.java @@ -0,0 +1,52 @@ +package com.simibubi.create; + +import net.minecraft.advancements.AdvancementManager; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.entity.player.AdvancementEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +@EventBusSubscriber +public class AdvancementListener { + + @SubscribeEvent + public static void onAdvancementGet(AdvancementEvent event) { + PlayerEntity player = event.getEntityPlayer(); + if (player == null) + return; + if (player.getServer() == null) + return; + + // DEBUG +// AdvancementManager advancements = player.getServer().getAdvancementManager(); +// player.sendMessage(new StringTextComponent(event.getAdvancement().getId().toString())); + + unlockWhen("story/smelt_iron", recipeOf(AllItems.ANDESITE_ALLOY_CUBE), event); + unlockWhen("story/smelt_iron", recipeOf(AllItems.PLACEMENT_HANDGUN), event); + unlockWhen("nether/obtain_blaze_rod", recipeOf(AllItems.BLAZE_BRASS_CUBE), event); + unlockWhen("recipes/misc/popped_chorus_fruit", recipeOf(AllItems.CHORUS_CHROME_CUBE), event); + unlockWhen("recipes/decorations/end_rod", recipeOf(AllItems.SYMMETRY_WAND), event); + unlockWhen("recipes/misc/bone_meal", recipeOf(AllItems.TREE_FERTILIZER), event); + + unlockWhen("recipes/misc/book", recipeOf(AllItems.EMPTY_BLUEPRINT), event); + unlockWhen("recipes/misc/book", recipeOf(AllItems.BLUEPRINT_AND_QUILL), event); + unlockWhen("recipes/misc/book", recipeOf(AllBlocks.SCHEMATIC_TABLE), event); + unlockWhen("recipes/misc/book", recipeOf(AllBlocks.SCHEMATICANNON), event); + } + + private static void unlockWhen(String advancement, ResourceLocation recipe, AdvancementEvent event) { + AdvancementManager advancements = event.getEntityPlayer().getServer().getAdvancementManager(); + if (event.getAdvancement() == advancements.getAdvancement(new ResourceLocation(advancement))) + event.getEntityPlayer().unlockRecipes(new ResourceLocation[] { recipe }); + } + + private static ResourceLocation recipeOf(AllItems item) { + return item.get().getRegistryName(); + } + + private static ResourceLocation recipeOf(AllBlocks block) { + return block.get().getRegistryName(); + } + +} diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 9c5c180b1..3abc61bb0 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -1,21 +1,42 @@ package com.simibubi.create; import com.simibubi.create.modules.curiosities.item.TreeFertilizerItem; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItemRenderer; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunModel; import com.simibubi.create.modules.schematics.item.BlueprintAndQuillItem; import com.simibubi.create.modules.schematics.item.BlueprintItem; import com.simibubi.create.modules.symmetry.SymmetryWandItem; +import com.simibubi.create.modules.symmetry.client.SymmetryWandItemRenderer; +import com.simibubi.create.modules.symmetry.client.SymmetryWandModel; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ModelResourceLocation; +import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; import net.minecraft.item.Item; import net.minecraft.item.Item.Properties; import net.minecraft.item.ItemStack; +import net.minecraft.item.Rarity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import net.minecraftforge.registries.IForgeRegistry; +@EventBusSubscriber(value = Dist.CLIENT, bus = Bus.MOD) public enum AllItems { - + + SYMMETRY_WAND(new SymmetryWandItem( + standardProperties().rarity(Rarity.UNCOMMON).setTEISR(() -> () -> withSpecialRenderer("wand")))), + PLACEMENT_HANDGUN(new BuilderGunItem( + new Properties().rarity(Rarity.UNCOMMON).setTEISR(() -> () -> withSpecialRenderer("gun")))), + + ANDESITE_ALLOY_CUBE(new Item(standardProperties())), BLAZE_BRASS_CUBE(new Item(standardProperties())), + CHORUS_CHROME_CUBE(new Item(standardProperties().rarity(Rarity.UNCOMMON))), + TREE_FERTILIZER(new TreeFertilizerItem(standardProperties())), - SYMMETRY_WAND(new SymmetryWandItem(standardProperties())), EMPTY_BLUEPRINT(new Item(standardProperties().maxStackSize(1))), BLUEPRINT_AND_QUILL(new BlueprintAndQuillItem(standardProperties().maxStackSize(1))), BLUEPRINT(new BlueprintItem(standardProperties())); @@ -26,27 +47,49 @@ public enum AllItems { this.item = item; this.item.setRegistryName(Create.ID, this.name().toLowerCase()); } - + public static Properties standardProperties() { return new Properties().group(Create.creativeTab); } - + public static void registerItems(IForgeRegistry iForgeRegistry) { for (AllItems item : values()) { iForgeRegistry.register(item.get()); } } - + public Item get() { return item; } - + public boolean typeOf(ItemStack stack) { return stack.getItem() == item; } @OnlyIn(Dist.CLIENT) - public static void initColorHandlers() { + public static ItemStackTileEntityRenderer withSpecialRenderer(String renderer) { + if ("wand".equals(renderer)) + return new SymmetryWandItemRenderer(); + if ("gun".equals(renderer)) + return new BuilderGunItemRenderer(); + return null; } - + + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public static void onModelBake(ModelBakeEvent event) { + + ModelResourceLocation wandLocation = getModelLocation(SYMMETRY_WAND); + IBakedModel template = event.getModelRegistry().get(wandLocation); + event.getModelRegistry().put(wandLocation, new SymmetryWandModel(template).loadPartials(event)); + + ModelResourceLocation handgunLocation = getModelLocation(PLACEMENT_HANDGUN); + template = event.getModelRegistry().get(handgunLocation); + event.getModelRegistry().put(handgunLocation, new BuilderGunModel(template).loadPartials(event)); + } + + protected static ModelResourceLocation getModelLocation(AllItems item) { + return new ModelResourceLocation(item.item.getRegistryName(), "inventory"); + } + } diff --git a/src/main/java/com/simibubi/create/AllPackets.java b/src/main/java/com/simibubi/create/AllPackets.java index 1dd88b98c..0d8308eb0 100644 --- a/src/main/java/com/simibubi/create/AllPackets.java +++ b/src/main/java/com/simibubi/create/AllPackets.java @@ -1,6 +1,7 @@ package com.simibubi.create; import com.simibubi.create.foundation.packet.NbtPacket; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunBeamPacket; import com.simibubi.create.modules.schematics.packet.ConfigureSchematicannonPacket; import com.simibubi.create.modules.schematics.packet.SchematicPlacePacket; import com.simibubi.create.modules.schematics.packet.SchematicUploadPacket; @@ -12,25 +13,29 @@ import net.minecraftforge.fml.network.simple.SimpleChannel; public class AllPackets { - private static final String PROTOCOL_VERSION = "1"; - + public static final ResourceLocation CHANNEL_NAME = new ResourceLocation(Create.ID, "network"); + public static final String NETWORK_VERSION = new ResourceLocation(Create.ID, "1").toString(); public static SimpleChannel channel; public static void registerPackets() { int i = 0; - channel = NetworkRegistry.newSimpleChannel(new ResourceLocation(Create.ID, "main"), () -> PROTOCOL_VERSION, - PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals); + channel = NetworkRegistry.ChannelBuilder.named(CHANNEL_NAME).serverAcceptedVersions(s -> true) + .clientAcceptedVersions(s -> true).networkProtocolVersion(() -> NETWORK_VERSION).simpleChannel(); + + channel.messageBuilder(NbtPacket.class, i++).decoder(NbtPacket::new).encoder(NbtPacket::toBytes) + .consumer(NbtPacket::handle).add(); + channel.messageBuilder(SchematicPlacePacket.class, i++).decoder(SchematicPlacePacket::new) + .encoder(SchematicPlacePacket::toBytes).consumer(SchematicPlacePacket::handle).add(); + channel.messageBuilder(ConfigureSchematicannonPacket.class, i++).decoder(ConfigureSchematicannonPacket::new) + .encoder(ConfigureSchematicannonPacket::toBytes).consumer(ConfigureSchematicannonPacket::handle).add(); + channel.messageBuilder(SchematicUploadPacket.class, i++).decoder(SchematicUploadPacket::new) + .encoder(SchematicUploadPacket::toBytes).consumer(SchematicUploadPacket::handle).add(); + channel.messageBuilder(SymmetryEffectPacket.class, i++).decoder(SymmetryEffectPacket::new) + .encoder(SymmetryEffectPacket::toBytes).consumer(SymmetryEffectPacket::handle).add(); + channel.messageBuilder(BuilderGunBeamPacket.class, i++).decoder(BuilderGunBeamPacket::new) + .encoder(BuilderGunBeamPacket::toBytes).consumer(BuilderGunBeamPacket::handle).add(); - channel.registerMessage(i++, NbtPacket.class, NbtPacket::toBytes, NbtPacket::new, NbtPacket::handle); - channel.registerMessage(i++, SchematicPlacePacket.class, SchematicPlacePacket::toBytes, - SchematicPlacePacket::new, SchematicPlacePacket::handle); - channel.registerMessage(i++, ConfigureSchematicannonPacket.class, ConfigureSchematicannonPacket::toBytes, - ConfigureSchematicannonPacket::new, ConfigureSchematicannonPacket::handle); - channel.registerMessage(i++, SchematicUploadPacket.class, SchematicUploadPacket::toBytes, - SchematicUploadPacket::new, SchematicUploadPacket::handle); - channel.registerMessage(i++, SymmetryEffectPacket.class, SymmetryEffectPacket::toBytes, - SymmetryEffectPacket::new, SymmetryEffectPacket::handle); } } diff --git a/src/main/java/com/simibubi/create/AllRecipes.java b/src/main/java/com/simibubi/create/AllRecipes.java new file mode 100644 index 000000000..7f025be89 --- /dev/null +++ b/src/main/java/com/simibubi/create/AllRecipes.java @@ -0,0 +1,30 @@ +package com.simibubi.create; + +import java.util.function.Supplier; + +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunUpgradeRecipe; + +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.RegistryEvent; + +public enum AllRecipes { + + Placement_Handgun_Upgrade(BuilderGunUpgradeRecipe.Serializer::new); + + public IRecipeSerializer serializer; + public Supplier> supplier; + + private AllRecipes(Supplier> supplier) { + this.supplier = supplier; + } + + public static void register(RegistryEvent.Register> event) { + for (AllRecipes r : AllRecipes.values()) { + r.serializer = r.supplier.get(); + ResourceLocation location = new ResourceLocation(Create.ID, r.name().toLowerCase()); + event.getRegistry().register(r.serializer.setRegistryName(location)); + } + } + +} diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 09a377992..1d01d9aea 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -13,6 +13,7 @@ import net.minecraft.block.Block; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; +import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.event.RegistryEvent; @@ -36,17 +37,17 @@ public class Create { public static final String ID = "create"; public static final String NAME = "Create"; - public static final String VERSION = "0.0.3"; + public static final String VERSION = "0.0.4"; public static Logger logger = LogManager.getLogger(); public static ItemGroup creativeTab = new CreateItemGroup(); - + @OnlyIn(Dist.CLIENT) public static ClientSchematicLoader cSchematicLoader; @OnlyIn(Dist.CLIENT) public static KeyBinding TOOL_MENU; - + public static ServerSchematicLoader sSchematicLoader; public Create() { @@ -57,7 +58,6 @@ public class Create { private void clientInit(FMLClientSetupEvent event) { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - AllItems.initColorHandlers(); AllTileEntities.registerRenderers(); cSchematicLoader = new ClientSchematicLoader(); new SchematicHologram(); @@ -73,17 +73,17 @@ public class Create { DistExecutor.runWhenOn(Dist.CLIENT, () -> AllContainers::registerScreenFactories); sSchematicLoader = new ServerSchematicLoader(); } - + @SubscribeEvent public static void onTick(ServerTickEvent event) { sSchematicLoader.tick(); } - + @SubscribeEvent public static void onServerClose(FMLServerStoppingEvent event) { sSchematicLoader.shutdown(); } - + @OnlyIn(Dist.CLIENT) @SubscribeEvent public static void onClientTick(ClientTickEvent event) { @@ -103,5 +103,11 @@ public class Create { public static void registerBlocks(RegistryEvent.Register event) { AllBlocks.registerBlocks(event.getRegistry()); } + + @SubscribeEvent + public static void registerCustomRecipes(RegistryEvent.Register> event) { + AllRecipes.register(event); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/block/CustomRenderItemBakedModel.java b/src/main/java/com/simibubi/create/foundation/block/CustomRenderItemBakedModel.java new file mode 100644 index 000000000..6e22c106a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/block/CustomRenderItemBakedModel.java @@ -0,0 +1,28 @@ +package com.simibubi.create.foundation.block; + +import com.simibubi.create.Create; + +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ModelRotation; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.ModelBakeEvent; + +public abstract class CustomRenderItemBakedModel extends WrappedBakedModel { + + public CustomRenderItemBakedModel(IBakedModel template) { + super(template); + } + + public abstract CustomRenderItemBakedModel loadPartials(ModelBakeEvent event); + + @Override + public boolean isBuiltInRenderer() { + return true; + } + + protected static IBakedModel loadCustomModel(ModelBakeEvent event, String name) { + return event.getModelLoader().func_217845_a(new ResourceLocation(Create.ID, "item/" + name), + ModelRotation.X0_Y0); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/block/WrappedBakedModel.java b/src/main/java/com/simibubi/create/foundation/block/WrappedBakedModel.java new file mode 100644 index 000000000..4447141ac --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/block/WrappedBakedModel.java @@ -0,0 +1,80 @@ +package com.simibubi.create.foundation.block; + +import java.util.List; +import java.util.Random; + +import javax.vecmath.Matrix4f; + +import org.apache.commons.lang3.tuple.Pair; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.model.ItemOverrideList; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.util.Direction; +import net.minecraftforge.client.model.data.EmptyModelData; +import net.minecraftforge.client.model.data.IModelData; + +@SuppressWarnings("deprecation") +public class WrappedBakedModel implements IBakedModel { + + protected IBakedModel template; + + public WrappedBakedModel(IBakedModel template) { + this.template = template; + } + + @Override + public IBakedModel getBakedModel() { + return template; + } + + @Override + public boolean isAmbientOcclusion() { + return template.isAmbientOcclusion(); + } + + @Override + public boolean isGui3d() { + return template.isGui3d(); + } + + @Override + public boolean isBuiltInRenderer() { + return template.isBuiltInRenderer(); + } + + @Override + public TextureAtlasSprite getParticleTexture(IModelData data) { + return template.getParticleTexture(data); + } + + @Override + public ItemOverrideList getOverrides() { + return template.getOverrides(); + } + + @Override + public Pair handlePerspective(TransformType cameraTransformType) { + Pair pair = template.handlePerspective(cameraTransformType); + return Pair.of(this, pair.getRight()); + } + + @Override + public List getQuads(BlockState state, Direction side, Random rand) { + return getQuads(state, side, rand, EmptyModelData.INSTANCE); + } + + @Override + public List getQuads(BlockState state, Direction side, Random rand, IModelData data) { + return template.getQuads(state, side, rand, data); + } + + @Override + public TextureAtlasSprite getParticleTexture() { + return getParticleTexture(EmptyModelData.INSTANCE); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java index 760e4c3ed..324eb96c9 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -79,6 +79,16 @@ public abstract class AbstractSimiScreen extends Screen { } return super.mouseScrolled(mouseX, mouseY, delta); } + + @Override + public boolean mouseReleased(double x, double y, int button) { + boolean result = false; + for (Widget widget : widgets) { + if (widget.mouseReleased(x, y, button)) + result = true; + } + return result | super.mouseReleased(x, y, button); + } @Override public boolean shouldCloseOnEsc() { diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenResources.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenResources.java index 1e29e98fa..833bf63b2 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenResources.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenResources.java @@ -11,6 +11,7 @@ public enum ScreenResources { // Inventories PLAYER_INVENTORY("player_inventory.png", 176, 108), WAND_SYMMETRY("wand_symmetry.png", 207, 58), + PLACEMENT_GUN("placement_handgun.png", 217, 70), SCHEMATIC_TABLE("schematic_table.png", 207, 89), SCHEMATIC_TABLE_PROGRESS("schematic_table.png", 209, 0, 24, 17), @@ -64,7 +65,16 @@ public enum ScreenResources { ICON_PLAY("icons.png", 0, 80, 16, 16), ICON_PAUSE("icons.png", 16, 80, 16, 16), - ICON_STOP("icons.png", 32, 80, 16, 16); + ICON_STOP("icons.png", 32, 80, 16, 16), + + ICON_PATTERN_SOLID("icons.png", 0, 96, 16, 16), + ICON_PATTERN_CHECKERED("icons.png", 16, 96, 16, 16), + ICON_PATTERN_CHECKERED_INVERSED("icons.png", 32, 96, 16, 16), + ICON_PATTERN_CHANCE_25("icons.png", 48, 96, 16, 16), + ICON_PATTERN_CHANCE_50("icons.png", 0, 112, 16, 16), + ICON_PATTERN_CHANCE_75("icons.png", 16, 112, 16, 16), + ICON_FOLLOW_DIAGONAL("icons.png", 32, 112, 16, 16), + ICON_FOLLOW_MATERIAL("icons.png", 48, 112, 16, 16); public static final int FONT_COLOR = 0x575F7A; diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java index 1271a928b..945e5cd6a 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/Label.java @@ -6,6 +6,7 @@ import net.minecraft.client.gui.FontRenderer; public class Label extends AbstractSimiWidget { public String text; + public String suffix; protected boolean hasShadow; protected int color; protected FontRenderer font; @@ -16,6 +17,7 @@ public class Label extends AbstractSimiWidget { this.text = "Label"; color = 0xFFFFFF; hasShadow = false; + suffix = ""; } public Label colored(int color) { @@ -28,15 +30,22 @@ public class Label extends AbstractSimiWidget { return this; } + public Label withSuffix(String s) { + suffix = s; + return this; + } + @Override public void render(int mouseX, int mouseY, float partialTicks) { if (!visible) return; + if (text == null || text.isEmpty()) + return; if (hasShadow) - font.drawStringWithShadow(text, x, y, color); + font.drawStringWithShadow(text + suffix, x, y, color); else - font.drawString(text, x, y, color); + font.drawString(text + suffix, x, y, color); } } diff --git a/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java b/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java index 0bec94196..3a313975b 100644 --- a/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java +++ b/src/main/java/com/simibubi/create/foundation/packet/NbtPacket.java @@ -43,12 +43,21 @@ public class NbtPacket { return; } + if (slot == -2) { + ItemStack heldItem = player.getHeldItemOffhand(); + if (heldItem.getItem() == stack.getItem()) { + heldItem.setTag(stack.getTag()); + } + return; + } + ItemStack heldInSlot = player.inventory.getStackInSlot(slot); if (heldInSlot.getItem() == stack.getItem()) { heldInSlot.setTag(stack.getTag()); } }); + context.get().setPacketHandled(true); } } diff --git a/src/main/java/com/simibubi/create/foundation/type/DimensionPos.java b/src/main/java/com/simibubi/create/foundation/type/DimensionPos.java index e2c6ab8f1..38cd7e240 100644 --- a/src/main/java/com/simibubi/create/foundation/type/DimensionPos.java +++ b/src/main/java/com/simibubi/create/foundation/type/DimensionPos.java @@ -2,14 +2,14 @@ package com.simibubi.create.foundation.type; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ServerWorld; +import net.minecraft.world.World; public class DimensionPos { - public ServerWorld world; + public World world; public BlockPos pos; public DimensionPos(ServerPlayerEntity player, BlockPos pos) { - this.world = player.getServerWorld(); + this.world = player.world; this.pos = pos; } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java new file mode 100644 index 000000000..ed9d0aa5d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -0,0 +1,51 @@ +package com.simibubi.create.foundation.utility; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.properties.SlabType; + +public class BlockHelper { + + public static int findAndRemoveInInventory(BlockState block, PlayerEntity player, int amount) { + int amountFound = 0; + Item required = getRequiredItem(block).getItem(); + + boolean needsTwo = block.has(BlockStateProperties.SLAB_TYPE) + && block.get(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE; + + if (needsTwo) + amount *= 2; + + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + if (amountFound == amount) + break; + + ItemStack itemstack = player.inventory.getStackInSlot(i); + int count = itemstack.getCount(); + if (itemstack.getItem() == required && count > 0) { + int taken = Math.min(count, amount - amountFound); + player.inventory.setInventorySlotContents(i, new ItemStack(itemstack.getItem(), count - taken)); + amountFound += taken; + } + } + + + if (needsTwo) { + // Give back 1 if uneven amount was removed + if (amountFound % 2 != 0) + player.inventory.addItemStackToInventory(new ItemStack(required)); + amountFound /= 2; + } + + return amountFound; + } + + public static ItemStack getRequiredItem(BlockState state) { + ItemStack itemStack = new ItemStack(state.getBlock()); + return itemStack; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/item/TreeFertilizerItem.java b/src/main/java/com/simibubi/create/modules/curiosities/item/TreeFertilizerItem.java index 785e65157..b5c2d9e67 100644 --- a/src/main/java/com/simibubi/create/modules/curiosities/item/TreeFertilizerItem.java +++ b/src/main/java/com/simibubi/create/modules/curiosities/item/TreeFertilizerItem.java @@ -42,13 +42,13 @@ public class TreeFertilizerItem extends Item { public TreeFertilizerItem(Properties properties) { super(properties); } - + @Override @OnlyIn(Dist.CLIENT) public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { if (KeyboardHelper.isKeyDown(KeyboardHelper.LSHIFT)) tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Tree won't grow? Try this on it.")); - else + else tooltip.add(new StringTextComponent(TextFormatting.DARK_GRAY + "< Hold Shift >")); super.addInformation(stack, worldIn, tooltip, flagIn); } @@ -58,12 +58,12 @@ public class TreeFertilizerItem extends Item { BlockState state = context.getWorld().getBlockState(context.getPos()); Block block = state.getBlock(); if (block instanceof SaplingBlock) { - + if (context.getWorld().isRemote) { BoneMealItem.spawnBonemealParticles(context.getWorld(), context.getPos(), 100); return ActionResultType.SUCCESS; } - + TreesDreamWorld world = new TreesDreamWorld(context.getWorld()); BlockPos saplingPos = context.getPos(); @@ -77,6 +77,9 @@ public class TreeFertilizerItem extends Item { for (BlockPos pos : world.blocksAdded.keySet()) { BlockPos actualPos = pos.add(saplingPos).down(10); + // Don't replace Bedrock + if (context.getWorld().getBlockState(pos).getBlockHardness(context.getWorld(), pos) == -1) + continue; // Don't replace solid blocks with leaves if (!world.getBlockState(pos).isNormalCube(world, pos) && context.getWorld().getBlockState(actualPos).isNormalCube(context.getWorld(), actualPos)) @@ -87,7 +90,7 @@ public class TreeFertilizerItem extends Item { context.getWorld().setBlockState(actualPos, world.getBlockState(pos)); } - + if (!context.getPlayer().isCreative()) context.getItem().shrink(1); return ActionResultType.SUCCESS; diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunBeamPacket.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunBeamPacket.java new file mode 100644 index 000000000..62b14bcd7 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunBeamPacket.java @@ -0,0 +1,55 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import java.util.function.Supplier; + +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunHandler.LaserBeam; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class BuilderGunBeamPacket { + + public Vec3d start; + public Vec3d target; + public Hand hand; + + public BuilderGunBeamPacket(Vec3d start, Vec3d target, Hand hand) { + this.start = start; + this.target = target; + this.hand = hand; + } + + public BuilderGunBeamPacket(PacketBuffer buffer) { + start = new Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()); + target = new Vec3d(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()); + hand = buffer.readBoolean()? Hand.MAIN_HAND : Hand.OFF_HAND; + } + + public void toBytes(PacketBuffer buffer) { + buffer.writeDouble(start.x); + buffer.writeDouble(start.y); + buffer.writeDouble(start.z); + buffer.writeDouble(target.x); + buffer.writeDouble(target.y); + buffer.writeDouble(target.z); + + buffer.writeBoolean(hand == Hand.MAIN_HAND); + } + + public void handle(Supplier context) { + context.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + if (Minecraft.getInstance().player.getPositionVector().distanceTo(start) > 100) + return; + BuilderGunHandler.addBeam(new LaserBeam(start, target)); + BuilderGunHandler.playSound(hand, new BlockPos(start)); + })); + context.get().setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunHandler.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunHandler.java new file mode 100644 index 000000000..44b4b4368 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunHandler.java @@ -0,0 +1,216 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import java.util.LinkedList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.utility.TessellatorHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.AbstractClientPlayerEntity; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.FirstPersonRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.PlayerRenderer; +import net.minecraft.client.renderer.model.ItemCameraTransforms; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Hand; +import net.minecraft.util.HandSide; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderSpecificHandEvent; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.event.world.BlockEvent.BreakEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; + +@SuppressWarnings("deprecation") +@EventBusSubscriber(value = Dist.CLIENT) +public class BuilderGunHandler { + + private static List cachedBeams; + private static float leftHandAnimation; + private static float rightHandAnimation; + private static float lastLeftHandAnimation; + private static float lastRightHandAnimation; + + public static class LaserBeam { + float itensity; + Vec3d start; + Vec3d end; + + public LaserBeam(Vec3d start, Vec3d end) { + this.start = start; + this.end = end; + itensity = 1; + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void onBlockBroken(BreakEvent event) { + PlayerEntity player = event.getPlayer(); + if (player == null) + return; + if (!AllItems.PLACEMENT_HANDGUN.typeOf(player.getHeldItemMainhand())) + return; + + if (event.getState().isNormalCube(player.world, event.getPos())) { + player.getHeldItemMainhand().getTag().put("BlockUsed", NBTUtil.writeBlockState(event.getState())); + } + event.setCanceled(true); + } + + @SubscribeEvent + public static void onClientTick(ClientTickEvent event) { + if (cachedBeams == null) + cachedBeams = new LinkedList<>(); + ClientWorld world = Minecraft.getInstance().world; + if (world == null) + return; + ClientPlayerEntity player = Minecraft.getInstance().player; + if (player == null) + return; + cachedBeams.removeIf(b -> b.itensity < .1f); + cachedBeams.forEach(b -> b.itensity *= .7f); + + lastLeftHandAnimation = leftHandAnimation; + lastRightHandAnimation = rightHandAnimation; + leftHandAnimation *= 0.8f; + rightHandAnimation *= 0.8f; + } + + @SubscribeEvent + public static void onRenderWorld(RenderWorldLastEvent event) { + if (cachedBeams == null || cachedBeams.isEmpty()) + return; + + cachedBeams.forEach(beam -> { + TessellatorHelper.prepareForDrawing(); + GlStateManager.disableTexture(); + GlStateManager.lineWidth(beam.itensity * 40); + + BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer(); + bufferBuilder.begin(GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION); + bufferBuilder.pos(beam.start.x, beam.start.y, beam.start.z).endVertex(); + bufferBuilder.pos(beam.end.x, beam.end.y, beam.end.z).endVertex(); + Tessellator.getInstance().draw(); + + GlStateManager.lineWidth(1); + GlStateManager.enableTexture(); + TessellatorHelper.cleanUpAfterDrawing(); + }); + } + + public static void shoot(Hand hand) { + ClientPlayerEntity player = Minecraft.getInstance().player; + boolean rightHand = hand == Hand.MAIN_HAND ^ player.getPrimaryHand() == HandSide.LEFT; + if (rightHand) + rightHandAnimation = .2f; + else + leftHandAnimation = .2f; + playSound(hand, player.getPosition()); + } + + public static void playSound(Hand hand, BlockPos position) { + float pitch = hand == Hand.MAIN_HAND ? 2f : 0.9f; + SoundEvent sound = SoundEvents.BLOCK_NOTE_BLOCK_BASEDRUM; + Minecraft.getInstance().world.playSound(position, sound, SoundCategory.BLOCKS, 0.8f, pitch, false); + } + + public static void addBeam(LaserBeam beam) { + Vec3d step = beam.end.subtract(beam.start).normalize(); + int steps = (int) (beam.end.squareDistanceTo(beam.start) / step.lengthSquared()); + for (int i = 0; i <= steps; i++) { + Vec3d pos = beam.start.add(step.scale(i)); + Minecraft.getInstance().world.addParticle(ParticleTypes.END_ROD, pos.x, pos.y, pos.z, 0, -15000, 0); + } + cachedBeams.add(beam); + } + + @SubscribeEvent + public static void onRenderPlayerHand(RenderSpecificHandEvent event) { + if (AllItems.PLACEMENT_HANDGUN.typeOf(event.getItemStack())) { + Minecraft mc = Minecraft.getInstance(); + boolean rightHand = event.getHand() == Hand.MAIN_HAND ^ mc.player.getPrimaryHand() == HandSide.LEFT; + + GlStateManager.pushMatrix(); + + float recoil = rightHand + ? MathHelper.lerp(event.getPartialTicks(), lastRightHandAnimation, rightHandAnimation) + : MathHelper.lerp(event.getPartialTicks(), lastLeftHandAnimation, leftHandAnimation); + + float equipProgress = event.getEquipProgress(); + + if (rightHand && rightHandAnimation > .01f) + equipProgress = 0; + if (!rightHand && leftHandAnimation > .01f) + equipProgress = 0; + + // Render arm + float f = rightHand ? 1.0F : -1.0F; + float f1 = MathHelper.sqrt(event.getSwingProgress()); + 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); + GlStateManager.translatef(f * (f2 + 0.64000005F - .1f), f3 + -0.4F + equipProgress * -0.6F, + f4 + -0.71999997F + .3f + recoil); + GlStateManager.rotatef(f * 75.0F, 0.0F, 1.0F, 0.0F); + float f5 = MathHelper.sin(event.getSwingProgress() * event.getSwingProgress() * (float) Math.PI); + float f6 = MathHelper.sin(f1 * (float) Math.PI); + GlStateManager.rotatef(f * f6 * 70.0F, 0.0F, 1.0F, 0.0F); + GlStateManager.rotatef(f * f5 * -20.0F, 0.0F, 0.0F, 1.0F); + AbstractClientPlayerEntity abstractclientplayerentity = mc.player; + mc.getTextureManager().bindTexture(abstractclientplayerentity.getLocationSkin()); + GlStateManager.translatef(f * -1.0F, 3.6F, 3.5F); + GlStateManager.rotatef(f * 120.0F, 0.0F, 0.0F, 1.0F); + GlStateManager.rotatef(200.0F, 1.0F, 0.0F, 0.0F); + GlStateManager.rotatef(f * -135.0F, 0.0F, 1.0F, 0.0F); + GlStateManager.translatef(f * 5.6F, 0.0F, 0.0F); + GlStateManager.rotatef(f * 40.0F, 0.0F, 1.0F, 0.0F); + PlayerRenderer playerrenderer = mc.getRenderManager().getRenderer(abstractclientplayerentity); + GlStateManager.disableCull(); + if (rightHand) { + playerrenderer.renderRightArm(abstractclientplayerentity); + } else { + playerrenderer.renderLeftArm(abstractclientplayerentity); + } + GlStateManager.enableCull(); + GlStateManager.popMatrix(); + + // Render gun + GlStateManager.pushMatrix(); + GlStateManager.translatef(f * (f2 + 0.64000005F - .1f), f3 + -0.4F + equipProgress * -0.6F, + f4 + -0.71999997F - 0.1f + recoil); + GlStateManager.rotatef(f * f6 * 70.0F, 0.0F, 1.0F, 0.0F); + GlStateManager.rotatef(f * f5 * -20.0F, 0.0F, 0.0F, 1.0F); + + GlStateManager.translatef(f * -0.1f, 0.1f, -0.4f); + GlStateManager.rotatef(f * 5.0F, 0.0F, 1.0F, 0.0F); + + FirstPersonRenderer firstPersonRenderer = mc.getFirstPersonRenderer(); + firstPersonRenderer.renderItemSide(mc.player, event.getItemStack(), + rightHand ? ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND + : ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND, + !rightHand); + GlStateManager.popMatrix(); + + event.setCanceled(true); + } + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItem.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItem.java new file mode 100644 index 000000000..64caf3a01 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItem.java @@ -0,0 +1,583 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.function.Predicate; + +import com.google.common.base.Predicates; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllPackets; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.utility.BlockHelper; +import com.simibubi.create.foundation.utility.KeyboardHelper; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunHandler.LaserBeam; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.item.UseAction; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.state.properties.StairsShape; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.NonNullList; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceContext.BlockMode; +import net.minecraft.util.math.RayTraceContext.FluidMode; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.PacketDistributor; + +public class BuilderGunItem extends Item { + + public static enum ComponentTier { + None, BlazeBrass, ChorusChrome + } + + public static enum Components { + Body, Amplifier, Accelerator, Retriever, Scope + } + + public BuilderGunItem(Properties properties) { + super(properties.maxStackSize(1)); + } + + @Override + public UseAction getUseAction(ItemStack stack) { + return UseAction.NONE; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { + if (KeyboardHelper.isKeyDown(KeyboardHelper.LSHIFT)) { + if (stack.getOrCreateTag().contains("BlockUsed")) { + BlockState state = NBTUtil.readBlockState(stack.getTag().getCompound("BlockUsed")); + tooltip.add(new StringTextComponent(TextFormatting.BLUE + "Using Block: " + TextFormatting.WHITE + + new TranslationTextComponent(state.getBlock().getTranslationKey()).getFormattedText())); + } else { + tooltip.add(new StringTextComponent(TextFormatting.BLUE + "Hit a Block to set the material.")); + } + tooltip.add(new StringTextComponent("")); + tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Places or Replaces Blocks at a range.")); + tooltip.add(new StringTextComponent( + TextFormatting.GRAY + "> [Left-Click] to set the material used by the gun")); + tooltip.add(new StringTextComponent( + TextFormatting.GRAY + "> [Right-Click] to place/replace blocks with the material")); + tooltip.add(new StringTextComponent(TextFormatting.GRAY + "> [Shift-Right-Click] to configure")); + tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Craft with components to upgrade.")); + tooltip.add(new StringTextComponent("")); + + for (Components c : Components.values()) { + ComponentTier tier = getTier(c, stack); + tooltip.add(new StringTextComponent( + TextFormatting.AQUA + "" + TextFormatting.ITALIC + c.name() + ": " + TextFormatting.GRAY + + (tier == ComponentTier.None ? (c == Components.Body ? "Andesite Alloy" : "Missing") + : tier.name()))); + } + + } else { + tooltip.add(new StringTextComponent(TextFormatting.DARK_GRAY + "< Hold Shift >")); + } + super.addInformation(stack, worldIn, tooltip, flagIn); + } + + @Override + public void fillItemGroup(ItemGroup group, NonNullList items) { + if (group == Create.creativeTab) { + ItemStack gunWithoutStuff = new ItemStack(this); + items.add(gunWithoutStuff); + + ItemStack gunWithGoldStuff = new ItemStack(this); + for (Components c : Components.values()) + setTier(c, ComponentTier.BlazeBrass, gunWithGoldStuff); + items.add(gunWithGoldStuff); + + ItemStack gunWithPurpurStuff = new ItemStack(this); + for (Components c : Components.values()) + setTier(c, ComponentTier.ChorusChrome, gunWithPurpurStuff); + items.add(gunWithPurpurStuff); + } + super.fillItemGroup(group, items); + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) { + // Shift -> open GUI + if (context.isPlacerSneaking()) { + if (context.getWorld().isRemote) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + openHandgunGUI(context.getItem(), context.getHand() == Hand.OFF_HAND); + }); + applyCooldown(context.getPlayer(), context.getItem(), false); + } + return ActionResultType.SUCCESS; + } + return super.onItemUse(context); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { + ItemStack item = player.getHeldItem(hand); + CompoundNBT nbt = item.getOrCreateTag(); + + // Shift -> Open GUI + if (player.isSneaking()) { + if (world.isRemote) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + openHandgunGUI(item, hand == Hand.OFF_HAND); + }); + applyCooldown(player, item, false); + } + return new ActionResult(ActionResultType.SUCCESS, item); + } + + boolean mainHand = hand == Hand.MAIN_HAND; + boolean isSwap = item.getTag().contains("_Swap"); + boolean gunInOtherHand = AllItems.PLACEMENT_HANDGUN + .typeOf(player.getHeldItem(mainHand ? Hand.OFF_HAND : Hand.MAIN_HAND)); + + // Pass To Offhand + if (mainHand && isSwap && gunInOtherHand) + return new ActionResult(ActionResultType.FAIL, item); + if (mainHand && !isSwap && gunInOtherHand) + item.getTag().putBoolean("_Swap", true); + if (!mainHand && isSwap) + item.getTag().remove("_Swap"); + if (!mainHand && gunInOtherHand) + player.getHeldItem(Hand.MAIN_HAND).getTag().remove("_Swap"); + player.setActiveHand(hand); + + // Check if block setting is present + BlockState stateToUse = Blocks.AIR.getDefaultState(); + if (nbt.contains("BlockUsed")) + stateToUse = NBTUtil.readBlockState(nbt.getCompound("BlockUsed")); + else { + world.playSound(player, player.getPosition(), SoundEvents.BLOCK_NOTE_BLOCK_BASS, SoundCategory.BLOCKS, 1f, + 0.5f); + player.sendStatusMessage(new StringTextComponent(TextFormatting.RED + "Left-Click a Block to set Material"), + true); + return new ActionResult(ActionResultType.FAIL, item); + } + + // Raytrace - Find the target + Vec3d start = player.getPositionVec().add(0, player.getEyeHeight(), 0); + Vec3d range = player.getLookVec().scale(getReachDistance(item)); + BlockRayTraceResult raytrace = world.rayTraceBlocks( + new RayTraceContext(start, start.add(range), BlockMode.OUTLINE, FluidMode.NONE, player)); + BlockPos pos = raytrace.getPos(); + BlockState stateReplaced = world.getBlockState(pos); + + // No target + if (pos == null || stateReplaced.getBlock() == Blocks.AIR) { + applyCooldown(player, item, gunInOtherHand); + return new ActionResult(ActionResultType.SUCCESS, item); + } + + // Find exact position of gun barrel for VFX + float yaw = (float) ((player.rotationYaw) / -180 * Math.PI); + float pitch = (float) ((player.rotationPitch) / -180 * Math.PI); + Vec3d barrelPosNoTransform = new Vec3d(mainHand ? -.35f : .35f, -0.1f, 1); + Vec3d barrelPos = start.add(barrelPosNoTransform.rotatePitch(pitch).rotateYaw(yaw)); + + // Client side - Shoot visual laser + if (world.isRemote) { + BuilderGunHandler.addBeam(new LaserBeam(barrelPos, raytrace.getHitVec())); + + if (getTier(Components.Amplifier, item) == ComponentTier.BlazeBrass) { + BuilderGunHandler.addBeam(new LaserBeam( + start.add(barrelPosNoTransform.add(-.09f, -.08f, 0).rotatePitch(pitch).rotateYaw(yaw)), + raytrace.getHitVec())); + } + if (getTier(Components.Amplifier, item) == ComponentTier.ChorusChrome) { + BuilderGunHandler.addBeam(new LaserBeam( + start.add(barrelPosNoTransform.add(-.09f, -.08f, 0).rotatePitch(pitch).rotateYaw(yaw)), + raytrace.getHitVec())); + BuilderGunHandler.addBeam(new LaserBeam( + start.add(barrelPosNoTransform.add(.09f, -.08f, 0).rotatePitch(pitch).rotateYaw(yaw)), + raytrace.getHitVec())); + } + + BuilderGunHandler.shoot(hand); + applyCooldown(player, item, gunInOtherHand); + return new ActionResult(ActionResultType.SUCCESS, item); + } + + // Server side - Replace Blocks + boolean replace = nbt.contains("Replace") && nbt.getBoolean("Replace"); + List selectedBlocks = getSelectedBlocks(item, world, player); + applyPattern(selectedBlocks, item); + Direction face = raytrace.getFace(); + + for (BlockPos placed : selectedBlocks) { + if (world.getBlockState(placed) == stateToUse) + continue; + if (!stateToUse.isValidPosition(world, placed)) + continue; + if (!player.isCreative() && !canBreak(item, world.getBlockState(placed), world, placed)) + continue; + if (!player.isCreative() && BlockHelper.findAndRemoveInInventory(stateToUse, player, 1) == 0) { + player.getCooldownTracker().setCooldown(item.getItem(), 20); + player.sendStatusMessage(new StringTextComponent(TextFormatting.RED + "Out of Blocks!"), true); + return new ActionResult(ActionResultType.SUCCESS, item); + } + + if (!player.isCreative() && replace) + dropBlocks(world, player, item, face, placed); + + for (Direction updateDirection : Direction.values()) + stateToUse = stateToUse.updatePostPlacement(updateDirection, + world.getBlockState(placed.offset(updateDirection)), world, placed, + placed.offset(updateDirection)); + + IFluidState ifluidstate = world.getFluidState(placed); + world.setBlockState(placed, ifluidstate.getBlockState(), 18); + world.setBlockState(placed, stateToUse); + + } + + applyCooldown(player, item, gunInOtherHand); + AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> player), + new BuilderGunBeamPacket(barrelPos, raytrace.getHitVec(), hand)); + + return new ActionResult(ActionResultType.SUCCESS, item); + + } + + @Override + public boolean onBlockDestroyed(ItemStack stack, World worldIn, BlockState state, BlockPos pos, + LivingEntity entityLiving) { + if (entityLiving instanceof PlayerEntity && ((PlayerEntity) entityLiving).isCreative()) { + worldIn.setBlockState(pos, state); + return false; + } + return super.onBlockDestroyed(stack, worldIn, state, pos, entityLiving); + } + + @Override + public boolean onEntitySwing(ItemStack stack, LivingEntity entity) { + if (!(entity instanceof PlayerEntity)) + return false; + if (entity.isSneaking()) + return true; + + Vec3d start = entity.getPositionVec().add(0, entity.getEyeHeight(), 0); + Vec3d range = entity.getLookVec().scale(getReachDistance(stack)); + BlockRayTraceResult raytrace = entity.world.rayTraceBlocks( + new RayTraceContext(start, start.add(range), BlockMode.OUTLINE, FluidMode.NONE, entity)); + BlockPos pos = raytrace.getPos(); + if (pos == null) + return true; + + entity.world.sendBlockBreakProgress(entity.getEntityId(), pos, -1); + BlockState newState = entity.world.getBlockState(pos); + + if (BlockHelper.getRequiredItem(newState).isEmpty()) + return true; + if (entity.world.getTileEntity(pos) != null) + return true; + if (newState.has(BlockStateProperties.DOUBLE_BLOCK_HALF)) + return true; + if (newState.has(BlockStateProperties.ATTACHED)) + return true; + if (newState.has(BlockStateProperties.HANGING)) + return true; + if (newState.has(BlockStateProperties.BED_PART)) + return true; + if (newState.has(BlockStateProperties.STAIRS_SHAPE)) + newState = newState.with(BlockStateProperties.STAIRS_SHAPE, StairsShape.STRAIGHT); + + if (stack.getTag().contains("BlockUsed") + && NBTUtil.readBlockState(stack.getTag().getCompound("BlockUsed")) == newState) + return true; + + stack.getTag().put("BlockUsed", NBTUtil.writeBlockState(newState)); + entity.world.playSound((PlayerEntity) entity, entity.getPosition(), SoundEvents.BLOCK_NOTE_BLOCK_BELL, + SoundCategory.BLOCKS, 0.5f, 0.8f); + + return true; + } + + @Override + public void inventoryTick(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) { + if (AllItems.PLACEMENT_HANDGUN.typeOf(stack)) { + CompoundNBT nbt = stack.getOrCreateTag(); + if (!nbt.contains("Replace")) + nbt.putBoolean("Replace", false); + if (!nbt.contains("Pattern")) + nbt.putString("Pattern", PlacementPatterns.Solid.name()); + if (!nbt.contains("SearchDiagonal")) + nbt.putBoolean("SearchDiagonal", false); + if (!nbt.contains("SearchMaterial")) + nbt.putBoolean("SearchMaterial", false); + if (!nbt.contains("SearchDistance")) + nbt.putInt("SearchDistance", 1); + } + } + + @Override + public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, PlayerEntity player) { + return true; + } + + @Override + public int getUseDuration(ItemStack stack) { + return 0; + } + + @Override + public void onPlayerStoppedUsing(ItemStack stack, World worldIn, LivingEntity entityLiving, int timeLeft) { + super.onPlayerStoppedUsing(stack, worldIn, entityLiving, timeLeft); + } + + @Override + public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) { + boolean differentBlock = true; + if (oldStack.hasTag() && newStack.hasTag() && oldStack.getTag().contains("BlockUsed") + && newStack.getTag().contains("BlockUsed")) + differentBlock = NBTUtil.readBlockState(oldStack.getTag().getCompound("BlockUsed")) != NBTUtil + .readBlockState(newStack.getTag().getCompound("BlockUsed")); + return slotChanged || !AllItems.PLACEMENT_HANDGUN.typeOf(newStack) || differentBlock; + } + + @OnlyIn(Dist.CLIENT) + private void openHandgunGUI(ItemStack handgun, boolean offhand) { + ScreenOpener.open(new BuilderGunScreen(handgun, offhand)); + } + + public static List getSelectedBlocks(ItemStack stack, World worldIn, PlayerEntity player) { + List list = new LinkedList<>(); + CompoundNBT tag = stack.getTag(); + if (tag == null) + return list; + + boolean searchDiagonals = tag.contains("SearchDiagonal") && tag.getBoolean("SearchDiagonal"); + boolean searchAcrossMaterials = tag.contains("SearchFuzzy") && tag.getBoolean("SearchFuzzy"); + boolean replace = tag.contains("Replace") && tag.getBoolean("Replace"); + int searchRange = tag.contains("SearchDistance") ? tag.getInt("SearchDistance") : 0; + + Set visited = new HashSet<>(); + List frontier = new LinkedList<>(); + + Vec3d start = player.getPositionVec().add(0, player.getEyeHeight(), 0); + Vec3d range = player.getLookVec().scale(getReachDistance(stack)); + BlockRayTraceResult raytrace = player.world.rayTraceBlocks( + new RayTraceContext(start, start.add(range), BlockMode.COLLIDER, FluidMode.NONE, player)); + BlockPos pos = raytrace.getPos().toImmutable(); + + if (pos == null) + return list; + + BlockState state = worldIn.getBlockState(pos); + Direction face = raytrace.getFace(); + List offsets = new LinkedList<>(); + + for (int x = -1; x <= 1; x++) + for (int y = -1; y <= 1; y++) + for (int z = -1; z <= 1; z++) + if (Math.abs(x) + Math.abs(y) + Math.abs(z) < 2 || searchDiagonals) + if (face.getAxis().getCoordinate(x, y, z) == 0) + offsets.add(new BlockPos(x, y, z)); + + BlockPos startPos = replace ? pos : pos.offset(face); + frontier.add(startPos); + + while (!frontier.isEmpty()) { + BlockPos currentPos = frontier.remove(0); + if (visited.contains(currentPos)) + continue; + visited.add(currentPos); + if (!currentPos.withinDistance(startPos, searchRange)) + continue; + + // Replace Mode + if (replace) { + BlockState stateToReplace = worldIn.getBlockState(currentPos); + BlockState stateAboveStateToReplace = worldIn.getBlockState(currentPos.offset(face)); + + // Criteria + if (stateToReplace.getBlockHardness(worldIn, currentPos) == -1) + continue; + if (stateToReplace.getBlock() != state.getBlock() && !searchAcrossMaterials) + continue; + if (stateToReplace.getMaterial().isReplaceable()) + continue; + if (stateAboveStateToReplace.isSolid()) + continue; + list.add(currentPos); + + // Search adjacent spaces + for (BlockPos offset : offsets) + frontier.add(currentPos.add(offset)); + continue; + } + + // Place Mode + BlockState stateToPlaceAt = worldIn.getBlockState(currentPos); + BlockState stateToPlaceOn = worldIn.getBlockState(currentPos.offset(face.getOpposite())); + + // Criteria + if (stateToPlaceOn.getMaterial().isReplaceable()) + continue; + if (stateToPlaceOn.getBlock() != state.getBlock() && !searchAcrossMaterials) + continue; + if (!stateToPlaceAt.getMaterial().isReplaceable()) + continue; + list.add(currentPos); + + // Search adjacent spaces + for (BlockPos offset : offsets) + frontier.add(currentPos.add(offset)); + continue; + } + + return list; + } + + public static boolean canBreak(ItemStack stack, BlockState state, World world, BlockPos pos) { + ComponentTier tier = getTier(Components.Body, stack); + float blockHardness = state.getBlockHardness(world, pos); + + if (blockHardness == -1) + return false; + if (tier == ComponentTier.None) + return blockHardness < 3; + if (tier == ComponentTier.BlazeBrass) + return blockHardness < 6; + if (tier == ComponentTier.ChorusChrome) + return true; + + return false; + } + + public static int getMaxAoe(ItemStack stack) { + ComponentTier tier = getTier(Components.Amplifier, stack); + if (tier == ComponentTier.None) + return 2; + if (tier == ComponentTier.BlazeBrass) + return 4; + if (tier == ComponentTier.ChorusChrome) + return 8; + + return 0; + } + + public static int getCooldownDelay(ItemStack stack) { + ComponentTier tier = getTier(Components.Accelerator, stack); + if (tier == ComponentTier.None) + return 8; + if (tier == ComponentTier.BlazeBrass) + return 5; + if (tier == ComponentTier.ChorusChrome) + return 2; + + return 20; + } + + public static int getReachDistance(ItemStack stack) { + ComponentTier tier = getTier(Components.Scope, stack); + if (tier == ComponentTier.None) + return 15; + if (tier == ComponentTier.BlazeBrass) + return 30; + if (tier == ComponentTier.ChorusChrome) + return 100; + + return 0; + } + + public static void applyPattern(List blocksIn, ItemStack stack) { + CompoundNBT tag = stack.getTag(); + PlacementPatterns pattern = !tag.contains("Pattern") ? PlacementPatterns.Solid + : PlacementPatterns.valueOf(tag.getString("Pattern")); + Random r = new Random(); + Predicate filter = Predicates.alwaysFalse(); + + switch (pattern) { + case Chance25: + filter = pos -> r.nextBoolean() || r.nextBoolean(); + break; + case Chance50: + filter = pos -> r.nextBoolean(); + break; + case Chance75: + filter = pos -> r.nextBoolean() && r.nextBoolean(); + break; + case Checkered: + filter = pos -> (pos.getX() + pos.getY() + pos.getZ()) % 2 == 0; + break; + case InverseCheckered: + filter = pos -> (pos.getX() + pos.getY() + pos.getZ()) % 2 != 0; + break; + case Solid: + default: + break; + } + + blocksIn.removeIf(filter); + } + + protected static void dropBlocks(World worldIn, PlayerEntity playerIn, ItemStack item, Direction face, + BlockPos placed) { + TileEntity tileentity = worldIn.getBlockState(placed).hasTileEntity() ? worldIn.getTileEntity(placed) : null; + + if (getTier(Components.Retriever, item) == ComponentTier.None) { + Block.spawnDrops(worldIn.getBlockState(placed), worldIn, placed.offset(face), tileentity); + } + + if (getTier(Components.Retriever, item) == ComponentTier.BlazeBrass) + Block.spawnDrops(worldIn.getBlockState(placed), worldIn, playerIn.getPosition(), tileentity); + + if (getTier(Components.Retriever, item) == ComponentTier.ChorusChrome) + for (ItemStack stack : Block.getDrops(worldIn.getBlockState(placed), (ServerWorld) worldIn, placed, + tileentity)) + if (!playerIn.inventory.addItemStackToInventory(stack)) + Block.spawnAsEntity(worldIn, placed, stack); + } + + protected static void applyCooldown(PlayerEntity playerIn, ItemStack item, boolean dual) { + playerIn.getCooldownTracker().setCooldown(item.getItem(), + dual ? getCooldownDelay(item) * 2 / 3 : getCooldownDelay(item)); + } + + public static ComponentTier getTier(Components component, ItemStack stack) { + if (!stack.hasTag() || !stack.getTag().contains(component.name())) + stack.getOrCreateTag().putString(component.name(), ComponentTier.None.name()); + return ComponentTier.valueOf(stack.getTag().getString(component.name())); + } + + public static void setTier(Components component, ComponentTier tier, ItemStack stack) { + stack.getOrCreateTag().putString(component.name(), tier.name()); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItemRenderer.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItemRenderer.java new file mode 100644 index 000000000..372b66d8d --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunItemRenderer.java @@ -0,0 +1,104 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import com.mojang.blaze3d.platform.GLX; +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.ComponentTier; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.client.model.animation.Animation; + +public class BuilderGunItemRenderer extends ItemStackTileEntityRenderer { + + @Override + public void renderByItem(ItemStack stack) { + ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); + BuilderGunModel mainModel = (BuilderGunModel) itemRenderer.getModelWithOverrides(stack); + float worldTime = Animation.getWorldTime(Minecraft.getInstance().world, + Minecraft.getInstance().getRenderPartialTicks()); + + GlStateManager.pushMatrix(); + GlStateManager.translatef(0.5F, 0.5F, 0.5F); + float lastCoordx = GLX.lastBrightnessX; + float lastCoordy = GLX.lastBrightnessY; + + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, Math.min(lastCoordx + 60, 240), Math.min(lastCoordy + 120, 240)); + + itemRenderer.renderItem(stack, mainModel.getBakedModel()); + + if (BuilderGunItem.getTier(Components.Body, stack) == ComponentTier.None) + itemRenderer.renderItem(stack, mainModel.body); + if (BuilderGunItem.getTier(Components.Body, stack) == ComponentTier.ChorusChrome) + itemRenderer.renderItem(stack, mainModel.chorusBody); + + if (BuilderGunItem.getTier(Components.Scope, stack) == ComponentTier.BlazeBrass) + itemRenderer.renderItem(stack, mainModel.goldScope); + if (BuilderGunItem.getTier(Components.Scope, stack) == ComponentTier.ChorusChrome) + itemRenderer.renderItem(stack, mainModel.chorusScope); + + if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.BlazeBrass) + itemRenderer.renderItem(stack, mainModel.goldAmp); + if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.ChorusChrome) + itemRenderer.renderItem(stack, mainModel.chorusAmp); + + if (BuilderGunItem.getTier(Components.Retriever, stack) == ComponentTier.BlazeBrass) + itemRenderer.renderItem(stack, mainModel.goldRetriever); + if (BuilderGunItem.getTier(Components.Retriever, stack) == ComponentTier.ChorusChrome) + itemRenderer.renderItem(stack, mainModel.chorusRetriever); + + if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.BlazeBrass) + itemRenderer.renderItem(stack, mainModel.goldAcc); + if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.ChorusChrome) + itemRenderer.renderItem(stack, mainModel.chorusAcc); + + if (mainModel.showBlock && stack.hasTag() && stack.getTag().contains("BlockUsed")) { + BlockState state = NBTUtil.readBlockState(stack.getTag().getCompound("BlockUsed")); + + GlStateManager.pushMatrix(); + GlStateManager.translatef(-0.8F, -0.7F, -0.5F); + GlStateManager.scalef(0.25F, 0.25F, 0.25F); + itemRenderer.renderItem(new ItemStack(state.getBlock()), + Minecraft.getInstance().getBlockRendererDispatcher().getModelForState(state)); + GlStateManager.popMatrix(); + } + + GlStateManager.disableLighting(); + + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, MathHelper.sin(worldTime * 5) * 120 + 120, 120); + if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.BlazeBrass) + itemRenderer.renderItem(stack, mainModel.goldAccCore); + if (BuilderGunItem.getTier(Components.Accelerator, stack) == ComponentTier.ChorusChrome) + itemRenderer.renderItem(stack, mainModel.chorusAccCore); + + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, 240, 120); + if (BuilderGunItem.getTier(Components.Body, stack) == ComponentTier.BlazeBrass) + itemRenderer.renderItem(stack, mainModel.goldBody); + + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, 240, 240); + if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.BlazeBrass) + itemRenderer.renderItem(stack, mainModel.goldAmpCore); + if (BuilderGunItem.getTier(Components.Amplifier, stack) == ComponentTier.ChorusChrome) + itemRenderer.renderItem(stack, mainModel.chorusAmpCore); + + float angle = worldTime * -50; + angle %= 360; + + float offset = -.19f; + GlStateManager.translatef(0, offset, 0); + GlStateManager.rotatef(angle, 0, 0, 1); + GlStateManager.translatef(0, -offset, 0); + itemRenderer.renderItem(stack, mainModel.rod); + + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, lastCoordx, lastCoordy); + GlStateManager.enableLighting(); + + GlStateManager.popMatrix(); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunModel.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunModel.java new file mode 100644 index 000000000..dedd8f92c --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunModel.java @@ -0,0 +1,72 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import javax.vecmath.Matrix4f; + +import org.apache.commons.lang3.tuple.Pair; + +import com.simibubi.create.foundation.block.CustomRenderItemBakedModel; + +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraftforge.client.event.ModelBakeEvent; + +@SuppressWarnings("deprecation") +public class BuilderGunModel extends CustomRenderItemBakedModel { + + public IBakedModel rod; + public IBakedModel body; + public boolean showBlock; + + public IBakedModel goldBody; + public IBakedModel goldScope; + public IBakedModel goldAmp; + public IBakedModel goldAmpCore; + public IBakedModel goldRetriever; + public IBakedModel goldAcc; + public IBakedModel goldAccCore; + + public IBakedModel chorusBody; + public IBakedModel chorusScope; + public IBakedModel chorusAmp; + public IBakedModel chorusAmpCore; + public IBakedModel chorusRetriever; + public IBakedModel chorusAcc; + public IBakedModel chorusAccCore; + + public BuilderGunModel(IBakedModel template) { + super(template); + } + + @Override + public Pair handlePerspective(TransformType cameraTransformType) { + showBlock = cameraTransformType == TransformType.GUI; + return super.handlePerspective(cameraTransformType); + } + + @Override + public CustomRenderItemBakedModel loadPartials(ModelBakeEvent event) { + String p = "placement_handgun/"; + + this.rod = loadCustomModel(event, p + "core"); + this.body = loadCustomModel(event, p + "body"); + + this.goldBody = loadCustomModel(event, p + "gold_body"); + this.goldScope = loadCustomModel(event, p + "gold_scope"); + this.goldAmp = loadCustomModel(event, p + "gold_amplifier"); + this.goldAmpCore = loadCustomModel(event, p + "gold_amplifier_core"); + this.goldRetriever = loadCustomModel(event, p + "gold_retriever"); + this.goldAcc = loadCustomModel(event, p + "gold_accelerator"); + this.goldAccCore = loadCustomModel(event, p + "gold_accelerator_core"); + + this.chorusBody = loadCustomModel(event, p + "chorus_body"); + this.chorusScope = loadCustomModel(event, p + "chorus_scope"); + this.chorusAmp = loadCustomModel(event, p + "chorus_amplifier"); + this.chorusAmpCore = loadCustomModel(event, p + "chorus_amplifier_core"); + this.chorusRetriever = loadCustomModel(event, p + "chorus_retriever"); + this.chorusAcc = loadCustomModel(event, p + "chorus_accelerator"); + this.chorusAccCore = loadCustomModel(event, p + "chorus_accelerator_core"); + + return this; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunScreen.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunScreen.java new file mode 100644 index 000000000..c3234b260 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunScreen.java @@ -0,0 +1,231 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import java.util.Collections; +import java.util.Vector; + +import org.lwjgl.opengl.GL11; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.simibubi.create.AllPackets; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.ScreenResources; +import com.simibubi.create.foundation.gui.widgets.IconButton; +import com.simibubi.create.foundation.gui.widgets.Indicator; +import com.simibubi.create.foundation.gui.widgets.Indicator.State; +import com.simibubi.create.foundation.gui.widgets.Label; +import com.simibubi.create.foundation.gui.widgets.ScrollInput; +import com.simibubi.create.foundation.packet.NbtPacket; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.texture.AtlasTexture; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.client.model.data.EmptyModelData; + +@SuppressWarnings("deprecation") +public class BuilderGunScreen extends AbstractSimiScreen { + + private ItemStack item; + private boolean offhand; + private float animationProgress; + + private IconButton replaceModeButton; + private Indicator replaceModeIndicator; + private IconButton spreadDiagonallyButton; + private Indicator spreadDiagonallyIndicator; + private IconButton spreadMaterialButton; + private Indicator spreadMaterialIndicator; + + private ScrollInput spreadRangeInput; + private Label spreadRangeLabel; + + private Vector patternButtons; + + public BuilderGunScreen(ItemStack handgun, boolean offhand) { + super(); + item = handgun; + this.offhand = offhand; + } + + @Override + protected void init() { + animationProgress = 0; + setWindowSize(ScreenResources.PLACEMENT_GUN.width + 40, ScreenResources.PLACEMENT_GUN.height); + super.init(); + int i = topLeftX - 20; + int j = topLeftY; + + CompoundNBT nbt = item.getOrCreateTag(); + + widgets.clear(); + replaceModeIndicator = new Indicator(i + 51, j + 36, ""); + replaceModeButton = new IconButton(i + 51, j + 41, ScreenResources.ICON_REPLACE_SOLID); + if (nbt.contains("Replace") && nbt.getBoolean("Replace")) + replaceModeIndicator.state = State.ON; + replaceModeButton.setToolTip("Replace Mode"); + + spreadDiagonallyIndicator = new Indicator(i + 74, j + 36, ""); + spreadDiagonallyButton = new IconButton(i + 74, j + 41, ScreenResources.ICON_FOLLOW_DIAGONAL); + if (nbt.contains("SearchDiagonal") && nbt.getBoolean("SearchDiagonal")) + spreadDiagonallyIndicator.state = State.ON; + spreadDiagonallyButton.setToolTip("Follow Diagonals"); + + spreadMaterialIndicator = new Indicator(i + 92, j + 36, ""); + spreadMaterialButton = new IconButton(i + 92, j + 41, ScreenResources.ICON_FOLLOW_MATERIAL); + if (nbt.contains("SearchFuzzy") && nbt.getBoolean("SearchFuzzy")) + spreadMaterialIndicator.state = State.ON; + spreadMaterialButton.setToolTip("Ignore Material Borders"); + + spreadRangeLabel = new Label(i + 119, j + 46, "").withShadow().withSuffix("m"); + spreadRangeInput = new ScrollInput(i + 115, j + 43, 22, 14) + .withRange(1, BuilderGunItem.getMaxAoe(item)).setState(1) + .titled("Spread Range").writingTo(spreadRangeLabel); + + if (nbt.contains("SearchDistance")) + spreadRangeInput.setState(nbt.getInt("SearchDistance")); + + Collections.addAll(widgets, replaceModeButton, replaceModeIndicator, spreadDiagonallyButton, + spreadDiagonallyIndicator, spreadMaterialButton, spreadMaterialIndicator, spreadRangeLabel, + spreadRangeInput); + + patternButtons = new Vector<>(6); + for (int row = 0; row <= 1; row++) { + for (int col = 0; col <= 2; col++) { + int id = patternButtons.size(); + PlacementPatterns pattern = PlacementPatterns.values()[id]; + patternButtons.add(new IconButton(i + 147 + col * 18, j + 23 + row * 18, pattern.icon)); + patternButtons.get(id).setToolTip(pattern.displayName); + + } + } + + if (nbt.contains("Pattern")) + patternButtons.get(PlacementPatterns.valueOf(nbt.getString("Pattern")).ordinal()).active = false; + + widgets.addAll(patternButtons); + + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + CompoundNBT nbt = item.getTag(); + + if (replaceModeButton.isHovered()) { + boolean mode = nbt.contains("Replace") && nbt.getBoolean("Replace"); + mode = !mode; + replaceModeIndicator.state = mode ? State.ON : State.OFF; + nbt.putBoolean("Replace", mode); + } + + if (spreadDiagonallyButton.isHovered()) { + boolean mode = nbt.contains("SearchDiagonal") && nbt.getBoolean("SearchDiagonal"); + mode = !mode; + spreadDiagonallyIndicator.state = mode ? State.ON : State.OFF; + nbt.putBoolean("SearchDiagonal", mode); + } + + if (spreadMaterialButton.isHovered()) { + boolean mode = nbt.contains("SearchFuzzy") && nbt.getBoolean("SearchFuzzy"); + mode = !mode; + spreadMaterialIndicator.state = mode ? State.ON : State.OFF; + nbt.putBoolean("SearchFuzzy", mode); + } + + for (IconButton patternButton : patternButtons) { + if (patternButton.isHovered()) { + patternButtons.forEach(b -> b.active = true); + patternButton.active = false; + patternButton.playDownSound(Minecraft.getInstance().getSoundHandler()); + nbt.putString("Pattern", PlacementPatterns.values()[patternButtons.indexOf(patternButton)].name()); + } + } + + return super.mouseClicked(x, y, button); + } + + @Override + public void onClose() { + CompoundNBT nbt = item.getTag(); + nbt.putInt("SearchDistance", spreadRangeInput.getState()); + AllPackets.channel.sendToServer(new NbtPacket(item, offhand ? -2 : -1)); + super.onClose(); + } + + @Override + public void tick() { + super.tick(); + animationProgress += 5; + } + + @Override + protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + int i = topLeftX - 20; + int j = topLeftY; + ScreenResources.PLACEMENT_GUN.draw(this, i, j); + + font.drawStringWithShadow("Placement Handgun", i + 8, j + 10, 0xCCDDFF); + font.drawString("Patterns", i + 148, j + 11, ScreenResources.FONT_COLOR); + + minecraft.getTextureManager().bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE); + GlStateManager.enableBlend(); + + renderBlock(); + + GlStateManager.pushLightingAttributes(); + GlStateManager.pushMatrix(); + + RenderHelper.enableStandardItemLighting(); + GlStateManager.enableBlend(); + GlStateManager.enableRescaleNormal(); + GlStateManager.enableAlphaTest(); + GlStateManager.alphaFunc(516, 0.1F); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); + + GlStateManager.translated((this.width - this.sWidth) / 2 + 260, this.height / 2 - this.sHeight / 4, 100); + GlStateManager.rotatef(90 + 0.2f * animationProgress, 0, 1, 0); + GlStateManager.rotatef(-40, .8f, 0, -.0f); + GlStateManager.scaled(100, -100, 100); + + IBakedModel model = itemRenderer.getModelWithOverrides(item); + model.handlePerspective(TransformType.FIXED); + itemRenderer.renderItem(item, model); + + GlStateManager.disableAlphaTest(); + GlStateManager.disableRescaleNormal(); + GlStateManager.disableLighting(); + + GlStateManager.popMatrix(); + GlStateManager.popAttributes(); + } + + private void renderBlock() { + GlStateManager.pushMatrix(); + BufferBuilder buffer = Tessellator.getInstance().getBuffer(); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + GlStateManager.translated(topLeftX + 1.7f, topLeftY - 49, 120); + GlStateManager.rotatef(-30f, .5f, .9f, -.1f); + GlStateManager.scaled(20, -20, 20); + + BlockState state = Blocks.BEACON.getDefaultState(); + if (item.hasTag() && item.getTag().contains("BlockUsed")) + state = NBTUtil.readBlockState(item.getTag().getCompound("BlockUsed")); + + minecraft.getBlockRendererDispatcher().renderBlock(state, new BlockPos(0, -5, 0), minecraft.world, buffer, + minecraft.world.rand, EmptyModelData.INSTANCE); + + Tessellator.getInstance().draw(); + GlStateManager.popMatrix(); + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunUpgradeRecipe.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunUpgradeRecipe.java new file mode 100644 index 000000000..4e04036bd --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/BuilderGunUpgradeRecipe.java @@ -0,0 +1,105 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import com.google.gson.JsonObject; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllRecipes; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.ComponentTier; +import com.simibubi.create.modules.curiosities.placementHandgun.BuilderGunItem.Components; + +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.JSONUtils; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.registries.ForgeRegistryEntry; + +public class BuilderGunUpgradeRecipe implements ICraftingRecipe { + + private ShapedRecipe recipe; + private Components component; + private ComponentTier tier; + + public BuilderGunUpgradeRecipe(ShapedRecipe recipe, Components component, ComponentTier tier) { + this.recipe = recipe; + this.component = component; + this.tier = tier; + } + + @Override + public boolean matches(CraftingInventory inv, World worldIn) { + return recipe.matches(inv, worldIn); + } + + @Override + public ItemStack getCraftingResult(CraftingInventory inv) { + for (int slot = 0; slot < inv.getSizeInventory(); slot++) { + ItemStack handgun = inv.getStackInSlot(slot).copy(); + if (!AllItems.PLACEMENT_HANDGUN.typeOf(handgun)) + continue; + BuilderGunItem.setTier(component, tier, handgun); + return handgun; + } + return ItemStack.EMPTY; + } + + @Override + public ItemStack getRecipeOutput() { + ItemStack handgun = new ItemStack(AllItems.PLACEMENT_HANDGUN.get()); + BuilderGunItem.setTier(component, tier, handgun); + return handgun; + } + + @Override + public boolean isDynamic() { + return true; + } + + @Override + public ResourceLocation getId() { + return recipe.getId(); + } + + @Override + public IRecipeSerializer getSerializer() { + return AllRecipes.Placement_Handgun_Upgrade.serializer; + } + + public static class Serializer extends ForgeRegistryEntry> implements IRecipeSerializer { + + @Override + public BuilderGunUpgradeRecipe read(ResourceLocation recipeId, JsonObject json) { + ShapedRecipe recipe = IRecipeSerializer.CRAFTING_SHAPED.read(recipeId, json); + + Components component = Components.valueOf(JSONUtils.getString(json, "component")); + ComponentTier tier = ComponentTier.valueOf(JSONUtils.getString(json, "tier")); + return new BuilderGunUpgradeRecipe(recipe, component, tier); + } + + @Override + public BuilderGunUpgradeRecipe read(ResourceLocation recipeId, PacketBuffer buffer) { + ShapedRecipe recipe = IRecipeSerializer.CRAFTING_SHAPED.read(recipeId, buffer); + + Components component = Components.valueOf(buffer.readString(buffer.readInt())); + ComponentTier tier = ComponentTier.valueOf(buffer.readString(buffer.readInt())); + return new BuilderGunUpgradeRecipe(recipe, component, tier); + } + + @Override + public void write(PacketBuffer buffer, BuilderGunUpgradeRecipe recipe) { + IRecipeSerializer.CRAFTING_SHAPED.write(buffer, recipe.recipe); + + String name = recipe.component.name(); + String name2 = recipe.tier.name(); + buffer.writeInt(name.length()); + buffer.writeString(name); + buffer.writeInt(name2.length()); + buffer.writeString(name2); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/PlacementPatterns.java b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/PlacementPatterns.java new file mode 100644 index 000000000..6d1858e02 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/curiosities/placementHandgun/PlacementPatterns.java @@ -0,0 +1,22 @@ +package com.simibubi.create.modules.curiosities.placementHandgun; + +import com.simibubi.create.foundation.gui.ScreenResources; + +public enum PlacementPatterns { + + Solid("Solid Material", ScreenResources.ICON_PATTERN_SOLID), + Checkered("Checkerboard", ScreenResources.ICON_PATTERN_CHECKERED), + InverseCheckered("Inversed Checkerboard", ScreenResources.ICON_PATTERN_CHECKERED_INVERSED), + Chance25("25% Roll", ScreenResources.ICON_PATTERN_CHANCE_25), + Chance50("50% Roll", ScreenResources.ICON_PATTERN_CHANCE_50), + Chance75("75% Roll", ScreenResources.ICON_PATTERN_CHANCE_75); + + public String displayName; + public ScreenResources icon; + + private PlacementPatterns(String displayName, ScreenResources icon) { + this.displayName = displayName; + this.icon = icon; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonScreen.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonScreen.java index 2b6ca2e08..07d35d60f 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonScreen.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonScreen.java @@ -146,10 +146,10 @@ public class SchematicannonScreen extends AbstractSimiContainerScreen"); } - if (hasControlDown()) { + if (hasShiftDown()) { if (skipMissingButton.isHovered()) { List tip = skipMissingButton.getToolTip(); tip.remove(1); diff --git a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java index 3a0112f4c..a97e6ade9 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/modules/schematics/block/SchematicannonTileEntity.java @@ -30,6 +30,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.state.properties.BedPart; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.state.properties.DoubleBlockHalf; +import net.minecraft.state.properties.SlabType; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; @@ -462,6 +463,11 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka // Find Item ItemStack requiredItem = getItemForBlock(blockState); + + if (blockState.has(BlockStateProperties.SLAB_TYPE) + && blockState.get(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE) + requiredItem.setCount(2); + if (!findItemInAttachedInventories(requiredItem)) { if (skipMissing) { statusMsg = "Skipping"; @@ -545,13 +551,34 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka if (hasCreativeCrate) return true; + boolean two = requiredItem.getCount() == 2; + int lastSlot = -1; + for (IItemHandler iItemHandler : attachedInventories) { for (int slot = 0; slot < iItemHandler.getSlots(); slot++) { ItemStack stackInSlot = iItemHandler.getStackInSlot(slot); if (!stackInSlot.isItemEqual(requiredItem)) continue; - if (!iItemHandler.extractItem(slot, 1, false).isEmpty()) + if (!two && !iItemHandler.extractItem(slot, 1, false).isEmpty()) return true; + + // Two Items required (Double slabs) + if (two) { + int count = iItemHandler.extractItem(slot, 2, true).getCount(); + if (count == 2) { + iItemHandler.extractItem(slot, 2, false); + return true; + } else if (count == 1) { + if (lastSlot == -1) + lastSlot = slot; + else { + iItemHandler.extractItem(lastSlot, 1, false); + iItemHandler.extractItem(slot, 1, false); + return true; + } + } + } + } } return false; @@ -628,17 +655,16 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka // Block doesnt have a mapping (Water, lava, etc) if (getItemForBlock(state).getItem() == Items.AIR && state.getBlock() != Blocks.AIR) return true; - + // Block doesnt need to be placed twice (Doors, beds, double plants) if (state.has(BlockStateProperties.DOUBLE_BLOCK_HALF) && state.get(BlockStateProperties.DOUBLE_BLOCK_HALF) == DoubleBlockHalf.UPPER) return true; - if (state.has(BlockStateProperties.BED_PART) - && state.get(BlockStateProperties.BED_PART) == BedPart.HEAD) + if (state.has(BlockStateProperties.BED_PART) && state.get(BlockStateProperties.BED_PART) == BedPart.HEAD) return true; if (state.getBlock() instanceof PistonHeadBlock) return true; - + return false; } @@ -647,12 +673,12 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka for (LaunchedBlock b : flyingBlocks) { b.update(); if (b.ticksRemaining <= 0 && !world.isRemote) { - + // Piston if (b.state.has(BlockStateProperties.EXTENDED)) { b.state = b.state.with(BlockStateProperties.EXTENDED, false); } - + world.setBlockState(b.target, b.state, 18); b.state.getBlock().onBlockPlacedBy(world, b.target, b.state, null, getItemForBlock(b.state)); toRemove.add(b); @@ -754,6 +780,12 @@ public class SchematicannonTileEntity extends SyncedTileEntity implements ITicka ItemStack requiredItem = getItemForBlock(required); if (requiredItem.isEmpty()) continue; + + // Two items for double slabs + if (required.has(BlockStateProperties.SLAB_TYPE) + && required.get(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE) + checklist.require(requiredItem.getItem()); + checklist.require(requiredItem.getItem()); blocksToPlace++; } diff --git a/src/main/java/com/simibubi/create/modules/schematics/client/BlueprintHandler.java b/src/main/java/com/simibubi/create/modules/schematics/client/BlueprintHandler.java index d594815e0..37c2123df 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/client/BlueprintHandler.java +++ b/src/main/java/com/simibubi/create/modules/schematics/client/BlueprintHandler.java @@ -5,7 +5,6 @@ import java.util.HashMap; import org.lwjgl.glfw.GLFW; import com.google.common.collect.ImmutableList; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.Create; @@ -24,29 +23,25 @@ import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.NBTUtil; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.StringTextComponent; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.GuiScreenEvent.MouseScrollEvent; import net.minecraftforge.client.event.InputEvent.KeyInputEvent; import net.minecraftforge.client.event.InputEvent.MouseInputEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.client.event.GuiScreenEvent.MouseScrollEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; -import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; -import net.minecraftforge.fml.common.gameevent.PlayerEvent.ItemPickupEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; @EventBusSubscriber(value = Dist.CLIENT, bus = Bus.FORGE) @@ -80,38 +75,6 @@ public class BlueprintHandler { selectionScreen = new ToolSelectionScreen(ImmutableList.of(Tools.Deploy), this::equip); } - @SubscribeEvent - public static void onPaperCrafted(ItemCraftedEvent event) { - if (event.isCanceled()) - return; - if (event.getCrafting().getItem() == Items.PAPER) { - event.getPlayer() - .unlockRecipes(new ResourceLocation[] { AllItems.EMPTY_BLUEPRINT.get().getRegistryName() }); - } - if (event.getCrafting().getItem() == Items.BONE_MEAL) { - event.getPlayer() - .unlockRecipes(new ResourceLocation[] { AllItems.TREE_FERTILIZER.get().getRegistryName() }); - } - if (event.getCrafting().getItem() == Items.END_ROD) { - event.getPlayer().unlockRecipes(new ResourceLocation[] { AllItems.SYMMETRY_WAND.get().getRegistryName() }); - } - if (AllItems.EMPTY_BLUEPRINT.typeOf(event.getCrafting())) { - event.getPlayer() - .unlockRecipes(new ResourceLocation[] { AllItems.BLUEPRINT_AND_QUILL.get().getRegistryName(), - AllBlocks.SCHEMATIC_TABLE.get().getRegistryName(), - AllBlocks.SCHEMATICANNON.get().getRegistryName() }); - } - } - - @SubscribeEvent - public static void onItemPickup(ItemPickupEvent event) { - if (event.isCanceled()) - return; - if (event.getStack().getItem() == Items.END_ROD) { - event.getPlayer().unlockRecipes(new ResourceLocation[] { AllItems.SYMMETRY_WAND.get().getRegistryName() }); - } - } - @SubscribeEvent public static void onClientTick(ClientTickEvent event) { ClientPlayerEntity player = Minecraft.getInstance().player; diff --git a/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java b/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java index 04466b8cd..5423905b4 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java +++ b/src/main/java/com/simibubi/create/modules/schematics/packet/ConfigureSchematicannonPacket.java @@ -92,6 +92,7 @@ public class ConfigureSchematicannonPacket { return; }); + context.get().setPacketHandled(true); } } diff --git a/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicPlacePacket.java b/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicPlacePacket.java index aa8a1e6cd..ec79bcbc9 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicPlacePacket.java +++ b/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicPlacePacket.java @@ -34,6 +34,7 @@ public class SchematicPlacePacket { t.addBlocksToWorld(player.getServerWorld(), NBTUtil.readBlockPos(stack.getTag().getCompound("Anchor")), BlueprintItem.getSettings(stack)); }); + context.get().setPacketHandled(true); } } diff --git a/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicUploadPacket.java b/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicUploadPacket.java index f99b5013f..5044484de 100644 --- a/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicUploadPacket.java +++ b/src/main/java/com/simibubi/create/modules/schematics/packet/SchematicUploadPacket.java @@ -77,6 +77,7 @@ public class SchematicUploadPacket { Create.sSchematicLoader.handleFinishedUpload(player, schematic); } }); + context.get().setPacketHandled(true); } } diff --git a/src/main/java/com/simibubi/create/modules/symmetry/SymmetryEffectPacket.java b/src/main/java/com/simibubi/create/modules/symmetry/SymmetryEffectPacket.java index 6441f4d07..3dab4f809 100644 --- a/src/main/java/com/simibubi/create/modules/symmetry/SymmetryEffectPacket.java +++ b/src/main/java/com/simibubi/create/modules/symmetry/SymmetryEffectPacket.java @@ -8,6 +8,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.network.PacketBuffer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.NetworkEvent.Context; public class SymmetryEffectPacket { @@ -37,12 +39,14 @@ public class SymmetryEffectPacket { } } - public void handle(Supplier context) { - if (Minecraft.getInstance().player.getPositionVector().distanceTo(new Vec3d(mirror)) > 100) - return; - - for (BlockPos to : positions) - SymmetryHandler.drawEffect(mirror, to); + public void handle(Supplier ctx) { + ctx.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + if (Minecraft.getInstance().player.getPositionVector().distanceTo(new Vec3d(mirror)) > 100) + return; + for (BlockPos to : positions) + SymmetryHandler.drawEffect(mirror, to); + })); + ctx.get().setPacketHandled(true); } } diff --git a/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandItem.java index 46d9d97b2..2d5dba869 100644 --- a/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandItem.java @@ -7,6 +7,7 @@ import java.util.Map; import com.simibubi.create.AllPackets; import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.utility.BlockHelper; import com.simibubi.create.foundation.utility.KeyboardHelper; import com.simibubi.create.modules.symmetry.mirror.CrossPlaneMirror; import com.simibubi.create.modules.symmetry.mirror.EmptyMirror; @@ -48,8 +49,7 @@ public class SymmetryWandItem extends Item { public SymmetryWandItem(Properties properties) { super(properties.maxStackSize(1)); } - - + @Override @OnlyIn(Dist.CLIENT) public void addInformation(ItemStack stack, World worldIn, List tooltip, ITooltipFlag flagIn) { @@ -57,13 +57,14 @@ public class SymmetryWandItem extends Item { tooltip.add(new StringTextComponent(TextFormatting.GRAY + "Perfectly mirrors your Block placement")); tooltip.add(new StringTextComponent(TextFormatting.GRAY + "across the configured planes.")); tooltip.add(new StringTextComponent("")); - tooltip.add(new StringTextComponent(TextFormatting.GRAY + "> [Right-Click] on ground to place mirror")); - tooltip.add(new StringTextComponent(TextFormatting.GRAY + "> [Right-Click] in air to configure mirror")); - tooltip.add(new StringTextComponent(TextFormatting.GRAY + "> [Shift-Right-Click] to toggle")); + tooltip.add( + new StringTextComponent(TextFormatting.GRAY + "> [Right-Click] on ground to place/move mirror")); + tooltip.add(new StringTextComponent(TextFormatting.GRAY + "> [Right-Click] in air to remove mirror")); + tooltip.add(new StringTextComponent(TextFormatting.GRAY + "> [Shift-Right-Click] to configure")); tooltip.add(new StringTextComponent("")); tooltip.add(new StringTextComponent(TextFormatting.DARK_GRAY + "Active while held in the Hotbar")); - - } else + + } else tooltip.add(new StringTextComponent(TextFormatting.DARK_GRAY + "< Hold Shift >")); super.addInformation(stack, worldIn, tooltip, flagIn); } @@ -73,22 +74,28 @@ public class SymmetryWandItem extends Item { PlayerEntity player = context.getPlayer(); BlockPos pos = context.getPos(); player.getCooldownTracker().setCooldown(this, 5); + ItemStack wand = player.getHeldItem(context.getHand()); + checkNBT(wand); + + // Shift -> open GUI + if (player.isSneaking()) { + if (player.world.isRemote) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + openWandGUI(wand); + }); + player.getCooldownTracker().setCooldown(this, 5); + } + return ActionResultType.SUCCESS; + } if (context.getWorld().isRemote || context.getHand() != Hand.MAIN_HAND) return ActionResultType.SUCCESS; - ItemStack wand = player.getHeldItem(context.getHand()); - checkNBT(wand); CompoundNBT compound = wand.getTag().getCompound($SYMMETRY); pos = pos.offset(context.getFace()); SymmetryMirror previousElement = SymmetryMirror.fromNBT(compound); - if (player.isSneaking()) { - if (!(previousElement instanceof EmptyMirror)) - wand.getTag().putBoolean($ENABLE, !isEnabled(wand)); - return ActionResultType.SUCCESS; - } - + // No Shift -> Make / Move Mirror wand.getTag().putBoolean($ENABLE, true); Vec3d pos3d = new Vec3d(pos.getX(), pos.getY(), pos.getZ()); SymmetryMirror newElement = new PlaneMirror(pos3d); @@ -131,13 +138,23 @@ public class SymmetryWandItem extends Item { @Override public ActionResult onItemRightClick(World worldIn, PlayerEntity playerIn, Hand handIn) { - if (worldIn.isRemote) { - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - openWandGUI(playerIn.getHeldItem(handIn)); - }); - playerIn.getCooldownTracker().setCooldown(this, 5); + ItemStack wand = playerIn.getHeldItem(handIn); + checkNBT(wand); + + // Shift -> Open GUI + if (playerIn.isSneaking()) { + if (worldIn.isRemote) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + openWandGUI(playerIn.getHeldItem(handIn)); + }); + playerIn.getCooldownTracker().setCooldown(this, 5); + } + return new ActionResult(ActionResultType.SUCCESS, wand); } - return super.onItemRightClick(worldIn, playerIn, handIn); + + // No Shift -> Clear Mirror + wand.getTag().putBoolean($ENABLE, false); + return new ActionResult(ActionResultType.SUCCESS, wand); } @OnlyIn(Dist.CLIENT) @@ -179,31 +196,36 @@ public class SymmetryWandItem extends Item { return; symmetry.process(blockSet); - BlockPos to = new BlockPos(mirrorPos); List targets = new ArrayList<>(); - targets.add(pos); + for (BlockPos position : blockSet.keySet()) { + if (position.equals(pos)) + continue; + if (world.func_217350_a(block, position, ISelectionContext.forEntity(player))) { - Item required = BlockItem.BLOCK_TO_ITEM.get(block.getBlock()); + BlockState blockState = blockSet.get(position); + for (Direction face : Direction.values()) + blockState = blockState.updatePostPlacement(face, world.getBlockState(position.offset(face)), world, + position, position.offset(face)); if (player.isCreative()) { - world.setBlockState(position, blockSet.get(position)); + world.setBlockState(position, blockState); targets.add(position); continue; } + + BlockState toReplace = world.getBlockState(position); + if (!toReplace.getMaterial().isReplaceable()) + continue; + if (toReplace.getBlockHardness(world, position) == -1) + continue; + if (BlockHelper.findAndRemoveInInventory(blockState, player, 1) == 0) + continue; - for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { - ItemStack itemstack = player.inventory.getStackInSlot(i); - if (itemstack.getItem() == required && itemstack.getCount() > 0) { - player.inventory.setInventorySlotContents(i, - new ItemStack(itemstack.getItem(), itemstack.getCount() - 1)); - world.setBlockState(position, blockSet.get(position)); - targets.add(position); - break; - } - } + world.setBlockState(position, blockState); + targets.add(position); } } @@ -245,7 +267,7 @@ public class SymmetryWandItem extends Item { targets.add(position); world.playEvent(2001, pos, Block.getStateId(blockstate)); world.setBlockState(position, air, 3); - + if (!player.isCreative()) { if (!player.getHeldItemMainhand().isEmpty()) player.getHeldItemMainhand().onBlockDestroyed(world, blockstate, position, player); diff --git a/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandScreen.java b/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandScreen.java index ec1b7c132..23755ecea 100644 --- a/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandScreen.java +++ b/src/main/java/com/simibubi/create/modules/symmetry/SymmetryWandScreen.java @@ -137,7 +137,7 @@ public class SymmetryWandScreen extends AbstractSimiScreen { GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); - GlStateManager.translated((this.width - this.sWidth) / 2 + 250, 250, 100); + GlStateManager.translated((this.width - this.sWidth) / 2 + 250, this.height / 2 + this.sHeight / 2, 100); GlStateManager.rotatef(-30, .4f, 0, -.2f); GlStateManager.rotatef(90 + 0.2f * animationProgress, 0, 1, 0); GlStateManager.scaled(100, -100, 100); diff --git a/src/main/java/com/simibubi/create/modules/symmetry/client/SymmetryWandItemRenderer.java b/src/main/java/com/simibubi/create/modules/symmetry/client/SymmetryWandItemRenderer.java new file mode 100644 index 000000000..53d924d19 --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/symmetry/client/SymmetryWandItemRenderer.java @@ -0,0 +1,50 @@ +package com.simibubi.create.modules.symmetry.client; + +import com.mojang.blaze3d.platform.GLX; +import com.mojang.blaze3d.platform.GlStateManager; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.client.model.animation.Animation; + +public class SymmetryWandItemRenderer extends ItemStackTileEntityRenderer { + + @Override + public void renderByItem(ItemStack stack) { + + ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); + SymmetryWandModel mainModel = (SymmetryWandModel) itemRenderer.getModelWithOverrides(stack); + float worldTime = Animation.getWorldTime(Minecraft.getInstance().world, + Minecraft.getInstance().getRenderPartialTicks()); + + GlStateManager.pushMatrix(); + GlStateManager.translatef(0.5F, 0.5F, 0.5F); + itemRenderer.renderItem(stack, mainModel.getBakedModel()); + + float lastCoordx = 0; + float lastCoordy = 0; + + GlStateManager.disableLighting(); + lastCoordx = GLX.lastBrightnessX; + lastCoordy = GLX.lastBrightnessY; + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, 240, 240); + + itemRenderer.renderItem(stack, mainModel.core); + + float floating = MathHelper.sin(worldTime) * .05f; + GlStateManager.translated(0, floating, 0); + float angle = worldTime * -10 % 360; + GlStateManager.rotated(angle, 0, 1, 0); + itemRenderer.renderItem(stack, mainModel.bits); + + GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, lastCoordx, lastCoordy); + GlStateManager.enableLighting(); + + GlStateManager.popMatrix(); + + } + +} diff --git a/src/main/java/com/simibubi/create/modules/symmetry/client/SymmetryWandModel.java b/src/main/java/com/simibubi/create/modules/symmetry/client/SymmetryWandModel.java new file mode 100644 index 000000000..74e36d3be --- /dev/null +++ b/src/main/java/com/simibubi/create/modules/symmetry/client/SymmetryWandModel.java @@ -0,0 +1,24 @@ +package com.simibubi.create.modules.symmetry.client; + +import com.simibubi.create.foundation.block.CustomRenderItemBakedModel; + +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraftforge.client.event.ModelBakeEvent; + +public class SymmetryWandModel extends CustomRenderItemBakedModel { + + public IBakedModel core; + public IBakedModel bits; + + public SymmetryWandModel(IBakedModel template) { + super(template); + } + + @Override + public CustomRenderItemBakedModel loadPartials(ModelBakeEvent event) { + this.core = loadCustomModel(event, "symmetry_wand_core"); + this.bits = loadCustomModel(event, "symmetry_wand_bits"); + return this; + } + +} diff --git a/src/main/java/com/simibubi/create/modules/symmetry/mirror/SymmetryMirror.java b/src/main/java/com/simibubi/create/modules/symmetry/mirror/SymmetryMirror.java index 519c57c8f..7ed6ae192 100644 --- a/src/main/java/com/simibubi/create/modules/symmetry/mirror/SymmetryMirror.java +++ b/src/main/java/com/simibubi/create/modules/symmetry/mirror/SymmetryMirror.java @@ -14,9 +14,9 @@ import net.minecraft.state.DirectionProperty; import net.minecraft.state.IProperty; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; import net.minecraft.util.IStringSerializable; import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -156,67 +156,11 @@ public abstract class SymmetryMirror { } protected BlockState flipD1(BlockState in) { - for (IProperty property : in.getProperties()) { - - if (property == BlockStateProperties.AXIS || property == BlockStateProperties.HORIZONTAL_AXIS) { - Axis axis = ((Axis) in.get(property)); - if (axis.isVertical()) - return in; - Axis value = axis == Axis.X ? Axis.Z : Axis.X; - if (property == BlockStateProperties.AXIS) - return in.with(BlockStateProperties.AXIS, value); - return in.with(BlockStateProperties.HORIZONTAL_AXIS, value); - } - - if (property instanceof DirectionProperty) { - switch ((Direction) in.get(property)) { - case EAST: - return in.with((DirectionProperty) property, Direction.NORTH); - case NORTH: - return in.with((DirectionProperty) property, Direction.EAST); - case SOUTH: - return in.with((DirectionProperty) property, Direction.WEST); - case WEST: - return in.with((DirectionProperty) property, Direction.SOUTH); - default: - break; - } - } - - } - return in; + return in.rotate(Rotation.COUNTERCLOCKWISE_90).mirror(Mirror.FRONT_BACK); } protected BlockState flipD2(BlockState in) { - for (IProperty property : in.getProperties()) { - - if (property == BlockStateProperties.AXIS || property == BlockStateProperties.HORIZONTAL_AXIS) { - Axis axis = ((Axis) in.get(property)); - if (axis.isVertical()) - return in; - Axis value = axis == Axis.X ? Axis.Z : Axis.X; - if (property == BlockStateProperties.AXIS) - return in.with(BlockStateProperties.AXIS, value); - return in.with(BlockStateProperties.HORIZONTAL_AXIS, value); - } - - if (property instanceof DirectionProperty) { - switch ((Direction) in.get(property)) { - case EAST: - return in.with((DirectionProperty) property, Direction.SOUTH); - case NORTH: - return in.with((DirectionProperty) property, Direction.WEST); - case SOUTH: - return in.with((DirectionProperty) property, Direction.EAST); - case WEST: - return in.with((DirectionProperty) property, Direction.NORTH); - default: - break; - } - } - - } - return in; + return in.rotate(Rotation.COUNTERCLOCKWISE_90).mirror(Mirror.LEFT_RIGHT); } protected BlockPos flipX(BlockPos position) { diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 1eb284e24..b415ffeb2 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -14,7 +14,7 @@ loaderVersion="[26,)" #mandatory (26 is current forge version) # The modid of the mod modId="create" #mandatory # The version number of the mod - there's a few well known ${} variables useable here or just hardcode it -version="0.0.3" #mandatory +version="0.0.4" #mandatory # A display name for the mod displayName="Create" #mandatory # A URL to query for updates for this mod. See the JSON update specification diff --git a/src/main/resources/assets/create/lang/en_us.json b/src/main/resources/assets/create/lang/en_us.json index 89043c300..30947af32 100644 --- a/src/main/resources/assets/create/lang/en_us.json +++ b/src/main/resources/assets/create/lang/en_us.json @@ -1,7 +1,11 @@ { "item.create.symmetry_wand": "Staff of Symmetry", + "item.create.placement_handgun": "Handheld Blockzapper", "item.create.tree_fertilizer": "Tree Fertilizer", "item.create.empty_blueprint": "Empty Schematic", + "item.create.andesite_alloy_cube": "Andesite Alloy", + "item.create.blaze_brass_cube": "Blaze Brass", + "item.create.chorus_chrome_cube": "Chorus Chrome", "item.create.blueprint_and_quill": "Schematic and Quill", "item.create.blueprint": "Schematic", "block.create.schematicannon": "Schematicannon", diff --git a/src/main/resources/assets/create/models/block/symmetry_crossplane.json b/src/main/resources/assets/create/models/block/symmetry_crossplane.json index ba4f5ca74..fede15ab1 100644 --- a/src/main/resources/assets/create/models/block/symmetry_crossplane.json +++ b/src/main/resources/assets/create/models/block/symmetry_crossplane.json @@ -3,7 +3,7 @@ "textures": { "0": "block/white_stained_glass", "1": "block/obsidian", - "2": "block/light_blue_concrete_powder" + "2": "block/packed_ice" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/symmetry_crossplane_diagonal.json b/src/main/resources/assets/create/models/block/symmetry_crossplane_diagonal.json index 38dd61dcc..dc89290e8 100644 --- a/src/main/resources/assets/create/models/block/symmetry_crossplane_diagonal.json +++ b/src/main/resources/assets/create/models/block/symmetry_crossplane_diagonal.json @@ -3,7 +3,7 @@ "textures": { "0": "block/white_stained_glass", "1": "block/obsidian", - "2": "block/light_blue_concrete_powder" + "2": "block/packed_ice" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/symmetry_plane.json b/src/main/resources/assets/create/models/block/symmetry_plane.json index 816212543..5d36206de 100644 --- a/src/main/resources/assets/create/models/block/symmetry_plane.json +++ b/src/main/resources/assets/create/models/block/symmetry_plane.json @@ -3,7 +3,7 @@ "textures": { "0": "block/white_stained_glass", "1": "block/obsidian", - "2": "block/light_blue_concrete_powder" + "2": "block/packed_ice" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/symmetry_tripleplane.json b/src/main/resources/assets/create/models/block/symmetry_tripleplane.json index af46c8584..2af7a097f 100644 --- a/src/main/resources/assets/create/models/block/symmetry_tripleplane.json +++ b/src/main/resources/assets/create/models/block/symmetry_tripleplane.json @@ -3,7 +3,7 @@ "textures": { "0": "block/white_stained_glass", "1": "block/obsidian", - "2": "block/light_blue_concrete_powder" + "2": "block/packed_ice" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/item/andesite_alloy_cube.json b/src/main/resources/assets/create/models/item/andesite_alloy_cube.json new file mode 100644 index 000000000..5a264e6bd --- /dev/null +++ b/src/main/resources/assets/create/models/item/andesite_alloy_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/andesite_alloy_cube" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/blaze_brass_cube.json b/src/main/resources/assets/create/models/item/blaze_brass_cube.json new file mode 100644 index 000000000..cf84e4e00 --- /dev/null +++ b/src/main/resources/assets/create/models/item/blaze_brass_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/blaze_brass_cube" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/chorus_chrome_cube.json b/src/main/resources/assets/create/models/item/chorus_chrome_cube.json new file mode 100644 index 000000000..e60f94401 --- /dev/null +++ b/src/main/resources/assets/create/models/item/chorus_chrome_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/chorus_chrome_cube" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun.json b/src/main/resources/assets/create/models/item/placement_handgun.json new file mode 100644 index 000000000..e617ba80c --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun.json @@ -0,0 +1,95 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "ambientocclusion": true, + "display": { + "firstperson_righthand": { + "rotation": [ 10, 0, 10 ], + "translation": [ 1, 4, 1], + "scale":[ 1, 1, 1 ] + }, + "thirdperson_righthand": { + "rotation": [ 15, 0, 0 ], + "translation": [ 0, 4, -2.5], + "scale":[ 0.8, 0.8, 0.8 ] + }, + "gui": { + "rotation": [ 42, 315, 0 ], + "translation": [ -1, 3, 0], + "scale":[ 1, 1, 1 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 4.2, 0], + "scale":[ 0.4, 0.4, 0.4 ] + }, + "fixed": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, -5, 0 ], + "scale": [ 1, 1, 1 ] + } + }, + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian" + }, + "elements": [ + { + "name": "Grip", + "from": [ 7.0, 1.0, 12.0 ], + "to": [ 9.0, 5.0, 15.0 ], + "rotation": { "origin": [ 8.0, 2.0, 14.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 4.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 4.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 3.0 ] } + } + }, + { + "name": "Connector", + "from": [ 6.499999992549419, 4.0, 7.300000004470348 ], + "to": [ 9.49999999254942, 5.0, 14.300000004470348 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 1.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 7.0, 1.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 1.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 7.0, 1.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 7.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 7.0 ] } + } + }, + { + "name": "Trigger", + "from": [ 7.499999992549419, 3.0, 11.0 ], + "to": [ 8.49999999254942, 6.0, 13.0 ], + "rotation": { "origin": [ 8.0, 2.0, 14.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "east": { "texture": "#4", "uv": [ 0.0, 0.0, 2.0, 3.0 ] }, + "south": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "west": { "texture": "#4", "uv": [ 0.0, 0.0, 2.0, 3.0 ] }, + "up": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 2.0 ] }, + "down": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 2.0 ] } + } + }, + { + "name": "Rod Back Cap", + "from": [ 6.799999997019768, 3.800000011920929, 14.0 ], + "to": [ 9.200000002980232, 6.200000017881393, 15.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 2.4000000059604645 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 2.4000000059604645 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.4000000059604645, 1.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.4000000059604645, 1.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/body.json b/src/main/resources/assets/create/models/item/placement_handgun/body.json new file mode 100644 index 000000000..57af707b1 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/body.json @@ -0,0 +1,28 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "ambientocclusion": true, + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian" + }, + "elements": [ + { + "name": "Rod Back", + "from": [ 7.0, 4.000000014901161, 7.0 ], + "to": [ 9.0, 6.000000014901161, 14.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 7.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "west": { "texture": "#1", "uv": [ 4.0, 3.0, 11.0, 5.0 ] }, + "up": { "texture": "#1", "uv": [ 6.0, 5.0, 8.0, 12.0 ] }, + "down": { "texture": "#1", "uv": [ 8.0, 6.0, 10.0, 13.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_accelerator.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_accelerator.json new file mode 100644 index 000000000..3146f34ab --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_accelerator.json @@ -0,0 +1,53 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/purpur_pillar" + }, + "elements": [ + { + "name": "Accelerator", + "from": [ 6.499999992549419, 5.0, 10.300000004470348 ], + "to": [ 9.49999999254942, 6.0, 15.300000004470348 ], + "faces": { + "north": { "texture": "#5", "uv": [ 7.0, 1.0, 10.0, 2.0 ] }, + "south": { "texture": "#5", "uv": [ 6.0, 3.0, 9.0, 4.0 ] }, + "up": { "texture": "#5", "uv": [ 6.0, 10.0, 9.0, 15.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 0.0, 10.0, 5.0 ] } + } + }, + { + "name": "Accelerator Connector", + "from": [ 6.4000000059604645, 7.300000004470348, 10.300000004470348 ], + "to": [ 9.600000008940697, 8.699999995529652, 11.699999995529652 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 13.0, 1.0, 15.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 4.0, 2.0, 5.399999991059303, 3.3999999910593033 ] }, + "south": { "texture": "#0", "uv": [ 1.0, 6.0, 4.200000002980232, 7.399999991059303 ] }, + "west": { "texture": "#0", "uv": [ 4.0, 2.0, 5.399999991059303, 3.3999999910593033 ] }, + "up": { "texture": "#0", "uv": [ 5.0, 6.0, 8.200000002980232, 7.399999991059303 ] }, + "down": { "texture": "#0", "uv": [ 4.0, 4.0, 7.200000002980232, 5.399999991059303 ] } + } + }, + { + "name": "Accelerator Back Cap", + "from": [ 7.100000001490116, 4.3000000193715096, 15.0 ], + "to": [ 8.699999995529652, 5.900000013411045, 15.399999991059303 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#5", "uv": [ 12.0, 4.0, 13.0, 6.4000000059604645 ] }, + "south": { "texture": "#5", "uv": [ 11.0, 5.0, 13.0, 7.0 ] }, + "west": { "texture": "#5", "uv": [ 6.0, 2.0, 7.0, 4.4000000059604645 ] }, + "up": { "texture": "#5", "uv": [ 7.0, 6.0, 9.400000005960464, 7.0 ] }, + "down": { "texture": "#5", "uv": [ 9.0, 0.0, 11.400000005960464, 1.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_accelerator_core.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_accelerator_core.json new file mode 100644 index 000000000..9c69cd6c1 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_accelerator_core.json @@ -0,0 +1,23 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/purpur_pillar" + }, + "elements": [ + { + "name": "Accelerator Core", + "from": [ 6.499999992549419, 5.0, 10.300000004470348 ], + "to": [ 9.49999999254942, 6.0, 15.300000004470348 ], + "faces": { + "east": { "texture": "#2", "uv": [ 4.0, 2.0, 9.0, 3.0 ] }, + "west": { "texture": "#2", "uv": [ 7.0, 2.0, 12.0, 3.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_amplifier.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_amplifier.json new file mode 100644 index 000000000..5f6539c6d --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_amplifier.json @@ -0,0 +1,71 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/purpur_pillar", + "6": "block/redstone_block" + }, + "elements": [ + { + "name": "Amplifier", + "from": [ 10.000000014901161, 4.0, 4.0 ], + "to": [ 11.000000014901161, 5.0, 10.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 1.0, 2.0, 2.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 10.0, 0.0, 16.0, 1.0 ] }, + "south": { "texture": "#5", "uv": [ 7.0, 7.0, 8.0, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 0.0, 1.0, 6.0, 2.0 ] }, + "up": { "texture": "#5", "uv": [ 2.0, 0.0, 1.0, 6.0 ] }, + "down": { "texture": "#5", "uv": [ 13.0, 10.0, 14.0, 16.0 ] } + } + }, + { + "name": "Amplifier Connector", + "from": [ 9.800000011920929, 5.0, 8.0 ], + "to": [ 10.800000011920929, 8.0, 9.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 6.0, 3.0, 7.0, 6.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 10.0, 2.0, 14.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 15.0, 11.0, 14.0, 15.0 ] }, + "down": { "texture": "#0", "uv": [ 10.0, 3.0, 11.0, 4.0 ] } + } + }, + { + "name": "Amplifier Connector 2", + "from": [ 7.800000011920929, 7.0, 8.0 ], + "to": [ 9.800000011920929, 8.0, 9.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, + "east": { "texture": "#0", "uv": [ 6.0, 3.0, 7.0, 4.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, + "west": { "texture": "#0", "uv": [ 10.0, 2.0, 13.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 6.0, 9.0, 7.0 ] }, + "down": { "texture": "#0", "uv": [ 10.0, 3.0, 12.0, 4.0 ] } + } + }, + { + "name": "Amplifier 2", + "from": [ 5.000000014901161, 3.0, 4.0 ], + "to": [ 6.000000014901161, 4.0, 10.0 ], + "rotation": { "origin": [ 5.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 1.0, 2.0, 2.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 10.0, 0.0, 16.0, 1.0 ] }, + "south": { "texture": "#5", "uv": [ 7.0, 7.0, 8.0, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 0.0, 1.0, 6.0, 2.0 ] }, + "up": { "texture": "#5", "uv": [ 2.0, 0.0, 1.0, 6.0 ] }, + "down": { "texture": "#5", "uv": [ 13.0, 10.0, 14.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_amplifier_core.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_amplifier_core.json new file mode 100644 index 000000000..c54f8a7ce --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_amplifier_core.json @@ -0,0 +1,71 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/purpur_pillar", + "6": "block/redstone_block" + }, + "elements": [ + { + "name": "Amplifier Core", + "from": [ 10.000000014901161, 4.0, 3.0 ], + "to": [ 11.000000014901161, 5.0, 4.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "east": { "texture": "#2", "uv": [ 10.0, 1.0, 11.0, 2.0 ] }, + "south": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "west": { "texture": "#2", "uv": [ 3.0, 5.0, 4.0, 6.0 ] }, + "up": { "texture": "#2", "uv": [ 11.0, 1.0, 10.0, 2.0 ] }, + "down": { "texture": "#2", "uv": [ 13.0, 10.0, 14.0, 11.0 ] } + } + }, + { + "name": "Amplifier Core 2", + "from": [ 5.000000014901161, 3.0, 3.0 ], + "to": [ 6.000000014901161, 4.0, 4.0 ], + "rotation": { "origin": [ 5.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "east": { "texture": "#2", "uv": [ 10.0, 1.0, 11.0, 2.0 ] }, + "south": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "west": { "texture": "#2", "uv": [ 3.0, 5.0, 4.0, 6.0 ] }, + "up": { "texture": "#2", "uv": [ 11.0, 1.0, 10.0, 2.0 ] }, + "down": { "texture": "#2", "uv": [ 13.0, 10.0, 14.0, 11.0 ] } + } + }, + { + "name": "Amplifier Glow", + "from": [ 9.8, 3.7999999970197678, 2.7999999970197678 ], + "to": [ 11.200000005960465, 5.200000002980232, 4.200000002980232 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "south": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "west": { "texture": "#3", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "up": { "texture": "#3", "uv": [ 7.0, 6.0, 9.0, 8.0 ] }, + "down": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Amplifier Glow 2", + "from": [ 4.800000000000001, 2.7999999970197678, 2.7999999970197678 ], + "to": [ 6.200000005960465, 4.200000002980232, 4.200000002980232 ], + "rotation": { "origin": [ 5.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "south": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "west": { "texture": "#3", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "up": { "texture": "#3", "uv": [ 7.0, 6.0, 9.0, 8.0 ] }, + "down": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_body.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_body.json new file mode 100644 index 000000000..51222f9b5 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_body.json @@ -0,0 +1,28 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "ambientocclusion": true, + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/end_stone", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian" + }, + "elements": [ + { + "name": "Rod Back", + "from": [ 7.0, 4.000000014901161, 7.0 ], + "to": [ 9.0, 6.000000014901161, 14.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 7.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "west": { "texture": "#1", "uv": [ 4.0, 3.0, 11.0, 5.0 ] }, + "up": { "texture": "#1", "uv": [ 6.0, 5.0, 8.0, 12.0 ] }, + "down": { "texture": "#1", "uv": [ 8.0, 6.0, 10.0, 13.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_master.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_master.json new file mode 100644 index 000000000..c99986a3e --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_master.json @@ -0,0 +1,341 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/gold_block", + "6": "block/redstone_block" + }, + "elements": [ + { + "name": "Grip", + "from": [ 7.0, 1.0, 12.0 ], + "to": [ 9.0, 5.0, 15.0 ], + "rotation": { "origin": [ 8.0, 2.0, 14.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 4.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 4.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 4.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 3.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 3.0 ] } + } + }, + { + "name": "Connector", + "from": [ 6.499999992549419, 4.0, 7.300000004470348 ], + "to": [ 9.49999999254942, 5.0, 14.300000004470348 ], + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 1.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 7.0, 1.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 1.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 7.0, 1.0 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 7.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 3.0, 7.0 ] } + } + }, + { + "name": "Rod Back", + "from": [ 7.0, 4.000000014901161, 7.0 ], + "to": [ 9.0, 6.000000014901161, 14.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 7.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "west": { "texture": "#1", "uv": [ 4.0, 3.0, 11.0, 5.0 ] }, + "up": { "texture": "#1", "uv": [ 6.0, 5.0, 8.0, 12.0 ] }, + "down": { "texture": "#1", "uv": [ 8.0, 6.0, 10.0, 13.0 ] } + } + }, + { + "name": "Rod Front", + "from": [ 7.300000004470348, 4.3000000193715096, 0.5000000074505806 ], + "to": [ 8.699999995529652, 5.700000010430813, 8.50000000745058 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#2", "uv": [ 0.0, 0.0, 1.3999999910593033, 1.3999999910593033 ] }, + "east": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 1.3999999910593033 ] }, + "south": { "texture": "#2", "uv": [ 0.0, 0.0, 1.3999999910593033, 1.3999999910593033 ] }, + "west": { "texture": "#2", "uv": [ 0.0, 0.0, 8.0, 1.3999999910593033 ] }, + "up": { "texture": "#2", "uv": [ 0.0, 0.0, 1.3999999910593033, 8.0 ] }, + "down": { "texture": "#2", "uv": [ 0.0, 0.0, 1.3999999910593033, 8.0 ] } + } + }, + { + "name": "Rod Glow", + "from": [ 6.899999998509884, 3.900000013411045, 0.0 ], + "to": [ 9.100000001490116, 6.100000016391277, 7.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 0.0, 0.0, 2.2000000029802322, 2.2000000029802322 ] }, + "east": { "texture": "#3", "uv": [ 0.0, 0.0, 7.0, 2.2000000029802322 ] }, + "south": { "texture": "#3", "uv": [ 0.0, 0.0, 2.2000000029802322, 2.2000000029802322 ] }, + "west": { "texture": "#3", "uv": [ 0.0, 0.0, 7.0, 2.2000000029802322 ] }, + "up": { "texture": "#3", "uv": [ 0.0, 0.0, 2.2000000029802322, 7.0 ] }, + "down": { "texture": "#3", "uv": [ 0.0, 0.0, 2.2000000029802322, 7.0 ] } + } + }, + { + "name": "Trigger", + "from": [ 7.499999992549419, 3.0, 11.0 ], + "to": [ 8.49999999254942, 6.0, 13.0 ], + "rotation": { "origin": [ 8.0, 2.0, 14.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "east": { "texture": "#4", "uv": [ 0.0, 0.0, 2.0, 3.0 ] }, + "south": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "west": { "texture": "#4", "uv": [ 0.0, 0.0, 2.0, 3.0 ] }, + "up": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 2.0 ] }, + "down": { "texture": "#4", "uv": [ 0.0, 0.0, 1.0, 2.0 ] } + } + }, + { + "name": "Rod Back Cap", + "from": [ 6.799999997019768, 3.800000011920929, 14.0 ], + "to": [ 9.200000002980232, 6.200000017881393, 15.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 2.4000000059604645 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 2.4000000059604645 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 2.4000000059604645, 1.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 2.4000000059604645, 1.0 ] } + } + }, + { + "name": "Scope", + "from": [ 7.500000007450581, 6.0, 6.0 ], + "to": [ 8.50000000745058, 7.0, 12.0 ], + "faces": { + "north": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 8.0 ] }, + "east": { "texture": "#5", "uv": [ 8.0, 15.0, 14.0, 16.0 ] }, + "south": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 9.0 ] }, + "west": { "texture": "#5", "uv": [ 6.0, 15.0, 12.0, 16.0 ] }, + "up": { "texture": "#5", "uv": [ 15.0, 5.0, 16.0, 11.0 ] }, + "down": { "texture": "#5", "uv": [ 15.0, 4.0, 16.0, 10.0 ] } + } + }, + { + "name": "Scope Back", + "from": [ 7.200000002980232, 7.0, 10.0 ], + "to": [ 8.800000011920929, 9.0, 12.0 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 13.0, 1.0, 15.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 4.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 6.0, 2.6000000089406967, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 4.0 ] }, + "up": { "texture": "#5", "uv": [ 5.0, 6.0, 6.600000008940697, 8.0 ] }, + "down": { "texture": "#5", "uv": [ 4.0, 4.0, 5.600000008940697, 6.0 ] } + } + }, + { + "name": "ScopeTop", + "from": [ 7.0, 7.0, 9.0 ], + "to": [ 9.0, 9.0, 13.0 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#5", "uv": [ 6.0, 3.0, 10.0, 5.0 ] }, + "south": { "texture": "#3", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#5", "uv": [ 10.0, 2.0, 14.0, 3.0 ] }, + "up": { "texture": "#5", "uv": [ 15.0, 11.0, 14.0, 15.0 ] }, + "down": { "texture": "#5", "uv": [ 10.0, 3.0, 12.0, 7.0 ] } + } + }, + { + "name": "Amplifier", + "from": [ 10.000000014901161, 4.0, 4.0 ], + "to": [ 11.000000014901161, 5.0, 10.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 1.0, 2.0, 2.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 10.0, 0.0, 16.0, 1.0 ] }, + "south": { "texture": "#5", "uv": [ 7.0, 7.0, 8.0, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 0.0, 1.0, 6.0, 2.0 ] }, + "up": { "texture": "#5", "uv": [ 2.0, 0.0, 1.0, 6.0 ] }, + "down": { "texture": "#5", "uv": [ 13.0, 10.0, 14.0, 16.0 ] } + } + }, + { + "name": "Amplifier Connector", + "from": [ 9.800000011920929, 5.0, 8.0 ], + "to": [ 10.800000011920929, 8.0, 9.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 6.0, 3.0, 7.0, 6.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 10.0, 2.0, 14.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 15.0, 11.0, 14.0, 15.0 ] }, + "down": { "texture": "#0", "uv": [ 10.0, 3.0, 11.0, 4.0 ] } + } + }, + { + "name": "Amplifier Glow", + "from": [ 9.8, 3.7999999970197678, 2.7999999970197678 ], + "to": [ 11.200000005960465, 5.200000002980232, 4.200000002980232 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "south": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "west": { "texture": "#3", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "up": { "texture": "#3", "uv": [ 7.0, 6.0, 9.0, 8.0 ] }, + "down": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Amplifier Core", + "from": [ 10.000000014901161, 4.0, 3.0 ], + "to": [ 11.000000014901161, 5.0, 4.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "east": { "texture": "#2", "uv": [ 10.0, 1.0, 11.0, 2.0 ] }, + "south": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "west": { "texture": "#2", "uv": [ 3.0, 5.0, 4.0, 6.0 ] }, + "up": { "texture": "#2", "uv": [ 11.0, 1.0, 10.0, 2.0 ] }, + "down": { "texture": "#2", "uv": [ 13.0, 10.0, 14.0, 11.0 ] } + } + }, + { + "name": "Retriever Back", + "from": [ 7.0, 2.0, 8.0 ], + "to": [ 9.0, 4.0, 9.0 ], + "rotation": { "origin": [ 8.0, 3.0, 7.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#5", "uv": [ 12.0, 4.0, 14.0, 6.0 ] }, + "east": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 10.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 13.0, 3.0, 15.0 ] }, + "west": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 9.0 ] }, + "up": { "texture": "#5", "uv": [ 3.0, 15.0, 5.0, 16.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 15.0, 9.0, 16.0 ] } + } + }, + { + "name": "Accelerator", + "from": [ 6.499999992549419, 5.0, 10.300000004470348 ], + "to": [ 9.49999999254942, 6.0, 15.300000004470348 ], + "faces": { + "north": { "texture": "#5", "uv": [ 7.0, 1.0, 10.0, 2.0 ] }, + "south": { "texture": "#5", "uv": [ 6.0, 3.0, 9.0, 4.0 ] }, + "up": { "texture": "#5", "uv": [ 6.0, 10.0, 9.0, 15.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 0.0, 10.0, 5.0 ] } + } + }, + { + "name": "Accelerator Core", + "from": [ 6.499999992549419, 5.0, 10.300000004470348 ], + "to": [ 9.49999999254942, 6.0, 15.300000004470348 ], + "faces": { + "east": { "texture": "#2", "uv": [ 4.0, 2.0, 9.0, 3.0 ] }, + "west": { "texture": "#2", "uv": [ 7.0, 2.0, 12.0, 3.0 ] } + } + }, + { + "name": "Accelerator Connector", + "from": [ 6.4000000059604645, 7.300000004470348, 10.300000004470348 ], + "to": [ 9.600000008940697, 8.699999995529652, 11.699999995529652 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 13.0, 1.0, 15.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 4.0, 2.0, 5.399999991059303, 3.3999999910593033 ] }, + "south": { "texture": "#0", "uv": [ 1.0, 6.0, 4.200000002980232, 7.399999991059303 ] }, + "west": { "texture": "#0", "uv": [ 4.0, 2.0, 5.399999991059303, 3.3999999910593033 ] }, + "up": { "texture": "#0", "uv": [ 5.0, 6.0, 8.200000002980232, 7.399999991059303 ] }, + "down": { "texture": "#0", "uv": [ 4.0, 4.0, 7.200000002980232, 5.399999991059303 ] } + } + }, + { + "name": "Accelerator Back Cap", + "from": [ 7.100000001490116, 4.3000000193715096, 15.0 ], + "to": [ 8.699999995529652, 5.900000013411045, 15.399999991059303 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#5", "uv": [ 12.0, 4.0, 13.0, 6.4000000059604645 ] }, + "south": { "texture": "#5", "uv": [ 11.0, 5.0, 13.0, 7.0 ] }, + "west": { "texture": "#5", "uv": [ 6.0, 2.0, 7.0, 4.4000000059604645 ] }, + "up": { "texture": "#5", "uv": [ 7.0, 6.0, 9.400000005960464, 7.0 ] }, + "down": { "texture": "#5", "uv": [ 9.0, 0.0, 11.400000005960464, 1.0 ] } + } + }, + { + "name": "Amplifier Connector 2", + "from": [ 7.800000011920929, 7.0, 8.0 ], + "to": [ 9.800000011920929, 8.0, 9.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, + "east": { "texture": "#0", "uv": [ 6.0, 3.0, 7.0, 4.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 2.0, 1.0 ] }, + "west": { "texture": "#0", "uv": [ 10.0, 2.0, 13.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 7.0, 6.0, 9.0, 7.0 ] }, + "down": { "texture": "#0", "uv": [ 10.0, 3.0, 12.0, 4.0 ] } + } + }, + { + "name": "Amplifier 2", + "from": [ 5.000000014901161, 3.0, 4.0 ], + "to": [ 6.000000014901161, 4.0, 10.0 ], + "rotation": { "origin": [ 5.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 1.0, 2.0, 2.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 10.0, 0.0, 16.0, 1.0 ] }, + "south": { "texture": "#5", "uv": [ 7.0, 7.0, 8.0, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 0.0, 1.0, 6.0, 2.0 ] }, + "up": { "texture": "#5", "uv": [ 2.0, 0.0, 1.0, 6.0 ] }, + "down": { "texture": "#5", "uv": [ 13.0, 10.0, 14.0, 16.0 ] } + } + }, + { + "name": "Amplifier Core 2", + "from": [ 5.000000014901161, 3.0, 3.0 ], + "to": [ 6.000000014901161, 4.0, 4.0 ], + "rotation": { "origin": [ 5.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "east": { "texture": "#2", "uv": [ 10.0, 1.0, 11.0, 2.0 ] }, + "south": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "west": { "texture": "#2", "uv": [ 3.0, 5.0, 4.0, 6.0 ] }, + "up": { "texture": "#2", "uv": [ 11.0, 1.0, 10.0, 2.0 ] }, + "down": { "texture": "#2", "uv": [ 13.0, 10.0, 14.0, 11.0 ] } + } + }, + { + "name": "Amplifier Glow 2", + "from": [ 4.800000000000001, 2.7999999970197678, 2.7999999970197678 ], + "to": [ 6.200000005960465, 4.200000002980232, 4.200000002980232 ], + "rotation": { "origin": [ 5.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "south": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "west": { "texture": "#3", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "up": { "texture": "#3", "uv": [ 7.0, 6.0, 9.0, 8.0 ] }, + "down": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + }, + { + "name": "Retriever Front", + "from": [ 6.0, 2.0, 7.0 ], + "to": [ 10.0, 3.0, 8.0 ], + "rotation": { "origin": [ 8.0, 3.0, 7.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#6", "uv": [ 2.0, 14.0, 6.0, 15.0 ] }, + "east": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 9.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 13.0, 5.0, 14.0 ] }, + "west": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 8.0 ] }, + "up": { "texture": "#5", "uv": [ 3.0, 15.0, 7.0, 16.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 15.0, 11.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_retriever.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_retriever.json new file mode 100644 index 000000000..dd1521d1f --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_retriever.json @@ -0,0 +1,43 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/purpur_pillar", + "6": "block/green_concrete_powder" + }, + "elements": [ + { + "name": "Retriever Back", + "from": [ 7.0, 2.0, 8.0 ], + "to": [ 9.0, 4.0, 9.0 ], + "rotation": { "origin": [ 8.0, 3.0, 7.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#5", "uv": [ 12.0, 4.0, 14.0, 6.0 ] }, + "east": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 10.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 13.0, 3.0, 15.0 ] }, + "west": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 9.0 ] }, + "up": { "texture": "#5", "uv": [ 3.0, 15.0, 5.0, 16.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 15.0, 9.0, 16.0 ] } + } + }, + { + "name": "Retriever Front", + "from": [ 6.0, 2.0, 7.0 ], + "to": [ 10.0, 3.0, 8.0 ], + "rotation": { "origin": [ 8.0, 3.0, 7.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#6", "uv": [ 2.0, 14.0, 6.0, 15.0 ] }, + "east": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 9.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 13.0, 5.0, 14.0 ] }, + "west": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 8.0 ] }, + "up": { "texture": "#5", "uv": [ 3.0, 15.0, 7.0, 16.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 15.0, 11.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/chorus_scope.json b/src/main/resources/assets/create/models/item/placement_handgun/chorus_scope.json new file mode 100644 index 000000000..0e8ca3f12 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/chorus_scope.json @@ -0,0 +1,56 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/purpur_pillar", + "6": "block/obsidian" + }, + "elements": [ + { + "name": "Scope", + "from": [ 7.500000007450581, 6.0, 6.0 ], + "to": [ 8.50000000745058, 7.0, 12.0 ], + "faces": { + "north": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 8.0 ] }, + "east": { "texture": "#5", "uv": [ 8.0, 15.0, 14.0, 16.0 ] }, + "south": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 9.0 ] }, + "west": { "texture": "#5", "uv": [ 6.0, 15.0, 12.0, 16.0 ] }, + "up": { "texture": "#5", "uv": [ 15.0, 5.0, 16.0, 11.0 ] }, + "down": { "texture": "#5", "uv": [ 15.0, 4.0, 16.0, 10.0 ] } + } + }, + { + "name": "Scope Back", + "from": [ 7.200000002980232, 7.0, 10.0 ], + "to": [ 8.800000011920929, 9.0, 12.0 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 13.0, 1.0, 15.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 4.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 6.0, 2.6000000089406967, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 4.0 ] }, + "up": { "texture": "#5", "uv": [ 5.0, 6.0, 6.600000008940697, 8.0 ] }, + "down": { "texture": "#5", "uv": [ 4.0, 4.0, 5.600000008940697, 6.0 ] } + } + }, + { + "name": "ScopeTop", + "from": [ 7.0, 7.0, 9.0 ], + "to": [ 9.0, 9.0, 13.0 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#6", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#5", "uv": [ 6.0, 3.0, 10.0, 5.0 ] }, + "south": { "texture": "#6", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "west": { "texture": "#5", "uv": [ 10.0, 2.0, 14.0, 4.0 ] }, + "up": { "texture": "#5", "uv": [ 15.0, 11.0, 13.0, 15.0 ] }, + "down": { "texture": "#5", "uv": [ 10.0, 3.0, 12.0, 7.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/core.json b/src/main/resources/assets/create/models/item/placement_handgun/core.json new file mode 100644 index 000000000..6c1bf80ac --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/core.json @@ -0,0 +1,38 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/white_concrete_powder", + "1": "block/white_stained_glass" + }, + "elements": [ + { + "name": "Rod Front", + "from": [ 7.300000004470348, 4.3000000193715096, 0.5000000074505806 ], + "to": [ 8.699999995529652, 5.700000010430813, 8.50000000745058 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 1.3999999910593033, 1.3999999910593033 ] }, + "east": { "texture": "#0", "uv": [ 4.0, 4.0, 12.0, 5.399999991059303 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 1.3999999910593033, 1.3999999910593033 ] }, + "west": { "texture": "#0", "uv": [ 1.0, 0.0, 9.0, 1.3999999910593033 ] }, + "up": { "texture": "#0", "uv": [ 0.0, 0.0, 1.3999999910593033, 8.0 ] }, + "down": { "texture": "#0", "uv": [ 0.0, 0.0, 1.3999999910593033, 8.0 ] } + } + }, + { + "name": "Rod Glow", + "from": [ 6.899999998509884, 3.900000013411045, 0.0 ], + "to": [ 9.100000001490116, 6.100000016391277, 7.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.2000000029802322, 2.2000000029802322 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 7.0, 2.2000000029802322 ] }, + "south": { "texture": "#1", "uv": [ 0.0, 0.0, 2.2000000029802322, 2.2000000029802322 ] }, + "west": { "texture": "#1", "uv": [ 0.0, 0.0, 7.0, 2.2000000029802322 ] }, + "up": { "texture": "#1", "uv": [ 0.0, 0.0, 2.2000000029802322, 7.0 ] }, + "down": { "texture": "#1", "uv": [ 0.0, 0.0, 2.2000000029802322, 7.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/gold_accelerator.json b/src/main/resources/assets/create/models/item/placement_handgun/gold_accelerator.json new file mode 100644 index 000000000..f02eb108c --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/gold_accelerator.json @@ -0,0 +1,53 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/gold_block" + }, + "elements": [ + { + "name": "Accelerator", + "from": [ 6.499999992549419, 5.0, 10.300000004470348 ], + "to": [ 9.49999999254942, 6.0, 15.300000004470348 ], + "faces": { + "north": { "texture": "#5", "uv": [ 7.0, 1.0, 10.0, 2.0 ] }, + "south": { "texture": "#5", "uv": [ 6.0, 3.0, 9.0, 4.0 ] }, + "up": { "texture": "#5", "uv": [ 6.0, 10.0, 9.0, 15.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 0.0, 10.0, 5.0 ] } + } + }, + { + "name": "Accelerator Connector", + "from": [ 6.4000000059604645, 7.300000004470348, 10.300000004470348 ], + "to": [ 9.600000008940697, 8.699999995529652, 11.699999995529652 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 13.0, 1.0, 15.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 4.0, 2.0, 5.399999991059303, 3.3999999910593033 ] }, + "south": { "texture": "#0", "uv": [ 1.0, 6.0, 4.200000002980232, 7.399999991059303 ] }, + "west": { "texture": "#0", "uv": [ 4.0, 2.0, 5.399999991059303, 3.3999999910593033 ] }, + "up": { "texture": "#0", "uv": [ 5.0, 6.0, 8.200000002980232, 7.399999991059303 ] }, + "down": { "texture": "#0", "uv": [ 4.0, 4.0, 7.200000002980232, 5.399999991059303 ] } + } + }, + { + "name": "Accelerator Back Cap", + "from": [ 7.100000001490116, 4.3000000193715096, 15.0 ], + "to": [ 8.699999995529652, 5.900000013411045, 15.399999991059303 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#5", "uv": [ 12.0, 4.0, 13.0, 6.4000000059604645 ] }, + "south": { "texture": "#5", "uv": [ 11.0, 5.0, 13.0, 7.0 ] }, + "west": { "texture": "#5", "uv": [ 6.0, 2.0, 7.0, 4.4000000059604645 ] }, + "up": { "texture": "#5", "uv": [ 7.0, 6.0, 9.400000005960464, 7.0 ] }, + "down": { "texture": "#5", "uv": [ 9.0, 0.0, 11.400000005960464, 1.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/gold_accelerator_core.json b/src/main/resources/assets/create/models/item/placement_handgun/gold_accelerator_core.json new file mode 100644 index 000000000..272cfe757 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/gold_accelerator_core.json @@ -0,0 +1,23 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/gold_block" + }, + "elements": [ + { + "name": "Accelerator Core", + "from": [ 6.499999992549419, 5.0, 10.300000004470348 ], + "to": [ 9.49999999254942, 6.0, 15.300000004470348 ], + "faces": { + "east": { "texture": "#2", "uv": [ 4.0, 2.0, 9.0, 3.0 ] }, + "west": { "texture": "#2", "uv": [ 7.0, 2.0, 12.0, 3.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/gold_amplifier.json b/src/main/resources/assets/create/models/item/placement_handgun/gold_amplifier.json new file mode 100644 index 000000000..872ad8fed --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/gold_amplifier.json @@ -0,0 +1,42 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/gold_block" + }, + "elements": [ + { + "name": "Amplifier", + "from": [ 10.000000014901161, 4.0, 4.0 ], + "to": [ 11.000000014901161, 5.0, 10.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 1.0, 2.0, 2.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 10.0, 0.0, 16.0, 1.0 ] }, + "south": { "texture": "#5", "uv": [ 7.0, 7.0, 8.0, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 0.0, 1.0, 6.0, 2.0 ] }, + "up": { "texture": "#5", "uv": [ 2.0, 0.0, 1.0, 6.0 ] }, + "down": { "texture": "#5", "uv": [ 13.0, 10.0, 14.0, 16.0 ] } + } + }, + { + "name": "Amplifier Connector", + "from": [ 9.800000011920929, 5.0, 8.0 ], + "to": [ 10.800000011920929, 8.0, 9.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "east": { "texture": "#0", "uv": [ 6.0, 3.0, 7.0, 6.0 ] }, + "south": { "texture": "#0", "uv": [ 0.0, 0.0, 1.0, 3.0 ] }, + "west": { "texture": "#0", "uv": [ 10.0, 2.0, 14.0, 3.0 ] }, + "up": { "texture": "#0", "uv": [ 15.0, 11.0, 14.0, 15.0 ] }, + "down": { "texture": "#0", "uv": [ 10.0, 3.0, 11.0, 4.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/gold_amplifier_core.json b/src/main/resources/assets/create/models/item/placement_handgun/gold_amplifier_core.json new file mode 100644 index 000000000..247e24a87 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/gold_amplifier_core.json @@ -0,0 +1,42 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/gold_block" + }, + "elements": [ + { + "name": "Amplifier Core", + "from": [ 10.000000014901161, 4.0, 3.0 ], + "to": [ 11.000000014901161, 5.0, 4.0 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "east": { "texture": "#2", "uv": [ 10.0, 1.0, 11.0, 2.0 ] }, + "south": { "texture": "#2", "uv": [ 9.0, 8.0, 10.0, 9.0 ] }, + "west": { "texture": "#2", "uv": [ 3.0, 5.0, 4.0, 6.0 ] }, + "up": { "texture": "#2", "uv": [ 11.0, 1.0, 10.0, 2.0 ] }, + "down": { "texture": "#2", "uv": [ 13.0, 10.0, 14.0, 11.0 ] } + } + }, + { + "name": "Amplifier Glow", + "from": [ 9.8, 3.7999999970197678, 2.7999999970197678 ], + "to": [ 11.200000005960465, 5.200000002980232, 4.200000002980232 ], + "rotation": { "origin": [ 11.0, 4.0, 8.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "east": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "south": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] }, + "west": { "texture": "#3", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "up": { "texture": "#3", "uv": [ 7.0, 6.0, 9.0, 8.0 ] }, + "down": { "texture": "#3", "uv": [ 7.0, 7.0, 9.0, 9.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/gold_body.json b/src/main/resources/assets/create/models/item/placement_handgun/gold_body.json new file mode 100644 index 000000000..b6e6b0559 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/gold_body.json @@ -0,0 +1,28 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "ambientocclusion": true, + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/magma", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian" + }, + "elements": [ + { + "name": "Rod Back", + "from": [ 7.0, 4.000000014901161, 7.0 ], + "to": [ 9.0, 6.000000014901161, 14.0 ], + "rotation": { "origin": [ 8.0, 5.0, 8.0 ], "axis": "z", "angle": -45.0 }, + "faces": { + "north": { "texture": "#1", "uv": [ 0.0, 0.0, 2.0, 2.0 ] }, + "east": { "texture": "#1", "uv": [ 0.0, 0.0, 7.0, 2.0 ] }, + "south": { "texture": "#1", "uv": [ 6.0, 7.0, 8.0, 9.0 ] }, + "west": { "texture": "#1", "uv": [ 4.0, 3.0, 11.0, 5.0 ] }, + "up": { "texture": "#1", "uv": [ 6.0, 5.0, 8.0, 12.0 ] }, + "down": { "texture": "#1", "uv": [ 8.0, 6.0, 10.0, 13.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/gold_retriever.json b/src/main/resources/assets/create/models/item/placement_handgun/gold_retriever.json new file mode 100644 index 000000000..eafe1f4ea --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/gold_retriever.json @@ -0,0 +1,29 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "0": "block/anvil", + "1": "block/gray_concrete_powder", + "2": "block/white_concrete_powder", + "3": "block/white_stained_glass", + "4": "block/obsidian", + "5": "block/gold_block", + "6": "block/redstone_block" + }, + "elements": [ + { + "name": "Retriever Back", + "from": [ 7.0, 2.0, 8.0 ], + "to": [ 9.0, 4.0, 9.0 ], + "rotation": { "origin": [ 8.0, 3.0, 7.0 ], "axis": "x", "angle": -22.5 }, + "faces": { + "north": { "texture": "#6", "uv": [ 12.0, 4.0, 14.0, 6.0 ] }, + "east": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 10.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 13.0, 3.0, 15.0 ] }, + "west": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 9.0 ] }, + "up": { "texture": "#5", "uv": [ 3.0, 15.0, 5.0, 16.0 ] }, + "down": { "texture": "#5", "uv": [ 7.0, 15.0, 9.0, 16.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/placement_handgun/gold_scope.json b/src/main/resources/assets/create/models/item/placement_handgun/gold_scope.json new file mode 100644 index 000000000..e6fc27ea0 --- /dev/null +++ b/src/main/resources/assets/create/models/item/placement_handgun/gold_scope.json @@ -0,0 +1,50 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "parent": "create:item/placement_handgun", + "textures": { + "3": "block/white_concrete", + "5": "block/gold_block" + }, + "elements": [ + { + "name": "Scope", + "from": [ 7.500000007450581, 6.0, 6.0 ], + "to": [ 8.50000000745058, 7.0, 12.0 ], + "faces": { + "north": { "texture": "#5", "uv": [ 15.0, 7.0, 16.0, 8.0 ] }, + "east": { "texture": "#5", "uv": [ 8.0, 15.0, 14.0, 16.0 ] }, + "south": { "texture": "#5", "uv": [ 15.0, 8.0, 16.0, 9.0 ] }, + "west": { "texture": "#5", "uv": [ 6.0, 15.0, 12.0, 16.0 ] }, + "up": { "texture": "#5", "uv": [ 15.0, 5.0, 16.0, 11.0 ] }, + "down": { "texture": "#5", "uv": [ 15.0, 4.0, 16.0, 10.0 ] } + } + }, + { + "name": "Scope Back", + "from": [ 7.200000002980232, 7.0, 10.0 ], + "to": [ 8.800000011920929, 9.0, 12.0 ], + "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#5", "uv": [ 13.0, 1.0, 15.0, 3.0 ] }, + "east": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 4.0 ] }, + "south": { "texture": "#5", "uv": [ 1.0, 6.0, 2.6000000089406967, 8.0 ] }, + "west": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 4.0 ] }, + "up": { "texture": "#5", "uv": [ 5.0, 6.0, 6.600000008940697, 8.0 ] }, + "down": { "texture": "#5", "uv": [ 4.0, 4.0, 5.600000008940697, 6.0 ] } + } + }, + { + "name": "ScopeTop", + "from": [ 7.500000007450581, 7.0, 9.0 ], + "to": [ 8.50000000745058, 8.0, 13.0 ], + "faces": { + "north": { "texture": "#3", "uv": [ 0.0, 0.0, 1.0, 1.0 ] }, + "east": { "texture": "#5", "uv": [ 6.0, 3.0, 10.0, 4.0 ] }, + "south": { "texture": "#3", "uv": [ 0.0, 0.0, 1.0, 1.0 ] }, + "west": { "texture": "#5", "uv": [ 10.0, 2.0, 14.0, 3.0 ] }, + "up": { "texture": "#5", "uv": [ 15.0, 11.0, 14.0, 15.0 ] }, + "down": { "texture": "#5", "uv": [ 10.0, 3.0, 11.0, 7.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/symmetry_wand.json b/src/main/resources/assets/create/models/item/symmetry_wand.json index d70df1b4d..ae65a49f4 100644 --- a/src/main/resources/assets/create/models/item/symmetry_wand.json +++ b/src/main/resources/assets/create/models/item/symmetry_wand.json @@ -1,6 +1,6 @@ { "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", -"ambientocclusion": true, + "ambientocclusion": true, "display": { "firstperson_righthand": { "rotation": [ 15, 0, 0 ], @@ -13,8 +13,8 @@ "scale":[ 0.5, 0.5, 0.5 ] }, "gui": { - "rotation": [ 40, 135, 32 ], - "translation": [ -1.2, -1, 3], + "rotation": [ 42, 135, 32 ], + "translation": [ -1.7, -1.7, 3], "scale":[ 0.8, 0.8, 0.8 ] }, "ground": { @@ -24,23 +24,23 @@ }, "fixed": { "rotation": [ 0, 90, 0 ], - "translation": [ -2, -1, 0 ], + "translation": [ 0, -5, 0 ], "scale": [ 1, 1, 1 ] } }, "textures": { "0": "block/obsidian", - "1": "block/light_blue_concrete_powder", + "1": "block/packed_ice", "2": "block/dark_oak_log", "3": "block/white_stained_glass", "4": "block/light_blue_stained_glass", - "5": "block/white_concrete" + "5": "block/white_concrete_powder" }, "elements": [ { "name": "Grip Core", - "from": [ 6.500000007450581, -5.0, 6.500000007450581 ], - "to": [ 9.50000000745058, 6.0, 9.50000000745058 ], + "from": [ 6.5, -5.0, 6.5 ], + "to": [ 9.5, 6.0, 9.5 ], "faces": { "north": { "texture": "#0", "uv": [ 5.0, 1.0, 8.0, 12.0 ] }, "east": { "texture": "#0", "uv": [ 2.0, 3.0, 5.0, 14.0 ] }, @@ -52,8 +52,8 @@ }, { "name": "Rod Bottom Core", - "from": [ 6.500000007450581, 8.000000014901161, 6.500000007450581 ], - "to": [ 9.50000000745058, 17.00000001490116, 9.50000000745058 ], + "from": [ 6.5, 8.0, 6.5 ], + "to": [ 9.5, 17.0, 9.5 ], "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, "faces": { "north": { "texture": "#1", "uv": [ 5.0, 7.0, 8.0, 16.0 ] }, @@ -66,8 +66,8 @@ }, { "name": "Grip Cap", - "from": [ 5.999999985098839, 6.0, 6.0 ], - "to": [ 9.999999985098839, 7.0, 10.0 ], + "from": [ 6.0, 6.0, 6.0 ], + "to": [ 10.0, 7.0, 10.0 ], "faces": { "north": { "texture": "#2", "uv": [ 2.0, 0.0, 6.0, 1.0 ] }, "east": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 1.0 ] }, @@ -77,23 +77,10 @@ "down": { "texture": "#2", "uv": [ 5.0, 3.0, 9.0, 7.0 ] } } }, - { - "name": "Rod Core", - "from": [ 7.0, 18.00000001490116, 7.0 ], - "to": [ 9.0, 26.00000001490116, 9.0 ], - "faces": { - "north": { "texture": "#5", "uv": [ 2.0, 2.0, 4.0, 10.0 ] }, - "east": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 10.0 ] }, - "south": { "texture": "#5", "uv": [ 4.0, 2.0, 6.0, 10.0 ] }, - "west": { "texture": "#5", "uv": [ 8.0, 2.0, 10.0, 10.0 ] }, - "up": { "texture": "#5", "uv": [ 2.0, 2.0, 4.0, 4.0 ] }, - "down": { "texture": "#5", "uv": [ 2.0, 2.0, 4.0, 4.0 ] } - } - }, { "name": "Rod Top Core", - "from": [ 6.500000007450581, 27.00000001490116, 6.500000007450581 ], - "to": [ 9.50000000745058, 30.00000001490116, 9.50000000745058 ], + "from": [ 6.5, 27.0, 6.5 ], + "to": [ 9.5, 30.0, 9.5 ], "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "y", "angle": 45.0 }, "faces": { "north": { "texture": "#1", "uv": [ 1.0, 4.0, 4.0, 7.0 ] }, @@ -106,8 +93,8 @@ }, { "name": "Cap", - "from": [ 5.999999985098839, 31.0, 6.0 ], - "to": [ 9.999999985098839, 32.0, 10.0 ], + "from": [ 6.0, 30.0, 6.0 ], + "to": [ 10.0, 31.0, 10.0 ], "faces": { "north": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 1.0 ] }, "east": { "texture": "#2", "uv": [ 0.0, 0.0, 4.0, 1.0 ] }, @@ -128,64 +115,10 @@ "west": { "texture": "#2", "uv": [ 7.0, 7.0, 10.400000005960464, 8.0 ] } } }, - { - "name": "Rod Bottom Cap", - "from": [ 6.000000014901161, 16.0, 6.000000014901161 ], - "to": [ 10.000000014901161, 18.0, 10.000000014901161 ], - "rotation": { "origin": [ 8.0, 6.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] }, - "east": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] }, - "south": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] }, - "west": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] } - } - }, - { - "name": "Rod Top Cap", - "from": [ 6.000000014901161, 26.0, 6.000000014901161 ], - "to": [ 10.000000014901161, 28.0, 10.000000014901161 ], - "rotation": { "origin": [ 8.0, 6.0, 8.0 ], "axis": "y", "angle": 45.0 }, - "faces": { - "north": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] }, - "east": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] }, - "south": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] }, - "west": { "texture": "#4", "uv": [ 2.0, 2.0, 6.0, 4.0 ] } - } - }, - { - "name": "Square North", - "from": [ 7.499999992549419, 21.0, 3.0 ], - "to": [ 8.49999999254942, 23.0, 5.0 ], - "shade": false, - "rotation": { "origin": [ 9.0, 22.0, 5.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "east": { "texture": "#3", "uv": [ 6.0, 6.0, 8.0, 8.0 ] }, - "south": { "texture": "#3", "uv": [ 8.0, 6.0, 9.0, 8.0 ] }, - "west": { "texture": "#3", "uv": [ 11.0, 9.0, 13.0, 11.0 ] }, - "up": { "texture": "#3", "uv": [ 9.0, 5.0, 6.0, 8.0 ] }, - "down": { "texture": "#3", "uv": [ 5.0, 7.0, 6.0, 9.0 ] } - } - }, - { - "name": "Square South", - "from": [ 7.499999992549419, 22.0, 10.0 ], - "to": [ 8.49999999254942, 24.0, 12.0 ], - "shade": false, - "rotation": { "origin": [ 13.0, 22.0, 11.0 ], "axis": "x", "angle": 45.0 }, - "faces": { - "north": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "east": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 4.0 ] }, - "south": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "west": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 4.0 ] }, - "up": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "down": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] } - } - }, { "name": "Rod Bottom Deco 1", - "from": [ 7.499999992549419, 9.0, 5.500000007450581 ], - "to": [ 8.49999999254942, 10.0, 10.50000000745058 ], + "from": [ 7.5, 9.0, 5.5 ], + "to": [ 8.5, 10.0, 10.5 ], "faces": { "north": { "texture": "#2", "uv": [ 0.0, 0.0, 1.0, 1.0 ] }, "east": { "texture": "#2", "uv": [ 0.0, 0.0, 5.0, 1.0 ] }, @@ -197,8 +130,8 @@ }, { "name": "Rod Bottom Deco 2", - "from": [ 5.499999992549419, 9.0, 7.500000007450581 ], - "to": [ 10.49999999254942, 10.0, 8.50000000745058 ], + "from": [ 5.5, 9.0, 7.5 ], + "to": [ 10.5, 10.0, 8.5 ], "faces": { "north": { "texture": "#2", "uv": [ 0.0, 0.0, 5.0, 1.0 ] }, "east": { "texture": "#2", "uv": [ 0.0, 0.0, 1.0, 1.0 ] }, @@ -208,36 +141,6 @@ "down": { "texture": "#2", "uv": [ 0.0, 0.0, 5.0, 1.0 ] } } }, - { - "name": "Square West", - "from": [ 11.49999999254942, 22.49999999254942, 7.499999992549419 ], - "to": [ 13.49999999254942, 24.49999999254942, 8.49999999254942 ], - "shade": false, - "rotation": { "origin": [ 13.0, 22.0, 11.0 ], "axis": "z", "angle": 45.0 }, - "faces": { - "north": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 4.0 ] }, - "east": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "south": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 4.0 ] }, - "west": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "up": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 3.0 ] }, - "down": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 3.0 ] } - } - }, - { - "name": "Square East", - "from": [ 6.499999992549419, 27.49999999254942, 7.499999992549419 ], - "to": [ 8.49999999254942, 29.49999999254942, 8.49999999254942 ], - "shade": false, - "rotation": { "origin": [ 13.0, 22.0, 11.0 ], "axis": "z", "angle": 45.0 }, - "faces": { - "north": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 4.0 ] }, - "east": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "south": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 4.0 ] }, - "west": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 4.0 ] }, - "up": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 3.0 ] }, - "down": { "texture": "#3", "uv": [ 2.0, 2.0, 4.0, 3.0 ] } - } - }, { "name": "Cube", "from": [ 6.3000000193715096, -4.0, 6.3000000193715096 ], diff --git a/src/main/resources/assets/create/models/item/symmetry_wand_bits.json b/src/main/resources/assets/create/models/item/symmetry_wand_bits.json new file mode 100644 index 000000000..cff5cc677 --- /dev/null +++ b/src/main/resources/assets/create/models/item/symmetry_wand_bits.json @@ -0,0 +1,75 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "ambientocclusion": false, + "parent": "create:item/symmetry_wand", + "textures": { + "0": "block/obsidian", + "1": "block/light_blue_concrete_powder", + "2": "block/dark_oak_log", + "3": "block/white_stained_glass", + "4": "block/light_blue_stained_glass", + "5": "block/white_concrete_powder" + }, + "elements": [ + { + "name": "Square North", + "from": [ 7.5, 24.0, 4.0 ], + "to": [ 8.5, 25.0, 5.0 ], + "shade": false, + "rotation": { "origin": [ 9.0, 24.0, 5.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "east": { "texture": "#3", "uv": [ 6.0, 6.0, 7.0, 7.0 ] }, + "south": { "texture": "#3", "uv": [ 8.0, 6.0, 9.0, 7.0 ] }, + "west": { "texture": "#3", "uv": [ 11.0, 9.0, 12.0, 10.0 ] }, + "up": { "texture": "#3", "uv": [ 9.0, 5.0, 10.0, 6.0 ] }, + "down": { "texture": "#3", "uv": [ 5.0, 7.0, 6.0, 8.0 ] } + } + }, + { + "name": "Square South", + "from": [ 7.5, 24.0, 10.0 ], + "to": [ 8.5, 25.0, 11.0 ], + "shade": false, + "rotation": { "origin": [ 13.0, 24.0, 11.0 ], "axis": "x", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "east": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "south": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "west": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "up": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "down": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] } + } + }, + { + "name": "Square West", + "from": [ 11.5, 25.5, 7.5 ], + "to": [ 12.5, 26.5, 8.5 ], + "shade": false, + "rotation": { "origin": [ 13.0, 24.0, 11.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "east": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "south": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "west": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "up": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "down": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] } + } + }, + { + "name": "Square East", + "from": [ 7.5, 29.5, 7.5 ], + "to": [ 8.5, 30.5, 8.5 ], + "shade": false, + "rotation": { "origin": [ 13.0, 24.0, 11.0 ], "axis": "z", "angle": 45.0 }, + "faces": { + "north": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "east": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "south": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "west": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "up": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] }, + "down": { "texture": "#3", "uv": [ 2.0, 2.0, 3.0, 3.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/symmetry_wand_core.json b/src/main/resources/assets/create/models/item/symmetry_wand_core.json new file mode 100644 index 000000000..7d14a3b7c --- /dev/null +++ b/src/main/resources/assets/create/models/item/symmetry_wand_core.json @@ -0,0 +1,41 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "ambientocclusion": false, + "parent": "create:item/symmetry_wand", + "textures": { + "0": "block/obsidian", + "1": "block/light_blue_concrete_powder", + "2": "block/dark_oak_log", + "3": "block/white_stained_glass", + "4": "block/light_blue_stained_glass", + "5": "block/white_concrete_powder" + }, + "elements": [ + { + "name": "Rod Core", + "from": [ 7.0, 18.0, 7.0 ], + "to": [ 9.0, 26.0, 9.0 ], + "faces": { + "north": { "texture": "#5", "uv": [ 10.0, 3.0, 12.0, 11.0 ] }, + "east": { "texture": "#5", "uv": [ 13.0, 6.0, 15.0, 14.0 ] }, + "south": { "texture": "#5", "uv": [ 11.0, 6.0, 13.0, 14.0 ] }, + "west": { "texture": "#5", "uv": [ 11.0, 4.0, 13.0, 12.0 ] }, + "up": { "texture": "#5", "uv": [ 14.0, 0.0, 16.0, 2.0 ] }, + "down": { "texture": "#5", "uv": [ 14.0, 6.0, 16.0, 8.0 ] } + } + }, + { + "name": "Cube", + "from": [ 6.5, 17.5, 6.5 ], + "to": [ 9.5, 26.5, 9.5 ], + "faces": { + "north": { "texture": "#3", "uv": [ 10.0, 5.0, 13.0, 13.0 ] }, + "east": { "texture": "#3", "uv": [ 5.0, 3.0, 8.0, 12.0 ] }, + "south": { "texture": "#3", "uv": [ 7.0, 6.0, 10.0, 14.0 ] }, + "west": { "texture": "#3", "uv": [ 7.0, 4.0, 4.0, 12.0 ] }, + "up": { "texture": "#3", "uv": [ 7.0, 5.0, 10.0, 8.0 ] }, + "down": { "texture": "#3", "uv": [ 9.0, 3.0, 12.0, 6.0 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index d2275b6d0..79d3f9368 100644 Binary files a/src/main/resources/assets/create/textures/gui/icons.png and b/src/main/resources/assets/create/textures/gui/icons.png differ diff --git a/src/main/resources/assets/create/textures/gui/placement_handgun.pdn b/src/main/resources/assets/create/textures/gui/placement_handgun.pdn new file mode 100644 index 000000000..2bd2649d5 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/placement_handgun.pdn differ diff --git a/src/main/resources/assets/create/textures/gui/placement_handgun.png b/src/main/resources/assets/create/textures/gui/placement_handgun.png new file mode 100644 index 000000000..c0086de79 Binary files /dev/null and b/src/main/resources/assets/create/textures/gui/placement_handgun.png differ diff --git a/src/main/resources/assets/create/textures/item/andesite_alloy_cube.png b/src/main/resources/assets/create/textures/item/andesite_alloy_cube.png new file mode 100644 index 000000000..b26d79fab Binary files /dev/null and b/src/main/resources/assets/create/textures/item/andesite_alloy_cube.png differ diff --git a/src/main/resources/assets/create/textures/item/blaze_brass_cube.png b/src/main/resources/assets/create/textures/item/blaze_brass_cube.png new file mode 100644 index 000000000..698ea9b39 Binary files /dev/null and b/src/main/resources/assets/create/textures/item/blaze_brass_cube.png differ diff --git a/src/main/resources/assets/create/textures/item/chorus_chrome_cube.png b/src/main/resources/assets/create/textures/item/chorus_chrome_cube.png new file mode 100644 index 000000000..efa11981f Binary files /dev/null and b/src/main/resources/assets/create/textures/item/chorus_chrome_cube.png differ diff --git a/src/main/resources/data/create/recipes/andesite_alloy_cube.json b/src/main/resources/data/create/recipes/andesite_alloy_cube.json new file mode 100644 index 000000000..5bb96cfba --- /dev/null +++ b/src/main/resources/data/create/recipes/andesite_alloy_cube.json @@ -0,0 +1,19 @@ +{ + "type": "crafting_shaped", + "pattern": [ + "SW", + "WS" + ], + "key": { + "W": { + "item": "minecraft:andesite" + }, + "S": { + "item": "minecraft:iron_nugget" + } + }, + "result": { + "item": "create:andesite_alloy_cube", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/blaze_brass_cube.json b/src/main/resources/data/create/recipes/blaze_brass_cube.json new file mode 100644 index 000000000..114a8e523 --- /dev/null +++ b/src/main/resources/data/create/recipes/blaze_brass_cube.json @@ -0,0 +1,19 @@ +{ + "type": "crafting_shaped", + "pattern": [ + "SW", + "WS" + ], + "key": { + "W": { + "item": "minecraft:blaze_powder" + }, + "S": { + "item": "minecraft:gold_nugget" + } + }, + "result": { + "item": "create:blaze_brass_cube", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/chorus_chrome_cube.json b/src/main/resources/data/create/recipes/chorus_chrome_cube.json new file mode 100644 index 000000000..b2cf6c706 --- /dev/null +++ b/src/main/resources/data/create/recipes/chorus_chrome_cube.json @@ -0,0 +1,19 @@ +{ + "type": "crafting_shaped", + "pattern": [ + "SW", + "WS" + ], + "key": { + "W": { + "item": "minecraft:popped_chorus_fruit" + }, + "S": { + "item": "minecraft:dragon_breath" + } + }, + "result": { + "item": "create:chorus_chrome_cube", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun.json b/src/main/resources/data/create/recipes/placement_handgun.json new file mode 100644 index 000000000..033589349 --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun.json @@ -0,0 +1,23 @@ +{ + "type": "crafting_shaped", + "pattern": [ + " E", + " A ", + "AO " + ], + "key": { + "E": { + "item": "minecraft:end_rod" + }, + "O": { + "item": "minecraft:obsidian" + }, + "A": { + "item": "create:andesite_alloy_cube" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_accelerator.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_accelerator.json new file mode 100644 index 000000000..82d506a15 --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_accelerator.json @@ -0,0 +1,24 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "SE", + "BS" + ], + "key": { + "B": { + "item": "create:blaze_brass_cube" + }, + "S": { + "item": "minecraft:sugar" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Accelerator", + "tier": "BlazeBrass" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_amplifier.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_amplifier.json new file mode 100644 index 000000000..d0d73b505 --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_amplifier.json @@ -0,0 +1,24 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "E ", + "BR" + ], + "key": { + "B": { + "item": "create:blaze_brass_cube" + }, + "R": { + "item": "minecraft:end_rod" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Amplifier", + "tier": "BlazeBrass" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_body.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_body.json new file mode 100644 index 000000000..306f7e53c --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_body.json @@ -0,0 +1,22 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + " B ", + "BEB", + " B " + ], + "key": { + "B": { + "item": "create:blaze_brass_cube" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Body", + "tier": "BlazeBrass" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_retriever.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_retriever.json new file mode 100644 index 000000000..9f862adfe --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_retriever.json @@ -0,0 +1,24 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "E ", + "BR" + ], + "key": { + "B": { + "item": "create:blaze_brass_cube" + }, + "R": { + "item": "minecraft:redstone" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Retriever", + "tier": "BlazeBrass" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_scope.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_scope.json new file mode 100644 index 000000000..86b2f82f7 --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/gold_scope.json @@ -0,0 +1,24 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "GBG", + " E " + ], + "key": { + "B": { + "item": "create:blaze_brass_cube" + }, + "G": { + "item": "minecraft:glass" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Scope", + "tier": "BlazeBrass" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_accelerator.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_accelerator.json new file mode 100644 index 000000000..db1b49d99 --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_accelerator.json @@ -0,0 +1,24 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "SE", + "BS" + ], + "key": { + "B": { + "item": "create:chorus_chrome_cube" + }, + "S": { + "item": "minecraft:sugar" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Accelerator", + "tier": "ChorusChrome" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_amplifier.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_amplifier.json new file mode 100644 index 000000000..c8c585f20 --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_amplifier.json @@ -0,0 +1,25 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "BR", + "E ", + "BR" + ], + "key": { + "B": { + "item": "create:chorus_chrome_cube" + }, + "R": { + "item": "minecraft:end_rod" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Amplifier", + "tier": "ChorusChrome" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_body.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_body.json new file mode 100644 index 000000000..1a2fc1ccc --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_body.json @@ -0,0 +1,22 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + " B ", + "BEB", + " B " + ], + "key": { + "B": { + "item": "create:chorus_chrome_cube" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Body", + "tier": "ChorusChrome" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_retriever.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_retriever.json new file mode 100644 index 000000000..7b657d5a4 --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_retriever.json @@ -0,0 +1,24 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "E ", + "BR" + ], + "key": { + "B": { + "item": "create:chorus_chrome_cube" + }, + "R": { + "item": "minecraft:ender_pearl" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Retriever", + "tier": "ChorusChrome" +} \ No newline at end of file diff --git a/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_scope.json b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_scope.json new file mode 100644 index 000000000..a3d0ae48b --- /dev/null +++ b/src/main/resources/data/create/recipes/placement_handgun_upgrades/purpur_scope.json @@ -0,0 +1,24 @@ +{ + "type": "create:placement_handgun_upgrade", + "pattern": [ + "GBG", + " E " + ], + "key": { + "B": { + "item": "create:chorus_chrome_cube" + }, + "G": { + "item": "minecraft:glass" + }, + "E": { + "item": "create:placement_handgun" + } + }, + "result": { + "item": "create:placement_handgun", + "count": 1 + }, + "component": "Scope", + "tier": "ChorusChrome" +} \ No newline at end of file