net.minecraft.server.commands

This commit is contained in:
Jake Potrebic
2024-12-14 13:42:43 -08:00
parent 973fe2a945
commit 93114d09f2
40 changed files with 460 additions and 518 deletions

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/server/commands/BanIpCommands.java
+++ b/net/minecraft/server/commands/BanIpCommands.java
@@ -68,7 +_,7 @@
}
for (ServerPlayer serverPlayer : playersWithAddress) {
- serverPlayer.connection.disconnect(Component.translatable("multiplayer.disconnect.ip_banned"));
+ serverPlayer.connection.disconnect(Component.translatable("multiplayer.disconnect.ip_banned"), org.bukkit.event.player.PlayerKickEvent.Cause.IP_BANNED); // Paper - kick event cause
}
return playersWithAddress.size();

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/server/commands/BanPlayerCommands.java
+++ b/net/minecraft/server/commands/BanPlayerCommands.java
@@ -55,7 +_,7 @@
);
ServerPlayer player = source.getServer().getPlayerList().getPlayer(gameProfile.getId());
if (player != null) {
- player.connection.disconnect(Component.translatable("multiplayer.disconnect.banned"));
+ player.connection.disconnect(Component.translatable("multiplayer.disconnect.banned"), org.bukkit.event.player.PlayerKickEvent.Cause.BANNED); // Paper - kick event cause
}
}
}

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/server/commands/DeOpCommands.java
+++ b/net/minecraft/server/commands/DeOpCommands.java
@@ -35,7 +_,7 @@
if (playerList.isOp(gameProfile)) {
playerList.deop(gameProfile);
i++;
- source.sendSuccess(() -> Component.translatable("commands.deop.success", players.iterator().next().getName()), true);
+ source.sendSuccess(() -> Component.translatable("commands.deop.success", gameProfile.getName()), true); // Paper - fixes MC-253721
}
}

View File

@@ -0,0 +1,18 @@
--- a/net/minecraft/server/commands/DefaultGameModeCommands.java
+++ b/net/minecraft/server/commands/DefaultGameModeCommands.java
@@ -28,9 +_,13 @@
GameType forcedGameType = server.getForcedGameType();
if (forcedGameType != null) {
for (ServerPlayer serverPlayer : server.getPlayerList().getPlayers()) {
- if (serverPlayer.setGameMode(forcedGameType)) {
- i++;
+ // Paper start - Expand PlayerGameModeChangeEvent
+ org.bukkit.event.player.PlayerGameModeChangeEvent event = serverPlayer.setGameMode(gamemode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, net.kyori.adventure.text.Component.empty());
+ if (event != null && event.isCancelled()) {
+ commandSource.sendSuccess(() -> io.papermc.paper.adventure.PaperAdventure.asVanilla(event.cancelMessage()), false);
}
+ // Paper end - Expand PlayerGameModeChangeEvent
+ i++;
}
}

View File

@@ -0,0 +1,16 @@
--- a/net/minecraft/server/commands/DifficultyCommand.java
+++ b/net/minecraft/server/commands/DifficultyCommand.java
@@ -31,10 +_,11 @@
public static int setDifficulty(CommandSourceStack source, Difficulty difficulty) throws CommandSyntaxException {
MinecraftServer server = source.getServer();
- if (server.getWorldData().getDifficulty() == difficulty) {
+ net.minecraft.server.level.ServerLevel serverLevel = source.getLevel(); // CraftBukkit
+ if (serverLevel.getDifficulty() == difficulty) { // CraftBukkit
throw ERROR_ALREADY_DIFFICULT.create(difficulty.getKey());
} else {
- server.setDifficulty(difficulty, true);
+ server.setDifficulty(serverLevel, difficulty, true); // Paper - per level difficulty; don't skip other difficulty-changing logic (fix upstream's fix)
source.sendSuccess(() -> Component.translatable("commands.difficulty.success", difficulty.getDisplayName()), true);
return 0;
}

View File

@@ -0,0 +1,29 @@
--- a/net/minecraft/server/commands/EffectCommands.java
+++ b/net/minecraft/server/commands/EffectCommands.java
@@ -180,7 +_,7 @@
for (Entity entity : targets) {
if (entity instanceof LivingEntity) {
MobEffectInstance mobEffectInstance = new MobEffectInstance(effect, i1, amplifier, false, showParticles);
- if (((LivingEntity)entity).addEffect(mobEffectInstance, source.getEntity())) {
+ if (((LivingEntity)entity).addEffect(mobEffectInstance, source.getEntity(), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.COMMAND)) { // CraftBukkit
i++;
}
}
@@ -210,7 +_,7 @@
int i = 0;
for (Entity entity : targets) {
- if (entity instanceof LivingEntity && ((LivingEntity)entity).removeAllEffects()) {
+ if (entity instanceof LivingEntity && ((LivingEntity)entity).removeAllEffects(org.bukkit.event.entity.EntityPotionEffectEvent.Cause.COMMAND)) { // CraftBukkit
i++;
}
}
@@ -235,7 +_,7 @@
int i = 0;
for (Entity entity : targets) {
- if (entity instanceof LivingEntity && ((LivingEntity)entity).removeEffect(effect)) {
+ if (entity instanceof LivingEntity && ((LivingEntity)entity).removeEffect(effect, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.COMMAND)) { // CraftBukkit
i++;
}
}

View File

@@ -0,0 +1,18 @@
--- a/net/minecraft/server/commands/GameModeCommand.java
+++ b/net/minecraft/server/commands/GameModeCommand.java
@@ -54,9 +_,14 @@
int i = 0;
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
}
}

View File

@@ -0,0 +1,20 @@
--- a/net/minecraft/server/commands/GameRuleCommand.java
+++ b/net/minecraft/server/commands/GameRuleCommand.java
@@ -30,14 +_,14 @@
static <T extends GameRules.Value<T>> int setRule(CommandContext<CommandSourceStack> source, GameRules.Key<T> gameRule) {
CommandSourceStack commandSourceStack = source.getSource();
- T rule = commandSourceStack.getServer().getGameRules().getRule(gameRule);
- rule.setFromArgument(source, "value");
+ T rule = commandSourceStack.getLevel().getGameRules().getRule(gameRule); // CraftBukkit
+ rule.setFromArgument(source, "value", gameRule); // Paper - Add WorldGameRuleChangeEvent
commandSourceStack.sendSuccess(() -> Component.translatable("commands.gamerule.set", gameRule.getId(), rule.toString()), true);
return rule.getCommandResult();
}
static <T extends GameRules.Value<T>> int queryRule(CommandSourceStack source, GameRules.Key<T> gameRule) {
- T rule = source.getServer().getGameRules().getRule(gameRule);
+ T rule = source.getLevel().getGameRules().getRule(gameRule); // CraftBukkit
source.sendSuccess(() -> Component.translatable("commands.gamerule.query", gameRule.getId(), rule.toString()), false);
return rule.getCommandResult();
}

View File

@@ -0,0 +1,33 @@
--- a/net/minecraft/server/commands/GiveCommand.java
+++ b/net/minecraft/server/commands/GiveCommand.java
@@ -51,6 +_,7 @@
private static int giveItem(CommandSourceStack source, ItemInput item, Collection<ServerPlayer> targets, int count) throws CommandSyntaxException {
ItemStack itemStack = item.createItemStack(1, false);
+ final Component displayName = itemStack.getDisplayName(); // Paper - get display name early
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); // CraftBukkit - SPIGOT-2942: Add boolean to call event
if (itemEntity != null) {
itemEntity.makeFakeItem();
}
@@ -95,11 +_,11 @@
if (targets.size() == 1) {
source.sendSuccess(
- () -> Component.translatable("commands.give.success.single", count, itemStack.getDisplayName(), targets.iterator().next().getDisplayName()),
+ () -> Component.translatable("commands.give.success.single", count, displayName, targets.iterator().next().getDisplayName()), // Paper - use cached display name
true
);
} else {
- source.sendSuccess(() -> Component.translatable("commands.give.success.single", count, itemStack.getDisplayName(), targets.size()), true);
+ source.sendSuccess(() -> Component.translatable("commands.give.success.single", count, displayName, targets.size()), true); // Paper - use cached display name
}
return targets.size();

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/server/commands/KickCommand.java
+++ b/net/minecraft/server/commands/KickCommand.java
@@ -48,7 +_,7 @@
for (ServerPlayer serverPlayer : players) {
if (!source.getServer().isSingleplayerOwner(serverPlayer.getGameProfile())) {
- serverPlayer.connection.disconnect(reason);
+ serverPlayer.connection.disconnect(reason, org.bukkit.event.player.PlayerKickEvent.Cause.KICK_COMMAND); // Paper - kick event cause
source.sendSuccess(() -> Component.translatable("commands.kick.success", serverPlayer.getDisplayName(), reason), true);
i++;
}

View File

@@ -0,0 +1,18 @@
--- a/net/minecraft/server/commands/ListPlayersCommand.java
+++ b/net/minecraft/server/commands/ListPlayersCommand.java
@@ -32,7 +_,14 @@
private static int format(CommandSourceStack source, Function<ServerPlayer, Component> nameExtractor) {
PlayerList playerList = source.getServer().getPlayerList();
- List<ServerPlayer> players = playerList.getPlayers();
+ // CraftBukkit start
+ List<ServerPlayer> playersTemp = playerList.getPlayers();
+ if (source.getBukkitSender() instanceof org.bukkit.entity.Player) {
+ org.bukkit.entity.Player sender = (org.bukkit.entity.Player) source.getBukkitSender();
+ playersTemp = playersTemp.stream().filter((ep) -> sender.canSee(ep.getBukkitEntity())).collect(java.util.stream.Collectors.toList());
+ }
+ final List<ServerPlayer> players = playersTemp;
+ // CraftBukkit end
Component component = ComponentUtils.formatList(players, nameExtractor);
source.sendSuccess(() -> Component.translatable("commands.list.players", players.size(), playerList.getMaxPlayers(), component), false);
return players.size();

View File

@@ -0,0 +1,10 @@
--- a/net/minecraft/server/commands/LootCommand.java
+++ b/net/minecraft/server/commands/LootCommand.java
@@ -395,6 +_,7 @@
private static int dropInWorld(CommandSourceStack source, Vec3 pos, List<ItemStack> items, LootCommand.Callback callback) throws CommandSyntaxException {
ServerLevel level = source.getLevel();
+ items.removeIf(ItemStack::isEmpty); // CraftBukkit - SPIGOT-6959 Remove empty items for avoid throw an error in new EntityItem
items.forEach(itemStack -> {
ItemEntity itemEntity = new ItemEntity(level, pos.x, pos.y, pos.z, itemStack.copy());
itemEntity.setDefaultPickUpDelay();

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/server/commands/OpCommand.java
+++ b/net/minecraft/server/commands/OpCommand.java
@@ -46,7 +_,7 @@
if (!playerList.isOp(gameProfile)) {
playerList.op(gameProfile);
i++;
- source.sendSuccess(() -> Component.translatable("commands.op.success", gameProfiles.iterator().next().getName()), true);
+ source.sendSuccess(() -> Component.translatable("commands.op.success", gameProfile.getName()), true); // Paper - fixes MC-253721
}
}

View File

@@ -0,0 +1,10 @@
--- a/net/minecraft/server/commands/PlaceCommand.java
+++ b/net/minecraft/server/commands/PlaceCommand.java
@@ -280,6 +_,7 @@
if (!structureStart.isValid()) {
throw ERROR_STRUCTURE_FAILED.create();
} else {
+ structureStart.generationEventCause = org.bukkit.event.world.AsyncStructureGenerateEvent.Cause.COMMAND; // CraftBukkit - set AsyncStructureGenerateEvent.Cause.COMMAND as generation cause
BoundingBox boundingBox = structureStart.getBoundingBox();
ChunkPos chunkPos = new ChunkPos(SectionPos.blockToSectionCoord(boundingBox.minX()), SectionPos.blockToSectionCoord(boundingBox.minZ()));
ChunkPos chunkPos1 = new ChunkPos(SectionPos.blockToSectionCoord(boundingBox.maxX()), SectionPos.blockToSectionCoord(boundingBox.maxZ()));

View File

@@ -0,0 +1,28 @@
--- a/net/minecraft/server/commands/ReloadCommand.java
+++ b/net/minecraft/server/commands/ReloadCommand.java
@@ -16,7 +_,7 @@
private static final Logger LOGGER = LogUtils.getLogger();
public static void reloadPacks(Collection<String> selectedIds, CommandSourceStack source) {
- source.getServer().reloadResources(selectedIds).exceptionally(throwable -> {
+ source.getServer().reloadResources(selectedIds, io.papermc.paper.event.server.ServerResourcesReloadedEvent.Cause.COMMAND).exceptionally(throwable -> { // Paper - Add ServerResourcesReloadedEvent
LOGGER.warn("Failed to execute reload", throwable);
source.sendFailure(Component.translatable("commands.reload.failure"));
return null;
@@ -36,6 +_,16 @@
return list;
}
+
+ // CraftBukkit start
+ public static void reload(MinecraftServer minecraftserver) {
+ PackRepository resourcepackrepository = minecraftserver.getPackRepository();
+ WorldData savedata = minecraftserver.getWorldData();
+ Collection<String> collection = resourcepackrepository.getSelectedIds();
+ Collection<String> collection1 = ReloadCommand.discoverNewPacks(resourcepackrepository, savedata, collection);
+ minecraftserver.reloadResources(collection1, io.papermc.paper.event.server.ServerResourcesReloadedEvent.Cause.PLUGIN); // Paper - Add ServerResourcesReloadedEvent
+ }
+ // CraftBukkit end
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
dispatcher.register(Commands.literal("reload").requires(source -> source.hasPermission(2)).executes(context -> {

View File

@@ -0,0 +1,29 @@
--- a/net/minecraft/server/commands/ScheduleCommand.java
+++ b/net/minecraft/server/commands/ScheduleCommand.java
@@ -32,7 +_,7 @@
);
private static final SimpleCommandExceptionType ERROR_MACRO = new SimpleCommandExceptionType(Component.translatableEscape("commands.schedule.macro"));
private static final SuggestionProvider<CommandSourceStack> SUGGEST_SCHEDULE = (context, builder) -> SharedSuggestionProvider.suggest(
- context.getSource().getServer().getWorldData().overworldData().getScheduledEvents().getEventsIds(), builder
+ context.getSource().getLevel().serverLevelData.getScheduledEvents().getEventsIds(), builder // Paper - Make schedule command per-world
);
public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
@@ -101,7 +_,7 @@
} else {
long l = source.getLevel().getGameTime() + time;
ResourceLocation resourceLocation = function.getFirst();
- TimerQueue<MinecraftServer> scheduledEvents = source.getServer().getWorldData().overworldData().getScheduledEvents();
+ TimerQueue<MinecraftServer> scheduledEvents = source.getLevel().serverLevelData.overworldData().getScheduledEvents(); // CraftBukkit - SPIGOT-6667: Use world specific function timer
Optional<CommandFunction<CommandSourceStack>> optional = function.getSecond().left();
if (optional.isPresent()) {
if (optional.get() instanceof MacroFunction) {
@@ -132,7 +_,7 @@
}
private static int remove(CommandSourceStack source, String function) throws CommandSyntaxException {
- int i = source.getServer().getWorldData().overworldData().getScheduledEvents().remove(function);
+ int i = source.getLevel().serverLevelData.overworldData().getScheduledEvents().remove(function); // Paper - Make schedule command per-world
if (i == 0) {
throw ERROR_CANT_REMOVE.create(function);
} else {

View File

@@ -0,0 +1,43 @@
--- a/net/minecraft/server/commands/SetSpawnCommand.java
+++ b/net/minecraft/server/commands/SetSpawnCommand.java
@@ -66,24 +_,34 @@
private static int setSpawn(CommandSourceStack source, Collection<ServerPlayer> targets, BlockPos pos, float angle) {
ResourceKey<Level> resourceKey = source.getLevel().dimension();
+ final Collection<ServerPlayer> actualTargets = new java.util.ArrayList<>(); // Paper - Add PlayerSetSpawnEvent
for (ServerPlayer serverPlayer : targets) {
- serverPlayer.setRespawnPosition(resourceKey, pos, angle, true, false);
- }
+ // Paper start - Add PlayerSetSpawnEvent
+ if (serverPlayer.setRespawnPosition(resourceKey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND)) {
+ actualTargets.add(serverPlayer);
+ }
+ // Paper end - Add PlayerSetSpawnEvent
+ }
+ // Paper start - Add PlayerSetSpawnEvent
+ if (actualTargets.isEmpty()) {
+ return 0;
+ }
+ // Paper end - Add PlayerSetSpawnEvent
String string = resourceKey.location().toString();
- if (targets.size() == 1) {
+ if (actualTargets.size() == 1) { // Paper - Add PlayerSetSpawnEvent
source.sendSuccess(
() -> Component.translatable(
- "commands.spawnpoint.success.single", pos.getX(), pos.getY(), pos.getZ(), angle, string, targets.iterator().next().getDisplayName()
+ "commands.spawnpoint.success.single", pos.getX(), pos.getY(), pos.getZ(), angle, string, actualTargets.iterator().next().getDisplayName() // Paper - Add PlayerSetSpawnEvent
),
true
);
} else {
source.sendSuccess(
- () -> Component.translatable("commands.spawnpoint.success.multiple", pos.getX(), pos.getY(), pos.getZ(), angle, string, targets.size()), true
+ () -> Component.translatable("commands.spawnpoint.success.multiple", pos.getX(), pos.getY(), pos.getZ(), angle, string, actualTargets.size()), true // Paper - Add PlayerSetSpawnEvent
);
}
- return targets.size();
+ return actualTargets.size(); // Paper - Add PlayerSetSpawnEvent
}
}

View File

@@ -0,0 +1,11 @@
--- a/net/minecraft/server/commands/SetWorldSpawnCommand.java
+++ b/net/minecraft/server/commands/SetWorldSpawnCommand.java
@@ -33,7 +_,7 @@
private static int setSpawn(CommandSourceStack source, BlockPos pos, float angle) {
ServerLevel level = source.getLevel();
- if (level.dimension() != Level.OVERWORLD) {
+ if (false && level.dimension() != Level.OVERWORLD) { // CraftBukkit - SPIGOT-7649: allow in all worlds
source.sendFailure(Component.translatable("commands.setworldspawn.failure.not_overworld"));
return 0;
} else {

View File

@@ -0,0 +1,10 @@
--- a/net/minecraft/server/commands/SpreadPlayersCommand.java
+++ b/net/minecraft/server/commands/SpreadPlayersCommand.java
@@ -255,6 +_,7 @@
entity.getYRot(),
entity.getXRot(),
true
+ , org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND // CraftBukkit - handle teleport reason
);
double d1 = Double.MAX_VALUE;

View File

@@ -0,0 +1,19 @@
--- a/net/minecraft/server/commands/SummonCommand.java
+++ b/net/minecraft/server/commands/SummonCommand.java
@@ -82,6 +_,7 @@
ServerLevel level = source.getLevel();
Entity entity = EntityType.loadEntityRecursive(compoundTag, level, EntitySpawnReason.COMMAND, entity1 -> {
entity1.moveTo(pos.x, pos.y, pos.z, entity1.getYRot(), entity1.getXRot());
+ entity1.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.COMMAND; // Paper - Entity#getEntitySpawnReason
return entity1;
});
if (entity == null) {
@@ -92,7 +_,7 @@
.finalizeSpawn(source.getLevel(), source.getLevel().getCurrentDifficultyAt(entity.blockPosition()), EntitySpawnReason.COMMAND, null);
}
- if (!level.tryAddFreshEntityWithPassengers(entity)) {
+ if (!level.tryAddFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.COMMAND)) { // CraftBukkit - pass a spawn reason of "COMMAND"
throw ERROR_DUPLICATE_UUID.create();
} else {
return entity;

View File

@@ -0,0 +1,43 @@
--- a/net/minecraft/server/commands/TeleportCommand.java
+++ b/net/minecraft/server/commands/TeleportCommand.java
@@ -20,6 +_,7 @@
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
@@ -290,7 +_,31 @@
float f1 = relatives.contains(Relative.X_ROT) ? xRot - target.getXRot() : xRot;
float f2 = Mth.wrapDegrees(f);
float f3 = Mth.wrapDegrees(f1);
- if (target.teleportTo(level, d, d1, d2, relatives, f2, f3, true)) {
+ // CraftBukkit start - Teleport event
+ boolean result;
+ if (target instanceof ServerPlayer player) {
+ result = player.teleportTo(level, d, d1, d2, relatives, f2, f3, true, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND);
+ } else {
+ org.bukkit.Location to = new org.bukkit.Location(level.getWorld(), d, d1, d2, f2, f3);
+ org.bukkit.event.entity.EntityTeleportEvent event = new org.bukkit.event.entity.EntityTeleportEvent(target.getBukkitEntity(), target.getBukkitEntity().getLocation(), to);
+ level.getCraftServer().getPluginManager().callEvent(event);
+ if (event.isCancelled() || event.getTo() == null) { // Paper
+ return;
+ }
+ to = event.getTo(); // Paper - actually track new location
+
+ d = to.getX();
+ d1 = to.getY();
+ d2 = to.getZ();
+ f2 = to.getYaw();
+ f3 = to.getPitch();
+ level = ((org.bukkit.craftbukkit.CraftWorld) to.getWorld()).getHandle();
+
+ result = target.teleportTo(level, d, d1, d2, relatives, f2, f3, true);
+ }
+
+ if (result) {
+ // CraftBukkit end
if (lookAt != null) {
lookAt.perform(source, target);
}

View File

@@ -0,0 +1,37 @@
--- a/net/minecraft/server/commands/TimeCommand.java
+++ b/net/minecraft/server/commands/TimeCommand.java
@@ -56,8 +_,15 @@
}
public static int setTime(CommandSourceStack source, int time) {
- for (ServerLevel serverLevel : source.getServer().getAllLevels()) {
- serverLevel.setDayTime(time);
+ for (ServerLevel serverLevel : io.papermc.paper.configuration.GlobalConfiguration.get().commands.timeCommandAffectsAllWorlds ? source.getServer().getAllLevels() : java.util.List.of(source.getLevel())) { // CraftBukkit - SPIGOT-6496: Only set the time for the world the command originates in // Paper - add config option for spigot's change
+ // serverLevel.setDayTime(time);
+ // CraftBukkit start
+ org.bukkit.event.world.TimeSkipEvent event = new org.bukkit.event.world.TimeSkipEvent(serverLevel.getWorld(), org.bukkit.event.world.TimeSkipEvent.SkipReason.COMMAND, time - serverLevel.getDayTime());
+ org.bukkit.Bukkit.getPluginManager().callEvent(event);
+ if (!event.isCancelled()) {
+ serverLevel.setDayTime(serverLevel.getDayTime() + event.getSkipAmount());
+ }
+ // CraftBukkit end
}
source.getServer().forceTimeSynchronization();
@@ -66,8 +_,14 @@
}
public static int addTime(CommandSourceStack source, int amount) {
- for (ServerLevel serverLevel : source.getServer().getAllLevels()) {
- serverLevel.setDayTime(serverLevel.getDayTime() + amount);
+ for (ServerLevel serverLevel : io.papermc.paper.configuration.GlobalConfiguration.get().commands.timeCommandAffectsAllWorlds ? source.getServer().getAllLevels() : java.util.List.of(source.getLevel())) { // CraftBukkit - SPIGOT-6496: Only set the time for the world the command originates in // Paper - add config option for spigot's change
+ // CraftBukkit start
+ org.bukkit.event.world.TimeSkipEvent event = new org.bukkit.event.world.TimeSkipEvent(serverLevel.getWorld(), org.bukkit.event.world.TimeSkipEvent.SkipReason.COMMAND, amount);
+ org.bukkit.Bukkit.getPluginManager().callEvent(event);
+ if (!event.isCancelled()) {
+ serverLevel.setDayTime(serverLevel.getDayTime() + event.getSkipAmount());
+ }
+ // CraftBukkit end
}
source.getServer().forceTimeSynchronization();

View File

@@ -0,0 +1,30 @@
--- a/net/minecraft/server/commands/WeatherCommand.java
+++ b/net/minecraft/server/commands/WeatherCommand.java
@@ -44,23 +_,23 @@
}
private static int getDuration(CommandSourceStack source, int time, IntProvider timeProvider) {
- return time == -1 ? timeProvider.sample(source.getServer().overworld().getRandom()) : time;
+ return time == -1 ? timeProvider.sample(source.getLevel().getRandom()) : time; // CraftBukkit - SPIGOT-7680: per-world
}
private static int setClear(CommandSourceStack source, int time) {
- source.getServer().overworld().setWeatherParameters(getDuration(source, time, ServerLevel.RAIN_DELAY), 0, false, false);
+ source.getLevel().setWeatherParameters(getDuration(source, time, ServerLevel.RAIN_DELAY), 0, false, false); // CraftBukkit - SPIGOT-7680: per-world
source.sendSuccess(() -> Component.translatable("commands.weather.set.clear"), true);
return time;
}
private static int setRain(CommandSourceStack source, int time) {
- source.getServer().overworld().setWeatherParameters(0, getDuration(source, time, ServerLevel.RAIN_DURATION), true, false);
+ source.getLevel().setWeatherParameters(0, getDuration(source, time, ServerLevel.RAIN_DURATION), true, false); // CraftBukkit - SPIGOT-7680: per-world
source.sendSuccess(() -> Component.translatable("commands.weather.set.rain"), true);
return time;
}
private static int setThunder(CommandSourceStack source, int time) {
- source.getServer().overworld().setWeatherParameters(0, getDuration(source, time, ServerLevel.THUNDER_DURATION), true, true);
+ source.getLevel().setWeatherParameters(0, getDuration(source, time, ServerLevel.THUNDER_DURATION), true, true); // CraftBukkit - SPIGOT-7680: per-world
source.sendSuccess(() -> Component.translatable("commands.weather.set.thunder"), true);
return time;
}

View File

@@ -0,0 +1,63 @@
--- a/net/minecraft/server/commands/WorldBorderCommand.java
+++ b/net/minecraft/server/commands/WorldBorderCommand.java
@@ -135,7 +_,7 @@
}
private static int setDamageBuffer(CommandSourceStack source, float distance) throws CommandSyntaxException {
- WorldBorder worldBorder = source.getServer().overworld().getWorldBorder();
+ WorldBorder worldBorder = source.getLevel().getWorldBorder(); // CraftBukkit
if (worldBorder.getDamageSafeZone() == distance) {
throw ERROR_SAME_DAMAGE_BUFFER.create();
} else {
@@ -146,7 +_,7 @@
}
private static int setDamageAmount(CommandSourceStack source, float damagePerBlock) throws CommandSyntaxException {
- WorldBorder worldBorder = source.getServer().overworld().getWorldBorder();
+ WorldBorder worldBorder = source.getLevel().getWorldBorder(); // CraftBukkit
if (worldBorder.getDamagePerBlock() == damagePerBlock) {
throw ERROR_SAME_DAMAGE_AMOUNT.create();
} else {
@@ -159,7 +_,7 @@
}
private static int setWarningTime(CommandSourceStack source, int time) throws CommandSyntaxException {
- WorldBorder worldBorder = source.getServer().overworld().getWorldBorder();
+ WorldBorder worldBorder = source.getLevel().getWorldBorder(); // CraftBukkit
if (worldBorder.getWarningTime() == time) {
throw ERROR_SAME_WARNING_TIME.create();
} else {
@@ -170,7 +_,7 @@
}
private static int setWarningDistance(CommandSourceStack source, int distance) throws CommandSyntaxException {
- WorldBorder worldBorder = source.getServer().overworld().getWorldBorder();
+ WorldBorder worldBorder = source.getLevel().getWorldBorder(); // CraftBukkit
if (worldBorder.getWarningBlocks() == distance) {
throw ERROR_SAME_WARNING_DISTANCE.create();
} else {
@@ -181,13 +_,13 @@
}
private static int getSize(CommandSourceStack source) {
- double size = source.getServer().overworld().getWorldBorder().getSize();
+ double size = source.getLevel().getWorldBorder().getSize(); // CraftBukkit
source.sendSuccess(() -> Component.translatable("commands.worldborder.get", String.format(Locale.ROOT, "%.0f", size)), false);
return Mth.floor(size + 0.5);
}
private static int setCenter(CommandSourceStack source, Vec2 pos) throws CommandSyntaxException {
- WorldBorder worldBorder = source.getServer().overworld().getWorldBorder();
+ WorldBorder worldBorder = source.getLevel().getWorldBorder(); // CraftBukkit
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 @@
}
private static int setSize(CommandSourceStack source, double newSize, long time) throws CommandSyntaxException {
- WorldBorder worldBorder = source.getServer().overworld().getWorldBorder();
+ WorldBorder worldBorder = source.getLevel().getWorldBorder(); // CraftBukkit
double size = worldBorder.getSize();
if (size == newSize) {
throw ERROR_SAME_SIZE.create();