diff --git a/gradle.properties b/gradle.properties index 5acaab5a..4502d343 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,10 +4,10 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/use # or better: https://modmuss50.me/fabric.html - minecraft_version=21w07a - yarn_mappings=21w07a+build.1 - loader_version=0.11.1 - fabric_version=0.30.5+1.17 + minecraft_version=21w08a + yarn_mappings=21w08a+build.1 + loader_version=0.11.2 + fabric_version=0.31.1+1.17 # Mod Properties mod_version = 1.4.27 diff --git a/src/main/java/carpet/fakes/StructureFeatureInterface.java b/src/main/java/carpet/fakes/StructureFeatureInterface.java index b54d3364..75d34585 100644 --- a/src/main/java/carpet/fakes/StructureFeatureInterface.java +++ b/src/main/java/carpet/fakes/StructureFeatureInterface.java @@ -13,5 +13,5 @@ import net.minecraft.world.gen.feature.FeatureConfig; public interface StructureFeatureInterface { boolean plopAnywhere(ServerWorld world, BlockPos pos, ChunkGenerator generator, boolean wireOnly,Biome biome, FeatureConfig config); - boolean shouldStartPublicAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, ChunkRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, C featureConfig, HeightLimitView heightLimitView); + boolean shouldStartPublicAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, ChunkRandom chunkRandom, ChunkPos chpos, Biome biome, ChunkPos chunkPos, C featureConfig, HeightLimitView heightLimitView); } diff --git a/src/main/java/carpet/helpers/FeatureGenerator.java b/src/main/java/carpet/helpers/FeatureGenerator.java index 40bda4b9..5096e62c 100644 --- a/src/main/java/carpet/helpers/FeatureGenerator.java +++ b/src/main/java/carpet/helpers/FeatureGenerator.java @@ -158,12 +158,12 @@ public class FeatureGenerator ChunkPos chunkPos2 = structure.getStartChunk(params, seed, chunkRandom, chunkPos.x, chunkPos.z); //find some chunk I guess // using here world for heightview, rather than chunk since we - unlike vanilla, want to avoid creating any chunks even on the // structure starts level - lets see where would that take us. - if (chunkPos.x == chunkPos2.x && chunkPos.z == chunkPos2.z && ((StructureFeatureInterface)structure).shouldStartPublicAt(generator, generator.getBiomeSource(), seed, chunkRandom, chunkPos.x, chunkPos.z, biome, chunkPos, configuredFeature.config, world)) // should start at + if (chunkPos.x == chunkPos2.x && chunkPos.z == chunkPos2.z && ((StructureFeatureInterface)structure).shouldStartPublicAt(generator, generator.getBiomeSource(), seed, chunkRandom, chunkPos, biome, chunkPos, configuredFeature.config, world)) // should start at { if (!computeBox) return StructureStart.DEFAULT; StructureManager manager = world.getStructureManager(); - StructureStart structureStart3 = structure.getStructureStartFactory().create((StructureFeature) configuredFeature.feature, chunkPos.x, chunkPos.z, BlockBox.empty(), 0, seed); - structureStart3.init(world.getRegistryManager(), generator, manager, chunkPos.x, chunkPos.z, biome, (T) configuredFeature.config, world); + StructureStart structureStart3 = structure.getStructureStartFactory().create((StructureFeature) configuredFeature.feature, chunkPos, BlockBox.empty(), 0, seed); + structureStart3.init(world.getRegistryManager(), generator, manager, chunkPos, biome, (T) configuredFeature.config, world); if (!structureStart3.hasChildren()) return null; return structureStart3; } diff --git a/src/main/java/carpet/logging/HUDController.java b/src/main/java/carpet/logging/HUDController.java index 88b3a3ee..4919cf9f 100644 --- a/src/main/java/carpet/logging/HUDController.java +++ b/src/main/java/carpet/logging/HUDController.java @@ -6,7 +6,9 @@ import carpet.logging.logHelpers.PacketCounter; import carpet.mixins.PlayerListHeaderS2CPacketMixin; import carpet.utils.Messenger; import carpet.utils.SpawnReporter; +import io.netty.buffer.Unpooled; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.PacketByteBuf; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.network.packet.s2c.play.PlayerListHeaderS2CPacket; import net.minecraft.server.MinecraftServer; @@ -53,9 +55,10 @@ public class HUDController } public static void clear_player(PlayerEntity player) { - PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(); - ((PlayerListHeaderS2CPacketMixin)packet).setHeader(new LiteralText("")); - ((PlayerListHeaderS2CPacketMixin)packet).setFooter(new LiteralText("")); + PacketByteBuf packetData = new PacketByteBuf(Unpooled.buffer()).writeText(new LiteralText("")).writeText(new LiteralText("")); + PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(packetData); + //((PlayerListHeaderS2CPacketMixin)packet).setHeader(new LiteralText("")); + //((PlayerListHeaderS2CPacketMixin)packet).setFooter(new LiteralText("")); ((ServerPlayerEntity)player).networkHandler.sendPacket(packet); } @@ -99,9 +102,14 @@ public class HUDController for (PlayerEntity player: player_huds.keySet()) { - PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(); - ((PlayerListHeaderS2CPacketMixin)packet).setHeader(new LiteralText("")); - ((PlayerListHeaderS2CPacketMixin)packet).setFooter(Messenger.c(player_huds.get(player).toArray(new Object[0]))); + PacketByteBuf packetData = new PacketByteBuf(Unpooled.buffer()). + writeText(new LiteralText("")). + writeText(Messenger.c(player_huds.get(player).toArray(new Object[0]))); + PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(packetData); + + //PlayerListHeaderS2CPacket packet = new PlayerListHeaderS2CPacket(); + //((PlayerListHeaderS2CPacketMixin)packet).setHeader(new LiteralText("")); + //((PlayerListHeaderS2CPacketMixin)packet).setFooter(Messenger.c(player_huds.get(player).toArray(new Object[0]))); ((ServerPlayerEntity)player).networkHandler.sendPacket(packet); } } diff --git a/src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java index e997f533..3f98fb79 100644 --- a/src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java @@ -8,14 +8,19 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import static carpet.script.CarpetEventServer.Event.PLAYER_ATTACKS_ENTITY; import static carpet.script.CarpetEventServer.Event.PLAYER_DEALS_DAMAGE; +import static carpet.script.CarpetEventServer.Event.PLAYER_INTERACTS_WITH_ENTITY; import static carpet.script.CarpetEventServer.Event.PLAYER_TAKES_DAMAGE; import static carpet.script.CarpetEventServer.Event.PLAYER_COLLIDES_WITH_ENTITY; @@ -53,4 +58,22 @@ public abstract class PlayerEntity_scarpetEventsMixin extends LivingEntity PLAYER_COLLIDES_WITH_ENTITY.onEntityHandAction((ServerPlayerEntity)(Object)this, entity, null); } } + + @Inject(method = "interact", at = @At("HEAD")) + private void doInteract(Entity entity, Hand hand, CallbackInfoReturnable cir) + { + if (!world.isClient && PLAYER_INTERACTS_WITH_ENTITY.isNeeded()) + { + PLAYER_INTERACTS_WITH_ENTITY.onEntityHandAction((ServerPlayerEntity) (Object)this, entity, hand); + } + } + + @Inject(method = "attack", at = @At("HEAD")) + private void onAttack(Entity target, CallbackInfo ci) + { + if (!world.isClient && PLAYER_ATTACKS_ENTITY.isNeeded() && target.isAttackable()) + { + PLAYER_ATTACKS_ENTITY.onEntityHandAction((ServerPlayerEntity) (Object)this, target, null); + } + } } diff --git a/src/main/java/carpet/mixins/ServerPlayNetworkHandler_scarpetEventsMixin.java b/src/main/java/carpet/mixins/ServerPlayNetworkHandler_scarpetEventsMixin.java index cc752361..7ef22620 100644 --- a/src/main/java/carpet/mixins/ServerPlayNetworkHandler_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/ServerPlayNetworkHandler_scarpetEventsMixin.java @@ -225,16 +225,16 @@ public class ServerPlayNetworkHandler_scarpetEventsMixin PLAYER_DEPLOYS_ELYTRA.onPlayerEvent(player); } - @Inject(method = "onPlayerInteractEntity", at = @At( + /*@Inject(method = "onPlayerInteractEntity", at = @At( value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;interact(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/ActionResult;" )) private void onEntityInteract(PlayerInteractEntityC2SPacket playerInteractEntityC2SPacket_1, CallbackInfo ci) { PLAYER_INTERACTS_WITH_ENTITY.onEntityHandAction(player, playerInteractEntityC2SPacket_1.getEntity(player.getServerWorld()), playerInteractEntityC2SPacket_1.getHand()); - } + }*/ - @Inject(method = "onPlayerInteractEntity", at = @At( + /*@Inject(method = "onPlayerInteractEntity", at = @At( value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;attack(Lnet/minecraft/entity/Entity;)V" )) @@ -242,7 +242,7 @@ public class ServerPlayNetworkHandler_scarpetEventsMixin { //todo add hit and hand in the future PLAYER_ATTACKS_ENTITY.onEntityHandAction(player, playerInteractEntityC2SPacket_1.getEntity(player.getServerWorld()), null); - } + }*/ @Inject(method = "onButtonClick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;updateLastActionTime()V")) private void onItemBeingPickedFromInventory(ButtonClickC2SPacket packet, CallbackInfo ci) diff --git a/src/main/java/carpet/mixins/StructureFeatureMixin.java b/src/main/java/carpet/mixins/StructureFeatureMixin.java index e9f7c9d9..62a8d2f0 100644 --- a/src/main/java/carpet/mixins/StructureFeatureMixin.java +++ b/src/main/java/carpet/mixins/StructureFeatureMixin.java @@ -29,7 +29,7 @@ public abstract class StructureFeatureMixin implements @Shadow public abstract StructureFeature.StructureStartFactory getStructureStartFactory(); - @Shadow protected abstract boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom random, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, C config, HeightLimitView heightLimitView); + @Shadow protected abstract boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom random, ChunkPos chunkPos, Biome biome, ChunkPos chunkPos2, C featureConfig, HeightLimitView heightLimitView); @Override public boolean plopAnywhere(ServerWorld world, BlockPos pos, ChunkGenerator generator, boolean wireOnly, Biome biome, FeatureConfig config) @@ -105,10 +105,10 @@ public abstract class StructureFeatureMixin implements if (biome == null) biome_1 = generator.getBiomeSource().getBiomeForNoiseGen((chunkpos.getStartX() + 9) >> 2, 0, (chunkpos.getStartZ() + 9) >> 2 ); - StructureStart structurestart1 = getStructureStartFactory().create((StructureFeature)(Object)this, chunkpos.x, chunkpos.z, BlockBox.empty(),0,worldIn.getSeed()); + StructureStart structurestart1 = getStructureStartFactory().create((StructureFeature)(Object)this, chunkpos, BlockBox.empty(),0,worldIn.getSeed()); if (config == null) config = new DefaultFeatureConfig(); - structurestart1.init(worldIn.getRegistryManager(), generator, worldIn.getStructureManager() , chunkpos.x, chunkpos.z, biome_1, config, ichunk); + structurestart1.init(worldIn.getRegistryManager(), generator, worldIn.getStructureManager() , chunkpos, biome_1, config, ichunk); structurestart = structurestart1.hasChildren() ? structurestart1 : StructureStart.DEFAULT; if (structurestart.hasChildren()) @@ -121,8 +121,8 @@ public abstract class StructureFeatureMixin implements } @Override - public boolean shouldStartPublicAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, ChunkRandom chunkRandom, int i, int j, Biome biome, ChunkPos chunkPos, C featureConfig, HeightLimitView heightLimitView) + public boolean shouldStartPublicAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, ChunkRandom chunkRandom, ChunkPos chpos, Biome biome, ChunkPos chunkPos, C featureConfig, HeightLimitView heightLimitView) { - return shouldStartAt(chunkGenerator, biomeSource, l, chunkRandom, i, j, biome, chunkPos, featureConfig, heightLimitView); + return shouldStartAt(chunkGenerator, biomeSource, l, chunkRandom, chpos, biome, chunkPos, featureConfig, heightLimitView); } } diff --git a/src/main/java/carpet/mixins/UpdateStructureBlockC2SPacketMixin.java b/src/main/java/carpet/mixins/UpdateStructureBlockC2SPacketMixin.java index 78509307..8cc3d3ba 100644 --- a/src/main/java/carpet/mixins/UpdateStructureBlockC2SPacketMixin.java +++ b/src/main/java/carpet/mixins/UpdateStructureBlockC2SPacketMixin.java @@ -21,7 +21,7 @@ public class UpdateStructureBlockC2SPacketMixin { private BlockPos size; @Inject( - method = "read", + method = "(Lnet/minecraft/network/PacketByteBuf;)V", at = @At("TAIL") ) private void structureBlockLimitsRead(PacketByteBuf buf, CallbackInfo ci) { diff --git a/src/main/java/carpet/patches/EntityPlayerMPFake.java b/src/main/java/carpet/patches/EntityPlayerMPFake.java index 39808ad4..895eca83 100644 --- a/src/main/java/carpet/patches/EntityPlayerMPFake.java +++ b/src/main/java/carpet/patches/EntityPlayerMPFake.java @@ -75,7 +75,7 @@ public class EntityPlayerMPFake extends ServerPlayerEntity server.getPlayerManager().sendToDimension(new EntitySetHeadYawS2CPacket(playerShadow, (byte) (player.headYaw * 256 / 360)), playerShadow.world.getRegistryKey()); - server.getPlayerManager().sendToAll(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, playerShadow)); + server.getPlayerManager().sendToAll(new PlayerListS2CPacket(PlayerListS2CPacket.class_5893.field_29136, playerShadow)); player.getServerWorld().getChunkManager().updateCameraPosition(playerShadow); return playerShadow; } diff --git a/src/main/java/carpet/script/api/Auxiliary.java b/src/main/java/carpet/script/api/Auxiliary.java index 4672a0ae..fb2f5160 100644 --- a/src/main/java/carpet/script/api/Auxiliary.java +++ b/src/main/java/carpet/script/api/Auxiliary.java @@ -36,6 +36,11 @@ import carpet.script.value.Value; import carpet.script.value.ValueConversions; import carpet.utils.Messenger; import net.minecraft.block.BlockState; +import net.minecraft.class_5888; +import net.minecraft.class_5894; +import net.minecraft.class_5903; +import net.minecraft.class_5904; +import net.minecraft.class_5905; import net.minecraft.command.DataCommandStorage; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; @@ -47,9 +52,10 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtHelper; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; +import net.minecraft.network.Packet; import net.minecraft.network.packet.s2c.play.PlaySoundIdS2CPacket; -import net.minecraft.network.packet.s2c.play.TitleS2CPacket; -import net.minecraft.network.packet.s2c.play.TitleS2CPacket.Action; +//import net.minecraft.network.packet.s2c.play.TitleS2CPacket; +//import net.minecraft.network.packet.s2c.play.TitleS2CPacket.Action; import net.minecraft.particle.ParticleEffect; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; @@ -85,6 +91,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -497,6 +504,7 @@ public class Auxiliary { return (_c, _t) -> finalRes; // pass through for variables }); expression.addLazyFunction("display_title", -1, (c, t, lv) -> { + if (lv.size() < 2) throw new InternalExpressionException("'display_title' needs at least a target, type and message, and optionally times"); Value pVal = lv.get(0).evalValue(c); if (!(pVal instanceof ListValue)) pVal = ListValue.of(pVal); @@ -507,26 +515,40 @@ public class Auxiliary { if (player == null) throw new InternalExpressionException("'display_title' requires a valid online player or a list of players as first argument. "+v.getString()+" is not a player."); return player; }); - TitleS2CPacket.Action action; + Function> packetGetter; + //TitleS2CPacket.Action action; switch (lv.get(1).evalValue(c).getString().toLowerCase(Locale.ROOT)) { case "title": - action = Action.TITLE; + packetGetter = (x) -> new class_5904(x); + //action = Action.TITLE; + if (lv.size() < 3) + throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type"); + break; case "subtitle": - action = Action.SUBTITLE; + packetGetter = (x) -> new class_5903(x); + if (lv.size() < 3) + throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type"); + + //action = Action.SUBTITLE; break; case "actionbar": - action = Action.ACTIONBAR; + packetGetter = (x) -> new class_5894(x); + if (lv.size() < 3) + throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type"); + + //action = Action.ACTIONBAR; break; case "clear": - action = Action.CLEAR; + packetGetter = (x) -> new class_5888(true); // resetting default fade + //action = Action.CLEAR; break; default: throw new InternalExpressionException("'display_title' requires 'title', 'subtitle', 'actionbar' or 'clear' as second argument"); } - if (action != Action.CLEAR && lv.size() < 3) - throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type"); + //if (action != Action.CLEAR && lv.size() < 3) + // throw new InternalExpressionException("Third argument of 'display_title' must be present except for 'clear' type"); Text title = null; if (lv.size() > 2) { @@ -536,17 +558,19 @@ public class Auxiliary { else title = new LiteralText(pVal.getString()); } - TitleS2CPacket timesPacket; + class_5905 timesPacket; // TimesPacket if (lv.size() > 3) { int in = NumericValue.asNumber(lv.get(3).evalValue(c),"fade in for display_title" ).getInt(); int stay = NumericValue.asNumber(lv.get(4).evalValue(c),"stay for display_title" ).getInt(); int out = NumericValue.asNumber(lv.get(5).evalValue(c),"fade out for display_title" ).getInt(); - timesPacket = new TitleS2CPacket(Action.TIMES, null, in, stay, out); + timesPacket = new class_5905(in, stay, out); + //timesPacket = new TitleS2CPacket(Action.TIMES, null, in, stay, out); } else timesPacket = null; - TitleS2CPacket packet = new TitleS2CPacket(action, title); + Packet packet = packetGetter.apply(title); + //TitleS2CPacket packet = new TitleS2CPacket(action, title); AtomicInteger total = new AtomicInteger(0); targets.forEach(p -> { if (timesPacket != null) p.networkHandler.sendPacket(timesPacket); diff --git a/src/main/java/carpet/script/api/WorldAccess.java b/src/main/java/carpet/script/api/WorldAccess.java index 95ba3673..e190bb3a 100644 --- a/src/main/java/carpet/script/api/WorldAccess.java +++ b/src/main/java/carpet/script/api/WorldAccess.java @@ -1356,7 +1356,7 @@ public class WorldAccess { return; } StructureStart start = structures.get(structure); - ChunkPos structureChunkPos = new ChunkPos(start.getChunkX(), start.getChunkZ()); + ChunkPos structureChunkPos = start.method_34000(); // new ChunkPos(start.getChunkX(), start.getChunkZ()); BlockBox box = start.getBoundingBox(); for (int chx = box.minX / 16; chx <= box.maxX / 16; chx++) { diff --git a/src/main/java/carpet/utils/BlockInfo.java b/src/main/java/carpet/utils/BlockInfo.java index 2136d1a4..a3aa1886 100644 --- a/src/main/java/carpet/utils/BlockInfo.java +++ b/src/main/java/carpet/utils/BlockInfo.java @@ -4,10 +4,9 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Material; import net.minecraft.block.MapColor; -import net.minecraft.class_5532; // TargetFinder import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnReason; -//import net.minecraft.entity.ai.TargetFinder; +import net.minecraft.entity.ai.NoPenaltyTargeting; import net.minecraft.entity.ai.goal.WanderAroundGoal; import net.minecraft.entity.ai.pathing.NavigationType; import net.minecraft.entity.mob.PathAwareEntity; @@ -253,7 +252,7 @@ public class BlockInfo for (int i=0; i<1000; i++) { - Vec3d vec = class_5532.method_31510(creature, 10, 7); // TargetFinder.findTarget(creature, 10, 7); + Vec3d vec = NoPenaltyTargeting.find(creature, 10, 7); // TargetFinder.findTarget(creature, 10, 7); if (vec == null) { continue;