diff --git a/build.gradle b/build.gradle index 94d764c..7634818 100644 --- a/build.gradle +++ b/build.gradle @@ -12,13 +12,15 @@ allprojects { apply plugin: "maven-publish" apply plugin: "signing" + group = 'net.rotgruengelb' + version = "${project.mod_version}+${rootProject.mod_minecraft_base_version}" + def ENV = System.getenv() def publishType = System.getenv("PUBLISH_TYPE") - - version = "${project.mod_version}+${project.mod_minecraft_base_version}" + def uniqueId = System.getenv("UNIQUE_ID") if (publishType == "SNAPSHOT") { - version = "${project.mod_version}+${rootProject.mod_minecraft_base_version}-SNAPSHOT" + version = "${version}-${uniqueId}-SNAPSHOT" } group = rootProject.maven_group diff --git a/gradle.properties b/gradle.properties index 6b2553b..5b64df6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.20.2+build.4 loader_version=0.14.24 # Mod Properties -mod_version=2.0.2 +mod_version=3.0.0 mod_minecraft_base_version=1.20.2 # Maven/Publishing diff --git a/src/main/java/net/rotgruengelb/quirl/Quirl.java b/src/main/java/net/rotgruengelb/quirl/Quirl.java index 91f7b20..4c6c386 100644 --- a/src/main/java/net/rotgruengelb/quirl/Quirl.java +++ b/src/main/java/net/rotgruengelb/quirl/Quirl.java @@ -4,8 +4,8 @@ import net.minecraft.block.Blocks; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; -import net.rotgruengelb.quirl.api.mechanic.interact.axe.v1.CustomAxeBlockInteract; -import net.rotgruengelb.quirl.api.mechanic.interact.shovel.v1.CustomShovelBlockInteract; +import net.rotgruengelb.quirl.api.mechanic.interact.onblock.AxeBlockInteractRegistry; +import net.rotgruengelb.quirl.api.mechanic.interact.onblock.ShovelBlockInteractRegistry; import net.rotgruengelb.quirl.internal.command.CommandNodes; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,7 +13,7 @@ public class Quirl implements ModInitializer { public static final Logger LOGGER = LoggerFactory.getLogger("quirl"); public static final String MOD_ID = "quirl"; - public static final Boolean MOD_TEST_MODE = false; + public static final Boolean MOD_TEST_MODE = true; @Override public void onInitialize() { @@ -24,10 +24,9 @@ public void onInitialize() { if (MOD_TEST_MODE) { LOGGER.warn("quirl is in test mode! do not release with 'MOD_TEST_MOD = true'!"); - CustomShovelBlockInteract.addResult(Blocks.ACACIA_PLANKS.getDefaultState(), Blocks.DIRT.getDefaultState(), SoundEvents.ITEM_SHOVEL_FLATTEN, SoundCategory.BLOCKS, true); - CustomShovelBlockInteract.addResult(Blocks.SPRUCE_PLANKS.getDefaultState(), Blocks.DIRT.getDefaultState(), SoundEvents.ITEM_BUCKET_EMPTY, SoundCategory.BLOCKS); - CustomAxeBlockInteract.addResult(Blocks.AMETHYST_BLOCK.getDefaultState(), Blocks.BLUE_ICE.getDefaultState(), SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS); - + ShovelBlockInteractRegistry.register(Blocks.ACACIA_PLANKS.getDefaultState(), Blocks.DIRT.getDefaultState(), SoundEvents.ITEM_SHOVEL_FLATTEN, SoundCategory.BLOCKS, true); + ShovelBlockInteractRegistry.register(Blocks.SPRUCE_PLANKS.getDefaultState(), Blocks.DIRT.getDefaultState(), SoundEvents.ITEM_BUCKET_EMPTY, SoundCategory.BLOCKS); + AxeBlockInteractRegistry.register(Blocks.AMETHYST_BLOCK.getDefaultState(), Blocks.BLUE_ICE.getDefaultState(), SoundEvents.ITEM_AXE_STRIP, SoundCategory.BLOCKS); } } } \ No newline at end of file diff --git a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/axe/v1/CustomAxeBlockInteract.java b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/axe/v1/CustomAxeBlockInteract.java deleted file mode 100644 index 43ad22d..0000000 --- a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/axe/v1/CustomAxeBlockInteract.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.rotgruengelb.quirl.api.mechanic.interact.axe.v1; - -import net.minecraft.block.BlockState; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.rotgruengelb.quirl.api.mechanic.interact.result.v1.ToolBlockInteractResult; - -import java.util.HashMap; -import java.util.Map; - -public class CustomAxeBlockInteract { - - public static Map CUSTOM_AXE_INTERACT_RESULTS = new HashMap<>(); - - public static void addResult(BlockState starting_blockstate, BlockState new_blockstate, SoundEvent interact_sound_event, SoundCategory interact_sound_category, Boolean disable_surrounding_checks) { - CUSTOM_AXE_INTERACT_RESULTS.put(starting_blockstate, new ToolBlockInteractResult(new_blockstate, interact_sound_event, interact_sound_category, disable_surrounding_checks)); - } - - public static void addResult(BlockState starting_blockstate, BlockState new_blockstate, SoundEvent interact_sound_event, SoundCategory interact_sound_category) { - CUSTOM_AXE_INTERACT_RESULTS.put(starting_blockstate, new ToolBlockInteractResult(new_blockstate, interact_sound_event, interact_sound_category, false)); - } -} diff --git a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/AxeBlockInteractRegistry.java b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/AxeBlockInteractRegistry.java new file mode 100644 index 0000000..8b09e8e --- /dev/null +++ b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/AxeBlockInteractRegistry.java @@ -0,0 +1,22 @@ +package net.rotgruengelb.quirl.api.mechanic.interact.onblock; + +import net.minecraft.block.BlockState; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class AxeBlockInteractRegistry { + + private static final Map REG = new HashMap<>(); + + public static void register(BlockState starting_blockstate, BlockState new_blockstate, SoundEvent sound_event, SoundCategory sound_category) { + REG.put(starting_blockstate, new ToolBlockInteractResult(new_blockstate, sound_event, sound_category, false)); + } + + public static @Nullable ToolBlockInteractResult getResult(BlockState blockState) { + return REG.get(blockState); + } +} diff --git a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/ShovelBlockInteractRegistry.java b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/ShovelBlockInteractRegistry.java new file mode 100644 index 0000000..b7c02c2 --- /dev/null +++ b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/ShovelBlockInteractRegistry.java @@ -0,0 +1,26 @@ +package net.rotgruengelb.quirl.api.mechanic.interact.onblock; + +import net.minecraft.block.BlockState; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class ShovelBlockInteractRegistry { + + private static final Map REG = new HashMap<>(); + + public static void register(BlockState starting_blockstate, BlockState new_blockstate, SoundEvent sound_event, SoundCategory sound_category) { + REG.put(starting_blockstate, new ToolBlockInteractResult(new_blockstate, sound_event, sound_category, false)); + } + + public static void register(BlockState starting_blockstate, BlockState new_blockstate, SoundEvent sound_event, SoundCategory sound_category, Boolean disable_surrounding_checks) { + REG.put(starting_blockstate, new ToolBlockInteractResult(new_blockstate, sound_event, sound_category, disable_surrounding_checks)); + } + + public static @Nullable ToolBlockInteractResult getResult(BlockState blockState) { + return REG.get(blockState); + } +} diff --git a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/result/v1/ToolBlockInteractResult.java b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/ToolBlockInteractResult.java similarity index 79% rename from src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/result/v1/ToolBlockInteractResult.java rename to src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/ToolBlockInteractResult.java index dcc035d..6a662f1 100644 --- a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/result/v1/ToolBlockInteractResult.java +++ b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/onblock/ToolBlockInteractResult.java @@ -1,4 +1,4 @@ -package net.rotgruengelb.quirl.api.mechanic.interact.result.v1; +package net.rotgruengelb.quirl.api.mechanic.interact.onblock; import net.minecraft.block.BlockState; import net.minecraft.sound.SoundCategory; @@ -6,10 +6,10 @@ public class ToolBlockInteractResult { - BlockState new_blockstate; - SoundEvent interact_sound_event; - SoundCategory interact_sound_category; - Boolean disable_surrounding_checks; + final BlockState new_blockstate; + final SoundEvent interact_sound_event; + final SoundCategory interact_sound_category; + final Boolean disable_surrounding_checks; public ToolBlockInteractResult(BlockState newBlockstate, SoundEvent interactSoundEvent, SoundCategory interactSoundCategory, Boolean disableSurroundingChecks) { new_blockstate = newBlockstate; diff --git a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/shovel/v1/CustomShovelBlockInteract.java b/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/shovel/v1/CustomShovelBlockInteract.java deleted file mode 100644 index 03e90e1..0000000 --- a/src/main/java/net/rotgruengelb/quirl/api/mechanic/interact/shovel/v1/CustomShovelBlockInteract.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.rotgruengelb.quirl.api.mechanic.interact.shovel.v1; - -import net.minecraft.block.BlockState; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.rotgruengelb.quirl.api.mechanic.interact.result.v1.ToolBlockInteractResult; - -import java.util.HashMap; -import java.util.Map; - -public class CustomShovelBlockInteract { - - public static Map CUSTOM_SHOVEL_INTERACT_RESULTS = new HashMap<>(); - - public static void addResult(BlockState starting_blockstate, BlockState new_blockstate, SoundEvent interact_sound_event, SoundCategory interact_sound_category, Boolean disable_surrounding_checks) { - CUSTOM_SHOVEL_INTERACT_RESULTS.put(starting_blockstate, new ToolBlockInteractResult(new_blockstate, interact_sound_event, interact_sound_category, disable_surrounding_checks)); - } - - public static void addResult(BlockState starting_blockstate, BlockState new_blockstate, SoundEvent interact_sound_event, SoundCategory interact_sound_category) { - CUSTOM_SHOVEL_INTERACT_RESULTS.put(starting_blockstate, new ToolBlockInteractResult(new_blockstate, interact_sound_event, interact_sound_category, false)); - } -} diff --git a/src/main/java/net/rotgruengelb/quirl/lib/feature/item/HasCustomArmPose.java b/src/main/java/net/rotgruengelb/quirl/lib/feature/item/HasCustomArmPose.java new file mode 100644 index 0000000..565f702 --- /dev/null +++ b/src/main/java/net/rotgruengelb/quirl/lib/feature/item/HasCustomArmPose.java @@ -0,0 +1,16 @@ +package net.rotgruengelb.quirl.lib.feature.item; + +import net.fabricmc.api.Environment; +import net.minecraft.client.model.ModelPart; +import net.minecraft.entity.LivingEntity; + +/** + * This interface is used to add custom arm poses to items.
+ * The methods positionRightArm and positionLeftArm are called by the mixin BipedEntityModelMixin. + */ +@Environment(net.fabricmc.api.EnvType.CLIENT) +public interface HasCustomArmPose { + void positionRightArm(ModelPart rightArm, LivingEntity entity, ModelPart head, ModelPart hat, ModelPart body, ModelPart leftArm, ModelPart rightLeg, ModelPart leftLeg); + + void positionLeftArm(ModelPart leftArm, LivingEntity entity, ModelPart head, ModelPart hat, ModelPart body, ModelPart rightArm, ModelPart rightLeg, ModelPart leftLeg); +} diff --git a/src/main/java/net/rotgruengelb/quirl/mixin/AxeItemMixin.java b/src/main/java/net/rotgruengelb/quirl/mixin/AxeItemMixin.java index c7ed930..91c2d61 100644 --- a/src/main/java/net/rotgruengelb/quirl/mixin/AxeItemMixin.java +++ b/src/main/java/net/rotgruengelb/quirl/mixin/AxeItemMixin.java @@ -9,14 +9,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.event.GameEvent; -import net.rotgruengelb.quirl.api.mechanic.interact.result.v1.ToolBlockInteractResult; +import net.rotgruengelb.quirl.api.mechanic.interact.onblock.AxeBlockInteractRegistry; +import net.rotgruengelb.quirl.api.mechanic.interact.onblock.ToolBlockInteractResult; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import static net.rotgruengelb.quirl.api.mechanic.interact.axe.v1.CustomAxeBlockInteract.CUSTOM_AXE_INTERACT_RESULTS; - @Mixin(AxeItem.class) public class AxeItemMixin { @@ -26,22 +25,22 @@ private void add_custom_useOn(ItemUsageContext context, CallbackInfoReturnable p.sendToolBreakStatus(context.getHand())); - } + if (!world.isClient) { + world.setBlockState(blockPos, blockState3, Block.NOTIFY_ALL | Block.REDRAW_ON_MAIN_THREAD); + world.emitGameEvent(GameEvent.BLOCK_CHANGE, blockPos, GameEvent.Emitter.of(playerEntity, blockState3)); + if (playerEntity != null) { + context.getStack().damage(1, playerEntity, p -> p.sendToolBreakStatus(context.getHand())); } - cir.setReturnValue(ActionResult.success(world.isClient)); - cir.cancel(); + } + cir.setReturnValue(ActionResult.success(world.isClient)); + cir.cancel(); } } } \ No newline at end of file diff --git a/src/main/java/net/rotgruengelb/quirl/mixin/BipedEntityModelMixin.java b/src/main/java/net/rotgruengelb/quirl/mixin/BipedEntityModelMixin.java new file mode 100644 index 0000000..b504b83 --- /dev/null +++ b/src/main/java/net/rotgruengelb/quirl/mixin/BipedEntityModelMixin.java @@ -0,0 +1,63 @@ +package net.rotgruengelb.quirl.mixin; + +import net.fabricmc.api.Environment; +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.entity.model.BipedEntityModel; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.Item; +import net.rotgruengelb.quirl.lib.feature.item.HasCustomArmPose; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Environment(net.fabricmc.api.EnvType.CLIENT) +@Mixin(BipedEntityModel.class) +public class BipedEntityModelMixin { + + @Shadow + @Final + public ModelPart rightArm; + + @Shadow + @Final + public ModelPart head; + + @Shadow + @Final + public ModelPart leftArm; + + @Shadow + @Final + public ModelPart hat; + + @Shadow + @Final + public ModelPart body; + + @Shadow + @Final + public ModelPart leftLeg; + + @Shadow + @Final + public ModelPart rightLeg; + + @Inject(at = @At(value = "TAIL"), method = "positionRightArm") + void positionRightArm(LivingEntity entity, CallbackInfo ci) { + Item activeItem = entity.getActiveItem().getItem(); + if (activeItem instanceof HasCustomArmPose) { + ((HasCustomArmPose) activeItem).positionRightArm(this.rightArm, entity, this.head, this.hat, this.body, this.leftArm, this.rightLeg, this.leftLeg); + } + } + + @Inject(at = @At(value = "TAIL"), method = "positionLeftArm") + void positionLeftArm(LivingEntity entity, CallbackInfo ci) { + Item activeItem = entity.getActiveItem().getItem(); + if (activeItem instanceof HasCustomArmPose) { + ((HasCustomArmPose) activeItem).positionLeftArm(this.leftArm, entity, this.head, this.hat, this.body, this.rightArm, this.rightLeg, this.leftLeg); + } + } +} diff --git a/src/main/java/net/rotgruengelb/quirl/mixin/ShovelItemMixin.java b/src/main/java/net/rotgruengelb/quirl/mixin/ShovelItemMixin.java index ffef066..b113d70 100644 --- a/src/main/java/net/rotgruengelb/quirl/mixin/ShovelItemMixin.java +++ b/src/main/java/net/rotgruengelb/quirl/mixin/ShovelItemMixin.java @@ -10,14 +10,13 @@ import net.minecraft.util.math.Direction; import net.minecraft.world.World; import net.minecraft.world.event.GameEvent; -import net.rotgruengelb.quirl.api.mechanic.interact.result.v1.ToolBlockInteractResult; +import net.rotgruengelb.quirl.api.mechanic.interact.onblock.ShovelBlockInteractRegistry; +import net.rotgruengelb.quirl.api.mechanic.interact.onblock.ToolBlockInteractResult; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import static net.rotgruengelb.quirl.api.mechanic.interact.shovel.v1.CustomShovelBlockInteract.CUSTOM_SHOVEL_INTERACT_RESULTS; - @Mixin(ShovelItem.class) public class ShovelItemMixin { @@ -27,7 +26,7 @@ private void add_custom_useOn(ItemUsageContext context, CallbackInfoReturnable