From 8aca2923e2f10b690ac2356a926727f7cacf9bb9 Mon Sep 17 00:00:00 2001 From: Jacob Buchanan Date: Wed, 12 Jan 2022 15:48:47 +0000 Subject: [PATCH] Update for 1.18.1 (#157) - jhbuchanan45 * Update to 1.18.1 * Optional config support for backpacks in trinkets mod back slot * Make tent blocks resistance equal obsidian's * Add new item textures and PT-BR translations by ppblitto * Update workflows for jdk 17 --- .github/workflows/check_build.yml | 4 +- .github/workflows/release.yml | 4 +- build.gradle | 9 +- gradle.properties | 17 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../campanion/block/BaseTentBlock.java | 4 +- .../campanion/block/CampanionBlocks.java | 10 +- .../campanion/block/FlareBlock.java | 2 +- .../block/RopeBridgePlanksBlock.java | 2 +- .../blockentity/LawnChairBlockEntity.java | 24 +- .../RopeBridgePlanksBlockEntity.java | 38 +-- .../RopeBridgePostBlockEntity.java | 5 +- .../blockentity/SerializableBlockEntity.java | 81 ++++++ .../blockentity/TentPartBlockEntity.java | 20 +- .../entity/GrapplingHookEntityRenderer.java | 2 +- .../client/renderer/item/FakeWorld.java | 2 +- .../campanion/config/CampanionConfig.java | 6 +- .../config/CampanionConfigManager.java | 22 ++ .../campanion/data/CampanionData.java | 4 - .../campanion/entity/GrapplingHookEntity.java | 2 +- .../campanion/item/FlareItem.java | 2 +- .../campanion/item/SkippingStoneItem.java | 2 +- .../campanion/item/SleepingBagItem.java | 4 +- .../campanion/item/SpearItem.java | 2 +- .../campanion/mixin/InvokerBlockEntity.java | 13 + .../mixin/client/MixinItemRenderer.java | 2 +- .../campanion/network/C2SOpenBackpack.java | 14 + .../campanion/network/C2SRotateHeldItem.java | 2 +- .../campanion/ropebridge/RopeBridgePlank.java | 4 +- .../assets/campanion/lang/pt_br.json | 274 ++++++++++++++++++ .../textures/item/blackened_marshmallow.png | Bin 285 -> 343 bytes .../item/blackened_marshmallow_on_a_stick.png | Bin 288 -> 272 bytes .../campanion/textures/item/camping_pack.png | Bin 2107 -> 512 bytes .../textures/item/cooked_marshmallow.png | Bin 285 -> 328 bytes .../item/cooked_marshmallow_on_a_stick.png | Bin 307 -> 282 bytes .../campanion/textures/item/day_pack.png | Bin 2144 -> 381 bytes .../campanion/textures/item/diamond_spear.png | Bin 1972 -> 361 bytes .../assets/campanion/textures/item/flare.png | Bin 300 -> 325 bytes .../campanion/textures/item/golden_spear.png | Bin 1977 -> 364 bytes .../textures/item/grappling_hook.png | Bin 1816 -> 357 bytes .../textures/item/grappling_hook_deployed.png | Bin 1736 -> 312 bytes .../campanion/textures/item/hiking_pack.png | Bin 2282 -> 499 bytes .../campanion/textures/item/iron_spear.png | Bin 1981 -> 356 bytes .../campanion/textures/item/leather_pouch.png | Bin 2003 -> 359 bytes .../textures/item/leather_tanner.png | Bin 1867 -> 350 bytes .../campanion/textures/item/marshmallow.png | Bin 266 -> 356 bytes .../textures/item/marshmallow_on_a_stick.png | Bin 298 -> 273 bytes .../assets/campanion/textures/item/mre.png | Bin 1807 -> 422 bytes .../textures/item/netherite_spear.png | Bin 350 -> 423 bytes .../assets/campanion/textures/item/rope.png | Bin 2211 -> 363 bytes .../textures/item/rope_bridge_post.png | Bin 1698 -> 421 bytes .../textures/item/skipping_stone.png | Bin 1670 -> 310 bytes .../campanion/textures/item/sleeping_bag.png | Bin 2017 -> 372 bytes .../textures/item/sleeping_bag_open.png | Bin 2004 -> 383 bytes .../campanion/textures/item/stone_spear.png | Bin 1976 -> 368 bytes .../textures/item/tanned_leather.png | Bin 2134 -> 386 bytes .../textures/item/tanned_leather_pouch.png | Bin 2095 -> 353 bytes .../textures/item/tent_bag_closed.png | Bin 1904 -> 344 bytes .../campanion/textures/item/tent_bag_open.png | Bin 1999 -> 395 bytes .../campanion/textures/item/wooden_rod.png | Bin 2021 -> 305 bytes .../campanion/textures/item/wooden_spear.png | Bin 1983 -> 362 bytes .../campanion/textures/item/wool_tarp.png | Bin 1837 -> 305 bytes src/main/resources/campanion.accesswidener | 6 +- src/main/resources/campanion.mixins.json | 3 +- .../data/trinkets/entities/campanion.json | 6 + .../data/trinkets/slots/chest/back.json | 11 + src/main/resources/fabric.mod.json | 3 + 67 files changed, 517 insertions(+), 91 deletions(-) create mode 100644 src/main/java/com/terraformersmc/campanion/blockentity/SerializableBlockEntity.java create mode 100644 src/main/java/com/terraformersmc/campanion/mixin/InvokerBlockEntity.java create mode 100644 src/main/resources/assets/campanion/lang/pt_br.json create mode 100644 src/main/resources/data/trinkets/entities/campanion.json create mode 100644 src/main/resources/data/trinkets/slots/chest/back.json diff --git a/.github/workflows/check_build.yml b/.github/workflows/check_build.yml index c9d2ee6e..49d99a4a 100644 --- a/.github/workflows/check_build.yml +++ b/.github/workflows/check_build.yml @@ -12,7 +12,7 @@ jobs: matrix: # Use these Java versions java: [ - 16, # Minimum + 17, # Minimum ] os: [ubuntu-20.04] runs-on: ${{ matrix.os }} @@ -33,7 +33,7 @@ jobs: - name: Build run: ./gradlew build --stacktrace --parallel - name: Capture build artifacts - if: ${{ runner.os == 'Linux' && matrix.java == '11' }} # Only upload artifacts built from LTS java on one OS + if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from LTS java on one OS uses: actions/upload-artifact@v2 with: name: Artifacts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index db067fb7..c1313917 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: # Use these Java versions - java: [16] + java: [17] # and run on both Linux and Windows os: [ubuntu-20.04] runs-on: ${{ matrix.os }} @@ -55,7 +55,7 @@ jobs: MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} DISCORD_ANNOUNCEMENT_WEBHOOK: ${{ secrets.DISCORD_ANNOUNCEMENT_WEBHOOK }} - name: Capture build artifacts - if: ${{ runner.os == 'Linux' && matrix.java == '11' }} # Only upload artifacts built from LTS java on one OS + if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from LTS java on one OS uses: actions/upload-artifact@v2 with: name: Artifacts diff --git a/build.gradle b/build.gradle index 0fc42fda..a1832f57 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,21 @@ plugins { - id 'fabric-loom' version '0.9.9' + id 'fabric-loom' version '0.10-SNAPSHOT' } apply from: 'https://raw.githubusercontent.com/TerraformersMC/GradleScripts/2.1/ferry.gradle' repositories { - // mavenLocal() +// mavenLocal() maven { url "https://maven.jamieswhiteshirt.com/libs-release" content { includeGroup "com.jamieswhiteshirt" } } + maven { + name = "Ladysnake Libs" + url = "https://ladysnake.jfrog.io/artifactory/mods" + } } dependencies { @@ -22,6 +26,7 @@ dependencies { modImplementation("net.fabricmc.fabric-api:fabric-api:${project.fabric_version}") modImplementation("com.terraformersmc:dossier:${project.dossier_version}") // modNotTransitive("gravestones", "net.guavy:Gravestones:${project.gravestones_version}") + modImplementation "dev.emi:trinkets:${trinkets_version}" include modImplementation("com.jamieswhiteshirt:reach-entity-attributes:${project.reach_entity_attributes_version}") } diff --git a/gradle.properties b/gradle.properties index 8f40a0fc..946be8da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,14 @@ org.gradle.jvmargs=-Xmx1G maven_group=com.terraformersmc archive_name=campanion -minecraft_version=1.17.1 -yarn_mappings=1.17.1+build.59 -loader_version=0.11.6 -fabric_version=0.37.0+1.17 -dossier_version=0.4.0 +minecraft_version=1.18.1 +yarn_mappings=1.18.1+build.3 +loader_version=0.12.11 +fabric_version=0.44.0+1.18 +dossier_version=0.5.0 reach_entity_attributes_version=2.1.1 #gravestones_version=v1.9 +trinkets_version=3.1.0 # Project Metadata project_name=Campanion @@ -17,19 +18,19 @@ project_url=https://www.curseforge.com/minecraft/mc-mods/campanion project_logo=https://i.imgur.com/Zm7PbHh.png project_color=0xf5841f # default_release_type can be stable, beta, or alpha -default_release_type=stable +default_release_type=alpha # CurseForge Metadata curseforge_slug=campanion curseforge_id=373138 -curseforge_game_versions=1.17.1, Fabric +curseforge_game_versions=1.18.1, Fabric curseforge_required_dependencies=fabric-api curseforge_optional_dependencies= # Modrinth Metadata modrinth_slug=campanion modrinth_id=Y2Rds0HS -modrinth_game_versions=1.17.1 +modrinth_game_versions=1.18.1 modrinth_mod_loaders=fabric # Mod Loader Metadata diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a97150..e750102e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/terraformersmc/campanion/block/BaseTentBlock.java b/src/main/java/com/terraformersmc/campanion/block/BaseTentBlock.java index a2d12330..daf93929 100644 --- a/src/main/java/com/terraformersmc/campanion/block/BaseTentBlock.java +++ b/src/main/java/com/terraformersmc/campanion/block/BaseTentBlock.java @@ -116,10 +116,10 @@ public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity pl tag.put("BlockState", NbtHelper.fromBlockState(world.getBlockState(off))); BlockEntity entity = world.getBlockEntity(off); if (entity != null) { - tag.put("BlockEntityData", entity.writeNbt(new NbtCompound())); + tag.put("BlockEntityData", entity.createNbt()); } list.add(tag); - world.removeBlockEntity(off);//If we wan't block entities to drop items, remove this line + world.removeBlockEntity(off); // if we want block entities to drop items, remove this line world.setBlockState(off, Blocks.AIR.getDefaultState(), 1 | 2 | 16); } } diff --git a/src/main/java/com/terraformersmc/campanion/block/CampanionBlocks.java b/src/main/java/com/terraformersmc/campanion/block/CampanionBlocks.java index 5fd0a4cb..f60d8ff1 100644 --- a/src/main/java/com/terraformersmc/campanion/block/CampanionBlocks.java +++ b/src/main/java/com/terraformersmc/campanion/block/CampanionBlocks.java @@ -113,7 +113,7 @@ public class CampanionBlocks { public static final TentTopFlatBlock RED_FLAT_TENT_TOP = tentTopFlat(DyeColor.RED); public static final TentTopFlatBlock BLACK_FLAT_TENT_TOP = tentTopFlat(DyeColor.BLACK); - public static final Block TENT_POLE = add("tent_pole", new TentPoleBlock(FabricBlockSettings.of(Material.WOOD).nonOpaque().hardness(-1F).sounds(BlockSoundGroup.WOOD)), (ItemGroup) null); + public static final Block TENT_POLE = add("tent_pole", new TentPoleBlock(FabricBlockSettings.of(Material.WOOD).nonOpaque().hardness(-1F).resistance(1200F).sounds(BlockSoundGroup.WOOD)), (ItemGroup) null); public static final FlareBlock FLARE_BLOCK = add("flare_block", new FlareBlock(FabricBlockSettings.of(Material.TNT).lightLevel(14)), (ItemGroup) null); @@ -157,19 +157,19 @@ public static void register() { } private static TentSideBlock tentSide(DyeColor color) { - return add(color.getName() + "_tent_side", new TentSideBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); + return add(color.getName() + "_tent_side", new TentSideBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).resistance(1200F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); } private static TentTopBlock tentTop(DyeColor color) { - return add(color.getName() + "_tent_top", new TentTopBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); + return add(color.getName() + "_tent_top", new TentTopBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).resistance(1200F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); } private static TentTopPoleBlock toppedTentPole(DyeColor color) { - return add(color.getName() + "_topped_tent_pole", new TentTopPoleBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); + return add(color.getName() + "_topped_tent_pole", new TentTopPoleBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).resistance(1200F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); } private static TentTopFlatBlock tentTopFlat(DyeColor color) { - return add(color.getName() + "_flat_tent_top", new TentTopFlatBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); + return add(color.getName() + "_flat_tent_top", new TentTopFlatBlock(FabricBlockSettings.of(Material.WOOL).nonOpaque().hardness(1F).resistance(1200F).sounds(BlockSoundGroup.WOOL), color), (ItemGroup) null); } diff --git a/src/main/java/com/terraformersmc/campanion/block/FlareBlock.java b/src/main/java/com/terraformersmc/campanion/block/FlareBlock.java index ddf00f54..283edf2f 100644 --- a/src/main/java/com/terraformersmc/campanion/block/FlareBlock.java +++ b/src/main/java/com/terraformersmc/campanion/block/FlareBlock.java @@ -26,7 +26,7 @@ public FlareBlock(Settings settings) { @Override public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) { - world.getBlockTickScheduler().schedule(pos, this, new Random().nextInt(150) + 100); + world.createAndScheduleBlockTick(pos, this, new Random().nextInt(150) + 100); } @Override diff --git a/src/main/java/com/terraformersmc/campanion/block/RopeBridgePlanksBlock.java b/src/main/java/com/terraformersmc/campanion/block/RopeBridgePlanksBlock.java index 597f9556..b56cb1a2 100644 --- a/src/main/java/com/terraformersmc/campanion/block/RopeBridgePlanksBlock.java +++ b/src/main/java/com/terraformersmc/campanion/block/RopeBridgePlanksBlock.java @@ -98,7 +98,7 @@ private void scheduleRemoved(World world, BlockPos pos) { } for (BlockPos neighbour : neighbours) { - world.getBlockTickScheduler().schedule(neighbour, world.getBlockState(neighbour).getBlock(), 1); + world.createAndScheduleBlockTick(neighbour, world.getBlockState(neighbour).getBlock(), 1); } } diff --git a/src/main/java/com/terraformersmc/campanion/blockentity/LawnChairBlockEntity.java b/src/main/java/com/terraformersmc/campanion/blockentity/LawnChairBlockEntity.java index 9c7a00ec..dba06bef 100644 --- a/src/main/java/com/terraformersmc/campanion/blockentity/LawnChairBlockEntity.java +++ b/src/main/java/com/terraformersmc/campanion/blockentity/LawnChairBlockEntity.java @@ -2,9 +2,7 @@ import com.terraformersmc.campanion.entity.CampanionEntities; import com.terraformersmc.campanion.entity.LawnChairEntity; -import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; import net.minecraft.nbt.NbtCompound; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; @@ -12,7 +10,7 @@ import java.util.List; import java.util.UUID; -public class LawnChairBlockEntity extends BlockEntity implements BlockEntityClientSerializable { +public class LawnChairBlockEntity extends SerializableBlockEntity { private UUID entityUUID = UUID.randomUUID(); @@ -40,25 +38,21 @@ public LawnChairEntity findOrCreateEntity() { } @Override - public NbtCompound writeNbt(NbtCompound tag) { - return super.writeNbt(this.toClientTag(tag)); + public void fromTag(NbtCompound tag) { + this.entityUUID = tag.getUuid("EntityUUID"); + this.cachedEntity = null; } @Override - public void readNbt(NbtCompound tag) { - this.fromClientTag(tag); - super.readNbt(tag); + public void toTag(NbtCompound tag) { + tag.putUuid("EntityUUID", this.entityUUID); } - @Override public void fromClientTag(NbtCompound tag) { - this.entityUUID = tag.getUuid("EntityUUID"); - this.cachedEntity = null; + fromTag(tag); } - @Override - public NbtCompound toClientTag(NbtCompound tag) { - tag.putUuid("EntityUUID", this.entityUUID); - return tag; + public void toClientTag(NbtCompound tag) { + toTag(tag); } } diff --git a/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePlanksBlockEntity.java b/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePlanksBlockEntity.java index ee964e0a..0b40e593 100644 --- a/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePlanksBlockEntity.java +++ b/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePlanksBlockEntity.java @@ -2,16 +2,14 @@ import com.terraformersmc.campanion.ropebridge.RopeBridge; import com.terraformersmc.campanion.ropebridge.RopeBridgePlank; -import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; import net.fabricmc.fabric.api.renderer.v1.Renderer; import net.fabricmc.fabric.api.renderer.v1.RendererAccess; import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh; import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.FurnaceBlockEntity; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; @@ -24,7 +22,7 @@ import java.util.Collections; import java.util.List; -public class RopeBridgePlanksBlockEntity extends BlockEntity implements BlockEntityClientSerializable { +public class RopeBridgePlanksBlockEntity extends SerializableBlockEntity { private final List planks = new ArrayList<>(); @@ -150,32 +148,28 @@ public boolean forceRenderStopper() { return false; } - @Override - public void readNbt(NbtCompound tag) { - this.fromClientTag(tag); - super.readNbt(tag); + + public void fromClientTag(NbtCompound tag) { + fromTag(tag); + + assert this.world != null; + this.world.updateListeners(this.pos, this.getCachedState(), this.getCachedState(), 11); } - @Override - public NbtCompound writeNbt(NbtCompound tag) { - return this.toClientTag(super.writeNbt(tag)); + public void toClientTag(NbtCompound tag) { + toTag(tag); } @Override - public void fromClientTag(NbtCompound tag) { - this.planks.clear(); - this.planks.addAll(this.getFrom(tag.getList("Planks", 10))); - this.clearPlankCache(); - - if (this.world != null && this.world.isClient) { - this.world.updateListeners(this.pos, this.getCachedState(), this.getCachedState(), 11); - } + public void toTag(NbtCompound tag) { + tag.put("Planks", writeTo(this.planks)); } @Override - public NbtCompound toClientTag(NbtCompound tag) { - tag.put("Planks", writeTo(this.planks)); - return tag; + public void fromTag(NbtCompound tag) { + this.planks.clear(); + this.planks.addAll(this.getFrom(tag.getList("Planks", NbtElement.COMPOUND_TYPE))); + this.clearPlankCache(); } protected List getFrom(NbtList list) { diff --git a/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePostBlockEntity.java b/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePostBlockEntity.java index 8ac5ce53..7f310518 100644 --- a/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePostBlockEntity.java +++ b/src/main/java/com/terraformersmc/campanion/blockentity/RopeBridgePostBlockEntity.java @@ -52,8 +52,8 @@ public void fromClientTag(NbtCompound tag) { } @Override - public NbtCompound toClientTag(NbtCompound tag) { - tag = super.toClientTag(tag); + public void toClientTag(NbtCompound tag) { + super.toClientTag(tag); NbtList list = new NbtList(); this.ghostPlanks.forEach((plankPos, pairs) -> { NbtCompound nbt = new NbtCompound(); @@ -72,6 +72,5 @@ public NbtCompound toClientTag(NbtCompound tag) { tag.put("GhostPlankMap", list); tag.putLongArray("LinkedPositions", this.linkedPositions.stream().mapToLong(BlockPos::asLong).toArray()); - return tag; } } diff --git a/src/main/java/com/terraformersmc/campanion/blockentity/SerializableBlockEntity.java b/src/main/java/com/terraformersmc/campanion/blockentity/SerializableBlockEntity.java new file mode 100644 index 00000000..8ea56f8a --- /dev/null +++ b/src/main/java/com/terraformersmc/campanion/blockentity/SerializableBlockEntity.java @@ -0,0 +1,81 @@ +package com.terraformersmc.campanion.blockentity; + +import com.google.common.base.Preconditions; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; + +// based on https://github.com/Technici4n/Modern-Dynamics/blob/master/src/main/java/dev/technici4n/moderndynamics/MdBlockEntity.java +/// by shartte & Technici4n +public abstract class SerializableBlockEntity extends BlockEntity { + private boolean shouldClientRemesh = true; + + public SerializableBlockEntity(BlockEntityType bet, BlockPos pos, BlockState state) { + super(bet, pos, state); + } + + public void sync(boolean shouldRemesh) { + Preconditions.checkNotNull(world); // Maintain distinct failure case from below + if (!(world instanceof ServerWorld)) + throw new IllegalStateException("Cannot call sync() on the logical client! Did you check world.isClient first?"); + + shouldClientRemesh = shouldRemesh | shouldClientRemesh; + ((ServerWorld) world).getChunkManager().markForUpdate(getPos()); + } + + public void sync() { + sync(true); + } + + public abstract void toTag(NbtCompound tag); + + public abstract void fromTag(NbtCompound tag); + + public abstract void toClientTag(NbtCompound tag); + + public abstract void fromClientTag(NbtCompound tag); + + @Override + public final BlockEntityUpdateS2CPacket toUpdatePacket() { + return BlockEntityUpdateS2CPacket.create(this); + } + + @Override + public final NbtCompound toInitialChunkDataNbt() { + NbtCompound nbt = super.toInitialChunkDataNbt(); + toClientTag(nbt); + nbt.putBoolean("#c", shouldClientRemesh); // mark client tag + shouldClientRemesh = false; + return nbt; + } + + @Override + protected final void writeNbt(NbtCompound nbt) { + toTag(nbt); + } + + @Override + public final void readNbt(NbtCompound nbt) { + if (nbt.contains("#c")) { + fromClientTag(nbt); + if (nbt.getBoolean("#c")) { + remesh(); + } + } else { + fromTag(nbt); + } + } + + public final void remesh() { + Preconditions.checkNotNull(world); + if (!(world instanceof ClientWorld)) + throw new IllegalStateException("Cannot call remesh() on the server!"); + + world.updateListeners(pos, null, null, 0); + } +} diff --git a/src/main/java/com/terraformersmc/campanion/blockentity/TentPartBlockEntity.java b/src/main/java/com/terraformersmc/campanion/blockentity/TentPartBlockEntity.java index c44202c0..c2d6d4c2 100644 --- a/src/main/java/com/terraformersmc/campanion/blockentity/TentPartBlockEntity.java +++ b/src/main/java/com/terraformersmc/campanion/blockentity/TentPartBlockEntity.java @@ -1,12 +1,13 @@ package com.terraformersmc.campanion.blockentity; +import com.terraformersmc.campanion.mixin.InvokerBlockEntity; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtHelper; import net.minecraft.util.math.BlockPos; -public class TentPartBlockEntity extends BlockEntity { +public class TentPartBlockEntity extends SerializableBlockEntity { private BlockPos linkedPos = BlockPos.ORIGIN; private BlockPos size = BlockPos.ORIGIN; @@ -32,16 +33,25 @@ public BlockPos getSize() { } @Override - public NbtCompound writeNbt(NbtCompound tag) { + public void toTag(NbtCompound tag) { + ((InvokerBlockEntity) this).callWriteIdentifyingData(tag); tag.put("LinkedPos", NbtHelper.fromBlockPos(this.linkedPos)); tag.put("Size", NbtHelper.fromBlockPos(this.size)); - return super.writeNbt(tag); } @Override - public void readNbt(NbtCompound tag) { + public void fromTag(NbtCompound tag) { this.linkedPos = NbtHelper.toBlockPos(tag.getCompound("LinkedPos")); this.size = NbtHelper.toBlockPos(tag.getCompound("Size")); - super.readNbt(tag); + } + + @Override + public void toClientTag(NbtCompound tag) { + toTag(tag); + } + + @Override + public void fromClientTag(NbtCompound tag) { + fromTag(tag); } } diff --git a/src/main/java/com/terraformersmc/campanion/client/renderer/entity/GrapplingHookEntityRenderer.java b/src/main/java/com/terraformersmc/campanion/client/renderer/entity/GrapplingHookEntityRenderer.java index 95248fa8..a290dc83 100644 --- a/src/main/java/com/terraformersmc/campanion/client/renderer/entity/GrapplingHookEntityRenderer.java +++ b/src/main/java/com/terraformersmc/campanion/client/renderer/entity/GrapplingHookEntityRenderer.java @@ -108,7 +108,7 @@ private static void drawLineVertex(float x, float y, float z, VertexConsumer buf nx /= s; ny /= s; nz /= s; - buffer.vertex(normal.getModel(), px, py, pz).color(0, 0, 0, 255).normal(normal.getNormal(), nx, ny, nz).next(); + buffer.vertex(normal.getPositionMatrix(), px, py, pz).color(0, 0, 0, 255).normal(normal.getNormalMatrix(), nx, ny, nz).next(); } diff --git a/src/main/java/com/terraformersmc/campanion/client/renderer/item/FakeWorld.java b/src/main/java/com/terraformersmc/campanion/client/renderer/item/FakeWorld.java index d9bd740a..91ba9364 100644 --- a/src/main/java/com/terraformersmc/campanion/client/renderer/item/FakeWorld.java +++ b/src/main/java/com/terraformersmc/campanion/client/renderer/item/FakeWorld.java @@ -33,7 +33,7 @@ public class FakeWorld extends ClientWorld { public FakeWorld(ItemStack stack, BlockPos basePos, int lightOverride) { super(CLIENT.player.networkHandler, new ClientWorld.Properties(CLIENT.world.getLevelProperties().getDifficulty(), CLIENT.world.getLevelProperties().isDifficultyLocked(), CLIENT.world.getLevelProperties().isHardcore()), - CLIENT.world.getRegistryKey(), CLIENT.world.getDimension(), 3, CLIENT::getProfiler, + CLIENT.world.getRegistryKey(), CLIENT.world.getDimension(), 3, 3, CLIENT::getProfiler, CLIENT.worldRenderer, CLIENT.world.isDebugWorld(), ((AccessorBiomeAccess) CLIENT.world.getBiomeAccess()).getSeed()); updatePositioning(basePos, lightOverride); diff --git a/src/main/java/com/terraformersmc/campanion/config/CampanionConfig.java b/src/main/java/com/terraformersmc/campanion/config/CampanionConfig.java index 0c42b39e..069876f0 100644 --- a/src/main/java/com/terraformersmc/campanion/config/CampanionConfig.java +++ b/src/main/java/com/terraformersmc/campanion/config/CampanionConfig.java @@ -1,7 +1,9 @@ package com.terraformersmc.campanion.config; public class CampanionConfig { + private boolean trinketsBackpackSupport = false; - - + public boolean isTrinketsBackpacksEnabled() { + return trinketsBackpackSupport; + } } diff --git a/src/main/java/com/terraformersmc/campanion/config/CampanionConfigManager.java b/src/main/java/com/terraformersmc/campanion/config/CampanionConfigManager.java index 6c4fa03b..38017f37 100644 --- a/src/main/java/com/terraformersmc/campanion/config/CampanionConfigManager.java +++ b/src/main/java/com/terraformersmc/campanion/config/CampanionConfigManager.java @@ -1,7 +1,14 @@ package com.terraformersmc.campanion.config; import com.terraformersmc.campanion.Campanion; +import dev.emi.trinkets.api.SlotType; +import dev.emi.trinkets.api.TrinketsApi; +import net.fabricmc.fabric.api.util.TriState; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.item.Item; +import net.minecraft.tag.ItemTags; +import net.minecraft.tag.Tag; +import net.minecraft.util.Identifier; import java.io.*; @@ -39,6 +46,21 @@ private static void load() { config = Campanion.GSON.fromJson(br, CampanionConfig.class); } + + if (FabricLoader.getInstance().isModLoaded("trinkets")) { + TrinketsApi.registerTrinketPredicate(new Identifier("campanion", "backpacks"), (stack, ref, entity) -> { + if (!config.isTrinketsBackpacksEnabled()) { + return TriState.FALSE; + } + + SlotType slot = ref.inventory().getSlotType(); + Tag tag = ItemTags.getTagGroup().getTagOrEmpty(new Identifier("campanion", "backpacks")); + if (tag.contains(stack.getItem())) { + return TriState.TRUE; + } + return TriState.DEFAULT; + }); + } } catch (FileNotFoundException e) { System.err.println("Couldn't load Campanion configuration file; reverting to defaults"); e.printStackTrace(); diff --git a/src/main/java/com/terraformersmc/campanion/data/CampanionData.java b/src/main/java/com/terraformersmc/campanion/data/CampanionData.java index d62091be..a3a5746f 100644 --- a/src/main/java/com/terraformersmc/campanion/data/CampanionData.java +++ b/src/main/java/com/terraformersmc/campanion/data/CampanionData.java @@ -16,15 +16,11 @@ import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.data.server.recipe.*; -import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.loot.function.SetCountLootFunction; import net.minecraft.loot.provider.number.UniformLootNumberProvider; import net.minecraft.recipe.Ingredient; -import net.minecraft.util.registry.Registry; - import java.util.function.Consumer; - import static net.minecraft.block.MapColor.COLORS; public class CampanionData implements DossierProvider { diff --git a/src/main/java/com/terraformersmc/campanion/entity/GrapplingHookEntity.java b/src/main/java/com/terraformersmc/campanion/entity/GrapplingHookEntity.java index fcb75322..413f085d 100644 --- a/src/main/java/com/terraformersmc/campanion/entity/GrapplingHookEntity.java +++ b/src/main/java/com/terraformersmc/campanion/entity/GrapplingHookEntity.java @@ -196,7 +196,7 @@ protected void ensureEntityVelocity() { boolean zCollide = false; Box box = this.player.getBoundingBox().stretch(movement.normalize().x, 0, movement.normalize().z); - for (VoxelShape shape : this.world.getBlockCollisions(this.player, box).collect(Collectors.toList())) { + for (VoxelShape shape : this.world.getBlockCollisions(this.player, box)) { xCollide |= box.contains(shape.getMax(Direction.Axis.X), box.minY, box.minZ) || box.contains(shape.getMax(Direction.Axis.X), box.minY, box.minZ); zCollide |= box.contains(box.minX, box.minY, shape.getMin(Direction.Axis.Z)) || box.contains(box.minX, box.minY, shape.getMax(Direction.Axis.Z)); } diff --git a/src/main/java/com/terraformersmc/campanion/item/FlareItem.java b/src/main/java/com/terraformersmc/campanion/item/FlareItem.java index 6c2b3b32..5aa311ec 100644 --- a/src/main/java/com/terraformersmc/campanion/item/FlareItem.java +++ b/src/main/java/com/terraformersmc/campanion/item/FlareItem.java @@ -28,7 +28,7 @@ public TypedActionResult use(World world, PlayerEntity user, Hand han if (!world.isClient) { FlareEntity flare = new FlareEntity(world, user); flare.setItem(itemStack); - flare.setProperties(user, user.getPitch(), user.getYaw(), 0.0F, 0.8F, 0.6F); + flare.setVelocity(user, user.getPitch(), user.getYaw(), 0.0F, 0.8F, 0.6F); world.spawnEntity(flare); } user.incrementStat(Stats.USED.getOrCreateStat(this)); diff --git a/src/main/java/com/terraformersmc/campanion/item/SkippingStoneItem.java b/src/main/java/com/terraformersmc/campanion/item/SkippingStoneItem.java index 807c0634..44310d91 100644 --- a/src/main/java/com/terraformersmc/campanion/item/SkippingStoneItem.java +++ b/src/main/java/com/terraformersmc/campanion/item/SkippingStoneItem.java @@ -27,7 +27,7 @@ public TypedActionResult use(World world, PlayerEntity user, Hand han if (!world.isClient) { SkippingStoneEntity stoneEntity = new SkippingStoneEntity(world, user); stoneEntity.setItem(itemStack); - stoneEntity.setProperties(user, user.getPitch(), user.getYaw(), 0.0F, 1.5F, 1.0F); + stoneEntity.setVelocity(user, user.getPitch(), user.getYaw(), 0.0F, 1.5F, 1.0F); world.spawnEntity(stoneEntity); } user.incrementStat(Stats.USED.getOrCreateStat(this)); diff --git a/src/main/java/com/terraformersmc/campanion/item/SleepingBagItem.java b/src/main/java/com/terraformersmc/campanion/item/SleepingBagItem.java index 00bd92b9..080db7d9 100644 --- a/src/main/java/com/terraformersmc/campanion/item/SleepingBagItem.java +++ b/src/main/java/com/terraformersmc/campanion/item/SleepingBagItem.java @@ -31,8 +31,8 @@ public class SleepingBagItem extends Item implements DyeableItem { - public static final Text CANT_SLEEP_DAY = PlayerEntity.SleepFailureReason.NOT_POSSIBLE_NOW.toText(); - public static final Text NOT_SAFE = PlayerEntity.SleepFailureReason.NOT_SAFE.toText(); + public static final Text CANT_SLEEP_DAY = PlayerEntity.SleepFailureReason.NOT_POSSIBLE_NOW.getMessage(); + public static final Text NOT_SAFE = PlayerEntity.SleepFailureReason.NOT_SAFE.getMessage(); public static final Text NOT_ON_GROUND = new TranslatableText("item.campanion.sleeping_bag.not_on_ground"); public static final Text TOO_WET = new TranslatableText("item.campanion.sleeping_bag.too_wet"); diff --git a/src/main/java/com/terraformersmc/campanion/item/SpearItem.java b/src/main/java/com/terraformersmc/campanion/item/SpearItem.java index e1a21f1b..8b4b5ebc 100644 --- a/src/main/java/com/terraformersmc/campanion/item/SpearItem.java +++ b/src/main/java/com/terraformersmc/campanion/item/SpearItem.java @@ -121,7 +121,7 @@ public void onStoppedUsing(ItemStack stack, World world, LivingEntity user, int if (!world.isClient) { stack.damage(1, playerEntity, entity -> entity.sendToolBreakStatus(user.getActiveHand())); SpearEntity spearEntity = new SpearEntity(world, playerEntity, this, stack); - spearEntity.setProperties(playerEntity, playerEntity.getPitch(), playerEntity.getYaw(), 0.0F, 2.5F, 1.0F); + spearEntity.setVelocity(playerEntity, playerEntity.getPitch(), playerEntity.getYaw(), 0.0F, 2.5F, 1.0F); if (playerEntity.getAbilities().creativeMode) { spearEntity.pickupType = PersistentProjectileEntity.PickupPermission.CREATIVE_ONLY; } diff --git a/src/main/java/com/terraformersmc/campanion/mixin/InvokerBlockEntity.java b/src/main/java/com/terraformersmc/campanion/mixin/InvokerBlockEntity.java new file mode 100644 index 00000000..671e96fe --- /dev/null +++ b/src/main/java/com/terraformersmc/campanion/mixin/InvokerBlockEntity.java @@ -0,0 +1,13 @@ +package com.terraformersmc.campanion.mixin; + + +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.nbt.NbtCompound; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BlockEntity.class) +public interface InvokerBlockEntity { + @Invoker + void callWriteIdentifyingData(NbtCompound nbt); +} diff --git a/src/main/java/com/terraformersmc/campanion/mixin/client/MixinItemRenderer.java b/src/main/java/com/terraformersmc/campanion/mixin/client/MixinItemRenderer.java index 5fdb33af..4114346e 100644 --- a/src/main/java/com/terraformersmc/campanion/mixin/client/MixinItemRenderer.java +++ b/src/main/java/com/terraformersmc/campanion/mixin/client/MixinItemRenderer.java @@ -25,7 +25,7 @@ public class MixinItemRenderer { @Inject(method = "renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformation$Mode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/world/World;III)V", at = @At("HEAD"), cancellable = true) public void renderItem(LivingEntity entity, ItemStack stack, ModelTransformation.Mode renderMode, boolean leftHanded, MatrixStack matrices, VertexConsumerProvider vertexConsumers, World world, int light, int overlay, int seed, CallbackInfo info) { - BakedModel model = MinecraftClient.getInstance().getItemRenderer().getHeldItemModel(stack, world, entity, seed); + BakedModel model = MinecraftClient.getInstance().getItemRenderer().getModel(stack, world, entity, seed); if(stack.getItem() instanceof SpearItem && SpearItemRenderer.INSTANCE.render(entity, stack, renderMode, leftHanded, matrices, vertexConsumers, light, overlay, model)) { info.cancel(); } diff --git a/src/main/java/com/terraformersmc/campanion/network/C2SOpenBackpack.java b/src/main/java/com/terraformersmc/campanion/network/C2SOpenBackpack.java index 299c349b..04fbe69a 100644 --- a/src/main/java/com/terraformersmc/campanion/network/C2SOpenBackpack.java +++ b/src/main/java/com/terraformersmc/campanion/network/C2SOpenBackpack.java @@ -2,10 +2,14 @@ import com.terraformersmc.campanion.Campanion; import com.terraformersmc.campanion.backpack.BackpackContainerFactory; +import com.terraformersmc.campanion.config.CampanionConfigManager; import com.terraformersmc.campanion.item.BackpackItem; +import dev.emi.trinkets.api.TrinketComponent; +import dev.emi.trinkets.api.TrinketsApi; import io.netty.buffer.Unpooled; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.network.Packet; @@ -25,6 +29,16 @@ public static Packet createPacket() { public static void onPacket(MinecraftServer server, ServerPlayerEntity player, ServerPlayNetworkHandler networkHandler, PacketByteBuf buffer, PacketSender sender) { server.execute(() -> { ItemStack stack = player.getEquippedStack(EquipmentSlot.CHEST); + + if (CampanionConfigManager.getConfig().isTrinketsBackpacksEnabled() && + FabricLoader.getInstance().isModLoaded("trinkets")) { + TrinketComponent component = TrinketsApi.getTrinketComponent(player).orElse(null); + + if (component != null && component.isEquipped(itemStack -> itemStack.getItem() instanceof BackpackItem)) { + stack = component.getEquipped(itemStack -> itemStack.getItem() instanceof BackpackItem).get(0).getRight(); + } + } + if (stack.getItem() instanceof BackpackItem) { BackpackItem.Type type = ((BackpackItem) stack.getItem()).type; player.openHandledScreen(new BackpackContainerFactory(type)); diff --git a/src/main/java/com/terraformersmc/campanion/network/C2SRotateHeldItem.java b/src/main/java/com/terraformersmc/campanion/network/C2SRotateHeldItem.java index 4a2b0551..53cff21e 100644 --- a/src/main/java/com/terraformersmc/campanion/network/C2SRotateHeldItem.java +++ b/src/main/java/com/terraformersmc/campanion/network/C2SRotateHeldItem.java @@ -50,7 +50,7 @@ public static void onPacket(MinecraftServer server, ServerPlayerEntity player, S if (be != null) { // TODO - Can't find equivalent // be.applyRotation(BlockRotation.CLOCKWISE_90); - tag.put("BlockEntityData", be.writeNbt(new NbtCompound())); + tag.put("BlockEntityData", be.createNbt()); } } } diff --git a/src/main/java/com/terraformersmc/campanion/ropebridge/RopeBridgePlank.java b/src/main/java/com/terraformersmc/campanion/ropebridge/RopeBridgePlank.java index bfedd9f2..95b84c4a 100644 --- a/src/main/java/com/terraformersmc/campanion/ropebridge/RopeBridgePlank.java +++ b/src/main/java/com/terraformersmc/campanion/ropebridge/RopeBridgePlank.java @@ -359,10 +359,10 @@ private void drawDoubleSided(QuadEmitter emitter, RenderMaterial material, Verte private static void add(QuadEmitter emitter, int index, MatrixStack stack, boolean translucent, float x, float y, float z, float u, float v, float nx, float ny, float nz) { Vector4f pos = new Vector4f(x, y, z, 1.0F); - pos.transform(stack.peek().getModel()); + pos.transform(stack.peek().getPositionMatrix()); Vec3f normal = new Vec3f(nx, ny, nz); - normal.transform(stack.peek().getNormal()); + normal.transform(stack.peek().getNormalMatrix()); emitter .pos(index, pos.getX(), pos.getY(), pos.getZ()) diff --git a/src/main/resources/assets/campanion/lang/pt_br.json b/src/main/resources/assets/campanion/lang/pt_br.json new file mode 100644 index 00000000..8943d03f --- /dev/null +++ b/src/main/resources/assets/campanion/lang/pt_br.json @@ -0,0 +1,274 @@ +{ + "itemGroup.campanion.items": "Campanion", + + "item.campanion.rope": "Corda de linho", + "item.campanion.wooden_rod": "Vara", + "item.campanion.wool_tarp": "Lona de lã", + "item.campanion.tanned_leather": "Couro curtido", + + "item.campanion.leather_pouch": "Bolsa de couro", + "item.campanion.tanned_leather_pouch": "Bolsa de couro curtido", + + "item.campanion.cracker": "Bolacha", + "item.campanion.marshmallow": "Marshmallow", + "item.campanion.cooked_marshmallow": "Marshmallow assado", + "item.campanion.blackened_marshmallow": "Marshmallow queimado", + "item.campanion.marshmallow_on_a_stick": "Marshmallow no espeto", + "item.campanion.cooked_marshmallow_on_a_stick": "Marshmallow assado no espeto", + "item.campanion.blackened_marshmallow_on_a_stick": "Marshmallow queimado no espeto", + "item.campanion.smore": "Bolacha recheada", + + "item.campanion.mre": "Comida instantânea", + + "item.campanion.day_pack": "Mochila básica", + "item.campanion.camping_pack": "Mochila de acampamento", + "item.campanion.hiking_pack": "Mochila de trilha", + "item.campanion.backpack.warning.1": "Desequipar este item", + "item.campanion.backpack.warning.2": "derrubará o seu conteúdo", + "item.campanion.backpack.warning.3": "todo no chão.", + + "item.campanion.tent_bag": "Bolsa de tenda", + "item.campanion.sleeping_bag": "Saco de dormir", + "item.campanion.sleeping_bag.not_on_ground": "Você não pode dormir no ar.", + "item.campanion.sleeping_bag.stop_sleeping": "Sair do saco de dormir", + "item.campanion.sleeping_bag.too_wet": "O chão está muito molhado, procure cobertura.", + + "item.campanion.wooden_spear": "Lança de madeira", + "item.campanion.stone_spear": "Lança rudimentar", + "item.campanion.iron_spear": "Lança enferrujada", + "item.campanion.golden_spear": "Lança decorativa", + "item.campanion.diamond_spear": "Lança", + "item.campanion.netherite_spear": "Lança reforçada", + + "item.campanion.grappling_hook": "Gancho de escalada", + + "item.campanion.skipping_stone": "Seixo", + + "item.campanion.white_lawn_chair": "Cadeira de descanso branca", + "item.campanion.orange_lawn_chair": "Cadeira de descanso laranja", + "item.campanion.magenta_lawn_chair": "Cadeira de descanso magenta", + "item.campanion.light_blue_lawn_chair": "Cadeira de descanso azul-claro", + "item.campanion.yellow_lawn_chair": "Cadeira de descanso amarela", + "item.campanion.lime_lawn_chair": "Cadeira de descanso verde-limão", + "item.campanion.pink_lawn_chair": "Cadeira de descanso rosa", + "item.campanion.gray_lawn_chair": "Cadeira de descanso cinza", + "item.campanion.light_gray_lawn_chair": "Cadeira de descanso cinza-claro", + "item.campanion.cyan_lawn_chair": "Cadeira de descanso ciano", + "item.campanion.purple_lawn_chair": "Cadeira de descanso roxa", + "item.campanion.blue_lawn_chair": "Cadeira de descanso azul", + "item.campanion.brown_lawn_chair": "Cadeira de descanso marrom", + "item.campanion.red_lawn_chair": "Cadeira de descanso vermelha", + "item.campanion.green_lawn_chair": "Cadeira de descanso verde", + "item.campanion.black_lawn_chair": "Cadeira de descanso preta", + + "item.campanion.small_unbuilt_tent": "Barraca pequena", + "item.campanion.large_unbuilt_tent": "Barraca grande", + + "item.campanion.tent_pole": "Mastro", + + "item.campanion.white_tent_side": "Lateral de barraca branca", + "item.campanion.orange_tent_side": "Lateral de barraca laranja", + "item.campanion.magenta_tent_side": "Lateral de barraca magenta", + "item.campanion.light_blue_tent_side": "Lateral de barraca azul-claro", + "item.campanion.yellow_tent_side": "Lateral de barraca amarela", + "item.campanion.lime_tent_side": "Lateral de barraca verde-limão", + "item.campanion.pink_tent_side": "Lateral de barraca rosa", + "item.campanion.gray_tent_side": "Lateral de barraca cinza", + "item.campanion.light_gray_tent_side": "Lateral de barraca cinza-claro", + "item.campanion.cyan_tent_side": "Lateral de barraca ciano", + "item.campanion.purple_tent_side": "Lateral de barraca roxa", + "item.campanion.blue_tent_side": "Lateral de barraca azul", + "item.campanion.brown_tent_side": "Lateral de barraca marrom", + "item.campanion.green_tent_side": "Lateral de barraca verde", + "item.campanion.red_tent_side": "Lateral de barraca vermelha", + "item.campanion.black_tent_side": "Lateral de barraca preta", + + "item.campanion.white_tent_top": "Cobertura de barraca branca", + "item.campanion.orange_tent_top": "Cobertura de barraca laranja", + "item.campanion.magenta_tent_top": "Cobertura de barraca magenta", + "item.campanion.light_blue_tent_top": "Cobertura de barraca azul-claro", + "item.campanion.yellow_tent_top": "Cobertura de barraca amarela", + "item.campanion.lime_tent_top": "Cobertura de barraca verde-limão", + "item.campanion.pink_tent_top": "Cobertura de barraca rosa", + "item.campanion.gray_tent_top": "Cobertura de barraca cinza", + "item.campanion.light_gray_tent_top": "Cobertura de barraca cinza-claro", + "item.campanion.cyan_tent_top": "Cobertura de barraca ciano", + "item.campanion.purple_tent_top": "Cobertura de barraca roxa", + "item.campanion.blue_tent_top": "Cobertura de barraca azul", + "item.campanion.brown_tent_top": "Cobertura de barraca marrom", + "item.campanion.green_tent_top": "Cobertura de barraca verde", + "item.campanion.red_tent_top": "Cobertura de barraca vermelha", + "item.campanion.black_tent_top": "Cobertura de barraca preta", + + "item.campanion.white_topped_tent_pole": "Mastro de barraca coberta branco", + "item.campanion.orange_topped_tent_pole": "Mastro de barraca coberta laranja", + "item.campanion.magenta_topped_tent_pole": "Mastro de barraca coberta magenta", + "item.campanion.light_blue_topped_tent_pole": "Mastro de barraca coberta azul-claro", + "item.campanion.yellow_topped_tent_pole": "Mastro de barraca coberta amarelo", + "item.campanion.lime_topped_tent_pole": "Mastro de barraca coberta verde-limão", + "item.campanion.pink_topped_tent_pole": "Mastro de barraca coberta rosa", + "item.campanion.gray_topped_tent_pole": "Mastro de barraca coberta cinza", + "item.campanion.light_gray_topped_tent_pole": "Mastro de barraca coberta cinza-claro", + "item.campanion.cyan_topped_tent_pole": "Mastro de barraca coberta ciano", + "item.campanion.purple_topped_tent_pole": "Mastro de barraca coberta roxo", + "item.campanion.blue_topped_tent_pole": "Mastro de barraca coberta azul", + "item.campanion.brown_topped_tent_pole": "Mastro de barraca coberta marrom", + "item.campanion.green_topped_tent_pole": "Mastro de barraca coberta verde", + "item.campanion.red_topped_tent_pole": "Mastro de barraca coberta vermelho", + "item.campanion.black_topped_tent_pole": "Mastro de barraca coberta preto", + + "item.campanion.white_flat_tent_top": "Cobertura achatada de barraca branca", + "item.campanion.orange_flat_tent_top": "Cobertura achatada de barraca laranja", + "item.campanion.magenta_flat_tent_top": "Cobertura achatada de barraca magenta", + "item.campanion.light_blue_flat_tent_top": "Cobertura achatada de barraca azul-claro", + "item.campanion.yellow_flat_tent_top": "Cobertura achatada de barraca amarela", + "item.campanion.lime_flat_tent_top": "Cobertura achatada de barraca verde-limão", + "item.campanion.pink_flat_tent_top": "Cobertura achatada de barraca rosa", + "item.campanion.gray_flat_tent_top": "Cobertura achatada de barraca cinza", + "item.campanion.light_gray_flat_tent_top": "Cobertura achatada de barraca cinza-claro", + "item.campanion.cyan_flat_tent_top": "Cobertura achatada de barraca ciano", + "item.campanion.purple_flat_tent_top": "Cobertura achatada de barraca roxa", + "item.campanion.blue_flat_tent_top": "Cobertura achatada de barraca azul", + "item.campanion.brown_flat_tent_top": "Cobertura achatada de barraca marrom", + "item.campanion.green_flat_tent_top": "Cobertura achatada de barraca verde", + "item.campanion.red_flat_tent_top": "Cobertura achatada de barraca vermelha", + "item.campanion.black_flat_tent_top": "Cobertura achatada de barraca preta", + + "item.campanion.flare" : "Sinalizador", + + "block.campanion.rope_ladder": "Escada de corda de linho", + "block.campanion.rope_bridge_post": "Poste de ponte suspensa", + "block.campanion.rope_bridge_planks": "Tábuas de pote suspensa", + + "block.campanion.rope_bridge_anchor": "Âncora de ponte suspensa", + "block.campanion.leather_tanner": "Cavalete de curtume", + + "block.campanion.white_lawn_chair": "Cadeira de descanso branca", + "block.campanion.orange_lawn_chair": "Cadeira de descanso laranja", + "block.campanion.magenta_lawn_chair": "Cadeira de descanso magenta", + "block.campanion.light_blue_lawn_chair": "Cadeira de descanso azul-claro", + "block.campanion.yellow_lawn_chair": "Cadeira de descanso amarela", + "block.campanion.lime_lawn_chair": "Cadeira de descanso verde-limão", + "block.campanion.pink_lawn_chair": "Cadeira de descanso rosa", + "block.campanion.gray_lawn_chair": "Cadeira de descanso cinza", + "block.campanion.light_gray_lawn_chair": "Cadeira de descanso cinza-claro", + "block.campanion.cyan_lawn_chair": "Cadeira de descanso ciano", + "block.campanion.purple_lawn_chair": "Cadeira de descanso roxa", + "block.campanion.blue_lawn_chair": "Cadeira de descanso azul", + "block.campanion.brown_lawn_chair": "Cadeira de descanso marrom", + "block.campanion.red_lawn_chair": "Cadeira de descanso vermelha", + "block.campanion.green_lawn_chair": "Cadeira de descanso verde", + "block.campanion.black_lawn_chair": "Cadeira de descanso preta", + + "block.campanion.white_tent_side": "Lateral de barraca branca", + "block.campanion.orange_tent_side": "Lateral de barraca laranja", + "block.campanion.magenta_tent_side": "Lateral de barraca magenta", + "block.campanion.light_blue_tent_side": "Lateral de barraca azul-claro", + "block.campanion.yellow_tent_side": "Lateral de barraca amarela", + "block.campanion.lime_tent_side": "Lateral de barraca verde-limão", + "block.campanion.pink_tent_side": "Lateral de barraca rosa", + "block.campanion.gray_tent_side": "Lateral de barraca cinza", + "block.campanion.light_gray_tent_side": "Lateral de barraca cinza-claro", + "block.campanion.cyan_tent_side": "Lateral de barraca ciano", + "block.campanion.purple_tent_side": "Lateral de barraca roxa", + "block.campanion.blue_tent_side": "Lateral de barraca azul", + "block.campanion.brown_tent_side": "Lateral de barraca marrom", + "block.campanion.green_tent_side": "Lateral de barraca verde", + "block.campanion.red_tent_side": "Lateral de barraca vermelha", + "block.campanion.black_tent_side": "Lateral de barraca preta", + + "block.campanion.white_tent_top": "Cobertura de barraca branca", + "block.campanion.orange_tent_top": "Cobertura de barraca laranja", + "block.campanion.magenta_tent_top": "Cobertura de barraca magenta", + "block.campanion.light_blue_tent_top": "Cobertura de barraca azul-claro", + "block.campanion.yellow_tent_top": "Cobertura de barraca amarela", + "block.campanion.lime_tent_top": "Cobertura de barraca verde-limão", + "block.campanion.pink_tent_top": "Cobertura de barraca rosa", + "block.campanion.gray_tent_top": "Cobertura de barraca cinza", + "block.campanion.light_gray_tent_top": "Cobertura de barraca cinza-claro", + "block.campanion.cyan_tent_top": "Cobertura de barraca ciano", + "block.campanion.purple_tent_top": "Cobertura de barraca roxa", + "block.campanion.blue_tent_top": "Cobertura de barraca azul", + "block.campanion.brown_tent_top": "Cobertura de barraca marrom", + "block.campanion.green_tent_top": "Cobertura de barraca verde", + "block.campanion.red_tent_top": "Cobertura de barraca vermelha", + "block.campanion.black_tent_top": "Cobertura de barraca preta", + + "block.campanion.white_topped_tent_pole": "Mastro de barraca coberta branco", + "block.campanion.orange_topped_tent_pole": "Mastro de barraca coberta laranja", + "block.campanion.magenta_topped_tent_pole": "Mastro de barraca coberta magenta", + "block.campanion.light_blue_topped_tent_pole": "Mastro de barraca coberta azul-claro", + "block.campanion.yellow_topped_tent_pole": "Mastro de barraca coberta amarelo", + "block.campanion.lime_topped_tent_pole": "Mastro de barraca coberta verde-limão", + "block.campanion.pink_topped_tent_pole": "Mastro de barraca coberta rosa", + "block.campanion.gray_topped_tent_pole": "Mastro de barraca coberta cinza", + "block.campanion.light_gray_topped_tent_pole": "Mastro de barraca coberta cinza-claro", + "block.campanion.cyan_topped_tent_pole": "Mastro de barraca coberta ciano", + "block.campanion.purple_topped_tent_pole": "Mastro de barraca coberta roxo", + "block.campanion.blue_topped_tent_pole": "Mastro de barraca coberta azul", + "block.campanion.brown_topped_tent_pole": "Mastro de barraca coberta marrom", + "block.campanion.green_topped_tent_pole": "Mastro de barraca coberta verde", + "block.campanion.red_topped_tent_pole": "Mastro de barraca coberta vermelho", + "block.campanion.black_topped_tent_pole": "Mastro de barraca coberta preto", + + "block.campanion.white_flat_tent_top": "Cobertura achatada de barraca branca", + "block.campanion.orange_flat_tent_top": "Cobertura achatada de barraca laranja", + "block.campanion.magenta_flat_tent_top": "Cobertura achatada de barraca magenta", + "block.campanion.light_blue_flat_tent_top": "Cobertura achatada de barraca azul-claro", + "block.campanion.yellow_flat_tent_top": "Cobertura achatada de barraca amarela", + "block.campanion.lime_flat_tent_top": "Cobertura achatada de barraca verde-limão", + "block.campanion.pink_flat_tent_top": "Cobertura achatada de barraca rosa", + "block.campanion.gray_flat_tent_top": "Cobertura achatada de barraca cinza", + "block.campanion.light_gray_flat_tent_top": "Cobertura achatada de barraca cinza-claro", + "block.campanion.cyan_flat_tent_top": "Cobertura achatada de barraca ciano", + "block.campanion.purple_flat_tent_top": "Cobertura achatada de barraca roxa", + "block.campanion.blue_flat_tent_top": "Cobertura achatada de barraca azul", + "block.campanion.brown_flat_tent_top": "Cobertura achatada de barraca marrom", + "block.campanion.green_flat_tent_top": "Cobertura achatada de barraca verde", + "block.campanion.red_flat_tent_top": "Cobertura achatada de barraca vermelha", + "block.campanion.black_flat_tent_top": "Cobertura achatada de barraca preta", + + "block.campanion.tent_pole": "Mastro", + "block.campanion.flare_block": "Sinalizador", + + "container.campanion.day_pack": "Mochila básica", + "container.campanion.camping_pack": "Mochila de acampamento", + "container.campanion.hiking_pack": "Mochila de trilha", + + "key.campanion.open_backpack": "Abrir mochila", + + "advancements.campanion.adventure.sleep_in_sleeping_bag.title": "Aconchegando-se", + "advancements.campanion.adventure.sleep_in_sleeping_bag.description": "Passe a noite num saco de dormir.", + "advancements.campanion.husbandry.cook_marshmallow.title": "Perfeitamente assado", + "advancements.campanion.husbandry.cook_marshmallow.description": "Asse um marshmallow na fogueira sem queimá-lo.", + "advancements.campanion.husbandry.eat_smore.title": "Biscoito ou bolacha?", + "advancements.campanion.husbandry.eat_smore.description": "Coma uma bolacha recheada.", + "advancements.campanion.adventure.skip_stone.title": "Senseixonal", + "advancements.campanion.adventure.skip_stone.description": "Faça um seixo quicar na água 6 ou mais vezes.", + "advancements.campanion.adventure.kill_with_stone_after_skips.title": "Meus sedimentos...", + "advancements.campanion.adventure.kill_with_stone_after_skips.description": "Derrote um inimigo com o golpe final de um seixo que tenha quicado 6 ou mais vezes na água.", + + "message.campanion.rope_bridge.same_position": "Não dá para construir uma ponte para o mesmo lugar.", + "message.campanion.rope_bridge.obstructed": "Não foi possível construir a ponte, houve uma obstrução em %s, %s, %s pelo bloco '%s'.", + "message.campanion.rope_bridge.angle": "Muito inclinado! A inclinação atual é '%s', mas o máximo é '%s'.", + "message.campanion.rope_bridge.length": "Muito distante! A distancia atual é '%s', mas o máximo é '%s'.", + "message.campanion.rope_bridge.ropes": "Não há cordas o suficiente! Serão necessárias mais %s.", + "message.campanion.rope_bridge.constructed": "%s tábuas restantes.", + "message.campanion.rope_bridge.finished": "Ponte construída!", + "message.campanion.rope_bridge.no_permission": "Você não possui permissão para colocar %s blocos.", + + "message.campanion.backpack.hasitems1": "Desequipar ou rebaixar", + "message.campanion.backpack.hasitems2": "derrubará os itens no chão.", + + "stat.campanion.sleep_in_sleeping_bag": "Noites passadas em um saco de dormir", + "stat.campanion.stone_skips": "Quiques de seixo", + + "subtitles.campanion.howl": "Lobo uiva", + "subtitles.campanion.spear_hit_ground": "Lança crava num bloco", + "subtitles.campanion.spear_hit_flesh": "Lança crava num corpo", + "subtitles.campanion.spear_throw": "Lança arremessada", + "subtitles.campanion.flare_strike": "Sinalizador acende", + + "attribute.name.campanion.reach": "Alcance", + "attribute.name.campanion.attack_range": "Alcance de ataque" +} diff --git a/src/main/resources/assets/campanion/textures/item/blackened_marshmallow.png b/src/main/resources/assets/campanion/textures/item/blackened_marshmallow.png index f0e3a8fdb976b350fc018ad045584de47ea7e5af..8b321d625d76fa3f72f8756c4433c8b9482e67cf 100644 GIT binary patch delta 316 zcmV-C0mJ^C0@nhNB!2;OQb$4nuFf3k0003INkl1unLz5WPQzb<^ zR4@jKh=U+FxH$L+{IC84>EIwz(xGOsf-Nc~RzjN4Ar2*n=0-=sZ#tLvc|Ohs{<@TP z0oQiYY&`IXrF>%@*cN+iZ|Vrs07#3HN`Y%TX#pgY1=cK`e1Co@wF1|6(%Z`m0EF1$ zbu z5FsQzO0qD)Mc_7C^#^@$e^8rf8?_KLv?wStB7_#U6YagIZOv}Zn|HZ$8Tk1sso=nJ zQWf89J!xJ71ItPEW&^j^E$~$saXH75Naa=Fn%pp}26o?+9D2;pvBb(MtEbxqKiFlx zAMEfCC)KFz06=IuOV48!M%gO&NAkS@z|e89`zF)b0)Tq8#x{w*TOnVQ@d&rq#WsZU z{cQ$7F^4x9DDR-tHqw?52u;t}I`G&Z51;QKFOu(7pZ}zu+eShj9#d0y00000NkvXX Hu0mjfLX2|G diff --git a/src/main/resources/assets/campanion/textures/item/blackened_marshmallow_on_a_stick.png b/src/main/resources/assets/campanion/textures/item/blackened_marshmallow_on_a_stick.png index 62914920633026aabedb9c3e2f001aa4e246250c..9002aa31391ba93fbbb4e7e22b77f7911d631553 100644 GIT binary patch delta 244 zcmV1vUbdrWjD1%BQ zBpq%t8JX?=g#Y5__yqZ$WWA&Ynuun zuM2e=Ed|gnh73H5<^BqQp$qqf2f%E(;uh`j!`RR=s8y<}Cv7~MZasaQ&LbcIAg5!n z4P9sRArP?Xfbv*{1u$3`9InKu5JDfXU!e=SW)x8iQ|g^0000-t!{n)-t)fjm-3`g zZO2pqXs2(#+-17Xa6uR^F@kUsHPx0Dlot#!96q*Dlupc=Y5Y z0G*s&ASg=zftGjo!fM` z2P)0;*Kf6E>(%5m`1aWWoEUZ{gs(4(GYNLlS1BQF7RnI z+eZ%11^%HY05BXSxVFh~l&GdS8Ef$YK6U#_YiFz!Jps6IzM>i@3BL5cGew4SDR=mc zB0}Ci#(a5J&Yqm*MQa;?aw&&pX6bz1VIlBnb$99X_g}Qnq%9GkTJortJlefo1zHHa z)CDSlVf=xvclrh(0GH;=6x?Zi*94&PvBw}9r+?*x_2B9`9=5h*F#MssdMz{n>Q6V1 cO!H6m8$kuHVnv}P>Hq)$07*qoM6N<$g0za}_5c6? literal 2107 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 literal 1972 zcmbVNO=uid9G_STwwO{+Mtkrvfl@JV=grs72VG0Dn{*f4G^8s@PUh{KH@ic2=8ZFx z>?W5Q>&1f*p-KoyLGco)lpGWk5o{Gf6fXt!CiT$fBGjuG-|Uw$ByGsT?ECutKYss@ z_uihKx-@j^`BQ=*43&z789ts#zo!QI{|kTZVm_PPV7v#i0zx-MRo|6-2^)f1ld0O|1s}a4j zI#nU7i^Ouoi!Xxr3S%Vc^c$dM1h{k zLLzG>FszK6)sUJU1qzZa37L|tLL}QLYwHH+{zPsqa$I|+Fxj=mS2?ksB%v)y&1N&x zR5L89NwQ^e9g3tVkRxEc5+t|#+LEH@! z517=#p(JNeN~sNWNFNt2MUA#`he)(ReHtV&$I5+dSZ4`~>+BHK{p0@`;Gr#-`!){r z#rOLr;$&i()941|Ky+ML38^$gW406#IL@HE_io&yI*&1K!HbNa}nK_=jvJYxjWW!cDRDsC&56Vl% z!3lmW*deydA|G?Yo{wu(3WJ&m`eC&5tid8~n0u%0-7n?y(-CvM20w^rE{%iIL_RB9 z*(_8ta@*Z<*)9cff&)TJg`CKPlkq&qHmIQ*icTR>Xcl6k>9DH18gx~nD~hfnB$J+e zfsv)O1bXsLTi!AZx0;0(CkSOrGob0{4m1>nDw>9gENeaa%aO-h5I2skCvD8McI=`T z^Q^9PTjvUWy*q1opj|FDCTSbwM3Uy8I%0R*J1_!AVbD?AtW&P^5p~gl#mr5bIHF@U z9<9gLophM#kch9of>Mg$xs7q&d*iOchpT({ie+shTEF-hr<3I<;)1+KSOD z>EpQG)lKR+s8N2WO5*X!9IX-$BeSpRj!FjY?f;I@J~C2zm3Asj+FyL_vpv@?Ph@+G z-{tAF|A_EK{~4kIk5j}SnP;8ZasEJUl?r1O^9SOmPwu4eYH4Ds@ag!% GoBsl(nRA-} diff --git a/src/main/resources/assets/campanion/textures/item/flare.png b/src/main/resources/assets/campanion/textures/item/flare.png index 3c7f041023859b54dcb464a150f14847e91d29ad..644ffd8ec01634b2a129ba04e287616fd7016201 100644 GIT binary patch delta 298 zcmV+_0oDGj0>uK5B!2;OQb$4nuFf3k00030NklrZ{RC*Xb0zR9SZH_?9wfhSP++rXe1b+BBxU>l_d2FrDwbM z@;m3A!-4+{&vM1HT={udJO;Nbc>vxGM~35Z4j`|KZ(7&t+xL5y1u8%k6AAl^%$Dg(Ru8U4|S;48vkuQIV}A)Yos5QYqw(ZR}bs7(yQ w5a1}hm*8Wu1|z^UPPDOV0Z^+6XyZSLZ|}*9F0AwZ_5c6?07*qoM6N<$g1Rz_A^-pY delta 273 zcmV+s0q*|A0;~d%B!BZsL_t(Ijbj*azzB1||NsAqa?1rbH;_U`gI&8A7#ZQ(AqEh_ z=UrX@zh-9se?UbAgi%c1 znTZLk5m_@q13;P?%T>Yb6?gA4ggt%?!i>mja2f#9EbTrM?tg4ud3m^I``fosHJ}IB zg*{m)0R{?nF?Mz^hN)w~mJUER%k0~SHNenq2BiZOFW?JptjNZ8 z|_eg8z*05Rk6|Jpj53>)9+6Qvo&0GQ@2 zI}b5rm_8>;GfLcmuM$rG#Rb_&*37`bz`&v+#`9l6=pw_$D-0xSW?*1oV7d31iQ(So j-wYWpq-$niU|;|M!Mu$zVIPQ000000NkvXXu0mjfmq?s# literal 1977 zcmbVNO=uid9G?&fT9UR0dq{KeF+CWuZ|8ecPBu^JaI*&PQh^ z*-Z}SgL)7=Xi!LlCq?m#rU(^^LaAu2NT47^K~Th#dJx)^y{vEc%NWx(WMJmKdGGiC z`29cLdv$W+)WCtG2N;GKDCBcfbUd8A5A@OR!?zoV4i5(T=OczW_*L@uy!F_@A%^L@ z=#-}8>EhD{_T3b+e3PW=Za~otGcsBa5S}G5FiF|*GVEWUUtxh`W!N)HkuL^WQgQN& zAvwJ`QNoL}Shv{GC%{PEpbA_PBT#p%US!lWY*Vj6=gBh1f+i%M&9GyMK`>pM1X({M zKuM_(3$g~%dP-1bUQ&+(kr#B1*Em6fykPLEp`=0kVX3vyvW=CeR(mU`Nv;09f_ zUepc~4H#EP0VkyRgi;e|;Vv$i3#(1z7UoEmxWtPiiWR!ppyJ1VRPpbky1V@!12nY7 zV%Ns5zPN7JL==zDQyT4n?23*`3jyJ#NaW9jn2gU;H;*N30wWs|6#HSx_p6;mO?F%c zB4q-G&p4jt*P=(a36LC$Nrn}9k%znl#dJxeS(vq=IjP47zuwnb5izs2oMPW9=Y^-kKpUdU!AL*I6)bR(KN zbrKZDv#Ox0Dil*f)7@gxD0oqfJWL9?3`>KPavaM*sxGOTB0)8++fXF34Yjn1p=J>!F=(l+RR~pjkGg2V zBHxZ{C?sQL8m;@*9d|e9BQ$?+*9FNUwxSb=Y{`U*BqM0@whm3x$cs1$kvc&s2`xKbgH%;;wo4f79)i48OhqTS7a?aLG~HsxWS6 z@iq6h9lJD<%_Vx4C)4gFLVvo~5bGxZ2*i8PnU#=|uy0NmpGTb}!*{VGHB6p|p_n-XQ05i0D z;e4fcWb3`g<3stY@@l`y9L>Gm1Gb!(KWbb$^2*rHjC1GE_x)>+d~g{)d+3wF>-Mrf z^#0&x&-INJx%bAAnX~WopZKBw%MFwG=h(j~WGOsph1+FE8U}k2mHEXSzh<_?4ois%(%hHRY2yq<4 z7=t89@Ke$#2!epaFvMlJfs_))828|@_(~}zA|@i|HJkzqr)kPXQ7{qlc+`Uv{w-Kc z2dtE;!Q)X6N~sE0`^M#L$frRU_b;EgS=~WO3E%e*b9tWc!2K6j9&tGv@_f>7gq;Z% z(*e&XecV2Nv_pcO2>`S{*;Ylc-fVGwbkp+iPs;Hf}kh|;nP zdACOE_?0k`fN@3Oazca;U8(|gePd`oUqkyr-!!pO(R)Q=KRx3jZWQ@=$}>^lG;)Gn zRb$Yst#zloT**^tawv!L1m+WALd}$$#R2xS_$q$XKG(c))m{&Q0DEbSbJawRR9R?| zkkjpZZ3p6l-w`UREI>&RAdL}uk!N|CoM}N+rGzSoEFV>Qz6{k#9Y7F(&4Dqrt(nb0 zbzL2B`~Wy68c1pk5f!m*s3v4Sq3}`23cMk*aUhGVB1k4HBzRz2R#dhOp`?qfPhxW_ z3}3juT(%IKgrgQAm6xozBE}6?j6s7{L>aOPNldUv5+LMFB>}`(m2KFw$<6_}%UMHJ zkT6CO5J6NC*=RflSy_+)YZ$!1MkNzLpja`W5FTi%7WVRh)QO!38N|6xhN1sa(~EQ1 z(=jA5m%?f$?8J+d?UU5aRQAUnG+7ztY`Ro*Dlo%Z*BCQQGJ;HH+P*^cHm9>pTgW0p zxAsybq=~mcF^f|BuouVKuYB$sp1=IVN<53tLP%DcryF zRr+>WJF3D-j|+#j=1N{_?HM_Q+9S>P(x>!J(zq`SBzw|{Cto_Ub9lMC^|9j%%y?tp z)Kcok9bcsHy;R?Hu_=zLOKK%HaYacq?LN&X?g?j7#Zl=Tf;oOgd>uSp6_1~(TiJ2**>^JmnUJ-v zv&O90G`CiFarm=k?))9sJ$>fn&)*I*sIUKli{Rr?*}Bgq!U8Zejk|;e+A7YoKo^xpdd~{NMWaQ~dw{ diff --git a/src/main/resources/assets/campanion/textures/item/grappling_hook_deployed.png b/src/main/resources/assets/campanion/textures/item/grappling_hook_deployed.png index 255f45e0ae4110e46031cc2d8bf557307c8d62e5..7a3a6560df0a1cc0b4e257cb0bddf936b41ac08c 100644 GIT binary patch delta 285 zcmV+&0pkA14Y&f3B!2;OQb$4nuFf3k0002;NklQ|Np;u@#23|Q&S8ZnD7}G85#M1`SRrqOP4NX`0(Ka zA>W|7z*kT3|HX?J|1Vjxh9{ba~W2qH=|h5`TBSs5R^`N`m<$jb2i?)m?OG-GuE%n$|! j28Ktsj^WijI2Hf^Ci-(Keb{}R00000NkvXXu0mjfs9=l< literal 1736 zcmcIlTZr6L7)}>@+tOMpveE}lv!bnfCihGdciOI-9cRF-)7`<{f~}sMoS6wb$w`y! z&g>%CZ53Q(VT&(P`XD|DwOUZAMM`P$snsHgzKGffeNn`R>Vg)jCv&q%x7`;*PI6B2 zo$vqtOa3gD#-7>Qzq6lVn61TvHBRr_)3Ip-y*_;77Nob$Vc}rRFk9|V$2#WZsRtQm z{duoEl}y>snuz!r=n@BKntn*p3^TN^8A3FT6V}01FUWDfeR`2&JvYZqs=j z<|8~YKUPNb)5vhSeS6uVrb!8WoItke*Mrz>=C~HGN$2Tfo?}~(WID$Urv}+6yTp!= z2(xNN14vYKHfv-=O%Y`6Nmdd>gBNsOlz||cf@Z2&wsUaQTI5#DaVy`kMOQhlmL#Fc z^NmI$(~vVHs`8>?P!5TgBtQ`$o(mG#1VKF5Ww3CJA}>rl60j*FbjVDSi*fr*& z-rjH~s<%9K5s&NGr?8j`6MLq@8c9f8Bdhq)d)@OUG)E!~6B3mPsdp1q>awsBC1-a} zdVxzC@t#ysX9Koif^(cCNCFTPdX`1WlvN<8rXaL&HZ1}dCU6Z%;(C?2d*W={ECz7` z1B8oKj-y&Kp68l6!jk4lGSC${3tUCffL?Jha1>3I9a+;WYNe%!?zae?~*$F^$CgeWcX9EZ}}VwdYY_U;h9wdrirHforXu9ovQCMK1n z0V6zIrD48jLGi08kKydyb+0Y!|CjDgKv4|_RZKf2&!wL5X-{dVga2=)TJLV_KV3L& zYU#AsP3fZ7k8wb$Bid~@-aHOyr~bHT4VU$$3n##~%lo(Ie|V>G_L0#88+S}Dl?lb`u_g*qs@bl-T40VbEmCWcd0wATN7WtC0p#Z^ZCV} zo7RzQ@XY%C(@SFhwZo-_b$>inexmSZ;po^W&o4iE;sNT5w z%@+?054>>hyDfiRF1?ISTFhbT#rKY1|6tS6D*@3?@A>nm-Mh|SeEanSD?iS^()Vt> d(m(L~nfv-mmG{R8`EFoXaA diff --git a/src/main/resources/assets/campanion/textures/item/hiking_pack.png b/src/main/resources/assets/campanion/textures/item/hiking_pack.png index d92638131e328c99d1243849830ac8538eb0ee4c..e57dc126b1b6fa796c1dd829d7198c307a239ae1 100644 GIT binary patch delta 473 zcmV;~0Ve+H5%U9(B!2;OQb$4nuFf3k00054NklZAWkx*BYyxmJRA@w8I!vhThvIhDI05TR@*D=?tLibP;w9_8LwV%8zo!Ra73Mr zwKkp#=p76n9^va~jC2H_zkDmXS#7W2sem_c-&N*dtaL*^FE;N*%Lm~5?GF|od*%!f zUEJ_=vBBIP0H~%kZi*3#d;k;V>?SVE5)`&oQ=*!ZG*bIj8t3@*ioX}hI2cA_>pq_5 z0G*f5kd7e9rX<-E=?J2Wo4Mvv2D1qLMh*}@e}W_GmCFBx&~M}g*+cjZ#!tBWv=L=^ P00000NkvXXu0mjfJLuf6 literal 2282 zcmbVO2~ZPP7>-w~pkg|m!l>1CQSe~1o0DWEAS6-Z7%CVQDIS~M4QxrWA-jPBexalbYUcKzm(>Q^kZ<+hs2! z#~UW#Bx@BB6ldK=w$N7E#&ZBG_G0bHEYEVu z>?^3f%g-4Ap*0x1HeRa5YW14ncwHKB!xNB~qB&!Rokrtmj&(XnT9*c72D-hm;~ED| z@T|kgvX;(7P3)8mNq{HN@TrWAV$-=1&upNz1W&7B2`0f1Oo~WCjbarplj9)tm>kEj z4yb{p7<0z|pb`w1%WOU5{=qzNigIMBd%dBtOFPZ z>ZH%k>ouB*4%Wii)kt@w+#1tx{5mhKgBZNsJm6{1NjhW<~`?W0TbeBNqehTbY5(=?NjuD7VMiGcf zDU%^8h1rAFi?BB z-~{PD25Oje=bxrv&ouLr2)vyK9kl7mG$4IVU39=W*37394mvUkMC*-phrUWYN2I-8 z`r9S%71Cd<(|3{X2`iaQ*pg__Q&HIM4C?Ma9Z5l7%vbx`Go7jv4%(l4=3hjhL6-8sChD93mD9(!F>zt9^|%gDp;OK5&KNg3_?^V&%{y$0>Z} zUas-;#4XZF7!AAcP}Ya}ooYMqc3mJZADd&J?oDYOby?1Rt^1(2N@@; zilCkO2Z|rSj)Xm7c>SrsTy25z)LytqmxgYvy-bpI zL2OA{mkQ_oFTO3zY;ygxbgpcG|D$aS>f;Np&}$MB1GQVjCawA)*SBeQbIo=te?rBu zC-GN_@RL=yY>ml>E*oR(zYiXs-Q}j~*9|G3F6dppJg8T>v(~~3uT|b;TDDgc-0q4C zC#f~XB{e~!U|B+2$cAteJ;QM2a$2lv8CBLDyZ diff --git a/src/main/resources/assets/campanion/textures/item/iron_spear.png b/src/main/resources/assets/campanion/textures/item/iron_spear.png index a12a609354543ad9cd2f89ea1af6e20a7d45d4aa..be5e3159c72e9b02203058d71405cfffef1b5670 100644 GIT binary patch delta 329 zcmV-P0k;0V599)nB!2;OQb$4nuFf3k0003VNkl|*49>Hn;Ud?u!a6;hEio8mSrIfL#7n4xj|NC1H&Z6WAe&=o)=V> zhe?V(zWEFP8JI8kM>DjYIy0-K-2ZX|-!Icd%Hu=eB7nUK`%{{!^A#0J3Du`=5}Y@ z-Q?~9KC}gjleJE8yd?-aqLJ0~LKT5HEkP=_|Ak~M0g5R_EWsGSXaL4deKo=!V1d1R5D5)@!J>$x>&%BN%Cf)^f?sn2R23Y5pyeS$eC%0nU{Qw)JtBiH1Sy_n z+Mr;&ZMTl!EE6l3SVgV~Vp2${4m5Ea=Pr2VdT!0+adg5Y?0Au7Gz7bpRc(@oF+b9@Gu!$WN8kBY+RW32nwi|r?lK^ z)Kn{FPG(HFCuS|jq!oYP1_P2o0ZH+)Buj#%2y!wnv##kd&OQ@Rk{Zw)HLXHz6I9EC zBvf=LX@Zpe7s@1Kq5$0yY+_iTo{bn`%SJ^ax=xYj+GT`kTBaTg%(7E9&S%r`iO}B~c&(NF)tGljEv@NI?>egoc%Z0u<9kE&D^B z#kL?S@7PbcF+=UZ3Cm|)tu?pK40*meDqCD#E)d~x8>Dy~_Me!1bK2UX0^4KIa9b%6 z=JYnYXuy102r9@UBSluNJL*onRq{SsynX5b7zU7aBp3#k1gytd2T(y5Of61`sw7lH zF0`m`N}cI66e$F9OVT?@y;)XVLQaveGgahwPG);b+_De<-*nq0BW>LO4WmtD#PBF> zC`{ZezWUmRW0y6uKE=-RaM->?*hl*sA`YvQ$1a&uUp=sgT~ME7Gb4HJwGX}ly{pna z!-vK4)j57S3b{uwtaZo>>)kiH$Jg^`4>eZiy`|(BN zZU6K4f2eUQ(SalLKX&eV{9u3n)t6qM`Rv!|=#__~Ye&2K_5u6dGj~;g`~AM}Z*bE3 zmmO;#jlcNTrFXy^r*6LR;Q5oYD?!h-;kDC8`!01az4FK5+S6VB#q@VWC;!|dc79sz rE3N2Xzx>$LU)PTeb{s#me7)<~@zr16TkaeUFWBtZWah)sXOH~@)wQX)kw+PT_H96R;0VsgSL1b(N_?}c}r^jWT%zq13YAvYZAek4$S1pN^JvMzL^dcdkWttN4nGf5Xr z(nY0Ti6B0|j74s5NDz*RvwW?mi%!sm(wDF;m*_qk9C3idP z?k0E1gM>f}p@_wzf=C6yCsEoyRVud9fCb;QFFq9U<3aI3F%(3UID22VlEhGOV0UL{ ze)IeP{vR{5JUMY>_l}_*f*|ZJjOR=I`*89+)W_eCudX5f=?}(Vj09olK=M2wy#3Cg zAoP9em8asV;tMur^%Nq^p{Zs);AlZOG|~(Zo}sbm(2D10rC+XIlSGeXrIYC*ECxAR z^~M)MdVFD`j2C9GMWm5u#6wM+6Vz#p#AdzbM|LwSwRmmbPljblY(e6gtTdV!6sL-l zVvdDWOs5Qh72OmwR!T8+s2NX*DpV{PnzEt+sMyf3(;2bTByKGvu3gGM*RjR_vQjmU z16!6GjYg`WrC3;z70cors;sJjBS19o$EXSXXt>Lerx6alAoiFqCXC2ovvF49O4}~f zgC4CPb;860CO1(aD=C<`)CCrcn?vjM9y*H0=D3xP-gSwi@_az$5{=kwi0RlI_2c2L zF@k$*gW0gw@|0ki)@Yr>A}&nnnF^{bW>J-G;74z|=S^VeLW*J*mKm#c6E)do5minu zK6%pf32Q_L6Gfc`G>>AMl~kxg0CfPhvI=cYwN(Ycv<+b!TI6*=P>j|C>y{1g1vBEg z^IL%yi*~_}V&r35$Y&)kD&={^RxJb#3JK6n69HuCDzHqd06lFuSaH;J+G^|K>+=lH zCgDrgx676=%sF}yvZ5@~3ehqY6GA(xvBnd{Z~L{vI*SS*a?48<}Gpr(|h?70jsaNLV{j^{fY={SA4)2n%6 zt2%9jlTDG8a8eDF3u+I0>x6l04z<@es+5y%QYCFz#N4=nLONREDf!PTls6I|p}Eba zn~sywA%Os=U7pjlPIxX%3^diEmgcICY^~fk&ci($ z@P6{JzB6)iu(m5q{&(@U=I%O#c_Ldw{A5qMy(@+P^e!dp^Eie4${BD+zvtK0)k1!> zY`%*BTw5F2c3^Q?x_t{SZa;N>;>5Xg?+)(CzVh1b?Q@rx)&^$ZA6)tP>xX&K#F`tUvB#OXJme|=ZdR^^c!Ot^e>`b__CtKXK+{B(LB zyXIW^;jhn+t?Ww{UfF+Bcx(TUebAr(edvR;gS>rdT%gmut^E98ZD`LoYl}x8+cv!L w(#7+8$@H^lXULs|_-23q4Wabe^~w{1|HadL&tG`sR&wnY#wPL~9iCqL8zDY|A^-pY diff --git a/src/main/resources/assets/campanion/textures/item/leather_tanner.png b/src/main/resources/assets/campanion/textures/item/leather_tanner.png index 704a6de1b04e0a8dcfa48c4de233ea923f58b95b..890e5b42e94f521c58789d94442b967c3ad49e7e 100644 GIT binary patch delta 323 zcmV-J0lfap4&DNgB!2;OQb$4nuFf3k0003PNklLEdV^^qt&8|?_uO;7 z`=4_z{7WUFE$ilPbQO<|U6Rn2@1UQcn_a=jrx$$JQbz&sU4M)D^Q&aDg|-p^Fivv- z;>e>YD~hsO(ae|4?CeMaN3ZP$jxK?t%l%c-h%2>bu>6u?_K72p)AMWM$YUAO0vzn` zwVWwvR~t1T32pIRi_4ok471-z>TPee3Y8i|EXs=Ez)%GOFdP_+)0}L!&-&q_2TeI!TY;m?Z@%{5>jO}y VXZlyG9(Vu%002ovPDHLkV1k3~m>2*6 literal 1867 zcmcIlZD`zN9M3%Zx*KlugVhZdQU;q_F0Ys5LeH-4Ra^9GZI88MtS))-E50vH#9!lh+)`*A?1{21bQdL3 zo@dJxmCNNqIWA;5Ns5U?5C==KEQt`LJ8pVPo;2O&3PTLKz%gvkuuR-%R8(usixNm_ z$%Twvr8V7hm{7o|ykb*Ki1uBo0ORr1p_xn-?RuSAWTmY4p2Tiq+=f&ibgeN5z|Jf* zz2=HB4OGwCV@|s0sRk&Rh8YBNkuaue%1&9H<)*Cr_)&db^~RPv9H@Afld!CGB~iT< z7Mw-o_>KX?)U2Gl(^phJ0Aq>=qXbK{G)eO)WeJ9r8A+xYk`Bu>U4q6@9cYTDtPN~w zhCaR)Xgn@=o35vr0CvZs1QHc83{BP*L035)kO~);NP*>5Qc}Y_$uKZXs~pcmkuT~( z=VKNa^TX$#FO{uk0mM;_kjx39AhHpLWONCTJj1hOMC2hE=5(Erq=?Q5YK83?$3S0> zlD?bOSEV6Fk&}3i7DW;Qpp&}5D`bRYAPFN8R#yc8bzLBE4amCXWE4~wJE-~oD&L|oY~9Z8SX)9m0qztEt%2=_ z8&37lr`s0KWS)Ov$MEdp_McCZ_215IdV9V2Qq6(B_G7;k-aEHPDl9F(61@4^o#2D> zliEQvW;Xu_|5*NMTVQWs=-lm3>_2bqudSW>IH-QK)&A{xZs@`{hg!A<=g+TvXkvjt z;K(dp_ruG-zdkBY?tkveWHuXHWR?=sb@nKJ?c(sBnKvHmKr_(X+}!wi{iTb&$G@&A z6beT{EgI>e3-tlCPK_NkK{&Vt-xXY0>1>)(51-vAo<2bao6uPK>-HBnmX@ira*(?E z&asv6zj}D#%5dn@nayt=A;b?ZO}8axwwO(O1KIgQpJ7jREi}~E?mn~ck=avr(~X;# s2Yhl)z1sf3^2m43wx4|U%WFaG^7R96EzQ;C{oh@8XHV?i_Jc3}4a+QR(EtDd diff --git a/src/main/resources/assets/campanion/textures/item/marshmallow.png b/src/main/resources/assets/campanion/textures/item/marshmallow.png index 50d3a11be5640f834ff3db24c8b4d97cc9efc83f..02ca075b7ba2b93f7089a663a2b56ad4c68bfe02 100644 GIT binary patch delta 329 zcmeBTdcrh8rJk`k$lZxy-8q?;3=E8No-U3d7QM*{5*Y_PJPt16^!=asW=E41&sUum zlULO{j64cHIv$ab__tX4P>=WKeeK%Kjq?(94;Y~Bz*WBSAIv-NqDUQH_4SS=rCq`}!?Yybo~_jk-;d{(oD?Zhe1g%(poTiEs5 z^Q^-HCOL`x`u}wC>i_!pEcliKiGTmkOuYNwdy>0*V5VB!3BTNLh0L05#MA05#MBUS;J70002INkl1R_6clr3?Vp8I=#2diC zz`$T&Y6kZP%r##=eZo+O)eEEmoMG_&!#9+0`2OJ=@urp(R{dYMVekK|S6{+$NnsV% ow1G7t!3;s>_w={nR6E2003PE>9spEUTmS$707*qoM6N<$g0kvvlmGw# diff --git a/src/main/resources/assets/campanion/textures/item/marshmallow_on_a_stick.png b/src/main/resources/assets/campanion/textures/item/marshmallow_on_a_stick.png index c43897832ded95006edb4c57f76d2ddb12070a7b..b81af73e1f5c0d2307ab068372f9b9bd823d6144 100644 GIT binary patch delta 245 zcmV_n z%m3fMfB*me`}hBQPe1>MxrTv(fq{uwFEB7LFg$+sgW<#Tmu@Ix1ikR^=yW(+M_q$q z-rRW%Q>M4UozILUp>M9 v6C&iv*F11G4~(-J7#JAjh1kf~Oep{WXJc3(9ZeE#00000NkvXXu0mjf=R|R) delta 271 zcmbQpw2EnhNZk{`>a6M2DGz`sP>l9sweA?CU+%5BIvqOLlIu1d9D% zv^4tP|9^jf|9^jf|Nr~dzkb@EG35aQpCeU`Kv4hi<7#;x`FZ^6otQ+A&8}@nBX9Y zAP+Kwf@mxrHS{M4{Tjou|DhsibS@HHT3T8vF`60#$tNU|s4p-bG~y*9hOa?1)0eYn zy!U>G!?`f=3QM9EmPGBp{q#5xU}JL;w=W1pHGoJwD-7NVI)5x-Nz|4^0|2Q~3xJ)y zeaiVXcel?B8jU3A!Hp)YZiOHb!{G^Vd2voR(K2pdknG!;7SGiMK@SFScmmXv3=8Wa zMH>H@&jZ~~{z3_wlE&}f33h|y?v=MS<wDD1|moo0)l^ z3$v*^UkSLldVj3w)%Dv!SQ52r2WqW06hJ9_;PIN7v(FH@eg(j4F^(7*dhqVSHeQFo zz5Gs5{btq(Z58CAO1;s-YB7>bS9nss^xruA_tQuefHk*??5C;=|1s!E^4m3lzPfqegOW(i~o5l&PV_N002ovP6b4+LSTYY1+#Vl literal 1807 zcmbVNYitx%6rK_nOXXpT4+Nv*)WjFF^VsK1x-IQ)OE+QGO}pBy5zC#KJKM3lbBCGP z?zYv0m^4te!J2@IL=zIiFO7l}0A8!}RQS7pO>v-eS(gXo6^NEt)_XgbpdgjBZ4z*^@IAsjCsHHz2W+8HEFS z*N6psMiMDyWKa=QsSCazQ`q3vMKNmJ=8@%y2%M87J2gLD~zjPg!|!b-~_ zTiKFxRbgNj=Ahx&7|YeL<^Xb#J%Ij&y7u}X z4sdEEspexzExBCHh3#|<;V>!*SrTohhE2$HLmTBS1$GQ!nN4mqrWmy#aFCTkC|fHUXKB_?vwVsRh-?^tX%;WoGE_pUt_@!Y^_QSN zF@P->L2=2bzyUV|tBR;0D+h4EdJbeDV;UKXtff(mqAaqoW30}%ct0MECM~4tS^UE8 z-rP>cJEB2O2nK21%a!Cxk{CB^2N(*B$08I?j#t-JQ33xe!T^WaulNJW*U4M$|-Gqx*@)DAM0RaS2) zH?4{kEOo(@R~4WHL68oIct6dn{tzv&0fm-TUqI$GPT*v@nQ?mvQ;_9VnU+}~S;~K@ zvc)dl)iYdC(F3>F^pK@u7J=e6X@pYT>Vzs)+179Re9E+i0f*{!Bi7aj)S>A#8R3Tjh-qT&og&f8>IN5Hj1Hv=dXna?K}0!s{~P37mu~2!V?E4 zXA-BAcYHFluOV<(W5bGdYqx&M?wy!?FQ4ixF7NMp{+3@o&(%HD8$EwsUN^GumBvjw zcmEXp?VHi@ACK*C6)wDXRG$re{po;05Sd6 zrT(cp;`7eqN9N|f|M2pftViFwVf$alpG|Lla)&haL*uri*QOHhr;TsPSIO~2>N~dO z(5__c^_3^aS|$0#`q^1SkmR8Q>!0Y?#}1vnwQ2f|mmB7P9(nqyQ$=NV<1*r2&(6-t zYkT~k{UW}3H*)U#D!=>f!^^H}cb+7t0~d*deb1b`XUDNMU!OU0F8#pDM@RcM{c*bg asOLf7t}TbhF8t~KWyL!Zv3J|Iz3?|S3S9^Q diff --git a/src/main/resources/assets/campanion/textures/item/netherite_spear.png b/src/main/resources/assets/campanion/textures/item/netherite_spear.png index abbf8678870e3c083e4c7baffd9a622e8768298b..ae46a511f95b24fde3f86395899143dd6ebc5f73 100644 GIT binary patch delta 398 zcmV;90dfA`0;dCzBYyw^b5ch_0Itp)=>Px$VM#5kiAR8P!z?_E45}Q+FDB! zL~WBG#3>b=tl}UY1VK9J=H@@<=2md**y0BPD-s(Dsa6~sTVtwq5XD}ngnnV-nclmP z-#O=9rtnkn)6c>2&|NOo$UTRA=@H4L8s!RktZb>Mw{8&*3V*I$Jkk3{54l1f?Uyzl z8}|SJ7UTKfBO%9eamIERaDaz5xJa^;=j>rabuU^aSBr>&w?b z6(!n{GpK7FyghfYkXXXQ-8Fy!OH@UPvWXaqS{1XYBx`hESzMT5x~?O_^}vY87cQGk z?5}58QLB1y5r3}tcLTR}*=%A{PBYtaJZMl88>pg0QC@&$7%&~1$??Qc>Y&CNsG>yk z%NbaP0bWrU0GN&q)3GNu4UNK4UO@Av>cM{U3La^p5 zSFV6<2f2dr|Ns94bsH!t|94SQWY}=}JeaR%V#5eCh@cBVntu(21;Cp5#YMp`foW#r z_>A8LFwKYWJYWbgHDrXj00cmq8SsSx%-JB#wkisYZ{NR%YeESeY%Tz4=8=$OcyawY z!=3kU8C3*@QEWv97%l*57Liv3YnIT|1pE2U`?p|>4KSf=2HE`J!g;u6LI7?6vdszx zhKwBS91KT}9X%mv05~Ng+YItEF*d^h6D+i00Y-{u5MWdm5CTU7F`Bg`*-!--7#IN8 WXo<31n5V}80000!Q diff --git a/src/main/resources/assets/campanion/textures/item/rope.png b/src/main/resources/assets/campanion/textures/item/rope.png index c5ed33239fcaf7198554800f8d259357f0ea664a..3d3514554df68df85d97af815c27906ca75ad3cd 100644 GIT binary patch delta 336 zcmV-W0k8g}5$ghwB!2;OQb$4nuFf3k0003cNkl+&lY z>RE7U&aSFvxO@9LgR-h7oPPMI?EjLZk5LR^#-`aLG>BpO%vlT^d|V8N_8(!mcIp&^ zu!Jasgscz)=jV3~mmYs=gsEr3<^p9^O$KImVTOkfUNFcjNPjT!N=P&8SiO!xMphm} zEmi~W-oDO|QJlf>`NdO)D<{q}e17qiA-k%Y;mPBN7-~_%0OtJNn+`HC_%Sdbhr_{r zI~cB?e}LZrnDdp3H5q2~&S2QhaFBt4fdNiy8Y(c{yL}J80W*4MFu3~JGh`HJFx>7A-0NZ~>AvaGZgmLN#C zZAvg?g#0zUq{eN6tct*vjwc}+K}MISlY-O$3{(UWCE>u|WXS3rH#X3=k%SPE*lCh6OX_9ggq?4c+oTPZt&T|el`@>)~O%C&Qp4YOm;FBAR z8b*>Qh*T zX-5k2WS%ymXUhZ&Mx=!#LD@(%r3_G(^0;K97Rv;eB?81i93%`KVyQef8C4BckE#!$ z&JRBj0G8J8&&TLeOFW(rp&M0mU>ezibcxo3O-Vr10bOm>Bv3U6$}BUpN%EB%5DZld zs%k8^P=TCel!lq0Bc><`SxxCLb(#P?f&ttZP0}PzGC1uBQZAn5cvyOp<4Lju>Q`kY z-1H!nA%hgf(iB7b1X2CL$P`FC$;6##9XkhU%Ek z{l3b|fTo6(7#z^+#*RUKRh4$iWw+zBjmpUN`*~kNH-v-)d>%Iji(^w1nRl>G(M59{ z&Qf6#XBgIw3#2IEEJr&Wa72=UJvZN@N{yxka`R<#zKanBDNNyZC&fW?vjQ%PqKpep zCneE#S{7wCH-Cbrz%3}mo|?zpn5K7lucE_MZOU$)iC}iN6;sfRU3ftlF`^1_CG?^vEKS!FvrZ0fe&(>>&& z7PO+~xdZ3Fn%;AR7hP0wa`C+-(#K3q`+#%3cI;Yn=hE6AHojcyX8uU0&)#+y-Kt%< zDqTP7Sn+|1q6PE5ESxFcx4zN8&Kj}wJ9V|8>g3y3PhV@9)^|u_NvLnUy}s7EenmmM z94Q;P=lYqV@595_A1r^b{KDGpUfXA0+y3_YUY}o_b@umTFWx z%lTk^-O_h2uY7Y|@4$#JEac$Z(V;tBvwrTTZ#v{-PNPS6{x}k{IQQ=SG!Xh^THB?K zuUBtg!_B|{A+vif^3h*c?j7E@b#VW0YmS5B%V%!h2>sN0Wj`~>J?dO-=?SQC`R-*% zn=d}Z+VXtUTLZ1di%%4$x~~rPZELI9Yn?nvL}s)eUp{H|-O)ov9^Kk@XOCm{gumxs zXRGH`s|}mi6a*~8$Mx>>OigPj;=FnxHf-0f*6%j${DtmuYs)pTuztAk=b`2W)cd{x erIUjEzB1Pb1xuS>oqOB-jPO;B_iPz6v*llJnt&b2yxXMLBMHm^3V1ZJj=u|VMW3_NGt>)5n4UD?$`#k4& z;J|;r{cOV9&nCRzWG23bb9xd*i2`^B$3|$Jg0LShIyf&fD)Yv2!%kMdKcl#n_H>C7oJ_+1%yIiS_7a;qiM0Gsg#|5px`H= zD9~aN0P6R)G=CkyeR&k&Mzble;49{5qb#V?Qh^qWP_I>SUmmgDVNh^zY=mrg=U|IugcgUKiidDxtSAgBE pRc|L1$Fv3`g=3eDI`KcfPs%c^z4?d8+W-In07*qoL_q}$@S95chny_R0-g^qPCFO4fAtH5GdIPRXd7utKyyMwmO z41~d41_>WFG-h#eAB>-dnVKvvVF+8|GRFrs>XK;yHAYbG~ ze$Vg!^8Ek*JJ#CLR93pJ6vMExK(oIM^^aQbLnY{2v6dE5_psJ{z`(H0m#nwogto4DD?sp?*S1-^$<5NTqJNs_7EM;AQRMl zAgVME=wSaqOGp~%mE1B>zZ!z7nnsty2D=@s^bm7@XAZfZB7TWxcSy^c2 zA)=@z(C z(sbQ~xR$3?jjWrH!|0@_(JaMSCS`!Kl*eg(dMqPcmS_+IaiE$8!m@d+7KJ7>qVQj+ z^V@d`K&}l2^D^$KOFW(zVVDj5$c(H*?uj-+DGktVz<_i9BgHTq& zseeMz1*7L~C<+-_G{yUZWl0D_JuV`HmADuIw5CP~Jnu%q2V+o2f{}KPjq3rQuT_U( zC5ASPwx+#!puxwpZk{JOip{7S3o5a`&4j1}Zv=VkzHvt*de5pc{e6a&6s&G0gWmkxCR3QtvfZrRcosjON)AdD94ILxC zw%KgeOr!Gt?Q~^%1?&G%Ve1ax9)0W3kAX&cbf*8ObXQQe@3?qp?zcbYJI0D%oMz70 z7gv5+n7uYQ_0g4u$)%r9ZnE=zQ%BfSGv;Y;*R$hGmydV6e(?O@%^f4BN2vKXx_;RD z`3v7Mw$Arf3P)ax2u~<$_^AfzKb~I^|cRq+fN-` zx^e9_Ep=kg%WJ z_OUN3X1M6brIQit6Xo1;UFViZ*3K>Si>p_WL+3!%7bjl5$~<47j(vaO>=M8D`_XCJ znZg^kCTjQG%C=!@w&bhp*S8|lMYgzTyy(sC1;eA=A5_gh*<$@g0u3$xvwORT{{ntZ BI=}z` diff --git a/src/main/resources/assets/campanion/textures/item/skipping_stone.png b/src/main/resources/assets/campanion/textures/item/skipping_stone.png index 30fb1dace1bc511f3cb90cfbbc92ecc785f77efd..ad3fe9d3a98166f71b2f2190e91f3a2a250fec18 100644 GIT binary patch delta 283 zcmV+$0p$LM4YmT1B!2;OQb$4nuFf3k0002+Nkl3-r5JsQDLKwVFDQY1H zS1P1*k)*WAZ%k{KKOt-xJTSxX$hBZysQ(`mc& z<9f{~1YY-h0NxLW4t%wODNFQf#X>3W=W||mI{-u^2}AD=iaZZ_Q6M7tpD8M90g~{Q hAWAO(zk&ZK-xQ^1ZWU2JV|oAp002ovPDHLkV1fr|c5eUx literal 1670 zcmcIlO^Dr86pj?zIx;A_Q5QC*h)(go{O2WM(lVWlz9(iJrw?Wn3UhPs&3kcPa$}O2 z_hwuuZt5(A0dZle;6@M^cBPvlb|oT+;#vivAQaSvV7n1Lc|Wm8JI==lch3oy*ar`KpPyGHDhRZ!!>%~G4?tQR2?h-CudPorN{xa^Y zm+QfEF5yW7Qy#L$Fv$Qd2=ix#877;o6hqdHQ&0Ns%IA_8Q%_nm10~27Subww=Iq?= za)<105{F7>PK)zH7YGtoVsV)C)50Bk(umiEb@f=5#1W+2^rVH#p|~Ebh>JXDqS>$z zQ4L#cIt|q_6y17C)D+c`6c@PfvWoohS9mGIM2lFc>rj zdV}X(S#=!X&}2VObWtvCgO`ck+Y%R@os7w=tl(QYVN2UAEl*CJQBvDxTX}yJ zDJ3%NvjkuT2vciUS&x^z=6q;_9&5NHJYS8AAi;1By$0I54Miv~w6}5V-BMC~-5rq|&86?pyxP0==QpLWa_X_u#)Ti>ss0r0rDgx)vm0;x4FN(ALI3~& diff --git a/src/main/resources/assets/campanion/textures/item/sleeping_bag.png b/src/main/resources/assets/campanion/textures/item/sleeping_bag.png index dfe3d41dfbe6839723d3195c54655e02be7690a9..59f7a651e5203e7f8d9aa842b68c660d16243ccb 100644 GIT binary patch delta 345 zcmV-f0jB=p5A*_%B!2;OQb$4nuFf3k0003lNklA zt^IHF*%Sz{-ERAq2iWa)!CM2ZwJ*yODJA>;o++c?72J!hwSNF8r3RzbYK2mYJkM#G zCYXJPi=x0h&$g*q_etKh)Bpx75Qvl*P#ux*@<#Krm rKYd{&@BsJw{VhCMNs{5lIR;&=w))p<*KrIT5579~$ANo?O=!>QFL29KU)gpEFzDR4*mf*qO z&d&V)zyH^7W_FAW4YqFT*hEoOYcipx$@|XWX=x(=_g}mM$?J9}@r*}NZ7adk@W#V! z_fS;RVKX!CkEfnekX;Bt-PUlZRB#BIqI!Bu4nz~!r!|~4tr+v$=gSOj>M>?aOo5aW z$2l`GCv6+s$&kEE5ia69kqZSZ~_$VTrZ8t{Q`iJ>;5>Z`u|eFhb3q^kWQ( zw30%>snc3swM?X7TnRcH9|A#2WuT7gIA_w$m!0c~!+Bi5mhTZPU&lH*+qb=(y$*GK z`6>sbw5e3x$C|Me3UwErKQKkos1{^Rw3nH7Fqg)jJ?SDmFh#=b3bJvOxQn50yBXWg z*BUia3z-&3CiH`2rls3O@1a!&ScN{0F#-?(3&N}*XLw!_qKYW6KvV#zKvTAE8q@!U z3W@*}LAnY`B%?zg-Vm%K#jxE1Bng`Zn8lo9Wf{6&MkQ|NZI?JE(S=vfC*$!E*EY;N zS@6<>{d965F7dJ?u|kM1hnq?%Nz3!0g>X`hF{C&l)6^9mLrDe@v%I8ZRx=`qg@R_V z;b=Do8n5ZlKs9^SMw5XAYW6y@7c>bNK+sr#VT9F$2w*jAgjo>-T?BGiL{Y6~KkS-h z3&Q+{d4i1@Xh%ty9_i|Ib?c1cm#U+@NtflKKoo3)7=wcTW1Xo^n`>0y<}#?z7IT=8 zUPl)dm}eV)5xTf9OR9B4-Er#$@4>0-hb{sh8KSI{z8R$MC<0jsNC$KQ0vy&N7>Puy z>xUkRC}F;)(~X2)_&-AxYe`sGQ-TLI7 zu69p7(SP8BJzt)>cT0Zr?x8-nVeWYIH;cPwyN_($JNfM5!BK4||Lf)F{uwSlukBpY zs9eV%)O^c%TF#z%`{hd~o4>t-IeBReot3{>$h1?hrDwMP)HvT_Y&m{z;qTw)I-}~- ziwEg<&mR3`@HV4~dGWm~;_T*`{im0HZk*30KKts`UvlT)>IB~RM?Sjyulo+2P#@@N z{O;n1JB+zq>7|8Zm#K4ib)IRawl4m7_!gtB_v;G>-jt6%@#%#>AKli_xMJlx-r2n^ PxP+4fL+YXa7iRwjnKG9H diff --git a/src/main/resources/assets/campanion/textures/item/sleeping_bag_open.png b/src/main/resources/assets/campanion/textures/item/sleeping_bag_open.png index e396d0f1832203b6387f6b2902a98a87bb359c32..41d79acfad21b3c7c78b14e62e1eff300fe344e4 100644 GIT binary patch delta 356 zcmV-q0h|8R5B~y?B!2;OQb$4nuFf3k0003wNklnxtT%oBUsjL76s-g*<)SzcoC!H)Tn@xD?&Aj)0^NWE`l$6q} z*K6}{xUOp>r8NDy@Ba+bkbVXQI&%R!XtiYzTsYIDd{!mSr4|M*w!aUB7Ao z_WQl(2mrz`1mJu=v)yh1SglqFA*@I#MHq(MZZ}hwrRN9$wAL&Z3$E8I)9Dm|wrxq0 z1b{S6o&B$2{I+fFU^biCUI^jLeBXBk!$p9}Wby+RLXf5@zVCB7ohZxFvjVNPjS6tT z-<|lcU?)LURb6ylN0wzYO+!%>Ho+^{5nL`84u=C>*P)am&-1r1fW3&K$N(&tO91Bc zIeDHl9*?Q2>M0C^e=t}u0FTGxE&OXmQDpj5AFXf853qw$94DFp00005Ik8&V6_0m^Ddvb6IrLZMxW4toH1gGrMDUE}5Cl zZsIMb23pVuZ=iiKiuECA>IE;*hoS@orGf|r5gHM+K}`ElXjQ~`X0y8_lC&kbFgs_? z`Obg&{_mXsRAzLzt+lI_qNujiNOFw4JHzMB7V_VHZ5@)=UGB&uK1H=JhfmXM_qFe( zsFn}R?07Jqeh47Pia_1T;Yh`D37VpM`zkI(6F8uAIB(i<=IXig3~lOh=7^H!({2J6 z%#j%nAD$V_qL~S#=}g}PbZ-R^0~QV-U9pO`4=Qn{Y8Q}kIL$G16%tIunSszDJ)X|c z3CF{<5{a@%kX1USMTDr#OVJ)$5Nux%{wrD>)?P6{W`%cM2cyNk@xi8Gd1qlzs!11z+&% zQxBOINhb8YM@(CH%KrXM8*mZ^IL?T?$g{k}idt3>fT#jRWO)Vf{021b=%z8f9aK?( zByWKd$>=bEw*>157>;K_lCWvPJmy?G&(IATLBc6I9&t>flQz$%5{ZoG7-o?y_+!Hd z=+s~$DrnItD@KHBxal-V*?s_Rgj2~lL&%AkrVe6A;h`bxEKzEVRRmdMRap~QL5G?W zH53#Rh@)!7K+-{_Py+S+I@!<1G+oqmmDOa8kOk!&t0@LzWr>f)1f;0EEZ6rR^h|OD zVR6@X!h;!V2aK3Lsp@p?=p4qAwNcTet8xJlg~uSyps@Z}XKK^tHVoWe1{-F}1x$?I zL>C({-!XzR^zcBQuysq_aXSU?!>OBxo`bSvU;(jERSi~DWR+D_q_Co{NU{{;qp~j6 zQ{OIhSq7q3*XeFTuhEJM(9UCWr*h2hles-5?p%j0hwlGNh6}IK4TW+46<>92)3r+q zS)C$xc{pq|5%SS!L)a!fd8Em#x+|ZN2K99+IgnLfJoCzr)-v5W*l`Ff%)hax=cwDU z^u^kDbHD6an1AWP<9*S`K5Y5u&{OLzuS*@r9^F5G|6fZdO2?YIe*V-dtzLin>K(H$ zk99qK?GiHZ>38p0Z7t{q^?YaN-QKtFyvl#v{Q22~vq$sZ`z;HLiP@9#jkf;e>E+HZ z*MWNZ{8Z-6l^>ql+dTB-AK$lAzfNCi&b`oG{%L6Fw+kz4^yR-V&foawLVy0P$A?b} zZ!h+IGq-s0%EYDX@BRJ^efHVOR6u<-*?Z#L%AZZA)}HvJpYA>r_TALrXmaVm@wtBi D1C5JF diff --git a/src/main/resources/assets/campanion/textures/item/stone_spear.png b/src/main/resources/assets/campanion/textures/item/stone_spear.png index a1f4dce1c9390b938f6944cf1a51e8ff941967ba..11eb8a2b495cd3d996324c5330a5d298d1f9a2b8 100644 GIT binary patch delta 341 zcmV-b0jmDE5AXtzB!2;OQb$4nuFf3k0003hNkl^+Yl zguwaPDHSr{oa6p=0yP}Ke;Y#xfzIIp9d(XDMUMDs?`p?!pp-)8dkiThxvpDm1!h}% zzp6r*q?B~h?E(PIz|U^LY)kKLub|hT!m&+y`dEr)X5eQxV78?E!sHt{Lr$Y!BLKL2m_*5Oqdx}8WB|ChdcjZdmD;ltmI`7(OH1CoK`oNl7hhWN8U!&Qg4l{Lg81r#k0R@ty%}TLhAhmU+xOqU|C|f6 zGiOGRK5~>{n9*V(KS#%VlkZ51{y+L>8`9yPpzvbEFvq@5zM+dx9vf$v)F)1PAzmmw zYa!oFL+n>by5$BG%`g*_tpK7riP;LNI$nnR);GGua-b5$dQ^;SPjY9)tNF{ zts@h2lh3ddEsH8}NetPR+wdZ*mEk&iEjmxO1&-}N;(CUgN({0KrCB!ThlEwr8jnQ9 zV0AMsY6_6Gr&tMyrT`2XqZKcPE#8Zc_ci26ghD5X9p7UUjj-Y`#Tkxz+6}=C25P;imnNDp zp#=j$OoJq(4iKXOE?5d19pe}Yq(NNb#Sz7d18h+9V?V0-w^2Pf{*M8g+EQs?V_#of zcVHrlr;7687PIltkD)G+l<-o0PUMAN8Lcz{I2BcjMW6g7jFL`~O`La=O*zWj5cLt79w4y`9?%!E5u z!HH;9S9+~;mb~1XH5|4>7Ym}K4Kf@`>Q6A&+jjQNz(FGDs%_Q?ReA?rbYYQi$4wZL zsVdFZU3n+m&iM!~-`RE5#uy?^=4~j6yp0ve8>UKlonQkKUBot2`l0V}o$}PQC_`1V zPwB(B-b*X0L9a^aohopL59VM@+_w(@Z@Pm919ta+S7=W#LUNUM87Ax{U*~MswMz@x z*`jxOG95f3bTN2_h)44j(nscj>?VE0n9X8-s%+eczJF(tu&-Sk8XJ47&3>1?It1Pv z|7q**tt(dw8+88mU)R6bSZk!-8_9n9;0NZ(ljrg9=dYhrE?v5~rVig4$!-|K6FVQa zpB^u)sa*ZUx6JzQ%H)sjpWpbh{q9C~lc}f9k3F{Iezdx{lhuBC;j(=r#nw|ljAZA} zZC{X>m*gYEw{E_F`Tm`UQtMYA-eyAOt5J4dzRCR7I`KRm)=!7(tAN>_`S_b_zuwqN P-qzyuOn&p!;w%3EglTt) diff --git a/src/main/resources/assets/campanion/textures/item/tanned_leather.png b/src/main/resources/assets/campanion/textures/item/tanned_leather.png index f525c78b2d2ac6bcbe640a1cbc45ccf0fe8d8952..dd6305943259b484c505bb13ac4a13e5bd783f38 100644 GIT binary patch delta 359 zcmV-t0hs>Q5P}1cB!2;OQb$4nuFf3k0003zNkldW64wM;(?i`Q(MT!nT$bH`=G%XE2mTo1nXp=n%lq8*_V64~ zDG)$8ksi}fayl2p@jJ&$VKspD_89LCxv(Oh!005FSW6+W^ z70p7QT<63}vx$^=a1bjEO4~`>MXCg7i>r7EMt1+N@dX9{g;oNE>+S#m002ovPDHLk FV1j=&s5<}v literal 2134 zcmcIlYitxn9A6#*0V@)k*c1rMVkjbW`?$Nk+m!>#U7-iPwzgL&1cBMz+3TivyUXrg z@7ga?CB_De9}JLG9?`@PMJ$m>VnY-HmBf-DA%;f{MoCbS5ELQt5sI_dyA!cIqH&Ym znVtE~@BjNhW~QsYc16kL^2r22ltil|4Y+;UeV>?szq5b23vn~atX^vq#FXjoJBH}l zT}BWSKGovQPIIhAl#P@JDu#qS*_4UV1hHsI)`W5^a!3g!G(AM!IC7LCH6=u?@yD2$ z8AdHyb%%u-J8I){N2@F-)RM*IqO6DsQpka1HkH(EF&mi&dw3wTz91P8JS^{Hy!=9vV_1P^f;8&|3@b9c=ns(jhr-q@MHL$&%k#GI zUx;dP98;v}OeW*Wcs+)dpjkn{930JY03(3it~)RbbbD@rA%bk#(o9D)bkb#nl96^o z6jnOoLdq=C>UKU%IAC-Znl$TST$c*KSnT1@RH}%!ovJo$C9ii>Vmsb$BDw+DM%t25 zRU6Wsxdmg2TwH6Wtz^zqMW#^_r7+CK!q}oIv&C=>yTy2bAI0gSH>Mc25OfSHZWzfz zqUsAQB!|h#`D-*?F*5dZuA=+`6oC#3Q5?fDfbrp!#aUMLGon`jj9+A!5oiq8fdU

S6isb^9B3>iMs?ePx{RWc5QRl~G))m9CwpZGRiLU20#NYDK;U>U zkbDUFg1p4?0XC-#ua6jV+6|w(exz&_L&hA%2#FHMsD4QnfW)f`kOW@unfOX0T5zUFd*?j;_#OX%0XWct5Rf9HLMiG zb)uzU0@0?Ppvb?}gpH(O#S8_<+X+fCuAyqO0vkleB zKnqnSa7rFoh4h2O+pz6X(tWCzQG)>IRsfvOCjh9bD&Pb;palGWE*OvsuKzF6^I?@+ zpq@bZgr%wf;LKx{`>1*N=LY;Yc^KUp+C5lDDvZ9r_;Pdi9Ktw}xgmVAyWQfIf`5va z64G&;EPUmBbS-$2AjT|?Mk?dM?)ToRtUJE6bnDUcUoIWnxpdCVq48bcbY_3Nd$(kF zP%CG9C%*gDga&G0u;c1E{e$uo>xV7{Uhp3LW5K#sPiO0f$iRZF+cv+ncJ);H%JH%z zB@@S=nSSt#g+E=GU3=i%jG^n#&+?oc8*dLbZR<#%s6e&dcLIUwwV$ z&0%xwu^G;b+VZ|x>xEUN72TkD`?r_UjaR=PzoRt!s(x{M=fzWpPu$r!X?WZ!a{U{( zfBsb$ZcMF+_q=oV$u*~m-}$ng>0RafKY9DYcfVZ&aX7Q7=ficzV5IToTivbQhq{cu z-q&kNE7UFKm72a;F?MkEl>W8@(QTI_&n)9^ulQ`}DX?q!^uEd+yL#*99cyxL{%BQg Kq;J`#SN;Ut6wJr~ diff --git a/src/main/resources/assets/campanion/textures/item/tanned_leather_pouch.png b/src/main/resources/assets/campanion/textures/item/tanned_leather_pouch.png index 2d5142bca0caea820e2b891184d41bf5be388e93..e0eb3ae7b497c080b99c3132ac6df59d274dacd6 100644 GIT binary patch delta 326 zcmV-M0lEIK5a9xlB!2;OQb$4nuFf3k0003SNklcp0Uw~FLnfz+?bL#mVjwD(5Vz9taQwA%C@+f~IZ&aDH)#y@>AH?V*r#&8OMELHurHnUo>P%Ts^)PCIY_i!7{YW^Ifm{ Y0E@MZ+w^0*gct48tgD?-OHou^vL)U@-uDI1om0sF>?>oCyzX*ZmUW^%aIV_K<5jzG+)@zzB7_&yO-h z>39fvr%G#i~DN+M*IEV8D<`H3h)s@q2`?l9@PY_3Sxf+e5#as-1+fCbcu2QJ> z3JWa|a(YguX&H9Gn;R%98{jzfag-5&09YWgKuilj6BUgQvq07W7>A}v9~jVw{|57# zAZvl`HDKE?GyS&$O{KJ?<@wM;I2n&JL{!K$4Grxtbr*2XkxfK2aU6+km%IhZ_gO1qbVRhjG_8Uuo@{Lzon@G(}GKU|79U$Vc^3!WPMs zORk&^-@MpHQ8f=H<4x(vhTU76799oC*ME0 zvmZY(^X}TYzkr8MQO@y^k4E1bsGD>CFOCh(IneXt)<=*2Ji6%&MIHF^)5N)x13h(A*RHc8`>DjA*&`SCMlK#+o7ZEz zmhInpu%>@>xtjXz;^nrDGfsbPHk=q9XkCf+zH*+OHY@Y?Idf;Mb=|hn?PE1(-+6UM TE-Uv0S9&th8h^ie<=TG$y+^gQ diff --git a/src/main/resources/assets/campanion/textures/item/tent_bag_closed.png b/src/main/resources/assets/campanion/textures/item/tent_bag_closed.png index a5841f9307b474a75d34c6dbffd1e74ee959c3dd..29d19c7024f69987d78b8385877893af12402008 100644 GIT binary patch delta 317 zcmV-D0mA<94%h;aB!2;OQb$4nuFf3k0003JNkl0{U@i|DIluE%_?|S~+bMJxw5ddXb z(hpqu8)2Me0ze1o2d+Fh@@Y91@$-l<@BpxF6M%6#*}~?t2Y;Dlh0rR;mSZuUEtGIN zTQE*13aiWj#Zw6?k!_o_9E-chCjhRa8wSIOtIG=j!oX9!ErZ+p7=ZKBkh9}M#_5E? zFrwGn$8)>%-1Y`<}J;=H~UBv~N@fTn32w4160-|GOdT&In4O-t}&4y#uzpjh*qfv7OmN-S%Dk-CfyTTiR}S z+d>EgLY54JQ&7N&kBHF-2n$XfxJ@08Ku{1&h@zqbLfBAIG$PKg_i`G9$R)l0`}Oz# z{ons~RaGpUlzn$LhGCPu<(_JEpK4xNx1;~OOJe}tCaUH2I)+XD$h;=3n=^SPhTXPB z^4A%4zDIaLiCTcD1fV4zRS_D)ob%%<5L%#t2Vh8&UBt!y0Ropq7g1~X(LU7;!%}&N z25UMh{6a^Iz=_2CdAKvqBZ4S203MGWb>FJ@C3wYaS_F)LA=gag}W6E z;&zLJ6d1M$FXSwYgQabbxww^PIEpT!7#m45Jni7^g?Q>mAZwZ!2tMT8AQ zu<8W!#D)!3%07SyW>B>~RXv0}SXQthALTX_lm|ewyQLG;fyA&eL=f>Qh81*nTZ2 zYv&oHHV%qfMg#`9Ay^dnprSvmUZN>GZR z7kc%=65Lzrb}*d7L0T_;dPsblG;E0Uy*g&`unPM;=Wx)L;EK!e30RJ|L{ z0hLZbG7jqBAtur^ZrP;aXoHzzW_6;6%<_dY+PE58t!wXO7Gc-~)$1wt7p)oTscflP zGF5L^$qVdux&lG&Gl8?-pfT`+f*tWtg(j?O)vb z^`+5ydA&J5Ib*L5G+yps{rJEU&-5u5chR=rujT~0opn#-udKT8=F;f;DgFD-WpLp`mwX5bld)K>N8~eAmzc1c#Z1=ZUPR(A^@xk_&_IHHJwLf+Y4oCaWym5Z+ z;c)M#$Etf9zdLw(CwB6M&BfDKt!jJa%o$7PQTFu7!#j32~I=1<@nNNTCR@dZR-^?|?iQdu*&$g206@LM|&zz3{ diff --git a/src/main/resources/assets/campanion/textures/item/tent_bag_open.png b/src/main/resources/assets/campanion/textures/item/tent_bag_open.png index 31835314f8998a1d98f29c8d206c6238cf2bfc42..77343dba9853f975a472ec0be039f2d6c82cc806 100644 GIT binary patch delta 368 zcmV-$0gwLA4~qkkB!2;OQb$4nuFf3k0003+Nkl#G zOloj&z-U6^%pdTt>TZ}#j0?LY#Ki;>16T@e+B%RvT8oT&w)gJ2=iHNf;lCmF6+hpH z8GvC+;hl7T7f6x>!!Ssa1c2Miv#dz^TC4#WP39s^Q~hrk27eYn9LLzUjcJ-(U$nFK zky~;pyfepfL=;6^5dh1w5TcqU2-gJRdgthI9G4^9bWXFP+opNrq@<0K&L+lqs^e&Z zuHVXfS3aKGKq<-N;AN-leZNN#gaAA|y)v52g_RdQx4~?&)WluLn{yt37Enr}lq3j3 zP0TS{Eb-h%iD_367(5RF=-+iK&c%kDR}lb^b-P0N30b!ZSKBq}-TAFUeLVho6M%3P z=>}Q1^#%ZhiFo^%Zzo7eL{phqmc?j1EnQ-c;{zdTwHg4^AlWaqb{`#f&aT1$KYG1;yPa!$=iP1X zHbTJQ7-UPBG9xgE0&`@bksuLK7!v^r3M|GCLeh%~w0d++_8 z-|u;z_j#UMQBhu!HG2GL1VOUgr7kbLXX{ty2>3to;tdYoM#-h~RRkIHseWa2%ovl4 zAj97leN|eO=Sh~A!Uj%|0>BUp%Mgtqw%IY6<7{y(ag=>AAz|c5EtF>beT@bDE zRG>~t0jSx);5CwonQvsYN zDLzRGr4Fhh2~?3j@>k~m4@q|rxOSrf_X$7g0qG6D5S zf*5SL9h5e+6mts{mW;q@++D!}&juwW%)x-gFjox-IZ}R0nZ16LdxDH@pXC$r0j+NY5$ZW!WQI0_sj!Z<)2ifSR61S6`rx0 zY@|Z2I=Kpo1$vmen--3t0%nrKX84?mg2M@>FVmwFKBR{)h`@=fz|m@~I-Z9h8OPi% zhtJa1_1Y|{(vkg2?}VSaIDMlD`7XT#ZTgl*Z9%Zo=<)Q^aL*JE1qIW=XqmN{t^ zc=Xq1V9UDNyJpKT#a(DOIr-K7d!}Zc2ruYV7g=)$j`c<@XIrSb6B_>fc=D+xr1{JD h*ZS9edo}<1unQlY8Qfd>hF|~Wx{JzP?-u%B{u_bv!!iH> diff --git a/src/main/resources/assets/campanion/textures/item/wooden_rod.png b/src/main/resources/assets/campanion/textures/item/wooden_rod.png index 63ef229f3681c8132ae0feb76b3802eb776ce6d6..863937dac5034528c7d9b802f2e2e90757ba9a41 100644 GIT binary patch delta 278 zcmV+x0qOqb53vG}B!2;OQb$4nuFf3k0002%Nkl1t{+5{n53?XqS zm?4AF!O;tFckv>;oL)tzY#qh5QyjwDUH1-@fS&o)?XV+B6pyItTr zX8B=tFtn_(fa}Koo7ycjjs24zmAlFWLtsVF)VT?+2%0*#!KGj<44@UA$G`yM($Xa` c3I_NEgjtl6)DO~@6#xJL07*qoM6N<$g64XKZU6uP literal 2021 zcmb_dZD<@t7(T_En%E{<1dXW628lJD+u4uX+g)<4$z4nidS^aP8$m+nc4qI^-0iNr zo7^RTghFXG^pCX^|EQ1_V~O>TCE{156eT|j@ka}yNP|H|u@y@Fqg7|`F6XtR9~2Mv zc6R2O=Y8IHo|$=dI5W7ZwX-!83T;XaB}eJIBY5r!)BndW{e$T1UT5e9FBIB*I(Y6l z)U)}KP$>MlnH~4X(>pcYE=3Twb0ktJITRfV_3o%RNS`D=lOuW4inA9#Imt36j zX_$5rq+kxsx@2rNlhtP@brrKawllpIjS`fIkC;lSXn9&C&Q^If+77xomZ?Jg$vE2= z1Z2k3!%V_<2@{RTK<6ceiK!7@mY^taV+6>n98@@71d!LDtVLr?{m0U1E;h8$rOMIgko0$nv#ljvtugRllo+t@T_ znxPVaQkEAqsA!^k6_i>ABOl!qjCIYh-4db+nEr=wLsS8c4{zD$78K@Kw3#w3f0wA6Ys{CF3kDPQ)~^CPay(LZSc>2^a{5 zBmh+s5y&A$6fu!xj2rWlwmubDAedj<4cOKx$A9vmp~s@gz(9@a5|C7h02QkU=okqG z79>f+%DS3oU6XD|RBUDqRAI_Uu)$+P*8$8)5>Q3TlS5(@2swmfJQM{5!NB%aCuu{b zN7s0!zLCbr%k@^#WUA)TkREJ`II9P4AegOpn;X>QmLk{ZmkWfF-oPcb=$>u(W#p2+ zJgwbLUC3QeyoaW5EFCMdEayZ5M1eN|5u_+kAVxrnMP=RK73yYbJ@sp(D_LIE1fj{b zw5%I0J?+=BmKGF))5)*QxNYrg7O(;-Y3vf4#Y_Mq9g zQs_tHQX&?ulS{9h_SHRi(d+6=D%qD+4jldZv({7ap}niI=k}fJJF>f_=j=%9@sB@J zXWAy-KDe}Uc6r3v#_s?5JoCm-%MZ^lUODj=zosr9-aoR`H}c}QnZ=e9!;gN@{$c-> zLzmBWFYG;LKO8#w;NsHux%b{T^n+(Egqh@<_y6%z2Xm_D;%WE$E&JwF=2KcL)Bw z`>WPt=NI02D!dZT3|KCjLZ1fCNfQ>r_Iq(BhfCZ+M>fJvrj? zSSD%el}hCA%!fhvmJ;c;apuFIT2wG}js95LO%TFoC56{7Cx3l|_M`m=?%FO_4NasH zG%oT05%}6Di1z(wx&}vC5g59L*_$lk8}kK#y(IX&lnbgw1+zEd+5Qm#RzFMaz|k?7H*% hhRCLvi&yi`4N=FIMx*_p}A zY<3e1f&|3&!3WX4h_%q-gBOhA1#cAHsSVqRtB%FUmj=p`gNahHd{i>MbxWIFY}n?Tdb8 zxk?oIkmu|5da5p`yr9gBx=w9Kyd(jN0O7nFp$2fnzK(@F32|Wik?px`Y!Mk=Ey{8< z(iVlP-!|*_j7kOdDyM*cP z@_!uA)E0|f9~;I}t#)06(eNCl(N4&Q=&&^J6Mlk(UM;|6c#ekI7qjtUE+8oKf|BPs zokERwLS`k(gxxn~yQWtU``2tBc@&W>Ckc`O1Q|$~l0>VfLxp~(p&+!NMbEUY`E^jO zBxazjL0JVt=3gk4jEN$2MX-sXsjowzY$?Z6Q`q*a}7x6UM)ZI2wAZOR2A9JfK1!*TtI$+f5L4KlDf1}(Go z3ZX_Xql*?S^sK0k0y0>p*}9_c_)7&JqPfe5ZfdHk8ZrU0BwBz-N*ZW_iGY$xtJo4X zs$Zo;eO>5Or#h4*DC-?bZzc40T5$!rWkSzXp4&Q^%_(uiI{d%sHcLiW+yAXi>&Wo& zQQA@%zg~RJwKc~sEo5_wp5^hddx_AG?lnYQnx}wXGT%S`9KFPtcMAEzlJ@nf@0NN# z6Ov!9JoNC3+mF4Qvc?C7W|KeFg4yf-*!IKT-}l zf1@zpoZHO%>Ep85xPd43@P diff --git a/src/main/resources/assets/campanion/textures/item/wool_tarp.png b/src/main/resources/assets/campanion/textures/item/wool_tarp.png index 8cb50594c33c97a130dbe74672727227bd827a3f..d38ba8334159ddcd4b5093bb552c796f674ca87a 100644 GIT binary patch delta 278 zcmV+x0qOp&4zU7|B!2;OQb$4nuFf3k0002%Nkl8U0v0_S zOj>Hrxv#6q;}ZxlO%p;0N+}2--iAD`&>3uMCMhKVVvPN4Xn*iL&%Jm~ET#0ia}IzI z!q93zZL_XxzuXdAYDx*`99nC<_k4VVZQC%$uWNJ%L0J+9w{Y42*zP!`f6qBrrBrR^f703H7I-!J c8or}naoM3Dzz-w<#sB~S07*qoM6N<$f)zD)0RR91 literal 1837 zcmcIlTWl0n7@kU6xrix3upu!{hQwIY*}3fO?9R}&mTqyIFl{X>6piB9IcIk#-I+6; znRd4o5=szStQrj=q^TGhiKLh&plE^;h<#8uZbYP6s+VgkW4dy^QzzBrl7 zIWyn+{_nq>f5y5ypIp9l%~Fb@mUqNsJ>*&MUyJL={o&tl0`gd5$G5r^wQQw-)ld_Y z4HQ-TnUU!AdbN$Jj?DmoIEeyz(;MPr%>lm7MTR*5@ABsl%2sIb~E@6epEkKy|L9c2LTT|35>IqM0HnK zXpxZ9k8Uw6h;weEuc*8L#ej#RjL3^T%S+@;2%^e|)u71oA(iJ#P>s|91Rhuz7(*j9 zv=FGKsU4Q<0ZT_6u_!}C1q=hKP!tti76caYDI!CW0Gmvq6f1~HC?z9&2qL|xi>!}f zeZUW&zrIwq5bK1a8X;9yhH`GTGT>Dx8SI%2Jf$SX(QIQ{u<{=PkLP0qYC zbvXSpyg&SnH2z85`)?mU_dsD}&x)hs$eBx{*OXt^{n*sL@A<#Rwyl$=&vRF=jny5R zdqlnb#b#~%>dkv)yPgLbx7+oxEaQm+;+1U8hs@ldQ??%78@?1MT zyJIf>%kjN67e6?i_jz0oJY73I@!H7)Lx+xkH+^#Rwm)YJmybR6;j!!H^_rkP Vk^45?(B%KnI@&v9GwWa2^*59VWXAvi diff --git a/src/main/resources/campanion.accesswidener b/src/main/resources/campanion.accesswidener index cdf3f7cb..9b13301d 100644 --- a/src/main/resources/campanion.accesswidener +++ b/src/main/resources/campanion.accesswidener @@ -1,5 +1,5 @@ accessWidener v1 named -extendable method net/minecraft/world/entity/Entity setRemoved (Lnet/minecraft/entity/Entity$RemovalReason;)V -accessible class net/minecraft/data/server/AbstractTagProvider$ObjectBuilder -accessible class net/minecraft/block/entity/BlockEntityType$BlockEntityFactory +accessible class net/minecraft/data/server/AbstractTagProvider$ObjectBuilder +accessible class net/minecraft/block/entity/BlockEntityType$BlockEntityFactory +accessible field net/minecraft/block/MapColor COLORS [Lnet/minecraft/block/MapColor; diff --git a/src/main/resources/campanion.mixins.json b/src/main/resources/campanion.mixins.json index a60bee8c..d7ce573f 100644 --- a/src/main/resources/campanion.mixins.json +++ b/src/main/resources/campanion.mixins.json @@ -2,12 +2,13 @@ "required": true, "minVersion": "0.8", "package": "com.terraformersmc.campanion.mixin", - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_17", "mixins": [ "AccessorBiomeAccess", "AccessorBlockTags", "AccessorItemTags", "InvokerCriteria", + "InvokerBlockEntity", "InvokerEntity", "MixinEnchantment", "MixinEnchantmentHelper", diff --git a/src/main/resources/data/trinkets/entities/campanion.json b/src/main/resources/data/trinkets/entities/campanion.json new file mode 100644 index 00000000..c8ef9ad8 --- /dev/null +++ b/src/main/resources/data/trinkets/entities/campanion.json @@ -0,0 +1,6 @@ +{ + "entities": ["player"], + "slots": [ + "chest/back" + ] +} diff --git a/src/main/resources/data/trinkets/slots/chest/back.json b/src/main/resources/data/trinkets/slots/chest/back.json new file mode 100644 index 00000000..fd3e7114 --- /dev/null +++ b/src/main/resources/data/trinkets/slots/chest/back.json @@ -0,0 +1,11 @@ +{ + "replace": false, + "validator_predicates": [ + "trinkets:tag", + "campanion:backpacks" + ], + "quick_move_predicates": [ + "trinkets:all", + "campanion:backpacks" + ] +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 6f09aa24..6c1a9caa 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -55,5 +55,8 @@ "fabric": ">=0.37.0", "java": ">=16", "minecraft": ">=1.17" + }, + "suggests": { + "trinkets": ">=3.1.0" } }