Skip to content

Commit 5f50769

Browse files
committed
feat: add GhostLiquidFixModule
1 parent 3ea6c55 commit 5f50769

File tree

5 files changed

+106
-0
lines changed

5 files changed

+106
-0
lines changed

src/main/java/org/afterlike/openutils/module/handler/ModuleHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public void initialize() {
2727
this.register(new SprintModule());
2828
// player
2929
this.register(new ActionSoundsModule());
30+
this.register(new GhostLiquidFixModule());
3031
this.register(new NoBreakDelayModule());
3132
this.register(new NoHitDelayModule());
3233
// render
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.afterlike.openutils.module.impl.player;
2+
3+
import org.afterlike.openutils.module.api.Module;
4+
import org.afterlike.openutils.module.api.ModuleCategory;
5+
6+
public class GhostLiquidFixModule extends Module {
7+
public GhostLiquidFixModule() {
8+
super("Ghost Liquid Fix", ModuleCategory.PLAYER);
9+
}
10+
}

src/main/java/org/afterlike/openutils/platform/mixin/minecraft/client/multiplayer/PlayerControllerMPMixin.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
11
package org.afterlike.openutils.platform.mixin.minecraft.client.multiplayer;
22

3+
import net.minecraft.client.entity.EntityPlayerSP;
34
import net.minecraft.client.multiplayer.PlayerControllerMP;
5+
import net.minecraft.client.multiplayer.WorldClient;
46
import net.minecraft.entity.Entity;
57
import net.minecraft.entity.player.EntityPlayer;
8+
import net.minecraft.init.Blocks;
9+
import net.minecraft.init.Items;
10+
import net.minecraft.item.ItemStack;
11+
import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement;
12+
import net.minecraft.util.BlockPos;
13+
import net.minecraft.util.EnumFacing;
14+
import net.minecraft.util.Vec3;
615
import org.afterlike.openutils.OpenUtils;
716
import org.afterlike.openutils.event.impl.AttackEntityEvent;
17+
import org.afterlike.openutils.module.impl.player.GhostLiquidFixModule;
818
import org.spongepowered.asm.mixin.Mixin;
919
import org.spongepowered.asm.mixin.injection.At;
1020
import org.spongepowered.asm.mixin.injection.Inject;
1121
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
22+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1223

1324
@Mixin(PlayerControllerMP.class)
1425
public class PlayerControllerMPMixin {
@@ -18,4 +29,31 @@ public class PlayerControllerMPMixin {
1829
final CallbackInfo ci) {
1930
OpenUtils.get().getEventBus().post(new AttackEntityEvent(playerIn, targetEntity));
2031
}
32+
33+
@Inject(method = "onPlayerRightClick", at = @At("HEAD"))
34+
private void ou$onPlayerRightClick(EntityPlayerSP player, WorldClient worldIn,
35+
ItemStack heldStack, BlockPos hitPos, EnumFacing side, Vec3 hitVec,
36+
CallbackInfoReturnable<Boolean> cir) {
37+
if (!OpenUtils.get().getModuleHandler().isEnabled(GhostLiquidFixModule.class)) {
38+
return;
39+
}
40+
if (heldStack != null) {
41+
float hitX = (float) (hitVec.xCoord - hitPos.getX());
42+
float hitY = (float) (hitVec.yCoord - hitPos.getY());
43+
float hitZ = (float) (hitVec.zCoord - hitPos.getZ());
44+
C08PacketPlayerBlockPlacement packet = new C08PacketPlayerBlockPlacement(hitPos,
45+
side.getIndex(), player.inventory.getCurrentItem(), hitX, hitY, hitZ);
46+
if (heldStack.getItem() == Items.lava_bucket) {
47+
BlockPos targetPos = new BlockPos(packet.getPosition().getX(),
48+
packet.getPosition().getY(), packet.getPosition().getZ())
49+
.offset(EnumFacing.getFront(packet.getPlacedBlockDirection()));
50+
worldIn.setBlockState(targetPos, Blocks.flowing_lava.getDefaultState());
51+
} else if (heldStack.getItem() == Items.water_bucket) {
52+
BlockPos targetPos = new BlockPos(packet.getPosition().getX(),
53+
packet.getPosition().getY(), packet.getPosition().getZ())
54+
.offset(EnumFacing.getFront(packet.getPlacedBlockDirection()));
55+
worldIn.setBlockState(targetPos, Blocks.flowing_water.getDefaultState());
56+
}
57+
}
58+
}
2159
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.afterlike.openutils.platform.mixin.minecraft.item;
2+
3+
import net.minecraft.block.Block;
4+
import net.minecraft.block.material.Material;
5+
import net.minecraft.init.Blocks;
6+
import net.minecraft.item.Item;
7+
import net.minecraft.item.ItemBucket;
8+
import net.minecraft.util.BlockPos;
9+
import net.minecraft.util.EnumParticleTypes;
10+
import net.minecraft.world.World;
11+
import org.afterlike.openutils.OpenUtils;
12+
import org.afterlike.openutils.module.impl.player.GhostLiquidFixModule;
13+
import org.spongepowered.asm.mixin.Mixin;
14+
import org.spongepowered.asm.mixin.Shadow;
15+
import org.spongepowered.asm.mixin.injection.At;
16+
import org.spongepowered.asm.mixin.injection.Redirect;
17+
18+
@Mixin(ItemBucket.class)
19+
public class ItemBucketMixin extends Item {
20+
@Shadow
21+
private Block isFull;
22+
@Redirect(method = "onItemRightClick", at = @At(value = "INVOKE",
23+
target = "Lnet/minecraft/item/ItemBucket;tryPlaceContainedLiquid(Lnet/minecraft/world/World;Lnet/minecraft/util/BlockPos;)Z"))
24+
private boolean ou$onItemRightClick(ItemBucket instance, World worldIn, BlockPos pos) {
25+
if (!OpenUtils.get().getModuleHandler().isEnabled(GhostLiquidFixModule.class)) {
26+
return instance.tryPlaceContainedLiquid(worldIn, pos);
27+
}
28+
if (this.isFull == Blocks.air) {
29+
return false;
30+
}
31+
Material material = worldIn.getBlockState(pos).getBlock().getMaterial();
32+
boolean isSolid = !material.isSolid();
33+
if (!worldIn.isAirBlock(pos) && !isSolid) {
34+
return false;
35+
}
36+
if (worldIn.provider.doesWaterVaporize() && this.isFull == Blocks.flowing_water) {
37+
int x = pos.getX();
38+
int y = pos.getY();
39+
int z = pos.getZ();
40+
worldIn.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, "random.fizz", 0.5f,
41+
2.6f + (worldIn.rand.nextFloat() - worldIn.rand.nextFloat()) * 0.8f);
42+
for (int l = 0; l < 8; ++l) {
43+
worldIn.spawnParticle(EnumParticleTypes.SMOKE_LARGE, x + Math.random(),
44+
y + Math.random(), z + Math.random(), 0.0, 0.0, 0.0);
45+
}
46+
} else {
47+
if (!worldIn.isRemote && isSolid && !material.isLiquid()) {
48+
worldIn.destroyBlock(pos, true);
49+
}
50+
if (!worldIn.isRemote) {
51+
worldIn.setBlockState(pos, this.isFull.getDefaultState(), 3);
52+
}
53+
}
54+
return true;
55+
}
56+
}

src/main/resources/mixins.openutils.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"minecraft.client.entity.AbstractClientPlayerMixin",
88
"minecraft.entity.EntityLivingBaseAccessor",
99
"minecraft.entity.EntityLivingBaseMixin",
10+
"minecraft.item.ItemBucketMixin",
1011
"minecraft.network.NetworkManagerMixin",
1112
"minecraft.world.storage.WorldInfoMixin",
1213
"minecraftforge.fml.common.network.handshake.ModListMixin"

0 commit comments

Comments
 (0)