Skip to content

Commit 1c6f2a7

Browse files
committed
Mixin documentation
1 parent 61be371 commit 1c6f2a7

18 files changed

+281
-55
lines changed

common/src/main/java/com/lambda/mixin/MinecraftClientMixin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import net.minecraft.client.gui.screen.Screen;
2828
import net.minecraft.client.gui.screen.ingame.ScreenHandlerProvider;
2929
import net.minecraft.client.network.ClientPlayerInteractionManager;
30+
import net.minecraft.util.thread.ThreadExecutor;
3031
import org.jetbrains.annotations.Nullable;
3132
import org.spongepowered.asm.mixin.Mixin;
3233
import org.spongepowered.asm.mixin.Shadow;
@@ -67,7 +68,7 @@ private void onShutdown(CallbackInfo ci) {
6768
}
6869

6970
/**
70-
* Inject after the thread field is set so `ThreadExecutor#getThread` is available
71+
* Inject after the thread field is set so that {@link ThreadExecutor#getThread} is available
7172
*/
7273
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;thread:Ljava/lang/Thread;", shift = At.Shift.AFTER, ordinal = 0), method = "run")
7374
private void onStartup(CallbackInfo ci) {

common/src/main/java/com/lambda/mixin/entity/ClientPlayInteractionManagerMixin.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import net.minecraft.entity.Entity;
2626
import net.minecraft.entity.player.PlayerEntity;
2727
import net.minecraft.entity.player.PlayerInventory;
28+
import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket;
2829
import net.minecraft.screen.slot.SlotActionType;
2930
import net.minecraft.util.ActionResult;
3031
import net.minecraft.util.Hand;
@@ -86,6 +87,18 @@ public void clickSlotHead(int syncId, int slotId, int button, SlotActionType act
8687
if (EventFlow.post(click).isCanceled()) ci.cancel();
8788
}
8889

90+
/**
91+
* Posts {@link InventoryEvent.HotbarSlot.Update} and returns the event value as the selected slot
92+
* <pre>{@code
93+
* private void syncSelectedSlot() {
94+
* int i = this.client.player.getInventory().selectedSlot;
95+
* if (i != this.lastSelectedSlot) {
96+
* this.lastSelectedSlot = i;
97+
* this.networkHandler.sendPacket(new UpdateSelectedSlotC2SPacket(this.lastSelectedSlot));
98+
* }
99+
* }
100+
* }</pre>
101+
*/
89102
@Redirect(method = "syncSelectedSlot", at = @At(value = "FIELD", target = "Lnet/minecraft/entity/player/PlayerInventory;selectedSlot:I"))
90103
public int overrideSelectedSlotSync(PlayerInventory instance) {
91104
return EventFlow.post(new InventoryEvent.HotbarSlot.Update(instance.selectedSlot)).getSlot();

common/src/main/java/com/lambda/mixin/entity/ClientPlayerEntityMixin.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public abstract class ClientPlayerEntityMixin extends EntityMixin {
5151
@Shadow
5252
protected abstract void autoJump(float dx, float dz);
5353

54+
/**
55+
* Post movement events and applies the modified player velocity
56+
*/
5457
@Inject(method = "move", at = @At("HEAD"), cancellable = true)
5558
void onMove(MovementType movementType, Vec3d movement, CallbackInfo ci) {
5659
ClientPlayerEntity self = (ClientPlayerEntity) (Object) this;
@@ -78,6 +81,22 @@ void processMovement(Input input, boolean slowDown, float slowDownFactor) {
7881
EventFlow.post(new MovementEvent.InputUpdate(input, slowDown, slowDownFactor));
7982
}
8083

84+
/**
85+
* Posts the {@link MovementEvent.Sprint} event
86+
* <pre>{@code
87+
* if (this.isSprinting()) {
88+
* boolean bl8 = !this.input.hasForwardMovement() || !this.canSprint();
89+
* boolean bl9 = bl8 || this.horizontalCollision && !this.collidedSoftly || this.isTouchingWater() && !this.isSubmergedInWater();
90+
* if (this.isSwimming()) {
91+
* if (!this.isOnGround() && !this.input.sneaking && bl8 || !this.isTouchingWater()) {
92+
* this.setSprinting(false);
93+
* }
94+
* } else if (bl9) {
95+
* this.setSprinting(false);
96+
* }
97+
* }
98+
* }</pre>
99+
*/
81100
@Redirect(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isSprinting()Z"))
82101
boolean isSprinting(ClientPlayerEntity entity) {
83102
return EventFlow.post(new MovementEvent.Sprint(entity.isSprinting())).getSprint();
@@ -92,6 +111,9 @@ void redirectSneaking(CallbackInfoReturnable<Boolean> cir) {
92111
cir.setReturnValue(EventFlow.post(new MovementEvent.Sneak(self.input.sneaking)).getSneak());
93112
}
94113

114+
/**
115+
* Overwrites the movement packet update function to use our code
116+
*/
95117
@Inject(method = "sendMovementPackets", at = @At(value = "HEAD"), cancellable = true)
96118
void sendBegin(CallbackInfo ci) {
97119
ci.cancel();
@@ -126,8 +148,6 @@ void onSwingHandPre(Hand hand, CallbackInfo ci) {
126148

127149
@Inject(method = "damage", at = @At("HEAD"), cancellable = true)
128150
public void damage(DamageSource source, float amount, CallbackInfoReturnable<Boolean> cir) {
129-
if (EventFlow.post(new PlayerEvent.Damage(source, amount)).isCanceled()) {
130-
cir.setReturnValue(false);
131-
}
151+
if (EventFlow.post(new PlayerEvent.Damage(source, amount)).isCanceled()) cir.setReturnValue(false);
132152
}
133153
}

common/src/main/java/com/lambda/mixin/entity/EntityMixin.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ public void move(MovementType movementType, Vec3d movement) {
4545
@Shadow
4646
public abstract float getYaw();
4747

48+
/**
49+
* Modifies the player yaw when there is an active rotation to apply the player velocity correctly
50+
*/
4851
@Redirect(method = "updateVelocity", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getYaw()F"))
4952
public float velocityYaw(Entity entity) {
5053
if ((Object) this != Lambda.getMc().player) return getYaw();
@@ -55,6 +58,14 @@ public float velocityYaw(Entity entity) {
5558
return y;
5659
}
5760

61+
/**
62+
* Modifies the player yaw for the given tick delta for interpolation when there is an active rotation
63+
* <pre>{@code
64+
* public final Vec3d getRotationVec(float tickDelta) {
65+
* return this.getRotationVector(this.getPitch(tickDelta), this.getYaw(tickDelta));
66+
* }
67+
* }</pre>
68+
*/
5869
@Redirect(method = "getRotationVec", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getYaw(F)F"))
5970
float fixDirectionYaw(Entity entity, float tickDelta) {
6071
Vec2d rot = RotationManager.getRotationForVector(tickDelta);
@@ -63,6 +74,14 @@ float fixDirectionYaw(Entity entity, float tickDelta) {
6374
return (float) rot.getX();
6475
}
6576

77+
/**
78+
* Modifies the player pitch for the given tick delta for interpolation when there is an active rotation
79+
* <pre>{@code
80+
* public final Vec3d getRotationVec(float tickDelta) {
81+
* return this.getRotationVector(this.getPitch(tickDelta), this.getYaw(tickDelta));
82+
* }
83+
* }</pre>
84+
*/
6685
@Redirect(method = "getRotationVec", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getPitch(F)F"))
6786
float fixDirectionPitch(Entity entity, float tickDelta) {
6887
Vec2d rot = RotationManager.getRotationForVector(tickDelta);
@@ -71,6 +90,14 @@ float fixDirectionPitch(Entity entity, float tickDelta) {
7190
return (float) rot.getY();
7291
}
7392

93+
/**
94+
* Modifies the player yaw for the current rotation yaw
95+
* <pre>{@code
96+
* public Vec3d getRotationVector() {
97+
* return this.getRotationVector(this.getPitch(), this.getYaw());
98+
* }
99+
* }</pre>
100+
*/
74101
@Redirect(method = "getRotationVector()Lnet/minecraft/util/math/Vec3d;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getYaw()F"))
75102
float fixDirectionYaw2(Entity entity) {
76103
Vec2d rot = RotationManager.getRotationForVector(1.0);
@@ -79,6 +106,14 @@ float fixDirectionYaw2(Entity entity) {
79106
return (float) rot.getX();
80107
}
81108

109+
/**
110+
* Modifies the player yaw for the current rotation pitch
111+
* <pre>{@code
112+
* public Vec3d getRotationVector() {
113+
* return this.getRotationVector(this.getPitch(), this.getYaw());
114+
* }
115+
* }</pre>
116+
*/
82117
@Redirect(method = "getRotationVector()Lnet/minecraft/util/math/Vec3d;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getPitch()F"))
83118
float fixDirectionPitch2(Entity entity) {
84119
Vec2d rot = RotationManager.getRotationForVector(1.0);
@@ -95,7 +130,6 @@ private void changeLookDirection(double cursorDeltaX, double cursorDeltaY, Callb
95130
@Inject(method = "onTrackedDataSet(Lnet/minecraft/entity/data/TrackedData;)V", at = @At("TAIL"))
96131
public void onTrackedDataSet(TrackedData<?> data, CallbackInfo ci) {
97132
Entity entity = (Entity) (Object) this;
98-
99133
EventFlow.post(new EntityEvent.EntityUpdate(entity, data));
100134
}
101135

common/src/main/java/com/lambda/mixin/entity/FireworkRocketEntityMixin.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,10 @@
2727

2828
@Mixin(FireworkRocketEntity.class)
2929
public class FireworkRocketEntityMixin {
30-
@Redirect(
31-
method = "tick",
32-
at = @At(
33-
value = "INVOKE",
34-
target = "Lnet/minecraft/entity/LivingEntity;setVelocity(Lnet/minecraft/util/math/Vec3d;)V"
35-
)
36-
)
30+
@Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;setVelocity(Lnet/minecraft/util/math/Vec3d;)V"))
3731
private void redirectSetVelocity(LivingEntity shooter, Vec3d vec3d) {
3832
if (ElytraFly.getDoBoost()) {
39-
ElytraFly.boostRocket(shooter);
33+
ElytraFly.boostRocket();
4034
} else shooter.setVelocity(vec3d);
4135
}
4236
}

common/src/main/java/com/lambda/mixin/entity/LivingEntityMixin.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,21 @@ public abstract class LivingEntityMixin extends EntityMixin {
3838
@Shadow
3939
protected abstract float getJumpVelocity();
4040

41+
/**
42+
* Overwrites the jump function to use our rotation and movements
43+
* <pre>{@code
44+
* protected void jump() {
45+
* Vec3d vec3d = this.getVelocity();
46+
* this.setVelocity(vec3d.x, (double)this.getJumpVelocity(), vec3d.z);
47+
* if (this.isSprinting()) {
48+
* float f = this.getYaw() * (float) (Math.PI / 180.0);
49+
* this.setVelocity(this.getVelocity().add((double)(-MathHelper.sin(f) * 0.2F), 0.0, (double)(MathHelper.cos(f) * 0.2F)));
50+
* }
51+
*
52+
* this.velocityDirty = true;
53+
* }
54+
* }</pre>
55+
*/
4156
@Inject(method = "jump", at = @At("HEAD"), cancellable = true)
4257
void onJump(CallbackInfo ci) {
4358
LivingEntity self = (LivingEntity) (Object) this;
@@ -74,6 +89,9 @@ void onTravelPost(Vec3d movementInput, CallbackInfo ci) {
7489
EventFlow.post(new MovementEvent.Entity.Post((LivingEntity) (Object) this, movementInput));
7590
}
7691

92+
/**
93+
* Modifies the entity pitch with the current rotation when the entity is fall flying
94+
*/
7795
@Redirect(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getPitch()F"))
7896
private float hookModifyFallFlyingPitch(LivingEntity entity) {
7997
Float pitch = RotationManager.getMovementPitch();
@@ -82,6 +100,27 @@ private float hookModifyFallFlyingPitch(LivingEntity entity) {
82100
return pitch;
83101
}
84102

103+
/**
104+
* Modifies the entity yaw with the active rotation yaw when the entity swing its hand
105+
* <pre>{@code
106+
* protected float turnHead(float bodyRotation, float headRotation) {
107+
* float f = MathHelper.wrapDegrees(bodyRotation - this.bodyYaw);
108+
* this.bodyYaw += f * 0.3F;
109+
* float g = MathHelper.wrapDegrees(this.getYaw() - this.bodyYaw);
110+
* float h = this.getMaxRelativeHeadRotation();
111+
* if (Math.abs(g) > h) {
112+
* this.bodyYaw = this.bodyYaw + (g - (float)MathHelper.sign((double)g) * h);
113+
* }
114+
*
115+
* boolean bl = g < -90.0F || g >= 90.0F;
116+
* if (bl) {
117+
* headRotation *= -1.0F;
118+
* }
119+
*
120+
* return headRotation;
121+
* }
122+
* }</pre>
123+
*/
85124
@Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getYaw()F"), slice = @Slice(to = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getYaw()F", ordinal = 1)))
86125
private float rotBody(LivingEntity entity) {
87126
if ((Object) this != Lambda.getMc().player) {
@@ -92,6 +131,27 @@ private float rotBody(LivingEntity entity) {
92131
return (yaw == null) ? entity.getYaw() : yaw;
93132
}
94133

134+
/**
135+
* Modifies the entity yaw with the active rotation yaw
136+
* <pre>{@code
137+
* protected float turnHead(float bodyRotation, float headRotation) {
138+
* float f = MathHelper.wrapDegrees(bodyRotation - this.bodyYaw);
139+
* this.bodyYaw += f * 0.3F;
140+
* float g = MathHelper.wrapDegrees(this.getYaw() - this.bodyYaw);
141+
* float h = this.getMaxRelativeHeadRotation();
142+
* if (Math.abs(g) > h) {
143+
* this.bodyYaw = this.bodyYaw + (g - (float)MathHelper.sign((double)g) * h);
144+
* }
145+
*
146+
* boolean bl = g < -90.0F || g >= 90.0F;
147+
* if (bl) {
148+
* headRotation *= -1.0F;
149+
* }
150+
*
151+
* return headRotation;
152+
* }
153+
* }</pre>
154+
*/
95155
@Redirect(method = "turnHead", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getYaw()F"))
96156
private float rotHead(LivingEntity entity) {
97157
if ((Object) this != Lambda.getMc().player) {

common/src/main/java/com/lambda/mixin/entity/PlayerEntityMixin.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.lambda.mixin.entity;
1919

20+
import com.lambda.Lambda;
2021
import com.lambda.event.EventFlow;
2122
import com.lambda.event.events.MovementEvent;
2223
import com.lambda.interaction.request.rotation.RotationManager;
@@ -38,7 +39,7 @@ private void injectSafeWalk(CallbackInfoReturnable<Boolean> cir) {
3839

3940
@Redirect(method = "tickNewAi", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getYaw()F"))
4041
private float injectHeadYaw(PlayerEntity instance) {
41-
if ((Object) this != MinecraftClient.getInstance().player) {
42+
if ((Object) this != Lambda.getMc().player) {
4243
return instance.getYaw();
4344
}
4445

@@ -48,7 +49,7 @@ private float injectHeadYaw(PlayerEntity instance) {
4849

4950
@Redirect(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getYaw()F"))
5051
private float injectAttackFix(PlayerEntity instance) {
51-
if ((Object) this != MinecraftClient.getInstance().player) {
52+
if ((Object) this != Lambda.getMc().player) {
5253
return instance.getYaw();
5354
}
5455

common/src/main/java/com/lambda/mixin/items/BarrierBlockMixin.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929

3030
@Mixin(BarrierBlock.class)
3131
public class BarrierBlockMixin {
32-
32+
/**
33+
* Modifies barrier block render type to {@link BlockRenderType#MODEL} when {@link BlockESP} is enabled and {@link BlockESP#getBarrier()} is true
34+
*/
3335
@Inject(method = "getRenderType", at = @At("RETURN"), cancellable = true)
3436
private void getRenderType(BlockState state, CallbackInfoReturnable<BlockRenderType> cir) {
3537
if (BlockESP.INSTANCE.isEnabled()

common/src/main/java/com/lambda/mixin/network/ClientPlayNetworkHandlerMixin.java

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@
2424
import com.lambda.event.events.WorldEvent;
2525
import net.minecraft.client.network.ClientPlayNetworkHandler;
2626
import net.minecraft.client.network.PlayerListEntry;
27+
import net.minecraft.client.network.ServerInfo;
28+
import net.minecraft.client.option.ServerList;
29+
import net.minecraft.client.toast.SystemToast;
30+
import net.minecraft.network.NetworkThreadUtils;
2731
import net.minecraft.network.packet.s2c.play.*;
32+
import net.minecraft.world.explosion.Explosion;
2833
import org.spongepowered.asm.mixin.Mixin;
2934
import org.spongepowered.asm.mixin.injection.At;
3035
import org.spongepowered.asm.mixin.injection.Inject;
@@ -40,15 +45,14 @@ void injectJoinPacket(GameJoinS2CPacket packet, CallbackInfo ci) {
4045

4146
@Inject(method = "handlePlayerListAction(Lnet/minecraft/network/packet/s2c/play/PlayerListS2CPacket$Action;Lnet/minecraft/network/packet/s2c/play/PlayerListS2CPacket$Entry;Lnet/minecraft/client/network/PlayerListEntry;)V", at = @At("TAIL"))
4247
void injectPlayerList(PlayerListS2CPacket.Action action, PlayerListS2CPacket.Entry receivedEntry, PlayerListEntry currentEntry, CallbackInfo ci) {
43-
if (action != PlayerListS2CPacket.Action.ADD_PLAYER) return;
48+
if (action != PlayerListS2CPacket.Action.UPDATE_LISTED) return;
4449

4550
var name = currentEntry.getProfile().getName();
4651
var uuid = currentEntry.getProfile().getId();
4752

48-
if (receivedEntry.listed())
53+
if (receivedEntry.listed()) {
4954
EventFlow.post(new WorldEvent.Player.Join(name, uuid, currentEntry));
50-
else
51-
EventFlow.post(new WorldEvent.Player.Leave(name, uuid, currentEntry));
55+
} else EventFlow.post(new WorldEvent.Player.Leave(name, uuid, currentEntry));
5256
}
5357

5458
@Inject(method = "onUpdateSelectedSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/NetworkThreadUtils;forceMainThread(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/listener/PacketListener;Lnet/minecraft/util/thread/ThreadExecutor;)V", shift = At.Shift.AFTER), cancellable = true)
@@ -61,17 +65,40 @@ private void onScreenHandlerSlotUpdate(ScreenHandlerSlotUpdateS2CPacket packet,
6165
EventFlow.post(new InventoryEvent.SlotUpdate(packet.getSyncId(), packet.getRevision(), packet.getSlot(), packet.getStack()));
6266
}
6367

68+
/**
69+
* Sets displayedUnsecureChatWarning to {@link NoRender#getNoChatVerificationToast()}
70+
* <pre>{@code
71+
* public void onServerMetadata(ServerMetadataS2CPacket packet) {
72+
* NetworkThreadUtils.forceMainThread(packet, this, this.client);
73+
* if (this.serverInfo != null) {
74+
* this.serverInfo.label = packet.getDescription();
75+
* packet.getFavicon().map(ServerInfo::validateFavicon).ifPresent(this.serverInfo::setFavicon);
76+
* this.serverInfo.setSecureChatEnforced(packet.isSecureChatEnforced());
77+
* ServerList.updateServerListEntry(this.serverInfo);
78+
* if (!this.displayedUnsecureChatWarning && !this.isSecureChatEnforced()) {
79+
* SystemToast systemToast = SystemToast.create(this.client, SystemToast.Type.UNSECURE_SERVER_WARNING, UNSECURE_SERVER_TOAST_TITLE, UNSECURE_SERVER_TOAST_TEXT);
80+
* this.client.getToastManager().add(systemToast);
81+
* this.displayedUnsecureChatWarning = true;
82+
* }
83+
* }
84+
* }
85+
* }</pre>
86+
*/
6487
@Redirect(method = "onServerMetadata", at = @At(value = "FIELD", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;displayedUnsecureChatWarning:Z", ordinal = 0))
6588
public boolean onServerMetadata(ClientPlayNetworkHandler clientPlayNetworkHandler) {
6689
return NoRender.getNoChatVerificationToast();
6790
}
6891

69-
// Cancel player velocity if Velocity module is enabled
70-
// Reference net.minecraft.client.network.ClientPlayNetworkHandler.onExplosion
71-
//
72-
// Explosion explosion = new Explosion(this.client.world, (Entity)null, packet.getX(), packet.getY(), packet.getZ(), packet.getRadius(), packet.getAffectedBlocks(), packet.getDestructionType(), packet.getParticle(), packet.getEmitterParticle(), packet.getSoundEvent());
73-
// explosion.affectWorld(true);
74-
// this.client.player.setVelocity(this.client.player.getVelocity().add((double)packet.getPlayerVelocityX(), (double)packet.getPlayerVelocityY(), (double)packet.getPlayerVelocityZ()));
92+
/**
93+
* Cancels the player velocity if {@link Velocity#getExplosion()} is true
94+
* <pre>{@code
95+
* public void onExplosion(ExplosionS2CPacket packet) {
96+
* Explosion explosion = new Explosion(this.client.world, (Entity) null, packet.getX(), packet.getY(), packet.getZ(), packet.getRadius(), packet.getAffectedBlocks(), packet.getDestructionType(), packet.getParticle(), packet.getEmitterParticle(), packet.getSoundEvent());
97+
* explosion.affectWorld(true);
98+
* this.client.player.setVelocity(this.client.player.getVelocity().add((double) packet.getPlayerVelocityX(), (double) packet.getPlayerVelocityY(), (double) packet.getPlayerVelocityZ()));
99+
* }
100+
* }</pre>
101+
*/
75102
@Inject(method = "onExplosion(Lnet/minecraft/network/packet/s2c/play/ExplosionS2CPacket;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;setVelocity(Lnet/minecraft/util/math/Vec3d;)V"), cancellable = true)
76103
void injectVelocity(ExplosionS2CPacket packet, CallbackInfo ci) {
77104
if (Velocity.getExplosion()) ci.cancel();

0 commit comments

Comments
 (0)