[READ-ONLY] Mirror of https://github.com/aaronateataco/pets-and-pals. Pets & Pals — client-side companion pets with real presence. Fork/redesign of downloadableduck's Pets Mod.
0

Configure Feed

Select the types of activity you want to include in your feed.

Pet volume setting, Pets&Pals rename, Xaero radar icons, icon prompt

- new 'Pet Volume' config slider (0-1, 0 = muted); applied to every pet sound
including the legacy custom mobs' ambient/step sounds (boxed Float so old
configs default to full volume instead of muted)
- display branding renamed Pets & Pals -> Pets&Pals (mod id/slug unchanged)
- Phase 2 (Xaero's Minimap): ship radar icon definitions for all 100 pet
entity types (assets/xaerominimap/entity/icon/definition/pets-and-pals/,
model-rendered icons; works from inside the mod jar, no resource pack)
- ICON_PROMPT.md: ready-to-paste ChatGPT prompt for the mod icon (baby chicken
in Friends & Foes / Villages & Pillages icon style) + title logo follow-up

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

aaronateataco (Jul 10, 2026, 4:30 PM +0100) 686ce957 f2742d80

+609 -40
+49
ICON_PROMPT.md
··· 1 + # Pets&Pals — mod icon generation prompt 2 + 3 + Paste the prompt below into ChatGPT (with image generation) **together with three attachments**: 4 + 1. your baby chicken photo (the subject), 5 + 2. the Friends & Foes mod icon (primary style reference), 6 + 3. the Villages & Pillages mod icon (secondary style reference). 7 + 8 + When you get a result you like, downscale/export it as a square PNG and replace 9 + `src/main/resources/assets/pets-and-pals/icon.png` (and use the big version for the Modrinth page). 10 + 11 + --- 12 + 13 + ## Prompt 14 + 15 + Create a square 1024x1024 Minecraft mod icon for a mod called "Pets&Pals". 16 + 17 + **Subject:** a baby chicken (chick), based on the attached chick photo, but redesigned as a 18 + cute *Minecraft-style* creature — blocky/cuboid head and body like an official Minecraft mob, 19 + NOT a realistic bird. Big head, small body, tiny blocky wings, simple dot eyes, small flat 20 + beak. It should read instantly as "adorable Minecraft pet". Front-facing bust (head and upper 21 + body), centered, looking slightly toward the viewer. 22 + 23 + **Style — match the two attached mod icons (Friends & Foes, Villages & Pillages):** 24 + - soft, high-quality 3D render of a blocky Minecraft-style model with gentle painterly 25 + shading and subtle ambient occlusion — the "modern Minecraft marketing art" look 26 + - warm, saturated but not neon colors; soft studio lighting from the upper left 27 + - the mob fills most of the frame, slightly cropped at the bottom like a portrait bust 28 + - simple rounded-square background in a single soft color (a warm pastel yellow-orange that 29 + compliments the chick) with a very subtle radial glow behind the subject 30 + - crisp silhouette; a faint darker outline or rim light so it pops as a small icon 31 + - NO text, NO watermark, NO border frame, nothing else in the scene 32 + 33 + **Mood:** friendly, loyal companion — like a Fortnite pet/back-bling portrait but Minecraft. 34 + 35 + The icon must stay readable at 64x64: bold shapes, high contrast between subject and 36 + background, no fine details that disappear when scaled down. 37 + 38 + --- 39 + 40 + ## Variations worth asking for in the same chat 41 + - "Same icon but the chick has a tiny red collar" (pet identity) 42 + - "Same icon but add a small heart particle floating beside its head" 43 + - "Same style but zoomed out enough to show its little feet" 44 + 45 + ## Also needed later, same style (title screen art) 46 + - a wide "Pets&Pals" logo/wordmark texture to replace 47 + `assets/pets-and-pals/textures/title/petsmod.png` and `modpets.png` 48 + (the in-game custom title screen). Ask: "Using the same style, render the text 49 + 'Pets&Pals' as a Minecraft-style logo with the chick perched on the ampersand."
+5 -5
README.md
··· 1 - # Pets & Pals 1 + # Pets&Pals 2 2 3 - **Pets & Pals** brings your own client-side companions into your game — pets with real presence that walk at your side, react to the world, and follow you anywhere. From squids to iron golems to even penguins, Pets & Pals offers nearly every mob from vanilla Minecraft, and more! And it works no matter whether you are on a multiplayer server or your own singleplayer world. 3 + **Pets&Pals** brings your own client-side companions into your game — pets with real presence that walk at your side, react to the world, and follow you anywhere. From squids to iron golems to even penguins, Pets&Pals offers nearly every mob from vanilla Minecraft, and more! And it works no matter whether you are on a multiplayer server or your own singleplayer world. 4 4 5 - Pets & Pals comes with its own configuration screen **and** custom commands to easily toggle between pets, change whether the mod is enabled at all, and switch up the appearance of your pets with **skins** and **names**. 5 + Pets&Pals comes with its own configuration screen **and** custom commands to easily toggle between pets, change whether the mod is enabled at all, and switch up the appearance of your pets with **skins** and **names**. 6 6 7 - > **Pets & Pals is a fork of [Pets Mod](https://github.com/downloadableduck/petsmod) by downloadableduck and The Pets Team** — full credit to them for the original mod this project is built on (which itself grew out of [DuckMod](https://modrinth.com/mod/duck--mod)). This fork is a ground-up redesign: real pathfinding-driven movement and animation, minimap compatibility, a proper addon API, a new companion-catalog UI, multi-version support, and opt-in networked pet visibility. 7 + > **Pets&Pals is a fork of [Pets Mod](https://github.com/downloadableduck/petsmod) by downloadableduck and The Pets Team** — full credit to them for the original mod this project is built on (which itself grew out of [DuckMod](https://modrinth.com/mod/duck--mod)). This fork is a ground-up redesign: real pathfinding-driven movement and animation, minimap compatibility, a proper addon API, a new companion-catalog UI, multi-version support, and opt-in networked pet visibility. 8 8 9 9 ## Features 10 10 - Almost EVERY vanilla Minecraft mob ··· 44 44 No, and they never will be! This mod will forever remain free for everyone to use. 45 45 46 46 **How does this relate to the original Pets Mod?** 47 - Pets & Pals started as a full redesign of Pets Mod (CC0-licensed) and is published as its own standalone mod, with credit to the original. Existing Pets Mod addons target the original mod's `pets-mod` id; a compatibility layer and a proper addon API are part of the roadmap (Phase 4). 47 + Pets&Pals started as a full redesign of Pets Mod (CC0-licensed) and is published as its own standalone mod, with credit to the original. Existing Pets Mod addons target the original mod's `pets-mod` id; a compatibility layer and a proper addon API are part of the roadmap (Phase 4). 48 48 49 49 **How can I contribute?** 50 50 Play the mod! If you have an issue, please report it on GitHub — we look forward to making this mod the best - and clearest of bugs - that it can be!
+1 -1
gradle.properties
··· 12 12 loom_version=1.14-SNAPSHOT 13 13 14 14 # Mod Properties 15 - mod_version=0.8.4 15 + mod_version=0.9.0 16 16 maven_group=io.github.aaronateataco.petsandpals 17 17 archives_base_name=pets-and-pals 18 18
+12 -10
src/client/java/io/github/aaronateataco/petsandpals/Central.java
··· 813 813 client.getResourcePackRepository().addPack("file/headpack"); 814 814 options.save(); 815 815 client.reloadResourcePacks(); 816 - //client.player.sendSystemMessage(Component.literal("§b[Pets & Pals] §aSorry for the interruption, the head pet requires a custom resource pack to work correctly and we loaded a pack for you. This will not affect anything except the head texture.")); 816 + //client.player.sendSystemMessage(Component.literal("§b[Pets&Pals] §aSorry for the interruption, the head pet requires a custom resource pack to work correctly and we loaded a pack for you. This will not affect anything except the head texture.")); 817 817 }*/ 818 818 } 819 819 ··· 850 850 851 851 // Configs from before the setting existed deserialize petSpeed as 0. 852 852 if (CONFIG.petSpeed <= 0.0f) CONFIG.petSpeed = 1.0f; 853 + if (CONFIG.petVolume == null) CONFIG.petVolume = 1.0f; 853 854 AbstractPet.speedMultiplier = () -> CONFIG.petSpeed; 855 + AbstractPet.soundVolume = () -> CONFIG.petVolume; 854 856 855 857 this.createPetSkinCommand(); 856 858 this.checkForNullObjects(); ··· 1550 1552 } 1551 1553 1552 1554 if (isValid) { 1553 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §aYour pet's skin has been updated.")); 1555 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §aYour pet's skin has been updated.")); 1554 1556 } else { 1555 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §cEither your currently selected pet doesn't support multiple skins, or that is not a valid skin. Try something else.")); 1557 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §cEither your currently selected pet doesn't support multiple skins, or that is not a valid skin. Try something else.")); 1556 1558 } 1557 1559 AutoConfig.getConfigHolder(PetsConfig.class).save(); 1558 1560 ··· 2023 2025 void createPetHelpCommand() { 2024 2026 ClientCommandRegistrationCallback.EVENT.register(((dispatcher, registryAccess) -> dispatcher.register(ClientCommands.literal("pethelp").executes(context -> { 2025 2027 context.getSource().getPlayer().sendSystemMessage(Component.literal(""" 2026 - §b[Pets & Pals] §aPossible commands:\ 2028 + §b[Pets&Pals] §aPossible commands:\ 2027 2029 2028 2030 §a/pethelp: §rdisplays a list of commands\ 2029 2031 ··· 2165 2167 String preference = StringArgumentType.getString(context, "preference"); 2166 2168 if (Objects.equals(preference, "off")) { 2167 2169 CONFIG.petOn = false; 2168 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §7Pet §coff.")); 2170 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §7Pet §coff.")); 2169 2171 AutoConfig.getConfigHolder(PetsConfig.class).save(); 2170 2172 } else if (Objects.equals(preference, "on")) { 2171 2173 CONFIG.petOn = true; 2172 2174 AutoConfig.getConfigHolder(PetsConfig.class).save(); 2173 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §7Pet §aon.")); 2175 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §7Pet §aon.")); 2174 2176 } else { 2175 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §c§lUnknown value " + preference + "! Possible values: §r§aon, §6off")); 2177 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §c§lUnknown value " + preference + "! Possible values: §r§aon, §6off")); 2176 2178 } 2177 2179 2178 2180 return 1; ··· 2227 2229 2228 2230 public void checkValidPet(boolean isValid, CommandContext<FabricClientCommandSource> context, String species) { 2229 2231 if (!isValid) { 2230 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §cThat's not a pet that's currently supported. Try something else. (Unknown input \"" + species + "\")")); 2232 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §cThat's not a pet that's currently supported. Try something else. (Unknown input \"" + species + "\")")); 2231 2233 } else if (isValid && CONFIG.petOn) { 2232 2234 despawnPet(); 2233 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §aYour active pet has been switched to " + CONFIG.activePet.replace("_", " ") + ".")); 2235 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §aYour active pet has been switched to " + CONFIG.activePet.replace("_", " ") + ".")); 2234 2236 summonPet(); 2235 2237 } else if (isValid && !CONFIG.petOn) { 2236 - context.getSource().sendFeedback(Component.literal("§b[Pets & Pals] §cYour pet has been switched to " + CONFIG.activePet.replace("_", " ") + ", but you currently do not have your pet enabled. Run §l/pet on§r§c to change this.")); 2238 + context.getSource().sendFeedback(Component.literal("§b[Pets&Pals] §cYour pet has been switched to " + CONFIG.activePet.replace("_", " ") + ", but you currently do not have your pet enabled. Run §l/pet on§r§c to change this.")); 2237 2239 } 2238 2240 } 2239 2241 }
+1 -1
src/client/java/io/github/aaronateataco/petsandpals/PetsClientInitializer.java
··· 406 406 ModelLayerRegistry.registerModelLayer(StingrayRenderer.STINGRAY_LOCATION, StingrayModel::createBodyLayer); 407 407 408 408 ClientLifecycleEvents.CLIENT_STARTED.register((mc) -> { 409 - LOGGER.info("Pets & Pals addons loaded:{}", ADDONS); 409 + LOGGER.info("Pets&Pals addons loaded:{}", ADDONS); 410 410 }); 411 411 } 412 412
+1
src/client/java/io/github/aaronateataco/petsandpals/PetsConfig.java
··· 19 19 public Boolean customTitleEnabled; 20 20 public String activePet; 21 21 public float petSpeed = 1.0f; 22 + public Float petVolume = 1.0f; 22 23 public String penguinName; 23 24 public String duckName; 24 25 public String racoonName;
+13 -3
src/client/java/io/github/aaronateataco/petsandpals/PetsConfigScreen.java
··· 58 58 * {@code Option}, this will not generate a {@code ClassCastException}. 59 59 * <p> {@code Baby?}: Uses a {@code TickBoxControllerBuilder} to let the user decide 60 60 * whether their pet is a baby or not. 61 - * <p> {@code Custom Title Enabled}: Controls whether the game will use the custom Pets & Pals title, edition, and splash text. 61 + * <p> {@code Custom Title Enabled}: Controls whether the game will use the custom Pets&Pals title, edition, and splash text. 62 62 * Please note that the splash text is only initialized once, during the game launch, so 63 63 * it will require a restart to change, but everything else will adjust instantly. (Note: a restart 64 64 * is not forced upon the user, as it is only splash text and won't impact gameplay severely.) ··· 107 107 .range(0.25f, 3.0f) 108 108 .step(0.05f)) 109 109 .build()) 110 + .option(Option.<Float>createBuilder() 111 + .name(Component.literal("Pet Volume")) 112 + .description(OptionDescription.of(Component.literal("Volume of all pet sounds (quacks, buzzes, ambient noises). 0 mutes your pet entirely."))) 113 + .binding(1.0f, 114 + () -> CONFIG.petVolume == null ? 1.0f : CONFIG.petVolume, 115 + newVal -> CONFIG.petVolume = newVal) 116 + .controller(opt -> FloatSliderControllerBuilder.create(opt) 117 + .range(0.0f, 1.0f) 118 + .step(0.05f)) 119 + .build()) 110 120 .build()) 111 121 .group(OptionGroup.createBuilder() 112 122 .name(Component.literal("Active Pet")) ··· 123 133 } catch (IllegalArgumentException e) { 124 134 assert Minecraft.getInstance().player != null; 125 135 if (!hasPrintedMessage) { 126 - Minecraft.getInstance().player.sendSystemMessage(Component.literal("§b[Pets & Pals] §cWe ran into an error and couldn't generate your config screen. Please report this stacktrace on my GitHub§r: " + e.getMessage() + ". §cThis is usually caused by tampering with the config JSON or a logic error in the code. §aIn the" + 136 + Minecraft.getInstance().player.sendSystemMessage(Component.literal("§b[Pets&Pals] §cWe ran into an error and couldn't generate your config screen. Please report this stacktrace on my GitHub§r: " + e.getMessage() + ". §cThis is usually caused by tampering with the config JSON or a logic error in the code. §aIn the" + 127 137 " meantime, try using the /pet commands.")); 128 138 Minecraft.getInstance().player.sendSystemMessage(Component.literal("§aRecommended course of action: run /petspecies and choose a valid option from the suggestions.")); 129 139 hasPrintedMessage = true; ··· 423 433 } catch (IllegalArgumentException e) { 424 434 assert Minecraft.getInstance().player != null; 425 435 if (!hasPrintedMessage) { 426 - Minecraft.getInstance().player.sendSystemMessage(Component.literal("§b[Pets & Pals] §cWe ran into an error and couldn't generate your config screen. Please report this stacktrace on my GitHub§r: " + e.getMessage() + ". §cThis is usually caused by tampering with the config JSON or a logic error in the code. §aIn the" + 436 + Minecraft.getInstance().player.sendSystemMessage(Component.literal("§b[Pets&Pals] §cWe ran into an error and couldn't generate your config screen. Please report this stacktrace on my GitHub§r: " + e.getMessage() + ". §cThis is usually caused by tampering with the config JSON or a logic error in the code. §aIn the" + 427 437 " meantime, try using the /pet commands.")); 428 438 Minecraft.getInstance().player.sendSystemMessage(Component.literal("§aRecommended course of action: run /petskin and choose a valid option from the suggestions.")); 429 439 hasPrintedMessage = true;
+9 -2
src/main/java/io/github/aaronateataco/petsandpals/mob/AbstractPet.java
··· 62 62 public static DoubleSupplier speedMultiplier = () -> 1.0; 63 63 64 64 /** 65 + * The user-adjustable pet sound volume ("Pet Volume" in the config screen, 0 = muted). 66 + * Applied to every sound the pets play; wired to the config in {@code Central}. 67 + */ 68 + public static DoubleSupplier soundVolume = () -> 1.0; 69 + 70 + /** 65 71 * @deprecated Only used by the bundled custom mobs' legacy tick logic; the goal-driven 66 72 * movement classes no longer touch it. 67 73 */ ··· 183 189 this.tickPerched(); 184 190 } 185 191 186 - if (this.random.nextInt(60 * 20) == 0 && this.getAmbientSound() != null) { 187 - this.level().playLocalSound(this, this.getAmbientSound(), SoundSource.NEUTRAL, 1.0f, 1.0f); 192 + float volume = (float) soundVolume.getAsDouble(); 193 + if (volume > 0.0f && this.random.nextInt(60 * 20) == 0 && this.getAmbientSound() != null) { 194 + this.level().playLocalSound(this, this.getAmbientSound(), SoundSource.NEUTRAL, volume, 1.0f); 188 195 } 189 196 } 190 197
+1 -1
src/main/java/io/github/aaronateataco/petsandpals/mob/aprilfools/MoonCow.java
··· 129 129 130 130 int ambient = (int) (Math.random() * (60 * 20)); 131 131 if (ambient == 1) { 132 - level().playLocalSound(this, SoundEvents.COW_SOUNDS.get(CowSoundVariants.SoundSet.CLASSIC).ambientSound().value(), SoundSource.AMBIENT, 1.0f, 1.0f); 132 + level().playLocalSound(this, SoundEvents.COW_SOUNDS.get(CowSoundVariants.SoundSet.CLASSIC).ambientSound().value(), SoundSource.AMBIENT, (float) soundVolume.getAsDouble(), 1.0f); 133 133 } 134 134 } 135 135 }
+2 -2
src/main/java/io/github/aaronateataco/petsandpals/mob/custom/aprilfools/Head.java
··· 238 238 } 239 239 240 240 /*if (this.walkAnimation.isMoving()) { 241 - level().playLocalSound(this, SoundEvents., SoundSource.NEUTRAL, 1.0f, 1.0f); 241 + level().playLocalSound(this, SoundEvents., SoundSource.NEUTRAL, (float) soundVolume.getAsDouble(), 1.0f); 242 242 }*/ 243 243 244 244 /*int ambient = (int) (Math.random() * (60 * 20)); 245 245 if (ambient == 1) { 246 - level().playLocalSound(this, PetsSounds.PENGUIN_AMBIENT, SoundSource.NEUTRAL, 1.0f, 1.0f); 246 + level().playLocalSound(this, PetsSounds.PENGUIN_AMBIENT, SoundSource.NEUTRAL, (float) soundVolume.getAsDouble(), 1.0f); 247 247 }*/ 248 248 } 249 249
+2 -2
src/main/java/io/github/aaronateataco/petsandpals/mob/custom/aquatic/DumboOctopus.java
··· 109 109 } 110 110 111 111 protected void playStepSound(final @NotNull BlockPos pos, final @NotNull BlockState blockState) { 112 - this.playSound(SoundEvents.CHICKEN_STEP.value(), 0.15F, 1.0F); 112 + this.playSound(SoundEvents.CHICKEN_STEP.value(), 0.15F * (float) soundVolume.getAsDouble(), 1.0F); 113 113 } 114 114 115 115 public @Nullable DumboOctopus getBreedOffspring(final @NotNull ServerLevel level, final @NotNull AgeableMob partner) { ··· 233 233 234 234 int ambient = (int) (Math.random() * (60 * 20)); 235 235 if (ambient == 1) { 236 - level().playLocalSound(this, SoundEvents.SQUID_AMBIENT, SoundSource.AMBIENT, 1.0f, 1.0f); 236 + level().playLocalSound(this, SoundEvents.SQUID_AMBIENT, SoundSource.AMBIENT, (float) soundVolume.getAsDouble(), 1.0f); 237 237 } 238 238 } 239 239
+2 -2
src/main/java/io/github/aaronateataco/petsandpals/mob/custom/aquatic/Koi.java
··· 87 87 } 88 88 89 89 protected void playStepSound(final @NotNull BlockPos pos, final @NotNull BlockState blockState) { 90 - this.playSound(SoundEvents.FISH_SWIM, 0.15F, 1.0F); 90 + this.playSound(SoundEvents.FISH_SWIM, 0.15F * (float) soundVolume.getAsDouble(), 1.0F); 91 91 } 92 92 93 93 public @Nullable Koi getBreedOffspring(final @NotNull ServerLevel level, final @NotNull AgeableMob partner) { ··· 237 237 238 238 int ambient = (int) (Math.random() * (60 * 20)); 239 239 if (ambient == 1) { 240 - level().playLocalSound(this, SoundEvents.SQUID_AMBIENT, SoundSource.AMBIENT, 1.0f, 1.0f); 240 + level().playLocalSound(this, SoundEvents.SQUID_AMBIENT, SoundSource.AMBIENT, (float) soundVolume.getAsDouble(), 1.0f); 241 241 } 242 242 } 243 243 }
+2 -2
src/main/java/io/github/aaronateataco/petsandpals/mob/custom/aquatic/Stingray.java
··· 101 101 } 102 102 103 103 protected void playStepSound(final @NotNull BlockPos pos, final @NotNull BlockState blockState) { 104 - this.playSound(SoundEvents.FISH_SWIM, 0.15F, 1.0F); 104 + this.playSound(SoundEvents.FISH_SWIM, 0.15F * (float) soundVolume.getAsDouble(), 1.0F); 105 105 } 106 106 107 107 public @Nullable Stingray getBreedOffspring(final @NotNull ServerLevel level, final @NotNull AgeableMob partner) { ··· 251 251 252 252 int ambient = (int) (Math.random() * (60 * 20)); 253 253 if (ambient == 1) { 254 - level().playLocalSound(this, SoundEvents.SQUID_AMBIENT, SoundSource.AMBIENT, 1.0f, 1.0f); 254 + level().playLocalSound(this, SoundEvents.SQUID_AMBIENT, SoundSource.AMBIENT, (float) soundVolume.getAsDouble(), 1.0f); 255 255 } 256 256 } 257 257 }
+3 -3
src/main/java/io/github/aaronateataco/petsandpals/mob/custom/first/Duck.java
··· 132 132 } 133 133 134 134 protected void playStepSound(final @NotNull BlockPos pos, final @NotNull BlockState blockState) { 135 - this.playSound(SoundEvents.CHICKEN_STEP.value(), 0.15F, 1.0F); 135 + this.playSound(SoundEvents.CHICKEN_STEP.value(), 0.15F * (float) soundVolume.getAsDouble(), 1.0F); 136 136 } 137 137 138 138 public @Nullable Duck getBreedOffspring(final @NotNull ServerLevel level, final @NotNull AgeableMob partner) { ··· 259 259 } 260 260 261 261 /*if (this.walkAnimation.isMoving()) { 262 - level().playLocalSound(this, SoundEvents.CHICKEN_STEP, SoundSource.NEUTRAL, 1.0f, 1.0f); 262 + level().playLocalSound(this, SoundEvents.CHICKEN_STEP, SoundSource.NEUTRAL, (float) soundVolume.getAsDouble(), 1.0f); 263 263 }*/ 264 264 265 265 int ambient = (int) (Math.random() * (60 * 20)); 266 266 if (ambient == 1) { 267 - level().playLocalSound(this, PetsSounds.DUCK_AMBIENT, SoundSource.NEUTRAL, 1.0f, 1.0f); 267 + level().playLocalSound(this, PetsSounds.DUCK_AMBIENT, SoundSource.NEUTRAL, (float) soundVolume.getAsDouble(), 1.0f); 268 268 } 269 269 } 270 270
+3 -3
src/main/java/io/github/aaronateataco/petsandpals/mob/custom/first/Penguin.java
··· 117 117 } 118 118 119 119 protected void playStepSound(final @NotNull BlockPos pos, final @NotNull BlockState blockState) { 120 - this.playSound(SoundEvents.CHICKEN_STEP.value(), 0.15F, 1.0F); 120 + this.playSound(SoundEvents.CHICKEN_STEP.value(), 0.15F * (float) soundVolume.getAsDouble(), 1.0F); 121 121 } 122 122 123 123 public @Nullable Penguin getBreedOffspring(final @NotNull ServerLevel level, final @NotNull AgeableMob partner) { ··· 242 242 } 243 243 244 244 if (this.walkAnimation.isMoving()) { 245 - level().playLocalSound(this, SoundEvents.CHICKEN_STEP.value(), SoundSource.NEUTRAL, 1.0f, 1.0f); 245 + level().playLocalSound(this, SoundEvents.CHICKEN_STEP.value(), SoundSource.NEUTRAL, (float) soundVolume.getAsDouble(), 1.0f); 246 246 } 247 247 248 248 int ambient = (int) (Math.random() * (60 * 20)); 249 249 if (ambient == 1) { 250 - level().playLocalSound(this, PetsSounds.PENGUIN_AMBIENT, SoundSource.NEUTRAL, 1.0f, 1.0f); 250 + level().playLocalSound(this, PetsSounds.PENGUIN_AMBIENT, SoundSource.NEUTRAL, (float) soundVolume.getAsDouble(), 1.0f); 251 251 } 252 252 } 253 253
+1 -1
src/main/java/io/github/aaronateataco/petsandpals/mob/custom/first/Racoon.java
··· 187 187 188 188 /*int ambient = (int) (Math.random() * (60 * 20)); 189 189 if (ambient == 1) { 190 - level().playLocalSound(this, SoundEvents.BOGGED_AMBIENT, SoundSource.AMBIENT, 1.0f, 1.0f); 190 + level().playLocalSound(this, SoundEvents.BOGGED_AMBIENT, SoundSource.AMBIENT, (float) soundVolume.getAsDouble(), 1.0f); 191 191 }*/ 192 192 } 193 193
+1 -1
src/main/resources/assets/pets-and-pals/lang/en_us.json
··· 8 8 "entity.pets-and-pals.head": "Floating Head", 9 9 "sound.pets-and-pals.duck_ambient": "Duck Quacks", 10 10 "sound.pets-and-pals.penguin_ambient": "Penguin Chirps", 11 - "key.category.pets-and-pals.petsandpals.keymapping": "Pets & Pals" 11 + "key.category.pets-and-pals.petsandpals.keymapping": "Pets&Pals" 12 12 }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/batato.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientallay.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientarmadillo.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientaxolotl.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientbat.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientbee.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientblaze.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientbogged.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientbreeze.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcamel.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcat.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcavespider.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientchicken.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcod.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcoppergolem.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcow.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcreaking.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientcreeper.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientdolphin.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientdonkey.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientdrowned.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientelderguardian.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientenderdragon.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientenderman.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientendermite.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientevoker.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientfox.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientfrog.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientghast.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientgoat.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientguardian.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clienthappyghast.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clienthoglin.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clienthorse.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clienthusk.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientirongolem.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientllama.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientmagmacube.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientmooshroom.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientnautilus.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientpanda.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientparched.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientparrot.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientphantom.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientpig.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientpiglin.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientpillager.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientpolarbear.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientpufferfish.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientrabbit.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientravager.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientsalmon.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientsheep.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientshulker.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientsilverfish.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientskeleton.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientslime.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientsniffer.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientsnowgolem.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientspider.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientsquid.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientstray.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientstrider.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clienttadpole.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clienttropicalfish.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientturtle.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientvex.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientvillager.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientvindicator.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientwandeinrgtrader.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientwanderingtrader.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientwarden.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientwitch.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientwither.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientwitherskeleton.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientwolf.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientzombie.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/clientzombievillager.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/diamond_chicken.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/duck.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/dumbo_octopus.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/head.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/koi.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/love_golem.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/mega_spud.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/moon_cow.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/nerd_creeper.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/penguin.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/pink_wither.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/plaguewhale_slab.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/poisonous_potato_zombie.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/potatohusk.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/racoon.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/ray_tracing.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/redstone_bug.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/smiling_creeper.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/stingray.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/stringray.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/toxifin_slab.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+5
src/main/resources/assets/xaerominimap/entity/icon/definition/pets-and-pals/traitor.json
··· 1 + { 2 + "variants": { 3 + "default": "model" 4 + } 5 + }
+1 -1
src/main/resources/fabric.mod.json
··· 2 2 "schemaVersion": 1, 3 3 "id": "pets-and-pals", 4 4 "version": "${version}", 5 - "name": "Pets & Pals", 5 + "name": "Pets&Pals", 6 6 "accessWidener": "pets-and-pals.accesswidener", 7 7 "description": "Your client-side companion mod: pets with real presence that walk at your side. Supports every vanilla mob and works on any server. A fork of downloadableduck's Pets Mod.", 8 8 "authors": [