From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Samsuik Date: Tue, 21 Sep 2021 23:54:25 +0100 Subject: [PATCH] Client Visibility Settings diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java index 3a926d4d34a7c68a24b9e00bcbcff271c8992ad2..f1f322f623756f0c0a06a4207a12765c9623e151 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -1749,6 +1749,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop optional = Optional.ofNullable(serverExplosion.getHitPlayers().get(serverPlayer)); - serverPlayer.connection.send(new ClientboundExplodePacket(vec3, optional, particleOptions, explosionSound)); + // Sakura start - client visibility settings; let players toggle explosion particles + ParticleOptions particle = particleOptions; + Vec3 position = vec3; + // In 1.22 and later this should be replaced with sending the motion through a PlayerPositionPacket. + // The problem here is SetEntityMotion is capped to 3.9 b/pt and the only other alternate mean was + // implemented in 1.21.3. I believe it's best to just wait on this issue and deal with this hack. + if (!this.checkExplosionVisibility(vec3, serverPlayer)) { + position = new Vec3(0.0, -1024.0, 0.0); + particle = net.minecraft.core.particles.ParticleTypes.SMOKE; + } + serverPlayer.connection.send(new ClientboundExplodePacket(position, optional, particle, explosionSound)); + // Sakura end - client visibility settings; let players toggle explosion particles } } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java index 4bf7e288b9e9643ac161fcf017d0194419290a54..8a27d202854e083d9c29abcd8486fc760a7bddd8 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -424,6 +424,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } // Paper end - rewrite chunk system public double trackingRangeModifier = 1.0; // Sakura - entity tracking range modifier + public final me.samsuik.sakura.player.visibility.PlayerVisibilitySettings visibilitySettings = new me.samsuik.sakura.player.visibility.PlayerVisibilitySettings(); // Sakura - client visibility settings public ServerPlayer(MinecraftServer server, ServerLevel level, GameProfile gameProfile, ClientInformation clientInformation) { super(level, level.getSharedSpawnPos(), level.getSharedSpawnAngle(), gameProfile); diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java index e71c1a564e5d4ac43460f89879ff709ee685706f..7d2fe5df38db1d492ae65aa72959200221cf32d5 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -51,6 +51,21 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack public final java.util.Map packCallbacks = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - adventure resource pack callbacks private static final long KEEPALIVE_LIMIT = Long.getLong("paper.playerconnection.keepalive", 30) * 1000; // Paper - provide property to set keepalive limit protected static final net.minecraft.resources.ResourceLocation MINECRAFT_BRAND = net.minecraft.resources.ResourceLocation.withDefaultNamespace("brand"); // Paper - Brand support + // Sakura start - client visibility settings + private @Nullable Packet recreatePacket(final Packet packet) { + final me.samsuik.sakura.player.visibility.VisibilitySettings settings = this.player.visibilitySettings; + if (packet instanceof net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket bedPacket) { + if (settings.isToggled(me.samsuik.sakura.player.visibility.VisibilityTypes.SPAWNERS) && bedPacket.getType() == net.minecraft.world.level.block.entity.BlockEntityType.MOB_SPAWNER) { + return null; + } + } else if (packet instanceof net.minecraft.network.protocol.game.ClientboundBlockEventPacket bePacket) { + if (settings.isToggled(me.samsuik.sakura.player.visibility.VisibilityTypes.PISTONS) && bePacket.getBlock() instanceof net.minecraft.world.level.block.piston.PistonBaseBlock) { + return null; + } + } + return packet; + } + // Sakura end - client visibility settings public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie, net.minecraft.server.level.ServerPlayer player) { // CraftBukkit this.server = server; @@ -287,6 +302,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } else if (packet instanceof net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket defaultSpawnPositionPacket) { this.player.compassTarget = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(defaultSpawnPositionPacket.getPos(), this.getCraftPlayer().getWorld()); } + // Sakura start - client visibility settings + if (this.player.visibilitySettings.playerModified()) { + packet = this.recreatePacket(packet); + if (packet == null) return; + } + // Sakura end - client visibility settings // CraftBukkit end if (packet.isTerminal()) { this.close(); @@ -299,7 +320,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } catch (Throwable var7) { CrashReport crashReport = CrashReport.forThrowable(var7, "Sending packet"); CrashReportCategory crashReportCategory = crashReport.addCategory("Packet being sent"); - crashReportCategory.setDetail("Packet class", () -> packet.getClass().getCanonicalName()); + // Sakura start - client visibility settings; packet has to be effectively final + final Packet packetFinal = packet; + crashReportCategory.setDetail("Packet class", () -> packetFinal.getClass().getCanonicalName()); + // Sakura end - client visibility settings; packet has to be effectively final throw new ReportedException(crashReport); } } diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java index 882dbb1276c548316938bbc50f5f7e01f8547ff8..b2079b8c8ba713f48c89ccd7c871af1ff4beb21e 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -3192,6 +3192,7 @@ public class ServerGamePacketListenerImpl event.setCancelled(cancelled); AbstractContainerMenu oldContainer = this.player.containerMenu; // SPIGOT-1224 + me.samsuik.sakura.player.gui.FeatureGui.clickEvent(event); // Sakura - client visibility settings this.cserver.getPluginManager().callEvent(event); if (this.player.containerMenu != oldContainer) { return; diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java index a652ed38dd54c43547e272204154e791fb666f48..d0107d42212ddff92b5637205417e98ac76dfd69 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -522,6 +522,10 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } // Paper end - optimise entity tracker public boolean pushedByFluid = true; // Sakura - entity pushed by fluid api + // Sakura start - client visibility settings + public boolean isPrimedTNT; + public boolean isFallingBlock; + // Sakura end - client visibility settings public Entity(EntityType entityType, Level level) { this.type = entityType; diff --git a/net/minecraft/world/entity/item/FallingBlockEntity.java b/net/minecraft/world/entity/item/FallingBlockEntity.java index e80b09ae0b34b5859cff7db350a731a387706ef1..bf5f3db9d62c063e8b880b831edb2f3a43d7005a 100644 --- a/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/net/minecraft/world/entity/item/FallingBlockEntity.java @@ -73,6 +73,7 @@ public class FallingBlockEntity extends Entity { public FallingBlockEntity(EntityType entityType, Level level) { super(entityType, level); this.heightParity = level.sakuraConfig().cannons.mechanics.fallingBlockParity; // Sakura - configure cannon mechanics + this.isFallingBlock = true; // Sakura - client visibility settings } public FallingBlockEntity(Level level, double x, double y, double z, BlockState state) { diff --git a/net/minecraft/world/entity/item/PrimedTnt.java b/net/minecraft/world/entity/item/PrimedTnt.java index 6f14584c5e06864d449ebc045f4875476bbe4320..c5b9ebbd159284ae2650b0698e06011104d4b70f 100644 --- a/net/minecraft/world/entity/item/PrimedTnt.java +++ b/net/minecraft/world/entity/item/PrimedTnt.java @@ -61,6 +61,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { public PrimedTnt(EntityType entityType, Level level) { super(entityType, level); this.blocksBuilding = true; + this.isPrimedTNT = true; // Sakura - client visibility settings } public PrimedTnt(Level level, double x, double y, double z, @Nullable LivingEntity owner) {