diff --git a/README.md b/README.md index 04fa69b..4a02c6b 100644 --- a/README.md +++ b/README.md @@ -12,13 +12,14 @@ This mod does the following: - Adds additional post-Gaia weapon, the Gaia Greatsword, which can use all of your Patreon colors - Buffs player-spawned pixies by making them always have the +2 damage bonus that would normally only be applied when the player is holding the Elementium Sword - Adds Gaia Gifts: "secret" weapon(s) obtained by defeating Gaia II under specific conditions -- 2.2.0 Adds "Angry Angry Bozu", an "evil upgrade" to Botania's Teru Teru Bozu that can summon thunderstorms. Useful for Channeling Tridents and Thundercaller. +- Adds "Angry Angry Bozu", an "evil upgrade" to Botania's Teru Teru Bozu that can summon thunderstorms. Useful for Channeling Tridents and Thundercaller If [Better Combat](https://www.curseforge.com/minecraft/mc-mods/better-combat-by-daedelus) is installed, it also does the following: - Adds offhand pixie spawn chance attribute to Elementium weapons (including Elementium Sword) - Adds pixie spawn chance attributes to the Elementium Axe -- Makes Terrasteel weapons (including Terra Blade) shoot a beam at the start of a BetterCombat swing; also works with offhand swings +- Makes Terrasteel weapons (including Terra Blade) shoot a beam during a BetterCombat swing; also works with offhand swings +- Makes Starcaller work similar to Terrasteel weapons - Reduces Thundercaller attack range to 1.5 (from BetterCombat's default 2.5), electricity range is unaffected If [Fabric Shield Lib](https://www.curseforge.com/minecraft/mc-mods/fabric-shield-lib) is installed, it also does the following: @@ -28,13 +29,14 @@ If [Fabric Shield Lib](https://www.curseforge.com/minecraft/mc-mods/fabric-shiel - Adds shield Gaia Gift If [Ranged Weapon API](https://www.curseforge.com/minecraft/mc-mods/ranged-weapon-api) is installed, it also does the following: -- Adds Pull Time and Projectile Damage attributes to Botania's bows +- Adds Pull Time and Ranged Damage attributes to Botania's bows - Adds Livingwood Crossbow - Adds Crystal Crossbow +- Adds Ranged Damage attribute to Mana Blaster with Damage lens (which deals magic damage) - Adds bow Gaia Gift **NOTE**: To ensure that the Lexica and subtitles from Botania are accurate, this mod includes an enabled-by-default resource pack that overrides some of Botania's lang file. -This mod only supports en_us.json currently (translations wanted) +This mod only supports en_us.json currently (translations wanted). Credits / Thanks: - Unilock for [cleaning up the code and fixing compat with Sinytra Connector](https://github.com/Partonetrain/botaniacombat/pull/1) @@ -42,6 +44,7 @@ Credits / Thanks: - arkosammy12 for helping with the Elementium Axe mixin - Adarsh and everyone else on the Violet Moon forums giving me feedback and ideas - June (of BasicWeapons) for letting me use that mod's method for dynamic item renders in the older versions +- brokenk3yboard for helping me understand Fabric networking API If you like this mod, [consider supporting me on ko-fi](https://ko-fi.com/partonetrain) ^_^ @@ -59,7 +62,4 @@ It should, thanks to Unilock's PR. Support for it is lower priority than support A couple of reasons, but mostly these are mods I already use myself, and I don't like doing mixin on vanilla when there's just a library I could use that does it #### *Is there a config?* -Yes, and a quite extensive one at that. Values pertaining to BotaniaCombat weapons can be changed, and certain Botania items can be nerfed (or buffed) as well. - -### *Why doesn't my Starcaller work like it should?* -WIP \ No newline at end of file +Yes, and a quite extensive one at that. It can be configured via ModMenu. Values pertaining to BotaniaCombat weapons can be changed, and certain Botania items can be nerfed (or buffed) as well. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4fb9ec5..2846169 100644 --- a/build.gradle +++ b/build.gradle @@ -66,7 +66,7 @@ dependencies { modImplementation "maven.modrinth:ranged-weapon-api:${project.ranged_weapon_api_version}" modImplementation "maven.modrinth:archers:${project.archers_version}" - include(implementation("com.github.ZsoltMolnarrr:TinyConfig:${project.tiny_config_version}")) + modImplementation("com.github.ZsoltMolnarrr:TinyConfig:${project.tiny_config_version}") modApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") { exclude(group: "net.fabricmc.fabric-api") diff --git a/gradle.properties b/gradle.properties index 5c92ce8..3577bb4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.20.1+build.10 loader_version=0.15.7 # Mod Properties -mod_version=1.20.1-2.3.0 +mod_version=1.20.1-3.0.0b maven_group=info.partonetrain archives_base_name=botaniacombat diff --git a/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java b/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java index 2ecd880..94272a3 100644 --- a/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java +++ b/src/client/java/info/partonetrain/botaniacombat/BotaniaCombatClient.java @@ -4,6 +4,7 @@ import info.partonetrain.botaniacombat.item.GaiaGreatswordItem; import info.partonetrain.botaniacombat.item.TerrasteelWeaponItem; import info.partonetrain.botaniacombat.network.StarcallerAttackHitHandler; +import info.partonetrain.botaniacombat.network.TerrasteelWeaponAttackHitHandler; import info.partonetrain.botaniacombat.registry.BotaniaCombatShieldItems; import info.partonetrain.botaniacombat.render.entity.BotaniaCombatEntityRenderers; import net.bettercombat.api.AttackHand; @@ -43,8 +44,7 @@ public void onInitializeClient() { this.registerOptionalResourcePack(); //for botaniacombatlang respack if (BotaniaCombat.BETTER_COMBAT_INSTALLED) { - BotaniaCombat.LOGGER.info("BetterCombat found, running client code"); - BetterCombatClientEvents.ATTACK_START.register(this::checkBetterCombatSwing); + BetterCombatClientEvents.ATTACK_HIT.register(new TerrasteelWeaponAttackHitHandler()); BetterCombatClientEvents.ATTACK_HIT.register(new StarcallerAttackHitHandler()); } @@ -70,18 +70,6 @@ public void onInitializeClient() { } } - public void checkBetterCombatSwing(LocalPlayer clientPlayerEntity, AttackHand attackHand) { - if (attackHand.itemStack().getItem() instanceof TerrasteelWeaponItem) { - TerrasteelWeaponItem.leftClick(attackHand.itemStack()); - } - else if (attackHand.itemStack().getItem() instanceof GaiaGreatswordItem) { - GaiaGreatswordItem.leftClick(attackHand.itemStack()); - } - else if (attackHand.itemStack().getItem() instanceof TerraBladeItem) { - TerraBladeItem.leftClick(attackHand.itemStack()); //the botania weapon - } - } - public void registerOptionalResourcePack() { ResourceLocation folderName = new ResourceLocation(BotaniaCombat.MOD_ID, "botaniacombatlang"); Component displayName = Component.literal("BotaniaCombat Lang Fixes"); diff --git a/src/client/java/info/partonetrain/botaniacombat/mixin/client/MinecraftMixin.java b/src/client/java/info/partonetrain/botaniacombat/mixin/client/vanillacombat/MinecraftMixin.java similarity index 81% rename from src/client/java/info/partonetrain/botaniacombat/mixin/client/MinecraftMixin.java rename to src/client/java/info/partonetrain/botaniacombat/mixin/client/vanillacombat/MinecraftMixin.java index 9700040..4f6edfe 100644 --- a/src/client/java/info/partonetrain/botaniacombat/mixin/client/MinecraftMixin.java +++ b/src/client/java/info/partonetrain/botaniacombat/mixin/client/vanillacombat/MinecraftMixin.java @@ -1,4 +1,4 @@ -package info.partonetrain.botaniacombat.mixin.client; +package info.partonetrain.botaniacombat.mixin.client.vanillacombat; import info.partonetrain.botaniacombat.item.GaiaGreatswordItem; import info.partonetrain.botaniacombat.item.TerrasteelWeaponItem; @@ -17,7 +17,6 @@ public abstract class MinecraftMixin { @Nullable public LocalPlayer player; - //this is not actually called when the player swings and BetterCombat is installed, but it's here in case you want to use the mod without BetterCombat or for misc compat @Inject(method = "startAttack", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;resetAttackStrengthTicker()V")) private void leftClickEmpty(CallbackInfoReturnable ci) { TerrasteelWeaponItem.leftClick(player.getMainHandItem()); diff --git a/src/client/java/info/partonetrain/botaniacombat/network/StarcallerAttackHitHandler.java b/src/client/java/info/partonetrain/botaniacombat/network/StarcallerAttackHitHandler.java index 53b39cb..e84e75e 100644 --- a/src/client/java/info/partonetrain/botaniacombat/network/StarcallerAttackHitHandler.java +++ b/src/client/java/info/partonetrain/botaniacombat/network/StarcallerAttackHitHandler.java @@ -14,8 +14,8 @@ 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(); + public void onPlayerAttackStart(LocalPlayer localPlayer, AttackHand attackHand, List list, @Nullable Entity entity) { + ItemStack stack = attackHand.isOffHand() ? localPlayer.getOffhandItem() : localPlayer.getMainHandItem(); if (stack.isEmpty()) { return; } diff --git a/src/client/java/info/partonetrain/botaniacombat/network/TerrasteelWeaponAttackHitHandler.java b/src/client/java/info/partonetrain/botaniacombat/network/TerrasteelWeaponAttackHitHandler.java new file mode 100644 index 0000000..a8b1f7e --- /dev/null +++ b/src/client/java/info/partonetrain/botaniacombat/network/TerrasteelWeaponAttackHitHandler.java @@ -0,0 +1,29 @@ +package info.partonetrain.botaniacombat.network; + +import info.partonetrain.botaniacombat.ITerrasteelWeapon; +import info.partonetrain.botaniacombat.item.GaiaGreatswordItem; +import info.partonetrain.botaniacombat.item.TerrasteelWeaponItem; +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 java.util.List; + +public class TerrasteelWeaponAttackHitHandler implements BetterCombatClientEvents.PlayerAttackHit{ + @Override + public void onPlayerAttackStart(LocalPlayer localPlayer, AttackHand attackHand, List list, @Nullable Entity entity) { + ItemStack stack = attackHand.isOffHand() ? localPlayer.getOffhandItem() : localPlayer.getMainHandItem(); + if (stack.isEmpty()) { + return; + } + Item item = stack.getItem(); + if (item instanceof ITerrasteelWeapon) { + ClientPlayNetworking.send(new TerrasteelWeaponHitPacket(attackHand.isOffHand())); + } + } +} diff --git a/src/client/resources/botaniacombat.client.mixins.json b/src/client/resources/botaniacombat.client.mixins.json index 7fdb4b6..5df9842 100644 --- a/src/client/resources/botaniacombat.client.mixins.json +++ b/src/client/resources/botaniacombat.client.mixins.json @@ -4,7 +4,7 @@ "compatibilityLevel": "JAVA_17", "client": [ "AbstractClientPlayerMixin", - "MinecraftMixin" + "vanillacombat.MinecraftMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java index e984060..79d5fa5 100644 --- a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java +++ b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombat.java @@ -5,6 +5,7 @@ import info.partonetrain.botaniacombat.item.TerrasteelWeaponItem; import info.partonetrain.botaniacombat.item.shield.ElementiumBannerShieldItem; import info.partonetrain.botaniacombat.network.StarcallerHitPacket; +import info.partonetrain.botaniacombat.network.TerrasteelWeaponHitPacket; import info.partonetrain.botaniacombat.registry.*; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.serializer.JanksonConfigSerializer; @@ -27,8 +28,10 @@ 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 TERRASTEEL_WEAPON_PACKET_ID = new ResourceLocation(MOD_ID, "terrasteel_weapon"); 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); + public static final PacketType TERRASTEEL_WEAPON_PACKET_TYPE = PacketType.create(TERRASTEEL_WEAPON_PACKET_ID, TerrasteelWeaponHitPacket::new); @Override public void onInitialize() { @@ -36,8 +39,10 @@ public void onInitialize() { BotaniaCombatItems.init(); 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); + if(!BETTER_COMBAT_INSTALLED){ //fabric events for vanilla combat + AttackEntityCallback.EVENT.register(TerrasteelWeaponItem::attackEntity); + AttackEntityCallback.EVENT.register(GaiaGreatswordItem::attackEntity); + } if (FABRIC_SHIELD_LIB_INSTALLED) { BotaniaCombatShieldItems.init(); @@ -46,13 +51,16 @@ public void onInitialize() { if (RANGED_WEAPON_API_INSTALLED) { BotaniaCombatRangedItems.init(); } + if (BETTER_COMBAT_INSTALLED){ + BotaniaCombatNetworking.initBetterCombat(); + } BotaniaCombatBlocks.init(); 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 ca99127..9bd3ef4 100644 --- a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatConfig.java +++ b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatConfig.java @@ -11,7 +11,7 @@ public class BotaniaCombatConfig implements ConfigData { @Comment("Modifier of dagger damage amount relative to tier damage") public int daggerDamageModifier = -3; @Comment("Modifier of dagger speed relative to default speed (4)") - public float daggerSpeed = -2.0f; + public float daggerSpeed = -1.6f; @Comment("Whether or not the Slaughtersaw can ONLY hit entities in the #botaniacombat:meaty entity tag") public boolean slaughtersawRestricted = false; @Comment("Modifier of Slaughtersaw damage amount relative to Manasteel tier damage") @@ -21,15 +21,15 @@ public class BotaniaCombatConfig implements ConfigData { @Comment("Modifier of spear damage amount relative to tier damage") public int spearDamageModifier = -1; @Comment("Modifier of spear speed relative to default speed (4)") - public float spearSpeed = -2.8f; + public float spearSpeed = -2.6f; @Comment("Modifier of Soulstaff damage amount relative to Manasteel tier damage") public int soulstaffDamageModifier = -1; @Comment("Modifier of Soulstaff speed relative to default speed (4)") public float soulstaffSpeed = -2.3f; @Comment("Modifier of Gaia Greatsword damage amount relative to Terrasteel tier damage") - public int greatswordDamageModifier = 3; + public int greatswordDamageModifier = 4; @Comment("Modifier of Gaia Greatsword speed relative to default speed (4)") - public float greatswordSpeed = -3.4f; + public float greatswordSpeed = -3f; @Comment("Modifier of Mjolnir damage relative to Terrasteel tier damage") public int mjolinirDamageModifier = 4; @Comment("Modifier of Mjolnir speed relative to default speed (4)") diff --git a/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatMixinPlugin.java b/src/main/java/info/partonetrain/botaniacombat/BotaniaCombatMixinPlugin.java index b29a6e9..61733ce 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("vanillacombat")) { + return !BotaniaCombat.BETTER_COMBAT_INSTALLED; + } if (Arrays.asList(packageTree).contains("bettercombat")) { return BotaniaCombat.BETTER_COMBAT_INSTALLED; } diff --git a/src/main/java/info/partonetrain/botaniacombat/IStarcaller.java b/src/main/java/info/partonetrain/botaniacombat/IStarcaller.java index d106689..1264975 100644 --- a/src/main/java/info/partonetrain/botaniacombat/IStarcaller.java +++ b/src/main/java/info/partonetrain/botaniacombat/IStarcaller.java @@ -1,9 +1,10 @@ package info.partonetrain.botaniacombat; +import net.minecraft.world.InteractionHand; 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); + void botaniacombat$summonStarBetterCombat(ItemStack stack, Level level, Player player, InteractionHand interactionHand); } diff --git a/src/main/java/info/partonetrain/botaniacombat/ITerrasteelWeapon.java b/src/main/java/info/partonetrain/botaniacombat/ITerrasteelWeapon.java new file mode 100644 index 0000000..cd4639d --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/ITerrasteelWeapon.java @@ -0,0 +1,10 @@ +package info.partonetrain.botaniacombat; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public interface ITerrasteelWeapon { + void botaniacombat$summonBeamBetterCombat(ItemStack stack, Level level, Player player, InteractionHand interactionHand); +} diff --git a/src/main/java/info/partonetrain/botaniacombat/item/GaiaGreatswordItem.java b/src/main/java/info/partonetrain/botaniacombat/item/GaiaGreatswordItem.java index 6bcc30c..94ec91d 100644 --- a/src/main/java/info/partonetrain/botaniacombat/item/GaiaGreatswordItem.java +++ b/src/main/java/info/partonetrain/botaniacombat/item/GaiaGreatswordItem.java @@ -2,6 +2,7 @@ import info.partonetrain.botaniacombat.BotaniaCombat; import info.partonetrain.botaniacombat.ColorContainer; +import info.partonetrain.botaniacombat.ITerrasteelWeapon; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -18,54 +19,45 @@ import vazkii.botania.network.serverbound.LeftClickPacket; import vazkii.botania.xplat.ClientXplatAbstractions; -public class GaiaGreatswordItem extends BotaniaCombatWeaponItem { +public class GaiaGreatswordItem extends BotaniaCombatWeaponItem implements ITerrasteelWeapon { private static final int[] BURST_ANGLES = new int[]{-30, -20, -10, 0, 10, 20, 30}; public GaiaGreatswordItem(Tier mat, int attackDamageFromWeaponType, float attackSpeed, Properties props) { super(mat, attackDamageFromWeaponType, attackSpeed, props); } - public static void leftClick(ItemStack stack) { + public static void leftClick(ItemStack stack) { //vanilla combat ONLY if (!stack.isEmpty() && stack.getItem() instanceof GaiaGreatswordItem) { ClientXplatAbstractions.INSTANCE.sendToServer(LeftClickPacket.INSTANCE); } } public static InteractionResult attackEntity(Player player, Level world, InteractionHand hand, Entity target, @Nullable EntityHitResult hit) { - if (!player.level().isClientSide() && !player.isSpectator()) { + if (!player.level().isClientSide() && !player.isSpectator()) { //vanilla combat ONLY trySpawnBursts(player); } return InteractionResult.PASS; } - public static void trySpawnBursts(Player player) { + public static void trySpawnBursts(Player player) { //vanilla combat ONLY trySpawnBursts(player, player.getAttackStrengthScale(0F)); } - public static void trySpawnBursts(Player player, float attackStrength) { + public static void trySpawnBursts(Player player, float attackStrength) { //vanilla combat ONLY if (!player.isSpectator()) { //mainhand if (!player.getMainHandItem().isEmpty() && player.getMainHandItem().getItem() instanceof GaiaGreatswordItem && attackStrength == 1) { - spawnBursts(player); + spawnSevenBursts(player); player.getMainHandItem().hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.MAIN_HAND)); player.level().playSound(null, player.getX(), player.getY(), player.getZ(), BotaniaSounds.terraBlade, SoundSource.PLAYERS, 1F, 1F); } - - //offhand - if (!player.getOffhandItem().isEmpty() - && player.getOffhandItem().getItem() instanceof GaiaGreatswordItem - && attackStrength == 1) { - spawnBursts(player); - 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); - } } } - public static void spawnBursts(Player player) { + public static void spawnSevenBursts(Player player) { final ItemStack DUMMY_TERRABLADE = new ItemStack(BotaniaItems.terraSword); ColorContainer cc = new ColorContainer(player.getName().getString()); @@ -93,4 +85,16 @@ public static void spawnBursts(Player player) { public int getManaPerDamage() { return BotaniaCombat.MANA_PER_DAMAGE_TERRA * BURST_ANGLES.length; } + + @Override + public void botaniacombat$summonBeamBetterCombat(ItemStack stack, Level level, Player player, InteractionHand interactionHand) { + float attackStrength = player.getAttackStrengthScale(0F); + if (!player.isSpectator() + && stack.getItem() instanceof ITerrasteelWeapon + && attackStrength == 1) { + spawnSevenBursts(player); + stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(interactionHand)); + player.level().playSound(null, player.getX(), player.getY(), player.getZ(), BotaniaSounds.terraBlade, SoundSource.PLAYERS, 1F, 1F); + } + } } diff --git a/src/main/java/info/partonetrain/botaniacombat/item/MjolnirItem.java b/src/main/java/info/partonetrain/botaniacombat/item/MjolnirItem.java index 21118e5..7635504 100644 --- a/src/main/java/info/partonetrain/botaniacombat/item/MjolnirItem.java +++ b/src/main/java/info/partonetrain/botaniacombat/item/MjolnirItem.java @@ -94,7 +94,7 @@ public boolean hurtEnemy(ItemStack stack, LivingEntity entity, @NotNull LivingEn for (int i = 0; i < hops; i++) { List entities = entity.level().getEntities(prevTarget, new AABB(prevTarget.getX() - range, prevTarget.getY() - range, prevTarget.getZ() - range, prevTarget.getX() + range, prevTarget.getY() + range, prevTarget.getZ() + range), selector); - if (entities.isEmpty()) { + if (entities.isEmpty() || dmg < 1) { break; } diff --git a/src/main/java/info/partonetrain/botaniacombat/item/TerrasteelWeaponItem.java b/src/main/java/info/partonetrain/botaniacombat/item/TerrasteelWeaponItem.java index a646fb1..487150a 100644 --- a/src/main/java/info/partonetrain/botaniacombat/item/TerrasteelWeaponItem.java +++ b/src/main/java/info/partonetrain/botaniacombat/item/TerrasteelWeaponItem.java @@ -1,6 +1,7 @@ package info.partonetrain.botaniacombat.item; import info.partonetrain.botaniacombat.BotaniaCombat; +import info.partonetrain.botaniacombat.ITerrasteelWeapon; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -19,33 +20,31 @@ import vazkii.botania.network.serverbound.LeftClickPacket; import vazkii.botania.xplat.ClientXplatAbstractions; -public class TerrasteelWeaponItem extends BotaniaCombatWeaponItem { +public class TerrasteelWeaponItem extends BotaniaCombatWeaponItem implements ITerrasteelWeapon { public TerrasteelWeaponItem(Tier mat, int attackDamageFromWeaponType, float attackSpeed, Item.Properties properties) { super(mat, attackDamageFromWeaponType, attackSpeed, properties); } - public static void leftClick(ItemStack stack) { + public static void leftClick(ItemStack stack) { //vanilla combat ONLY if (!stack.isEmpty() && stack.getItem() instanceof TerrasteelWeaponItem) { ClientXplatAbstractions.INSTANCE.sendToServer(LeftClickPacket.INSTANCE); } } - public static InteractionResult attackEntity(Player player, Level world, InteractionHand hand, Entity target, @Nullable EntityHitResult hit) { + public static InteractionResult attackEntity(Player player, Level world, InteractionHand hand, Entity target, @Nullable EntityHitResult hit) { //vanilla combat ONLY if (!player.level().isClientSide() && !player.isSpectator()) { trySpawnBurst(player); } return InteractionResult.PASS; } - public static void trySpawnBurst(Player player) { + public static void trySpawnBurst(Player player) { //vanilla combat ONLY trySpawnBurst(player, player.getAttackStrengthScale(0F)); } - public static void trySpawnBurst(Player player, float attackStrength) { + public static void trySpawnBurst(Player player, float attackStrength) { //vanilla combat ONLY if (!player.isSpectator()) { final ItemStack DUMMY_TERRABLADE = new ItemStack(BotaniaItems.terraSword); - - //mainhand if (!player.getMainHandItem().isEmpty() && player.getMainHandItem().getItem() instanceof TerrasteelWeaponItem && attackStrength == 1) { @@ -54,17 +53,6 @@ public static void trySpawnBurst(Player player, float attackStrength) { player.getMainHandItem().hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.MAIN_HAND)); player.level().playSound(null, player.getX(), player.getY(), player.getZ(), BotaniaSounds.terraBlade, SoundSource.PLAYERS, 1F, 1F); } - - //offhand - if (!player.getOffhandItem().isEmpty() - && player.getOffhandItem().getItem() instanceof TerrasteelWeaponItem - && attackStrength == 1) { - ManaBurstEntity burst = TerraBladeItem.getBurst(player, DUMMY_TERRABLADE); - - 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); - } } } @@ -72,4 +60,19 @@ public static void trySpawnBurst(Player player, float attackStrength) { public int getManaPerDamage() { return BotaniaCombat.MANA_PER_DAMAGE_TERRA; } + + @Override + public void botaniacombat$summonBeamBetterCombat(ItemStack stack, Level level, Player player, InteractionHand interactionHand) { + final ItemStack DUMMY_TERRABLADE = new ItemStack(BotaniaItems.terraSword); + float attackStrength = player.getAttackStrengthScale(0F); + if (!player.isSpectator() + && stack.getItem() instanceof ITerrasteelWeapon + && attackStrength == 1) { + ManaBurstEntity burst = TerraBladeItem.getBurst(player, stack); + burst.setSourceLens(DUMMY_TERRABLADE); + player.level().addFreshEntity(burst); + stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(interactionHand)); + player.level().playSound(null, player.getX(), player.getY(), player.getZ(), BotaniaSounds.terraBlade, SoundSource.PLAYERS, 1F, 1F); + } + } } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/TerraBladeItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/TerraBladeItemMixin.java new file mode 100644 index 0000000..a0ae6a2 --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/TerraBladeItemMixin.java @@ -0,0 +1,24 @@ +package info.partonetrain.botaniacombat.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import info.partonetrain.botaniacombat.PsiContributorColors; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +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 vazkii.botania.common.entity.ManaBurstEntity; +import vazkii.botania.common.item.equipment.tool.terrasteel.TerraBladeItem; + +@Mixin(TerraBladeItem.class) +public class TerraBladeItemMixin { + @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); + burst.setColor(colors[random]); + } + } +} diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumSwordItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumSwordItemMixin.java index 75f354c..4e5840a 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumSwordItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/ElementiumSwordItemMixin.java @@ -2,6 +2,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import com.llamalad7.mixinextras.sugar.Local; import info.partonetrain.botaniacombat.BotaniaCombat; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.ai.attributes.Attribute; @@ -19,10 +20,9 @@ public class ElementiumSwordItemMixin { @Inject( method = "getDefaultAttributeModifiers(Lnet/minecraft/world/entity/EquipmentSlot;)Lcom/google/common/collect/Multimap;", - at = @At("TAIL"), - locals = LocalCapture.CAPTURE_FAILHARD + at = @At("TAIL") ) - private void botaniacombat$addOffhandAttributeToElementiumSword(@NotNull EquipmentSlot slot, CallbackInfoReturnable<@NotNull Multimap> cir, Multimap ret) { + private void botaniacombat$addOffhandAttributeToElementiumSword(@NotNull EquipmentSlot slot, CallbackInfoReturnable<@NotNull Multimap> cir, @Local Multimap ret) { 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 index d109fc7..22fcafe 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/StarcallerItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/StarcallerItemMixin.java @@ -1,6 +1,7 @@ package info.partonetrain.botaniacombat.mixin.bettercombat; import info.partonetrain.botaniacombat.IStarcaller; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -14,7 +15,7 @@ public class StarcallerItemMixin implements IStarcaller { //StarcallerItem will @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){ + public void botaniacombat$summonStarBetterCombat(ItemStack stack, Level level, Player player, InteractionHand interactionHand){ long timeSinceLast = level.getGameTime() - ItemNBTHelper.getLong(stack, "lastTriggerTime", level.getGameTime()); if (timeSinceLast > 12L && !level.isClientSide()) { //12L = StarcallerItem.INTERVAL ItemNBTHelper.setLong(stack, "lastTriggerTime", level.getGameTime()); diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/TerraBladeItemMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/TerraBladeItemMixin.java index cf43b57..08771af 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/TerraBladeItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/bettercombat/TerraBladeItemMixin.java @@ -2,11 +2,17 @@ import com.llamalad7.mixinextras.sugar.Local; import info.partonetrain.botaniacombat.BotaniaCombat; +import info.partonetrain.botaniacombat.ITerrasteelWeapon; import info.partonetrain.botaniacombat.PsiContributorColors; +import net.bettercombat.api.AttackHand; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.EntityHitResult; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -19,31 +25,23 @@ import vazkii.botania.common.item.equipment.tool.terrasteel.TerraBladeItem; @Mixin(TerraBladeItem.class) -public class TerraBladeItemMixin { - @Inject( - method = "trySpawnBurst(Lnet/minecraft/world/entity/player/Player;F)V", - at = @At("HEAD"), - cancellable = true - ) - private static void botaniacombat$addOffhandBurst(Player player, float attackStrength, CallbackInfo ci) { +public class TerraBladeItemMixin implements ITerrasteelWeapon { + @Inject(method = "attackEntity", at = @At("HEAD"), cancellable = true) + private static void botaniacombat$cancelAttackEntity(Player player, Level world, InteractionHand hand, Entity target, EntityHitResult hit, CallbackInfoReturnable cir){ + cir.setReturnValue(InteractionResult.PASS); + cir.cancel(); + } + + @Override + public void botaniacombat$summonBeamBetterCombat(ItemStack stack, Level level, Player player, InteractionHand interactionHand) { + float attackStrength = player.getAttackStrengthScale(0F); if (!player.isSpectator() - && !player.getOffhandItem().isEmpty() - && player.getOffhandItem().is(BotaniaItems.terraSword) + && stack.getItem() instanceof ITerrasteelWeapon && attackStrength == 1) { - ManaBurstEntity burst = TerraBladeItem.getBurst(player, player.getOffhandItem()); + ManaBurstEntity burst = TerraBladeItem.getBurst(player, stack); player.level().addFreshEntity(burst); - player.getOffhandItem().hurtAndBreak(1, player, p -> p.broadcastBreakEvent(InteractionHand.OFF_HAND)); + stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(interactionHand)); 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")) - 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); - burst.setColor(colors[random]); } } } 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 d0da930..09e2d4b 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/BabylonWeaponEntityMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/BabylonWeaponEntityMixin.java @@ -9,7 +9,7 @@ @Mixin(BabylonWeaponEntity.class) 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){ + public float botanaicombat$modifyBabylonWeaponDamage(float value){ 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 6f6a391..ca2a93d 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/DamagingLensMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/DamagingLensMixin.java @@ -14,7 +14,7 @@ @Mixin(DamagingLens.class) public class DamagingLensMixin { @ModifyArg(method = "updateBurst", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z"), index = 1) - public float botanaicombat_modifyDamageLensDamage(float value, @Local ThrowableProjectile entity){ + public float botanaicombat$modifyDamageLensDamage(float value, @Local ThrowableProjectile entity){ float damage; if(BotaniaCombat.RANGED_WEAPON_API_INSTALLED && entity.getOwner() instanceof Player player){ damage = (float) player.getAttributeValue(EntityAttributes_RangedWeapon.DAMAGE.attribute); //will get value from held blaster diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/FallingStarEntityMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/FallingStarEntityMixin.java index 23a35cb..e01bf0b 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/FallingStarEntityMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/FallingStarEntityMixin.java @@ -9,7 +9,7 @@ @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){ + 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 a69dd9a..601a35d 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/MagicMissileEntityMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/MagicMissileEntityMixin.java @@ -10,7 +10,7 @@ @Mixin(MagicMissileEntity.class) public class MagicMissileEntityMixin { @ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z"), index = 1) - public float botanaicombat_modifyMagicMissleDamage(float amount, @Local boolean evil){ + public float botanaicombat$modifyMagicMissleDamage(float amount, @Local boolean evil){ if(evil){ return 12; } 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 37f1053..266f282 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/RingOfOdinItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/RingOfOdinItemMixin.java @@ -18,7 +18,7 @@ @Mixin(RingOfOdinItem.class) public class RingOfOdinItemMixin { @Inject(method = "getEquippedAttributeModifiers", at = @At("HEAD"), cancellable = true) - public void botaniacombat_nerfAttributeModifiers(ItemStack stack, CallbackInfoReturnable> cir){ + public void botaniacombat$nerfAttributeModifiers(ItemStack stack, CallbackInfoReturnable> cir){ Multimap attributes = HashMultimap.create(); attributes.put(Attributes.MAX_HEALTH, new AttributeModifier(getBaubleUUID(stack), "Odin Ring", BotaniaNerfConfiguredValues.odinHealthMod, BotaniaNerfConfiguredValues.odinHealthOperation)); 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 9292126..d6eab8a 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/TerraBladeItemMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/TerraBladeItemMixin.java @@ -9,7 +9,7 @@ @Mixin(TerraBladeItem.class) 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){ + public float botaniacombat$modifyTerraBladeDamage(float original){ 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 3759d06..711bedd 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/ThornChakramEntityMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/nerf/ThornChakramEntityMixin.java @@ -9,7 +9,7 @@ @Mixin(ThornChakramEntity.class) 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){ + public float botanaicombat$modifyChakramDamage(float value){ return BotaniaNerfConfiguredValues.chakramDamage; } } diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/AbstractArrowMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/AbstractArrowMixin.java index 937bb6a..cbfd4e5 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/AbstractArrowMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/AbstractArrowMixin.java @@ -21,7 +21,7 @@ public class AbstractArrowMixin implements ITickFreezeArrow { } @Inject(method = "doPostHurtEffects", at = @At("HEAD")) - public void botaniacombat_addFrozenTicks(LivingEntity target, CallbackInfo ci){ + public void botaniacombat$addFrozenTicks(LivingEntity target, CallbackInfo ci){ target.setTicksFrozen(target.getTicksFrozen() + freezeTicks); } } 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 43845ad..444d8eb 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/ManaBlasterMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/ranged/ManaBlasterMixin.java @@ -31,7 +31,7 @@ public ManaBlasterMixin(Properties properties) { } @Inject(method = "inventoryTick", at = @At("HEAD")) - public void botaniacombat_setDamageLensNBT(ItemStack stack, Level world, Entity entity, int slot, boolean selected, CallbackInfo ci){ + public void botaniacombat$setDamageLensNBT(ItemStack stack, Level world, Entity entity, int slot, boolean selected, CallbackInfo ci){ if(ManaBlasterItem.getLens(stack).is(BotaniaItems.lensDamage)){ if(!stack.getAttributeModifiers(EquipmentSlot.MAINHAND).containsKey(EntityAttributes_RangedWeapon.DAMAGE.attribute)){ stack.addAttributeModifier(EntityAttributes_RangedWeapon.DAMAGE.attribute, mod1, EquipmentSlot.MAINHAND); diff --git a/src/main/java/info/partonetrain/botaniacombat/mixin/BotaniaLeftClickPacketMixin.java b/src/main/java/info/partonetrain/botaniacombat/mixin/vanillacombat/BotaniaLeftClickPacketMixin.java similarity index 96% rename from src/main/java/info/partonetrain/botaniacombat/mixin/BotaniaLeftClickPacketMixin.java rename to src/main/java/info/partonetrain/botaniacombat/mixin/vanillacombat/BotaniaLeftClickPacketMixin.java index 3fa45dd..1ef9c19 100644 --- a/src/main/java/info/partonetrain/botaniacombat/mixin/BotaniaLeftClickPacketMixin.java +++ b/src/main/java/info/partonetrain/botaniacombat/mixin/vanillacombat/BotaniaLeftClickPacketMixin.java @@ -1,4 +1,4 @@ -package info.partonetrain.botaniacombat.mixin; +package info.partonetrain.botaniacombat.mixin.vanillacombat; import info.partonetrain.botaniacombat.item.GaiaGreatswordItem; import info.partonetrain.botaniacombat.item.TerrasteelWeaponItem; diff --git a/src/main/java/info/partonetrain/botaniacombat/network/TerrasteelWeaponHitPacket.java b/src/main/java/info/partonetrain/botaniacombat/network/TerrasteelWeaponHitPacket.java new file mode 100644 index 0000000..322837e --- /dev/null +++ b/src/main/java/info/partonetrain/botaniacombat/network/TerrasteelWeaponHitPacket.java @@ -0,0 +1,26 @@ +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 TerrasteelWeaponHitPacket implements FabricPacket { + private final boolean offhand; + public TerrasteelWeaponHitPacket(boolean offhand){ + this.offhand = offhand; + } + public TerrasteelWeaponHitPacket(FriendlyByteBuf buf){ + offhand = buf.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeBoolean(offhand); + } + + @Override + public PacketType getType() { + return BotaniaCombat.TERRASTEEL_WEAPON_PACKET_TYPE; + } +} diff --git a/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatNetworking.java b/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatNetworking.java index 408f8af..d61e30e 100644 --- a/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatNetworking.java +++ b/src/main/java/info/partonetrain/botaniacombat/registry/BotaniaCombatNetworking.java @@ -2,19 +2,31 @@ import info.partonetrain.botaniacombat.BotaniaCombat; import info.partonetrain.botaniacombat.IStarcaller; +import info.partonetrain.botaniacombat.ITerrasteelWeapon; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.world.InteractionHand; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; public class BotaniaCombatNetworking { - public static void init(){ + public static void initBetterCombat(){ + ServerPlayNetworking.registerGlobalReceiver(BotaniaCombat.TERRASTEEL_WEAPON_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(); + ITerrasteelWeapon terraWeapon = (ITerrasteelWeapon)item; + terraWeapon.botaniacombat$summonBeamBetterCombat(stack, player.level(), player, offhand ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND); + }); + }); + 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); + starcaller.botaniacombat$summonStarBetterCombat(stack, player.level(), player, offhand ? InteractionHand.OFF_HAND : InteractionHand.MAIN_HAND); }); }); } diff --git a/src/main/resources/assets/botaniacombat/models/item/handheld_big_spear.json b/src/main/resources/assets/botaniacombat/models/item/handheld_big_spear.json index 1898714..bd3bf88 100644 --- a/src/main/resources/assets/botaniacombat/models/item/handheld_big_spear.json +++ b/src/main/resources/assets/botaniacombat/models/item/handheld_big_spear.json @@ -3,113 +3,37 @@ "parent": "minecraft:item/generated", "display": { "thirdperson_righthand": { - "rotation": [ - 0, - -90, - 45 - ], - "translation": [ - 0, - 0, - 0 - ], - "scale": [ - 1.75, - 1.75, - 0.85 - ] + "rotation": [0, -90, 55], + "translation": [0, 7.5, 0.5], + "scale": [1.75, 1.75, 0.85] }, "thirdperson_lefthand": { - "rotation": [ - 0, - 90, - -45 - ], - "translation": [ - 0, - 0, - 0 - ], - "scale": [ - 1.75, - 1.75, - 0.85 - ] + "rotation": [0, 90, -55], + "translation": [0, 7.5, 0.5], + "scale": [1.75, 1.75, 0.75] }, "firstperson_righthand": { - "rotation": [ - 0, - 90, - 0 - ], - "translation": [ - 0, - 0, - 0 - ], - "scale": [ - 1.75, - 1.75, - 0.85 - ] + "rotation": [0, -90, 25], + "translation": [1.25, 1, 1], + "scale": [1.5, 1.5, 0.75] }, "firstperson_lefthand": { - "rotation": [ - 0, - -90, - 0 - ], - "translation": [ - 0, - 0, - 0 - ], - "scale": [ - 1.75, - 1.75, - 0.85 - ] + "rotation": [0, 90, 25], + "translation": [1.25, 1, 1], + "scale": [1.5, 1.5, 0.75] }, "ground": { - "translation": [ - 0, - 4, - 0 - ], - "scale": [ - 1, - 1, - 0.5 - ] + "translation": [0, 2, 0], + "scale": [1, 1, 0.5] }, "head": { - "translation": [ - 0, - 6, - 0 - ], - "scale": [ - 1.5, - 1.5, - 1.5 - ] + "translation": [0, 6, 0], + "scale": [1, 1, 0.5] }, "fixed": { - "rotation": [ - 0, - 180, - 0 - ], - "translation": [ - 0, - 0, - -1 - ], - "scale": [ - 2, - 2, - 1 - ] + "rotation": [0, 180, 0], + "translation": [0, 0, 0], + "scale": [2, 2, 1] } } } \ No newline at end of file diff --git a/src/main/resources/assets/botaniacombat/models/item/handheld_big_sword.json b/src/main/resources/assets/botaniacombat/models/item/handheld_big_sword.json index 77ea4d4..0377048 100644 --- a/src/main/resources/assets/botaniacombat/models/item/handheld_big_sword.json +++ b/src/main/resources/assets/botaniacombat/models/item/handheld_big_sword.json @@ -4,26 +4,26 @@ "display": { "thirdperson_righthand": { "rotation": [0, -90, 55], - "translation": [0, 12, -0.5], + "translation": [0, 13, -1], "scale": [1.75, 1.75, 0.75] }, "thirdperson_lefthand": { "rotation": [0, 90, -55], - "translation": [0, 12, -0.5], + "translation": [0, 13, -1], "scale": [1.75, 1.75, 0.75] }, "firstperson_lefthand": { "rotation": [0, 90, -25], - "translation": [1, 3, 1], + "translation": [2, 3, 1], "scale": [1.25, 1.25, 0.75] }, "firstperson_righthand": { "rotation": [0, -90, 25], - "translation": [1, 3, 1], + "translation": [2, 3, 1], "scale": [1.25, 1.25, 0.75] }, "ground": { - "translation": [0, 4, 0], + "translation": [0, 2, 0], "scale": [1, 1, 0.5] }, "fixed": { diff --git a/src/main/resources/botaniacombat.mixins.json b/src/main/resources/botaniacombat.mixins.json index a6e2691..9ceeb10 100644 --- a/src/main/resources/botaniacombat.mixins.json +++ b/src/main/resources/botaniacombat.mixins.json @@ -4,9 +4,9 @@ "plugin": "info.partonetrain.botaniacombat.BotaniaCombatMixinPlugin", "compatibilityLevel": "JAVA_17", "mixins": [ - "BotaniaLeftClickPacketMixin", "EnchantmentMixin", "PixieHandlerMixin", + "TerraBladeItemMixin", "bettercombat.ElementiumAxeItemMixin", "bettercombat.ElementiumSwordItemMixin", "bettercombat.StarcallerItemMixin", @@ -21,7 +21,8 @@ "ranged.AbstractArrowMixin", "ranged.LivingwoodBowItemMixin", "ranged.ManaBlasterMixin", - "shield.PlayerMixin" + "shield.PlayerMixin", + "vanillacombat.BotaniaLeftClickPacketMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/data/botania/advancements/challenge/botaniacombat_artifactsmod_skadi_bow.json b/src/main/resources/data/botania/advancements/challenge/botaniacombat_artifactsmod_skadi_bow.json new file mode 100644 index 0000000..41f40e0 --- /dev/null +++ b/src/main/resources/data/botania/advancements/challenge/botaniacombat_artifactsmod_skadi_bow.json @@ -0,0 +1,51 @@ +{ + "display": { + "icon": { + "item": "botaniacombat:skadi_bow" + }, + "title": { + "translate": "advancement.botaniacombat:skadi_bow" + }, + "description": { + "translate": "advancement.botaniacombat:skadi_bow.desc" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "parent": "botania:challenge/gaia_guardian_hardmode", + "criteria": { + "kill_guardian_with_snowshoes": { + "trigger": "minecraft:player_killed_entity", + "conditions": { + "player": [ + { + "condition": "minecraft:reference", + "name": "botaniacombat:snowshoes" + } + ], + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "botania:doppleganger", + "nbt": "{hardMode:1b}" + } + } + ] + } + } + }, + "requirements": [ + [ + "kill_guardian_with_snowshoes" + ] + ], + "rewards": { + "function": "botaniacombat:grant_skadi_bow", + "experience": 0 + }, + "sends_telemetry_event": true +} diff --git a/src/main/resources/data/botaniacombat/functions/grant_skadi_bow.mcfunction b/src/main/resources/data/botaniacombat/functions/grant_skadi_bow.mcfunction new file mode 100644 index 0000000..37e949f --- /dev/null +++ b/src/main/resources/data/botaniacombat/functions/grant_skadi_bow.mcfunction @@ -0,0 +1,2 @@ +advancement grant @p only botania:challenge/botaniacombat_skadi_bow +advancement revoke @p only botania:challenge/botaniacombat_artifactsmod_skadi_bow \ No newline at end of file diff --git a/src/main/resources/data/botaniacombat/predicates/snowshoes.json b/src/main/resources/data/botaniacombat/predicates/snowshoes.json new file mode 100644 index 0000000..9826355 --- /dev/null +++ b/src/main/resources/data/botaniacombat/predicates/snowshoes.json @@ -0,0 +1,19 @@ +{ + "fabric:load_conditions": [ + { + "condition": "fabric:all_mods_loaded", + "values": [ + "ranged_weapon_api", + "artifacts", + "cardinal-components" + ] + } + ], + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "type": "minecraft:player", + "nbt": "{cardinal_components:{\"trinkets:trinkets\": {feet: {shoes: {Items: [{id: \"artifacts:snowshoes\", Count: 1b}]}}}}}" + } + } + \ No newline at end of file