Add removed patches directory

This commit is contained in:
William Blake Galbreath
2020-06-28 22:30:19 -05:00
parent 1a46c4bc6b
commit 2cdce3ee87
35 changed files with 16117 additions and 0 deletions

View File

@@ -0,0 +1,120 @@
From 0c20fdc1cc34d29b9135326be5db514107bb6766 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 4 May 2019 00:57:16 -0500
Subject: [PATCH] Ridables
---
.../paper/entity/ai/VanillaGoal.java | 4 ++
.../event/entity/RidableSpacebarEvent.java | 37 ++++++++++++++++++
src/main/java/org/bukkit/entity/Entity.java | 38 +++++++++++++++++++
3 files changed, 79 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/event/entity/RidableSpacebarEvent.java
diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java
index d23ad96ee..36d37e9a3 100644
--- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java
+++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java
@@ -154,6 +154,10 @@ public interface VanillaGoal<T extends Mob> extends Goal<T> {
GoalKey<Mob> FOLLOW_ENTITY = GoalKey.of(Mob.class, NamespacedKey.minecraft("follow_entity"));
GoalKey<Tameable> FOLLOW_OWNER = GoalKey.of(Tameable.class, NamespacedKey.minecraft("follow_owner"));
GoalKey<Animals> FOLLOW_PARENT = GoalKey.of(Animals.class, NamespacedKey.minecraft("follow_parent"));
+ // Purpur start
+ GoalKey<Phantom> FIND_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal_goal"));
+ GoalKey<Phantom> ORBIT_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal_goal"));
+ // Purpur end
GoalKey<SkeletonHorse> HORSE_TRAP = GoalKey.of(SkeletonHorse.class, NamespacedKey.minecraft("horse_trap"));
GoalKey<Creature> HURT_BY_TARGET = GoalKey.of(Creature.class, NamespacedKey.minecraft("hurt_by_target"));
GoalKey<Mob> INTERACT = GoalKey.of(Mob.class, NamespacedKey.minecraft("interact"));
diff --git a/src/main/java/net/pl3x/purpur/event/entity/RidableSpacebarEvent.java b/src/main/java/net/pl3x/purpur/event/entity/RidableSpacebarEvent.java
new file mode 100644
index 000000000..c0ec5a130
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/event/entity/RidableSpacebarEvent.java
@@ -0,0 +1,37 @@
+package net.pl3x.purpur.event.entity;
+
+import org.bukkit.entity.Entity;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.NotNull;
+
+public class RidableSpacebarEvent extends EntityEvent implements Cancellable {
+ private static final HandlerList handlers = new HandlerList();
+ private boolean cancelled;
+
+ public RidableSpacebarEvent(@NotNull Entity entity) {
+ super(entity);
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ cancelled = cancel;
+ }
+
+ @Override
+ @NotNull
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
index 3f0f38031..25372c58b 100644
--- a/src/main/java/org/bukkit/entity/Entity.java
+++ b/src/main/java/org/bukkit/entity/Entity.java
@@ -659,4 +659,42 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
@NotNull
org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason getEntitySpawnReason();
// Paper end
+
+ // Purpur start
+ /**
+ * Get the riding player
+ *
+ * @return Riding player
+ */
+ @Nullable
+ Player getRider();
+
+ /**
+ * Check if entity is being ridden
+ *
+ * @return True if being ridden
+ */
+ boolean hasRider();
+
+ /**
+ * Check if entity is ridable
+ *
+ * @return True if ridable
+ */
+ boolean isRidable();
+
+ /**
+ * Check if entity is ridable in water
+ *
+ * @return True if ridable in water
+ */
+ boolean isRidableInWater();
+
+ /**
+ * Check if shift is required to mount this entity
+ *
+ * @return True if shift is required
+ */
+ boolean requireShiftToMount();
+ // Purpur end
}
--
2.26.2

View File

@@ -0,0 +1,142 @@
From acabe1261f9db72988a29d0d72ee138b7c0cf221 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Tue, 31 Dec 2019 23:00:07 -0600
Subject: [PATCH] Remove pointless annotations and deprecations
---
src/main/java/org/bukkit/Bukkit.java | 3 ---
src/main/java/org/bukkit/Server.java | 3 ---
src/main/java/org/bukkit/command/CommandExecutor.java | 2 +-
src/main/java/org/bukkit/command/TabCompleter.java | 2 +-
src/main/java/org/bukkit/inventory/ItemStack.java | 8 --------
src/main/java/org/bukkit/plugin/java/JavaPlugin.java | 4 ++--
src/test/java/org/bukkit/AnnotationTest.java | 5 +++++
7 files changed, 9 insertions(+), 18 deletions(-)
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index a9c10228e..780d603e4 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
@@ -863,13 +863,10 @@ public final class Bukkit {
* This will return an object even if the player does not exist. To this
* method, all players will exist.
*
- * @deprecated Persistent storage of users should be by UUID as names are no longer
- * unique past a single session.
* @param name the name the player to retrieve
* @return an offline player
* @see #getOfflinePlayer(java.util.UUID)
*/
- @Deprecated
@NotNull
public static OfflinePlayer getOfflinePlayer(@NotNull String name) {
return server.getOfflinePlayer(name);
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index ab1d082a4..a4cf71fb4 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -722,13 +722,10 @@ public interface Server extends PluginMessageRecipient {
* This will return an object even if the player does not exist. To this
* method, all players will exist.
*
- * @deprecated Persistent storage of users should be by UUID as names are no longer
- * unique past a single session.
* @param name the name the player to retrieve
* @return an offline player
* @see #getOfflinePlayer(java.util.UUID)
*/
- @Deprecated
@NotNull
public OfflinePlayer getOfflinePlayer(@NotNull String name);
diff --git a/src/main/java/org/bukkit/command/CommandExecutor.java b/src/main/java/org/bukkit/command/CommandExecutor.java
index 45cb8da12..383b43e1b 100644
--- a/src/main/java/org/bukkit/command/CommandExecutor.java
+++ b/src/main/java/org/bukkit/command/CommandExecutor.java
@@ -19,5 +19,5 @@ public interface CommandExecutor {
* @param args Passed command arguments
* @return true if a valid command, otherwise false
*/
- public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args);
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args); // Purpur - remove pointless annotations
}
diff --git a/src/main/java/org/bukkit/command/TabCompleter.java b/src/main/java/org/bukkit/command/TabCompleter.java
index e9cf71f5c..34d3462c7 100644
--- a/src/main/java/org/bukkit/command/TabCompleter.java
+++ b/src/main/java/org/bukkit/command/TabCompleter.java
@@ -23,5 +23,5 @@ public interface TabCompleter {
* to default to the command executor
*/
@Nullable
- public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args);
+ public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args); // Purpur - remove pointless annotations
}
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index ccd81fca2..a8ade268c 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -204,13 +204,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable {
* Sets the durability of this item
*
* @param durability Durability of this item
- * @deprecated durability is now part of ItemMeta. To avoid confusion and
- * misuse, {@link #getItemMeta()}, {@link #setItemMeta(ItemMeta)} and
- * {@link Damageable#setDamage(int)} should be used instead. This is because
- * any call to this method will be overwritten by subsequent setting of
- * ItemMeta which was created before this call.
*/
- @Deprecated
public void setDurability(final short durability) {
ItemMeta meta = getItemMeta();
if (meta != null) {
@@ -223,9 +217,7 @@ public class ItemStack implements Cloneable, ConfigurationSerializable {
* Gets the durability of this item
*
* @return Durability of this item
- * @deprecated see {@link #setDurability(short)}
*/
- @Deprecated
public short getDurability() {
ItemMeta meta = getItemMeta();
return (meta == null) ? 0 : (short) ((Damageable) meta).getDamage();
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
index 04fa3991f..24d65491c 100644
--- a/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
+++ b/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
@@ -287,7 +287,7 @@ public abstract class JavaPlugin extends PluginBase {
* {@inheritDoc}
*/
@Override
- public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { // Purpur - remove pointless annotations
return false;
}
@@ -296,7 +296,7 @@ public abstract class JavaPlugin extends PluginBase {
*/
@Override
@Nullable
- public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
+ public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) { // Purpur - remove pointless annotations
return null;
}
diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
index a48be38b1..951b81e79 100644
--- a/src/test/java/org/bukkit/AnnotationTest.java
+++ b/src/test/java/org/bukkit/AnnotationTest.java
@@ -41,6 +41,11 @@ public class AnnotationTest {
"org/bukkit/plugin/java/PluginClassLoader",
// Generic functional interface
"org/bukkit/util/Consumer",
+ // Purpur start
+ "org/bukkit/command/CommandExecutor",
+ "org/bukkit/command/TabCompleter",
+ "org/bukkit/plugin/java/JavaPlugin",
+ // Purpur end
// Paper start
// Timings history is broken in terms of nullability due to guavas Function defining that the param is NonNull
"co/aikar/timings/TimingHistory$2",
--
2.26.2

View File

@@ -0,0 +1,59 @@
From e503ea72858416dd97bd79c5aae85a2834f11195 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sat, 11 Jan 2020 23:12:00 -0600
Subject: [PATCH] Add EntityPortalReadyEvent
---
.../event/entity/EntityPortalReadyEvent.java | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/event/entity/EntityPortalReadyEvent.java
diff --git a/src/main/java/net/pl3x/purpur/event/entity/EntityPortalReadyEvent.java b/src/main/java/net/pl3x/purpur/event/entity/EntityPortalReadyEvent.java
new file mode 100644
index 000000000..37f11c104
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/event/entity/EntityPortalReadyEvent.java
@@ -0,0 +1,40 @@
+package net.pl3x.purpur.event.entity;
+
+import org.bukkit.entity.Entity;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.entity.EntityEvent;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Called when an entity is ready to travel through a portal
+ */
+public class EntityPortalReadyEvent extends EntityEvent implements Cancellable {
+ private static final HandlerList handlers = new HandlerList();
+ private boolean cancelled = false;
+
+ public EntityPortalReadyEvent(@NotNull Entity entity) {
+ super(entity);
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return cancelled;
+ }
+
+ @Override
+ public void setCancelled(boolean cancel) {
+ this.cancelled = cancel;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
--
2.26.2

View File

@@ -0,0 +1,128 @@
From 97b09e0112fecb7c4bd3dacf078e7cedcf402cdd Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Fri, 12 Jul 2019 02:09:58 -0500
Subject: [PATCH] Implement ChunkTooLargeEvent
---
.../pl3x/purpur/event/ChunkTooLargeEvent.java | 109 ++++++++++++++++++
1 file changed, 109 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/event/ChunkTooLargeEvent.java
diff --git a/src/main/java/net/pl3x/purpur/event/ChunkTooLargeEvent.java b/src/main/java/net/pl3x/purpur/event/ChunkTooLargeEvent.java
new file mode 100644
index 000000000..f9d4a42c6
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/event/ChunkTooLargeEvent.java
@@ -0,0 +1,109 @@
+package net.pl3x.purpur.event;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Called when an oversized chunk loads or saves
+ */
+public class ChunkTooLargeEvent extends Event {
+ private static final HandlerList handlers = new HandlerList();
+ private final String worldName;
+ private final World world;
+ private final int chunkX;
+ private final int chunkZ;
+ private final boolean saving;
+ private final boolean overzealous;
+
+ public ChunkTooLargeEvent(@NotNull String worldName, int chunkX, int chunkZ, boolean saving, boolean overzealous) {
+ super(!Bukkit.isPrimaryThread());
+ this.worldName = worldName;
+ this.world = Bukkit.getWorld(worldName);
+ this.chunkX = chunkX;
+ this.chunkZ = chunkZ;
+ this.saving = saving;
+ this.overzealous = overzealous;
+ }
+
+ /**
+ * Get the world name according to the save directory
+ *
+ * @return World name
+ */
+ @NotNull
+ public String getWorldName() {
+ return worldName;
+ }
+
+ /**
+ * Get the world
+ *
+ * @return World, or null if world not loaded
+ */
+ @Nullable
+ public World getWorld() {
+ return world;
+ }
+
+ /**
+ * Get the X chunk coordinate
+ *
+ * @return X chunk coordinate
+ */
+ public int getChunkX() {
+ return chunkX;
+ }
+
+ /**
+ * Get the Z chunk coordinate
+ *
+ * @return Z chunk coordinate
+ */
+ public int getChunkZ() {
+ return chunkZ;
+ }
+
+ /**
+ * Whether this happened during a save attempt.
+ *
+ * @return True if saving, false if loading
+ */
+ public boolean isSaving() {
+ return saving;
+ }
+
+ /**
+ * If saving, was this is overzealous mode
+ *
+ * @return True if saving in overzealous mode
+ */
+ public boolean isOverzealous() {
+ return overzealous;
+ }
+
+ /**
+ * Get the location
+ *
+ * @return Location, or null if world not loaded
+ */
+ @Nullable
+ public Location getLocation() {
+ return world == null ? null : new Location(world, chunkX << 4, 128, chunkZ << 4);
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
--
2.26.2

View File

@@ -0,0 +1,132 @@
From 46a1c768adda232530d684c5ac49b69b6271cd04 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 19 Oct 2019 03:27:55 -0500
Subject: [PATCH] Add ThrownEggHatchEvent
---
.../event/entity/ThrownEggHatchEvent.java | 113 ++++++++++++++++++
1 file changed, 113 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/event/entity/ThrownEggHatchEvent.java
diff --git a/src/main/java/net/pl3x/purpur/event/entity/ThrownEggHatchEvent.java b/src/main/java/net/pl3x/purpur/event/entity/ThrownEggHatchEvent.java
new file mode 100644
index 000000000..815e871d0
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/event/entity/ThrownEggHatchEvent.java
@@ -0,0 +1,113 @@
+package net.pl3x.purpur.event.entity;
+
+import org.bukkit.entity.Egg;
+import org.bukkit.entity.EntityType;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Called when a thrown egg might hatch
+ */
+public class ThrownEggHatchEvent extends Event {
+ private static final HandlerList handlers = new HandlerList();
+
+ private final Egg egg;
+ private boolean hatching;
+ private EntityType hatchType;
+ private byte numHatches;
+
+ public ThrownEggHatchEvent(@NotNull final Egg egg, final boolean hatching, final byte numHatches, @NotNull final EntityType hatchingType) {
+ this.egg = egg;
+ this.hatching = hatching;
+ this.numHatches = numHatches;
+ this.hatchType = hatchingType;
+ }
+
+ /**
+ * Gets the egg involved in this event.
+ *
+ * @return the egg involved in this event
+ */
+ @NotNull
+ public Egg getEgg() {
+ return egg;
+ }
+
+ /**
+ * Gets whether the egg is hatching or not. Will be what the server
+ * would've done without interaction.
+ *
+ * @return boolean Whether the egg is going to hatch or not
+ */
+ public boolean isHatching() {
+ return hatching;
+ }
+
+ /**
+ * Sets whether the egg will hatch or not.
+ *
+ * @param hatching true if you want the egg to hatch, false if you want it not to
+ */
+ public void setHatching(boolean hatching) {
+ this.hatching = hatching;
+ }
+
+ /**
+ * Get the type of the mob being hatched (EntityType.CHICKEN by default)
+ *
+ * @return The type of the mob being hatched by the egg
+ */
+ @NotNull
+ public EntityType getHatchingType() {
+ return hatchType;
+ }
+
+ /**
+ * Change the type of mob being hatched by the egg
+ *
+ * @param hatchType The type of the mob being hatched by the egg
+ */
+ public void setHatchingType(@NotNull EntityType hatchType) {
+ if (!hatchType.isSpawnable()) throw new IllegalArgumentException("Can't spawn that entity type from an egg!");
+ this.hatchType = hatchType;
+ }
+
+ /**
+ * Get the number of mob hatches from the egg. By default the number will
+ * be the number the server would've done
+ * <ul>
+ * <li>7/8 chance of being 0
+ * <li>31/256 ~= 1/8 chance to be 1
+ * <li>1/256 chance to be 4
+ * </ul>
+ *
+ * @return The number of mobs going to be hatched by the egg
+ */
+ public byte getNumHatches() {
+ return numHatches;
+ }
+
+ /**
+ * Change the number of mobs coming out of the hatched egg
+ * <p>
+ * The boolean hatching will override this number. Ie. If hatching =
+ * false, this number will not matter
+ *
+ * @param numHatches The number of mobs coming out of the egg
+ */
+ public void setNumHatches(byte numHatches) {
+ this.numHatches = numHatches;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
--
2.26.2

View File

@@ -0,0 +1,61 @@
From f6f1059eb70c8286fafd421d629652abddeab72a Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 19 Oct 2019 02:43:10 -0500
Subject: [PATCH] Add LootableInventoryFirstFillEvent
---
.../LootableInventoryFirstFillEvent.java | 42 +++++++++++++++++++
1 file changed, 42 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/event/block/LootableInventoryFirstFillEvent.java
diff --git a/src/main/java/net/pl3x/purpur/event/block/LootableInventoryFirstFillEvent.java b/src/main/java/net/pl3x/purpur/event/block/LootableInventoryFirstFillEvent.java
new file mode 100644
index 000000000..ef8eafb7c
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/event/block/LootableInventoryFirstFillEvent.java
@@ -0,0 +1,42 @@
+package net.pl3x.purpur.event.block;
+
+import com.destroystokyo.paper.loottable.LootableInventory;
+import org.bukkit.entity.Player;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class LootableInventoryFirstFillEvent extends Event {
+ @Nullable
+ private final Player player;
+ @NotNull
+ private final LootableInventory inventory;
+
+ public LootableInventoryFirstFillEvent(@Nullable Player player, @NotNull LootableInventory inventory) {
+ this.player = player;
+ this.inventory = inventory;
+ }
+
+ @Nullable
+ public Player getPlayer() {
+ return player;
+ }
+
+ @NotNull
+ public LootableInventory getInventory() {
+ return inventory;
+ }
+
+ private static final HandlerList handlers = new HandlerList();
+
+ @NotNull
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
--
2.26.2

View File

@@ -0,0 +1,47 @@
From b08452c2c1e0893a931b924f80972baa4d007619 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 19 Oct 2019 03:53:46 -0500
Subject: [PATCH] Add back EntityCreatePortalEvent for EnderDragon
---
src/main/java/org/bukkit/PortalType.java | 7 +++++++
.../org/bukkit/event/entity/EntityCreatePortalEvent.java | 4 +---
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/main/java/org/bukkit/PortalType.java b/src/main/java/org/bukkit/PortalType.java
index 427cfbb8b..e23565323 100644
--- a/src/main/java/org/bukkit/PortalType.java
+++ b/src/main/java/org/bukkit/PortalType.java
@@ -15,6 +15,13 @@ public enum PortalType {
*/
ENDER,
+ // Purpur start
+ /**
+ * This is an End Gateway portal
+ */
+ END_GATEWAY,
+ // Purpur end
+
/**
* This is a custom Plugin portal.
*/
diff --git a/src/main/java/org/bukkit/event/entity/EntityCreatePortalEvent.java b/src/main/java/org/bukkit/event/entity/EntityCreatePortalEvent.java
index 397baaefd..7456240b4 100644
--- a/src/main/java/org/bukkit/event/entity/EntityCreatePortalEvent.java
+++ b/src/main/java/org/bukkit/event/entity/EntityCreatePortalEvent.java
@@ -11,10 +11,8 @@ import org.jetbrains.annotations.NotNull;
/**
* Thrown when a Living Entity creates a portal in a world.
- *
- * @deprecated Use {@link PortalCreateEvent}
*/
-@Deprecated
+// Purpur - un-deprecate
public class EntityCreatePortalEvent extends EntityEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private final List<BlockState> blocks;
--
2.26.2

View File

@@ -0,0 +1,51 @@
From eb6271ac09f62253e19664c2a5e4b28f1dd5a914 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Wed, 1 Apr 2020 19:18:29 -0500
Subject: [PATCH] Configurable enchantment max level
---
src/main/java/org/bukkit/enchantments/Enchantment.java | 9 +++++++++
.../java/org/bukkit/enchantments/EnchantmentWrapper.java | 7 +++++++
2 files changed, 16 insertions(+)
diff --git a/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java
index d1885f178..b277428d6 100644
--- a/src/main/java/org/bukkit/enchantments/Enchantment.java
+++ b/src/main/java/org/bukkit/enchantments/Enchantment.java
@@ -232,6 +232,15 @@ public abstract class Enchantment implements Keyed {
*/
public abstract int getMaxLevel();
+ // Purpur start
+ /**
+ * Sets the maximum level that this Enchantment may become.
+ *
+ * @param maxLevel Maximum level of the Enchantment
+ */
+ public abstract void setMaxLevel(int maxLevel);
+ // Purpur end
+
/**
* Gets the level that this Enchantment should start at
*
diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
index 9566e4306..67e31fee3 100644
--- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
+++ b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
@@ -27,6 +27,13 @@ public class EnchantmentWrapper extends Enchantment {
return getEnchantment().getMaxLevel();
}
+ // Purpur start
+ @Override
+ public void setMaxLevel(int maxLevel) {
+ getEnchantment().setMaxLevel(maxLevel);
+ }
+ // Purpur end
+
@Override
public int getStartLevel() {
return getEnchantment().getStartLevel();
--
2.26.2

View File

@@ -0,0 +1,73 @@
From 520632fdade49977988e20c07bd90d360f86418a Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Thu, 18 Jun 2020 23:29:43 -0500
Subject: [PATCH] Add PrepareGrindstoneEvent
---
.../inventory/PrepareGrindstoneEvent.java | 54 +++++++++++++++++++
1 file changed, 54 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/event/inventory/PrepareGrindstoneEvent.java
diff --git a/src/main/java/net/pl3x/purpur/event/inventory/PrepareGrindstoneEvent.java b/src/main/java/net/pl3x/purpur/event/inventory/PrepareGrindstoneEvent.java
new file mode 100644
index 000000000..d0670bb72
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/event/inventory/PrepareGrindstoneEvent.java
@@ -0,0 +1,54 @@
+package net.pl3x.purpur.event.inventory;
+
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.inventory.InventoryEvent;
+import org.bukkit.inventory.GrindstoneInventory;
+import org.bukkit.inventory.InventoryView;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Called when an item is put in a grindstone slot.
+ */
+public class PrepareGrindstoneEvent extends InventoryEvent {
+
+ private static final HandlerList handlers = new HandlerList();
+ private ItemStack result;
+
+ public PrepareGrindstoneEvent(@NotNull InventoryView inventory, @Nullable ItemStack result) {
+ super(inventory);
+ this.result = result;
+ }
+
+ @NotNull
+ @Override
+ public GrindstoneInventory getInventory() {
+ return (GrindstoneInventory) super.getInventory();
+ }
+
+ /**
+ * Get result item, may be null.
+ *
+ * @return result item
+ */
+ @Nullable
+ public ItemStack getResult() {
+ return result;
+ }
+
+ public void setResult(@Nullable ItemStack result) {
+ this.result = result;
+ }
+
+ @NotNull
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ @NotNull
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+}
--
2.26.2

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,135 @@
From b1cd21795f45b71ae265cebd95060a23cfcf9310 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Thu, 26 Mar 2020 13:17:09 -0500
Subject: [PATCH] Add language asset purpur.lang
---
.../net/minecraft/server/EntityPlayer.java | 1 +
.../net/minecraft/server/LocaleLanguage.java | 48 +++++++++++++++++--
.../pl3x/purpur/command/PurpurCommand.java | 3 ++
src/main/resources/purpur.lang | 1 +
4 files changed, 49 insertions(+), 4 deletions(-)
create mode 100644 src/main/resources/purpur.lang
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index 39072ebdc..fe1e9ea61 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -1582,6 +1582,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
}
public void a(IChatBaseComponent ichatbasecomponent, ChatMessageType chatmessagetype) {
+ if (ichatbasecomponent == null) return; // Purpur
this.playerConnection.a((Packet) (new PacketPlayOutChat(ichatbasecomponent, chatmessagetype)), (future) -> {
if (!future.isSuccess() && (chatmessagetype == ChatMessageType.GAME_INFO || chatmessagetype == ChatMessageType.SYSTEM)) {
boolean flag = true;
diff --git a/src/main/java/net/minecraft/server/LocaleLanguage.java b/src/main/java/net/minecraft/server/LocaleLanguage.java
index 601273933..75707adcd 100644
--- a/src/main/java/net/minecraft/server/LocaleLanguage.java
+++ b/src/main/java/net/minecraft/server/LocaleLanguage.java
@@ -15,18 +15,41 @@ import java.util.Map.Entry;
import java.util.regex.Pattern;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.bukkit.ChatColor;
public class LocaleLanguage {
private static final Logger LOGGER = LogManager.getLogger();
private static final Pattern b = Pattern.compile("%(\\d+\\$)?[\\d\\.]*[df]");
private static final LocaleLanguage c = new LocaleLanguage();
- private final Map<String, String> d = Maps.newHashMap();
- private long e;
+ private final Map<String, String> d = Maps.newHashMap(); public Map<String, String> getStorage() { return this.d; } // Purpur - OBFHELPER
+ private long e; public long getLastUpdateTime() { return this.e; } public void setLastUpdateTime(int time) { this.e = time; } // Purpur - OBFHELPER
public LocaleLanguage() {
+ // Purpur start
+ reload(this);
+ }
+
+ private void loadFromFile(String resource) {
try {
- InputStream inputstream = LocaleLanguage.class.getResourceAsStream("/assets/minecraft/lang/en_us.json");
+ java.io.File file = new java.io.File(resource);
+ if (!file.exists()) {
+ java.nio.file.Files.copy(getClass().getResourceAsStream("/" + resource), file.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
+ }
+ loadFromJar("/" + resource);
+ loadFromStream(resource, new java.io.FileInputStream(file));
+ } catch (IOException e) {
+ LOGGER.error("Couldn't read string from " + resource, e);
+ }
+ }
+
+ private void loadFromJar(String resource) {
+ loadFromStream(resource, getClass().getResourceAsStream(resource));
+ }
+
+ private void loadFromStream(String resource, InputStream inputstream) {
+ try {
+ // Purpur end
Throwable throwable = null;
try {
@@ -60,7 +83,7 @@ public class LocaleLanguage {
}
} catch (JsonParseException | IOException ioexception) {
- LocaleLanguage.LOGGER.error("Couldn't read strings from /assets/minecraft/lang/en_us.json", ioexception);
+ LocaleLanguage.LOGGER.error("Couldn't read strings from " + resource, ioexception); // Purpur
}
}
@@ -88,4 +111,21 @@ public class LocaleLanguage {
public long b() {
return this.e;
}
+
+ // Purpur start
+ public static void reload(LocaleLanguage instance) {
+ instance.setLastUpdateTime(0);
+ instance.getStorage().clear();
+ instance.loadFromJar("/assets/minecraft/lang/en_us.json");
+ instance.loadFromFile("purpur.lang");
+ }
+
+ public static ChatMessage translate(String key, Object... args) {
+ String str = getInstance().translateKey(key);
+ if (str == null) return null;
+ str = ChatColor.translateAlternateColorCodes('&', str);
+ if (str.isEmpty()) return null;
+ return new ChatMessage(str, args);
+ }
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/command/PurpurCommand.java b/src/main/java/net/pl3x/purpur/command/PurpurCommand.java
index 7d983d9a5..36260e0ec 100644
--- a/src/main/java/net/pl3x/purpur/command/PurpurCommand.java
+++ b/src/main/java/net/pl3x/purpur/command/PurpurCommand.java
@@ -1,5 +1,6 @@
package net.pl3x.purpur.command;
+import net.minecraft.server.LocaleLanguage;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.WorldServer;
import net.pl3x.purpur.PurpurConfig;
@@ -45,6 +46,8 @@ public class PurpurCommand extends Command {
Command.broadcastCommandMessage(sender, ChatColor.RED + "Please note that this command is not supported and may cause issues.");
Command.broadcastCommandMessage(sender, ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server.");
+ LocaleLanguage.reload(LocaleLanguage.getInstance());
+
MinecraftServer console = MinecraftServer.getServer();
PurpurConfig.init((File) console.options.valueOf("purpur-settings"));
for (WorldServer world : console.getWorlds()) {
diff --git a/src/main/resources/purpur.lang b/src/main/resources/purpur.lang
new file mode 100644
index 000000000..0967ef424
--- /dev/null
+++ b/src/main/resources/purpur.lang
@@ -0,0 +1 @@
+{}
--
2.26.2

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,203 @@
From 9b77d9886cde434034d95d1dd086971e27e85222 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sun, 19 May 2019 18:11:53 -0500
Subject: [PATCH] Campfires have regen effect
---
.../net/minecraft/server/BlockCampfire.java | 2 +-
.../net/minecraft/server/EntityLiving.java | 15 ++++++++--
.../net/minecraft/server/EntityPotion.java | 26 ++++++++++++++++
.../minecraft/server/TileEntityCampfire.java | 30 +++++++++++++++++++
.../net/pl3x/purpur/PurpurWorldConfig.java | 23 ++++++++++++++
5 files changed, 92 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/minecraft/server/BlockCampfire.java b/src/main/java/net/minecraft/server/BlockCampfire.java
index 6303be944..65f8d803b 100644
--- a/src/main/java/net/minecraft/server/BlockCampfire.java
+++ b/src/main/java/net/minecraft/server/BlockCampfire.java
@@ -8,7 +8,7 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged
protected static final VoxelShape a = Block.a(0.0D, 0.0D, 0.0D, 16.0D, 7.0D, 16.0D);
public static final BlockStateBoolean b = BlockProperties.r;
- public static final BlockStateBoolean c = BlockProperties.y;
+ public static final BlockStateBoolean c = BlockProperties.y; public static BlockStateBoolean signalFire() { return c; } // Purpur - OBFHELPER
public static final BlockStateBoolean d = BlockProperties.C;
public static final BlockStateDirection e = BlockProperties.N;
private static final VoxelShape f = Block.a(6.0D, 0.0D, 6.0D, 10.0D, 16.0D, 10.0D);
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 685538793..aaaa98318 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -2799,10 +2799,19 @@ public abstract class EntityLiving extends Entity {
public boolean hasLineOfSight(Entity entity) {
if (this.world != entity.world) return false; // CraftBukkit - SPIGOT-5675, SPIGOT-5798, MC-149563
- Vec3D vec3d = new Vec3D(this.locX(), this.getHeadY(), this.locZ());
- Vec3D vec3d1 = new Vec3D(entity.locX(), entity.getHeadY(), entity.locZ());
+ // Purpur start
+ return hasLineOfSight(entity.locX(), entity.getHeadY(), entity.locZ());
+ }
+
+ public boolean hasLineOfSight(TileEntity te) {
+ return hasLineOfSight(te.position.getX() + 0.5, te.position.getY() + 0.5, te.position.getZ() + 0.5);
+ }
- return this.world.rayTrace(new RayTrace(vec3d, vec3d1, RayTrace.BlockCollisionOption.COLLIDER, RayTrace.FluidCollisionOption.NONE, this)).getType() == MovingObjectPosition.EnumMovingObjectType.MISS;
+ public boolean hasLineOfSight(double x, double y, double z) {
+ Vec3D start = new Vec3D(locX(), getHeadY(), locZ());
+ Vec3D end = new Vec3D(x, y, z);
+ return world.rayTrace(new RayTrace(start, end, RayTrace.BlockCollisionOption.COLLIDER, RayTrace.FluidCollisionOption.NONE, this)).getType() == MovingObjectPosition.EnumMovingObjectType.MISS;
+ // Purpur end
}
@Override
diff --git a/src/main/java/net/minecraft/server/EntityPotion.java b/src/main/java/net/minecraft/server/EntityPotion.java
index b56b021b4..fcc5a5c23 100644
--- a/src/main/java/net/minecraft/server/EntityPotion.java
+++ b/src/main/java/net/minecraft/server/EntityPotion.java
@@ -92,6 +92,7 @@ public class EntityPotion extends EntityProjectile {
} else {
this.a(list, movingobjectposition.getType() == MovingObjectPosition.EnumMovingObjectType.ENTITY ? ((MovingObjectPositionEntity) movingobjectposition).getEntity() : null);
}
+ splashCampfires(list); // Purpur
}
int i = potionregistry.b() ? 2007 : 2002;
@@ -101,6 +102,31 @@ public class EntityPotion extends EntityProjectile {
}
}
+ // Purpur start
+ private void splashCampfires(List<MobEffect> list) {
+ AxisAlignedBB aabb = getBoundingBox().grow(4.0D, 2.0D, 4.0D);
+ for (int x = (int) aabb.minX; x <= aabb.maxX; x++) {
+ for (int z = (int) aabb.minZ; z <= aabb.maxZ; z++) {
+ for (int y = (int) aabb.minY; y <= aabb.maxY; y++) {
+ BlockPosition pos = new BlockPosition(x, y, z);
+ TileEntity te = world.getTileEntity(pos);
+ if (te instanceof TileEntityCampfire) {
+ for (MobEffect effect : list) {
+ if (effect.getMobEffect() == MobEffects.REGENERATION) {
+ for (int i = 0; i < 6 ; i++) {
+ ((WorldServer) world).sendParticles(((WorldServer) world).players, null, Particles.HEART, te.position.getX(), te.position.getY() + 1, te.position.getZ(), 1, 0.5, 0.5, 0.5, 0, true);
+ }
+ ((TileEntityCampfire) te).splashed = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // Purpur end
+
private void splash() {
AxisAlignedBB axisalignedbb = this.getBoundingBox().grow(4.0D, 2.0D, 4.0D);
List<EntityLiving> list = this.world.a(EntityLiving.class, axisalignedbb, EntityPotion.e);
diff --git a/src/main/java/net/minecraft/server/TileEntityCampfire.java b/src/main/java/net/minecraft/server/TileEntityCampfire.java
index a1580b8c6..618ca2d76 100644
--- a/src/main/java/net/minecraft/server/TileEntityCampfire.java
+++ b/src/main/java/net/minecraft/server/TileEntityCampfire.java
@@ -14,6 +14,7 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab
private final NonNullList<ItemStack> items;
public final int[] cookingTimes;
public final int[] cookingTotalTimes;
+ public boolean splashed = false; // Purpur
public TileEntityCampfire() {
super(TileEntityTypes.CAMPFIRE);
@@ -34,6 +35,27 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab
} else {
if (flag) {
+ // Purpur start
+ if ((splashed || !world.purpurConfig.campfireRequireRegenPotion) && world.purpurConfig.campfireRegenInterval > 0 && world.getTime() % world.purpurConfig.campfireRegenInterval == 0L) {
+ boolean signalBoost = getBlock().get(BlockCampfire.signalFire());
+ int duration = signalBoost ? world.purpurConfig.campfireRegenBoostDuration : world.purpurConfig.campfireRegenDuration;
+ byte amp = (byte) (signalBoost ? world.purpurConfig.campfireRegenBoostAmp : world.purpurConfig.campfireRegenAmp);
+ int range = signalBoost ? world.purpurConfig.campfireRegenBoostRange : world.purpurConfig.campfireRegenRange;
+ MobEffect regeneration = new MobEffect(MobEffects.REGENERATION, duration, amp, true, true);
+ world.getEntitiesByClass(EntityHuman.class, new AxisAlignedBB(position).grow(range)).forEach(entityhuman -> {
+ boolean noLineOfSign = true;
+ if (!signalBoost && world.purpurConfig.campfireRegenRequireLineOfSight) {
+ noLineOfSign = false;
+ }
+ if (signalBoost && world.purpurConfig.campfireRegenBoostRequireLineOfSight) {
+ noLineOfSign = false;
+ }
+ if (noLineOfSign || entityhuman.hasLineOfSight(this)) {
+ entityhuman.addEffect(regeneration);
+ }
+ });
+ }
+ // Purpur end
this.h();
} else {
for (int i = 0; i < this.items.size(); ++i) {
@@ -41,6 +63,7 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab
this.cookingTimes[i] = MathHelper.clamp(this.cookingTimes[i] - 2, 0, this.cookingTotalTimes[i]);
}
}
+ splashed = false; // Purpur
}
}
@@ -137,6 +160,12 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab
System.arraycopy(aint, 0, this.cookingTotalTimes, 0, Math.min(this.cookingTotalTimes.length, aint.length));
}
+ // Purpur start
+ if (nbttagcompound.hasKey("Purpur.splashed")) {
+ splashed = nbttagcompound.getBoolean("Purpur.splashed");
+ }
+ // Purpur end
+
}
@Override
@@ -144,6 +173,7 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab
this.d(nbttagcompound);
nbttagcompound.setIntArray("CookingTimes", this.cookingTimes);
nbttagcompound.setIntArray("CookingTotalTimes", this.cookingTotalTimes);
+ nbttagcompound.setBoolean("Purpur.splashed", splashed); // Purpur
return nbttagcompound;
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 94744c78b..d8d95d787 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -71,6 +71,29 @@ public class PurpurWorldConfig {
return PurpurConfig.config.getString("world-settings." + worldName + "." + path, PurpurConfig.config.getString("world-settings.default." + path));
}
+ public int campfireRegenInterval = 0;
+ public int campfireRegenDuration = 80;
+ public int campfireRegenRange = 5;
+ public int campfireRegenAmp = 0;
+ public boolean campfireRegenRequireLineOfSight = true;
+ public int campfireRegenBoostDuration = 0;
+ public int campfireRegenBoostRange = 10;
+ public int campfireRegenBoostAmp = 1;
+ public boolean campfireRegenBoostRequireLineOfSight = false;
+ public boolean campfireRequireRegenPotion = true;
+ private void campfireSettings() {
+ campfireRegenInterval = getInt("blocks.campfire.regen.interval", campfireRegenInterval);
+ campfireRegenDuration = getInt("blocks.campfire.regen.duration", campfireRegenDuration);
+ campfireRegenRange = getInt("blocks.campfire.regen.range", campfireRegenRange);
+ campfireRegenAmp = getInt("blocks.campfire.regen.amplifier", campfireRegenAmp);
+ campfireRegenRequireLineOfSight = getBoolean("blocks.campfire.regen.require-line-of-sight", campfireRegenRequireLineOfSight);
+ campfireRegenBoostDuration = getInt("blocks.campfire.regen.boost-duration", campfireRegenBoostDuration);
+ campfireRegenBoostRange = getInt("blocks.campfire.regen.boost-range", campfireRegenBoostRange);
+ campfireRegenBoostAmp = getInt("blocks.campfire.regen.boost-amplifier", campfireRegenBoostAmp);
+ campfireRegenBoostRequireLineOfSight = getBoolean("blocks.campfire.regen.boost-require-line-of-sight", campfireRegenBoostRequireLineOfSight);
+ campfireRequireRegenPotion = getBoolean("blocks.campfire.regen.requires-potion-to-activate", campfireRequireRegenPotion);
+ }
+
public boolean farmlandGetsMoistFromBelow = false;
private void farmlandSettings() {
farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow);
--
2.26.2

View File

@@ -0,0 +1,82 @@
From e95433c37c07dd0343e1336c9a49661974ddc28f Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Thu, 6 Jun 2019 21:30:49 -0500
Subject: [PATCH] Campfires burn out in rain
---
src/main/java/net/minecraft/server/Block.java | 2 +-
.../net/minecraft/server/BlockCampfire.java | 17 ++++++++++++++++-
.../java/net/pl3x/purpur/PurpurWorldConfig.java | 2 ++
3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java
index 9c7faa2bd..97e553b38 100644
--- a/src/main/java/net/minecraft/server/Block.java
+++ b/src/main/java/net/minecraft/server/Block.java
@@ -395,7 +395,7 @@ public class Block implements IMaterial {
PacketDebug.a(world, blockposition);
}
- public int a(IWorldReader iworldreader) {
+ public int a(IWorldReader world) { return tickRate(world); } public int tickRate(IWorldReader world) { // Purpur - OBFHELPER
return 10;
}
diff --git a/src/main/java/net/minecraft/server/BlockCampfire.java b/src/main/java/net/minecraft/server/BlockCampfire.java
index 65f8d803b..3b95dfaaa 100644
--- a/src/main/java/net/minecraft/server/BlockCampfire.java
+++ b/src/main/java/net/minecraft/server/BlockCampfire.java
@@ -7,7 +7,7 @@ import javax.annotation.Nullable;
public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged {
protected static final VoxelShape a = Block.a(0.0D, 0.0D, 0.0D, 16.0D, 7.0D, 16.0D);
- public static final BlockStateBoolean b = BlockProperties.r;
+ public static final BlockStateBoolean b = BlockProperties.r; public static BlockStateBoolean lit() { return b; } // Purpur - OBFHELPER
public static final BlockStateBoolean c = BlockProperties.y; public static BlockStateBoolean signalFire() { return c; } // Purpur - OBFHELPER
public static final BlockStateBoolean d = BlockProperties.C;
public static final BlockStateDirection e = BlockProperties.N;
@@ -74,6 +74,21 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged
return (IBlockData) ((IBlockData) ((IBlockData) ((IBlockData) this.getBlockData().set(BlockCampfire.d, flag)).set(BlockCampfire.c, this.h(world.getType(blockposition.down())))).set(BlockCampfire.b, !flag)).set(BlockCampfire.e, blockactioncontext.f());
}
+ // Purpur start
+ @Override
+ public void tick(IBlockData iblockdata, WorldServer world, BlockPosition pos, Random random) {
+ if (world.purpurConfig.campfireBurnOutInRain && world.getTime() % 20 == 0L && iblockdata.get(lit()) && world.isRainingAt(pos.shift(EnumDirection.UP))) {
+ world.setTypeAndData(pos, iblockdata.set(lit(), false), 3);
+ }
+ world.getBlockTickList().a(pos, this, tickRate(world));
+ }
+
+ @Override
+ public int tickRate(IWorldReader world) {
+ return 1;
+ }
+ // Purpur end
+
@Override
public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) {
if ((Boolean) iblockdata.get(BlockCampfire.d)) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 8c84431e5..a761b2c73 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -81,6 +81,7 @@ public class PurpurWorldConfig {
public int campfireRegenBoostAmp = 1;
public boolean campfireRegenBoostRequireLineOfSight = false;
public boolean campfireRequireRegenPotion = true;
+ public boolean campfireBurnOutInRain = false;
private void campfireSettings() {
campfireRegenInterval = getInt("blocks.campfire.regen.interval", campfireRegenInterval);
campfireRegenDuration = getInt("blocks.campfire.regen.duration", campfireRegenDuration);
@@ -92,6 +93,7 @@ public class PurpurWorldConfig {
campfireRegenBoostAmp = getInt("blocks.campfire.regen.boost-amplifier", campfireRegenBoostAmp);
campfireRegenBoostRequireLineOfSight = getBoolean("blocks.campfire.regen.boost-require-line-of-sight", campfireRegenBoostRequireLineOfSight);
campfireRequireRegenPotion = getBoolean("blocks.campfire.regen.requires-potion-to-activate", campfireRequireRegenPotion);
+ campfireBurnOutInRain = getBoolean("blocks.campfire.burn-out-in-rain", campfireBurnOutInRain);
}
public boolean farmlandGetsMoistFromBelow = false;
--
2.26.2

View File

@@ -0,0 +1,83 @@
From dd79210dd48515873533b7a50d14eab5db537495 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Thu, 23 May 2019 16:20:21 -0500
Subject: [PATCH] Campfires should fall with gravity
---
.../java/net/minecraft/server/BlockCampfire.java | 16 ++++++++++++++--
.../java/net/pl3x/purpur/PurpurWorldConfig.java | 2 ++
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/minecraft/server/BlockCampfire.java b/src/main/java/net/minecraft/server/BlockCampfire.java
index 3b95dfaaa..418fa6d1f 100644
--- a/src/main/java/net/minecraft/server/BlockCampfire.java
+++ b/src/main/java/net/minecraft/server/BlockCampfire.java
@@ -9,7 +9,7 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged
protected static final VoxelShape a = Block.a(0.0D, 0.0D, 0.0D, 16.0D, 7.0D, 16.0D);
public static final BlockStateBoolean b = BlockProperties.r; public static BlockStateBoolean lit() { return b; } // Purpur - OBFHELPER
public static final BlockStateBoolean c = BlockProperties.y; public static BlockStateBoolean signalFire() { return c; } // Purpur - OBFHELPER
- public static final BlockStateBoolean d = BlockProperties.C;
+ public static final BlockStateBoolean d = BlockProperties.C; public static BlockStateBoolean waterlogged() { return d; } // Purpur - OBFHELPER
public static final BlockStateDirection e = BlockProperties.N;
private static final VoxelShape f = Block.a(6.0D, 0.0D, 6.0D, 10.0D, 16.0D, 10.0D);
@@ -75,8 +75,19 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged
}
// Purpur start
+ @Override
+ public void onPlace(IBlockData iblockdata, World world, BlockPosition pos, IBlockData iblockdata1, boolean flag) {
+ world.getBlockTickList().a(pos, this, tickRate(world));
+ }
+
@Override
public void tick(IBlockData iblockdata, WorldServer world, BlockPosition pos, Random random) {
+ if (world.purpurConfig.campfireFallWithGravity && BlockFalling.canFallThrough(world.getType(pos.down())) && pos.getY() >= 0) {
+ world.addEntity(new EntityFallingBlock(world, pos.getX() + 0.5D, pos.getY(), pos.getZ() + 0.5D, world.getType(pos)));
+ }
+ if (iblockdata.get(waterlogged()) && iblockdata.get(lit())) {
+ world.setTypeAndData(pos, iblockdata.set(lit(), false), 3);
+ }
if (world.purpurConfig.campfireBurnOutInRain && world.getTime() % 20 == 0L && iblockdata.get(lit()) && world.isRainingAt(pos.shift(EnumDirection.UP))) {
world.setTypeAndData(pos, iblockdata.set(lit(), false), 3);
}
@@ -91,6 +102,7 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged
@Override
public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) {
+ generatoraccess.getBlockTickList().a(blockposition, this, tickRate(generatoraccess)); // Purpur - Campfires should fall with gravity
if ((Boolean) iblockdata.get(BlockCampfire.d)) {
generatoraccess.getFluidTickList().a(blockposition, FluidTypes.WATER, FluidTypes.WATER.a((IWorldReader) generatoraccess));
}
@@ -119,7 +131,7 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged
@Override
public boolean place(GeneratorAccess generatoraccess, BlockPosition blockposition, IBlockData iblockdata, Fluid fluid) {
- if (!(Boolean) iblockdata.get(BlockProperties.C) && fluid.getType() == FluidTypes.WATER) {
+ if (!(Boolean) iblockdata.get(BlockCampfire.d) && fluid.getType() == FluidTypes.WATER) { // Purpur
boolean flag = (Boolean) iblockdata.get(BlockCampfire.b);
if (flag) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index a761b2c73..d6405b2ec 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -82,6 +82,7 @@ public class PurpurWorldConfig {
public boolean campfireRegenBoostRequireLineOfSight = false;
public boolean campfireRequireRegenPotion = true;
public boolean campfireBurnOutInRain = false;
+ public boolean campfireFallWithGravity = false;
private void campfireSettings() {
campfireRegenInterval = getInt("blocks.campfire.regen.interval", campfireRegenInterval);
campfireRegenDuration = getInt("blocks.campfire.regen.duration", campfireRegenDuration);
@@ -94,6 +95,7 @@ public class PurpurWorldConfig {
campfireRegenBoostRequireLineOfSight = getBoolean("blocks.campfire.regen.boost-require-line-of-sight", campfireRegenBoostRequireLineOfSight);
campfireRequireRegenPotion = getBoolean("blocks.campfire.regen.requires-potion-to-activate", campfireRequireRegenPotion);
campfireBurnOutInRain = getBoolean("blocks.campfire.burn-out-in-rain", campfireBurnOutInRain);
+ campfireFallWithGravity = getBoolean("blocks.campfire.fall-with-gravity", campfireFallWithGravity);
}
public boolean farmlandGetsMoistFromBelow = false;
--
2.26.2

View File

@@ -0,0 +1,72 @@
From 48d14d7c57478a6af1c85d20a59ebef69b43ec9e Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Mon, 22 Jul 2019 14:24:26 -0500
Subject: [PATCH] Pillager limits and leaders chance
---
.../java/net/minecraft/server/ChunkProviderGenerate.java | 1 +
.../java/net/minecraft/server/EntityMonsterPatrolling.java | 7 ++++++-
src/main/java/net/pl3x/purpur/PurpurWorldConfig.java | 6 ++++++
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/minecraft/server/ChunkProviderGenerate.java b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
index 70f43c515..fa08b8e1a 100644
--- a/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
+++ b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java
@@ -143,6 +143,7 @@ public class ChunkProviderGenerate extends ChunkGeneratorAbstract<GeneratorSetti
}
} else if (enumcreaturetype == EnumCreatureType.MONSTER) {
if (WorldGenerator.PILLAGER_OUTPOST.a(this.a, blockposition)) {
+ if (getWorld().purpurConfig.pillagerLimitOutpostSpawns <= 0 || getWorld().getEntitiesByClass(EntityPillager.class, new AxisAlignedBB(blockposition).grow(128)).size() < getWorld().purpurConfig.pillagerLimitOutpostSpawns) // Purpur
return WorldGenerator.PILLAGER_OUTPOST.e();
}
diff --git a/src/main/java/net/minecraft/server/EntityMonsterPatrolling.java b/src/main/java/net/minecraft/server/EntityMonsterPatrolling.java
index f44334b9e..70559714a 100644
--- a/src/main/java/net/minecraft/server/EntityMonsterPatrolling.java
+++ b/src/main/java/net/minecraft/server/EntityMonsterPatrolling.java
@@ -49,6 +49,7 @@ public abstract class EntityMonsterPatrolling extends EntityMonster {
return -0.45D;
}
+ public boolean canBeLeader() { return this.es(); } // Purpur
public boolean es() {
return true;
}
@@ -56,7 +57,11 @@ public abstract class EntityMonsterPatrolling extends EntityMonster {
@Nullable
@Override
public GroupDataEntity prepare(GeneratorAccess generatoraccess, DifficultyDamageScaler difficultydamagescaler, EnumMobSpawn enummobspawn, @Nullable GroupDataEntity groupdataentity, @Nullable NBTTagCompound nbttagcompound) {
- if (enummobspawn != EnumMobSpawn.PATROL && enummobspawn != EnumMobSpawn.EVENT && enummobspawn != EnumMobSpawn.STRUCTURE && this.random.nextFloat() < 0.06F && this.es()) {
+ // Purpur start
+ World world = generatoraccess.getMinecraftWorld();
+ if (this.canBeLeader() && enummobspawn != EnumMobSpawn.PATROL && enummobspawn != EnumMobSpawn.EVENT && enummobspawn != EnumMobSpawn.STRUCTURE && this.random.nextFloat() < world.purpurConfig.pillagerLeaderChance) {
+ if (world.purpurConfig.pillagerLeaderRangeCheck <= 0 || (this instanceof EntityPillager && world.getEntitiesByClass(EntityPillager.class, new AxisAlignedBB(new BlockPosition(this)).grow(world.purpurConfig.pillagerLeaderRangeCheck)).size() == 0))
+ // Purpur end
this.patrolLeader = true;
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index a2fce0c63..299b080c8 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -525,10 +525,16 @@ public class PurpurWorldConfig {
public boolean pillagerRidable = false;
public boolean pillagerRidableInWater = false;
public boolean pillagerRequireShiftToMount = true;
+ public int pillagerLimitOutpostSpawns = 0;
+ public float pillagerLeaderChance = 0.06F;
+ public int pillagerLeaderRangeCheck = 0;
private void pillagerSettings() {
pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable);
pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater);
pillagerRequireShiftToMount = getBoolean("mobs.pillager.require-shift-to-mount", pillagerRequireShiftToMount);
+ pillagerLimitOutpostSpawns = getInt("mobs.pillager.limit-outpost-spawns", pillagerLimitOutpostSpawns);
+ pillagerLeaderChance = (float) getDouble("mobs.pillager.leader.chance", pillagerLeaderChance);
+ pillagerLeaderRangeCheck = getInt("mobs.pillager.leader.range-check-for-other-leaders", pillagerLeaderRangeCheck);
}
public boolean polarBearRidable = false;
--
2.26.2

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,158 @@
From 76ab9614c42d949915127a45567be02453e414ef Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sat, 11 Jan 2020 23:12:52 -0600
Subject: [PATCH] Add EntityPortalReadyEvent
---
.../java/net/minecraft/server/BlockPortal.java | 16 +++++++++-------
src/main/java/net/minecraft/server/Entity.java | 7 ++++---
.../net/minecraft/server/PortalTravelAgent.java | 5 +++--
.../java/net/minecraft/server/WorldServer.java | 2 +-
4 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/src/main/java/net/minecraft/server/BlockPortal.java b/src/main/java/net/minecraft/server/BlockPortal.java
index 09c7c1318..6880cdd7f 100644
--- a/src/main/java/net/minecraft/server/BlockPortal.java
+++ b/src/main/java/net/minecraft/server/BlockPortal.java
@@ -54,6 +54,7 @@ public class BlockPortal extends Block {
}
+ public boolean createPortal(GeneratorAccess generatoraccess, BlockPosition blockposition) { return a(generatoraccess, blockposition); } // Purpur - OBFHELPER
public boolean a(GeneratorAccess generatoraccess, BlockPosition blockposition) {
BlockPortal.Shape blockportal_shape = this.b(generatoraccess, blockposition);
@@ -67,8 +68,8 @@ public class BlockPortal extends Block {
}
}
- @Nullable
- public BlockPortal.Shape b(GeneratorAccess generatoraccess, BlockPosition blockposition) {
+ public BlockPortal.Shape createShape(GeneratorAccess generatoraccess, BlockPosition blockposition) { return b(generatoraccess, blockposition); } // Purpur - OBFHELPER
+ @Nullable public BlockPortal.Shape b(GeneratorAccess generatoraccess, BlockPosition blockposition) {
BlockPortal.Shape blockportal_shape = new BlockPortal.Shape(generatoraccess, blockposition, EnumDirection.EnumAxis.X);
if (blockportal_shape.d() && blockportal_shape.e == 0) {
@@ -189,6 +190,7 @@ public class BlockPortal extends Block {
private int height;
private int width;
java.util.List<org.bukkit.block.BlockState> blocks = new java.util.ArrayList<org.bukkit.block.BlockState>(); // CraftBukkit - add field
+ public static Block FRAME_BLOCK = Blocks.OBSIDIAN; // Purpur
public Shape(GeneratorAccess generatoraccess, BlockPosition blockposition, EnumDirection.EnumAxis enumdirection_enumaxis) {
this.a = generatoraccess;
@@ -228,14 +230,14 @@ public class BlockPortal extends Block {
for (i = 0; i < 22; ++i) {
BlockPosition blockposition1 = blockposition.shift(enumdirection, i);
- if (!this.a(this.a.getType(blockposition1)) || this.a.getType(blockposition1.down()).getBlock() != Blocks.OBSIDIAN) {
+ if (!this.a(this.a.getType(blockposition1)) || this.a.getType(blockposition1.down()).getBlock() != FRAME_BLOCK) { // Purpur
break;
}
}
Block block = this.a.getType(blockposition.shift(enumdirection, i)).getBlock();
- return block == Blocks.OBSIDIAN ? i : 0;
+ return block == FRAME_BLOCK ? i : 0; // Purpur
}
public int a() {
@@ -270,7 +272,7 @@ public class BlockPortal extends Block {
if (i == 0) {
block = this.a.getType(blockposition.shift(this.d)).getBlock();
- if (block != Blocks.OBSIDIAN) {
+ if (block != FRAME_BLOCK) { // Purpur
break label56;
// CraftBukkit start - add the block to our list
} else {
@@ -280,7 +282,7 @@ public class BlockPortal extends Block {
}
} else if (i == this.width - 1) {
block = this.a.getType(blockposition.shift(this.c)).getBlock();
- if (block != Blocks.OBSIDIAN) {
+ if (block != FRAME_BLOCK) { // Purpur
break label56;
// CraftBukkit start - add the block to our list
} else {
@@ -293,7 +295,7 @@ public class BlockPortal extends Block {
}
for (i = 0; i < this.width; ++i) {
- if (this.a.getType(this.position.shift(this.c, i).up(this.height)).getBlock() != Blocks.OBSIDIAN) {
+ if (this.a.getType(this.position.shift(this.c, i).up(this.height)).getBlock() != FRAME_BLOCK) { // Purpur
this.height = 0;
break;
// CraftBukkit start - add the block to our list
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 580843686..bdf79302b 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -170,9 +170,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
protected boolean af; public final boolean inPortal() { return this.af; } // Paper - OBFHELPER
protected int ag;
public DimensionManager dimension;
- protected BlockPosition ai;
- protected Vec3D aj;
- protected EnumDirection ak;
+ public BlockPosition ai; // Purpur - protected -> public
+ public Vec3D aj; // Purpur - protected -> public
+ public EnumDirection ak; // Purpur - protected -> public
private boolean invulnerable;
protected UUID uniqueID;
protected String am;
@@ -2472,6 +2472,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
this.world.getMethodProfiler().enter("portal");
this.ag = i;
this.portalCooldown = this.ba();
+ if (new net.pl3x.purpur.event.entity.EntityPortalReadyEvent(getBukkitEntity()).callEvent()) // Purpur
// CraftBukkit start
if (this instanceof EntityPlayer) {
((EntityPlayer) this).a(this.world.worldProvider.getDimensionManager().getType() == DimensionManager.NETHER ? DimensionManager.OVERWORLD : DimensionManager.NETHER, PlayerTeleportEvent.TeleportCause.NETHER_PORTAL);
diff --git a/src/main/java/net/minecraft/server/PortalTravelAgent.java b/src/main/java/net/minecraft/server/PortalTravelAgent.java
index f84dd6d9b..f50e9670b 100644
--- a/src/main/java/net/minecraft/server/PortalTravelAgent.java
+++ b/src/main/java/net/minecraft/server/PortalTravelAgent.java
@@ -11,6 +11,7 @@ public class PortalTravelAgent {
private final WorldServer world;
private final Random b;
+ public Block FRAME_BLOCK = Blocks.OBSIDIAN; // Purpur
public PortalTravelAgent(WorldServer worldserver) {
this.world = worldserver;
@@ -233,7 +234,7 @@ public class PortalTravelAgent {
boolean flag1 = l2 < 0;
blockposition_mutableblockposition.d(j3, l3, i4);
- blockList.setTypeAndData(blockposition_mutableblockposition, flag1 ? Blocks.OBSIDIAN.getBlockData() : Blocks.AIR.getBlockData(), 3); // CraftBukkit
+ blockList.setTypeAndData(blockposition_mutableblockposition, flag1 ? FRAME_BLOCK.getBlockData() : Blocks.AIR.getBlockData(), 3); // CraftBukkit // Purpur
}
}
}
@@ -243,7 +244,7 @@ public class PortalTravelAgent {
for (i3 = -1; i3 < 4; ++i3) {
if (k2 == -1 || k2 == 2 || i3 == -1 || i3 == 3) {
blockposition_mutableblockposition.d(i5 + k2 * k5, j5 + i3, j2 + k2 * l5);
- blockList.setTypeAndData(blockposition_mutableblockposition, Blocks.OBSIDIAN.getBlockData(), 3); // CraftBukkit
+ blockList.setTypeAndData(blockposition_mutableblockposition, FRAME_BLOCK.getBlockData(), 3); // CraftBukkit // Purpur
}
}
}
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 156c87ed4..610542dc8 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -76,7 +76,7 @@ public class WorldServer extends World {
public boolean savingDisabled;
private boolean everyoneSleeping;
private int emptyTime;
- private final PortalTravelAgent portalTravelAgent;
+ public PortalTravelAgent portalTravelAgent; // Purpur - private final -> public non-final
private final TickListServer<Block> nextTickListBlock;
private final TickListServer<FluidType> nextTickListFluid;
private final Set<NavigationAbstract> navigators; final com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<NavigationAbstract> navigatorsForIteration = new com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<>(2048, 0.5f, 2048, 0.2); // Tuinity - make removing entities while ticking safe
--
2.26.2

View File

@@ -0,0 +1,102 @@
From 5de138cbdf306a02f264c50f32f22c6864d001f1 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Thu, 1 Aug 2019 19:15:12 -0500
Subject: [PATCH] Add blacklist option for grindstone
---
.../minecraft/server/ContainerGrindstone.java | 17 +++++++++++++++++
.../java/net/minecraft/server/ItemStack.java | 6 ++++++
.../java/net/pl3x/purpur/PurpurWorldConfig.java | 12 ++++++++++++
3 files changed, 35 insertions(+)
diff --git a/src/main/java/net/minecraft/server/ContainerGrindstone.java b/src/main/java/net/minecraft/server/ContainerGrindstone.java
index 83cb0cd64..2a849d0ec 100644
--- a/src/main/java/net/minecraft/server/ContainerGrindstone.java
+++ b/src/main/java/net/minecraft/server/ContainerGrindstone.java
@@ -61,12 +61,24 @@ public class ContainerGrindstone extends Container {
this.a(new Slot(this.craftInventory, 0, 49, 19) {
@Override
public boolean isAllowed(ItemStack itemstack) {
+ // Purpur start
+ if (containeraccess.getWorld().purpurConfig.grindstoneBlacklistDisallowPlacement && containeraccess.getWorld().purpurConfig.grindstoneBlacklist.contains(itemstack.getId())) {
+ getBukkitView().getTopInventory().getViewers().forEach(viewer -> ((Player) viewer).updateInventory());
+ return false;
+ }
+ // Purpur end
return itemstack.e() || itemstack.getItem() == Items.ENCHANTED_BOOK || itemstack.hasEnchantments();
}
});
this.a(new Slot(this.craftInventory, 1, 49, 40) {
@Override
public boolean isAllowed(ItemStack itemstack) {
+ // Purpur start
+ if (containeraccess.getWorld().purpurConfig.grindstoneBlacklistDisallowPlacement && containeraccess.getWorld().purpurConfig.grindstoneBlacklist.contains(itemstack.getId())) {
+ getBukkitView().getTopInventory().getViewers().forEach(viewer -> ((Player) viewer).updateInventory());
+ return false;
+ }
+ // Purpur end
return itemstack.e() || itemstack.getItem() == Items.ENCHANTED_BOOK || itemstack.hasEnchantments();
}
});
@@ -110,6 +122,11 @@ public class ContainerGrindstone extends Container {
}
private int e(ItemStack itemstack) {
+ // Purpur start
+ if (containeraccess.getWorld().purpurConfig.grindstoneBlacklistReturnsZeroExp && containeraccess.getWorld().purpurConfig.grindstoneBlacklist.contains(itemstack.getId())) {
+ return 0;
+ }
+ // Purpur end
int j = 0;
Map<Enchantment, Integer> map = EnchantmentManager.a(itemstack);
Iterator iterator = map.entrySet().iterator();
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index 8c3bbef66..d5e0578b2 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -542,6 +542,12 @@ public final class ItemStack {
return !this.e() ? this.doMaterialsMatch(itemstack) : !itemstack.isEmpty() && this.getItem() == itemstack.getItem();
}
+ // Purpur start
+ public String getId() {
+ return IRegistry.ITEM.getKey(getItem()).toString();
+ }
+ // Purpur end
+
public String j() {
return this.getItem().f(this);
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 5318a8e32..9c60855d6 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -8,6 +8,7 @@ import net.minecraft.server.MinecraftKey;
import org.bukkit.configuration.ConfigurationSection;
import org.spigotmc.SpigotWorldConfig;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -103,6 +104,17 @@ public class PurpurWorldConfig {
farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow);
}
+ public List<String> grindstoneBlacklist = new ArrayList<>();
+ public boolean grindstoneBlacklistDisallowPlacement = true;
+ public boolean grindstoneBlacklistReturnsZeroExp = true;
+ private void grindstoneBlacklist() {
+ List<String> blacklist = getList("blocks.grindstone.blacklist.blacklisted-items", grindstoneBlacklist);
+ grindstoneBlacklistDisallowPlacement = getBoolean("blocks.grindstone.blacklist.disallow-placement", grindstoneBlacklistDisallowPlacement);
+ grindstoneBlacklistReturnsZeroExp = getBoolean("blocks.grindstone.blacklist.returns-zero-exp", grindstoneBlacklistReturnsZeroExp);
+ grindstoneBlacklist.clear();
+ grindstoneBlacklist.addAll(blacklist);
+ }
+
public boolean signAllowColors = false;
public boolean signRightClickEdit = false;
private void signSettings() {
--
2.26.2

View File

@@ -0,0 +1,67 @@
From 9b4138db851b38e9c42ecd40ede122f9b75f2ce1 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Fri, 23 Aug 2019 21:56:31 -0500
Subject: [PATCH] Option for slimes not pushable
---
src/main/java/net/minecraft/server/BlockPiston.java | 10 ++++++++++
src/main/java/net/minecraft/server/BlockSlime.java | 7 +++++++
src/main/java/net/pl3x/purpur/PurpurConfig.java | 5 +++++
3 files changed, 22 insertions(+)
diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java
index 8312ed779..a1721c63d 100644
--- a/src/main/java/net/minecraft/server/BlockPiston.java
+++ b/src/main/java/net/minecraft/server/BlockPiston.java
@@ -347,6 +347,16 @@ public class BlockPiston extends BlockDirectional {
} else {
event = new BlockPistonRetractEvent(bblock, blocks, CraftBlock.notchToBlockFace(enumdirection1));
}
+ // Purpur start
+ if (net.pl3x.purpur.PurpurConfig.slimeBlocksNotPushable) {
+ for (org.bukkit.block.Block block : blocks) {
+ if (block.getType() == org.bukkit.Material.SLIME_BLOCK) {
+ event.setCancelled(true);
+ break;
+ }
+ }
+ }
+ // Purpur end
world.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
diff --git a/src/main/java/net/minecraft/server/BlockSlime.java b/src/main/java/net/minecraft/server/BlockSlime.java
index 01f32659d..52ab86f0b 100644
--- a/src/main/java/net/minecraft/server/BlockSlime.java
+++ b/src/main/java/net/minecraft/server/BlockSlime.java
@@ -49,4 +49,11 @@ public class BlockSlime extends BlockHalfTransparent {
super.stepOn(world, blockposition, entity);
}
+
+ // Purpur start
+ @Override
+ public EnumPistonReaction getPushReaction(IBlockData iblockdata) {
+ return net.pl3x.purpur.PurpurConfig.slimeBlocksNotPushable ? EnumPistonReaction.BLOCK : super.getPushReaction(iblockdata);
+ }
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index ab20fa2fa..72ad9dce7 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -149,6 +149,11 @@ public class PurpurConfig {
dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets);
}
+ public static boolean slimeBlocksNotPushable = false;
+ private static void blockSettings() {
+ slimeBlocksNotPushable = getBoolean("settings.blocks.slime.not-movable-by-piston", slimeBlocksNotPushable);
+ }
+
private static void timingsSettings() {
getString("settings.timings.url", "https://timings.pl3x.net");
}
--
2.26.2

View File

@@ -0,0 +1,30 @@
From 2773516386b1b074024a5129b2dac38d1d1d0ec9 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 19 Oct 2019 03:36:52 -0500
Subject: [PATCH] Fix furnace cook speed multiplier using values between 0 and
1
---
src/main/java/net/minecraft/server/TileEntityFurnace.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java
index 7d50b7056..c5e643292 100644
--- a/src/main/java/net/minecraft/server/TileEntityFurnace.java
+++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java
@@ -307,8 +307,10 @@ public abstract class TileEntityFurnace extends TileEntityContainer implements I
}
if (this.isBurning() && this.canBurn(irecipe)) {
- this.cookTime += cookSpeedMultiplier; // Paper - cook speed multiplier API
- if (this.cookTime >= this.cookTimeTotal) { // Paper - cook speed multiplier API
+ // Purpur start - fix cook speed multiplier API
+ ++this.cookTime;
+ if (this.cookTime >= this.cookTimeTotal / this.cookSpeedMultiplier) {
+ // Purpur end - fix cook speed multiplier API
this.cookTime = 0;
this.cookTimeTotal = this.getRecipeCookingTime();
this.burn(irecipe);
--
2.26.2

View File

@@ -0,0 +1,65 @@
From ab9d1fa681708fd626c0c7a02291cd17d8bdff0c Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Fri, 29 Nov 2019 23:47:42 -0600
Subject: [PATCH] Despawn egg hatches chicken
---
.../java/net/minecraft/server/EntityItem.java | 21 +++++++++++++++++++
.../net/pl3x/purpur/PurpurWorldConfig.java | 4 ++++
2 files changed, 25 insertions(+)
diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java
index 2926fbb95..bbb9ca1ef 100644
--- a/src/main/java/net/minecraft/server/EntityItem.java
+++ b/src/main/java/net/minecraft/server/EntityItem.java
@@ -165,6 +165,27 @@ public class EntityItem extends Entity {
}
// Spigot end
+ // Purpur start
+ @Override
+ public void die() {
+ if (!dead && world.purpurConfig.chickenEggsHatchWhenDespawnedMax > 0) {
+ ItemStack item = getItemStack();
+ if (item != null && item.getItem() == Items.EGG) {
+ int range = world.purpurConfig.chickenEggsHatchWhenDespawnedRange;
+ if (world.getEntitiesByClass(EntityChicken.class, new AxisAlignedBB(locX() - range, locY() - range, locZ() - range, locX() + range, locY() + range, locZ() + range)).size() < world.purpurConfig.chickenEggsHatchWhenDespawnedMax) {
+ EntityChicken chicken = EntityTypes.CHICKEN.create(world);
+ if (chicken != null) {
+ chicken.setPosition(locX(), locY(), locZ());
+ chicken.setAge(-24000);
+ world.addEntity(chicken, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG);
+ }
+ }
+ }
+ }
+ super.die();
+ }
+ // Purpur end
+
private void u() {
Vec3D vec3d = this.getMot();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 5b042a609..647bece31 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -262,11 +262,15 @@ public class PurpurWorldConfig {
public boolean chickenRidableInWater = false;
public boolean chickenRequireShiftToMount = true;
public boolean chickenDontLayEggsWhenRidden = false;
+ public int chickenEggsHatchWhenDespawnedMax = 0;
+ public int chickenEggsHatchWhenDespawnedRange = 10;
private void chickenSettings() {
chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable);
chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater);
chickenRequireShiftToMount = getBoolean("mobs.chicken.require-shift-to-mount", chickenRequireShiftToMount);
chickenDontLayEggsWhenRidden = getBoolean("mobs.chicken.dont-lay-eggs-when-ridden", chickenDontLayEggsWhenRidden);
+ chickenEggsHatchWhenDespawnedMax = getInt("mobs.chicken.eggs-hatch-when-despawned.max", chickenEggsHatchWhenDespawnedMax);
+ chickenEggsHatchWhenDespawnedRange = getInt("mobs.chicken.eggs-hatch-when-despawned.range", chickenEggsHatchWhenDespawnedRange);
}
public boolean codRidable = false;
--
2.26.2

View File

@@ -0,0 +1,54 @@
From 324ade06e16035915b27500e54ab4fb1f1c29a32 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 19 Oct 2019 01:42:50 -0500
Subject: [PATCH] Fix SpawnChangeEvent not firing for all use-cases
---
src/main/java/net/minecraft/server/World.java | 3 +++
src/main/java/org/bukkit/craftbukkit/CraftWorld.java | 12 ++++++++----
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index ad3b81a11..b24191d81 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -1472,8 +1472,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
return blockposition;
}
+ public void setSpawn(BlockPosition blockposition) { v(blockposition); } // Purpur - OBFHELPER
public void a_(BlockPosition blockposition) {
+ BlockPosition prevPos = getSpawn(); // Purpur
this.worldData.setSpawn(blockposition);
+ new org.bukkit.event.world.SpawnChangeEvent(world, MCUtil.toLocation(this, prevPos)).callEvent(); // Purpur
}
public boolean a(EntityHuman entityhuman, BlockPosition blockposition) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 3d27028e8..85922aaa9 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -391,12 +391,16 @@ public class CraftWorld implements World {
@Override
public boolean setSpawnLocation(int x, int y, int z) {
try {
- Location previousLocation = getSpawnLocation();
- world.worldData.setSpawn(new BlockPosition(x, y, z));
+ // Purpur start - move to World#setSpawn()
+ //Location previousLocation = getSpawnLocation();
+ //world.worldData.setSpawn(new BlockPosition(x, y, z));
// Notify anyone who's listening.
- SpawnChangeEvent event = new SpawnChangeEvent(this, previousLocation);
- server.getPluginManager().callEvent(event);
+ //SpawnChangeEvent event = new SpawnChangeEvent(this, previousLocation);
+ //server.getPluginManager().callEvent(event);
+
+ world.setSpawn(new BlockPosition(x, y, z));
+ // Purpur end
return true;
} catch (Exception e) {
--
2.26.2

View File

@@ -0,0 +1,79 @@
From ace26bd42b6a6b5de262a011df936981c281c91e Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sat, 30 Nov 2019 03:30:17 -0600
Subject: [PATCH] Add sleep options
---
.../net/minecraft/server/EntityHuman.java | 19 +++++++++++++++++--
.../net/pl3x/purpur/PurpurWorldConfig.java | 4 ++++
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index d62174e9c..22e17e3de 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -143,6 +143,21 @@ public abstract class EntityHuman extends EntityLiving {
this.datawatcher.register(EntityHuman.bt, new NBTTagCompound());
}
+ // Purpur start
+ private javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino");
+
+ private boolean unableToSleepRightNow() {
+ if (world.purpurConfig.playerSleepOnlyWithCondition) {
+ try {
+ scriptEngine.eval("time = " + world.getDayTime());
+ return !(Boolean) scriptEngine.eval(world.purpurConfig.playerSleepCondition);
+ } catch (Exception ignore) {
+ }
+ }
+ return world.isDay();
+ }
+ // Purpur end
+
@Override
public void tick() {
this.noclip = this.isSpectator();
@@ -160,7 +175,7 @@ public abstract class EntityHuman extends EntityLiving {
this.sleepTicks = 100;
}
- if (!this.world.isClientSide && this.world.isDay()) {
+ if (!this.world.isClientSide && unableToSleepRightNow()) { // Purpur
this.wakeup(false, true);
}
} else if (this.sleepTicks > 0) {
@@ -1334,7 +1349,7 @@ public abstract class EntityHuman extends EntityLiving {
return Either.left(EntityHuman.EnumBedResult.NOT_POSSIBLE_HERE);
}
- if (this.world.isDay()) {
+ if (unableToSleepRightNow()) { // Purpur
this.setRespawnPosition(blockposition, false, true);
return Either.left(EntityHuman.EnumBedResult.NOT_POSSIBLE_NOW);
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 647bece31..08fb0bae3 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -150,6 +150,8 @@ public class PurpurWorldConfig {
public boolean disableDropsOnCrammingDeath = false;
public boolean fixClimbingBypassingCrammingRule = false;
public boolean milkCuresBadOmen = true;
+ public boolean playerSleepOnlyWithCondition = false;
+ public String playerSleepCondition = "time >= 12541 && time <= 23458";
public boolean useBetterMending = false;
private void gameplayMechanicsSettings() {
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
@@ -174,6 +176,8 @@ public class PurpurWorldConfig {
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
fixClimbingBypassingCrammingRule = getBoolean("gameplay-mechanics.fix-climbing-bypassing-cramming-rule", fixClimbingBypassingCrammingRule);
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
+ playerSleepOnlyWithCondition = getBoolean("gameplay-mechanics.player.sleep.only-with-condition", playerSleepOnlyWithCondition);
+ playerSleepCondition = getString("gameplay-mechanics.player.sleep.condition", playerSleepCondition);
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
}
--
2.26.2

View File

@@ -0,0 +1,41 @@
From 670ad16925b34ff2bf80abea7613073586291c86 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sat, 30 Nov 2019 01:31:09 -0600
Subject: [PATCH] Option for hay block fall damage
---
src/main/java/net/minecraft/server/BlockHay.java | 2 +-
src/main/java/net/pl3x/purpur/PurpurWorldConfig.java | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/minecraft/server/BlockHay.java b/src/main/java/net/minecraft/server/BlockHay.java
index ca81c49f0..1f8f60542 100644
--- a/src/main/java/net/minecraft/server/BlockHay.java
+++ b/src/main/java/net/minecraft/server/BlockHay.java
@@ -9,6 +9,6 @@ public class BlockHay extends BlockRotatable {
@Override
public void fallOn(World world, BlockPosition blockposition, Entity entity, float f) {
- entity.b(f, 0.2F);
+ entity.b(f, world.purpurConfig.hayBlockFallDamage); // Purpur
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 08fb0bae3..a4a09874f 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -127,6 +127,11 @@ public class PurpurWorldConfig {
grindstoneBlacklist.addAll(blacklist);
}
+ public float hayBlockFallDamage = 0.2F;
+ private void hayBlockFallDamage() {
+ hayBlockFallDamage = (float) getDouble("blocks.hay_block.fall-damage", hayBlockFallDamage);
+ }
+
public boolean lavaInfinite = false;
private void lavaSettings() {
lavaInfinite = getBoolean("blocks.lava.infinite-source", lavaInfinite);
--
2.26.2

View File

@@ -0,0 +1,44 @@
From 5cb92f4ecb97c800374f4c632b3f3c371241a0c9 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Sat, 19 Oct 2019 02:43:17 -0500
Subject: [PATCH] Add LootableInventoryFirstFillEvent
---
.../paper/loottable/PaperLootableInventoryData.java | 4 ++++
.../paper/loottable/PaperTileEntityLootableInventory.java | 5 ++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java b/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java
index b5401eaf9..1decf0e89 100644
--- a/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java
+++ b/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java
@@ -49,6 +49,10 @@ public class PaperLootableInventoryData {
// ALWAYS process the first fill or if the feature is disabled
if (this.lastFill == -1 || !this.lootable.getNMSWorld().paperConfig.autoReplenishLootables) {
+ // Purpur start
+ LootableInventory inventory = lootable.getAPILootableInventory();
+ if (inventory != null) new net.pl3x.purpur.event.block.LootableInventoryFirstFillEvent(player == null ? null : (Player) player.getBukkitEntity(), inventory).callEvent();
+ // Purpur end
return true;
}
diff --git a/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java b/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java
index d50410532..2f24e5a70 100644
--- a/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java
+++ b/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java
@@ -57,7 +57,10 @@ public class PaperTileEntityLootableInventory implements PaperLootableBlockInven
if (world == null) {
return null;
}
- return (LootableInventory) getBukkitWorld().getBlockAt(MCUtil.toLocation(world, tileEntityLootable.getPosition())).getState();
+ // Purpur start
+ org.bukkit.block.BlockState state = getBukkitWorld().getBlockAt(MCUtil.toLocation(world, tileEntityLootable.getPosition())).getState();
+ return state instanceof LootableInventory ? (LootableInventory) state : null;
+ // Purpur end
}
@Override
--
2.26.2

View File

@@ -0,0 +1,200 @@
From cbe470f55a4b73c26d920e28b5a34244ccbfb9cf Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Wed, 22 Jan 2020 20:13:40 -0600
Subject: [PATCH] UPnP Port Forwarding Service
---
pom.xml | 10 ++++
.../net/minecraft/server/DedicatedServer.java | 25 ++++++++++
.../net/minecraft/server/MinecraftServer.java | 10 ++++
.../java/net/pl3x/purpur/PurpurConfig.java | 5 ++
.../net/pl3x/purpur/gui/info/JInfoPanel.java | 3 ++
.../pl3x/purpur/gui/info/UPnPComponent.java | 47 +++++++++++++++++++
6 files changed, 100 insertions(+)
create mode 100644 src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java
diff --git a/pom.xml b/pom.xml
index 097c736bc..adf7f78da 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,12 @@
<version>1.7.7.1</version>
<scope>compile</scope>
</dependency>
+ <dependency>
+ <groupId>com.dosse.upnp</groupId>
+ <artifactId>UPnP</artifactId>
+ <version>1.0</version>
+ <scope>compile</scope>
+ </dependency>
<!-- Purpur end -->
<dependency>
<groupId>net.minecrell</groupId>
@@ -166,6 +172,10 @@
<id>spigotmc-public</id>
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
</repository>
+ <repository>
+ <id>pl3x</id>
+ <url>https://repo.pl3x.net/</url>
+ </repository>
</repositories>
<pluginRepositories>
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
index 7f2db5f0b..5cfb6fd3d 100644
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
@@ -242,6 +242,31 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
return false;
}
+ // Purpur start
+ if (net.pl3x.purpur.PurpurConfig.useUPnP) {
+ LOGGER.info("[UPnP] Attempting to start UPnP port forwarding service...");
+ com.dosse.upnp.UPnP.NAME = "Purpur UPnP";
+ if (com.dosse.upnp.UPnP.isUPnPAvailable()) {
+ if (com.dosse.upnp.UPnP.isMappedTCP(getPort())) {
+ upnp = false;
+ LOGGER.info("[UPnP] Port " + getPort() + " is already open");
+ } else if (com.dosse.upnp.UPnP.openPortTCP(getPort())) {
+ upnp = true;
+ LOGGER.info("[UPnP] Successfully opened port " + getPort());
+ } else {
+ upnp = false;
+ LOGGER.info("[UPnP] Failed to open port " + getPort());
+ }
+ if (upnp) {
+ LOGGER.info("[UPnP] " + com.dosse.upnp.UPnP.getExternalIP() + ":" + getPort());
+ }
+ } else {
+ upnp = false;
+ LOGGER.error("[UPnP] Service is unavailable");
+ }
+ }
+ // Purpur end
+
// CraftBukkit start
// this.a((PlayerList) (new DedicatedPlayerList(this))); // Spigot - moved up
server.loadPlugins();
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index f23fdd5f2..d9e5eda9b 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -187,6 +187,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
public boolean lagging = false; // Purpur
public final SlackActivityAccountant slackActivityAccountant = new SlackActivityAccountant();
// Spigot end
+ protected boolean upnp = false; public boolean isUPnPEnabled() { return upnp; } // Purpur
public MinecraftServer(OptionSet options, Proxy proxy, DataFixer datafixer, CommandDispatcher commanddispatcher, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache, WorldLoadListenerFactory worldloadlistenerfactory, String s) {
super("Server");
@@ -745,6 +746,15 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
// CraftBukkit end
MinecraftServer.LOGGER.info("Stopping server (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO PAPER)"); // Paper
MinecraftTimings.stopServer(); // Paper
+ // Purpur start
+ if (upnp) {
+ if (com.dosse.upnp.UPnP.closePortTCP(getPort())) {
+ LOGGER.info("[UPnP] Port " + getPort() + " closed");
+ } else {
+ LOGGER.error("[UPnP] Failed to close port " + getPort());
+ }
+ }
+ // Purpur end
// CraftBukkit start
if (this.server != null) {
this.server.disablePlugins();
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index c3ecd6fc7..fe38b3ce9 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -150,6 +150,11 @@ public class PurpurConfig {
useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive);
}
+ public static boolean useUPnP = false;
+ private static void upnpSettings() {
+ useUPnP = getBoolean("settings.upnp-port-forwarding", useUPnP);
+ }
+
public static boolean dontSendUselessEntityPackets = false;
private static void dontSendUselessEntityPackets() {
dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets);
diff --git a/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java b/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java
index c4903c7db..ee4f022fc 100644
--- a/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java
+++ b/src/main/java/net/pl3x/purpur/gui/info/JInfoPanel.java
@@ -19,13 +19,16 @@ public class JInfoPanel extends JPanel {
ramGraph = new RAMGraph();
RAMDetails ramDetails = new RAMDetails(server);
+ UPnPComponent upnpComponent = new UPnPComponent(server);
add(ramGraph, "North");
add(ramDetails, "Center");
+ add(upnpComponent, "South");
timer = new Timer(500, (event) -> {
ramGraph.update();
ramDetails.update();
+ upnpComponent.repaint();
});
timer.start();
}
diff --git a/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java b/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java
new file mode 100644
index 000000000..b0465d360
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java
@@ -0,0 +1,47 @@
+package net.pl3x.purpur.gui.info;
+
+import net.minecraft.server.MinecraftServer;
+import net.pl3x.purpur.PurpurConfig;
+
+import javax.swing.JTextPane;
+import javax.swing.border.EmptyBorder;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+
+public class UPnPComponent extends JTextPane {
+ private final MinecraftServer server;
+
+ public UPnPComponent(MinecraftServer server) {
+ this.server = server;
+ setBorder(new EmptyBorder(0, 30, 0, 10));
+ setEditable(false);
+ setText("UPnP Status");
+ setOpaque(false);
+ setHighlighter(null);
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ return new Dimension(350, 20);
+ }
+
+ @Override
+ public void paint(Graphics graphics) {
+ super.paint(graphics);
+ graphics.setColor(server.isUPnPEnabled() ? Color.GREEN : Color.RED);
+ graphics.fillOval(10, 0, 15, 15);
+ setToolTipText(getTooltip());
+ }
+
+ private String getTooltip() {
+ if (!PurpurConfig.useUPnP) {
+ return "UPnP Disabled";
+ }
+ if (server.isUPnPEnabled()) {
+ return "UPnP Enabled";
+ } else {
+ return "UPnP Unavailable";
+ }
+ }
+}
--
2.26.2

View File

@@ -0,0 +1,69 @@
From 6dc574dbdbe31a99b139d32473070ac089288cc8 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sat, 22 Feb 2020 15:04:29 -0600
Subject: [PATCH] Implement bed explosion options
---
.../java/net/minecraft/server/BlockBed.java | 2 +-
.../net/pl3x/purpur/PurpurWorldConfig.java | 18 ++++++++++++++++++
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/minecraft/server/BlockBed.java b/src/main/java/net/minecraft/server/BlockBed.java
index e0bc6080e..61a5e06a2 100644
--- a/src/main/java/net/minecraft/server/BlockBed.java
+++ b/src/main/java/net/minecraft/server/BlockBed.java
@@ -84,7 +84,7 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity {
world.a(blockposition1, false);
}
- world.createExplosion((Entity) null, DamageSource.a(), (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, 5.0F, true, Explosion.Effect.DESTROY);
+ if (world.purpurConfig.bedExplode) world.createExplosion(null, DamageSource.a(), blockposition.getX() + 0.5D, blockposition.getY() + 0.5D, blockposition.getZ() + 0.5D, (float) world.purpurConfig.bedExplosionPower, world.purpurConfig.bedExplosionFire, world.purpurConfig.bedExplosionEffect); // Purpur
return EnumInteractionResult.SUCCESS;
// CraftBukkit end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 51585a7d8..0e34414a7 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -3,6 +3,7 @@ package net.pl3x.purpur;
import com.destroystokyo.paper.PaperWorldConfig;
import net.minecraft.server.Block;
import net.minecraft.server.Blocks;
+import net.minecraft.server.Explosion;
import net.minecraft.server.IRegistry;
import net.minecraft.server.MinecraftKey;
import org.bukkit.configuration.ConfigurationSection;
@@ -12,6 +13,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.logging.Level;
import static net.pl3x.purpur.PurpurConfig.log;
@@ -79,6 +81,22 @@ public class PurpurWorldConfig {
bambooSmallHeight = getInt("blocks.bamboo.small-height", bambooSmallHeight);
}
+ public boolean bedExplode = true;
+ public double bedExplosionPower = 5.0D;
+ public boolean bedExplosionFire = true;
+ public Explosion.Effect bedExplosionEffect = Explosion.Effect.DESTROY;
+ private void bedSettings() {
+ bedExplode = getBoolean("blocks.bed.explode", bedExplode);
+ bedExplosionPower = getDouble("blocks.bed.explosion-power", bedExplosionPower);
+ bedExplosionFire = getBoolean("blocks.bed.explosion-fire", bedExplosionFire);
+ try {
+ bedExplosionEffect = Explosion.Effect.valueOf(getString("blocks.bed.explosion-effect", bedExplosionEffect.name()));
+ } catch (IllegalArgumentException e) {
+ log(Level.SEVERE, "Unknown value for `blocks.bed.explosion-effect`! Using default of `DESTROY`");
+ bedExplosionEffect = Explosion.Effect.DESTROY;
+ }
+ }
+
public int campfireRegenInterval = 0;
public int campfireRegenDuration = 80;
public int campfireRegenRange = 5;
--
2.26.2

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,788 @@
From df05bfbcf31d32354e0286477ecf261279eb244d Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Wed, 1 Apr 2020 17:21:42 -0500
Subject: [PATCH] Configurable enchantment max level
---
src/main/java/net/minecraft/server/Enchantment.java | 12 ++++++++++--
.../net/minecraft/server/EnchantmentArrowDamage.java | 6 +-----
.../minecraft/server/EnchantmentArrowKnockback.java | 6 +-----
.../net/minecraft/server/EnchantmentBinding.java | 6 +-----
.../minecraft/server/EnchantmentDepthStrider.java | 6 +-----
.../net/minecraft/server/EnchantmentDigging.java | 6 +-----
.../net/minecraft/server/EnchantmentDurability.java | 6 +-----
.../java/net/minecraft/server/EnchantmentFire.java | 6 +-----
.../net/minecraft/server/EnchantmentFlameArrows.java | 6 +-----
.../net/minecraft/server/EnchantmentFrostWalker.java | 6 +-----
.../minecraft/server/EnchantmentInfiniteArrows.java | 6 +-----
.../net/minecraft/server/EnchantmentKnockback.java | 6 +-----
.../net/minecraft/server/EnchantmentLootBonus.java | 6 +-----
.../java/net/minecraft/server/EnchantmentLure.java | 6 +-----
.../net/minecraft/server/EnchantmentMending.java | 6 +-----
.../net/minecraft/server/EnchantmentMultishot.java | 6 +-----
.../java/net/minecraft/server/EnchantmentOxygen.java | 6 +-----
.../net/minecraft/server/EnchantmentPiercing.java | 6 +-----
.../net/minecraft/server/EnchantmentProtection.java | 7 +------
.../net/minecraft/server/EnchantmentQuickCharge.java | 6 +-----
.../net/minecraft/server/EnchantmentSilkTouch.java | 6 +-----
.../net/minecraft/server/EnchantmentSweeping.java | 6 +-----
.../java/net/minecraft/server/EnchantmentThorns.java | 6 +-----
.../server/EnchantmentTridentChanneling.java | 6 +-----
.../minecraft/server/EnchantmentTridentImpaling.java | 6 +-----
.../minecraft/server/EnchantmentTridentLoyalty.java | 6 +-----
.../minecraft/server/EnchantmentTridentRiptide.java | 6 +-----
.../net/minecraft/server/EnchantmentVanishing.java | 6 +-----
.../net/minecraft/server/EnchantmentWaterWorker.java | 6 +-----
.../minecraft/server/EnchantmentWeaponDamage.java | 6 +-----
src/main/java/net/pl3x/purpur/PurpurConfig.java | 10 ++++++++++
.../craftbukkit/enchantments/CraftEnchantment.java | 7 +++++++
32 files changed, 56 insertions(+), 148 deletions(-)
diff --git a/src/main/java/net/minecraft/server/Enchantment.java b/src/main/java/net/minecraft/server/Enchantment.java
index 70cd4a483..0ab96ea34 100644
--- a/src/main/java/net/minecraft/server/Enchantment.java
+++ b/src/main/java/net/minecraft/server/Enchantment.java
@@ -44,9 +44,17 @@ public abstract class Enchantment {
return 1;
}
- public int getMaxLevel() {
- return 1;
+ // Purpur start
+ private int maxLevel = 1;
+
+ public final int getMaxLevel() {
+ return maxLevel;
+ }
+
+ public final void setMaxLevel(int maxLevel) {
+ this.maxLevel = maxLevel;
}
+ // Purpur end
public int a(int i) {
return 1 + i * 10;
diff --git a/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java b/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java
index ffa1d19cb..1040e7e08 100644
--- a/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java
+++ b/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java
@@ -4,6 +4,7 @@ public class EnchantmentArrowDamage extends Enchantment {
public EnchantmentArrowDamage(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot);
+ setMaxLevel(5); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentArrowDamage extends Enchantment {
public int b(int i) {
return this.a(i) + 15;
}
-
- @Override
- public int getMaxLevel() {
- return 5;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java b/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java
index 9103f3c61..67f487b9e 100644
--- a/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java
+++ b/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java
@@ -4,6 +4,7 @@ public class EnchantmentArrowKnockback extends Enchantment {
public EnchantmentArrowKnockback(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot);
+ setMaxLevel(2); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentArrowKnockback extends Enchantment {
public int b(int i) {
return this.a(i) + 25;
}
-
- @Override
- public int getMaxLevel() {
- return 2;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentBinding.java b/src/main/java/net/minecraft/server/EnchantmentBinding.java
index b49154b13..ec4dad3cf 100644
--- a/src/main/java/net/minecraft/server/EnchantmentBinding.java
+++ b/src/main/java/net/minecraft/server/EnchantmentBinding.java
@@ -4,6 +4,7 @@ public class EnchantmentBinding extends Enchantment {
public EnchantmentBinding(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.WEARABLE, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentBinding extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 1;
- }
-
@Override
public boolean isTreasure() {
return true;
diff --git a/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java b/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java
index 669fbd268..07d566cd9 100644
--- a/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java
+++ b/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java
@@ -4,6 +4,7 @@ public class EnchantmentDepthStrider extends Enchantment {
public EnchantmentDepthStrider(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.ARMOR_FEET, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentDepthStrider extends Enchantment {
return this.a(i) + 15;
}
- @Override
- public int getMaxLevel() {
- return 3;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment) && enchantment != Enchantments.FROST_WALKER;
diff --git a/src/main/java/net/minecraft/server/EnchantmentDigging.java b/src/main/java/net/minecraft/server/EnchantmentDigging.java
index 798b3c250..16a7c38bc 100644
--- a/src/main/java/net/minecraft/server/EnchantmentDigging.java
+++ b/src/main/java/net/minecraft/server/EnchantmentDigging.java
@@ -4,6 +4,7 @@ public class EnchantmentDigging extends Enchantment {
protected EnchantmentDigging(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.DIGGER, aenumitemslot);
+ setMaxLevel(5); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentDigging extends Enchantment {
return super.a(i) + 50;
}
- @Override
- public int getMaxLevel() {
- return 5;
- }
-
@Override
public boolean canEnchant(ItemStack itemstack) {
return itemstack.getItem() == Items.SHEARS ? true : super.canEnchant(itemstack);
diff --git a/src/main/java/net/minecraft/server/EnchantmentDurability.java b/src/main/java/net/minecraft/server/EnchantmentDurability.java
index c946326fb..6deccef55 100644
--- a/src/main/java/net/minecraft/server/EnchantmentDurability.java
+++ b/src/main/java/net/minecraft/server/EnchantmentDurability.java
@@ -6,6 +6,7 @@ public class EnchantmentDurability extends Enchantment {
protected EnchantmentDurability(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.BREAKABLE, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -18,11 +19,6 @@ public class EnchantmentDurability extends Enchantment {
return super.a(i) + 50;
}
- @Override
- public int getMaxLevel() {
- return 3;
- }
-
@Override
public boolean canEnchant(ItemStack itemstack) {
return itemstack.e() ? true : super.canEnchant(itemstack);
diff --git a/src/main/java/net/minecraft/server/EnchantmentFire.java b/src/main/java/net/minecraft/server/EnchantmentFire.java
index c4da4378c..f2664c18e 100644
--- a/src/main/java/net/minecraft/server/EnchantmentFire.java
+++ b/src/main/java/net/minecraft/server/EnchantmentFire.java
@@ -4,6 +4,7 @@ public class EnchantmentFire extends Enchantment {
protected EnchantmentFire(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot);
+ setMaxLevel(2); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentFire extends Enchantment {
public int b(int i) {
return super.a(i) + 50;
}
-
- @Override
- public int getMaxLevel() {
- return 2;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java b/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java
index a0b4da25b..af3db770f 100644
--- a/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java
+++ b/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java
@@ -4,6 +4,7 @@ public class EnchantmentFlameArrows extends Enchantment {
public EnchantmentFlameArrows(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentFlameArrows extends Enchantment {
public int b(int i) {
return 50;
}
-
- @Override
- public int getMaxLevel() {
- return 1;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java b/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java
index b5de6c740..8c4fd331c 100644
--- a/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java
+++ b/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java
@@ -10,6 +10,7 @@ public class EnchantmentFrostWalker extends Enchantment {
public EnchantmentFrostWalker(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.ARMOR_FEET, aenumitemslot);
+ setMaxLevel(2); // Purpur
}
@Override
@@ -27,11 +28,6 @@ public class EnchantmentFrostWalker extends Enchantment {
return true;
}
- @Override
- public int getMaxLevel() {
- return 2;
- }
-
public static void a(EntityLiving entityliving, World world, BlockPosition blockposition, int i) {
if (entityliving.onGround) {
IBlockData iblockdata = Blocks.FROSTED_ICE.getBlockData();
diff --git a/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java b/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java
index 408cfa460..1dbedc0ad 100644
--- a/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java
+++ b/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java
@@ -4,6 +4,7 @@ public class EnchantmentInfiniteArrows extends Enchantment {
public EnchantmentInfiniteArrows(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentInfiniteArrows extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 1;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return enchantment instanceof EnchantmentMending ? false : super.a(enchantment);
diff --git a/src/main/java/net/minecraft/server/EnchantmentKnockback.java b/src/main/java/net/minecraft/server/EnchantmentKnockback.java
index 362ce7bc4..04062c255 100644
--- a/src/main/java/net/minecraft/server/EnchantmentKnockback.java
+++ b/src/main/java/net/minecraft/server/EnchantmentKnockback.java
@@ -4,6 +4,7 @@ public class EnchantmentKnockback extends Enchantment {
protected EnchantmentKnockback(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot);
+ setMaxLevel(2); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentKnockback extends Enchantment {
public int b(int i) {
return super.a(i) + 50;
}
-
- @Override
- public int getMaxLevel() {
- return 2;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentLootBonus.java b/src/main/java/net/minecraft/server/EnchantmentLootBonus.java
index b5232facc..c27e20e06 100644
--- a/src/main/java/net/minecraft/server/EnchantmentLootBonus.java
+++ b/src/main/java/net/minecraft/server/EnchantmentLootBonus.java
@@ -4,6 +4,7 @@ public class EnchantmentLootBonus extends Enchantment {
protected EnchantmentLootBonus(Enchantment.Rarity enchantment_rarity, EnchantmentSlotType enchantmentslottype, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, enchantmentslottype, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentLootBonus extends Enchantment {
return super.a(i) + 50;
}
- @Override
- public int getMaxLevel() {
- return 3;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment) && enchantment != Enchantments.SILK_TOUCH;
diff --git a/src/main/java/net/minecraft/server/EnchantmentLure.java b/src/main/java/net/minecraft/server/EnchantmentLure.java
index 1ffb91c57..c5a9e61f9 100644
--- a/src/main/java/net/minecraft/server/EnchantmentLure.java
+++ b/src/main/java/net/minecraft/server/EnchantmentLure.java
@@ -4,6 +4,7 @@ public class EnchantmentLure extends Enchantment {
protected EnchantmentLure(Enchantment.Rarity enchantment_rarity, EnchantmentSlotType enchantmentslottype, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, enchantmentslottype, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentLure extends Enchantment {
public int b(int i) {
return super.a(i) + 50;
}
-
- @Override
- public int getMaxLevel() {
- return 3;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentMending.java b/src/main/java/net/minecraft/server/EnchantmentMending.java
index dafc29399..ace2e19a6 100644
--- a/src/main/java/net/minecraft/server/EnchantmentMending.java
+++ b/src/main/java/net/minecraft/server/EnchantmentMending.java
@@ -4,6 +4,7 @@ public class EnchantmentMending extends Enchantment {
public EnchantmentMending(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.BREAKABLE, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -20,9 +21,4 @@ public class EnchantmentMending extends Enchantment {
public boolean isTreasure() {
return true;
}
-
- @Override
- public int getMaxLevel() {
- return 1;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentMultishot.java b/src/main/java/net/minecraft/server/EnchantmentMultishot.java
index 6f423e753..5fb8a624c 100644
--- a/src/main/java/net/minecraft/server/EnchantmentMultishot.java
+++ b/src/main/java/net/minecraft/server/EnchantmentMultishot.java
@@ -4,6 +4,7 @@ public class EnchantmentMultishot extends Enchantment {
public EnchantmentMultishot(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.CROSSBOW, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentMultishot extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 1;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment) && enchantment != Enchantments.PIERCING;
diff --git a/src/main/java/net/minecraft/server/EnchantmentOxygen.java b/src/main/java/net/minecraft/server/EnchantmentOxygen.java
index c1bc97f6e..a5726d36d 100644
--- a/src/main/java/net/minecraft/server/EnchantmentOxygen.java
+++ b/src/main/java/net/minecraft/server/EnchantmentOxygen.java
@@ -4,6 +4,7 @@ public class EnchantmentOxygen extends Enchantment {
public EnchantmentOxygen(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.ARMOR_HEAD, aenumitemslot);
+ setMaxLevel(3);// Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentOxygen extends Enchantment {
public int b(int i) {
return this.a(i) + 30;
}
-
- @Override
- public int getMaxLevel() {
- return 3;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentPiercing.java b/src/main/java/net/minecraft/server/EnchantmentPiercing.java
index 1a2e8e31f..0e8993e86 100644
--- a/src/main/java/net/minecraft/server/EnchantmentPiercing.java
+++ b/src/main/java/net/minecraft/server/EnchantmentPiercing.java
@@ -4,6 +4,7 @@ public class EnchantmentPiercing extends Enchantment {
public EnchantmentPiercing(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.CROSSBOW, aenumitemslot);
+ setMaxLevel(4); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentPiercing extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 4;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment) && enchantment != Enchantments.MULTISHOT;
diff --git a/src/main/java/net/minecraft/server/EnchantmentProtection.java b/src/main/java/net/minecraft/server/EnchantmentProtection.java
index 416e57caa..b29cb5467 100644
--- a/src/main/java/net/minecraft/server/EnchantmentProtection.java
+++ b/src/main/java/net/minecraft/server/EnchantmentProtection.java
@@ -10,7 +10,7 @@ public class EnchantmentProtection extends Enchantment {
if (enchantmentprotection_damagetype == EnchantmentProtection.DamageType.FALL) {
this.itemTarget = EnchantmentSlotType.ARMOR_FEET;
}
-
+ setMaxLevel(4); // Purpur
}
@Override
@@ -23,11 +23,6 @@ public class EnchantmentProtection extends Enchantment {
return this.a(i) + this.a.c();
}
- @Override
- public int getMaxLevel() {
- return 4;
- }
-
@Override
public int a(int i, DamageSource damagesource) {
return damagesource.ignoresInvulnerability() ? 0 : (this.a == EnchantmentProtection.DamageType.ALL ? i : (this.a == EnchantmentProtection.DamageType.FIRE && damagesource.isFire() ? i * 2 : (this.a == EnchantmentProtection.DamageType.FALL && damagesource == DamageSource.FALL ? i * 3 : (this.a == EnchantmentProtection.DamageType.EXPLOSION && damagesource.isExplosion() ? i * 2 : (this.a == EnchantmentProtection.DamageType.PROJECTILE && damagesource.b() ? i * 2 : 0)))));
diff --git a/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java b/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java
index e624b63aa..762642ce5 100644
--- a/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java
+++ b/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java
@@ -4,6 +4,7 @@ public class EnchantmentQuickCharge extends Enchantment {
public EnchantmentQuickCharge(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.CROSSBOW, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentQuickCharge extends Enchantment {
public int b(int i) {
return 50;
}
-
- @Override
- public int getMaxLevel() {
- return 3;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java b/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java
index 04aa8e1d5..d0eac6dbc 100644
--- a/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java
+++ b/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java
@@ -4,6 +4,7 @@ public class EnchantmentSilkTouch extends Enchantment {
protected EnchantmentSilkTouch(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.DIGGER, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentSilkTouch extends Enchantment {
return super.a(i) + 50;
}
- @Override
- public int getMaxLevel() {
- return 1;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment) && enchantment != Enchantments.LOOT_BONUS_BLOCKS;
diff --git a/src/main/java/net/minecraft/server/EnchantmentSweeping.java b/src/main/java/net/minecraft/server/EnchantmentSweeping.java
index a20b1c8f5..7804e0a0a 100644
--- a/src/main/java/net/minecraft/server/EnchantmentSweeping.java
+++ b/src/main/java/net/minecraft/server/EnchantmentSweeping.java
@@ -4,6 +4,7 @@ public class EnchantmentSweeping extends Enchantment {
public EnchantmentSweeping(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentSweeping extends Enchantment {
return this.a(i) + 15;
}
- @Override
- public int getMaxLevel() {
- return 3;
- }
-
public static float e(int i) {
return 1.0F - 1.0F / (float) (i + 1);
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentThorns.java b/src/main/java/net/minecraft/server/EnchantmentThorns.java
index fd0255c89..df7c9b24b 100644
--- a/src/main/java/net/minecraft/server/EnchantmentThorns.java
+++ b/src/main/java/net/minecraft/server/EnchantmentThorns.java
@@ -7,6 +7,7 @@ public class EnchantmentThorns extends Enchantment {
public EnchantmentThorns(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.ARMOR_CHEST, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -19,11 +20,6 @@ public class EnchantmentThorns extends Enchantment {
return super.a(i) + 50;
}
- @Override
- public int getMaxLevel() {
- return 3;
- }
-
@Override
public boolean canEnchant(ItemStack itemstack) {
return itemstack.getItem() instanceof ItemArmor ? true : super.canEnchant(itemstack);
diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java b/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java
index 14115ecc7..2533b2cab 100644
--- a/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java
+++ b/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java
@@ -4,6 +4,7 @@ public class EnchantmentTridentChanneling extends Enchantment {
public EnchantmentTridentChanneling(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentTridentChanneling extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 1;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment);
diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java b/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java
index f64fc401e..b47d8284f 100644
--- a/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java
+++ b/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java
@@ -4,6 +4,7 @@ public class EnchantmentTridentImpaling extends Enchantment {
public EnchantmentTridentImpaling(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot);
+ setMaxLevel(5); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentTridentImpaling extends Enchantment {
return this.a(i) + 20;
}
- @Override
- public int getMaxLevel() {
- return 5;
- }
-
@Override
public float a(int i, EnumMonsterType enummonstertype) {
return enummonstertype == EnumMonsterType.e ? (float) i * 2.5F : 0.0F;
diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java b/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java
index dd91bed6e..826f4d875 100644
--- a/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java
+++ b/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java
@@ -4,6 +4,7 @@ public class EnchantmentTridentLoyalty extends Enchantment {
public EnchantmentTridentLoyalty(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentTridentLoyalty extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 3;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment);
diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java b/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java
index 0f669dc7a..81d6ccc35 100644
--- a/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java
+++ b/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java
@@ -4,6 +4,7 @@ public class EnchantmentTridentRiptide extends Enchantment {
public EnchantmentTridentRiptide(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot);
+ setMaxLevel(3); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentTridentRiptide extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 3;
- }
-
@Override
public boolean a(Enchantment enchantment) {
return super.a(enchantment) && enchantment != Enchantments.LOYALTY && enchantment != Enchantments.CHANNELING;
diff --git a/src/main/java/net/minecraft/server/EnchantmentVanishing.java b/src/main/java/net/minecraft/server/EnchantmentVanishing.java
index 4ef59d7f1..5d7b6ca57 100644
--- a/src/main/java/net/minecraft/server/EnchantmentVanishing.java
+++ b/src/main/java/net/minecraft/server/EnchantmentVanishing.java
@@ -4,6 +4,7 @@ public class EnchantmentVanishing extends Enchantment {
public EnchantmentVanishing(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.ALL, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -16,11 +17,6 @@ public class EnchantmentVanishing extends Enchantment {
return 50;
}
- @Override
- public int getMaxLevel() {
- return 1;
- }
-
@Override
public boolean isTreasure() {
return true;
diff --git a/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java b/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java
index cf0999095..bea57861b 100644
--- a/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java
+++ b/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java
@@ -4,6 +4,7 @@ public class EnchantmentWaterWorker extends Enchantment {
public EnchantmentWaterWorker(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.ARMOR_HEAD, aenumitemslot);
+ setMaxLevel(1); // Purpur
}
@Override
@@ -15,9 +16,4 @@ public class EnchantmentWaterWorker extends Enchantment {
public int b(int i) {
return this.a(i) + 40;
}
-
- @Override
- public int getMaxLevel() {
- return 1;
- }
}
diff --git a/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java b/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java
index 4571cdf02..aa3cbd523 100644
--- a/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java
+++ b/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java
@@ -11,6 +11,7 @@ public class EnchantmentWeaponDamage extends Enchantment {
public EnchantmentWeaponDamage(Enchantment.Rarity enchantment_rarity, int i, EnumItemSlot... aenumitemslot) {
super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot);
this.a = i;
+ setMaxLevel(5); // Purpur
}
@Override
@@ -23,11 +24,6 @@ public class EnchantmentWeaponDamage extends Enchantment {
return this.a(i) + EnchantmentWeaponDamage.g[this.a];
}
- @Override
- public int getMaxLevel() {
- return 5;
- }
-
@Override
public float a(int i, EnumMonsterType enummonstertype) {
return this.a == 0 ? 1.0F + (float) Math.max(0, i - 1) * 0.5F : (this.a == 1 && enummonstertype == EnumMonsterType.UNDEAD ? (float) i * 2.5F : (this.a == 2 && enummonstertype == EnumMonsterType.ARTHROPOD ? (float) i * 2.5F : 0.0F));
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 7bea36213..68bad6a13 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -1,6 +1,8 @@
package net.pl3x.purpur;
import com.google.common.base.Throwables;
+import net.minecraft.server.Enchantment;
+import net.minecraft.server.IRegistry;
import net.minecraft.server.MinecraftServer;
import net.pl3x.purpur.command.PurpurCommand;
import org.bukkit.Bukkit;
@@ -194,4 +196,12 @@ public class PurpurConfig {
private static void timingsSettings() {
getString("settings.timings.url", "https://timings.pl3x.net");
}
+
+ private static void enchantmentSettings() {
+ for (Enchantment enchantment : IRegistry.ENCHANTMENT) {
+ String name = IRegistry.ENCHANTMENT.getKey(enchantment).getKey();
+ int maxLevel = getInt("settings.enchantment." + name + ".max-level", enchantment.getMaxLevel());
+ enchantment.setMaxLevel(maxLevel);
+ }
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
index 64ceeda1a..0e9fa3441 100644
--- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
+++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
@@ -23,6 +23,13 @@ public class CraftEnchantment extends Enchantment {
return target.getMaxLevel();
}
+ // Purpur start
+ @Override
+ public void setMaxLevel(int maxLevel) {
+ target.setMaxLevel(maxLevel);
+ }
+ // Purpur end
+
@Override
public int getStartLevel() {
return target.getStartLevel();
--
2.26.2

View File

@@ -0,0 +1,111 @@
From 4d4c1ccec681b4363afd0772013d59b6de57b351 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Thu, 2 Apr 2020 00:28:06 -0500
Subject: [PATCH] Optimize Chunk Ticks
---
.../minecraft/server/ChunkProviderServer.java | 50 ++++---------------
.../minecraft/server/EnumCreatureType.java | 14 ++++++
2 files changed, 25 insertions(+), 39 deletions(-)
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
index e8bf60507..93abf7493 100644
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
@@ -981,11 +981,12 @@ public class ChunkProviderServer extends IChunkProvider {
int k = this.world.getGameRules().getInt(GameRules.RANDOM_TICK_SPEED);
BlockPosition blockposition = this.world.getSpawn();
// CraftBukkit start - Other mob type spawn tick rate
- boolean spawnAnimalThisTick = world.ticksPerAnimalSpawns != 0L && worlddata.getTime() % world.ticksPerAnimalSpawns == 0L;
- boolean spawnMonsterThisTick = world.ticksPerMonsterSpawns != 0L && worlddata.getTime() % world.ticksPerMonsterSpawns == 0L;
- boolean spawnWaterThisTick = world.ticksPerWaterSpawns != 0L && worlddata.getTime() % world.ticksPerWaterSpawns == 0L;
- boolean spawnAmbientThisTick = world.ticksPerAmbientSpawns != 0L && worlddata.getTime() % world.ticksPerAmbientSpawns == 0L;
- boolean flag2 = spawnAnimalThisTick;
+ // Purpur start
+ EnumCreatureType.CREATURE.setLimitThisTick(world.ticksPerAnimalSpawns != 0L && i % world.ticksPerAnimalSpawns == 0L ? world.getWorld().getAnimalSpawnLimit() : -1);
+ EnumCreatureType.MONSTER.setLimitThisTick(world.ticksPerMonsterSpawns != 0L && i % world.ticksPerMonsterSpawns == 0L ? world.getWorld().getMonsterSpawnLimit() : -1);
+ EnumCreatureType.WATER_CREATURE.setLimitThisTick(world.ticksPerWaterSpawns != 0L && i % world.ticksPerWaterSpawns == 0L ? world.getWorld().getWaterAnimalSpawnLimit() : -1);
+ EnumCreatureType.AMBIENT.setLimitThisTick(world.ticksPerAmbientSpawns != 0L && i % world.ticksPerAmbientSpawns == 0L ? world.getWorld().getAmbientSpawnLimit() : -1);
+ // Purpur end
// CraftBukkit end
this.world.getMethodProfiler().enter("naturalSpawnCount");
@@ -1032,40 +1033,11 @@ public class ChunkProviderServer extends IChunkProvider {
if (flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(playerchunk, chunkcoordintpair, true)) { // Spigot // Paper - optimise isOutsideOfRange
this.world.getMethodProfiler().enter("spawner");
this.world.timings.mobSpawn.startTiming(); // Spigot
- EnumCreatureType[] aenumcreaturetype1 = aenumcreaturetype;
- int i1 = aenumcreaturetype.length;
-
- for (int j1 = 0; j1 < i1; ++j1) {
- EnumCreatureType enumcreaturetype = aenumcreaturetype1[j1];
-
- // CraftBukkit start - Use per-world spawn limits
- boolean spawnThisTick = true;
- int limit = enumcreaturetype.b();
- switch (enumcreaturetype) {
- case MONSTER:
- spawnThisTick = spawnMonsterThisTick;
- limit = world.getWorld().getMonsterSpawnLimit();
- break;
- case CREATURE:
- spawnThisTick = spawnAnimalThisTick;
- limit = world.getWorld().getAnimalSpawnLimit();
- break;
- case WATER_CREATURE:
- spawnThisTick = spawnWaterThisTick;
- limit = world.getWorld().getWaterAnimalSpawnLimit();
- break;
- case AMBIENT:
- spawnThisTick = spawnAmbientThisTick;
- limit = world.getWorld().getAmbientSpawnLimit();
- break;
- }
-
- if (!spawnThisTick || limit == 0) {
- continue;
- }
- // CraftBukkit end
-
- if (enumcreaturetype != EnumCreatureType.MISC && (!enumcreaturetype.c() || this.allowAnimals) && (enumcreaturetype.c() || this.allowMonsters) && (!enumcreaturetype.d() || flag2)) {
+ // Purpur start
+ for (EnumCreatureType enumcreaturetype : aenumcreaturetype) {
+ int limit = enumcreaturetype.getLimitThisTick();
+ if (limit > 0 && enumcreaturetype != EnumCreatureType.MISC && (!enumcreaturetype.isFriendly() || this.allowAnimals) && (enumcreaturetype.isFriendly() || this.allowMonsters)) {
+ // Purpur end
int k1 = limit * l / ChunkProviderServer.b; // CraftBukkit - use per-world limits
// Paper start - only allow spawns upto the limit per chunk and update count afterwards
diff --git a/src/main/java/net/minecraft/server/EnumCreatureType.java b/src/main/java/net/minecraft/server/EnumCreatureType.java
index 3ed7fa324..7f236585d 100644
--- a/src/main/java/net/minecraft/server/EnumCreatureType.java
+++ b/src/main/java/net/minecraft/server/EnumCreatureType.java
@@ -31,11 +31,25 @@ public enum EnumCreatureType {
return this.g;
}
+ public boolean isFriendly() { return c(); } // Purpur - OBFHELPER
public boolean c() {
return this.h;
}
+ public boolean isPersistent() { return d(); } // Purpur - OBFHELPER
public boolean d() {
return this.i;
}
+
+ // Purpur start
+ private int limitThisTick = -1;
+
+ void setLimitThisTick(int cap) {
+ this.limitThisTick = cap;
+ }
+
+ int getLimitThisTick() {
+ return this.limitThisTick;
+ }
+ // Purpur end
}
--
2.26.2

View File

@@ -0,0 +1,107 @@
From a4900735eb07249132c6a813145a613e4d86026b Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Thu, 2 Apr 2020 03:39:34 -0500
Subject: [PATCH] Add configurable beehive generation chance
---
.../server/WorldGenFeatureTreeBeehive.java | 18 +++++++++++++--
.../server/WorldGenTreeProvider.java | 5 +++-
.../net/pl3x/purpur/PurpurWorldConfig.java | 23 +++++++++++++++++++
3 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java b/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java
index 5827b1ba1..5ef9ae16e 100644
--- a/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java
+++ b/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java
@@ -10,7 +10,7 @@ import java.util.stream.Collectors;
public class WorldGenFeatureTreeBeehive extends WorldGenFeatureTree {
- private final float b;
+ private final float b; public float getChance() { return b; } // Purpur - OBFHELPER
public WorldGenFeatureTreeBeehive(float f) {
super(WorldGenFeatureTrees.d);
@@ -23,7 +23,7 @@ public class WorldGenFeatureTreeBeehive extends WorldGenFeatureTree {
@Override
public void a(GeneratorAccess generatoraccess, Random random, List<BlockPosition> list, List<BlockPosition> list1, Set<BlockPosition> set, StructureBoundingBox structureboundingbox) {
- if (random.nextFloat() < this.b) {
+ if (random.nextFloat() < getChance(generatoraccess.getMinecraftWorld(), list.get(0))) {
EnumDirection enumdirection = BlockBeehive.a[random.nextInt(BlockBeehive.a.length)];
int i = !list1.isEmpty() ? Math.max(((BlockPosition) list1.get(0)).getY() - 1, ((BlockPosition) list.get(0)).getY()) : Math.min(((BlockPosition) list.get(0)).getY() + 1 + random.nextInt(3), ((BlockPosition) list.get(list.size() - 1)).getY());
List<BlockPosition> list2 = (List) list.stream().filter((blockposition) -> {
@@ -56,6 +56,20 @@ public class WorldGenFeatureTreeBeehive extends WorldGenFeatureTree {
}
}
+ private float getChance(World world, BlockPosition position) {
+ BiomeBase biome = world.getBiome(position);
+ if (biome == Biomes.PLAINS) return world.purpurConfig.beehivesGeneratePlainsChance;
+ else if (biome == Biomes.SUNFLOWER_PLAINS) return world.purpurConfig.beehivesGenerateSunflowerPlainsChance;
+ else if (biome == Biomes.FLOWER_FOREST) return world.purpurConfig.beehivesGenerateFlowerForestChance;
+ else if (biome == Biomes.FOREST) return world.purpurConfig.beehivesGenerateForestChance;
+ else if (biome == Biomes.WOODED_HILLS) return world.purpurConfig.beehivesGenerateWoodedHillsChance;
+ else if (biome == Biomes.BIRCH_FOREST) return world.purpurConfig.beehivesGenerateBirchForestChance;
+ else if (biome == Biomes.TALL_BIRCH_FOREST) return world.purpurConfig.beehivesGenerateTallBirchForestChance;
+ else if (biome == Biomes.BIRCH_FOREST_HILLS) return world.purpurConfig.beehivesGenerateBirchForestHillsChance;
+ else if (biome == Biomes.TALL_BIRCH_HILLS) return world.purpurConfig.beehivesGenerateTallBirchHillsChance;
+ return getChance();
+ }
+
@Override
public <T> T a(DynamicOps<T> dynamicops) {
return new Dynamic<>(dynamicops, dynamicops.createMap(ImmutableMap.of(dynamicops.createString("type"), dynamicops.createString(IRegistry.w.getKey(this.a).toString()), dynamicops.createString("probability"), dynamicops.createFloat(this.b)))).getValue(); // Purpur - decompile error
diff --git a/src/main/java/net/minecraft/server/WorldGenTreeProvider.java b/src/main/java/net/minecraft/server/WorldGenTreeProvider.java
index b9dee0e25..9e9d9e643 100644
--- a/src/main/java/net/minecraft/server/WorldGenTreeProvider.java
+++ b/src/main/java/net/minecraft/server/WorldGenTreeProvider.java
@@ -31,7 +31,10 @@ public abstract class WorldGenTreeProvider {
}
private boolean a(GeneratorAccess generatoraccess, BlockPosition blockposition) {
- Iterator iterator = BlockPosition.MutableBlockPosition.a(blockposition.down().north(2).west(2), blockposition.up().south(2).east(2)).iterator();
+ // Purpur start
+ int r = generatoraccess.getMinecraftWorld().purpurConfig.beehivesSaplingFlowerRadius;
+ Iterator iterator = BlockPosition.MutableBlockPosition.a(blockposition.down().north(r).west(r), blockposition.up().south(r).east(r)).iterator();
+ // Purpur end
BlockPosition blockposition1;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index adcdc6b8f..0347b729c 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -99,6 +99,29 @@ public class PurpurWorldConfig {
}
}
+ public int beehivesSaplingFlowerRadius = 2;
+ public float beehivesGeneratePlainsChance = 0.05F;
+ public float beehivesGenerateSunflowerPlainsChance = 0.05F;
+ public float beehivesGenerateFlowerForestChance = 0.01F;
+ public float beehivesGenerateForestChance;
+ public float beehivesGenerateWoodedHillsChance;
+ public float beehivesGenerateBirchForestChance;
+ public float beehivesGenerateTallBirchForestChance;
+ public float beehivesGenerateBirchForestHillsChance;
+ public float beehivesGenerateTallBirchHillsChance;
+ private void beehiveSettings() {
+ beehivesSaplingFlowerRadius = getInt("beehive.grow-sapling-flower-check-radius", beehivesSaplingFlowerRadius);
+ beehivesGeneratePlainsChance = (float) getDouble("beehive.generation-chance.plains", beehivesGeneratePlainsChance);
+ beehivesGenerateSunflowerPlainsChance = (float) getDouble("beehive.generation-chance.sunflower-plains", beehivesGenerateSunflowerPlainsChance);
+ beehivesGenerateFlowerForestChance = (float) getDouble("beehive.generation-chance.flower-forest", beehivesGenerateFlowerForestChance);
+ beehivesGenerateForestChance = (float) getDouble("beehive.generation-chance.forest", beehivesGenerateForestChance);
+ beehivesGenerateWoodedHillsChance = (float) getDouble("beehive.generation-chance.wooded-hills", beehivesGenerateWoodedHillsChance);
+ beehivesGenerateBirchForestChance = (float) getDouble("beehive.generation-chance.birch-forest", beehivesGenerateBirchForestChance);
+ beehivesGenerateTallBirchForestChance = (float) getDouble("beehive.generation-chance.tall-birch-forest", beehivesGenerateTallBirchForestChance);
+ beehivesGenerateBirchForestHillsChance = (float) getDouble("beehive.generation-chance.birch-forest-hills", beehivesGenerateBirchForestHillsChance);
+ beehivesGenerateTallBirchHillsChance = (float) getDouble("beehive.generation-chance.tall-birch-hills", beehivesGenerateTallBirchHillsChance);
+ }
+
public int campfireRegenInterval = 0;
public int campfireRegenDuration = 80;
public int campfireRegenRange = 5;
--
2.26.2

View File

@@ -0,0 +1,224 @@
From 758523eb133359d46e347782229675a02ee5a1e9 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sat, 4 Apr 2020 02:36:45 -0500
Subject: [PATCH] Add more timings timers
---
.../co/aikar/timings/MinecraftTimings.java | 22 +++++++++++++++++++
.../minecraft/server/EntityInsentient.java | 14 ++++++++++++
.../net/minecraft/server/EntityLiving.java | 12 ++++++++++
.../server/PathfinderGoalSelector.java | 6 +++++
.../net/minecraft/server/WorldServer.java | 2 ++
5 files changed, 56 insertions(+)
diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java
index 2966c5731..f663f019b 100644
--- a/src/main/java/co/aikar/timings/MinecraftTimings.java
+++ b/src/main/java/co/aikar/timings/MinecraftTimings.java
@@ -45,6 +45,28 @@ public final class MinecraftTimings {
public static final Timing scoreboardScoreSearch = Timings.ofSafe("Scoreboard score search"); // Tuinity - add timings for scoreboard search
+ // Purpur start
+ public static final Timing goalCleanup = Timings.ofSafe("PathfinderGoal - Cleanup");
+ public static final Timing goalUpdate = Timings.ofSafe("PathfinderGoal - Update");
+ public static final Timing goalTick = Timings.ofSafe("PathfinderGoal - Tick");
+
+ public static final Timing entityMovementTick = Timings.ofSafe("Entity Movement");
+ public static final Timing entityMovementTickAI = Timings.ofSafe("Entity Movement - AI");
+ public static final Timing entityMovementTickNewAI = Timings.ofSafe("Entity Movement - New AI");
+ public static final Timing entityMovementTickJump = Timings.ofSafe("Entity Movement - Jump");
+ public static final Timing entityMovementTickTravel = Timings.ofSafe("Entity Movement - Travel");
+ public static final Timing entityMovementTickPush = Timings.ofSafe("Entity Movement - Push");
+
+ public static final Timing entityInsentientSensing = Timings.ofSafe("Entity Insentient - Sensing");
+ public static final Timing entityInsentientTargetSelector = Timings.ofSafe("Entity Insentient - TargetSelector");
+ public static final Timing entityInsentientGoalSelector = Timings.ofSafe("Entity Insentient - GoalSelector");
+ public static final Timing entityInsentientNavigation = Timings.ofSafe("Entity Insentient - Navigation");
+ public static final Timing entityInsentientMobTick = Timings.ofSafe("Entity Insentient - MobTick");
+ public static final Timing entityInsentientControls = Timings.ofSafe("Entity Insentient - Controls");
+
+ public static final Timing passengerTick = Timings.ofSafe("Passenger Tick");
+ // Purpur end
+
private static final Map<Class<?>, String> taskNameCache = new MapMaker().weakKeys().makeMap();
private MinecraftTimings() {}
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
index 3adc3434e..eb0befb35 100644
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
@@ -1,5 +1,7 @@
package net.minecraft.server;
+import co.aikar.timings.Timing;
+import co.aikar.timings.Timings;
import com.google.common.collect.Maps;
import java.util.Arrays;
import java.util.Iterator;
@@ -676,21 +678,32 @@ public abstract class EntityInsentient extends EntityLiving {
}
// Paper end
this.world.getMethodProfiler().enter("sensing");
+ co.aikar.timings.MinecraftTimings.entityInsentientSensing.startTiming(); // Purpur
this.bw.a();
+ co.aikar.timings.MinecraftTimings.entityInsentientSensing.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("targetSelector");
+ co.aikar.timings.MinecraftTimings.entityInsentientTargetSelector.startTiming(); // Purpur
this.targetSelector.doTick();
+ co.aikar.timings.MinecraftTimings.entityInsentientTargetSelector.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("goalSelector");
+ co.aikar.timings.MinecraftTimings.entityInsentientGoalSelector.startTiming(); // Purpur
this.goalSelector.doTick();
+ co.aikar.timings.MinecraftTimings.entityInsentientGoalSelector.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("navigation");
+ co.aikar.timings.MinecraftTimings.entityInsentientNavigation.startTiming(); // Purpur
this.navigation.c();
+ co.aikar.timings.MinecraftTimings.entityInsentientNavigation.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("mob tick");
+ co.aikar.timings.MinecraftTimings.entityInsentientMobTick.startTiming(); // Purpur
this.mobTick();
+ co.aikar.timings.MinecraftTimings.entityInsentientMobTick.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("controls");
+ co.aikar.timings.MinecraftTimings.entityInsentientControls.startTiming(); // Purpur
this.world.getMethodProfiler().enter("move");
this.moveController.a();
this.world.getMethodProfiler().exitEnter("look");
@@ -698,6 +711,7 @@ public abstract class EntityInsentient extends EntityLiving {
this.world.getMethodProfiler().exitEnter("jump");
this.bq.b();
this.world.getMethodProfiler().exit();
+ co.aikar.timings.MinecraftTimings.entityInsentientControls.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.K();
}
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index dae35c55e..3b5e38608 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -2398,7 +2398,9 @@ public abstract class EntityLiving extends Entity {
}
}
+ MinecraftTimings.entityMovementTick.startTiming(); // Purpur
if (!dead) this.movementTick(); // Purpur
+ MinecraftTimings.entityMovementTick.stopTiming(); // Purpur
double d0 = this.locX() - this.lastX;
double d1 = this.locZ() - this.lastZ;
float f = (float) (d0 * d0 + d1 * d1);
@@ -2605,18 +2607,23 @@ public abstract class EntityLiving extends Entity {
this.setMot(d4, d5, d6);
this.world.getMethodProfiler().enter("ai");
+ co.aikar.timings.MinecraftTimings.entityMovementTickAI.startTiming(); // Purpur
if (this.isFrozen()) {
this.jumping = false;
this.aZ = 0.0F;
this.bb = 0.0F;
} else if (this.doAITick()) {
this.world.getMethodProfiler().enter("newAi");
+ co.aikar.timings.MinecraftTimings.entityMovementTickNewAI.startTiming(); // Purpur
this.doTick();
+ co.aikar.timings.MinecraftTimings.entityMovementTickNewAI.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
}
+ co.aikar.timings.MinecraftTimings.entityMovementTickAI.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("jump");
+ co.aikar.timings.MinecraftTimings.entityMovementTickJump.startTiming(); // Purpur
if (this.jumping) {
if (this.N > 0.0D && (!this.onGround || this.N > 0.4D)) {
this.c(TagsFluid.WATER);
@@ -2632,22 +2639,27 @@ public abstract class EntityLiving extends Entity {
this.jumpTicks = 0;
}
+ co.aikar.timings.MinecraftTimings.entityMovementTickJump.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("travel");
+ co.aikar.timings.MinecraftTimings.entityMovementTickTravel.startTiming(); // Purpur
this.aZ *= 0.98F;
this.bb *= 0.98F;
this.n();
AxisAlignedBB axisalignedbb = this.getBoundingBox();
this.e(new Vec3D((double) this.aZ, (double) this.ba, (double) this.bb));
+ co.aikar.timings.MinecraftTimings.entityMovementTickTravel.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
this.world.getMethodProfiler().enter("push");
+ co.aikar.timings.MinecraftTimings.entityMovementTickPush.startTiming(); // Purpur
if (this.bn > 0) {
--this.bn;
this.a(axisalignedbb, this.getBoundingBox());
}
this.collideNearby();
+ co.aikar.timings.MinecraftTimings.entityMovementTickPush.stopTiming(); // Purpur
this.world.getMethodProfiler().exit();
// Purpur start
if (EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0) {
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java
index a68fc11ec..4b277a6f6 100644
--- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java
+++ b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java
@@ -78,6 +78,7 @@ public class PathfinderGoalSelector {
private static final PathfinderGoal.Type[] PATHFINDER_GOAL_TYPES = PathfinderGoal.Type.values(); // Paper - remove streams from pathfindergoalselector
public void doTick() {
+ co.aikar.timings.MinecraftTimings.goalCleanup.startTiming();
this.e.enter("goalCleanup");
// Paper start - remove streams from pathfindergoalselector
for (Iterator<PathfinderGoalWrapped> iterator = this.d.iterator(); iterator.hasNext();) {
@@ -97,8 +98,10 @@ public class PathfinderGoalSelector {
}
});
+ co.aikar.timings.MinecraftTimings.goalCleanup.stopTiming();
this.e.exit();
this.e.enter("goalUpdate");
+ co.aikar.timings.MinecraftTimings.goalUpdate.startTiming();
// Paper start - remove streams from pathfindergoalselector
goal_update_loop: for (Iterator<PathfinderGoalWrapped> iterator = this.d.iterator(); iterator.hasNext();) {
PathfinderGoalWrapped wrappedGoal = iterator.next();
@@ -141,8 +144,10 @@ public class PathfinderGoalSelector {
wrappedGoal.c();
}
// Paper end - remove streams from pathfindergoalselector
+ co.aikar.timings.MinecraftTimings.goalUpdate.stopTiming();
this.e.exit();
this.e.enter("goalTick");
+ co.aikar.timings.MinecraftTimings.goalTick.startTiming();
// Paper start - remove streams from pathfindergoalselector
for (Iterator<PathfinderGoalWrapped> iterator = this.d.iterator(); iterator.hasNext();) {
PathfinderGoalWrapped wrappedGoal = iterator.next();
@@ -151,6 +156,7 @@ public class PathfinderGoalSelector {
}
}
// Paper end - remove streams from pathfindergoalselector
+ co.aikar.timings.MinecraftTimings.goalTick.stopTiming();
this.e.exit();
}
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 610542dc8..23d832914 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -1308,7 +1308,9 @@ public class WorldServer extends World {
return IRegistry.ENTITY_TYPE.getKey(entity1.getEntityType()).toString();
});
gameprofilerfiller.c("tickPassenger");
+ co.aikar.timings.MinecraftTimings.passengerTick.startTiming(); // Purpur
entity1.passengerTick();
+ co.aikar.timings.MinecraftTimings.passengerTick.stopTiming(); // Purpur
gameprofilerfiller.exit();
}
--
2.26.2

View File

@@ -0,0 +1,67 @@
From 709d9ada46d90e86bde0c82e0dc0960c3e7c86b7 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Tue, 9 Jul 2019 20:56:47 -0500
Subject: [PATCH] MC-56653 Fix - pig zombies aggro
---
src/main/java/net/minecraft/server/EntityPigZombie.java | 9 ++++++++-
src/main/java/net/pl3x/purpur/PurpurWorldConfig.java | 2 ++
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java
index 90bf12c73..c78876fc4 100644
--- a/src/main/java/net/minecraft/server/EntityPigZombie.java
+++ b/src/main/java/net/minecraft/server/EntityPigZombie.java
@@ -170,6 +170,7 @@ public class EntityPigZombie extends EntityZombie {
boolean result = super.damageEntity(damagesource, f);
if (result && entity instanceof EntityHuman && !((EntityHuman) entity).isCreative() && this.hasLineOfSight(entity)) {
+ if (world.purpurConfig.zombiePigmanDontTargetUnlessHit) this.setLastDamager((EntityHuman) entity); // Purpur - fix MC-56653
this.i((EntityLiving) entity);
}
@@ -188,7 +189,7 @@ public class EntityPigZombie extends EntityZombie {
this.angerLevel = event.getNewAnger();
// CraftBukkit end
this.soundDelay = this.random.nextInt(40);
- this.setLastDamager(entityliving);
+ if (!world.purpurConfig.zombiePigmanDontTargetUnlessHit) this.setLastDamager(entityliving); // Purpur - fix MC-56653
return true;
}
@@ -230,6 +231,12 @@ public class EntityPigZombie extends EntityZombie {
return this.eA();
}
+ // Purpur start - fix MC-56653
+ protected boolean isDropExperience() {
+ return super.isDropExperience() && (!world.purpurConfig.zombiePigmanDontTargetUnlessHit || getLastDamager() instanceof EntityHuman);
+ }
+ // Purpur end
+
static class PathfinderGoalAnger extends PathfinderGoalNearestAttackableTarget<EntityHuman> {
public PathfinderGoalAnger(EntityPigZombie entitypigzombie) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 296274896..7e7f10351 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -1013,6 +1013,7 @@ public class PurpurWorldConfig {
public boolean zombiePigmanJockeyOnlyBaby = true;
public double zombiePigmanJockeyChance = 0.05D;
public boolean zombiePigmanJockeyTryExistingChickens = true;
+ public boolean zombiePigmanDontTargetUnlessHit = false;
private void zombiePigmanSettings() {
zombiePigmanRidable = getBoolean("mobs.zombie_pigman.ridable", zombiePigmanRidable);
zombiePigmanRidableInWater = getBoolean("mobs.zombie_pigman.ridable-in-water", zombiePigmanRidableInWater);
@@ -1020,6 +1021,7 @@ public class PurpurWorldConfig {
zombiePigmanJockeyOnlyBaby = getBoolean("mobs.zombie_pigman.jockey.only-babies", zombiePigmanJockeyOnlyBaby);
zombiePigmanJockeyChance = getDouble("mobs.zombie_pigman.jockey.chance", zombiePigmanJockeyChance);
zombiePigmanJockeyTryExistingChickens = getBoolean("mobs.zombie_pigman.jockey.try-existing-chickens", zombiePigmanJockeyTryExistingChickens);
+ zombiePigmanDontTargetUnlessHit = getBoolean("mobs.zombie_pigman.dont-target-unless-hit", zombiePigmanDontTargetUnlessHit);
}
public boolean zombieVillagerRidable = false;
--
2.26.2

View File

@@ -0,0 +1,175 @@
From 1b1a21c1dc6b4bbfbe85b0743ee29c22385882f9 Mon Sep 17 00:00:00 2001
From: tr7zw <tr7zw@live.de>
Date: Thu, 5 Mar 2020 23:08:01 +0100
Subject: [PATCH] YAPFA - Disable mojang profiler
---
.../net/minecraft/server/CommandDebug.java | 5 ++
.../net/minecraft/server/MinecraftServer.java | 5 +-
.../net/pl3x/purpur/GameProfilerNoop.java | 68 +++++++++++++++++++
.../java/org/bukkit/craftbukkit/Main.java | 2 +
src/main/resources/purpur.lang | 1 +
5 files changed, 80 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/net/pl3x/purpur/GameProfilerNoop.java
diff --git a/src/main/java/net/minecraft/server/CommandDebug.java b/src/main/java/net/minecraft/server/CommandDebug.java
index f0d72ea39..e38a68406 100644
--- a/src/main/java/net/minecraft/server/CommandDebug.java
+++ b/src/main/java/net/minecraft/server/CommandDebug.java
@@ -22,6 +22,7 @@ public class CommandDebug {
private static final Logger LOGGER = LogManager.getLogger();
private static final SimpleCommandExceptionType b = new SimpleCommandExceptionType(new ChatMessage("commands.debug.notRunning", new Object[0]));
private static final SimpleCommandExceptionType c = new SimpleCommandExceptionType(new ChatMessage("commands.debug.alreadyRunning", new Object[0]));
+ private static final SimpleCommandExceptionType disabled = new SimpleCommandExceptionType(new ChatMessage("commands.purpur.debug.disabled")); // Purpur
@Nullable
private static final FileSystemProvider d = (FileSystemProvider) FileSystemProvider.installedProviders().stream().filter((filesystemprovider) -> {
return filesystemprovider.getScheme().equalsIgnoreCase("jar");
@@ -43,6 +44,8 @@ public class CommandDebug {
MinecraftServer minecraftserver = commandlistenerwrapper.getServer();
GameProfiler gameprofiler = minecraftserver.getMethodProfiler();
+ if (gameprofiler instanceof net.pl3x.purpur.GameProfilerNoop) throw CommandDebug.disabled.create(); // Purpur
+
if (gameprofiler.d().a()) {
throw CommandDebug.c.create();
} else {
@@ -56,6 +59,8 @@ public class CommandDebug {
MinecraftServer minecraftserver = commandlistenerwrapper.getServer();
GameProfiler gameprofiler = minecraftserver.getMethodProfiler();
+ if (gameprofiler instanceof net.pl3x.purpur.GameProfilerNoop) throw CommandDebug.disabled.create(); // Purpur
+
if (!gameprofiler.d().a()) {
throw CommandDebug.b.create();
} else {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 40da7a05c..6928d2492 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -80,7 +80,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
private final MojangStatisticsGenerator snooper = new MojangStatisticsGenerator("server", this, SystemUtils.getMonotonicMillis());
public File universe;
private final List<Runnable> tickables = Lists.newArrayList();
- private final GameProfiler methodProfiler = new GameProfiler(this::ak);
+ protected GameProfiler methodProfiler = new net.pl3x.purpur.GameProfilerNoop(this::getTickCount); // Purpur
private ServerConnection serverConnection;
public final WorldLoadListenerFactory worldLoadListenerFactory;
private final ServerPing serverPing = new ServerPing();
@@ -1529,6 +1529,8 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
String s1 = (String) Optional.ofNullable(optionset.valueOf("world")).orElse(dedicatedserversettings.getProperties().levelName);
final DedicatedServer dedicatedserver = new DedicatedServer(optionset, dedicatedserversettings, DataConverterRegistry.a(), yggdrasilauthenticationservice, minecraftsessionservice, gameprofilerepository, usercache, WorldLoadListenerLogger::new, s1);
+ if (optionset.has("enableProfiler") || optionset.nonOptionArguments().contains("enableProfiler")) dedicatedserver.methodProfiler = new GameProfiler(dedicatedserver::getTickCount); // Purpur
+
/*
dedicatedserver.i((String) optionset.valueOf(optionspec7));
dedicatedserver.setPort((Integer) optionset.valueOf(optionspec10));
@@ -1956,6 +1958,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
public abstract boolean a(EnumGamemode enumgamemode, boolean flag, int i);
+ public int getTickCount() { return ak(); } // Purpur - OBFHELPER
public int ak() {
return this.ticks;
}
diff --git a/src/main/java/net/pl3x/purpur/GameProfilerNoop.java b/src/main/java/net/pl3x/purpur/GameProfilerNoop.java
new file mode 100644
index 000000000..b32a5418f
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/GameProfilerNoop.java
@@ -0,0 +1,68 @@
+package net.pl3x.purpur;
+
+import net.minecraft.server.GameProfiler;
+import net.minecraft.server.MethodProfilerResults;
+import net.minecraft.server.MethodProfilerResultsEmpty;
+
+import java.util.function.IntSupplier;
+import java.util.function.Supplier;
+
+public class GameProfilerNoop extends GameProfiler {
+ private final EmptyProfiler profiler = new EmptyProfiler();
+
+ public GameProfilerNoop(IntSupplier tickCount) {
+ super(tickCount);
+ }
+
+ public GameProfiler.a d() {
+ return this.profiler;
+ }
+
+ @Override
+ public void a() {
+ }
+
+ @Override
+ public void b() {
+ }
+
+ @Override
+ public void enter(String s) {
+ }
+
+ @Override
+ public void a(Supplier<String> supplier) {
+ }
+
+ @Override
+ public void exit() {
+ }
+
+ @Override
+ public void exitEnter(String s) {
+ }
+
+ @Override
+ public void c(String s) {
+ }
+
+ @Override
+ public void c(Supplier<String> supplier) {
+ }
+
+ static class EmptyProfiler implements GameProfiler.a {
+ @Override
+ public boolean a() { // isEnabled
+ return false;
+ }
+
+ @Override
+ public MethodProfilerResults b() { // disable
+ return MethodProfilerResultsEmpty.a; // empty
+ }
+
+ @Override
+ public void d() { // enable
+ }
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index b007840a5..1916bfb5d 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -152,6 +152,8 @@ public class Main {
.ofType(File.class)
.defaultsTo(new File("purpur.yml"))
.describedAs("Yml file");
+
+ acceptsAll(asList("enableProfiler"), "Enables the vanilla profiler");
// Purpur end
// Paper start
diff --git a/src/main/resources/purpur.lang b/src/main/resources/purpur.lang
index e81beea7f..5c3536b26 100644
--- a/src/main/resources/purpur.lang
+++ b/src/main/resources/purpur.lang
@@ -1,5 +1,6 @@
{
"cannot.ride.mob": "You cannot mount that mob",
+ "commands.purpur.debug.disabled": "The debug profiler is disabled",
"commands.purpur.ping": "§a%s's ping is %sms",
"idle.timeout.broadcast.away": "§e§o%s is now AFK",
"idle.timeout.broadcast.back": "§e§o%s is no longer AFK"
--
2.26.2