diff --git a/game/client/instance/instance.cfg b/game/client/instance/instance.cfg index 1d39f319c..cebfd7697 100644 --- a/game/client/instance/instance.cfg +++ b/game/client/instance/instance.cfg @@ -1,4 +1,7 @@ InstanceType=OneSix +AutomaticJava=true +JavaVendor=Adoptium +JavaVersion=17.0.19 iconKey=v$version name=Better than Adventure! (Managed) JvmArgs=-XX:+UseG1GC -Dsun.rmi.dgc.server.gcInterval=2147483646 -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M diff --git a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java index 2b86ed7c2..c01819b59 100644 --- a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java +++ b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java @@ -107,7 +107,7 @@ public class PlayerLocal extends Player { } @Override - public void setGamemode(Gamemode gamemode) { + public void setGamemode(@NotNull Gamemode gamemode) { this.gamemode = gamemode; MenuInventory newContainer = gamemode.getInventoryMenu(this.inventory); diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java index de82047a8..a31e8bfa7 100644 --- a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java +++ b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java @@ -82,6 +82,7 @@ public abstract class OptionsPages { .withComponent(new ToggleableOptionComponent<>(GameSettings.PLACEMENT_MODE)) .withComponent(new BooleanOptionComponent(GameSettings.AUTO_HIT)) .withComponent(new BooleanOptionComponent(GameSettings.EASY_BRIDGE)) + .withComponent(new BooleanOptionComponent(GameSettings.EASY_BRIDGE_OUTLINE)) .withComponent(new BooleanOptionComponent(GameSettings.VIEW_BOBBING)) ) .withComponent(new OptionsCategory("gui.options.page.general.category.user_interface") diff --git a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java index 9f8e0ff4f..8d835be10 100644 --- a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java +++ b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java @@ -169,6 +169,7 @@ public final class GameSettings { public static final @NotNull OptionString SHADER_OVERRIDE = register(new OptionString("shaderOverride", "")); public static final @NotNull OptionBoolean AUTO_HIT = register(new OptionBoolean("autoHit", true)); public static final @NotNull OptionBoolean EASY_BRIDGE = register(new OptionBoolean("easyBridge", true)); + public static final @NotNull OptionBoolean EASY_BRIDGE_OUTLINE = register(new OptionBoolean("easyBridgeOutline", true)); public static final @NotNull OptionBoolean FOOD_HEALTH_REGEN_OVERLAY = register(new OptionBoolean("foodHealthRegenOverlay", true)); public static final @NotNull OptionBoolean FPS_IN_OVERLAY = register(new OptionBoolean("fpsInOverlay", false)); public static final @NotNull OptionBoolean VERSION_IN_OVERLAY = register(new OptionBoolean("versionInOverlay", false)); diff --git a/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java b/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java index c299780a8..08b4c481e 100644 --- a/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java +++ b/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java @@ -62,7 +62,6 @@ import net.minecraft.core.world.weather.Weather; import org.lwjgl.opengl.GL41; import org.slf4j.Logger; -import java.util.List; import java.util.Random; public class WorldRenderer { @@ -719,7 +718,7 @@ public class WorldRenderer { } renderGlobal.drawSelectionBox(this.mc.activeCamera, this.mc.objectMouseOver, partialTicks); // glEnable(GL_ALPHA_TEST); - } else if (this.mc.canBridge) { + } else if (this.mc.canBridge && GameSettings.EASY_BRIDGE_OUTLINE.value) { renderGlobal.drawTileSelectionBox(this.mc.activeCamera, this.mc.bridgePos, partialTicks); } @@ -755,7 +754,7 @@ public class WorldRenderer { // glDisable(GL_ALPHA_TEST); renderGlobal.drawSelectionBox(this.mc.activeCamera, this.mc.objectMouseOver, partialTicks); // glEnable(GL_ALPHA_TEST); - } else if (this.mc.canBridge) { + } else if (this.mc.canBridge && GameSettings.EASY_BRIDGE_OUTLINE.value) { renderGlobal.drawTileSelectionBox(this.mc.activeCamera, this.mc.bridgePos, partialTicks); } diff --git a/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java b/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java index 8ac8fc20e..35c3c8e83 100644 --- a/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java +++ b/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java @@ -23,6 +23,7 @@ import net.minecraft.core.world.settings.WorldConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.Set; @@ -62,10 +63,13 @@ public class WorldClientMP extends WorldClient { this.getLevelData().setWorldTime(this.getLevelData().getWorldTime() + 1L); } this.getLevelData().setTotalWorldTime(this.getLevelData().getTotalWorldTime() + 1L); - for (int k = 0; k < 10 && !this.reEntries.isEmpty(); k++) { - Entity entity = this.reEntries.iterator().next(); - if (!this.entities.contains(entity)) { - entityJoinedWorld(entity); + if (!this.reEntries.isEmpty()) { + // reEntries.iterator().next() could return the same failing entity forever, leaving every other entity invisible. + for (Entity entity : new ArrayList<>(this.reEntries)) { + this.reEntries.remove(entity); + if (!this.entities.contains(entity)) { + entityJoinedWorld(entity); + } } } diff --git a/game/client/src/main/resources/credits.txt b/game/client/src/main/resources/credits.txt index cef07c221..02d46efa7 100644 --- a/game/client/src/main/resources/credits.txt +++ b/game/client/src/main/resources/credits.txt @@ -82,6 +82,7 @@ mzov4j --Deer model PedroThePanda64 (@agreathornedowl) --Shader fixes and improvements +--Acid shader fix --Dog music track fix ph --Venison texture diff --git a/game/client/src/main/resources/shaders/acid_overlay.fsh b/game/client/src/main/resources/shaders/acid_overlay.fsh index adc932444..6bf53fde3 100644 --- a/game/client/src/main/resources/shaders/acid_overlay.fsh +++ b/game/client/src/main/resources/shaders/acid_overlay.fsh @@ -2,7 +2,6 @@ out vec4 FragColor; -in vec4 Color; in vec2 TexCoord; uniform float uCurrentTick; @@ -10,6 +9,32 @@ uniform vec4 uColor; uniform float uAlphaTest; uniform vec2 uViewPortSize; +// https://www.shadertoy.com/view/4lcBWn +float cro(in vec2 a, in vec2 b ) { return a.x*b.y - a.y*b.x; } + +float sdUnevenCapsule( in vec2 p, in vec2 pa, in vec2 pb, in float ra, in float rb ) +{ + p -= pa; + pb -= pa; + float h = dot(pb,pb); + vec2 q = vec2( dot(p,vec2(pb.y,-pb.x)), dot(p,pb) )/h; + + //----------- + + q.x = abs(q.x); + + float b = ra-rb; + vec2 c = vec2(sqrt(h-b*b),b); + + float k = cro(c,q); + float m = dot(c,q); + float n = dot(q,q); + + if( k < 0.0 ) return sqrt(h*(n )) - ra; + else if( k > c.x ) return sqrt(h*(n+1.0-2.0*q.y)) - rb; + return m - ra; +} + void main() { // Vignette vec2 centerCoords = TexCoord - 0.5; @@ -20,10 +45,10 @@ void main() { float vignetteAlpha = minVignette + vignetteRamp; // Droplets - float pixelScale = 8.0; - vec2 dropUV = floor(TexCoord * (uViewPortSize / pixelScale)) / (uViewPortSize / pixelScale); + float pixelScale = 128.0; + vec2 dropUV = floor(TexCoord * pixelScale) / pixelScale; - float cols = floor(uViewPortSize.x / 24.0); + float cols = 32.0; float streamIndex = floor(dropUV.x * cols); float localX = fract(dropUV.x * cols) - 0.5; float r1 = fract(sin(dot(vec2(streamIndex), vec2(12.9898, 78.233))) * 43758.5453); @@ -41,7 +66,7 @@ void main() { float distX = abs(localX); float w = 0.0; - if (t > 0.25 && t < 0.75) { + if (t > 0.4 && t < 0.9) { w = 0.3; core = step(distX, 0.15); @@ -61,4 +86,25 @@ void main() { float dripAlpha = 0.08 * drop * (1.0 + distSq * 2.0); float finalAlpha = uColor.a * (vignetteAlpha + dripAlpha); FragColor = vec4(col, finalAlpha); +/* + float cols = 32.0; + float streamIndex = floor(dropUV.x * cols); + + vec2 p = dropUV * cols; + vec2 v1 = vec2(0.5 + streamIndex, 1.0); + vec2 v2 = vec2(0.5 + streamIndex, 4.0); + float r1 = 0.1; + float r2 = 0.5; + + float d = sdUnevenCapsule(p, v1, v2, r1, r2); + float drop = 1.0 - clamp(d, 0.0, 1.0); + + vec3 baseColor = vec3(0.85, 1.0, 0.25); + vec3 dripOuter = vec3(0.65, 0.85, 0.15); + vec3 dripInner = vec3(0.95, 1.0, 0.25); + vec3 dropCol = mix(baseColor, dripInner, drop); + vec3 col = vec3(drop); //dropCol; //mix(baseColor, dropCol, 1.0 - drop); + + FragColor = vec4(col, floor(drop)); +*/ } \ No newline at end of file diff --git a/game/client/src/main/resources/shaders/acid_overlay.vsh b/game/client/src/main/resources/shaders/acid_overlay.vsh index 775ecf1e5..9705973e2 100644 --- a/game/client/src/main/resources/shaders/acid_overlay.vsh +++ b/game/client/src/main/resources/shaders/acid_overlay.vsh @@ -3,7 +3,6 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec4 aColor; layout (location = 2) in vec2 aUV; -out vec4 Color; out vec2 TexCoord; uniform mat4 model; @@ -16,6 +15,5 @@ layout (std140) uniform Matrices { void main() { gl_Position = matrices.projection * matrices.view * model * vec4(aPos, 1); - Color = aColor; TexCoord = aUV; } diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java index ba134cfca..8c1af0d91 100644 --- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java +++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java @@ -1,5 +1,6 @@ package net.minecraft.core.block; +import net.minecraft.core.block.entity.TileEntityActivator; import net.minecraft.core.block.material.Material; import net.minecraft.core.current.util.BlockState; import net.minecraft.core.block.piston.BlockLogicPistonBase; @@ -243,6 +244,12 @@ public class BlockLogicConduit extends BlockLogic } } + return cycleFace(world, cTilePos, player, side, holdingConduit); + } + + private boolean cycleFace(final @NotNull World world, final @NotNull TilePosc cTilePos, final @Nullable Player player, final @NotNull Side side, final boolean holdingConduit) { + int cData = world.getBlockData(cTilePos); + if (isInert(cData)) { return false; } @@ -275,11 +282,16 @@ public class BlockLogicConduit extends BlockLogic world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, cTilePos.x(), cTilePos.y(), cTilePos.z(), "tile.activator.use", 1, 1.2f); world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, cTilePos.x(), cTilePos.y(), cTilePos.z(), "note.hat", 0.7f, 0.4f); - world.playBlockEvent(cTilePos, LevelListener.EVENT_CONDUIT_PORT_PARTICLES, packEventConduitData(side, getPower(nextData))); + world.playBlockEvent(cTilePos, LevelListener.EVENT_CONDUIT_PORT_PARTICLES, packEventConduitData(side, getPower(world, cTilePos))); return true; } + @Override + public void onActivatorInteracted(final @NotNull World world, final @NotNull TilePosc tilePos, final @NotNull TileEntityActivator activator, final @NotNull Direction direction) { + cycleFace(world, tilePos, null, direction.opposite().side(), false); + } + public static byte packEventConduitData(@Nullable Side side, int strength) { int s = Math.max(0, Math.min(PROPAGATION_LENGTH, strength)); int sideId = (side == null) ? 0 : (side.id & 0x07); diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java index e25bdcd7a..a820462d5 100644 --- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java +++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java @@ -30,10 +30,10 @@ public class BlockLogicStone extends BlockLogic { super.onHarvest(world, player, tilePos, data, tileEntity); if ( player.getStat(Blocks.STONE.getStat(StatList.STAT_MINED)) > 0 && - player.getStat(Blocks.BASALT.getStat(StatList.STAT_MINED)) > 0 && - player.getStat(Blocks.GRANITE.getStat(StatList.STAT_MINED)) > 0 && - player.getStat(Blocks.LIMESTONE.getStat(StatList.STAT_MINED)) > 0 && - player.getStat(Blocks.PERMAFROST.getStat(StatList.STAT_MINED)) > 0) { + player.getStat(Blocks.BASALT.getStat(StatList.STAT_MINED)) > 0 && + player.getStat(Blocks.GRANITE.getStat(StatList.STAT_MINED)) > 0 && + player.getStat(Blocks.LIMESTONE.getStat(StatList.STAT_MINED)) > 0 && + player.getStat(Blocks.PERMAFROST.getStat(StatList.STAT_MINED)) > 0) { player.triggerAchievement(Achievements.COLLECT_STONE); } diff --git a/game/core/src/main/java/net/minecraft/core/entity/Entity.java b/game/core/src/main/java/net/minecraft/core/entity/Entity.java index cde2b08d2..ebba016a8 100644 --- a/game/core/src/main/java/net/minecraft/core/entity/Entity.java +++ b/game/core/src/main/java/net/minecraft/core/entity/Entity.java @@ -479,46 +479,44 @@ public abstract class Entity double oldZd = zd; workingBox3.set(this.bb); - double bbWidth = this.bb.maxX - this.bb.minX - 0.05; - if (isSneaking()) { // Edge safety behavior - workingBox1.setMin(this.bb.minX, this.bb.minY - 1.0, this.bb.minZ); - workingBox1.setMax(this.bb.maxX, this.bb.minY, this.bb.maxZ); - MathHelper.aabbExpand(workingBox1, xd, 0.0, zd, workingBox1); - List collidingBoxes = this.world.getCubes(this, workingBox1); - if (!collidingBoxes.isEmpty()) { - if (xd != 0.0) { - double limitX = 0.0; - for (int i = 0; i < collidingBoxes.size(); i++) { - AABBdc bb1 = collidingBoxes.get(i); - if (xd < 0.0) { - limitX = Math.min(limitX, bb1.minX() - bbWidth - this.bb.minX); - } else { - limitX = Math.max(limitX, bb1.maxX() + bbWidth - this.bb.maxX); - } - } - if (xd < 0.0) { - oldXd = xd = Math.max(xd, limitX); - } else { - oldXd = xd = Math.min(xd, limitX); - } + if (this.onGround && isSneaking()) { // Edge safety behavior + double shrinkStep = 0.05; + while (xd != 0.0 && this.world.getCubes(this, workingBox1.set(this.bb).translate(xd, -1.0, 0.0)).isEmpty()) { + if (xd < shrinkStep && xd >= -shrinkStep) { + xd = 0.0; + } else if (xd > 0.0) { + xd -= shrinkStep; + } else { + xd += shrinkStep; } - if (zd != 0.0) { - double limitZ = 0.0; - for (int i = 0; i < collidingBoxes.size(); i++) { - AABBdc bb1 = collidingBoxes.get(i); - if (zd < 0.0) { - limitZ = Math.min(limitZ, bb1.minZ() - bbWidth - this.bb.minZ); - } else { - limitZ = Math.max(limitZ, bb1.maxZ() + bbWidth - this.bb.maxZ); - } - } - if (zd < 0.0) { - oldZd = zd = Math.max(zd, limitZ); - } else { - oldZd = zd = Math.min(zd, limitZ); - } + } + while (zd != 0.0 && this.world.getCubes(this, workingBox1.set(this.bb).translate(0.0, -1.0, zd)).isEmpty()) { + if (zd < shrinkStep && zd >= -shrinkStep) { + zd = 0.0; + } else if (zd > 0.0) { + zd -= shrinkStep; + } else { + zd += shrinkStep; + } + } + while (xd != 0.0 && zd != 0.0 && this.world.getCubes(this, workingBox1.set(this.bb).translate(xd, -1.0, zd)).isEmpty()) { + if (xd < shrinkStep && xd >= -shrinkStep) { + xd = 0.0; + } else if (xd > 0.0) { + xd -= shrinkStep; + } else { + xd += shrinkStep; + } + if (zd < shrinkStep && zd >= -shrinkStep) { + zd = 0.0; + } else if (zd > 0.0) { + zd -= shrinkStep; + } else { + zd += shrinkStep; } } + oldXd = xd; + oldZd = zd; } List cubes = this.world.getCubes(this, MathHelper.aabbExpand(this.bb, xd, yd, zd, workingBox2)); diff --git a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java index 630ef0df8..dbeb39bd4 100644 --- a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java +++ b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java @@ -622,9 +622,9 @@ public abstract class Player float progress = (float) (tier - 1) / (float) (ACID_CYCLE_MAX - 1); - float curve = (float) Math.sqrt(progress); + float curve = (float) Math.pow(progress, 2D); - final float multiplier = 1.0F + (curve * 0.45F); + final float multiplier = 1.0F + (curve * 5.0F); return Math.max(1, (int) Math.ceil(base * multiplier)); } @@ -1655,18 +1655,15 @@ public abstract class Player * Categorizes the player into Close, Medium, or Far range based on maxRadius, * playing a different sound for each tier. */ - public void handleThermalPing(Player player, double ventCoordinateX, double ventCoordinateY, double ventCoordinateZ, double maxRadius) { - double distanceSquared = this.distanceToSqr(ventCoordinateX, ventCoordinateY, ventCoordinateZ); - double distance = Math.sqrt(distanceSquared); - - double oneFifthOfRadius = maxRadius * 0.2; - double threeFifthsOfRadius = maxRadius * 0.6; + public void handleThermalPing(@NotNull Player player, double ventCoordinateX, double ventCoordinateY, double ventCoordinateZ, double maxRadius) { + double distance = Math.sqrt( + distanceToSqr(ventCoordinateX, ventCoordinateY, ventCoordinateZ) + ); boolean isNether = player.world.getWorldType().hasTag(WorldTypeTags.NETHER); - float randomizedPitch = 0.8F + (this.world.rand.nextFloat() - this.world.rand.nextFloat()) * 0.45F; - if (distance <= oneFifthOfRadius) { + if (distance <= maxRadius * 0.2) { player.playSoundToSelf(SoundCategory.WORLD_SOUNDS, ventCoordinateX, ventCoordinateY, ventCoordinateZ, "tile.crumble", 20.0F, randomizedPitch); @@ -1676,7 +1673,7 @@ public abstract class Player "tile.deepboom", 20.0F, randomizedPitch); } } - else if (distance <= threeFifthsOfRadius) { + else if (distance <= maxRadius * 0.6) { player.playSoundToSelf(SoundCategory.WORLD_SOUNDS, ventCoordinateX, ventCoordinateY, ventCoordinateZ, "tile.deepcrumble", 20.0F, randomizedPitch); @@ -1709,7 +1706,7 @@ public abstract class Player } - public void setGamemodeOnLogin(Gamemode gamemode) { + public void setGamemodeOnLogin(@NotNull Gamemode gamemode) { this.gamemode = gamemode; MenuInventory newContainer = gamemode.getInventoryMenu(this.inventory); @@ -1724,7 +1721,7 @@ public abstract class Player this.fireImmune = gamemode.hasFireImmunity(); } - public void setGamemode(Gamemode gamemode) { + public void setGamemode(@NotNull Gamemode gamemode) { this.gamemode = gamemode; this.fireImmune = gamemode.hasFireImmunity(); } diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java index 5cd09ac5e..952dd129d 100644 --- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java +++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java @@ -5,6 +5,7 @@ import net.minecraft.core.entity.player.Player; import net.minecraft.core.item.ItemStack; import net.minecraft.core.net.handler.PacketHandler; import net.minecraft.core.util.helper.MathHelper; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.*; @@ -32,7 +33,7 @@ public class PacketAddPlayer extends Packet super(); } - public PacketAddPlayer(final Player entityplayer) { + public PacketAddPlayer(final @NotNull Player entityplayer) { super(); this.entityId = entityplayer.id; this.name = entityplayer.username; @@ -44,7 +45,7 @@ public class PacketAddPlayer extends Packet this.pitch = (byte) (int) ((entityplayer.xRot * 256F) / 360F); final ItemStack itemstack = entityplayer.inventory.getCurrentItem(); this.currentItem = itemstack != null ? itemstack.itemID : 0; - this.nickname = entityplayer.getDisplayName(); + this.nickname = entityplayer.nickname; this.chatColor = entityplayer.chatColor; this.playerConfig = entityplayer.playerConfig.config; if (entityplayer.getHeldObject() == null) { diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java index dfccd0666..138522bac 100644 --- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java +++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java @@ -1,6 +1,7 @@ package net.minecraft.core.net.packet; import net.minecraft.core.net.handler.PacketHandler; +import org.jetbrains.annotations.NotNull; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -25,19 +26,21 @@ public class PacketEntityNickname extends Packet @Override public int getEstimatedSize() { - return 4 + nickname.length() + 1; + return 4 + 2 + (nickname.length() * 2) + 1; } @Override - public void read(DataInputStream dis) throws IOException + public void read(@NotNull DataInputStream dis) throws IOException { + entityId = dis.readInt(); nickname = readStringUTF16BE(dis, MAX_NICKNAME_SIZE); chatColor = dis.readByte(); } @Override - public void write(DataOutputStream dos) throws IOException + public void write(@NotNull DataOutputStream dos) throws IOException { + dos.writeInt(entityId); writeStringUTF16BE(nickname, dos); dos.writeByte(chatColor); } diff --git a/game/core/src/main/java/net/minecraft/core/world/World.java b/game/core/src/main/java/net/minecraft/core/world/World.java index b6a74bc6c..84197e86c 100644 --- a/game/core/src/main/java/net/minecraft/core/world/World.java +++ b/game/core/src/main/java/net/minecraft/core/world/World.java @@ -1332,7 +1332,9 @@ public abstract class World implements MutableWorldSource { final boolean flag = entity instanceof Player; if (flag || this.isChunkLoaded(i, j)) { if (entity instanceof final Player entityplayer) { - this.players.add(entityplayer); + if (!this.players.contains(entityplayer)) { + this.players.add(entityplayer); + } this.updateEnoughPlayersSleepingFlag(null); } @@ -1731,6 +1733,7 @@ public abstract class World implements MutableWorldSource { for (int i = 0; i < list.size(); i++) { final Entity entity = list.get(i); if (entity instanceof MobFireflyCluster) continue; + if (entity.hasNoPhysics()) continue; if (!entity.removed && entity.blocksBuilding) { return false; } diff --git a/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang b/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang index b5b68bd73..6e960fba6 100644 --- a/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang +++ b/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang @@ -99,6 +99,7 @@ options.animations.procedural=Procedural options.animations.off=Off options.autoHit=Auto Hit options.easyBridge=Easy Bridge +options.easyBridgeOutline=Easy Bridge Outline options.controller=Controller... options.controllerSensitivity=Sensitivity options.controllerMenuSensitivity=Menu Sensitivity diff --git a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java index 8bcccd211..e7b04940d 100644 --- a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java +++ b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java @@ -111,6 +111,11 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry { trackedEntity.y = (double)entityY / 32D; trackedEntity.z = (double)entityZ / 32D; packet = new PacketTeleportEntity(trackedEntity.id, entityX, entityY, entityZ, (byte)entityYaw, (byte)entityPitch); + encodedPosX = entityX; + encodedPosY = entityY; + encodedPosZ = entityZ; + encodedRotationYaw = entityYaw; + encodedRotationPitch = entityPitch; } else if(hasMoved && hasLooked) { packet = new PacketMoveEntity.PosRot(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz, (byte)entityYaw, (byte)entityPitch); } else if(hasMoved) { @@ -210,6 +215,9 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry { if(!trackedPlayers.contains(playerServer)) { trackedPlayers.add(playerServer); playerServer.playerNetServerHandler.sendPacket(NetEntityHandler.getSpawnPacket(this)); + if(encodedPosX != MathHelper.floor(trackedEntity.x * 32D) || encodedPosY != MathHelper.floor(trackedEntity.y * 32D) || encodedPosZ != MathHelper.floor(trackedEntity.z * 32D)) { + ticksSinceLastTeleport = 400; + } if (trackedEntity.sendAdditionalData) { playerServer.playerNetServerHandler.sendPacket(new PacketEntityTagData(trackedEntity)); } diff --git a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java index d3a971d4e..893fb3a86 100644 --- a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java +++ b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java @@ -49,8 +49,10 @@ public class EntityTrackerImpl implements EntityTracker { if(trackingDistance > maxTrackingDistanceThreshold) { trackingDistance = maxTrackingDistanceThreshold; } - if(trackedEntityHashTable.containsValue(entity.id)) { - throw new IllegalStateException("Entity is already tracked!"); + EntityTrackerEntryImpl staleEntry = trackedEntityHashTable.remove(entity.id); + if(staleEntry != null) { + trackedEntitySet.remove(staleEntry); + staleEntry.sendDestroyEntityPacketToTrackedPlayers(); } EntityTrackerEntryImpl trackerEntry = new EntityTrackerEntryImpl(entity, trackingDistance, movementPacketDelay, shouldSendMotionUpdates); trackedEntitySet.add(trackerEntry); diff --git a/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java b/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java index bb0bb3cc3..dbad29c07 100644 --- a/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java +++ b/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java @@ -13,7 +13,6 @@ import net.minecraft.core.enums.EnumSleepStatus; import net.minecraft.core.item.Item; import net.minecraft.core.item.IComplexItem; import net.minecraft.core.item.ItemStack; -import net.minecraft.core.lang.I18n; import com.mojang.nbt.tags.CompoundTag; import net.minecraft.core.net.command.TextFormatting; import net.minecraft.core.player.inventory.container.Container; @@ -98,7 +97,7 @@ public class PlayerServer extends Player implements ContainerListener { } @Override - public void setGamemode(Gamemode gamemode) + public void setGamemode(@NotNull Gamemode gamemode) { mcServer.playerList.sendPacketToAllPlayers(new PacketPlayerGamemode(this.id, gamemode.getId())); this.gamemode = gamemode; @@ -319,6 +318,7 @@ public class PlayerServer extends Player implements ContainerListener { loadedChunks.remove(chunkCoord); ChunkPos sentChunkPos = new ChunkPos(chunkCoord.x, chunkCoord.z); if (worldserver.isChunkLoaded(sentChunkPos)) { + worldserver.getChunkProvider().ensureDecorated(sentChunkPos); worldserver.getChunk(sentChunkPos, true).sentToClients = true; } playerNetServerHandler.sendPacket(new PacketBlockRegionUpdate(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, Chunk.CHUNK_SIZE_Z, worldserver)); diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java index 33e7512a1..f76ca3905 100644 --- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java +++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java @@ -302,6 +302,8 @@ public class CommandColor implements CommandManager.CommandRegistry { if (player == null) throw CommandExceptions.notInWorld().create(); player.chatColor = colorId; + player.hadNicknameSet = true; + player.mcServer.playerList.updatePlayerProfile(player.username, player.nickname, player.uuid, player.score, player.chatColor, true, player.isOperator()); TextFormatting color = TextFormatting.get(colorId); if (player == source.getSender()) { source.sendTranslatableMessage("command.commands.color.set.success", color + color.getNames()[0]); diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java index e33cd7990..6fc689561 100644 --- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java +++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java @@ -89,7 +89,7 @@ public class CommandNickname implements CommandManager.CommandRegistry { PlayerServer player = (PlayerServer) entities.get(0); player.nickname = ""; - player.hadNicknameSet = false; + player.hadNicknameSet = true; player.mcServer.playerList.updatePlayerProfile(player.username, player.nickname, player.uuid, player.score, player.chatColor, true, player.isOperator()); if (source.getSender() == player) { source.sendTranslatableMessage("command.commands.nickname.reset.success"); @@ -107,7 +107,7 @@ public class CommandNickname implements CommandManager.CommandRegistry { if (player == null) throw CommandExceptions.notInWorld().create(); player.nickname = ""; - player.hadNicknameSet = false; + player.hadNicknameSet = true; player.mcServer.playerList.updatePlayerProfile(player.username, player.nickname, player.uuid, player.score, player.chatColor, true, player.isOperator()); source.sendTranslatableMessage("command.commands.nickname.reset.success", player.username); diff --git a/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java b/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java index 92fef2466..35941efe0 100644 --- a/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java +++ b/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java @@ -214,16 +214,62 @@ public class ChunkProviderServer if (this.chunkGenerator != null) { this.decorating = true; this.warnedRecursiveGeneration = false; + final boolean wasDecorating = this.world.isDecorating; + this.world.isDecorating = true; try { this.chunkGenerator.decorate(chunk); } finally { this.decorating = false; + this.world.isDecorating = wasDecorating; } chunk.setChunkModified(); } } } + public void ensureDecorated(@NotNull ChunkPosc chunkPos) { + if (this.decorating || this.chunkGenerator == null) { + return; + } + final List scratchChunks = new ArrayList<>(); + for (int ownerDx = -1; ownerDx <= 0; ownerDx++) { + for (int ownerDz = -1; ownerDz <= 0; ownerDz++) { + final ChunkPos ownerPos = new ChunkPos(chunkPos.x() + ownerDx, chunkPos.z() + ownerDz); + Chunk owner = this.chunkMap.get(ownerPos); + if (owner == null) { + scratchChunks.add(ownerPos); + owner = prepareChunk(ownerPos, true); + } + if (owner.isTerrainPopulated) { + continue; + } + + //populate requires the +x, +z and +xz chunks to be present + for (int dx = 0; dx <= 1; dx++) { + for (int dz = 0; dz <= 1; dz++) { + if (dx == 0 && dz == 0) { + continue; + } + final ChunkPos neighbourPos = new ChunkPos(ownerPos.x + dx, ownerPos.z + dz); + if (!this.chunkMap.containsKey(neighbourPos)) { + scratchChunks.add(neighbourPos); + prepareChunk(neighbourPos, true); + } + } + } + populate(ownerPos); + + } + } + + for (final ChunkPos scratchPos : scratchChunks) { + if (scratchPos.x != chunkPos.x() || scratchPos.z != chunkPos.z()) { + dropChunk(scratchPos); + } + } + + } + @Override public boolean saveChunks(boolean saveImmediately, @Nullable ProgressListener progressListener) { saveImmediately |= this.world.mcServer.forceSaveAllChunksOnAutosave;