mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-19 17:37:42 +01:00
progress
This commit is contained in:
@@ -3,6 +3,7 @@ From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
|||||||
Date: Sat, 13 Feb 2021 14:02:43 -0600
|
Date: Sat, 13 Feb 2021 14:02:43 -0600
|
||||||
Subject: [PATCH] Add ghast allow-griefing option
|
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
|
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
|
index e83d9aae4a04fc67587d40cec1f24ba5ebb58e10..5834b38ab206a9db6d3e336074095ce85bdbcc50 100644
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Encode42 <me@encode42.dev>
|
|
||||||
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);
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ben Kerllenevich <me@notom3ga.me>
|
|
||||||
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;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Mariell Hoversholm <proximyst@proximyst.com>
|
|
||||||
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 <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
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<T extends Entity> {
|
|
||||||
return this.bf.create(this, world);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ public static Optional<Entity> loadEntityFixedData(NBTTagCompound nbtTagCompound, World world) { return a(nbtTagCompound, world); } // Purpur - OBFHELPER
|
|
||||||
public static Optional<Entity> 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<NBTBase> 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<NBTBase> converted = DataConverterRegistry.getDataFixer().update(DataConverterTypes.ITEM_STACK, new Dynamic<NBTBase>(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<NBTBase> 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()) {
|
|
||||||
@@ -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;
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: JustDoom <justdoomdev@gmail.com>
|
|
||||||
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<Item> itemImmuneToExplosion = new ArrayList<>();
|
|
||||||
public List<Item> itemImmuneToFire = new ArrayList<>();
|
|
||||||
public List<Item> 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;
|
|
||||||
@@ -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<AttributeBase, AttributeModifier> getAttributeModifiers(EnumItemSlot enumitemslot) { return this.a(enumitemslot); } // Purpur - OBFHELPER
|
|
||||||
public Multimap<AttributeBase, AttributeModifier> 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;
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
|
||||||
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);
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Encode42 <me@encode42.dev>
|
|
||||||
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<Item> 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;
|
|
||||||
80
patches/server/0155-Config-to-always-tame-in-Creative.patch
Normal file
80
patches/server/0155-Config-to-always-tame-in-Creative.patch
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Encode42 <me@encode42.dev>
|
||||||
|
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);
|
||||||
93
patches/server/0156-End-crystal-explosion-options.patch
Normal file
93
patches/server/0156-End-crystal-explosion-options.patch
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ben Kerllenevich <me@notom3ga.me>
|
||||||
|
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;
|
||||||
111
patches/server/0157-Add-unsafe-Entity-serialization-API.patch
Normal file
111
patches/server/0157-Add-unsafe-Entity-serialization-API.patch
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariell Hoversholm <proximyst@proximyst.com>
|
||||||
|
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 <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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<Tag> 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<Tag> converted = DataFixers.getDataFixer().update(References.ITEM_STACK, new Dynamic<Tag>(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<Tag> 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()) {
|
||||||
@@ -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;
|
||||||
45
patches/server/0159-Dont-run-with-scissors.patch
Normal file
45
patches/server/0159-Dont-run-with-scissors.patch
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: JustDoom <justdoomdev@gmail.com>
|
||||||
|
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<Item> itemImmuneToExplosion = new ArrayList<>();
|
||||||
|
public List<Item> itemImmuneToFire = new ArrayList<>();
|
||||||
|
public List<Item> 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;
|
||||||
51
patches/server/0160-One-Punch-Man.patch
Normal file
51
patches/server/0160-One-Punch-Man.patch
Normal file
@@ -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;
|
||||||
46
patches/server/0161-Add-config-for-snow-on-blue-ice.patch
Normal file
46
patches/server/0161-Add-config-for-snow-on-blue-ice.patch
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
||||||
|
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;
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Encode42 <me@encode42.dev>
|
||||||
|
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<Item> 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;
|
||||||
Reference in New Issue
Block a user