diff --git a/src/main/java/me/youhavetrouble/moregamerules/ExtraGameRule.java b/src/main/java/me/youhavetrouble/moregamerules/ExtraGameRule.java index ffc1cb8..2d586a2 100644 --- a/src/main/java/me/youhavetrouble/moregamerules/ExtraGameRule.java +++ b/src/main/java/me/youhavetrouble/moregamerules/ExtraGameRule.java @@ -8,6 +8,9 @@ public class ExtraGameRule { public static GameRules.Key MAGMA_BLOCK_DAMAGE; public static GameRules.Key LIGHTNING_ROD_RANGE; + public static GameRules.Key ELYTRA_DAMAGE_PER_SECOND; + public static GameRules.Key ELYTRA_DAMAGE_FROM_FIREWORK_BOOST; + public static GameRules.Key ELYTRA_DAMAGE_FROM_RIPTIDE_BOOST; protected static void init() { MAGMA_BLOCK_DAMAGE = GameRuleRegistry.register( @@ -20,6 +23,21 @@ public class ExtraGameRule { GameRules.Category.MISC, GameRuleFactory.createIntRule(128, 0, Integer.MAX_VALUE) ); + ELYTRA_DAMAGE_PER_SECOND = GameRuleRegistry.register( + "elytraDamagePerSecond", + GameRules.Category.MISC, + GameRuleFactory.createIntRule(1, 0, Integer.MAX_VALUE) + ); + ELYTRA_DAMAGE_FROM_FIREWORK_BOOST = GameRuleRegistry.register( + "elytraDamageFromFirework", + GameRules.Category.MISC, + GameRuleFactory.createIntRule(0, 0, Integer.MAX_VALUE) + ); + ELYTRA_DAMAGE_FROM_RIPTIDE_BOOST = GameRuleRegistry.register( + "elytraDamageFromRiptideTrident", + GameRules.Category.MISC, + GameRuleFactory.createIntRule(0, 0, Integer.MAX_VALUE) + ); } } diff --git a/src/main/java/me/youhavetrouble/moregamerules/mixin/FireworkItemMixin.java b/src/main/java/me/youhavetrouble/moregamerules/mixin/FireworkItemMixin.java new file mode 100644 index 0000000..3a2e80b --- /dev/null +++ b/src/main/java/me/youhavetrouble/moregamerules/mixin/FireworkItemMixin.java @@ -0,0 +1,31 @@ +package me.youhavetrouble.moregamerules.mixin; + +import me.youhavetrouble.moregamerules.ExtraGameRule; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.*; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; +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; + +@Mixin(FireworkRocketItem.class) +public class FireworkItemMixin { + + @Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/FireworkRocketEntity;(Lnet/minecraft/world/World;Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/LivingEntity;)V", shift = At.Shift.AFTER)) + private void injected(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable> cir) { + ItemStack chestItem = user.getEquippedStack(EquipmentSlot.CHEST); + int damage = user.world.getGameRules().getInt(ExtraGameRule.ELYTRA_DAMAGE_FROM_FIREWORK_BOOST); + if (!chestItem.isOf(Items.ELYTRA) || damage == 0) return; + if (chestItem.getDamage() + damage >= chestItem.getMaxDamage() ) { + chestItem.setDamage(chestItem.getMaxDamage()-1); + } else { + chestItem.damage(damage, (LivingEntity)user, ((player) -> player.sendEquipmentBreakStatus(EquipmentSlot.CHEST))); + } + } + +} diff --git a/src/main/java/me/youhavetrouble/moregamerules/mixin/LivingEntityMixin.java b/src/main/java/me/youhavetrouble/moregamerules/mixin/LivingEntityMixin.java new file mode 100644 index 0000000..bc45575 --- /dev/null +++ b/src/main/java/me/youhavetrouble/moregamerules/mixin/LivingEntityMixin.java @@ -0,0 +1,18 @@ +package me.youhavetrouble.moregamerules.mixin; + +import me.youhavetrouble.moregamerules.ExtraGameRule; +import net.minecraft.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(LivingEntity.class) +public class LivingEntityMixin { + + @ModifyArg(method = "tickFallFlying", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;damage(ILnet/minecraft/entity/LivingEntity;Ljava/util/function/Consumer;)V"), index = 0) + private int injectedGetLightningRodPos(int range) { + LivingEntity livingEntity = (LivingEntity)(Object) this; + return livingEntity.world.getGameRules().getInt(ExtraGameRule.ELYTRA_DAMAGE_PER_SECOND); + } + +} diff --git a/src/main/java/me/youhavetrouble/moregamerules/mixin/MagmaBlockMixin.java b/src/main/java/me/youhavetrouble/moregamerules/mixin/MagmaBlockMixin.java index f3d2dff..8fbc106 100644 --- a/src/main/java/me/youhavetrouble/moregamerules/mixin/MagmaBlockMixin.java +++ b/src/main/java/me/youhavetrouble/moregamerules/mixin/MagmaBlockMixin.java @@ -1,7 +1,6 @@ package me.youhavetrouble.moregamerules.mixin; import me.youhavetrouble.moregamerules.ExtraGameRule; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.MagmaBlock; import net.minecraft.entity.Entity; @@ -13,11 +12,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MagmaBlock.class) -public class MagmaBlockMixin extends Block { - - public MagmaBlockMixin(Settings settings) { - super(settings); - } +public class MagmaBlockMixin { @Inject(at = @At("HEAD"), method = "onSteppedOn", cancellable = true) private void injectedOnSteppedOn(World world, BlockPos pos, BlockState state, Entity entity, CallbackInfo info) { diff --git a/src/main/java/me/youhavetrouble/moregamerules/mixin/TridentItemMixin.java b/src/main/java/me/youhavetrouble/moregamerules/mixin/TridentItemMixin.java new file mode 100644 index 0000000..3f1a0ad --- /dev/null +++ b/src/main/java/me/youhavetrouble/moregamerules/mixin/TridentItemMixin.java @@ -0,0 +1,30 @@ +package me.youhavetrouble.moregamerules.mixin; + +import me.youhavetrouble.moregamerules.ExtraGameRule; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.TridentItem; +import net.minecraft.world.World; +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.CallbackInfo; + +@Mixin(TridentItem.class) +public class TridentItemMixin { + + @Inject(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;addVelocity(DDD)V", shift = At.Shift.BEFORE)) + private void injected(ItemStack stack, World world, LivingEntity user, int remainingUseTicks, CallbackInfo ci) { + ItemStack chestItem = user.getEquippedStack(EquipmentSlot.CHEST); + int damage = user.world.getGameRules().getInt(ExtraGameRule.ELYTRA_DAMAGE_FROM_RIPTIDE_BOOST); + if (!chestItem.isOf(Items.ELYTRA) || damage == 0) return; + if (chestItem.getDamage() + damage >= chestItem.getMaxDamage() ) { + chestItem.setDamage(chestItem.getMaxDamage()-1); + } else { + chestItem.damage(damage, user, ((player) -> player.sendEquipmentBreakStatus(EquipmentSlot.CHEST))); + } + } + +} diff --git a/src/main/resources/assets/moregamerules/lang/en_us.json b/src/main/resources/assets/moregamerules/lang/en_us.json index 244e200..5bab1ab 100644 --- a/src/main/resources/assets/moregamerules/lang/en_us.json +++ b/src/main/resources/assets/moregamerules/lang/en_us.json @@ -2,5 +2,11 @@ "gamerule.magmaBlockDamage": "Magma block damage", "gamerule.magmaBlockDamage.description": "Controls if magma blocks should do damage when stepped on", "gamerule.lightningRodRange": "Lightning rod range", - "gamerule.lightningRodRange.description": "Sets the range in which lightning rod will redirect lightning" + "gamerule.lightningRodRange.description": "Sets the range in which lightning rod will redirect lightning", + "gamerule.elytraDamagePerSecond": "Elytra damage per second", + "gamerule.elytraDamagePerSecond.description": "Controls how much damage elytras take when flying", + "gamerule.elytraDamageFromFirework": "Elytra damage from firework boost", + "gamerule.elytraDamageFromFirework.description": "Controls how much damage elytras take when boosting with a firework", + "gamerule.elytraDamageFromRiptideTrident": "Elytra damage from firework boost", + "gamerule.elytraDamageFromRiptideTrident.description": "Controls how much damage elytras take when boosting with a riptide trident" } \ No newline at end of file diff --git a/src/main/resources/moregamerules.mixins.json b/src/main/resources/moregamerules.mixins.json index 871bd14..621a4e7 100644 --- a/src/main/resources/moregamerules.mixins.json +++ b/src/main/resources/moregamerules.mixins.json @@ -4,13 +4,15 @@ "package": "me.youhavetrouble.moregamerules.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ - "ServerWorldMixin" + "FireworkItemMixin", + "LivingEntityMixin", + "ServerWorldMixin", + "TridentItemMixin" ], "client": [ ], "server": [ "MagmaBlockMixin" - ], "injectors": { "defaultRequire": 1