Skip to content

Commit 9815784

Browse files
committed
Add a NetUtils and fix tool break protection once and for all
1 parent 18e8724 commit 9815784

File tree

6 files changed

+56
-18
lines changed

6 files changed

+56
-18
lines changed

src/main/java/net/earthcomputer/clientcommands/CoreModSanityCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void accept(PlayerTickEvent t) {
2727
}
2828

2929
@Override
30-
public boolean isOneTime() {
30+
public boolean wasFinalAction() {
3131
return true;
3232
}
3333

src/main/java/net/earthcomputer/clientcommands/EventManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ public void onPostDamageItem(ToolDamagedEvent.Post e) {
495495
public static interface Listener<E extends Event> {
496496
void accept(E e);
497497

498-
default boolean isOneTime() {
498+
default boolean wasFinalAction() {
499499
return false;
500500
}
501501
}
@@ -506,7 +506,7 @@ private static class Listeners<E extends Event> {
506506
public void invoke(E e) {
507507
for (Listener<E> listener : new ArrayList<>(listeners)) {
508508
listener.accept(e);
509-
if (listener.isOneTime()) {
509+
if (listener.wasFinalAction()) {
510510
listeners.remove(listener);
511511
}
512512
}

src/main/java/net/earthcomputer/clientcommands/SpecialActionKey.java

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

33
import org.lwjgl.input.Keyboard;
44

5+
import net.earthcomputer.clientcommands.network.NetUtils;
56
import net.minecraft.client.Minecraft;
67
import net.minecraft.client.entity.EntityPlayerSP;
78
import net.minecraft.client.settings.KeyBinding;
@@ -44,8 +45,8 @@ public static void registerEvents() {
4445
if (packet instanceof CPacketPlayerTryUseItemOnBlock) {
4546
if (isSpecialActionKeyPressed()) {
4647
EntityPlayerSP player = Minecraft.getMinecraft().player;
47-
Minecraft.getMinecraft().getConnection().sendPacket(new CPacketPlayer.Rotation(
48-
MathHelper.wrapDegrees(player.rotationYaw + 180), -player.rotationPitch, player.onGround));
48+
NetUtils.sendPacket(new CPacketPlayer.Rotation(MathHelper.wrapDegrees(player.rotationYaw + 180),
49+
-player.rotationPitch, player.onGround));
4950
}
5051
}
5152
});
@@ -54,7 +55,7 @@ public static void registerEvents() {
5455
if (packet instanceof CPacketPlayerTryUseItemOnBlock) {
5556
if (isSpecialActionKeyPressed()) {
5657
EntityPlayerSP player = Minecraft.getMinecraft().player;
57-
Minecraft.getMinecraft().getConnection().sendPacket(
58+
NetUtils.sendPacket(
5859
new CPacketPlayer.Rotation(player.rotationYaw, player.rotationPitch, player.onGround));
5960
}
6061
}

src/main/java/net/earthcomputer/clientcommands/TempRulesImpl.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.List;
55
import java.util.concurrent.atomic.AtomicInteger;
66

7+
import net.earthcomputer.clientcommands.network.NetUtils;
78
import net.minecraft.block.material.Material;
89
import net.minecraft.block.state.IBlockState;
910
import net.minecraft.client.Minecraft;
@@ -12,7 +13,6 @@
1213
import net.minecraft.enchantment.EnchantmentHelper;
1314
import net.minecraft.entity.player.EntityPlayer;
1415
import net.minecraft.init.Enchantments;
15-
import net.minecraft.inventory.ClickType;
1616
import net.minecraft.network.play.client.CPacketPlayerDigging;
1717
import net.minecraft.util.EnumFacing;
1818
import net.minecraft.util.math.BlockPos;
@@ -41,13 +41,7 @@ private static void initToolBreakProtection() {
4141
EventManager.addPlayerTickListener(e -> {
4242
int hotbarSlot = hotbarSlotToUpdate.getAndSet(-1);
4343
if (hotbarSlot != -1) {
44-
if (e.player.openContainer == e.player.inventoryContainer) {
45-
// Pickup the item and put it back again to refresh durability
46-
for (int i = 0; i < 2; i++) {
47-
Minecraft.getMinecraft().playerController.windowClick(e.player.openContainer.windowId,
48-
hotbarSlot, 0, ClickType.PICKUP, e.player);
49-
}
50-
}
44+
NetUtils.resyncInventory(slot -> slot.inventory == Minecraft.getMinecraft().player.inventory);
5145
}
5246
});
5347
EventManager.addPreDamageItemListener(e -> {
@@ -89,8 +83,8 @@ private static void initGhostBlockFix() {
8983
if (!blocksToUpdate.isEmpty()) {
9084
for (BlockPos pos : blocksToUpdate) {
9185
// Cause the server to re-send the block
92-
Minecraft.getMinecraft().getConnection().sendPacket(new CPacketPlayerDigging(
93-
CPacketPlayerDigging.Action.ABORT_DESTROY_BLOCK, pos, EnumFacing.DOWN));
86+
NetUtils.sendPacket(new CPacketPlayerDigging(CPacketPlayerDigging.Action.ABORT_DESTROY_BLOCK, pos,
87+
EnumFacing.DOWN));
9488
}
9589
blocksToUpdate.clear();
9690
}

src/main/java/net/earthcomputer/clientcommands/ToolDamageManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
import java.util.Iterator;
55
import java.util.List;
66

7+
import net.earthcomputer.clientcommands.network.NetUtils;
78
import net.minecraft.block.Block;
89
import net.minecraft.block.BlockCommandBlock;
910
import net.minecraft.block.BlockStructure;
1011
import net.minecraft.block.material.Material;
1112
import net.minecraft.block.state.IBlockState;
1213
import net.minecraft.client.Minecraft;
13-
import net.minecraft.client.entity.EntityPlayerSP;
1414
import net.minecraft.entity.Entity;
1515
import net.minecraft.entity.monster.EntityCreeper;
1616
import net.minecraft.entity.player.EntityPlayer;
@@ -69,7 +69,7 @@ public static void registerEvents() {
6969
ItemStack elytra = player.inventory.armorItemInSlot(2);
7070
if (!elytra.isEmpty() && elytra.getItem() == Items.ELYTRA) {
7171
if (postToolDamaged(player, elytra, 1)) {
72-
((EntityPlayerSP) player).connection.sendPacket(
72+
NetUtils.sendPacket(
7373
new CPacketEntityAction(player, CPacketEntityAction.Action.START_FALL_FLYING));
7474
}
7575
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package net.earthcomputer.clientcommands.network;
2+
3+
import java.util.function.Predicate;
4+
5+
import net.minecraft.client.Minecraft;
6+
import net.minecraft.entity.player.EntityPlayer;
7+
import net.minecraft.init.Blocks;
8+
import net.minecraft.inventory.ClickType;
9+
import net.minecraft.inventory.Container;
10+
import net.minecraft.inventory.Slot;
11+
import net.minecraft.item.ItemStack;
12+
import net.minecraft.network.Packet;
13+
import net.minecraft.network.play.client.CPacketClickWindow;
14+
15+
public class NetUtils {
16+
17+
/**
18+
* Sends a packet to the server
19+
*/
20+
public static void sendPacket(Packet<?> packet) {
21+
Minecraft.getMinecraft().getConnection().sendPacket(packet);
22+
}
23+
24+
/**
25+
* Resyncs the inventory. Effects are not immediate. Returns whether successful
26+
*/
27+
public static boolean resyncInventory(Predicate<Slot> isDesynced) {
28+
EntityPlayer player = Minecraft.getMinecraft().player;
29+
Container container = player.openContainer;
30+
31+
for (Slot slot : container.inventorySlots) {
32+
if (!slot.getHasStack() && !isDesynced.test(slot)) {
33+
short transactionId = container.getNextTransactionID(player.inventory);
34+
sendPacket(new CPacketClickWindow(container.windowId, slot.slotNumber, 0, ClickType.PICKUP,
35+
new ItemStack(Blocks.COMMAND_BLOCK, 65), transactionId));
36+
return true;
37+
}
38+
}
39+
40+
return false;
41+
}
42+
43+
}

0 commit comments

Comments
 (0)