mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-20 09:57:43 +01:00
WOAH WERE HALFWAY THERE 🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉
This commit is contained in:
@@ -1,19 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
||||
Date: Sat, 15 Aug 2020 06:51:46 -0500
|
||||
Subject: [PATCH] Use configured height for nether surface builders
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/levelgen/surfacebuilders/WorldGenSurfaceNetherAbstract.java b/src/main/java/net/minecraft/world/level/levelgen/surfacebuilders/WorldGenSurfaceNetherAbstract.java
|
||||
index b9523f5611b5b8d786fddcc5fd265e8a2043ab6c..6c4707ce08f48da027b4430eee38bfe794c2625f 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/levelgen/surfacebuilders/WorldGenSurfaceNetherAbstract.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/levelgen/surfacebuilders/WorldGenSurfaceNetherAbstract.java
|
||||
@@ -42,7 +42,7 @@ public abstract class WorldGenSurfaceNetherAbstract extends WorldGenSurface<Worl
|
||||
return ((NoiseGeneratorOctaves) entry.getValue()).a((double) i, (double) l, (double) j);
|
||||
})).get()).getKey();
|
||||
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
|
||||
- IBlockData iblockdata4 = ichunkaccess.getType(blockposition_mutableblockposition.d(k1, 128, l1));
|
||||
+ IBlockData iblockdata4 = ichunkaccess.getType(blockposition_mutableblockposition.d(k1, k, l1)); // Purpur - use configured height
|
||||
|
||||
for (int k2 = k; k2 >= 0; --k2) { // Paper - fix MC-187716 - use configured height
|
||||
blockposition_mutableblockposition.d(k1, k2, l1);
|
||||
@@ -1,63 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
||||
Date: Mon, 17 Aug 2020 17:34:33 -0500
|
||||
Subject: [PATCH] Crying obsidian valid for portal frames
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
|
||||
index cfdc602947548970b3fde00dd9fddf4e82c28841..4e0b88e26ad8017d93841c4149a1687c1db4ff0b 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/Block.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
|
||||
@@ -140,6 +140,7 @@ public class Block extends BlockBase implements IMaterial {
|
||||
return tag.isTagged(this);
|
||||
}
|
||||
|
||||
+ public boolean equals(Block block) { return a(block); } // Purpur - OBFHELPER
|
||||
public boolean a(Block block) {
|
||||
return this == block;
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
|
||||
index a1144a3df0287899ef85bc055e8f02ef0a5d6860..e0a6e2b975889a784c239fab18e70403dec937bc 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
|
||||
@@ -686,6 +686,7 @@ public abstract class BlockBase {
|
||||
}
|
||||
|
||||
public final boolean isSameInstance(Block block) { return a(block); } // Paper - OBFHELPER
|
||||
+ public boolean equals(Block block) { return a(block); } // Purpur - OBFHELPER
|
||||
public boolean a(Block block) {
|
||||
return this.getBlock().a(block);
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/portal/BlockPortalShape.java b/src/main/java/net/minecraft/world/level/portal/BlockPortalShape.java
|
||||
index 0bce061d5a0dd0fc08f0aa4d46ead9326beb4bc7..526ae936e6d4470efcf89c1b2892e90320c42201 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/portal/BlockPortalShape.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/portal/BlockPortalShape.java
|
||||
@@ -28,7 +28,7 @@ import org.bukkit.event.world.PortalCreateEvent;
|
||||
public class BlockPortalShape {
|
||||
|
||||
private static final BlockBase.e a = (iblockdata, iblockaccess, blockposition) -> {
|
||||
- return iblockdata.a(Blocks.OBSIDIAN);
|
||||
+ return iblockdata.equals(Blocks.OBSIDIAN) || (net.pl3x.purpur.PurpurConfig.cryingObsidianValidForPortalFrame && iblockdata.equals(Blocks.CRYING_OBSIDIAN)); // Purpur
|
||||
};
|
||||
private final GeneratorAccess b;
|
||||
private final EnumDirection.EnumAxis c;
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
||||
index 65f436e0a27c8687180d7008dbff1cf8f667383c..318caff699e2a1656ef9428641f898f0508a1df7 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
||||
@@ -180,6 +180,7 @@ public class PurpurConfig {
|
||||
public static boolean barrelSixRows = false;
|
||||
public static boolean enderChestSixRows = false;
|
||||
public static boolean enderChestPermissionRows = false;
|
||||
+ public static boolean cryingObsidianValidForPortalFrame = false;
|
||||
private static void blockSettings() {
|
||||
if (version < 3) {
|
||||
boolean oldValue = getBoolean("settings.barrel.packed-barrels", true);
|
||||
@@ -194,6 +195,7 @@ public class PurpurConfig {
|
||||
enderChestSixRows = getBoolean("settings.blocks.ender_chest.six-rows", enderChestSixRows);
|
||||
InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27);
|
||||
enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows);
|
||||
+ cryingObsidianValidForPortalFrame = getBoolean("settings.blocks.crying_obsidian.valid-for-portal-frame", cryingObsidianValidForPortalFrame);
|
||||
}
|
||||
|
||||
public static boolean endermanShortHeight = false;
|
||||
@@ -1,48 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
||||
Date: Mon, 17 Aug 2020 19:32:05 -0500
|
||||
Subject: [PATCH] Entities can use portals configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index 3bbc9d154215437e3db98ad0d10ce43712a70485..aeaac4221e1c235d89e872da4c1aaaa68ab70a48 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -2308,7 +2308,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
|
||||
public void d(BlockPosition blockposition) {
|
||||
if (this.ai()) {
|
||||
this.resetPortalCooldown();
|
||||
- } else {
|
||||
+ } else if (world.purpurConfig.entitiesCanUsePortals || this instanceof EntityPlayer) { // Purpur
|
||||
if (!this.world.isClientSide && !blockposition.equals(this.ac)) {
|
||||
this.ac = blockposition.immutableCopy();
|
||||
}
|
||||
@@ -2889,7 +2889,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
|
||||
}
|
||||
|
||||
public boolean canPortal() {
|
||||
- return isAlive() && valid; // Paper
|
||||
+ return isAlive() && valid && (world.purpurConfig.entitiesCanUsePortals || this instanceof EntityPlayer); // Paper // Purpur
|
||||
}
|
||||
|
||||
public float a(Explosion explosion, IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata, Fluid fluid, float f) {
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
index 9fcc63a2f4a4c363ace85087665bf3a978d3d648..55366240f249c05cf3d40eaf29f2cd21cd86cd07 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
@@ -202,6 +202,7 @@ public class PurpurWorldConfig {
|
||||
public boolean boatEjectPlayersOnLand = false;
|
||||
public boolean disableDropsOnCrammingDeath = false;
|
||||
public boolean entitiesPickUpLootBypassMobGriefing = false;
|
||||
+ public boolean entitiesCanUsePortals = true;
|
||||
public boolean milkCuresBadOmen = true;
|
||||
public double tridentLoyaltyVoidReturnHeight = 0.0D;
|
||||
public double voidDamageHeight = -64.0D;
|
||||
@@ -211,6 +212,7 @@ public class PurpurWorldConfig {
|
||||
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
|
||||
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
|
||||
entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing);
|
||||
+ entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals);
|
||||
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
|
||||
tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
|
||||
voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
|
||||
@@ -1,22 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
|
||||
Date: Mon, 17 Aug 2020 21:50:39 -0500
|
||||
Subject: [PATCH] LivingEntity#broadcastItemBreak
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
index 75af4d5385d4366e562a53716e020ba20ccbea94..411a84840764ce6f7a83e11655cc04403d6ee5ee 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
@@ -886,5 +886,11 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
||||
public void setSafeFallDistance(float safeFallDistance) {
|
||||
getHandle().safeFallDistance = safeFallDistance;
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public void broadcastItemBreak(org.bukkit.inventory.EquipmentSlot slot) {
|
||||
+ if (slot == null) return;
|
||||
+ getHandle().broadcastItemBreak(org.bukkit.craftbukkit.CraftEquipmentSlot.getNMS(slot));
|
||||
+ }
|
||||
// Purpur end
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Thu, 20 Aug 2020 17:38:12 -0700
|
||||
Subject: [PATCH] Customizable wither health and healing
|
||||
|
||||
Adds the ability to customize the health of the wither, as well as the amount that it heals, and how often.
|
||||
|
||||
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 8afb710441466918a7c97bd1daffafc48899decc..0c631868c7e7bade389e907e5657d76172590cac 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
|
||||
@@ -205,6 +205,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
|
||||
skull.setPositionRaw(headX, headY, headZ);
|
||||
world.addEntity(skull);
|
||||
}
|
||||
+
|
||||
+ @Override
|
||||
+ public void initAttributes() {
|
||||
+ this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(world.purpurConfig.witherMaxHealth);
|
||||
+ }
|
||||
// Purpur end
|
||||
|
||||
@Override
|
||||
@@ -409,7 +414,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
|
||||
|
||||
this.setInvul(i);
|
||||
if (this.ticksLived % 10 == 0) {
|
||||
- this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit
|
||||
+ this.heal(this.getMaxHealth() / 33, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit // Purpur - use max health for healing instead of a constant
|
||||
}
|
||||
|
||||
} else {
|
||||
@@ -518,8 +523,10 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
|
||||
}
|
||||
}
|
||||
|
||||
- if (this.ticksLived % 20 == 0) {
|
||||
- this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit
|
||||
+ // Purpur start - customizable heal rate and amount
|
||||
+ if (this.ticksLived % world.purpurConfig.witherHealthRegenDelay == 0) {
|
||||
+ this.heal(world.purpurConfig.witherHealthRegenAmount, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit
|
||||
+ // Purpur end
|
||||
}
|
||||
|
||||
//this.bossBattle.setProgress(this.getHealth() / this.getMaxHealth()); // Paper - Moved down
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
index 55366240f249c05cf3d40eaf29f2cd21cd86cd07..db9deac5b43626b264f1237d8a2d2535d7bb639b 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
@@ -979,10 +979,21 @@ public class PurpurWorldConfig {
|
||||
public boolean witherRidable = false;
|
||||
public boolean witherRidableInWater = false;
|
||||
public double witherMaxY = 256D;
|
||||
+ public float witherHealthRegenAmount = 1.0f;
|
||||
+ public int witherHealthRegenDelay = 20;
|
||||
+ public double witherMaxHealth = 300.0D;
|
||||
private void witherSettings() {
|
||||
witherRidable = getBoolean("mobs.wither.ridable", witherRidable);
|
||||
witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater);
|
||||
witherMaxY = getDouble("mobs.wither.ridable-max-y", witherMaxY);
|
||||
+ witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount);
|
||||
+ witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay);
|
||||
+ if (PurpurConfig.version < 8) {
|
||||
+ double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth);
|
||||
+ set("mobs.wither.attributes.max-health", oldValue);
|
||||
+ set("mobs.wither.max-health", null);
|
||||
+ }
|
||||
+ witherMaxHealth = getDouble("mobs.wither.attributes.max-health", witherMaxHealth);
|
||||
}
|
||||
|
||||
public boolean witherSkeletonRidable = false;
|
||||
@@ -1,176 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Sat, 22 Aug 2020 20:47:11 -0700
|
||||
Subject: [PATCH] Allow toggling special MobSpawners per world
|
||||
|
||||
In vanilla, these are all hardcoded on for world type 0 (overworld) and hardcoded off for every other world type. Default config behaviour matches this.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
|
||||
index a83324f1f4479b5807f7f335b7e63ba1f6bcb057..5567d12b2b74b0fcf17e600d2c7b8ab88c2f3b13 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
|
||||
@@ -92,6 +92,7 @@ import net.minecraft.world.entity.EnumCreatureType;
|
||||
import net.minecraft.world.entity.ReputationHandler;
|
||||
import net.minecraft.world.entity.ai.navigation.NavigationAbstract;
|
||||
import net.minecraft.world.entity.ai.village.ReputationEvent;
|
||||
+import net.minecraft.world.entity.ai.village.VillageSiege;
|
||||
import net.minecraft.world.entity.ai.village.poi.VillagePlace;
|
||||
import net.minecraft.world.entity.ai.village.poi.VillagePlaceType;
|
||||
import net.minecraft.world.entity.animal.EntityAnimal;
|
||||
@@ -101,6 +102,8 @@ import net.minecraft.world.entity.animal.horse.EntityHorseSkeleton;
|
||||
import net.minecraft.world.entity.boss.EntityComplexPart;
|
||||
import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon;
|
||||
import net.minecraft.world.entity.item.EntityItem;
|
||||
+import net.minecraft.world.entity.npc.MobSpawnerCat;
|
||||
+import net.minecraft.world.entity.npc.MobSpawnerTrader;
|
||||
import net.minecraft.world.entity.npc.NPC;
|
||||
import net.minecraft.world.entity.player.EntityHuman;
|
||||
import net.minecraft.world.entity.raid.PersistentRaid;
|
||||
@@ -133,6 +136,8 @@ import net.minecraft.world.level.chunk.storage.RegionFile;
|
||||
import net.minecraft.world.level.dimension.DimensionManager;
|
||||
import net.minecraft.world.level.dimension.end.EnderDragonBattle;
|
||||
import net.minecraft.world.level.levelgen.HeightMap;
|
||||
+import net.minecraft.world.level.levelgen.MobSpawnerPatrol;
|
||||
+import net.minecraft.world.level.levelgen.MobSpawnerPhantom;
|
||||
import net.minecraft.world.level.levelgen.feature.StructureGenerator;
|
||||
import net.minecraft.world.level.levelgen.structure.StructureBoundingBox;
|
||||
import net.minecraft.world.level.levelgen.structure.StructureStart;
|
||||
@@ -347,7 +352,24 @@ public class WorldServer extends World implements GeneratorAccessSeed {
|
||||
this.L = new ObjectLinkedOpenHashSet();
|
||||
this.Q = flag1;
|
||||
this.server = minecraftserver;
|
||||
- this.mobSpawners = list;
|
||||
+ // Purpur start - enable/disable MobSpawners per world
|
||||
+ this.mobSpawners = new java.util.ArrayList<>();
|
||||
+ if (purpurConfig.phantomSpawning) {
|
||||
+ mobSpawners.add(new MobSpawnerPhantom());
|
||||
+ }
|
||||
+ if (purpurConfig.patrolSpawning) {
|
||||
+ mobSpawners.add(new MobSpawnerPatrol());
|
||||
+ }
|
||||
+ if (purpurConfig.catSpawning) {
|
||||
+ mobSpawners.add(new MobSpawnerCat());
|
||||
+ }
|
||||
+ if (purpurConfig.villageSiegeSpawning) {
|
||||
+ mobSpawners.add(new VillageSiege());
|
||||
+ }
|
||||
+ if (purpurConfig.villagerTraderSpawning) {
|
||||
+ mobSpawners.add(new MobSpawnerTrader(iworlddataserver));
|
||||
+ }
|
||||
+ // Purpur end
|
||||
// CraftBukkit start
|
||||
this.worldDataServer = (WorldDataServer) iworlddataserver;
|
||||
worldDataServer.world = this;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/npc/MobSpawnerTrader.java b/src/main/java/net/minecraft/world/entity/npc/MobSpawnerTrader.java
|
||||
index 7c8a2151be8a0f48cba1c15d231d5dbdb500b4d6..361771fc4fcf16b1b013c550734019535cef2924 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/npc/MobSpawnerTrader.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/npc/MobSpawnerTrader.java
|
||||
@@ -5,6 +5,7 @@ import java.util.Optional;
|
||||
import java.util.Random;
|
||||
import javax.annotation.Nullable;
|
||||
import net.minecraft.core.BlockPosition;
|
||||
+import net.minecraft.core.EnumDirection;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.chat.IChatBaseComponent;
|
||||
import net.minecraft.server.level.EntityPlayer;
|
||||
@@ -153,7 +154,17 @@ public class MobSpawnerTrader implements MobSpawner {
|
||||
int k = blockposition.getX() + this.a.nextInt(i * 2) - i;
|
||||
int l = blockposition.getZ() + this.a.nextInt(i * 2) - i;
|
||||
int i1 = iworldreader.a(HeightMap.Type.WORLD_SURFACE, k, l);
|
||||
- BlockPosition blockposition2 = new BlockPosition(k, i1, l);
|
||||
+ // Purpur start - allow traders to spawn below nether roof
|
||||
+ BlockPosition.MutableBlockPosition blockposition2 = new BlockPosition.MutableBlockPosition(k, i1, l);
|
||||
+ if (iworldreader.getDimensionManager().hasCeiling()) {
|
||||
+ do {
|
||||
+ blockposition2.c(EnumDirection.DOWN);
|
||||
+ } while (!iworldreader.getType(blockposition2).isAir());
|
||||
+ do {
|
||||
+ blockposition2.c(EnumDirection.DOWN);
|
||||
+ } while (iworldreader.getType(blockposition2).isAir() && blockposition2.getY() > 0);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
|
||||
if (SpawnerCreature.a(EntityPositionTypes.Surface.ON_GROUND, iworldreader, blockposition2, EntityTypes.WANDERING_TRADER)) {
|
||||
blockposition1 = blockposition2;
|
||||
diff --git a/src/main/java/net/minecraft/world/level/World.java b/src/main/java/net/minecraft/world/level/World.java
|
||||
index d55a139f91905e8a2af125b4eeee05c957feae0a..ea40c3d862acdea4d02b234ae5039204a415df20 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/World.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/World.java
|
||||
@@ -200,7 +200,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
||||
this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.WorldDataServer) worlddatamutable).getName()); // Spigot
|
||||
this.paperConfig = new com.destroystokyo.paper.PaperWorldConfig(((net.minecraft.world.level.storage.WorldDataServer) worlddatamutable).getName(), this.spigotConfig); // Paper
|
||||
this.chunkPacketBlockController = this.paperConfig.antiXray ? new ChunkPacketBlockControllerAntiXray(this, executor) : ChunkPacketBlockController.NO_OPERATION_INSTANCE; // Paper - Anti-Xray
|
||||
- this.purpurConfig = new net.pl3x.purpur.PurpurWorldConfig((((net.minecraft.world.level.storage.WorldDataServer)worlddatamutable).getName())); // Purpur
|
||||
+ this.purpurConfig = new net.pl3x.purpur.PurpurWorldConfig((((net.minecraft.world.level.storage.WorldDataServer)worlddatamutable).getName()), env); // Purpur
|
||||
this.generator = gen;
|
||||
this.world = new CraftWorld((WorldServer) this, gen, env);
|
||||
this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
index db9deac5b43626b264f1237d8a2d2535d7bb639b..63cf32fe3359eb00f5e526689a9b10f673911a86 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
@@ -7,6 +7,8 @@ import net.minecraft.world.level.block.Blocks;
|
||||
import net.minecraft.world.item.Item;
|
||||
import net.minecraft.world.item.Items;
|
||||
import net.minecraft.resources.MinecraftKey;
|
||||
+import org.apache.commons.lang3.BooleanUtils;
|
||||
+import org.bukkit.World;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -15,6 +17,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
+import java.util.function.Predicate;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static net.pl3x.purpur.PurpurConfig.log;
|
||||
@@ -22,9 +25,11 @@ import static net.pl3x.purpur.PurpurConfig.log;
|
||||
public class PurpurWorldConfig {
|
||||
|
||||
private final String worldName;
|
||||
+ private final World.Environment environment;
|
||||
|
||||
- public PurpurWorldConfig(String worldName) {
|
||||
+ public PurpurWorldConfig(String worldName, World.Environment environment) {
|
||||
this.worldName = worldName;
|
||||
+ this.environment = environment;
|
||||
init();
|
||||
}
|
||||
|
||||
@@ -52,6 +57,12 @@ public class PurpurWorldConfig {
|
||||
return PurpurConfig.config.getBoolean("world-settings." + worldName + "." + path, PurpurConfig.config.getBoolean("world-settings.default." + path));
|
||||
}
|
||||
|
||||
+ private boolean getBoolean(String path, Predicate<Boolean> predicate) {
|
||||
+ String val = getString(path, "default").toLowerCase();
|
||||
+ Boolean bool = BooleanUtils.toBooleanObject(val, "true", "false", "default");
|
||||
+ return predicate.test(bool);
|
||||
+ }
|
||||
+
|
||||
private double getDouble(String path, double def) {
|
||||
PurpurConfig.config.addDefault("world-settings.default." + path, def);
|
||||
return PurpurConfig.config.getDouble("world-settings." + worldName + "." + path, PurpurConfig.config.getDouble("world-settings.default." + path));
|
||||
@@ -219,6 +230,21 @@ public class PurpurWorldConfig {
|
||||
voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
|
||||
}
|
||||
|
||||
+ public boolean catSpawning;
|
||||
+ public boolean patrolSpawning;
|
||||
+ public boolean phantomSpawning;
|
||||
+ public boolean villagerTraderSpawning;
|
||||
+ public boolean villageSiegeSpawning;
|
||||
+ private void mobSpawnerSettings() {
|
||||
+ // values of "default" or null will default to true only if the world environment is normal (aka overworld)
|
||||
+ Predicate<Boolean> predicate = (bool) -> (bool != null && bool) || (bool == null && environment == World.Environment.NORMAL);
|
||||
+ catSpawning = getBoolean("gameplay-mechanics.mob-spawning.village-cats", predicate);
|
||||
+ patrolSpawning = getBoolean("gameplay-mechanics.mob-spawning.raid-patrols", predicate);
|
||||
+ phantomSpawning = getBoolean("gameplay-mechanics.mob-spawning.phantoms", predicate);
|
||||
+ villagerTraderSpawning = getBoolean("gameplay-mechanics.mob-spawning.wandering-traders", predicate);
|
||||
+ villageSiegeSpawning = getBoolean("gameplay-mechanics.mob-spawning.village-sieges", predicate);
|
||||
+ }
|
||||
+
|
||||
public int elytraDamagePerSecond = 1;
|
||||
public double elytraDamageMultiplyBySpeed = 0;
|
||||
public boolean elytraIgnoreUnbreaking = false;
|
||||
@@ -1,73 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Thu, 27 Aug 2020 13:48:52 -0700
|
||||
Subject: [PATCH] Raid cooldown setting
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/raid/PersistentRaid.java b/src/main/java/net/minecraft/world/entity/raid/PersistentRaid.java
|
||||
index c939ca087af4588e14669a2d53d7c116dcb59f16..11271762dcf5783c3179de1afc6a882c5330b4dd 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/raid/PersistentRaid.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/raid/PersistentRaid.java
|
||||
@@ -27,6 +27,7 @@ import net.minecraft.world.phys.Vec3D;
|
||||
|
||||
public class PersistentRaid extends PersistentBase {
|
||||
|
||||
+ public final Map<java.util.UUID, Integer> playerCooldowns = new java.util.HashMap<>(); // Purpur
|
||||
public final Map<Integer, Raid> raids = Maps.newHashMap();
|
||||
private final WorldServer b;
|
||||
private int c;
|
||||
@@ -45,6 +46,17 @@ public class PersistentRaid extends PersistentBase {
|
||||
|
||||
public void a() {
|
||||
++this.d;
|
||||
+ // Purpur start
|
||||
+ if (b.purpurConfig.raidCooldownSeconds != 0 && this.d % 20 == 0) {
|
||||
+ com.google.common.collect.ImmutableMap.copyOf(playerCooldowns).forEach((id, i) -> {
|
||||
+ if (i < 1) {
|
||||
+ playerCooldowns.remove(id);
|
||||
+ } else {
|
||||
+ playerCooldowns.put(id, i - 1);
|
||||
+ }
|
||||
+ });
|
||||
+ }
|
||||
+ // Purpur end
|
||||
Iterator iterator = this.raids.values().iterator();
|
||||
|
||||
while (iterator.hasNext()) {
|
||||
@@ -128,10 +140,15 @@ public class PersistentRaid extends PersistentBase {
|
||||
|
||||
if (flag) {
|
||||
// CraftBukkit start
|
||||
- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callRaidTriggerEvent(raid, entityplayer)) {
|
||||
+ if ((b.purpurConfig.raidCooldownSeconds != 0 && playerCooldowns.containsKey(entityplayer.getUniqueID())) || !org.bukkit.craftbukkit.event.CraftEventFactory.callRaidTriggerEvent(raid, entityplayer)) { // Purpur
|
||||
entityplayer.removeEffect(MobEffects.BAD_OMEN);
|
||||
return null;
|
||||
}
|
||||
+ // Purpur start
|
||||
+ if (b.purpurConfig.raidCooldownSeconds != 0) {
|
||||
+ playerCooldowns.put(entityplayer.getUniqueID(), b.purpurConfig.raidCooldownSeconds);
|
||||
+ }
|
||||
+ // Purpur end
|
||||
|
||||
if (!this.raids.containsKey(raid.getId())) {
|
||||
this.raids.put(raid.getId(), raid);
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
index 63cf32fe3359eb00f5e526689a9b10f673911a86..1e0af82c74259783fdc86a7824b18ff1d14fe938 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
@@ -218,6 +218,7 @@ public class PurpurWorldConfig {
|
||||
public double tridentLoyaltyVoidReturnHeight = 0.0D;
|
||||
public double voidDamageHeight = -64.0D;
|
||||
public double voidDamageDealt = 4.0D;
|
||||
+ public int raidCooldownSeconds = 0;
|
||||
private void miscGameplayMechanicsSettings() {
|
||||
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
|
||||
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
|
||||
@@ -228,6 +229,7 @@ public class PurpurWorldConfig {
|
||||
tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
|
||||
voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
|
||||
voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
|
||||
+ raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
|
||||
}
|
||||
|
||||
public boolean catSpawning;
|
||||
@@ -1,343 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Mon, 14 Sep 2020 10:09:05 -0700
|
||||
Subject: [PATCH] Despawn rate config options per projectile type
|
||||
|
||||
Default values of -1 respect vanilla behaviour.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
|
||||
index b0e8e9934edbb0cf7ac063e4903452be526afbc7..d4d45655ed84d4b35e624a97b64f269e39c99e08 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
|
||||
@@ -61,7 +61,7 @@ public abstract class EntityArrow extends IProjectile {
|
||||
protected int c;
|
||||
public EntityArrow.PickupStatus fromPlayer;
|
||||
public int shake;
|
||||
- public int despawnCounter;
|
||||
+ //public int despawnCounter; // Purpur - moved to IProjectile
|
||||
private double damage;
|
||||
public int knockbackStrength;
|
||||
private SoundEffect ak;
|
||||
@@ -293,13 +293,23 @@ public abstract class EntityArrow extends IProjectile {
|
||||
|
||||
}
|
||||
|
||||
- protected final void tickDespawnCounter() { this.h(); } // Paper - OBFHELPER
|
||||
- protected void h() {
|
||||
- ++this.despawnCounter;
|
||||
- if (this.despawnCounter >= (fromPlayer == PickupStatus.CREATIVE_ONLY ? world.paperConfig.creativeArrowDespawnRate : (fromPlayer == PickupStatus.DISALLOWED ? world.paperConfig.nonPlayerArrowDespawnRate : ((this instanceof EntityThrownTrident) ? world.spigotConfig.tridentDespawnRate : world.spigotConfig.arrowDespawnRate)))) { // Spigot // Paper - TODO: Extract this to init?
|
||||
- this.die();
|
||||
+ // Purpur start
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ if (fromPlayer == PickupStatus.CREATIVE_ONLY) {
|
||||
+ return world.paperConfig.creativeArrowDespawnRate;
|
||||
+ }
|
||||
+ if (fromPlayer == PickupStatus.DISALLOWED) {
|
||||
+ return world.paperConfig.nonPlayerArrowDespawnRate;
|
||||
+ }
|
||||
+ if (this instanceof EntityThrownTrident) {
|
||||
+ return world.spigotConfig.tridentDespawnRate;
|
||||
}
|
||||
+ return world.spigotConfig.arrowDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
|
||||
+ protected void h() {
|
||||
+ tickDespawnCounter(); // Purpur
|
||||
}
|
||||
|
||||
private void A() {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityDragonFireball.java b/src/main/java/net/minecraft/world/entity/projectile/EntityDragonFireball.java
|
||||
index 27853f510e15e40c66da2cb4905c43f5e8f99d3d..98dcfedc8826ebb067438be713549e2cfb19ebb0 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityDragonFireball.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityDragonFireball.java
|
||||
@@ -87,4 +87,11 @@ public class EntityDragonFireball extends EntityFireball {
|
||||
protected boolean W_() {
|
||||
return false;
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.dragonFireballDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityEgg.java b/src/main/java/net/minecraft/world/entity/projectile/EntityEgg.java
|
||||
index dc2e51718395494f60b0376d65d496daf2f76e71..d97511c27ff376b2dd0fbedb227f9a0c337a1264 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityEgg.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityEgg.java
|
||||
@@ -99,4 +99,11 @@ public class EntityEgg extends EntityProjectileThrowable {
|
||||
protected Item getDefaultItem() {
|
||||
return Items.EGG;
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.eggDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
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 efdf5bc4f07231690c680429b3f77bd07970eee0..cf2c691357c41a7e7044f7a719144db2ffab5dbe 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityEnderPearl.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityEnderPearl.java
|
||||
@@ -122,4 +122,11 @@ public class EntityEnderPearl extends EntityProjectileThrowable {
|
||||
|
||||
return super.b(worldserver);
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.enderPearlDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java b/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
|
||||
index ca7a10c4b04766d7eb55be9252e96ef939e76df3..6a6ed24640c152bd5d6637b30ccce3efdf8a4856 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
|
||||
@@ -323,4 +323,11 @@ public class EntityFireworks extends IProjectile {
|
||||
public Packet<?> P() {
|
||||
return new PacketPlayOutSpawnEntity(this);
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.fireworkDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java b/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
|
||||
index 45f0f004e97b20e5c6c5b1f205b088bf8aa86017..242ba2c1feb07f9e582a722f34e6362dd84f27cc 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
|
||||
@@ -615,4 +615,11 @@ public class EntityFishingHook extends IProjectile {
|
||||
|
||||
private HookState() {}
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.fishingHookDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityLargeFireball.java b/src/main/java/net/minecraft/world/entity/projectile/EntityLargeFireball.java
|
||||
index cf2663d9883654f53b327246d85ee63c3990cd71..e860737bacfea0a1d728dbaaf41d62165658ad89 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityLargeFireball.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityLargeFireball.java
|
||||
@@ -77,4 +77,11 @@ public class EntityLargeFireball extends EntityFireballFireball {
|
||||
}
|
||||
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.largeFireballDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java b/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
|
||||
index 6f497fc1b1eb33d0d9dfb0dc014b25b7eeb0dfac..56de41fc11720f4a37ee4e1e7cbec1b2dbe3ab76 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
|
||||
@@ -86,4 +86,11 @@ public class EntityLlamaSpit extends IProjectile {
|
||||
public Packet<?> P() {
|
||||
return new PacketPlayOutSpawnEntity(this);
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.llamaSpitDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityPotion.java b/src/main/java/net/minecraft/world/entity/projectile/EntityPotion.java
|
||||
index 9348288fb752e758fe7aee8c2a630ea0fb7b9a8c..fa2a4f9e9c0364893abf83ffc627f33b198b2e81 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityPotion.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityPotion.java
|
||||
@@ -283,4 +283,11 @@ public class EntityPotion extends EntityProjectileThrowable {
|
||||
}
|
||||
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.potionDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java b/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
|
||||
index 24076f3de298173e293507f2024105532f833455..96c609aa888b4fb83db6eddba259bd553fe0dd0a 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
|
||||
@@ -337,4 +337,11 @@ public class EntityShulkerBullet extends IProjectile {
|
||||
public Packet<?> P() {
|
||||
return new PacketPlayOutSpawnEntity(this);
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.shulkerBulletDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntitySmallFireball.java b/src/main/java/net/minecraft/world/entity/projectile/EntitySmallFireball.java
|
||||
index d139c5806e5971e82865c2ce627e87c631e42d7a..bf747cbf6e1ef9ea9d1d41d0441b29a46ce874c0 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntitySmallFireball.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntitySmallFireball.java
|
||||
@@ -100,4 +100,11 @@ public class EntitySmallFireball extends EntityFireballFireball {
|
||||
public boolean damageEntity(DamageSource damagesource, float f) {
|
||||
return false;
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.smallFireballDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntitySnowball.java b/src/main/java/net/minecraft/world/entity/projectile/EntitySnowball.java
|
||||
index 3ec380ec35fade3bcc61c5f45cee651eb45ae073..0d3b9c81e47eef645335e49a1d6d88db7338aa4b 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntitySnowball.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntitySnowball.java
|
||||
@@ -25,6 +25,12 @@ public class EntitySnowball extends EntityProjectileThrowable {
|
||||
super(EntityTypes.SNOWBALL, d0, d1, d2, world);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return world.purpurConfig.snowballDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
+
|
||||
@Override
|
||||
protected Item getDefaultItem() {
|
||||
return Items.SNOWBALL;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityThrownExpBottle.java b/src/main/java/net/minecraft/world/entity/projectile/EntityThrownExpBottle.java
|
||||
index e07353a6b34196e3d275ba482fbef7e4d209c31d..6ef87bd6969603a51f09034ad87b89ab8a25eadb 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityThrownExpBottle.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityThrownExpBottle.java
|
||||
@@ -61,4 +61,11 @@ public class EntityThrownExpBottle extends EntityProjectileThrowable {
|
||||
}
|
||||
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.expBottleDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityWitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/EntityWitherSkull.java
|
||||
index 021a7e31dc3650c0c404a893374528e6a63dfbad..2fe0e32a1158cccb3060f5a986c9fc41a0237aa8 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityWitherSkull.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityWitherSkull.java
|
||||
@@ -137,4 +137,11 @@ public class EntityWitherSkull extends EntityFireball {
|
||||
protected boolean W_() {
|
||||
return false;
|
||||
}
|
||||
+
|
||||
+ // Purpur start
|
||||
+ @Override
|
||||
+ protected int getPurpurDespawnRate() {
|
||||
+ return this.world.purpurConfig.witherSkullDespawnRate;
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
|
||||
index 390023a7a825eed850a13572b719f47ed534c003..8df2b646df701b4d21f956b9870d7c09c13e2b6d 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
|
||||
@@ -25,6 +25,7 @@ public abstract class IProjectile extends Entity {
|
||||
private UUID shooter;
|
||||
private int c;
|
||||
private boolean d; public boolean leftOwner() { return d; } public void setLeftOwner(boolean leftOwner) { this.d = leftOwner; } // Purpur - OBFHELPER
|
||||
+ public int despawnCounter; // Purpur - moved from EntityArrow
|
||||
|
||||
// CraftBukkit start
|
||||
private boolean hitCancelled = false;
|
||||
@@ -34,6 +35,19 @@ public abstract class IProjectile extends Entity {
|
||||
super(entitytypes, world);
|
||||
}
|
||||
|
||||
+ // Purpur start
|
||||
+ protected final void tickDespawnCounter() {
|
||||
+ if (this.getPurpurDespawnRate() != -1) {
|
||||
+ ++this.despawnCounter;
|
||||
+ if (this.despawnCounter >= this.getPurpurDespawnRate()) {
|
||||
+ this.die();
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ protected abstract int getPurpurDespawnRate();
|
||||
+ // Purpur end
|
||||
+
|
||||
public void setShooter(@Nullable Entity entity) {
|
||||
if (entity != null) {
|
||||
this.shooter = entity.getUniqueID();
|
||||
@@ -88,6 +102,12 @@ public abstract class IProjectile extends Entity {
|
||||
}
|
||||
|
||||
super.tick();
|
||||
+
|
||||
+ // Purpur start
|
||||
+ if (!(this instanceof EntityArrow)) { // EntityArrow handles its own despawn counter
|
||||
+ this.tickDespawnCounter();
|
||||
+ }
|
||||
+ // Purpur end
|
||||
}
|
||||
|
||||
public boolean checkIfLeftOwner() { return this.h(); } // Purpur - OBFHELPER
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
index 1e0af82c74259783fdc86a7824b18ff1d14fe938..c9fa235746dd8cf148ae88c3cca4c4a9639d0f61 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
@@ -209,6 +209,35 @@ public class PurpurWorldConfig {
|
||||
idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList);
|
||||
}
|
||||
|
||||
+ public int dragonFireballDespawnRate = -1;
|
||||
+ public int eggDespawnRate = -1;
|
||||
+ public int enderPearlDespawnRate = -1;
|
||||
+ public int expBottleDespawnRate = -1;
|
||||
+ public int fireworkDespawnRate = -1;
|
||||
+ public int fishingHookDespawnRate = -1;
|
||||
+ public int largeFireballDespawnRate = -1;
|
||||
+ public int llamaSpitDespawnRate = -1;
|
||||
+ public int potionDespawnRate = -1;
|
||||
+ public int shulkerBulletDespawnRate = -1;
|
||||
+ public int smallFireballDespawnRate = -1;
|
||||
+ public int snowballDespawnRate = -1;
|
||||
+ public int witherSkullDespawnRate = -1;
|
||||
+ private void projectileDespawnRateSettings() {
|
||||
+ dragonFireballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.dragon_fireball", dragonFireballDespawnRate);
|
||||
+ eggDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.egg", eggDespawnRate);
|
||||
+ enderPearlDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.ender_pearl", enderPearlDespawnRate);
|
||||
+ expBottleDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.experience_bottle", expBottleDespawnRate);
|
||||
+ fireworkDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.firework_rocket", fireworkDespawnRate);
|
||||
+ fishingHookDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.fishing_bobber", fishingHookDespawnRate);
|
||||
+ largeFireballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.fireball", largeFireballDespawnRate);
|
||||
+ llamaSpitDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.llama_spit", llamaSpitDespawnRate);
|
||||
+ potionDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.potion", potionDespawnRate);
|
||||
+ shulkerBulletDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.shulker_bullet", shulkerBulletDespawnRate);
|
||||
+ smallFireballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.small_fireball", smallFireballDespawnRate);
|
||||
+ snowballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.snowball", snowballDespawnRate);
|
||||
+ witherSkullDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.wither_skull", witherSkullDespawnRate);
|
||||
+ }
|
||||
+
|
||||
public boolean useBetterMending = false;
|
||||
public boolean boatEjectPlayersOnLand = false;
|
||||
public boolean disableDropsOnCrammingDeath = false;
|
||||
@@ -1,89 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: nitricspace <nitricspace@users.noreply.github.com>
|
||||
Date: Mon, 21 Sep 2020 23:19:43 +0100
|
||||
Subject: [PATCH] Add option to disable zombie aggressiveness towards villagers
|
||||
when lagging
|
||||
|
||||
|
||||
diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
|
||||
index f62d0ee49ebda2b0c7a136562b24ee038502d048..995ccf9abfd91780168091da95c9af758f177b98 100644
|
||||
--- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
|
||||
+++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
|
||||
@@ -305,6 +305,10 @@ public class MobGoalHelper {
|
||||
deobfuscationMap.put("wither_a", "wither_do_nothing");
|
||||
deobfuscationMap.put("wolf_a", "wolf_avoid_entity");
|
||||
deobfuscationMap.put("zombie_a", "zombie_attack_turtle_egg");
|
||||
+ // Purpur start
|
||||
+ deobfuscationMap.put("zombie_1", "zombie_attack_villager");
|
||||
+ deobfuscationMap.put("drowned_1", "drowned_attack_villager");
|
||||
+ // Purpur end
|
||||
|
||||
ignored.add("selector_1");
|
||||
ignored.add("selector_2");
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityDrowned.java b/src/main/java/net/minecraft/world/entity/monster/EntityDrowned.java
|
||||
index 1d4039d61a2c77a38a31947010cee26f41c0becd..93946f4e3cad07e20189a44ce512682b4cbc163b 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/EntityDrowned.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityDrowned.java
|
||||
@@ -109,7 +109,18 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity {
|
||||
this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, 1.0D));
|
||||
this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{EntityDrowned.class})).a(EntityPigZombie.class));
|
||||
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, 10, true, false, this::i));
|
||||
- if ( world.spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)); // Paper
|
||||
+ // Purpur start
|
||||
+ if ( world.spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<EntityVillagerAbstract>(this, EntityVillagerAbstract.class, false) { // Spigot
|
||||
+ @Override
|
||||
+ public boolean a() {
|
||||
+ return (world.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !world.getMinecraftServer().server.isLagging()) && super.a();
|
||||
+ }
|
||||
+ @Override
|
||||
+ public boolean b() {
|
||||
+ return (world.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !world.getMinecraftServer().server.isLagging()) && super.b();
|
||||
+ }
|
||||
+ });
|
||||
+ // Purpur end
|
||||
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, true));
|
||||
this.targetSelector.a(5, new PathfinderGoalNearestAttackableTarget<>(this, EntityTurtle.class, 10, true, false, EntityTurtle.bo));
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityZombie.java b/src/main/java/net/minecraft/world/entity/monster/EntityZombie.java
|
||||
index 901fe8d224130c67bad00636b065bc798859a18e..88264b7b2c21a377f4b0dd857065e40165f0acde 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/EntityZombie.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityZombie.java
|
||||
@@ -148,7 +148,18 @@ public class EntityZombie extends EntityMonster {
|
||||
this.goalSelector.a(7, new PathfinderGoalRandomStrollLand(this, 1.0D));
|
||||
this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[0])).a(EntityPigZombie.class));
|
||||
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
|
||||
- if ( world.spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)); // Spigot
|
||||
+ // Purpur start
|
||||
+ if ( world.spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<EntityVillagerAbstract>(this, EntityVillagerAbstract.class, false) { // Spigot
|
||||
+ @Override
|
||||
+ public boolean a() {
|
||||
+ return (world.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !world.getMinecraftServer().server.isLagging()) && super.a();
|
||||
+ }
|
||||
+ @Override
|
||||
+ public boolean b() {
|
||||
+ return (world.purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !world.getMinecraftServer().server.isLagging()) && super.b();
|
||||
+ }
|
||||
+ });
|
||||
+ // Purpur end
|
||||
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, true));
|
||||
this.targetSelector.a(5, new PathfinderGoalNearestAttackableTarget<>(this, EntityTurtle.class, 10, true, false, EntityTurtle.bo));
|
||||
}
|
||||
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
index c9fa235746dd8cf148ae88c3cca4c4a9639d0f61..94681a3cb57950b0cd074927aa63bf84e3ef0cf7 100644
|
||||
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
||||
@@ -1081,12 +1081,14 @@ public class PurpurWorldConfig {
|
||||
public boolean zombieJockeyOnlyBaby = true;
|
||||
public double zombieJockeyChance = 0.05D;
|
||||
public boolean zombieJockeyTryExistingChickens = true;
|
||||
+ public boolean zombieAggressiveTowardsVillagerWhenLagging = true;
|
||||
private void zombieSettings() {
|
||||
zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable);
|
||||
zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater);
|
||||
zombieJockeyOnlyBaby = getBoolean("mobs.zombie.jockey.only-babies", zombieJockeyOnlyBaby);
|
||||
zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance);
|
||||
zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens);
|
||||
+ zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging);
|
||||
}
|
||||
|
||||
public boolean zombieHorseCanSwim = false;
|
||||
Reference in New Issue
Block a user