diff --git a/patches/server-unmapped/0168-Add-ghast-allow-griefing-option.patch b/patches/removed/1.17/0168-Add-ghast-allow-griefing-option.patch similarity index 98% rename from patches/server-unmapped/0168-Add-ghast-allow-griefing-option.patch rename to patches/removed/1.17/0168-Add-ghast-allow-griefing-option.patch index 6ccfac862..cfc64fe45 100644 --- a/patches/server-unmapped/0168-Add-ghast-allow-griefing-option.patch +++ b/patches/removed/1.17/0168-Add-ghast-allow-griefing-option.patch @@ -3,6 +3,7 @@ From: William Blake Galbreath Date: Sat, 13 Feb 2021 14:02:43 -0600 Subject: [PATCH] Add ghast allow-griefing option +fireball griefing is already covered by another patch diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java b/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java index e83d9aae4a04fc67587d40cec1f24ba5ebb58e10..5834b38ab206a9db6d3e336074095ce85bdbcc50 100644 diff --git a/patches/server-unmapped/0165-Config-to-always-tame-in-Creative.patch b/patches/server-unmapped/0165-Config-to-always-tame-in-Creative.patch deleted file mode 100644 index 19ca2eb53..000000000 --- a/patches/server-unmapped/0165-Config-to-always-tame-in-Creative.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Encode42 -Date: Tue, 9 Feb 2021 21:23:37 -0500 -Subject: [PATCH] Config to always tame in Creative - -Adds a configuration option that ensures a player in Creative always tames a tameable entity. -This essentially allows Creative mode players to tame animals on their first try. - -diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.java b/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.java -index d285f5aa66fa81a2f56920c05afb4506cb82fa54..39e348847bcecd91013452e71ef1672994a1bfa7 100644 ---- a/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.java -+++ b/src/main/java/net/minecraft/world/entity/ai/goal/PathfinderGoalTame.java -@@ -63,7 +63,7 @@ public class PathfinderGoalTame extends PathfinderGoal { - int j = this.entity.getMaxDomestication(); - - // CraftBukkit - fire EntityTameEvent -- if (j > 0 && this.entity.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.entity.getBukkitEntity().getPassenger()).getHandle()).isCancelled()) { -+ if ((this.entity.world.purpurConfig.alwaysTameInCreative && ((EntityHuman) entity).abilities.canInstantlyBuild) || (j > 0 && this.entity.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.entity.getBukkitEntity().getPassenger()).getHandle()).isCancelled())) { // Purpur - this.entity.i((EntityHuman) entity); - return; - } -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java -index b3b26044daaf084b9bdc911f10804bbb852f088c..048cd00d7a06d572e39fe8bd020c097b203d0253 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java -@@ -439,7 +439,7 @@ public class EntityCat extends EntityTameableAnimal { - } - } else if (this.k(itemstack)) { - this.a(entityhuman, itemstack); -- if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { // CraftBukkit -+ if ((this.world.purpurConfig.alwaysTameInCreative && entityhuman.abilities.canInstantlyBuild) || (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled())) { // CraftBukkit // Purpur - this.tame(entityhuman); - this.setWillSit(true); - this.world.broadcastEntityEffect(this, (byte) 7); -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java -index 7500de8bcdd32f08bf6d32e70cfe09baf097cc2b..2f51e80a02817f1e36c8fe9542809ab881263a16 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java -@@ -301,7 +301,7 @@ public class EntityParrot extends EntityPerchable implements EntityBird { - } - - if (!this.world.isClientSide) { -- if (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { // CraftBukkit -+ if ((this.world.purpurConfig.alwaysTameInCreative && entityhuman.abilities.canInstantlyBuild) || (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled())) { // CraftBukkit // Purpur - this.tame(entityhuman); - this.world.broadcastEntityEffect(this, (byte) 7); - } else { -diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java b/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java -index 090903fbc8f6cd1522c7afb358f708f5ae3395f4..884a3f03c73efb8fb0863976615fba5ec10f716c 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java -+++ b/src/main/java/net/minecraft/world/entity/animal/EntityWolf.java -@@ -482,7 +482,7 @@ public class EntityWolf extends EntityTameableAnimal implements IEntityAngerable - } - - // CraftBukkit - added event call and isCancelled check. -- if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { -+ if ((this.world.purpurConfig.alwaysTameInCreative && entityhuman.abilities.canInstantlyBuild) || (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled())) { // Purpur - this.tame(entityhuman); - this.navigation.o(); - this.setGoalTarget((EntityLiving) null); -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index faa5df044857f19503b35bbcf7366ac13b2fa2a9..88e28b680e144e1b0bb919e93644b86a48b553e1 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -299,6 +299,7 @@ public class PurpurWorldConfig { - } - - public boolean useBetterMending = false; -+ public boolean alwaysTameInCreative = false; - public boolean boatEjectPlayersOnLand = false; - public boolean boatsDoFallDamage = true; - public boolean disableDropsOnCrammingDeath = false; -@@ -316,6 +317,7 @@ public class PurpurWorldConfig { - public int animalBreedingCooldownSeconds = 0; - private void miscGameplayMechanicsSettings() { - useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); -+ alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative); - boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); - boatsDoFallDamage = getBoolean("gameplay-mechanics.boat.do-fall-damage", boatsDoFallDamage); - disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath); diff --git a/patches/server-unmapped/0166-End-crystal-explosion-options.patch b/patches/server-unmapped/0166-End-crystal-explosion-options.patch deleted file mode 100644 index 3bede61fa..000000000 --- a/patches/server-unmapped/0166-End-crystal-explosion-options.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Ben Kerllenevich -Date: Sat, 13 Feb 2021 09:28:56 -0500 -Subject: [PATCH] End crystal explosion options - - -diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java -index 4cd5d2de76e785e839c3b3a78d55f2304d9aa4c3..f2c4151671806f053ccadaf16c21af429f9c71bb 100644 ---- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java -+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.java -@@ -130,6 +130,22 @@ public class EntityEnderCrystal extends Entity { - phantomDamageCooldown = 0; - idleCooldown = 60; - } -+ -+ public boolean shouldExplode() { -+ return isShowingBottom() ? world.purpurConfig.baseCrystalExplode : world.purpurConfig.baselessCrystalExplode; -+ } -+ -+ public float getExplosionPower() { -+ return (float) (isShowingBottom() ? world.purpurConfig.baseCrystalExplosionPower : world.purpurConfig.baselessCrystalExplosionPower); -+ } -+ -+ public boolean hasExplosionFire() { -+ return isShowingBottom() ? world.purpurConfig.baseCrystalExplosionFire : world.purpurConfig.baselessCrystalExplosionFire; -+ } -+ -+ public Explosion.Effect getExplosionEffect() { -+ return isShowingBottom() ? world.purpurConfig.baseCrystalExplosionEffect : world.purpurConfig.baselessCrystalExplosionEffect; -+ } - // Purpur end - - @Override -@@ -175,15 +191,17 @@ public class EntityEnderCrystal extends Entity { - // CraftBukkit end - this.die(); - if (!damagesource.isExplosion()) { -+ if (shouldExplode()) { // Purpur - // CraftBukkit start -- ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), getExplosionPower(), hasExplosionFire()); // Purpur - this.world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.dead = false; - return false; - } -- this.world.createExplosion(this, this.locX(), this.locY(), this.locZ(), event.getRadius(), event.getFire(), Explosion.Effect.DESTROY); -+ this.world.createExplosion(this, this.locX(), this.locY(), this.locZ(), event.getRadius(), event.getFire(), getExplosionEffect()); // Purpur - // CraftBukkit end -+ } else this.dead = false; // Purpur - } - - this.a(damagesource); -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 88e28b680e144e1b0bb919e93644b86a48b553e1..266b64abb949fca2cc667395d175c962c55435db 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -1975,4 +1975,33 @@ public class PurpurWorldConfig { - private void imposeTeleportRestrictionsOnGateways() { - imposeTeleportRestrictionsOnGateways = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-gateways", imposeTeleportRestrictionsOnGateways); - } -+ -+ public boolean baselessCrystalExplode = true; -+ public double baselessCrystalExplosionPower = 6.0D; -+ public boolean baselessCrystalExplosionFire = false; -+ public Explosion.Effect baselessCrystalExplosionEffect = Explosion.Effect.DESTROY; -+ public boolean baseCrystalExplode = true; -+ public double baseCrystalExplosionPower = 6.0D; -+ public boolean baseCrystalExplosionFire = false; -+ public Explosion.Effect baseCrystalExplosionEffect = Explosion.Effect.DESTROY; -+ private void crystalSettings() { -+ baselessCrystalExplode = getBoolean("blocks.end-crystal.baseless.explode", baselessCrystalExplode); -+ baselessCrystalExplosionPower = getDouble("blocks.end-crystal.baseless.explosion-power", baselessCrystalExplosionPower); -+ baselessCrystalExplosionFire = getBoolean("blocks.end-crystal.baseless.explosion-fire", baselessCrystalExplosionFire); -+ try { -+ baselessCrystalExplosionEffect = Explosion.Effect.valueOf(getString("blocks.end-crystal.baseless.explosion-effect", baselessCrystalExplosionEffect.name())); -+ } catch (IllegalArgumentException e) { -+ log(Level.SEVERE, "Unknown value for `blocks.end-crystal.baseless.explosion-effect`! Using default of `DESTROY`"); -+ baselessCrystalExplosionEffect = Explosion.Effect.DESTROY; -+ } -+ baseCrystalExplode = getBoolean("blocks.end-crystal.base.explode", baseCrystalExplode); -+ baseCrystalExplosionPower = getDouble("blocks.end-crystal.base.explosion-power", baseCrystalExplosionPower); -+ baseCrystalExplosionFire = getBoolean("blocks.end-crystal.base.explosion-fire", baseCrystalExplosionFire); -+ try { -+ baseCrystalExplosionEffect = Explosion.Effect.valueOf(getString("blocks.end-crystal.base.explosion-effect", baseCrystalExplosionEffect.name())); -+ } catch (IllegalArgumentException e) { -+ log(Level.SEVERE, "Unknown value for `blocks.end-crystal.base.explosion-effect`! Using default of `DESTROY`"); -+ baseCrystalExplosionEffect = Explosion.Effect.DESTROY; -+ } -+ } - } diff --git a/patches/server-unmapped/0167-Add-unsafe-Entity-serialization-API.patch b/patches/server-unmapped/0167-Add-unsafe-Entity-serialization-API.patch deleted file mode 100644 index 9bad1fac2..000000000 --- a/patches/server-unmapped/0167-Add-unsafe-Entity-serialization-API.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mariell Hoversholm -Date: Sat, 9 Jan 2021 21:22:58 +0100 -Subject: [PATCH] Add unsafe Entity serialization API - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -diff --git a/src/main/java/net/minecraft/world/entity/EntityTypes.java b/src/main/java/net/minecraft/world/entity/EntityTypes.java -index 2cf4e8f68fa85c4e09effda0da0c3a3f64ae7ba9..c166e0a8e7eadb4f714078f764ef35f7afca543b 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityTypes.java -+++ b/src/main/java/net/minecraft/world/entity/EntityTypes.java -@@ -532,6 +532,7 @@ public class EntityTypes { - return this.bf.create(this, world); - } - -+ public static Optional loadEntityFixedData(NBTTagCompound nbtTagCompound, World world) { return a(nbtTagCompound, world); } // Purpur - OBFHELPER - public static Optional a(NBTTagCompound nbttagcompound, World world) { - return SystemUtils.a(a(nbttagcompound).map((entitytypes) -> { - return entitytypes.a(world); -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index d567297364920660a6ef9c9198b29382e73342df..b1bb47992451b5e76d1cbe5b2bee550af583f818 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -1187,5 +1187,12 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { - public boolean isRidableInWater() { - return getHandle().isRidableInWater(); - } -+ -+ @Override -+ public boolean spawnAt(Location location, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ entity.world = ((CraftWorld) location.getWorld()).getHandle(); -+ entity.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); -+ return !entity.valid && entity.world.addEntity(entity, spawnReason); -+ } - // Purpur end - } -diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 3fa4d18d7a1e2d351fbe8e02d1e749587f98c2a2..bfe4f7ed53620510b52d4f01c5ea2a3f726942d8 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -410,9 +410,14 @@ public final class CraftMagicNumbers implements UnsafeValues { - Preconditions.checkNotNull(item, "null cannot be serialized"); - Preconditions.checkArgument(item.getType() != Material.AIR, "air cannot be serialized"); - -+ // Purpur start - rework NBT <-> bytes -+ return serializeNbtToBytes(CraftItemStack.asNMSCopy(item).save(new NBTTagCompound()), true); -+ } -+ -+ public byte[] serializeNbtToBytes(NBTTagCompound compound, boolean addDataVersion) { -+ if (addDataVersion) compound.setInt("DataVersion", getDataVersion()); - java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream(); -- NBTTagCompound compound = (item instanceof CraftItemStack ? ((CraftItemStack) item).getHandle() : CraftItemStack.asNMSCopy(item)).save(new NBTTagCompound()); -- compound.setInt("DataVersion", getDataVersion()); -+ // Purpur end - try { - net.minecraft.nbt.NBTCompressedStreamTools.writeNBT( - compound, -@@ -425,26 +430,58 @@ public final class CraftMagicNumbers implements UnsafeValues { - return outputStream.toByteArray(); - } - -+ public static DynamicOpsNBT getDynamicOpsNbtInstance() { return DynamicOpsNBT.a; } // Purpur - OBFHELPER - keeping out of the class because it's FULL of decompile errors - @Override - public ItemStack deserializeItem(byte[] data) { - Preconditions.checkNotNull(data, "null cannot be deserialized"); - Preconditions.checkArgument(data.length > 0, "cannot deserialize nothing"); - -+ // Purpur start - rework NBT <-> bytes -+ NBTTagCompound compound = deserializeNbtFromBytes(data, true); -+ Dynamic converted = DataConverterRegistry.getDataFixer().update(DataConverterTypes.ITEM_STACK, new Dynamic<>(getDynamicOpsNbtInstance(), compound), compound.getInt("DataVersion"), getDataVersion()); // TODO: obfhelper -+ return net.minecraft.world.item.ItemStack.fromCompound((NBTTagCompound) converted.getValue()).asBukkitMirror(); -+ } -+ -+ public NBTTagCompound deserializeNbtFromBytes(byte[] data, boolean verifyDataVersion) { -+ // Purpur end - try { - NBTTagCompound compound = net.minecraft.nbt.NBTCompressedStreamTools.readNBT( - new java.io.ByteArrayInputStream(data) - ); -+ if (verifyDataVersion) { // Purpur - int dataVersion = compound.getInt("DataVersion"); - - Preconditions.checkArgument(dataVersion <= getDataVersion(), "Newer version! Server downgrades are not supported!"); -- Dynamic converted = DataConverterRegistry.getDataFixer().update(DataConverterTypes.ITEM_STACK, new Dynamic(DynamicOpsNBT.a, compound), dataVersion, getDataVersion()); -- return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.fromCompound((NBTTagCompound) converted.getValue())); -+ } // Purpur -+ return compound; // Purpur - } catch (IOException ex) { - com.destroystokyo.paper.util.SneakyThrow.sneaky(ex); - throw new RuntimeException(); - } - } - -+ // Purpur start -+ @Override -+ public byte[] serializeEntity(org.bukkit.entity.Entity entity) { -+ Preconditions.checkNotNull(entity, "null cannot be serialized"); -+ Preconditions.checkArgument(entity instanceof org.bukkit.craftbukkit.entity.CraftEntity, "non-CraftEntity cannot be serialized"); -+ NBTTagCompound compound = new NBTTagCompound(); -+ compound.setString("id", ((org.bukkit.craftbukkit.entity.CraftEntity) entity).getHandle().getMinecraftKeyString()); -+ return serializeNbtToBytes(((org.bukkit.craftbukkit.entity.CraftEntity) entity).getHandle().save(compound), true); -+ } -+ -+ @Override -+ public org.bukkit.entity.Entity deserializeEntity(byte[] data, org.bukkit.World world) { -+ NBTTagCompound compound = deserializeNbtFromBytes(data, true); -+ Dynamic converted = DataConverterRegistry.getDataFixer().update(DataConverterTypes.ENTITY, new Dynamic<>(getDynamicOpsNbtInstance(), compound), compound.getInt("DataVersion"), getDataVersion()); -+ compound = (NBTTagCompound) converted.getValue(); -+ compound.remove("UUID"); // Make the server make a new UUID for this entity; makes entities always spawnable. -+ return net.minecraft.world.entity.EntityTypes.loadEntityFixedData(compound, ((org.bukkit.craftbukkit.CraftWorld) world).getHandle()) -+ .orElseThrow(() -> new IllegalArgumentException("unknown ID was found for the data; did you downgrade?")) -+ .getBukkitEntity(); -+ } -+ // Pupur end -+ - @Override - public String getTranslationKey(Material mat) { - if (mat.isBlock()) { diff --git a/patches/server-unmapped/0169-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch b/patches/server-unmapped/0169-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch deleted file mode 100644 index fb74a7782..000000000 --- a/patches/server-unmapped/0169-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> -Date: Sat, 20 Feb 2021 14:47:08 -0800 -Subject: [PATCH] Configs for if Wither/Ender Dragon can ride vehicles - - -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index d56ee8483fa1011f303a0afac5130279b6f9a191..7b28e61eee6f65219a11e63dea3728aa36b9a313 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2155,7 +2155,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne - } - } - -- protected boolean n(Entity entity) { -+ protected boolean n(Entity entity) { // Purpur - canRide - return !this.isSneaking() && this.j <= 0; - } - -diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java -index ebf682c8ea6eb5feb499815a1dc1bea5715038c7..0ce49a3095472383dbe9362ece186a7bd60939b6 100644 ---- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java -+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java -@@ -1073,6 +1073,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster { - - @Override - protected boolean n(Entity entity) { -+ if (this.world.purpurConfig.enderDragonCanRideVehicles) return this.getRideCooldown() <= 0; // Purpur - return false; - } - -diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java -index 5ca2833adc383845c2ea1824a130f17445498f19..9e1b4fb9b9a111e8da7b4b0db9ebee0099705bf2 100644 ---- a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java -+++ b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java -@@ -728,6 +728,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { - - @Override - protected boolean n(Entity entity) { -+ if (this.world.purpurConfig.witherCanRideVehicles) return this.getRideCooldown() <= 0; // Purpur - return false; - } - -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 23f7a3af8f92fd6e89601b0e1b4b2d1635dfe0b0..b2d7e4ee4ecef476d633278c960130110c862520 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -833,6 +833,7 @@ public class PurpurWorldConfig { - public boolean enderDragonAlwaysDropsFullExp = false; - public boolean enderDragonBypassMobGriefing = false; - public double enderDragonMaxHealth = 200.0D; -+ public boolean enderDragonCanRideVehicles = false; - private void enderDragonSettings() { - enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); - enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -849,6 +850,7 @@ public class PurpurWorldConfig { - set("mobs.ender_dragon.attributes.max_health", oldValue); - } - enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); -+ enderDragonCanRideVehicles = getBoolean("mobs.ender_dragon.can-ride-vehicles", enderDragonCanRideVehicles); - } - - public boolean endermanRidable = false; -@@ -1793,6 +1795,7 @@ public class PurpurWorldConfig { - public float witherHealthRegenAmount = 1.0f; - public int witherHealthRegenDelay = 20; - public double witherMaxHealth = 300.0D; -+ public boolean witherCanRideVehicles = false; - private void witherSettings() { - witherRidable = getBoolean("mobs.wither.ridable", witherRidable); - witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1810,6 +1813,7 @@ public class PurpurWorldConfig { - set("mobs.wither.attributes.max_health", oldValue); - } - witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); -+ witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); - } - - public boolean witherSkeletonRidable = false; diff --git a/patches/server-unmapped/0170-Dont-run-with-scissors.patch b/patches/server-unmapped/0170-Dont-run-with-scissors.patch deleted file mode 100644 index f6522cb3c..000000000 --- a/patches/server-unmapped/0170-Dont-run-with-scissors.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: JustDoom -Date: Fri, 5 Mar 2021 14:23:16 -0500 -Subject: [PATCH] Dont run with scissors! - - -diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java -index 797e067a08395af491ffdb64d01eed6535ffd1f7..38e88a99c41eaeb172068357b8f0dabe9d7ef27e 100644 ---- a/src/main/java/net/minecraft/server/network/PlayerConnection.java -+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java -@@ -1498,6 +1498,12 @@ public class PlayerConnection implements PacketListenerPlayIn { - this.player.fallDistance = 0.0F; - } - -+ // Purpur Start -+ if (this.player.isSprinting() && this.player.getWorldServer().purpurConfig.dontRunWithScissors && (this.player.getItemInHand(EnumHand.MAIN_HAND).getItem() == Items.SHEARS || this.player.getItemInHand(EnumHand.OFF_HAND).getItem() == Items.SHEARS) && (int) (Math.random() * 10) == 0) { -+ this.player.damageEntity(net.minecraft.world.damagesource.DamageSource.MAGIC, (float) this.player.getWorldServer().purpurConfig.scissorsRunningDamage); -+ } -+ // Purpur End -+ - this.player.checkMovement(this.player.locX() - d0, this.player.locY() - d1, this.player.locZ() - d2); - this.o = this.player.locX(); - this.p = this.player.locY(); -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index b2d7e4ee4ecef476d633278c960130110c862520..02ebb0fc704b5e77cf508893d67feef036df80ed 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -203,6 +203,8 @@ public class PurpurWorldConfig { - public List itemImmuneToExplosion = new ArrayList<>(); - public List itemImmuneToFire = new ArrayList<>(); - public List itemImmuneToLightning = new ArrayList<>(); -+ public boolean dontRunWithScissors = false; -+ public double scissorsRunningDamage = 1D; - private void itemSettings() { - itemImmuneToCactus.clear(); - getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { -@@ -240,6 +242,8 @@ public class PurpurWorldConfig { - Item item = IRegistry.ITEM.get(new MinecraftKey(key.toString())); - if (item != Items.AIR) itemImmuneToLightning.add(item); - }); -+ dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors); -+ scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage); - } - - public boolean idleTimeoutKick = true; diff --git a/patches/server-unmapped/0171-One-Punch-Man.patch b/patches/server-unmapped/0171-One-Punch-Man.patch deleted file mode 100644 index 1955bb8ee..000000000 --- a/patches/server-unmapped/0171-One-Punch-Man.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Fourmisain <8464472+Fourmisain@users.noreply.github.com> -Date: Fri, 5 Mar 2021 17:42:35 -0500 -Subject: [PATCH] One Punch Man! - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java -index a2afce8391a8bd30e39cda917d92842fe3da33e5..11390c5eba03ca2d60c2f711807970078c5704ea 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityLiving.java -+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java -@@ -2016,6 +2016,23 @@ public abstract class EntityLiving extends Entity { - ((EntityPlayer) damagesource.getEntity()).a(StatisticList.DAMAGE_DEALT_ABSORBED, Math.round(f2 * 10.0F)); - } - -+ // Purpur start -+ if (damagesource.getEntity() instanceof EntityHuman && damagesource.getEntity().world.purpurConfig.creativeOnePunch) { -+ EntityHuman entityHuman = (EntityHuman) damagesource.getEntity(); -+ if (entityHuman.isCreative()) { -+ double attackDamage = 0; -+ -+ for (AttributeModifier modifier : entityHuman.getItemInMainHand().getAttributeModifiers(EnumItemSlot.MAINHAND).get(GenericAttributes.ATTACK_DAMAGE)) { -+ attackDamage += modifier.getAmount(); -+ } -+ -+ if (attackDamage == 0) { -+ this.setHealth(0); -+ } -+ } -+ } -+ // Purpur end -+ - if (f > 0 || !human) { - if (human) { - // PAIL: Be sure to drag all this code from the EntityHuman subclass each update. -diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index a4c41caae425e054db3f40a9abc41f45ccd20730..2e4bc664412feb8657c7b9995d281203a14d48fd 100644 ---- a/src/main/java/net/minecraft/world/item/ItemStack.java -+++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -897,6 +897,7 @@ public final class ItemStack { - this.getOrCreateTag().setInt("RepairCost", i); - } - -+ public Multimap getAttributeModifiers(EnumItemSlot enumitemslot) { return this.a(enumitemslot); } // Purpur - OBFHELPER - public Multimap a(EnumItemSlot enumitemslot) { - Object object; - -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 02ebb0fc704b5e77cf508893d67feef036df80ed..f577b1054f8bdd2be933f7dae3ffe18dfeb87fe5 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -319,6 +319,7 @@ public class PurpurWorldConfig { - public double voidDamageDealt = 4.0D; - public int raidCooldownSeconds = 0; - public int animalBreedingCooldownSeconds = 0; -+ public boolean creativeOnePunch = false; - private void miscGameplayMechanicsSettings() { - useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); - alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative); -@@ -337,6 +338,7 @@ public class PurpurWorldConfig { - voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); - raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds); - animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds); -+ creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch); - } - - public boolean catSpawning; diff --git a/patches/server-unmapped/0172-Add-config-for-snow-on-blue-ice.patch b/patches/server-unmapped/0172-Add-config-for-snow-on-blue-ice.patch deleted file mode 100644 index bb5613af1..000000000 --- a/patches/server-unmapped/0172-Add-config-for-snow-on-blue-ice.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Fri, 5 Mar 2021 17:59:05 -0600 -Subject: [PATCH] Add config for snow on blue ice - - -diff --git a/src/main/java/net/minecraft/world/level/block/BlockSnow.java b/src/main/java/net/minecraft/world/level/block/BlockSnow.java -index d44b88185ce58346007c6ef70b76f8e0df23e95c..4b7497acc5b26da48375625b4a31fb057805344d 100644 ---- a/src/main/java/net/minecraft/world/level/block/BlockSnow.java -+++ b/src/main/java/net/minecraft/world/level/block/BlockSnow.java -@@ -74,7 +74,18 @@ public class BlockSnow extends Block { - public boolean canPlace(IBlockData iblockdata, IWorldReader iworldreader, BlockPosition blockposition) { - IBlockData iblockdata1 = iworldreader.getType(blockposition.down()); - -- return !iblockdata1.a(Blocks.ICE) && !iblockdata1.a(Blocks.PACKED_ICE) && !iblockdata1.a(Blocks.BARRIER) ? (!iblockdata1.a(Blocks.HONEY_BLOCK) && !iblockdata1.a(Blocks.SOUL_SAND) ? Block.a(iblockdata1.getCollisionShape(iworldreader, blockposition.down()), EnumDirection.UP) || iblockdata1.getBlock() == this && (Integer) iblockdata1.get(BlockSnow.LAYERS) == 8 : true) : false; -+ // Purpur start - rewrite this whole return to make more sense -+ if (iblockdata1.equals(Blocks.ICE) || iblockdata1.equals(Blocks.PACKED_ICE) || iblockdata1.equals(Blocks.BARRIER)) { -+ return false; -+ } -+ if (iblockdata1.equals(Blocks.BLUE_ICE) && !iworldreader.getWorldBorder().world.purpurConfig.snowOnBlueIce) { -+ return false; -+ } -+ if (iblockdata1.equals(Blocks.HONEY_BLOCK) || iblockdata1.equals(Blocks.SOUL_SAND)) { -+ return true; -+ } -+ return Block.a(iblockdata1.getCollisionShape(iworldreader, blockposition.down()), EnumDirection.UP) || iblockdata1.equals(this) && iblockdata1.get(LAYERS) == 8; -+ // Purpur end - } - - @Override -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index f577b1054f8bdd2be933f7dae3ffe18dfeb87fe5..8cf40f10dccd9b4f52507e432dcfd6b2015e90f2 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -477,6 +477,11 @@ public class PurpurWorldConfig { - } - } - -+ public boolean snowOnBlueIce = true; -+ private void iceSettings() { -+ snowOnBlueIce = getBoolean("blocks.blue_ice.allow-snow-formation", snowOnBlueIce); -+ } -+ - public boolean chestOpenWithBlockOnTop = false; - private void chestSettings() { - chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop); diff --git a/patches/server-unmapped/0173-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server-unmapped/0173-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch deleted file mode 100644 index e7f886dc5..000000000 --- a/patches/server-unmapped/0173-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Encode42 -Date: Sun, 7 Mar 2021 19:08:16 -0500 -Subject: [PATCH] Configurable Ender Pearl cooldown, damage, and Endermite RNG - -- Survival and Creative Cooldown speed -- Damage dealt on pearl usage -- Endermite spawn chance - -diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityEnderPearl.java b/src/main/java/net/minecraft/world/entity/projectile/EntityEnderPearl.java -index cf2c691357c41a7e7044f7a719144db2ffab5dbe..d80c1abefe53e6b20dd2a020f60c11e380b57bb1 100644 ---- a/src/main/java/net/minecraft/world/entity/projectile/EntityEnderPearl.java -+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityEnderPearl.java -@@ -69,7 +69,7 @@ public class EntityEnderPearl extends EntityProjectileThrowable { - Bukkit.getPluginManager().callEvent(teleEvent); - - if (!teleEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) { -- if (this.random.nextFloat() < 0.05F && this.world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING)) { -+ if (this.random.nextFloat() < this.world.purpurConfig.enderPearlEndermiteChance && this.world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING)) { // Purpur - EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.a(this.world); - - entityendermite.setPlayerSpawned(true); -@@ -84,7 +84,7 @@ public class EntityEnderPearl extends EntityProjectileThrowable { - entityplayer.playerConnection.teleport(teleEvent.getTo()); - entity.fallDistance = 0.0F; - CraftEventFactory.entityDamage = this; -- entity.damageEntity(DamageSource.FALL, 5.0F); -+ entity.damageEntity(DamageSource.FALL, this.world.purpurConfig.enderPearlDamage); // Purpur - CraftEventFactory.entityDamage = null; - } - // CraftBukkit end -diff --git a/src/main/java/net/minecraft/world/item/ItemEnderPearl.java b/src/main/java/net/minecraft/world/item/ItemEnderPearl.java -index 9896d77381e7fadf1ef2619210713e190c1445d0..61512c6755f29cb2c228ae3e80b1e08348d784a5 100644 ---- a/src/main/java/net/minecraft/world/item/ItemEnderPearl.java -+++ b/src/main/java/net/minecraft/world/item/ItemEnderPearl.java -@@ -36,7 +36,7 @@ public class ItemEnderPearl extends Item { - - world.playSound((EntityHuman) null, entityhuman.locX(), entityhuman.locY(), entityhuman.locZ(), SoundEffects.ENTITY_ENDER_PEARL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F)); - entityhuman.b(StatisticList.ITEM_USED.b(this)); -- entityhuman.getCooldownTracker().setCooldown(this, 20); -+ entityhuman.getCooldownTracker().setCooldown(this, entityhuman.abilities.canInstantlyBuild ? world.purpurConfig.enderPearlCooldownCreative : world.purpurConfig.enderPearlCooldown); // Purpur - } else { - // Paper end - if (entityhuman instanceof net.minecraft.server.level.EntityPlayer) { -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 8cf40f10dccd9b4f52507e432dcfd6b2015e90f2..129fef2e4da94bcd80153379a7246590e4ea9cdd 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -205,6 +205,10 @@ public class PurpurWorldConfig { - public List itemImmuneToLightning = new ArrayList<>(); - public boolean dontRunWithScissors = false; - public double scissorsRunningDamage = 1D; -+ public float enderPearlDamage = 5.0F; -+ public int enderPearlCooldown = 20; -+ public int enderPearlCooldownCreative = 20; -+ public float enderPearlEndermiteChance = 0.05F; - private void itemSettings() { - itemImmuneToCactus.clear(); - getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { -@@ -244,6 +248,10 @@ public class PurpurWorldConfig { - }); - dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors); - scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage); -+ enderPearlDamage = (float) getDouble("gameplay-mechanics.item.ender-pearl.damage", enderPearlDamage); -+ enderPearlCooldown = getInt("gameplay-mechanics.item.ender-pearl.cooldown", enderPearlCooldown); -+ enderPearlCooldownCreative = getInt("gameplay-mechanics.item.ender-pearl.creative-cooldown", enderPearlCooldownCreative); -+ enderPearlEndermiteChance = (float) getDouble("gameplay-mechanics.item.ender-pearl.endermite-spawn-chance", enderPearlEndermiteChance); - } - - public boolean idleTimeoutKick = true; diff --git a/patches/server/0155-Config-to-always-tame-in-Creative.patch b/patches/server/0155-Config-to-always-tame-in-Creative.patch new file mode 100644 index 000000000..a8b20e41a --- /dev/null +++ b/patches/server/0155-Config-to-always-tame-in-Creative.patch @@ -0,0 +1,80 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Encode42 +Date: Tue, 9 Feb 2021 21:23:37 -0500 +Subject: [PATCH] Config to always tame in Creative + +Adds a configuration option that ensures a player in Creative always tames a tameable entity. +This essentially allows Creative mode players to tame animals on their first try. + +diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java +index fd0f5c255729b2c05ead5843ab58fe880971b3db..08bdebf99cdedfc6115405e5198346ee4e6e1dce 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java ++++ b/src/main/java/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.java +@@ -63,7 +63,7 @@ public class RunAroundLikeCrazyGoal extends Goal { + int j = this.horse.getMaxTemper(); + + // CraftBukkit - fire EntityTameEvent +- if (j > 0 && this.horse.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.horse, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.horse.getBukkitEntity().getPassenger()).getHandle()).isCancelled()) { ++ if ((this.horse.level.purpurConfig.alwaysTameInCreative && ((Player) entity).getAbilities().instabuild) || (j > 0 && this.horse.getRandom().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.horse, ((org.bukkit.craftbukkit.entity.CraftHumanEntity) this.horse.getBukkitEntity().getPassenger()).getHandle()).isCancelled())) { // Purpur + this.horse.tameWithName((Player) entity); + return; + } +diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java +index 052d1e51a891ee17bed0043f6f3fd162c15b16b2..0d521af1a44acc0fd62f209b845b6d128e42baf4 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java +@@ -466,7 +466,7 @@ public class Cat extends TamableAnimal { + } + } else if (this.isFood(itemstack)) { + this.usePlayerItem(player, hand, itemstack); +- if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled()) { // CraftBukkit ++ if ((this.level.purpurConfig.alwaysTameInCreative && player.getAbilities().instabuild) || (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled())) { // CraftBukkit // Purpur + this.tame(player); + this.setOrderedToSit(true); + this.level.broadcastEntityEvent(this, (byte) 7); +diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java +index 2cc91c255e0f77b214b8ec54429c11bb1d6fe8e0..553b0aff0ccc5baf41d5faae1a2fd88249dd5a74 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java +@@ -316,7 +316,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.getAbilities().instabuild) || (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled())) { // CraftBukkit // Purpur + this.tame(player); + this.level.broadcastEntityEvent(this, (byte) 7); + } else { +diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +index 518dd0e6b4889c049e438b393baa795a5eac3e7d..21e154c4e7fe261a41c891b481072fbd6d5215b5 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +@@ -509,7 +509,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { + } + + // CraftBukkit - added event call and isCancelled check. +- if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, player).isCancelled()) { ++ if ((this.level.purpurConfig.alwaysTameInCreative && player.getAbilities().instabuild) || (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, player).isCancelled())) { // Purpur + this.tame(player); + this.navigation.stop(); + this.setTarget((LivingEntity) null); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 58338f0d1c1cdd153ce90e79ad4ae2725622752e..930adab7d6d387c935cb9e8d974d4fdf048871be 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -355,6 +355,7 @@ public class PurpurWorldConfig { + } + + public boolean useBetterMending = false; ++ public boolean alwaysTameInCreative = false; + public boolean boatEjectPlayersOnLand = false; + public boolean boatsDoFallDamage = true; + public boolean disableDropsOnCrammingDeath = false; +@@ -374,6 +375,7 @@ public class PurpurWorldConfig { + public int animalBreedingCooldownSeconds = 0; + private void miscGameplayMechanicsSettings() { + useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); ++ alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative); + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); + boatsDoFallDamage = getBoolean("gameplay-mechanics.boat.do-fall-damage", boatsDoFallDamage); + disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath); diff --git a/patches/server/0156-End-crystal-explosion-options.patch b/patches/server/0156-End-crystal-explosion-options.patch new file mode 100644 index 000000000..5531a15ee --- /dev/null +++ b/patches/server/0156-End-crystal-explosion-options.patch @@ -0,0 +1,93 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Ben Kerllenevich +Date: Sat, 13 Feb 2021 09:28:56 -0500 +Subject: [PATCH] End crystal explosion options + + +diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +index 92e65f3fbc8f5d77bb8cc31e7a7780c2589f4227..0c46507ab0b904fb1f79bc5421c88c03e894c869 100644 +--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java ++++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +@@ -130,6 +130,22 @@ public class EndCrystal extends Entity { + phantomDamageCooldown = 0; + idleCooldown = 60; + } ++ ++ public boolean shouldExplode() { ++ return showsBottom() ? level.purpurConfig.basedEndCrystalExplode : level.purpurConfig.baselessEndCrystalExplode; ++ } ++ ++ public float getExplosionPower() { ++ return (float) (showsBottom() ? level.purpurConfig.basedEndCrystalExplosionPower : level.purpurConfig.baselessEndCrystalExplosionPower); ++ } ++ ++ public boolean hasExplosionFire() { ++ return showsBottom() ? level.purpurConfig.basedEndCrystalExplosionFire : level.purpurConfig.baselessEndCrystalExplosionFire; ++ } ++ ++ public Explosion.BlockInteraction getExplosionEffect() { ++ return showsBottom() ? level.purpurConfig.basedEndCrystalExplosionEffect : level.purpurConfig.baselessEndCrystalExplosionEffect; ++ } + // Purpur end + + @Override +@@ -175,15 +191,17 @@ public class EndCrystal extends Entity { + // CraftBukkit end + this.remove(Entity.RemovalReason.KILLED); + if (!source.isExplosion()) { ++ if (shouldExplode()) { // Purpur + // CraftBukkit start +- ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), getExplosionPower(), hasExplosionFire()); // Purpur + this.level.getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + this.unsetRemoved(); + return false; + } +- this.level.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Explosion.BlockInteraction.DESTROY); ++ this.level.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), getExplosionEffect()); // Purpur + // CraftBukkit end ++ } else this.unsetRemoved(); // Purpur + } + + this.onDestroyedBy(source); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 930adab7d6d387c935cb9e8d974d4fdf048871be..90788945ff4e5915422aed6325ce9808af401477 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -450,6 +450,35 @@ public class PurpurWorldConfig { + dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils); + } + ++ public boolean baselessEndCrystalExplode = true; ++ public double baselessEndCrystalExplosionPower = 6.0D; ++ public boolean baselessEndCrystalExplosionFire = false; ++ public Explosion.BlockInteraction baselessEndCrystalExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ public boolean basedEndCrystalExplode = true; ++ public double basedEndCrystalExplosionPower = 6.0D; ++ public boolean basedEndCrystalExplosionFire = false; ++ public Explosion.BlockInteraction basedEndCrystalExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ private void endCrystalSettings() { ++ baselessEndCrystalExplode = getBoolean("blocks.end-crystal.baseless.explode", baselessEndCrystalExplode); ++ baselessEndCrystalExplosionPower = getDouble("blocks.end-crystal.baseless.explosion-power", baselessEndCrystalExplosionPower); ++ baselessEndCrystalExplosionFire = getBoolean("blocks.end-crystal.baseless.explosion-fire", baselessEndCrystalExplosionFire); ++ try { ++ baselessEndCrystalExplosionEffect = Explosion.BlockInteraction.valueOf(getString("blocks.end-crystal.baseless.explosion-effect", baselessEndCrystalExplosionEffect.name())); ++ } catch (IllegalArgumentException e) { ++ log(Level.SEVERE, "Unknown value for `blocks.end-crystal.baseless.explosion-effect`! Using default of `DESTROY`"); ++ baselessEndCrystalExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ } ++ basedEndCrystalExplode = getBoolean("blocks.end-crystal.base.explode", basedEndCrystalExplode); ++ basedEndCrystalExplosionPower = getDouble("blocks.end-crystal.base.explosion-power", basedEndCrystalExplosionPower); ++ basedEndCrystalExplosionFire = getBoolean("blocks.end-crystal.base.explosion-fire", basedEndCrystalExplosionFire); ++ try { ++ basedEndCrystalExplosionEffect = Explosion.BlockInteraction.valueOf(getString("blocks.end-crystal.base.explosion-effect", basedEndCrystalExplosionEffect.name())); ++ } catch (IllegalArgumentException e) { ++ log(Level.SEVERE, "Unknown value for `blocks.end-crystal.base.explosion-effect`! Using default of `DESTROY`"); ++ basedEndCrystalExplosionEffect = Explosion.BlockInteraction.DESTROY; ++ } ++ } ++ + public boolean farmlandBypassMobGriefing = false; + public boolean farmlandGetsMoistFromBelow = false; + public boolean farmlandAlpha = false; diff --git a/patches/server/0157-Add-unsafe-Entity-serialization-API.patch b/patches/server/0157-Add-unsafe-Entity-serialization-API.patch new file mode 100644 index 000000000..be0338704 --- /dev/null +++ b/patches/server/0157-Add-unsafe-Entity-serialization-API.patch @@ -0,0 +1,111 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mariell Hoversholm +Date: Sat, 9 Jan 2021 21:22:58 +0100 +Subject: [PATCH] Add unsafe Entity serialization API + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +index d2c776b8c189dc01dadb7399d3892399ebcb6276..e2b1574af471699f93956130b50268647f24e0b9 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +@@ -1233,5 +1233,12 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { + public boolean isRidableInWater() { + return getHandle().rideableUnderWater(); + } ++ ++ @Override ++ public boolean spawnAt(Location location, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { ++ entity.level = ((CraftWorld) location.getWorld()).getHandle(); ++ entity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); ++ return !entity.valid && entity.level.addEntity(entity, spawnReason); ++ } + // Purpur end + } +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +index 9239c4c948ddfc6f7ad8c5f277e355581f8f37ec..75c5cb1a0b95f319eb32da618df7fa75ccefccbd 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +@@ -408,9 +408,14 @@ public final class CraftMagicNumbers implements UnsafeValues { + Preconditions.checkNotNull(item, "null cannot be serialized"); + Preconditions.checkArgument(item.getType() != Material.AIR, "air cannot be serialized"); + ++ // Purpur start - rework NBT <-> bytes ++ return serializeNbtToBytes(CraftItemStack.asNMSCopy(item).save(new CompoundTag()), true); ++ } ++ ++ public byte[] serializeNbtToBytes(CompoundTag compound, boolean addDataVersion) { ++ if (addDataVersion) compound.putInt("DataVersion", getDataVersion()); + java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream(); +- CompoundTag compound = (item instanceof CraftItemStack ? ((CraftItemStack) item).handle : CraftItemStack.asNMSCopy(item)).save(new CompoundTag()); +- compound.putInt("DataVersion", getDataVersion()); ++ // Purpur end + try { + net.minecraft.nbt.NbtIo.writeCompressed( + compound, +@@ -428,21 +433,52 @@ public final class CraftMagicNumbers implements UnsafeValues { + Preconditions.checkNotNull(data, "null cannot be deserialized"); + Preconditions.checkArgument(data.length > 0, "cannot deserialize nothing"); + ++ // Purpur start - rework NBT <-> bytes ++ CompoundTag compound = deserializeNbtFromBytes(data, true); ++ Dynamic converted = DataFixers.getDataFixer().update(References.ITEM_STACK, new Dynamic<>(NbtOps.INSTANCE, compound), compound.getInt("DataVersion"), getDataVersion()); ++ return net.minecraft.world.item.ItemStack.of((CompoundTag) converted.getValue()).asBukkitMirror(); ++ } ++ ++ public CompoundTag deserializeNbtFromBytes(byte[] data, boolean verifyDataVersion) { ++ // Purpur end + try { + CompoundTag compound = net.minecraft.nbt.NbtIo.readCompressed( + new java.io.ByteArrayInputStream(data) + ); ++ if (verifyDataVersion) { // Purpur + int dataVersion = compound.getInt("DataVersion"); + + Preconditions.checkArgument(dataVersion <= getDataVersion(), "Newer version! Server downgrades are not supported!"); +- Dynamic converted = DataFixers.getDataFixer().update(References.ITEM_STACK, new Dynamic(NbtOps.INSTANCE, compound), dataVersion, getDataVersion()); +- return CraftItemStack.asCraftMirror(net.minecraft.world.item.ItemStack.of((CompoundTag) converted.getValue())); ++ } // Purpur ++ return compound; // Purpur + } catch (IOException ex) { + com.destroystokyo.paper.util.SneakyThrow.sneaky(ex); + throw new RuntimeException(); + } + } + ++ // Purpur start ++ @Override ++ public byte[] serializeEntity(org.bukkit.entity.Entity entity) { ++ Preconditions.checkNotNull(entity, "null cannot be serialized"); ++ Preconditions.checkArgument(entity instanceof org.bukkit.craftbukkit.entity.CraftEntity, "non-CraftEntity cannot be serialized"); ++ CompoundTag compound = new CompoundTag(); ++ compound.putString("id", ((org.bukkit.craftbukkit.entity.CraftEntity) entity).getHandle().getMinecraftKeyString()); ++ return serializeNbtToBytes(((org.bukkit.craftbukkit.entity.CraftEntity) entity).getHandle().saveWithoutId(compound), true); ++ } ++ ++ @Override ++ public org.bukkit.entity.Entity deserializeEntity(byte[] data, org.bukkit.World world) { ++ CompoundTag compound = deserializeNbtFromBytes(data, true); ++ Dynamic converted = DataFixers.getDataFixer().update(References.ENTITY, new Dynamic<>(NbtOps.INSTANCE, compound), compound.getInt("DataVersion"), getDataVersion()); ++ compound = (CompoundTag) converted.getValue(); ++ compound.remove("UUID"); // Make the server make a new UUID for this entity; makes entities always spawnable. ++ return net.minecraft.world.entity.EntityType.create(compound, ((org.bukkit.craftbukkit.CraftWorld) world).getHandle()) ++ .orElseThrow(() -> new IllegalArgumentException("unknown ID was found for the data; did you downgrade?")) ++ .getBukkitEntity(); ++ } ++ // Purpur end ++ + @Override + public String getTranslationKey(Material mat) { + if (mat.isBlock()) { diff --git a/patches/server/0158-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch b/patches/server/0158-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch new file mode 100644 index 000000000..8aeef51d8 --- /dev/null +++ b/patches/server/0158-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch @@ -0,0 +1,66 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> +Date: Sat, 20 Feb 2021 14:47:08 -0800 +Subject: [PATCH] Configs for if Wither/Ender Dragon can ride vehicles + + +diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +index c4800d71a96d3530ba8693638fad6d119f48dbb7..680a3dd1f376ac03250b56179450ba2d5b19240b 100644 +--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java ++++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +@@ -1109,6 +1109,7 @@ public class EnderDragon extends Mob implements Enemy { + + @Override + protected boolean canRide(Entity entity) { ++ if (this.level.purpurConfig.enderDragonCanRideVehicles) return this.boardingCooldown <= 0; // Purpur + return false; + } + +diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +index 15d35d325b66e1a417eb7ba699597d627bd4eb54..36745f845f33c877595d572e46bd8e966c03d11a 100644 +--- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java ++++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +@@ -717,6 +717,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob + + @Override + protected boolean canRide(Entity entity) { ++ if (this.level.purpurConfig.witherCanRideVehicles) return this.boardingCooldown <= 0; // Purpur + return false; + } + +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 90788945ff4e5915422aed6325ce9808af401477..814dab20834481fccdae8e8f0962bffa3b8f1d8a 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -839,6 +839,7 @@ public class PurpurWorldConfig { + public double enderDragonMaxHealth = 200.0D; + public boolean enderDragonAlwaysDropsFullExp = false; + public boolean enderDragonBypassMobGriefing = false; ++ public boolean enderDragonCanRideVehicles = false; + private void enderDragonSettings() { + enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); + enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); +@@ -855,6 +856,7 @@ public class PurpurWorldConfig { + enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); + enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); + enderDragonBypassMobGriefing = getBoolean("mobs.ender_dragon.bypass-mob-griefing", enderDragonBypassMobGriefing); ++ enderDragonCanRideVehicles = getBoolean("mobs.ender_dragon.can-ride-vehicles", enderDragonCanRideVehicles); + } + + public boolean endermanRidable = false; +@@ -1825,6 +1827,7 @@ public class PurpurWorldConfig { + public float witherHealthRegenAmount = 1.0f; + public int witherHealthRegenDelay = 20; + public boolean witherBypassMobGriefing = false; ++ public boolean witherCanRideVehicles = false; + private void witherSettings() { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); +@@ -1842,6 +1845,7 @@ public class PurpurWorldConfig { + witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); + witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); + witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); ++ witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); + } + + public boolean witherSkeletonRidable = false; diff --git a/patches/server/0159-Dont-run-with-scissors.patch b/patches/server/0159-Dont-run-with-scissors.patch new file mode 100644 index 000000000..74c4d09a1 --- /dev/null +++ b/patches/server/0159-Dont-run-with-scissors.patch @@ -0,0 +1,45 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: JustDoom +Date: Fri, 5 Mar 2021 14:23:16 -0500 +Subject: [PATCH] Dont run with scissors! + + +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 6eb0b178e1aec3bfb6c59913dbf70aac222041e2..167619f874304134532cd9144ffc7c3bbdda4473 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -1518,6 +1518,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + this.player.fallDistance = 0.0F; + } + ++ // Purpur Start ++ if (this.player.isSprinting() && this.player.level.purpurConfig.dontRunWithScissors && (this.player.getItemInHand(InteractionHand.MAIN_HAND).getItem() == Items.SHEARS || this.player.getItemInHand(InteractionHand.OFF_HAND).getItem() == Items.SHEARS) && (int) (Math.random() * 10) == 0) { ++ this.player.hurt(net.minecraft.world.damagesource.DamageSource.MAGIC, (float) this.player.level.purpurConfig.scissorsRunningDamage); ++ } ++ // Purpur End ++ + this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); + this.lastGoodX = this.player.getX(); + this.lastGoodY = this.player.getY(); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 814dab20834481fccdae8e8f0962bffa3b8f1d8a..ea461a88824b7a777fae8fe05b27e23a9faf79f0 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -143,6 +143,8 @@ public class PurpurWorldConfig { + public List itemImmuneToExplosion = new ArrayList<>(); + public List itemImmuneToFire = new ArrayList<>(); + public List itemImmuneToLightning = new ArrayList<>(); ++ public boolean dontRunWithScissors = false; ++ public double scissorsRunningDamage = 1D; + private void itemSettings() { + itemImmuneToCactus.clear(); + getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { +@@ -180,6 +182,8 @@ public class PurpurWorldConfig { + Item item = Registry.ITEM.get(new ResourceLocation(key.toString())); + if (item != Items.AIR) itemImmuneToLightning.add(item); + }); ++ dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors); ++ scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage); + } + + public double minecartMaxSpeed = 0.4D; diff --git a/patches/server/0160-One-Punch-Man.patch b/patches/server/0160-One-Punch-Man.patch new file mode 100644 index 000000000..b28c0e2f0 --- /dev/null +++ b/patches/server/0160-One-Punch-Man.patch @@ -0,0 +1,51 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Fourmisain <8464472+Fourmisain@users.noreply.github.com> +Date: Fri, 5 Mar 2021 17:42:35 -0500 +Subject: [PATCH] One Punch Man! + + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index 48c32591f7193cb3d35f2675cbc97ac3a0212757..355f741dfdbe5ef9a4ef36feb3c3ffee052f123f 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -2116,6 +2116,20 @@ public abstract class LivingEntity extends Entity { + ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f2 * 10.0F)); + } + ++ // Purpur start ++ if (damagesource.getEntity() instanceof net.minecraft.world.entity.player.Player player && damagesource.getEntity().level.purpurConfig.creativeOnePunch) { ++ if (player.isCreative()) { ++ double attackDamage = 0; ++ for (AttributeModifier modifier : player.getMainHandItem().getAttributeModifiers(EquipmentSlot.MAINHAND).get(Attributes.ATTACK_DAMAGE)) { ++ attackDamage += modifier.getAmount(); ++ } ++ if (attackDamage == 0) { ++ this.setHealth(0); ++ } ++ } ++ } ++ // Purpur end ++ + if (f > 0 || !human) { + if (human) { + // PAIL: Be sure to drag all this code from the EntityHuman subclass each update. +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index ea461a88824b7a777fae8fe05b27e23a9faf79f0..1e5589f8ece209fd77519d8afc6339b13f489834 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -287,6 +287,7 @@ public class PurpurWorldConfig { + public boolean teleportIfOutsideBorder = false; + public boolean totemOfUndyingWorksInInventory = false; + public boolean playerFixStuckPortal = false; ++ public boolean creativeOnePunch = false; + private void playerSettings() { + idleTimeoutKick = getBoolean("gameplay-mechanics.player.idle-timeout.kick-if-idle", idleTimeoutKick); + idleTimeoutTickNearbyEntities = getBoolean("gameplay-mechanics.player.idle-timeout.tick-nearby-entities", idleTimeoutTickNearbyEntities); +@@ -299,6 +300,7 @@ public class PurpurWorldConfig { + teleportIfOutsideBorder = getBoolean("gameplay-mechanics.player.teleport-if-outside-border", teleportIfOutsideBorder); + totemOfUndyingWorksInInventory = getBoolean("gameplay-mechanics.player.totem-of-undying-works-in-inventory", totemOfUndyingWorksInInventory); + playerFixStuckPortal = getBoolean("gameplay-mechanics.player.fix-stuck-in-portal", playerFixStuckPortal); ++ creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch); + } + + public int snowballDamage = -1; diff --git a/patches/server/0161-Add-config-for-snow-on-blue-ice.patch b/patches/server/0161-Add-config-for-snow-on-blue-ice.patch new file mode 100644 index 000000000..a9ccea635 --- /dev/null +++ b/patches/server/0161-Add-config-for-snow-on-blue-ice.patch @@ -0,0 +1,46 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Fri, 5 Mar 2021 17:59:05 -0600 +Subject: [PATCH] Add config for snow on blue ice + + +diff --git a/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java b/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java +index 0169d874247a96c2e10a65ecb9c0c093f5a6ecfb..b760e2d014b3ae70671878082bb853b75572ed7f 100644 +--- a/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/SnowLayerBlock.java +@@ -76,7 +76,18 @@ public class SnowLayerBlock extends Block { + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockState iblockdata1 = world.getBlockState(pos.below()); + +- return !iblockdata1.is(Blocks.ICE) && !iblockdata1.is(Blocks.PACKED_ICE) && !iblockdata1.is(Blocks.BARRIER) ? (!iblockdata1.is(Blocks.HONEY_BLOCK) && !iblockdata1.is(Blocks.SOUL_SAND) ? Block.isFaceFull(iblockdata1.getCollisionShape(world, pos.below()), Direction.UP) || iblockdata1.is((Block) this) && (Integer) iblockdata1.getValue(SnowLayerBlock.LAYERS) == 8 : true) : false; ++ // Purpur start - rewrite this whole return to make more sense ++ if (iblockdata1.is(Blocks.ICE) || iblockdata1.is(Blocks.PACKED_ICE) || iblockdata1.is(Blocks.BARRIER)) { ++ return false; ++ } ++ if (iblockdata1.is(Blocks.BLUE_ICE) && !world.getWorldBorder().world.purpurConfig.snowOnBlueIce) { ++ return false; ++ } ++ if (iblockdata1.is(Blocks.HONEY_BLOCK) || iblockdata1.is(Blocks.SOUL_SAND)) { ++ return true; ++ } ++ return Block.isFaceFull(iblockdata1.getCollisionShape(world, pos.below()), Direction.UP) || iblockdata1.is(this) && iblockdata1.getValue(LAYERS) == 8; ++ // Purpur end + } + + @Override +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 1e5589f8ece209fd77519d8afc6339b13f489834..3dd239cda6a5d54ac5ca62d9b91860728f2c4a25 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -505,6 +505,11 @@ public class PurpurWorldConfig { + furnaceInfiniteFuel = getBoolean("blocks.furnace.infinite-fuel", furnaceInfiniteFuel); + } + ++ public boolean snowOnBlueIce = true; ++ private void iceSettings() { ++ snowOnBlueIce = getBoolean("blocks.blue_ice.allow-snow-formation", snowOnBlueIce); ++ } ++ + public boolean lavaInfinite = false; + public int lavaInfiniteRequiredSources = 2; + public int lavaSpeedNether = 10; diff --git a/patches/server/0162-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server/0162-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch new file mode 100644 index 000000000..f80eb33e6 --- /dev/null +++ b/patches/server/0162-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch @@ -0,0 +1,70 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Encode42 +Date: Sun, 7 Mar 2021 19:08:16 -0500 +Subject: [PATCH] Configurable Ender Pearl cooldown, damage, and Endermite RNG + +- Survival and Creative Cooldown speed +- Damage dealt on pearl usage +- Endermite spawn chance + +diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +index a65e0a3357a27dfdf62ba45ebfeb531958851285..c2db9485e69b9679a33a57bc84cf2c76c1de2a42 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +@@ -69,7 +69,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + Bukkit.getPluginManager().callEvent(teleEvent); + + if (!teleEvent.isCancelled() && !entityplayer.connection.isDisconnected()) { +- if (this.random.nextFloat() < 0.05F && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { ++ if (this.random.nextFloat() < this.level.purpurConfig.enderPearlEndermiteChance && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur + Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(this.level); + + entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); +@@ -83,7 +83,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + entityplayer.connection.teleport(teleEvent.getTo()); + entity.fallDistance = 0.0F; + CraftEventFactory.entityDamage = this; +- entity.hurt(DamageSource.FALL, 5.0F); ++ entity.hurt(DamageSource.FALL, this.level.purpurConfig.enderPearlDamage); // Purpur + CraftEventFactory.entityDamage = null; + } + // CraftBukkit end +diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java +index 749ab72edc0d2e9c6f1161415ab8d59d3d6ca976..897c202c0905040072a06fdfa2032a7f9461b088 100644 +--- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java ++++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java +@@ -36,7 +36,7 @@ public class EnderpearlItem extends Item { + + world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F)); + user.awardStat(Stats.ITEM_USED.get(this)); +- user.getCooldowns().addCooldown(this, 20); ++ user.getCooldowns().addCooldown(this, user.getAbilities().instabuild ? world.purpurConfig.enderPearlCooldownCreative : world.purpurConfig.enderPearlCooldown); // Purpur + } else { + // Paper end + if (user instanceof net.minecraft.server.level.ServerPlayer) { +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 3dd239cda6a5d54ac5ca62d9b91860728f2c4a25..6d849b9f42858f7ac692eefcac7d788700212ba9 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -145,6 +145,10 @@ public class PurpurWorldConfig { + public List itemImmuneToLightning = new ArrayList<>(); + public boolean dontRunWithScissors = false; + public double scissorsRunningDamage = 1D; ++ public float enderPearlDamage = 5.0F; ++ public int enderPearlCooldown = 20; ++ public int enderPearlCooldownCreative = 20; ++ public float enderPearlEndermiteChance = 0.05F; + private void itemSettings() { + itemImmuneToCactus.clear(); + getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { +@@ -184,6 +188,10 @@ public class PurpurWorldConfig { + }); + dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors); + scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage); ++ enderPearlDamage = (float) getDouble("gameplay-mechanics.item.ender-pearl.damage", enderPearlDamage); ++ enderPearlCooldown = getInt("gameplay-mechanics.item.ender-pearl.cooldown", enderPearlCooldown); ++ enderPearlCooldownCreative = getInt("gameplay-mechanics.item.ender-pearl.creative-cooldown", enderPearlCooldownCreative); ++ enderPearlEndermiteChance = (float) getDouble("gameplay-mechanics.item.ender-pearl.endermite-spawn-chance", enderPearlEndermiteChance); + } + + public double minecartMaxSpeed = 0.4D;