From 05f4c936e02876a599c1ef6424ba44db4a705b13 Mon Sep 17 00:00:00 2001 From: TGdoesCode Date: Mon, 9 Feb 2026 11:29:40 +0100 Subject: [PATCH] atom --- gradle.properties | 2 +- src/blockbench_models/Atom.bbmodel | 1 + .../java/dev/tggamesyt/szar/client/Atom.java | 52 +++++++++++ .../szar/client/AtomEntityRenderer.java | 57 ++++++++++++ .../dev/tggamesyt/szar/client/SzarClient.java | 16 +++- .../java/dev/tggamesyt/szar/AtomEntity.java | 84 ++++++++++++++++++ .../dev/tggamesyt/szar/AtomSummonerItem.java | 66 ++++++++++++++ src/main/java/dev/tggamesyt/szar/Szar.java | 35 ++++++-- .../resources/assets/szar/lang/en_us.json | 5 +- .../assets/szar/models/item/detonator.json | 6 ++ .../assets/szar/textures/entity/nuke.png | Bin 0 -> 1093 bytes .../assets/szar/textures/item/detonator.png | Bin 0 -> 722 bytes 12 files changed, 311 insertions(+), 13 deletions(-) create mode 100644 src/blockbench_models/Atom.bbmodel create mode 100644 src/client/java/dev/tggamesyt/szar/client/Atom.java create mode 100644 src/client/java/dev/tggamesyt/szar/client/AtomEntityRenderer.java create mode 100644 src/main/java/dev/tggamesyt/szar/AtomEntity.java create mode 100644 src/main/java/dev/tggamesyt/szar/AtomSummonerItem.java create mode 100644 src/main/resources/assets/szar/models/item/detonator.json create mode 100644 src/main/resources/assets/szar/textures/entity/nuke.png create mode 100644 src/main/resources/assets/szar/textures/item/detonator.png diff --git a/gradle.properties b/gradle.properties index 432aab3..abeff57 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.20.1 yarn_mappings=1.20.1+build.10 loader_version=0.18.3 # Mod Properties -mod_version=26.2.8.1 +mod_version=26.2.9 maven_group=dev.tggamesyt archives_base_name=szar # Dependencies diff --git a/src/blockbench_models/Atom.bbmodel b/src/blockbench_models/Atom.bbmodel new file mode 100644 index 0000000..ec73841 --- /dev/null +++ b/src/blockbench_models/Atom.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"Atom","model_identifier":"Atom","modded_entity_entity_class":"Atom","modded_entity_version":"1.17_yarn","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,2,-2],"to":[2,4,2],"autouv":0,"color":9,"origin":[0,2,0],"uv_offset":[32,15],"faces":{"north":{"uv":[36,19,40,21],"texture":0},"east":{"uv":[32,19,36,21],"texture":0},"south":{"uv":[44,19,48,21],"texture":0},"west":{"uv":[40,19,44,21],"texture":0},"up":{"uv":[40,19,36,15],"texture":0},"down":{"uv":[44,15,40,19],"texture":0}},"type":"cube","uuid":"eb8bc620-4a12-0651-02b4-ef7ebcd631a7"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-3,4,-3],"to":[3,6,3],"autouv":0,"color":9,"origin":[0,4,0],"uv_offset":[0,30],"faces":{"north":{"uv":[6,36,12,38],"texture":0},"east":{"uv":[0,36,6,38],"texture":0},"south":{"uv":[18,36,24,38],"texture":0},"west":{"uv":[12,36,18,38],"texture":0},"up":{"uv":[12,36,6,30],"texture":0},"down":{"uv":[18,30,12,36],"texture":0}},"type":"cube","uuid":"907bf9c5-a8e9-7d26-5c54-942f14b4a557"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-4,6,-4],"to":[4,13,4],"autouv":0,"color":9,"origin":[0,6,0],"uv_offset":[0,15],"faces":{"north":{"uv":[8,23,16,30],"texture":0},"east":{"uv":[0,23,8,30],"texture":0},"south":{"uv":[24,23,32,30],"texture":0},"west":{"uv":[16,23,24,30],"texture":0},"up":{"uv":[16,23,8,15],"texture":0},"down":{"uv":[24,15,16,23],"texture":0}},"type":"cube","uuid":"3db0194b-95b0-2ea7-e8c7-fa5cf21e04ce"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,1,-1],"to":[1,2,1],"autouv":0,"color":9,"origin":[0,1,0],"uv_offset":[36,41],"faces":{"north":{"uv":[38,43,40,44],"texture":0},"east":{"uv":[36,43,38,44],"texture":0},"south":{"uv":[42,43,44,44],"texture":0},"west":{"uv":[40,43,42,44],"texture":0},"up":{"uv":[40,43,38,41],"texture":0},"down":{"uv":[42,41,40,43],"texture":0}},"type":"cube","uuid":"052bba3e-8f9f-b884-40ee-1f1442fa4f7e"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-3,13,-3],"to":[3,15,3],"autouv":0,"color":9,"origin":[0,13,0],"uv_offset":[24,30],"faces":{"north":{"uv":[30,36,36,38],"texture":0},"east":{"uv":[24,36,30,38],"texture":0},"south":{"uv":[42,36,48,38],"texture":0},"west":{"uv":[36,36,42,38],"texture":0},"up":{"uv":[36,36,30,30],"texture":0},"down":{"uv":[42,30,36,36],"texture":0}},"type":"cube","uuid":"a24c38c6-78b9-5d17-7e51-4b417058148c"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,15,-2],"to":[2,17,2],"autouv":0,"color":9,"origin":[0,15,0],"uv_offset":[32,21],"faces":{"north":{"uv":[36,25,40,27],"texture":0},"east":{"uv":[32,25,36,27],"texture":0},"south":{"uv":[44,25,48,27],"texture":0},"west":{"uv":[40,25,44,27],"texture":0},"up":{"uv":[40,25,36,21],"texture":0},"down":{"uv":[44,21,40,25],"texture":0}},"type":"cube","uuid":"e5873951-3374-575e-5967-b538037bd48c"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-1,17,-1],"to":[1,18,1],"autouv":0,"color":9,"origin":[0,17,0],"uv_offset":[42,27],"faces":{"north":{"uv":[44,29,46,30],"texture":0},"east":{"uv":[42,29,44,30],"texture":0},"south":{"uv":[48,29,50,30],"texture":0},"west":{"uv":[46,29,48,30],"texture":0},"up":{"uv":[46,29,44,27],"texture":0},"down":{"uv":[48,27,46,29],"texture":0}},"type":"cube","uuid":"30d88807-ecba-1fba-38ec-1fef73f44a24"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-3,15,-3],"to":[-2,19,-2],"autouv":0,"color":9,"origin":[-3,15,-2],"uv_offset":[0,43],"faces":{"north":{"uv":[1,44,2,48],"texture":0},"east":{"uv":[0,44,1,48],"texture":0},"south":{"uv":[3,44,4,48],"texture":0},"west":{"uv":[2,44,3,48],"texture":0},"up":{"uv":[2,44,1,43],"texture":0},"down":{"uv":[3,43,2,44],"texture":0}},"type":"cube","uuid":"b1548d66-d36f-da9a-e6ba-5f2bfb57fb68"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[2,15,-3],"to":[3,19,-2],"autouv":0,"color":9,"origin":[2,15,-2],"uv_offset":[4,43],"faces":{"north":{"uv":[5,44,6,48],"texture":0},"east":{"uv":[4,44,5,48],"texture":0},"south":{"uv":[7,44,8,48],"texture":0},"west":{"uv":[6,44,7,48],"texture":0},"up":{"uv":[6,44,5,43],"texture":0},"down":{"uv":[7,43,6,44],"texture":0}},"type":"cube","uuid":"698e467e-2f6f-a436-22ba-85086ad07663"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[2,15,2],"to":[3,19,3],"autouv":0,"color":9,"origin":[2,15,3],"uv_offset":[8,43],"faces":{"north":{"uv":[9,44,10,48],"texture":0},"east":{"uv":[8,44,9,48],"texture":0},"south":{"uv":[11,44,12,48],"texture":0},"west":{"uv":[10,44,11,48],"texture":0},"up":{"uv":[10,44,9,43],"texture":0},"down":{"uv":[11,43,10,44],"texture":0}},"type":"cube","uuid":"41b7332a-97a2-aa5c-cb5d-7d4efae681e7"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-3,15,2],"to":[-2,19,3],"autouv":0,"color":9,"origin":[-3,15,3],"uv_offset":[12,43],"faces":{"north":{"uv":[13,44,14,48],"texture":0},"east":{"uv":[12,44,13,48],"texture":0},"south":{"uv":[15,44,16,48],"texture":0},"west":{"uv":[14,44,15,48],"texture":0},"up":{"uv":[14,44,13,43],"texture":0},"down":{"uv":[15,43,14,44],"texture":0}},"type":"cube","uuid":"1d6dca42-0d45-7314-31bd-7595b7a6823c"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-6,19,-6],"to":[6,22,6],"autouv":0,"color":9,"origin":[0,20,0],"faces":{"north":{"uv":[12,12,24,15],"texture":0},"east":{"uv":[0,12,12,15],"texture":0},"south":{"uv":[36,12,48,15],"texture":0},"west":{"uv":[24,12,36,15],"texture":0},"up":{"uv":[24,12,12,0],"texture":0},"down":{"uv":[36,0,24,12],"texture":0}},"type":"cube","uuid":"1fd1c7f6-0ba1-3683-dcd4-2e85e1253170"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,15,2],"to":[2,17,3],"autouv":0,"color":9,"rotation":[-22.5,0,0],"origin":[0,15,3],"uv_offset":[32,27],"faces":{"north":{"uv":[33,28,37,30],"texture":0},"east":{"uv":[32,28,33,30],"texture":0},"south":{"uv":[38,28,42,30],"texture":0},"west":{"uv":[37,28,38,30],"texture":0},"up":{"uv":[37,28,33,27],"texture":0},"down":{"uv":[41,27,37,28],"texture":0}},"type":"cube","uuid":"8a4433a2-2928-5d46-86ed-cbb5a1bc15c0"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[2,15,-2],"to":[3,17,2],"autouv":0,"color":9,"rotation":[0,0,22.5],"origin":[3,15,0],"uv_offset":[16,38],"faces":{"north":{"uv":[20,42,21,44],"texture":0},"east":{"uv":[16,42,20,44],"texture":0},"south":{"uv":[25,42,26,44],"texture":0},"west":{"uv":[21,42,25,44],"texture":0},"up":{"uv":[21,42,20,38],"texture":0},"down":{"uv":[22,38,21,42],"texture":0}},"type":"cube","uuid":"eb1d011d-0133-aa4d-286d-c0d6984f8e7f"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,15,-3],"to":[2,17,-2],"autouv":0,"color":9,"rotation":[22.5,0,0],"origin":[0,15,-3],"uv_offset":[36,38],"faces":{"north":{"uv":[37,39,41,41],"texture":0},"east":{"uv":[36,39,37,41],"texture":0},"south":{"uv":[42,39,46,41],"texture":0},"west":{"uv":[41,39,42,41],"texture":0},"up":{"uv":[41,39,37,38],"texture":0},"down":{"uv":[45,38,41,39],"texture":0}},"type":"cube","uuid":"fded7a9f-c81a-f70d-5cc7-e21cd1fac682"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-3,15,-2],"to":[-2,17,2],"autouv":0,"color":9,"rotation":[0,0,-22.5],"origin":[-3,15,0],"uv_offset":[26,38],"faces":{"north":{"uv":[30,42,31,44],"texture":0},"east":{"uv":[26,42,30,44],"texture":0},"south":{"uv":[35,42,36,44],"texture":0},"west":{"uv":[31,42,35,44],"texture":0},"up":{"uv":[31,42,30,38],"texture":0},"down":{"uv":[32,38,31,42],"texture":0}},"type":"cube","uuid":"d1bc3382-ef94-8b09-43e4-b43529a6a1ad"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"allow_mirror_modeling":true,"from":[-2,18,-2],"to":[2,19,2],"autouv":0,"color":9,"origin":[0,18,0],"uv_offset":[0,38],"faces":{"north":{"uv":[4,42,8,43],"texture":0},"east":{"uv":[0,42,4,43],"texture":0},"south":{"uv":[12,42,16,43],"texture":0},"west":{"uv":[8,42,12,43],"texture":0},"up":{"uv":[8,42,4,38],"texture":0},"down":{"uv":[12,38,8,42],"texture":0}},"type":"cube","uuid":"8116b37e-dd18-0569-9808-26b136e0e50c"}],"groups":[],"outliner":["eb8bc620-4a12-0651-02b4-ef7ebcd631a7","907bf9c5-a8e9-7d26-5c54-942f14b4a557","3db0194b-95b0-2ea7-e8c7-fa5cf21e04ce","052bba3e-8f9f-b884-40ee-1f1442fa4f7e","a24c38c6-78b9-5d17-7e51-4b417058148c","e5873951-3374-575e-5967-b538037bd48c","30d88807-ecba-1fba-38ec-1fef73f44a24","b1548d66-d36f-da9a-e6ba-5f2bfb57fb68","41b7332a-97a2-aa5c-cb5d-7d4efae681e7","698e467e-2f6f-a436-22ba-85086ad07663","1d6dca42-0d45-7314-31bd-7595b7a6823c","1fd1c7f6-0ba1-3683-dcd4-2e85e1253170","8a4433a2-2928-5d46-86ed-cbb5a1bc15c0","eb1d011d-0133-aa4d-286d-c0d6984f8e7f","fded7a9f-c81a-f70d-5cc7-e21cd1fac682","d1bc3382-ef94-8b09-43e4-b43529a6a1ad","8116b37e-dd18-0569-9808-26b136e0e50c"],"textures":[{"name":"nuke.png","relative_path":"../main/resources/assets/szar/textures/entity/nuke.png","folder":"block","namespace":"","id":"0","group":"","width":256,"height":256,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"default","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"319403b4-9689-9922-1388-9462f1fe7511","source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/src/client/java/dev/tggamesyt/szar/client/Atom.java b/src/client/java/dev/tggamesyt/szar/client/Atom.java new file mode 100644 index 0000000..3be4a1d --- /dev/null +++ b/src/client/java/dev/tggamesyt/szar/client/Atom.java @@ -0,0 +1,52 @@ +package dev.tggamesyt.szar.client; + +import dev.tggamesyt.szar.AtomEntity; +import net.minecraft.client.model.*; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.util.math.MatrixStack; + +// Made with Blockbench 5.0.7 +// Exported for Minecraft version 1.17+ for Yarn +// Paste this class into your mod and generate all required imports +public class Atom extends EntityModel { + private final ModelPart bb_main; + public Atom(ModelPart root) { + this.bb_main = root.getChild("bb_main"); + } + public static TexturedModelData getTexturedModelData() { + ModelData modelData = new ModelData(); + ModelPartData modelPartData = modelData.getRoot(); + ModelPartData bb_main = modelPartData.addChild("bb_main", ModelPartBuilder.create().uv(32, 15).cuboid(-2.0F, -4.0F, -2.0F, 4.0F, 2.0F, 4.0F, new Dilation(0.0F)) + .uv(0, 30).cuboid(-3.0F, -6.0F, -3.0F, 6.0F, 2.0F, 6.0F, new Dilation(0.0F)) + .uv(0, 15).cuboid(-4.0F, -13.0F, -4.0F, 8.0F, 7.0F, 8.0F, new Dilation(0.0F)) + .uv(36, 41).cuboid(-1.0F, -2.0F, -1.0F, 2.0F, 1.0F, 2.0F, new Dilation(0.0F)) + .uv(24, 30).cuboid(-3.0F, -15.0F, -3.0F, 6.0F, 2.0F, 6.0F, new Dilation(0.0F)) + .uv(32, 21).cuboid(-2.0F, -17.0F, -2.0F, 4.0F, 2.0F, 4.0F, new Dilation(0.0F)) + .uv(42, 27).cuboid(-1.0F, -18.0F, -1.0F, 2.0F, 1.0F, 2.0F, new Dilation(0.0F)) + .uv(0, 43).cuboid(2.0F, -19.0F, -3.0F, 1.0F, 4.0F, 1.0F, new Dilation(0.0F)) + .uv(4, 43).cuboid(-3.0F, -19.0F, -3.0F, 1.0F, 4.0F, 1.0F, new Dilation(0.0F)) + .uv(8, 43).cuboid(-3.0F, -19.0F, 2.0F, 1.0F, 4.0F, 1.0F, new Dilation(0.0F)) + .uv(12, 43).cuboid(2.0F, -19.0F, 2.0F, 1.0F, 4.0F, 1.0F, new Dilation(0.0F)) + .uv(0, 0).cuboid(-6.0F, -22.0F, -6.0F, 12.0F, 3.0F, 12.0F, new Dilation(0.0F)) + .uv(0, 38).cuboid(-2.0F, -19.0F, -2.0F, 4.0F, 1.0F, 4.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData cube_r1 = bb_main.addChild("cube_r1", ModelPartBuilder.create().uv(26, 38).cuboid(-1.0F, -2.0F, -2.0F, 1.0F, 2.0F, 4.0F, new Dilation(0.0F)), ModelTransform.of(3.0F, -15.0F, 0.0F, 0.0F, 0.0F, -0.3927F)); + + ModelPartData cube_r2 = bb_main.addChild("cube_r2", ModelPartBuilder.create().uv(36, 38).cuboid(-2.0F, -2.0F, 0.0F, 4.0F, 2.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -15.0F, -3.0F, -0.3927F, 0.0F, 0.0F)); + + ModelPartData cube_r3 = bb_main.addChild("cube_r3", ModelPartBuilder.create().uv(16, 38).cuboid(0.0F, -2.0F, -2.0F, 1.0F, 2.0F, 4.0F, new Dilation(0.0F)), ModelTransform.of(-3.0F, -15.0F, 0.0F, 0.0F, 0.0F, 0.3927F)); + + ModelPartData cube_r4 = bb_main.addChild("cube_r4", ModelPartBuilder.create().uv(32, 27).cuboid(-2.0F, -2.0F, -1.0F, 4.0F, 2.0F, 1.0F, new Dilation(0.0F)), ModelTransform.of(0.0F, -15.0F, 3.0F, 0.3927F, 0.0F, 0.0F)); + return TexturedModelData.of(modelData, 64, 64); + } + @Override + public void render(MatrixStack matrices, VertexConsumer vertexConsumer, int light, int overlay, float red, float green, float blue, float alpha) { + bb_main.render(matrices, vertexConsumer, light, overlay, red, green, blue, alpha); + } + + @Override + public void setAngles(AtomEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + + } +} \ No newline at end of file diff --git a/src/client/java/dev/tggamesyt/szar/client/AtomEntityRenderer.java b/src/client/java/dev/tggamesyt/szar/client/AtomEntityRenderer.java new file mode 100644 index 0000000..bbafb4c --- /dev/null +++ b/src/client/java/dev/tggamesyt/szar/client/AtomEntityRenderer.java @@ -0,0 +1,57 @@ +package dev.tggamesyt.szar.client; + +import dev.tggamesyt.szar.AtomEntity; +import dev.tggamesyt.szar.Szar; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.RotationAxis; + +public class AtomEntityRenderer extends EntityRenderer { + + public static final EntityModelLayer ATOM_LAYER = + new EntityModelLayer(new Identifier(Szar.MOD_ID, "atom"), "main"); + + private static final Identifier TEXTURE = + new Identifier(Szar.MOD_ID, "textures/entity/nuke.png"); + + private final Atom model; + + public AtomEntityRenderer(EntityRendererFactory.Context context) { + super(context); + this.model = new Atom(context.getPart(ATOM_LAYER)); + this.shadowRadius = 1.5F; + } + + @Override + public void render( + AtomEntity entity, + float yaw, + float tickDelta, + MatrixStack matrices, + VertexConsumerProvider vertexConsumers, + int light + ) { + matrices.push(); + + model.render( + matrices, + vertexConsumers.getBuffer(model.getLayer(TEXTURE)), + light, + OverlayTexture.DEFAULT_UV, + 1.0F, 1.0F, 1.0F, 1.0F + ); + + matrices.pop(); + super.render(entity, yaw, tickDelta, matrices, vertexConsumers, light); + } + + @Override + public Identifier getTexture(AtomEntity entity) { + return TEXTURE; + } +} diff --git a/src/client/java/dev/tggamesyt/szar/client/SzarClient.java b/src/client/java/dev/tggamesyt/szar/client/SzarClient.java index aee94b5..8714cc7 100644 --- a/src/client/java/dev/tggamesyt/szar/client/SzarClient.java +++ b/src/client/java/dev/tggamesyt/szar/client/SzarClient.java @@ -38,8 +38,7 @@ import net.minecraft.util.math.random.Random; import java.util.*; -import static dev.tggamesyt.szar.Szar.HitterEntityType; -import static dev.tggamesyt.szar.Szar.PLANE_ANIM_PACKET; +import static dev.tggamesyt.szar.Szar.*; import static javax.swing.text.html.HTML.Attribute.ID; public class SzarClient implements ClientModInitializer { @@ -54,6 +53,11 @@ public class SzarClient implements ClientModInitializer { new Identifier(Szar.MOD_ID, "nyan_cat"), "main" ); + public static final EntityModelLayer ATOM = + new EntityModelLayer( + new Identifier(Szar.MOD_ID, "atom"), + "main" + ); // Outside of your tick handler private final Map activeSounds = new HashMap<>(); private static final SoundEvent NYAN_LOOP = SoundEvent.of(new Identifier("szar", "nyan_cat_loop")); @@ -165,6 +169,14 @@ public class SzarClient implements ClientModInitializer { Szar.NiggerEntityType, NiggerEntityRenderer::new ); + EntityRendererRegistry.register( + Szar.AtomEntityType, + AtomEntityRenderer::new + ); + EntityModelLayerRegistry.registerModelLayer( + ATOM, + Atom::getTexturedModelData + ); EntityRendererRegistry.register( Szar.HitterEntityType, HitterEntityRenderer::new diff --git a/src/main/java/dev/tggamesyt/szar/AtomEntity.java b/src/main/java/dev/tggamesyt/szar/AtomEntity.java new file mode 100644 index 0000000..0da45cb --- /dev/null +++ b/src/main/java/dev/tggamesyt/szar/AtomEntity.java @@ -0,0 +1,84 @@ +package dev.tggamesyt.szar; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.MovementType; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class AtomEntity extends Entity { + private static final int NUKE_RADIUS = 100; + public AtomEntity(EntityType type, World world) { + super(type, world); + } + + @Override + protected void initDataTracker() {} + + @Override + public void tick() { + super.tick(); + + if (!this.hasNoGravity()) { + this.setVelocity(this.getVelocity().add(0, -0.08, 0)); + } + + this.move(MovementType.SELF, this.getVelocity()); + + if (!getWorld().isClient && this.isOnGround()) { + explode(); + this.discard(); + } + } + + private void explode() { + ServerWorld world = (ServerWorld) this.getWorld(); + + // Visual / sound explosion only + world.createExplosion( + this, + getX(), + getY(), + getZ(), + 50.0F, // just visuals + World.ExplosionSourceType.TNT + ); + + clearSphere(world, this.getBlockPos(), NUKE_RADIUS); + } + private void clearSphere(ServerWorld world, BlockPos center, int radius) { + int rSquared = radius * radius; + + BlockPos.Mutable mutable = new BlockPos.Mutable(); + + for (int x = -radius; x <= radius; x++) { + for (int y = -radius; y <= radius; y++) { + for (int z = -radius; z <= radius; z++) { + + if (x * x + y * y + z * z > rSquared) continue; + + mutable.set( + center.getX() + x, + center.getY() + y, + center.getZ() + z + ); + + // Skip void / out of world + if (!world.isInBuildLimit(mutable)) continue; + + world.setBlockState(mutable, net.minecraft.block.Blocks.AIR.getDefaultState(), 3); + } + } + } + } + + + @Override + protected void readCustomDataFromNbt(NbtCompound nbt) {} + + @Override + protected void writeCustomDataToNbt(NbtCompound nbt) {} +} diff --git a/src/main/java/dev/tggamesyt/szar/AtomSummonerItem.java b/src/main/java/dev/tggamesyt/szar/AtomSummonerItem.java new file mode 100644 index 0000000..a2655e7 --- /dev/null +++ b/src/main/java/dev/tggamesyt/szar/AtomSummonerItem.java @@ -0,0 +1,66 @@ +package dev.tggamesyt.szar; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.*; +import net.minecraft.world.RaycastContext; +import net.minecraft.world.World; + +public class AtomSummonerItem extends Item { + + private static final int COOLDOWN_TICKS = 20 * 60; // 10 minutes + private static final double RAY_DISTANCE = 500.0D; + + public AtomSummonerItem(Settings settings) { + super(settings.maxDamage(2)); + } + + @Override + public TypedActionResult use(World world, PlayerEntity player, Hand hand) { + if (world.isClient()) { + return TypedActionResult.success(player.getStackInHand(hand)); + } + + ServerWorld serverWorld = (ServerWorld) world; + ItemStack stack = player.getStackInHand(hand); + + // Raycast from eyes + Vec3d start = player.getCameraPosVec(1.0F); + Vec3d direction = player.getRotationVec(1.0F); + Vec3d end = start.add(direction.multiply(RAY_DISTANCE)); + + BlockHitResult hit = serverWorld.raycast(new RaycastContext( + start, + end, + RaycastContext.ShapeType.OUTLINE, + RaycastContext.FluidHandling.NONE, + player + )); + + // If player is looking into nothing, abort + if (hit.getType() == HitResult.Type.MISS) { + return TypedActionResult.fail(stack); + } + + BlockPos hitPos = hit.getBlockPos(); + Vec3d spawnPos = Vec3d.ofCenter(hitPos).add(0, 100, 0); + + AtomEntity atom = new AtomEntity(Szar.AtomEntityType, serverWorld); + atom.setPosition(spawnPos.x, spawnPos.y, spawnPos.z); + + serverWorld.spawnEntity(atom); + + // Cooldown + durability + player.getItemCooldownManager().set(this, COOLDOWN_TICKS); + stack.damage(1, player, p -> p.sendToolBreakStatus(hand)); + + return TypedActionResult.success(stack); + } +} diff --git a/src/main/java/dev/tggamesyt/szar/Szar.java b/src/main/java/dev/tggamesyt/szar/Szar.java index 4972dcc..2f4ffb0 100644 --- a/src/main/java/dev/tggamesyt/szar/Szar.java +++ b/src/main/java/dev/tggamesyt/szar/Szar.java @@ -76,7 +76,7 @@ public class Szar implements ModInitializer { public static final Logger LOGGER = LogManager.getLogger(MOD_ID); public static MinecraftServer SERVER; public static final Identifier PLANE_ANIM_PACKET = - new Identifier("szar", "plane_anim"); + new Identifier(MOD_ID, "plane_anim"); public static final Identifier OPEN_URL = new Identifier(MOD_ID, "epsteinfiles"); public static final Block SZAR_BLOCK = @@ -99,7 +99,7 @@ public class Szar implements ModInitializer { public static final RegistryKey BULLET_DAMAGE = RegistryKey.of( RegistryKeys.DAMAGE_TYPE, - new Identifier("szar", "bullet") + new Identifier(MOD_ID, "bullet") ); public static VillagerProfession DROG_DEALER = Registry.register( Registries.VILLAGER_PROFESSION, @@ -233,6 +233,7 @@ public class Szar implements ModInitializer { entries.add(Szar.NYAN_SPAWNEGG); entries.add(Szar.EPSTEIN_FILES); entries.add(Szar.EPSTEIN_SPAWNEGG); + entries.add(Szar.ATOM_DETONATOR); }) .build() ); @@ -476,7 +477,7 @@ public class Szar implements ModInitializer { GenerationStep.Feature.VEGETAL_DECORATION, RegistryKey.of( RegistryKeys.PLACED_FEATURE, - new Identifier("szar", "cannabis_patch") + new Identifier(MOD_ID, "cannabis_patch") ) ); AttackEntityCallback.EVENT.register((player, world, hand, entity, hitResult) -> { @@ -522,7 +523,7 @@ public class Szar implements ModInitializer { public static final Feature CANNABIS_PATCH = Registry.register( Registries.FEATURE, - new Identifier("szar", "cannabis_patch"), + new Identifier(MOD_ID, "cannabis_patch"), new CannabisPatchFeature(CannabisPatchFeatureConfig.CODEC) ); public static final Map PLAYER_JOINT_LEVEL = new HashMap<>(); @@ -532,25 +533,36 @@ public class Szar implements ModInitializer { new Identifier(MOD_ID, "drog"), new DrogEffect() ); - public static final StatusEffect ARRESTED = Registry.register(Registries.STATUS_EFFECT, new Identifier("szar", "arrested"), new ArrestedEffect()); + public static final StatusEffect ARRESTED = Registry.register(Registries.STATUS_EFFECT, new Identifier(MOD_ID, "arrested"), new ArrestedEffect()); public static final Item AK_AMMO = Registry.register( Registries.ITEM, - new Identifier("szar", "bullet"), + new Identifier(MOD_ID, "bullet"), new Item(new Item.Settings()) ); public static final EntityType BULLET = Registry.register( Registries.ENTITY_TYPE, - new Identifier("szar", "bullet"), + new Identifier(MOD_ID, "bullet"), FabricEntityTypeBuilder.create(SpawnGroup.MISC, BulletEntity::new) .dimensions(EntityDimensions.fixed(0.25F, 0.25F)) .trackRangeBlocks(64) .trackedUpdateRate(20) .build() ); + public static final EntityType AtomEntityType = + Registry.register( + Registries.ENTITY_TYPE, + new Identifier(MOD_ID, "atom"), + FabricEntityTypeBuilder.create() + .entityFactory(AtomEntity::new) + .dimensions(EntityDimensions.fixed(2.0F, 6.0F)) + .trackRangeBlocks(256) + .trackedUpdateRate(1) + .build() + ); public static final Item AK47 = Registry.register( Registries.ITEM, - new Identifier("szar", "ak47"), + new Identifier(MOD_ID, "ak47"), new AK47Item(new Item.Settings().maxCount(1)) ); @@ -714,7 +726,7 @@ public class Szar implements ModInitializer { new FaszItem(FASZ_BLOCK, new Item.Settings()) ); public static final SoundEvent NYAN_MUSIC = - SoundEvent.of(new Identifier("szar", "nyan_music")); + SoundEvent.of(new Identifier(MOD_ID, "nyan_music")); public static final Item POPTART = Registry.register( Registries.ITEM, new Identifier(MOD_ID, "pop_tart"), @@ -724,6 +736,11 @@ public class Szar implements ModInitializer { hunger((Math.random() < 0.5) ? 6 : 7) // SIX OR SEVEN .build()), 217) ); + public static final Item ATOM_DETONATOR = Registry.register( + Registries.ITEM, + new Identifier(MOD_ID, "detonator"), + new AtomSummonerItem(new Item.Settings()) + ); public static final Item NWORD_PASS = Registry.register( Registries.ITEM, new Identifier(MOD_ID, "nwordpass"), diff --git a/src/main/resources/assets/szar/lang/en_us.json b/src/main/resources/assets/szar/lang/en_us.json index c02a4e5..4abbe3c 100644 --- a/src/main/resources/assets/szar/lang/en_us.json +++ b/src/main/resources/assets/szar/lang/en_us.json @@ -53,5 +53,8 @@ "szar.nyan_cat_start": "Nyan Cat Starts Performing", "item.szar.epstein_files": "Epstein Files", "entity.szar.epstein": "Epstein", - "item.szar.epstein_spawn_egg": "Epstein Spawn Egg" + "item.szar.epstein_spawn_egg": "Epstein Spawn Egg", + + "item.szar.detonator": "Detonator", + "entity.szar.atom": "Atom" } diff --git a/src/main/resources/assets/szar/models/item/detonator.json b/src/main/resources/assets/szar/models/item/detonator.json new file mode 100644 index 0000000..1337d3c --- /dev/null +++ b/src/main/resources/assets/szar/models/item/detonator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "szar:item/detonator" + } +} diff --git a/src/main/resources/assets/szar/textures/entity/nuke.png b/src/main/resources/assets/szar/textures/entity/nuke.png new file mode 100644 index 0000000000000000000000000000000000000000..8da1cb38feca5e059cec83200aa9ef8cef9e0160 GIT binary patch literal 1093 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0%sU!E?GAr*7p+`Z^`D?y?m zF(GC8w#Bg>yBAd|%FT?u`RI{{2anQ}MG4*SKg;L{pRB*IK7Z=8M^&ZU;~b{$oo~W8 zL5<-Oi^D7i4`GH(CIw%HC7ca|K`_s*q27MJ*!3@OA8s?h`1o(-?dQj1U(a}Ck-|M-j zC)cWNjG0@df9hUFd2Gs=Yw1p_ALi#T+Z`wO@7lAEjW_#KYL}Uc95`Ka|J;wKAN$YT z_~r91gMs<@w%GUcHh!JieD%chw|v!S9-L3DRV%b;DCUovSAX;Q=ghu;EH|usY;EQL z{eQHV-R8A1`||Ub-}V(7pME?2cD=q))NA8~iy7a@9^=Vi|SI&<(s>juNgzfY8` zJ^#cnhV$OJ{LicM-rIctcDmpH`Y)f?Uv4klz9+u^*4LerHZmTVp7LHDoC>x){d~BI z^JmQB%$vU;iDKKl+wT|jf1kdy`ojHtNj%k@x96~8=>N`ge@622ulh^NY7g9l#&8_-gfytX21DwmMuz*%&%p5i lKhuF+L11CP1}X)Z8A4|9Zm4l%t^tZLc)I$ztaD0e0sx}|n#}+J literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/szar/textures/item/detonator.png b/src/main/resources/assets/szar/textures/item/detonator.png new file mode 100644 index 0000000000000000000000000000000000000000..f564b72eae229e639ebb5398e3f68b75d4bb9d14 GIT binary patch literal 722 zcmV;@0xkWCP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940%u7?K~#8N?b<&` zRbd#%@oQ}kcc~i`1h+7xu_3S;ni?DeX($ju2cse=8X}sSq9CHh7IA5869OF^Oz4m3 zAc-W=AMa9;=jb5f5J*AKckn#-+}`tgQiA9CEYA;wE57jjyyv~Qt+K=FC(ryM{?V9y zz2m<##vZ0wegI6fO7CN6$GrpobAA9!vr6yd{`&FEj;D>q%xi{zuIbKLPgY6!La!I% zE5J0%JAhf3-qGFmuRFn4fN7R@0J9~%^CM3lk#@(2PhUv+-Y@+iiRaHoNFvk;z5-0M zyaSjmg*xEwy@#ZH$=V7jU+DjO$my=LB=Kf?iX_s>MG}r=|7KqSrdi$r%$7nO&^z2i z63ZtxN$AOTz<7O}l&`zdO~U9tf;cd@mn6D=ULc944!F5Y!mSnWfUW!hm}W(H!0qeT zNaD`@t0d8Ws+}a7Iw6wY`Hi<5Bys-S6_S`38zTvS76|YIV479B1GLVLqoiU&&-~JU`Pz4x zBx3LULVN|7W_brNw=MS0Pz&AhX|dk{3h@npL_3G~EeW+3y9G-FeMdfN7TT1E^Gf13MzZannA-Q~&?~07*qoM6N<$ Ef(On}?*IS* literal 0 HcmV?d00001