1.21.6 dev
Co-authored-by: Bjarne Koll <git@lynxplay.dev> Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com> Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Co-authored-by: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Co-authored-by: Noah van der Aa <ndvdaa@gmail.com> Co-authored-by: Owen1212055 <23108066+Owen1212055@users.noreply.github.com> Co-authored-by: Spottedleaf <Spottedleaf@users.noreply.github.com>
This commit is contained in:
committed by
Nassim Jahnke
parent
39203a65e0
commit
a24f9b204c
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/Main.java
|
||||
+++ b/net/minecraft/server/Main.java
|
||||
@@ -67,8 +_,10 @@
|
||||
@@ -68,8 +_,10 @@
|
||||
reason = "System.out needed before bootstrap"
|
||||
)
|
||||
@DontObfuscate
|
||||
@@ -12,7 +12,7 @@
|
||||
OptionParser optionParser = new OptionParser();
|
||||
OptionSpec<Void> optionSpec = optionParser.accepts("nogui");
|
||||
OptionSpec<Void> optionSpec1 = optionParser.accepts("initSettings", "Initializes 'server.properties' and 'eula.txt', then quits");
|
||||
@@ -93,41 +_,94 @@
|
||||
@@ -94,41 +_,94 @@
|
||||
optionParser.printHelpOn(System.err);
|
||||
return;
|
||||
}
|
||||
@@ -116,7 +116,7 @@
|
||||
Dynamic<?> dataTag;
|
||||
if (levelStorageAccess.hasWorldData()) {
|
||||
LevelSummary summary;
|
||||
@@ -169,12 +_,33 @@
|
||||
@@ -170,12 +_,33 @@
|
||||
}
|
||||
|
||||
Dynamic<?> dynamic = dataTag;
|
||||
@@ -141,7 +141,7 @@
|
||||
+ "pack_format": %d
|
||||
+ }
|
||||
+ }
|
||||
+ """.formatted(SharedConstants.getCurrentVersion().getPackVersion(net.minecraft.server.packs.PackType.SERVER_DATA))
|
||||
+ """.formatted(SharedConstants.getCurrentVersion().packVersion(net.minecraft.server.packs.PackType.SERVER_DATA))
|
||||
+ );
|
||||
+ } catch (java.io.IOException ex) {
|
||||
+ throw new RuntimeException("Could not initialize Bukkit datapack", ex);
|
||||
@@ -151,7 +151,7 @@
|
||||
|
||||
WorldStem worldStem;
|
||||
try {
|
||||
@@ -183,6 +_,7 @@
|
||||
@@ -184,6 +_,7 @@
|
||||
executor -> WorldLoader.load(
|
||||
initConfig,
|
||||
context -> {
|
||||
@@ -159,7 +159,7 @@
|
||||
Registry<LevelStem> registry = context.datapackDimensions().lookupOrThrow(Registries.LEVEL_STEM);
|
||||
if (dynamic != null) {
|
||||
LevelDataAndDimensions levelDataAndDimensions = LevelStorageSource.getLevelDataAndDimensions(
|
||||
@@ -196,7 +_,7 @@
|
||||
@@ -197,7 +_,7 @@
|
||||
LevelSettings levelSettings;
|
||||
WorldOptions worldOptions;
|
||||
WorldDimensions worldDimensions;
|
||||
@@ -168,7 +168,7 @@
|
||||
levelSettings = MinecraftServer.DEMO_SETTINGS;
|
||||
worldOptions = WorldOptions.DEMO_OPTIONS;
|
||||
worldDimensions = WorldPresets.createNormalWorldDimensions(context.datapackWorldgen());
|
||||
@@ -211,7 +_,7 @@
|
||||
@@ -212,7 +_,7 @@
|
||||
new GameRules(context.dataConfiguration().enabledFeatures()),
|
||||
context.dataConfiguration()
|
||||
);
|
||||
@@ -177,7 +177,7 @@
|
||||
worldDimensions = properties.createDimensions(context.datapackWorldgen());
|
||||
}
|
||||
|
||||
@@ -237,6 +_,7 @@
|
||||
@@ -238,6 +_,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
RegistryAccess.Frozen frozen = worldStem.registries().compositeAccess();
|
||||
WorldData worldData = worldStem.worldData();
|
||||
boolean hasOptionSpec1 = optionSet.has(optionSpec6);
|
||||
@@ -245,9 +_,13 @@
|
||||
@@ -246,9 +_,13 @@
|
||||
}
|
||||
|
||||
levelStorageAccess.saveDataTag(frozen, worldData);
|
||||
@@ -199,7 +199,7 @@
|
||||
thread1,
|
||||
levelStorageAccess,
|
||||
packRepository,
|
||||
@@ -257,17 +_,34 @@
|
||||
@@ -258,18 +_,36 @@
|
||||
services,
|
||||
LoggerChunkProgressListener::createFromGameruleRadius
|
||||
);
|
||||
@@ -221,14 +221,16 @@
|
||||
if (flag && !GraphicsEnvironment.isHeadless()) {
|
||||
dedicatedServer1.showGui();
|
||||
}
|
||||
|
||||
+ // Paper start
|
||||
+ if (optionSet.has("port")) {
|
||||
+ int port = (Integer) optionSet.valueOf("port");
|
||||
+ if (port > 0) {
|
||||
+ dedicatedServer1.setPort(port);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // Paper end
|
||||
|
||||
GameTestTicker.SINGLETON.startTicking();
|
||||
return dedicatedServer1;
|
||||
}
|
||||
);
|
||||
@@ -236,7 +238,7 @@
|
||||
Thread thread = new Thread("Server Shutdown Thread") {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -276,6 +_,7 @@
|
||||
@@ -278,6 +_,7 @@
|
||||
};
|
||||
thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LOGGER));
|
||||
Runtime.getRuntime().addShutdownHook(thread);
|
||||
@@ -244,7 +246,7 @@
|
||||
} catch (Exception var42) {
|
||||
LOGGER.error(LogUtils.FATAL_MARKER, "Failed to start the minecraft server", (Throwable)var42);
|
||||
}
|
||||
@@ -317,7 +_,7 @@
|
||||
@@ -319,7 +_,7 @@
|
||||
RegistryAccess registryAccess,
|
||||
boolean recreateRegionFiles
|
||||
) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/net/minecraft/server/MinecraftServer.java
|
||||
@@ -173,11 +_,13 @@
|
||||
@@ -174,11 +_,13 @@
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTask> implements ServerInfo, ChunkIOErrorReporter, CommandSource {
|
||||
@@ -15,7 +15,7 @@
|
||||
private static final int OVERLOADED_TICKS_THRESHOLD = 20;
|
||||
private static final long OVERLOADED_WARNING_INTERVAL_NANOS = 10L * TimeUtil.NANOSECONDS_PER_SECOND;
|
||||
private static final int OVERLOADED_TICKS_WARNING_INTERVAL = 100;
|
||||
@@ -217,6 +_,7 @@
|
||||
@@ -218,6 +_,7 @@
|
||||
private Map<ResourceKey<Level>, ServerLevel> levels = Maps.newLinkedHashMap();
|
||||
private PlayerList playerList;
|
||||
private volatile boolean running = true;
|
||||
@@ -23,7 +23,7 @@
|
||||
private boolean stopped;
|
||||
private int tickCount;
|
||||
private int ticksUntilAutosave = 6000;
|
||||
@@ -225,11 +_,15 @@
|
||||
@@ -226,11 +_,15 @@
|
||||
private boolean preventProxyConnections;
|
||||
private boolean pvp;
|
||||
private boolean allowFlight;
|
||||
@@ -41,7 +41,7 @@
|
||||
@Nullable
|
||||
private KeyPair keyPair;
|
||||
@Nullable
|
||||
@@ -270,10 +_,37 @@
|
||||
@@ -271,10 +_,37 @@
|
||||
private final SuppressedExceptionCollector suppressedExceptions = new SuppressedExceptionCollector();
|
||||
private final DiscontinuousFrame tickFrame;
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
if (Runtime.getRuntime().availableProcessors() > 4) {
|
||||
thread.setPriority(8);
|
||||
}
|
||||
@@ -285,6 +_,10 @@
|
||||
@@ -286,6 +_,10 @@
|
||||
}
|
||||
|
||||
public MinecraftServer(
|
||||
@@ -91,7 +91,7 @@
|
||||
Thread serverThread,
|
||||
LevelStorageSource.LevelStorageAccess storageSource,
|
||||
PackRepository packRepository,
|
||||
@@ -295,9 +_,10 @@
|
||||
@@ -296,9 +_,10 @@
|
||||
ChunkProgressListenerFactory progressListenerFactory
|
||||
) {
|
||||
super("Server");
|
||||
@@ -103,7 +103,7 @@
|
||||
throw new IllegalStateException("Missing Overworld dimension data");
|
||||
} else {
|
||||
this.proxy = proxy;
|
||||
@@ -308,7 +_,7 @@
|
||||
@@ -309,7 +_,7 @@
|
||||
services.profileCache().setExecutor(this);
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
this.tickRateManager = new ServerTickRateManager(this);
|
||||
this.progressListenerFactory = progressListenerFactory;
|
||||
this.storageSource = storageSource;
|
||||
@@ -327,6 +_,38 @@
|
||||
@@ -328,6 +_,38 @@
|
||||
this.fuelValues = FuelValues.vanillaBurnTimes(this.registries.compositeAccess(), this.worldData.enabledFeatures());
|
||||
this.tickFrame = TracyClient.createDiscontinuousFrame("Server Tick");
|
||||
}
|
||||
@@ -151,7 +151,7 @@
|
||||
}
|
||||
|
||||
private void readScoreboard(DimensionDataStorage dataStorage) {
|
||||
@@ -335,18 +_,13 @@
|
||||
@@ -336,18 +_,13 @@
|
||||
|
||||
protected abstract boolean initServer() throws IOException;
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
if (profiledDuration != null) {
|
||||
profiledDuration.finish(true);
|
||||
}
|
||||
@@ -363,25 +_,265 @@
|
||||
@@ -364,25 +_,265 @@
|
||||
protected void forceDifficulty() {
|
||||
}
|
||||
|
||||
@@ -457,7 +457,7 @@
|
||||
if (!serverLevelData.isInitialized()) {
|
||||
try {
|
||||
setInitialSpawn(serverLevel, serverLevelData, worldOptions.generateBonusChest(), isDebugWorld);
|
||||
@@ -402,47 +_,30 @@
|
||||
@@ -403,47 +_,30 @@
|
||||
|
||||
serverLevelData.setInitialized(true);
|
||||
}
|
||||
@@ -522,7 +522,7 @@
|
||||
int spawnHeight = chunkSource.getGenerator().getSpawnHeight(level);
|
||||
if (spawnHeight < level.getMinY()) {
|
||||
BlockPos worldPosition = chunkPos.getWorldPosition();
|
||||
@@ -494,36 +_,48 @@
|
||||
@@ -495,36 +_,48 @@
|
||||
serverLevelData.setGameType(GameType.SPECTATOR);
|
||||
}
|
||||
|
||||
@@ -582,7 +582,7 @@
|
||||
}
|
||||
|
||||
public GameType getDefaultGameType() {
|
||||
@@ -552,11 +_,14 @@
|
||||
@@ -553,11 +_,14 @@
|
||||
flag = true;
|
||||
}
|
||||
|
||||
@@ -597,7 +597,7 @@
|
||||
if (flush) {
|
||||
for (ServerLevel serverLevel2 : this.getAllLevels()) {
|
||||
LOGGER.info("ThreadedAnvilChunkStorage ({}): All chunks are saved", serverLevel2.getChunkSource().chunkMap.getStorageName());
|
||||
@@ -586,18 +_,48 @@
|
||||
@@ -587,18 +_,48 @@
|
||||
this.stopServer();
|
||||
}
|
||||
|
||||
@@ -647,7 +647,7 @@
|
||||
}
|
||||
|
||||
LOGGER.info("Saving worlds");
|
||||
@@ -639,6 +_,25 @@
|
||||
@@ -640,6 +_,25 @@
|
||||
} catch (IOException var4) {
|
||||
LOGGER.error("Failed to unlock level {}", this.storageSource.getLevelId(), var4);
|
||||
}
|
||||
@@ -673,7 +673,7 @@
|
||||
}
|
||||
|
||||
public String getLocalIp() {
|
||||
@@ -654,6 +_,14 @@
|
||||
@@ -655,6 +_,14 @@
|
||||
}
|
||||
|
||||
public void halt(boolean waitForServer) {
|
||||
@@ -688,7 +688,7 @@
|
||||
this.running = false;
|
||||
if (waitForServer) {
|
||||
try {
|
||||
@@ -664,6 +_,57 @@
|
||||
@@ -665,6 +_,57 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -746,7 +746,7 @@
|
||||
protected void runServer() {
|
||||
try {
|
||||
if (!this.initServer()) {
|
||||
@@ -674,6 +_,35 @@
|
||||
@@ -675,6 +_,35 @@
|
||||
this.statusIcon = this.loadStatusIcon().orElse(null);
|
||||
this.status = this.buildServerStatus();
|
||||
|
||||
@@ -782,7 +782,7 @@
|
||||
while (this.running) {
|
||||
long l;
|
||||
if (!this.isPaused() && this.tickRateManager.isSprinting() && this.tickRateManager.checkShouldSprintThisTick()) {
|
||||
@@ -686,11 +_,30 @@
|
||||
@@ -687,11 +_,30 @@
|
||||
if (l1 > OVERLOADED_THRESHOLD_NANOS + 20L * l
|
||||
&& this.nextTickTimeNanos - this.lastOverloadWarningNanos >= OVERLOADED_WARNING_INTERVAL_NANOS + 100L * l) {
|
||||
long l2 = l1 / l;
|
||||
@@ -813,7 +813,7 @@
|
||||
|
||||
boolean flag = l == 0L;
|
||||
if (this.debugCommandProfilerDelayStart) {
|
||||
@@ -698,6 +_,8 @@
|
||||
@@ -699,6 +_,8 @@
|
||||
this.debugCommandProfiler = new MinecraftServer.TimeProfiler(Util.getNanos(), this.tickCount);
|
||||
}
|
||||
|
||||
@@ -822,7 +822,7 @@
|
||||
this.nextTickTimeNanos += l;
|
||||
|
||||
try (Profiler.Scope scope = Profiler.use(this.createProfiler())) {
|
||||
@@ -748,7 +_,7 @@
|
||||
@@ -749,7 +_,7 @@
|
||||
this.services.profileCache().clearExecutor();
|
||||
}
|
||||
|
||||
@@ -831,7 +831,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -800,7 +_,14 @@
|
||||
@@ -801,7 +_,14 @@
|
||||
}
|
||||
|
||||
private boolean haveTime() {
|
||||
@@ -847,7 +847,7 @@
|
||||
}
|
||||
|
||||
public static boolean throwIfFatalException() {
|
||||
@@ -845,6 +_,12 @@
|
||||
@@ -846,6 +_,12 @@
|
||||
|
||||
@Override
|
||||
public TickTask wrapRunnable(Runnable runnable) {
|
||||
@@ -860,7 +860,7 @@
|
||||
return new TickTask(this.tickCount, runnable);
|
||||
}
|
||||
|
||||
@@ -864,15 +_,16 @@
|
||||
@@ -865,15 +_,16 @@
|
||||
if (super.pollTask()) {
|
||||
return true;
|
||||
} else {
|
||||
@@ -879,7 +879,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -920,26 +_,44 @@
|
||||
@@ -921,26 +_,44 @@
|
||||
}
|
||||
|
||||
public void tickServer(BooleanSupplier hasTimeLeft) {
|
||||
@@ -925,7 +925,7 @@
|
||||
this.tickCount++;
|
||||
this.tickRateManager.tick();
|
||||
this.tickChildren(hasTimeLeft);
|
||||
@@ -949,11 +_,19 @@
|
||||
@@ -950,11 +_,19 @@
|
||||
}
|
||||
|
||||
this.ticksUntilAutosave--;
|
||||
@@ -946,7 +946,7 @@
|
||||
profilerFiller.push("tallying");
|
||||
long l = Util.getNanos() - nanos;
|
||||
int i1 = this.tickCount % 100;
|
||||
@@ -961,12 +_,17 @@
|
||||
@@ -962,12 +_,17 @@
|
||||
this.aggregatedTickTimesNanos += l;
|
||||
this.tickTimesNanos[i1] = l;
|
||||
this.smoothedTickTimeMillis = this.smoothedTickTimeMillis * 0.8F + (float)l / (float)TimeUtil.NANOSECONDS_PER_MILLISECOND * 0.19999999F;
|
||||
@@ -965,7 +965,7 @@
|
||||
LOGGER.debug("Autosave started");
|
||||
ProfilerFiller profilerFiller = Profiler.get();
|
||||
profilerFiller.push("save");
|
||||
@@ -1008,7 +_,7 @@
|
||||
@@ -1009,7 +_,7 @@
|
||||
private ServerStatus buildServerStatus() {
|
||||
ServerStatus.Players players = this.buildPlayerStatus();
|
||||
return new ServerStatus(
|
||||
@@ -974,7 +974,7 @@
|
||||
Optional.of(players),
|
||||
Optional.of(ServerStatus.Version.current()),
|
||||
Optional.ofNullable(this.statusIcon),
|
||||
@@ -1022,7 +_,7 @@
|
||||
@@ -1023,7 +_,7 @@
|
||||
if (this.hidesOnlinePlayers()) {
|
||||
return new ServerStatus.Players(maxPlayers, players.size(), List.of());
|
||||
} else {
|
||||
@@ -983,7 +983,7 @@
|
||||
ObjectArrayList<GameProfile> list = new ObjectArrayList<>(min);
|
||||
int randomInt = Mth.nextInt(this.random, 0, players.size() - min);
|
||||
|
||||
@@ -1039,17 +_,66 @@
|
||||
@@ -1040,17 +_,66 @@
|
||||
protected void tickChildren(BooleanSupplier hasTimeLeft) {
|
||||
ProfilerFiller profilerFiller = Profiler.get();
|
||||
this.getPlayerList().getPlayers().forEach(serverPlayer1 -> serverPlayer1.connection.suspendFlushing());
|
||||
@@ -1050,7 +1050,7 @@
|
||||
|
||||
profilerFiller.push("tick");
|
||||
|
||||
@@ -1063,7 +_,9 @@
|
||||
@@ -1064,7 +_,9 @@
|
||||
|
||||
profilerFiller.pop();
|
||||
profilerFiller.pop();
|
||||
@@ -1060,7 +1060,7 @@
|
||||
|
||||
profilerFiller.popPush("connection");
|
||||
this.tickConnection();
|
||||
@@ -1141,6 +_,22 @@
|
||||
@@ -1142,6 +_,22 @@
|
||||
return this.levels.get(dimension);
|
||||
}
|
||||
|
||||
@@ -1083,7 +1083,7 @@
|
||||
public Set<ResourceKey<Level>> levelKeys() {
|
||||
return this.levels.keySet();
|
||||
}
|
||||
@@ -1170,7 +_,7 @@
|
||||
@@ -1171,7 +_,7 @@
|
||||
|
||||
@DontObfuscate
|
||||
public String getServerModName() {
|
||||
@@ -1092,7 +1092,7 @@
|
||||
}
|
||||
|
||||
public SystemReport fillSystemReport(SystemReport systemReport) {
|
||||
@@ -1205,7 +_,7 @@
|
||||
@@ -1206,7 +_,7 @@
|
||||
|
||||
@Override
|
||||
public void sendSystemMessage(Component component) {
|
||||
@@ -1101,7 +1101,7 @@
|
||||
}
|
||||
|
||||
public KeyPair getKeyPair() {
|
||||
@@ -1243,11 +_,14 @@
|
||||
@@ -1244,11 +_,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1121,7 +1121,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1257,7 +_,7 @@
|
||||
@@ -1258,7 +_,7 @@
|
||||
|
||||
private void updateMobSpawningFlags() {
|
||||
for (ServerLevel serverLevel : this.getAllLevels()) {
|
||||
@@ -1130,7 +1130,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1333,10 +_,20 @@
|
||||
@@ -1334,10 +_,20 @@
|
||||
|
||||
@Override
|
||||
public String getMotd() {
|
||||
@@ -1152,7 +1152,7 @@
|
||||
this.motd = motd;
|
||||
}
|
||||
|
||||
@@ -1359,7 +_,7 @@
|
||||
@@ -1360,7 +_,7 @@
|
||||
}
|
||||
|
||||
public ServerConnectionListener getConnection() {
|
||||
@@ -1161,7 +1161,7 @@
|
||||
}
|
||||
|
||||
public boolean isReady() {
|
||||
@@ -1445,7 +_,7 @@
|
||||
@@ -1446,7 +_,7 @@
|
||||
@Override
|
||||
public void executeIfPossible(Runnable task) {
|
||||
if (this.isStopped()) {
|
||||
@@ -1170,7 +1170,7 @@
|
||||
} else {
|
||||
super.executeIfPossible(task);
|
||||
}
|
||||
@@ -1484,7 +_,14 @@
|
||||
@@ -1485,7 +_,14 @@
|
||||
return this.functionManager;
|
||||
}
|
||||
|
||||
@@ -1185,7 +1185,7 @@
|
||||
CompletableFuture<Void> completableFuture = CompletableFuture.<ImmutableList>supplyAsync(
|
||||
() -> selectedIds.stream().map(this.packRepository::getPack).filter(Objects::nonNull).map(Pack::open).collect(ImmutableList.toImmutableList()),
|
||||
this
|
||||
@@ -1492,7 +_,7 @@
|
||||
@@ -1493,7 +_,7 @@
|
||||
.thenCompose(
|
||||
list -> {
|
||||
CloseableResourceManager closeableResourceManager = new MultiPackResourceManager(PackType.SERVER_DATA, list);
|
||||
@@ -1194,7 +1194,7 @@
|
||||
return ReloadableServerResources.loadResources(
|
||||
closeableResourceManager,
|
||||
this.registries,
|
||||
@@ -1513,20 +_,39 @@
|
||||
@@ -1514,20 +_,39 @@
|
||||
)
|
||||
.thenAcceptAsync(
|
||||
reloadableResources -> {
|
||||
@@ -1236,7 +1236,7 @@
|
||||
},
|
||||
this
|
||||
);
|
||||
@@ -1543,7 +_,7 @@
|
||||
@@ -1544,7 +_,7 @@
|
||||
DataPackConfig dataPackConfig = initialDataConfig.dataPacks();
|
||||
FeatureFlagSet featureFlagSet = initMode ? FeatureFlagSet.of() : initialDataConfig.enabledFeatures();
|
||||
FeatureFlagSet featureFlagSet1 = initMode ? FeatureFlags.REGISTRY.allFlags() : initialDataConfig.enabledFeatures();
|
||||
@@ -1245,7 +1245,7 @@
|
||||
if (safeMode) {
|
||||
return configureRepositoryWithSelection(packRepository, List.of("vanilla"), featureFlagSet, false);
|
||||
} else {
|
||||
@@ -1598,7 +_,7 @@
|
||||
@@ -1599,7 +_,7 @@
|
||||
private static WorldDataConfiguration configureRepositoryWithSelection(
|
||||
PackRepository packRepository, Collection<String> selectedPacks, FeatureFlagSet enabledFeatures, boolean safeMode
|
||||
) {
|
||||
@@ -1254,7 +1254,7 @@
|
||||
enableForcedFeaturePacks(packRepository, enabledFeatures);
|
||||
DataPackConfig selectedPacks1 = getSelectedPacks(packRepository, safeMode);
|
||||
FeatureFlagSet featureFlagSet = packRepository.getRequestedFeatureFlags().join(enabledFeatures);
|
||||
@@ -1630,7 +_,7 @@
|
||||
@@ -1631,7 +_,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1263,7 +1263,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1644,11 +_,12 @@
|
||||
@@ -1645,11 +_,12 @@
|
||||
public void kickUnlistedPlayers(CommandSourceStack commandSource) {
|
||||
if (this.isEnforceWhitelist()) {
|
||||
PlayerList playerList = commandSource.getServer().getPlayerList();
|
||||
@@ -1278,7 +1278,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1852,6 +_,17 @@
|
||||
@@ -1853,6 +_,17 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1296,7 +1296,7 @@
|
||||
private ProfilerFiller createProfiler() {
|
||||
if (this.willStartRecordingMetrics) {
|
||||
this.metricsRecorder = ActiveMetricsRecorder.createStarted(
|
||||
@@ -1973,16 +_,22 @@
|
||||
@@ -1974,16 +_,22 @@
|
||||
}
|
||||
|
||||
public void logChatMessage(Component content, ChatType.Bound boundChatType, @Nullable String header) {
|
||||
@@ -1323,7 +1323,7 @@
|
||||
}
|
||||
|
||||
public boolean logIPs() {
|
||||
@@ -2115,4 +_,53 @@
|
||||
@@ -2120,4 +_,53 @@
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
public PlayerAdvancements(DataFixer dataFixer, PlayerList playerList, ServerAdvancementManager manager, Path playerSavePath, ServerPlayer player) {
|
||||
this.playerList = playerList;
|
||||
@@ -128,6 +_,7 @@
|
||||
@@ -127,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void save() {
|
||||
@@ -25,7 +25,7 @@
|
||||
JsonElement jsonElement = this.codec.encodeStart(JsonOps.INSTANCE, this.asData()).getOrThrow();
|
||||
|
||||
try {
|
||||
@@ -145,6 +_,7 @@
|
||||
@@ -144,6 +_,7 @@
|
||||
data.forEach((path, progress) -> {
|
||||
AdvancementHolder advancementHolder = advancementManager.get(path);
|
||||
if (advancementHolder == null) {
|
||||
@@ -33,7 +33,7 @@
|
||||
LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", path, this.playerSavePath);
|
||||
} else {
|
||||
this.startProgress(advancementHolder, progress);
|
||||
@@ -169,14 +_,31 @@
|
||||
@@ -168,14 +_,31 @@
|
||||
AdvancementProgress orStartProgress = this.getOrStartProgress(advancement);
|
||||
boolean isDone = orStartProgress.isDone();
|
||||
if (orStartProgress.grantProgress(criterionKey)) {
|
||||
@@ -58,16 +58,16 @@
|
||||
+ // Paper end
|
||||
advancement.value().rewards().grant(this.player);
|
||||
advancement.value().display().ifPresent(displayInfo -> {
|
||||
- if (displayInfo.shouldAnnounceChat() && this.player.serverLevel().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) {
|
||||
- if (displayInfo.shouldAnnounceChat() && this.player.level().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) {
|
||||
- this.playerList.broadcastSystemMessage(displayInfo.getType().createAnnouncement(advancement, this.player), false);
|
||||
+ // Paper start - Add Adventure message to PlayerAdvancementDoneEvent
|
||||
+ if (event.message() != null && this.player.serverLevel().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) {
|
||||
+ if (event.message() != null && this.player.level().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) {
|
||||
+ this.playerList.broadcastSystemMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.message()), false);
|
||||
+ // Paper end
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -247,7 +_,7 @@
|
||||
@@ -246,7 +_,7 @@
|
||||
public void flushDirty(ServerPlayer player, boolean showAdvancements) {
|
||||
if (this.isFirstPacket || !this.rootsToUpdate.isEmpty() || !this.progressChanged.isEmpty()) {
|
||||
Map<ResourceLocation, AdvancementProgress> map = new HashMap<>();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/ReloadableServerRegistries.java
|
||||
+++ b/net/minecraft/server/ReloadableServerRegistries.java
|
||||
@@ -48,8 +_,9 @@
|
||||
@@ -46,8 +_,9 @@
|
||||
List<HolderLookup.RegistryLookup<?>> list = TagLoader.buildUpdatedLookups(registryAccess.getAccessForLoading(RegistryLayer.RELOADABLE), postponedTags);
|
||||
HolderLookup.Provider provider = HolderLookup.Provider.create(list.stream());
|
||||
RegistryOps<JsonElement> registryOps = provider.createSerializationContext(JsonOps.INSTANCE);
|
||||
@@ -11,7 +11,7 @@
|
||||
.toList();
|
||||
CompletableFuture<List<WritableRegistry<?>>> completableFuture = Util.sequence(list1);
|
||||
return completableFuture.thenApplyAsync(
|
||||
@@ -58,19 +_,20 @@
|
||||
@@ -56,19 +_,20 @@
|
||||
}
|
||||
|
||||
private static <T> CompletableFuture<WritableRegistry<?>> scheduleRegistryLoad(
|
||||
@@ -21,7 +21,7 @@
|
||||
return CompletableFuture.supplyAsync(
|
||||
() -> {
|
||||
WritableRegistry<T> writableRegistry = new MappedRegistry<>(lootDataType.registryKey(), Lifecycle.experimental());
|
||||
+ io.papermc.paper.registry.PaperRegistryAccess.instance().registerReloadableRegistry(lootDataType.registryKey(), writableRegistry); // Paper - register reloadable registry
|
||||
+ io.papermc.paper.registry.PaperRegistryAccess.instance().registerReloadableRegistry(writableRegistry); // Paper - register reloadable registry
|
||||
Map<ResourceLocation, T> map = new HashMap<>();
|
||||
SimpleJsonResourceReloadListener.scanDirectory(resourceManager, lootDataType.registryKey(), ops, lootDataType.codec(), map);
|
||||
map.forEach(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/ServerScoreboard.java
|
||||
+++ b/net/minecraft/server/ServerScoreboard.java
|
||||
@@ -43,9 +_,7 @@
|
||||
@@ -45,9 +_,7 @@
|
||||
protected void onScoreChanged(ScoreHolder scoreHolder, Objective objective, Score score) {
|
||||
super.onScoreChanged(scoreHolder, objective, score);
|
||||
if (this.trackedObjectives.contains(objective)) {
|
||||
@@ -11,7 +11,7 @@
|
||||
new ClientboundSetScorePacket(
|
||||
scoreHolder.getScoreboardName(),
|
||||
objective.getName(),
|
||||
@@ -68,7 +_,7 @@
|
||||
@@ -70,7 +_,7 @@
|
||||
@Override
|
||||
public void onPlayerRemoved(ScoreHolder scoreHolder) {
|
||||
super.onPlayerRemoved(scoreHolder);
|
||||
@@ -20,7 +20,7 @@
|
||||
this.setDirty();
|
||||
}
|
||||
|
||||
@@ -76,7 +_,7 @@
|
||||
@@ -78,7 +_,7 @@
|
||||
public void onPlayerScoreRemoved(ScoreHolder scoreHolder, Objective objective) {
|
||||
super.onPlayerScoreRemoved(scoreHolder, objective);
|
||||
if (this.trackedObjectives.contains(objective)) {
|
||||
@@ -29,7 +29,7 @@
|
||||
}
|
||||
|
||||
this.setDirty();
|
||||
@@ -88,7 +_,7 @@
|
||||
@@ -90,7 +_,7 @@
|
||||
super.setDisplayObjective(slot, objective);
|
||||
if (displayObjective != objective && displayObjective != null) {
|
||||
if (this.getObjectiveDisplaySlotCount(displayObjective) > 0) {
|
||||
@@ -38,7 +38,7 @@
|
||||
} else {
|
||||
this.stopTrackingObjective(displayObjective);
|
||||
}
|
||||
@@ -96,7 +_,7 @@
|
||||
@@ -98,7 +_,7 @@
|
||||
|
||||
if (objective != null) {
|
||||
if (this.trackedObjectives.contains(objective)) {
|
||||
@@ -47,27 +47,21 @@
|
||||
} else {
|
||||
this.startTrackingObjective(objective);
|
||||
}
|
||||
@@ -108,24 +_,50 @@
|
||||
@@ -110,9 +_,7 @@
|
||||
@Override
|
||||
public boolean addPlayerToTeam(String playerName, PlayerTeam team) {
|
||||
if (super.addPlayerToTeam(playerName, team)) {
|
||||
- this.server
|
||||
- .getPlayerList()
|
||||
- .broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(team, playerName, ClientboundSetPlayerTeamPacket.Action.ADD));
|
||||
- this.setDirty();
|
||||
- return true;
|
||||
- } else {
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
+ this.broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(team, playerName, ClientboundSetPlayerTeamPacket.Action.ADD)); // CraftBukkit
|
||||
+ this.setDirty();
|
||||
+ return true;
|
||||
+ } else {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
this.updatePlayerWaypoint(playerName);
|
||||
this.setDirty();
|
||||
return true;
|
||||
@@ -121,16 +_,44 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ // Paper start - Multiple Entries with Scoreboards
|
||||
+ public boolean addPlayersToTeam(java.util.Collection<String> players, PlayerTeam team) {
|
||||
+ boolean anyAdded = false;
|
||||
@@ -86,19 +80,18 @@
|
||||
+ }
|
||||
+ }
|
||||
+ // Paper end - Multiple Entries with Scoreboards
|
||||
|
||||
+
|
||||
@Override
|
||||
public void removePlayerFromTeam(String username, PlayerTeam playerTeam) {
|
||||
super.removePlayerFromTeam(username, playerTeam);
|
||||
- this.server
|
||||
- .getPlayerList()
|
||||
- .broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(playerTeam, username, ClientboundSetPlayerTeamPacket.Action.REMOVE));
|
||||
- this.setDirty();
|
||||
- }
|
||||
+ this.broadcastAll(ClientboundSetPlayerTeamPacket.createPlayerPacket(playerTeam, username, ClientboundSetPlayerTeamPacket.Action.REMOVE)); // CraftBukkit
|
||||
+ this.setDirty();
|
||||
+ }
|
||||
+
|
||||
this.updatePlayerWaypoint(username);
|
||||
this.setDirty();
|
||||
}
|
||||
|
||||
+ // Paper start - Multiple Entries with Scoreboards
|
||||
+ public void removePlayersFromTeam(java.util.Collection<String> players, PlayerTeam team) {
|
||||
+ for (String playerName : players) {
|
||||
@@ -109,10 +102,11 @@
|
||||
+ this.setDirty();
|
||||
+ }
|
||||
+ // Paper end - Multiple Entries with Scoreboards
|
||||
|
||||
+
|
||||
@Override
|
||||
public void onObjectiveAdded(Objective objective) {
|
||||
@@ -137,7 +_,7 @@
|
||||
super.onObjectiveAdded(objective);
|
||||
@@ -141,7 +_,7 @@
|
||||
public void onObjectiveChanged(Objective objective) {
|
||||
super.onObjectiveChanged(objective);
|
||||
if (this.trackedObjectives.contains(objective)) {
|
||||
@@ -121,7 +115,7 @@
|
||||
}
|
||||
|
||||
this.setDirty();
|
||||
@@ -156,21 +_,21 @@
|
||||
@@ -160,14 +_,14 @@
|
||||
@Override
|
||||
public void onTeamAdded(PlayerTeam playerTeam) {
|
||||
super.onTeamAdded(playerTeam);
|
||||
@@ -135,18 +129,19 @@
|
||||
super.onTeamChanged(playerTeam);
|
||||
- this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, false));
|
||||
+ this.broadcastAll(ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(playerTeam, false)); // CraftBukkit
|
||||
this.updateTeamWaypoints(playerTeam);
|
||||
this.setDirty();
|
||||
}
|
||||
|
||||
@@ -175,7 +_,7 @@
|
||||
@Override
|
||||
public void onTeamRemoved(PlayerTeam playerTeam) {
|
||||
super.onTeamRemoved(playerTeam);
|
||||
- this.server.getPlayerList().broadcastAll(ClientboundSetPlayerTeamPacket.createRemovePacket(playerTeam));
|
||||
+ this.broadcastAll(ClientboundSetPlayerTeamPacket.createRemovePacket(playerTeam)); // CraftBukkit
|
||||
this.updateTeamWaypoints(playerTeam);
|
||||
this.setDirty();
|
||||
}
|
||||
|
||||
@@ -213,6 +_,7 @@
|
||||
@@ -219,6 +_,7 @@
|
||||
List<Packet<?>> startTrackingPackets = this.getStartTrackingPackets(objective);
|
||||
|
||||
for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) {
|
||||
@@ -154,7 +149,7 @@
|
||||
for (Packet<?> packet : startTrackingPackets) {
|
||||
serverPlayer.connection.send(packet);
|
||||
}
|
||||
@@ -238,6 +_,7 @@
|
||||
@@ -244,6 +_,7 @@
|
||||
List<Packet<?>> stopTrackingPackets = this.getStopTrackingPackets(objective);
|
||||
|
||||
for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) {
|
||||
@@ -162,11 +157,10 @@
|
||||
for (Packet<?> packet : stopTrackingPackets) {
|
||||
serverPlayer.connection.send(packet);
|
||||
}
|
||||
@@ -269,6 +_,16 @@
|
||||
scoreboardSaveData.loadFrom(data);
|
||||
return scoreboardSaveData;
|
||||
@@ -295,4 +_,13 @@
|
||||
.forEach(serverPlayer -> serverLevel.getWaypointManager().remakeConnections(serverPlayer));
|
||||
}
|
||||
}
|
||||
+
|
||||
+ // CraftBukkit start - Send to players
|
||||
+ private void broadcastAll(Packet<?> packet) {
|
||||
+ for (ServerPlayer serverPlayer : this.server.getPlayerList().players) {
|
||||
@@ -176,6 +170,4 @@
|
||||
+ }
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
|
||||
public static enum Method {
|
||||
CHANGE,
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/commands/BanPlayerCommands.java
|
||||
+++ b/net/minecraft/server/commands/BanPlayerCommands.java
|
||||
@@ -55,7 +_,7 @@
|
||||
@@ -57,7 +_,7 @@
|
||||
);
|
||||
ServerPlayer player = source.getServer().getPlayerList().getPlayer(gameProfile.getId());
|
||||
if (player != null) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/commands/DeOpCommands.java
|
||||
+++ b/net/minecraft/server/commands/DeOpCommands.java
|
||||
@@ -35,7 +_,7 @@
|
||||
@@ -39,7 +_,7 @@
|
||||
if (playerList.isOp(gameProfile)) {
|
||||
playerList.deop(gameProfile);
|
||||
i++;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/commands/EffectCommands.java
|
||||
+++ b/net/minecraft/server/commands/EffectCommands.java
|
||||
@@ -180,7 +_,7 @@
|
||||
@@ -182,7 +_,7 @@
|
||||
for (Entity entity : targets) {
|
||||
if (entity instanceof LivingEntity) {
|
||||
MobEffectInstance mobEffectInstance = new MobEffectInstance(effect, i1, amplifier, false, showParticles);
|
||||
@@ -9,7 +9,7 @@
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@@ -210,7 +_,7 @@
|
||||
@@ -212,7 +_,7 @@
|
||||
int i = 0;
|
||||
|
||||
for (Entity entity : targets) {
|
||||
@@ -18,7 +18,7 @@
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@@ -235,7 +_,7 @@
|
||||
@@ -237,7 +_,7 @@
|
||||
int i = 0;
|
||||
|
||||
for (Entity entity : targets) {
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
--- a/net/minecraft/server/commands/GameModeCommand.java
|
||||
+++ b/net/minecraft/server/commands/GameModeCommand.java
|
||||
@@ -54,9 +_,14 @@
|
||||
int i = 0;
|
||||
@@ -69,9 +_,16 @@
|
||||
}
|
||||
|
||||
for (ServerPlayer serverPlayer : players) {
|
||||
- if (serverPlayer.setGameMode(gameType)) {
|
||||
+ // Paper start - Expand PlayerGameModeChangeEvent
|
||||
+ org.bukkit.event.player.PlayerGameModeChangeEvent event = serverPlayer.setGameMode(gameType, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.COMMAND, net.kyori.adventure.text.Component.empty());
|
||||
+ if (event != null && !event.isCancelled()) {
|
||||
logGamemodeChange(source.getSource(), serverPlayer, gameType);
|
||||
i++;
|
||||
+ } else if (event != null && event.cancelMessage() != null) {
|
||||
+ source.getSource().sendSuccess(() -> io.papermc.paper.adventure.PaperAdventure.asVanilla(event.cancelMessage()), true);
|
||||
+ // Paper end - Expand PlayerGameModeChangeEvent
|
||||
}
|
||||
private static boolean setGameMode(CommandSourceStack source, ServerPlayer player, GameType gameMode) {
|
||||
- if (player.setGameMode(gameMode)) {
|
||||
+ // Paper start
|
||||
+ org.bukkit.event.player.PlayerGameModeChangeEvent event = player.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.COMMAND, net.kyori.adventure.text.Component.empty());
|
||||
+ if (event != null && !event.isCancelled()) {
|
||||
+ // Paper end
|
||||
logGamemodeChange(source, player, gameMode);
|
||||
return true;
|
||||
+ } else if (event != null && event.cancelMessage() != null) {
|
||||
+ source.sendSuccess(() -> io.papermc.paper.adventure.PaperAdventure.asVanilla(event.cancelMessage()), true);
|
||||
+ return false;
|
||||
+ // Paper end - Expand PlayerGameModeChangeEvent
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/commands/GiveCommand.java
|
||||
+++ b/net/minecraft/server/commands/GiveCommand.java
|
||||
@@ -51,6 +_,7 @@
|
||||
@@ -54,6 +_,7 @@
|
||||
|
||||
private static int giveItem(CommandSourceStack source, ItemInput item, Collection<ServerPlayer> targets, int count) throws CommandSyntaxException {
|
||||
ItemStack itemStack = item.createItemStack(1, false);
|
||||
@@ -8,25 +8,7 @@
|
||||
int maxStackSize = itemStack.getMaxStackSize();
|
||||
int i = maxStackSize * 100;
|
||||
if (count > i) {
|
||||
@@ -66,7 +_,7 @@
|
||||
ItemStack itemStack1 = item.createItemStack(min, false);
|
||||
boolean flag = serverPlayer.getInventory().add(itemStack1);
|
||||
if (flag && itemStack1.isEmpty()) {
|
||||
- ItemEntity itemEntity = serverPlayer.drop(itemStack, false);
|
||||
+ ItemEntity itemEntity = serverPlayer.drop(itemStack, false, false, false, null); // Paper - do not fire PlayerDropItemEvent for /give command
|
||||
if (itemEntity != null) {
|
||||
itemEntity.makeFakeItem();
|
||||
}
|
||||
@@ -84,7 +_,7 @@
|
||||
);
|
||||
serverPlayer.containerMenu.broadcastChanges();
|
||||
} else {
|
||||
- ItemEntity itemEntity = serverPlayer.drop(itemStack1, false);
|
||||
+ ItemEntity itemEntity = serverPlayer.drop(itemStack1, false, false, false, null); // Paper - do not fire PlayerDropItemEvent for /give command
|
||||
if (itemEntity != null) {
|
||||
itemEntity.setNoPickUpDelay();
|
||||
itemEntity.setTarget(serverPlayer.getUUID());
|
||||
@@ -95,11 +_,11 @@
|
||||
@@ -98,11 +_,11 @@
|
||||
|
||||
if (targets.size() == 1) {
|
||||
source.sendSuccess(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/commands/KickCommand.java
|
||||
+++ b/net/minecraft/server/commands/KickCommand.java
|
||||
@@ -48,7 +_,7 @@
|
||||
@@ -50,7 +_,7 @@
|
||||
|
||||
for (ServerPlayer serverPlayer : players) {
|
||||
if (!source.getServer().isSingleplayerOwner(serverPlayer.getGameProfile())) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/commands/LocateCommand.java
|
||||
+++ b/net/minecraft/server/commands/LocateCommand.java
|
||||
@@ -202,6 +_,6 @@
|
||||
@@ -199,6 +_,6 @@
|
||||
private static float dist(int x1, int z1, int x2, int z2) {
|
||||
int i = x2 - x1;
|
||||
int i1 = z2 - z1;
|
||||
|
||||
@@ -34,4 +34,4 @@
|
||||
+ // CraftBukkit end
|
||||
|
||||
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
|
||||
dispatcher.register(Commands.literal("reload").requires(source -> source.hasPermission(2)).executes(context -> {
|
||||
dispatcher.register(Commands.literal("reload").requires(Commands.hasPermission(2)).executes(commandContext -> {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
--- a/net/minecraft/server/commands/RideCommand.java
|
||||
+++ b/net/minecraft/server/commands/RideCommand.java
|
||||
@@ -58,7 +_,7 @@
|
||||
@@ -60,7 +_,7 @@
|
||||
Entity vehicle1 = target.getVehicle();
|
||||
if (vehicle1 != null) {
|
||||
throw ERROR_ALREADY_RIDING.create(target.getDisplayName(), vehicle1.getDisplayName());
|
||||
- } else if (vehicle.getType() == EntityType.PLAYER) {
|
||||
+ } else if (vehicle.getType() == EntityType.PLAYER && !io.papermc.paper.configuration.GlobalConfiguration.get().commands.rideCommandAllowPlayerAsVehicle) { // Paper - allow player as vehicle
|
||||
throw ERROR_MOUNTING_PLAYER.create();
|
||||
} else if (target.getSelfAndPassengers().anyMatch(passenger -> passenger == vehicle)) {
|
||||
} else if (target.getSelfAndPassengers().anyMatch(entity -> entity == vehicle)) {
|
||||
throw ERROR_MOUNTING_LOOP.create();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/commands/WorldBorderCommand.java
|
||||
+++ b/net/minecraft/server/commands/WorldBorderCommand.java
|
||||
@@ -135,7 +_,7 @@
|
||||
@@ -136,7 +_,7 @@
|
||||
}
|
||||
|
||||
private static int setDamageBuffer(CommandSourceStack source, float distance) throws CommandSyntaxException {
|
||||
@@ -9,7 +9,7 @@
|
||||
if (worldBorder.getDamageSafeZone() == distance) {
|
||||
throw ERROR_SAME_DAMAGE_BUFFER.create();
|
||||
} else {
|
||||
@@ -146,7 +_,7 @@
|
||||
@@ -147,7 +_,7 @@
|
||||
}
|
||||
|
||||
private static int setDamageAmount(CommandSourceStack source, float damagePerBlock) throws CommandSyntaxException {
|
||||
@@ -18,7 +18,7 @@
|
||||
if (worldBorder.getDamagePerBlock() == damagePerBlock) {
|
||||
throw ERROR_SAME_DAMAGE_AMOUNT.create();
|
||||
} else {
|
||||
@@ -159,7 +_,7 @@
|
||||
@@ -160,7 +_,7 @@
|
||||
}
|
||||
|
||||
private static int setWarningTime(CommandSourceStack source, int time) throws CommandSyntaxException {
|
||||
@@ -27,7 +27,7 @@
|
||||
if (worldBorder.getWarningTime() == time) {
|
||||
throw ERROR_SAME_WARNING_TIME.create();
|
||||
} else {
|
||||
@@ -170,7 +_,7 @@
|
||||
@@ -171,7 +_,7 @@
|
||||
}
|
||||
|
||||
private static int setWarningDistance(CommandSourceStack source, int distance) throws CommandSyntaxException {
|
||||
@@ -36,7 +36,7 @@
|
||||
if (worldBorder.getWarningBlocks() == distance) {
|
||||
throw ERROR_SAME_WARNING_DISTANCE.create();
|
||||
} else {
|
||||
@@ -181,13 +_,13 @@
|
||||
@@ -182,13 +_,13 @@
|
||||
}
|
||||
|
||||
private static int getSize(CommandSourceStack source) {
|
||||
@@ -52,7 +52,7 @@
|
||||
if (worldBorder.getCenterX() == pos.x && worldBorder.getCenterZ() == pos.y) {
|
||||
throw ERROR_SAME_CENTER.create();
|
||||
} else if (!(Math.abs(pos.x) > 2.9999984E7) && !(Math.abs(pos.y) > 2.9999984E7)) {
|
||||
@@ -205,7 +_,7 @@
|
||||
@@ -206,7 +_,7 @@
|
||||
}
|
||||
|
||||
private static int setSize(CommandSourceStack source, double newSize, long time) throws CommandSyntaxException {
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LOGGER));
|
||||
- thread.start();
|
||||
+ // thread.start(); // Paper - Enhance console tab completions for brigadier commands; moved down
|
||||
LOGGER.info("Starting minecraft server version {}", SharedConstants.getCurrentVersion().getName());
|
||||
LOGGER.info("Starting minecraft server version {}", SharedConstants.getCurrentVersion().name());
|
||||
if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) {
|
||||
LOGGER.warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\"");
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/dedicated/DedicatedServerProperties.java
|
||||
+++ b/net/minecraft/server/dedicated/DedicatedServerProperties.java
|
||||
@@ -45,6 +_,7 @@
|
||||
@@ -47,6 +_,7 @@
|
||||
static final Logger LOGGER = LogUtils.getLogger();
|
||||
private static final Pattern SHA1 = Pattern.compile("^[a-fA-F0-9]{40}$");
|
||||
private static final Splitter COMMA_SPLITTER = Splitter.on(',').trimResults();
|
||||
@@ -8,7 +8,7 @@
|
||||
public final boolean onlineMode = this.get("online-mode", true);
|
||||
public final boolean preventProxyConnections = this.get("prevent-proxy-connections", false);
|
||||
public final String serverIp = this.get("server-ip", "");
|
||||
@@ -85,7 +_,7 @@
|
||||
@@ -87,7 +_,7 @@
|
||||
public final boolean broadcastRconToOps = this.get("broadcast-rcon-to-ops", true);
|
||||
public final boolean broadcastConsoleToOps = this.get("broadcast-console-to-ops", true);
|
||||
public final int maxWorldSize = this.get("max-world-size", property -> Mth.clamp(property, 1, 29999984), 29999984);
|
||||
@@ -17,7 +17,7 @@
|
||||
public final String regionFileComression = this.get("region-file-compression", "deflate");
|
||||
public final boolean enableJmxMonitoring = this.get("enable-jmx-monitoring", false);
|
||||
public final boolean enableStatus = this.get("enable-status", true);
|
||||
@@ -99,13 +_,16 @@
|
||||
@@ -101,13 +_,16 @@
|
||||
public final Settings<DedicatedServerProperties>.MutableValue<Boolean> whiteList = this.getMutable("white-list", false);
|
||||
public final boolean enforceSecureProfile = this.get("enforce-secure-profile", true);
|
||||
public final boolean logIPs = this.get("log-ips", true);
|
||||
@@ -37,7 +37,7 @@
|
||||
String string = this.get("level-seed", "");
|
||||
boolean flag = this.get("generate-structures", true);
|
||||
long l = WorldOptions.parseSeed(string).orElse(WorldOptions.randomSeed());
|
||||
@@ -126,15 +_,21 @@
|
||||
@@ -128,15 +_,21 @@
|
||||
this.get("initial-enabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getEnabled())),
|
||||
this.get("initial-disabled-packs", String.join(",", WorldDataConfiguration.DEFAULT.dataPacks().getDisabled()))
|
||||
);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
@VisibleForDebug
|
||||
private NaturalSpawner.SpawnState lastSpawnState;
|
||||
+ // Paper start
|
||||
+ private final ca.spottedleaf.concurrentutil.map.ConcurrentLong2ReferenceChainedHashTable<net.minecraft.world.level.chunk.LevelChunk> fullChunks = new ca.spottedleaf.concurrentutil.map.ConcurrentLong2ReferenceChainedHashTable<>();
|
||||
+ public final ca.spottedleaf.concurrentutil.map.ConcurrentLong2ReferenceChainedHashTable<net.minecraft.world.level.chunk.LevelChunk> fullChunks = new ca.spottedleaf.concurrentutil.map.ConcurrentLong2ReferenceChainedHashTable<>();
|
||||
+ public int getFullChunksCount() {
|
||||
+ return this.fullChunks.size();
|
||||
+ }
|
||||
@@ -146,7 +146,7 @@
|
||||
+ ProfilerFiller gameprofilerfiller = Profiler.get();
|
||||
+
|
||||
+ gameprofilerfiller.push("purge");
|
||||
+ this.ticketStorage.purgeStaleTickets();
|
||||
+ this.ticketStorage.purgeStaleTickets(this.chunkMap);
|
||||
+ this.runDistanceManagerUpdates();
|
||||
+ gameprofilerfiller.popPush("unload");
|
||||
+ this.chunkMap.tick(() -> true);
|
||||
@@ -161,7 +161,7 @@
|
||||
profilerFiller.push("purge");
|
||||
- if (this.level.tickRateManager().runsNormally() || !tickChunks) {
|
||||
+ if (this.level.tickRateManager().runsNormally() || !tickChunks || this.level.spigotConfig.unloadFrozenChunks) { // Spigot
|
||||
this.ticketStorage.purgeStaleTickets();
|
||||
this.ticketStorage.purgeStaleTickets(this.chunkMap);
|
||||
}
|
||||
|
||||
@@ -388,12 +_,20 @@
|
||||
@@ -188,7 +188,7 @@
|
||||
} else {
|
||||
filteredSpawningCategories = List.of();
|
||||
}
|
||||
@@ -544,8 +_,13 @@
|
||||
@@ -547,8 +_,13 @@
|
||||
|
||||
@Override
|
||||
public void setSpawnSettings(boolean spawnSettings) {
|
||||
@@ -203,7 +203,7 @@
|
||||
}
|
||||
|
||||
public String getChunkDebugData(ChunkPos chunkPos) {
|
||||
@@ -618,12 +_,18 @@
|
||||
@@ -621,12 +_,18 @@
|
||||
|
||||
@Override
|
||||
public boolean pollTask() {
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
Packet<?> packet = null;
|
||||
boolean flag2 = flag1 || this.tickCount % 60 == 0;
|
||||
boolean flag3 = false;
|
||||
@@ -223,6 +_,25 @@
|
||||
@@ -227,6 +_,25 @@
|
||||
|
||||
this.tickCount++;
|
||||
if (this.entity.hurtMarked) {
|
||||
@@ -96,7 +96,7 @@
|
||||
this.entity.hurtMarked = false;
|
||||
this.broadcastAndSend(new ClientboundSetEntityMotionPacket(this.entity));
|
||||
}
|
||||
@@ -280,7 +_,10 @@
|
||||
@@ -284,7 +_,10 @@
|
||||
|
||||
public void sendPairingData(ServerPlayer player, Consumer<Packet<ClientGamePacketListener>> consumer) {
|
||||
if (this.entity.isRemoved()) {
|
||||
@@ -108,11 +108,10 @@
|
||||
}
|
||||
|
||||
Packet<ClientGamePacketListener> addEntityPacket = this.entity.getAddEntityPacket(this);
|
||||
@@ -292,6 +_,12 @@
|
||||
boolean flag = this.trackDelta;
|
||||
if (this.entity instanceof LivingEntity) {
|
||||
Collection<AttributeInstance> syncableAttributes = ((LivingEntity)this.entity).getAttributes().getSyncableAttributes();
|
||||
+
|
||||
@@ -295,6 +_,11 @@
|
||||
|
||||
if (this.entity instanceof LivingEntity livingEntity) {
|
||||
Collection<AttributeInstance> syncableAttributes = livingEntity.getAttributes().getSyncableAttributes();
|
||||
+ // CraftBukkit start - If sending own attributes send scaled health instead of current maximum health
|
||||
+ if (this.entity.getId() == player.getId()) {
|
||||
+ ((ServerPlayer) this.entity).getBukkitEntity().injectScaledMaxHealth(syncableAttributes, false);
|
||||
@@ -121,7 +120,7 @@
|
||||
if (!syncableAttributes.isEmpty()) {
|
||||
consumer.accept(new ClientboundUpdateAttributesPacket(this.entity.getId(), syncableAttributes));
|
||||
}
|
||||
@@ -316,8 +_,9 @@
|
||||
@@ -311,8 +_,9 @@
|
||||
}
|
||||
|
||||
if (!list.isEmpty()) {
|
||||
@@ -132,7 +131,7 @@
|
||||
}
|
||||
|
||||
if (!this.entity.getPassengers().isEmpty()) {
|
||||
@@ -364,6 +_,11 @@
|
||||
@@ -359,6 +_,11 @@
|
||||
if (this.entity instanceof LivingEntity) {
|
||||
Set<AttributeInstance> attributesToSync = ((LivingEntity)this.entity).getAttributes().getAttributesToSync();
|
||||
if (!attributesToSync.isEmpty()) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -178,7 +_,7 @@
|
||||
@@ -180,7 +_,7 @@
|
||||
final List<ServerPlayer> players = Lists.newArrayList();
|
||||
public final ServerChunkCache chunkSource;
|
||||
private final MinecraftServer server;
|
||||
@@ -8,8 +8,8 @@
|
||||
+ public final net.minecraft.world.level.storage.PrimaryLevelData serverLevelData; // CraftBukkit - type
|
||||
private int lastSpawnChunkRadius;
|
||||
final EntityTickList entityTickList = new EntityTickList();
|
||||
public final PersistentEntitySectionManager<Entity> entityManager;
|
||||
@@ -205,11 +_,131 @@
|
||||
private final ServerWaypointManager waypointManager;
|
||||
@@ -208,11 +_,131 @@
|
||||
private final boolean tickTime;
|
||||
private final RandomSequences randomSequences;
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
ResourceKey<Level> dimension,
|
||||
LevelStem levelStem,
|
||||
ChunkProgressListener progressListener,
|
||||
@@ -217,14 +_,38 @@
|
||||
@@ -220,14 +_,38 @@
|
||||
long biomeZoomSeed,
|
||||
List<CustomSpawner> customSpawners,
|
||||
boolean tickTime,
|
||||
@@ -183,7 +183,7 @@
|
||||
boolean flag = server.forceSynchronousWrites();
|
||||
DataFixer fixerUpper = server.getFixerUpper();
|
||||
EntityPersistentStorage<Entity> entityPersistentStorage = new EntityStorage(
|
||||
@@ -246,8 +_,8 @@
|
||||
@@ -249,8 +_,8 @@
|
||||
server.getStructureManager(),
|
||||
dispatcher,
|
||||
chunkGenerator,
|
||||
@@ -194,7 +194,7 @@
|
||||
flag,
|
||||
progressListener,
|
||||
this.entityManager::updateChunkStatus,
|
||||
@@ -268,7 +_,7 @@
|
||||
@@ -271,7 +_,7 @@
|
||||
this.chunkSource.chunkScanner(),
|
||||
this.registryAccess(),
|
||||
server.getStructureManager(),
|
||||
@@ -203,7 +203,7 @@
|
||||
chunkGenerator,
|
||||
this.chunkSource.randomState(),
|
||||
this,
|
||||
@@ -276,9 +_,9 @@
|
||||
@@ -279,9 +_,9 @@
|
||||
seed,
|
||||
fixerUpper
|
||||
);
|
||||
@@ -216,10 +216,10 @@
|
||||
} else {
|
||||
this.dragonFight = null;
|
||||
}
|
||||
@@ -286,7 +_,15 @@
|
||||
this.sleepStatus = new SleepStatus();
|
||||
@@ -290,7 +_,15 @@
|
||||
this.gameEventDispatcher = new GameEventDispatcher(this);
|
||||
this.randomSequences = Objects.requireNonNullElseGet(randomSequences, () -> this.getDataStorage().computeIfAbsent(RandomSequences.TYPE));
|
||||
this.waypointManager = new ServerWaypointManager();
|
||||
- }
|
||||
+ this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit
|
||||
+ }
|
||||
@@ -233,7 +233,7 @@
|
||||
|
||||
@Deprecated
|
||||
@VisibleForTesting
|
||||
@@ -298,8 +_,8 @@
|
||||
@@ -302,8 +_,8 @@
|
||||
this.serverLevelData.setClearWeatherTime(clearTime);
|
||||
this.serverLevelData.setRainTime(weatherTime);
|
||||
this.serverLevelData.setThunderTime(weatherTime);
|
||||
@@ -244,7 +244,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -326,12 +_,25 @@
|
||||
@@ -330,12 +_,25 @@
|
||||
|
||||
int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE);
|
||||
if (this.sleepStatus.areEnoughSleeping(_int) && this.sleepStatus.areEnoughDeepSleeping(_int, this.players)) {
|
||||
@@ -273,7 +273,7 @@
|
||||
if (this.getGameRules().getBoolean(GameRules.RULE_WEATHER_CYCLE) && this.isRaining()) {
|
||||
this.resetWeatherCycle();
|
||||
}
|
||||
@@ -346,9 +_,9 @@
|
||||
@@ -350,9 +_,9 @@
|
||||
if (!this.isDebug() && runsNormally) {
|
||||
long l = this.getGameTime();
|
||||
profilerFiller.push("blockTicks");
|
||||
@@ -285,7 +285,7 @@
|
||||
profilerFiller.pop();
|
||||
}
|
||||
|
||||
@@ -366,7 +_,7 @@
|
||||
@@ -370,7 +_,7 @@
|
||||
|
||||
this.handlingTick = false;
|
||||
profilerFiller.pop();
|
||||
@@ -294,7 +294,7 @@
|
||||
if (flag) {
|
||||
this.resetEmptyTime();
|
||||
}
|
||||
@@ -455,11 +_,13 @@
|
||||
@@ -459,11 +_,13 @@
|
||||
ProfilerFiller profilerFiller = Profiler.get();
|
||||
profilerFiller.push("iceandsnow");
|
||||
|
||||
@@ -308,7 +308,7 @@
|
||||
|
||||
profilerFiller.popPush("tickBlocks");
|
||||
if (randomTickSpeed > 0) {
|
||||
@@ -502,12 +_,12 @@
|
||||
@@ -506,12 +_,12 @@
|
||||
int minBlockZ = pos.getMinBlockZ();
|
||||
ProfilerFiller profilerFiller = Profiler.get();
|
||||
profilerFiller.push("thunder");
|
||||
@@ -323,7 +323,7 @@
|
||||
&& !this.getBlockState(blockPos.below()).is(Blocks.LIGHTNING_ROD);
|
||||
if (flag) {
|
||||
SkeletonHorse skeletonHorse = EntityType.SKELETON_HORSE.create(this, EntitySpawnReason.EVENT);
|
||||
@@ -515,7 +_,7 @@
|
||||
@@ -519,7 +_,7 @@
|
||||
skeletonHorse.setTrap(true);
|
||||
skeletonHorse.setAge(0);
|
||||
skeletonHorse.setPos(blockPos.getX(), blockPos.getY(), blockPos.getZ());
|
||||
@@ -332,7 +332,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -523,7 +_,7 @@
|
||||
@@ -527,7 +_,7 @@
|
||||
if (lightningBolt != null) {
|
||||
lightningBolt.snapTo(Vec3.atBottomCenterOf(blockPos));
|
||||
lightningBolt.setVisualOnly(flag);
|
||||
@@ -341,7 +341,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -537,7 +_,7 @@
|
||||
@@ -541,7 +_,7 @@
|
||||
BlockPos blockPos1 = heightmapPos.below();
|
||||
Biome biome = this.getBiome(heightmapPos).value();
|
||||
if (biome.shouldFreeze(this, blockPos1)) {
|
||||
@@ -350,7 +350,7 @@
|
||||
}
|
||||
|
||||
if (this.isRaining()) {
|
||||
@@ -549,10 +_,10 @@
|
||||
@@ -553,10 +_,10 @@
|
||||
if (layersValue < Math.min(_int, 8)) {
|
||||
BlockState blockState1 = blockState.setValue(SnowLayerBlock.LAYERS, layersValue + 1);
|
||||
Block.pushEntitiesUp(blockState, blockState1, this, heightmapPos);
|
||||
@@ -363,7 +363,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -577,6 +_,12 @@
|
||||
@@ -581,6 +_,12 @@
|
||||
}
|
||||
|
||||
protected BlockPos findLightningTargetAround(BlockPos pos) {
|
||||
@@ -376,7 +376,7 @@
|
||||
BlockPos heightmapPos = this.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, pos);
|
||||
Optional<BlockPos> optional = this.findLightningRod(heightmapPos);
|
||||
if (optional.isPresent()) {
|
||||
@@ -584,11 +_,12 @@
|
||||
@@ -588,11 +_,12 @@
|
||||
} else {
|
||||
AABB aabb = AABB.encapsulatingFullBlocks(heightmapPos, heightmapPos.atY(this.getMaxY() + 1)).inflate(3.0);
|
||||
List<LivingEntity> entitiesOfClass = this.getEntitiesOfClass(
|
||||
@@ -390,7 +390,7 @@
|
||||
if (heightmapPos.getY() == this.getMinY() - 1) {
|
||||
heightmapPos = heightmapPos.above(2);
|
||||
}
|
||||
@@ -675,8 +_,8 @@
|
||||
@@ -683,8 +_,8 @@
|
||||
this.serverLevelData.setThunderTime(thunderTime);
|
||||
this.serverLevelData.setRainTime(rainTime);
|
||||
this.serverLevelData.setClearWeatherTime(clearWeatherTime);
|
||||
@@ -401,7 +401,7 @@
|
||||
}
|
||||
|
||||
this.oThunderLevel = this.thunderLevel;
|
||||
@@ -697,6 +_,7 @@
|
||||
@@ -705,6 +_,7 @@
|
||||
this.rainLevel = Mth.clamp(this.rainLevel, 0.0F, 1.0F);
|
||||
}
|
||||
|
||||
@@ -409,7 +409,7 @@
|
||||
if (this.oRainLevel != this.rainLevel) {
|
||||
this.server
|
||||
.getPlayerList()
|
||||
@@ -719,14 +_,47 @@
|
||||
@@ -727,14 +_,47 @@
|
||||
this.server.getPlayerList().broadcastAll(new ClientboundGameEventPacket(ClientboundGameEventPacket.RAIN_LEVEL_CHANGE, this.rainLevel));
|
||||
this.server.getPlayerList().broadcastAll(new ClientboundGameEventPacket(ClientboundGameEventPacket.THUNDER_LEVEL_CHANGE, this.thunderLevel));
|
||||
}
|
||||
@@ -461,7 +461,7 @@
|
||||
}
|
||||
|
||||
public void resetEmptyTime() {
|
||||
@@ -748,18 +_,46 @@
|
||||
@@ -756,18 +_,46 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -508,7 +508,7 @@
|
||||
}
|
||||
|
||||
private void tickPassenger(Entity ridingEntity, Entity passengerEntity) {
|
||||
@@ -768,10 +_,12 @@
|
||||
@@ -776,10 +_,12 @@
|
||||
} else if (passengerEntity instanceof Player || this.entityTickList.contains(passengerEntity)) {
|
||||
passengerEntity.setOldPosAndRot();
|
||||
passengerEntity.tickCount++;
|
||||
@@ -521,7 +521,7 @@
|
||||
profilerFiller.pop();
|
||||
|
||||
for (Entity entity : passengerEntity.getPassengers()) {
|
||||
@@ -788,6 +_,7 @@
|
||||
@@ -810,6 +_,7 @@
|
||||
public void save(@Nullable ProgressListener progress, boolean flush, boolean skipSave) {
|
||||
ServerChunkCache chunkSource = this.getChunkSource();
|
||||
if (!skipSave) {
|
||||
@@ -529,7 +529,7 @@
|
||||
if (progress != null) {
|
||||
progress.progressStartNoAbort(Component.translatable("menu.savingLevel"));
|
||||
}
|
||||
@@ -804,11 +_,19 @@
|
||||
@@ -826,11 +_,19 @@
|
||||
this.entityManager.autoSave();
|
||||
}
|
||||
}
|
||||
@@ -550,7 +550,7 @@
|
||||
}
|
||||
|
||||
DimensionDataStorage dataStorage = this.getChunkSource().getDataStorage();
|
||||
@@ -873,18 +_,40 @@
|
||||
@@ -895,18 +_,40 @@
|
||||
|
||||
@Override
|
||||
public boolean addFreshEntity(Entity entity) {
|
||||
@@ -594,7 +594,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -907,40 +_,119 @@
|
||||
@@ -929,40 +_,119 @@
|
||||
this.entityManager.addNewEntity(player);
|
||||
}
|
||||
|
||||
@@ -719,7 +719,7 @@
|
||||
if (d * d + d1 * d1 + d2 * d2 < 1024.0) {
|
||||
serverPlayer.connection.send(new ClientboundBlockDestructionPacket(breakerId, pos, progress));
|
||||
}
|
||||
@@ -1015,7 +_,7 @@
|
||||
@@ -1037,7 +_,7 @@
|
||||
pos.getX(),
|
||||
pos.getY(),
|
||||
pos.getZ(),
|
||||
@@ -728,7 +728,7 @@
|
||||
this.dimension(),
|
||||
new ClientboundLevelEventPacket(type, pos, data, false)
|
||||
);
|
||||
@@ -1027,6 +_,11 @@
|
||||
@@ -1049,6 +_,11 @@
|
||||
|
||||
@Override
|
||||
public void gameEvent(Holder<GameEvent> gameEvent, Vec3 pos, GameEvent.Context context) {
|
||||
@@ -740,7 +740,7 @@
|
||||
this.gameEventDispatcher.post(gameEvent, pos, context);
|
||||
}
|
||||
|
||||
@@ -1039,17 +_,28 @@
|
||||
@@ -1061,17 +_,28 @@
|
||||
|
||||
this.getChunkSource().blockChanged(pos);
|
||||
this.pathTypesByPosCache.invalidate(pos);
|
||||
@@ -769,7 +769,7 @@
|
||||
|
||||
try {
|
||||
this.isUpdatingNavigations = true;
|
||||
@@ -1061,15 +_,23 @@
|
||||
@@ -1083,15 +_,23 @@
|
||||
this.isUpdatingNavigations = false;
|
||||
}
|
||||
}
|
||||
@@ -793,7 +793,7 @@
|
||||
this.neighborUpdater.updateNeighborsAtExceptFromFacing(pos, block, null, orientation);
|
||||
}
|
||||
|
||||
@@ -1118,6 +_,42 @@
|
||||
@@ -1140,6 +_,42 @@
|
||||
ParticleOptions largeExplosionParticles,
|
||||
Holder<SoundEvent> explosionSound
|
||||
) {
|
||||
@@ -836,7 +836,7 @@
|
||||
Explosion.BlockInteraction blockInteraction = switch (explosionInteraction) {
|
||||
case NONE -> Explosion.BlockInteraction.KEEP;
|
||||
case BLOCK -> this.getDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY);
|
||||
@@ -1126,10 +_,17 @@
|
||||
@@ -1148,10 +_,17 @@
|
||||
: Explosion.BlockInteraction.KEEP;
|
||||
case TNT -> this.getDestroyType(GameRules.RULE_TNT_EXPLOSION_DROP_DECAY);
|
||||
case TRIGGER -> Explosion.BlockInteraction.TRIGGER_BLOCK;
|
||||
@@ -854,7 +854,7 @@
|
||||
ParticleOptions particleOptions = serverExplosion.isSmall() ? smallExplosionParticles : largeExplosionParticles;
|
||||
|
||||
for (ServerPlayer serverPlayer : this.players) {
|
||||
@@ -1138,6 +_,8 @@
|
||||
@@ -1160,6 +_,8 @@
|
||||
serverPlayer.connection.send(new ClientboundExplodePacket(vec3, optional, particleOptions, explosionSound));
|
||||
}
|
||||
}
|
||||
@@ -863,7 +863,7 @@
|
||||
}
|
||||
|
||||
private Explosion.BlockInteraction getDestroyType(GameRules.Key<GameRules.BooleanValue> decayGameRule) {
|
||||
@@ -1208,7 +_,7 @@
|
||||
@@ -1230,7 +_,7 @@
|
||||
public <T extends ParticleOptions> int sendParticles(
|
||||
T type, double posX, double posY, double posZ, int particleCount, double xOffset, double yOffset, double zOffset, double speed
|
||||
) {
|
||||
@@ -872,7 +872,7 @@
|
||||
}
|
||||
|
||||
public <T extends ParticleOptions> int sendParticles(
|
||||
@@ -1224,13 +_,49 @@
|
||||
@@ -1246,13 +_,49 @@
|
||||
double zOffset,
|
||||
double speed
|
||||
) {
|
||||
@@ -924,7 +924,7 @@
|
||||
if (this.sendParticles(serverPlayer, overrideLimiter, posX, posY, posZ, clientboundLevelParticlesPacket)) {
|
||||
i++;
|
||||
}
|
||||
@@ -1293,7 +_,7 @@
|
||||
@@ -1315,7 +_,7 @@
|
||||
|
||||
@Nullable
|
||||
public BlockPos findNearestMapStructure(TagKey<Structure> structureTag, BlockPos pos, int radius, boolean skipExistingChunks) {
|
||||
@@ -933,7 +933,7 @@
|
||||
return null;
|
||||
} else {
|
||||
Optional<HolderSet.Named<Structure>> optional = this.registryAccess().lookupOrThrow(Registries.STRUCTURE).get(structureTag);
|
||||
@@ -1340,10 +_,36 @@
|
||||
@@ -1362,10 +_,36 @@
|
||||
@Nullable
|
||||
@Override
|
||||
public MapItemSavedData getMapData(MapId mapId) {
|
||||
@@ -971,7 +971,7 @@
|
||||
this.getServer().overworld().getDataStorage().set(MapItemSavedData.type(mapId), data);
|
||||
}
|
||||
|
||||
@@ -1355,17 +_,27 @@
|
||||
@@ -1377,17 +_,27 @@
|
||||
BlockPos spawnPos = this.levelData.getSpawnPos();
|
||||
float spawnAngle = this.levelData.getSpawnAngle();
|
||||
if (!spawnPos.equals(pos) || spawnAngle != angle) {
|
||||
@@ -1001,7 +1001,7 @@
|
||||
}
|
||||
|
||||
this.lastSpawnChunkRadius = i;
|
||||
@@ -1400,6 +_,11 @@
|
||||
@@ -1422,6 +_,11 @@
|
||||
DebugPackets.sendPoiRemovedPacket(this, blockPos);
|
||||
}));
|
||||
optional1.ifPresent(holder -> this.getServer().execute(() -> {
|
||||
@@ -1013,7 +1013,7 @@
|
||||
this.getPoiManager().add(blockPos, (Holder<PoiType>)holder);
|
||||
DebugPackets.sendPoiAddedPacket(this, blockPos);
|
||||
}));
|
||||
@@ -1552,12 +_,12 @@
|
||||
@@ -1574,12 +_,12 @@
|
||||
}
|
||||
|
||||
public boolean isFlat() {
|
||||
@@ -1028,7 +1028,7 @@
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -1608,6 +_,7 @@
|
||||
@@ -1630,6 +_,7 @@
|
||||
|
||||
@Override
|
||||
public LevelEntityGetter<Entity> getEntities() {
|
||||
@@ -1036,7 +1036,7 @@
|
||||
return this.entityManager.getEntityGetter();
|
||||
}
|
||||
|
||||
@@ -1697,6 +_,28 @@
|
||||
@@ -1736,6 +_,28 @@
|
||||
return this.serverLevelData.getGameRules();
|
||||
}
|
||||
|
||||
@@ -1065,15 +1065,15 @@
|
||||
@Override
|
||||
public CrashReportCategory fillReportDetails(CrashReport report) {
|
||||
CrashReportCategory crashReportCategory = super.fillReportDetails(report);
|
||||
@@ -1712,6 +_,7 @@
|
||||
final class EntityCallbacks implements LevelCallback<Entity> {
|
||||
@Override
|
||||
public void onCreated(Entity entity) {
|
||||
@@ -1754,6 +_,7 @@
|
||||
if (entity instanceof WaypointTransmitter waypointTransmitter && waypointTransmitter.isTransmittingWaypoint()) {
|
||||
ServerLevel.this.getWaypointManager().trackWaypoint(waypointTransmitter);
|
||||
}
|
||||
+ entity.setOldPosAndRot(); // Paper - update old pos / rot for new entities as it will default to Vec3.ZERO
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1721,24 +_,32 @@
|
||||
@@ -1767,17 +_,24 @@
|
||||
|
||||
@Override
|
||||
public void onTickingStart(Entity entity) {
|
||||
@@ -1086,8 +1086,7 @@
|
||||
ServerLevel.this.entityTickList.remove(entity);
|
||||
+ // Paper start - Reset pearls when they stop being ticked
|
||||
+ if (ServerLevel.this.paperConfig().fixes.disableUnloadedChunkEnderpearlExploit && ServerLevel.this.paperConfig().misc.legacyEnderPearlBehavior && entity instanceof net.minecraft.world.entity.projectile.ThrownEnderpearl pearl) {
|
||||
+ pearl.cachedOwner = null;
|
||||
+ pearl.ownerUUID = null;
|
||||
+ pearl.setOwner(null);
|
||||
+ }
|
||||
+ // Paper end - Reset pearls when they stop being ticked
|
||||
}
|
||||
@@ -1099,7 +1098,8 @@
|
||||
+ // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server; moved down below valid=true
|
||||
if (entity instanceof ServerPlayer serverPlayer) {
|
||||
ServerLevel.this.players.add(serverPlayer);
|
||||
ServerLevel.this.updateSleepingPlayerList();
|
||||
if (serverPlayer.isReceivingWaypoints()) {
|
||||
@@ -1792,7 +_,7 @@
|
||||
}
|
||||
|
||||
if (entity instanceof Mob mob) {
|
||||
@@ -1108,7 +1108,7 @@
|
||||
String string = "onTrackingStart called during navigation iteration";
|
||||
Util.logAndPauseIfInIde(
|
||||
"onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")
|
||||
@@ -1755,10 +_,52 @@
|
||||
@@ -1809,10 +_,52 @@
|
||||
}
|
||||
|
||||
entity.updateDynamicGameEventListener(DynamicGameEventListener::add);
|
||||
@@ -1161,7 +1161,7 @@
|
||||
ServerLevel.this.getChunkSource().removeEntity(entity);
|
||||
if (entity instanceof ServerPlayer serverPlayer) {
|
||||
ServerLevel.this.players.remove(serverPlayer);
|
||||
@@ -1766,7 +_,7 @@
|
||||
@@ -1821,7 +_,7 @@
|
||||
}
|
||||
|
||||
if (entity instanceof Mob mob) {
|
||||
@@ -1170,7 +1170,7 @@
|
||||
String string = "onTrackingStart called during navigation iteration";
|
||||
Util.logAndPauseIfInIde(
|
||||
"onTrackingStart called during navigation iteration", new IllegalStateException("onTrackingStart called during navigation iteration")
|
||||
@@ -1783,6 +_,15 @@
|
||||
@@ -1838,6 +_,15 @@
|
||||
}
|
||||
|
||||
entity.updateDynamicGameEventListener(DynamicGameEventListener::remove);
|
||||
@@ -1186,7 +1186,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1790,4 +_,24 @@
|
||||
@@ -1845,4 +_,24 @@
|
||||
entity.updateDynamicGameEventListener(DynamicGameEventListener::move);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,6 @@
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -65,7 +_,6 @@
|
||||
import net.minecraft.network.protocol.game.ClientboundHurtAnimationPacket;
|
||||
import net.minecraft.network.protocol.game.ClientboundMerchantOffersPacket;
|
||||
import net.minecraft.network.protocol.game.ClientboundOpenBookPacket;
|
||||
-import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
|
||||
import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket;
|
||||
import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket;
|
||||
import net.minecraft.network.protocol.game.ClientboundPlayerCombatEndPacket;
|
||||
@@ -235,7 +_,8 @@
|
||||
@@ -245,7 +_,8 @@
|
||||
private int levitationStartTime;
|
||||
private boolean disconnected;
|
||||
private int requestedViewDistance = 2;
|
||||
@@ -18,7 +10,7 @@
|
||||
@Nullable
|
||||
private Vec3 startingToFallPosition;
|
||||
@Nullable
|
||||
@@ -281,6 +_,13 @@
|
||||
@@ -291,6 +_,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +24,7 @@
|
||||
@Override
|
||||
public void sendSlotChange(AbstractContainerMenu container, int slot, ItemStack itemStack) {
|
||||
ServerPlayer.this.connection.send(new ClientboundContainerSetSlotPacket(container.containerId, container.incrementStateId(), slot, itemStack));
|
||||
@@ -316,6 +_,32 @@
|
||||
@@ -326,6 +_,32 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +57,7 @@
|
||||
@Override
|
||||
public void dataChanged(AbstractContainerMenu containerMenu, int dataSlotIndex, int value) {
|
||||
}
|
||||
@@ -344,9 +_,43 @@
|
||||
@@ -354,9 +_,43 @@
|
||||
public void sendSystemMessage(Component component) {
|
||||
ServerPlayer.this.sendSystemMessage(component);
|
||||
}
|
||||
@@ -108,22 +100,20 @@
|
||||
+ public @Nullable org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event
|
||||
|
||||
public ServerPlayer(MinecraftServer server, ServerLevel level, GameProfile gameProfile, ClientInformation clientInformation) {
|
||||
super(level, level.getSharedSpawnPos(), level.getSharedSpawnAngle(), gameProfile);
|
||||
@@ -356,16 +_,22 @@
|
||||
super(level, gameProfile);
|
||||
@@ -366,15 +_,21 @@
|
||||
this.server = server;
|
||||
this.stats = server.getPlayerList().getPlayerStats(this);
|
||||
this.advancements = server.getPlayerList().getPlayerAdvancements(this);
|
||||
- this.snapTo(this.adjustSpawnLocation(level, level.getSharedSpawnPos()).getBottomCenter(), 0.0F, 0.0F);
|
||||
- this.updateOptions(clientInformation);
|
||||
+ // this.snapTo(this.adjustSpawnLocation(level, level.getSharedSpawnPos()).getBottomCenter(), 0.0F, 0.0F); // Paper - Don't move existing players to world spawn
|
||||
+ this.updateOptionsNoEvents(clientInformation); // Paper - don't call options events on login
|
||||
this.object = null;
|
||||
+
|
||||
+ // CraftBukkit start
|
||||
+ this.displayName = this.getScoreboardName();
|
||||
+ this.adventure$displayName = net.kyori.adventure.text.Component.text(this.getScoreboardName()); // Paper
|
||||
+ this.bukkitPickUpLoot = true;
|
||||
+ this.maxHealthCache = this.getMaxHealth();
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -135,22 +125,22 @@
|
||||
int max = Math.max(0, this.server.getSpawnRadius(level));
|
||||
int floor = Mth.floor(level.getWorldBorder().getDistanceToBorder(pos.getX(), pos.getZ()));
|
||||
if (floor < max) {
|
||||
@@ -436,6 +_,7 @@
|
||||
this.enteredNetherPosition = compound.read("entered_nether_pos", Vec3.CODEC).orElse(null);
|
||||
this.seenCredits = compound.getBooleanOr("seenCredits", false);
|
||||
this.recipeBook.fromNbt(compound.getCompoundOrEmpty("recipeBook"), key -> this.server.getRecipeManager().byKey(key).isPresent());
|
||||
+ this.getBukkitEntity().readExtraData(compound); // CraftBukkit
|
||||
@@ -446,6 +_,7 @@
|
||||
this.seenCredits = input.getBooleanOr("seenCredits", false);
|
||||
input.read("recipeBook", ServerRecipeBook.Packed.CODEC)
|
||||
.ifPresent(packed -> this.recipeBook.loadUntrusted(packed, key -> this.server.getRecipeManager().byKey(key).isPresent()));
|
||||
+ this.getBukkitEntity().readExtraData(input); // CraftBukkit
|
||||
if (this.isSleeping()) {
|
||||
this.stopSleeping();
|
||||
}
|
||||
@@ -459,12 +_,24 @@
|
||||
compound.putBoolean("spawn_extra_particles_on_fall", this.spawnExtraParticlesOnFall);
|
||||
compound.storeNullable("raid_omen_position", BlockPos.CODEC, this.raidOmenPosition);
|
||||
this.saveEnderPearls(compound);
|
||||
+ this.getBukkitEntity().setExtraData(compound); // CraftBukkit
|
||||
@@ -469,12 +_,24 @@
|
||||
output.putBoolean("spawn_extra_particles_on_fall", this.spawnExtraParticlesOnFall);
|
||||
output.storeNullable("raid_omen_position", BlockPos.CODEC, this.raidOmenPosition);
|
||||
this.saveEnderPearls(output);
|
||||
+ this.getBukkitEntity().setExtraData(output); // CraftBukkit
|
||||
}
|
||||
|
||||
private void saveParentVehicle(CompoundTag tag) {
|
||||
private void saveParentVehicle(ValueOutput output) {
|
||||
Entity rootVehicle = this.getRootVehicle();
|
||||
Entity vehicle = this.getVehicle();
|
||||
- if (vehicle != null && rootVehicle != this && rootVehicle.hasExactlyOnePlayerPassenger()) {
|
||||
@@ -166,19 +156,19 @@
|
||||
+ }
|
||||
+ if (persistVehicle && vehicle != null && rootVehicle != this && rootVehicle.hasExactlyOnePlayerPassenger() && !rootVehicle.isRemoved()) { // Paper - Ensure valid vehicle status
|
||||
+ // CraftBukkit end
|
||||
CompoundTag compoundTag = new CompoundTag();
|
||||
CompoundTag compoundTag1 = new CompoundTag();
|
||||
rootVehicle.save(compoundTag1);
|
||||
@@ -479,7 +_,7 @@
|
||||
if (!compound.isEmpty()) {
|
||||
ServerLevel serverLevel = this.serverLevel();
|
||||
ValueOutput valueOutput = output.child("RootVehicle");
|
||||
valueOutput.store("Attach", UUIDUtil.CODEC, vehicle.getUUID());
|
||||
rootVehicle.save(valueOutput.child("Entity"));
|
||||
@@ -486,7 +_,7 @@
|
||||
if (!optional.isEmpty()) {
|
||||
ServerLevel serverLevel = this.level();
|
||||
Entity entity = EntityType.loadEntityRecursive(
|
||||
- compound.get().getCompoundOrEmpty("Entity"), serverLevel, EntitySpawnReason.LOAD, entity2 -> !serverLevel.addWithUUID(entity2) ? null : entity2
|
||||
+ compound.get().getCompoundOrEmpty("Entity"), serverLevel, EntitySpawnReason.LOAD, entity2 -> !serverLevel.addWithUUID(entity2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT) ? null : entity2 // Paper - Entity#getEntitySpawnReason
|
||||
- optional.get().childOrEmpty("Entity"), serverLevel, EntitySpawnReason.LOAD, entity2 -> !serverLevel.addWithUUID(entity2) ? null : entity2
|
||||
+ optional.get().childOrEmpty("Entity"), serverLevel, EntitySpawnReason.LOAD, entity2 -> !serverLevel.addWithUUID(entity2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT) ? null : entity2 // Paper - Entity#getEntitySpawnReason
|
||||
);
|
||||
if (entity != null) {
|
||||
UUID uuid = compound.get().read("Attach", UUIDUtil.CODEC).orElse(null);
|
||||
@@ -496,10 +_,10 @@
|
||||
UUID uuid = optional.get().read("Attach", UUIDUtil.CODEC).orElse(null);
|
||||
@@ -503,10 +_,10 @@
|
||||
|
||||
if (!this.isPassenger()) {
|
||||
LOGGER.warn("Couldn't reattach entity to player");
|
||||
@@ -191,15 +181,15 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -511,6 +_,7 @@
|
||||
ListTag listTag = new ListTag();
|
||||
@@ -518,6 +_,7 @@
|
||||
ValueOutput.ValueOutputList valueOutputList = output.childrenList("ender_pearls");
|
||||
|
||||
for (ThrownEnderpearl thrownEnderpearl : this.enderPearls) {
|
||||
+ if (thrownEnderpearl.level().paperConfig().misc.legacyEnderPearlBehavior) continue; // Paper - Allow using old ender pearl behavior
|
||||
if (thrownEnderpearl.isRemoved()) {
|
||||
LOGGER.warn("Trying to save removed ender pearl, skipping");
|
||||
} else {
|
||||
@@ -546,6 +_,16 @@
|
||||
@@ -550,6 +_,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,7 +206,7 @@
|
||||
public void setExperiencePoints(int experiencePoints) {
|
||||
float f = this.getXpNeededForNextLevel();
|
||||
float f1 = (f - 1.0F) / f;
|
||||
@@ -603,6 +_,11 @@
|
||||
@@ -607,6 +_,11 @@
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
@@ -228,7 +218,7 @@
|
||||
this.tickClientLoadTimeout();
|
||||
this.gameMode.tick();
|
||||
this.wardenSpawnTracker.tick();
|
||||
@@ -610,9 +_,14 @@
|
||||
@@ -614,9 +_,14 @@
|
||||
this.invulnerableTime--;
|
||||
}
|
||||
|
||||
@@ -246,7 +236,7 @@
|
||||
this.containerMenu = this.inventoryMenu;
|
||||
}
|
||||
|
||||
@@ -662,7 +_,7 @@
|
||||
@@ -675,7 +_,7 @@
|
||||
|
||||
public void doTick() {
|
||||
try {
|
||||
@@ -255,7 +245,7 @@
|
||||
super.tick();
|
||||
}
|
||||
|
||||
@@ -676,7 +_,7 @@
|
||||
@@ -689,7 +_,7 @@
|
||||
if (this.getHealth() != this.lastSentHealth
|
||||
|| this.lastSentFood != this.foodData.getFoodLevel()
|
||||
|| this.foodData.getSaturationLevel() == 0.0F != this.lastFoodSaturationZero) {
|
||||
@@ -264,7 +254,7 @@
|
||||
this.lastSentHealth = this.getHealth();
|
||||
this.lastSentFood = this.foodData.getFoodLevel();
|
||||
this.lastFoodSaturationZero = this.foodData.getSaturationLevel() == 0.0F;
|
||||
@@ -707,6 +_,12 @@
|
||||
@@ -720,6 +_,12 @@
|
||||
this.updateScoreForCriteria(ObjectiveCriteria.EXPERIENCE, Mth.ceil((float)this.lastRecordedExperience));
|
||||
}
|
||||
|
||||
@@ -277,7 +267,7 @@
|
||||
if (this.experienceLevel != this.lastRecordedLevel) {
|
||||
this.lastRecordedLevel = this.experienceLevel;
|
||||
this.updateScoreForCriteria(ObjectiveCriteria.LEVEL, Mth.ceil((float)this.lastRecordedLevel));
|
||||
@@ -720,6 +_,21 @@
|
||||
@@ -733,6 +_,21 @@
|
||||
if (this.tickCount % 20 == 0) {
|
||||
CriteriaTriggers.LOCATION.trigger(this);
|
||||
}
|
||||
@@ -299,8 +289,8 @@
|
||||
} catch (Throwable var4) {
|
||||
CrashReport crashReport = CrashReport.forThrowable(var4, "Ticking player");
|
||||
CrashReportCategory crashReportCategory = crashReport.addCategory("Player being ticked");
|
||||
@@ -744,7 +_,7 @@
|
||||
if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.serverLevel().getGameRules().getBoolean(GameRules.RULE_NATURAL_REGENERATION)) {
|
||||
@@ -757,7 +_,7 @@
|
||||
if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.level().getGameRules().getBoolean(GameRules.RULE_NATURAL_REGENERATION)) {
|
||||
if (this.tickCount % 20 == 0) {
|
||||
if (this.getHealth() < this.getMaxHealth()) {
|
||||
- this.heal(1.0F);
|
||||
@@ -308,7 +298,7 @@
|
||||
}
|
||||
|
||||
float saturationLevel = this.foodData.getSaturationLevel();
|
||||
@@ -793,15 +_,36 @@
|
||||
@@ -806,15 +_,36 @@
|
||||
}
|
||||
|
||||
private void updateScoreForCriteria(ObjectiveCriteria criteria, int points) {
|
||||
@@ -318,7 +308,7 @@
|
||||
- @Override
|
||||
- public void die(DamageSource cause) {
|
||||
- this.gameEvent(GameEvent.ENTITY_DIE);
|
||||
- boolean _boolean = this.serverLevel().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES);
|
||||
- boolean _boolean = this.level().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES);
|
||||
- if (_boolean) {
|
||||
- Component deathMessage = this.getCombatTracker().getDeathMessage();
|
||||
+ this.level().getCraftServer().getScoreboardManager().forAllObjectives(criteria, this, score -> score.set(points)); // CraftBukkit - Use our scores instead
|
||||
@@ -354,7 +344,7 @@
|
||||
this.connection
|
||||
.send(
|
||||
new ClientboundPlayerCombatKillPacket(this.getId(), deathMessage),
|
||||
@@ -818,6 +_,65 @@
|
||||
@@ -831,6 +_,65 @@
|
||||
}
|
||||
)
|
||||
);
|
||||
@@ -366,13 +356,13 @@
|
||||
+ @Override
|
||||
+ public void die(DamageSource cause) {
|
||||
+ // this.gameEvent(GameEvent.ENTITY_DIE); // Paper - move below event cancellation check
|
||||
+ boolean _boolean = this.serverLevel().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); final boolean showDeathMessage = _boolean; // Paper - OBFHELPER
|
||||
+ boolean _boolean = this.level().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); final boolean showDeathMessage = _boolean; // Paper - OBFHELPER
|
||||
+ // CraftBukkit start - fire PlayerDeathEvent
|
||||
+ if (this.isRemoved()) {
|
||||
+ return;
|
||||
+ }
|
||||
+ List<DefaultDrop> loot = new java.util.ArrayList<>(this.getInventory().getContainerSize()); // Paper - Restore vanilla drops behavior
|
||||
+ boolean keepInventory = this.serverLevel().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator();
|
||||
+ boolean keepInventory = this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator();
|
||||
+ if (!keepInventory) {
|
||||
+ for (ItemStack item : this.getInventory().getContents()) {
|
||||
+ if (!item.isEmpty() && !EnchantmentHelper.has(item, net.minecraft.world.item.enchantment.EnchantmentEffectComponents.PREVENT_EQUIPMENT_DROP)) {
|
||||
@@ -380,9 +370,9 @@
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ if (this.shouldDropLoot() && this.serverLevel().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { // Paper - fix player loottables running when mob loot gamerule is false
|
||||
+ if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { // Paper - fix player loottables running when mob loot gamerule is false
|
||||
+ // SPIGOT-5071: manually add player loot tables (SPIGOT-5195 - ignores keepInventory rule)
|
||||
+ this.dropFromLootTable(this.serverLevel(), cause, this.lastHurtByPlayerMemoryTime > 0);
|
||||
+ this.dropFromLootTable(this.level(), cause, this.lastHurtByPlayerMemoryTime > 0);
|
||||
+ // Paper - Restore vanilla drops behaviour; custom death loot is a noop on server player, remove.
|
||||
+ loot.addAll(this.drops);
|
||||
+ this.drops.clear(); // SPIGOT-5188: make sure to clear
|
||||
@@ -420,7 +410,7 @@
|
||||
Team team = this.getTeam();
|
||||
if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) {
|
||||
this.server.getPlayerList().broadcastSystemMessage(deathMessage, false);
|
||||
@@ -827,7 +_,7 @@
|
||||
@@ -840,7 +_,7 @@
|
||||
this.server.getPlayerList().broadcastSystemToAllExceptTeam(this, deathMessage);
|
||||
}
|
||||
} else {
|
||||
@@ -429,14 +419,14 @@
|
||||
}
|
||||
|
||||
this.removeEntitiesOnShoulder();
|
||||
@@ -835,11 +_,35 @@
|
||||
@@ -848,11 +_,35 @@
|
||||
this.tellNeutralMobsThatIDied();
|
||||
}
|
||||
|
||||
- if (!this.isSpectator()) {
|
||||
- this.dropAllDeathLoot(this.serverLevel(), cause);
|
||||
- this.dropAllDeathLoot(this.level(), cause);
|
||||
+ // SPIGOT-5478 must be called manually now
|
||||
+ if (event.shouldDropExperience()) this.dropExperience(this.serverLevel(), cause.getEntity()); // Paper - tie to event
|
||||
+ if (event.shouldDropExperience()) this.dropExperience(this.level(), cause.getEntity()); // Paper - tie to event
|
||||
+ // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory.
|
||||
+ if (!event.getKeepInventory()) {
|
||||
+ // Paper start - PlayerDeathEvent#getItemsToKeep
|
||||
@@ -468,7 +458,7 @@
|
||||
LivingEntity killCredit = this.getKillCredit();
|
||||
if (killCredit != null) {
|
||||
this.awardStat(Stats.ENTITY_KILLED_BY.get(killCredit.getType()));
|
||||
@@ -872,10 +_,10 @@
|
||||
@@ -885,10 +_,10 @@
|
||||
public void awardKillScore(Entity entity, DamageSource damageSource) {
|
||||
if (entity != this) {
|
||||
super.awardKillScore(entity, damageSource);
|
||||
@@ -481,7 +471,7 @@
|
||||
} else {
|
||||
this.awardStat(Stats.MOB_KILLS);
|
||||
}
|
||||
@@ -891,7 +_,7 @@
|
||||
@@ -904,7 +_,7 @@
|
||||
if (playersTeam != null) {
|
||||
int id = playersTeam.getColor().getId();
|
||||
if (id >= 0 && id < crtieria.length) {
|
||||
@@ -490,7 +480,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -902,9 +_,20 @@
|
||||
@@ -915,9 +_,20 @@
|
||||
return false;
|
||||
} else {
|
||||
Entity entity = damageSource.getEntity();
|
||||
@@ -513,7 +503,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -914,23 +_,77 @@
|
||||
@@ -927,23 +_,77 @@
|
||||
}
|
||||
|
||||
private boolean isPvpAllowed() {
|
||||
@@ -596,8 +586,8 @@
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
|
||||
public static Optional<ServerPlayer.RespawnPosAngle> findRespawnAndUseSpawnBlock(
|
||||
@@ -947,10 +_,10 @@
|
||||
public boolean isReceivingWaypoints() {
|
||||
@@ -978,10 +_,10 @@
|
||||
level.setBlock(blockPos, blockState.setValue(RespawnAnchorBlock.CHARGE, blockState.getValue(RespawnAnchorBlock.CHARGE) - 1), 3);
|
||||
}
|
||||
|
||||
@@ -610,7 +600,7 @@
|
||||
} else if (!flag) {
|
||||
return Optional.empty();
|
||||
} else {
|
||||
@@ -958,7 +_,7 @@
|
||||
@@ -989,7 +_,7 @@
|
||||
BlockState blockState1 = level.getBlockState(blockPos.above());
|
||||
boolean isPossibleToRespawnInThis1 = blockState1.getBlock().isPossibleToRespawnInThis(blockState1);
|
||||
return isPossibleToRespawnInThis && isPossibleToRespawnInThis1
|
||||
@@ -619,7 +609,7 @@
|
||||
: Optional.empty();
|
||||
}
|
||||
}
|
||||
@@ -976,6 +_,7 @@
|
||||
@@ -1007,6 +_,7 @@
|
||||
@Nullable
|
||||
@Override
|
||||
public ServerPlayer teleport(TeleportTransition teleportTransition) {
|
||||
@@ -627,10 +617,10 @@
|
||||
if (this.isRemoved()) {
|
||||
return null;
|
||||
} else {
|
||||
@@ -985,17 +_,52 @@
|
||||
@@ -1016,17 +_,52 @@
|
||||
|
||||
ServerLevel level = teleportTransition.newLevel();
|
||||
ServerLevel serverLevel = this.serverLevel();
|
||||
ServerLevel serverLevel = this.level();
|
||||
- ResourceKey<Level> resourceKey = serverLevel.dimension();
|
||||
+ // CraftBukkit start
|
||||
+ ResourceKey<net.minecraft.world.level.dimension.LevelStem> resourceKey = serverLevel.getTypeKey();
|
||||
@@ -640,8 +630,8 @@
|
||||
+ org.bukkit.Location exit = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(absolutePosition.position(), level.getWorld(), absolutePosition.yRot(), absolutePosition.xRot());
|
||||
+ org.bukkit.event.player.PlayerTeleportEvent tpEvent = new org.bukkit.event.player.PlayerTeleportEvent(this.getBukkitEntity(), enter, exit.clone(), teleportTransition.cause());
|
||||
+ // Paper start - gateway-specific teleport event
|
||||
+ if (this.portalProcess != null && this.portalProcess.isSamePortal(((net.minecraft.world.level.block.EndGatewayBlock) net.minecraft.world.level.block.Blocks.END_GATEWAY)) && this.serverLevel().getBlockEntity(this.portalProcess.getEntryPosition()) instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity theEndGatewayBlockEntity) {
|
||||
+ tpEvent = new com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent(this.getBukkitEntity(), enter, exit.clone(), new org.bukkit.craftbukkit.block.CraftEndGateway(this.serverLevel().getWorld(), theEndGatewayBlockEntity));
|
||||
+ if (this.portalProcess != null && this.portalProcess.isSamePortal(((net.minecraft.world.level.block.EndGatewayBlock) net.minecraft.world.level.block.Blocks.END_GATEWAY)) && this.level().getBlockEntity(this.portalProcess.getEntryPosition()) instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity theEndGatewayBlockEntity) {
|
||||
+ tpEvent = new com.destroystokyo.paper.event.player.PlayerTeleportEndGatewayEvent(this.getBukkitEntity(), enter, exit.clone(), new org.bukkit.craftbukkit.block.CraftEndGateway(this.level().getWorld(), theEndGatewayBlockEntity));
|
||||
+ }
|
||||
+ // Paper end - gateway-specific teleport event
|
||||
+ org.bukkit.Bukkit.getServer().getPluginManager().callEvent(tpEvent);
|
||||
@@ -683,7 +673,7 @@
|
||||
this.isChangingDimension = true;
|
||||
LevelData levelData = level.getLevelData();
|
||||
this.connection.send(new ClientboundRespawnPacket(this.createCommonSpawnInfo(level), (byte)3));
|
||||
@@ -1004,16 +_,30 @@
|
||||
@@ -1035,16 +_,30 @@
|
||||
playerList.sendPlayerPermissionLevel(this);
|
||||
serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION);
|
||||
this.unsetRemoved();
|
||||
@@ -716,12 +706,10 @@
|
||||
this.connection.resetPosition();
|
||||
level.addDuringTeleport(this);
|
||||
profilerFiller.pop();
|
||||
@@ -1027,10 +_,39 @@
|
||||
this.lastSentExp = -1;
|
||||
@@ -1059,10 +_,37 @@
|
||||
this.lastSentHealth = -1.0F;
|
||||
this.lastSentFood = -1;
|
||||
+
|
||||
+
|
||||
this.teleportSpectators(teleportTransition, serverLevel);
|
||||
+ // CraftBukkit start
|
||||
+ org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), serverLevel.getWorld());
|
||||
+ this.level().getCraftServer().getPluginManager().callEvent(changeEvent);
|
||||
@@ -756,7 +744,7 @@
|
||||
|
||||
@Override
|
||||
public void forceSetRotation(float yRot, float xRot) {
|
||||
@@ -1040,12 +_,26 @@
|
||||
@@ -1072,12 +_,26 @@
|
||||
public void triggerDimensionChangeTriggers(ServerLevel level) {
|
||||
ResourceKey<Level> resourceKey = level.dimension();
|
||||
ResourceKey<Level> resourceKey1 = this.level().dimension();
|
||||
@@ -786,7 +774,7 @@
|
||||
this.enteredNetherPosition = null;
|
||||
}
|
||||
}
|
||||
@@ -1061,19 +_,18 @@
|
||||
@@ -1093,19 +_,18 @@
|
||||
this.containerMenu.broadcastChanges();
|
||||
}
|
||||
|
||||
@@ -810,7 +798,7 @@
|
||||
if (this.level().isBrightOutside()) {
|
||||
return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW);
|
||||
} else {
|
||||
@@ -1092,7 +_,34 @@
|
||||
@@ -1124,7 +_,34 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -846,7 +834,7 @@
|
||||
this.awardStat(Stats.SLEEP_IN_BED);
|
||||
CriteriaTriggers.SLEPT_IN_BED.trigger(this);
|
||||
});
|
||||
@@ -1128,21 +_,29 @@
|
||||
@@ -1160,21 +_,29 @@
|
||||
|
||||
@Override
|
||||
public void stopSleepInBed(boolean wakeImmediately, boolean updateLevelForSleepingPlayers) {
|
||||
@@ -859,7 +847,7 @@
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
if (this.isSleeping()) {
|
||||
this.serverLevel().getChunkSource().broadcastAndSend(this, new ClientboundAnimatePacket(this, 2));
|
||||
this.level().getChunkSource().broadcastAndSend(this, new ClientboundAnimatePacket(this, 2));
|
||||
}
|
||||
|
||||
super.stopSleepInBed(wakeImmediately, updateLevelForSleepingPlayers);
|
||||
@@ -879,8 +867,8 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1185,8 +_,9 @@
|
||||
this.connection.send(new ClientboundOpenSignEditorPacket(signEntity.getBlockPos(), isFrontText));
|
||||
@@ -1222,8 +_,9 @@
|
||||
this.connection.send(new ClientboundShowDialogPacket(dialog));
|
||||
}
|
||||
|
||||
- public void nextContainerCounter() {
|
||||
@@ -890,7 +878,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1194,12 +_,39 @@
|
||||
@@ -1231,12 +_,39 @@
|
||||
if (menu == null) {
|
||||
return OptionalInt.empty();
|
||||
} else {
|
||||
@@ -931,7 +919,7 @@
|
||||
if (abstractContainerMenu == null) {
|
||||
if (this.isSpectator()) {
|
||||
this.displayClientMessage(Component.translatable("container.spectatorCantOpen").withStyle(ChatFormatting.RED), true);
|
||||
@@ -1207,10 +_,14 @@
|
||||
@@ -1244,10 +_,14 @@
|
||||
|
||||
return OptionalInt.empty();
|
||||
} else {
|
||||
@@ -948,7 +936,7 @@
|
||||
return OptionalInt.of(this.containerCounter);
|
||||
}
|
||||
}
|
||||
@@ -1223,14 +_,25 @@
|
||||
@@ -1260,14 +_,25 @@
|
||||
|
||||
@Override
|
||||
public void openHorseInventory(AbstractHorse horse, Container inventory) {
|
||||
@@ -977,7 +965,7 @@
|
||||
this.initMenu(this.containerMenu);
|
||||
}
|
||||
|
||||
@@ -1252,10 +_,30 @@
|
||||
@@ -1289,10 +_,30 @@
|
||||
|
||||
@Override
|
||||
public void closeContainer() {
|
||||
@@ -1008,7 +996,7 @@
|
||||
@Override
|
||||
public void doCloseContainer() {
|
||||
this.containerMenu.removed(this);
|
||||
@@ -1278,19 +_,19 @@
|
||||
@@ -1315,19 +_,19 @@
|
||||
int rounded = Math.round((float)Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F);
|
||||
if (rounded > 0) {
|
||||
this.awardStat(Stats.SWIM_ONE_CM, rounded);
|
||||
@@ -1031,7 +1019,7 @@
|
||||
}
|
||||
} else if (this.onClimbable()) {
|
||||
if (dy > 0.0) {
|
||||
@@ -1301,13 +_,13 @@
|
||||
@@ -1338,13 +_,13 @@
|
||||
if (rounded > 0) {
|
||||
if (this.isSprinting()) {
|
||||
this.awardStat(Stats.SPRINT_ONE_CM, rounded);
|
||||
@@ -1048,7 +1036,7 @@
|
||||
}
|
||||
}
|
||||
} else if (this.isFallFlying()) {
|
||||
@@ -1347,13 +_,13 @@
|
||||
@@ -1386,13 +_,13 @@
|
||||
@Override
|
||||
public void awardStat(Stat<?> stat, int amount) {
|
||||
this.stats.increment(this, stat, amount);
|
||||
@@ -1064,7 +1052,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1384,9 +_,9 @@
|
||||
@@ -1423,9 +_,9 @@
|
||||
super.jumpFromGround();
|
||||
this.awardStat(Stats.JUMP);
|
||||
if (this.isSprinting()) {
|
||||
@@ -1076,7 +1064,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1399,6 +_,13 @@
|
||||
@@ -1438,6 +_,13 @@
|
||||
public void disconnect() {
|
||||
this.disconnected = true;
|
||||
this.ejectPassengers();
|
||||
@@ -1090,7 +1078,7 @@
|
||||
if (this.isSleeping()) {
|
||||
this.stopSleepInBed(true, false);
|
||||
}
|
||||
@@ -1410,6 +_,7 @@
|
||||
@@ -1449,6 +_,7 @@
|
||||
|
||||
public void resetSentInfo() {
|
||||
this.lastSentHealth = -1.0E8F;
|
||||
@@ -1098,7 +1086,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1444,12 +_,12 @@
|
||||
@@ -1483,12 +_,12 @@
|
||||
this.onUpdateAbilities();
|
||||
if (keepEverything) {
|
||||
this.getAttributes().assignBaseValues(that.getAttributes());
|
||||
@@ -1113,16 +1101,16 @@
|
||||
}
|
||||
|
||||
this.getInventory().replaceWith(that.getInventory());
|
||||
@@ -1460,7 +_,7 @@
|
||||
@@ -1499,7 +_,7 @@
|
||||
this.portalProcess = that.portalProcess;
|
||||
} else {
|
||||
this.getAttributes().assignBaseValues(that.getAttributes());
|
||||
- this.setHealth(this.getMaxHealth());
|
||||
+ // this.setHealth(this.getMaxHealth()); // CraftBukkit
|
||||
if (this.serverLevel().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || that.isSpectator()) {
|
||||
if (this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || that.isSpectator()) {
|
||||
this.getInventory().replaceWith(that.getInventory());
|
||||
this.experienceLevel = that.experienceLevel;
|
||||
@@ -1476,7 +_,7 @@
|
||||
@@ -1515,7 +_,7 @@
|
||||
this.lastSentExp = -1;
|
||||
this.lastSentHealth = -1.0F;
|
||||
this.lastSentFood = -1;
|
||||
@@ -1131,7 +1119,7 @@
|
||||
this.seenCredits = that.seenCredits;
|
||||
this.enteredNetherPosition = that.enteredNetherPosition;
|
||||
this.chunkTrackingView = that.chunkTrackingView;
|
||||
@@ -1529,7 +_,7 @@
|
||||
@@ -1568,7 +_,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1140,7 +1128,7 @@
|
||||
if (this.isSleeping()) {
|
||||
this.stopSleepInBed(true, true);
|
||||
}
|
||||
@@ -1538,7 +_,7 @@
|
||||
@@ -1577,7 +_,7 @@
|
||||
this.setCamera(this);
|
||||
}
|
||||
|
||||
@@ -1149,7 +1137,7 @@
|
||||
if (flag) {
|
||||
this.setYHeadRot(relativeMovements.contains(Relative.Y_ROT) ? this.getYHeadRot() + yaw : yaw);
|
||||
}
|
||||
@@ -1575,9 +_,17 @@
|
||||
@@ -1615,9 +_,17 @@
|
||||
}
|
||||
|
||||
public boolean setGameMode(GameType gameMode) {
|
||||
@@ -1169,7 +1157,7 @@
|
||||
} else {
|
||||
this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, gameMode.getId()));
|
||||
if (gameMode == GameType.SPECTATOR) {
|
||||
@@ -1593,7 +_,7 @@
|
||||
@@ -1633,7 +_,7 @@
|
||||
|
||||
this.onUpdateAbilities();
|
||||
this.updateEffectVisibility();
|
||||
@@ -1178,7 +1166,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1649,8 +_,13 @@
|
||||
@@ -1689,8 +_,13 @@
|
||||
}
|
||||
|
||||
public void sendChatMessage(OutgoingChatMessage message, boolean filtered, ChatType.Bound boundType) {
|
||||
@@ -1193,7 +1181,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1661,7 +_,42 @@
|
||||
@@ -1701,7 +_,42 @@
|
||||
}
|
||||
|
||||
public void updateOptions(ClientInformation clientInformation) {
|
||||
@@ -1236,7 +1224,7 @@
|
||||
this.requestedViewDistance = clientInformation.viewDistance();
|
||||
this.chatVisibility = clientInformation.chatVisibility();
|
||||
this.canChatColor = clientInformation.chatColors();
|
||||
@@ -1747,8 +_,23 @@
|
||||
@@ -1787,8 +_,23 @@
|
||||
Entity camera = this.getCamera();
|
||||
this.camera = (Entity)(entityToSpectate == null ? this : entityToSpectate);
|
||||
if (camera != this.camera) {
|
||||
@@ -1261,7 +1249,7 @@
|
||||
}
|
||||
|
||||
if (entityToSpectate != null) {
|
||||
@@ -1782,11 +_,11 @@
|
||||
@@ -1822,11 +_,11 @@
|
||||
|
||||
@Nullable
|
||||
public Component getTabListDisplayName() {
|
||||
@@ -1275,7 +1263,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1817,11 +_,56 @@
|
||||
@@ -1857,11 +_,56 @@
|
||||
}
|
||||
|
||||
public void setRespawnPosition(@Nullable ServerPlayer.RespawnConfig respawnConfig, boolean displayInChat) {
|
||||
@@ -1334,7 +1322,7 @@
|
||||
}
|
||||
|
||||
public SectionPos getLastSectionPos() {
|
||||
@@ -1851,16 +_,23 @@
|
||||
@@ -1891,16 +_,23 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1362,24 +1350,24 @@
|
||||
return itemEntity;
|
||||
}
|
||||
|
||||
@@ -1888,6 +_,16 @@
|
||||
@@ -1928,6 +_,16 @@
|
||||
}
|
||||
|
||||
public void loadGameTypes(@Nullable CompoundTag tag) {
|
||||
public void loadGameTypes(@Nullable ValueInput input) {
|
||||
+ // Paper start - Expand PlayerGameModeChangeEvent
|
||||
+ if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != readPlayerMode(tag, "playerGameType")) {
|
||||
+ if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != readPlayerMode(input, "playerGameType")) {
|
||||
+ if (new org.bukkit.event.player.PlayerGameModeChangeEvent(this.getBukkitEntity(), org.bukkit.GameMode.getByValue(this.server.getDefaultGameType().getId()), org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, null).callEvent()) {
|
||||
+ this.gameMode.setGameModeForPlayer(this.server.getForcedGameType(), GameType.DEFAULT_MODE);
|
||||
+ } else {
|
||||
+ this.gameMode.setGameModeForPlayer(readPlayerMode(tag,"playerGameType"), readPlayerMode(tag, "previousPlayerGameType"));
|
||||
+ this.gameMode.setGameModeForPlayer(readPlayerMode(input, "playerGameType"), readPlayerMode(input, "previousPlayerGameType"));
|
||||
+ }
|
||||
+ return;
|
||||
+ }
|
||||
+ // Paper end - Expand PlayerGameModeChangeEvent
|
||||
this.gameMode
|
||||
.setGameModeForPlayer(this.calculateGameModeForNewPlayer(readPlayerMode(tag, "playerGameType")), readPlayerMode(tag, "previousPlayerGameType"));
|
||||
.setGameModeForPlayer(this.calculateGameModeForNewPlayer(readPlayerMode(input, "playerGameType")), readPlayerMode(input, "previousPlayerGameType"));
|
||||
}
|
||||
@@ -1989,8 +_,14 @@
|
||||
@@ -2029,8 +_,14 @@
|
||||
|
||||
@Override
|
||||
public void removeVehicle() {
|
||||
@@ -1395,7 +1383,7 @@
|
||||
if (vehicle instanceof LivingEntity livingEntity) {
|
||||
for (MobEffectInstance mobEffectInstance : livingEntity.getActiveEffects()) {
|
||||
this.connection.send(new ClientboundRemoveMobEffectPacket(vehicle.getId(), mobEffectInstance.getEffect()));
|
||||
@@ -2089,7 +_,7 @@
|
||||
@@ -2129,7 +_,7 @@
|
||||
}
|
||||
|
||||
public static long placeEnderPearlTicket(ServerLevel level, ChunkPos pos) {
|
||||
@@ -1404,7 +1392,7 @@
|
||||
return TicketType.ENDER_PEARL.timeout();
|
||||
}
|
||||
|
||||
@@ -2113,9 +_,11 @@
|
||||
@@ -2153,9 +_,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1419,7 +1407,7 @@
|
||||
}
|
||||
|
||||
private static float calculateLookAtYaw(Vec3 position, BlockPos towardsPos) {
|
||||
@@ -2123,4 +_,143 @@
|
||||
@@ -2163,4 +_,143 @@
|
||||
return (float)Mth.wrapDegrees(Mth.atan2(vec3.z, vec3.x) * 180.0F / (float)Math.PI - 90.0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
public ServerPlayerGameMode(ServerPlayer player) {
|
||||
this.player = player;
|
||||
this.level = player.serverLevel();
|
||||
this.level = player.level();
|
||||
}
|
||||
|
||||
+ @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper
|
||||
@@ -40,8 +40,8 @@
|
||||
+ // CraftBukkit end
|
||||
+ this.setGameModeForPlayer(gameModeForPlayer, this.gameModeForPlayer); // Paper - Fix MC-259571
|
||||
this.player.onUpdateAbilities();
|
||||
this.player
|
||||
.server
|
||||
this.level
|
||||
.getServer()
|
||||
.getPlayerList()
|
||||
- .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player));
|
||||
+ .broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_GAME_MODE, this.player), this.player); // CraftBukkit
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
|
||||
+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
|
||||
@@ -27,30 +_,67 @@
|
||||
@@ -29,30 +_,67 @@
|
||||
import net.minecraft.util.profiling.Profiler;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
|
||||
private void close() {
|
||||
if (!this.closed) {
|
||||
@@ -61,6 +_,12 @@
|
||||
@@ -63,6 +_,12 @@
|
||||
|
||||
@Override
|
||||
public void onDisconnect(DisconnectionDetails details) {
|
||||
@@ -86,7 +86,7 @@
|
||||
if (this.isSingleplayerOwner()) {
|
||||
LOGGER.info("Stopping singleplayer server as player logged out");
|
||||
this.server.halt(false);
|
||||
@@ -80,7 +_,7 @@
|
||||
@@ -82,7 +_,7 @@
|
||||
this.latency = (this.latency * 3 + i) / 4;
|
||||
this.keepAlivePending = false;
|
||||
} else if (!this.isSingleplayerOwner()) {
|
||||
@@ -95,7 +95,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,30 +_,123 @@
|
||||
@@ -90,9 +_,73 @@
|
||||
public void handlePong(ServerboundPongPacket packet) {
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
+ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+
|
||||
+ final net.minecraft.resources.ResourceLocation identifier = packet.payload().type().id();
|
||||
+ final byte[] data = discardedPayload.data();
|
||||
@@ -169,7 +169,8 @@
|
||||
+ // Paper end
|
||||
|
||||
@Override
|
||||
public void handleResourcePackResponse(ServerboundResourcePackPacket packet) {
|
||||
public void handleCustomClickAction(ServerboundCustomClickActionPacket packet) {
|
||||
@@ -105,21 +_,50 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.server);
|
||||
if (packet.action() == ServerboundResourcePackPacket.Action.DECLINED && this.server.isResourcePackRequired()) {
|
||||
LOGGER.info("Disconnecting {} due to resource pack {} rejection", this.playerProfile().getName(), packet.id());
|
||||
@@ -225,7 +226,7 @@
|
||||
} else if (this.checkIfClosed(millis)) {
|
||||
this.keepAlivePending = true;
|
||||
this.keepAliveTime = millis;
|
||||
@@ -126,7 +_,7 @@
|
||||
@@ -134,7 +_,7 @@
|
||||
private boolean checkIfClosed(long time) {
|
||||
if (this.closed) {
|
||||
if (time - this.closedListenerTime >= 15000L) {
|
||||
@@ -234,10 +235,10 @@
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -149,6 +_,13 @@
|
||||
@@ -157,6 +_,13 @@
|
||||
}
|
||||
|
||||
public void send(Packet<?> packet, @Nullable PacketSendListener listener) {
|
||||
public void send(Packet<?> packet, @Nullable ChannelFutureListener channelFutureListener) {
|
||||
+ // CraftBukkit start
|
||||
+ if (packet == null || this.processedDisconnect) { // Spigot
|
||||
+ return;
|
||||
@@ -248,7 +249,7 @@
|
||||
if (packet.isTerminal()) {
|
||||
this.close();
|
||||
}
|
||||
@@ -165,19 +_,115 @@
|
||||
@@ -173,19 +_,115 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -139,16 +_,21 @@
|
||||
@@ -139,16 +_,22 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -57,9 +57,10 @@
|
||||
return;
|
||||
}
|
||||
|
||||
- ServerPlayer playerForLogin = playerList.getPlayerForLogin(this.gameProfile, this.clientInformation);
|
||||
+ ServerPlayer playerForLogin = playerList.getPlayerForLogin(this.gameProfile, this.clientInformation, this.player); // CraftBukkit
|
||||
playerList.placeNewPlayer(this.connection, playerForLogin, this.createCookie(this.clientInformation));
|
||||
- ServerPlayer serverPlayer = new ServerPlayer(this.server, this.server.overworld(), this.gameProfile, this.clientInformation);
|
||||
+ ServerPlayer serverPlayer = this.player; // Paper
|
||||
+ this.player.updateOptions(this.clientInformation); // Paper - Of course, we reuse the player
|
||||
playerList.placeNewPlayer(this.connection, serverPlayer, this.createCookie(this.clientInformation));
|
||||
} catch (Exception var5) {
|
||||
LOGGER.error("Couldn't place player in world", (Throwable)var5);
|
||||
+ // Paper start - Debugging
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
@@ -204,6 +_,39 @@
|
||||
@@ -208,6 +_,38 @@
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
@@ -33,14 +33,13 @@
|
||||
+import org.bukkit.event.player.PlayerSwapHandItemsEvent;
|
||||
+import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
+import org.bukkit.event.player.PlayerToggleFlightEvent;
|
||||
+import org.bukkit.event.player.PlayerToggleSneakEvent;
|
||||
+import org.bukkit.event.player.PlayerToggleSprintEvent;
|
||||
+// CraftBukkit end
|
||||
+
|
||||
public class ServerGamePacketListenerImpl
|
||||
extends ServerCommonPacketListenerImpl
|
||||
implements GameProtocols.Context,
|
||||
@@ -222,7 +_,9 @@
|
||||
@@ -226,7 +_,9 @@
|
||||
private int tickCount;
|
||||
private int ackBlockChangesUpTo = -1;
|
||||
private final TickThrottler chatSpamThrottler = new TickThrottler(20, 200);
|
||||
@@ -50,7 +49,7 @@
|
||||
private double firstGoodX;
|
||||
private double firstGoodY;
|
||||
private double firstGoodZ;
|
||||
@@ -248,23 +_,42 @@
|
||||
@@ -252,23 +_,42 @@
|
||||
private int receivedMovePacketCount;
|
||||
private int knownMovePacketCount;
|
||||
private boolean receivedMovementThisTick;
|
||||
@@ -95,7 +94,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -284,8 +_,8 @@
|
||||
@@ -288,8 +_,8 @@
|
||||
this.knownMovePacketCount = this.receivedMovePacketCount;
|
||||
if (this.clientIsFloating && !this.player.isSleeping() && !this.player.isPassenger() && !this.player.isDeadOrDying()) {
|
||||
if (++this.aboveGroundTickCount > this.getMaximumFlyingTicks(this.player)) {
|
||||
@@ -106,7 +105,7 @@
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@@ -303,8 +_,8 @@
|
||||
@@ -307,8 +_,8 @@
|
||||
this.vehicleLastGoodZ = this.lastVehicle.getZ();
|
||||
if (this.clientVehicleIsFloating && this.lastVehicle.getControllingPassenger() == this.player) {
|
||||
if (++this.aboveGroundVehicleTickCount > this.getMaximumFlyingTicks(this.lastVehicle)) {
|
||||
@@ -117,7 +116,7 @@
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@@ -320,11 +_,20 @@
|
||||
@@ -324,11 +_,20 @@
|
||||
this.keepConnectionAlive();
|
||||
this.chatSpamThrottler.tick();
|
||||
this.dropSpamThrottler.tick();
|
||||
@@ -141,22 +140,49 @@
|
||||
}
|
||||
|
||||
private int getMaximumFlyingTicks(Entity entity) {
|
||||
@@ -384,6 +_,12 @@
|
||||
@@ -388,11 +_,37 @@
|
||||
@Override
|
||||
public void handlePlayerInput(ServerboundPlayerInputPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ // CraftBukkit start
|
||||
+ if (!packet.input().equals(this.player.getLastClientInput())) {
|
||||
+ PlayerInputEvent event = new PlayerInputEvent(this.player.getBukkitEntity(), new org.bukkit.craftbukkit.CraftInput(packet.input()));
|
||||
+ this.cserver.getPluginManager().callEvent(event);
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+ // Paper start - PlayerToggleSneakEvent
|
||||
+ net.minecraft.world.entity.player.Input lastInput = this.player.getLastClientInput();
|
||||
+ boolean shiftKeyDown = packet.input().shift();
|
||||
+ if (lastInput.shift() != packet.input().shift()) {
|
||||
+ // Has sneak changed
|
||||
+ org.bukkit.event.player.PlayerToggleSneakEvent event = new org.bukkit.event.player.PlayerToggleSneakEvent(this.getCraftPlayer(), packet.input().shift());
|
||||
+ this.cserver.getPluginManager().callEvent(event);
|
||||
+
|
||||
+ // Technically the player input and the flag is desynced, but this is previous behavior.. so should be fine?
|
||||
+ if (event.isCancelled()) {
|
||||
+ shiftKeyDown = this.player.isShiftKeyDown();
|
||||
+ }
|
||||
+ }
|
||||
+ // Paper end - PlayerToggleSneakEvent
|
||||
this.player.setLastClientInput(packet.input());
|
||||
if (this.player.hasClientLoaded()) {
|
||||
this.player.resetLastActionTime();
|
||||
- this.player.setShiftKeyDown(packet.input().shift());
|
||||
- }
|
||||
+ this.player.setShiftKeyDown(shiftKeyDown); // Paper
|
||||
+ }
|
||||
+ // Paper start - Add option to make parrots stay
|
||||
+ if (packet.input().shift() && this.player.level().paperConfig().entities.behavior.parrotsAreUnaffectedByPlayerMovement) {
|
||||
+ this.player.removeEntitiesOnShoulder();
|
||||
+ }
|
||||
+ // Paper end - Add option to make parrots stay
|
||||
+
|
||||
}
|
||||
|
||||
@@ -403,17 +_,29 @@
|
||||
private static boolean containsInvalidValues(double x, double y, double z, float yRot, float xRot) {
|
||||
@@ -411,17 +_,29 @@
|
||||
public void handleMoveVehicle(ServerboundMoveVehiclePacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
if (containsInvalidValues(packet.position().x(), packet.position().y(), packet.position().z(), packet.yRot(), packet.xRot())) {
|
||||
- this.disconnect(Component.translatable("multiplayer.disconnect.invalid_vehicle_movement"));
|
||||
+ this.disconnect(Component.translatable("multiplayer.disconnect.invalid_vehicle_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_VEHICLE_MOVEMENT); // Paper - kick event cause
|
||||
@@ -168,7 +194,7 @@
|
||||
+ }
|
||||
+ // Paper end - Don't allow vehicle movement from players while teleporting
|
||||
if (rootVehicle != this.player && rootVehicle.getControllingPassenger() == this.player && rootVehicle == this.lastVehicle) {
|
||||
ServerLevel serverLevel = this.player.serverLevel();
|
||||
ServerLevel serverLevel = this.player.level();
|
||||
+ // CraftBukkit - store current player position
|
||||
+ double prevX = this.player.getX();
|
||||
+ double prevY = this.player.getY();
|
||||
@@ -188,7 +214,7 @@
|
||||
float f = Mth.wrapDegrees(packet.yRot());
|
||||
float f1 = Mth.wrapDegrees(packet.xRot());
|
||||
double d3 = d - this.vehicleFirstGoodX;
|
||||
@@ -421,7 +_,52 @@
|
||||
@@ -429,7 +_,52 @@
|
||||
double d5 = d2 - this.vehicleFirstGoodZ;
|
||||
double d6 = rootVehicle.getDeltaMovement().lengthSqr();
|
||||
double d7 = d3 * d3 + d4 * d4 + d5 * d5;
|
||||
@@ -242,48 +268,34 @@
|
||||
LOGGER.warn(
|
||||
"{} (vehicle of {}) moved too quickly! {},{},{}", rootVehicle.getName().getString(), this.player.getName().getString(), d3, d4, d5
|
||||
);
|
||||
@@ -430,15 +_,16 @@
|
||||
@@ -438,9 +_,9 @@
|
||||
}
|
||||
|
||||
boolean flag = serverLevel.noCollision(rootVehicle, rootVehicle.getBoundingBox().deflate(0.0625));
|
||||
AABB boundingBox = rootVehicle.getBoundingBox();
|
||||
- d3 = d - this.vehicleLastGoodX;
|
||||
- d4 = d1 - this.vehicleLastGoodY;
|
||||
- d5 = d2 - this.vehicleLastGoodZ;
|
||||
+ d3 = d - this.vehicleLastGoodX; // Paper - diff on change, used for checking large move vectors above
|
||||
+ d4 = d1 - this.vehicleLastGoodY; // Paper - diff on change, used for checking large move vectors above
|
||||
+ d5 = d2 - this.vehicleLastGoodZ; // Paper - diff on change, used for checking large move vectors above
|
||||
boolean flag1 = rootVehicle.verticalCollisionBelow;
|
||||
boolean flag = rootVehicle.verticalCollisionBelow;
|
||||
if (rootVehicle instanceof LivingEntity livingEntity && livingEntity.onClimbable()) {
|
||||
livingEntity.resetFallDistance();
|
||||
}
|
||||
|
||||
rootVehicle.move(MoverType.PLAYER, new Vec3(d3, d4, d5));
|
||||
+ double verticalDelta = d4; // Paper - Decompile fix: lvt reassignment lost
|
||||
d3 = d - rootVehicle.getX();
|
||||
d4 = d1 - rootVehicle.getY();
|
||||
if (d4 > -0.5 || d4 < 0.5) {
|
||||
@@ -448,27 +_,80 @@
|
||||
@@ -457,7 +_,7 @@
|
||||
d5 = d2 - rootVehicle.getZ();
|
||||
d7 = d3 * d3 + d4 * d4 + d5 * d5;
|
||||
boolean flag2 = false;
|
||||
boolean flag1 = false;
|
||||
- if (d7 > 0.0625) {
|
||||
+ if (d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot
|
||||
flag2 = true;
|
||||
flag1 = true;
|
||||
LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", rootVehicle.getName().getString(), this.player.getName().getString(), Math.sqrt(d7));
|
||||
}
|
||||
@@ -471,6 +_,57 @@
|
||||
}
|
||||
|
||||
rootVehicle.absSnapTo(d, d1, d2, f, f1);
|
||||
+ this.player.absSnapTo(d, d1, d2, this.player.getYRot(), this.player.getXRot()); // CraftBukkit
|
||||
boolean flag3 = serverLevel.noCollision(rootVehicle, rootVehicle.getBoundingBox().deflate(0.0625));
|
||||
if (flag && (flag2 || !flag3)) {
|
||||
rootVehicle.absSnapTo(x, y, z, f, f1);
|
||||
+ this.player.absSnapTo(x, y, z, this.player.getYRot(), this.player.getXRot()); // CraftBukkit
|
||||
this.send(ClientboundMoveVehiclePacket.fromEntity(rootVehicle));
|
||||
rootVehicle.removeLatestMovementRecordingBatch();
|
||||
return;
|
||||
}
|
||||
|
||||
+ // CraftBukkit start - fire PlayerMoveEvent
|
||||
+ // CraftBukkit start - fire PlayerMoveEvent TODO: this should be removed.
|
||||
+ this.player.absSnapTo(x, y, z, this.player.getYRot(), this.player.getXRot()); // Paper - TODO: This breaks alot of stuff
|
||||
+ org.bukkit.entity.Player player = this.getCraftPlayer();
|
||||
+ if (!this.hasMoved) {
|
||||
+ this.lastPosX = prevX;
|
||||
@@ -333,20 +345,11 @@
|
||||
+ }
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+
|
||||
this.player.serverLevel().getChunkSource().move(this.player);
|
||||
this.player.level().getChunkSource().move(this.player);
|
||||
Vec3 vec3 = new Vec3(rootVehicle.getX() - x, rootVehicle.getY() - y, rootVehicle.getZ() - z);
|
||||
this.handlePlayerKnownMovement(vec3);
|
||||
rootVehicle.setOnGroundWithMovement(packet.onGround(), vec3);
|
||||
rootVehicle.doCheckFallDamage(vec3.x, vec3.y, vec3.z, packet.onGround());
|
||||
this.player.checkMovementStatistics(vec3.x, vec3.y, vec3.z);
|
||||
- this.clientVehicleIsFloating = d4 >= -0.03125
|
||||
+ this.clientVehicleIsFloating = verticalDelta >= -0.03125 // Paper - Decompile fix
|
||||
&& !flag1
|
||||
&& !this.server.isFlightAllowed()
|
||||
&& !rootVehicle.isNoGravity()
|
||||
@@ -491,12 +_,12 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
@@ -501,12 +_,12 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
if (packet.getId() == this.awaitingTeleport) {
|
||||
if (this.awaitingPositionFromClient == null) {
|
||||
- this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"));
|
||||
@@ -360,17 +363,17 @@
|
||||
this.awaitingPositionFromClient.x,
|
||||
this.awaitingPositionFromClient.y,
|
||||
this.awaitingPositionFromClient.z,
|
||||
@@ -508,12 +_,20 @@
|
||||
@@ -518,12 +_,20 @@
|
||||
this.lastGoodZ = this.awaitingPositionFromClient.z;
|
||||
this.player.hasChangedDimension();
|
||||
this.awaitingPositionFromClient = null;
|
||||
+ this.player.serverLevel().getChunkSource().move(this.player); // CraftBukkit
|
||||
+ this.player.level().getChunkSource().move(this.player); // CraftBukkit
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleAcceptPlayerLoad(ServerboundPlayerLoadedPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ // Paper start - PlayerLoadedWorldEvent
|
||||
+ if (this.player.hasClientLoaded()) {
|
||||
+ return;
|
||||
@@ -381,15 +384,15 @@
|
||||
this.player.setClientLoaded(true);
|
||||
}
|
||||
|
||||
@@ -535,6 +_,7 @@
|
||||
@@ -545,6 +_,7 @@
|
||||
@Override
|
||||
public void handleRecipeBookChangeSettingsPacket(ServerboundRecipeBookChangeSettingsPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ CraftEventFactory.callRecipeBookSettingsEvent(this.player, packet.getBookType(), packet.isOpen(), packet.isFiltering()); // CraftBukkit
|
||||
this.player.getRecipeBook().setBookSetting(packet.getBookType(), packet.isOpen(), packet.isFiltering());
|
||||
}
|
||||
|
||||
@@ -550,25 +_,110 @@
|
||||
@@ -560,25 +_,110 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,8 +403,8 @@
|
||||
+
|
||||
@Override
|
||||
public void handleCustomCommandSuggestions(ServerboundCommandSuggestionPacket packet) {
|
||||
- PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
+ // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
|
||||
- PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); // Paper - AsyncTabCompleteEvent; run this async
|
||||
+ // CraftBukkit start
|
||||
+ if (!this.tabSpamThrottler.isIncrementAndUnderThreshold() && !this.server.getPlayerList().isOp(this.player.getGameProfile()) && !this.server.isSingleplayerOwner(this.player.getGameProfile())) { // Paper - configurable tab spam limits
|
||||
+ this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause // Paper - add proper async disconnect
|
||||
@@ -505,8 +508,8 @@
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -578,7 +_,7 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
@@ -588,7 +_,7 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
if (!this.server.isCommandBlockEnabled()) {
|
||||
this.player.sendSystemMessage(Component.translatable("advMode.notEnabled"));
|
||||
- } else if (!this.player.canUseGameMasterBlocks()) {
|
||||
@@ -514,8 +517,8 @@
|
||||
this.player.sendSystemMessage(Component.translatable("advMode.notAllowed"));
|
||||
} else {
|
||||
BaseCommandBlock baseCommandBlock = null;
|
||||
@@ -633,7 +_,7 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
@@ -643,7 +_,7 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
if (!this.server.isCommandBlockEnabled()) {
|
||||
this.player.sendSystemMessage(Component.translatable("advMode.notEnabled"));
|
||||
- } else if (!this.player.canUseGameMasterBlocks()) {
|
||||
@@ -523,7 +526,7 @@
|
||||
this.player.sendSystemMessage(Component.translatable("advMode.notAllowed"));
|
||||
} else {
|
||||
BaseCommandBlock commandBlock = packet.getCommandBlock(this.player.level());
|
||||
@@ -661,11 +_,11 @@
|
||||
@@ -671,11 +_,11 @@
|
||||
boolean flag = this.player.hasInfiniteMaterials() && packet.includeData();
|
||||
ItemStack cloneItemStack = blockState.getCloneItemStack(serverLevel, blockPos, flag);
|
||||
if (!cloneItemStack.isEmpty()) {
|
||||
@@ -537,7 +540,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -689,27 +_,40 @@
|
||||
@@ -702,27 +_,40 @@
|
||||
if (entityOrPart != null && this.player.canInteractWithEntity(entityOrPart, 3.0)) {
|
||||
ItemStack pickResult = entityOrPart.getPickResult();
|
||||
if (pickResult != null && !pickResult.isEmpty()) {
|
||||
@@ -578,14 +581,14 @@
|
||||
+ inventory.addAndPickItem(stack, event.getTargetSlot()); // Paper - Add PlayerPickItemEvent
|
||||
}
|
||||
|
||||
this.player.connection.send(new ClientboundSetHeldSlotPacket(inventory.getSelectedSlot()));
|
||||
this.send(new ClientboundSetHeldSlotPacket(inventory.getSelectedSlot()));
|
||||
this.player.inventoryMenu.broadcastChanges();
|
||||
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -887,6 +_,13 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
@@ -900,6 +_,13 @@
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
int item = packet.getItem();
|
||||
if (this.player.containerMenu instanceof MerchantMenu merchantMenu) {
|
||||
+ // CraftBukkit start
|
||||
@@ -598,7 +601,7 @@
|
||||
if (!merchantMenu.stillValid(this.player)) {
|
||||
LOGGER.debug("Player {} interacted with invalid menu {}", this.player, merchantMenu);
|
||||
return;
|
||||
@@ -899,6 +_,51 @@
|
||||
@@ -912,6 +_,51 @@
|
||||
|
||||
@Override
|
||||
public void handleEditBook(ServerboundEditBookPacket packet) {
|
||||
@@ -650,7 +653,7 @@
|
||||
int slot = packet.slot();
|
||||
if (Inventory.isHotbarSlot(slot) || slot == 40) {
|
||||
List<String> list = Lists.newArrayList();
|
||||
@@ -913,10 +_,14 @@
|
||||
@@ -926,10 +_,14 @@
|
||||
}
|
||||
|
||||
private void updateBookContents(List<FilteredText> pages, int index) {
|
||||
@@ -666,7 +669,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -930,7 +_,8 @@
|
||||
@@ -943,7 +_,8 @@
|
||||
DataComponents.WRITTEN_BOOK_CONTENT,
|
||||
new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getName().getString(), 0, list, true)
|
||||
);
|
||||
@@ -676,14 +679,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -974,27 +_,35 @@
|
||||
@@ -991,27 +_,35 @@
|
||||
public void handleMovePlayer(ServerboundMovePlayerPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
if (containsInvalidValues(packet.getX(0.0), packet.getY(0.0), packet.getZ(0.0), packet.getYRot(0.0F), packet.getXRot(0.0F))) {
|
||||
- this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"));
|
||||
+ this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
|
||||
} else {
|
||||
ServerLevel serverLevel = this.player.serverLevel();
|
||||
ServerLevel serverLevel = this.player.level();
|
||||
- if (!this.player.wonGame) {
|
||||
+ if (!this.player.wonGame && !this.player.isImmobile()) { // CraftBukkit
|
||||
if (this.tickCount == 0) {
|
||||
@@ -706,7 +709,7 @@
|
||||
+ double d2 = clampHorizontal(packet.getZ(this.player.getZ())); final double toZ = d2; // Paper - OBFHELPER
|
||||
if (this.player.isPassenger()) {
|
||||
this.player.absSnapTo(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1);
|
||||
this.player.serverLevel().getChunkSource().move(this.player);
|
||||
this.player.level().getChunkSource().move(this.player);
|
||||
+ this.allowedPlayerTicks = 20; // CraftBukkit
|
||||
} else {
|
||||
+ // CraftBukkit - Make sure the move is valid but then reset it for plugins to modify
|
||||
@@ -719,7 +722,7 @@
|
||||
double x = this.player.getX();
|
||||
double y = this.player.getY();
|
||||
double z = this.player.getZ();
|
||||
@@ -1003,6 +_,16 @@
|
||||
@@ -1020,6 +_,16 @@
|
||||
double d5 = d2 - this.firstGoodZ;
|
||||
double d6 = this.player.getDeltaMovement().lengthSqr();
|
||||
double d7 = d3 * d3 + d4 * d4 + d5 * d5;
|
||||
@@ -736,7 +739,7 @@
|
||||
if (this.player.isSleeping()) {
|
||||
if (d7 > 1.0) {
|
||||
this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1);
|
||||
@@ -1012,36 +_,109 @@
|
||||
@@ -1029,36 +_,108 @@
|
||||
if (serverLevel.tickRateManager().runsNormally()) {
|
||||
this.receivedMovePacketCount++;
|
||||
int i = this.receivedMovePacketCount - this.knownMovePacketCount;
|
||||
@@ -853,11 +856,10 @@
|
||||
+ return; // ... thanks Mojang for letting move calls teleport across dimensions.
|
||||
+ }
|
||||
+ // Paper end - prevent position desync
|
||||
+ double verticalDelta = d4; // Paper - Decompile fix: lvt reassignment lost
|
||||
double verticalDelta = d4;
|
||||
d3 = d - this.player.getX();
|
||||
d4 = d1 - this.player.getY();
|
||||
if (d4 > -0.5 || d4 < 0.5) {
|
||||
@@ -1050,23 +_,104 @@
|
||||
@@ -1068,20 +_,100 @@
|
||||
|
||||
d5 = d2 - this.player.getZ();
|
||||
d7 = d3 * d3 + d4 * d4 + d5 * d5;
|
||||
@@ -883,20 +885,20 @@
|
||||
- if (this.player.noPhysics
|
||||
- || this.player.isSleeping()
|
||||
- || (!flag2 || !serverLevel.noCollision(this.player, boundingBox))
|
||||
- && !this.isPlayerCollidingWithAnythingNew(serverLevel, boundingBox, d, d1, d2)) {
|
||||
- && !this.isEntityCollidingWithAnythingNew(serverLevel, this.player, boundingBox, d, d1, d2)) {
|
||||
+ } // Paper
|
||||
+ }
|
||||
+
|
||||
+ // Paper start - Add fail move event
|
||||
+ boolean teleportBack = !this.player.noPhysics && !this.player.isSleeping() && (movedWrongly && serverLevel.noCollision(this.player, boundingBox) || this.isPlayerCollidingWithAnythingNew(serverLevel, boundingBox, d, d1, d2));
|
||||
+ if (teleportBack) {
|
||||
+ boolean allowMovement = this.player.noPhysics || this.player.isSleeping() || (!movedWrongly || !serverLevel.noCollision(this.player, boundingBox)) && !this.isEntityCollidingWithAnythingNew(serverLevel, this.player, boundingBox, d, d1, d2);
|
||||
+ if (!allowMovement) {
|
||||
+ io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.CLIPPED_INTO_BLOCK,
|
||||
+ toX, toY, toZ, toYaw, toPitch, false);
|
||||
+ if (event.isAllowed()) {
|
||||
+ teleportBack = false;
|
||||
+ allowMovement = true;
|
||||
+ }
|
||||
+ }
|
||||
+ if (!teleportBack) {
|
||||
+ if (allowMovement) {
|
||||
+ // Paper end - Add fail move event
|
||||
+ // CraftBukkit start - fire PlayerMoveEvent
|
||||
+ // Reset to old location first
|
||||
@@ -911,7 +913,6 @@
|
||||
+ this.lastPitch = prevPitch;
|
||||
+ this.hasMoved = true;
|
||||
+ }
|
||||
+
|
||||
+ Location from = new Location(player.getWorld(), this.lastPosX, this.lastPosY, this.lastPosZ, this.lastYaw, this.lastPitch); // Get the Players previous Event location.
|
||||
+ Location to = player.getLocation().clone(); // Start off the To location as the Players current location.
|
||||
+
|
||||
@@ -964,24 +965,20 @@
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+ // Paper end
|
||||
this.player.absSnapTo(d, d1, d2, f, f1);
|
||||
boolean isAutoSpinAttack = this.player.isAutoSpinAttack();
|
||||
- this.clientIsFloating = d4 >= -0.03125
|
||||
+ this.clientIsFloating = verticalDelta >= -0.03125 // Paper - Decompile fix
|
||||
&& !flag1
|
||||
&& !this.player.isSpectator()
|
||||
&& !this.server.isFlightAllowed()
|
||||
@@ -1098,7 +_,7 @@
|
||||
this.clientIsFloating = verticalDelta >= -0.03125
|
||||
@@ -1116,7 +_,7 @@
|
||||
this.lastGoodY = this.player.getY();
|
||||
this.lastGoodZ = this.player.getZ();
|
||||
} else {
|
||||
- this.teleport(x, y, z, f, f1);
|
||||
+ this.internalTeleport(x, y, z, f, f1); // CraftBukkit - SPIGOT-1807: Don't call teleport event, when the client thinks the player is falling, because the chunks are not loaded on the client yet.
|
||||
this.player.doCheckFallDamage(this.player.getX() - x, this.player.getY() - y, this.player.getZ() - z, packet.isOnGround());
|
||||
this.player.removeLatestMovementRecordingBatch();
|
||||
this.player.removeLatestMovementRecording();
|
||||
}
|
||||
@@ -1134,6 +_,7 @@
|
||||
@@ -1152,6 +_,7 @@
|
||||
this.player.getXRot()
|
||||
);
|
||||
}
|
||||
@@ -989,7 +986,7 @@
|
||||
|
||||
return true;
|
||||
} else {
|
||||
@@ -1157,10 +_,77 @@
|
||||
@@ -1175,10 +_,77 @@
|
||||
}
|
||||
|
||||
public void teleport(double x, double y, double z, float yaw, float pitch) {
|
||||
@@ -1068,7 +1065,7 @@
|
||||
this.awaitingTeleportTime = this.tickCount;
|
||||
if (++this.awaitingTeleport == Integer.MAX_VALUE) {
|
||||
this.awaitingTeleport = 0;
|
||||
@@ -1168,12 +_,20 @@
|
||||
@@ -1186,12 +_,20 @@
|
||||
|
||||
this.player.teleportSetPosition(posMoveRotation, relatives);
|
||||
this.awaitingPositionFromClient = this.player.position();
|
||||
@@ -1079,17 +1076,17 @@
|
||||
+ this.lastYaw = this.player.getYRot();
|
||||
+ this.lastPitch = this.player.getXRot();
|
||||
+ // CraftBukkit end
|
||||
this.player.connection.send(ClientboundPlayerPositionPacket.of(this.awaitingTeleport, posMoveRotation, relatives));
|
||||
this.send(ClientboundPlayerPositionPacket.of(this.awaitingTeleport, posMoveRotation, relatives));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handlePlayerAction(ServerboundPlayerActionPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
if (this.player.hasClientLoaded()) {
|
||||
BlockPos pos = packet.getPos();
|
||||
this.player.resetLastActionTime();
|
||||
@@ -1182,32 +_,95 @@
|
||||
@@ -1200,32 +_,95 @@
|
||||
case SWAP_ITEM_WITH_OFFHAND:
|
||||
if (!this.player.isSpectator()) {
|
||||
ItemStack itemInHand = this.player.getItemInHand(InteractionHand.OFF_HAND);
|
||||
@@ -1167,7 +1164,7 @@
|
||||
+ this.player.gameMode.captureSentBlockEntities = true;
|
||||
+ // Paper end - Send block entities after destroy prediction
|
||||
this.player.gameMode.handleBlockBreakAction(pos, action, packet.getDirection(), this.player.level().getMaxY(), packet.getSequence());
|
||||
this.player.connection.ackBlockChangesUpTo(packet.getSequence());
|
||||
this.ackBlockChangesUpTo(packet.getSequence());
|
||||
+ // Paper start - Send block entities after destroy prediction
|
||||
+ this.player.gameMode.captureSentBlockEntities = false;
|
||||
+ // If a block entity was modified speedup the block change ack to avoid the block entity
|
||||
@@ -1188,7 +1185,7 @@
|
||||
return;
|
||||
default:
|
||||
throw new IllegalArgumentException("Invalid player action");
|
||||
@@ -1224,9 +_,31 @@
|
||||
@@ -1242,9 +_,31 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1214,13 +1211,13 @@
|
||||
+
|
||||
@Override
|
||||
public void handleUseItemOn(ServerboundUseItemOnPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
+ if (!this.checkLimit(packet.timestamp)) return; // Spigot - check limit
|
||||
if (this.player.hasClientLoaded()) {
|
||||
this.player.connection.ackBlockChangesUpTo(packet.getSequence());
|
||||
ServerLevel serverLevel = this.player.serverLevel();
|
||||
@@ -1235,6 +_,11 @@
|
||||
this.ackBlockChangesUpTo(packet.getSequence());
|
||||
ServerLevel serverLevel = this.player.level();
|
||||
@@ -1253,6 +_,11 @@
|
||||
if (itemInHand.isItemEnabled(serverLevel.enabledFeatures())) {
|
||||
BlockHitResult hitResult = packet.getHitResult();
|
||||
Vec3 location = hitResult.getLocation();
|
||||
@@ -1232,7 +1229,7 @@
|
||||
BlockPos blockPos = hitResult.getBlockPos();
|
||||
if (this.player.canInteractWithBlock(blockPos, 1.0)) {
|
||||
Vec3 vec3 = location.subtract(Vec3.atCenterOf(blockPos));
|
||||
@@ -1244,7 +_,8 @@
|
||||
@@ -1262,7 +_,8 @@
|
||||
this.player.resetLastActionTime();
|
||||
int maxY = this.player.level().getMaxY();
|
||||
if (blockPos.getY() <= maxY) {
|
||||
@@ -1242,7 +1239,7 @@
|
||||
InteractionResult interactionResult = this.player.gameMode.useItemOn(this.player, serverLevel, itemInHand, hand, hitResult);
|
||||
if (interactionResult.consumesAction()) {
|
||||
CriteriaTriggers.ANY_BLOCK_USE.trigger(this.player, hitResult.getBlockPos(), itemInHand.copy());
|
||||
@@ -1257,10 +_,10 @@
|
||||
@@ -1275,10 +_,10 @@
|
||||
Component component = Component.translatable("build.tooHigh", maxY).withStyle(ChatFormatting.RED);
|
||||
this.player.sendSystemMessage(component, true);
|
||||
} else if (interactionResult instanceof InteractionResult.Success success
|
||||
@@ -1255,10 +1252,10 @@
|
||||
} else {
|
||||
Component component1 = Component.translatable("build.tooHigh", maxY).withStyle(ChatFormatting.RED);
|
||||
this.player.sendSystemMessage(component1, true);
|
||||
@@ -1268,13 +_,7 @@
|
||||
@@ -1286,13 +_,8 @@
|
||||
|
||||
this.player.connection.send(new ClientboundBlockUpdatePacket(serverLevel, blockPos));
|
||||
this.player.connection.send(new ClientboundBlockUpdatePacket(serverLevel, blockPos.relative(direction)));
|
||||
this.send(new ClientboundBlockUpdatePacket(serverLevel, blockPos));
|
||||
this.send(new ClientboundBlockUpdatePacket(serverLevel, blockPos.relative(direction)));
|
||||
- } else {
|
||||
- LOGGER.warn(
|
||||
- "Rejecting UseItemOnPacket from {}: Location {} too far away from hit block {}.",
|
||||
@@ -1267,19 +1264,20 @@
|
||||
- blockPos
|
||||
- );
|
||||
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes.
|
||||
+ // Paper - Remove unused warning
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1284,6 +_,8 @@
|
||||
@@ -1302,6 +_,8 @@
|
||||
@Override
|
||||
public void handleUseItem(ServerboundUseItemPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
+ if (!this.checkLimit(packet.timestamp)) return; // Spigot - check limit
|
||||
if (this.player.hasClientLoaded()) {
|
||||
this.ackBlockChangesUpTo(packet.getSequence());
|
||||
ServerLevel serverLevel = this.player.serverLevel();
|
||||
@@ -1297,6 +_,48 @@
|
||||
ServerLevel serverLevel = this.player.level();
|
||||
@@ -1315,6 +_,48 @@
|
||||
this.player.absSnapRotationTo(f, f1);
|
||||
}
|
||||
|
||||
@@ -1328,7 +1326,7 @@
|
||||
if (this.player.gameMode.useItem(this.player, serverLevel, itemInHand, hand) instanceof InteractionResult.Success success
|
||||
&& success.swingSource() == InteractionResult.SwingSource.SERVER) {
|
||||
this.player.swing(hand, true);
|
||||
@@ -1312,7 +_,7 @@
|
||||
@@ -1330,7 +_,7 @@
|
||||
for (ServerLevel serverLevel : this.server.getAllLevels()) {
|
||||
Entity entity = packet.getEntity(serverLevel);
|
||||
if (entity != null) {
|
||||
@@ -1337,7 +1335,7 @@
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1329,24 +_,54 @@
|
||||
@@ -1347,24 +_,54 @@
|
||||
|
||||
@Override
|
||||
public void onDisconnect(DisconnectionDetails details) {
|
||||
@@ -1395,10 +1393,10 @@
|
||||
throw new IllegalArgumentException("Expected packet sequence nr >= 0");
|
||||
} else {
|
||||
this.ackBlockChangesUpTo = Math.max(sequence, this.ackBlockChangesUpTo);
|
||||
@@ -1356,20 +_,38 @@
|
||||
@@ -1374,20 +_,38 @@
|
||||
@Override
|
||||
public void handleSetCarriedItem(ServerboundSetCarriedItemPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
if (packet.getSlot() >= 0 && packet.getSlot() < Inventory.getSelectionSize()) {
|
||||
+ if (packet.getSlot() == this.player.getInventory().getSelectedSlot()) { return; } // Paper - don't fire itemheldevent when there wasn't a slot change
|
||||
@@ -1434,7 +1432,7 @@
|
||||
Optional<LastSeenMessages> optional = this.unpackAndApplyLastSeen(packet.lastSeenMessages());
|
||||
if (!optional.isEmpty()) {
|
||||
this.tryHandleChat(packet.message(), () -> {
|
||||
@@ -1381,25 +_,45 @@
|
||||
@@ -1399,25 +_,45 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1487,7 +1485,7 @@
|
||||
ParseResults<CommandSourceStack> parseResults = this.parseCommand(command);
|
||||
if (this.server.enforceSecureProfile() && SignableCommand.hasSignableArguments(parseResults)) {
|
||||
LOGGER.error(
|
||||
@@ -1416,28 +_,57 @@
|
||||
@@ -1434,28 +_,57 @@
|
||||
Optional<LastSeenMessages> optional = this.unpackAndApplyLastSeen(packet.lastSeenMessages());
|
||||
if (!optional.isEmpty()) {
|
||||
this.tryHandleChat(packet.command(), () -> {
|
||||
@@ -1548,7 +1546,7 @@
|
||||
}
|
||||
|
||||
private void handleMessageDecodeFailure(SignedMessageChain.DecodeException exception) {
|
||||
@@ -1501,14 +_,20 @@
|
||||
@@ -1519,14 +_,20 @@
|
||||
return dispatcher.parse(command, this.player.createCommandSourceStack());
|
||||
}
|
||||
|
||||
@@ -1573,7 +1571,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1520,7 +_,7 @@
|
||||
@@ -1538,7 +_,7 @@
|
||||
var10000 = Optional.of(lastSeenMessages);
|
||||
} catch (LastSeenMessagesValidator.ValidationException var5) {
|
||||
LOGGER.error("Failed to validate message acknowledgements from {}: {}", this.player.getName().getString(), var5.getMessage());
|
||||
@@ -1582,7 +1580,7 @@
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@@ -1538,22 +_,81 @@
|
||||
@@ -1556,22 +_,81 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1670,7 +1668,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1564,7 +_,7 @@
|
||||
@@ -1582,7 +_,7 @@
|
||||
this.lastSeenMessages.applyOffset(packet.offset());
|
||||
} catch (LastSeenMessagesValidator.ValidationException var5) {
|
||||
LOGGER.error("Failed to validate message acknowledgement offset from {}: {}", this.player.getName().getString(), var5.getMessage());
|
||||
@@ -1679,10 +1677,10 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1572,7 +_,40 @@
|
||||
@@ -1590,7 +_,40 @@
|
||||
@Override
|
||||
public void handleAnimate(ServerboundSwingPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
this.player.resetLastActionTime();
|
||||
+ // CraftBukkit start - Raytrace to look for 'rogue armswings'
|
||||
@@ -1720,23 +1718,13 @@
|
||||
this.player.swing(packet.getHand());
|
||||
}
|
||||
|
||||
@@ -1580,10 +_,41 @@
|
||||
@@ -1598,6 +_,22 @@
|
||||
public void handlePlayerCommand(ServerboundPlayerCommandPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
if (this.player.hasClientLoaded()) {
|
||||
+ // CraftBukkit start
|
||||
+ if (this.player.isRemoved()) return;
|
||||
+ switch (packet.getAction()) {
|
||||
+ case PRESS_SHIFT_KEY:
|
||||
+ case RELEASE_SHIFT_KEY: {
|
||||
+ PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getCraftPlayer(), packet.getAction() == ServerboundPlayerCommandPacket.Action.PRESS_SHIFT_KEY);
|
||||
+ this.cserver.getPluginManager().callEvent(event);
|
||||
+
|
||||
+ if (event.isCancelled()) {
|
||||
+ return;
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ case START_SPRINTING:
|
||||
+ case STOP_SPRINTING: {
|
||||
+ PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getCraftPlayer(), packet.getAction() == ServerboundPlayerCommandPacket.Action.START_SPRINTING);
|
||||
@@ -1752,17 +1740,8 @@
|
||||
+
|
||||
this.player.resetLastActionTime();
|
||||
switch (packet.getAction()) {
|
||||
case PRESS_SHIFT_KEY:
|
||||
this.player.setShiftKeyDown(true);
|
||||
+ // Paper start - Add option to make parrots stay
|
||||
+ if (this.player.level().paperConfig().entities.behavior.parrotsAreUnaffectedByPlayerMovement) {
|
||||
+ this.player.removeEntitiesOnShoulder();
|
||||
+ }
|
||||
+ // Paper end - Add option to make parrots stay
|
||||
break;
|
||||
case RELEASE_SHIFT_KEY:
|
||||
this.player.setShiftKeyDown(false);
|
||||
@@ -1630,6 +_,14 @@
|
||||
case START_SPRINTING:
|
||||
@@ -1642,6 +_,14 @@
|
||||
}
|
||||
|
||||
public void sendPlayerChatMessage(PlayerChatMessage chatMessage, ChatType.Bound boundType) {
|
||||
@@ -1777,7 +1756,7 @@
|
||||
this.send(
|
||||
new ClientboundPlayerChatPacket(
|
||||
this.nextChatIndex++,
|
||||
@@ -1652,9 +_,11 @@
|
||||
@@ -1664,9 +_,11 @@
|
||||
}
|
||||
|
||||
if (i > 4096) {
|
||||
@@ -1790,7 +1769,7 @@
|
||||
}
|
||||
|
||||
public void sendDisguisedChatMessage(Component message, ChatType.Bound boundType) {
|
||||
@@ -1665,6 +_,17 @@
|
||||
@@ -1677,6 +_,17 @@
|
||||
return this.connection.getRemoteAddress();
|
||||
}
|
||||
|
||||
@@ -1808,13 +1787,13 @@
|
||||
public void switchToConfig() {
|
||||
this.waitingForSwitchToConfig = true;
|
||||
this.removePlayerFromWorld();
|
||||
@@ -1680,9 +_,16 @@
|
||||
@@ -1692,9 +_,16 @@
|
||||
@Override
|
||||
public void handleInteract(ServerboundInteractPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
if (this.player.hasClientLoaded()) {
|
||||
final ServerLevel serverLevel = this.player.serverLevel();
|
||||
final ServerLevel serverLevel = this.player.level();
|
||||
final Entity target = packet.getTarget(serverLevel);
|
||||
+ // Spigot start
|
||||
+ if (target == this.player && !this.player.isSpectator()) {
|
||||
@@ -1825,7 +1804,7 @@
|
||||
this.player.resetLastActionTime();
|
||||
this.player.setShiftKeyDown(packet.isUsingSecondaryAction());
|
||||
if (target != null) {
|
||||
@@ -1691,16 +_,58 @@
|
||||
@@ -1703,16 +_,58 @@
|
||||
}
|
||||
|
||||
AABB boundingBox = target.getBoundingBox();
|
||||
@@ -1889,7 +1868,7 @@
|
||||
ItemStack itemStack1 = success.wasItemInteraction() ? itemStack : ItemStack.EMPTY;
|
||||
CriteriaTriggers.PLAYER_INTERACTED_WITH_ENTITY.trigger(ServerGamePacketListenerImpl.this.player, itemStack1, target);
|
||||
if (success.swingSource() == InteractionResult.SwingSource.SERVER) {
|
||||
@@ -1712,13 +_,13 @@
|
||||
@@ -1724,13 +_,13 @@
|
||||
|
||||
@Override
|
||||
public void onInteraction(InteractionHand hand) {
|
||||
@@ -1905,7 +1884,7 @@
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1726,14 +_,19 @@
|
||||
@@ -1738,14 +_,19 @@
|
||||
public void onAttack() {
|
||||
if (!(target instanceof ItemEntity)
|
||||
&& !(target instanceof ExperienceOrb)
|
||||
@@ -1927,7 +1906,7 @@
|
||||
ServerGamePacketListenerImpl.LOGGER
|
||||
.warn("Player {} tried to attack an invalid entity", ServerGamePacketListenerImpl.this.player.getName().getString());
|
||||
}
|
||||
@@ -1742,6 +_,27 @@
|
||||
@@ -1754,6 +_,27 @@
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1955,7 +1934,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1754,7 +_,7 @@
|
||||
@@ -1766,7 +_,7 @@
|
||||
case PERFORM_RESPAWN:
|
||||
if (this.player.wonGame) {
|
||||
this.player.wonGame = false;
|
||||
@@ -1964,7 +1943,7 @@
|
||||
this.resetPosition();
|
||||
CriteriaTriggers.CHANGED_DIMENSION.trigger(this.player, Level.END, Level.OVERWORLD);
|
||||
} else {
|
||||
@@ -1762,11 +_,11 @@
|
||||
@@ -1774,11 +_,11 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1973,13 +1952,13 @@
|
||||
this.resetPosition();
|
||||
if (this.server.isHardcore()) {
|
||||
- this.player.setGameMode(GameType.SPECTATOR);
|
||||
- this.player.serverLevel().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.server);
|
||||
- this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.server);
|
||||
+ this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent
|
||||
+ this.player.serverLevel().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.player.serverLevel()); // CraftBukkit - per-world
|
||||
+ this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS).set(false, this.player.level()); // CraftBukkit - per-world
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1777,16 +_,28 @@
|
||||
@@ -1789,16 +_,27 @@
|
||||
|
||||
@Override
|
||||
public void handleContainerClose(ServerboundContainerClosePacket packet) {
|
||||
@@ -1989,17 +1968,16 @@
|
||||
+
|
||||
+ public void handleContainerClose(ServerboundContainerClosePacket packet, org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||||
+ // Paper end - Inventory close reason
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
+ CraftEventFactory.handleInventoryCloseEvent(this.player, reason); // CraftBukkit // Paper
|
||||
+
|
||||
this.player.doCloseContainer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleContainerClick(ServerboundContainerClickPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
this.player.resetLastActionTime();
|
||||
- if (this.player.containerMenu.containerId == packet.containerId()) {
|
||||
@@ -2010,7 +1988,7 @@
|
||||
this.player.containerMenu.sendAllDataToRemote();
|
||||
} else if (!this.player.containerMenu.stillValid(this.player)) {
|
||||
LOGGER.debug("Player {} interacted with invalid menu {}", this.player, this.player.containerMenu);
|
||||
@@ -1799,7 +_,340 @@
|
||||
@@ -1811,7 +_,340 @@
|
||||
} else {
|
||||
boolean flag = packet.stateId() != this.player.containerMenu.getStateId();
|
||||
this.player.containerMenu.suppressRemoteUpdates();
|
||||
@@ -2352,7 +2330,7 @@
|
||||
|
||||
for (Entry<HashedStack> entry : Int2ObjectMaps.fastIterable(packet.changedSlots())) {
|
||||
this.player.containerMenu.setRemoteSlotUnsafe(entry.getIntKey(), entry.getValue());
|
||||
@@ -1812,6 +_,7 @@
|
||||
@@ -1824,6 +_,7 @@
|
||||
} else {
|
||||
this.player.containerMenu.broadcastChanges();
|
||||
}
|
||||
@@ -2360,7 +2338,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1819,6 +_,14 @@
|
||||
@@ -1831,6 +_,14 @@
|
||||
|
||||
@Override
|
||||
public void handlePlaceRecipe(ServerboundPlaceRecipePacket packet) {
|
||||
@@ -2372,10 +2350,10 @@
|
||||
+ }
|
||||
+ }
|
||||
+ // Paper end - auto recipe limit
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
this.player.resetLastActionTime();
|
||||
if (!this.player.isSpectator() && this.player.containerMenu.containerId == packet.containerId()) {
|
||||
@@ -1835,9 +_,44 @@
|
||||
@@ -1847,9 +_,44 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2414,22 +2392,22 @@
|
||||
+ }
|
||||
+
|
||||
RecipeBookMenu.PostPlaceAction postPlaceAction = recipeBookMenu.handlePlacement(
|
||||
- packet.useMaxItems(), this.player.isCreative(), recipeHolder, this.player.serverLevel(), this.player.getInventory()
|
||||
+ makeAll, this.player.isCreative(), recipeHolder, this.player.serverLevel(), this.player.getInventory()
|
||||
- packet.useMaxItems(), this.player.isCreative(), recipeHolder, this.player.level(), this.player.getInventory()
|
||||
+ makeAll, this.player.isCreative(), recipeHolder, this.player.level(), this.player.getInventory()
|
||||
);
|
||||
+ // CraftBukkit end
|
||||
if (postPlaceAction == RecipeBookMenu.PostPlaceAction.PLACE_GHOST_RECIPE) {
|
||||
this.player
|
||||
.connection
|
||||
@@ -1853,6 +_,7 @@
|
||||
this.send(new ClientboundPlaceGhostRecipePacket(this.player.containerMenu.containerId, recipeFromDisplay.display().display()));
|
||||
}
|
||||
@@ -1863,6 +_,7 @@
|
||||
@Override
|
||||
public void handleContainerButtonClick(ServerboundContainerButtonClickPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
this.player.resetLastActionTime();
|
||||
if (this.player.containerMenu.containerId == packet.containerId() && !this.player.isSpectator()) {
|
||||
if (!this.player.containerMenu.stillValid(this.player)) {
|
||||
@@ -1862,6 +_,7 @@
|
||||
@@ -1872,6 +_,7 @@
|
||||
if (flag) {
|
||||
this.player.containerMenu.broadcastChanges();
|
||||
}
|
||||
@@ -2437,7 +2415,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1878,10 +_,48 @@
|
||||
@@ -1888,10 +_,48 @@
|
||||
|
||||
boolean flag1 = packet.slotNum() >= 1 && packet.slotNum() <= 45;
|
||||
boolean flag2 = itemStack.isEmpty() || itemStack.getCount() <= itemStack.getMaxStackSize();
|
||||
@@ -2486,7 +2464,7 @@
|
||||
} else if (flag && flag2) {
|
||||
if (this.dropSpamThrottler.isUnderThreshold()) {
|
||||
this.dropSpamThrottler.increment();
|
||||
@@ -1895,15 +_,38 @@
|
||||
@@ -1905,15 +_,38 @@
|
||||
|
||||
@Override
|
||||
public void handleSignUpdate(ServerboundSignUpdatePacket packet) {
|
||||
@@ -2510,7 +2488,7 @@
|
||||
private void updateSignText(ServerboundSignUpdatePacket packet, List<FilteredText> filteredText) {
|
||||
+ if (this.player.isImmobile()) return; // CraftBukkit
|
||||
this.player.resetLastActionTime();
|
||||
ServerLevel serverLevel = this.player.serverLevel();
|
||||
ServerLevel serverLevel = this.player.level();
|
||||
BlockPos pos = packet.getPos();
|
||||
if (serverLevel.hasChunkAt(pos)) {
|
||||
+ // Paper start - Add API for client-side signs
|
||||
@@ -2526,10 +2504,10 @@
|
||||
if (!(serverLevel.getBlockEntity(pos) instanceof SignBlockEntity signBlockEntity)) {
|
||||
return;
|
||||
}
|
||||
@@ -1915,14 +_,32 @@
|
||||
@@ -1925,14 +_,32 @@
|
||||
@Override
|
||||
public void handlePlayerAbilities(ServerboundPlayerAbilitiesPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
- this.player.getAbilities().flying = packet.isFlying() && this.player.getAbilities().mayfly;
|
||||
+ // CraftBukkit start
|
||||
+ if (this.player.getAbilities().mayfly && this.player.getAbilities().flying != packet.isFlying()) {
|
||||
@@ -2546,7 +2524,7 @@
|
||||
|
||||
@Override
|
||||
public void handleClientInformation(ServerboundClientInformationPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ // Paper start - do not accept invalid information
|
||||
+ if (packet.information().viewDistance() < 0) {
|
||||
+ LOGGER.warn("Disconnecting {} for invalid view distance: {}", this.player.getScoreboardName(), packet.information().viewDistance());
|
||||
@@ -2560,16 +2538,16 @@
|
||||
if (this.player.isModelPartShown(PlayerModelPart.HAT) != isModelPartShown) {
|
||||
this.server.getPlayerList().broadcastAll(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_HAT, this.player));
|
||||
}
|
||||
@@ -1932,7 +_,7 @@
|
||||
public void handleChangeDifficulty(ServerboundChangeDifficultyPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
if (this.player.hasPermissions(2) || this.isSingleplayerOwner()) {
|
||||
- this.server.setDifficulty(packet.getDifficulty(), false);
|
||||
+ // this.server.setDifficulty(packet.getDifficulty(), false); // Paper - per level difficulty; don't allow clients to change this
|
||||
@@ -1948,7 +_,7 @@
|
||||
packet.difficulty().getDisplayName()
|
||||
);
|
||||
} else {
|
||||
- this.server.setDifficulty(packet.difficulty(), false);
|
||||
+ // this.server.setDifficulty(packet.difficulty(), false); // Paper - per level difficulty; don't allow clients to change this
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1952,7 +_,7 @@
|
||||
@@ -1982,7 +_,7 @@
|
||||
ProfilePublicKey.Data data2 = data.profilePublicKey();
|
||||
if (!Objects.equals(data1, data2)) {
|
||||
if (data1 != null && data2.expiresAt().isBefore(data1.expiresAt())) {
|
||||
@@ -2578,7 +2556,7 @@
|
||||
} else {
|
||||
try {
|
||||
SignatureValidator profileKeySignatureValidator = this.server.getProfileKeySignatureValidator();
|
||||
@@ -1963,8 +_,8 @@
|
||||
@@ -1993,8 +_,8 @@
|
||||
|
||||
this.resetPlayerChatState(data.validate(this.player.getGameProfile(), profileKeySignatureValidator));
|
||||
} catch (ProfilePublicKey.ValidationException var6) {
|
||||
@@ -2589,7 +2567,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1978,7 +_,7 @@
|
||||
@@ -2008,7 +_,7 @@
|
||||
this.connection
|
||||
.setupInboundProtocol(
|
||||
ConfigurationProtocols.SERVERBOUND,
|
||||
@@ -2598,7 +2576,7 @@
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1997,27 +_,32 @@
|
||||
@@ -2027,27 +_,32 @@
|
||||
|
||||
private void resetPlayerChatState(RemoteChatSession chatSession) {
|
||||
this.chatSession = chatSession;
|
||||
@@ -2627,12 +2605,12 @@
|
||||
|
||||
@Override
|
||||
public void handleClientTickEnd(ServerboundClientTickEndPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||
+ this.tickEndEvent.callEvent(); // Paper - add client tick end event
|
||||
if (!this.receivedMovementThisTick) {
|
||||
this.player.setKnownMovement(Vec3.ZERO);
|
||||
}
|
||||
@@ -2048,4 +_,17 @@
|
||||
@@ -2078,4 +_,17 @@
|
||||
interface EntityInteraction {
|
||||
InteractionResult run(ServerPlayer player, Entity entity, InteractionHand hand);
|
||||
}
|
||||
|
||||
@@ -73,16 +73,16 @@
|
||||
+ org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t);
|
||||
+ }
|
||||
+ // Paper end - Connection throttle
|
||||
if (packet.protocolVersion() != SharedConstants.getCurrentVersion().getProtocolVersion()) {
|
||||
if (packet.protocolVersion() != SharedConstants.getCurrentVersion().protocolVersion()) {
|
||||
- Component component;
|
||||
- if (packet.protocolVersion() < 754) {
|
||||
- component = Component.translatable("multiplayer.disconnect.outdated_client", SharedConstants.getCurrentVersion().getName());
|
||||
- component = Component.translatable("multiplayer.disconnect.outdated_client", SharedConstants.getCurrentVersion().name());
|
||||
+ net.kyori.adventure.text.Component adventureComponent; // Paper - Fix hex colors not working in some kick messages
|
||||
+ if (packet.protocolVersion() < SharedConstants.getCurrentVersion().getProtocolVersion()) { // Spigot - SPIGOT-7546: Handle version check correctly for outdated client message
|
||||
+ adventureComponent = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(java.text.MessageFormat.format(org.spigotmc.SpigotConfig.outdatedClientMessage.replaceAll("'", "''"), SharedConstants.getCurrentVersion().getName())); // Spigot // Paper - Fix hex colors not working in some kick messages
|
||||
+ if (packet.protocolVersion() < SharedConstants.getCurrentVersion().protocolVersion()) { // Spigot - SPIGOT-7546: Handle version check correctly for outdated client message
|
||||
+ adventureComponent = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(java.text.MessageFormat.format(org.spigotmc.SpigotConfig.outdatedClientMessage.replaceAll("'", "''"), SharedConstants.getCurrentVersion().name())); // Spigot // Paper - Fix hex colors not working in some kick messages
|
||||
} else {
|
||||
- component = Component.translatable("multiplayer.disconnect.incompatible", SharedConstants.getCurrentVersion().getName());
|
||||
+ adventureComponent = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(java.text.MessageFormat.format(org.spigotmc.SpigotConfig.outdatedServerMessage.replaceAll("'", "''"), SharedConstants.getCurrentVersion().getName())); // Spigot // Paper - Fix hex colors not working in some kick messages
|
||||
- component = Component.translatable("multiplayer.disconnect.incompatible", SharedConstants.getCurrentVersion().name());
|
||||
+ adventureComponent = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(java.text.MessageFormat.format(org.spigotmc.SpigotConfig.outdatedServerMessage.replaceAll("'", "''"), SharedConstants.getCurrentVersion().name())); // Spigot // Paper - Fix hex colors not working in some kick messages
|
||||
}
|
||||
+ Component component = io.papermc.paper.adventure.PaperAdventure.asVanilla(adventureComponent); // Paper - Fix hex colors not working in some kick messages
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/packs/PathPackResources.java
|
||||
+++ b/net/minecraft/server/packs/PathPackResources.java
|
||||
@@ -103,6 +_,12 @@
|
||||
@@ -112,6 +_,12 @@
|
||||
try (DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path)) {
|
||||
for (Path path1 : directoryStream) {
|
||||
String string = path1.getFileName().toString();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/server/players/PlayerList.java
|
||||
+++ b/net/minecraft/server/players/PlayerList.java
|
||||
@@ -112,14 +_,16 @@
|
||||
@@ -111,14 +_,16 @@
|
||||
private static final int SEND_PLAYER_INFO_INTERVAL = 600;
|
||||
private static final SimpleDateFormat BAN_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
|
||||
private final MinecraftServer server;
|
||||
@@ -20,7 +20,7 @@
|
||||
public final PlayerDataStorage playerIo;
|
||||
private boolean doWhiteList;
|
||||
private final LayeredRegistryAccess<RegistryLayer> registries;
|
||||
@@ -130,14 +_,26 @@
|
||||
@@ -129,14 +_,26 @@
|
||||
private static final boolean ALLOW_LOGOUTIVATOR = false;
|
||||
private int sendAllPlayerInfoIn;
|
||||
|
||||
@@ -47,259 +47,262 @@
|
||||
GameProfile gameProfile = player.getGameProfile();
|
||||
GameProfileCache profileCache = this.server.getProfileCache();
|
||||
String string;
|
||||
@@ -150,30 +_,94 @@
|
||||
@@ -149,20 +_,66 @@
|
||||
}
|
||||
|
||||
Optional<CompoundTag> optional = this.load(player);
|
||||
- ResourceKey<Level> resourceKey = optional.<ResourceKey<Level>>flatMap(
|
||||
- compoundTag -> DimensionType.parseLegacy(new Dynamic<>(NbtOps.INSTANCE, compoundTag.get("Dimension"))).resultOrPartial(LOGGER::error)
|
||||
+ // CraftBukkit start - Better rename detection
|
||||
+ if (optional.isPresent()) {
|
||||
+ string = optional.flatMap(t -> t.getCompound("bukkit")).flatMap(t -> t.getString("lastKnownName")).orElse(string);
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+ // Paper start - move logic in Entity to here, to use bukkit supplied world UUID & reset to main world spawn if no valid world is found
|
||||
+ ResourceKey<Level> resourceKey = null; // Paper
|
||||
+ boolean[] invalidPlayerWorld = {false};
|
||||
+ bukkitData: if (optional.isPresent()) {
|
||||
+ // The main way for bukkit worlds to store the world is the world UUID despite mojang adding custom worlds
|
||||
+ final org.bukkit.World bWorld;
|
||||
+ final CompoundTag playerData = optional.get();
|
||||
+ // TODO maybe convert this to a codec and use compoundTag#read, we need silent variants of that method first.
|
||||
+ final Optional<Long> worldUUIDMost = playerData.getLong("WorldUUIDMost");
|
||||
+ final Optional<Long> worldUUIDLeast = playerData.getLong("WorldUUIDLeast");
|
||||
+ final java.util.Optional<String> worldName = playerData.getString("world");
|
||||
+ if (worldUUIDMost.isPresent() && worldUUIDLeast.isPresent()) {
|
||||
+ bWorld = org.bukkit.Bukkit.getServer().getWorld(new UUID(worldUUIDMost.get(), worldUUIDLeast.get()));
|
||||
+ } else if (worldName.isPresent()) { // Paper - legacy bukkit world name
|
||||
+ bWorld = org.bukkit.Bukkit.getServer().getWorld(worldName.get());
|
||||
+ } else {
|
||||
+ break bukkitData; // if neither of the bukkit data points exist, proceed to the vanilla migration section
|
||||
try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), LOGGER)) {
|
||||
- Optional<ValueInput> optional1 = this.load(player, scopedCollector);
|
||||
- ResourceKey<Level> resourceKey = optional1.<ResourceKey<Level>>flatMap(valueInput -> valueInput.read("Dimension", Level.RESOURCE_KEY_CODEC))
|
||||
- .orElse(Level.OVERWORLD);
|
||||
+ Optional<ValueInput> optional1 = this.load(player, scopedCollector); final Optional<ValueInput> loadedPlayerData = optional1; // Paper - OBFHELPER
|
||||
+ // CraftBukkit start - Better rename detection
|
||||
+ if (loadedPlayerData.isPresent()) {
|
||||
+ string = loadedPlayerData.flatMap(t -> t.child("bukkit")).flatMap(t -> t.getString("lastKnownName")).orElse(string);
|
||||
+ }
|
||||
+ if (bWorld != null) {
|
||||
+ resourceKey = ((org.bukkit.craftbukkit.CraftWorld) bWorld).getHandle().dimension();
|
||||
+ } else {
|
||||
+ resourceKey = Level.OVERWORLD;
|
||||
+ invalidPlayerWorld[0] = true;
|
||||
+ }
|
||||
+ }
|
||||
+ if (resourceKey == null) { // only run the vanilla logic if we haven't found a world from the bukkit data
|
||||
+ // Below is the vanilla way of getting the dimension, this is for migration from vanilla servers
|
||||
+ resourceKey = optional.<ResourceKey<Level>>flatMap(
|
||||
+ compoundTag -> {
|
||||
+ com.mojang.serialization.DataResult<ResourceKey<Level>> dataResult = DimensionType.parseLegacy(new Dynamic<>(NbtOps.INSTANCE, compoundTag.get("Dimension")));
|
||||
+ final Optional<ResourceKey<Level>> result = dataResult.resultOrPartial(LOGGER::error);
|
||||
+ invalidPlayerWorld[0] = result.isEmpty(); // reset to main world spawn if no valid world is found
|
||||
+ return result;
|
||||
+ }
|
||||
)
|
||||
- .orElse(Level.OVERWORLD);
|
||||
+ .orElse(Level.OVERWORLD); // revert to vanilla default main world, this isn't an "invalid world" since no player data existed
|
||||
+ }
|
||||
+ // Paper end
|
||||
ServerLevel level = this.server.getLevel(resourceKey);
|
||||
ServerLevel serverLevel;
|
||||
if (level == null) {
|
||||
LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", resourceKey);
|
||||
serverLevel = this.server.overworld();
|
||||
+ invalidPlayerWorld[0] = true; // Paper - reset to main world if no world with parsed value is found
|
||||
} else {
|
||||
serverLevel = level;
|
||||
}
|
||||
|
||||
+ // Paper start - Entity#getEntitySpawnReason
|
||||
+ if (optional.isEmpty()) {
|
||||
+ player.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; // set Player SpawnReason to DEFAULT on first login
|
||||
+ // Paper start - reset to main world spawn if first spawn or invalid world
|
||||
+ }
|
||||
+ if (optional.isEmpty() || invalidPlayerWorld[0]) {
|
||||
+ // Paper end - reset to main world spawn if first spawn or invalid world
|
||||
+ player.snapTo(player.adjustSpawnLocation(serverLevel, serverLevel.getSharedSpawnPos()).getBottomCenter(), serverLevel.getSharedSpawnAngle(), 0.0F); // Paper - MC-200092 - fix first spawn pos yaw being ignored
|
||||
+ }
|
||||
+ // Paper end - Entity#getEntitySpawnReason
|
||||
player.setServerLevel(serverLevel);
|
||||
String loggableAddress = connection.getLoggableAddress(this.server.logIPs());
|
||||
- LOGGER.info(
|
||||
- "{}[{}] logged in with entity id {} at ({}, {}, {})",
|
||||
- player.getName().getString(),
|
||||
- loggableAddress,
|
||||
- player.getId(),
|
||||
- player.getX(),
|
||||
- player.getY(),
|
||||
- player.getZ()
|
||||
- );
|
||||
+ // Spigot start - spawn location event
|
||||
+ org.bukkit.entity.Player spawnPlayer = player.getBukkitEntity();
|
||||
+ org.spigotmc.event.player.PlayerSpawnLocationEvent ev = new org.spigotmc.event.player.PlayerSpawnLocationEvent(spawnPlayer, spawnPlayer.getLocation());
|
||||
+ this.cserver.getPluginManager().callEvent(ev);
|
||||
+
|
||||
+ org.bukkit.Location loc = ev.getSpawnLocation();
|
||||
+ serverLevel = ((org.bukkit.craftbukkit.CraftWorld) loc.getWorld()).getHandle();
|
||||
+
|
||||
+ player.spawnIn(serverLevel);
|
||||
+ // Paper start - set raw so we aren't fully joined to the world (not added to chunk or world)
|
||||
+ player.setPosRaw(loc.getX(), loc.getY(), loc.getZ());
|
||||
+ player.setRot(loc.getYaw(), loc.getPitch());
|
||||
+ // Paper end - set raw so we aren't fully joined to the world
|
||||
+ // Spigot end
|
||||
+ // LOGGER.info( // CraftBukkit - Moved message to after join
|
||||
+ // "{}[{}] logged in with entity id {} at ({}, {}, {})",
|
||||
+ // player.getName().getString(),
|
||||
+ // loggableAddress,
|
||||
+ // player.getId(),
|
||||
+ // player.getX(),
|
||||
+ // player.getY(),
|
||||
+ // player.getZ()
|
||||
+ // );
|
||||
LevelData levelData = serverLevel.getLevelData();
|
||||
player.loadGameTypes(optional.orElse(null));
|
||||
ServerGamePacketListenerImpl serverGamePacketListenerImpl = new ServerGamePacketListenerImpl(this.server, connection, player, cookie);
|
||||
@@ -191,8 +_,8 @@
|
||||
levelData.isHardcore(),
|
||||
this.server.levelKeys(),
|
||||
this.getMaxPlayers(),
|
||||
- this.viewDistance,
|
||||
- this.simulationDistance,
|
||||
+ serverLevel.spigotConfig.viewDistance,// Spigot - view distance
|
||||
+ serverLevel.spigotConfig.simulationDistance,
|
||||
_boolean1,
|
||||
!_boolean,
|
||||
_boolean2,
|
||||
@@ -200,6 +_,7 @@
|
||||
this.server.enforceSecureProfile()
|
||||
)
|
||||
);
|
||||
+ player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit
|
||||
serverGamePacketListenerImpl.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked()));
|
||||
serverGamePacketListenerImpl.send(new ClientboundPlayerAbilitiesPacket(player.getAbilities()));
|
||||
serverGamePacketListenerImpl.send(new ClientboundSetHeldSlotPacket(player.getInventory().getSelectedSlot()));
|
||||
@@ -219,26 +_,119 @@
|
||||
mutableComponent = Component.translatable("multiplayer.player.joined.renamed", player.getDisplayName(), string);
|
||||
}
|
||||
|
||||
- this.broadcastSystemMessage(mutableComponent.withStyle(ChatFormatting.YELLOW), false);
|
||||
+ // CraftBukkit start
|
||||
+ mutableComponent.withStyle(ChatFormatting.YELLOW);
|
||||
+ Component joinMessage = mutableComponent; // Paper - Adventure
|
||||
serverGamePacketListenerImpl.teleport(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot());
|
||||
ServerStatus status = this.server.getStatus();
|
||||
if (status != null && !cookie.transferred()) {
|
||||
player.sendServerStatus(status);
|
||||
}
|
||||
|
||||
- player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players));
|
||||
+ // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below
|
||||
this.players.add(player);
|
||||
+ this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot
|
||||
this.playersByUUID.put(player.getUUID(), player);
|
||||
- this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)));
|
||||
- this.sendLevelInfo(player, serverLevel);
|
||||
+ // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below
|
||||
+ // Paper start - Fire PlayerJoinEvent when Player is actually ready; correctly register player BEFORE PlayerJoinEvent, so the entity is valid and doesn't require tick delay hacks
|
||||
+ player.supressTrackerForLogin = true;
|
||||
serverLevel.addNewPlayer(player);
|
||||
- this.server.getCustomBossEvents().onPlayerConnect(player);
|
||||
- this.sendActivePlayerEffects(player);
|
||||
+ this.server.getCustomBossEvents().onPlayerConnect(player); // see commented out section below serverLevel.addPlayerJoin(player);
|
||||
+ // Paper end - Fire PlayerJoinEvent when Player is actually ready
|
||||
optional.ifPresent(compoundTag -> {
|
||||
player.loadAndSpawnEnderPearls(compoundTag);
|
||||
player.loadAndSpawnParentVehicle(compoundTag);
|
||||
});
|
||||
+ // CraftBukkit start
|
||||
+ org.bukkit.craftbukkit.entity.CraftPlayer bukkitPlayer = player.getBukkitEntity();
|
||||
+
|
||||
+ // Ensure that player inventory is populated with its viewer
|
||||
+ player.containerMenu.transferTo(player.containerMenu, bukkitPlayer);
|
||||
+
|
||||
+ org.bukkit.event.player.PlayerJoinEvent playerJoinEvent = new org.bukkit.event.player.PlayerJoinEvent(bukkitPlayer, io.papermc.paper.adventure.PaperAdventure.asAdventure(mutableComponent)); // Paper - Adventure
|
||||
+ this.cserver.getPluginManager().callEvent(playerJoinEvent);
|
||||
+
|
||||
+ if (!player.connection.isAcceptingMessages()) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage();
|
||||
+
|
||||
+ if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure
|
||||
+ joinMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(jm); // Paper - Adventure
|
||||
+ this.server.getPlayerList().broadcastSystemMessage(joinMessage, false); // Paper - Adventure
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+
|
||||
+ // CraftBukkit start - sendAll above replaced with this loop
|
||||
+ ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); // Paper - Add Listing API for Player
|
||||
+
|
||||
+ final List<ServerPlayer> onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - Use single player info update packet on join
|
||||
+ for (int i = 0; i < this.players.size(); ++i) {
|
||||
+ ServerPlayer entityplayer1 = (ServerPlayer) this.players.get(i);
|
||||
+
|
||||
+ if (entityplayer1.getBukkitEntity().canSee(bukkitPlayer)) {
|
||||
+ // Paper start - Add Listing API for Player
|
||||
+ if (entityplayer1.getBukkitEntity().isListed(bukkitPlayer)) {
|
||||
+ // Paper end - Add Listing API for Player
|
||||
+ entityplayer1.connection.send(packet);
|
||||
+ // Paper start - Add Listing API for Player
|
||||
+ // CraftBukkit end
|
||||
+ // Paper start - move logic in Entity to here, to use bukkit supplied world UUID & reset to main world spawn if no valid world is found
|
||||
+ ResourceKey<Level> resourceKey = null; // Paper
|
||||
+ boolean[] invalidPlayerWorld = {false};
|
||||
+ bukkitData: if (loadedPlayerData.isPresent()) {
|
||||
+ // The main way for bukkit worlds to store the world is the world UUID despite mojang adding custom worlds
|
||||
+ final org.bukkit.World bWorld;
|
||||
+ final ValueInput playerData = loadedPlayerData.get();
|
||||
+ // TODO maybe convert this to a codec and use compoundTag#read, we need silent variants of that method first.
|
||||
+ final Optional<Long> worldUUIDMost = playerData.getLong("WorldUUIDMost");
|
||||
+ final Optional<Long> worldUUIDLeast = playerData.getLong("WorldUUIDLeast");
|
||||
+ final java.util.Optional<String> worldName = playerData.getString("world");
|
||||
+ if (worldUUIDMost.isPresent() && worldUUIDLeast.isPresent()) {
|
||||
+ bWorld = org.bukkit.Bukkit.getServer().getWorld(new UUID(worldUUIDMost.get(), worldUUIDLeast.get()));
|
||||
+ } else if (worldName.isPresent()) { // Paper - legacy bukkit world name
|
||||
+ bWorld = org.bukkit.Bukkit.getServer().getWorld(worldName.get());
|
||||
+ } else {
|
||||
+ entityplayer1.connection.send(ClientboundPlayerInfoUpdatePacket.createSinglePlayerInitializing(player, false));
|
||||
+ break bukkitData; // if neither of the bukkit data points exist, proceed to the vanilla migration section
|
||||
+ }
|
||||
+ // Paper end - Add Listing API for Player
|
||||
+ if (bWorld != null) {
|
||||
+ resourceKey = ((org.bukkit.craftbukkit.CraftWorld) bWorld).getHandle().dimension();
|
||||
+ } else {
|
||||
+ resourceKey = Level.OVERWORLD;
|
||||
+ invalidPlayerWorld[0] = true;
|
||||
+ }
|
||||
+ }
|
||||
+ if (resourceKey == null) { // only run the vanilla logic if we haven't found a world from the bukkit data
|
||||
+ // Below is the vanilla way of getting the dimension, this is for migration from vanilla servers
|
||||
+ resourceKey = loadedPlayerData.<ResourceKey<Level>>flatMap(
|
||||
+ compoundTag -> {
|
||||
+ Optional<ResourceKey<Level>> result = compoundTag.read("Dimension", Level.RESOURCE_KEY_CODEC);
|
||||
+ invalidPlayerWorld[0] = result.isEmpty(); // reset to main world spawn if no valid world is found
|
||||
+ return result;
|
||||
+ }
|
||||
+ )
|
||||
+ .orElse(Level.OVERWORLD); // revert to vanilla default main world, this isn't an "invalid world" since no player data existed
|
||||
+ }
|
||||
+ // Paper end
|
||||
ServerLevel level = this.server.getLevel(resourceKey);
|
||||
ServerLevel serverLevel;
|
||||
if (level == null) {
|
||||
LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", resourceKey);
|
||||
serverLevel = this.server.overworld();
|
||||
+ invalidPlayerWorld[0] = true; // Paper - reset to main world if no world with parsed value is found
|
||||
} else {
|
||||
serverLevel = level;
|
||||
}
|
||||
|
||||
+ // Paper start - Entity#getEntitySpawnReason
|
||||
+ if (loadedPlayerData.isEmpty()) {
|
||||
+ player.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; // set Player SpawnReason to DEFAULT on first login
|
||||
+ }
|
||||
+ // Paper end - Entity#getEntitySpawnReason
|
||||
player.setServerLevel(serverLevel);
|
||||
- if (optional1.isEmpty()) {
|
||||
+ if (loadedPlayerData.isEmpty() || invalidPlayerWorld[0]) { // Paper - reset to main world spawn if first spawn or invalid world
|
||||
player.snapTo(
|
||||
player.adjustSpawnLocation(serverLevel, serverLevel.getSharedSpawnPos()).getBottomCenter(), serverLevel.getSharedSpawnAngle(), 0.0F
|
||||
);
|
||||
@@ -170,15 +_,29 @@
|
||||
|
||||
serverLevel.waitForChunkAndEntities(player.chunkPosition(), 1);
|
||||
String loggableAddress = connection.getLoggableAddress(this.server.logIPs());
|
||||
- LOGGER.info(
|
||||
- "{}[{}] logged in with entity id {} at ({}, {}, {})",
|
||||
- player.getName().getString(),
|
||||
- loggableAddress,
|
||||
- player.getId(),
|
||||
- player.getX(),
|
||||
- player.getY(),
|
||||
- player.getZ()
|
||||
- );
|
||||
+ // Spigot start - spawn location event
|
||||
+ org.bukkit.entity.Player spawnPlayer = player.getBukkitEntity();
|
||||
+ org.spigotmc.event.player.PlayerSpawnLocationEvent ev = new org.spigotmc.event.player.PlayerSpawnLocationEvent(spawnPlayer, spawnPlayer.getLocation());
|
||||
+ this.cserver.getPluginManager().callEvent(ev);
|
||||
+
|
||||
+ org.bukkit.Location loc = ev.getSpawnLocation();
|
||||
+ serverLevel = ((org.bukkit.craftbukkit.CraftWorld) loc.getWorld()).getHandle();
|
||||
+
|
||||
+ player.spawnIn(serverLevel);
|
||||
+ // Paper start - set raw so we aren't fully joined to the world (not added to chunk or world)
|
||||
+ player.setPosRaw(loc.getX(), loc.getY(), loc.getZ());
|
||||
+ player.setRot(loc.getYaw(), loc.getPitch());
|
||||
+ // Paper end - set raw so we aren't fully joined to the world
|
||||
+ // Spigot end
|
||||
+ // LOGGER.info( // CraftBukkit - Moved message to after join
|
||||
+ // "{}[{}] logged in with entity id {} at ({}, {}, {})",
|
||||
+ // player.getName().getString(),
|
||||
+ // loggableAddress,
|
||||
+ // player.getId(),
|
||||
+ // player.getX(),
|
||||
+ // player.getY(),
|
||||
+ // player.getZ()
|
||||
+ // );
|
||||
LevelData levelData = serverLevel.getLevelData();
|
||||
player.loadGameTypes(optional1.orElse(null));
|
||||
ServerGamePacketListenerImpl serverGamePacketListenerImpl = new ServerGamePacketListenerImpl(this.server, connection, player, cookie);
|
||||
@@ -196,8 +_,8 @@
|
||||
levelData.isHardcore(),
|
||||
this.server.levelKeys(),
|
||||
this.getMaxPlayers(),
|
||||
- this.viewDistance,
|
||||
- this.simulationDistance,
|
||||
+ serverLevel.spigotConfig.viewDistance, // Spigot - view distance
|
||||
+ serverLevel.spigotConfig.simulationDistance, // Spigot - simulation distance
|
||||
_boolean1,
|
||||
!_boolean,
|
||||
_boolean2,
|
||||
@@ -205,6 +_,7 @@
|
||||
this.server.enforceSecureProfile()
|
||||
)
|
||||
);
|
||||
+ player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit
|
||||
serverGamePacketListenerImpl.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked()));
|
||||
serverGamePacketListenerImpl.send(new ClientboundPlayerAbilitiesPacket(player.getAbilities()));
|
||||
serverGamePacketListenerImpl.send(new ClientboundSetHeldSlotPacket(player.getInventory().getSelectedSlot()));
|
||||
@@ -224,26 +_,119 @@
|
||||
mutableComponent = Component.translatable("multiplayer.player.joined.renamed", player.getDisplayName(), string);
|
||||
}
|
||||
|
||||
- this.broadcastSystemMessage(mutableComponent.withStyle(ChatFormatting.YELLOW), false);
|
||||
+ // CraftBukkit start
|
||||
+ mutableComponent.withStyle(ChatFormatting.YELLOW);
|
||||
+ Component joinMessage = mutableComponent; // Paper - Adventure
|
||||
serverGamePacketListenerImpl.teleport(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot());
|
||||
ServerStatus status = this.server.getStatus();
|
||||
if (status != null && !cookie.transferred()) {
|
||||
player.sendServerStatus(status);
|
||||
}
|
||||
|
||||
- player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players));
|
||||
+ // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below
|
||||
this.players.add(player);
|
||||
+ this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot
|
||||
this.playersByUUID.put(player.getUUID(), player);
|
||||
- this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)));
|
||||
- this.sendLevelInfo(player, serverLevel);
|
||||
+ // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below
|
||||
+ // Paper start - Fire PlayerJoinEvent when Player is actually ready; correctly register player BEFORE PlayerJoinEvent, so the entity is valid and doesn't require tick delay hacks
|
||||
+ player.supressTrackerForLogin = true;
|
||||
serverLevel.addNewPlayer(player);
|
||||
- this.server.getCustomBossEvents().onPlayerConnect(player);
|
||||
- this.sendActivePlayerEffects(player);
|
||||
+ this.server.getCustomBossEvents().onPlayerConnect(player); // see commented out section below serverLevel.addPlayerJoin(player);
|
||||
+ // Paper end - Fire PlayerJoinEvent when Player is actually ready
|
||||
optional1.ifPresent(valueInput -> {
|
||||
player.loadAndSpawnEnderPearls(valueInput);
|
||||
player.loadAndSpawnParentVehicle(valueInput);
|
||||
});
|
||||
+ // CraftBukkit start
|
||||
+ org.bukkit.craftbukkit.entity.CraftPlayer bukkitPlayer = player.getBukkitEntity();
|
||||
+
|
||||
+ // Ensure that player inventory is populated with its viewer
|
||||
+ player.containerMenu.transferTo(player.containerMenu, bukkitPlayer);
|
||||
+
|
||||
+ org.bukkit.event.player.PlayerJoinEvent playerJoinEvent = new org.bukkit.event.player.PlayerJoinEvent(bukkitPlayer, io.papermc.paper.adventure.PaperAdventure.asAdventure(mutableComponent)); // Paper - Adventure
|
||||
+ this.cserver.getPluginManager().callEvent(playerJoinEvent);
|
||||
+
|
||||
+ if (!player.connection.isAcceptingMessages()) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (entityplayer1 == player || !bukkitPlayer.canSee(entityplayer1.getBukkitEntity())) { // Paper - Use single player info update packet on join; Don't include joining player
|
||||
+ continue;
|
||||
+ final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage();
|
||||
+
|
||||
+ if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure
|
||||
+ joinMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(jm); // Paper - Adventure
|
||||
+ this.server.getPlayerList().broadcastSystemMessage(joinMessage, false); // Paper - Adventure
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+
|
||||
+ // CraftBukkit start - sendAll above replaced with this loop
|
||||
+ ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); // Paper - Add Listing API for Player
|
||||
+
|
||||
+ final List<ServerPlayer> onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - Use single player info update packet on join
|
||||
+ for (int i = 0; i < this.players.size(); ++i) {
|
||||
+ ServerPlayer entityplayer1 = (ServerPlayer) this.players.get(i);
|
||||
+
|
||||
+ if (entityplayer1.getBukkitEntity().canSee(bukkitPlayer)) {
|
||||
+ // Paper start - Add Listing API for Player
|
||||
+ if (entityplayer1.getBukkitEntity().isListed(bukkitPlayer)) {
|
||||
+ // Paper end - Add Listing API for Player
|
||||
+ entityplayer1.connection.send(packet);
|
||||
+ // Paper start - Add Listing API for Player
|
||||
+ } else {
|
||||
+ entityplayer1.connection.send(ClientboundPlayerInfoUpdatePacket.createSinglePlayerInitializing(player, false));
|
||||
+ }
|
||||
+ // Paper end - Add Listing API for Player
|
||||
+ }
|
||||
+
|
||||
+ if (entityplayer1 == player || !bukkitPlayer.canSee(entityplayer1.getBukkitEntity())) { // Paper - Use single player info update packet on join; Don't include joining player
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ onlinePlayers.add(entityplayer1); // Paper - Use single player info update packet on join
|
||||
+ }
|
||||
+ // Paper start - Use single player info update packet on join
|
||||
+ if (!onlinePlayers.isEmpty()) {
|
||||
+ player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, player)); // Paper - Add Listing API for Player
|
||||
+ }
|
||||
+ // Paper end - Use single player info update packet on join
|
||||
+ player.sentListPacket = true;
|
||||
+ player.supressTrackerForLogin = false; // Paper - Fire PlayerJoinEvent when Player is actually ready
|
||||
+ ((ServerLevel)player.level()).getChunkSource().chunkMap.addEntity(player); // Paper - Fire PlayerJoinEvent when Player is actually ready; track entity now
|
||||
+ // CraftBukkit end
|
||||
+
|
||||
+ //player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn // Paper - THIS IS NOT NEEDED ANYMORE
|
||||
+
|
||||
+ this.sendLevelInfo(player, serverLevel);
|
||||
+
|
||||
+ // CraftBukkit start - Only add if the player wasn't moved in the event
|
||||
+ if (player.level() == serverLevel && !serverLevel.players().contains(player)) {
|
||||
+ serverLevel.addNewPlayer(player);
|
||||
+ this.server.getCustomBossEvents().onPlayerConnect(player);
|
||||
+ }
|
||||
+
|
||||
+ onlinePlayers.add(entityplayer1); // Paper - Use single player info update packet on join
|
||||
+ }
|
||||
+ // Paper start - Use single player info update packet on join
|
||||
+ if (!onlinePlayers.isEmpty()) {
|
||||
+ player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(onlinePlayers, player)); // Paper - Add Listing API for Player
|
||||
+ }
|
||||
+ // Paper end - Use single player info update packet on join
|
||||
+ player.sentListPacket = true;
|
||||
+ player.supressTrackerForLogin = false; // Paper - Fire PlayerJoinEvent when Player is actually ready
|
||||
+ ((ServerLevel)player.level()).getChunkSource().chunkMap.addEntity(player); // Paper - Fire PlayerJoinEvent when Player is actually ready; track entity now
|
||||
+ // CraftBukkit end
|
||||
+
|
||||
+ //player.refreshEntityData(player); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn // Paper - THIS IS NOT NEEDED ANYMORE
|
||||
+
|
||||
+ this.sendLevelInfo(player, serverLevel);
|
||||
+
|
||||
+ // CraftBukkit start - Only add if the player wasn't moved in the event
|
||||
+ if (player.level() == serverLevel && !serverLevel.players().contains(player)) {
|
||||
+ serverLevel.addNewPlayer(player);
|
||||
+ this.server.getCustomBossEvents().onPlayerConnect(player);
|
||||
+ }
|
||||
+
|
||||
+ serverLevel = player.serverLevel(); // CraftBukkit - Update in case join event changed it
|
||||
+ // CraftBukkit end
|
||||
+ this.sendActivePlayerEffects(player);
|
||||
+ // Paper - move loading pearls / parent vehicle up
|
||||
player.initInventoryMenu();
|
||||
+ // CraftBukkit - Moved from above, added world
|
||||
+ // Paper start - Configurable player collision; Add to collideRule team if needed
|
||||
+ final net.minecraft.world.scores.Scoreboard scoreboard = this.getServer().getLevel(Level.OVERWORLD).getScoreboard();
|
||||
+ final PlayerTeam collideRuleTeam = scoreboard.getPlayerTeam(this.collideRuleTeamName);
|
||||
+ if (this.collideRuleTeamName != null && collideRuleTeam != null && player.getTeam() == null) {
|
||||
+ scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam);
|
||||
+ }
|
||||
+ // Paper end - Configurable player collision
|
||||
+ PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), loggableAddress, player.getId(), serverLevel.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ());
|
||||
+ // Paper start - Send empty chunk, so players aren't stuck in the world loading screen with our chunk system not sending chunks when dead
|
||||
+ if (player.isDeadOrDying()) {
|
||||
+ net.minecraft.core.Holder<net.minecraft.world.level.biome.Biome> plains = serverLevel.registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.BIOME)
|
||||
+ serverLevel = player.level(); // CraftBukkit - Update in case join event changed it
|
||||
+ // CraftBukkit end
|
||||
+ this.sendActivePlayerEffects(player);
|
||||
+ // Paper - move loading pearls / parent vehicle up
|
||||
player.initInventoryMenu();
|
||||
+ // CraftBukkit - Moved from above, added world
|
||||
+ // Paper start - Configurable player collision; Add to collideRule team if needed
|
||||
+ final net.minecraft.world.scores.Scoreboard scoreboard = this.getServer().getLevel(Level.OVERWORLD).getScoreboard();
|
||||
+ final PlayerTeam collideRuleTeam = scoreboard.getPlayerTeam(this.collideRuleTeamName);
|
||||
+ if (this.collideRuleTeamName != null && collideRuleTeam != null && player.getTeam() == null) {
|
||||
+ scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam);
|
||||
+ }
|
||||
+ // Paper end - Configurable player collision
|
||||
+ PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), loggableAddress, player.getId(), serverLevel.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ());
|
||||
+ // Paper start - Send empty chunk, so players aren't stuck in the world loading screen with our chunk system not sending chunks when dead
|
||||
+ if (player.isDeadOrDying()) {
|
||||
+ net.minecraft.core.Holder<net.minecraft.world.level.biome.Biome> plains = serverLevel.registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.BIOME)
|
||||
+ .getOrThrow(net.minecraft.world.level.biome.Biomes.PLAINS);
|
||||
+ player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket(
|
||||
+ player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket(
|
||||
+ new net.minecraft.world.level.chunk.EmptyLevelChunk(serverLevel, player.chunkPosition(), plains),
|
||||
+ serverLevel.getLightEngine(), (java.util.BitSet)null, (java.util.BitSet) null)
|
||||
+ );
|
||||
+ }
|
||||
+ // Paper end - Send empty chunk
|
||||
+ );
|
||||
+ }
|
||||
+ // Paper end - Send empty chunk
|
||||
}
|
||||
}
|
||||
|
||||
public void updateEntireScoreboard(ServerScoreboard scoreboard, ServerPlayer player) {
|
||||
@@ -261,30 +_,31 @@
|
||||
@@ -267,30 +_,31 @@
|
||||
}
|
||||
|
||||
public void addWorldborderListener(ServerLevel level) {
|
||||
@@ -336,7 +339,7 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -312,56 +_,156 @@
|
||||
@@ -319,56 +_,156 @@
|
||||
}
|
||||
|
||||
protected void save(ServerPlayer player) {
|
||||
@@ -362,7 +365,7 @@
|
||||
+ }
|
||||
+ public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) {
|
||||
+ // Paper end - Fix kick event leave message not being sent
|
||||
ServerLevel serverLevel = player.serverLevel();
|
||||
ServerLevel serverLevel = player.level();
|
||||
player.awardStat(Stats.LEAVE_GAME);
|
||||
+ // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it
|
||||
+ // See SPIGOT-5799, SPIGOT-6145
|
||||
@@ -423,7 +426,7 @@
|
||||
+ if (!thrownEnderpearl.level().paperConfig().misc.legacyEnderPearlBehavior) {
|
||||
+ thrownEnderpearl.setRemoved(Entity.RemovalReason.UNLOADED_WITH_PLAYER, org.bukkit.event.entity.EntityRemoveEvent.Cause.PLAYER_QUIT); // CraftBukkit - add Bukkit remove cause
|
||||
+ } else {
|
||||
+ thrownEnderpearl.cachedOwner = null;
|
||||
+ thrownEnderpearl.setOwner(null);
|
||||
+ }
|
||||
+ // Paper end - Allow using old ender pearl behavior
|
||||
}
|
||||
@@ -495,7 +498,7 @@
|
||||
+ // depending on the outcome.
|
||||
+ SocketAddress socketAddress = loginlistener.connection.getRemoteAddress();
|
||||
+
|
||||
+ ServerPlayer entity = new ServerPlayer(this.server, this.server.getLevel(Level.OVERWORLD), gameProfile, ClientInformation.createDefault());
|
||||
+ ServerPlayer entity = new ServerPlayer(this.server, this.server.getLevel(Level.OVERWORLD), gameProfile, net.minecraft.server.level.ClientInformation.createDefault());
|
||||
+ entity.transferCookieConnection = loginlistener;
|
||||
+ org.bukkit.entity.Player player = entity.getBukkitEntity();
|
||||
+ org.bukkit.event.player.PlayerLoginEvent event = new org.bukkit.event.player.PlayerLoginEvent(player, loginlistener.connection.hostname, ((java.net.InetSocketAddress) socketAddress).getAddress(), ((java.net.InetSocketAddress) loginlistener.connection.channel.remoteAddress()).getAddress());
|
||||
@@ -507,7 +510,7 @@
|
||||
MutableComponent mutableComponent = Component.translatable("multiplayer.disconnect.banned.reason", userBanListEntry.getReason());
|
||||
if (userBanListEntry.getExpires() != null) {
|
||||
mutableComponent.append(
|
||||
@@ -369,10 +_,12 @@
|
||||
@@ -376,10 +_,12 @@
|
||||
);
|
||||
}
|
||||
|
||||
@@ -524,7 +527,7 @@
|
||||
IpBanListEntry ipBanListEntry = this.ipBans.get(socketAddress);
|
||||
MutableComponent mutableComponent = Component.translatable("multiplayer.disconnect.banned_ip.reason", ipBanListEntry.getReason());
|
||||
if (ipBanListEntry.getExpires() != null) {
|
||||
@@ -381,69 +_,131 @@
|
||||
@@ -388,65 +_,124 @@
|
||||
);
|
||||
}
|
||||
|
||||
@@ -538,10 +541,6 @@
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- public ServerPlayer getPlayerForLogin(GameProfile gameProfile, ClientInformation clientInformation) {
|
||||
- return new ServerPlayer(this.server, this.server.overworld(), gameProfile, clientInformation);
|
||||
- }
|
||||
-
|
||||
- public boolean disconnectAllPlayersWithProfile(GameProfile gameProfile) {
|
||||
- UUID id = gameProfile.getId();
|
||||
- Set<ServerPlayer> set = Sets.newIdentityHashSet();
|
||||
@@ -578,13 +577,6 @@
|
||||
+ return entity;
|
||||
+ }
|
||||
+
|
||||
+ // CraftBukkit start - added EntityPlayer
|
||||
+ public ServerPlayer getPlayerForLogin(GameProfile gameProfile, ClientInformation clientInformation, ServerPlayer player) {
|
||||
+ player.updateOptions(clientInformation);
|
||||
+ return player;
|
||||
+ // CraftBukkit end
|
||||
+ }
|
||||
+
|
||||
+ public boolean disconnectAllPlayersWithProfile(GameProfile gameProfile, ServerPlayer player) { // CraftBukkit - added ServerPlayer
|
||||
+ // CraftBukkit start - Moved up
|
||||
+ // UUID id = gameProfile.getId();
|
||||
@@ -619,7 +611,7 @@
|
||||
+ player.stopRiding(); // CraftBukkit
|
||||
this.players.remove(player);
|
||||
+ this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot
|
||||
player.serverLevel().removePlayerImmediately(player, reason);
|
||||
player.level().removePlayerImmediately(player, reason);
|
||||
- TeleportTransition teleportTransition = player.findRespawnPositionAndUseSpawnBlock(!keepInventory, TeleportTransition.DO_NOTHING);
|
||||
- ServerLevel level = teleportTransition.newLevel();
|
||||
- ServerPlayer serverPlayer = new ServerPlayer(this.server, level, player.getGameProfile(), player.clientInformation());
|
||||
@@ -686,7 +678,7 @@
|
||||
}
|
||||
|
||||
byte b = (byte)(keepInventory ? 1 : 0);
|
||||
ServerLevel serverLevel = serverPlayer.serverLevel();
|
||||
ServerLevel serverLevel = serverPlayer.level();
|
||||
LevelData levelData = serverLevel.getLevelData();
|
||||
serverPlayer.connection.send(new ClientboundRespawnPacket(serverPlayer.createCommonSpawnInfo(serverLevel), b));
|
||||
- serverPlayer.connection.teleport(serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(), serverPlayer.getYRot(), serverPlayer.getXRot());
|
||||
@@ -697,7 +689,7 @@
|
||||
serverPlayer.connection.send(new ClientboundSetDefaultSpawnPositionPacket(level.getSharedSpawnPos(), level.getSharedSpawnAngle()));
|
||||
serverPlayer.connection.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked()));
|
||||
serverPlayer.connection
|
||||
@@ -451,10 +_,13 @@
|
||||
@@ -454,10 +_,13 @@
|
||||
this.sendActivePlayerEffects(serverPlayer);
|
||||
this.sendLevelInfo(serverPlayer, level);
|
||||
this.sendPlayerPermissionLevel(serverPlayer);
|
||||
@@ -715,7 +707,7 @@
|
||||
serverPlayer.setHealth(serverPlayer.getHealth());
|
||||
ServerPlayer.RespawnConfig respawnConfig = serverPlayer.getRespawnConfig();
|
||||
if (!keepInventory && respawnConfig != null) {
|
||||
@@ -477,8 +_,52 @@
|
||||
@@ -480,8 +_,52 @@
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -768,7 +760,7 @@
|
||||
|
||||
return serverPlayer;
|
||||
}
|
||||
@@ -488,24 +_,59 @@
|
||||
@@ -491,24 +_,59 @@
|
||||
}
|
||||
|
||||
public void sendActiveEffects(LivingEntity entity, ServerGamePacketListenerImpl connection) {
|
||||
@@ -831,7 +823,7 @@
|
||||
public void broadcastAll(Packet<?> packet) {
|
||||
for (ServerPlayer serverPlayer : this.players) {
|
||||
serverPlayer.connection.send(packet);
|
||||
@@ -581,6 +_,12 @@
|
||||
@@ -584,6 +_,12 @@
|
||||
}
|
||||
|
||||
private void sendPlayerPermissionLevel(ServerPlayer player, int permLevel) {
|
||||
@@ -844,7 +836,7 @@
|
||||
if (player.connection != null) {
|
||||
byte b;
|
||||
if (permLevel <= 0) {
|
||||
@@ -594,11 +_,33 @@
|
||||
@@ -597,11 +_,33 @@
|
||||
player.connection.send(new ClientboundEntityEventPacket(player, b));
|
||||
}
|
||||
|
||||
@@ -879,7 +871,7 @@
|
||||
}
|
||||
|
||||
public boolean isOp(GameProfile profile) {
|
||||
@@ -609,21 +_,17 @@
|
||||
@@ -612,21 +_,17 @@
|
||||
|
||||
@Nullable
|
||||
public ServerPlayer getPlayerByName(String username) {
|
||||
@@ -907,7 +899,7 @@
|
||||
if (serverPlayer != except && serverPlayer.level().dimension() == dimension) {
|
||||
double d = x - serverPlayer.getX();
|
||||
double d1 = y - serverPlayer.getY();
|
||||
@@ -636,9 +_,11 @@
|
||||
@@ -639,9 +_,11 @@
|
||||
}
|
||||
|
||||
public void saveAll() {
|
||||
@@ -919,7 +911,7 @@
|
||||
}
|
||||
|
||||
public UserWhiteList getWhiteList() {
|
||||
@@ -661,14 +_,18 @@
|
||||
@@ -664,14 +_,18 @@
|
||||
}
|
||||
|
||||
public void sendLevelInfo(ServerPlayer player, ServerLevel level) {
|
||||
@@ -942,7 +934,7 @@
|
||||
}
|
||||
|
||||
player.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.LEVEL_CHUNKS_LOAD_START, 0.0F));
|
||||
@@ -677,8 +_,21 @@
|
||||
@@ -680,8 +_,21 @@
|
||||
|
||||
public void sendAllPlayerInfo(ServerPlayer player) {
|
||||
player.inventoryMenu.sendAllDataToRemote();
|
||||
@@ -957,15 +949,15 @@
|
||||
+ player.refreshEntityData(player); // CraftBukkit - SPIGOT-7218: sync metadata
|
||||
player.connection.send(new ClientboundSetHeldSlotPacket(player.getInventory().getSelectedSlot()));
|
||||
+ // CraftBukkit start - from GameRules
|
||||
+ int i = player.serverLevel().getGameRules().getBoolean(GameRules.RULE_REDUCEDDEBUGINFO) ? 22 : 23;
|
||||
+ int i = player.level().getGameRules().getBoolean(GameRules.RULE_REDUCEDDEBUGINFO) ? 22 : 23;
|
||||
+ player.connection.send(new ClientboundEntityEventPacket(player, (byte) i));
|
||||
+ float immediateRespawn = player.serverLevel().getGameRules().getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN) ? 1.0F: 0.0F;
|
||||
+ float immediateRespawn = player.level().getGameRules().getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN) ? 1.0F: 0.0F;
|
||||
+ player.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.IMMEDIATE_RESPAWN, immediateRespawn));
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
|
||||
public int getPlayerCount() {
|
||||
@@ -694,6 +_,7 @@
|
||||
@@ -697,6 +_,7 @@
|
||||
}
|
||||
|
||||
public void setUsingWhiteList(boolean whitelistEnabled) {
|
||||
@@ -973,7 +965,7 @@
|
||||
this.doWhiteList = whitelistEnabled;
|
||||
}
|
||||
|
||||
@@ -731,10 +_,35 @@
|
||||
@@ -734,10 +_,35 @@
|
||||
}
|
||||
|
||||
public void removeAll() {
|
||||
@@ -1013,7 +1005,7 @@
|
||||
|
||||
public void broadcastSystemMessage(Component message, boolean bypassHiddenChat) {
|
||||
this.broadcastSystemMessage(message, serverPlayer -> message, bypassHiddenChat);
|
||||
@@ -756,20 +_,39 @@
|
||||
@@ -759,20 +_,39 @@
|
||||
}
|
||||
|
||||
public void broadcastChatMessage(PlayerChatMessage message, ServerPlayer sender, ChatType.Bound boundChatType) {
|
||||
@@ -1056,7 +1048,7 @@
|
||||
flag1 |= flag2 && message.isFullyFiltered();
|
||||
}
|
||||
|
||||
@@ -782,14 +_,21 @@
|
||||
@@ -785,14 +_,21 @@
|
||||
return message.hasSignature() && !message.hasExpiredServer(Instant.now());
|
||||
}
|
||||
|
||||
@@ -1082,7 +1074,7 @@
|
||||
Path path = file2.toPath();
|
||||
if (FileUtil.isPathNormalized(path) && FileUtil.isPathPortable(path) && path.startsWith(file.getPath()) && file2.isFile()) {
|
||||
file2.renameTo(file1);
|
||||
@@ -797,7 +_,7 @@
|
||||
@@ -800,7 +_,7 @@
|
||||
}
|
||||
|
||||
serverStatsCounter = new ServerStatsCounter(this.server, file1);
|
||||
@@ -1091,7 +1083,7 @@
|
||||
}
|
||||
|
||||
return serverStatsCounter;
|
||||
@@ -805,11 +_,11 @@
|
||||
@@ -808,11 +_,11 @@
|
||||
|
||||
public PlayerAdvancements getPlayerAdvancements(ServerPlayer player) {
|
||||
UUID uuid = player.getUUID();
|
||||
@@ -1105,7 +1097,7 @@
|
||||
}
|
||||
|
||||
playerAdvancements.setPlayer(player);
|
||||
@@ -852,11 +_,34 @@
|
||||
@@ -855,11 +_,34 @@
|
||||
}
|
||||
|
||||
public void reloadResources() {
|
||||
|
||||
Reference in New Issue
Block a user