mirror of
https://github.com/GTMEGA/EndlessIDs.git
synced 2026-11-13 05:27:28 +00:00
DataWatcher
This commit is contained in:
4 files changed
+112
-82
No files matched your search
@@ -14,7 +14,6 @@ import com.falsepattern.endlessids.asm.transformer.VanillaS26PacketMapChunkBulk;
|
||||
import com.falsepattern.endlessids.asm.transformer.VanillaS24PacketBlockActivation;
|
||||
import com.falsepattern.endlessids.asm.transformer.VanillaS22PacketMultiBlockChange;
|
||||
import com.falsepattern.endlessids.asm.transformer.VanillaNetHandlerPlayClient;
|
||||
import com.falsepattern.endlessids.asm.transformer.VanillaDataWatcher;
|
||||
import java.util.Map;
|
||||
|
||||
public enum ClassEdit
|
||||
@@ -25,7 +24,7 @@ public enum ClassEdit
|
||||
//VanillaAnvilChunkLoader(new VanillaAnvilChunkLoader(), new String[] { "net.minecraft.world.chunk.storage.AnvilChunkLoader" }),
|
||||
//VanillaChunk(new VanillaChunk(), new String[] { "net.minecraft.world.chunk.Chunk" }),
|
||||
//VanillaExtendedBlockStorage(new VanillaExtendedBlockStorage(), new String[] { "net.minecraft.world.chunk.storage.ExtendedBlockStorage" }),
|
||||
VanillaDataWatcher(new VanillaDataWatcher(), new String[] { "net.minecraft.entity.DataWatcher" }),
|
||||
//VanillaDataWatcher(new VanillaDataWatcher(), new String[] { "net.minecraft.entity.DataWatcher" }),
|
||||
VanillaNetHandlerPlayClient(new VanillaNetHandlerPlayClient(), new String[] { "net.minecraft.client.network.NetHandlerPlayClient" }),
|
||||
//VanillaS21PacketChunkData(new VanillaS21PacketChunkData(), new String[] { "net.minecraft.network.play.server.S21PacketChunkData" }),
|
||||
VanillaS22PacketMultiBlockChange(new VanillaS22PacketMultiBlockChange(), new String[] { "net.minecraft.network.play.server.S22PacketMultiBlockChange" }),
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
package com.falsepattern.endlessids.asm.transformer;
|
||||
|
||||
import java.util.ListIterator;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
import org.objectweb.asm.tree.MethodInsnNode;
|
||||
import org.objectweb.asm.tree.AbstractInsnNode;
|
||||
import com.falsepattern.endlessids.asm.AsmUtil;
|
||||
import com.falsepattern.endlessids.asm.Name;
|
||||
import com.falsepattern.endlessids.IEConfig;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import com.falsepattern.endlessids.asm.IClassNodeTransformer;
|
||||
|
||||
public class VanillaDataWatcher implements IClassNodeTransformer
|
||||
{
|
||||
public VanillaDataWatcher() {
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void transform(final ClassNode cn, final boolean obfuscated) {
|
||||
if (IEConfig.extendDataWatcher) {
|
||||
MethodNode method = AsmUtil.findMethod(cn, Name.dataWatcher_addObject);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 31, 127);
|
||||
method = AsmUtil.findMethod(cn, Name.dataWatcher_writeWatchableObjectToPacketBuffer);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 31, 127);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 255, 1023);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 5, 7);
|
||||
final ListIterator<AbstractInsnNode> it = (ListIterator<AbstractInsnNode>)method.instructions.iterator();
|
||||
while (it.hasNext()) {
|
||||
final AbstractInsnNode insn = (AbstractInsnNode)it.next();
|
||||
if (insn.getOpcode() == 182 && ((MethodInsnNode)insn).name.equals("writeByte")) {
|
||||
it.set((AbstractInsnNode)new MethodInsnNode(182, "net/minecraft/network/PacketBuffer", "writeShort", "(I)Lio/netty/buffer/ByteBuf;", false));
|
||||
break;
|
||||
}
|
||||
}
|
||||
method = AsmUtil.findMethod(cn, Name.dataWatcher_readWatchedListFromPacketBuffer);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 127, 32767);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 224, 896);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 31, 127);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 5, 7);
|
||||
int num = 0;
|
||||
ListIterator<AbstractInsnNode> it2 = (ListIterator<AbstractInsnNode>)method.instructions.iterator();
|
||||
while (it2.hasNext()) {
|
||||
final AbstractInsnNode insn2 = (AbstractInsnNode)it2.next();
|
||||
if (insn2.getOpcode() == 182 && ((MethodInsnNode)insn2).name.equals("readByte")) {
|
||||
if (++num == 2) {
|
||||
continue;
|
||||
}
|
||||
it2.set((AbstractInsnNode)new MethodInsnNode(182, "net/minecraft/network/PacketBuffer", "readShort", "()S", false));
|
||||
if (num == 3) {
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
method = AsmUtil.findMethod(cn, Name.dataWatcher_writeWatchedListToPacketBuffer);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 127, 32767);
|
||||
it2 = (ListIterator<AbstractInsnNode>)method.instructions.iterator();
|
||||
while (it2.hasNext()) {
|
||||
final AbstractInsnNode insn2 = (AbstractInsnNode)it2.next();
|
||||
if (insn2.getOpcode() == 182 && ((MethodInsnNode)insn2).name.equals("writeByte")) {
|
||||
it2.set((AbstractInsnNode)new MethodInsnNode(182, "net/minecraft/network/PacketBuffer", "writeShort", "(I)Lio/netty/buffer/ByteBuf;", false));
|
||||
break;
|
||||
}
|
||||
}
|
||||
method = AsmUtil.findMethod(cn, Name.dataWatcher_func_151509_a);
|
||||
AsmUtil.transformInlinedSizeMethod(cn, method, 127, 32767);
|
||||
it2 = (ListIterator<AbstractInsnNode>)method.instructions.iterator();
|
||||
while (it2.hasNext()) {
|
||||
final AbstractInsnNode insn2 = (AbstractInsnNode)it2.next();
|
||||
if (insn2.getOpcode() == 182 && ((MethodInsnNode)insn2).name.equals("writeByte")) {
|
||||
it2.set((AbstractInsnNode)new MethodInsnNode(182, "net/minecraft/network/PacketBuffer", "writeShort", "(I)Lio/netty/buffer/ByteBuf;", false));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package com.falsepattern.endlessids.mixin.mixins.common;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import net.minecraft.entity.DataWatcher;
|
||||
import net.minecraft.network.PacketBuffer;
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.Overwrite;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Constant;
|
||||
import org.spongepowered.asm.mixin.injection.ModifyConstant;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Mixin(DataWatcher.class)
|
||||
public abstract class DataWatcherMixin {
|
||||
@ModifyConstant(method = {"addObject", "writeWatchedListToPacketBuffer", "func_151509_a", "writeWatchableObjectToPacketBuffer"},
|
||||
constant = @Constant(intValue = 31),
|
||||
require = 4)
|
||||
private static int extend1(int constant) {
|
||||
return 127;
|
||||
}
|
||||
|
||||
@ModifyConstant(method = "writeWatchableObjectToPacketBuffer",
|
||||
constant = @Constant(intValue = 5, ordinal = 0),
|
||||
require = 1)
|
||||
private static int extend2(int constant) {
|
||||
return 7;
|
||||
}
|
||||
|
||||
@ModifyConstant(method = "writeWatchableObjectToPacketBuffer",
|
||||
constant = @Constant(intValue = 255, ordinal = 0),
|
||||
require = 1)
|
||||
private static int extend3(int constant) {
|
||||
return 1023;
|
||||
}
|
||||
|
||||
@Redirect(method = "writeWatchableObjectToPacketBuffer",
|
||||
at = @At(value = "INVOKE",
|
||||
target = "Lnet/minecraft/network/PacketBuffer;writeByte(I)Lio/netty/buffer/ByteBuf;"),
|
||||
require = 1)
|
||||
private static ByteBuf extendWrite(PacketBuffer instance, int p_writeByte_1_) {
|
||||
return instance.writeShort(p_writeByte_1_);
|
||||
}
|
||||
|
||||
/**
|
||||
* @author FalsePattern
|
||||
* @reason Direct port from dumped code
|
||||
*/
|
||||
@Overwrite
|
||||
public static List<DataWatcher.WatchableObject> readWatchedListFromPacketBuffer(PacketBuffer packet) throws IOException {
|
||||
ArrayList<DataWatcher.WatchableObject> watchables = null;
|
||||
|
||||
for(short id = packet.readShort(); id != 32767; id = packet.readShort()) {
|
||||
if (watchables == null) {
|
||||
watchables = new ArrayList<>();
|
||||
}
|
||||
|
||||
int var3 = (id & 896) >> 7;
|
||||
int var4 = id & 127;
|
||||
DataWatcher.WatchableObject watchable = null;
|
||||
switch(var3) {
|
||||
case 0:
|
||||
watchable = new DataWatcher.WatchableObject(var3, var4, packet.readByte());
|
||||
break;
|
||||
case 1:
|
||||
watchable = new DataWatcher.WatchableObject(var3, var4, packet.readShort());
|
||||
break;
|
||||
case 2:
|
||||
watchable = new DataWatcher.WatchableObject(var3, var4, packet.readInt());
|
||||
break;
|
||||
case 3:
|
||||
watchable = new DataWatcher.WatchableObject(var3, var4, packet.readFloat());
|
||||
break;
|
||||
case 4:
|
||||
watchable = new DataWatcher.WatchableObject(var3, var4, packet.readStringFromBuffer(32767));
|
||||
break;
|
||||
case 5:
|
||||
watchable = new DataWatcher.WatchableObject(var3, var4, packet.readItemStackFromBuffer());
|
||||
break;
|
||||
case 6:
|
||||
int x = packet.readInt();
|
||||
int y = packet.readInt();
|
||||
int z = packet.readInt();
|
||||
watchable = new DataWatcher.WatchableObject(var3, var4, new ChunkCoordinates(x, y, z));
|
||||
}
|
||||
|
||||
watchables.add(watchable);
|
||||
}
|
||||
|
||||
return watchables;
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,17 @@
|
||||
package com.falsepattern.endlessids.mixin.plugin;
|
||||
|
||||
import com.falsepattern.endlessids.IEConfig;
|
||||
import cpw.mods.fml.relauncher.FMLLaunchHandler;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public enum Mixin {
|
||||
AnvilChunkLoaderMixin(builder(Side.COMMON).mixin("AnvilChunkLoaderMixin")),
|
||||
ChunkMixin(builder(Side.COMMON).mixin("ChunkMixin")),
|
||||
DataWatcherMixin(builder(Side.COMMON).condition(() -> IEConfig.extendDataWatcher).mixin("DataWatcherMixin")),
|
||||
StatListMixin(builder(Side.COMMON).mixin("StatListMixin")),
|
||||
BlockFireMixin(builder(Side.COMMON).mixin("BlockFireMixin")),
|
||||
WorldMixin(builder(Side.COMMON).mixin("WorldMixin")),
|
||||
@@ -19,12 +22,14 @@ public enum Mixin {
|
||||
public final String mixin;
|
||||
public final Set<TargetedMod> targetedMods;
|
||||
public final Set<TargetedMod> avoidedMods;
|
||||
public final Set<Supplier<Boolean>> allowConditions;
|
||||
private final Side side;
|
||||
|
||||
Mixin(Builder builder) {
|
||||
this.mixin = builder.mixin;
|
||||
this.targetedMods = builder.targetedMods;
|
||||
this.avoidedMods = builder.avoidedMods;
|
||||
this.allowConditions = builder.allowConditions;
|
||||
this.side = builder.side;
|
||||
}
|
||||
|
||||
@@ -32,7 +37,9 @@ public enum Mixin {
|
||||
return (side == Side.COMMON
|
||||
|| side == Side.SERVER && FMLLaunchHandler.side().isServer()
|
||||
|| side == Side.CLIENT && FMLLaunchHandler.side().isClient())
|
||||
&& loadedMods.containsAll(targetedMods) && avoidedMods.stream().noneMatch(loadedMods::contains);
|
||||
&& loadedMods.containsAll(targetedMods)
|
||||
&& avoidedMods.stream().noneMatch(loadedMods::contains)
|
||||
&& allowConditions.stream().allMatch(Supplier::get);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,8 +51,9 @@ public enum Mixin {
|
||||
private static class Builder {
|
||||
public String mixin;
|
||||
public Side side;
|
||||
public Set<TargetedMod> targetedMods = new HashSet<>();
|
||||
public final Set<TargetedMod> targetedMods = new HashSet<>();
|
||||
public final Set<TargetedMod> avoidedMods = new HashSet<>();
|
||||
public final Set<Supplier<Boolean>> allowConditions = new HashSet<>();
|
||||
|
||||
public Builder(Side side) {
|
||||
this.side = side;
|
||||
@@ -65,6 +73,11 @@ public enum Mixin {
|
||||
avoidedMods.add(mod);
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder condition(Supplier<Boolean> cond) {
|
||||
allowConditions.add(cond);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
private enum Side {
|
||||
|
||||
Reference in new issue
Block a user