diff --git a/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java b/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java index 3c164da..2ecd880 100644 --- a/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java +++ b/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java @@ -3,11 +3,13 @@ import com.github.crimsondawn45.fabricshieldlib.lib.event.ShieldSetModelCallback; import info.partonetrain.botaniacombat.item.GaiaGreatswordItem; import info.partonetrain.botaniacombat.item.TerrasteelWeaponItem; +import info.partonetrain.botaniacombat.network.StarcallerAttackHitHandler; import info.partonetrain.botaniacombat.registry.BotaniaCombatShieldItems; import info.partonetrain.botaniacombat.render.entity.BotaniaCombatEntityRenderers; import net.bettercombat.api.AttackHand; import net.bettercombat.api.client.BetterCombatClientEvents; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry; import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; @@ -23,6 +25,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; +import vazkii.botania.common.item.equipment.tool.StarcallerItem; import vazkii.botania.common.item.equipment.tool.terrasteel.TerraBladeItem; import static com.github.crimsondawn45.fabricshieldlib.initializers.FabricShieldLibClient.renderBanner; @@ -41,7 +44,8 @@ public void onInitializeClient() { if (BotaniaCombat.BETTER_COMBAT_INSTALLED) { BotaniaCombat.LOGGER.info("BetterCombat found, running client code"); - BetterCombatClientEvents.ATTACK_START.register(this::checkSwing); + BetterCombatClientEvents.ATTACK_START.register(this::checkBetterCombatSwing); + BetterCombatClientEvents.ATTACK_HIT.register(new StarcallerAttackHitHandler()); } if (BotaniaCombat.FABRIC_SHIELD_LIB_INSTALLED) { @@ -66,12 +70,14 @@ public void onInitializeClient() { } } - public void checkSwing(LocalPlayer clientPlayerEntity, AttackHand attackHand) { + public void checkBetterCombatSwing(LocalPlayer clientPlayerEntity, AttackHand attackHand) { if (attackHand.itemStack().getItem() instanceof TerrasteelWeaponItem) { TerrasteelWeaponItem.leftClick(attackHand.itemStack()); - }else if (attackHand.itemStack().getItem() instanceof GaiaGreatswordItem) { + } + else if (attackHand.itemStack().getItem() instanceof GaiaGreatswordItem) { GaiaGreatswordItem.leftClick(attackHand.itemStack()); - } else if (attackHand.itemStack().getItem() instanceof TerraBladeItem) { + } + else if (attackHand.itemStack().getItem() instanceof TerraBladeItem) { TerraBladeItem.leftClick(attackHand.itemStack()); //the botania weapon } } diff --git a/src/client/java/info/partonetrain/botaniacombat/network/StarcallerAttackHitHandler.java b/src/client/java/info/partonetrain/botaniacombat/network/StarcallerAttackHitHandler.java new file mode 100644 index 0000000..53b39cb --- /dev/null +++ b/src/client/java/info/partonetrain/botaniacombat/network/StarcallerAttackHitHandler.java @@ -0,0 +1,27 @@ +package info.partonetrain.botaniacombat.network; + +import net.bettercombat.api.AttackHand; +import net.bettercombat.api.client.BetterCombatClientEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; +import vazkii.botania.common.item.equipment.tool.StarcallerItem; + +import java.util.List; + +public class StarcallerAttackHitHandler implements BetterCombatClientEvents.PlayerAttackHit { + @Override + public void onPlayerAttackStart(LocalPlayer player, AttackHand attackHand, List list, @Nullable Entity entity) { + ItemStack stack = attackHand.isOffHand() ? player.getOffhandItem() : player.getMainHandItem(); + if (stack.isEmpty()) { + return; + } + Item item = stack.getItem(); + if (item instanceof StarcallerItem) { + ClientPlayNetworking.send(new StarcallerHitPacket(attackHand.isOffHand())); + } + } +} diff --git a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java index e35d7cb..e984060 100644 --- a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java +++ b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java @@ -4,12 +4,15 @@ import info.partonetrain.botaniacombat.item.GaiaGreatswordItem; import info.partonetrain.botaniacombat.item.TerrasteelWeaponItem; import info.partonetrain.botaniacombat.item.shield.ElementiumBannerShieldItem; +import info.partonetrain.botaniacombat.network.StarcallerHitPacket; import info.partonetrain.botaniacombat.registry.*; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.serializer.JanksonConfigSerializer; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.player.AttackEntityCallback; +import net.fabricmc.fabric.api.networking.v1.PacketType; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.resources.ResourceLocation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,11 +27,14 @@ public class BotaniaCombat implements ModInitializer { public static final int MANA_PER_DAMAGE = 60; public static final int MANA_PER_DAMAGE_TERRA = 100; + public static final ResourceLocation STARCALLER_PACKET_ID = new ResourceLocation(MOD_ID, "starcaller"); + public static final PacketType STARCALLER_HIT_PACKET_PACKET_TYPE = PacketType.create(STARCALLER_PACKET_ID, StarcallerHitPacket::new); + @Override public void onInitialize() { AutoConfig.register(BotaniaCombatConfig.class, JanksonConfigSerializer::new); BotaniaCombatItems.init(); - ConfiguredValues.init(); //prevents loading issues; ensures autoconfig is registered before values are used + BotaniaNerfConfiguredValues.init(); //prevents loading issues; ensures autoconfig is registered before values are used AttackEntityCallback.EVENT.register(TerrasteelWeaponItem::attackEntity); //fabric events for if BetterCombat is not installed AttackEntityCallback.EVENT.register(GaiaGreatswordItem::attackEntity); @@ -45,6 +51,8 @@ public void onInitialize() { BotaniaCombatBlockEntities.init(); PsiContributorColors.get(); + + BotaniaCombatNetworking.init(); LOGGER.info("BotaniaCombat initialized"); } } \ No newline at end of file diff --git a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatConfig.java b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatConfig.java index 1aee621..ca99127 100644 --- a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatConfig.java +++ b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatConfig.java @@ -52,10 +52,14 @@ public static class RangedItemConfig{ @ConfigEntry.Gui.CollapsibleObject public BotaniaNerfsConfig botaniaNerfsConfig = new BotaniaNerfsConfig(); public static class BotaniaNerfsConfig{ - @Comment("Terrasteel Mana Burst damage") + @Comment("Terrasteel weapon projectile damage") public float terraBladeDamage = 8; - @Comment("Thorn Chakram damage") + @Comment("Chakram damage, poison/fire damage is unchanged") public float chakramDamage = 12; + @Comment("Starcaller projectile") + public float fallingStarNormalDamage = 5; + @Comment("Starcaller projectile, 25% chance of using this instead of normal damage") + public float fallingStarHighDamage = 10; @Comment("Missile from Unstable Reservoir Rod (does not effect Gaia Gaurdian)") public float missileDamage = 7; @Comment("Damaging Lens damage, recommended to lower if RWAPI is installed") diff --git a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatMixinPlugin.java b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatMixinPlugin.java index a6c8078..b29a6e9 100644 --- a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatMixinPlugin.java +++ b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatMixinPlugin.java @@ -28,6 +28,9 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { if(Arrays.asList(packageTree).contains("nerf")){ return true; } + if (Arrays.asList(packageTree).contains("bettercombat")) { + return BotaniaCombat.BETTER_COMBAT_INSTALLED; + } if (Arrays.asList(packageTree).contains("ranged")) { return BotaniaCombat.RANGED_WEAPON_API_INSTALLED; } diff --git a/src/main/java/info/partonetrain/botaniacombat/ConfiguredValues.java b/src/main/java/info/partonetrain/botaniacombat/BotaniaNerfConfiguredValues.java similarity index 74% rename from src/main/java/info/partonetrain/botaniacombat/ConfiguredValues.java rename to src/main/java/info/partonetrain/botaniacombat/BotaniaNerfConfiguredValues.java index 932f62d..95a8ccd 100644 --- a/src/main/java/info/partonetrain/botaniacombat/ConfiguredValues.java +++ b/src/main/java/info/partonetrain/botaniacombat/BotaniaNerfConfiguredValues.java @@ -3,9 +3,11 @@ import me.shedaniel.autoconfig.AutoConfig; import net.minecraft.world.entity.ai.attributes.AttributeModifier; -public class ConfiguredValues { +public class BotaniaNerfConfiguredValues { //have default values loaded so mixins don't classload config public static float terraBladeDamage = 7; public static float chakramDamage = 12; + public static float fallingStarNormalDamage = 5; + public static float fallingStarHighDamage = 10; public static float dmgLensDamage = 8; public static float odinHealthMod = 20f; public static AttributeModifier.Operation odinHealthOperation = AttributeModifier.Operation.ADDITION; @@ -14,6 +16,8 @@ public class ConfiguredValues { public static void init(){ terraBladeDamage = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig().botaniaNerfsConfig.terraBladeDamage; chakramDamage = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig().botaniaNerfsConfig.chakramDamage; + fallingStarNormalDamage = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig().botaniaNerfsConfig.fallingStarNormalDamage; + fallingStarHighDamage = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig().botaniaNerfsConfig.fallingStarHighDamage; dmgLensDamage = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig().botaniaNerfsConfig.dmgLensDamage; odinHealthMod = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig().botaniaNerfsConfig.odinHealthMod; odinHealthOperation = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig().botaniaNerfsConfig.odinHealthOperation; diff --git a/src/main/java/info/partonetrain/botaniacombat/IStarcaller.java b/src/main/java/info/partonetrain/botaniacombat/IStarcaller.java new file mode 100644 index 0000000..d106689 --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/IStarcaller.java @@ -0,0 +1,9 @@ +package info.partonetrain.botaniacombat; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public interface IStarcaller { + void botaniacombat_summonStarBetterCombat(ItemStack stack, Level level, Player player); +} diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/ElementiumAxeItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumAxeItemMixin.java similarity index 73% rename from src/main/java/info/partonetrain/botaniacombat/mixin/ElementiumAxeItemMixin.java rename to src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumAxeItemMixin.java index f0f169a..1a8059f 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/ElementiumAxeItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumAxeItemMixin.java @@ -1,4 +1,4 @@ -package info.partonetrain.botaniacombat.mixin; +package info.partonetrain.botaniacombat.mixin.bettercombat; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -22,14 +22,10 @@ public ElementiumAxeItemMixin(Properties properties) { @Override public Multimap getDefaultAttributeModifiers(EquipmentSlot slot) { Multimap ret = super.getDefaultAttributeModifiers(slot); - - if (BotaniaCombat.BETTER_COMBAT_INSTALLED) { - if (slot == EquipmentSlot.MAINHAND || slot == EquipmentSlot.OFFHAND) { - ret = HashMultimap.create(ret); - ret.put(PixieHandler.PIXIE_SPAWN_CHANCE, PixieHandler.makeModifier(slot, "Axe modifier", 0.05)); - } + if (slot == EquipmentSlot.MAINHAND || slot == EquipmentSlot.OFFHAND) { + ret = HashMultimap.create(ret); + ret.put(PixieHandler.PIXIE_SPAWN_CHANCE, PixieHandler.makeModifier(slot, "Axe modifier", 0.05)); } - return ret; } } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/ElementiumSwordItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumSwordItemMixin.java similarity index 91% rename from src/main/java/info/partonetrain/botaniacombat/mixin/ElementiumSwordItemMixin.java rename to src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumSwordItemMixin.java index db4e4b1..75f354c 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/ElementiumSwordItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumSwordItemMixin.java @@ -1,4 +1,4 @@ -package info.partonetrain.botaniacombat.mixin; +package info.partonetrain.botaniacombat.mixin.bettercombat; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -23,7 +23,7 @@ public class ElementiumSwordItemMixin { locals = LocalCapture.CAPTURE_FAILHARD ) private void botaniacombat$addOffhandAttributeToElementiumSword(@NotNull EquipmentSlot slot, CallbackInfoReturnable<@NotNull Multimap> cir, Multimap ret) { - if (BotaniaCombat.BETTER_COMBAT_INSTALLED && slot == EquipmentSlot.OFFHAND) { + if (slot == EquipmentSlot.OFFHAND) { ret = HashMultimap.create(ret); ret.put(PixieHandler.PIXIE_SPAWN_CHANCE, PixieHandler.makeModifier(slot, "Sword modifier", 0.05)); } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/StarcallerItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/StarcallerItemMixin.java new file mode 100644 index 0000000..d109fc7 --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/StarcallerItemMixin.java @@ -0,0 +1,24 @@ +package info.partonetrain.botaniacombat.mixin.bettercombat; + +import info.partonetrain.botaniacombat.IStarcaller; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import vazkii.botania.common.helper.ItemNBTHelper; +import vazkii.botania.common.item.equipment.tool.StarcallerItem; + +@Mixin(StarcallerItem.class) +public class StarcallerItemMixin implements IStarcaller { //StarcallerItem will implement IStarcaller + @Shadow(remap = false) //summonFallingStar is private for some reason + private void summonFallingStar(ItemStack stack, Level world, Player player) {} + @Override + public void botaniacombat_summonStarBetterCombat(ItemStack stack, Level level, Player player){ + long timeSinceLast = level.getGameTime() - ItemNBTHelper.getLong(stack, "lastTriggerTime", level.getGameTime()); + if (timeSinceLast > 12L && !level.isClientSide()) { //12L = StarcallerItem.INTERVAL + ItemNBTHelper.setLong(stack, "lastTriggerTime", level.getGameTime()); + this.summonFallingStar(stack, level, player); + } + } +} diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/TerraBladeItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/TerraBladeItemMixin.java similarity index 61% rename from src/main/java/info/partonetrain/botaniacombat/mixin/TerraBladeItemMixin.java rename to src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/TerraBladeItemMixin.java index cb05a9d..cf43b57 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/TerraBladeItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/TerraBladeItemMixin.java @@ -1,5 +1,6 @@ -package info.partonetrain.botaniacombat.mixin; +package info.partonetrain.botaniacombat.mixin.bettercombat; +import com.llamalad7.mixinextras.sugar.Local; import info.partonetrain.botaniacombat.BotaniaCombat; import info.partonetrain.botaniacombat.PsiContributorColors; import net.minecraft.sounds.SoundSource; @@ -22,26 +23,23 @@ public class TerraBladeItemMixin { @Inject( method = "trySpawnBurst(Lnet/minecraft/world/entity/player/Player;F)V", at = @At("HEAD"), - locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true ) private static void botaniacombat$addOffhandBurst(Player player, float attackStrength, CallbackInfo ci) { - if (BotaniaCombat.BETTER_COMBAT_INSTALLED) { - if (!player.isSpectator() - && !player.getOffhandItem().isEmpty() - && player.getOffhandItem().is(BotaniaItems.terraSword) - && attackStrength == 1) { - ManaBurstEntity burst = TerraBladeItem.getBurst(player, player.getOffhandItem()); - player.level().addFreshEntity(burst); - player.getOffhandItem().hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.OFF_HAND)); - player.level().playSound(null, player.getX(), player.getY(), player.getZ(), BotaniaSounds.terraBlade, SoundSource.PLAYERS, 1F, 1F); - ci.cancel(); //cancel the rest of the method so it doesn't check the main hand if there was an offhand burst. - } + if (!player.isSpectator() + && !player.getOffhandItem().isEmpty() + && player.getOffhandItem().is(BotaniaItems.terraSword) + && attackStrength == 1) { + ManaBurstEntity burst = TerraBladeItem.getBurst(player, player.getOffhandItem()); + player.level().addFreshEntity(burst); + player.getOffhandItem().hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.OFF_HAND)); + player.level().playSound(null, player.getX(), player.getY(), player.getZ(), BotaniaSounds.terraBlade, SoundSource.PLAYERS, 1F, 1F); + ci.cancel(); //cancel the rest of the method so it doesn't check the main hand if there was an offhand burst. } } - @Inject(method = "getBurst", at = @At("TAIL"), locals = LocalCapture.CAPTURE_FAILHARD) - private static void botaniacombat$makeManaBeamPatronColors(Player player, ItemStack stack, CallbackInfoReturnable cir, ManaBurstEntity burst) { + @Inject(method = "getBurst", at = @At("TAIL")) + private static void botaniacombat$makeManaBeamPatronColors(Player player, ItemStack stack, CallbackInfoReturnable cir, @Local ManaBurstEntity burst) { if (PsiContributorColors.isContributor(player.getName().getString().toLowerCase())) { int[] colors = PsiContributorColors.getColors(player.getName().getString().toLowerCase()); int random = player.level().getRandom().nextInt(colors.length); diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/BabylonWeaponEntityMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/BabylonWeaponEntityMixin.java index ff23fb5..d0da930 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/BabylonWeaponEntityMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/BabylonWeaponEntityMixin.java @@ -1,6 +1,6 @@ package info.partonetrain.botaniacombat.mixin.nerf; -import info.partonetrain.botaniacombat.ConfiguredValues; +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @@ -10,6 +10,6 @@ public class BabylonWeaponEntityMixin { @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z")) public float botanaicombat_modifyBabylonWeaponDamage(float value){ - return ConfiguredValues.babylonDamage; + return BotaniaNerfConfiguredValues.babylonDamage; } } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/DamagingLensMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/DamagingLensMixin.java index bb6ef70..6f6a391 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/DamagingLensMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/DamagingLensMixin.java @@ -2,7 +2,7 @@ import com.llamalad7.mixinextras.sugar.Local; import info.partonetrain.botaniacombat.BotaniaCombat; -import info.partonetrain.botaniacombat.ConfiguredValues; +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; import net.fabric_extras.ranged_weapon.api.EntityAttributes_RangedWeapon; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.ThrowableProjectile; @@ -20,7 +20,7 @@ public float botanaicombat_modifyDamageLensDamage(float value, @Local ThrowableP damage = (float) player.getAttributeValue(EntityAttributes_RangedWeapon.DAMAGE.attribute); //will get value from held blaster } else{ - damage = ConfiguredValues.dmgLensDamage; + damage = BotaniaNerfConfiguredValues.dmgLensDamage; } return damage; diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/FallingStarEntityMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/FallingStarEntityMixin.java new file mode 100644 index 0000000..23a35cb --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/FallingStarEntityMixin.java @@ -0,0 +1,15 @@ +package info.partonetrain.botaniacombat.mixin.nerf; + +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import vazkii.botania.common.entity.FallingStarEntity; + +@Mixin(FallingStarEntity.class) +public class FallingStarEntityMixin { + @ModifyArg(method = "onHitEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z"), index = 1) + public float botanaicombat_modifyFallingStarDamage(float amount){ + return Math.random() < 0.25 ? BotaniaNerfConfiguredValues.fallingStarHighDamage : BotaniaNerfConfiguredValues.fallingStarNormalDamage; + } +} diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/MagicMissileEntityMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/MagicMissileEntityMixin.java index 8b69744..a69dd9a 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/MagicMissileEntityMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/MagicMissileEntityMixin.java @@ -1,7 +1,7 @@ package info.partonetrain.botaniacombat.mixin.nerf; import com.llamalad7.mixinextras.sugar.Local; -import info.partonetrain.botaniacombat.ConfiguredValues; +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @@ -15,8 +15,7 @@ public float botanaicombat_modifyMagicMissleDamage(float amount, @Local boolean return 12; } else{ - return ConfiguredValues.missileDamage; + return BotaniaNerfConfiguredValues.missileDamage; } - } } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/RingOfOdinItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/RingOfOdinItemMixin.java index 24f08aa..37f1053 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/RingOfOdinItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/RingOfOdinItemMixin.java @@ -2,7 +2,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; -import info.partonetrain.botaniacombat.ConfiguredValues; +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -21,7 +21,7 @@ public class RingOfOdinItemMixin { public void botaniacombat_nerfAttributeModifiers(ItemStack stack, CallbackInfoReturnable> cir){ Multimap attributes = HashMultimap.create(); attributes.put(Attributes.MAX_HEALTH, - new AttributeModifier(getBaubleUUID(stack), "Odin Ring", ConfiguredValues.odinHealthMod, ConfiguredValues.odinHealthOperation)); + new AttributeModifier(getBaubleUUID(stack), "Odin Ring", BotaniaNerfConfiguredValues.odinHealthMod, BotaniaNerfConfiguredValues.odinHealthOperation)); cir.setReturnValue(attributes); cir.cancel(); } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/TerraBladeItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/TerraBladeItemMixin.java index 13e4f56..9292126 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/TerraBladeItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/TerraBladeItemMixin.java @@ -1,6 +1,6 @@ package info.partonetrain.botaniacombat.mixin.nerf; -import info.partonetrain.botaniacombat.ConfiguredValues; +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; @@ -10,6 +10,6 @@ public class TerraBladeItemMixin { @ModifyVariable(method = "updateBurst", at = @At(value = "STORE", target = "Lnet/minecraft/world/item/Tier;getAttackDamageBonus()F"), ordinal = 0) public float botaniacombat_modifyTerraBladeDamage(float original){ - return ConfiguredValues.terraBladeDamage; + return BotaniaNerfConfiguredValues.terraBladeDamage; } } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/ThornChakramEntityMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/ThornChakramEntityMixin.java index a7b3652..3759d06 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/ThornChakramEntityMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/ThornChakramEntityMixin.java @@ -1,6 +1,6 @@ package info.partonetrain.botaniacombat.mixin.nerf; -import info.partonetrain.botaniacombat.ConfiguredValues; +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @@ -10,6 +10,6 @@ public class ThornChakramEntityMixin { @ModifyArg(method = "onHitEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z"), index = 1) public float botanaicombat_modifyChakramDamage(float value){ - return ConfiguredValues.chakramDamage; + return BotaniaNerfConfiguredValues.chakramDamage; } } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/ManaBlasterMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/ManaBlasterMixin.java index 30ddf21..43845ad 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/ManaBlasterMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/ManaBlasterMixin.java @@ -1,6 +1,6 @@ package info.partonetrain.botaniacombat.mixin.ranged; -import info.partonetrain.botaniacombat.ConfiguredValues; +import info.partonetrain.botaniacombat.BotaniaNerfConfiguredValues; import net.fabric_extras.ranged_weapon.api.EntityAttributes_RangedWeapon; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; @@ -21,7 +21,7 @@ @Mixin(ManaBlasterItem.class) public abstract class ManaBlasterMixin extends Item { @Unique - float damage = ConfiguredValues.dmgLensDamage; + float damage = BotaniaNerfConfiguredValues.dmgLensDamage; @Unique AttributeModifier mod1 = new AttributeModifier(UUID.fromString("60dfc4ff-de55-4f4f-8b4b-a7748c26ec4d"), "Blaster mainhand modifier", damage, AttributeModifier.Operation.ADDITION); @Unique diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/shield/PlayerMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/shield/PlayerMixin.java index 243583d..6cd31a5 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/shield/PlayerMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/shield/PlayerMixin.java @@ -14,7 +14,7 @@ @Mixin(Player.class) public abstract class PlayerMixin { - @Inject(method = "Lnet/minecraft/world/entity/player/Player;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z", at = @At("TAIL")) + @Inject(method = "hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z", at = @At("TAIL")) private void botaniacombat$svallinCatchFireDamage(DamageSource source, float amount, CallbackInfoReturnable cir){ Player player = (Player) (Object) this; ItemStack offhand = player.getItemBySlot(EquipmentSlot.OFFHAND); diff --git a/src/main/java/info/partonetrain/botaniacombat/network/StarcallerHitPacket.java b/src/main/java/info/partonetrain/botaniacombat/network/StarcallerHitPacket.java new file mode 100644 index 0000000..a2214d9 --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/network/StarcallerHitPacket.java @@ -0,0 +1,27 @@ +package info.partonetrain.botaniacombat.network; + +import info.partonetrain.botaniacombat.BotaniaCombat; +import net.fabricmc.fabric.api.networking.v1.FabricPacket; +import net.fabricmc.fabric.api.networking.v1.PacketType; +import net.minecraft.network.FriendlyByteBuf; + +public class StarcallerHitPacket implements FabricPacket { + private final boolean offhand; + + public StarcallerHitPacket(boolean offhand){ + this.offhand = offhand; + } + public StarcallerHitPacket(FriendlyByteBuf buf){ + offhand = buf.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeBoolean(offhand); + } + + @Override + public PacketType getType() { + return BotaniaCombat.STARCALLER_HIT_PACKET_PACKET_TYPE; + } +} diff --git a/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatItems.java b/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatItems.java index 33df41e..c1d5ff4 100644 --- a/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatItems.java +++ b/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatItems.java @@ -13,7 +13,6 @@ import vazkii.botania.api.BotaniaRegistries; public final class BotaniaCombatItems { - public static BotaniaCombatConfig config = AutoConfig.getConfigHolder(BotaniaCombatConfig.class).getConfig(); public static final Item.Properties ITEM_PROPERTIES_MANASTEEL = BotaniaCombatItemProperties.defaultItemBuilderWithCustomDamageOnFabric().defaultDurability(300); diff --git a/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatNetworking.java b/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatNetworking.java new file mode 100644 index 0000000..408f8af --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatNetworking.java @@ -0,0 +1,21 @@ +package info.partonetrain.botaniacombat.registry; + +import info.partonetrain.botaniacombat.BotaniaCombat; +import info.partonetrain.botaniacombat.IStarcaller; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +public class BotaniaCombatNetworking { + public static void init(){ + ServerPlayNetworking.registerGlobalReceiver(BotaniaCombat.STARCALLER_PACKET_ID, (server, player, handler, buf, responseSender) -> { + boolean offhand = buf.getBoolean(0); + server.execute(()->{ + ItemStack stack = offhand ? player.getOffhandItem(): player.getMainHandItem(); + Item item = stack.getItem(); + IStarcaller starcaller = (IStarcaller)item; + starcaller.botaniacombat_summonStarBetterCombat(stack, player.level(), player); + }); + }); + } +} diff --git a/src/main/resources/assets/botaniacombat/lang/en_us.json b/src/main/resources/assets/botaniacombat/lang/en_us.json index b1cbf30..b9b4362 100644 --- a/src/main/resources/assets/botaniacombat/lang/en_us.json +++ b/src/main/resources/assets/botaniacombat/lang/en_us.json @@ -131,7 +131,9 @@ "text.autoconfig.botaniacombat.option.botaniaNerfsConfig": "Botania Nerfs/Buffs (optional, unchanged by default)", "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.terraBladeDamage": "Terrasteel Weapon Burst Damage", - "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.chakramDamage": "Thorn Chakram Damage", + "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.chakramDamage": "Thorn/Flare Chakram Damage", + "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.fallingStarNormalDamage": "Falling Star Damage", + "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.fallingStarHighDamage": "Falling Star High Damage", "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.missileDamage": "Magic Missile Damage", "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.dmgLensDamage": "Damaging Lens Damage", "text.autoconfig.botaniacombat.option.botaniaNerfsConfig.odinHealthMod": "Ring of Odin Health Mod", diff --git a/src/main/resources/botaniacombat.mixins.json b/src/main/resources/botaniacombat.mixins.json index 6baf94e..a6e2691 100644 --- a/src/main/resources/botaniacombat.mixins.json +++ b/src/main/resources/botaniacombat.mixins.json @@ -5,13 +5,15 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "BotaniaLeftClickPacketMixin", - "ElementiumAxeItemMixin", - "ElementiumSwordItemMixin", "EnchantmentMixin", "PixieHandlerMixin", - "TerraBladeItemMixin", + "bettercombat.ElementiumAxeItemMixin", + "bettercombat.ElementiumSwordItemMixin", + "bettercombat.StarcallerItemMixin", + "bettercombat.TerraBladeItemMixin", "nerf.BabylonWeaponEntityMixin", "nerf.DamagingLensMixin", + "nerf.FallingStarEntityMixin", "nerf.MagicMissileEntityMixin", "nerf.RingOfOdinItemMixin", "nerf.TerraBladeItemMixin",