mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-19 01:17:42 +01:00
all patches applied \o/
This commit is contained in:
@@ -1,115 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Kerllenevich <ben@omega24.dev>
|
||||
Date: Sat, 25 Jun 2022 00:18:33 -0400
|
||||
Subject: [PATCH] Skeletons eat wither roses
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
|
||||
index 2064d6177b3e43810d5962102fe914296e2627ff..30ff77f5f137614b5d0d2df6dc90f47c97e8ab13 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
|
||||
@@ -14,6 +14,16 @@ import net.minecraft.world.item.Items;
|
||||
import net.minecraft.world.level.ItemLike;
|
||||
import net.minecraft.world.level.Level;
|
||||
|
||||
+// Purpur start
|
||||
+import net.minecraft.world.item.ItemStack;
|
||||
+import net.minecraft.world.level.block.Blocks;
|
||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
|
||||
+import net.minecraft.world.InteractionHand;
|
||||
+import net.minecraft.world.InteractionResult;
|
||||
+import net.minecraft.server.level.ServerLevel;
|
||||
+import net.minecraft.core.particles.ParticleTypes;
|
||||
+// Purpur end
|
||||
+
|
||||
public class Skeleton extends AbstractSkeleton {
|
||||
|
||||
private static final int TOTAL_CONVERSION_TIME = 300;
|
||||
@@ -174,4 +184,67 @@ public class Skeleton extends AbstractSkeleton {
|
||||
}
|
||||
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ private int witherRosesFed = 0;
|
||||
+
|
||||
+ @Override
|
||||
+ public InteractionResult mobInteract(Player player, InteractionHand hand) {
|
||||
+ ItemStack stack = player.getItemInHand(hand);
|
||||
+
|
||||
+ if (level().purpurConfig.skeletonFeedWitherRoses > 0 && this.getType() != EntityType.WITHER_SKELETON && stack.getItem() == Blocks.WITHER_ROSE.asItem()) {
|
||||
+ return this.feedWitherRose(player, stack);
|
||||
+ }
|
||||
+
|
||||
+ return super.mobInteract(player, hand);
|
||||
+ }
|
||||
+
|
||||
+ private InteractionResult feedWitherRose(Player player, ItemStack stack) {
|
||||
+ if (++witherRosesFed < level().purpurConfig.skeletonFeedWitherRoses) {
|
||||
+ if (!player.getAbilities().instabuild) {
|
||||
+ stack.shrink(1);
|
||||
+ }
|
||||
+ return InteractionResult.CONSUME;
|
||||
+ }
|
||||
+
|
||||
+ WitherSkeleton skeleton = EntityType.WITHER_SKELETON.create(level());
|
||||
+ if (skeleton == null) {
|
||||
+ return InteractionResult.PASS;
|
||||
+ }
|
||||
+
|
||||
+ skeleton.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
|
||||
+ skeleton.setHealth(this.getHealth());
|
||||
+ skeleton.setAggressive(this.isAggressive());
|
||||
+ skeleton.copyPosition(this);
|
||||
+ skeleton.setYBodyRot(this.yBodyRot);
|
||||
+ skeleton.setYHeadRot(this.getYHeadRot());
|
||||
+ skeleton.yRotO = this.yRotO;
|
||||
+ skeleton.xRotO = this.xRotO;
|
||||
+
|
||||
+ if (this.hasCustomName()) {
|
||||
+ skeleton.setCustomName(this.getCustomName());
|
||||
+ }
|
||||
+
|
||||
+ if (CraftEventFactory.callEntityTransformEvent(this, skeleton, org.bukkit.event.entity.EntityTransformEvent.TransformReason.INFECTION).isCancelled()) {
|
||||
+ return InteractionResult.PASS;
|
||||
+ }
|
||||
+
|
||||
+ if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), skeleton.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.INFECTED).callEvent()) {
|
||||
+ return InteractionResult.PASS;
|
||||
+ }
|
||||
+
|
||||
+ this.level().addFreshEntity(skeleton);
|
||||
+ this.remove(RemovalReason.DISCARDED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
|
||||
+ if (!player.getAbilities().instabuild) {
|
||||
+ stack.shrink(1);
|
||||
+ }
|
||||
+
|
||||
+ for (int i = 0; i < 15; ++i) {
|
||||
+ ((ServerLevel) level()).sendParticles(((ServerLevel) level()).players(), null, ParticleTypes.HAPPY_VILLAGER,
|
||||
+ getX() + random.nextFloat(), getY() + (random.nextFloat() * 2), getZ() + random.nextFloat(), 1,
|
||||
+ random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, 0, true);
|
||||
+ }
|
||||
+ return InteractionResult.SUCCESS;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index ba8d194d1a6ecab995b31d04687f269389811754..e77c777096229ff1ad14fe58c531e2bf1ed7bf3b 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -2482,6 +2482,7 @@ public class PurpurWorldConfig {
|
||||
public boolean skeletonTakeDamageFromWater = false;
|
||||
public boolean skeletonAlwaysDropExp = false;
|
||||
public double skeletonHeadVisibilityPercent = 0.5D;
|
||||
+ public int skeletonFeedWitherRoses = 0;
|
||||
private void skeletonSettings() {
|
||||
skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable);
|
||||
skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater);
|
||||
@@ -2495,6 +2496,7 @@ public class PurpurWorldConfig {
|
||||
skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater);
|
||||
skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp);
|
||||
skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent);
|
||||
+ skeletonFeedWitherRoses = getInt("mobs.skeleton.feed-wither-roses", skeletonFeedWitherRoses);
|
||||
}
|
||||
|
||||
public boolean skeletonHorseRidable = false;
|
||||
@@ -1,163 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Kerllenevich <ben@omega24.dev>
|
||||
Date: Sat, 25 Jun 2022 08:04:06 -0400
|
||||
Subject: [PATCH] Enchantment Table Persists Lapis
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
|
||||
index e6935b6632c7a7e07f4da459c95f564356242f98..1a686780e5aadcbdcfceb770ce8e283b38115209 100644
|
||||
--- a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
|
||||
+++ b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
|
||||
@@ -40,6 +40,12 @@ import org.bukkit.event.enchantment.PrepareItemEnchantEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
// CraftBukkit end
|
||||
|
||||
+// Purpur start
|
||||
+import net.minecraft.world.level.block.entity.BlockEntity;
|
||||
+import net.minecraft.world.level.block.entity.EnchantmentTableBlockEntity;
|
||||
+import org.bukkit.craftbukkit.entity.CraftHumanEntity;
|
||||
+// Purpur end
|
||||
+
|
||||
public class EnchantmentMenu extends AbstractContainerMenu {
|
||||
|
||||
static final ResourceLocation EMPTY_SLOT_LAPIS_LAZULI = new ResourceLocation("item/empty_slot_lapis_lazuli");
|
||||
@@ -74,6 +80,22 @@ public class EnchantmentMenu extends AbstractContainerMenu {
|
||||
return context.getLocation();
|
||||
}
|
||||
// CraftBukkit end
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public void onClose(CraftHumanEntity who) {
|
||||
+ super.onClose(who);
|
||||
+
|
||||
+ if (who.getHandle().level().purpurConfig.enchantmentTableLapisPersists) {
|
||||
+ access.execute((level, pos) -> {
|
||||
+ BlockEntity blockEntity = level.getBlockEntity(pos);
|
||||
+ if (blockEntity instanceof EnchantmentTableBlockEntity enchantmentTable) {
|
||||
+ enchantmentTable.setLapis(this.getItem(1).getCount());
|
||||
+ }
|
||||
+ });
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end
|
||||
};
|
||||
this.random = RandomSource.create();
|
||||
this.enchantmentSeed = DataSlot.standalone();
|
||||
@@ -99,6 +121,17 @@ public class EnchantmentMenu extends AbstractContainerMenu {
|
||||
}
|
||||
});
|
||||
|
||||
+ // Purpur start
|
||||
+ access.execute((level, pos) -> {
|
||||
+ if (level.purpurConfig.enchantmentTableLapisPersists) {
|
||||
+ BlockEntity blockEntity = level.getBlockEntity(pos);
|
||||
+ if (blockEntity instanceof EnchantmentTableBlockEntity enchantmentTable) {
|
||||
+ this.getSlot(1).set(new ItemStack(Items.LAPIS_LAZULI, enchantmentTable.getLapis()));
|
||||
+ }
|
||||
+ }
|
||||
+ });
|
||||
+ // Purpur end
|
||||
+
|
||||
int j;
|
||||
|
||||
for (j = 0; j < 3; ++j) {
|
||||
@@ -351,6 +384,7 @@ public class EnchantmentMenu extends AbstractContainerMenu {
|
||||
public void removed(net.minecraft.world.entity.player.Player player) {
|
||||
super.removed(player);
|
||||
this.access.execute((world, blockposition) -> {
|
||||
+ if (world.purpurConfig.enchantmentTableLapisPersists) this.getSlot(1).set(ItemStack.EMPTY); // Purpur
|
||||
this.clearContainer(player, this.enchantSlots);
|
||||
});
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java b/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java
|
||||
index af3a8d5f4d80b22d67092bb0c2af5da31b2e3bce..7d5233a96dfa9fca2255e8e44b02179313087ef6 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/EnchantmentTableBlock.java
|
||||
@@ -30,6 +30,8 @@ import net.minecraft.world.level.pathfinder.PathComputationType;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
+import net.minecraft.world.Containers; // Purpur
|
||||
+import net.minecraft.world.item.Items; // Purpur
|
||||
|
||||
public class EnchantmentTableBlock extends BaseEntityBlock {
|
||||
public static final MapCodec<EnchantmentTableBlock> CODEC = simpleCodec(EnchantmentTableBlock::new);
|
||||
@@ -137,4 +139,18 @@ public class EnchantmentTableBlock extends BaseEntityBlock {
|
||||
public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) {
|
||||
return false;
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean moved) {
|
||||
+ BlockEntity blockEntity = level.getBlockEntity(pos);
|
||||
+
|
||||
+ if (level.purpurConfig.enchantmentTableLapisPersists && blockEntity instanceof EnchantmentTableBlockEntity enchantmentTable) {
|
||||
+ Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), new ItemStack(Items.LAPIS_LAZULI, enchantmentTable.getLapis()));
|
||||
+ level.updateNeighbourForOutputSignal(pos, this);
|
||||
+ }
|
||||
+
|
||||
+ super.onRemove(state, level, pos, newState, moved);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java
|
||||
index a912a1ccd3816a9c398946a8724bd3c882f4e9c3..af936b9a2daff9974c2f6ca3c8f5541db94cb40d 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/EnchantmentTableBlockEntity.java
|
||||
@@ -24,6 +24,7 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable
|
||||
public float tRot;
|
||||
private static final RandomSource RANDOM = RandomSource.create();
|
||||
private Component name;
|
||||
+ private int lapis = 0; // Purpur
|
||||
|
||||
public EnchantmentTableBlockEntity(BlockPos pos, BlockState state) {
|
||||
super(BlockEntityType.ENCHANTING_TABLE, pos, state);
|
||||
@@ -35,6 +36,7 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable
|
||||
if (this.hasCustomName()) {
|
||||
nbt.putString("CustomName", Component.Serializer.toJson(this.name));
|
||||
}
|
||||
+ nbt.putInt("Purpur.Lapis", this.lapis); // Purpur
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -43,6 +45,7 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable
|
||||
if (nbt.contains("CustomName", 8)) {
|
||||
this.name = io.papermc.paper.util.MCUtil.getBaseComponentFromNbt("CustomName", nbt); // Paper - Catch ParseException
|
||||
}
|
||||
+ this.lapis = nbt.getInt("Purpur.Lapis"); // Purpur
|
||||
}
|
||||
|
||||
public static void bookAnimationTick(Level world, BlockPos pos, BlockState state, EnchantmentTableBlockEntity blockEntity) {
|
||||
@@ -117,4 +120,14 @@ public class EnchantmentTableBlockEntity extends BlockEntity implements Nameable
|
||||
public Component getCustomName() {
|
||||
return this.name;
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ public int getLapis() {
|
||||
+ return this.lapis;
|
||||
+ }
|
||||
+
|
||||
+ public void setLapis(int lapis) {
|
||||
+ this.lapis = lapis;
|
||||
+ }
|
||||
+ // Purpur
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index e77c777096229ff1ad14fe58c531e2bf1ed7bf3b..7f159bc172cf9414cf34e8141d841764b80b204d 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -1519,6 +1519,11 @@ public class PurpurWorldConfig {
|
||||
elderGuardianAlwaysDropExp = getBoolean("mobs.elder_guardian.always-drop-exp", elderGuardianAlwaysDropExp);
|
||||
}
|
||||
|
||||
+ public boolean enchantmentTableLapisPersists = false;
|
||||
+ private void enchantmentTableSettings() {
|
||||
+ enchantmentTableLapisPersists = getBoolean("blocks.enchantment-table.lapis-persists", enchantmentTableLapisPersists);
|
||||
+ }
|
||||
+
|
||||
public boolean enderDragonRidable = false;
|
||||
public boolean enderDragonRidableInWater = true;
|
||||
public boolean enderDragonControllable = true;
|
||||
@@ -1,140 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Kerllenevich <ben@omega24.dev>
|
||||
Date: Sat, 25 Jun 2022 19:40:36 -0400
|
||||
Subject: [PATCH] Spark Profiler
|
||||
|
||||
Co-authored-by: granny <granny@purpurmc.org>
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java
|
||||
index 708e5bb9bbf0476fcc2c4b92c6830b094703b43e..6141f716b15ad47ac2ac4c9ce92a3897b3ad8807 100644
|
||||
--- a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java
|
||||
+++ b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java
|
||||
@@ -104,6 +104,7 @@ public class PluginInitializerManager {
|
||||
@SuppressWarnings("unchecked")
|
||||
java.util.List<Path> files = ((java.util.List<File>) optionSet.valuesOf("add-plugin")).stream().map(File::toPath).toList();
|
||||
io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.PluginFlagProviderSource.INSTANCE, files);
|
||||
+ io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.SparkProviderSource.INSTANCE, new File("cache", "spark.jar").toPath()); // Purpur
|
||||
}
|
||||
|
||||
// This will be the end of me...
|
||||
diff --git a/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java b/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..cb78dac8e072b5cb3c6e52e17c9ecdf708aeedc1
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java
|
||||
@@ -0,0 +1,115 @@
|
||||
+package io.papermc.paper.plugin.provider.source;
|
||||
+
|
||||
+import com.mojang.logging.LogUtils;
|
||||
+import io.papermc.paper.plugin.entrypoint.Entrypoint;
|
||||
+import io.papermc.paper.plugin.entrypoint.EntrypointHandler;
|
||||
+import io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler;
|
||||
+import io.papermc.paper.plugin.provider.PluginProvider;
|
||||
+import java.io.BufferedReader;
|
||||
+import java.io.File;
|
||||
+import java.io.InputStreamReader;
|
||||
+import java.math.BigInteger;
|
||||
+import java.net.URL;
|
||||
+import java.net.URLConnection;
|
||||
+import java.nio.file.Files;
|
||||
+import java.nio.file.Path;
|
||||
+import java.nio.file.StandardCopyOption;
|
||||
+import java.security.MessageDigest;
|
||||
+import java.util.stream.Collectors;
|
||||
+import org.bukkit.plugin.java.JavaPlugin;
|
||||
+import org.slf4j.Logger;
|
||||
+
|
||||
+public class SparkProviderSource implements ProviderSource<Path, Path> {
|
||||
+
|
||||
+ public static final SparkProviderSource INSTANCE = new SparkProviderSource();
|
||||
+ private static final FileProviderSource FILE_PROVIDER_SOURCE = new FileProviderSource("File '%s' specified by Purpur"::formatted);
|
||||
+ private static final Logger LOGGER = LogUtils.getClassLogger();
|
||||
+
|
||||
+ @Override
|
||||
+ public Path prepareContext(Path context) {
|
||||
+ // first, check if user doesn't want spark at all
|
||||
+ if (Boolean.getBoolean("Purpur.IReallyDontWantSpark")) {
|
||||
+ return null; // boo!
|
||||
+ }
|
||||
+
|
||||
+ // second, check if user has their own spark
|
||||
+ if (hasSpark()) {
|
||||
+ LOGGER.info("Purpur: Using user-provided spark plugin instead of our own.");
|
||||
+ return null; // let's hope it's at least the modern version :3
|
||||
+ }
|
||||
+
|
||||
+ // you can't have errors in your code if you wrap the entire codebase in a try/catch block
|
||||
+ try {
|
||||
+
|
||||
+ // make sure the directory exists where we want to keep spark
|
||||
+ File file = context.toFile();
|
||||
+ file.getParentFile().mkdirs();
|
||||
+
|
||||
+ boolean shouldDownload;
|
||||
+
|
||||
+ // check if our spark exists
|
||||
+ if (!file.exists()) {
|
||||
+ // it does not, so let's download it
|
||||
+ shouldDownload = true;
|
||||
+ } else {
|
||||
+ // we have a spark file, let's see if it's up-to-date by comparing shas
|
||||
+ String fileSha1 = String.format("%040x", new BigInteger(1, MessageDigest.getInstance("SHA-1").digest(Files.readAllBytes(file.toPath()))));
|
||||
+ String sparkSha1;
|
||||
+
|
||||
+ // luck has a nifty endpoint containing the sha of the newest version
|
||||
+ URLConnection urlConnection = new URL("https://sparkapi.lucko.me/download/bukkit/sha1").openConnection();
|
||||
+
|
||||
+ // set a reasonable timeout to prevent servers without internet from hanging for 60+ seconds on startup
|
||||
+ urlConnection.setReadTimeout(5000);
|
||||
+ urlConnection.setConnectTimeout(5000);
|
||||
+
|
||||
+ // read it
|
||||
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()))) {
|
||||
+ sparkSha1 = reader.lines().collect(Collectors.joining(""));
|
||||
+ }
|
||||
+
|
||||
+ // compare; we only download a new spark if the shas don't match
|
||||
+ shouldDownload = !fileSha1.equals(sparkSha1);
|
||||
+ }
|
||||
+
|
||||
+ // ok, finally we can download spark if we need it
|
||||
+ if (shouldDownload) {
|
||||
+ URLConnection urlConnection = new URL("https://sparkapi.lucko.me/download/bukkit").openConnection();
|
||||
+ urlConnection.setReadTimeout(5000);
|
||||
+ urlConnection.setConnectTimeout(5000);
|
||||
+ Files.copy(urlConnection.getInputStream(), file.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
+ }
|
||||
+
|
||||
+ // register the spark, newly downloaded or existing
|
||||
+ return FILE_PROVIDER_SOURCE.prepareContext(context);
|
||||
+
|
||||
+ } catch (Throwable e) {
|
||||
+ LOGGER.error("Purpur: Failed to download and install spark plugin", e);
|
||||
+ }
|
||||
+ return null;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void registerProviders(final EntrypointHandler entrypointHandler, final Path context) {
|
||||
+ if (context == null) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ try {
|
||||
+ FILE_PROVIDER_SOURCE.registerProviders(entrypointHandler, context);
|
||||
+ } catch (IllegalArgumentException ignored) {
|
||||
+ // Ignore illegal argument exceptions from jar checking
|
||||
+ } catch (Exception e) {
|
||||
+ LOGGER.error("Error loading our spark plugin: " + e.getMessage(), e);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ private static boolean hasSpark() {
|
||||
+ for (PluginProvider<JavaPlugin> provider : LaunchEntryPointHandler.INSTANCE.get(Entrypoint.PLUGIN).getRegisteredProviders()) {
|
||||
+ if (provider.getMeta().getName().equalsIgnoreCase("spark")) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+ return false;
|
||||
+ }
|
||||
+}
|
||||
@@ -1,35 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Sun, 3 Jul 2022 04:13:57 -0500
|
||||
Subject: [PATCH] Option to disable kick for out of order chat
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
index 1cefa3b6bdd62ae7bf30da872012fc150905f5ae..db42bf7c5604f32b9b06accb4bbc004ed264a3c2 100644
|
||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
@@ -1716,7 +1716,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||
|
||||
do {
|
||||
if (!iterator.hasNext()) {
|
||||
- return false;
|
||||
+ return !org.purpurmc.purpur.PurpurConfig.kickForOutOfOrderChat; // Purpur
|
||||
}
|
||||
|
||||
voxelshape1 = (VoxelShape) iterator.next();
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index 9bc5cc4944dcd3918b2a90bde9dd8fdd795ae3b2..b55a4366f69a1f259d5d7aed01764aec14a1dbb2 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -461,9 +461,11 @@ public class PurpurConfig {
|
||||
|
||||
public static boolean useUPnP = false;
|
||||
public static boolean maxJoinsPerSecond = false;
|
||||
+ public static boolean kickForOutOfOrderChat = true;
|
||||
private static void networkSettings() {
|
||||
useUPnP = getBoolean("settings.network.upnp-port-forwarding", useUPnP);
|
||||
maxJoinsPerSecond = getBoolean("settings.network.max-joins-per-second", maxJoinsPerSecond);
|
||||
+ kickForOutOfOrderChat = getBoolean("settings.network.kick-for-out-of-order-chat", kickForOutOfOrderChat);
|
||||
}
|
||||
|
||||
public static java.util.regex.Pattern usernameValidCharactersPattern;
|
||||
@@ -1,35 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Encode42 <me@encode42.dev>
|
||||
Date: Mon, 4 Jul 2022 13:32:51 -0400
|
||||
Subject: [PATCH] Config for sculk shrieker can_summon state
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java b/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java
|
||||
index 09c61eb5ba129e9630a756b452ef6aa61745c533..837c8399b2f490d98ca556e66018bfd471cf05bf 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/SculkShriekerBlock.java
|
||||
@@ -137,7 +137,7 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo
|
||||
@Nullable
|
||||
@Override
|
||||
public BlockState getStateForPlacement(BlockPlaceContext ctx) {
|
||||
- return (BlockState) this.defaultBlockState().setValue(SculkShriekerBlock.WATERLOGGED, ctx.getLevel().getFluidState(ctx.getClickedPos()).getType() == Fluids.WATER);
|
||||
+ return (BlockState) this.defaultBlockState().setValue(SculkShriekerBlock.WATERLOGGED, ctx.getLevel().getFluidState(ctx.getClickedPos()).getType() == Fluids.WATER).setValue(SculkShriekerBlock.CAN_SUMMON, ctx.getLevel().purpurConfig.sculkShriekerCanSummonDefault); // Purpur
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 7f159bc172cf9414cf34e8141d841764b80b204d..4ba10f93d1e9eabb9c737efc0be93f2f555fb546 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -1057,6 +1057,11 @@ public class PurpurWorldConfig {
|
||||
}
|
||||
}
|
||||
|
||||
+ public boolean sculkShriekerCanSummonDefault = false;
|
||||
+ private void sculkShriekerSettings() {
|
||||
+ sculkShriekerCanSummonDefault = getBoolean("blocks.sculk_shrieker.can-summon-default", sculkShriekerCanSummonDefault);
|
||||
+ }
|
||||
+
|
||||
public boolean signAllowColors = false;
|
||||
private void signSettings() {
|
||||
signAllowColors = getBoolean("blocks.sign.allow-colors", signAllowColors);
|
||||
@@ -1,46 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Encode42 <me@encode42.dev>
|
||||
Date: Mon, 4 Jul 2022 13:57:06 -0400
|
||||
Subject: [PATCH] Config to not let coral die
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java b/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java
|
||||
index ffcb4849d83e0f02adbb106f4543bb4898678267..700108e84cf3836a0542c5e04856a9fe254794e9 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java
|
||||
@@ -38,6 +38,7 @@ public abstract class BaseCoralPlantTypeBlock extends Block implements SimpleWat
|
||||
}
|
||||
|
||||
protected static boolean scanForWater(BlockState state, BlockGetter world, BlockPos pos) {
|
||||
+ if (!((net.minecraft.world.level.LevelAccessor) world).getMinecraftWorld().purpurConfig.coralDieOutsideWater) return true; // Purpur
|
||||
if (state.getValue(WATERLOGGED)) {
|
||||
return true;
|
||||
} else {
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/CoralBlock.java b/src/main/java/net/minecraft/world/level/block/CoralBlock.java
|
||||
index 8fd8285e07de4a0457da507501e49a807542f3b1..e580c5a141bebdc45893b5abde01e633c864fc13 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/CoralBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/CoralBlock.java
|
||||
@@ -59,6 +59,7 @@ public class CoralBlock extends Block {
|
||||
}
|
||||
|
||||
protected boolean scanForWater(BlockGetter world, BlockPos pos) {
|
||||
+ if (!((net.minecraft.world.level.LevelAccessor) world).getMinecraftWorld().purpurConfig.coralDieOutsideWater) return true; // Purpur
|
||||
Direction[] aenumdirection = Direction.values();
|
||||
int i = aenumdirection.length;
|
||||
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 4ba10f93d1e9eabb9c737efc0be93f2f555fb546..6e30be26888422187c145c5e7c81d24804119b90 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -904,6 +904,11 @@ public class PurpurWorldConfig {
|
||||
composterBulkProcess = getBoolean("blocks.composter.sneak-to-bulk-process", composterBulkProcess);
|
||||
}
|
||||
|
||||
+ public boolean coralDieOutsideWater = true;
|
||||
+ private void coralSettings() {
|
||||
+ coralDieOutsideWater = getBoolean("blocks.coral.die-outside-water", coralDieOutsideWater);
|
||||
+ }
|
||||
+
|
||||
public boolean dispenserApplyCursedArmor = true;
|
||||
public boolean dispenserPlaceAnvils = false;
|
||||
private void dispenserSettings() {
|
||||
@@ -1,23 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Sat, 9 Jul 2022 00:57:32 -0500
|
||||
Subject: [PATCH] Add local difficulty api
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
index 00357d78182b3ff87e3d9a45705b072af56739c8..06abe25b335606b42ac2a7b5551f0c9e7143a474 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
@@ -2416,6 +2416,12 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
||||
return (this.getHandle().getDragonFight() == null) ? null : new CraftDragonBattle(this.getHandle().getDragonFight());
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ public float getLocalDifficultyAt(Location location) {
|
||||
+ return getHandle().getCurrentDifficultyAt(io.papermc.paper.util.MCUtil.toBlockPosition(location)).getEffectiveDifficulty();
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
public Collection<GeneratedStructure> getStructures(int x, int z) {
|
||||
return this.getStructures(x, z, struct -> true);
|
||||
@@ -1,50 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Encode42 <me@encode42.dev>
|
||||
Date: Tue, 12 Jul 2022 14:16:10 -0400
|
||||
Subject: [PATCH] Add toggle for RNG manipulation
|
||||
|
||||
Paper patches RNG maniplulation by using a shared (and locked) random source.
|
||||
This comes with a performance gain, but technical players may prefer the ability to manipulate RNG.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index 2cac12d2b788b0962b719a83b43dc23177b76ac6..ec6187bc3f445acb86e69161ab1b82248b6e99e0 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -597,7 +597,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
||||
this.bb = Entity.INITIAL_AABB;
|
||||
this.stuckSpeedMultiplier = Vec3.ZERO;
|
||||
this.nextStep = 1.0F;
|
||||
- this.random = SHARED_RANDOM; // Paper - Share random for entities to make them more random
|
||||
+ this.random = world == null || world.purpurConfig.entitySharedRandom ? SHARED_RANDOM : RandomSource.create(); // Paper - Share random for entities to make them more random // Purpur
|
||||
this.remainingFireTicks = -this.getFireImmuneTicks();
|
||||
this.fluidHeight = new Object2DoubleArrayMap(2);
|
||||
this.fluidOnEyes = new HashSet();
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java
|
||||
index fa15e43d19482125e1793e049d1a1380aced906c..38d1eb5680281b2812f2396677ffb959a6e089ce 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/Squid.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java
|
||||
@@ -44,7 +44,7 @@ public class Squid extends WaterAnimal {
|
||||
|
||||
public Squid(EntityType<? extends Squid> type, Level world) {
|
||||
super(type, world);
|
||||
- //this.random.setSeed((long)this.getId()); // Paper - Share random for entities to make them more random
|
||||
+ if (!world.purpurConfig.entitySharedRandom) this.random.setSeed((long)this.getId()); // Paper - Share random for entities to make them more random // Purpur
|
||||
this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 6e30be26888422187c145c5e7c81d24804119b90..7d0d298bd68ecba2ba1e2f3336d9aad4567dfde2 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -204,9 +204,11 @@ public class PurpurWorldConfig {
|
||||
|
||||
public int entityLifeSpan = 0;
|
||||
public float entityLeftHandedChance = 0.05f;
|
||||
+ public boolean entitySharedRandom = true;
|
||||
private void entitySettings() {
|
||||
entityLifeSpan = getInt("gameplay-mechanics.entity-lifespan", entityLifeSpan);
|
||||
entityLeftHandedChance = (float) getDouble("gameplay-mechanics.entity-left-handed-chance", entityLeftHandedChance);
|
||||
+ entitySharedRandom = getBoolean("settings.entity.shared-random", entitySharedRandom);
|
||||
}
|
||||
|
||||
public boolean infinityWorksWithoutArrows = false;
|
||||
@@ -1,35 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Kerllenevich <ben@omega24.dev>
|
||||
Date: Wed, 13 Jul 2022 16:27:43 -0400
|
||||
Subject: [PATCH] Send client custom name of BE
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
||||
index 8e1afae66742fc69d5aab1074ba94a3999cbf9b8..e9701ed4e5b35ace1accd2b46f082191d8ab6497 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
||||
@@ -205,10 +205,24 @@ public abstract class BlockEntity {
|
||||
|
||||
@Nullable
|
||||
public Packet<ClientGamePacketListener> getUpdatePacket() {
|
||||
+ // Purpur start
|
||||
+ if (this instanceof net.minecraft.world.Nameable nameable && nameable.hasCustomName()) {
|
||||
+ CompoundTag nbt = this.saveWithoutMetadata();
|
||||
+ nbt.remove("Items");
|
||||
+ return net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket.create(this, $ -> nbt);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
return null;
|
||||
}
|
||||
|
||||
public CompoundTag getUpdateTag() {
|
||||
+ // Purpur start
|
||||
+ if (this instanceof net.minecraft.world.Nameable nameable && nameable.hasCustomName()) {
|
||||
+ CompoundTag nbt = this.saveWithoutMetadata();
|
||||
+ nbt.remove("Items");
|
||||
+ return nbt;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
return new CompoundTag();
|
||||
}
|
||||
|
||||
@@ -1,926 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Fri, 1 Jul 2022 04:03:37 -0500
|
||||
Subject: [PATCH] Remove Timings
|
||||
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java
|
||||
index 6bc7c6f16a1649fc9e24e7cf90fca401e5bd4875..e1ffd62f4ebceecb9bc5471df3da406cffea0483 100644
|
||||
--- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java
|
||||
+++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java
|
||||
@@ -1316,9 +1316,9 @@ public final class ChunkHolderManager {
|
||||
}
|
||||
|
||||
public boolean processTicketUpdates() {
|
||||
- co.aikar.timings.MinecraftTimings.distanceManagerTick.startTiming(); try { // Paper - add timings for distance manager
|
||||
+ //co.aikar.timings.MinecraftTimings.distanceManagerTick.startTiming(); try { // Paper - add timings for distance manager // Purpur
|
||||
return this.processTicketUpdates(true, true, null);
|
||||
- } finally { co.aikar.timings.MinecraftTimings.distanceManagerTick.stopTiming(); } // Paper - add timings for distance manager
|
||||
+ //} finally { co.aikar.timings.MinecraftTimings.distanceManagerTick.stopTiming(); } // Paper - add timings for distance manager // Purpur
|
||||
}
|
||||
|
||||
private static final ThreadLocal<List<ChunkProgressionTask>> CURRENT_TICKET_UPDATE_SCHEDULING = new ThreadLocal<>();
|
||||
diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/NewChunkHolder.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/NewChunkHolder.java
|
||||
index b66a7d4aab887309579154815a0d4abf9de506b0..e6f56bc5b129699bab60db9c97c7f73b6ede2351 100644
|
||||
--- a/src/main/java/io/papermc/paper/chunk/system/scheduling/NewChunkHolder.java
|
||||
+++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/NewChunkHolder.java
|
||||
@@ -1779,7 +1779,7 @@ public final class NewChunkHolder {
|
||||
boolean canSavePOI = !(chunk instanceof LevelChunk levelChunk && levelChunk.mustNotSave) && (poi != null && poi.isDirty());
|
||||
boolean canSaveEntities = entities != null;
|
||||
|
||||
- try (co.aikar.timings.Timing ignored = this.world.timings.chunkSave.startTiming()) { // Paper
|
||||
+ //try (co.aikar.timings.Timing ignored = this.world.timings.chunkSave.startTiming()) { // Paper // Purpur
|
||||
if (canSaveChunk) {
|
||||
canSaveChunk = this.saveChunk(chunk, unloading);
|
||||
}
|
||||
@@ -1793,7 +1793,7 @@ public final class NewChunkHolder {
|
||||
this.lastEntityUnload = null;
|
||||
}
|
||||
}
|
||||
- }
|
||||
+ //} // Purpur
|
||||
|
||||
return executedUnloadTask | canSaveChunk | canSaveEntities | canSavePOI ? new SaveStat(executedUnloadTask || canSaveChunk, canSaveEntities, canSavePOI): null;
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/network/protocol/PacketUtils.java b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
|
||||
index 83302c252f54481f239522e5c6861ccfe233070a..620edb63cacd15e38f7fc859efd4095bfb5e5f72 100644
|
||||
--- a/src/main/java/net/minecraft/network/protocol/PacketUtils.java
|
||||
+++ b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
|
||||
@@ -50,7 +50,7 @@ public class PacketUtils {
|
||||
if (listener instanceof ServerCommonPacketListenerImpl serverCommonPacketListener && serverCommonPacketListener.processedDisconnect) return; // CraftBukkit - Don't handle sync packets for kicked players
|
||||
if (listener.shouldHandleMessage(packet)) {
|
||||
co.aikar.timings.Timing timing = co.aikar.timings.MinecraftTimings.getPacketTiming(packet); // Paper - timings
|
||||
- try (co.aikar.timings.Timing ignored = timing.startTiming()) { // Paper - timings
|
||||
+ try { // Paper - timings // Purpur
|
||||
packet.handle(listener);
|
||||
} catch (Exception exception) {
|
||||
label25:
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 71fca0aae67c632198625cbec4381afeff7771be..0b1f9a51aaf97c3fb8a68bb7141ff76430d3b1a5 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1439,7 +1439,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
return;
|
||||
}
|
||||
|
||||
- co.aikar.timings.MinecraftTimings.midTickChunkTasks.startTiming();
|
||||
+ // co.aikar.timings.MinecraftTimings.midTickChunkTasks.startTiming(); // Purpur
|
||||
try {
|
||||
for (;;) {
|
||||
boolean moreTasks = this.tickMidTickTasks();
|
||||
@@ -1466,7 +1466,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
- co.aikar.timings.MinecraftTimings.midTickChunkTasks.stopTiming();
|
||||
+ // co.aikar.timings.MinecraftTimings.midTickChunkTasks.stopTiming(); // Purpur
|
||||
}
|
||||
}
|
||||
// Paper end - execute chunk tasks mid tick
|
||||
@@ -1541,15 +1541,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
|
||||
public void tickServer(BooleanSupplier shouldKeepTicking) {
|
||||
- co.aikar.timings.TimingsManager.FULL_SERVER_TICK.startTiming(); // Paper
|
||||
+ //co.aikar.timings.TimingsManager.FULL_SERVER_TICK.startTiming(); // Paper // Purpur
|
||||
long i = Util.getNanos();
|
||||
|
||||
// Paper start - move oversleep into full server tick
|
||||
- isOversleep = true;MinecraftTimings.serverOversleep.startTiming();
|
||||
+ //isOversleep = true;MinecraftTimings.serverOversleep.startTiming(); // Purpur
|
||||
this.managedBlock(() -> {
|
||||
return !this.canOversleep();
|
||||
});
|
||||
- isOversleep = false;MinecraftTimings.serverOversleep.stopTiming();
|
||||
+ //isOversleep = false;MinecraftTimings.serverOversleep.stopTiming(); // Purpur
|
||||
// Paper end
|
||||
new com.destroystokyo.paper.event.server.ServerTickStartEvent(this.tickCount+1).callEvent(); // Paper - Server Tick Events
|
||||
|
||||
@@ -1586,9 +1586,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
// Paper end - Incremental chunk and player saving
|
||||
io.papermc.paper.util.CachedLists.reset(); // Paper
|
||||
// Paper start - move executeAll() into full server tick timing
|
||||
- try (co.aikar.timings.Timing ignored = MinecraftTimings.processTasksTimer.startTiming()) {
|
||||
+ //try (co.aikar.timings.Timing ignored = MinecraftTimings.processTasksTimer.startTiming()) { // Purpur
|
||||
this.runAllTasks();
|
||||
- }
|
||||
+ //} // Purpur
|
||||
// Paper end
|
||||
// Paper start - Server Tick Events
|
||||
long endTime = System.nanoTime();
|
||||
@@ -1613,7 +1613,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.logTickTime(l - i);
|
||||
this.profiler.pop();
|
||||
org.spigotmc.WatchdogThread.tick(); // Spigot
|
||||
- co.aikar.timings.TimingsManager.FULL_SERVER_TICK.stopTiming(); // Paper
|
||||
+ //co.aikar.timings.TimingsManager.FULL_SERVER_TICK.stopTiming(); // Paper // Purpur
|
||||
}
|
||||
|
||||
private int computeNextAutosaveInterval() {
|
||||
@@ -1675,9 +1675,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.getPlayerList().getPlayers().forEach((entityplayer) -> {
|
||||
entityplayer.connection.suspendFlushing();
|
||||
});
|
||||
- MinecraftTimings.bukkitSchedulerTimer.startTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.bukkitSchedulerTimer.startTiming(); // Spigot // Paper // Purpur
|
||||
this.server.getScheduler().mainThreadHeartbeat(this.tickCount); // CraftBukkit
|
||||
- MinecraftTimings.bukkitSchedulerTimer.stopTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.bukkitSchedulerTimer.stopTiming(); // Spigot // Paper // Purpur
|
||||
// Paper start - Folia scheduler API
|
||||
((io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler) Bukkit.getGlobalRegionScheduler()).tick();
|
||||
getAllLevels().forEach(level -> {
|
||||
@@ -1694,21 +1694,21 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
// Paper end - Folia scheduler API
|
||||
io.papermc.paper.adventure.providers.ClickCallbackProviderImpl.CALLBACK_MANAGER.handleQueue(this.tickCount); // Paper
|
||||
this.profiler.push("commandFunctions");
|
||||
- MinecraftTimings.commandFunctionsTimer.startTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.commandFunctionsTimer.startTiming(); // Spigot // Paper // Purpur
|
||||
this.getFunctions().tick();
|
||||
- MinecraftTimings.commandFunctionsTimer.stopTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.commandFunctionsTimer.stopTiming(); // Spigot // Paper // Purpur
|
||||
this.profiler.popPush("levels");
|
||||
//Iterator iterator = this.getAllLevels().iterator(); // Paper - Throw exception on world create while being ticked; moved down
|
||||
|
||||
// CraftBukkit start
|
||||
// Run tasks that are waiting on processing
|
||||
- MinecraftTimings.processQueueTimer.startTiming(); // Spigot
|
||||
+ //MinecraftTimings.processQueueTimer.startTiming(); // Spigot // Purpur
|
||||
while (!this.processQueue.isEmpty()) {
|
||||
this.processQueue.remove().run();
|
||||
}
|
||||
- MinecraftTimings.processQueueTimer.stopTiming(); // Spigot
|
||||
+ //MinecraftTimings.processQueueTimer.stopTiming(); // Spigot // Purpur
|
||||
|
||||
- MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot // Paper // Purpur
|
||||
// Send time updates to everyone, it will get the right time from the world the player is in.
|
||||
// Paper start - Perf: Optimize time updates
|
||||
for (final ServerLevel level : this.getAllLevels()) {
|
||||
@@ -1728,7 +1728,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
}
|
||||
}
|
||||
// Paper end - Perf: Optimize time updates
|
||||
- MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot // Paper // Purpur
|
||||
|
||||
this.isIteratingOverLevels = true; // Paper - Throw exception on world create while being ticked
|
||||
Iterator iterator = this.getAllLevels().iterator(); // Paper - Throw exception on world create while being ticked; move down
|
||||
@@ -1754,14 +1754,14 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.profiler.push("tick");
|
||||
|
||||
try {
|
||||
- worldserver.timings.doTick.startTiming(); // Spigot
|
||||
+ //worldserver.timings.doTick.startTiming(); // Spigot // Purpur
|
||||
worldserver.tick(shouldKeepTicking);
|
||||
// Paper start
|
||||
for (final io.papermc.paper.chunk.SingleThreadChunkRegionManager regionManager : worldserver.getChunkSource().chunkMap.regionManagers) {
|
||||
regionManager.recalculateRegions();
|
||||
}
|
||||
// Paper end
|
||||
- worldserver.timings.doTick.stopTiming(); // Spigot
|
||||
+ //worldserver.timings.doTick.stopTiming(); // Spigot // Purpur
|
||||
} catch (Throwable throwable) {
|
||||
CrashReport crashreport = CrashReport.forThrowable(throwable, "Exception ticking world");
|
||||
|
||||
@@ -1776,24 +1776,24 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
this.isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
|
||||
|
||||
this.profiler.popPush("connection");
|
||||
- MinecraftTimings.connectionTimer.startTiming(); // Spigot // Paper
|
||||
+ // MinecraftTimings.connectionTimer.startTiming(); // Spigot // Paper // Purpur
|
||||
this.getConnection().tick();
|
||||
- MinecraftTimings.connectionTimer.stopTiming(); // Spigot // Paper
|
||||
+ // MinecraftTimings.connectionTimer.stopTiming(); // Spigot // Paper // Purpur
|
||||
this.profiler.popPush("players");
|
||||
- MinecraftTimings.playerListTimer.startTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.playerListTimer.startTiming(); // Spigot // Paper // Purpur
|
||||
this.playerList.tick();
|
||||
- MinecraftTimings.playerListTimer.stopTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.playerListTimer.stopTiming(); // Spigot // Paper // Purpur
|
||||
if (SharedConstants.IS_RUNNING_IN_IDE && this.tickRateManager.runsNormally()) {
|
||||
GameTestTicker.SINGLETON.tick();
|
||||
}
|
||||
|
||||
this.profiler.popPush("server gui refresh");
|
||||
|
||||
- MinecraftTimings.tickablesTimer.startTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.tickablesTimer.startTiming(); // Spigot // Paper // Purpur
|
||||
for (int i = 0; i < this.tickables.size(); ++i) {
|
||||
((Runnable) this.tickables.get(i)).run();
|
||||
}
|
||||
- MinecraftTimings.tickablesTimer.stopTiming(); // Spigot // Paper
|
||||
+ //MinecraftTimings.tickablesTimer.stopTiming(); // Spigot // Paper // Purpur
|
||||
|
||||
this.profiler.popPush("send chunks");
|
||||
iterator = this.playerList.getPlayers().iterator();
|
||||
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
index 38de0e9b83ecac489ca676725274d14fcb60dd5c..6a9bd431e9c2e1fc1e51d394eaccba864bbeac89 100644
|
||||
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -523,7 +523,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
||||
}
|
||||
|
||||
public void handleConsoleInputs() {
|
||||
- MinecraftTimings.serverCommandTimer.startTiming(); // Spigot
|
||||
+ //MinecraftTimings.serverCommandTimer.startTiming(); // Spigot // Purpur
|
||||
// Paper start - Perf: use proper queue
|
||||
ConsoleInput servercommand;
|
||||
while ((servercommand = this.serverCommandQueue.poll()) != null) {
|
||||
@@ -540,7 +540,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
||||
// CraftBukkit end
|
||||
}
|
||||
|
||||
- MinecraftTimings.serverCommandTimer.stopTiming(); // Spigot
|
||||
+ //MinecraftTimings.serverCommandTimer.stopTiming(); // Spigot // Purpur
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
index 1081e9df44bb24b2c51ebd9364c21c7b2a3a205a..3fbc1e7e401331790d590dcd513a0a267b5ea181 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -540,15 +540,15 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
protected void tick(BooleanSupplier shouldKeepTicking) {
|
||||
ProfilerFiller gameprofilerfiller = this.level.getProfiler();
|
||||
|
||||
- try (Timing ignored = this.level.timings.poiUnload.startTiming()) { // Paper
|
||||
+ //try (Timing ignored = this.level.timings.poiUnload.startTiming()) { // Paper // Purpur
|
||||
gameprofilerfiller.push("poi");
|
||||
this.poiManager.tick(shouldKeepTicking);
|
||||
- } // Paper
|
||||
+ //} // Paper // Purpur
|
||||
gameprofilerfiller.popPush("chunk_unload");
|
||||
if (!this.level.noSave()) {
|
||||
- try (Timing ignored = this.level.timings.chunkUnload.startTiming()) { // Paper
|
||||
+ //try (Timing ignored = this.level.timings.chunkUnload.startTiming()) { // Paper // Purpur
|
||||
this.processUnloads(shouldKeepTicking);
|
||||
- } // Paper
|
||||
+ //} // Paper // Purpur
|
||||
}
|
||||
|
||||
gameprofilerfiller.pop();
|
||||
@@ -1141,24 +1141,24 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
|
||||
// Paper start - optimised tracker
|
||||
private final void processTrackQueue() {
|
||||
- this.level.timings.tracker1.startTiming();
|
||||
+ //this.level.timings.tracker1.startTiming(); // Purpur
|
||||
try {
|
||||
for (TrackedEntity tracker : this.entityMap.values()) {
|
||||
// update tracker entry
|
||||
tracker.updatePlayers(tracker.entity.getPlayersInTrackRange());
|
||||
}
|
||||
} finally {
|
||||
- this.level.timings.tracker1.stopTiming();
|
||||
+ //this.level.timings.tracker1.stopTiming(); // Purpur
|
||||
}
|
||||
|
||||
|
||||
- this.level.timings.tracker2.startTiming();
|
||||
+ //this.level.timings.tracker2.startTiming(); // Purpur
|
||||
try {
|
||||
for (TrackedEntity tracker : this.entityMap.values()) {
|
||||
tracker.serverEntity.sendChanges();
|
||||
}
|
||||
} finally {
|
||||
- this.level.timings.tracker2.stopTiming();
|
||||
+ //this.level.timings.tracker2.stopTiming(); // Purpur
|
||||
}
|
||||
}
|
||||
// Paper end - optimised tracker
|
||||
@@ -1173,7 +1173,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
List<ServerPlayer> list = Lists.newArrayList();
|
||||
List<ServerPlayer> list1 = this.level.players();
|
||||
ObjectIterator objectiterator = this.entityMap.values().iterator();
|
||||
- level.timings.tracker1.startTiming(); // Paper
|
||||
+ //this.level.timings.tracker1.startTiming(); // Paper // Purpur
|
||||
|
||||
ChunkMap.TrackedEntity playerchunkmap_entitytracker;
|
||||
|
||||
@@ -1198,17 +1198,17 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
playerchunkmap_entitytracker.serverEntity.sendChanges();
|
||||
}
|
||||
}
|
||||
- level.timings.tracker1.stopTiming(); // Paper
|
||||
+ //this.level.timings.tracker1.stopTiming(); // Paper // Purpur
|
||||
|
||||
if (!list.isEmpty()) {
|
||||
objectiterator = this.entityMap.values().iterator();
|
||||
|
||||
- level.timings.tracker2.startTiming(); // Paper
|
||||
+ //this.level.timings.tracker2.startTiming(); // Paper // Purpur
|
||||
while (objectiterator.hasNext()) {
|
||||
playerchunkmap_entitytracker = (ChunkMap.TrackedEntity) objectiterator.next();
|
||||
playerchunkmap_entitytracker.updatePlayers(list);
|
||||
}
|
||||
- level.timings.tracker2.stopTiming(); // Paper
|
||||
+ //this.level.timings.tracker2.stopTiming(); // Paper // Purpur
|
||||
}
|
||||
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||
index 1cf8c819c0d7776c3b33d6594ca81abe3c2a719d..bbc3153379d7da8b4d91c49a3ba83d4415a7671a 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||
@@ -281,10 +281,10 @@ public class ServerChunkCache extends ChunkSource {
|
||||
if (!completablefuture.isDone()) { // Paper
|
||||
io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.pushChunkWait(this.level, x1, z1); // Paper - rewrite chunk system
|
||||
com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x, z); // Paper - Add debug for sync chunk loads
|
||||
- this.level.timings.syncChunkLoad.startTiming(); // Paper
|
||||
+ //this.level.timings.syncChunkLoad.startTiming(); // Paper // Purpur
|
||||
chunkproviderserver_b.managedBlock(completablefuture::isDone);
|
||||
io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.popChunkWait(); // Paper - rewrite chunk system
|
||||
- this.level.timings.syncChunkLoad.stopTiming(); // Paper
|
||||
+ //this.level.timings.syncChunkLoad.stopTiming(); // Paper // Purpur
|
||||
} // Paper
|
||||
ichunkaccess = (ChunkAccess) ((Either) completablefuture.join()).map((ichunkaccess1) -> {
|
||||
return ichunkaccess1;
|
||||
@@ -433,17 +433,17 @@ public class ServerChunkCache extends ChunkSource {
|
||||
|
||||
public void save(boolean flush) {
|
||||
this.runDistanceManagerUpdates();
|
||||
- try (co.aikar.timings.Timing timed = level.timings.chunkSaveData.startTiming()) { // Paper - Timings
|
||||
+ //try (co.aikar.timings.Timing timed = level.timings.chunkSaveData.startTiming()) { // Paper - Timings // Purpur
|
||||
this.chunkMap.saveAllChunks(flush);
|
||||
- } // Paper - Timings
|
||||
+ //} // Paper - Timings // Purpur
|
||||
}
|
||||
|
||||
// Paper start - Incremental chunk and player saving; duplicate save, but call incremental
|
||||
public void saveIncrementally() {
|
||||
this.runDistanceManagerUpdates();
|
||||
- try (co.aikar.timings.Timing timed = level.timings.chunkSaveData.startTiming()) { // Paper - Timings
|
||||
+ //try (co.aikar.timings.Timing timed = level.timings.chunkSaveData.startTiming()) { // Paper - Timings // Purpur
|
||||
this.chunkMap.saveIncrementally();
|
||||
- } // Paper - Timings
|
||||
+ //} // Paper - Timings // Purpur
|
||||
}
|
||||
// Paper end - Incremental chunk and player saving
|
||||
|
||||
@@ -480,23 +480,23 @@ public class ServerChunkCache extends ChunkSource {
|
||||
@Override
|
||||
public void tick(BooleanSupplier shouldKeepTicking, boolean tickChunks) {
|
||||
this.level.getProfiler().push("purge");
|
||||
- this.level.timings.doChunkMap.startTiming(); // Spigot
|
||||
+ //this.level.timings.doChunkMap.startTiming(); // Spigot // Purpur
|
||||
this.distanceManager.purgeStaleTickets();
|
||||
this.runDistanceManagerUpdates();
|
||||
- this.level.timings.doChunkMap.stopTiming(); // Spigot
|
||||
+ //this.level.timings.doChunkMap.stopTiming(); // Spigot // Purpur
|
||||
this.level.getProfiler().popPush("chunks");
|
||||
if (tickChunks) {
|
||||
- this.level.timings.chunks.startTiming(); // Paper - timings
|
||||
+ //this.level.timings.chunks.startTiming(); // Paper - timings // Purpur
|
||||
this.chunkMap.level.playerChunkLoader.tick(); // Paper - replace player chunk loader - this is mostly required to account for view distance changes
|
||||
this.tickChunks();
|
||||
- this.level.timings.chunks.stopTiming(); // Paper - timings
|
||||
+ //this.level.timings.chunks.stopTiming(); // Paper - timings // Purpur
|
||||
this.chunkMap.tick();
|
||||
}
|
||||
|
||||
- this.level.timings.doChunkUnload.startTiming(); // Spigot
|
||||
+ //this.level.timings.doChunkUnload.startTiming(); // Spigot // Purpur
|
||||
this.level.getProfiler().popPush("unload");
|
||||
this.chunkMap.tick(shouldKeepTicking);
|
||||
- this.level.timings.doChunkUnload.stopTiming(); // Spigot
|
||||
+ //this.level.timings.doChunkUnload.stopTiming(); // Spigot // Purpur
|
||||
this.level.getProfiler().pop();
|
||||
this.clearCache();
|
||||
}
|
||||
@@ -512,14 +512,14 @@ public class ServerChunkCache extends ChunkSource {
|
||||
gameprofilerfiller.push("pollingChunks");
|
||||
gameprofilerfiller.push("filteringLoadedChunks");
|
||||
// Paper - optimise chunk tick iteration
|
||||
- if (this.level.getServer().tickRateManager().runsNormally()) this.level.timings.chunkTicks.startTiming(); // Paper
|
||||
+ //if (this.level.getServer().tickRateManager().runsNormally()) this.level.timings.chunkTicks.startTiming(); // Paper // Purpur
|
||||
|
||||
// Paper - optimise chunk tick iteration
|
||||
|
||||
this.level.resetIceAndSnowTick(); // Pufferfish - reset ice & snow tick random
|
||||
if (this.level.getServer().tickRateManager().runsNormally()) {
|
||||
gameprofilerfiller.popPush("naturalSpawnCount");
|
||||
- this.level.timings.countNaturalMobs.startTiming(); // Paper - timings
|
||||
+ //this.level.timings.countNaturalMobs.startTiming(); // Paper - timings // Purpur
|
||||
int k = this.distanceManager.getNaturalSpawnChunkCount();
|
||||
// Paper start - Optional per player mob spawns
|
||||
int naturalSpawnChunkCount = k;
|
||||
@@ -549,7 +549,7 @@ public class ServerChunkCache extends ChunkSource {
|
||||
// Pufferfish end
|
||||
}
|
||||
// Paper end - Optional per player mob spawns
|
||||
- this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings
|
||||
+ // this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur
|
||||
|
||||
// this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously
|
||||
gameprofilerfiller.popPush("spawnAndTick");
|
||||
@@ -658,19 +658,19 @@ public class ServerChunkCache extends ChunkSource {
|
||||
}
|
||||
}
|
||||
// Paper end - optimise chunk tick iteration
|
||||
- this.level.timings.chunkTicks.stopTiming(); // Paper
|
||||
+ // this.level.timings.chunkTicks.stopTiming(); // Paper // Purpur
|
||||
|
||||
gameprofilerfiller.popPush("customSpawners");
|
||||
if (flag) {
|
||||
- try (co.aikar.timings.Timing ignored = this.level.timings.miscMobSpawning.startTiming()) { // Paper - timings
|
||||
+ //try (co.aikar.timings.Timing ignored = this.level.timings.miscMobSpawning.startTiming()) { // Paper - timings // Purpur
|
||||
this.level.tickCustomSpawners(this.spawnEnemies, this.spawnFriendlies);
|
||||
- } // Paper - timings
|
||||
+ //} // Paper - timings // Purpur
|
||||
}
|
||||
}
|
||||
|
||||
gameprofilerfiller.popPush("broadcast");
|
||||
// Paper - optimise chunk tick iteration
|
||||
- this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing
|
||||
+ //this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing // Purpur
|
||||
// Paper start - optimise chunk tick iteration
|
||||
if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) {
|
||||
it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet<ChunkHolder> copy = this.chunkMap.needsChangeBroadcasting.clone();
|
||||
@@ -684,7 +684,7 @@ public class ServerChunkCache extends ChunkSource {
|
||||
}
|
||||
}
|
||||
// Paper end - optimise chunk tick iteration
|
||||
- this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing
|
||||
+ //this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing // Purpur
|
||||
// Paper - optimise chunk tick iteration
|
||||
gameprofilerfiller.pop();
|
||||
gameprofilerfiller.pop();
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
index 8caa45d3bdf1a7b576427f6e3ae976bbfcb911f6..0d9ac7d3248686780b7482afab3059a09bba649a 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -866,7 +866,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
}
|
||||
|
||||
gameprofilerfiller.popPush("tickPending");
|
||||
- this.timings.scheduledBlocks.startTiming(); // Paper
|
||||
+ //this.timings.scheduledBlocks.startTiming(); // Paper // Purpur
|
||||
if (!this.isDebug() && flag) {
|
||||
j = this.getGameTime();
|
||||
gameprofilerfiller.push("blockTicks");
|
||||
@@ -875,24 +875,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
this.fluidTicks.tick(j, paperConfig().environment.maxFluidTicks, this::tickFluid); // Paper - configurable max fluid ticks
|
||||
gameprofilerfiller.pop();
|
||||
}
|
||||
- this.timings.scheduledBlocks.stopTiming(); // Paper
|
||||
+ //this.timings.scheduledBlocks.stopTiming(); // Paper // Purpur
|
||||
|
||||
gameprofilerfiller.popPush("raid");
|
||||
if (flag) {
|
||||
- this.timings.raids.startTiming(); // Paper - timings
|
||||
+ // this.timings.raids.startTiming(); // Paper - timings // Purpur
|
||||
this.raids.tick();
|
||||
- this.timings.raids.stopTiming(); // Paper - timings
|
||||
+ // this.timings.raids.stopTiming(); // Paper - timings // Purpur
|
||||
}
|
||||
|
||||
gameprofilerfiller.popPush("chunkSource");
|
||||
- this.timings.chunkProviderTick.startTiming(); // Paper - timings
|
||||
+ //this.timings.chunkProviderTick.startTiming(); // Paper - timings // Purpur
|
||||
this.getChunkSource().tick(shouldKeepTicking, true);
|
||||
- this.timings.chunkProviderTick.stopTiming(); // Paper - timings
|
||||
+ //this.timings.chunkProviderTick.stopTiming(); // Paper - timings // Purpur
|
||||
gameprofilerfiller.popPush("blockEvents");
|
||||
if (flag) {
|
||||
- this.timings.doSounds.startTiming(); // Spigot
|
||||
+ // this.timings.doSounds.startTiming(); // Spigot // Purpur
|
||||
this.runBlockEvents();
|
||||
- this.timings.doSounds.stopTiming(); // Spigot
|
||||
+ // this.timings.doSounds.stopTiming(); // Spigot // Purpur
|
||||
}
|
||||
|
||||
this.handlingTick = false;
|
||||
@@ -905,7 +905,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
|
||||
if (flag1 || this.emptyTime++ < 300) {
|
||||
gameprofilerfiller.push("entities");
|
||||
- this.timings.tickEntities.startTiming(); // Spigot
|
||||
+ //this.timings.tickEntities.startTiming(); // Spigot // Purpur
|
||||
if (this.dragonFight != null && flag) {
|
||||
gameprofilerfiller.push("dragonFight");
|
||||
this.dragonFight.tick();
|
||||
@@ -913,7 +913,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
}
|
||||
|
||||
org.spigotmc.ActivationRange.activateEntities(this); // Spigot
|
||||
- this.timings.entityTick.startTiming(); // Spigot
|
||||
+ //this.timings.entityTick.startTiming(); // Spigot // Purpur
|
||||
this.entityTickList.forEach((entity) -> {
|
||||
entity.activatedPriorityReset = false; // Pufferfish - DAB
|
||||
if (!entity.isRemoved()) {
|
||||
@@ -954,8 +954,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
}
|
||||
}
|
||||
});
|
||||
- this.timings.entityTick.stopTiming(); // Spigot
|
||||
- this.timings.tickEntities.stopTiming(); // Spigot
|
||||
+ //this.timings.entityTick.stopTiming(); // Spigot // Purpur
|
||||
+ //this.timings.tickEntities.stopTiming(); // Spigot // Purpur
|
||||
gameprofilerfiller.pop();
|
||||
this.tickBlockEntities();
|
||||
}
|
||||
@@ -1099,7 +1099,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
} // Paper - Option to disable ice and snow
|
||||
|
||||
gameprofilerfiller.popPush("tickBlocks");
|
||||
- timings.chunkTicksBlocks.startTiming(); // Paper
|
||||
+ //timings.chunkTicksBlocks.startTiming(); // Paper // Purpur
|
||||
if (randomTickSpeed > 0) {
|
||||
// Paper start - optimize random block ticking
|
||||
LevelChunkSection[] sections = chunk.getSections();
|
||||
@@ -1133,7 +1133,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
}
|
||||
// Paper end - optimise random block ticking
|
||||
|
||||
- timings.chunkTicksBlocks.stopTiming(); // Paper
|
||||
+ //timings.chunkTicksBlocks.stopTiming(); // Paper // Purpur
|
||||
gameprofilerfiller.pop();
|
||||
}
|
||||
|
||||
@@ -1477,8 +1477,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
// Spigot end
|
||||
// Paper start- timings
|
||||
final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity);
|
||||
- timer = isActive ? entity.getType().tickTimer.startTiming() : entity.getType().inactiveTickTimer.startTiming(); // Paper
|
||||
- try {
|
||||
+ //timer = isActive ? entity.getType().tickTimer.startTiming() : entity.getType().inactiveTickTimer.startTiming(); // Paper // Purpur
|
||||
+ //try { // Purpur
|
||||
// Paper end - timings
|
||||
entity.setOldPosAndRot();
|
||||
ProfilerFiller gameprofilerfiller = this.getProfiler();
|
||||
@@ -1494,7 +1494,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
entity.postTick(); // CraftBukkit
|
||||
} else { entity.inactiveTick(); } // Paper - EAR 2
|
||||
this.getProfiler().pop();
|
||||
- } finally { timer.stopTiming(); } // Paper - timings
|
||||
+ //} finally { timer.stopTiming(); } // Paper - timings // Purpur
|
||||
Iterator iterator = entity.getPassengers().iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
@@ -1517,8 +1517,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
if (passenger instanceof Player || this.entityTickList.contains(passenger)) {
|
||||
// Paper - EAR 2
|
||||
final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger);
|
||||
- co.aikar.timings.Timing timer = isActive ? passenger.getType().passengerTickTimer.startTiming() : passenger.getType().passengerInactiveTickTimer.startTiming(); // Paper
|
||||
- try {
|
||||
+ //co.aikar.timings.Timing timer = isActive ? passenger.getType().passengerTickTimer.startTiming() : passenger.getType().passengerInactiveTickTimer.startTiming(); // Paper // Purpur
|
||||
+ //try { // Purpur
|
||||
// Paper end
|
||||
passenger.setOldPosAndRot();
|
||||
++passenger.tickCount;
|
||||
@@ -1548,7 +1548,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
this.tickPassenger(passenger, entity2);
|
||||
}
|
||||
|
||||
- } finally { timer.stopTiming(); }// Paper - EAR2 timings
|
||||
+ //} finally { timer.stopTiming(); }// Paper - EAR2 timings // Purpur
|
||||
}
|
||||
} else {
|
||||
passenger.stopRiding();
|
||||
@@ -1568,14 +1568,14 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld()));
|
||||
}
|
||||
|
||||
- try (co.aikar.timings.Timing ignored = this.timings.worldSave.startTiming()) {
|
||||
+ //try (co.aikar.timings.Timing ignored = this.timings.worldSave.startTiming()) { // Purpur
|
||||
if (doFull) {
|
||||
this.saveLevelData(true); // Paper - Write SavedData IO async
|
||||
}
|
||||
|
||||
- this.timings.worldSaveChunks.startTiming(); // Paper
|
||||
+ //this.timings.worldSaveChunks.startTiming(); // Paper // Purpur
|
||||
if (!this.noSave()) chunkproviderserver.saveIncrementally();
|
||||
- this.timings.worldSaveChunks.stopTiming(); // Paper
|
||||
+ //this.timings.worldSaveChunks.stopTiming(); // Paper // Purpur
|
||||
|
||||
// Copied from save()
|
||||
// CraftBukkit start - moved from MinecraftServer.saveChunks
|
||||
@@ -1587,7 +1587,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData());
|
||||
}
|
||||
// CraftBukkit end
|
||||
- }
|
||||
+ //} // Purpur
|
||||
}
|
||||
// Paper end - Incremental chunk and player saving
|
||||
|
||||
@@ -1601,7 +1601,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
|
||||
if (!savingDisabled) {
|
||||
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(this.getWorld())); // CraftBukkit
|
||||
- try (co.aikar.timings.Timing ignored = timings.worldSave.startTiming()) { // Paper
|
||||
+ //try (co.aikar.timings.Timing ignored = timings.worldSave.startTiming()) { // Paper // Purpur // Purpur
|
||||
if (progressListener != null) {
|
||||
progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel"));
|
||||
}
|
||||
@@ -1611,11 +1611,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
progressListener.progressStage(Component.translatable("menu.savingChunks"));
|
||||
}
|
||||
|
||||
- timings.worldSaveChunks.startTiming(); // Paper
|
||||
+ //timings.worldSaveChunks.startTiming(); // Paper // Purpur
|
||||
if (!close) chunkproviderserver.save(flush); // Paper - rewrite chunk system
|
||||
if (close) chunkproviderserver.close(true); // Paper - rewrite chunk system
|
||||
- timings.worldSaveChunks.stopTiming(); // Paper
|
||||
- }// Paper
|
||||
+ //timings.worldSaveChunks.stopTiming(); // Paper // Purpur
|
||||
+ //}// Paper // Purpur
|
||||
// Paper - rewrite chunk system - entity saving moved into ChunkHolder
|
||||
|
||||
} else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system
|
||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
index 716377ce3236c9ae012b9bbcf432251ca06a9342..fdbdaa1d8d5760c5c661cbeca803e8ff8ec46aac 100644
|
||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
@@ -2456,7 +2456,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||
|
||||
public void handleCommand(String s) { // Paper - private -> public
|
||||
org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher
|
||||
- co.aikar.timings.MinecraftTimings.playerCommandTimer.startTiming(); // Paper
|
||||
+ //co.aikar.timings.MinecraftTimings.playerCommandTimer.startTiming(); // Paper // Purpur
|
||||
if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot
|
||||
this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s);
|
||||
|
||||
@@ -2466,7 +2466,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||
this.cserver.getPluginManager().callEvent(event);
|
||||
|
||||
if (event.isCancelled()) {
|
||||
- co.aikar.timings.MinecraftTimings.playerCommandTimer.stopTiming(); // Paper
|
||||
+ //co.aikar.timings.MinecraftTimings.playerCommandTimer.stopTiming(); // Paper // Purpur
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2479,7 +2479,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||
java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
||||
return;
|
||||
} finally {
|
||||
- co.aikar.timings.MinecraftTimings.playerCommandTimer.stopTiming(); // Paper
|
||||
+ //co.aikar.timings.MinecraftTimings.playerCommandTimer.stopTiming(); // Paper // Purpur
|
||||
}
|
||||
}
|
||||
// CraftBukkit end
|
||||
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||||
index 1b8b0bafce3352bd65d570ac7cb4ea3acdfe991d..ac1e0c66f167218306504db6037cc1d6509072a0 100644
|
||||
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
||||
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||||
@@ -1274,7 +1274,7 @@ public abstract class PlayerList {
|
||||
|
||||
public void saveAll(int interval) {
|
||||
io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main
|
||||
- MinecraftTimings.savePlayers.startTiming(); // Paper
|
||||
+ //MinecraftTimings.savePlayers.startTiming(); // Paper // Purpur
|
||||
int numSaved = 0;
|
||||
long now = MinecraftServer.currentTick;
|
||||
for (int i = 0; i < this.players.size(); ++i) {
|
||||
@@ -1285,7 +1285,7 @@ public abstract class PlayerList {
|
||||
}
|
||||
// Paper end - Incremental chunk and player saving
|
||||
}
|
||||
- MinecraftTimings.savePlayers.stopTiming(); // Paper
|
||||
+ //MinecraftTimings.savePlayers.stopTiming(); // Paper // Purpur
|
||||
return null; }); // Paper - ensure main
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java
|
||||
index 03092417cd8ab5c6d266f3af9f20f47b34cfaba3..8f7d9f8a5138bcd572691d66c814aaa7c308b317 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/Behavior.java
|
||||
@@ -59,9 +59,9 @@ public abstract class Behavior<E extends LivingEntity> implements BehaviorContro
|
||||
this.status = Behavior.Status.RUNNING;
|
||||
int i = this.minDuration + world.getRandom().nextInt(this.maxDuration + 1 - this.minDuration);
|
||||
this.endTimestamp = time + (long)i;
|
||||
- this.timing.startTiming(); // Paper - behavior timings
|
||||
+ //this.timing.startTiming(); // Paper - behavior timings // Purpur
|
||||
this.start(world, entity, time);
|
||||
- this.timing.stopTiming(); // Paper - behavior timings
|
||||
+ //this.timing.stopTiming(); // Paper - behavior timings // Purpur
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@@ -73,13 +73,13 @@ public abstract class Behavior<E extends LivingEntity> implements BehaviorContro
|
||||
|
||||
@Override
|
||||
public final void tickOrStop(ServerLevel world, E entity, long time) {
|
||||
- this.timing.startTiming(); // Paper - behavior timings
|
||||
+ //this.timing.startTiming(); // Paper - behavior timings // Purpur
|
||||
if (!this.timedOut(time) && this.canStillUse(world, entity, time)) {
|
||||
this.tick(world, entity, time);
|
||||
} else {
|
||||
this.doStop(world, entity, time);
|
||||
}
|
||||
- this.timing.stopTiming(); // Paper - behavior timings
|
||||
+ //this.timing.stopTiming(); // Paper - behavior timings // Purpur
|
||||
}
|
||||
|
||||
protected void tick(ServerLevel world, E entity, long time) {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java
|
||||
index 9e90cb2f51d1bacacb287e912d14ab9152523205..e553f52de2e0b30511ac1b73cb436374017cd7d7 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/sensing/Sensor.java
|
||||
@@ -53,10 +53,10 @@ public abstract class Sensor<E extends LivingEntity> {
|
||||
if (--this.timeToTick <= 0L) {
|
||||
// Paper start - configurable sensor tick rate and timings
|
||||
this.timeToTick = java.util.Objects.requireNonNullElse(world.paperConfig().tickRates.sensor.get(entity.getType(), this.configKey), this.scanRate);
|
||||
- this.timing.startTiming();
|
||||
+ //this.timing.startTiming(); // Purpur
|
||||
// Paper end
|
||||
this.doTick(world, entity);
|
||||
- this.timing.stopTiming(); // Paper - sensor timings
|
||||
+ //this.timing.stopTiming(); // Paper - sensor timings // Purpur
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
|
||||
index 9e896ede9f84568b5675e04294bb9b6a8d016324..ea9b33eb48d8610943d122811cc49d211bc22d86 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/Level.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
||||
@@ -1317,15 +1317,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||
ProfilerFiller gameprofilerfiller = this.getProfiler();
|
||||
|
||||
gameprofilerfiller.push("blockEntities");
|
||||
- this.timings.tileEntityPending.startTiming(); // Spigot
|
||||
+ //this.timings.tileEntityPending.startTiming(); // Spigot // Purpur
|
||||
this.tickingBlockEntities = true;
|
||||
if (!this.pendingBlockEntityTickers.isEmpty()) {
|
||||
this.blockEntityTickers.addAll(this.pendingBlockEntityTickers);
|
||||
this.pendingBlockEntityTickers.clear();
|
||||
}
|
||||
- this.timings.tileEntityPending.stopTiming(); // Spigot
|
||||
+ //this.timings.tileEntityPending.stopTiming(); // Spigot // Purpur
|
||||
|
||||
- this.timings.tileEntityTick.startTiming(); // Spigot
|
||||
+ //this.timings.tileEntityTick.startTiming(); // Spigot // Purpur
|
||||
// Spigot start
|
||||
// Iterator<TickingBlockEntity> iterator = this.blockEntityTickers.iterator();
|
||||
boolean flag = this.tickRateManager().runsNormally();
|
||||
@@ -1354,7 +1354,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||
}
|
||||
this.blockEntityTickers.removeAll(toRemove); // Paper - Fix MC-117075
|
||||
|
||||
- this.timings.tileEntityTick.stopTiming(); // Spigot
|
||||
+ //this.timings.tileEntityTick.stopTiming(); // Spigot // Purpur
|
||||
this.tickingBlockEntities = false;
|
||||
co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper
|
||||
gameprofilerfiller.pop();
|
||||
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
||||
index 661acdf4b1f33d150b0caf179e925d3162d7be35..78eb2d8ba58f2937c1145147e2d9e7de802e541e 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
||||
@@ -133,7 +133,7 @@ public final class NaturalSpawner {
|
||||
|
||||
public static void spawnForChunk(ServerLevel world, LevelChunk chunk, NaturalSpawner.SpawnState info, boolean spawnAnimals, boolean spawnMonsters, boolean rareSpawn) {
|
||||
world.getProfiler().push("spawner");
|
||||
- world.timings.mobSpawn.startTiming(); // Spigot
|
||||
+ //world.timings.mobSpawn.startTiming(); // Spigot // Purpur
|
||||
MobCategory[] aenumcreaturetype = NaturalSpawner.SPAWNING_CATEGORIES;
|
||||
int i = aenumcreaturetype.length;
|
||||
|
||||
@@ -186,7 +186,7 @@ public final class NaturalSpawner {
|
||||
}
|
||||
}
|
||||
|
||||
- world.timings.mobSpawn.stopTiming(); // Spigot
|
||||
+ //world.timings.mobSpawn.stopTiming(); // Spigot // Purpur
|
||||
world.getProfiler().pop();
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
||||
index d087c8271dbdfe3dc6d805539a710d37ed6d7f21..8b1f5d290efbebe5fb6fc90b6031356ea3e4cef3 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
||||
@@ -799,7 +799,7 @@ public class LevelChunk extends ChunkAccess {
|
||||
this.chunkHolder.getEntityChunk().callEntitiesLoadEvent(); // Paper - rewrite chunk system
|
||||
|
||||
if (this.needsDecoration) {
|
||||
- try (co.aikar.timings.Timing ignored = this.level.timings.chunkLoadPopulate.startTiming()) { // Paper
|
||||
+ //try (co.aikar.timings.Timing ignored = this.level.timings.chunkLoadPopulate.startTiming()) { // Paper // Purpur
|
||||
this.needsDecoration = false;
|
||||
java.util.Random random = new java.util.Random();
|
||||
random.setSeed(this.level.getSeed());
|
||||
@@ -819,7 +819,7 @@ public class LevelChunk extends ChunkAccess {
|
||||
}
|
||||
}
|
||||
server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk));
|
||||
- } // Paper
|
||||
+ //} // Paper // Purpur
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1177,7 +1177,7 @@ public class LevelChunk extends ChunkAccess {
|
||||
ProfilerFiller gameprofilerfiller = LevelChunk.this.level.getProfiler();
|
||||
|
||||
gameprofilerfiller.push(this::getType);
|
||||
- this.blockEntity.tickTimer.startTiming(); // Spigot
|
||||
+ //this.blockEntity.tickTimer.startTiming(); // Spigot // Purpur
|
||||
BlockState iblockdata = LevelChunk.this.getBlockState(blockposition);
|
||||
|
||||
if (this.blockEntity.getType().isValid(iblockdata)) {
|
||||
@@ -1204,7 +1204,7 @@ public class LevelChunk extends ChunkAccess {
|
||||
// Paper end - Prevent block entity and entity crashes
|
||||
// Spigot start
|
||||
} finally {
|
||||
- this.blockEntity.tickTimer.stopTiming();
|
||||
+ //this.blockEntity.tickTimer.stopTiming(); // Purpur
|
||||
// Spigot end
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
index c1e2d3a75b9d4710ab6d8b5c62af4bc136a2b668..ca8ae8e1c51b937dac916e0b0dc94b5e2e61efeb 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
@@ -515,10 +515,10 @@ public class CraftScheduler implements BukkitScheduler {
|
||||
this.runners.remove(task.getTaskId());
|
||||
}
|
||||
}
|
||||
- MinecraftTimings.bukkitSchedulerFinishTimer.startTiming(); // Paper
|
||||
+ //MinecraftTimings.bukkitSchedulerFinishTimer.startTiming(); // Paper // Purpur
|
||||
this.pending.addAll(temp);
|
||||
temp.clear();
|
||||
- MinecraftTimings.bukkitSchedulerFinishTimer.stopTiming(); // Paper
|
||||
+ //MinecraftTimings.bukkitSchedulerFinishTimer.stopTiming(); // Paper // Purpur
|
||||
//this.debugHead = this.debugHead.getNextHead(currentTick); // Paper
|
||||
}
|
||||
|
||||
@@ -561,7 +561,7 @@ public class CraftScheduler implements BukkitScheduler {
|
||||
}
|
||||
|
||||
void parsePending() { // Paper
|
||||
- if (!this.isAsyncScheduler) MinecraftTimings.bukkitSchedulerPendingTimer.startTiming(); // Paper
|
||||
+ //if (!this.isAsyncScheduler) MinecraftTimings.bukkitSchedulerPendingTimer.startTiming(); // Paper // Purpur
|
||||
CraftTask head = this.head;
|
||||
CraftTask task = head.getNext();
|
||||
CraftTask lastTask = head;
|
||||
@@ -580,7 +580,7 @@ public class CraftScheduler implements BukkitScheduler {
|
||||
task.setNext(null);
|
||||
}
|
||||
this.head = lastTask;
|
||||
- if (!this.isAsyncScheduler) MinecraftTimings.bukkitSchedulerPendingTimer.stopTiming(); // Paper
|
||||
+ //if (!this.isAsyncScheduler) MinecraftTimings.bukkitSchedulerPendingTimer.stopTiming(); // Paper // Purpur
|
||||
}
|
||||
|
||||
private boolean isReady(final int currentTick) {
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java
|
||||
index ea26d9464644b5217879b8c21b4da28e57708dcb..5835dc236b3f5291a804f7fb14a12eb466d4e0ba 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftTask.java
|
||||
@@ -96,13 +96,13 @@ public class CraftTask implements BukkitTask, Runnable { // Spigot
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
- try (Timing ignored = timings.startTiming()) { // Paper
|
||||
+ //try (Timing ignored = timings.startTiming()) { // Paper // Purpur
|
||||
if (this.rTask != null) {
|
||||
this.rTask.run();
|
||||
} else {
|
||||
this.cTask.accept(this);
|
||||
}
|
||||
- } // Paper
|
||||
+ //} // Paper // Purpur
|
||||
}
|
||||
|
||||
long getCreatedAt() {
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
||||
index b3e1adeb932da9b3bed16acd94e2f16da48a7c72..d3ec817e95628f1fc8be4a29c9a0f13c7d5fd552 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
||||
@@ -115,7 +115,7 @@ public final class CraftScoreboardManager implements ScoreboardManager {
|
||||
public void forAllObjectives(ObjectiveCriteria criteria, ScoreHolder holder, Consumer<ScoreAccess> consumer) {
|
||||
// Paper start - add timings for scoreboard search
|
||||
// plugins leaking scoreboards will make this very expensive, let server owners debug it easily
|
||||
- co.aikar.timings.MinecraftTimings.scoreboardScoreSearch.startTimingIfSync();
|
||||
+ //co.aikar.timings.MinecraftTimings.scoreboardScoreSearch.startTimingIfSync(); // Purpur
|
||||
try {
|
||||
// Paper end - add timings for scoreboard search
|
||||
for (CraftScoreboard scoreboard : this.scoreboards) {
|
||||
@@ -123,7 +123,7 @@ public final class CraftScoreboardManager implements ScoreboardManager {
|
||||
board.forAllObjectives(criteria, holder, (score) -> consumer.accept(score));
|
||||
}
|
||||
} finally { // Paper start - add timings for scoreboard search
|
||||
- co.aikar.timings.MinecraftTimings.scoreboardScoreSearch.stopTimingIfSync();
|
||||
+ //co.aikar.timings.MinecraftTimings.scoreboardScoreSearch.stopTimingIfSync(); // Purpur
|
||||
}
|
||||
// Paper end - add timings for scoreboard search
|
||||
}
|
||||
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
|
||||
index c63b7d5b442f2be5dadd529a2f4f65302e44e792..56e52b16b419c882440a15947f037ae1a902bc70 100644
|
||||
--- a/src/main/java/org/spigotmc/ActivationRange.java
|
||||
+++ b/src/main/java/org/spigotmc/ActivationRange.java
|
||||
@@ -172,7 +172,7 @@ public class ActivationRange
|
||||
*/
|
||||
public static void activateEntities(Level world)
|
||||
{
|
||||
- MinecraftTimings.entityActivationCheckTimer.startTiming();
|
||||
+ //MinecraftTimings.entityActivationCheckTimer.startTiming(); // Purpur
|
||||
final int miscActivationRange = world.spigotConfig.miscActivationRange;
|
||||
final int raiderActivationRange = world.spigotConfig.raiderActivationRange;
|
||||
final int animalActivationRange = world.spigotConfig.animalActivationRange;
|
||||
@@ -251,7 +251,7 @@ public class ActivationRange
|
||||
}
|
||||
// Paper end
|
||||
}
|
||||
- MinecraftTimings.entityActivationCheckTimer.stopTiming();
|
||||
+ //MinecraftTimings.entityActivationCheckTimer.stopTiming(); // Purpur
|
||||
}
|
||||
|
||||
/**
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,36 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Wed, 27 Jul 2022 00:42:39 -0500
|
||||
Subject: [PATCH] Add more logger output for invalid movement kicks
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
index fdbdaa1d8d5760c5c661cbeca803e8ff8ec46aac..872be72e24017fdcb3060f6e4e9a92c342d59fc1 100644
|
||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
@@ -733,6 +733,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||
if (packet.getId() == this.awaitingTeleport) {
|
||||
if (this.awaitingPositionFromClient == null) {
|
||||
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
|
||||
+ ServerGamePacketListenerImpl.LOGGER.warn("Disconnected on accept teleport packet. Was not expecting position data from client at this time"); // Purpur
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1364,8 +1365,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||
@Override
|
||||
public void handleMovePlayer(ServerboundMovePlayerPacket packet) {
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
- if (ServerGamePacketListenerImpl.containsInvalidValues(packet.getX(0.0D), packet.getY(0.0D), packet.getZ(0.0D), packet.getYRot(0.0F), packet.getXRot(0.0F))) {
|
||||
+ // Purpur start
|
||||
+ boolean invalidX = Double.isNaN(packet.getX(0.0D));
|
||||
+ boolean invalidY = Double.isNaN(packet.getY(0.0D));
|
||||
+ boolean invalidZ = Double.isNaN(packet.getZ(0.0D));
|
||||
+ boolean invalidYaw = !Floats.isFinite(packet.getYRot(0.0F));
|
||||
+ boolean invalidPitch = !Floats.isFinite(packet.getXRot(0.0F));
|
||||
+ if (invalidX || invalidY || invalidZ || invalidYaw || invalidPitch) {
|
||||
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
|
||||
+ ServerGamePacketListenerImpl.LOGGER.warn(String.format("Disconnected on move player packet. Invalid data: x=%b, y=%b, z=%b, yaw=%b, pitch=%b", invalidX, invalidY, invalidZ, invalidYaw, invalidPitch));
|
||||
+ // Purpur end
|
||||
} else {
|
||||
ServerLevel worldserver = this.player.serverLevel();
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: SageSphinx63920 <sage@sagesphinx63920.dev>
|
||||
Date: Mon, 25 Jul 2022 19:33:49 +0200
|
||||
Subject: [PATCH] Add Bee API
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java
|
||||
index c2dae3636145105ecb3ae950e07095f278f72ac2..997ab942be9f742804041b07d607e7dd6473ba96 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java
|
||||
@@ -814,6 +814,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
if (optional.isPresent()) {
|
||||
Bee.this.savedFlowerPos = (BlockPos) optional.get();
|
||||
Bee.this.navigation.moveTo((double) Bee.this.savedFlowerPos.getX() + 0.5D, (double) Bee.this.savedFlowerPos.getY() + 0.5D, (double) Bee.this.savedFlowerPos.getZ() + 0.5D, 1.2000000476837158D);
|
||||
+ new org.purpurmc.purpur.event.entity.BeeFoundFlowerEvent((org.bukkit.entity.Bee) Bee.this.getBukkitEntity(), io.papermc.paper.util.MCUtil.toLocation(Bee.this.level(), Bee.this.savedFlowerPos)).callEvent(); // Purpur
|
||||
return true;
|
||||
} else {
|
||||
Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60);
|
||||
@@ -870,6 +871,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
this.pollinating = false;
|
||||
Bee.this.navigation.stop();
|
||||
Bee.this.remainingCooldownBeforeLocatingNewFlower = 200;
|
||||
+ new org.purpurmc.purpur.event.entity.BeeStopPollinatingEvent((org.bukkit.entity.Bee) Bee.this.getBukkitEntity(), Bee.this.savedFlowerPos == null ? null : io.papermc.paper.util.MCUtil.toLocation(Bee.this.level(), Bee.this.savedFlowerPos), Bee.this.hasNectar()).callEvent(); // Purpur
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -916,6 +918,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
this.setWantedPos();
|
||||
}
|
||||
|
||||
+ if (this.successfulPollinatingTicks == 0) new org.purpurmc.purpur.event.entity.BeeStartedPollinatingEvent((org.bukkit.entity.Bee) Bee.this.getBukkitEntity(), io.papermc.paper.util.MCUtil.toLocation(Bee.this.level(), Bee.this.savedFlowerPos)).callEvent(); // Purpur
|
||||
++this.successfulPollinatingTicks;
|
||||
if (Bee.this.random.nextFloat() < 0.05F && this.successfulPollinatingTicks > this.lastSoundPlayedTick + 60) {
|
||||
this.lastSoundPlayedTick = this.successfulPollinatingTicks;
|
||||
@@ -1,148 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: YouHaveTrouble <youhavetrouble@youhavetrouble.me>
|
||||
Date: Sat, 23 Jul 2022 14:40:38 +0200
|
||||
Subject: [PATCH] Debug Marker API
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
index 14e60675d23f9696fd8f64eb026fcd0b82b498f0..659450d3538cc1499fd427868159e8c32b007dd2 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
@@ -1600,6 +1600,42 @@ public final class CraftServer implements Server {
|
||||
public void removeFuel(org.bukkit.Material material) {
|
||||
net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity.removeFuel(net.minecraft.world.item.ItemStack.fromBukkitCopy(new ItemStack(material)));
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration) {
|
||||
+ sendBlockHighlight(location, duration, "", 0x6400FF00);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, int argb) {
|
||||
+ sendBlockHighlight(location, duration, "", argb);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text) {
|
||||
+ sendBlockHighlight(location, duration, text, 0x6400FF00);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text, int argb) {
|
||||
+ this.worlds.forEach((name, world) -> world.sendBlockHighlight(location, duration, text, argb));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, org.bukkit.Color color, int transparency) {
|
||||
+ sendBlockHighlight(location, duration, "", color, transparency);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text, org.bukkit.Color color, int transparency) {
|
||||
+ if (transparency < 0 || transparency > 255) throw new IllegalArgumentException("transparency is outside of 0-255 range");
|
||||
+ sendBlockHighlight(location, duration, text, transparency << 24 | color.asRGB());
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void clearBlockHighlights() {
|
||||
+ this.worlds.forEach((name, world) -> clearBlockHighlights());
|
||||
+ }
|
||||
// Purpur End
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
index 06abe25b335606b42ac2a7b5551f0c9e7143a474..69c12d9049af908380c48c7f13d3d5c7220f8e39 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
||||
@@ -2420,6 +2420,42 @@ public class CraftWorld extends CraftRegionAccessor implements World {
|
||||
public float getLocalDifficultyAt(Location location) {
|
||||
return getHandle().getCurrentDifficultyAt(io.papermc.paper.util.MCUtil.toBlockPosition(location)).getEffectiveDifficulty();
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration) {
|
||||
+ sendBlockHighlight(location, duration, "", 0x6400FF00);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, int argb) {
|
||||
+ sendBlockHighlight(location, duration, "", argb);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text) {
|
||||
+ sendBlockHighlight(location, duration, text, 0x6400FF00);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text, int argb) {
|
||||
+ net.minecraft.network.protocol.game.DebugPackets.sendGameTestAddMarker(getHandle(), io.papermc.paper.util.MCUtil.toBlockPosition(location), text, argb, duration);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, org.bukkit.Color color, int transparency) {
|
||||
+ sendBlockHighlight(location, duration, "", color, transparency);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text, org.bukkit.Color color, int transparency) {
|
||||
+ if (transparency < 0 || transparency > 255) throw new IllegalArgumentException("transparency is outside of 0-255 range");
|
||||
+ sendBlockHighlight(location, duration, text, transparency << 24 | color.asRGB());
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void clearBlockHighlights() {
|
||||
+ net.minecraft.network.protocol.game.DebugPackets.sendGameTestClearPacket(getHandle());
|
||||
+ }
|
||||
// Purpur end
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
index 4a04c56371a2d9772fb542ffac5b9b98cbf1e86a..9d2b39e871c83ab7af9c2cbde08e560006fcb005 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
@@ -3508,5 +3508,43 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||
public void resetIdleTimer() {
|
||||
getHandle().resetLastActionTime();
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration) {
|
||||
+ sendBlockHighlight(location, duration, "", 0x6400FF00);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, int argb) {
|
||||
+ sendBlockHighlight(location, duration, "", argb);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text) {
|
||||
+ sendBlockHighlight(location, duration, text, 0x6400FF00);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text, int argb) {
|
||||
+ if (this.getHandle().connection == null) return;
|
||||
+ this.getHandle().connection.send(new net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket(new net.minecraft.network.protocol.common.custom.GameTestAddMarkerDebugPayload(io.papermc.paper.util.MCUtil.toBlockPosition(location), argb, text, duration)));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, org.bukkit.Color color, int transparency) {
|
||||
+ sendBlockHighlight(location, duration, "", color, transparency);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendBlockHighlight(Location location, int duration, String text, org.bukkit.Color color, int transparency) {
|
||||
+ if (transparency < 0 || transparency > 255) throw new IllegalArgumentException("transparency is outside of 0-255 range");
|
||||
+ sendBlockHighlight(location, duration, text, transparency << 24 | color.asRGB());
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void clearBlockHighlights() {
|
||||
+ if (this.getHandle().connection == null) return;
|
||||
+ this.getHandle().connection.send(new net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket(new net.minecraft.network.protocol.common.custom.GameTestClearMarkersDebugPayload()));
|
||||
+ }
|
||||
// Purpur end
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: granny <granny@purpurmc.org>
|
||||
Date: Fri, 26 Aug 2022 22:44:41 -0700
|
||||
Subject: [PATCH] mob spawning option to ignore creative players
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
||||
index d657de0bcc0684d1ba49ddad4db35e0e23fac108..a2026900948e9157cb35ba0183dc3af20c63214f 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
|
||||
@@ -258,7 +258,7 @@ public final class NaturalSpawner {
|
||||
blockposition_mutableblockposition.set(l, i, i1);
|
||||
double d0 = (double) l + 0.5D;
|
||||
double d1 = (double) i1 + 0.5D;
|
||||
- Player entityhuman = world.getNearestPlayer(d0, (double) i, d1, -1.0D, false);
|
||||
+ Player entityhuman = world.getNearestPlayer(d0, (double) i, d1, -1.0D, world.purpurConfig.mobSpawningIgnoreCreativePlayers); // Purpur
|
||||
|
||||
if (entityhuman != null) {
|
||||
double d2 = entityhuman.distanceToSqr(d0, (double) i, d1);
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 7d0d298bd68ecba2ba1e2f3336d9aad4567dfde2..d790f742b47093f4e393cc7d60fc7c5c13c20fd1 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -377,6 +377,7 @@ public class PurpurWorldConfig {
|
||||
public boolean phantomSpawning;
|
||||
public boolean villagerTraderSpawning;
|
||||
public boolean villageSiegeSpawning;
|
||||
+ public boolean mobSpawningIgnoreCreativePlayers = false;
|
||||
private void mobSpawnerSettings() {
|
||||
// values of "default" or null will default to true only if the world environment is normal (aka overworld)
|
||||
Predicate<Boolean> predicate = (bool) -> (bool != null && bool) || (bool == null && environment == World.Environment.NORMAL);
|
||||
@@ -385,6 +386,7 @@ public class PurpurWorldConfig {
|
||||
phantomSpawning = getBoolean("gameplay-mechanics.mob-spawning.phantoms", predicate);
|
||||
villagerTraderSpawning = getBoolean("gameplay-mechanics.mob-spawning.wandering-traders", predicate);
|
||||
villageSiegeSpawning = getBoolean("gameplay-mechanics.mob-spawning.village-sieges", predicate);
|
||||
+ mobSpawningIgnoreCreativePlayers = getBoolean("gameplay-mechanics.mob-spawning.ignore-creative-players", mobSpawningIgnoreCreativePlayers);
|
||||
}
|
||||
|
||||
public boolean disableObserverClocks = false;
|
||||
@@ -1,51 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Fri, 2 Sep 2022 13:04:53 -0500
|
||||
Subject: [PATCH] Add skeleton bow accuracy option
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
||||
index cb378b343f721c16868a6673aba59856574c7133..a00646bc8a9caefe56e48b7682e8fb0c464b81fa 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
||||
@@ -182,7 +182,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
|
||||
double d2 = target.getZ() - this.getZ();
|
||||
double d3 = Math.sqrt(d0 * d0 + d2 * d2);
|
||||
|
||||
- entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level().getDifficulty().getId() * 4));
|
||||
+ entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, this.level().purpurConfig.skeletonBowAccuracyMap.getOrDefault(this.level().getDifficulty().getId(), (float) (14 - this.level().getDifficulty().getId() * 4))); // Purpur
|
||||
// CraftBukkit start
|
||||
org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), entityarrow.getPickupItem(), entityarrow, net.minecraft.world.InteractionHand.MAIN_HAND, 0.8F, true); // Paper
|
||||
if (event.isCancelled()) {
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index d790f742b47093f4e393cc7d60fc7c5c13c20fd1..5b12c08a1d8e6f62c5653c95071a1d36d735d039 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -2502,6 +2502,8 @@ public class PurpurWorldConfig {
|
||||
public boolean skeletonAlwaysDropExp = false;
|
||||
public double skeletonHeadVisibilityPercent = 0.5D;
|
||||
public int skeletonFeedWitherRoses = 0;
|
||||
+ public String skeletonBowAccuracy = "14 - difficulty * 4";
|
||||
+ public Map<Integer, Float> skeletonBowAccuracyMap = new HashMap<>();
|
||||
private void skeletonSettings() {
|
||||
skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable);
|
||||
skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater);
|
||||
@@ -2516,6 +2518,18 @@ public class PurpurWorldConfig {
|
||||
skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp);
|
||||
skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent);
|
||||
skeletonFeedWitherRoses = getInt("mobs.skeleton.feed-wither-roses", skeletonFeedWitherRoses);
|
||||
+ final String defaultSkeletonBowAccuracy = skeletonBowAccuracy;
|
||||
+ skeletonBowAccuracy = getString("mobs.skeleton.bow-accuracy", skeletonBowAccuracy);
|
||||
+ for (int i = 1; i < 4; i++) {
|
||||
+ final float divergence;
|
||||
+ try {
|
||||
+ divergence = ((Number) Entity.scriptEngine.eval("let difficulty = " + i + "; " + skeletonBowAccuracy)).floatValue();
|
||||
+ } catch (javax.script.ScriptException e) {
|
||||
+ e.printStackTrace();
|
||||
+ break;
|
||||
+ }
|
||||
+ skeletonBowAccuracyMap.put(i, divergence);
|
||||
+ }
|
||||
}
|
||||
|
||||
public boolean skeletonHorseRidable = false;
|
||||
@@ -1,63 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Tue, 20 Sep 2022 17:56:21 -0500
|
||||
Subject: [PATCH] Allay respect item NBT
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java
|
||||
index 9bf06cf7b3706f8883e1a0ceac8b1aebb52ba475..c783ce59ea766e6c46a3313628b961f27e01ee8b 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java
|
||||
@@ -406,9 +406,31 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS
|
||||
|
||||
@Override
|
||||
public boolean wantsToPickUp(ItemStack stack) {
|
||||
- ItemStack itemstack1 = this.getItemInHand(InteractionHand.MAIN_HAND);
|
||||
-
|
||||
- return !itemstack1.isEmpty() && this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.inventory.canAddItem(stack) && this.allayConsidersItemEqual(itemstack1, stack);
|
||||
+ // Purpur start
|
||||
+ if (!this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ ItemStack itemStack = this.getItemInHand(InteractionHand.MAIN_HAND);
|
||||
+ if (itemStack.isEmpty()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if (!allayConsidersItemEqual(itemStack, stack)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if (!this.inventory.canAddItem(stack)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ for (String tag : this.level().purpurConfig.allayRespectNBT) {
|
||||
+ if (stack.hasTag() && itemStack.hasTag()) {
|
||||
+ Tag tag1 = stack.getTag().get(tag);
|
||||
+ Tag tag2 = itemStack.getTag().get(tag);
|
||||
+ if (!Objects.equals(tag1, tag2)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return true;
|
||||
+ // Purpur end
|
||||
}
|
||||
|
||||
private boolean allayConsidersItemEqual(ItemStack stack, ItemStack stack2) {
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 5b12c08a1d8e6f62c5653c95071a1d36d735d039..94e29919ddc7f507d54e14c3360f7a3e8bb831a7 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -1138,10 +1138,13 @@ public class PurpurWorldConfig {
|
||||
public boolean allayRidable = false;
|
||||
public boolean allayRidableInWater = true;
|
||||
public boolean allayControllable = true;
|
||||
+ public List<String> allayRespectNBT = new ArrayList<>();
|
||||
private void allaySettings() {
|
||||
allayRidable = getBoolean("mobs.allay.ridable", allayRidable);
|
||||
allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater);
|
||||
allayControllable = getBoolean("mobs.allay.controllable", allayControllable);
|
||||
+ allayRespectNBT.clear();
|
||||
+ getList("mobs.allay.respect-nbt", new ArrayList<>()).forEach(key -> allayRespectNBT.add(key.toString()));
|
||||
}
|
||||
|
||||
public boolean axolotlRidable = false;
|
||||
@@ -1,22 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: MelnCat <melncatuwu@gmail.com>
|
||||
Date: Fri, 23 Sep 2022 18:41:05 -0700
|
||||
Subject: [PATCH] Add death screen API
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
index 9d2b39e871c83ab7af9c2cbde08e560006fcb005..fb2d05e43df3bfb72b1f6e325736dd3cbc6c3096 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
||||
@@ -3546,5 +3546,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||
if (this.getHandle().connection == null) return;
|
||||
this.getHandle().connection.send(new net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket(new net.minecraft.network.protocol.common.custom.GameTestClearMarkersDebugPayload()));
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendDeathScreen(net.kyori.adventure.text.Component message) {
|
||||
+ if (this.getHandle().connection == null) return;
|
||||
+ this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket(getEntityId(), io.papermc.paper.adventure.PaperAdventure.asVanilla(message)));
|
||||
+ }
|
||||
// Purpur end
|
||||
}
|
||||
@@ -1,360 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Mon, 26 Sep 2022 07:43:30 -0500
|
||||
Subject: [PATCH] Implement ram and rambar commands
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
||||
index 48a4f26eec06777b4ae165db6566c1f6198527fd..b6cc108c2d4361e6f415cfc3ff8c7699a8e222f4 100644
|
||||
--- a/src/main/java/net/minecraft/commands/Commands.java
|
||||
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
||||
@@ -256,6 +256,8 @@ public class Commands {
|
||||
org.purpurmc.purpur.command.UptimeCommand.register(this.dispatcher); // Purpur
|
||||
org.purpurmc.purpur.command.TPSBarCommand.register(this.dispatcher); // Purpur
|
||||
org.purpurmc.purpur.command.CompassCommand.register(this.dispatcher); // Purpur
|
||||
+ org.purpurmc.purpur.command.RamBarCommand.register(this.dispatcher); // Purpur
|
||||
+ org.purpurmc.purpur.command.RamCommand.register(this.dispatcher); // Purpur
|
||||
}
|
||||
|
||||
if (environment.includeIntegrated) {
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
index d78c2348160795fcc9ff23b448e7d3c48f34c272..305b90d10a499e9731f5178433fb10207e428091 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -284,6 +284,7 @@ public class ServerPlayer extends Player {
|
||||
public boolean purpurClient = false; // Purpur
|
||||
private boolean tpsBar = false; // Purpur
|
||||
private boolean compassBar = false; // Purpur
|
||||
+ private boolean ramBar = false; // Purpur
|
||||
|
||||
// Paper start - replace player chunk loader
|
||||
private final java.util.concurrent.atomic.AtomicReference<io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances> viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1));
|
||||
@@ -571,6 +572,7 @@ public class ServerPlayer extends Player {
|
||||
}
|
||||
}
|
||||
|
||||
+ if (nbt.contains("Purpur.RamBar")) { this.ramBar = nbt.getBoolean("Purpur.RamBar"); } // Purpur
|
||||
if (nbt.contains("Purpur.TPSBar")) { this.tpsBar = nbt.getBoolean("Purpur.TPSBar"); } // Purpur
|
||||
if (nbt.contains("Purpur.CompassBar")) { this.compassBar = nbt.getBoolean("Purpur.CompassBar"); } // Purpur
|
||||
}
|
||||
@@ -639,6 +641,7 @@ public class ServerPlayer extends Player {
|
||||
}
|
||||
this.getBukkitEntity().setExtraData(nbt); // CraftBukkit
|
||||
|
||||
+ nbt.putBoolean("Purpur.RamBar", this.ramBar); // Purpur
|
||||
nbt.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur
|
||||
nbt.putBoolean("Purpur.CompassBar", this.compassBar); // Purpur
|
||||
}
|
||||
@@ -2915,5 +2918,13 @@ public class ServerPlayer extends Player {
|
||||
public void compassBar(boolean compassBar) {
|
||||
this.compassBar = compassBar;
|
||||
}
|
||||
+
|
||||
+ public boolean ramBar() {
|
||||
+ return this.ramBar;
|
||||
+ }
|
||||
+
|
||||
+ public void ramBar(boolean ramBar) {
|
||||
+ this.ramBar = ramBar;
|
||||
+ }
|
||||
// Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index b55a4366f69a1f259d5d7aed01764aec14a1dbb2..5313ba91ffc625b27d5bb99395f0e719829f6bda 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -182,6 +182,8 @@ public class PurpurConfig {
|
||||
public static String creditsCommandOutput = "<green>%s has been shown the end credits";
|
||||
public static String demoCommandOutput = "<green>%s has been shown the demo screen";
|
||||
public static String pingCommandOutput = "<green>%s's ping is %sms";
|
||||
+ public static String ramCommandOutput = "<green>Ram Usage: <used>/<xmx> (<percent>)";
|
||||
+ public static String rambarCommandOutput = "<green>Rambar toggled <onoff> for <target>";
|
||||
public static String tpsbarCommandOutput = "<green>Tpsbar toggled <onoff> for <target>";
|
||||
public static String dontRunWithScissors = "<red><italic>Don't run with scissors!";
|
||||
public static String uptimeCommandOutput = "<green>Server uptime is <uptime>";
|
||||
@@ -199,6 +201,8 @@ public class PurpurConfig {
|
||||
creditsCommandOutput = getString("settings.messages.credits-command-output", creditsCommandOutput);
|
||||
demoCommandOutput = getString("settings.messages.demo-command-output", demoCommandOutput);
|
||||
pingCommandOutput = getString("settings.messages.ping-command-output", pingCommandOutput);
|
||||
+ ramCommandOutput = getString("settings.messages.ram-command-output", ramCommandOutput);
|
||||
+ rambarCommandOutput = getString("settings.messages.rambar-command-output", rambarCommandOutput);
|
||||
tpsbarCommandOutput = getString("settings.messages.tpsbar-command-output", tpsbarCommandOutput);
|
||||
dontRunWithScissors = getString("settings.messages.dont-run-with-scissors", dontRunWithScissors);
|
||||
uptimeCommandOutput = getString("settings.messages.uptime-command-output", uptimeCommandOutput);
|
||||
@@ -247,6 +251,15 @@ public class PurpurConfig {
|
||||
disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops);
|
||||
}
|
||||
|
||||
+ public static String commandRamBarTitle = "<gray>Ram<yellow>:</yellow> <used>/<xmx> (<percent>)";
|
||||
+ public static BossBar.Overlay commandRamBarProgressOverlay = BossBar.Overlay.NOTCHED_20;
|
||||
+ public static BossBar.Color commandRamBarProgressColorGood = BossBar.Color.GREEN;
|
||||
+ public static BossBar.Color commandRamBarProgressColorMedium = BossBar.Color.YELLOW;
|
||||
+ public static BossBar.Color commandRamBarProgressColorLow = BossBar.Color.RED;
|
||||
+ public static String commandRamBarTextColorGood = "<gradient:#55ff55:#00aa00><text></gradient>";
|
||||
+ public static String commandRamBarTextColorMedium = "<gradient:#ffff55:#ffaa00><text></gradient>";
|
||||
+ public static String commandRamBarTextColorLow = "<gradient:#ff5555:#aa0000><text></gradient>";
|
||||
+ public static int commandRamBarTickInterval = 20;
|
||||
public static String commandTPSBarTitle = "<gray>TPS<yellow>:</yellow> <tps> MSPT<yellow>:</yellow> <mspt> Ping<yellow>:</yellow> <ping>ms";
|
||||
public static BossBar.Overlay commandTPSBarProgressOverlay = BossBar.Overlay.NOTCHED_20;
|
||||
public static TPSBarTask.FillMode commandTPSBarProgressFillMode = TPSBarTask.FillMode.MSPT;
|
||||
@@ -274,6 +287,16 @@ public class PurpurConfig {
|
||||
public static String uptimeSecond = "%02d second";
|
||||
public static String uptimeSeconds = "%02d seconds";
|
||||
private static void commandSettings() {
|
||||
+ commandRamBarTitle = getString("settings.command.rambar.title", commandRamBarTitle);
|
||||
+ commandRamBarProgressOverlay = BossBar.Overlay.valueOf(getString("settings.command.rambar.overlay", commandRamBarProgressOverlay.name()));
|
||||
+ commandRamBarProgressColorGood = BossBar.Color.valueOf(getString("settings.command.rambar.progress-color.good", commandRamBarProgressColorGood.name()));
|
||||
+ commandRamBarProgressColorMedium = BossBar.Color.valueOf(getString("settings.command.rambar.progress-color.medium", commandRamBarProgressColorMedium.name()));
|
||||
+ commandRamBarProgressColorLow = BossBar.Color.valueOf(getString("settings.command.rambar.progress-color.low", commandRamBarProgressColorLow.name()));
|
||||
+ commandRamBarTextColorGood = getString("settings.command.rambar.text-color.good", commandRamBarTextColorGood);
|
||||
+ commandRamBarTextColorMedium = getString("settings.command.rambar.text-color.medium", commandRamBarTextColorMedium);
|
||||
+ commandRamBarTextColorLow = getString("settings.command.rambar.text-color.low", commandRamBarTextColorLow);
|
||||
+ commandRamBarTickInterval = getInt("settings.command.rambar.tick-interval", commandRamBarTickInterval);
|
||||
+
|
||||
commandTPSBarTitle = getString("settings.command.tpsbar.title", commandTPSBarTitle);
|
||||
commandTPSBarProgressOverlay = BossBar.Overlay.valueOf(getString("settings.command.tpsbar.overlay", commandTPSBarProgressOverlay.name()));
|
||||
commandTPSBarProgressFillMode = TPSBarTask.FillMode.valueOf(getString("settings.command.tpsbar.fill-mode", commandTPSBarProgressFillMode.name()));
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/command/RamBarCommand.java b/src/main/java/org/purpurmc/purpur/command/RamBarCommand.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..2852c07adb080c34905f5d1b19efed8ea47eecc6
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/purpurmc/purpur/command/RamBarCommand.java
|
||||
@@ -0,0 +1,44 @@
|
||||
+package org.purpurmc.purpur.command;
|
||||
+
|
||||
+import com.mojang.brigadier.CommandDispatcher;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import net.kyori.adventure.text.format.NamedTextColor;
|
||||
+import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
+import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
+import net.minecraft.commands.CommandSourceStack;
|
||||
+import net.minecraft.commands.Commands;
|
||||
+import net.minecraft.commands.arguments.EntityArgument;
|
||||
+import net.minecraft.server.level.ServerPlayer;
|
||||
+import org.purpurmc.purpur.PurpurConfig;
|
||||
+import org.purpurmc.purpur.task.RamBarTask;
|
||||
+
|
||||
+import java.util.Collection;
|
||||
+import java.util.Collections;
|
||||
+
|
||||
+public class RamBarCommand {
|
||||
+ public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
|
||||
+ dispatcher.register(Commands.literal("rambar")
|
||||
+ .requires(listener -> listener.hasPermission(2, "bukkit.command.rambar"))
|
||||
+ .executes(context -> execute(context.getSource(), Collections.singleton(context.getSource().getPlayerOrException())))
|
||||
+ .then(Commands.argument("targets", EntityArgument.players())
|
||||
+ .requires(listener -> listener.hasPermission(2, "bukkit.command.rambar.other"))
|
||||
+ .executes((context) -> execute(context.getSource(), EntityArgument.getPlayers(context, "targets")))
|
||||
+ )
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ private static int execute(CommandSourceStack sender, Collection<ServerPlayer> targets) {
|
||||
+ for (ServerPlayer player : targets) {
|
||||
+ boolean result = RamBarTask.instance().togglePlayer(player.getBukkitEntity());
|
||||
+ player.ramBar(result);
|
||||
+
|
||||
+ Component output = MiniMessage.miniMessage().deserialize(PurpurConfig.rambarCommandOutput,
|
||||
+ Placeholder.component("onoff", Component.translatable(result ? "options.on" : "options.off")
|
||||
+ .color(result ? NamedTextColor.GREEN : NamedTextColor.RED)),
|
||||
+ Placeholder.parsed("target", player.getGameProfile().getName()));
|
||||
+
|
||||
+ sender.sendSuccess(output, false);
|
||||
+ }
|
||||
+ return targets.size();
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/command/RamCommand.java b/src/main/java/org/purpurmc/purpur/command/RamCommand.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..992f8dfc628c7485e335191e1308cdfd4eedfbe8
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/purpurmc/purpur/command/RamCommand.java
|
||||
@@ -0,0 +1,30 @@
|
||||
+package org.purpurmc.purpur.command;
|
||||
+
|
||||
+import com.mojang.brigadier.CommandDispatcher;
|
||||
+import io.papermc.paper.adventure.PaperAdventure;
|
||||
+import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
+import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
+import net.minecraft.commands.CommandSourceStack;
|
||||
+import net.minecraft.commands.Commands;
|
||||
+import org.purpurmc.purpur.PurpurConfig;
|
||||
+import org.purpurmc.purpur.task.RamBarTask;
|
||||
+
|
||||
+public class RamCommand {
|
||||
+ public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
|
||||
+ dispatcher.register(Commands.literal("ram")
|
||||
+ .requires(listener -> listener.hasPermission(2, "bukkit.command.ram"))
|
||||
+ .executes(context -> {
|
||||
+ CommandSourceStack sender = context.getSource();
|
||||
+ RamBarTask ramBar = RamBarTask.instance();
|
||||
+ sender.sendSuccess(() -> PaperAdventure.asVanilla(MiniMessage.miniMessage().deserialize(PurpurConfig.ramCommandOutput,
|
||||
+ Placeholder.component("allocated", ramBar.format(ramBar.getAllocated())),
|
||||
+ Placeholder.component("used", ramBar.format(ramBar.getUsed())),
|
||||
+ Placeholder.component("xmx", ramBar.format(ramBar.getXmx())),
|
||||
+ Placeholder.component("xms", ramBar.format(ramBar.getXms())),
|
||||
+ Placeholder.unparsed("percent", ((int) (ramBar.getPercent() * 100)) + "%")
|
||||
+ )), false);
|
||||
+ return 1;
|
||||
+ })
|
||||
+ );
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/task/BossBarTask.java b/src/main/java/org/purpurmc/purpur/task/BossBarTask.java
|
||||
index d333334f323049ca97e756324cff0b23eddacd2a..114f273dd7f8b8a3c02f0651f6944859b33a65d4 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/task/BossBarTask.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/task/BossBarTask.java
|
||||
@@ -89,17 +89,22 @@ public abstract class BossBarTask extends BukkitRunnable {
|
||||
}
|
||||
|
||||
public static void startAll() {
|
||||
+ RamBarTask.instance().start();
|
||||
TPSBarTask.instance().start();
|
||||
CompassTask.instance().start();
|
||||
}
|
||||
|
||||
public static void stopAll() {
|
||||
+ RamBarTask.instance().stop();
|
||||
TPSBarTask.instance().stop();
|
||||
CompassTask.instance().stop();
|
||||
}
|
||||
|
||||
public static void addToAll(ServerPlayer player) {
|
||||
Player bukkit = player.getBukkitEntity();
|
||||
+ if (player.ramBar()) {
|
||||
+ RamBarTask.instance().addPlayer(bukkit);
|
||||
+ }
|
||||
if (player.tpsBar()) {
|
||||
TPSBarTask.instance().addPlayer(bukkit);
|
||||
}
|
||||
@@ -109,6 +114,7 @@ public abstract class BossBarTask extends BukkitRunnable {
|
||||
}
|
||||
|
||||
public static void removeFromAll(Player player) {
|
||||
+ RamBarTask.instance().removePlayer(player);
|
||||
TPSBarTask.instance().removePlayer(player);
|
||||
CompassTask.instance().removePlayer(player);
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/task/RamBarTask.java b/src/main/java/org/purpurmc/purpur/task/RamBarTask.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..8e98c0ae73e2c40002a72b5d0d246ffa0c3ab38f
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/purpurmc/purpur/task/RamBarTask.java
|
||||
@@ -0,0 +1,117 @@
|
||||
+package org.purpurmc.purpur.task;
|
||||
+
|
||||
+import net.kyori.adventure.bossbar.BossBar;
|
||||
+import net.kyori.adventure.text.Component;
|
||||
+import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
+import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
+import org.bukkit.entity.Player;
|
||||
+import org.purpurmc.purpur.PurpurConfig;
|
||||
+
|
||||
+import java.lang.management.ManagementFactory;
|
||||
+import java.lang.management.MemoryUsage;
|
||||
+
|
||||
+public class RamBarTask extends BossBarTask {
|
||||
+ private static RamBarTask instance;
|
||||
+ private long allocated = 0L;
|
||||
+ private long used = 0L;
|
||||
+ private long xmx = 0L;
|
||||
+ private long xms = 0L;
|
||||
+ private float percent = 0F;
|
||||
+ private int tick = 0;
|
||||
+
|
||||
+ public static RamBarTask instance() {
|
||||
+ if (instance == null) {
|
||||
+ instance = new RamBarTask();
|
||||
+ }
|
||||
+ return instance;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ BossBar createBossBar() {
|
||||
+ return BossBar.bossBar(Component.text(""), 0.0F, instance().getBossBarColor(), PurpurConfig.commandRamBarProgressOverlay);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ void updateBossBar(BossBar bossbar, Player player) {
|
||||
+ bossbar.progress(getBossBarProgress());
|
||||
+ bossbar.color(getBossBarColor());
|
||||
+ bossbar.name(MiniMessage.miniMessage().deserialize(PurpurConfig.commandRamBarTitle,
|
||||
+ Placeholder.component("allocated", format(this.allocated)),
|
||||
+ Placeholder.component("used", format(this.used)),
|
||||
+ Placeholder.component("xmx", format(this.xmx)),
|
||||
+ Placeholder.component("xms", format(this.xms)),
|
||||
+ Placeholder.unparsed("percent", ((int) (this.percent * 100)) + "%")
|
||||
+ ));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void run() {
|
||||
+ if (++this.tick < PurpurConfig.commandRamBarTickInterval) {
|
||||
+ return;
|
||||
+ }
|
||||
+ this.tick = 0;
|
||||
+
|
||||
+ MemoryUsage heap = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
|
||||
+
|
||||
+ this.allocated = heap.getCommitted();
|
||||
+ this.used = heap.getUsed();
|
||||
+ this.xmx = heap.getMax();
|
||||
+ this.xms = heap.getInit();
|
||||
+ this.percent = Math.max(Math.min((float) this.used / this.xmx, 1.0F), 0.0F);
|
||||
+
|
||||
+ super.run();
|
||||
+ }
|
||||
+
|
||||
+ private float getBossBarProgress() {
|
||||
+ return this.percent;
|
||||
+ }
|
||||
+
|
||||
+ private BossBar.Color getBossBarColor() {
|
||||
+ if (this.percent < 0.5F) {
|
||||
+ return PurpurConfig.commandRamBarProgressColorGood;
|
||||
+ } else if (this.percent < 0.75F) {
|
||||
+ return PurpurConfig.commandRamBarProgressColorMedium;
|
||||
+ } else {
|
||||
+ return PurpurConfig.commandRamBarProgressColorLow;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public Component format(long v) {
|
||||
+ String color;
|
||||
+ if (this.percent < 0.60F) {
|
||||
+ color = PurpurConfig.commandRamBarTextColorGood;
|
||||
+ } else if (this.percent < 0.85F) {
|
||||
+ color = PurpurConfig.commandRamBarTextColorMedium;
|
||||
+ } else {
|
||||
+ color = PurpurConfig.commandRamBarTextColorLow;
|
||||
+ }
|
||||
+ String value;
|
||||
+ if (v < 1024) {
|
||||
+ value = v + "B";
|
||||
+ } else {
|
||||
+ int z = (63 - Long.numberOfLeadingZeros(v)) / 10;
|
||||
+ value = String.format("%.1f%s", (double) v / (1L << (z * 10)), "BKMGTPE".charAt(z));
|
||||
+ }
|
||||
+ return MiniMessage.miniMessage().deserialize(color, Placeholder.unparsed("text", value));
|
||||
+ }
|
||||
+
|
||||
+ public long getAllocated() {
|
||||
+ return this.allocated;
|
||||
+ }
|
||||
+
|
||||
+ public long getUsed() {
|
||||
+ return this.used;
|
||||
+ }
|
||||
+
|
||||
+ public long getXmx() {
|
||||
+ return this.xmx;
|
||||
+ }
|
||||
+
|
||||
+ public long getXms() {
|
||||
+ return this.xms;
|
||||
+ }
|
||||
+
|
||||
+ public float getPercent() {
|
||||
+ return this.percent;
|
||||
+ }
|
||||
+}
|
||||
@@ -1,43 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: MelnCat <melncatuwu@gmail.com>
|
||||
Date: Sat, 1 Oct 2022 13:29:17 -0700
|
||||
Subject: [PATCH] Configurable block blast resistance
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
|
||||
index 63c4d52c348d9297a24abb17e105b2f4c7758740..d38d8fc7ef22fb68e867cc29dab1171c9aa6ac35 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java
|
||||
@@ -84,7 +84,7 @@ public abstract class BlockBehaviour implements FeatureElement {
|
||||
|
||||
protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP};
|
||||
public final boolean hasCollision;
|
||||
- protected final float explosionResistance;
|
||||
+ public float explosionResistance; // Purpur - protected final -> public
|
||||
protected final boolean isRandomlyTicking;
|
||||
protected final SoundType soundType;
|
||||
protected final float friction;
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index 88763ca8cc31bda23f8f31d2bc990fb4a85c9955..b13635ec623c80b1c32f2a6c11680dae899e8ec7 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -578,4 +578,19 @@ public class PurpurConfig {
|
||||
private static void fixProjectileLootingTransfer() {
|
||||
fixProjectileLootingTransfer = getBoolean("settings.fix-projectile-looting-transfer", fixProjectileLootingTransfer);
|
||||
}
|
||||
+
|
||||
+ private static void blastResistanceSettings() {
|
||||
+ getMap("settings.blast-resistance-overrides", Collections.emptyMap()).forEach((blockId, value) -> {
|
||||
+ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId));
|
||||
+ if (block == Blocks.AIR) {
|
||||
+ log(Level.SEVERE, "Invalid block for `settings.blast-resistance-overrides`: " + blockId);
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!(value instanceof Number blastResistance)) {
|
||||
+ log(Level.SEVERE, "Invalid blast resistance for `settings.blast-resistance-overrides." + blockId + "`: " + value);
|
||||
+ return;
|
||||
+ }
|
||||
+ block.explosionResistance = blastResistance.floatValue();
|
||||
+ });
|
||||
+ }
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: MelnCat <melncatuwu@gmail.com>
|
||||
Date: Sat, 1 Oct 2022 18:06:52 -0700
|
||||
Subject: [PATCH] Configurable block fall damage modifiers
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java
|
||||
index 58d4554785d066962acad59d983d15e6419c4869..83fa72b5a8fde431e7035fe5cacc50e33ae506bf 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/BedBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java
|
||||
@@ -183,7 +183,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
|
||||
|
||||
@Override
|
||||
public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
|
||||
- super.fallOn(world, state, pos, entity, fallDistance * 0.5F);
|
||||
+ super.fallOn(world, state, pos, entity, fallDistance); // Purpur
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
|
||||
index 34b4c19220e73efad9ff22f3798ee7fbbd5a1968..284149925440f413d23a9ec3ce704e70a74f4c08 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/Block.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
|
||||
@@ -96,6 +96,10 @@ public class Block extends BlockBehaviour implements ItemLike {
|
||||
public static final int UPDATE_LIMIT = 512;
|
||||
protected final StateDefinition<Block, BlockState> stateDefinition;
|
||||
private BlockState defaultBlockState;
|
||||
+ // Purpur start
|
||||
+ public float fallDamageMultiplier = 1.0F;
|
||||
+ public float fallDistanceMultiplier = 1.0F;
|
||||
+ // Purpur end
|
||||
// Paper start
|
||||
public final boolean isDestroyable() {
|
||||
return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits ||
|
||||
@@ -522,7 +526,7 @@ public class Block extends BlockBehaviour implements ItemLike {
|
||||
}
|
||||
|
||||
public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
|
||||
- entity.causeFallDamage(fallDistance, 1.0F, entity.damageSources().fall());
|
||||
+ entity.causeFallDamage(fallDistance * fallDistanceMultiplier, fallDamageMultiplier, entity.damageSources().fall()); // Purpur
|
||||
}
|
||||
|
||||
public void updateEntityAfterFallOn(BlockGetter world, Entity entity) {
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/HayBlock.java b/src/main/java/net/minecraft/world/level/block/HayBlock.java
|
||||
index ef364aa171a48482a45bc18cfe730ec20c3f7be6..74971d90506aa253d5ee821b5390fb2551a3a393 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/HayBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/HayBlock.java
|
||||
@@ -23,6 +23,6 @@ public class HayBlock extends RotatedPillarBlock {
|
||||
|
||||
@Override
|
||||
public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) {
|
||||
- entity.causeFallDamage(fallDistance, 0.2F, world.damageSources().fall());
|
||||
+ super.fallOn(world, state, pos, entity, fallDistance); // Purpur
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index b13635ec623c80b1c32f2a6c11680dae899e8ec7..bc001cac7d478baf5118ec746de8d2d2eba2ba5c 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -593,4 +593,50 @@ public class PurpurConfig {
|
||||
block.explosionResistance = blastResistance.floatValue();
|
||||
});
|
||||
}
|
||||
+ private static void blockFallMultiplierSettings() {
|
||||
+ getMap("settings.block-fall-multipliers", Map.ofEntries(
|
||||
+ Map.entry("minecraft:hay_block", Map.of("damage", 0.2F)),
|
||||
+ Map.entry("minecraft:white_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:light_gray_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:gray_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:black_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:brown_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:pink_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:red_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:orange_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:yellow_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:green_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:lime_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:cyan_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:light_blue_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:blue_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:purple_bed", Map.of("distance", 0.5F)),
|
||||
+ Map.entry("minecraft:magenta_bed", Map.of("distance", 0.5F))
|
||||
+ )).forEach((blockId, value) -> {
|
||||
+ Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId));
|
||||
+ if (block == Blocks.AIR) {
|
||||
+ log(Level.SEVERE, "Invalid block for `settings.block-fall-multipliers`: " + blockId);
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!(value instanceof Map<?, ?> map)) {
|
||||
+ log(Level.SEVERE, "Invalid fall multiplier for `settings.block-fall-multipliers." + blockId + "`: " + value
|
||||
+ + ", expected a map with keys `damage` and `distance` to floats.");
|
||||
+ return;
|
||||
+ }
|
||||
+ Object rawFallDamageMultiplier = map.get("damage");
|
||||
+ if (rawFallDamageMultiplier == null) rawFallDamageMultiplier = 1F;
|
||||
+ if (!(rawFallDamageMultiplier instanceof Number fallDamageMultiplier)) {
|
||||
+ log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".damage`: " + map.get("damage"));
|
||||
+ return;
|
||||
+ }
|
||||
+ Object rawFallDistanceMultiplier = map.get("distance");
|
||||
+ if (rawFallDistanceMultiplier == null) rawFallDistanceMultiplier = 1F;
|
||||
+ if (!(rawFallDistanceMultiplier instanceof Number fallDistanceMultiplier)) {
|
||||
+ log(Level.SEVERE, "Invalid multiplier for `settings.block-fall-multipliers." + blockId + ".distance`: " + map.get("distance"));
|
||||
+ return;
|
||||
+ }
|
||||
+ block.fallDamageMultiplier = fallDamageMultiplier.floatValue();
|
||||
+ block.fallDistanceMultiplier = fallDistanceMultiplier.floatValue();
|
||||
+ });
|
||||
+ }
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: MelnCat <melncatuwu@gmail.com>
|
||||
Date: Sat, 1 Oct 2022 17:08:43 -0700
|
||||
Subject: [PATCH] Language API
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
index 659450d3538cc1499fd427868159e8c32b007dd2..dabaf0cff6dafe8ca411996e67ead9a2cf84dfb8 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
@@ -400,6 +400,20 @@ public final class CraftServer implements Server {
|
||||
this.serverTickManager = new CraftServerTickManager(console.tickRateManager());
|
||||
|
||||
Bukkit.setServer(this);
|
||||
+ // Purpur start
|
||||
+ org.purpurmc.purpur.language.Language.setLanguage(new org.purpurmc.purpur.language.Language() {
|
||||
+ private net.minecraft.locale.Language language = net.minecraft.locale.Language.getInstance();
|
||||
+ @Override
|
||||
+ public boolean has(@org.jetbrains.annotations.NotNull String key) {
|
||||
+ return language.has(key);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public @org.jetbrains.annotations.NotNull String getOrDefault(@org.jetbrains.annotations.NotNull String key) {
|
||||
+ return language.getOrDefault(key);
|
||||
+ }
|
||||
+ });
|
||||
+ // Purpur end
|
||||
|
||||
CraftRegistry.setMinecraftRegistry(console.registryAccess());
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Rhythmic <mc.ADHDMC@gmail.com>
|
||||
Date: Thu, 6 Oct 2022 10:41:01 -0700
|
||||
Subject: [PATCH] Milk Keeps Beneficial Effects
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
index e64d2425f6b5cec9a72bcbf451284fcbb3ebce06..d6705dce3bc8c1964184fe425386b3f3c0a8202e 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
@@ -1133,6 +1133,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||
for (flag = false; iterator.hasNext(); flag = true) {
|
||||
// CraftBukkit start
|
||||
MobEffectInstance effect = (MobEffectInstance) iterator.next();
|
||||
+ if (cause == EntityPotionEffectEvent.Cause.MILK && !this.level().purpurConfig.milkClearsBeneficialEffects && effect.getEffect().isBeneficial()) continue; // Purpur
|
||||
EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED);
|
||||
if (event.isCancelled()) {
|
||||
continue;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
index 21a7cc86245d2440b8fc757d3664a29de293f7b0..b133c186d2d1412aa623ba3db68091bc69c282a5 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
@@ -115,7 +115,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
|
||||
return this.canDrinkPotion && this.level().isNight() && !entityvillagertrader.isInvisible(); // Paper - Add more WanderingTrader API
|
||||
}));
|
||||
this.goalSelector.addGoal(0, new UseItemGoal<>(this, new ItemStack(Items.MILK_BUCKET), SoundEvents.WANDERING_TRADER_REAPPEARED, (entityvillagertrader) -> {
|
||||
- return this.canDrinkMilk && this.level().isDay() && entityvillagertrader.isInvisible(); // Paper - Add more WanderingTrader API
|
||||
+ return level().purpurConfig.milkClearsBeneficialEffects && this.canDrinkMilk && this.level().isDay() && entityvillagertrader.isInvisible(); // Paper - Add more WanderingTrader API // Purpur
|
||||
}));
|
||||
this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this));
|
||||
this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Zombie.class, 8.0F, 0.5D, 0.5D));
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 94e29919ddc7f507d54e14c3360f7a3e8bb831a7..f1ac2b90a465213c93ce940ca3f40497a9309e9b 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -128,6 +128,7 @@ public class PurpurWorldConfig {
|
||||
public boolean fireballsBypassMobGriefing = false;
|
||||
public boolean imposeTeleportRestrictionsOnGateways = false;
|
||||
public boolean milkCuresBadOmen = true;
|
||||
+ public boolean milkClearsBeneficialEffects = true;
|
||||
public boolean noteBlockIgnoreAbove = false;
|
||||
public boolean persistentDroppableEntityDisplayNames = true;
|
||||
public boolean persistentTileEntityDisplayNames = false;
|
||||
@@ -154,6 +155,7 @@ public class PurpurWorldConfig {
|
||||
fireballsBypassMobGriefing = getBoolean("gameplay-mechanics.fireballs-bypass-mob-griefing", fireballsBypassMobGriefing);
|
||||
imposeTeleportRestrictionsOnGateways = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-gateways", imposeTeleportRestrictionsOnGateways);
|
||||
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
|
||||
+ milkClearsBeneficialEffects = getBoolean("gameplay-mechanics.milk-clears-beneficial-effects", milkClearsBeneficialEffects);
|
||||
noteBlockIgnoreAbove = getBoolean("gameplay-mechanics.note-block-ignore-above", noteBlockIgnoreAbove);
|
||||
persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
|
||||
persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames);
|
||||
@@ -1,22 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Krakenied <Krakenied1@gmail.com>
|
||||
Date: Sun, 9 Oct 2022 01:50:39 +0200
|
||||
Subject: [PATCH] MC-121706 - Fix mobs not looking up and down when strafing
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/RangedBowAttackGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/RangedBowAttackGoal.java
|
||||
index 515c1f671cb2c3a7cc23053aedf404bbbe77af3e..42a1e5b9c08a9245dd0ce6d4025e3bb5d60feb62 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/RangedBowAttackGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/RangedBowAttackGoal.java
|
||||
@@ -116,9 +116,9 @@ public class RangedBowAttackGoal<T extends Monster & RangedAttackMob> extends Go
|
||||
}
|
||||
|
||||
this.mob.lookAt(livingEntity, 30.0F, 30.0F);
|
||||
- } else {
|
||||
+ } //else { // Purpur - fix MC-121706
|
||||
this.mob.getLookControl().setLookAt(livingEntity, 30.0F, 30.0F);
|
||||
- }
|
||||
+ //} // Purpur
|
||||
|
||||
if (this.mob.isUsingItem()) {
|
||||
if (!bl && this.seeTime < -60) {
|
||||
@@ -1,25 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Krakenied <Krakenied1@gmail.com>
|
||||
Date: Fri, 14 Oct 2022 23:11:16 +0200
|
||||
Subject: [PATCH] Add log suppression for LibraryLoader
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index bc001cac7d478baf5118ec746de8d2d2eba2ba5c..5343628ea71c14fba785a0b36ef4abd05b6f63c3 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -470,11 +470,14 @@ public class PurpurConfig {
|
||||
public static boolean loggerSuppressIgnoredAdvancementWarnings = false;
|
||||
public static boolean loggerSuppressUnrecognizedRecipeErrors = false;
|
||||
public static boolean loggerSuppressSetBlockFarChunk = false;
|
||||
+ public static boolean loggerSuppressLibraryLoader = false;
|
||||
private static void loggerSettings() {
|
||||
loggerSuppressInitLegacyMaterialError = getBoolean("settings.logger.suppress-init-legacy-material-errors", loggerSuppressInitLegacyMaterialError);
|
||||
loggerSuppressIgnoredAdvancementWarnings = getBoolean("settings.logger.suppress-ignored-advancement-warnings", loggerSuppressIgnoredAdvancementWarnings);
|
||||
loggerSuppressUnrecognizedRecipeErrors = getBoolean("settings.logger.suppress-unrecognized-recipe-errors", loggerSuppressUnrecognizedRecipeErrors);
|
||||
loggerSuppressSetBlockFarChunk = getBoolean("settings.logger.suppress-setblock-in-far-chunk-errors", loggerSuppressSetBlockFarChunk);
|
||||
+ loggerSuppressLibraryLoader = getBoolean("settings.logger.suppress-library-loader", loggerSuppressLibraryLoader);
|
||||
+ org.bukkit.plugin.java.JavaPluginLoader.SuppressLibraryLoaderLogger = loggerSuppressLibraryLoader;
|
||||
}
|
||||
|
||||
public static boolean tpsCatchup = true;
|
||||
@@ -1,45 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jared Seville <Peashooter101@yahoo.com>
|
||||
Date: Sat, 15 Oct 2022 16:01:03 -0700
|
||||
Subject: [PATCH] Add option to allow creeper to encircle target when fusing.
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java
|
||||
index 137ec75ee803789deb7b1ca93dd9369c9af362b9..ca95d25af3e9a0536868b0c7fd8e7d2ff1154ee3 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/SwellGoal.java
|
||||
@@ -54,6 +54,14 @@ public class SwellGoal extends Goal {
|
||||
this.creeper.setSwellDir(-1);
|
||||
} else {
|
||||
this.creeper.setSwellDir(1);
|
||||
+ // Purpur start
|
||||
+ if (this.creeper.level().purpurConfig.creeperEncircleTarget) {
|
||||
+ net.minecraft.world.phys.Vec3 relative = this.creeper.position().subtract(this.target.position());
|
||||
+ relative = relative.yRot((float) Math.PI / 3).normalize().multiply(2, 2, 2);
|
||||
+ net.minecraft.world.phys.Vec3 destination = this.target.position().add(relative);
|
||||
+ this.creeper.getNavigation().moveTo(destination.x, destination.y, destination.z, 1);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index f1ac2b90a465213c93ce940ca3f40497a9309e9b..eae5bebdb1bcc711b205078f96023ceb48fe5dd0 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -1412,6 +1412,7 @@ public class PurpurWorldConfig {
|
||||
public boolean creeperHealthRadius = false;
|
||||
public boolean creeperAlwaysDropExp = false;
|
||||
public double creeperHeadVisibilityPercent = 0.5D;
|
||||
+ public boolean creeperEncircleTarget = false;
|
||||
private void creeperSettings() {
|
||||
creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable);
|
||||
creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater);
|
||||
@@ -1430,6 +1431,7 @@ public class PurpurWorldConfig {
|
||||
creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius);
|
||||
creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp);
|
||||
creeperHeadVisibilityPercent = getDouble("mobs.creeper.head-visibility-percent", creeperHeadVisibilityPercent);
|
||||
+ creeperEncircleTarget = getBoolean("mobs.creeper.encircle-target", creeperEncircleTarget);
|
||||
}
|
||||
|
||||
public boolean dolphinRidable = false;
|
||||
@@ -1,92 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Racci <90304606+DaRacci@users.noreply.github.com>
|
||||
Date: Fri, 4 Feb 2022 16:10:21 +1100
|
||||
Subject: [PATCH] Fire Immunity API
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index ac1f4576476a800adf484912baaea9f2b7b546d0..a2f5027910b4d690eff73aaab7e991807b91df78 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -427,6 +427,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
||||
public boolean activatedPriorityReset = false; // Pufferfish - DAB
|
||||
public int activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; // Pufferfish - DAB (golf score)
|
||||
public final BlockPos.MutableBlockPos cachedBlockPos = new BlockPos.MutableBlockPos(); // Pufferfish - reduce entity allocations
|
||||
+ public @Nullable Boolean immuneToFire = null; // Purpur - Fire immune API
|
||||
|
||||
public void setOrigin(@javax.annotation.Nonnull Location location) {
|
||||
this.origin = location.toVector();
|
||||
@@ -1827,7 +1828,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
||||
}
|
||||
|
||||
public boolean fireImmune() {
|
||||
- return this.getType().fireImmune();
|
||||
+ return this.immuneToFire != null ? immuneToFire : this.getType().fireImmune(); // Purpur - add fire immune API
|
||||
}
|
||||
|
||||
public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) {
|
||||
@@ -2524,6 +2525,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
||||
nbttagcompound.putBoolean("Paper.FreezeLock", true);
|
||||
}
|
||||
// Paper end
|
||||
+ // Purpur start
|
||||
+ if (immuneToFire != null) {
|
||||
+ nbttagcompound.putBoolean("Purpur.FireImmune", immuneToFire);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
return nbttagcompound;
|
||||
} catch (Throwable throwable) {
|
||||
CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT");
|
||||
@@ -2671,6 +2677,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
||||
freezeLocked = nbt.getBoolean("Paper.FreezeLock");
|
||||
}
|
||||
// Paper end
|
||||
+ // Purpur start
|
||||
+ if (nbt.contains("Purpur.FireImmune")) {
|
||||
+ immuneToFire = nbt.getBoolean("Purpur.FireImmune");
|
||||
+ }
|
||||
+ // Purpur end
|
||||
|
||||
} catch (Throwable throwable) {
|
||||
CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT");
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
||||
index b6ecb58718b7de7ba9c90236f3dc11715652daa9..7121de7f623b4a57937a9c60c8fc0f4307e538dc 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
||||
@@ -84,6 +84,16 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
||||
this.entityType = CraftEntityType.minecraftToBukkit(entity.getType());
|
||||
}
|
||||
|
||||
+ @Override
|
||||
+ public boolean isImmuneToFire() {
|
||||
+ return getHandle().fireImmune();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void setImmuneToFire(Boolean fireImmune) {
|
||||
+ getHandle().immuneToFire = fireImmune;
|
||||
+ }
|
||||
+
|
||||
@Override
|
||||
public boolean isInDaylight() {
|
||||
return getHandle().isSunBurnTick();
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
||||
index 01e4395f1669d21c30465aa1366bd2f1ae17678f..5c1cda88080850314dac196dbe71ff12e48a8aca 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
|
||||
@@ -173,9 +173,14 @@ public class CraftItem extends CraftEntity implements Item {
|
||||
return this.getHandle().immuneToExplosion;
|
||||
}
|
||||
|
||||
+ @Override
|
||||
+ public void setImmuneToFire(@org.jetbrains.annotations.Nullable Boolean immuneToFire) {
|
||||
+ this.getHandle().immuneToFire = (immuneToFire != null && immuneToFire);
|
||||
+ }
|
||||
+
|
||||
@Override
|
||||
public void setImmuneToFire(boolean immuneToFire) {
|
||||
- item.immuneToFire = immuneToFire;
|
||||
+ this.setImmuneToFire((Boolean) immuneToFire);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1,38 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Sun, 13 Nov 2022 05:05:34 -0600
|
||||
Subject: [PATCH] Add option to teleport to spawn on nether ceiling damage
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index a2f5027910b4d690eff73aaab7e991807b91df78..f2c6b52fe7fbb05afa0074684cd195f6ae598f1f 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -936,6 +936,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
||||
&& this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v)
|
||||
&& (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
|
||||
// Paper end - Configurable nether ceiling damage
|
||||
+ if (this.level().purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(io.papermc.paper.util.MCUtil.toLocation(this.level, this.level.getSharedSpawnPos())); else // Purpur
|
||||
this.onBelowWorld();
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index eae5bebdb1bcc711b205078f96023ceb48fe5dd0..cb7cb5352a431cc336086c106be84e50424fd8ea 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -417,6 +417,7 @@ public class PurpurWorldConfig {
|
||||
public String playerDeathExpDropEquation = "expLevel * 7";
|
||||
public int playerDeathExpDropMax = 100;
|
||||
public boolean teleportIfOutsideBorder = false;
|
||||
+ public boolean teleportOnNetherCeilingDamage = false;
|
||||
public boolean totemOfUndyingWorksInInventory = false;
|
||||
public boolean playerFixStuckPortal = false;
|
||||
public boolean creativeOnePunch = false;
|
||||
@@ -444,6 +445,7 @@ public class PurpurWorldConfig {
|
||||
playerDeathExpDropEquation = getString("gameplay-mechanics.player.exp-dropped-on-death.equation", playerDeathExpDropEquation);
|
||||
playerDeathExpDropMax = getInt("gameplay-mechanics.player.exp-dropped-on-death.maximum", playerDeathExpDropMax);
|
||||
teleportIfOutsideBorder = getBoolean("gameplay-mechanics.player.teleport-if-outside-border", teleportIfOutsideBorder);
|
||||
+ teleportOnNetherCeilingDamage = getBoolean("gameplay-mechanics.player.teleport-on-nether-ceiling-damage", teleportOnNetherCeilingDamage);
|
||||
totemOfUndyingWorksInInventory = getBoolean("gameplay-mechanics.player.totem-of-undying-works-in-inventory", totemOfUndyingWorksInInventory);
|
||||
playerFixStuckPortal = getBoolean("gameplay-mechanics.player.fix-stuck-in-portal", playerFixStuckPortal);
|
||||
creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch);
|
||||
@@ -1,18 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: SageSphinx63920 <sage@sagesphinx63920.dev>
|
||||
Date: Sat, 29 Oct 2022 00:06:41 +0200
|
||||
Subject: [PATCH] Added got ram event
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
|
||||
index 566f117ba6742ba17ffb8a2673a8c320c39549f7..9d356b08279fd611fb9a7d25be6ede59998a9799 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java
|
||||
@@ -429,6 +429,7 @@ public class Goat extends Animal {
|
||||
|
||||
// Paper start - Goat ram API
|
||||
public void ram(net.minecraft.world.entity.LivingEntity entity) {
|
||||
+ if(!new org.purpurmc.purpur.event.entity.GoatRamEntityEvent((org.bukkit.entity.Goat) getBukkitEntity(), (org.bukkit.entity.LivingEntity) entity.getBukkitLivingEntity()).callEvent()) return; // Purpur
|
||||
Brain<Goat> brain = this.getBrain();
|
||||
brain.setMemory(MemoryModuleType.RAM_TARGET, entity.position());
|
||||
brain.eraseMemory(MemoryModuleType.RAM_COOLDOWN_TICKS);
|
||||
@@ -1,23 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Thu, 24 Nov 2022 11:00:37 -0600
|
||||
Subject: [PATCH] Log skipped entity's position
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
|
||||
index d52af9fa2ca4a07f3499dfee5fe5a7c7b9239cad..a9e2a758669550530eb29475ba99fe42e520f6ae 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
|
||||
@@ -619,6 +619,12 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
|
||||
entity.load(nbt);
|
||||
}, () -> {
|
||||
EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id"));
|
||||
+ // Purpur start - log skipped entity's position
|
||||
+ try {
|
||||
+ ListTag pos = nbt.getList("Pos", 6);
|
||||
+ EntityType.LOGGER.warn("Location: {} {},{},{}", world.getWorld().getName(), pos.getDouble(0), pos.getDouble(1), pos.getDouble(2));
|
||||
+ } catch (Throwable ignore) {}
|
||||
+ // Purpur end
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: BillyGalbreath <blake.galbreath@gmail.com>
|
||||
Date: Thu, 15 Dec 2022 11:42:15 -0600
|
||||
Subject: [PATCH] End Crystal Cramming
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||
index 24ad1bae912fa6ee82ea8b6bdbb0af664dc1006c..34f5006f72ec357c474a19f22ee339e3a1dc786f 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||
@@ -100,6 +100,7 @@ public class EndCrystal extends Entity {
|
||||
}
|
||||
}
|
||||
// Paper end - Fix invulnerable end crystals
|
||||
+ if (this.level().purpurConfig.endCrystalCramming > 0 && this.level().getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level().purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur
|
||||
}
|
||||
|
||||
// Purpur start
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index cb7cb5352a431cc336086c106be84e50424fd8ea..892af70a29ab76575cc86c7d9f36e28f3aefabb9 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -947,6 +947,7 @@ public class PurpurWorldConfig {
|
||||
public double basedEndCrystalExplosionPower = 6.0D;
|
||||
public boolean basedEndCrystalExplosionFire = false;
|
||||
public net.minecraft.world.level.Level.ExplosionInteraction basedEndCrystalExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK;
|
||||
+ public int endCrystalCramming = 0;
|
||||
private void endCrystalSettings() {
|
||||
if (PurpurConfig.version < 31) {
|
||||
if ("DESTROY".equals(getString("blocks.end-crystal.baseless.explosion-effect", baselessEndCrystalExplosionEffect.name()))) {
|
||||
@@ -974,6 +975,7 @@ public class PurpurWorldConfig {
|
||||
log(Level.SEVERE, "Unknown value for `blocks.end-crystal.base.explosion-effect`! Using default of `BLOCK`");
|
||||
basedEndCrystalExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK;
|
||||
}
|
||||
+ endCrystalCramming = getInt("blocks.end-crystal.cramming-amount", endCrystalCramming);
|
||||
}
|
||||
|
||||
public boolean farmlandBypassMobGriefing = false;
|
||||
@@ -1,55 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: 12emin34 <macanovic.emin@gmail.com>
|
||||
Date: Mon, 26 Dec 2022 19:10:43 +0100
|
||||
Subject: [PATCH] Option to allow beacon effects when covered by tinted glass
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
|
||||
index 4a0bca08585fae3620da108f6a4cc07e500e5e03..428773361d12ecbcf3a6bf790aedfe12a384f511 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java
|
||||
@@ -174,6 +174,7 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name
|
||||
int j = pos.getY();
|
||||
int k = pos.getZ();
|
||||
BlockPos blockposition1;
|
||||
+ boolean isTintedGlass = false;
|
||||
|
||||
if (blockEntity.lastCheckY < j) {
|
||||
blockposition1 = pos;
|
||||
@@ -207,6 +208,9 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name
|
||||
}
|
||||
}
|
||||
} else {
|
||||
+ if (world.purpurConfig.beaconAllowEffectsWithTintedGlass && block.equals(Blocks.TINTED_GLASS)) {
|
||||
+ isTintedGlass = true;
|
||||
+ }
|
||||
if (tileentitybeacon_beaconcolortracker == null || iblockdata1.getLightBlock(world, blockposition1) >= 15 && !iblockdata1.is(Blocks.BEDROCK)) {
|
||||
blockEntity.checkingBeamSections.clear();
|
||||
blockEntity.lastCheckY = l;
|
||||
@@ -226,7 +230,7 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name
|
||||
blockEntity.levels = BeaconBlockEntity.updateBase(world, i, j, k);
|
||||
}
|
||||
|
||||
- if (blockEntity.levels > 0 && !blockEntity.beamSections.isEmpty()) {
|
||||
+ if (blockEntity.levels > 0 && (!blockEntity.beamSections.isEmpty() || (world.purpurConfig.beaconAllowEffectsWithTintedGlass && isTintedGlass))) {
|
||||
BeaconBlockEntity.applyEffects(world, pos, blockEntity.levels, blockEntity.primaryPower, blockEntity.secondaryPower, blockEntity); // Paper - Custom beacon ranges
|
||||
BeaconBlockEntity.playSound(world, pos, SoundEvents.BEACON_AMBIENT);
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 892af70a29ab76575cc86c7d9f36e28f3aefabb9..70b3c2fc1bd9f31d79079828a5de22a40d9cceba 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -846,11 +846,13 @@ public class PurpurWorldConfig {
|
||||
public int beaconLevelTwo = 30;
|
||||
public int beaconLevelThree = 40;
|
||||
public int beaconLevelFour = 50;
|
||||
+ public boolean beaconAllowEffectsWithTintedGlass = false;
|
||||
private void beaconSettings() {
|
||||
beaconLevelOne = getInt("blocks.beacon.effect-range.level-1", beaconLevelOne);
|
||||
beaconLevelTwo = getInt("blocks.beacon.effect-range.level-2", beaconLevelTwo);
|
||||
beaconLevelThree = getInt("blocks.beacon.effect-range.level-3", beaconLevelThree);
|
||||
beaconLevelFour = getInt("blocks.beacon.effect-range.level-4", beaconLevelFour);
|
||||
+ beaconAllowEffectsWithTintedGlass = getBoolean("blocks.beacon.allow-effects-with-tinted-glass", beaconAllowEffectsWithTintedGlass);
|
||||
}
|
||||
|
||||
public boolean bedExplode = true;
|
||||
@@ -1,58 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
|
||||
Date: Thu, 27 Oct 2022 23:12:45 -0400
|
||||
Subject: [PATCH] Add attribute clamping and armor limit config
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/damagesource/CombatRules.java b/src/main/java/net/minecraft/world/damagesource/CombatRules.java
|
||||
index ccbfcef3e83b1bef364447657bfd08a92d615cf6..aa2331c6df4e79d4bb0add071a0b11d2a3a08b88 100644
|
||||
--- a/src/main/java/net/minecraft/world/damagesource/CombatRules.java
|
||||
+++ b/src/main/java/net/minecraft/world/damagesource/CombatRules.java
|
||||
@@ -11,12 +11,12 @@ public class CombatRules {
|
||||
|
||||
public static float getDamageAfterAbsorb(float damage, float armor, float armorToughness) {
|
||||
float f = 2.0F + armorToughness / 4.0F;
|
||||
- float g = Mth.clamp(armor - damage / f, armor * 0.2F, 20.0F);
|
||||
+ float g = Mth.clamp(armor - damage / f, armor * 0.2F, org.purpurmc.purpur.PurpurConfig.limitArmor ? 20F : Float.MAX_VALUE); // Purpur
|
||||
return damage * (1.0F - g / 25.0F);
|
||||
}
|
||||
|
||||
public static float getDamageAfterMagicAbsorb(float damageDealt, float protection) {
|
||||
- float f = Mth.clamp(protection, 0.0F, 20.0F);
|
||||
+ float f = Mth.clamp(protection, 0.0F, org.purpurmc.purpur.PurpurConfig.limitArmor ? 20F : Float.MAX_VALUE); // Purpur
|
||||
return damageDealt * (1.0F - f / 25.0F);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/RangedAttribute.java b/src/main/java/net/minecraft/world/entity/ai/attributes/RangedAttribute.java
|
||||
index f0703302e7dbbda88de8c648d20d87c55ed9b1e0..a913ebabaa5f443afa987b972355a8f8d1723c78 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/attributes/RangedAttribute.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/attributes/RangedAttribute.java
|
||||
@@ -29,6 +29,7 @@ public class RangedAttribute extends Attribute {
|
||||
|
||||
@Override
|
||||
public double sanitizeValue(double value) {
|
||||
+ if (!org.purpurmc.purpur.PurpurConfig.clampAttributes) return Double.isNaN(value) ? this.minValue : value; // Purpur
|
||||
return Double.isNaN(value) ? this.minValue : Mth.clamp(value, this.minValue, this.maxValue);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index 5343628ea71c14fba785a0b36ef4abd05b6f63c3..cd2c365bcaca0720dc543188a23ff585192cb76e 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -582,6 +582,16 @@ public class PurpurConfig {
|
||||
fixProjectileLootingTransfer = getBoolean("settings.fix-projectile-looting-transfer", fixProjectileLootingTransfer);
|
||||
}
|
||||
|
||||
+ public static boolean clampAttributes = true;
|
||||
+ private static void clampAttributes() {
|
||||
+ clampAttributes = getBoolean("settings.clamp-attributes", clampAttributes);
|
||||
+ }
|
||||
+
|
||||
+ public static boolean limitArmor = true;
|
||||
+ private static void limitArmor() {
|
||||
+ limitArmor = getBoolean("settings.limit-armor", limitArmor);
|
||||
+ }
|
||||
+
|
||||
private static void blastResistanceSettings() {
|
||||
getMap("settings.blast-resistance-overrides", Collections.emptyMap()).forEach((blockId, value) -> {
|
||||
Block block = BuiltInRegistries.BLOCK.get(new ResourceLocation(blockId));
|
||||
@@ -1,44 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Nico314159 <nicolino.will@gmail.com>
|
||||
Date: Mon, 9 Jan 2023 19:45:55 -0500
|
||||
Subject: [PATCH] Config to remove explosion radius clamp
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
|
||||
index 5dcfb077fc58a92f32425aaafb82d6b41d488e13..9b5da37a532595541eaac0a4607aff9045a20ff3 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/Explosion.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/Explosion.java
|
||||
@@ -97,7 +97,7 @@ public class Explosion {
|
||||
this.hitPlayers = Maps.newHashMap();
|
||||
this.level = world;
|
||||
this.source = entity;
|
||||
- this.radius = (float) Math.max(power, 0.0); // CraftBukkit - clamp bad values
|
||||
+ this.radius = (float) (world == null || world.purpurConfig.explosionClampRadius ? Math.max(power, 0.0) : power); // CraftBukkit - clamp bad values // Purpur
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
@@ -425,7 +425,7 @@ public class Explosion {
|
||||
|
||||
public void explode() {
|
||||
// CraftBukkit start
|
||||
- if (this.radius < 0.1F) {
|
||||
+ if ((this.level == null || this.level.purpurConfig.explosionClampRadius) && this.radius < 0.1F) { // Purpur
|
||||
return;
|
||||
}
|
||||
// CraftBukkit end
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 70b3c2fc1bd9f31d79079828a5de22a40d9cceba..9759c3aa4dab2a1ea3ab62ee026d6ad93a488ff7 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -213,6 +213,11 @@ public class PurpurWorldConfig {
|
||||
entitySharedRandom = getBoolean("settings.entity.shared-random", entitySharedRandom);
|
||||
}
|
||||
|
||||
+ public boolean explosionClampRadius = true;
|
||||
+ private void explosionSettings() {
|
||||
+ explosionClampRadius = getBoolean("gameplay-mechanics.clamp-explosion-radius", explosionClampRadius);
|
||||
+ }
|
||||
+
|
||||
public boolean infinityWorksWithoutArrows = false;
|
||||
public boolean infinityWorksWithNormalArrows = true;
|
||||
public boolean infinityWorksWithSpectralArrows = false;
|
||||
@@ -1,163 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: granny <granny@purpurmc.org>
|
||||
Date: Thu, 9 Feb 2023 00:28:03 -0800
|
||||
Subject: [PATCH] bonemealable sugarcane, cactus, and netherwart
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java
|
||||
index 84b04419d2cb536ac42ec5373cc74cc29418755c..02ea708a5b5df9f753194cdc9312fc830af85c68 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java
|
||||
@@ -23,7 +23,7 @@ import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
|
||||
|
||||
-public class CactusBlock extends Block {
|
||||
+public class CactusBlock extends Block implements BonemealableBlock { // Purpur
|
||||
|
||||
public static final MapCodec<CactusBlock> CODEC = simpleCodec(CactusBlock::new);
|
||||
public static final IntegerProperty AGE = BlockStateProperties.AGE_15;
|
||||
@@ -134,4 +134,34 @@ public class CactusBlock extends Block {
|
||||
public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) {
|
||||
return false;
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isValidBonemealTarget(final LevelReader world, final BlockPos pos, final BlockState state) {
|
||||
+ if (!((Level) world).purpurConfig.cactusAffectedByBonemeal || !world.isEmptyBlock(pos.above())) return false;
|
||||
+
|
||||
+ int cactusHeight = 0;
|
||||
+ while (world.getBlockState(pos.below(cactusHeight)).is(this)) {
|
||||
+ cactusHeight++;
|
||||
+ }
|
||||
+
|
||||
+ return cactusHeight < ((Level) world).paperConfig().maxGrowthHeight.cactus;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isBonemealSuccess(Level world, RandomSource random, BlockPos pos, BlockState state) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) {
|
||||
+ int cactusHeight = 0;
|
||||
+ while (world.getBlockState(pos.below(cactusHeight)).is(this)) {
|
||||
+ cactusHeight++;
|
||||
+ }
|
||||
+ for (int i = 0; i <= world.paperConfig().maxGrowthHeight.cactus - cactusHeight; i++) {
|
||||
+ world.setBlockAndUpdate(pos.above(i), state.setValue(CactusBlock.AGE, 0));
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java b/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java
|
||||
index 464a9d2e4c694d5d4aae6c2d3e8a5fad0111e910..13eb4dffd60ea7902d620f484df5e3f2c4688402 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/NetherWartBlock.java
|
||||
@@ -16,7 +16,7 @@ import net.minecraft.world.level.block.state.properties.IntegerProperty;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
-public class NetherWartBlock extends BushBlock {
|
||||
+public class NetherWartBlock extends BushBlock implements BonemealableBlock { // Purpur
|
||||
|
||||
public static final MapCodec<NetherWartBlock> CODEC = simpleCodec(NetherWartBlock::new);
|
||||
public static final int MAX_AGE = 3;
|
||||
@@ -78,5 +78,22 @@ public class NetherWartBlock extends BushBlock {
|
||||
super.playerDestroy(world, player, pos, state, blockEntity, itemInHand, includeDrops, dropExp);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isValidBonemealTarget(final net.minecraft.world.level.LevelReader world, final BlockPos pos, final BlockState state) {
|
||||
+ return ((net.minecraft.world.level.Level) world).purpurConfig.netherWartAffectedByBonemeal && state.getValue(NetherWartBlock.AGE) < 3;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isBonemealSuccess(net.minecraft.world.level.Level world, RandomSource random, BlockPos pos, BlockState state) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) {
|
||||
+ int i = Math.min(3, state.getValue(NetherWartBlock.AGE) + 1);
|
||||
+ state = state.setValue(NetherWartBlock.AGE, i);
|
||||
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, pos, state, 2); // CraftBukkit
|
||||
+ }
|
||||
// Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
|
||||
index 04957d461d0e968d443737068aaeec1d0bce78b2..7a283fbe4663cb321739f8e42ade4039d84e462b 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java
|
||||
@@ -20,7 +20,7 @@ import net.minecraft.world.level.material.FluidState;
|
||||
import net.minecraft.world.phys.shapes.CollisionContext;
|
||||
import net.minecraft.world.phys.shapes.VoxelShape;
|
||||
|
||||
-public class SugarCaneBlock extends Block {
|
||||
+public class SugarCaneBlock extends Block implements BonemealableBlock { // Purpur
|
||||
|
||||
public static final MapCodec<SugarCaneBlock> CODEC = simpleCodec(SugarCaneBlock::new);
|
||||
public static final IntegerProperty AGE = BlockStateProperties.AGE_15;
|
||||
@@ -113,4 +113,34 @@ public class SugarCaneBlock extends Block {
|
||||
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||
builder.add(SugarCaneBlock.AGE);
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public boolean isValidBonemealTarget(final LevelReader world, final BlockPos pos, final BlockState state) {
|
||||
+ if (!((net.minecraft.world.level.Level) world).purpurConfig.sugarCanAffectedByBonemeal || !world.isEmptyBlock(pos.above())) return false;
|
||||
+
|
||||
+ int reedHeight = 0;
|
||||
+ while (world.getBlockState(pos.below(reedHeight)).is(this)) {
|
||||
+ reedHeight++;
|
||||
+ }
|
||||
+
|
||||
+ return reedHeight < ((net.minecraft.world.level.Level) world).paperConfig().maxGrowthHeight.reeds;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isBonemealSuccess(net.minecraft.world.level.Level world, RandomSource random, BlockPos pos, BlockState state) {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void performBonemeal(ServerLevel world, RandomSource random, BlockPos pos, BlockState state) {
|
||||
+ int reedHeight = 0;
|
||||
+ while (world.getBlockState(pos.below(reedHeight)).is(this)) {
|
||||
+ reedHeight++;
|
||||
+ }
|
||||
+ for (int i = 0; i <= world.paperConfig().maxGrowthHeight.reeds - reedHeight; i++) {
|
||||
+ world.setBlockAndUpdate(pos.above(i), state.setValue(SugarCaneBlock.AGE, 0));
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 9759c3aa4dab2a1ea3ab62ee026d6ad93a488ff7..959be2c3248bc5db01d4c5a4b15326867074ecee 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -900,8 +900,20 @@ public class PurpurWorldConfig {
|
||||
}
|
||||
|
||||
public boolean cactusBreaksFromSolidNeighbors = true;
|
||||
+ public boolean cactusAffectedByBonemeal = false;
|
||||
private void cactusSettings() {
|
||||
cactusBreaksFromSolidNeighbors = getBoolean("blocks.cactus.breaks-from-solid-neighbors", cactusBreaksFromSolidNeighbors);
|
||||
+ cactusAffectedByBonemeal = getBoolean("blocks.cactus.affected-by-bonemeal", cactusAffectedByBonemeal);
|
||||
+ }
|
||||
+
|
||||
+ public boolean sugarCanAffectedByBonemeal = false;
|
||||
+ private void sugarCaneSettings() {
|
||||
+ sugarCanAffectedByBonemeal = getBoolean("blocks.sugar_cane.affected-by-bonemeal", sugarCanAffectedByBonemeal);
|
||||
+ }
|
||||
+
|
||||
+ public boolean netherWartAffectedByBonemeal = false;
|
||||
+ private void netherWartSettings() {
|
||||
+ netherWartAffectedByBonemeal = getBoolean("blocks.nether_wart.affected-by-bonemeal", netherWartAffectedByBonemeal);
|
||||
}
|
||||
|
||||
public boolean campFireLitWhenPlaced = true;
|
||||
@@ -1,34 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: SageSphinx63920 <sage@sagesphinx63920.dev>
|
||||
Date: Mon, 26 Dec 2022 23:42:37 +0100
|
||||
Subject: [PATCH] Add PreExplodeEvents
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
|
||||
index 9b5da37a532595541eaac0a4607aff9045a20ff3..0be03430d8257d918b7cf646af518473ae027399 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/Explosion.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/Explosion.java
|
||||
@@ -429,6 +429,23 @@ public class Explosion {
|
||||
return;
|
||||
}
|
||||
// CraftBukkit end
|
||||
+
|
||||
+ // Purpur start - add PreExplodeEvents
|
||||
+ if(this.source != null){
|
||||
+ Location location = new Location(this.level.getWorld(), this.x, this.y, this.z);
|
||||
+ if(!new org.purpurmc.purpur.event.entity.PreEntityExplodeEvent(this.source.getBukkitEntity(), location, this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F).callEvent()) {
|
||||
+ this.wasCanceled = true;
|
||||
+ return;
|
||||
+ }
|
||||
+ }else {
|
||||
+ Location location = new Location(this.level.getWorld(), this.x, this.y, this.z);
|
||||
+ if(!new org.purpurmc.purpur.event.PreBlockExplodeEvent(location.getBlock(), this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, this.damageSource.explodedBlockState).callEvent()) {
|
||||
+ this.wasCanceled = true;
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ //Purpur end
|
||||
+
|
||||
this.level.gameEvent(this.source, GameEvent.EXPLODE, new Vec3(this.x, this.y, this.z));
|
||||
Set<BlockPos> set = Sets.newHashSet();
|
||||
boolean flag = true;
|
||||
@@ -1,131 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Parker Hawke <hawkeboyz2@hotmail.com>
|
||||
Date: Sat, 27 Jun 2020 18:43:37 -0400
|
||||
Subject: [PATCH] Improve output of plugins command
|
||||
|
||||
Co-authored-by: Oharass <oharass@bk.ru>
|
||||
Co-authored-by: granny <granny@purpurmc.org>
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java b/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java
|
||||
index f0fce4113fb07c64adbec029d177c236cbdcbae8..e94224ed280247ee69dfdff8dc960f2b8729be33 100644
|
||||
--- a/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java
|
||||
+++ b/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java
|
||||
@@ -78,10 +78,10 @@ public class PaperPluginsCommand extends BukkitCommand {
|
||||
this.setAliases(Arrays.asList("pl"));
|
||||
}
|
||||
|
||||
- private static <T> List<Component> formatProviders(TreeMap<String, PluginProvider<T>> plugins) {
|
||||
+ private static <T> List<Component> formatProviders(TreeMap<String, PluginProvider<T>> plugins, @NotNull CommandSender sender) { // Purpur
|
||||
List<Component> components = new ArrayList<>(plugins.size());
|
||||
for (PluginProvider<T> entry : plugins.values()) {
|
||||
- components.add(formatProvider(entry));
|
||||
+ components.add(formatProvider(entry, sender)); // Purpur
|
||||
}
|
||||
|
||||
boolean isFirst = true;
|
||||
@@ -109,7 +109,7 @@ public class PaperPluginsCommand extends BukkitCommand {
|
||||
return formattedSublists;
|
||||
}
|
||||
|
||||
- private static Component formatProvider(PluginProvider<?> provider) {
|
||||
+ private static Component formatProvider(PluginProvider<?> provider, @NotNull CommandSender sender) { // Purpur
|
||||
TextComponent.Builder builder = Component.text();
|
||||
if (provider instanceof SpigotPluginProvider spigotPluginProvider && CraftMagicNumbers.isLegacy(spigotPluginProvider.getMeta())) {
|
||||
builder.append(LEGACY_PLUGIN_STAR);
|
||||
@@ -117,12 +117,64 @@ public class PaperPluginsCommand extends BukkitCommand {
|
||||
|
||||
String name = provider.getMeta().getName();
|
||||
Component pluginName = Component.text(name, fromStatus(provider))
|
||||
- .clickEvent(ClickEvent.runCommand("/version " + name));
|
||||
+ // Purpur start
|
||||
+ .clickEvent(ClickEvent.suggestCommand("/version " + name));
|
||||
+
|
||||
+ if (sender instanceof org.bukkit.entity.Player && sender.hasPermission("bukkit.command.version")) {
|
||||
+ // Event components
|
||||
+ String description = provider.getMeta().getDescription();
|
||||
+ TextComponent.Builder hover = Component.text();
|
||||
+ hover.append(Component.text("Version: ", NamedTextColor.WHITE)).append(Component.text(provider.getMeta().getVersion(), NamedTextColor.GREEN));
|
||||
+
|
||||
+ if (description != null) {
|
||||
+ hover.append(Component.newline())
|
||||
+ .append(Component.text("Description: ", NamedTextColor.WHITE))
|
||||
+ .append(Component.text(description, NamedTextColor.GREEN));
|
||||
+ }
|
||||
+
|
||||
+ if (provider.getMeta().getWebsite() != null) {
|
||||
+ hover.append(Component.newline())
|
||||
+ .append(Component.text("Website: ", NamedTextColor.WHITE))
|
||||
+ .append(Component.text(provider.getMeta().getWebsite(), NamedTextColor.GREEN));
|
||||
+ }
|
||||
+
|
||||
+ if (!provider.getMeta().getAuthors().isEmpty()) {
|
||||
+ hover.append(Component.newline());
|
||||
+ if (provider.getMeta().getAuthors().size() == 1) {
|
||||
+ hover.append(Component.text("Author: "));
|
||||
+ } else {
|
||||
+ hover.append(Component.text("Authors: "));
|
||||
+ }
|
||||
+
|
||||
+ hover.append(getAuthors(provider.getMeta()));
|
||||
+ }
|
||||
+
|
||||
+ pluginName.hoverEvent(hover.build());
|
||||
+ }
|
||||
|
||||
builder.append(pluginName);
|
||||
+ // Purpur end
|
||||
+
|
||||
+ return builder.build();
|
||||
+ }
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @NotNull
|
||||
+ private static TextComponent getAuthors(@NotNull final PluginMeta pluginMeta) {
|
||||
+ TextComponent.Builder builder = Component.text();
|
||||
+ List<String> authors = pluginMeta.getAuthors();
|
||||
+
|
||||
+ for (int i = 0; i < authors.size(); i++) {
|
||||
+ if (i > 0) {
|
||||
+ builder.append(Component.text(i < authors.size() - 1 ? ", " : " and ", NamedTextColor.WHITE));
|
||||
+ }
|
||||
+
|
||||
+ builder.append(Component.text(authors.get(i), NamedTextColor.GREEN));
|
||||
+ }
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
+ // Purpur end
|
||||
|
||||
private static Component asPlainComponents(String strings) {
|
||||
net.kyori.adventure.text.TextComponent.Builder builder = Component.text();
|
||||
@@ -182,24 +234,24 @@ public class PaperPluginsCommand extends BukkitCommand {
|
||||
}
|
||||
}
|
||||
|
||||
- Component infoMessage = Component.text("Server Plugins (%s):".formatted(paperPlugins.size() + spigotPlugins.size()), NamedTextColor.WHITE);
|
||||
+ //Component infoMessage = Component.text("Server Plugins (%s):".formatted(paperPlugins.size() + spigotPlugins.size()), NamedTextColor.WHITE);
|
||||
//.append(INFO_ICON_START.hoverEvent(SERVER_PLUGIN_INFO)); TODO: Add docs
|
||||
|
||||
- sender.sendMessage(infoMessage);
|
||||
+ //sender.sendMessage(infoMessage); // Purpur
|
||||
|
||||
if (!paperPlugins.isEmpty()) {
|
||||
- sender.sendMessage(PAPER_HEADER);
|
||||
+ sender.sendMessage(PAPER_HEADER.append(Component.text(" (%s):".formatted(paperPlugins.size())))); // Purpur
|
||||
}
|
||||
|
||||
- for (Component component : formatProviders(paperPlugins)) {
|
||||
+ for (Component component : formatProviders(paperPlugins, sender)) { // Purpur
|
||||
sender.sendMessage(component);
|
||||
}
|
||||
|
||||
if (!spigotPlugins.isEmpty()) {
|
||||
- sender.sendMessage(BUKKIT_HEADER);
|
||||
+ sender.sendMessage(BUKKIT_HEADER.append(Component.text(" (%s):".formatted(spigotPlugins.size())))); // Purpur
|
||||
}
|
||||
|
||||
- for (Component component : formatProviders(spigotPlugins)) {
|
||||
+ for (Component component : formatProviders(spigotPlugins, sender)) { // Purpur
|
||||
sender.sendMessage(component);
|
||||
}
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: rafaelflromao <12960698+rafaelflromao@users.noreply.github.com>
|
||||
Date: Mon, 8 May 2023 20:43:29 +0100
|
||||
Subject: [PATCH] Add mending multiplier
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
||||
index 373a932b80be18b8a47ef849ce837dbfbba6f9cb..9a3210e34decb4096533c58f36687e31330198c4 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
|
||||
@@ -360,13 +360,15 @@ public class ExperienceOrb extends Entity {
|
||||
}
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
public int durabilityToXp(int repairAmount) {
|
||||
- return repairAmount / 2;
|
||||
+ return (int) (repairAmount / (2 * level().purpurConfig.mendingMultiplier));
|
||||
}
|
||||
|
||||
public int xpToDurability(int experienceAmount) {
|
||||
- return experienceAmount * 2;
|
||||
+ return (int) ((experienceAmount * 2) * level().purpurConfig.mendingMultiplier);
|
||||
}
|
||||
+ // Purpur end
|
||||
|
||||
public int getValue() {
|
||||
return this.value;
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 959be2c3248bc5db01d4c5a4b15326867074ecee..24e3ebf13e6af6d4bddb85976b30ef894278ce20 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -119,6 +119,7 @@ public class PurpurWorldConfig {
|
||||
}
|
||||
|
||||
public boolean useBetterMending = false;
|
||||
+ public double mendingMultiplier = 1.0;
|
||||
public boolean alwaysTameInCreative = false;
|
||||
public boolean boatEjectPlayersOnLand = false;
|
||||
public boolean boatsDoFallDamage = false;
|
||||
@@ -146,6 +147,7 @@ public class PurpurWorldConfig {
|
||||
public int mobLastHurtByPlayerTime = 100;
|
||||
private void miscGameplayMechanicsSettings() {
|
||||
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
|
||||
+ mendingMultiplier = getDouble("gameplay-mechanics.mending-multiplier", mendingMultiplier);
|
||||
alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative);
|
||||
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
|
||||
boatsDoFallDamage = getBoolean("gameplay-mechanics.boat.do-fall-damage", boatsDoFallDamage);
|
||||
@@ -1,421 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Thu, 16 Jan 2020 14:59:16 -0600
|
||||
Subject: [PATCH] Make GUI Great Again
|
||||
|
||||
|
||||
diff --git a/src/log4jPlugins/java/org/purpurmc/purpur/gui/HighlightErrorConverter.java b/src/log4jPlugins/java/org/purpurmc/purpur/gui/HighlightErrorConverter.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..15a226e3854d731f7724025ea3459c8ace07630c
|
||||
--- /dev/null
|
||||
+++ b/src/log4jPlugins/java/org/purpurmc/purpur/gui/HighlightErrorConverter.java
|
||||
@@ -0,0 +1,85 @@
|
||||
+package org.purpurmc.purpur.gui.util;
|
||||
+
|
||||
+import org.apache.logging.log4j.Level;
|
||||
+import org.apache.logging.log4j.core.LogEvent;
|
||||
+import org.apache.logging.log4j.core.config.Configuration;
|
||||
+import org.apache.logging.log4j.core.config.plugins.Plugin;
|
||||
+import org.apache.logging.log4j.core.layout.PatternLayout;
|
||||
+import org.apache.logging.log4j.core.pattern.ConverterKeys;
|
||||
+import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
|
||||
+import org.apache.logging.log4j.core.pattern.PatternConverter;
|
||||
+import org.apache.logging.log4j.core.pattern.PatternFormatter;
|
||||
+import org.apache.logging.log4j.core.pattern.PatternParser;
|
||||
+import org.apache.logging.log4j.util.PerformanceSensitive;
|
||||
+
|
||||
+import java.util.List;
|
||||
+
|
||||
+@Plugin(name = "highlightGUIError", category = PatternConverter.CATEGORY)
|
||||
+@ConverterKeys({"highlightGUIError"})
|
||||
+@PerformanceSensitive("allocation")
|
||||
+public final class HighlightErrorConverter extends LogEventPatternConverter {
|
||||
+ private static final String ERROR = "\u00A74\u00A7l"; // Bold Red
|
||||
+ private static final String WARN = "\u00A7e\u00A7l"; // Bold Yellow
|
||||
+
|
||||
+ private final List<PatternFormatter> formatters;
|
||||
+
|
||||
+ private HighlightErrorConverter(List<PatternFormatter> formatters) {
|
||||
+ super("highlightGUIError", null);
|
||||
+ this.formatters = formatters;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void format(LogEvent event, StringBuilder toAppendTo) {
|
||||
+ Level level = event.getLevel();
|
||||
+ if (level.isMoreSpecificThan(Level.ERROR)) {
|
||||
+ format(ERROR, event, toAppendTo);
|
||||
+ return;
|
||||
+ } else if (level.isMoreSpecificThan(Level.WARN)) {
|
||||
+ format(WARN, event, toAppendTo);
|
||||
+ return;
|
||||
+ }
|
||||
+ for (PatternFormatter formatter : formatters) {
|
||||
+ formatter.format(event, toAppendTo);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ private void format(String style, LogEvent event, StringBuilder toAppendTo) {
|
||||
+ int start = toAppendTo.length();
|
||||
+ toAppendTo.append(style);
|
||||
+ int end = toAppendTo.length();
|
||||
+
|
||||
+ for (PatternFormatter formatter : formatters) {
|
||||
+ formatter.format(event, toAppendTo);
|
||||
+ }
|
||||
+
|
||||
+ if (toAppendTo.length() == end) {
|
||||
+ toAppendTo.setLength(start);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean handlesThrowable() {
|
||||
+ for (final PatternFormatter formatter : formatters) {
|
||||
+ if (formatter.handlesThrowable()) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ public static HighlightErrorConverter newInstance(Configuration config, String[] options) {
|
||||
+ if (options.length != 1) {
|
||||
+ LOGGER.error("Incorrect number of options on highlightGUIError. Expected 1 received " + options.length);
|
||||
+ return null;
|
||||
+ }
|
||||
+
|
||||
+ if (options[0] == null) {
|
||||
+ LOGGER.error("No pattern supplied on highlightGUIError");
|
||||
+ return null;
|
||||
+ }
|
||||
+
|
||||
+ PatternParser parser = PatternLayout.createPatternParser(config);
|
||||
+ List<PatternFormatter> formatters = parser.parse(options[0]);
|
||||
+ return new HighlightErrorConverter(formatters);
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
index 85b861e21d8798a883ecbd0a09cc25f87e801b7b..5ca6af93362d205438f8321ee2461ae7f8160df1 100644
|
||||
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -99,6 +99,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
||||
return;
|
||||
}
|
||||
// Paper start - Use TerminalConsoleAppender
|
||||
+ if (DedicatedServer.this.gui == null || System.console() != null) // Purpur - has no GUI or has console (did not double-click)
|
||||
new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start();
|
||||
/*
|
||||
jline.console.ConsoleReader bufferedreader = DedicatedServer.this.reader;
|
||||
diff --git a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
|
||||
index 7704a5951ac3d02020ed0f40d76500dd6ba005af..0dec2f3762aa55cfaa7af5b357f0fe243a3b2cc6 100644
|
||||
--- a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
|
||||
+++ b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
|
||||
@@ -43,6 +43,11 @@ public class MinecraftServerGui extends JComponent {
|
||||
private Thread logAppenderThread;
|
||||
private final Collection<Runnable> finalizers = Lists.newArrayList();
|
||||
final AtomicBoolean isClosing = new AtomicBoolean();
|
||||
+ // Purpur start
|
||||
+ private final CommandHistory history = new CommandHistory();
|
||||
+ private String currentCommand = "";
|
||||
+ private int historyIndex = 0;
|
||||
+ // Purpur end
|
||||
|
||||
public static MinecraftServerGui showFrameFor(final DedicatedServer server) {
|
||||
try {
|
||||
@@ -51,7 +56,7 @@ public class MinecraftServerGui extends JComponent {
|
||||
;
|
||||
}
|
||||
|
||||
- final JFrame jframe = new JFrame("Minecraft server");
|
||||
+ final JFrame jframe = new JFrame("Purpur Minecraft server"); // Purpur
|
||||
final MinecraftServerGui servergui = new MinecraftServerGui(server);
|
||||
|
||||
jframe.setDefaultCloseOperation(2);
|
||||
@@ -59,7 +64,7 @@ public class MinecraftServerGui extends JComponent {
|
||||
jframe.pack();
|
||||
jframe.setLocationRelativeTo((Component) null);
|
||||
jframe.setVisible(true);
|
||||
- jframe.setName("Minecraft server"); // Paper - Improve ServerGUI
|
||||
+ jframe.setName("Purpur Minecraft server"); // Paper - Improve ServerGUI // Purpur
|
||||
|
||||
// Paper start - Improve ServerGUI
|
||||
try {
|
||||
@@ -71,7 +76,7 @@ public class MinecraftServerGui extends JComponent {
|
||||
jframe.addWindowListener(new WindowAdapter() {
|
||||
public void windowClosing(WindowEvent windowevent) {
|
||||
if (!servergui.isClosing.getAndSet(true)) {
|
||||
- jframe.setTitle("Minecraft server - shutting down!");
|
||||
+ jframe.setTitle("Purpur Minecraft server - shutting down!"); // Purpur
|
||||
server.halt(true);
|
||||
servergui.runFinalizers();
|
||||
}
|
||||
@@ -159,7 +164,7 @@ public class MinecraftServerGui extends JComponent {
|
||||
|
||||
private JComponent buildChatPanel() {
|
||||
JPanel jpanel = new JPanel(new BorderLayout());
|
||||
- JTextArea jtextarea = new JTextArea();
|
||||
+ org.purpurmc.purpur.gui.JColorTextPane jtextarea = new org.purpurmc.purpur.gui.JColorTextPane(); // Purpur
|
||||
JScrollPane jscrollpane = new JScrollPane(jtextarea, 22, 30);
|
||||
|
||||
jtextarea.setEditable(false);
|
||||
@@ -171,10 +176,43 @@ public class MinecraftServerGui extends JComponent {
|
||||
|
||||
if (!s.isEmpty()) {
|
||||
this.server.handleConsoleInput(s, this.server.createCommandSourceStack());
|
||||
+ // Purpur start
|
||||
+ history.add(s);
|
||||
+ historyIndex = -1;
|
||||
+ // Purpur end
|
||||
}
|
||||
|
||||
jtextfield.setText("");
|
||||
});
|
||||
+ // Purpur start
|
||||
+ jtextfield.getInputMap().put(javax.swing.KeyStroke.getKeyStroke("UP"), "up");
|
||||
+ jtextfield.getInputMap().put(javax.swing.KeyStroke.getKeyStroke("DOWN"), "down");
|
||||
+ jtextfield.getActionMap().put("up", new javax.swing.AbstractAction() {
|
||||
+ @Override
|
||||
+ public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
|
||||
+ if (historyIndex < 0) {
|
||||
+ currentCommand = jtextfield.getText();
|
||||
+ }
|
||||
+ if (historyIndex < history.size() - 1) {
|
||||
+ jtextfield.setText(history.get(++historyIndex));
|
||||
+ }
|
||||
+ }
|
||||
+ });
|
||||
+ jtextfield.getActionMap().put("down", new javax.swing.AbstractAction() {
|
||||
+ @Override
|
||||
+ public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
|
||||
+ if (historyIndex >= 0) {
|
||||
+ if (historyIndex == 0) {
|
||||
+ --historyIndex;
|
||||
+ jtextfield.setText(currentCommand);
|
||||
+ } else {
|
||||
+ --historyIndex;
|
||||
+ jtextfield.setText(history.get(historyIndex));
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ });
|
||||
+ // Purpur end
|
||||
jtextarea.addFocusListener(new FocusAdapter() {
|
||||
public void focusGained(FocusEvent focusevent) {}
|
||||
});
|
||||
@@ -210,7 +248,7 @@ public class MinecraftServerGui extends JComponent {
|
||||
}
|
||||
|
||||
private static final java.util.regex.Pattern ANSI = java.util.regex.Pattern.compile("\\e\\[[\\d;]*[^\\d;]"); // CraftBukkit // Paper
|
||||
- public void print(JTextArea textArea, JScrollPane scrollPane, String message) {
|
||||
+ public void print(org.purpurmc.purpur.gui.JColorTextPane textArea, JScrollPane scrollPane, String message) { // Purpur
|
||||
if (!SwingUtilities.isEventDispatchThread()) {
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
this.print(textArea, scrollPane, message);
|
||||
@@ -224,11 +262,14 @@ public class MinecraftServerGui extends JComponent {
|
||||
flag = (double) jscrollbar.getValue() + jscrollbar.getSize().getHeight() + (double) (MinecraftServerGui.MONOSPACED.getSize() * 4) > (double) jscrollbar.getMaximum();
|
||||
}
|
||||
|
||||
+ /* // Purpur
|
||||
try {
|
||||
document.insertString(document.getLength(), MinecraftServerGui.ANSI.matcher(message).replaceAll(""), (AttributeSet) null); // CraftBukkit
|
||||
} catch (BadLocationException badlocationexception) {
|
||||
;
|
||||
}
|
||||
+ */ // Purpur
|
||||
+ textArea.append(message); // Purpur
|
||||
|
||||
if (flag) {
|
||||
jscrollbar.setValue(Integer.MAX_VALUE);
|
||||
@@ -236,4 +277,16 @@ public class MinecraftServerGui extends JComponent {
|
||||
|
||||
}
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ public static class CommandHistory extends java.util.LinkedList<String> {
|
||||
+ @Override
|
||||
+ public boolean add(String command) {
|
||||
+ if (size() > 1000) {
|
||||
+ remove();
|
||||
+ }
|
||||
+ return super.offerFirst(command);
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/gui/GUIColor.java b/src/main/java/org/purpurmc/purpur/gui/GUIColor.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..550222758bf0e7deff26a6e813a860b7be365e87
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/purpurmc/purpur/gui/GUIColor.java
|
||||
@@ -0,0 +1,58 @@
|
||||
+package org.purpurmc.purpur.gui;
|
||||
+
|
||||
+import net.md_5.bungee.api.ChatColor;
|
||||
+
|
||||
+import java.awt.Color;
|
||||
+import java.util.HashMap;
|
||||
+import java.util.Map;
|
||||
+
|
||||
+public enum GUIColor {
|
||||
+ BLACK(ChatColor.BLACK, new Color(0x000000)),
|
||||
+ DARK_BLUE(ChatColor.DARK_BLUE, new Color(0x0000AA)),
|
||||
+ DARK_GREEN(ChatColor.DARK_GREEN, new Color(0x00AA00)),
|
||||
+ DARK_AQUA(ChatColor.DARK_AQUA, new Color(0x009999)),
|
||||
+ DARK_RED(ChatColor.DARK_RED, new Color(0xAA0000)),
|
||||
+ DARK_PURPLE(ChatColor.DARK_PURPLE, new Color(0xAA00AA)),
|
||||
+ GOLD(ChatColor.GOLD, new Color(0xBB8800)),
|
||||
+ GRAY(ChatColor.GRAY, new Color(0x888888)),
|
||||
+ DARK_GRAY(ChatColor.DARK_GRAY, new Color(0x444444)),
|
||||
+ BLUE(ChatColor.BLUE, new Color(0x5555FF)),
|
||||
+ GREEN(ChatColor.GREEN, new Color(0x55FF55)),
|
||||
+ AQUA(ChatColor.AQUA, new Color(0x55DDDD)),
|
||||
+ RED(ChatColor.RED, new Color(0xFF5555)),
|
||||
+ LIGHT_PURPLE(ChatColor.LIGHT_PURPLE, new Color(0xFF55FF)),
|
||||
+ YELLOW(ChatColor.YELLOW, new Color(0xFFBB00)),
|
||||
+ WHITE(ChatColor.WHITE, new Color(0xBBBBBB));
|
||||
+
|
||||
+ private final ChatColor chat;
|
||||
+ private final Color color;
|
||||
+
|
||||
+ private static final Map<ChatColor, GUIColor> BY_CHAT = new HashMap<>();
|
||||
+
|
||||
+ GUIColor(ChatColor chat, Color color) {
|
||||
+ this.chat = chat;
|
||||
+ this.color = color;
|
||||
+ }
|
||||
+
|
||||
+ public Color getColor() {
|
||||
+ return color;
|
||||
+ }
|
||||
+
|
||||
+ public ChatColor getChatColor() {
|
||||
+ return chat;
|
||||
+ }
|
||||
+
|
||||
+ public String getCode() {
|
||||
+ return chat.toString();
|
||||
+ }
|
||||
+
|
||||
+ public static GUIColor getColor(ChatColor chat) {
|
||||
+ return BY_CHAT.get(chat);
|
||||
+ }
|
||||
+
|
||||
+ static {
|
||||
+ for (GUIColor color : values()) {
|
||||
+ BY_CHAT.put(color.chat, color);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/gui/JColorTextPane.java b/src/main/java/org/purpurmc/purpur/gui/JColorTextPane.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..d75fb5e77eff27d86135ed7d605dbc250b660f7d
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/purpurmc/purpur/gui/JColorTextPane.java
|
||||
@@ -0,0 +1,83 @@
|
||||
+package org.purpurmc.purpur.gui;
|
||||
+
|
||||
+import com.google.common.collect.Sets;
|
||||
+import javax.swing.UIManager;
|
||||
+import net.md_5.bungee.api.chat.BaseComponent;
|
||||
+import net.md_5.bungee.api.chat.TextComponent;
|
||||
+
|
||||
+import javax.swing.JTextPane;
|
||||
+import javax.swing.Timer;
|
||||
+import javax.swing.text.AttributeSet;
|
||||
+import javax.swing.text.BadLocationException;
|
||||
+import javax.swing.text.SimpleAttributeSet;
|
||||
+import javax.swing.text.StyleConstants;
|
||||
+import javax.swing.text.StyleContext;
|
||||
+import java.util.Set;
|
||||
+
|
||||
+public class JColorTextPane extends JTextPane {
|
||||
+ private static final GUIColor DEFAULT_COLOR;
|
||||
+ static {
|
||||
+ DEFAULT_COLOR = UIManager.getSystemLookAndFeelClassName().equals("com.sun.java.swing.plaf.gtk.GTKLookAndFeel")
|
||||
+ ? GUIColor.WHITE : GUIColor.BLACK;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ public void append(String msg) {
|
||||
+ // TODO: update to use adventure instead
|
||||
+ BaseComponent[] components = TextComponent.fromLegacyText(DEFAULT_COLOR.getCode() + msg, DEFAULT_COLOR.getChatColor());
|
||||
+ for (BaseComponent component : components) {
|
||||
+ String text = component.toPlainText();
|
||||
+ if (text == null || text.isEmpty()) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ GUIColor guiColor = GUIColor.getColor(component.getColor());
|
||||
+
|
||||
+ StyleContext context = StyleContext.getDefaultStyleContext();
|
||||
+ AttributeSet attr = context.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, guiColor.getColor());
|
||||
+ attr = context.addAttribute(attr, StyleConstants.CharacterConstants.Bold, component.isBold() || guiColor != DEFAULT_COLOR);
|
||||
+ attr = context.addAttribute(attr, StyleConstants.CharacterConstants.Italic, component.isItalic());
|
||||
+ attr = context.addAttribute(attr, StyleConstants.CharacterConstants.Underline, component.isUnderlined());
|
||||
+ attr = context.addAttribute(attr, StyleConstants.CharacterConstants.StrikeThrough, component.isStrikethrough());
|
||||
+ //attr = context.addAttribute(attr, StyleConstants.CharacterConstants.Blink, component.isObfuscated()); // no such thing as Blink, sadly
|
||||
+
|
||||
+ try {
|
||||
+ int pos = getDocument().getLength();
|
||||
+ getDocument().insertString(pos, text, attr);
|
||||
+
|
||||
+ if (component.isObfuscated()) {
|
||||
+ // dirty hack to blink some text
|
||||
+ Blink blink = new Blink(pos, text.length(), attr, context.addAttribute(attr, StyleConstants.Foreground, getBackground()));
|
||||
+ BLINKS.add(blink);
|
||||
+ }
|
||||
+ } catch (BadLocationException ignore) {
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ private static final Set<Blink> BLINKS = Sets.newHashSet();
|
||||
+ private static boolean SYNC_BLINK;
|
||||
+
|
||||
+ static {
|
||||
+ new Timer(500, e -> {
|
||||
+ SYNC_BLINK = !SYNC_BLINK;
|
||||
+ BLINKS.forEach(Blink::blink);
|
||||
+ }).start();
|
||||
+ }
|
||||
+
|
||||
+ public class Blink {
|
||||
+ private final int start, length;
|
||||
+ private final AttributeSet attr1, attr2;
|
||||
+
|
||||
+ private Blink(int start, int length, AttributeSet attr1, AttributeSet attr2) {
|
||||
+ this.start = start;
|
||||
+ this.length = length;
|
||||
+ this.attr1 = attr1;
|
||||
+ this.attr2 = attr2;
|
||||
+ }
|
||||
+
|
||||
+ private void blink() {
|
||||
+ getStyledDocument().setCharacterAttributes(start, length, SYNC_BLINK ? attr1 : attr2, true);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
|
||||
index 675cd61221e807aadf28322b46c3daa1370241b5..0769f5c4711a3b7f59489e611ed01ad8367e5db1 100644
|
||||
--- a/src/main/resources/log4j2.xml
|
||||
+++ b/src/main/resources/log4j2.xml
|
||||
@@ -2,7 +2,16 @@
|
||||
<Configuration status="WARN" packages="com.mojang.util" shutdownHook="disable">
|
||||
<Appenders>
|
||||
<Queue name="ServerGuiConsole">
|
||||
- <PatternLayout pattern="[%d{HH:mm:ss} %level]: %msg%n" />
|
||||
+ <!-- Purpur start - copied from TerminalConsole -->
|
||||
+ <PatternLayout>
|
||||
+ <LoggerNamePatternSelector defaultPattern="%highlightGUIError{[%d{HH:mm:ss} %level]: [%logger] %stripAnsi{%msg}%n%xEx{full}}">
|
||||
+ <!-- Log root, Minecraft, Mojang and Bukkit loggers without prefix -->
|
||||
+ <!-- Disable prefix for various plugins that bypass the plugin logger -->
|
||||
+ <PatternMatch key=",net.minecraft.,Minecraft,com.mojang.,com.sk89q.,ru.tehkode.,Minecraft.AWE"
|
||||
+ pattern="%highlightGUIError{[%d{HH:mm:ss} %level]: %stripAnsi{%msg}%n%xEx{full}}" />
|
||||
+ </LoggerNamePatternSelector>
|
||||
+ </PatternLayout>
|
||||
+ <!-- Purpur end -->
|
||||
</Queue>
|
||||
<TerminalConsole name="TerminalConsole">
|
||||
<PatternLayout>
|
||||
@@ -1,59 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: MrFishCakes <FinlayOxby@outlook.com>
|
||||
Date: Sun, 2 Jul 2023 00:50:14 +0100
|
||||
Subject: [PATCH] Shears can defuse TNT
|
||||
|
||||
Shears can now defuse TNT. Each world can have a configured chance for the TNT to be defused when right clicking with a set of shears and damage dealt to the shears accordingly. If the TNT is defused then it will drop the TNT item instead and the entity removed from the world no longer existing. All the interaction is handled within the net.minecraft.world.entity.item.PrimedTnt class similar to how it is handled for when sheep are sheared.
|
||||
|
||||
By default the option is disabled to avoid breaking any possible vanilla mechanics.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
|
||||
index e712bd07ea2946167782473a536e0c72fab4bccd..6d934405cd18d63943171448743cafd5c52026e2 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
|
||||
@@ -200,4 +200,29 @@ public class PrimedTnt extends Entity implements TraceableEntity {
|
||||
return !level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid();
|
||||
}
|
||||
// Paper end - Option to prevent TNT from moving in water
|
||||
+ // Purpur start - Shears can defuse TNT
|
||||
+ @Override
|
||||
+ public net.minecraft.world.InteractionResult interact(net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand) {
|
||||
+ if (!level().isClientSide && level().purpurConfig.shearsCanDefuseTnt) {
|
||||
+ final net.minecraft.world.item.ItemStack inHand = player.getItemInHand(hand);
|
||||
+
|
||||
+ if (!inHand.is(net.minecraft.world.item.Items.SHEARS) || !player.getBukkitEntity().hasPermission("purpur.tnt.defuse") ||
|
||||
+ level().random.nextFloat() > level().purpurConfig.shearsCanDefuseTntChance) return net.minecraft.world.InteractionResult.PASS;
|
||||
+
|
||||
+ net.minecraft.world.entity.item.ItemEntity tntItem = new net.minecraft.world.entity.item.ItemEntity(level(), getX(), getY(), getZ(),
|
||||
+ new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.TNT));
|
||||
+ tntItem.setPickUpDelay(10);
|
||||
+
|
||||
+ inHand.hurtAndBreak(1, player, entity -> entity.broadcastBreakEvent(hand));
|
||||
+ level().addFreshEntity(tntItem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM);
|
||||
+
|
||||
+ this.playSound(net.minecraft.sounds.SoundEvents.SHEEP_SHEAR);
|
||||
+
|
||||
+ this.kill();
|
||||
+ return net.minecraft.world.InteractionResult.SUCCESS;
|
||||
+ }
|
||||
+
|
||||
+ return super.interact(player, hand);
|
||||
+ }
|
||||
+ // Purpur end - Shears can defuse TNT
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 24e3ebf13e6af6d4bddb85976b30ef894278ce20..a35837a4d089658b4a19ebf63690e5371e1515cd 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -3276,4 +3276,11 @@ public class PurpurWorldConfig {
|
||||
cauldronDripstoneWaterFillChance = (float) getDouble("blocks.cauldron.fill-chances.dripstone-water", cauldronDripstoneWaterFillChance);
|
||||
cauldronDripstoneLavaFillChance = (float) getDouble("blocks.cauldron.fill-chances.dripstone-lava", cauldronDripstoneLavaFillChance);
|
||||
}
|
||||
+
|
||||
+ public float shearsCanDefuseTntChance = 0.00F;
|
||||
+ public boolean shearsCanDefuseTnt = false;
|
||||
+ private void shearsCanDefuseTntSettings() {
|
||||
+ shearsCanDefuseTntChance = (float) getDouble("gameplay-mechanics.item.shears.defuse-tnt-chance", 0.00D);
|
||||
+ shearsCanDefuseTnt = shearsCanDefuseTntChance > 0.00F;
|
||||
+ }
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Wed, 5 Jul 2023 12:48:15 -0500
|
||||
Subject: [PATCH] Explorer Map API
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/item/MapItem.java b/src/main/java/net/minecraft/world/item/MapItem.java
|
||||
index d8dd99ec8bf7444c5a3c426db3a9c13e334dc0ff..8d3c1897044f9a2bbe1911e1a72dc9a00fb246df 100644
|
||||
--- a/src/main/java/net/minecraft/world/item/MapItem.java
|
||||
+++ b/src/main/java/net/minecraft/world/item/MapItem.java
|
||||
@@ -235,6 +235,7 @@ public class MapItem extends ComplexItem {
|
||||
MapItemSavedData worldmap = MapItem.getSavedData(map, world);
|
||||
|
||||
if (worldmap != null) {
|
||||
+ worldmap.isExplorerMap = true; // Purpur
|
||||
if (world.dimension() == worldmap.dimension) {
|
||||
int i = 1 << worldmap.scale;
|
||||
int j = worldmap.centerX;
|
||||
diff --git a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java
|
||||
index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..e1498d496aa01c433b6fa198608e33916eadecf3 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java
|
||||
@@ -67,6 +67,7 @@ public class MapItemSavedData extends SavedData {
|
||||
private final Map<String, MapFrame> frameMarkers = Maps.newHashMap();
|
||||
private int trackedDecorationCount;
|
||||
private org.bukkit.craftbukkit.map.RenderData vanillaRender = new org.bukkit.craftbukkit.map.RenderData(); // Paper
|
||||
+ public boolean isExplorerMap; // Purpur
|
||||
|
||||
// CraftBukkit start
|
||||
public final CraftMapView mapView;
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java
|
||||
index 15e9dd8844f893de5e8372b847c9e8295d6f69ca..b4b105c0190502328d5aeb680dd8e67c2875618f 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java
|
||||
@@ -46,4 +46,10 @@ public class CraftMapRenderer extends MapRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
+ // Purpur - start
|
||||
+ @Override
|
||||
+ public boolean isExplorerMap() {
|
||||
+ return this.worldMap.isExplorerMap;
|
||||
+ }
|
||||
+ // Purpur - end
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Fri, 21 Jul 2023 11:04:47 -0500
|
||||
Subject: [PATCH] Option Ocelot Spawn Under Sea Level
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java
|
||||
index af275fc579d66bb098c08e88e4186846a1174c02..3c5f25300d1c7800144a459cc8bf598352a62a35 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java
|
||||
@@ -295,7 +295,7 @@ public class Ocelot extends Animal {
|
||||
if (world.isUnobstructed(this) && !world.containsAnyLiquid(this.getBoundingBox())) {
|
||||
BlockPos blockposition = this.blockPosition();
|
||||
|
||||
- if (blockposition.getY() < world.getSeaLevel()) {
|
||||
+ if (!level().purpurConfig.ocelotSpawnUnderSeaLevel && blockposition.getY() < world.getSeaLevel()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index a35837a4d089658b4a19ebf63690e5371e1515cd..43c6f7bfac08c31e19df70fb92cd611fbbe03b30 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -2091,6 +2091,7 @@ public class PurpurWorldConfig {
|
||||
public int ocelotBreedingTicks = 6000;
|
||||
public boolean ocelotTakeDamageFromWater = false;
|
||||
public boolean ocelotAlwaysDropExp = false;
|
||||
+ public boolean ocelotSpawnUnderSeaLevel = false;
|
||||
private void ocelotSettings() {
|
||||
ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable);
|
||||
ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater);
|
||||
@@ -2104,6 +2105,7 @@ public class PurpurWorldConfig {
|
||||
ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks);
|
||||
ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater);
|
||||
ocelotAlwaysDropExp = getBoolean("mobs.ocelot.always-drop-exp", ocelotAlwaysDropExp);
|
||||
+ ocelotSpawnUnderSeaLevel = getBoolean("mobs.ocelot.spawn-below-sea-level", ocelotSpawnUnderSeaLevel);
|
||||
}
|
||||
|
||||
public boolean pandaRidable = false;
|
||||
@@ -1,66 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: granny <contact@granny.dev>
|
||||
Date: Sun, 13 Aug 2023 06:26:08 -0700
|
||||
Subject: [PATCH] add an option for piglins to ignore gold-trimmed armor
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java
|
||||
index 4f4f557b7f4232ec3b90dda43c6bed30521318ba..dd4313e0507d3adda0ec84c79f1af13ecc2d7ef3 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java
|
||||
@@ -599,20 +599,33 @@ public class PiglinAi {
|
||||
Iterator iterator = iterable.iterator();
|
||||
|
||||
Item item;
|
||||
+ ItemStack itemstack; // Purpur
|
||||
|
||||
do {
|
||||
if (!iterator.hasNext()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
- ItemStack itemstack = (ItemStack) iterator.next();
|
||||
+ itemstack = (ItemStack) iterator.next(); // Purpur
|
||||
|
||||
item = itemstack.getItem();
|
||||
- } while (!(item instanceof ArmorItem) || ((ArmorItem) item).getMaterial() != ArmorMaterials.GOLD);
|
||||
+ } while (!(item instanceof ArmorItem) || ((ArmorItem) item).getMaterial() != ArmorMaterials.GOLD && (!entity.level().purpurConfig.piglinIgnoresArmorWithGoldTrim || !isWearingGoldTrim(entity, itemstack))); // Purpur
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ private static boolean isWearingGoldTrim(LivingEntity entity, ItemStack itemstack) {
|
||||
+ Optional<net.minecraft.world.item.armortrim.ArmorTrim> optionalArmorTrim = net.minecraft.world.item.armortrim.ArmorTrim.getTrim(entity.level().registryAccess(), itemstack, true);
|
||||
+
|
||||
+ if (optionalArmorTrim.isEmpty()) return false;
|
||||
+
|
||||
+ net.minecraft.world.item.armortrim.ArmorTrim armorTrim = optionalArmorTrim.get();
|
||||
+
|
||||
+ return armorTrim.material().is(net.minecraft.world.item.armortrim.TrimMaterials.GOLD);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
private static void stopWalking(Piglin piglin) {
|
||||
piglin.getBrain().eraseMemory(MemoryModuleType.WALK_TARGET);
|
||||
piglin.getNavigation().stop();
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 43c6f7bfac08c31e19df70fb92cd611fbbe03b30..2cefa0a09e86e8d344de8b6fff8541d43f662b65 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -2260,6 +2260,7 @@ public class PurpurWorldConfig {
|
||||
public int piglinPortalSpawnModifier = 2000;
|
||||
public boolean piglinAlwaysDropExp = false;
|
||||
public double piglinHeadVisibilityPercent = 0.5D;
|
||||
+ public boolean piglinIgnoresArmorWithGoldTrim = false;
|
||||
private void piglinSettings() {
|
||||
piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable);
|
||||
piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater);
|
||||
@@ -2275,6 +2276,7 @@ public class PurpurWorldConfig {
|
||||
piglinPortalSpawnModifier = getInt("mobs.piglin.portal-spawn-modifier", piglinPortalSpawnModifier);
|
||||
piglinAlwaysDropExp = getBoolean("mobs.piglin.always-drop-exp", piglinAlwaysDropExp);
|
||||
piglinHeadVisibilityPercent = getDouble("mobs.piglin.head-visibility-percent", piglinHeadVisibilityPercent);
|
||||
+ piglinIgnoresArmorWithGoldTrim = getBoolean("mobs.piglin.ignores-armor-with-gold-trim", piglinIgnoresArmorWithGoldTrim);
|
||||
}
|
||||
|
||||
public boolean piglinBruteRidable = false;
|
||||
@@ -1,46 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: MelnCat <melncatuwu@gmail.com>
|
||||
Date: Tue, 22 Aug 2023 22:18:26 -0700
|
||||
Subject: [PATCH] Add option for always showing item in player death messages
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java
|
||||
index 925654e40a170d1a4af0b9fcde1b9b359f833064..bf06bb78d060bb54d9aaade3605d42ce837d598b 100644
|
||||
--- a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java
|
||||
+++ b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java
|
||||
@@ -53,7 +53,7 @@ public class CombatTracker {
|
||||
|
||||
private Component getMessageForAssistedFall(Entity attacker, Component attackerDisplayName, String itemDeathTranslationKey, String deathTranslationKey) {
|
||||
ItemStack itemStack = attacker instanceof LivingEntity livingEntity ? livingEntity.getMainHandItem() : ItemStack.EMPTY;
|
||||
- return !itemStack.isEmpty() && itemStack.hasCustomHoverName()
|
||||
+ return !itemStack.isEmpty() && (org.purpurmc.purpur.PurpurConfig.playerDeathsAlwaysShowItem || itemStack.hasCustomHoverName()) // Purpur
|
||||
? Component.translatable(itemDeathTranslationKey, this.mob.getDisplayName(), attackerDisplayName, itemStack.getDisplayName())
|
||||
: Component.translatable(deathTranslationKey, this.mob.getDisplayName(), attackerDisplayName);
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
||||
index 41651c877246f38c73cc9c81b37a0b86e5054cb9..a1724d2d545aa808ea380f910c0190658fc7881b 100644
|
||||
--- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
||||
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
||||
@@ -196,7 +196,7 @@ public class DamageSource {
|
||||
|
||||
ItemStack itemstack1 = itemstack;
|
||||
|
||||
- return !itemstack1.isEmpty() && itemstack1.hasCustomHoverName() ? Component.translatable(s + ".item", killed.getDisplayName(), ichatbasecomponent, itemstack1.getDisplayName()) : Component.translatable(s, killed.getDisplayName(), ichatbasecomponent);
|
||||
+ return !itemstack1.isEmpty() && (org.purpurmc.purpur.PurpurConfig.playerDeathsAlwaysShowItem || itemstack1.hasCustomHoverName()) ? Component.translatable(s + ".item", killed.getDisplayName(), ichatbasecomponent, itemstack1.getDisplayName()) : Component.translatable(s, killed.getDisplayName(), ichatbasecomponent);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index cd2c365bcaca0720dc543188a23ff585192cb76e..776d397fc31db121fa933a2ae2b4f1589fc10247 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -652,4 +652,9 @@ public class PurpurConfig {
|
||||
block.fallDistanceMultiplier = fallDistanceMultiplier.floatValue();
|
||||
});
|
||||
}
|
||||
+
|
||||
+ public static boolean playerDeathsAlwaysShowItem = false;
|
||||
+ private static void playerDeathsAlwaysShowItem() {
|
||||
+ playerDeathsAlwaysShowItem = getBoolean("settings.player-deaths-always-show-item", playerDeathsAlwaysShowItem);
|
||||
+ }
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: granny <contact@granny.dev>
|
||||
Date: Wed, 23 Aug 2023 01:39:14 -0700
|
||||
Subject: [PATCH] place end crystal on any block
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/item/EndCrystalItem.java b/src/main/java/net/minecraft/world/item/EndCrystalItem.java
|
||||
index faa3f62d22266a3c32d6c95c3ffebd4aa3880739..0cf62b1f64afa56c319392eafe0d444b7c5662c7 100644
|
||||
--- a/src/main/java/net/minecraft/world/item/EndCrystalItem.java
|
||||
+++ b/src/main/java/net/minecraft/world/item/EndCrystalItem.java
|
||||
@@ -26,7 +26,7 @@ public class EndCrystalItem extends Item {
|
||||
BlockPos blockposition = context.getClickedPos();
|
||||
BlockState iblockdata = world.getBlockState(blockposition);
|
||||
|
||||
- if (!iblockdata.is(Blocks.OBSIDIAN) && !iblockdata.is(Blocks.BEDROCK)) {
|
||||
+ if (!world.purpurConfig.endCrystalPlaceAnywhere && !iblockdata.is(Blocks.OBSIDIAN) && !iblockdata.is(Blocks.BEDROCK)) {
|
||||
return InteractionResult.FAIL;
|
||||
} else {
|
||||
BlockPos blockposition1 = blockposition.above(); final BlockPos aboveBlockPosition = blockposition1; // Paper - OBFHELPER
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 2cefa0a09e86e8d344de8b6fff8541d43f662b65..28ecc0e7d61a1c0a62bc0ec096cd601a45fa02db 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -969,6 +969,7 @@ public class PurpurWorldConfig {
|
||||
public boolean basedEndCrystalExplosionFire = false;
|
||||
public net.minecraft.world.level.Level.ExplosionInteraction basedEndCrystalExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK;
|
||||
public int endCrystalCramming = 0;
|
||||
+ public boolean endCrystalPlaceAnywhere = false;
|
||||
private void endCrystalSettings() {
|
||||
if (PurpurConfig.version < 31) {
|
||||
if ("DESTROY".equals(getString("blocks.end-crystal.baseless.explosion-effect", baselessEndCrystalExplosionEffect.name()))) {
|
||||
@@ -997,6 +998,7 @@ public class PurpurWorldConfig {
|
||||
basedEndCrystalExplosionEffect = net.minecraft.world.level.Level.ExplosionInteraction.BLOCK;
|
||||
}
|
||||
endCrystalCramming = getInt("blocks.end-crystal.cramming-amount", endCrystalCramming);
|
||||
+ endCrystalPlaceAnywhere = getBoolean("gameplay-mechanics.item.end-crystal.place-anywhere", endCrystalPlaceAnywhere);
|
||||
}
|
||||
|
||||
public boolean farmlandBypassMobGriefing = false;
|
||||
@@ -1,28 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Meln Cat <melncatuwu@gmail.com>
|
||||
Date: Mon, 2 Oct 2023 17:42:26 -0700
|
||||
Subject: [PATCH] Add hover lines API
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
||||
index 71aac5d4cf29cea9daa378fc8ac584750de4d1ca..0496871db7437322d3932ca3d3504d84af832d90 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
|
||||
@@ -596,4 +596,17 @@ public final class CraftItemFactory implements ItemFactory {
|
||||
return CraftItemStack.asCraftMirror(enchanted);
|
||||
}
|
||||
// Paper end - enchantWithLevels API
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ public @org.jetbrains.annotations.NotNull java.util.List<net.kyori.adventure.text.@org.jetbrains.annotations.NotNull Component> getHoverLines(@org.jetbrains.annotations.NotNull ItemStack itemStack, boolean advanced) {
|
||||
+ return io.papermc.paper.adventure.PaperAdventure.asAdventure(
|
||||
+ CraftItemStack.asNMSCopy(itemStack).getTooltipLines(
|
||||
+ null,
|
||||
+ advanced ? net.minecraft.world.item.TooltipFlag.ADVANCED
|
||||
+ : net.minecraft.world.item.TooltipFlag.NORMAL
|
||||
+ )
|
||||
+ );
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Meln Cat <melncatuwu@gmail.com>
|
||||
Date: Mon, 9 Oct 2023 12:21:49 -0700
|
||||
Subject: [PATCH] Add option to disable the copper oxidation proximity penalty
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java b/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java
|
||||
index daae7fd6e0148cfba8e359d990748a0c83a3376e..0e06b1bcd906e92c083dc74d56d6d0a2a36f62a7 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/ChangeOverTimeBlock.java
|
||||
@@ -67,7 +67,7 @@ public interface ChangeOverTimeBlock<T extends Enum<T>> {
|
||||
}
|
||||
|
||||
float f = (float) (k + 1) / (float) (k + j + 1);
|
||||
- float f1 = f * f * this.getChanceModifier();
|
||||
+ float f1 = world.purpurConfig.disableOxidationProximityPenalty ? this.getChanceModifier() : f * f * this.getChanceModifier(); // Purpur
|
||||
|
||||
return random.nextFloat() < f1 ? this.getNext(state) : Optional.empty();
|
||||
}
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 28ecc0e7d61a1c0a62bc0ec096cd601a45fa02db..002c9bba93dede25111c653ec1df38316f19421f 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -145,6 +145,7 @@ public class PurpurWorldConfig {
|
||||
public boolean rainStopsAfterSleep = true;
|
||||
public boolean thunderStopsAfterSleep = true;
|
||||
public int mobLastHurtByPlayerTime = 100;
|
||||
+ public boolean disableOxidationProximityPenalty = false;
|
||||
private void miscGameplayMechanicsSettings() {
|
||||
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
|
||||
mendingMultiplier = getDouble("gameplay-mechanics.mending-multiplier", mendingMultiplier);
|
||||
@@ -173,6 +174,7 @@ public class PurpurWorldConfig {
|
||||
rainStopsAfterSleep = getBoolean("gameplay-mechanics.rain-stops-after-sleep", rainStopsAfterSleep);
|
||||
thunderStopsAfterSleep = getBoolean("gameplay-mechanics.thunder-stops-after-sleep", thunderStopsAfterSleep);
|
||||
mobLastHurtByPlayerTime = getInt("gameplay-mechanics.mob-last-hurt-by-player-time", mobLastHurtByPlayerTime);
|
||||
+ disableOxidationProximityPenalty = getBoolean("gameplay-mechanics.disable-oxidation-proximity-penalty", disableOxidationProximityPenalty);
|
||||
}
|
||||
|
||||
public int daytimeTicks = 12000;
|
||||
@@ -1,50 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: granny <contact@granny.dev>
|
||||
Date: Sun, 18 Feb 2024 16:28:32 -0800
|
||||
Subject: [PATCH] register minecraft debug commands
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
||||
index b6cc108c2d4361e6f415cfc3ff8c7699a8e222f4..b203394ed62807e7d5df433830993f1d2ee14939 100644
|
||||
--- a/src/main/java/net/minecraft/commands/Commands.java
|
||||
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
||||
@@ -221,8 +221,8 @@ public class Commands {
|
||||
JfrCommand.register(this.dispatcher);
|
||||
}
|
||||
|
||||
- if (SharedConstants.IS_RUNNING_IN_IDE) {
|
||||
- TestCommand.register(this.dispatcher);
|
||||
+ if (org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands || SharedConstants.IS_RUNNING_IN_IDE) { // Purpur
|
||||
+ if (!org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands) TestCommand.register(this.dispatcher); // Purpur
|
||||
ResetChunksCommand.register(this.dispatcher);
|
||||
RaidCommand.register(this.dispatcher);
|
||||
DebugPathCommand.register(this.dispatcher);
|
||||
diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java
|
||||
index bc391d27399d8c22e78735ca39aa8ab45efb6413..4ef8eaad4485a2ee920f80556f9dda04e59d2b2a 100644
|
||||
--- a/src/main/java/net/minecraft/server/Main.java
|
||||
+++ b/src/main/java/net/minecraft/server/Main.java
|
||||
@@ -130,6 +130,10 @@ public class Main {
|
||||
// Paper start - load config files early for access below if needed
|
||||
org.bukkit.configuration.file.YamlConfiguration bukkitConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("bukkit-settings"));
|
||||
org.bukkit.configuration.file.YamlConfiguration spigotConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("spigot-settings"));
|
||||
+ // Purpur start
|
||||
+ org.bukkit.configuration.file.YamlConfiguration purpurConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("purpur-settings"));
|
||||
+ org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands = purpurConfiguration.getBoolean("settings.register-minecraft-debug-commands");
|
||||
+ // Purpur end
|
||||
// Paper end - load config files early for access below if needed
|
||||
|
||||
if (optionset.has("initSettings")) { // CraftBukkit
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index 776d397fc31db121fa933a2ae2b4f1589fc10247..efe25d3894f3ad000257c72d9a5e06ef22446d41 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -657,4 +657,9 @@ public class PurpurConfig {
|
||||
private static void playerDeathsAlwaysShowItem() {
|
||||
playerDeathsAlwaysShowItem = getBoolean("settings.player-deaths-always-show-item", playerDeathsAlwaysShowItem);
|
||||
}
|
||||
+
|
||||
+ public static boolean registerMinecraftDebugCommands = false;
|
||||
+ private static void registerMinecraftDebugCommands() {
|
||||
+ registerMinecraftDebugCommands = getBoolean("settings.register-minecraft-debug-commands", registerMinecraftDebugCommands);
|
||||
+ }
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Pantera <zeruskr@gmail.com>
|
||||
Date: Fri, 26 Jan 2024 15:57:24 +0900
|
||||
Subject: [PATCH] Configurable-villager-search-radius
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
||||
index e1b6fe9ecda25f86431baf414f1bfd3a26a8b2bd..6499e3fe49e453db11e51eaf717ca8b3b682056b 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
||||
@@ -73,7 +73,7 @@ public class AcquirePoi {
|
||||
};
|
||||
// Paper start - optimise POI access
|
||||
java.util.List<Pair<Holder<PoiType>, BlockPos>> poiposes = new java.util.ArrayList<>();
|
||||
- io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, poiPredicate, predicate2, entity.blockPosition(), 48, 48*48, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes);
|
||||
+ io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, poiPredicate, predicate2, entity.blockPosition(), world.purpurConfig.villagerAcquirePoiSearchRadius, world.purpurConfig.villagerAcquirePoiSearchRadius*world.purpurConfig.villagerAcquirePoiSearchRadius, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes); // Purpur
|
||||
Set<Pair<Holder<PoiType>, BlockPos>> set = new java.util.HashSet<>(poiposes);
|
||||
// Paper end - optimise POI access
|
||||
Path path = findPathToPois(entity, set);
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java
|
||||
index 92731b6b593289e9f583c9b705b219e81fcd8e73..9104d7010bda6f9f73b478c11490ef9c53f76da2 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java
|
||||
@@ -56,7 +56,7 @@ public class NearestBedSensor extends Sensor<Mob> {
|
||||
// Paper start - optimise POI access
|
||||
java.util.List<Pair<Holder<PoiType>, BlockPos>> poiposes = new java.util.ArrayList<>();
|
||||
// don't ask me why it's unbounded. ask mojang.
|
||||
- io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), 48, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes);
|
||||
+ io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), world.purpurConfig.villagerNearestBedSensorSearchRadius, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes); // Purpur
|
||||
Path path = AcquirePoi.findPathToPois(entity, new java.util.HashSet<>(poiposes));
|
||||
// Paper end - optimise POI access
|
||||
if (path != null && path.canReach()) {
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
index 002c9bba93dede25111c653ec1df38316f19421f..7dc82ffccc157a17335f1bc56ab81be3813294f6 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
||||
@@ -2890,6 +2890,8 @@ public class PurpurWorldConfig {
|
||||
public boolean villagerDisplayTradeItem = true;
|
||||
public int villagerSpawnIronGolemRadius = 0;
|
||||
public int villagerSpawnIronGolemLimit = 0;
|
||||
+ public int villagerAcquirePoiSearchRadius = 48;
|
||||
+ public int villagerNearestBedSensorSearchRadius = 48;
|
||||
private void villagerSettings() {
|
||||
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
|
||||
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
|
||||
@@ -2926,6 +2928,8 @@ public class PurpurWorldConfig {
|
||||
villagerDisplayTradeItem = getBoolean("mobs.villager.display-trade-item", villagerDisplayTradeItem);
|
||||
villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius);
|
||||
villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit);
|
||||
+ villagerAcquirePoiSearchRadius = getInt("mobs.villager.search-radius.acquire-poi", villagerAcquirePoiSearchRadius);
|
||||
+ villagerNearestBedSensorSearchRadius = getInt("mobs.villager.search-radius.nearest-bed-sensor", villagerNearestBedSensorSearchRadius);
|
||||
}
|
||||
|
||||
public boolean vindicatorRidable = false;
|
||||
Reference in New Issue
Block a user