diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/commands/Commands.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/commands/Commands.java.patch deleted file mode 100644 index 76c7592a4..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/commands/Commands.java.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index ec1cced129ef42be65d7b2b622638bfae8bd895e..e03e2b976870ecda1e5e3c53d47e7978fe5670ed 100644 ---- a/net/minecraft/commands/Commands.java -+++ b/net/minecraft/commands/Commands.java -@@ -252,7 +252,7 @@ public class Commands { - JfrCommand.register(this.dispatcher); - } - -- if (SharedConstants.IS_RUNNING_IN_IDE) { -+ if (org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands || SharedConstants.IS_RUNNING_IN_IDE) { // Purpur - register minecraft debug commands - RaidCommand.register(this.dispatcher, context); - DebugPathCommand.register(this.dispatcher); - DebugMobSpawningCommand.register(this.dispatcher); -@@ -264,6 +264,12 @@ public class Commands { - } - } - -+ // Purpur start - register disabled minecraft commands -+ if (org.purpurmc.purpur.PurpurConfig.registerMinecraftDisabledCommands) { -+ net.minecraft.server.commands.ChaseCommand.register(this.dispatcher); -+ } -+ // Purpur end - register disabled minecraft commands -+ - if (selection.includeDedicated) { - BanIpCommands.register(this.dispatcher); - BanListCommands.register(this.dispatcher); -@@ -280,6 +286,14 @@ public class Commands { - StopCommand.register(this.dispatcher); - TransferCommand.register(this.dispatcher); - WhitelistCommand.register(this.dispatcher); -+ org.purpurmc.purpur.command.CreditsCommand.register(this.dispatcher); // Purpur - Add credits command -+ org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur - Add demo command -+ org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur - Add ping command -+ org.purpurmc.purpur.command.UptimeCommand.register(this.dispatcher); // Purpur - Add uptime command -+ org.purpurmc.purpur.command.TPSBarCommand.register(this.dispatcher); // Purpur - Implement TPSBar -+ org.purpurmc.purpur.command.CompassCommand.register(this.dispatcher); // Purpur - Add compass command -+ org.purpurmc.purpur.command.RamBarCommand.register(this.dispatcher); // Purpur - Add rambar command -+ org.purpurmc.purpur.command.RamCommand.register(this.dispatcher); // Purpur - Add ram command - } - - if (selection.includeIntegrated) { -@@ -504,6 +518,7 @@ public class Commands { - private void runSync(ServerPlayer player, java.util.Collection bukkit, RootCommandNode rootCommandNode) { - // Paper end - Perf: Async command map building - new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootCommandNode, true).callEvent(); // Paper - Brigadier API -+ if (org.bukkit.event.player.PlayerCommandSendEvent.getHandlerList().getRegisteredListeners().length > 0) { // Purpur - Skip events if there's no listeners - org.bukkit.event.player.PlayerCommandSendEvent event = new org.bukkit.event.player.PlayerCommandSendEvent(player.getBukkitEntity(), new java.util.LinkedHashSet<>(bukkit)); - event.getPlayer().getServer().getPluginManager().callEvent(event); - -@@ -514,6 +529,8 @@ public class Commands { - } - } - // CraftBukkit end -+ } // Purpur - Skip events if there's no listeners -+ - player.connection.send(new ClientboundCommandsPacket(rootCommandNode, COMMAND_NODE_INSPECTOR)); - } - diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/server/dedicated/DedicatedServer.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/server/dedicated/DedicatedServer.java.patch deleted file mode 100644 index ef5baf4f3..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 98927d4a5fba2a0dcdb147ac10b82c3286ccdc6b..670553243d26e2faab8a21f099a846d4d1df7927 100644 ---- a/net/minecraft/server/dedicated/DedicatedServer.java -+++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -105,6 +105,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - public void run() { - if (!org.bukkit.craftbukkit.Main.useConsole) return; // CraftBukkit - // Paper start - Use TerminalConsoleAppender -+ if (DedicatedServer.this.gui == null || System.console() != null) // Purpur - GUI Improvements - has no GUI or has console (did not double-click) - new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start(); - /* - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); -@@ -183,6 +184,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command - this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark - com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics -+ // Purpur start - Purpur config files -+ try { -+ org.purpurmc.purpur.PurpurConfig.init((java.io.File) options.valueOf("purpur-settings")); -+ } catch (Exception e) { -+ DedicatedServer.LOGGER.error("Unable to load server configuration", e); -+ return false; -+ } -+ org.purpurmc.purpur.PurpurConfig.registerCommands(); -+ // Purpur end - Purpur config files - com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now - - this.setPvpAllowed(properties.pvp); -@@ -230,6 +240,30 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - if (true) throw new IllegalStateException("Failed to bind to port", var10); // Paper - Propagate failed to bind to port error - return false; - } -+ // Purpur start - UPnP Port Forwarding -+ if (org.purpurmc.purpur.PurpurConfig.useUPnP) { -+ LOGGER.info("[UPnP] Attempting to start UPnP port forwarding service..."); -+ if (dev.omega24.upnp4j.UPnP4J.isUPnPAvailable()) { -+ if (dev.omega24.upnp4j.UPnP4J.isOpen(this.getPort(), dev.omega24.upnp4j.util.Protocol.TCP)) { -+ this.upnp = false; -+ LOGGER.info("[UPnP] Port {} is already open", this.getPort()); -+ } else if (dev.omega24.upnp4j.UPnP4J.open(this.getPort(), dev.omega24.upnp4j.util.Protocol.TCP)) { -+ this.upnp = true; -+ LOGGER.info("[UPnP] Successfully opened port {}", this.getPort()); -+ } else { -+ this.upnp = false; -+ LOGGER.info("[UPnP] Failed to open port {}", this.getPort()); -+ } -+ -+ if (upnp) { -+ LOGGER.info("[UPnP] {}:{}", dev.omega24.upnp4j.UPnP4J.getExternalIP(), this.getPort()); -+ } -+ } else { -+ this.upnp = false; -+ LOGGER.error("[UPnP] Service is unavailable"); -+ } -+ } -+ // Purpur end - UPnP Port Forwarding - - // CraftBukkit start - this.server.loadPlugins(); -@@ -308,6 +342,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - LOGGER.info("JMX monitoring enabled"); - } - -+ org.purpurmc.purpur.task.BossBarTask.startAll(); // Purpur - Implement TPSBar -+ if (org.purpurmc.purpur.PurpurConfig.beeCountPayload) org.purpurmc.purpur.task.BeehiveTask.instance().register(); // Purpur - Give bee counts in beehives to Purpur clients - return true; - } - } diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/server/dedicated/DedicatedServerProperties.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/server/dedicated/DedicatedServerProperties.java.patch deleted file mode 100644 index 12f65e365..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/server/dedicated/DedicatedServerProperties.java.patch +++ /dev/null @@ -1,18 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/server/dedicated/DedicatedServerProperties.java b/net/minecraft/server/dedicated/DedicatedServerProperties.java -index 4a01088da91fc6d620cb804a9ab6d6eb1630b473..b286dc17cda16fca3af9374d2a4a8bd137c24450 100644 ---- a/net/minecraft/server/dedicated/DedicatedServerProperties.java -+++ b/net/minecraft/server/dedicated/DedicatedServerProperties.java -@@ -51,6 +51,7 @@ public class DedicatedServerProperties extends Settings -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index e1fd699b33832c0f01b14023db7cc2b9d6797227..189bf2f787e6f99ed16d75c2e05ff4351d2c8747 100644 ---- a/net/minecraft/server/players/PlayerList.java -+++ b/net/minecraft/server/players/PlayerList.java -@@ -401,6 +401,7 @@ public abstract class PlayerList { - scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); - } - // Paper end - Configurable player collision -+ org.purpurmc.purpur.task.BossBarTask.addToAll(player); // Purpur - Implement TPSBar - PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), loggableAddress, player.getId(), serverLevel.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); - // Paper start - Send empty chunk, so players aren't stuck in the world loading screen with our chunk system not sending chunks when dead - if (player.isDeadOrDying()) { -@@ -508,6 +509,7 @@ public abstract class PlayerList { - } - public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) { - // Paper end - Fix kick event leave message not being sent -+ org.purpurmc.purpur.task.BossBarTask.removeFromAll(player.getBukkitEntity()); // Purpur - Implement TPSBar - ServerLevel serverLevel = player.level(); - player.awardStat(Stats.LEAVE_GAME); - // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it -@@ -893,6 +895,20 @@ public abstract class PlayerList { - } - } - -+ // Purpur start - Component related conveniences -+ public void broadcastMiniMessage(@Nullable String message, boolean overlay) { -+ if (message != null && !message.isEmpty()) { -+ this.broadcastMessage(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(message), overlay); -+ } -+ } -+ -+ public void broadcastMessage(@Nullable net.kyori.adventure.text.Component message, boolean overlay) { -+ if (message != null) { -+ this.broadcastSystemMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(message), overlay); -+ } -+ } -+ // Purpur end - Component related conveniences -+ - public void broadcastAll(Packet packet, ResourceKey dimension) { - for (ServerPlayer serverPlayer : this.players) { - if (serverPlayer.level().dimension() == dimension) { -@@ -977,6 +993,7 @@ public abstract class PlayerList { - } else { - b = (byte)(24 + permLevel); - } -+ if (b < 28 && player.getBukkitEntity().hasPermission("purpur.debug.f3n")) b = 28; // Purpur - Add permission for F3+N debug - - player.connection.send(new ClientboundEntityEventPacket(player, b)); - } -@@ -989,7 +1006,7 @@ public abstract class PlayerList { - - // Paper start - whitelist verify event / login event - public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) { -- final boolean shouldKick = this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(profile); -+ final boolean shouldKick = this.players.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(profile)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining - final io.papermc.paper.event.player.PlayerServerFullCheckEvent fullCheckEvent = new io.papermc.paper.event.player.PlayerServerFullCheckEvent( - com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(profile), - io.papermc.paper.adventure.PaperAdventure.asAdventure(currentResult.message), diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/animal/Bee.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/animal/Bee.java.patch deleted file mode 100644 index 277f0180d..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/animal/Bee.java.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 13f24836649790a34b988e2d63accb043e6ff080..a74def8accfbed14257b4090889a6c8d1a3ccd87 100644 ---- a/net/minecraft/world/entity/animal/Bee.java -+++ b/net/minecraft/world/entity/animal/Bee.java -@@ -168,7 +168,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - // Paper end - Fix MC-167279 - this.lookControl = new Bee.BeeLookControl(this); - this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); -- this.setPathfindingMalus(PathType.WATER, -1.0F); -+ if (this.level().purpurConfig.beeCanInstantlyStartDrowning) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - bee can instantly start drowning in water option - this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); - this.setPathfindingMalus(PathType.COCOA, -1.0F); - this.setPathfindingMalus(PathType.FENCE, -1.0F); -@@ -366,7 +366,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - } - - public static boolean isNightOrRaining(Level level) { -- return level.dimensionType().hasSkyLight() && (level.isDarkOutside() || level.isRaining()); -+ return level.dimensionType().hasSkyLight() && (level.isDarkOutside() && !level.purpurConfig.beeCanWorkAtNight || level.isRaining() && !level.purpurConfig.beeCanWorkInRain); // Purpur - Bee can work when raining or at night - } - - public void setStayOutOfHiveCountdown(int stayOutOfHiveCountdown) { -@@ -389,7 +389,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - @Override - protected void customServerAiStep(ServerLevel level) { - boolean hasStung = this.hasStung(); -- if (this.isInWater()) { -+ if (this.level().purpurConfig.beeCanInstantlyStartDrowning && this.isInWater()) { // Purpur - bee can instantly start drowning in water option - this.underWaterTicks++; - } else { - this.underWaterTicks = 0; -@@ -399,6 +399,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - this.hurtServer(level, this.damageSources().drown(), 1.0F); - } - -+ if (hasStung && !this.level().purpurConfig.beeDiesAfterSting) setHasStung(false); else // Purpur - Stop bees from dying after stinging - if (hasStung) { - this.timeSinceSting++; - if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) { -@@ -1133,6 +1134,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - Bee.this.savedFlowerPos = optional.get(); - Bee.this.navigation - .moveTo(Bee.this.savedFlowerPos.getX() + 0.5, Bee.this.savedFlowerPos.getY() + 0.5, Bee.this.savedFlowerPos.getZ() + 0.5, 1.2F); -+ new org.purpurmc.purpur.event.entity.BeeFoundFlowerEvent((org.bukkit.entity.Bee) Bee.this.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(Bee.this.savedFlowerPos, Bee.this.level())).callEvent(); // Purpur - Bee API - return true; - } else { - Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60); -@@ -1179,6 +1181,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - this.pollinating = false; - Bee.this.navigation.stop(); - Bee.this.remainingCooldownBeforeLocatingNewFlower = 200; -+ new org.purpurmc.purpur.event.entity.BeeStopPollinatingEvent((org.bukkit.entity.Bee) Bee.this.getBukkitEntity(), Bee.this.savedFlowerPos == null ? null : org.bukkit.craftbukkit.util.CraftLocation.toBukkit(Bee.this.savedFlowerPos, Bee.this.level()), Bee.this.hasNectar()).callEvent(); // Purpur - Bee API - } - - @Override -@@ -1225,6 +1228,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - this.setWantedPos(); - } - -+ if (this.successfulPollinatingTicks == 0) new org.purpurmc.purpur.event.entity.BeeStartedPollinatingEvent((org.bukkit.entity.Bee) Bee.this.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(Bee.this.savedFlowerPos, Bee.this.level())).callEvent(); // Purpur - Bee API - this.successfulPollinatingTicks++; - if (Bee.this.random.nextFloat() < 0.05F && this.successfulPollinatingTicks > this.lastSoundPlayedTick + 60) { - this.lastSoundPlayedTick = this.successfulPollinatingTicks; diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/animal/Parrot.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/animal/Parrot.java.patch deleted file mode 100644 index 67dfd1122..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/animal/Parrot.java.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java -index 22d1e36dadd6a8cbf615335074426aaab6ea7d01..50d836960e6b2d7dae760ac648b5999d8c58b785 100644 ---- a/net/minecraft/world/entity/animal/Parrot.java -+++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -159,6 +159,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - protected void registerGoals() { - this.goalSelector.addGoal(0, new TamableAnimal.TamableAnimalPanicGoal(1.25)); - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ if (this.level().purpurConfig.parrotBreedable) this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.BreedGoal(this, 1.0D)); // Purpur - Breedable parrots - this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); - this.goalSelector.addGoal(2, new FollowOwnerGoal(this, 1.0, 5.0F, 1.0F)); -@@ -264,7 +265,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - } - - if (!this.level().isClientSide) { -- if (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled()) { // CraftBukkit -+ if (((this.level().purpurConfig.alwaysTameInCreative && player.hasInfiniteMaterials()) || this.random.nextInt(10) == 0) && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled()) { // CraftBukkit // Purpur - Config to always tame in Creative - this.tame(player); - this.level().broadcastEntityEvent(this, (byte)7); - } else { -@@ -272,6 +273,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - } - } - -+ if (this.level().purpurConfig.parrotBreedable) return super.mobInteract(player, hand); // Purpur - Breedable parrots - return InteractionResult.SUCCESS; - } else if (!itemInHand.is(ItemTags.PARROT_POISONOUS_FOOD)) { - if (!this.isFlying() && this.isTame() && this.isOwnedBy(player)) { -@@ -296,7 +298,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - - @Override - public boolean isFood(ItemStack stack) { -- return false; -+ return this.level().purpurConfig.parrotBreedable && stack.is(ItemTags.PARROT_FOOD); // Purpur - Breedable parrots - } - - public static boolean checkParrotSpawnRules( -@@ -311,13 +313,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - - @Override - public boolean canMate(Animal otherAnimal) { -- return false; -+ return super.canMate(otherAnimal); // Purpur - Breedable parrots - } - - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) { -- return null; -+ return level.purpurConfig.parrotBreedable ? EntityType.PARROT.create(level, EntitySpawnReason.BREEDING) : null; // Purpur - Breedable parrots - } - - @Nullable diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/monster/Skeleton.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/monster/Skeleton.java.patch deleted file mode 100644 index 99318d823..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/monster/Skeleton.java.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java -index 743bc2986b962d4aaef00d2e457117f375ca65c7..d53364e33bd9e15ad419f306d7cc2e09c9de242c 100644 ---- a/net/minecraft/world/entity/monster/Skeleton.java -+++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -140,4 +140,64 @@ public class Skeleton extends AbstractSkeleton { - this.spawnAtLocation(level, Items.SKELETON_SKULL); - } - } -+ -+ // Purpur start - Skeletons eat wither roses -+ private int witherRosesFed = 0; -+ -+ @Override -+ public net.minecraft.world.InteractionResult mobInteract(net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand) { -+ net.minecraft.world.item.ItemStack stack = player.getItemInHand(hand); -+ -+ if (level().purpurConfig.skeletonFeedWitherRoses > 0 && this.getType() != EntityType.WITHER_SKELETON && stack.getItem() == net.minecraft.world.level.block.Blocks.WITHER_ROSE.asItem()) { -+ return this.feedWitherRose(player, stack); -+ } -+ -+ return super.mobInteract(player, hand); -+ } -+ -+ private net.minecraft.world.InteractionResult feedWitherRose(net.minecraft.world.entity.player.Player player, net.minecraft.world.item.ItemStack stack) { -+ if (++witherRosesFed < level().purpurConfig.skeletonFeedWitherRoses) { -+ if (!player.getAbilities().instabuild) { -+ stack.shrink(1); -+ } -+ return net.minecraft.world.InteractionResult.CONSUME; -+ } -+ -+ WitherSkeleton skeleton = EntityType.WITHER_SKELETON.create(level(), net.minecraft.world.entity.EntitySpawnReason.CONVERSION); -+ if (skeleton == null) { -+ return net.minecraft.world.InteractionResult.PASS; -+ } -+ -+ skeleton.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); -+ skeleton.setHealth(this.getHealth()); -+ skeleton.setAggressive(this.isAggressive()); -+ skeleton.copyPosition(this); -+ skeleton.setYBodyRot(this.yBodyRot); -+ skeleton.setYHeadRot(this.getYHeadRot()); -+ skeleton.yRotO = this.yRotO; -+ skeleton.xRotO = this.xRotO; -+ -+ if (this.hasCustomName()) { -+ skeleton.setCustomName(this.getCustomName()); -+ } -+ -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTransformEvent(this, skeleton, org.bukkit.event.entity.EntityTransformEvent.TransformReason.INFECTION).isCancelled()) { -+ return net.minecraft.world.InteractionResult.PASS; -+ } -+ -+ this.level().addFreshEntity(skeleton); -+ this.remove(RemovalReason.DISCARDED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); -+ if (!player.getAbilities().instabuild) { -+ stack.shrink(1); -+ } -+ -+ for (int i = 0; i < 15; ++i) { -+ ((ServerLevel) level()).sendParticlesSource(((ServerLevel) level()).players(), null, net.minecraft.core.particles.ParticleTypes.HAPPY_VILLAGER, -+ false, true, -+ getX() + random.nextFloat(), getY() + (random.nextFloat() * 2), getZ() + random.nextFloat(), 1, -+ random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, 0); -+ } -+ return net.minecraft.world.InteractionResult.SUCCESS; -+ } -+ // Purpur end - Skeletons eat wither roses - } diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch deleted file mode 100644 index ea04fe3af..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index bc80d5b302f24974ce89db502b41d659457dd98c..75a8f3ecaec5cdfe98aa8363326a8a2047ea75b1 100644 ---- a/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -129,10 +129,10 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - public InteractionResult mobInteract(Player player, InteractionHand hand) { - ItemStack itemInHand = player.getItemInHand(hand); - if (itemInHand.is(Items.GOLDEN_APPLE)) { -- if (this.hasEffect(MobEffects.WEAKNESS)) { -+ if (this.hasEffect(MobEffects.WEAKNESS) && level().purpurConfig.zombieVillagerCureEnabled) { // Purpur - Add option to disable zombie villagers cure - itemInHand.consume(1, player); - if (!this.level().isClientSide) { -- this.startConverting(player.getUUID(), this.random.nextInt(2401) + 3600); -+ this.startConverting(player.getUUID(), this.random.nextInt(level().purpurConfig.zombieVillagerCuringTimeMax - level().purpurConfig.zombieVillagerCuringTimeMin + 1) + level().purpurConfig.zombieVillagerCuringTimeMin); // Purpur - Customizable Zombie Villager curing times - } - - return InteractionResult.SUCCESS_SERVER; diff --git a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/npc/CatSpawner.java.patch b/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/npc/CatSpawner.java.patch deleted file mode 100644 index 222cd8727..000000000 --- a/purpur-server/minecraft-patches/unapplied-sources/net/minecraft/world/entity/npc/CatSpawner.java.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 1e4693c6129676cacc2e29a157b5a69107c78543 Mon Sep 17 00:00:00 2001 -From: File -Date: Sun, 20 Apr 1997 06:37:42 -0700 -Subject: [PATCH] purpur File Patches - - -diff --git a/net/minecraft/world/entity/npc/CatSpawner.java b/net/minecraft/world/entity/npc/CatSpawner.java -index e282b6ab6d0d1c11ee40f5f436bd50fa90ddc88b..d6ae13c19481ce33bfa0b6c9db63283009339d8c 100644 ---- a/net/minecraft/world/entity/npc/CatSpawner.java -+++ b/net/minecraft/world/entity/npc/CatSpawner.java -@@ -25,7 +25,7 @@ public class CatSpawner implements CustomSpawner { - if (spawnFriendlies && level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { - this.nextTick--; - if (this.nextTick <= 0) { -- this.nextTick = 1200; -+ this.nextTick = level.purpurConfig.catSpawnDelay; // Purpur - Cat spawning options - Player randomPlayer = level.getRandomPlayer(); - if (randomPlayer != null) { - RandomSource randomSource = level.random; -@@ -48,9 +48,12 @@ public class CatSpawner implements CustomSpawner { - } - - private void spawnInVillage(ServerLevel level, BlockPos pos) { -- int i = 48; -- if (level.getPoiManager().getCountInRange(holder -> holder.is(PoiTypes.HOME), pos, 48, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { -- List entitiesOfClass = level.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(48.0, 8.0, 48.0)); -+ // Purpur start - Cat spawning options -+ int range = level.purpurConfig.catSpawnVillageScanRange; -+ if (range <= 0) return; -+ if (level.getPoiManager().getCountInRange(holder -> holder.is(PoiTypes.HOME), pos, range, PoiManager.Occupancy.IS_OCCUPIED) > 4L) { -+ List entitiesOfClass = level.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(range, 8.0, range)); -+ // Purpur end - Cat spawning options - if (entitiesOfClass.size() < 5) { - this.spawnCat(pos, level, false); - } -@@ -58,8 +61,11 @@ public class CatSpawner implements CustomSpawner { - } - - private void spawnInHut(ServerLevel level, BlockPos pos) { -- int i = 16; -- List entitiesOfClass = level.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(16.0, 8.0, 16.0)); -+ // Purpur start - Cat spawning options -+ int range = level.purpurConfig.catSpawnSwampHutScanRange; -+ if (range <= 0) return; -+ List entitiesOfClass = level.getEntitiesOfClass(Cat.class, new AABB(pos).inflate(range, 8.0, range)); -+ // Purpur end - Cat spawning options - if (entitiesOfClass.isEmpty()) { - this.spawnCat(pos, level, true); - }