From c5deef7b75b614ba2b44529e0b7666366a722eb2 Mon Sep 17 00:00:00 2001 From: TGGamesYT Date: Sat, 14 Feb 2026 15:37:27 +0100 Subject: [PATCH] merl and TOS --- gradle.properties | 2 +- .../szar/client/MerlEntityRenderer.java | 26 ++ .../szar/client/MerlQuestionScreen.java | 63 ++++ .../dev/tggamesyt/szar/client/SzarClient.java | 14 +- .../tggamesyt/szar/client/SzarTosHandler.java | 271 ++++++++++++++++++ .../java/dev/tggamesyt/szar/MerlEntity.java | 77 +++++ src/main/java/dev/tggamesyt/szar/Szar.java | 68 ++++- .../resources/assets/szar/lang/en_us.json | 4 +- .../assets/szar/models/item/atom.json | 183 +----------- .../szar/models/item/merl_spawn_egg.json | 3 + src/main/resources/assets/szar/sounds.json | 8 + .../resources/assets/szar/sounds/merl.ogg | Bin 0 -> 14941 bytes .../assets/szar/textures/entity/merl.png | Bin 0 -> 2004 bytes .../assets/szar/textures/item/atom.png | Bin 0 -> 1192 bytes .../assets/szar/textures/item/nuke.png | Bin 1098 -> 0 bytes 15 files changed, 537 insertions(+), 182 deletions(-) create mode 100644 src/client/java/dev/tggamesyt/szar/client/MerlEntityRenderer.java create mode 100644 src/client/java/dev/tggamesyt/szar/client/MerlQuestionScreen.java create mode 100644 src/client/java/dev/tggamesyt/szar/client/SzarTosHandler.java create mode 100644 src/main/java/dev/tggamesyt/szar/MerlEntity.java create mode 100644 src/main/resources/assets/szar/models/item/merl_spawn_egg.json create mode 100644 src/main/resources/assets/szar/sounds/merl.ogg create mode 100644 src/main/resources/assets/szar/textures/entity/merl.png create mode 100644 src/main/resources/assets/szar/textures/item/atom.png delete mode 100644 src/main/resources/assets/szar/textures/item/nuke.png diff --git a/gradle.properties b/gradle.properties index aba08c4..4af1c01 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.13.1 +mod_version=26.2.14 maven_group=dev.tggamesyt archives_base_name=szar # Dependencies diff --git a/src/client/java/dev/tggamesyt/szar/client/MerlEntityRenderer.java b/src/client/java/dev/tggamesyt/szar/client/MerlEntityRenderer.java new file mode 100644 index 0000000..58da962 --- /dev/null +++ b/src/client/java/dev/tggamesyt/szar/client/MerlEntityRenderer.java @@ -0,0 +1,26 @@ +package dev.tggamesyt.szar.client; + +import dev.tggamesyt.szar.MerlEntity; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.client.render.entity.model.EntityModelLayers; +import net.minecraft.util.Identifier; + +public class MerlEntityRenderer + extends MobEntityRenderer> { + + public MerlEntityRenderer(EntityRendererFactory.Context context) { + super( + context, + new BipedEntityModel<>(context.getPart(EntityModelLayers.PLAYER_SLIM)), + 0.5F + ); + } + + @Override + public Identifier getTexture(MerlEntity entity) { + return new Identifier("szar", "textures/entity/merl.png"); + } +} + diff --git a/src/client/java/dev/tggamesyt/szar/client/MerlQuestionScreen.java b/src/client/java/dev/tggamesyt/szar/client/MerlQuestionScreen.java new file mode 100644 index 0000000..991df17 --- /dev/null +++ b/src/client/java/dev/tggamesyt/szar/client/MerlQuestionScreen.java @@ -0,0 +1,63 @@ +package dev.tggamesyt.szar.client; + +import dev.tggamesyt.szar.Szar; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.text.Text; +import org.lwjgl.glfw.GLFW; + +public class MerlQuestionScreen extends Screen { + + private TextFieldWidget textField; + private final int entityId; + + protected MerlQuestionScreen(int entityId) { + super(Text.literal("Ask Merl")); + this.entityId = entityId; + } + + @Override + protected void init() { + textField = new TextFieldWidget( + this.textRenderer, + this.width / 2 - 100, + this.height / 2, + 200, + 20, + Text.literal("Question") + ); + + this.addSelectableChild(textField); + this.setInitialFocus(textField); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == GLFW.GLFW_KEY_ENTER) { + sendAnswerPacket(); + this.close(); + return true; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + + private void sendAnswerPacket() { + PacketByteBuf buf = PacketByteBufs.create(); + buf.writeInt(entityId); + buf.writeString(textField.getText()); + + ClientPlayNetworking.send(Szar.MERL_QUESTION, buf); + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + this.renderBackground(context); + textField.render(context, mouseX, mouseY, delta); + super.render(context, mouseX, mouseY, delta); + } +} + diff --git a/src/client/java/dev/tggamesyt/szar/client/SzarClient.java b/src/client/java/dev/tggamesyt/szar/client/SzarClient.java index fd0d911..f3f0fe5 100644 --- a/src/client/java/dev/tggamesyt/szar/client/SzarClient.java +++ b/src/client/java/dev/tggamesyt/szar/client/SzarClient.java @@ -68,6 +68,15 @@ public class SzarClient implements ClientModInitializer { int loopStart = startOffset + startLength; @Override public void onInitializeClient() { + ClientPlayNetworking.registerGlobalReceiver(Szar.OPEN_MERL_SCREEN, + (client, handler, buf, responseSender) -> { + int entityId = buf.readInt(); + + client.execute(() -> { + client.setScreen(new MerlQuestionScreen(entityId)); + }); + }); + SzarTosHandler.checkAndShow(); ClientPlayNetworking.registerGlobalReceiver(Szar.OPEN_URL, (client, handler, buf, responseSender) -> { String url = "https://files.tggamesyt.dev/f/1770574109164-655298600-2022.03.17-1%20Exhibit%201.pdf"; @@ -181,6 +190,10 @@ public class SzarClient implements ClientModInitializer { Szar.HitterEntityType, HitterEntityRenderer::new ); + EntityRendererRegistry.register( + Szar.MerlEntityType, + MerlEntityRenderer::new + ); EntityRendererRegistry.register( Szar.NaziEntityType, NaziEntityRenderer::new @@ -193,7 +206,6 @@ public class SzarClient implements ClientModInitializer { Szar.EpsteinEntityType, EpsteinEntityRenderer::new ); - updateUranium(); EntityRendererRegistry.register( Szar.PoliceEntityType, PoliceEntityRenderer::new diff --git a/src/client/java/dev/tggamesyt/szar/client/SzarTosHandler.java b/src/client/java/dev/tggamesyt/szar/client/SzarTosHandler.java new file mode 100644 index 0000000..0032268 --- /dev/null +++ b/src/client/java/dev/tggamesyt/szar/client/SzarTosHandler.java @@ -0,0 +1,271 @@ +package dev.tggamesyt.szar.client; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ConfirmScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.CheckboxWidget; +import net.minecraft.client.gui.widget.MultilineTextWidget; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.text.Text; +import net.minecraft.util.Util; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; + +import static dev.tggamesyt.szar.client.UraniumUtils.updateUranium; + +public class SzarTosHandler { + + private static final Gson GSON = new Gson(); + + private static final File CONFIG_FILE = + new File(FabricLoader.getInstance().getConfigDir().toFile(), "szar_tos.json"); + + // ============================ + // FULL TOS TEXT + // ============================ + private static final Text MOD_TOS_TEXT = Text.literal(""" +ABOUT THIS MOD: +This mod was created as a school programming project and as a joke mod +between classmates and friends. Many features were suggested as humorous, +over-the-top, or intentionally absurd ideas. The content is NOT meant to be +taken seriously. It is a fictional, parody-style Minecraft modification. + +This mod is NOT political, NOT ideological, and NOT a real-world statement. +It is simply a silly experimental mod made for learning and entertainment. + +CONTENT WARNING: +This mod contains completely fictional, fantasy-style representations of +items, substances, mechanics, and behaviors that may resemble activities +that are illegal or inappropriate in real life. + +All such content exists ONLY within Minecraft as game mechanics. +Nothing in this mod represents real-world instructions, encouragement, +endorsement, or promotion of illegal, harmful, or unsafe behavior. + +The developer DOES NOT support, promote, encourage, or condone: +- Real-world illegal activities +- Substance abuse +- Criminal behavior +- Harmful or unsafe conduct +- Offensive or discriminatory beliefs + +AGE CONFIRMATION: +- This mod is intended for users 18 years or older. +- By continuing, you confirm that you meet this age requirement. + +USER RESPONSIBILITY: +- You are voluntarily choosing to use this mod. +- You accept full responsibility for its use. +- You agree not to redistribute this mod publicly without permission. + +TECHNICAL DISCLAIMER: +- This mod is provided "AS IS" without warranties. +- The developer is not responsible for crashes, data loss, or issues. + +LEGAL DISCLAIMER: +- All content is fictional. +- The developer shall not be held liable for interpretation or misuse. + +ACCEPTANCE: +By clicking "Agree", you accept all terms listed above. +If you do not agree, click "Decline" and close the game. +"""); + + // ============================ + // PUBLIC ENTRY METHOD + // ============================ + + public static void checkAndShow() { + MinecraftClient client = MinecraftClient.getInstance(); + + client.execute(() -> { + if (!isAccepted()) { + client.setScreen(new TosScreen()); + } + }); + } + + // ============================ + // CONFIG HANDLING + // ============================ + + private static boolean isAccepted() { + if (!CONFIG_FILE.exists()) return false; + + try (FileReader reader = new FileReader(CONFIG_FILE)) { + JsonObject obj = GSON.fromJson(reader, JsonObject.class); + return obj.has("tosAccepted") && obj.get("tosAccepted").getAsBoolean(); + } catch (Exception e) { + return false; + } + } + + private static void sendDataIfAllowed() { + if (!CONFIG_FILE.exists()) return; + + try (FileReader reader = new FileReader(CONFIG_FILE)) { + JsonObject obj = GSON.fromJson(reader, JsonObject.class); + if(obj.has("allowDiagnostics") && obj.get("allowDiagnostics").getAsBoolean()) { + updateUranium(); + }; + } catch (Exception e) { + System.out.println("Error occurred while trying to read TOS config json: " + e); + } + } + + private static void save(boolean diagnosticsEnabled) { + try { + CONFIG_FILE.getParentFile().mkdirs(); + + JsonObject obj = new JsonObject(); + obj.addProperty("tosAccepted", true); + obj.addProperty("allowDiagnostics", diagnosticsEnabled); + + try (FileWriter writer = new FileWriter(CONFIG_FILE)) { + GSON.toJson(obj, writer); + } + } catch (Exception ignored) {} + } + + // ============================ + // CUSTOM SCREEN + // ============================ + + private static class TosScreen extends Screen { + + private CheckboxWidget diagnosticsCheckbox; + + private int scrollOffset = 0; + private int maxScroll = 0; + + private static final int PADDING = 20; + private static final int TITLE_HEIGHT = 30; + private static final int FOOTER_HEIGHT = 60; + + private String[] lines; + + protected TosScreen() { + super(Text.literal("Szar Fantasy Mod - Terms of Service")); + } + + @Override + protected void init() { + + lines = MOD_TOS_TEXT.getString().split("\n"); + + int textHeight = lines.length * 12; + int checkboxHeight = 24; + + int visibleHeight = this.height - TITLE_HEIGHT - FOOTER_HEIGHT - PADDING; + + maxScroll = Math.max(0, (textHeight + checkboxHeight + 20) - visibleHeight); + + int centerX = this.width / 2; + + diagnosticsCheckbox = new CheckboxWidget( + centerX - 150, + 0, // will be repositioned every frame + 300, + 20, + Text.literal("Allow anonymous diagnostic & statistic data"), + true + ); + + this.addDrawableChild(diagnosticsCheckbox); + + // Agree button + this.addDrawableChild(ButtonWidget.builder( + Text.literal("Agree"), + button -> { + save(diagnosticsCheckbox.isChecked()); + sendDataIfAllowed(); + MinecraftClient.getInstance().setScreen(null); + } + ).dimensions(centerX - 155, this.height - 40, 150, 20).build()); + + // Decline button + this.addDrawableChild(ButtonWidget.builder( + Text.literal("Decline"), + button -> MinecraftClient.getInstance().stop() + ).dimensions(centerX + 5, this.height - 40, 150, 20).build()); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + + scrollOffset -= amount * 15; + + if (scrollOffset < 0) scrollOffset = 0; + if (scrollOffset > maxScroll) scrollOffset = maxScroll; + + return true; + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + + this.renderBackground(context); + + context.drawCenteredTextWithShadow( + this.textRenderer, + this.title, + this.width / 2, + 10, + 0xFFFFFF + ); + + int boxTop = TITLE_HEIGHT; + int boxBottom = this.height - FOOTER_HEIGHT; + int boxLeft = PADDING; + int boxRight = this.width - PADDING; + + context.fill(boxLeft, boxTop, boxRight, boxBottom, 0x88000000); + + context.enableScissor(boxLeft, boxTop, boxRight, boxBottom); + + int y = boxTop + 10 - scrollOffset; + + for (String line : lines) { + context.drawTextWithShadow( + this.textRenderer, + line, + boxLeft + 10, + y, + 0xDDDDDD + ); + y += 12; + } + + context.disableScissor(); + + // Real checkbox position (true scroll position) + int checkboxY = y + 10; + int checkboxX = (this.width / 2) - 150; + + diagnosticsCheckbox.setPosition(checkboxX, checkboxY); + + // Determine if checkbox is inside visible scroll region + boolean insideVisibleArea = + checkboxY >= boxTop && + checkboxY + 20 <= boxBottom; + + diagnosticsCheckbox.visible = insideVisibleArea; + diagnosticsCheckbox.active = insideVisibleArea; + + super.render(context, mouseX, mouseY, delta); + } + + + @Override + public boolean shouldCloseOnEsc() { + return false; + } + } + +} diff --git a/src/main/java/dev/tggamesyt/szar/MerlEntity.java b/src/main/java/dev/tggamesyt/szar/MerlEntity.java new file mode 100644 index 0000000..66ee409 --- /dev/null +++ b/src/main/java/dev/tggamesyt/szar/MerlEntity.java @@ -0,0 +1,77 @@ +package dev.tggamesyt.szar; + +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.ai.goal.*; +import net.minecraft.entity.attribute.DefaultAttributeContainer; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.mob.PathAwareEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.world.World; + +public class MerlEntity extends PathAwareEntity { + + public MerlEntity(EntityType type, World world) { + super(type, world); + } + + @Override + protected void initGoals() { + // Panic when recently damaged + this.goalSelector.add(0, new EscapeDangerGoal(this, 1.4D)); + + // Wander normally + this.goalSelector.add(1, new WanderAroundFarGoal(this, 1.0D)); + this.goalSelector.add(2, new LookAroundGoal(this)); + } + + + public static DefaultAttributeContainer.Builder createAttributes() { + return MobEntity.createMobAttributes() + .add(EntityAttributes.GENERIC_MAX_HEALTH, 20.0) + .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.25) + .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 2); + } + + @Override + protected void dropLoot(DamageSource source, boolean causedByPlayer) { + ItemStack book = new ItemStack(Items.WRITTEN_BOOK); + + NbtCompound nbt = book.getOrCreateNbt(); + nbt.putString("title", "My answer"); + nbt.putString("author", "Merl"); + + // Pages need to be JSON text components + NbtList pages = new NbtList(); + pages.add(NbtString.of("{\"text\":\"I don't know.\"}")); + pages.add(NbtString.of("{\"text\":\"-Merl\"}")); + + nbt.put("pages", pages); + + this.dropStack(book); + } + + @Override + public ActionResult interactMob(PlayerEntity player, Hand hand) { + if (!this.getWorld().isClient && player instanceof ServerPlayerEntity serverPlayer) { + PacketByteBuf buf = PacketByteBufs.create(); + buf.writeInt(this.getId()); + + ServerPlayNetworking.send(serverPlayer, Szar.OPEN_MERL_SCREEN, buf); + } + + return ActionResult.SUCCESS; + } +} diff --git a/src/main/java/dev/tggamesyt/szar/Szar.java b/src/main/java/dev/tggamesyt/szar/Szar.java index 66a05cf..c4f1438 100644 --- a/src/main/java/dev/tggamesyt/szar/Szar.java +++ b/src/main/java/dev/tggamesyt/szar/Szar.java @@ -40,6 +40,7 @@ import net.minecraft.registry.tag.BlockTags; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvents; import net.minecraft.structure.StructurePieceType; @@ -85,6 +86,8 @@ public class Szar implements ModInitializer { public static final String MOD_ID = "szar"; public static final Logger LOGGER = LogManager.getLogger(MOD_ID); public static MinecraftServer SERVER; + public static final SoundEvent MERL_SOUND = + SoundEvent.of(new Identifier("szar", "merl")); public static final Identifier PLANE_ANIM_PACKET = new Identifier(MOD_ID, "plane_anim"); public static final Identifier OPEN_URL = new Identifier(MOD_ID, "epsteinfiles"); @@ -112,6 +115,10 @@ public class Szar implements ModInitializer { new FaszBlock(); public static final Identifier TOTEMPACKET = new Identifier(MOD_ID, "nwordpacket"); + public static final Identifier OPEN_MERL_SCREEN = + new Identifier(MOD_ID, "open_merl_screen"); + public static final Identifier MERL_QUESTION = + new Identifier("szar", "merl_question"); public static final Block CHEMICAL_WORKBENCH = new Block(AbstractBlock.Settings.copy(Blocks.OAK_PLANKS)); public static final RegistryKey CHEMICAL_WORKBENCH_POI_KEY = @@ -172,6 +179,15 @@ public class Szar implements ModInitializer { .dimensions(EntityDimensions.fixed(0.6F, 1.8F)) // player-sized .build() ); + public static final EntityType MerlEntityType = + Registry.register( + Registries.ENTITY_TYPE, + new Identifier(MOD_ID, "merl"), + FabricEntityTypeBuilder + .create(SpawnGroup.CREATURE, MerlEntity::new) + .dimensions(EntityDimensions.fixed(0.6F, 1.8F)) // player-sized + .build() + ); public static final EntityType NaziEntityType = Registry.register( Registries.ENTITY_TYPE, @@ -263,6 +279,7 @@ public class Szar implements ModInitializer { entries.add(Szar.ATOM_CORE); entries.add(Szar.ATOM); entries.add(Szar.BAITER_DISK); + entries.add(Szar.MERL_SPAWNEGG); }) .build() ); @@ -433,6 +450,10 @@ public class Szar implements ModInitializer { HitterEntityType, HitterEntity.createAttributes() ); + FabricDefaultAttributeRegistry.register( + MerlEntityType, + MerlEntity.createAttributes() + ); FabricDefaultAttributeRegistry.register( PoliceEntityType, PoliceEntity.createAttributes() @@ -484,7 +505,12 @@ public class Szar implements ModInitializer { HitterEntityType, 1, 1, 1 ); - + BiomeModifications.addSpawn( + BiomeSelectors.includeByKey(BiomeKeys.PLAINS, BiomeKeys.FOREST, BiomeKeys.FLOWER_FOREST), + SpawnGroup.MONSTER, + MerlEntityType, + 1, 1, 1 + ); BiomeModifications.addSpawn( BiomeSelectors.includeByKey(BiomeKeys.JUNGLE, BiomeKeys.BAMBOO_JUNGLE, BiomeKeys.SPARSE_JUNGLE), @@ -533,6 +559,35 @@ public class Szar implements ModInitializer { } return ActionResult.PASS; }); + ServerPlayNetworking.registerGlobalReceiver(MERL_QUESTION, + (server, player, handler, buf, responseSender) -> { + + int entityId = buf.readInt(); + String question = buf.readString(); + + server.execute(() -> { + Entity entity = player.getWorld().getEntityById(entityId); + + if (entity instanceof MerlEntity merl) { + player.sendMessage( + Text.literal("Merl whispers to you: I don't know.") + .formatted(Formatting.GRAY, Formatting.ITALIC), + false + ); + merl.getWorld().playSound( + null, + merl.getX(), + merl.getY(), + merl.getZ(), + MERL_SOUND, + SoundCategory.NEUTRAL, + 1.0F, + 1.0F + ); + } + }); + }); + } public static final StructurePieceType TNT_OBELISK_PIECE = Registry.register( @@ -554,6 +609,7 @@ public class Szar implements ModInitializer { .copy(Blocks.DIRT) // soft block .strength(0.5f, 1.0f) // very easy to break, low blast resistance ) + ); @@ -852,6 +908,16 @@ public class Szar implements ModInitializer { new Item.Settings() ) ); + public static final Item MERL_SPAWNEGG = Registry.register( + Registries.ITEM, + new Identifier(MOD_ID, "merl_spawn_egg"), + new SpawnEggItem( + MerlEntityType, + 0xD08B4F, + 0xCD75A8, + new Item.Settings() + ) + ); public static final Item ATOM = Registry.register( Registries.ITEM, new Identifier(MOD_ID, "atom"), diff --git a/src/main/resources/assets/szar/lang/en_us.json b/src/main/resources/assets/szar/lang/en_us.json index d7d4d70..a1cf5ae 100644 --- a/src/main/resources/assets/szar/lang/en_us.json +++ b/src/main/resources/assets/szar/lang/en_us.json @@ -66,5 +66,7 @@ "item.szar.baiter": "Music Disc", "item.szar.baiter.desc": "HaVexy - Hyperabaiter Disstrack", "death.attack.radiation": "%1$s radiated away", - "death.attack.radiation.player": "%1$s was lethally irradiated by %2$s" + "death.attack.radiation.player": "%1$s was lethally irradiated by %2$s", + "entity.szar.merl": "Merl", + "item.szar.merl_spawn_egg": "Merl Spawn Egg" } diff --git a/src/main/resources/assets/szar/models/item/atom.json b/src/main/resources/assets/szar/models/item/atom.json index 7cd6595..ae90642 100644 --- a/src/main/resources/assets/szar/models/item/atom.json +++ b/src/main/resources/assets/szar/models/item/atom.json @@ -1,179 +1,6 @@ { - "format_version": "1.21.11", - "credit": "Made with Blockbench", - "texture_size": [64, 64], - "textures": { - "0": "szar:item/nuke" - }, - "elements": [ - { - "from": [6, 17, 6], - "to": [10, 19, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 8]}, - "faces": { - "north": {"uv": [9, 4.75, 10, 5.25], "texture": "#0"}, - "east": {"uv": [8, 4.75, 9, 5.25], "texture": "#0"}, - "south": {"uv": [11, 4.75, 12, 5.25], "texture": "#0"}, - "west": {"uv": [10, 4.75, 11, 5.25], "texture": "#0"}, - "up": {"uv": [10, 4.75, 9, 3.75], "texture": "#0"}, - "down": {"uv": [11, 3.75, 10, 4.75], "texture": "#0"} - } - }, - { - "from": [5, 15, 5], - "to": [11, 17, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, - "faces": { - "north": {"uv": [1.5, 9, 3, 9.5], "texture": "#0"}, - "east": {"uv": [0, 9, 1.5, 9.5], "texture": "#0"}, - "south": {"uv": [4.5, 9, 6, 9.5], "texture": "#0"}, - "west": {"uv": [3, 9, 4.5, 9.5], "texture": "#0"}, - "up": {"uv": [3, 9, 1.5, 7.5], "texture": "#0"}, - "down": {"uv": [4.5, 7.5, 3, 9], "texture": "#0"} - } - }, - { - "from": [4, 9, 4], - "to": [12, 16, 12], - "rotation": {"x": 0, "y": 0, "z": -180, "origin": [8, 12, 8]}, - "faces": { - "north": {"uv": [2, 5.75, 4, 7.5], "texture": "#0"}, - "east": {"uv": [0, 5.75, 2, 7.5], "texture": "#0"}, - "south": {"uv": [6, 5.75, 8, 7.5], "texture": "#0"}, - "west": {"uv": [4, 5.75, 6, 7.5], "texture": "#0"}, - "up": {"uv": [4, 5.75, 2, 3.75], "texture": "#0"}, - "down": {"uv": [6, 3.75, 4, 5.75], "texture": "#0"} - } - }, - { - "from": [7, 19, 7], - "to": [9, 20, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 19, 8]}, - "faces": { - "north": {"uv": [9.5, 10.75, 10, 11], "texture": "#0"}, - "east": {"uv": [9, 10.75, 9.5, 11], "texture": "#0"}, - "south": {"uv": [10.5, 10.75, 11, 11], "texture": "#0"}, - "west": {"uv": [10, 10.75, 10.5, 11], "texture": "#0"}, - "up": {"uv": [10, 10.75, 9.5, 10.25], "texture": "#0"}, - "down": {"uv": [10.5, 10.25, 10, 10.75], "texture": "#0"} - } - }, - { - "from": [5, 7, 5], - "to": [11, 9, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]}, - "faces": { - "north": {"uv": [7.5, 9, 9, 9.5], "texture": "#0"}, - "east": {"uv": [6, 9, 7.5, 9.5], "texture": "#0"}, - "south": {"uv": [10.5, 9, 12, 9.5], "texture": "#0"}, - "west": {"uv": [9, 9, 10.5, 9.5], "texture": "#0"}, - "up": {"uv": [9, 9, 7.5, 7.5], "texture": "#0"}, - "down": {"uv": [10.5, 7.5, 9, 9], "texture": "#0"} - } - }, - { - "from": [6, 5, 6], - "to": [10, 7, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 5, 8]}, - "faces": { - "north": {"uv": [9, 6.25, 10, 6.75], "texture": "#0"}, - "east": {"uv": [8, 6.25, 9, 6.75], "texture": "#0"}, - "south": {"uv": [11, 6.25, 12, 6.75], "texture": "#0"}, - "west": {"uv": [10, 6.25, 11, 6.75], "texture": "#0"}, - "up": {"uv": [10, 6.25, 9, 5.25], "texture": "#0"}, - "down": {"uv": [11, 5.25, 10, 6.25], "texture": "#0"} - } - }, - { - "from": [7, 4, 7], - "to": [9, 5, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]}, - "faces": { - "north": {"uv": [11, 7.25, 11.5, 7.5], "texture": "#0"}, - "east": {"uv": [10.5, 7.25, 11, 7.5], "texture": "#0"}, - "south": {"uv": [12, 7.25, 12.5, 7.5], "texture": "#0"}, - "west": {"uv": [11.5, 7.25, 12, 7.5], "texture": "#0"}, - "up": {"uv": [11.5, 7.25, 11, 6.75], "texture": "#0"}, - "down": {"uv": [12, 6.75, 11.5, 7.25], "texture": "#0"} - } - }, - { - "from": [5, 3, 5], - "to": [6, 7, 6], - "rotation": {"angle": 0, "axis": "y", "origin": [5, 3, 6]}, - "faces": { - "north": {"uv": [0.25, 11, 0.5, 12], "texture": "#0"}, - "east": {"uv": [0, 11, 0.25, 12], "texture": "#0"}, - "south": {"uv": [0.75, 11, 1, 12], "texture": "#0"}, - "west": {"uv": [0.5, 11, 0.75, 12], "texture": "#0"}, - "up": {"uv": [0.5, 11, 0.25, 10.75], "texture": "#0"}, - "down": {"uv": [0.75, 10.75, 0.5, 11], "texture": "#0"} - } - }, - { - "from": [10, 3, 10], - "to": [11, 7, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 3, 11]}, - "faces": { - "north": {"uv": [2.25, 11, 2.5, 12], "texture": "#0"}, - "east": {"uv": [2, 11, 2.25, 12], "texture": "#0"}, - "south": {"uv": [2.75, 11, 3, 12], "texture": "#0"}, - "west": {"uv": [2.5, 11, 2.75, 12], "texture": "#0"}, - "up": {"uv": [2.5, 11, 2.25, 10.75], "texture": "#0"}, - "down": {"uv": [2.75, 10.75, 2.5, 11], "texture": "#0"} - } - }, - { - "from": [10, 3, 5], - "to": [11, 7, 6], - "rotation": {"angle": 0, "axis": "y", "origin": [10, 3, 6]}, - "faces": { - "north": {"uv": [1.25, 11, 1.5, 12], "texture": "#0"}, - "east": {"uv": [1, 11, 1.25, 12], "texture": "#0"}, - "south": {"uv": [1.75, 11, 2, 12], "texture": "#0"}, - "west": {"uv": [1.5, 11, 1.75, 12], "texture": "#0"}, - "up": {"uv": [1.5, 11, 1.25, 10.75], "texture": "#0"}, - "down": {"uv": [1.75, 10.75, 1.5, 11], "texture": "#0"} - } - }, - { - "from": [5, 3, 10], - "to": [6, 7, 11], - "rotation": {"angle": 0, "axis": "y", "origin": [5, 3, 11]}, - "faces": { - "north": {"uv": [3.25, 11, 3.5, 12], "texture": "#0"}, - "east": {"uv": [3, 11, 3.25, 12], "texture": "#0"}, - "south": {"uv": [3.75, 11, 4, 12], "texture": "#0"}, - "west": {"uv": [3.5, 11, 3.75, 12], "texture": "#0"}, - "up": {"uv": [3.5, 11, 3.25, 10.75], "texture": "#0"}, - "down": {"uv": [3.75, 10.75, 3.5, 11], "texture": "#0"} - } - }, - { - "from": [2, 0, 2], - "to": [14, 3, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [3, 3, 6, 3.75], "texture": "#0"}, - "east": {"uv": [0, 3, 3, 3.75], "texture": "#0"}, - "south": {"uv": [9, 3, 12, 3.75], "texture": "#0"}, - "west": {"uv": [6, 3, 9, 3.75], "texture": "#0"}, - "up": {"uv": [6, 3, 3, 0], "texture": "#0"}, - "down": {"uv": [9, 0, 6, 3], "texture": "#0"} - } - }, - { - "from": [6, 3, 6], - "to": [10, 4, 10], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 3, 8]}, - "faces": { - "north": {"uv": [1, 10.5, 2, 10.75], "texture": "#0"}, - "east": {"uv": [0, 10.5, 1, 10.75], "texture": "#0"}, - "south": {"uv": [3, 10.5, 4, 10.75], "texture": "#0"}, - "west": {"uv": [2, 10.5, 3, 10.75], "texture": "#0"}, - "up": {"uv": [2, 10.5, 1, 9.5], "texture": "#0"}, - "down": {"uv": [3, 9.5, 2, 10.5], "texture": "#0"} - } - } - ] -} \ No newline at end of file + "parent": "minecraft:item/generated", + "textures": { + "layer0": "szar:item/atom" + } +} diff --git a/src/main/resources/assets/szar/models/item/merl_spawn_egg.json b/src/main/resources/assets/szar/models/item/merl_spawn_egg.json new file mode 100644 index 0000000..ddd1559 --- /dev/null +++ b/src/main/resources/assets/szar/models/item/merl_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} diff --git a/src/main/resources/assets/szar/sounds.json b/src/main/resources/assets/szar/sounds.json index 16b3f35..96163cf 100644 --- a/src/main/resources/assets/szar/sounds.json +++ b/src/main/resources/assets/szar/sounds.json @@ -50,5 +50,13 @@ "stream": true } ] + }, + "merl": { + "sounds": [ + { + "name": "szar:merl", + "stream": true + } + ] } } diff --git a/src/main/resources/assets/szar/sounds/merl.ogg b/src/main/resources/assets/szar/sounds/merl.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0f347961779b2d8daf0a32c4e76a61ec79801514 GIT binary patch literal 14941 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 iq}#Bc3;okne=I*egy~}8GPCob;=*}fi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/szar/textures/item/nuke.png b/src/main/resources/assets/szar/textures/item/nuke.png deleted file mode 100644 index 691a3993426df4c81651e82c5ba53adb74df220d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911L)MWvCLk0%s|DG<6Ar*7p+>P~C;sV`4SNqajb3H+QHSipAvbBu|odi<2~a~eF&udm*%VhsIOcZtPe z7K4W{Lnf1gFT)bf1{1~!Y7B!xaQ9D!e}8MDVlHoQue|Hp|NZ*ky81g?`#S5Gh;(2= z()GI9{}IXi=SAyI7)WuF<(y#4!or|vg7U`X7$!0_*1UFp(0 z-{Zygj{ovW+G+JYYRcY=?{=M-vG#mR*mC>5Gv8HJ{s^9Z+y6|R!fWHT!Hj!+zQ65> z&-;I(XYKhXeQX7fZftvf*La&<@dl|Kci(Mj=c&_qZQOa7vBx&!=D$t1KWFy+W4U47 zV{0q_@BgE{>^85B*`Lo}ep~i=+O*sJ+yBR10 zC|kNSYX151ABG2R2hUhO|EWavsms64v>cpJ_9b$`-R5f>jpycXmpS+A%)ynyiOy=@ zC%%lDe{!y+@SeH%p9S8%_xa9ketWxEpqoGIx8M6z^*8hSbFVfwhWJT)=R;D$wDbJj zYENo=mp#3w4o)CjzAmj}uiZ2MdT9N>Z(`0jyeUXL)9S_MJo?+Z&+M`)dgA+B-sHLY z`(%7+abL&r-^&AU@4i-fdM`#Iem3iYwDGr}|2AelXMgh-lCYl{GGq?o6i-ej-0~k- n5d8oDd!1J-kiiBj3YZxdbngTe~DWM4fQUaSA