From c0bba54799f58477f13bd5c13d2ab696b9e2dbff Mon Sep 17 00:00:00 2001 From: gnembon Date: Wed, 19 Jan 2022 21:20:06 +0100 Subject: [PATCH 1/3] 1.4.57 --- gradle.properties | 2 +- src/main/java/carpet/CarpetSettings.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 8ce4bbfb..b473634b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs=-Xmx1G fabric_version=0.40.1+1.17 # Mod Properties - mod_version = 1.4.56 + mod_version = 1.4.57 maven_group = carpet archives_base_name = fabric-carpet diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 372b0986..1fc12664 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -43,7 +43,7 @@ import static carpet.settings.RuleCategory.CLIENT; @SuppressWarnings("CanBeFinal") public class CarpetSettings { - public static final String carpetVersion = "1.4.56+v211130"; + public static final String carpetVersion = "1.4.57+v220119"; public static final Logger LOG = LogManager.getLogger("carpet"); public static ThreadLocal skipGenerationChecks = ThreadLocal.withInitial(() -> false); public static ThreadLocal impendingFillSkipUpdates = ThreadLocal.withInitial(() -> false); From ec47dea267f5a409a06c6b609df879f9d53971e8 Mon Sep 17 00:00:00 2001 From: altrisi Date: Wed, 19 Jan 2022 21:28:36 +0100 Subject: [PATCH 2/3] Make fake players compatible with adventure platform lib and minor refactor around them (#1235) * Make fake players compatible with adventure platform and minor refactor around them Cleaner approach * Remove no longer needed enderpearl mixin for fake players Their ClientConnection now has an open channel so isOpen returns true --- .../fakes/ClientConnectionInterface.java | 7 ++++ .../carpet/mixins/ClientConnectionMixin.java | 9 ++++- .../PlayerManager_fakePlayersMixin.java | 36 ++----------------- ...rownEnderpearlEntity_fakePlayersMixin.java | 29 --------------- .../carpet/patches/EntityPlayerMPFake.java | 4 +-- .../carpet/patches/FakeClientConnection.java | 27 ++++++++++++++ .../patches/NetHandlerPlayServerFake.java | 7 ++-- .../carpet/patches/NetworkManagerFake.java | 22 ------------ src/main/resources/carpet.mixins.json | 1 - 9 files changed, 49 insertions(+), 93 deletions(-) create mode 100644 src/main/java/carpet/fakes/ClientConnectionInterface.java delete mode 100644 src/main/java/carpet/mixins/ThrownEnderpearlEntity_fakePlayersMixin.java create mode 100644 src/main/java/carpet/patches/FakeClientConnection.java delete mode 100644 src/main/java/carpet/patches/NetworkManagerFake.java diff --git a/src/main/java/carpet/fakes/ClientConnectionInterface.java b/src/main/java/carpet/fakes/ClientConnectionInterface.java new file mode 100644 index 00000000..127f3ac3 --- /dev/null +++ b/src/main/java/carpet/fakes/ClientConnectionInterface.java @@ -0,0 +1,7 @@ +package carpet.fakes; + +import io.netty.channel.Channel; + +public interface ClientConnectionInterface { + void setChannel(Channel channel); +} diff --git a/src/main/java/carpet/mixins/ClientConnectionMixin.java b/src/main/java/carpet/mixins/ClientConnectionMixin.java index 2caf403d..7d245809 100644 --- a/src/main/java/carpet/mixins/ClientConnectionMixin.java +++ b/src/main/java/carpet/mixins/ClientConnectionMixin.java @@ -1,18 +1,21 @@ package carpet.mixins; +import carpet.fakes.ClientConnectionInterface; import carpet.logging.logHelpers.PacketCounter; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import net.minecraft.network.ClientConnection; import net.minecraft.network.Packet; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ClientConnection.class) -public abstract class ClientConnectionMixin +public abstract class ClientConnectionMixin implements ClientConnectionInterface { // Add to the packet counter whenever a packet is received. @Inject(method = "channelRead0", at = @At("HEAD")) @@ -28,4 +31,8 @@ public abstract class ClientConnectionMixin { PacketCounter.totalOut++; } + + @Override + @Accessor //Compat with adventure-platform-fabric + public abstract void setChannel(Channel channel); } diff --git a/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java b/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java index 9f6136dc..c585ee07 100644 --- a/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java +++ b/src/main/java/carpet/mixins/PlayerManager_fakePlayersMixin.java @@ -1,9 +1,7 @@ package carpet.mixins; -import com.mojang.authlib.GameProfile; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.ClientConnection; -import net.minecraft.text.TranslatableText; import net.minecraft.server.MinecraftServer; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ServerPlayNetworkHandler; @@ -15,14 +13,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import carpet.patches.NetHandlerPlayServerFake; import carpet.patches.EntityPlayerMPFake; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - @Mixin(PlayerManager.class) public abstract class PlayerManager_fakePlayersMixin { @@ -42,38 +35,13 @@ public abstract class PlayerManager_fakePlayersMixin @Redirect(method = "onPlayerConnect", at = @At(value = "NEW", target = "net/minecraft/server/network/ServerPlayNetworkHandler")) private ServerPlayNetworkHandler replaceNetworkHandler(MinecraftServer server, ClientConnection clientConnection, ServerPlayerEntity playerIn) { - boolean isServerPlayerEntity = playerIn instanceof EntityPlayerMPFake; - if (isServerPlayerEntity) + if (playerIn instanceof EntityPlayerMPFake fake) { - return new NetHandlerPlayServerFake(this.server, clientConnection, playerIn); + return new NetHandlerPlayServerFake(this.server, clientConnection, fake); } else { return new ServerPlayNetworkHandler(this.server, clientConnection, playerIn); } } - - @Redirect(method = "createPlayer", at = @At(value = "INVOKE", target = "Ljava/util/Iterator;hasNext()Z")) - private boolean cancelWhileLoop(Iterator iterator) - { - return false; - } - - @Inject(method = "createPlayer", at = @At(value = "INVOKE", shift = At.Shift.BEFORE, - target = "Ljava/util/Iterator;hasNext()Z"), locals = LocalCapture.CAPTURE_FAILHARD) - private void newWhileLoop(GameProfile gameProfile_1, CallbackInfoReturnable cir, UUID uUID_1, - List list_1, ServerPlayerEntity serverPlayerEntity, Iterator var5) - { - while (var5.hasNext()) - { - ServerPlayerEntity serverPlayerEntity_3 = (ServerPlayerEntity) var5.next(); - if(serverPlayerEntity_3 instanceof EntityPlayerMPFake) - { - ((EntityPlayerMPFake)serverPlayerEntity_3).kill(new TranslatableText("multiplayer.disconnect.duplicate_login")); - continue; - } - serverPlayerEntity_3.networkHandler.disconnect(new TranslatableText("multiplayer.disconnect.duplicate_login")); - } - } - } \ No newline at end of file diff --git a/src/main/java/carpet/mixins/ThrownEnderpearlEntity_fakePlayersMixin.java b/src/main/java/carpet/mixins/ThrownEnderpearlEntity_fakePlayersMixin.java deleted file mode 100644 index 474e9691..00000000 --- a/src/main/java/carpet/mixins/ThrownEnderpearlEntity_fakePlayersMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package carpet.mixins; - -import carpet.patches.EntityPlayerMPFake; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.projectile.thrown.EnderPearlEntity; -import net.minecraft.entity.projectile.thrown.ThrownItemEntity; -import net.minecraft.network.ClientConnection; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(EnderPearlEntity.class) -public abstract class ThrownEnderpearlEntity_fakePlayersMixin extends ThrownItemEntity -{ - public ThrownEnderpearlEntity_fakePlayersMixin(EntityType entityType_1, World world_1) - { - super(entityType_1, world_1); - } - - @Redirect(method = "onCollision", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/network/ClientConnection;isOpen()Z" - )) - private boolean isConnectionGood(ClientConnection clientConnection) - { - return clientConnection.isOpen() || getOwner() instanceof EntityPlayerMPFake; - } -} diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index ada943ff..a27f29a3 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -62,7 +62,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity } EntityPlayerMPFake instance = new EntityPlayerMPFake(server, worldIn, gameprofile, false); instance.fixStartingPosition = () -> instance.refreshPositionAndAngles(d0, d1, d2, (float) yaw, (float) pitch); - server.getPlayerManager().onPlayerConnect(new NetworkManagerFake(NetworkSide.SERVERBOUND), instance); + server.getPlayerManager().onPlayerConnect(new FakeClientConnection(NetworkSide.SERVERBOUND), instance); instance.teleport(worldIn, d0, d1, d2, (float)yaw, (float)pitch); instance.setHealth(20.0F); instance.unsetRemoved(); @@ -83,7 +83,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity ServerWorld worldIn = player.getServerWorld();//.getWorld(player.dimension); GameProfile gameprofile = player.getGameProfile(); EntityPlayerMPFake playerShadow = new EntityPlayerMPFake(server, worldIn, gameprofile, true); - server.getPlayerManager().onPlayerConnect(new NetworkManagerFake(NetworkSide.SERVERBOUND), playerShadow); + server.getPlayerManager().onPlayerConnect(new FakeClientConnection(NetworkSide.SERVERBOUND), playerShadow); playerShadow.setHealth(player.getHealth()); playerShadow.networkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), player.getYaw(), player.getPitch()); diff --git a/src/main/java/carpet/patches/FakeClientConnection.java b/src/main/java/carpet/patches/FakeClientConnection.java new file mode 100644 index 00000000..5ee1cb15 --- /dev/null +++ b/src/main/java/carpet/patches/FakeClientConnection.java @@ -0,0 +1,27 @@ +package carpet.patches; + +import carpet.fakes.ClientConnectionInterface; +import io.netty.channel.embedded.EmbeddedChannel; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.NetworkSide; + +public class FakeClientConnection extends ClientConnection +{ + public FakeClientConnection(NetworkSide p) + { + super(p); + // compat with adventure-platform-fabric. This does NOT trigger other vanilla handlers for establishing a channel + // also makes #isOpen return true, allowing enderpearls to teleport fake players + ((ClientConnectionInterface)this).setChannel(new EmbeddedChannel()); + } + + @Override + public void disableAutoRead() + { + } + + @Override + public void handleDisconnection() + { + } +} \ No newline at end of file diff --git a/src/main/java/carpet/patches/NetHandlerPlayServerFake.java b/src/main/java/carpet/patches/NetHandlerPlayServerFake.java index 330cb54d..e6882de4 100644 --- a/src/main/java/carpet/patches/NetHandlerPlayServerFake.java +++ b/src/main/java/carpet/patches/NetHandlerPlayServerFake.java @@ -4,13 +4,12 @@ import net.minecraft.network.ClientConnection; import net.minecraft.network.Packet; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayNetworkHandler; -import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; public class NetHandlerPlayServerFake extends ServerPlayNetworkHandler { - public NetHandlerPlayServerFake(MinecraftServer server, ClientConnection cc, ServerPlayerEntity playerIn) + public NetHandlerPlayServerFake(MinecraftServer server, ClientConnection cc, EntityPlayerMPFake playerIn) { super(server, cc, playerIn); } @@ -23,9 +22,9 @@ public class NetHandlerPlayServerFake extends ServerPlayNetworkHandler @Override public void disconnect(Text message) { - if (player instanceof EntityPlayerMPFake && message instanceof TranslatableText && ((TranslatableText) message).getKey().equals("multiplayer.disconnect.idling")) + if (message instanceof TranslatableText text && (text.getKey().equals("multiplayer.disconnect.idling") || text.getKey().equals("multiplayer.disconnect.duplicate_login"))) { - ((EntityPlayerMPFake) player).kill(new TranslatableText(((TranslatableText) message).getKey())); + ((EntityPlayerMPFake) player).kill(message); } } } diff --git a/src/main/java/carpet/patches/NetworkManagerFake.java b/src/main/java/carpet/patches/NetworkManagerFake.java deleted file mode 100644 index d094fca1..00000000 --- a/src/main/java/carpet/patches/NetworkManagerFake.java +++ /dev/null @@ -1,22 +0,0 @@ -package carpet.patches; - -import net.minecraft.network.ClientConnection; -import net.minecraft.network.NetworkSide; - -public class NetworkManagerFake extends ClientConnection -{ - public NetworkManagerFake(NetworkSide p) - { - super(p); - } - - @Override - public void disableAutoRead() - { - } - - @Override - public void handleDisconnection() - { - } -} \ No newline at end of file diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 9a571f7e..cd0ea1c7 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -68,7 +68,6 @@ "VillagerEntity_aiMixin", "PlayerEntity_fakePlayersMixin", - "ThrownEnderpearlEntity_fakePlayersMixin", "ServerPlayNetworkHandler_coreMixin", From 0ac214963f484dcb9fa98a2a1703fbf27dc13ace Mon Sep 17 00:00:00 2001 From: intricate Date: Wed, 19 Jan 2022 17:36:16 -0300 Subject: [PATCH 3/3] Add on_move Entity Event for Scarpet (#1096) * Add ON_MOVE Entity Event for Scarpet * Update src/main/java/carpet/script/EntityEventsGroup.java * Add on_move to Entities.md * Switch to ValueConversions * Update docs/scarpet/api/Entities.md Co-authored-by: gnembon <41132274+gnembon@users.noreply.github.com> * Fix #1126 * undo last commit cause it was on the wrong branch Co-authored-by: gnembon <41132274+gnembon@users.noreply.github.com> --- docs/scarpet/api/Entities.md | 1 + .../mixins/Entity_scarpetEventsMixin.java | 17 +++++++++++++++++ .../java/carpet/script/EntityEventsGroup.java | 15 +++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/docs/scarpet/api/Entities.md b/docs/scarpet/api/Entities.md index 044e1837..bd12373d 100644 --- a/docs/scarpet/api/Entities.md +++ b/docs/scarpet/api/Entities.md @@ -858,6 +858,7 @@ defining the callback with `entity_event`. The following events can be handled by entities: * `'on_tick'`: executes every tick right before the entity is ticked in the game. Required arguments: `entity` +* `'on_move'`: executes every time an entity changes position, invoked just after it has been moved to the new position. Required arguments: `entity, velocity, pos1, pos2` * `'on_death'`: executes once when a living entity dies. Required arguments: `entity, reason` * `'on_removed'`: execute once when an entity is removed. Required arguments: `entity` * `'on_damaged'`: executed every time a living entity is about to receive damage. diff --git a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java index 0070517a..02ac6184 100644 --- a/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/Entity_scarpetEventsMixin.java @@ -3,6 +3,7 @@ package carpet.mixins; import carpet.fakes.EntityInterface; import carpet.script.EntityEventsGroup; import net.minecraft.entity.Entity; +import net.minecraft.util.math.Vec3d; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -19,10 +20,14 @@ public abstract class Entity_scarpetEventsMixin implements EntityInterface @Shadow public abstract boolean isRemoved(); + @Shadow private Vec3d pos, velocity; + private boolean permanentVehicle; private final EntityEventsGroup events = new EntityEventsGroup((Entity) (Object)this); + private Vec3d pos1, motion; + @Override public EntityEventsGroup getEventContainer() { @@ -79,4 +84,16 @@ public abstract class Entity_scarpetEventsMixin implements EntityInterface } + @Inject(method = "setPos", at = @At("HEAD")) + private void firstPos(CallbackInfo ci) + { + pos1 = this.pos; + motion = this.velocity; + } + + @Inject(method = "setPos", at = @At("TAIL")) + private void secondPos(CallbackInfo ci) + { + events.onEvent(EntityEventsGroup.Event.ON_MOVE, motion, pos1, this.pos); + } } diff --git a/src/main/java/carpet/script/EntityEventsGroup.java b/src/main/java/carpet/script/EntityEventsGroup.java index 16655d7c..5e51278f 100644 --- a/src/main/java/carpet/script/EntityEventsGroup.java +++ b/src/main/java/carpet/script/EntityEventsGroup.java @@ -7,8 +7,10 @@ import carpet.script.value.FunctionValue; import carpet.script.value.NumericValue; import carpet.script.value.StringValue; import carpet.script.value.Value; +import carpet.script.value.ValueConversions; import net.minecraft.entity.Entity; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.util.math.Vec3d; import java.util.Arrays; import java.util.Collections; @@ -108,6 +110,19 @@ public class EntityEventsGroup ); } }; + public static final Event ON_MOVE = new Event("on_move", 3) + { + @Override + public List makeArgs(Entity entity, Object... providedArgs) + { + return Arrays.asList( + new EntityValue(entity), + ValueConversions.of((Vec3d) providedArgs[0]), + ValueConversions.of((Vec3d) providedArgs[1]), + ValueConversions.of((Vec3d) providedArgs[2]) + ); + } + }; public final int argcount; public final String id;