mirror of
https://github.com/Samsuik/Sakura.git
synced 2026-01-06 15:41:49 +00:00
252 lines
16 KiB
Diff
252 lines
16 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Samsuik <kfian294ma4@gmail.com>
|
|
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<TickTa
|
|
profilerFiller.pop();
|
|
profilerFiller.pop();
|
|
serverLevel.explosionDensityCache.clear(); // Paper - Optimize explosions
|
|
+ serverLevel.explosionPositions.clear(); // Sakura - client visibility settings
|
|
}
|
|
this.isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
|
|
|
|
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
|
|
index 8f9f759885a9cda57ae7d665ec309a57e12969fd..e096463443639e9eef5311d7154f6d2ac1517883 100644
|
|
--- a/net/minecraft/server/level/ChunkMap.java
|
|
+++ b/net/minecraft/server/level/ChunkMap.java
|
|
@@ -168,6 +168,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
this.handleLegacyStructureIndex(pos);
|
|
}
|
|
// Paper end - rewrite chunk system
|
|
+ private final it.unimi.dsi.fastutil.longs.Long2IntMap minimalEntities; // Sakura - client visibility settings; minimal tnt/sand
|
|
|
|
public ChunkMap(
|
|
ServerLevel level,
|
|
@@ -230,6 +231,10 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
);
|
|
this.setServerViewDistance(viewDistance);
|
|
this.worldGenContext = new WorldGenContext(level, generator, structureManager, this.lightEngine, null, this::setChunkUnsaved); // Paper - rewrite chunk system
|
|
+ // Sakura start - client visibility settings; minimal tnt/sand
|
|
+ this.minimalEntities = new it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap();
|
|
+ this.minimalEntities.defaultReturnValue(Integer.MIN_VALUE);
|
|
+ // Sakura end - client visibility settings; minimal tnt/sand
|
|
}
|
|
|
|
private void setChunkUnsaved(ChunkPos chunkPos) {
|
|
@@ -954,6 +959,8 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
tracker.serverEntity.sendChanges();
|
|
}
|
|
}
|
|
+
|
|
+ this.minimalEntities.clear(); // Sakura - client visibility settings; minimal tnt/sand
|
|
}
|
|
// Paper end - optimise entity tracker
|
|
|
|
@@ -1164,6 +1171,32 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
return !this.seenBy.isEmpty();
|
|
}
|
|
// Paper end - optimise entity tracker
|
|
+ // Sakura start - client visibility settings; entity visibility
|
|
+ private boolean checkEntityVisibility(final ServerPlayer player) {
|
|
+ final Entity entity = this.entity;
|
|
+ final me.samsuik.sakura.player.visibility.VisibilitySettings settings = player.visibilitySettings;
|
|
+ if (!settings.playerModified() || !(entity.isPrimedTNT || entity.isFallingBlock)) {
|
|
+ return true;
|
|
+ }
|
|
+ final me.samsuik.sakura.player.visibility.VisibilityType type;
|
|
+ if (entity.isPrimedTNT) {
|
|
+ type = me.samsuik.sakura.player.visibility.VisibilityTypes.TNT;
|
|
+ } else {
|
|
+ type = me.samsuik.sakura.player.visibility.VisibilityTypes.SAND;
|
|
+ }
|
|
+ final me.samsuik.sakura.player.visibility.VisibilityState state = settings.get(type);
|
|
+ if (state == me.samsuik.sakura.player.visibility.VisibilityState.MINIMAL) {
|
|
+ final long key = entity.blockPosition().asLong() ^ entity.getType().hashCode();
|
|
+ final long visibleEntity = ChunkMap.this.minimalEntities.get(key);
|
|
+ if (visibleEntity != Integer.MIN_VALUE) {
|
|
+ return entity.getId() == visibleEntity;
|
|
+ } else {
|
|
+ ChunkMap.this.minimalEntities.put(key, entity.getId());
|
|
+ }
|
|
+ }
|
|
+ return state != me.samsuik.sakura.player.visibility.VisibilityState.OFF;
|
|
+ }
|
|
+ // Sakura end - client visibility settings; entity visibility
|
|
|
|
public TrackedEntity(final Entity entity, final int range, final int updateInterval, final boolean trackDelta) {
|
|
this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, updateInterval, trackDelta, this::broadcast, this.seenBy); // CraftBukkit
|
|
@@ -1234,6 +1267,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
|
}
|
|
flag = flag && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z);
|
|
// Paper end - Configurable entity tracking range by Y
|
|
+ flag = flag && this.checkEntityVisibility(player); // Sakura start - client visibility settings; entity visibility
|
|
// CraftBukkit start - respect vanish API
|
|
if (flag && !player.getBukkitEntity().canSee(this.entity.getBukkitEntity())) { // Paper - only consider hits
|
|
flag = false;
|
|
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
|
index b49a0c3eb4236c71e390f42278412dce59e98cbd..30454e69d603c3de3e2ecb5498d79c25bcc15a07 100644
|
|
--- a/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/net/minecraft/server/level/ServerLevel.java
|
|
@@ -569,6 +569,21 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
);
|
|
}
|
|
// Paper end - chunk tick iteration
|
|
+ // Sakura start - client visibility settings
|
|
+ public final LongSet explosionPositions = new it.unimi.dsi.fastutil.longs.LongOpenHashSet();
|
|
+
|
|
+ public final boolean checkExplosionVisibility(final Vec3 position, final ServerPlayer player) {
|
|
+ final me.samsuik.sakura.player.visibility.VisibilitySettings settings = player.visibilitySettings;
|
|
+ if (settings.isDisabled(me.samsuik.sakura.player.visibility.VisibilityTypes.EXPLOSIONS)) {
|
|
+ return false;
|
|
+ } else if (settings.isToggled(me.samsuik.sakura.player.visibility.VisibilityTypes.EXPLOSIONS)) {
|
|
+ final BlockPos blockPosition = BlockPos.containing(position);
|
|
+ final long encodedPosition = blockPosition.asLong();
|
|
+ return this.explosionPositions.add(encodedPosition);
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+ // Sakura end - client visibility settings
|
|
|
|
public ServerLevel(
|
|
MinecraftServer server,
|
|
@@ -1854,7 +1869,18 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
|
for (ServerPlayer serverPlayer : this.players) {
|
|
if (serverPlayer.distanceToSqr(vec3) < 4096.0) {
|
|
Optional<Vec3> 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 4535ea5fe788fc5c473d8289c031f2c9e56cfce6..92ee40a77f1b13c2c720cd41747206f82a735f9e 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<java.util.UUID, net.kyori.adventure.resource.ResourcePackCallback> 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 27ef385a85b13ceb58e8d149849983107c539b31..c44c9399ddbb34408b255550a98f5c54ecdf6aff 100644
|
|
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -3185,6 +3185,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 54a3ac38b70a9733173fb2ce4a7f86b534de1136..c4ace72f2eaf6a15c98490d18d3478b9ad5ed1a6 100644
|
|
--- a/net/minecraft/world/entity/Entity.java
|
|
+++ b/net/minecraft/world/entity/Entity.java
|
|
@@ -526,6 +526,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 6b708503367f989665b89a39d367935c80210d1d..5462a423be1317a306ca12ed10edcab636cd0c7f 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<? extends FallingBlockEntity> 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 3c673e5b8a52e322d41ed442ed06337cacb58771..8118911019f7fc81218a656e1ecbd7eada505741 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<? extends PrimedTnt> 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) {
|