Skip to content

Commit 02937d0

Browse files
committed
Fix RangedWeaponItemMixin and update to 1.21.8
1 parent 3ba6c18 commit 02937d0

File tree

2 files changed

+26
-41
lines changed

2 files changed

+26
-41
lines changed

gradle.properties

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# Done to increase the memory available to gradle.
22
org.gradle.jvmargs=-Xmx1G
33

4-
minecraft_version=1.21.6
5-
yarn_mappings=1.21.6+build.1
4+
minecraft_version=1.21.8
5+
yarn_mappings=1.21.8+build.1
66
loader_version=0.16.14
77

88
#Fabric api
9-
fabric_version=0.127.0+1.21.6
9+
fabric_version=0.131.0+1.21.8
1010

1111
# Mod Properties
12-
mod_version=0.5.1
12+
mod_version=0.5.2
1313
maven_group=xyz.nucleoid
1414
archives_base_name=stimuli
Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package xyz.nucleoid.stimuli.mixin.projectile;
22

3+
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
5+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
36
import com.llamalad7.mixinextras.sugar.Local;
7+
import com.llamalad7.mixinextras.sugar.Share;
8+
import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef;
9+
import net.minecraft.entity.EquipmentSlot;
410
import net.minecraft.entity.LivingEntity;
511
import net.minecraft.entity.projectile.PersistentProjectileEntity;
612
import net.minecraft.entity.projectile.ProjectileEntity;
@@ -10,77 +16,56 @@
1016
import net.minecraft.item.RangedWeaponItem;
1117
import net.minecraft.server.network.ServerPlayerEntity;
1218
import net.minecraft.server.world.ServerWorld;
13-
import net.minecraft.util.Hand;
1419
import net.minecraft.world.World;
15-
import org.jetbrains.annotations.Nullable;
1620
import org.spongepowered.asm.mixin.Mixin;
1721
import org.spongepowered.asm.mixin.Shadow;
18-
import org.spongepowered.asm.mixin.Unique;
1922
import org.spongepowered.asm.mixin.injection.At;
20-
import org.spongepowered.asm.mixin.injection.Inject;
21-
import org.spongepowered.asm.mixin.injection.ModifyArg;
22-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
2323
import xyz.nucleoid.stimuli.Stimuli;
2424
import xyz.nucleoid.stimuli.duck.PassBowUseTicks;
2525
import xyz.nucleoid.stimuli.event.EventResult;
2626
import xyz.nucleoid.stimuli.event.projectile.ArrowFireEvent;
2727

28-
import java.util.List;
28+
import java.util.function.Consumer;
2929

3030
@Mixin(RangedWeaponItem.class)
3131
public abstract class RangedWeaponItemMixin implements PassBowUseTicks {
32-
@Unique private ThreadLocal<ProjectileEntity> projectile = new ThreadLocal<>();
3332

3433
@Shadow
3534
protected abstract ProjectileEntity createArrowEntity(World world, LivingEntity shooter, ItemStack weaponStack, ItemStack projectileStack, boolean critical);
3635

37-
@Inject(
36+
@WrapOperation(
3837
method = "shootAll",
39-
at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/ProjectileEntity;spawn(Lnet/minecraft/entity/projectile/ProjectileEntity;Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/item/ItemStack;Ljava/util/function/Consumer;)Lnet/minecraft/entity/projectile/ProjectileEntity;"),
40-
cancellable = true
38+
at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/ProjectileEntity;spawn(Lnet/minecraft/entity/projectile/ProjectileEntity;Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/item/ItemStack;Ljava/util/function/Consumer;)Lnet/minecraft/entity/projectile/ProjectileEntity;")
4139
)
42-
private void onFireArrow(
43-
ServerWorld world,
44-
LivingEntity shooter,
45-
Hand hand,
46-
ItemStack tool,
47-
List<ItemStack> projectiles,
48-
float speed,
49-
float divergence,
50-
boolean critical,
51-
@Nullable LivingEntity target,
52-
CallbackInfo ci,
53-
@Local(ordinal = 1) ItemStack projectileStack
40+
private ProjectileEntity onFireArrow(
41+
ProjectileEntity projectile, ServerWorld world, ItemStack projectileStack, Consumer<ProjectileEntity> beforeSpawn, Operation<ProjectileEntity> original,
42+
@Local(argsOnly = true, ordinal = 0) LivingEntity shooter, @Local(argsOnly = true) ItemStack tool, @Share("damage") LocalBooleanRef damage
5443
) {
5544
if (!(shooter instanceof ServerPlayerEntity player)) {
56-
return;
45+
return null;
5746
}
5847

59-
ProjectileEntity projectile = this.createArrowEntity(world, shooter, tool, projectileStack, critical);
60-
this.projectile.set(projectile);
61-
6248
Item projectileItem = projectileStack.getItem();
6349
if (!(projectileItem instanceof ArrowItem item) || !(projectile instanceof PersistentProjectileEntity persistentProjectile)) {
64-
return;
50+
damage.set(true);
51+
return original.call(projectile, world, projectileStack, beforeSpawn);
6552
}
6653

6754
try (var invokers = Stimuli.select().forEntity(player)) {
6855
var result = invokers.get(ArrowFireEvent.EVENT)
6956
.onFireArrow(player, tool, item, this.stimuli$getLastRemainingUseTicks(), persistentProjectile);
7057

7158
if (result == EventResult.DENY) {
72-
ci.cancel();
59+
damage.set(false);
60+
return projectile;
7361
}
7462
}
63+
damage.set(true);
64+
return original.call(projectile, world, projectileStack, beforeSpawn);
7565
}
7666

77-
@ModifyArg(
78-
method = "shootAll",
79-
at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/projectile/ProjectileEntity;spawn(Lnet/minecraft/entity/projectile/ProjectileEntity;Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/item/ItemStack;Ljava/util/function/Consumer;)Lnet/minecraft/entity/projectile/ProjectileEntity;")
80-
)
81-
private ProjectileEntity useStoredProjectile(ProjectileEntity original) {
82-
ProjectileEntity stored = this.projectile.get();
83-
this.projectile.set(null);
84-
return stored != null ? stored : original;
67+
@WrapWithCondition(method = "shootAll", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;damage(ILnet/minecraft/entity/LivingEntity;Lnet/minecraft/entity/EquipmentSlot;)V"))
68+
private boolean cancelDamageIfNoProjectile(ItemStack instance, int amount, LivingEntity entity, EquipmentSlot slot, @Share("damage") LocalBooleanRef damage) {
69+
return damage.get();
8570
}
8671
}

0 commit comments

Comments
 (0)