From 82ef35225f3dfdf035c6eaa1647d36f8a6fb509a Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Wed, 16 Jun 2021 17:17:33 -0500 Subject: [PATCH] progress --- ...021-Ridables.patch => 0004-Ridables.patch} | 19 +- ...ch => 0005-Allow-inventory-resizing.patch} | 0 ...t-API.patch => 0006-Advancement-API.patch} | 0 ...6-Llama-API.patch => 0007-Llama-API.patch} | 0 ...{0007-AFK-API.patch => 0008-AFK-API.patch} | 0 ...atch => 0009-Bring-back-server-name.patch} | 0 ...t.patch => 0010-ExecuteCommandEvent.patch} | 0 ... 0011-LivingEntity-safeFallDistance.patch} | 0 ...old.patch => 0012-Lagging-threshold.patch} | 0 ...h => 0013-ItemFactory-getMonsterEgg.patch} | 0 ...14-PlayerSetSpawnerTypeWithEggEvent.patch} | 0 ...ch => 0015-EMC-MonsterEggSpawnEvent.patch} | 0 ....patch => 0016-Villager-resetOffers.patch} | 0 ...ch => 0017-Player-invulnerabilities.patch} | 0 ...7-Anvil-API.patch => 0018-Anvil-API.patch} | 0 ... 0019-ItemStack-convenience-methods.patch} | 0 ...d-to-crystals-and-crystals-shoot-ph.patch} | 14 +- ...atch => 0021-ChatColor-conveniences.patch} | 0 ...sable-zombie-aggressiveness-towards-.patch | 8 +- patches/api/0031-Rabid-Wolf-API.patch | 6 +- .../0040-Iron-golem-poppy-calms-anger.patch | 4 +- ...101-Ridables.patch => 0001-Ridables.patch} | 0 ...Configurable-entity-base-attributes.patch} | 0 patches/server/0003-Ridables.patch | 2155 +++++++++++++++++ ...s-stuff.patch => 0004-Timings-stuff.patch} | 8 +- ...0005-Barrels-and-enderchests-6-rows.patch} | 4 +- ...t-API.patch => 0006-Advancement-API.patch} | 0 ...6-Llama-API.patch => 0007-Llama-API.patch} | 0 ...{0007-AFK-API.patch => 0008-AFK-API.patch} | 53 +- ...atch => 0009-Bring-back-server-name.patch} | 0 ...> 0010-Configurable-server-mod-name.patch} | 10 +- ... 0011-LivingEntity-safeFallDistance.patch} | 2 +- ...old.patch => 0012-Lagging-threshold.patch} | 6 +- ...h => 0013-ItemFactory-getMonsterEgg.patch} | 0 ...14-PlayerSetSpawnerTypeWithEggEvent.patch} | 0 ...ch => 0015-EMC-MonsterEggSpawnEvent.patch} | 0 ...ch => 0016-Player-invulnerabilities.patch} | 24 +- ...6-Anvil-API.patch => 0017-Anvil-API.patch} | 0 ...8-Configurable-villager-brain-ticks.patch} | 20 +- ...0019-Alternative-Keepalive-Handling.patch} | 8 +- ...s.patch => 0020-Silk-touch-spawners.patch} | 8 +- ...72-Fix-Add-turtle-egg-block-options.patch} | 19 +- ...-vanilla-command-permission-handler.patch} | 0 ...settings-suppressing-pointless-logs.patch} | 4 +- ...> 0024-Disable-outdated-build-check.patch} | 0 ...gs.patch => 0025-Giants-AI-settings.patch} | 22 +- ...tch => 0026-Illusioners-AI-settings.patch} | 20 +- ...> 0027-Zombie-horse-naturally-spawn.patch} | 24 +- ...028-Charged-creeper-naturally-spawn.patch} | 22 +- ...it-naturally-spawn-toast-and-killer.patch} | 22 +- ...er-showing-in-ping-before-server-fu.patch} | 0 .../server/0030-Make-Iron-Golems-Swim.patch | 42 - ...031-Dont-send-useless-entity-packets.patch | 4 +- .../server/0032-Tulips-change-fox-type.patch | 22 +- .../server/0033-Breedable-Polar-Bears.patch | 20 +- .../server/0034-Chickens-can-retaliate.patch | 22 +- .../server/0036-Cat-spawning-options.patch | 20 +- patches/server/0038-Cows-eat-mushrooms.patch | 30 +- .../server/0040-Pigs-give-saddle-back.patch | 22 +- ...41-Snowman-drop-and-put-back-pumpkin.patch | 23 +- ...42-Ender-dragon-always-drop-full-exp.patch | 23 +- .../0043-Signs-editable-on-right-click.patch | 8 +- .../server/0044-Signs-allow-color-codes.patch | 10 +- ...-Minecart-settings-and-WASD-controls.patch | 23 +- ...able-loot-drops-on-death-by-cramming.patch | 14 +- ...048-Players-should-not-cram-to-death.patch | 4 +- ...ption-to-toggle-milk-curing-bad-omen.patch | 6 +- ...-skeleton-takes-wither-damage-option.patch | 22 +- .../0055-Configurable-TPS-Catchup.patch | 6 +- ...low-loyalty-on-tridents-to-work-in-t.patch | 6 +- ...derman-and-creeper-griefing-controls.patch | 34 +- ...up-loot-bypass-mob-griefing-gamerule.patch | 8 +- ...ing-can-bypass-mob-griefing-gamerule.patch | 10 +- ...0060-Villagers-follow-emerald-blocks.patch | 29 +- .../0061-Allow-leashing-villagers.patch | 39 +- ...urable-search-radius-for-villagers-t.patch | 15 +- ...Add-player-death-exp-control-options.patch | 20 +- ...urable-void-damage-height-and-damage.patch | 10 +- ...ispenser-curse-of-binding-protection.patch | 6 +- ...n-for-boats-to-eject-players-on-land.patch | 8 +- ...g-mends-most-damages-equipment-first.patch | 8 +- .../0071-Implement-elytra-settings.patch | 14 +- .../server/0072-Item-entity-immunities.patch | 12 +- patches/server/0073-Add-ping-command.patch | 9 +- .../0074-Configurable-jockey-options.patch | 83 +- 85 files changed, 2625 insertions(+), 489 deletions(-) rename patches/api/{0021-Ridables.patch => 0004-Ridables.patch} (90%) rename patches/api/{0004-Allow-inventory-resizing.patch => 0005-Allow-inventory-resizing.patch} (100%) rename patches/api/{0005-Advancement-API.patch => 0006-Advancement-API.patch} (100%) rename patches/api/{0006-Llama-API.patch => 0007-Llama-API.patch} (100%) rename patches/api/{0007-AFK-API.patch => 0008-AFK-API.patch} (100%) rename patches/api/{0008-Bring-back-server-name.patch => 0009-Bring-back-server-name.patch} (100%) rename patches/api/{0009-ExecuteCommandEvent.patch => 0010-ExecuteCommandEvent.patch} (100%) rename patches/api/{0010-LivingEntity-safeFallDistance.patch => 0011-LivingEntity-safeFallDistance.patch} (100%) rename patches/api/{0011-Lagging-threshold.patch => 0012-Lagging-threshold.patch} (100%) rename patches/api/{0012-ItemFactory-getMonsterEgg.patch => 0013-ItemFactory-getMonsterEgg.patch} (100%) rename patches/api/{0013-PlayerSetSpawnerTypeWithEggEvent.patch => 0014-PlayerSetSpawnerTypeWithEggEvent.patch} (100%) rename patches/api/{0014-EMC-MonsterEggSpawnEvent.patch => 0015-EMC-MonsterEggSpawnEvent.patch} (100%) rename patches/api/{0015-Villager-resetOffers.patch => 0016-Villager-resetOffers.patch} (100%) rename patches/api/{0016-Player-invulnerabilities.patch => 0017-Player-invulnerabilities.patch} (100%) rename patches/api/{0017-Anvil-API.patch => 0018-Anvil-API.patch} (100%) rename patches/api/{0018-ItemStack-convenience-methods.patch => 0019-ItemStack-convenience-methods.patch} (100%) rename patches/api/{0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch => 0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch} (55%) rename patches/api/{0020-ChatColor-conveniences.patch => 0021-ChatColor-conveniences.patch} (100%) rename patches/server-unmapped/{0101-Ridables.patch => 0001-Ridables.patch} (100%) rename patches/server-unmapped/{0147-Configurable-entity-base-attributes.patch => 0002-Configurable-entity-base-attributes.patch} (100%) create mode 100644 patches/server/0003-Ridables.patch rename patches/server/{0003-Timings-stuff.patch => 0004-Timings-stuff.patch} (92%) rename patches/server/{0004-Barrels-and-enderchests-6-rows.patch => 0005-Barrels-and-enderchests-6-rows.patch} (98%) rename patches/server/{0005-Advancement-API.patch => 0006-Advancement-API.patch} (100%) rename patches/server/{0006-Llama-API.patch => 0007-Llama-API.patch} (100%) rename patches/server/{0007-AFK-API.patch => 0008-AFK-API.patch} (90%) rename patches/server/{0008-Bring-back-server-name.patch => 0009-Bring-back-server-name.patch} (100%) rename patches/server/{0009-Configurable-server-mod-name.patch => 0010-Configurable-server-mod-name.patch} (78%) rename patches/server/{0010-LivingEntity-safeFallDistance.patch => 0011-LivingEntity-safeFallDistance.patch} (97%) rename patches/server/{0011-Lagging-threshold.patch => 0012-Lagging-threshold.patch} (92%) rename patches/server/{0012-ItemFactory-getMonsterEgg.patch => 0013-ItemFactory-getMonsterEgg.patch} (100%) rename patches/server/{0013-PlayerSetSpawnerTypeWithEggEvent.patch => 0014-PlayerSetSpawnerTypeWithEggEvent.patch} (100%) rename patches/server/{0014-EMC-MonsterEggSpawnEvent.patch => 0015-EMC-MonsterEggSpawnEvent.patch} (100%) rename patches/server/{0015-Player-invulnerabilities.patch => 0016-Player-invulnerabilities.patch} (88%) rename patches/server/{0016-Anvil-API.patch => 0017-Anvil-API.patch} (100%) rename patches/server/{0017-Configurable-villager-brain-ticks.patch => 0018-Configurable-villager-brain-ticks.patch} (84%) rename patches/server/{0018-Alternative-Keepalive-Handling.patch => 0019-Alternative-Keepalive-Handling.patch} (93%) rename patches/server/{0019-Silk-touch-spawners.patch => 0020-Silk-touch-spawners.patch} (97%) rename patches/server/{0020-MC-168772-Fix-Add-turtle-egg-block-options.patch => 0021-MC-168772-Fix-Add-turtle-egg-block-options.patch} (87%) rename patches/server/{0021-Fix-vanilla-command-permission-handler.patch => 0022-Fix-vanilla-command-permission-handler.patch} (100%) rename patches/server/{0022-Logger-settings-suppressing-pointless-logs.patch => 0023-Logger-settings-suppressing-pointless-logs.patch} (95%) rename patches/server/{0023-Disable-outdated-build-check.patch => 0024-Disable-outdated-build-check.patch} (100%) rename patches/server/{0024-Giants-AI-settings.patch => 0025-Giants-AI-settings.patch} (93%) rename patches/server/{0025-Illusioners-AI-settings.patch => 0026-Illusioners-AI-settings.patch} (80%) rename patches/server/{0026-Zombie-horse-naturally-spawn.patch => 0027-Zombie-horse-naturally-spawn.patch} (81%) rename patches/server/{0027-Charged-creeper-naturally-spawn.patch => 0028-Charged-creeper-naturally-spawn.patch} (86%) rename patches/server/{0028-Rabbit-naturally-spawn-toast-and-killer.patch => 0029-Rabbit-naturally-spawn-toast-and-killer.patch} (78%) rename patches/server/{0029-Fix-outdated-server-showing-in-ping-before-server-fu.patch => 0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch} (100%) delete mode 100644 patches/server/0030-Make-Iron-Golems-Swim.patch diff --git a/patches/api/0021-Ridables.patch b/patches/api/0004-Ridables.patch similarity index 90% rename from patches/api/0021-Ridables.patch rename to patches/api/0004-Ridables.patch index 357897fe3..73cdfb519 100644 --- a/patches/api/0021-Ridables.patch +++ b/patches/api/0004-Ridables.patch @@ -5,18 +5,21 @@ Subject: [PATCH] Ridables diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index b88097f6a82e3ddf7e6db4b362bc810cf14d25b9..e1e5e6f24a0d7578625a06c080c5a6076a97be71 100644 +index 659193fc0596084031c09aa47fbb428a93d052e8..e1f871812e563605e31837159f129d69e05b868f 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -198,6 +198,8 @@ public interface VanillaGoal extends Goal { - // Purpur start - GoalKey FIND_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal_goal")); - GoalKey ORBIT_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal_goal")); -+ GoalKey HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); -+ GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); - // Purpur end +@@ -196,6 +196,11 @@ public interface VanillaGoal extends Goal { + GoalKey RAIDER_CELEBRATION = GoalKey.of(Raider.class, NamespacedKey.minecraft("raider_celebration")); + GoalKey RAIDER_MOVE_THROUGH_VILLAGE = GoalKey.of(Raider.class, NamespacedKey.minecraft("raider_move_through_village")); ++ // Purpur start ++ GoalKey MOB_HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); ++ GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); ++ // Purpur end ++ /** + * @deprecated removed in 1.16 + */ diff --git a/src/main/java/net/pl3x/purpur/event/entity/RidableMoveEvent.java b/src/main/java/net/pl3x/purpur/event/entity/RidableMoveEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..48e7ac392fe5efac8a4ce549e31a05ed817417e4 diff --git a/patches/api/0004-Allow-inventory-resizing.patch b/patches/api/0005-Allow-inventory-resizing.patch similarity index 100% rename from patches/api/0004-Allow-inventory-resizing.patch rename to patches/api/0005-Allow-inventory-resizing.patch diff --git a/patches/api/0005-Advancement-API.patch b/patches/api/0006-Advancement-API.patch similarity index 100% rename from patches/api/0005-Advancement-API.patch rename to patches/api/0006-Advancement-API.patch diff --git a/patches/api/0006-Llama-API.patch b/patches/api/0007-Llama-API.patch similarity index 100% rename from patches/api/0006-Llama-API.patch rename to patches/api/0007-Llama-API.patch diff --git a/patches/api/0007-AFK-API.patch b/patches/api/0008-AFK-API.patch similarity index 100% rename from patches/api/0007-AFK-API.patch rename to patches/api/0008-AFK-API.patch diff --git a/patches/api/0008-Bring-back-server-name.patch b/patches/api/0009-Bring-back-server-name.patch similarity index 100% rename from patches/api/0008-Bring-back-server-name.patch rename to patches/api/0009-Bring-back-server-name.patch diff --git a/patches/api/0009-ExecuteCommandEvent.patch b/patches/api/0010-ExecuteCommandEvent.patch similarity index 100% rename from patches/api/0009-ExecuteCommandEvent.patch rename to patches/api/0010-ExecuteCommandEvent.patch diff --git a/patches/api/0010-LivingEntity-safeFallDistance.patch b/patches/api/0011-LivingEntity-safeFallDistance.patch similarity index 100% rename from patches/api/0010-LivingEntity-safeFallDistance.patch rename to patches/api/0011-LivingEntity-safeFallDistance.patch diff --git a/patches/api/0011-Lagging-threshold.patch b/patches/api/0012-Lagging-threshold.patch similarity index 100% rename from patches/api/0011-Lagging-threshold.patch rename to patches/api/0012-Lagging-threshold.patch diff --git a/patches/api/0012-ItemFactory-getMonsterEgg.patch b/patches/api/0013-ItemFactory-getMonsterEgg.patch similarity index 100% rename from patches/api/0012-ItemFactory-getMonsterEgg.patch rename to patches/api/0013-ItemFactory-getMonsterEgg.patch diff --git a/patches/api/0013-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/api/0014-PlayerSetSpawnerTypeWithEggEvent.patch similarity index 100% rename from patches/api/0013-PlayerSetSpawnerTypeWithEggEvent.patch rename to patches/api/0014-PlayerSetSpawnerTypeWithEggEvent.patch diff --git a/patches/api/0014-EMC-MonsterEggSpawnEvent.patch b/patches/api/0015-EMC-MonsterEggSpawnEvent.patch similarity index 100% rename from patches/api/0014-EMC-MonsterEggSpawnEvent.patch rename to patches/api/0015-EMC-MonsterEggSpawnEvent.patch diff --git a/patches/api/0015-Villager-resetOffers.patch b/patches/api/0016-Villager-resetOffers.patch similarity index 100% rename from patches/api/0015-Villager-resetOffers.patch rename to patches/api/0016-Villager-resetOffers.patch diff --git a/patches/api/0016-Player-invulnerabilities.patch b/patches/api/0017-Player-invulnerabilities.patch similarity index 100% rename from patches/api/0016-Player-invulnerabilities.patch rename to patches/api/0017-Player-invulnerabilities.patch diff --git a/patches/api/0017-Anvil-API.patch b/patches/api/0018-Anvil-API.patch similarity index 100% rename from patches/api/0017-Anvil-API.patch rename to patches/api/0018-Anvil-API.patch diff --git a/patches/api/0018-ItemStack-convenience-methods.patch b/patches/api/0019-ItemStack-convenience-methods.patch similarity index 100% rename from patches/api/0018-ItemStack-convenience-methods.patch rename to patches/api/0019-ItemStack-convenience-methods.patch diff --git a/patches/api/0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 55% rename from patches/api/0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index 653df2cd9..3bc839ad6 100644 --- a/patches/api/0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -5,17 +5,15 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 659193fc0596084031c09aa47fbb428a93d052e8..b88097f6a82e3ddf7e6db4b362bc810cf14d25b9 100644 +index e1f871812e563605e31837159f129d69e05b868f..91262be391b9bf7067bdf257fc385f0b70747182 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -195,6 +195,10 @@ public interface VanillaGoal extends Goal { - GoalKey OBTAIN_RAID_LEADER_BANNER = GoalKey.of(Raider.class, NamespacedKey.minecraft("obtain_raid_leader_banner")); - GoalKey RAIDER_CELEBRATION = GoalKey.of(Raider.class, NamespacedKey.minecraft("raider_celebration")); - GoalKey RAIDER_MOVE_THROUGH_VILLAGE = GoalKey.of(Raider.class, NamespacedKey.minecraft("raider_move_through_village")); -+ // Purpur start +@@ -199,6 +199,8 @@ public interface VanillaGoal extends Goal { + // Purpur start + GoalKey MOB_HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); + GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); + GoalKey FIND_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal_goal")); + GoalKey ORBIT_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal_goal")); -+ // Purpur end + // Purpur end /** - * @deprecated removed in 1.16 diff --git a/patches/api/0020-ChatColor-conveniences.patch b/patches/api/0021-ChatColor-conveniences.patch similarity index 100% rename from patches/api/0020-ChatColor-conveniences.patch rename to patches/api/0021-ChatColor-conveniences.patch diff --git a/patches/api/0026-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/api/0026-Add-option-to-disable-zombie-aggressiveness-towards-.patch index fdc430aec..4294f9d0b 100644 --- a/patches/api/0026-Add-option-to-disable-zombie-aggressiveness-towards-.patch +++ b/patches/api/0026-Add-option-to-disable-zombie-aggressiveness-towards-.patch @@ -6,13 +6,13 @@ Subject: [PATCH] Add option to disable zombie aggressiveness towards villagers diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index e1e5e6f24a0d7578625a06c080c5a6076a97be71..7728488e32bce6780f604d8f74f714853f2079a2 100644 +index 91262be391b9bf7067bdf257fc385f0b70747182..569ffabc5c092217cd7ff69e8089654624bb9045 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -200,6 +200,8 @@ public interface VanillaGoal extends Goal { - GoalKey ORBIT_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal_goal")); - GoalKey HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); +@@ -201,6 +201,8 @@ public interface VanillaGoal extends Goal { GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); + GoalKey FIND_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal_goal")); + GoalKey ORBIT_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal_goal")); + GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); + GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); // Purpur end diff --git a/patches/api/0031-Rabid-Wolf-API.patch b/patches/api/0031-Rabid-Wolf-API.patch index 9cf95978b..9444ce65d 100644 --- a/patches/api/0031-Rabid-Wolf-API.patch +++ b/patches/api/0031-Rabid-Wolf-API.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Rabid Wolf API diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 7728488e32bce6780f604d8f74f714853f2079a2..71139ef4251ea8c5954445d9476625c57165462b 100644 +index 569ffabc5c092217cd7ff69e8089654624bb9045..e17b9d08c9ed9f7fd7e11b6461b9c5f0d04556a8 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -202,6 +202,7 @@ public interface VanillaGoal extends Goal { - GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); +@@ -203,6 +203,7 @@ public interface VanillaGoal extends Goal { + GoalKey ORBIT_CRYSTAL_GOAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal_goal")); GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); + GoalKey AVOID_RABID_WOLVES = GoalKey.of(Wolf.class, NamespacedKey.minecraft("avoid_rabid_wolves")); diff --git a/patches/api/0040-Iron-golem-poppy-calms-anger.patch b/patches/api/0040-Iron-golem-poppy-calms-anger.patch index eceede67b..2d172aa5a 100644 --- a/patches/api/0040-Iron-golem-poppy-calms-anger.patch +++ b/patches/api/0040-Iron-golem-poppy-calms-anger.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Iron golem poppy calms anger diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 71139ef4251ea8c5954445d9476625c57165462b..e5a8247d4c1c6e16f99f670552b9cf1f490b50ce 100644 +index e17b9d08c9ed9f7fd7e11b6461b9c5f0d04556a8..1c691750265a31f05e877d5f62c29f01117930b9 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -203,6 +203,7 @@ public interface VanillaGoal extends Goal { +@@ -204,6 +204,7 @@ public interface VanillaGoal extends Goal { GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); GoalKey AVOID_RABID_WOLVES = GoalKey.of(Wolf.class, NamespacedKey.minecraft("avoid_rabid_wolves")); diff --git a/patches/server-unmapped/0101-Ridables.patch b/patches/server-unmapped/0001-Ridables.patch similarity index 100% rename from patches/server-unmapped/0101-Ridables.patch rename to patches/server-unmapped/0001-Ridables.patch diff --git a/patches/server-unmapped/0147-Configurable-entity-base-attributes.patch b/patches/server-unmapped/0002-Configurable-entity-base-attributes.patch similarity index 100% rename from patches/server-unmapped/0147-Configurable-entity-base-attributes.patch rename to patches/server-unmapped/0002-Configurable-entity-base-attributes.patch diff --git a/patches/server/0003-Ridables.patch b/patches/server/0003-Ridables.patch new file mode 100644 index 000000000..9f1a846a4 --- /dev/null +++ b/patches/server/0003-Ridables.patch @@ -0,0 +1,2155 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Tue, 15 Jun 2021 18:57:52 -0500 +Subject: [PATCH] Ridables + + +diff --git a/src/main/java/net/minecraft/core/BlockPos.java b/src/main/java/net/minecraft/core/BlockPos.java +index 22ea0da3836b61bb018ae974d2b8c7546b9528d6..dea8abfd8443702e138823bd536aaac2c3395d6f 100644 +--- a/src/main/java/net/minecraft/core/BlockPos.java ++++ b/src/main/java/net/minecraft/core/BlockPos.java +@@ -41,6 +41,12 @@ public class BlockPos extends Vec3i { + private static final int X_OFFSET = 38; + // Paper end + ++ // Purpur start ++ public BlockPos(net.minecraft.world.entity.Entity entity) { ++ super(entity.getX(), entity.getY(), entity.getZ()); ++ } ++ // Purpur end ++ + public BlockPos(int x, int y, int z) { + super(x, y, z); + } +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index f40e6ae2a1a3c9c76071a60a3bdfb4762ab68deb..2ff3c3f64a61e152262e82a1c33a474bbe4e9c5c 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -1515,6 +1515,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper + worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper ++ worldserver.hasRidableMoveEvent = net.pl3x.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur + net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig.disableHopperMoveEvents || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper + + this.profiler.push(() -> { +diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java +index fe6d8b93f5685b611f1f2fe6ac28a0b718e198cc..900b30c9ba0d7b9e0b19c23c1eb5b75dbf2d7141 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -201,6 +201,7 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl + public final UUID uuid; + public boolean hasPhysicsEvent = true; // Paper + public boolean hasEntityMoveEvent = false; // Paper ++ public boolean hasRidableMoveEvent = false; // Purpur + public static Throwable getAddToWorldStackTrace(Entity entity) { + return new Throwable(entity + " Added to world at " + new java.util.Date()); + } +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index b4055c6de62c22ba8ee8384884f9b3fd62eddeb8..84c0c68e327d73e782cd451fc0d209a8b4287b2e 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -662,6 +662,15 @@ public class ServerPlayer extends Player { + } + + this.advancements.flushDirty(this); ++ ++ // Purpur start ++ if (this.level.purpurConfig.useNightVisionWhenRiding && this.getVehicle() != null && this.getVehicle().getRider() == this && this.level.getGameTime() % 100 == 0) { // 5 seconds ++ MobEffectInstance nightVision = this.getEffect(MobEffects.NIGHT_VISION); ++ if (nightVision == null || nightVision.getDuration() <= 300) { // 15 seconds ++ this.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 400, 0)); // 20 seconds ++ } ++ } ++ // Purpur end + } + + public void doTick() { +@@ -2366,4 +2375,6 @@ public class ServerPlayer extends Player { + return (CraftPlayer) super.getBukkitEntity(); + } + // CraftBukkit end ++ ++ + } +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 40d0dac02bb1922483d68f3cdd09a228f66d09f6..8e585ea6a070b2339cf396d70224a0d3791abe1f 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -2350,6 +2350,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + + ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); + ++ player.processClick(enumhand); // Purpur ++ + // Fish bucket - SPIGOT-4048 + if ((entity instanceof AbstractFish && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { + ServerGamePacketListenerImpl.this.send(new ClientboundAddMobPacket((AbstractFish) entity)); +diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java +index aaaf5d49972ab608473637dc884dd0c802deaae0..3e2e3038bfe830a50edfee81bc4aa454a42538ec 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -230,7 +230,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n + public float yRotO; + public float xRotO; + private AABB bb; +- protected boolean onGround; ++ public boolean onGround; // Purpur - protected -> public + public boolean horizontalCollision; + public boolean verticalCollision; + public boolean hurtMarked; +@@ -2408,6 +2408,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n + this.passengers = ImmutableList.copyOf(list); + } + ++ // Purpur start ++ if (isRidable() && this.passengers.get(0) == entity && entity instanceof Player player) { ++ onMount(player); ++ this.rider = player; ++ } ++ // Purpur end + } + return true; // CraftBukkit + } +@@ -2448,6 +2454,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n + return false; + } + // Spigot end ++ ++ // Purpur start ++ if (this.rider != null && this.passengers.get(0) == this.rider) { ++ onDismount(this.rider); ++ this.rider = null; ++ } ++ // Purpur end ++ + if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { + this.passengers = ImmutableList.of(); + } else { +@@ -3374,6 +3388,29 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n + return SlotAccess.NULL; + } + ++ // Purpur Start ++ public void sendMessage(@Nullable String message) { ++ if (message == null) { ++ return; ++ } ++ sendMessage(net.kyori.adventure.text.minimessage.MiniMessage.get().parse(message)); ++ } ++ ++ public void sendMessage(@Nullable net.kyori.adventure.text.Component message) { ++ if (message == null) { ++ return; ++ } ++ sendMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(message)); ++ } ++ ++ public void sendMessage(@Nullable Component message) { ++ if (message == null) { ++ return; ++ } ++ sendMessage(message, Util.NIL_UUID); ++ } ++ // Purpur end ++ + @Override + public void sendMessage(Component message, UUID sender) {} + +@@ -3985,4 +4022,41 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n + return ((ServerChunkCache) level.getChunkSource()).isPositionTicking(this); + } + // Paper end ++ ++ // Purpur start ++ @Nullable ++ private Player rider = null; ++ ++ @Nullable ++ public Player getRider() { ++ return rider; ++ } ++ ++ public boolean isRidable() { ++ return false; ++ } ++ ++ public void onMount(Player player) { ++ if (this instanceof Mob) { ++ ((Mob) this).setGoalTarget(null, null, false); ++ ((Mob) this).getNavigation().stopPathfinding(); ++ } ++ player.setJumping(false); // fixes jump on mount ++ } ++ ++ public void onDismount(Player player) { ++ } ++ ++ public boolean onSpacebar() { ++ return false; ++ } ++ ++ public boolean onClick(InteractionHand hand) { ++ return false; ++ } ++ ++ public boolean processClick(InteractionHand hand) { ++ return false; ++ } ++ // Purpur end + } +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index 58b36ed797476f3cec78529e09e913ebb791c5e3..e733c1e8f0b180bf1508e4f004124d44407f6c07 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -220,9 +220,9 @@ public abstract class LivingEntity extends Entity { + protected int deathScore; + public float lastHurt; + public boolean jumping; +- public float xxa; +- public float yya; +- public float zza; ++ public float xxa; public float getStrafeMot() { return xxa; } public void setStrafeMot(float strafe) { xxa = strafe; } // Purpur - OBFHELPER ++ public float yya; public float getVerticalMot() { return yya; } public void setVerticalMot(float vertical) { yya = vertical; } // Purpur - OBFHELPER ++ public float zza; public float getForwardMot() { return zza; } public void setForwardMot(float forward) { zza = forward; } // Purpur - OBFHELPER + protected int lerpSteps; + protected double lerpX; + protected double lerpY; +@@ -2559,7 +2559,7 @@ public abstract class LivingEntity extends Entity { + return 0.42F * this.getBlockJumpFactor(); + } + +- protected void jumpFromGround() { ++ public void jumpFromGround() { // Purpur - protected -> public + float f = this.getJumpPower(); + + if (this.hasEffect(MobEffects.JUMP)) { +@@ -3218,8 +3218,10 @@ public abstract class LivingEntity extends Entity { + this.pushEntities(); + this.level.getProfiler().pop(); + // Paper start +- if (((ServerLevel) this.level).hasEntityMoveEvent) { +- if (this.xo != getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { ++ // Purpur start ++ if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { ++ if (((ServerLevel) level).hasEntityMoveEvent) { ++ // Purpur end + Location from = new Location(this.level.getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); + Location to = new Location (this.level.getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); + io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone()); +@@ -3229,6 +3231,21 @@ public abstract class LivingEntity extends Entity { + absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); + } + } ++ // Purpur start ++ if (getRider() != null) { ++ getRider().resetLastActionTime(); ++ if (((ServerLevel) level).hasRidableMoveEvent && this instanceof Mob) { ++ Location from = new Location(level.getWorld(), xo, yo, zo, this.yRotO, this.xRotO); ++ Location to = new Location(level.getWorld(), getX(), getY(), getZ(), this.getYRot(), this.getXRot()); ++ net.pl3x.purpur.event.entity.RidableMoveEvent event = new net.pl3x.purpur.event.entity.RidableMoveEvent((org.bukkit.entity.Mob) getBukkitLivingEntity(), (Player) getRider().getBukkitEntity(), from, to.clone()); ++ if (!event.callEvent()) { ++ absMoveTo(from.getX(), from.getY(), from.getZ(), from.getYaw(), from.getPitch()); ++ } else if (!to.equals(event.getTo())) { ++ absMoveTo(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch()); ++ } ++ } ++ } ++ // Purpur end + } + // Paper end + if (!this.level.isClientSide && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) { +diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java +index ecd6ce01f541a2885384dac47095422b86e194fa..9438a6dfee9e3a2a4b781eff63332386fb7d6b13 100644 +--- a/src/main/java/net/minecraft/world/entity/Mob.java ++++ b/src/main/java/net/minecraft/world/entity/Mob.java +@@ -139,6 +139,8 @@ public abstract class Mob extends LivingEntity { + this.targetSelector = new GoalSelector(world.getProfilerSupplier()); + this.lookControl = new LookControl(this); + this.moveControl = new MoveControl(this); ++ this.lookControl = new net.pl3x.purpur.controller.LookControllerWASD(this); // Purpur ++ this.moveControl = new net.pl3x.purpur.controller.MoveControllerWASD(this); // Purpur + this.jumpControl = new JumpControl(this); + this.bodyRotationControl = this.createBodyControl(); + this.navigation = this.createNavigation(world); +@@ -1273,7 +1275,7 @@ public abstract class Mob extends LivingEntity { + protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} + + protected InteractionResult mobInteract(Player player, InteractionHand hand) { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur + } + + public boolean isWithinRestriction() { +@@ -1632,4 +1634,52 @@ public abstract class Mob extends LivingEntity { + + return itemmonsteregg == null ? null : new ItemStack(itemmonsteregg); + } ++ ++ // Purpur start ++ public double getMaxY() { ++ return level.getHeight(); ++ } ++ ++ public InteractionResult tryRide(Player player, InteractionHand hand) { ++ if (!isRidable()) { ++ return InteractionResult.PASS; ++ } ++ if (hand != InteractionHand.MAIN_HAND) { ++ return InteractionResult.PASS; ++ } ++ if (player.isShiftKeyDown()) { ++ return InteractionResult.PASS; ++ } ++ if (!player.getItemInHand(hand).isEmpty()) { ++ return InteractionResult.PASS; ++ } ++ if (!passengers.isEmpty() || player.isPassenger()) { ++ return InteractionResult.PASS; ++ } ++ if (this instanceof TamableAnimal tamable) { ++ if (tamable.isTame() && !tamable.isOwnedBy(player)) { ++ return InteractionResult.PASS; ++ } ++ if (!tamable.isTame() && !level.purpurConfig.untamedTamablesAreRidable) { ++ return InteractionResult.PASS; ++ } ++ } ++ if (this instanceof AgeableMob ageable) { ++ if (ageable.isBaby() && !level.purpurConfig.babiesAreRidable) { ++ return InteractionResult.PASS; ++ } ++ } ++ if (!player.getBukkitEntity().hasPermission("allow.ride." + getType().id)) { ++ player.sendMessage(net.pl3x.purpur.PurpurConfig.cannotRideMob); ++ return InteractionResult.PASS; ++ } ++ player.setYRot(this.getYRot()); ++ player.setXRot(this.getXRot()); ++ if (player.startRiding(this)) { ++ return InteractionResult.SUCCESS; ++ } else { ++ return InteractionResult.PASS; ++ } ++ } ++ // Purpur end + } +diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +index b1e00093ad2b42a1e0a399d261539e06f2a505b9..d588bdf546da77f37ec1f40e12dcfeb9e7d37002 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java ++++ b/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +@@ -74,7 +74,86 @@ import org.apache.logging.log4j.Logger; + + public class DefaultAttributes { + private static final Logger LOGGER = LogManager.getLogger(); +- private static final Map, AttributeSupplier> SUPPLIERS = ImmutableMap., AttributeSupplier>builder().put(EntityType.ARMOR_STAND, LivingEntity.createLivingAttributes().build()).put(EntityType.AXOLOTL, Axolotl.createAttributes().build()).put(EntityType.BAT, Bat.createAttributes().build()).put(EntityType.BEE, Bee.createAttributes().build()).put(EntityType.BLAZE, Blaze.createAttributes().build()).put(EntityType.CAT, Cat.createAttributes().build()).put(EntityType.CAVE_SPIDER, CaveSpider.createCaveSpider().build()).put(EntityType.CHICKEN, Chicken.createAttributes().build()).put(EntityType.COD, AbstractFish.createAttributes().build()).put(EntityType.COW, Cow.createAttributes().build()).put(EntityType.CREEPER, Creeper.createAttributes().build()).put(EntityType.DOLPHIN, Dolphin.createAttributes().build()).put(EntityType.DONKEY, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.DROWNED, Zombie.createAttributes().build()).put(EntityType.ELDER_GUARDIAN, ElderGuardian.createAttributes().build()).put(EntityType.ENDERMAN, EnderMan.createAttributes().build()).put(EntityType.ENDERMITE, Endermite.createAttributes().build()).put(EntityType.ENDER_DRAGON, EnderDragon.createAttributes().build()).put(EntityType.EVOKER, Evoker.createAttributes().build()).put(EntityType.FOX, Fox.createAttributes().build()).put(EntityType.GHAST, Ghast.createAttributes().build()).put(EntityType.GIANT, Giant.createAttributes().build()).put(EntityType.GLOW_SQUID, GlowSquid.createAttributes().build()).put(EntityType.GOAT, Goat.createAttributes().build()).put(EntityType.GUARDIAN, Guardian.createAttributes().build()).put(EntityType.HOGLIN, Hoglin.createAttributes().build()).put(EntityType.HORSE, AbstractHorse.createBaseHorseAttributes().build()).put(EntityType.HUSK, Zombie.createAttributes().build()).put(EntityType.ILLUSIONER, Illusioner.createAttributes().build()).put(EntityType.IRON_GOLEM, IronGolem.createAttributes().build()).put(EntityType.LLAMA, Llama.createAttributes().build()).put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()).put(EntityType.MOOSHROOM, Cow.createAttributes().build()).put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()).put(EntityType.OCELOT, Ocelot.createAttributes().build()).put(EntityType.PANDA, Panda.createAttributes().build()).put(EntityType.PARROT, Parrot.createAttributes().build()).put(EntityType.PHANTOM, Monster.createMonsterAttributes().build()).put(EntityType.PIG, Pig.createAttributes().build()).put(EntityType.PIGLIN, Piglin.createAttributes().build()).put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()).put(EntityType.PILLAGER, Pillager.createAttributes().build()).put(EntityType.PLAYER, Player.createAttributes().build()).put(EntityType.POLAR_BEAR, PolarBear.createAttributes().build()).put(EntityType.PUFFERFISH, AbstractFish.createAttributes().build()).put(EntityType.RABBIT, Rabbit.createAttributes().build()).put(EntityType.RAVAGER, Ravager.createAttributes().build()).put(EntityType.SALMON, AbstractFish.createAttributes().build()).put(EntityType.SHEEP, Sheep.createAttributes().build()).put(EntityType.SHULKER, Shulker.createAttributes().build()).put(EntityType.SILVERFISH, Silverfish.createAttributes().build()).put(EntityType.SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.SKELETON_HORSE, SkeletonHorse.createAttributes().build()).put(EntityType.SLIME, Monster.createMonsterAttributes().build()).put(EntityType.SNOW_GOLEM, SnowGolem.createAttributes().build()).put(EntityType.SPIDER, Spider.createAttributes().build()).put(EntityType.SQUID, Squid.createAttributes().build()).put(EntityType.STRAY, AbstractSkeleton.createAttributes().build()).put(EntityType.STRIDER, Strider.createAttributes().build()).put(EntityType.TRADER_LLAMA, Llama.createAttributes().build()).put(EntityType.TROPICAL_FISH, AbstractFish.createAttributes().build()).put(EntityType.TURTLE, Turtle.createAttributes().build()).put(EntityType.VEX, Vex.createAttributes().build()).put(EntityType.VILLAGER, Villager.createAttributes().build()).put(EntityType.VINDICATOR, Vindicator.createAttributes().build()).put(EntityType.WANDERING_TRADER, Mob.createMobAttributes().build()).put(EntityType.WITCH, Witch.createAttributes().build()).put(EntityType.WITHER, WitherBoss.createAttributes().build()).put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build()).put(EntityType.WOLF, Wolf.createAttributes().build()).put(EntityType.ZOGLIN, Zoglin.createAttributes().build()).put(EntityType.ZOMBIE, Zombie.createAttributes().build()).put(EntityType.ZOMBIE_HORSE, ZombieHorse.createAttributes().build()).put(EntityType.ZOMBIE_VILLAGER, Zombie.createAttributes().build()).put(EntityType.ZOMBIFIED_PIGLIN, ZombifiedPiglin.createAttributes().build()).build(); ++ ++ // Purpur start ++ private static final Map, AttributeSupplier> SUPPLIERS = ImmutableMap., AttributeSupplier>builder() ++ .put(EntityType.ARMOR_STAND, LivingEntity.createLivingAttributes().build()) ++ .put(EntityType.AXOLOTL, Axolotl.createAttributes().build()) ++ .put(EntityType.BAT, Bat.createAttributes().build()) ++ .put(EntityType.BEE, Bee.createAttributes().build()) ++ .put(EntityType.BLAZE, Blaze.createAttributes().build()) ++ .put(EntityType.CAT, Cat.createAttributes().build()) ++ .put(EntityType.CAVE_SPIDER, CaveSpider.createCaveSpider().build()) ++ .put(EntityType.CHICKEN, Chicken.createAttributes().build()) ++ .put(EntityType.COD, AbstractFish.createAttributes().build()) ++ .put(EntityType.COW, Cow.createAttributes().build()) ++ .put(EntityType.CREEPER, Creeper.createAttributes().build()) ++ .put(EntityType.DOLPHIN, Dolphin.createAttributes().build()) ++ .put(EntityType.DONKEY, AbstractChestedHorse.createBaseChestedHorseAttributes().build()) ++ .put(EntityType.DROWNED, Zombie.createAttributes().build()) ++ .put(EntityType.ELDER_GUARDIAN, ElderGuardian.createAttributes().build()) ++ .put(EntityType.ENDERMAN, EnderMan.createAttributes().build()) ++ .put(EntityType.ENDERMITE, Endermite.createAttributes().build()) ++ .put(EntityType.ENDER_DRAGON, EnderDragon.createAttributes().build()) ++ .put(EntityType.EVOKER, Evoker.createAttributes().build()) ++ .put(EntityType.FOX, Fox.createAttributes().build()) ++ .put(EntityType.GHAST, Ghast.createAttributes().build()) ++ .put(EntityType.GIANT, Giant.createAttributes().build()) ++ .put(EntityType.GLOW_SQUID, GlowSquid.createAttributes().build()) ++ .put(EntityType.GOAT, Goat.createAttributes().build()) ++ .put(EntityType.GUARDIAN, Guardian.createAttributes().build()) ++ .put(EntityType.HOGLIN, Hoglin.createAttributes().build()) ++ .put(EntityType.HORSE, AbstractHorse.createBaseHorseAttributes().build()) ++ .put(EntityType.HUSK, Zombie.createAttributes().build()) ++ .put(EntityType.ILLUSIONER, Illusioner.createAttributes().build()) ++ .put(EntityType.IRON_GOLEM, IronGolem.createAttributes().build()) ++ .put(EntityType.LLAMA, Llama.createAttributes().build()) ++ .put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()) ++ .put(EntityType.MOOSHROOM, Cow.createAttributes().build()) ++ .put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()) ++ .put(EntityType.OCELOT, Ocelot.createAttributes().build()) ++ .put(EntityType.PANDA, Panda.createAttributes().build()) ++ .put(EntityType.PARROT, Parrot.createAttributes().build()) ++ .put(EntityType.PHANTOM, Monster.createMonsterAttributes().build()) ++ .put(EntityType.PIG, Pig.createAttributes().build()) ++ .put(EntityType.PIGLIN, Piglin.createAttributes().build()) ++ .put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()) ++ .put(EntityType.PILLAGER, Pillager.createAttributes().build()) ++ .put(EntityType.PLAYER, Player.createAttributes().build()) ++ .put(EntityType.POLAR_BEAR, PolarBear.createAttributes().build()) ++ .put(EntityType.PUFFERFISH, AbstractFish.createAttributes().build()) ++ .put(EntityType.RABBIT, Rabbit.createAttributes().build()) ++ .put(EntityType.RAVAGER, Ravager.createAttributes().build()) ++ .put(EntityType.SALMON, AbstractFish.createAttributes().build()) ++ .put(EntityType.SHEEP, Sheep.createAttributes().build()) ++ .put(EntityType.SHULKER, Shulker.createAttributes().build()) ++ .put(EntityType.SILVERFISH, Silverfish.createAttributes().build()) ++ .put(EntityType.SKELETON, AbstractSkeleton.createAttributes().build()) ++ .put(EntityType.SKELETON_HORSE, SkeletonHorse.createAttributes().build()) ++ .put(EntityType.SLIME, Monster.createMonsterAttributes().build()) ++ .put(EntityType.SNOW_GOLEM, SnowGolem.createAttributes().build()) ++ .put(EntityType.SPIDER, Spider.createAttributes().build()) ++ .put(EntityType.SQUID, Squid.createAttributes().build()) ++ .put(EntityType.STRAY, AbstractSkeleton.createAttributes().build()) ++ .put(EntityType.STRIDER, Strider.createAttributes().build()) ++ .put(EntityType.TRADER_LLAMA, Llama.createAttributes().build()) ++ .put(EntityType.TROPICAL_FISH, AbstractFish.createAttributes().build()) ++ .put(EntityType.TURTLE, Turtle.createAttributes().build()) ++ .put(EntityType.VEX, Vex.createAttributes().build()) ++ .put(EntityType.VILLAGER, Villager.createAttributes().build()) ++ .put(EntityType.VINDICATOR, Vindicator.createAttributes().build()) ++ .put(EntityType.WANDERING_TRADER, Mob.createMobAttributes().build()) ++ .put(EntityType.WITCH, Witch.createAttributes().build()) ++ .put(EntityType.WITHER, WitherBoss.createAttributes().build()) ++ .put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build()) ++ .put(EntityType.WOLF, Wolf.createAttributes().build()) ++ .put(EntityType.ZOGLIN, Zoglin.createAttributes().build()) ++ .put(EntityType.ZOMBIE, Zombie.createAttributes().build()) ++ .put(EntityType.ZOMBIE_HORSE, ZombieHorse.createAttributes().build()) ++ .put(EntityType.ZOMBIE_VILLAGER, Zombie.createAttributes().build()) ++ .put(EntityType.ZOMBIFIED_PIGLIN, ZombifiedPiglin.createAttributes().build()) ++ .build(); ++ // Purpur end + + public static AttributeSupplier getSupplier(EntityType type) { + return SUPPLIERS.get(type); +diff --git a/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java b/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java +index fcdebde11f622d0e35d922286b34c8666f9f6861..43e5efd136937fe215db0e88907f3176e06197d1 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java ++++ b/src/main/java/net/minecraft/world/entity/ai/control/MoveControl.java +@@ -29,6 +29,20 @@ public class MoveControl implements Control { + this.mob = entity; + } + ++ // Purpur start ++ public void setSpeedModifier(double speed) { ++ this.speedModifier = speed; ++ } ++ ++ public void setForward(float forward) { ++ this.strafeForwards = forward; ++ } ++ ++ public void setStrafe(float strafe) { ++ this.strafeRight = strafe; ++ } ++ // Purpur end ++ + public boolean hasWanted() { + return this.operation == MoveControl.Operation.MOVE_TO; + } +diff --git a/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java b/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java +index ffc87d14cdc7edc22a7e2ac642d0e37037c52487..f2957d7f4c377a67ee486a9d0f7ae173add20aed 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java ++++ b/src/main/java/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java +@@ -3,7 +3,7 @@ package net.minecraft.world.entity.ai.control; + import net.minecraft.util.Mth; + import net.minecraft.world.entity.Mob; + +-public class SmoothSwimmingLookControl extends LookControl { ++public class SmoothSwimmingLookControl extends net.pl3x.purpur.controller.LookControllerWASD { // Purpur + private final int maxYRotFromCenter; + private static final int HEAD_TILT_X = 10; + private static final int HEAD_TILT_Y = 20; +@@ -14,7 +14,7 @@ public class SmoothSwimmingLookControl extends LookControl { + } + + @Override +- public void tick() { ++ public void vanillaTick() { // Purpur + if (this.hasWanted) { + this.hasWanted = false; + this.getYRotD().ifPresent((float_) -> { +@@ -32,9 +32,9 @@ public class SmoothSwimmingLookControl extends LookControl { + } + + float f = Mth.wrapDegrees(this.mob.yHeadRot - this.mob.yBodyRot); +- if (f < (float)(-this.maxYRotFromCenter)) { ++ if (f < (float) (-this.maxYRotFromCenter)) { + this.mob.yBodyRot -= 4.0F; +- } else if (f > (float)this.maxYRotFromCenter) { ++ } else if (f > (float) this.maxYRotFromCenter) { + this.mob.yBodyRot += 4.0F; + } + +diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java +index 153194d937d210e2e4fd8864e4a3c000f85d7e2e..87c5915564487d40ba9d160b2d1dc2cd2f2c5bb5 100644 +--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java ++++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java +@@ -20,6 +20,7 @@ import net.minecraft.world.entity.EntityType; + import net.minecraft.world.entity.LivingEntity; + import net.minecraft.world.entity.Mob; + import net.minecraft.world.entity.MobSpawnType; ++import net.minecraft.world.entity.MoverType; + import net.minecraft.world.entity.Pose; + import net.minecraft.world.entity.ai.attributes.AttributeSupplier; + import net.minecraft.world.entity.ai.attributes.Attributes; +@@ -42,9 +43,48 @@ public class Bat extends AmbientCreature { + + public Bat(EntityType type, Level world) { + super(type, world); ++ this.moveControl = new net.pl3x.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.075F); // Purpur + this.setResting(true); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return level.purpurConfig.batRidable; ++ } ++ ++ @Override ++ public boolean rideableUnderWater() { ++ return level.purpurConfig.batRidableInWater; ++ } ++ ++ @Override ++ public double getMaxY() { ++ return level.purpurConfig.batMaxY; ++ } ++ ++ @Override ++ public void onMount(Player player) { ++ super.onMount(player); ++ if (isResting()) { ++ setResting(false); ++ level.levelEvent(null, 1025, new BlockPos(this).above(), 0); ++ } ++ } ++ ++ @Override ++ public void travel(Vec3 vec3) { ++ super.travel(vec3); ++ if (getRider() != null && !onGround) { ++ float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 2; ++ setSpeed(speed); ++ Vec3 mot = getDeltaMovement(); ++ move(MoverType.SELF, mot.multiply(speed, 0.25, speed)); ++ setDeltaMovement(mot.scale(0.9D)); ++ } ++ } ++ // Purpur end ++ + @Override + public boolean isFlapping() { + return !this.isResting() && this.tickCount % Bat.TICKS_PER_FLAP == 0; +@@ -94,7 +134,7 @@ public class Bat extends AmbientCreature { + protected void pushEntities() {} + + public static AttributeSupplier.Builder createAttributes() { +- return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 6.0D); ++ return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 6.0D).add(Attributes.FLYING_SPEED, 0.6D); // Purpur + } + + public boolean isResting() { +@@ -126,6 +166,14 @@ public class Bat extends AmbientCreature { + + @Override + protected void customServerAiStep() { ++ // Purpur start ++ if (getRider() != null) { ++ Vec3 mot = getDeltaMovement(); ++ setDeltaMovement(mot.x(), mot.y() + (getVerticalMot() > 0 ? 0.07D : 0.0D), mot.z()); ++ return; ++ } ++ // Purpur end ++ + super.customServerAiStep(); + BlockPos blockposition = this.blockPosition(); + BlockPos blockposition1 = blockposition.above(); +diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java +index 2639f64f1a50faddc0284fb26b73b563b3e9eba9..8632a4047776723088b9b9fa27c6e8093fb17801 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java +@@ -44,6 +44,7 @@ import net.minecraft.world.entity.EntityType; + import net.minecraft.world.entity.LivingEntity; + import net.minecraft.world.entity.Mob; + import net.minecraft.world.entity.MobType; ++import net.minecraft.world.entity.MoverType; + import net.minecraft.world.entity.NeutralMob; + import net.minecraft.world.entity.PathfinderMob; + import net.minecraft.world.entity.Pose; +@@ -143,6 +144,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + public Bee(EntityType type, Level world) { + super(type, world); + this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(this.random, 20, 60); ++ final net.pl3x.purpur.controller.FlyingMoveControllerWASD flyingController = new net.pl3x.purpur.controller.FlyingMoveControllerWASD(this, 0.25F, false); // Purpur + // Paper start - apply gravity to bees when they get stuck in the void, fixes MC-167279 + class BeeFlyingMoveControl extends FlyingMoveControl { + public BeeFlyingMoveControl(final Mob entity, final int maxPitchChange, final boolean noGravity) { +@@ -151,11 +153,24 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + + @Override + public void tick() { ++ // Purpur start ++ if (mob.getRider() != null) { ++ flyingController.purpurTick(mob.getRider()); ++ return; ++ } ++ // Purpur end + if (this.mob.getY() <= Bee.this.level.getMinBuildHeight()) { + this.mob.setNoGravity(false); + } + super.tick(); + } ++ ++ // Purpur start ++ @Override ++ public boolean hasWanted() { ++ return mob.getRider() != null || super.hasWanted(); ++ } ++ // Purpur end + } + this.moveControl = new BeeFlyingMoveControl(this, 20, true); + // Paper end +@@ -167,6 +182,35 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + this.setPathfindingMalus(BlockPathTypes.FENCE, -1.0F); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return level.purpurConfig.beeRidable; ++ } ++ ++ @Override ++ public boolean rideableUnderWater() { ++ return level.purpurConfig.beeRidableInWater; ++ } ++ ++ @Override ++ public double getMaxY() { ++ return level.purpurConfig.beeMaxY; ++ } ++ ++ @Override ++ public void travel(Vec3 vec3) { ++ super.travel(vec3); ++ if (getRider() != null && !onGround) { ++ float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 2; ++ setSpeed(speed); ++ Vec3 mot = getDeltaMovement(); ++ move(MoverType.SELF, mot.multiply(speed, speed, speed)); ++ setDeltaMovement(mot.scale(0.9D)); ++ } ++ } ++ // Purpur end ++ + @Override + protected void defineSynchedData() { + super.defineSynchedData(); +@@ -181,6 +225,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + + @Override + protected void registerGoals() { ++ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur + this.goalSelector.addGoal(0, new Bee.BeeAttackGoal(this, 1.399999976158142D, true)); + this.goalSelector.addGoal(1, new Bee.BeeEnterHiveGoal()); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); +@@ -196,6 +241,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + this.goalSelector.addGoal(7, new Bee.BeeGrowCropGoal()); + this.goalSelector.addGoal(8, new Bee.BeeWanderGoal()); + this.goalSelector.addGoal(9, new FloatGoal(this)); ++ this.targetSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur + this.targetSelector.addGoal(1, (new Bee.BeeHurtByOtherGoal(this)).setAlertOthers(new Class[0])); + this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); + this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); +@@ -871,16 +917,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + } + } + +- private class BeeLookControl extends LookControl { ++ private class BeeLookControl extends net.pl3x.purpur.controller.LookControllerWASD { // Purpur + + BeeLookControl(Mob entity) { + super(entity); + } + + @Override +- public void tick() { ++ public void vanillaTick() { // Purpur + if (!Bee.this.isAngry()) { +- super.tick(); ++ super.vanillaTick(); // Purpur + } + } + +diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java +index c9dcbc2dcb2736d0f448496c67121db29b7d4deb..1cb5342d63011605b567a4fe16d07de831f04216 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Cow.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java +@@ -40,9 +40,22 @@ public class Cow extends Animal { + super(type, world); + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return level.purpurConfig.cowRidable; ++ } ++ ++ @Override ++ public boolean rideableUnderWater() { ++ return level.purpurConfig.cowRidableInWater; ++ } ++ // Purpur end ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur + this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); +@@ -83,6 +96,7 @@ public class Cow extends Animal { + + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { ++ if (getRider() != null) return InteractionResult.PASS; // Purpur + ItemStack itemstack = player.getItemInHand(hand); + + if (itemstack.is(Items.BUCKET) && !this.isBaby()) { +@@ -90,7 +104,7 @@ public class Cow extends Animal { + org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) player.level, player, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, hand); // Paper - add enumHand + + if (event.isCancelled()) { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur + } + // CraftBukkit end + +diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +index 3a9391b512974e812cac0d89119f68ba6728bfc9..4a60afbb79ffb86d3c41b48d923ca8b3beca1c54 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +@@ -129,7 +129,7 @@ public class Rabbit extends Animal { + } + + @Override +- protected void jumpFromGround() { ++ public void jumpFromGround() { // Purpur - protected -> public + super.jumpFromGround(); + double d0 = this.moveControl.getSpeedModifier(); + +diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +index 25ebcb30cf5165675f26802983b6f68404b93b06..e076d03025690492c2226f03d777eba714819300 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java ++++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +@@ -90,6 +90,23 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { + this.maxUpStep = 1.0F; + } + ++ // Purpur start ++ @Override ++ public boolean isRidable() { ++ return level.purpurConfig.axolotlRidable; ++ } ++ ++ @Override ++ public boolean rideableUnderWater() { ++ return true; ++ } ++ ++ @Override ++ protected void registerGoals() { ++ this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur ++ } ++ // Purpur end ++ + @Override + public Map getModelRotationValues() { + return this.modelRotationValues; +@@ -513,14 +530,22 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { + private static class AxolotlMoveControl extends SmoothSwimmingMoveControl { + + private final Axolotl axolotl; ++ private final net.pl3x.purpur.controller.WaterMoveControllerWASD waterController; // Purpur + + public AxolotlMoveControl(Axolotl axolotl) { + super(axolotl, 85, 10, 0.1F, 0.5F, false); + this.axolotl = axolotl; ++ waterController = new net.pl3x.purpur.controller.WaterMoveControllerWASD(axolotl, 0.5D); // Purpur + } + + @Override + public void tick() { ++ // Purpur start ++ if (axolotl.getRider() != null) { ++ waterController.purpurTick(axolotl.getRider()); ++ return; ++ } ++ // Purpur end + if (!this.axolotl.isPlayingDead()) { + super.tick(); + } +@@ -535,9 +560,9 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { + } + + @Override +- public void tick() { ++ public void vanillaTick() { // Purpur + if (!Axolotl.this.isPlayingDead()) { +- super.tick(); ++ super.vanillaTick(); // Purpur + } + + } +diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java +index fdc01dee8a81f0376f3c0a154c4291d03ead7f8f..058f4e8729736f9650bb6b08e7aed28f9f78a89b 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Slime.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java +@@ -360,7 +360,7 @@ public class Slime extends Mob implements Enemy { + } + + @Override +- protected void jumpFromGround() { ++ public void jumpFromGround() { // Purpur - protected -> public + Vec3 vec3d = this.getDeltaMovement(); + + this.setDeltaMovement(vec3d.x, (double) this.getJumpPower(), vec3d.z); +diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java +index d286d88a3c3f93dbfa92de9421e320c92cd96350..b4ebd8d3ad90e51ed953d091610eafe558a3184f 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Player.java ++++ b/src/main/java/net/minecraft/world/entity/player/Player.java +@@ -193,6 +193,19 @@ public abstract class Player extends LivingEntity { + } + // CraftBukkit end + ++ public abstract void resetLastActionTime(); ++ ++ // Purpur start ++ @Override ++ public boolean processClick(InteractionHand hand) { ++ Entity vehicle = getRootVehicle(); ++ if (vehicle != null && vehicle.getRider() == this) { ++ return vehicle.onClick(hand); ++ } ++ return false; ++ } ++ // Purpur end ++ + public Player(Level world, BlockPos pos, float yaw, GameProfile profile) { + super(EntityType.PLAYER, world); + this.lastItemInMainHand = ItemStack.EMPTY; +diff --git a/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java b/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java +index 85a509e4fc0e4b9f182585e17b7deab2fea7e6c0..f1a12b147d55e34d4f8374593640a311598cf1a6 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java +@@ -27,6 +27,12 @@ public class LlamaSpit extends Projectile { + this.setPos(owner.getX() - (double) (owner.getBbWidth() + 1.0F) * 0.5D * (double) Mth.sin(owner.yBodyRot * 0.017453292F), owner.getEyeY() - 0.10000000149011612D, owner.getZ() + (double) (owner.getBbWidth() + 1.0F) * 0.5D * (double) Mth.cos(owner.yBodyRot * 0.017453292F)); + } + ++ // Purpur start ++ public void super_tick() { ++ super.tick(); ++ } ++ // Purpur end ++ + @Override + public void tick() { + super.tick(); +diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +index 69f439851fe1ff07d827eaed274940a5783d5f6c..07853aff3d42ce50799406ee1c14389b5f715b51 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +@@ -35,7 +35,7 @@ public abstract class Projectile extends Entity { + private boolean hasBeenShot; + + // CraftBukkit start +- private boolean hitCancelled = false; ++ public boolean hitCancelled = false; // Purpur - private -> public + // CraftBukkit end + + Projectile(EntityType type, Level world) { +diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java +index 74fc4fc2216cf82e1546ef3d567f2750b1240df1..c90dda3d62dab896f68481000c0b6db1426bc461 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java +@@ -127,4 +127,9 @@ public class PurpurConfig { + config.addDefault(path, def); + return config.getString(path, config.getString(path)); + } ++ ++ public static String cannotRideMob = "You cannot mount that mob"; ++ private static void messages() { ++ cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); ++ } + } +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 361f7857e461578e90cb71e15027dadaf794cb69..4fd7d61c5d225f0dc0666ad7219542777afe01ea 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -56,4 +56,530 @@ public class PurpurWorldConfig { + PurpurConfig.config.addDefault("world-settings.default." + path, def); + return PurpurConfig.config.getString("world-settings." + worldName + "." + path, PurpurConfig.config.getString("world-settings.default." + path)); + } ++ ++ public boolean babiesAreRidable = true; ++ public boolean untamedTamablesAreRidable = true; ++ public boolean useNightVisionWhenRiding = false; ++ private void ridableSettings() { ++ babiesAreRidable = getBoolean("ridable-settings.babies-are-ridable", babiesAreRidable); ++ untamedTamablesAreRidable = getBoolean("ridable-settings.untamed-tamables-are-ridable", untamedTamablesAreRidable); ++ useNightVisionWhenRiding = getBoolean("ridable-settings.use-night-vision", useNightVisionWhenRiding); ++ } ++ ++ public boolean axolotlRidable = false; ++ private void axolotlSettings() { ++ axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); ++ } ++ ++ public boolean batRidable = false; ++ public boolean batRidableInWater = false; ++ public double batMaxY = 256D; ++ private void batSettings() { ++ batRidable = getBoolean("mobs.bat.ridable", batRidable); ++ batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); ++ batMaxY = getDouble("mobs.bat.ridable-max-y", batMaxY); ++ } ++ ++ public boolean beeRidable = false; ++ public boolean beeRidableInWater = false; ++ public double beeMaxY = 256D; ++ private void beeSettings() { ++ beeRidable = getBoolean("mobs.bee.ridable", beeRidable); ++ beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); ++ beeMaxY = getDouble("mobs.bee.ridable-max-y", beeMaxY); ++ } ++ ++ public boolean blazeRidable = false; ++ public boolean blazeRidableInWater = false; ++ public double blazeMaxY = 256D; ++ private void blazeSettings() { ++ blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); ++ blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); ++ blazeMaxY = getDouble("mobs.blaze.ridable-max-y", blazeMaxY); ++ } ++ ++ public boolean catRidable = false; ++ public boolean catRidableInWater = false; ++ private void catSettings() { ++ catRidable = getBoolean("mobs.cat.ridable", catRidable); ++ catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); ++ } ++ ++ public boolean caveSpiderRidable = false; ++ public boolean caveSpiderRidableInWater = false; ++ private void caveSpiderSettings() { ++ caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); ++ caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); ++ } ++ ++ public boolean chickenRidable = false; ++ public boolean chickenRidableInWater = false; ++ private void chickenSettings() { ++ chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); ++ chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); ++ } ++ ++ public boolean codRidable = false; ++ private void codSettings() { ++ codRidable = getBoolean("mobs.cod.ridable", codRidable); ++ } ++ ++ public boolean cowRidable = false; ++ public boolean cowRidableInWater = false; ++ private void cowSettings() { ++ cowRidable = getBoolean("mobs.cow.ridable", cowRidable); ++ cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); ++ } ++ ++ public boolean creeperRidable = false; ++ public boolean creeperRidableInWater = false; ++ private void creeperSettings() { ++ creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); ++ creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); ++ } ++ ++ public boolean dolphinRidable = false; ++ public int dolphinSpitCooldown = 20; ++ public float dolphinSpitSpeed = 1.0F; ++ public float dolphinSpitDamage = 2.0F; ++ private void dolphinSettings() { ++ dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); ++ dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); ++ dolphinSpitSpeed = (float) getDouble("mobs.dolphin.spit.speed", dolphinSpitSpeed); ++ dolphinSpitDamage = (float) getDouble("mobs.dolphin.spit.damage", dolphinSpitDamage); ++ } ++ ++ public boolean donkeyRidableInWater = false; ++ private void donkeySettings() { ++ donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); ++ } ++ ++ public boolean drownedRidable = false; ++ public boolean drownedRidableInWater = false; ++ private void drownedSettings() { ++ drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); ++ drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); ++ } ++ ++ public boolean elderGuardianRidable = false; ++ private void elderGuardianSettings() { ++ elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); ++ } ++ ++ public boolean enderDragonRidable = false; ++ public boolean enderDragonRidableInWater = false; ++ public double enderDragonMaxY = 256D; ++ private void enderDragonSettings() { ++ enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); ++ enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); ++ enderDragonMaxY = getDouble("mobs.ender_dragon.ridable-max-y", enderDragonMaxY); ++ } ++ ++ public boolean endermanRidable = false; ++ public boolean endermanRidableInWater = false; ++ private void endermanSettings() { ++ endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); ++ endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); ++ } ++ ++ public boolean endermiteRidable = false; ++ public boolean endermiteRidableInWater = false; ++ private void endermiteSettings() { ++ endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); ++ endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); ++ } ++ ++ public boolean evokerRidable = false; ++ public boolean evokerRidableInWater = false; ++ private void evokerSettings() { ++ evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); ++ evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); ++ } ++ ++ public boolean foxRidable = false; ++ public boolean foxRidableInWater = false; ++ private void foxSettings() { ++ foxRidable = getBoolean("mobs.fox.ridable", foxRidable); ++ foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); ++ } ++ ++ public boolean ghastRidable = false; ++ public boolean ghastRidableInWater = false; ++ public double ghastMaxY = 256D; ++ private void ghastSettings() { ++ ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ++ ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); ++ ghastMaxY = getDouble("mobs.ghast.ridable-max-y", ghastMaxY); ++ } ++ ++ public boolean giantRidable = false; ++ public boolean giantRidableInWater = false; ++ private void giantSettings() { ++ giantRidable = getBoolean("mobs.giant.ridable", giantRidable); ++ giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); ++ } ++ ++ public boolean glowSquidRidable = false; ++ private void glowSquidSettings() { ++ glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); ++ } ++ ++ public boolean goatRidable = false; ++ public boolean goatRidableInWater = false; ++ private void goatSettings() { ++ goatRidable = getBoolean("mobs.goat.ridable", goatRidable); ++ goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); ++ } ++ ++ public boolean guardianRidable = false; ++ private void guardianSettings() { ++ guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); ++ } ++ ++ public boolean hoglinRidable = false; ++ public boolean hoglinRidableInWater = false; ++ private void hoglinSettings() { ++ hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); ++ hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); ++ } ++ ++ public boolean horseRidableInWater = false; ++ private void horseSettings() { ++ horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); ++ } ++ ++ public boolean huskRidable = false; ++ public boolean huskRidableInWater = false; ++ private void huskSettings() { ++ huskRidable = getBoolean("mobs.husk.ridable", huskRidable); ++ huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); ++ } ++ ++ public boolean illusionerRidable = false; ++ public boolean illusionerRidableInWater = false; ++ private void illusionerSettings() { ++ illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); ++ illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); ++ } ++ ++ public boolean ironGolemRidable = false; ++ public boolean ironGolemRidableInWater = false; ++ public boolean ironGolemCanSwim = false; ++ private void ironGolemSettings() { ++ ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ++ ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); ++ ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); ++ } ++ ++ public boolean llamaRidable = false; ++ public boolean llamaRidableInWater = false; ++ private void llamaSettings() { ++ llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); ++ llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); ++ } ++ ++ public boolean magmaCubeRidable = false; ++ public boolean magmaCubeRidableInWater = false; ++ private void magmaCubeSettings() { ++ magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); ++ magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); ++ } ++ ++ public boolean mooshroomRidable = false; ++ public boolean mooshroomRidableInWater = false; ++ private void mooshroomSettings() { ++ mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); ++ mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); ++ } ++ ++ public boolean muleRidableInWater = false; ++ private void muleSettings() { ++ muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); ++ } ++ ++ public boolean ocelotRidable = false; ++ public boolean ocelotRidableInWater = false; ++ private void ocelotSettings() { ++ ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ++ ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); ++ } ++ ++ public boolean pandaRidable = false; ++ public boolean pandaRidableInWater = false; ++ private void pandaSettings() { ++ pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); ++ pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); ++ } ++ ++ public boolean parrotRidable = false; ++ public boolean parrotRidableInWater = false; ++ public double parrotMaxY = 256D; ++ private void parrotSettings() { ++ parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); ++ parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); ++ parrotMaxY = getDouble("mobs.parrot.ridable-max-y", parrotMaxY); ++ } ++ ++ public boolean phantomRidable = false; ++ public boolean phantomRidableInWater = false; ++ public double phantomMaxY = 256D; ++ public float phantomFlameDamage = 1.0F; ++ public int phantomFlameFireTime = 8; ++ public boolean phantomAllowGriefing = false; ++ private void phantomSettings() { ++ phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); ++ phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); ++ phantomMaxY = getDouble("mobs.phantom.ridable-max-y", phantomMaxY); ++ phantomFlameDamage = (float) getDouble("mobs.phantom.flames.damage", phantomFlameDamage); ++ phantomFlameFireTime = getInt("mobs.phantom.flames.fire-time", phantomFlameFireTime); ++ phantomAllowGriefing = getBoolean("mobs.phantom.allow-griefing", phantomAllowGriefing); ++ } ++ ++ public boolean pigRidable = false; ++ public boolean pigRidableInWater = false; ++ private void pigSettings() { ++ pigRidable = getBoolean("mobs.pig.ridable", pigRidable); ++ pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); ++ } ++ ++ public boolean piglinRidable = false; ++ public boolean piglinRidableInWater = false; ++ private void piglinSettings() { ++ piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); ++ piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); ++ } ++ ++ public boolean piglinBruteRidable = false; ++ public boolean piglinBruteRidableInWater = false; ++ private void piglinBruteSettings() { ++ piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); ++ piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); ++ } ++ ++ public boolean pillagerRidable = false; ++ public boolean pillagerRidableInWater = false; ++ private void pillagerSettings() { ++ pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); ++ pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); ++ } ++ ++ public boolean polarBearRidable = false; ++ public boolean polarBearRidableInWater = false; ++ private void polarBearSettings() { ++ polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); ++ polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); ++ } ++ ++ public boolean pufferfishRidable = false; ++ private void pufferfishSettings() { ++ pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); ++ } ++ ++ public boolean rabbitRidable = false; ++ public boolean rabbitRidableInWater = false; ++ private void rabbitSettings() { ++ rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); ++ rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); ++ } ++ ++ public boolean ravagerRidable = false; ++ public boolean ravagerRidableInWater = false; ++ private void ravagerSettings() { ++ ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ++ ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); ++ } ++ ++ public boolean salmonRidable = false; ++ private void salmonSettings() { ++ salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); ++ } ++ ++ public boolean sheepRidable = false; ++ public boolean sheepRidableInWater = false; ++ private void sheepSettings() { ++ sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); ++ sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); ++ } ++ ++ public boolean shulkerRidable = false; ++ public boolean shulkerRidableInWater = false; ++ private void shulkerSettings() { ++ shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); ++ shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); ++ } ++ ++ public boolean silverfishRidable = false; ++ public boolean silverfishRidableInWater = false; ++ private void silverfishSettings() { ++ silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); ++ silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); ++ } ++ ++ public boolean skeletonRidable = false; ++ public boolean skeletonRidableInWater = false; ++ private void skeletonSettings() { ++ skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); ++ skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); ++ } ++ ++ public boolean skeletonHorseRidableInWater = false; ++ public boolean skeletonHorseCanSwim = false; ++ private void skeletonHorseSettings() { ++ skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); ++ skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); ++ } ++ ++ public boolean slimeRidable = false; ++ public boolean slimeRidableInWater = false; ++ private void slimeSettings() { ++ slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); ++ slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); ++ } ++ ++ public boolean snowGolemRidable = false; ++ public boolean snowGolemRidableInWater = false; ++ public boolean snowGolemLeaveTrailWhenRidden = false; ++ private void snowGolemSettings() { ++ snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); ++ snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); ++ snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); ++ } ++ ++ public boolean squidRidable = false; ++ private void squidSettings() { ++ squidRidable = getBoolean("mobs.squid.ridable", squidRidable); ++ } ++ ++ public boolean spiderRidable = false; ++ public boolean spiderRidableInWater = false; ++ private void spiderSettings() { ++ spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); ++ spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); ++ } ++ ++ public boolean strayRidable = false; ++ public boolean strayRidableInWater = false; ++ private void straySettings() { ++ strayRidable = getBoolean("mobs.stray.ridable", strayRidable); ++ strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); ++ } ++ ++ public boolean striderRidable = false; ++ public boolean striderRidableInWater = false; ++ private void striderSettings() { ++ striderRidable = getBoolean("mobs.strider.ridable", striderRidable); ++ striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); ++ } ++ ++ public boolean traderLlamaRidable = false; ++ public boolean traderLlamaRidableInWater = false; ++ private void traderLlamaSettings() { ++ traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); ++ traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); ++ } ++ ++ public boolean tropicalFishRidable = false; ++ private void tropicalFishSettings() { ++ tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); ++ } ++ ++ public boolean turtleRidable = false; ++ public boolean turtleRidableInWater = false; ++ private void turtleSettings() { ++ turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); ++ turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); ++ } ++ ++ public boolean vexRidable = false; ++ public boolean vexRidableInWater = false; ++ public double vexMaxY = 256D; ++ private void vexSettings() { ++ vexRidable = getBoolean("mobs.vex.ridable", vexRidable); ++ vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); ++ vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); ++ } ++ ++ public boolean villagerRidable = false; ++ public boolean villagerRidableInWater = false; ++ private void villagerSettings() { ++ villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); ++ villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); ++ } ++ ++ public boolean vindicatorRidable = false; ++ public boolean vindicatorRidableInWater = false; ++ private void vindicatorSettings() { ++ vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); ++ vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); ++ } ++ ++ public boolean wanderingTraderRidable = false; ++ public boolean wanderingTraderRidableInWater = false; ++ private void wanderingTraderSettings() { ++ wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); ++ wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); ++ } ++ ++ public boolean witchRidable = false; ++ public boolean witchRidableInWater = false; ++ private void witchSettings() { ++ witchRidable = getBoolean("mobs.witch.ridable", witchRidable); ++ witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); ++ } ++ ++ public boolean witherRidable = false; ++ public boolean witherRidableInWater = false; ++ private void witherSettings() { ++ witherRidable = getBoolean("mobs.wither.ridable", witherRidable); ++ witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); ++ } ++ ++ public boolean witherSkeletonRidable = false; ++ public boolean witherSkeletonRidableInWater = false; ++ private void witherSkeletonSettings() { ++ witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); ++ witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); ++ } ++ ++ public boolean wolfRidable = false; ++ public boolean wolfRidableInWater = false; ++ private void wolfSettings() { ++ wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); ++ wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); ++ } ++ ++ public boolean zoglinRidable = false; ++ public boolean zoglinRidableInWater = false; ++ private void zoglinSettings() { ++ zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); ++ zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); ++ } ++ ++ public boolean zombieRidable = false; ++ public boolean zombieRidableInWater = false; ++ private void zombieSettings() { ++ zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); ++ zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); ++ } ++ ++ public boolean zombieHorseRidableInWater = false; ++ public boolean zombieHorseCanSwim = false; ++ private void zombieHorseSettings() { ++ zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); ++ zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); ++ } ++ ++ public boolean zombieVillagerRidable = false; ++ public boolean zombieVillagerRidableInWater = false; ++ private void zombieVillagerSettings() { ++ zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); ++ zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); ++ } ++ ++ public boolean zombiefiedPiglinRidable = false; ++ public boolean zombiefiedPiglinRidableInWater = false; ++ private void zombiefiedPiglinSettings() { ++ zombiefiedPiglinRidable = getBoolean("mobs.zombiefied_piglin.ridable", zombiefiedPiglinRidable); ++ zombiefiedPiglinRidableInWater = getBoolean("mobs.zombiefied_piglin.ridable-in-water", zombiefiedPiglinRidableInWater); ++ } + } +diff --git a/src/main/java/net/pl3x/purpur/controller/FlyingMoveControllerWASD.java b/src/main/java/net/pl3x/purpur/controller/FlyingMoveControllerWASD.java +new file mode 100644 +index 0000000000000000000000000000000000000000..d0f6c7d47d158b49fb6a5fe2a7480ffd53f844c5 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/controller/FlyingMoveControllerWASD.java +@@ -0,0 +1,61 @@ ++package net.pl3x.purpur.controller; ++ ++import net.minecraft.world.entity.Mob; ++import net.minecraft.world.entity.ai.attributes.Attributes; ++import net.minecraft.world.entity.player.Player; ++ ++public class FlyingMoveControllerWASD extends MoveControllerWASD { ++ protected final float groundSpeedModifier; ++ protected int tooHighCooldown = 0; ++ protected boolean setGravityFlag = true; ++ ++ public FlyingMoveControllerWASD(Mob entity) { ++ this(entity, 1.0F); ++ } ++ ++ public FlyingMoveControllerWASD(Mob entity, float groundSpeedModifier) { ++ this(entity, groundSpeedModifier, true); ++ } ++ ++ public FlyingMoveControllerWASD(Mob entity, float groundSpeedModifier, boolean setGravityFlag) { ++ super(entity); ++ this.groundSpeedModifier = groundSpeedModifier; ++ this.setGravityFlag = setGravityFlag; ++ } ++ ++ @Override ++ public void purpurTick(Player rider) { ++ float forward = Math.max(0.0F, rider.getForwardMot()); ++ float vertical = forward == 0.0F ? 0.0F : -(rider.xRotO / 45.0F); ++ float strafe = rider.getStrafeMot(); ++ ++ if (rider.jumping && spacebarEvent(entity)) { ++ entity.onSpacebar(); ++ } ++ ++ if (entity.getY() >= entity.getMaxY() || --tooHighCooldown > 0) { ++ tooHighCooldown = 60; ++ entity.setDeltaMovement(entity.getDeltaMovement().add(0.0D, -0.05D, 0.0D)); ++ vertical = 0.0F; ++ } ++ ++ setSpeedModifier(entity.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float speed = (float) getSpeedModifier(); ++ ++ if (entity.onGround) { ++ speed *= groundSpeedModifier; // TODO = fix this! ++ } ++ ++ if (setGravityFlag) { ++ entity.setNoGravity(forward > 0); ++ } ++ ++ entity.setSpeed(speed); ++ entity.setVerticalMot(vertical); ++ entity.setStrafeMot(strafe); ++ entity.setForwardMot(forward); ++ ++ setForward(entity.getForwardMot()); ++ setStrafe(entity.getStrafeMot()); ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/controller/FlyingWithSpacebarMoveControllerWASD.java b/src/main/java/net/pl3x/purpur/controller/FlyingWithSpacebarMoveControllerWASD.java +new file mode 100644 +index 0000000000000000000000000000000000000000..79d23cb66bc825fe78ecc249f12ef8b9851e09f8 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/controller/FlyingWithSpacebarMoveControllerWASD.java +@@ -0,0 +1,61 @@ ++package net.pl3x.purpur.controller; ++ ++import net.minecraft.world.entity.Mob; ++import net.minecraft.world.entity.ai.attributes.Attributes; ++import net.minecraft.world.entity.player.Player; ++import net.minecraft.world.phys.Vec3; ++ ++public class FlyingWithSpacebarMoveControllerWASD extends FlyingMoveControllerWASD { ++ public FlyingWithSpacebarMoveControllerWASD(Mob entity) { ++ super(entity); ++ } ++ ++ public FlyingWithSpacebarMoveControllerWASD(Mob entity, float groundSpeedModifier) { ++ super(entity, groundSpeedModifier); ++ } ++ ++ @Override ++ public void purpurTick(Player rider) { ++ float forward = rider.getForwardMot(); ++ float strafe = rider.getStrafeMot() * 0.5F; ++ float vertical = 0; ++ ++ if (forward < 0.0F) { ++ forward *= 0.5F; ++ strafe *= 0.5F; ++ } ++ ++ float speed = (float) entity.getAttributeValue(Attributes.MOVEMENT_SPEED); ++ ++ if (entity.onGround) { ++ speed *= groundSpeedModifier; ++ } ++ ++ if (rider.jumping && spacebarEvent(entity) && !entity.onSpacebar()) { ++ entity.setNoGravity(true); ++ vertical = 1.0F; ++ } else { ++ entity.setNoGravity(false); ++ } ++ ++ if (entity.getY() >= entity.getMaxY() || --tooHighCooldown > 0) { ++ tooHighCooldown = 60; ++ entity.setDeltaMovement(entity.getDeltaMovement().add(0.0D, -0.2D, 0.0D)); ++ vertical = 0.0F; ++ } ++ ++ setSpeedModifier(speed); ++ entity.setSpeed((float) getSpeedModifier()); ++ entity.setVerticalMot(vertical); ++ entity.setStrafeMot(strafe); ++ entity.setForwardMot(forward); ++ ++ setForward(entity.getForwardMot()); ++ setStrafe(entity.getStrafeMot()); ++ ++ Vec3 mot = entity.getDeltaMovement(); ++ if (mot.y > 0.2D) { ++ entity.setDeltaMovement(mot.x, 0.2D, mot.z); ++ } ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/controller/LookControllerWASD.java b/src/main/java/net/pl3x/purpur/controller/LookControllerWASD.java +new file mode 100644 +index 0000000000000000000000000000000000000000..b93fe26c357930d5c0242da8137443feb216f9dd +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/controller/LookControllerWASD.java +@@ -0,0 +1,76 @@ ++package net.pl3x.purpur.controller; ++ ++ ++import net.minecraft.network.protocol.game.ClientboundMoveEntityPacket; ++import net.minecraft.util.Mth; ++import net.minecraft.world.entity.Mob; ++import net.minecraft.world.entity.ai.control.LookControl; ++import net.minecraft.world.entity.player.Player; ++ ++public class LookControllerWASD extends LookControl { ++ protected final Mob entity; ++ private float yOffset = 0; ++ private float xOffset = 0; ++ ++ public LookControllerWASD(Mob entity) { ++ super(entity); ++ this.entity = entity; ++ } ++ ++ // tick ++ @Override ++ public void tick() { ++ if (entity.getRider() != null) { ++ purpurTick(entity.getRider()); ++ } else { ++ vanillaTick(); ++ } ++ } ++ ++ protected void purpurTick(Player rider) { ++ setYawPitch(rider.getYRot(), rider.getXRot()); ++ } ++ ++ public void vanillaTick() { ++ super.tick(); ++ } ++ ++ public void setYawPitch(float yRot, float xRot) { ++ entity.setXRot(normalizePitch(xRot + xOffset)); ++ entity.setYRot(normalizeYaw(yRot + yOffset)); ++ entity.setYHeadRot(entity.getYRot()); ++ entity.xRotO = entity.getXRot(); ++ entity.yRotO = entity.getYRot(); ++ ++ entity.tracker.broadcast(new ClientboundMoveEntityPacket ++ .PosRot(entity.getId(), ++ (short) 0, (short) 0, (short) 0, ++ (byte) Mth.floor(entity.getYRot() * 256.0F / 360.0F), ++ (byte) Mth.floor(entity.getXRot() * 256.0F / 360.0F), ++ entity.onGround)); ++ } ++ ++ public void setOffsets(float yaw, float pitch) { ++ yOffset = yaw; ++ xOffset = pitch; ++ } ++ ++ public float normalizeYaw(float yaw) { ++ yaw %= 360.0f; ++ if (yaw >= 180.0f) { ++ yaw -= 360.0f; ++ } else if (yaw < -180.0f) { ++ yaw += 360.0f; ++ } ++ return yaw; ++ } ++ ++ public float normalizePitch(float pitch) { ++ if (pitch > 90.0f) { ++ pitch = 90.0f; ++ } else if (pitch < -90.0f) { ++ pitch = -90.0f; ++ } ++ return pitch; ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/controller/MoveControllerWASD.java b/src/main/java/net/pl3x/purpur/controller/MoveControllerWASD.java +new file mode 100644 +index 0000000000000000000000000000000000000000..4a3a1eca04a58682d5aeb720832bad5cc8ba2d9c +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/controller/MoveControllerWASD.java +@@ -0,0 +1,89 @@ ++package net.pl3x.purpur.controller; ++ ++import net.minecraft.world.entity.Mob; ++import net.minecraft.world.entity.ai.attributes.Attributes; ++import net.minecraft.world.entity.ai.control.MoveControl; ++import net.minecraft.world.entity.player.Player; ++import net.pl3x.purpur.event.entity.RidableSpacebarEvent; ++ ++public class MoveControllerWASD extends MoveControl { ++ protected final Mob entity; ++ private final double speedModifier; ++ ++ public MoveControllerWASD(Mob entity) { ++ this(entity, 1.0D); ++ } ++ ++ public MoveControllerWASD(Mob entity, double speedModifier) { ++ super(entity); ++ this.entity = entity; ++ this.speedModifier = speedModifier; ++ } ++ ++ @Override ++ public boolean hasWanted() { ++ return entity.getRider() != null ? strafeForwards != 0 || strafeRight != 0 : super.hasWanted(); ++ } ++ ++ @Override ++ public void tick() { ++ if (entity.getRider() != null) { ++ purpurTick(entity.getRider()); ++ } else { ++ vanillaTick(); ++ } ++ } ++ ++ public void vanillaTick() { ++ super.tick(); ++ } ++ ++ public void purpurTick(Player rider) { ++ float forward = rider.getForwardMot() * 0.5F; ++ float strafe = rider.getStrafeMot() * 0.25F; ++ ++ if (forward <= 0.0F) { ++ forward *= 0.5F; ++ } ++ ++ float yawOffset = 0; ++ if (strafe != 0) { ++ if (forward == 0) { ++ yawOffset += strafe > 0 ? -90 : 90; ++ forward = Math.abs(strafe * 2); ++ } else { ++ yawOffset += strafe > 0 ? -30 : 30; ++ strafe /= 2; ++ if (forward < 0) { ++ yawOffset += strafe > 0 ? -110 : 110; ++ forward *= -1; ++ } ++ } ++ } else if (forward < 0) { ++ yawOffset -= 180; ++ forward *= -1; ++ } ++ ++ ((LookControllerWASD) entity.getLookControl()).setOffsets(yawOffset, 0); ++ ++ if (rider.jumping && spacebarEvent(entity) && !entity.onSpacebar() && entity.onGround) { ++ entity.jumpFromGround(); ++ } ++ ++ setSpeedModifier(entity.getAttributeValue(Attributes.MOVEMENT_SPEED) * speedModifier); ++ ++ entity.setSpeed((float) getSpeedModifier()); ++ entity.setForwardMot(forward); ++ ++ setForward(entity.getForwardMot()); ++ setStrafe(entity.getStrafeMot()); ++ } ++ ++ public static boolean spacebarEvent(Mob entity) { ++ if (RidableSpacebarEvent.getHandlerList().getRegisteredListeners().length > 0) { ++ return new RidableSpacebarEvent(entity.getBukkitEntity()).callEvent(); ++ } else { ++ return true; ++ } ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/controller/WaterMoveControllerWASD.java b/src/main/java/net/pl3x/purpur/controller/WaterMoveControllerWASD.java +new file mode 100644 +index 0000000000000000000000000000000000000000..c9b24eeaa4221c56dc5030ad4574499e1a03727d +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/controller/WaterMoveControllerWASD.java +@@ -0,0 +1,50 @@ ++package net.pl3x.purpur.controller; ++ ++import net.minecraft.world.entity.Mob; ++import net.minecraft.world.entity.ai.attributes.Attributes; ++import net.minecraft.world.entity.player.Player; ++ ++public class WaterMoveControllerWASD extends MoveControllerWASD { ++ private final double speedModifier; ++ ++ public WaterMoveControllerWASD(Mob entity) { ++ this(entity, 1.0D); ++ } ++ ++ public WaterMoveControllerWASD(Mob entity, double speedModifier) { ++ super(entity); ++ this.speedModifier = speedModifier; ++ } ++ ++ @Override ++ public void purpurTick(Player rider) { ++ float forward = rider.getForwardMot(); ++ float strafe = rider.getStrafeMot() * 0.5F; // strafe slower by default ++ float vertical = -(rider.xRotO / 90); ++ ++ if (forward == 0.0F) { ++ // strafe slower if not moving forward ++ strafe *= 0.5F; ++ // do not move vertically if not moving forward ++ vertical = 0.0F; ++ } else if (forward < 0.0F) { ++ // water animals can't swim backwards ++ forward = 0.0F; ++ vertical = 0.0F; ++ } ++ ++ if (rider.jumping && spacebarEvent(entity)) { ++ entity.onSpacebar(); ++ } ++ ++ setSpeedModifier(entity.getAttributeValue(Attributes.MOVEMENT_SPEED) * speedModifier); ++ entity.setSpeed((float) getSpeedModifier() * 0.1F); ++ ++ entity.setForwardMot(forward * (float) speedModifier); ++ entity.setStrafeMot(strafe * (float) speedModifier); ++ entity.setVerticalMot(vertical * (float) speedModifier); ++ ++ setForward(entity.getForwardMot()); ++ setStrafe(entity.getStrafeMot()); ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java b/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java +new file mode 100644 +index 0000000000000000000000000000000000000000..fda24d4ecff91cc28d2a7a45fbb55ea734261153 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java +@@ -0,0 +1,99 @@ ++package net.pl3x.purpur.entity; ++ ++import net.minecraft.core.particles.ParticleTypes; ++import net.minecraft.server.level.ServerLevel; ++import net.minecraft.util.Mth; ++import net.minecraft.world.damagesource.DamageSource; ++import net.minecraft.world.entity.Entity; ++import net.minecraft.world.entity.EntityType; ++import net.minecraft.world.entity.LivingEntity; ++import net.minecraft.world.entity.animal.Dolphin; ++import net.minecraft.world.entity.projectile.LlamaSpit; ++import net.minecraft.world.entity.projectile.ProjectileUtil; ++import net.minecraft.world.level.Level; ++import net.minecraft.world.level.block.state.BlockState; ++import net.minecraft.world.phys.BlockHitResult; ++import net.minecraft.world.phys.EntityHitResult; ++import net.minecraft.world.phys.HitResult; ++import net.minecraft.world.phys.Vec3; ++ ++public class DolphinSpit extends LlamaSpit { ++ public LivingEntity dolphin; ++ public int ticksLived; ++ ++ public DolphinSpit(EntityType type, Level world) { ++ super(type, world); ++ } ++ ++ public DolphinSpit(Level world, Dolphin dolphin) { ++ this(EntityType.LLAMA_SPIT, world); ++ setOwner(dolphin.getRider() != null ? dolphin.getRider() : dolphin); ++ this.dolphin = dolphin; ++ this.setPos( ++ dolphin.getX() - (double) (dolphin.getBbWidth() + 1.0F) * 0.5D * (double) Mth.sin(dolphin.yBodyRot * 0.017453292F), ++ dolphin.getEyeY() - 0.10000000149011612D, ++ dolphin.getZ() + (double) (dolphin.getBbWidth() + 1.0F) * 0.5D * (double) Mth.cos(dolphin.yBodyRot * 0.017453292F)); ++ } ++ ++ public void tick() { ++ super_tick(); ++ ++ Vec3 mot = this.getDeltaMovement(); ++ HitResult hitResult = ProjectileUtil.getHitResult(this, this::canHitEntity); ++ ++ this.preOnHit(hitResult); ++ ++ double x = this.getX() + mot.x; ++ double y = this.getY() + mot.y; ++ double z = this.getZ() + mot.z; ++ ++ this.updateRotation(); ++ ++ Vec3 motDouble = mot.scale(2.0); ++ for (int i = 0; i < 5; i++) { ++ ((ServerLevel) level).sendParticles(null, ParticleTypes.BUBBLE, ++ getX() + random.nextFloat() / 2 - 0.25F, ++ getY() + random.nextFloat() / 2 - 0.25F, ++ getZ() + random.nextFloat() / 2 - 0.25F, ++ 0, motDouble.x(), motDouble.y(), motDouble.z(), 0.1D, true); ++ } ++ ++ if (++ticksLived > 20) { ++ this.discard(); ++ } else { ++ this.setDeltaMovement(mot.scale(0.99D)); ++ if (!this.isNoGravity()) { ++ this.setDeltaMovement(this.getDeltaMovement().add(0.0D, -0.06D, 0.0D)); ++ } ++ ++ this.setPos(x, y, z); ++ } ++ } ++ ++ @Override ++ public void shoot(double x, double y, double z, float speed, float inaccuracy) { ++ setDeltaMovement(new Vec3(x, y, z).normalize().add( ++ random.nextGaussian() * (double) 0.0075F * (double) inaccuracy, ++ random.nextGaussian() * (double) 0.0075F * (double) inaccuracy, ++ random.nextGaussian() * (double) 0.0075F * (double) inaccuracy) ++ .scale(speed)); ++ } ++ ++ @Override ++ protected void onHitEntity(EntityHitResult entityHitResult) { ++ Entity shooter = this.getOwner(); ++ if (shooter instanceof LivingEntity) { ++ entityHitResult.getEntity().hurt(DamageSource.indirectMobAttack(this, (LivingEntity) shooter).setProjectile(), level.purpurConfig.dolphinSpitDamage); ++ } ++ } ++ ++ @Override ++ protected void onHitBlock(BlockHitResult blockHitResult) { ++ if (this.hitCancelled) { ++ return; ++ } ++ BlockState state = this.level.getBlockState(blockHitResult.getBlockPos()); ++ state.onProjectileHit(this.level, state, blockHitResult, this); ++ this.discard(); ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java b/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java +new file mode 100644 +index 0000000000000000000000000000000000000000..57b59a12f609fda0787d49575724762362ce12af +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java +@@ -0,0 +1,114 @@ ++package net.pl3x.purpur.entity; ++ ++import net.minecraft.core.particles.ParticleTypes; ++import net.minecraft.server.level.ServerLevel; ++import net.minecraft.util.Mth; ++import net.minecraft.world.damagesource.DamageSource; ++import net.minecraft.world.entity.Entity; ++import net.minecraft.world.entity.EntityType; ++import net.minecraft.world.entity.LivingEntity; ++import net.minecraft.world.entity.decoration.ArmorStand; ++import net.minecraft.world.entity.monster.Phantom; ++import net.minecraft.world.entity.projectile.LlamaSpit; ++import net.minecraft.world.entity.projectile.ProjectileUtil; ++import net.minecraft.world.level.Level; ++import net.minecraft.world.level.block.state.BlockBehaviour; ++import net.minecraft.world.level.block.state.BlockState; ++import net.minecraft.world.phys.BlockHitResult; ++import net.minecraft.world.phys.EntityHitResult; ++import net.minecraft.world.phys.HitResult; ++import net.minecraft.world.phys.Vec3; ++ ++public class PhantomFlames extends LlamaSpit { ++ public Phantom phantom; ++ public int ticksLived; ++ public boolean canGrief = false; ++ ++ public PhantomFlames(EntityType type, Level world) { ++ super(type, world); ++ } ++ ++ public PhantomFlames(Level world, Phantom phantom) { ++ this(EntityType.LLAMA_SPIT, world); ++ setOwner(phantom.getRider() != null ? phantom.getRider() : phantom); ++ this.phantom = phantom; ++ this.setPos( ++ phantom.getX() - (double) (phantom.getBbWidth() + 1.0F) * 0.5D * (double) Mth.sin(phantom.yBodyRot * 0.017453292F), ++ phantom.getEyeY() - 0.10000000149011612D, ++ phantom.getZ() + (double) (phantom.getBbWidth() + 1.0F) * 0.5D * (double) Mth.cos(phantom.yBodyRot * 0.017453292F)); ++ } ++ ++ public void tick() { ++ super_tick(); ++ ++ Vec3 mot = this.getDeltaMovement(); ++ HitResult hitResult = ProjectileUtil.getHitResult(this, this::canHitEntity); ++ ++ this.preOnHit(hitResult); ++ ++ double x = this.getX() + mot.x; ++ double y = this.getY() + mot.y; ++ double z = this.getZ() + mot.z; ++ ++ this.updateRotation(); ++ ++ Vec3 motDouble = mot.scale(2.0); ++ for (int i = 0; i < 5; i++) { ++ ((ServerLevel) level).sendParticles(null, ParticleTypes.FLAME, ++ getX() + random.nextFloat() / 2 - 0.25F, ++ getY() + random.nextFloat() / 2 - 0.25F, ++ getZ() + random.nextFloat() / 2 - 0.25F, ++ 0, motDouble.x(), motDouble.y(), motDouble.z(), 0.1D, true); ++ } ++ ++ if (++ticksLived > 20) { ++ this.discard(); ++ } else if (this.level.getBlockStates(this.getBoundingBox()).noneMatch(BlockBehaviour.BlockStateBase::isAir)) { ++ this.discard(); ++ } else if (this.isInWaterOrBubble()) { ++ this.discard(); ++ } else { ++ this.setDeltaMovement(mot.scale(0.99D)); ++ if (!this.isNoGravity()) { ++ this.setDeltaMovement(this.getDeltaMovement().add(0.0D, -0.06D, 0.0D)); ++ } ++ ++ this.setPos(x, y, z); ++ } ++ } ++ ++ @Override ++ public void shoot(double x, double y, double z, float speed, float inaccuracy) { ++ setDeltaMovement(new Vec3(x, y, z).normalize().add( ++ random.nextGaussian() * (double) 0.0075F * (double) inaccuracy, ++ random.nextGaussian() * (double) 0.0075F * (double) inaccuracy, ++ random.nextGaussian() * (double) 0.0075F * (double) inaccuracy) ++ .scale(speed)); ++ } ++ ++ @Override ++ protected void onHitEntity(EntityHitResult entityHitResult) { ++ Entity shooter = this.getOwner(); ++ if (shooter instanceof LivingEntity) { ++ Entity target = entityHitResult.getEntity(); ++ if (canGrief || (target instanceof LivingEntity && !(target instanceof ArmorStand))) { ++ target.hurt(DamageSource.indirectMobAttack(this, (LivingEntity) shooter).setProjectile(), level.purpurConfig.phantomFlameDamage); ++ if (level.purpurConfig.phantomFlameFireTime > 0) { ++ target.setSecondsOnFire(level.purpurConfig.phantomFlameFireTime); ++ } ++ } ++ } ++ } ++ ++ @Override ++ protected void onHitBlock(BlockHitResult blockHitResult) { ++ if (this.hitCancelled) { ++ return; ++ } ++ if (this.canGrief) { ++ BlockState state = this.level.getBlockState(blockHitResult.getBlockPos()); ++ state.onProjectileHit(this.level, state, blockHitResult, this); ++ } ++ this.discard(); ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/entity/ai/HasRider.java b/src/main/java/net/pl3x/purpur/entity/ai/HasRider.java +new file mode 100644 +index 0000000000000000000000000000000000000000..bd48d16bbe3d9b10541a5e65c037926b3a58af22 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/entity/ai/HasRider.java +@@ -0,0 +1,20 @@ ++package net.pl3x.purpur.entity.ai; ++ ++import net.minecraft.world.entity.Mob; ++import net.minecraft.world.entity.ai.goal.Goal; ++ ++import java.util.EnumSet; ++ ++public class HasRider extends Goal { ++ public final Mob entity; ++ ++ public HasRider(Mob entity) { ++ this.entity = entity; ++ setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK, Flag.TARGET, Flag.UNKNOWN_BEHAVIOR)); ++ } ++ ++ @Override ++ public boolean canUse() { ++ return entity.getRider() != null; ++ } ++} +diff --git a/src/main/java/net/pl3x/purpur/entity/ai/HorseHasRider.java b/src/main/java/net/pl3x/purpur/entity/ai/HorseHasRider.java +new file mode 100644 +index 0000000000000000000000000000000000000000..8eefb7b7eb33aecf48ac206d3f0139e0cf342e35 +--- /dev/null ++++ b/src/main/java/net/pl3x/purpur/entity/ai/HorseHasRider.java +@@ -0,0 +1,17 @@ ++package net.pl3x.purpur.entity.ai; ++ ++import net.minecraft.world.entity.animal.horse.AbstractHorse; ++ ++public class HorseHasRider extends HasRider { ++ public final AbstractHorse horse; ++ ++ public HorseHasRider(AbstractHorse entity) { ++ super(entity); ++ this.horse = entity; ++ } ++ ++ @Override ++ public boolean canUse() { ++ return super.canUse() && horse.isSaddled(); ++ } ++} +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +index 281d9ff8c7741d44131743271046af07d34ba21d..7eb3d56ecc776c96481930a4e78e1f36076f68bb 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +@@ -1207,4 +1207,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { + return getHandle().isTicking(); + } + // Paper end ++ ++ // Purpur start ++ @Override ++ public org.bukkit.entity.Player getRider() { ++ Player rider = getHandle().getRider(); ++ return rider != null ? (org.bukkit.entity.Player) rider.getBukkitEntity() : null; ++ } ++ ++ @Override ++ public boolean hasRider() { ++ return getHandle().getRider() != null; ++ } ++ ++ @Override ++ public boolean isRidable() { ++ return getHandle().isRidable(); ++ } ++ ++ @Override ++ public boolean isRidableInWater() { ++ return getHandle().rideableUnderWater(); ++ } ++ // Purpur end + } +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index 71571868090062f02579d50ae483d9f367de5016..7dfa256c43e9757e1467af1506377859b46154ea 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -537,6 +537,15 @@ public class CraftEventFactory { + } + craftServer.getPluginManager().callEvent(event); + ++ // Purpur start ++ if (who != null) { ++ switch (action) { ++ case LEFT_CLICK_BLOCK, LEFT_CLICK_AIR -> who.processClick(InteractionHand.MAIN_HAND); ++ case RIGHT_CLICK_BLOCK, RIGHT_CLICK_AIR -> who.processClick(InteractionHand.OFF_HAND); ++ } ++ } ++ // Purpur end ++ + return event; + } + +@@ -944,6 +953,7 @@ public class CraftEventFactory { + damageCause = DamageCause.ENTITY_EXPLOSION; + } + event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), entity.getBukkitEntity(), damageCause, modifiers, modifierFunctions); ++ damager.processClick(InteractionHand.MAIN_HAND); // Purpur + } + event.setCancelled(cancelled); + +@@ -1027,6 +1037,7 @@ public class CraftEventFactory { + if (!event.isCancelled()) { + event.getEntity().setLastDamageCause(event); + } ++ damager.getHandle().processClick(InteractionHand.MAIN_HAND); // Purpur + return event; + } + +@@ -1078,6 +1089,7 @@ public class CraftEventFactory { + EntityDamageEvent event; + if (damager != null) { + event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, modifiers, modifierFunctions); ++ damager.processClick(InteractionHand.MAIN_HAND); // Purpur + } else { + event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, modifiers, modifierFunctions); + } +diff --git a/src/test/java/com/destroystokyo/paper/entity/ai/VanillaMobGoalTest.java b/src/test/java/com/destroystokyo/paper/entity/ai/VanillaMobGoalTest.java +index b2d510459bcf90a3611f3d91dae4ccc3d29b4079..2ddf338f40092f8ef1db3ea5c175300471566d51 100644 +--- a/src/test/java/com/destroystokyo/paper/entity/ai/VanillaMobGoalTest.java ++++ b/src/test/java/com/destroystokyo/paper/entity/ai/VanillaMobGoalTest.java +@@ -37,7 +37,7 @@ public class VanillaMobGoalTest { + } + + List> classes; +- try (ScanResult scanResult = new ClassGraph().enableAllInfo().whitelistPackages("net.minecraft").scan()) { ++ try (ScanResult scanResult = new ClassGraph().enableAllInfo().whitelistPackages("net.minecraft", "net.pl3x.purpur.entity.ai").scan()) { // Purpur + classes = scanResult.getSubclasses(net.minecraft.world.entity.ai.goal.Goal.class.getName()).loadClasses(); + } + diff --git a/patches/server/0003-Timings-stuff.patch b/patches/server/0004-Timings-stuff.patch similarity index 92% rename from patches/server/0003-Timings-stuff.patch rename to patches/server/0004-Timings-stuff.patch index 87f1390bc..0adc2d1c9 100644 --- a/patches/server/0003-Timings-stuff.patch +++ b/patches/server/0004-Timings-stuff.patch @@ -54,12 +54,12 @@ index 2ff4d4921e2076abf415bd3c8f5173ecd6222168..279cf6a1f9ee6e5ed099eedbf68ee72a String hostName = "BrokenHost"; try { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 74fc4fc2216cf82e1546ef3d567f2750b1240df1..6660e8ad9084b4ea0b7433eed41c63e24d93a963 100644 +index c90dda3d62dab896f68481000c0b6db1426bc461..358ce4bb952fbf50bf78a35f19b4c61e6f4d1afd 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -127,4 +127,10 @@ public class PurpurConfig { - config.addDefault(path, def); - return config.getString(path, config.getString(path)); +@@ -132,4 +132,10 @@ public class PurpurConfig { + private static void messages() { + cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); } + + public static String timingsUrl = "https://timings.pl3x.net"; diff --git a/patches/server/0004-Barrels-and-enderchests-6-rows.patch b/patches/server/0005-Barrels-and-enderchests-6-rows.patch similarity index 98% rename from patches/server/0004-Barrels-and-enderchests-6-rows.patch rename to patches/server/0005-Barrels-and-enderchests-6-rows.patch index 7d8a00e85..7785b5203 100644 --- a/patches/server/0004-Barrels-and-enderchests-6-rows.patch +++ b/patches/server/0005-Barrels-and-enderchests-6-rows.patch @@ -142,10 +142,10 @@ index f494063ead9c6303fb3ca880aba2a877ae8d83ab..3b027111ed933856ae86ad5f62aac744 } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 6660e8ad9084b4ea0b7433eed41c63e24d93a963..7e0c9505427f58df767ab44f18bec66212b7dd57 100644 +index 358ce4bb952fbf50bf78a35f19b4c61e6f4d1afd..7bb30fba98b5b217df72e6df5b2dc4e6082d1a6a 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -133,4 +133,23 @@ public class PurpurConfig { +@@ -138,4 +138,23 @@ public class PurpurConfig { timingsUrl = getString("settings.timings.url", timingsUrl); if (!co.aikar.timings.TimingsManager.hiddenConfigs.contains("server-ip")) co.aikar.timings.TimingsManager.hiddenConfigs.add("server-ip"); } diff --git a/patches/server/0005-Advancement-API.patch b/patches/server/0006-Advancement-API.patch similarity index 100% rename from patches/server/0005-Advancement-API.patch rename to patches/server/0006-Advancement-API.patch diff --git a/patches/server/0006-Llama-API.patch b/patches/server/0007-Llama-API.patch similarity index 100% rename from patches/server/0006-Llama-API.patch rename to patches/server/0007-Llama-API.patch diff --git a/patches/server/0007-AFK-API.patch b/patches/server/0008-AFK-API.patch similarity index 90% rename from patches/server/0007-AFK-API.patch rename to patches/server/0008-AFK-API.patch index 5867279ab..b3b8394d6 100644 --- a/patches/server/0007-AFK-API.patch +++ b/patches/server/0008-AFK-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] AFK API diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index b4055c6de62c22ba8ee8384884f9b3fd62eddeb8..16891782bc6038e493180c678d564f1f57a0f9a2 100644 +index 84c0c68e327d73e782cd451fc0d209a8b4287b2e..610b1d32c34659ec8459b984cde4aa80bee89f11 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1905,8 +1905,54 @@ public class ServerPlayer extends Player { +@@ -1914,8 +1914,54 @@ public class ServerPlayer extends Player { public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -64,7 +64,7 @@ index b4055c6de62c22ba8ee8384884f9b3fd62eddeb8..16891782bc6038e493180c678d564f1f return this.stats; } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 40d0dac02bb1922483d68f3cdd09a228f66d09f6..b50ae4093b4bda0d62ec6ac445c969327871dd38 100644 +index 8e585ea6a070b2339cf396d70224a0d3791abe1f..3792cb44df997e72d902f26fe09590b1c5c7e814 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -391,6 +391,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @@ -142,25 +142,23 @@ index a060cca08631fb42041e3a79a9abc422fe7757af..e7b11d1ba984ea14f0cdf8e84f9eaab4 private EntitySelector() {} // Paper start diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index d286d88a3c3f93dbfa92de9421e320c92cd96350..1cc9291f14a4d655cb1b91479b954d76cc1fcf7f 100644 +index b4ebd8d3ad90e51ed953d091610eafe558a3184f..686f64000ca633fe58d8d479ef3c8462052ec9c5 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -193,6 +193,15 @@ public abstract class Player extends LivingEntity { - } - // CraftBukkit end +@@ -196,6 +196,13 @@ public abstract class Player extends LivingEntity { + public abstract void resetLastActionTime(); -+ // Purpur start + // Purpur start + public void setAfk(boolean afk) { + } + + public boolean isAfk() { + return false; + } -+ // Purpur end + - public Player(Level world, BlockPos pos, float yaw, GameProfile profile) { - super(EntityType.PLAYER, world); - this.lastItemInMainHand = ItemStack.EMPTY; + @Override + public boolean processClick(InteractionHand hand) { + Entity vehicle = getRootVehicle(); diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java index b0cafe6e0bdb3f297c13f310fdbe9e3158a6715d..2d953133a7e15699952ec0f8a7dc00c91ed32e03 100644 --- a/src/main/java/net/minecraft/world/level/EntityGetter.java @@ -175,34 +173,32 @@ index b0cafe6e0bdb3f297c13f310fdbe9e3158a6715d..2d953133a7e15699952ec0f8a7dc00c9 if (range < 0.0D || d < range * range) { return true; diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 7e0c9505427f58df767ab44f18bec66212b7dd57..5842f8fad24c08cb001a192bf36de690fd14cd32 100644 +index 7bb30fba98b5b217df72e6df5b2dc4e6082d1a6a..e818682578beac89fb6b7c8cf6a2240b1210055a 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -128,6 +128,15 @@ public class PurpurConfig { +@@ -128,8 +128,14 @@ public class PurpurConfig { return config.getString(path, config.getString(path)); } -+ public static String afkBroadcastAway = "§e§o%s is now AFK"; -+ public static String afkBroadcastBack = "§e§o%s is no longer AFK"; ++ public static String afkBroadcastAway = "%s is now AFK"; ++ public static String afkBroadcastBack = "%s is no longer AFK"; + public static String afkTabListPrefix = "[AFK] "; -+ private static void messages() { + public static String cannotRideMob = "You cannot mount that mob"; + private static void messages() { + afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); + afkBroadcastBack = getString("settings.messages.afk-broadcast-back", afkBroadcastBack); + afkTabListPrefix = getString("settings.messages.afk-tab-list-prefix", afkTabListPrefix); -+ } -+ - public static String timingsUrl = "https://timings.pl3x.net"; - private static void timingsSettings() { - timingsUrl = getString("settings.timings.url", timingsUrl); + cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); + } + diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 361f7857e461578e90cb71e15027dadaf794cb69..2578a4677d1ee060f687be531e696b7c7be89e84 100644 +index 4fd7d61c5d225f0dc0666ad7219542777afe01ea..a2f482e3dbcfb93cdee2678ca963c46479670e8c 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -56,4 +56,15 @@ public class PurpurWorldConfig { - PurpurConfig.config.addDefault("world-settings.default." + path, def); +@@ -57,6 +57,17 @@ public class PurpurWorldConfig { return PurpurConfig.config.getString("world-settings." + worldName + "." + path, PurpurConfig.config.getString("world-settings.default." + path)); } -+ + + public boolean idleTimeoutKick = true; + public boolean idleTimeoutTickNearbyEntities = true; + public boolean idleTimeoutCountAsSleeping = false; @@ -213,7 +209,10 @@ index 361f7857e461578e90cb71e15027dadaf794cb69..2578a4677d1ee060f687be531e696b7c + idleTimeoutCountAsSleeping = getBoolean("gameplay-mechanics.player.idle-timeout.count-as-sleeping", idleTimeoutCountAsSleeping); + idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); + } - } ++ + public boolean babiesAreRidable = true; + public boolean untamedTamablesAreRidable = true; + public boolean useNightVisionWhenRiding = false; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 05007190441117fe8b2f8b54fc37e589ffc213dc..04b49b0d570d3049ffa756376e2f374a98335b67 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java diff --git a/patches/server/0008-Bring-back-server-name.patch b/patches/server/0009-Bring-back-server-name.patch similarity index 100% rename from patches/server/0008-Bring-back-server-name.patch rename to patches/server/0009-Bring-back-server-name.patch diff --git a/patches/server/0009-Configurable-server-mod-name.patch b/patches/server/0010-Configurable-server-mod-name.patch similarity index 78% rename from patches/server/0009-Configurable-server-mod-name.patch rename to patches/server/0010-Configurable-server-mod-name.patch index 64f702a5b..318d9bab0 100644 --- a/patches/server/0009-Configurable-server-mod-name.patch +++ b/patches/server/0010-Configurable-server-mod-name.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable server mod name diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index f40e6ae2a1a3c9c76071a60a3bdfb4762ab68deb..e50aa9ab6ca8adde7a2314ad86f604e68cf0de43 100644 +index 2ff3c3f64a61e152262e82a1c33a474bbe4e9c5c..247b4c599018cb42cd4b2da5d8b4d732f2e884b0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1634,7 +1634,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info -@@ -3009,6 +3025,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -3011,6 +3027,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @Override public void handleKeepAlive(ServerboundKeepAlivePacket packet) { @@ -56,10 +56,10 @@ index 23e536192bce9f85bebdcd8ba8dc019ca56fde90..5c4d8b3587ff2eae4669428be90df5bf if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) { int i = (int) (Util.getMillis() - this.keepAliveTime); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index d940b295dc8657387e6e62fb9e0009a7b2c37121..675d29694c3acf5806c237459407ac45a2825409 100644 +index 2c80bfba35073b0f381673cff7c972865f707ee5..53803f1dc9dcdae0c26193e627f52318d83a047d 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -153,6 +153,11 @@ public class PurpurConfig { +@@ -155,6 +155,11 @@ public class PurpurConfig { laggingThreshold = getDouble("settings.lagging-threshold", laggingThreshold); } diff --git a/patches/server/0019-Silk-touch-spawners.patch b/patches/server/0020-Silk-touch-spawners.patch similarity index 97% rename from patches/server/0019-Silk-touch-spawners.patch rename to patches/server/0020-Silk-touch-spawners.patch index 127d95b11..09befc9e2 100644 --- a/patches/server/0019-Silk-touch-spawners.patch +++ b/patches/server/0020-Silk-touch-spawners.patch @@ -170,7 +170,7 @@ index b1e04d41de80971a7a1616beb0860226ecc25045..9ce53046b7f67309c2d4636b95e6fb05 public void spawnAfterBreak(BlockState state, ServerLevel world, BlockPos pos, ItemStack stack) { super.spawnAfterBreak(state, world, pos, stack); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index c7fb5a737cab0083c39732247acb8f4e87562894..f06be7e567f39b7c3c3d4b75bb5892b3d938533b 100644 +index 76bd14850cdabd2883611ebecaa8227efdd02a64..50fe7dbad049db6be24a2ed68b07df587b0f5830 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -1,6 +1,12 @@ @@ -213,6 +213,6 @@ index c7fb5a737cab0083c39732247acb8f4e87562894..f06be7e567f39b7c3c3d4b75bb5892b3 + }); + } + - public int villagerBrainTicks = 1; - public boolean villagerUseBrainTicksOnlyWhenLagging = true; - private void villagerSettings() { + public boolean babiesAreRidable = true; + public boolean untamedTamablesAreRidable = true; + public boolean useNightVisionWhenRiding = false; diff --git a/patches/server/0020-MC-168772-Fix-Add-turtle-egg-block-options.patch b/patches/server/0021-MC-168772-Fix-Add-turtle-egg-block-options.patch similarity index 87% rename from patches/server/0020-MC-168772-Fix-Add-turtle-egg-block-options.patch rename to patches/server/0021-MC-168772-Fix-Add-turtle-egg-block-options.patch index 83fe2a993..92017583a 100644 --- a/patches/server/0020-MC-168772-Fix-Add-turtle-egg-block-options.patch +++ b/patches/server/0021-MC-168772-Fix-Add-turtle-egg-block-options.patch @@ -50,22 +50,23 @@ index fdb3ab919a78221605257ae82bfd026346ce2ffb..e98fc3c235f9160f1928a8afb0d7991a } } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index f06be7e567f39b7c3c3d4b75bb5892b3d938533b..e778601b9a075311715d24beffaa421abb25c153 100644 +index 50fe7dbad049db6be24a2ed68b07df587b0f5830..148cc428b17e0db46a86079bf4e2199b52f1ad84 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -104,6 +104,15 @@ public class PurpurWorldConfig { - }); - } +@@ -532,9 +532,15 @@ public class PurpurWorldConfig { + public boolean turtleRidable = false; + public boolean turtleRidableInWater = false; +- private void turtleSettings() { + public boolean turtleEggsBreakFromExpOrbs = true; + public boolean turtleEggsBreakFromItems = true; + public boolean turtleEggsBreakFromMinecarts = true; + private void turtleEggSettings() { + turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); + turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); + turtleEggsBreakFromExpOrbs = getBoolean("blocks.turtle_egg.break-from-exp-orbs", turtleEggsBreakFromExpOrbs); + turtleEggsBreakFromItems = getBoolean("blocks.turtle_egg.break-from-items", turtleEggsBreakFromItems); + turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); -+ } -+ - public int villagerBrainTicks = 1; - public boolean villagerUseBrainTicksOnlyWhenLagging = true; - private void villagerSettings() { + } + + public boolean vexRidable = false; diff --git a/patches/server/0021-Fix-vanilla-command-permission-handler.patch b/patches/server/0022-Fix-vanilla-command-permission-handler.patch similarity index 100% rename from patches/server/0021-Fix-vanilla-command-permission-handler.patch rename to patches/server/0022-Fix-vanilla-command-permission-handler.patch diff --git a/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0023-Logger-settings-suppressing-pointless-logs.patch similarity index 95% rename from patches/server/0022-Logger-settings-suppressing-pointless-logs.patch rename to patches/server/0023-Logger-settings-suppressing-pointless-logs.patch index f86aba059..84b31cf2f 100644 --- a/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch +++ b/patches/server/0023-Logger-settings-suppressing-pointless-logs.patch @@ -17,10 +17,10 @@ index d1f85b092eba829b003e39c913a4afeffc140568..e159bf06a225aa63b4d397a7c76fa9ef } // CraftBukkit end diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 675d29694c3acf5806c237459407ac45a2825409..4e8f346cfe09b5806f53ae85729b3597b2e7c9eb 100644 +index 53803f1dc9dcdae0c26193e627f52318d83a047d..4bac9e7c419c43b163bda6d1cebaa4c5fe42317f 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -176,4 +176,11 @@ public class PurpurConfig { +@@ -178,4 +178,11 @@ public class PurpurConfig { org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); } diff --git a/patches/server/0023-Disable-outdated-build-check.patch b/patches/server/0024-Disable-outdated-build-check.patch similarity index 100% rename from patches/server/0023-Disable-outdated-build-check.patch rename to patches/server/0024-Disable-outdated-build-check.patch diff --git a/patches/server/0024-Giants-AI-settings.patch b/patches/server/0025-Giants-AI-settings.patch similarity index 93% rename from patches/server/0024-Giants-AI-settings.patch rename to patches/server/0025-Giants-AI-settings.patch index 2ae50a32f..e09955f01 100644 --- a/patches/server/0024-Giants-AI-settings.patch +++ b/patches/server/0025-Giants-AI-settings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Giants AI settings diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index a62d79fbd7f1974f98520c536948225c5dc53c12..3c40cec55a1195f81ce453eaebe9487e140297ae 100644 +index 0fc358d5491900affb61545d89a788bbb2435c04..c150a898c60a3477012e7d49e30f98cfcdc27247 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -289,6 +289,7 @@ public abstract class LivingEntity extends Entity { @@ -135,13 +135,13 @@ index a183226bb0cf01c5aaf7babe1d08fa9ab7388648..8f86797cd47b338a599dc053a515e16c } } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index e778601b9a075311715d24beffaa421abb25c153..abf4d0b330ceeb1bd50b1fc17651727ec9d8d5e3 100644 +index 148cc428b17e0db46a86079bf4e2199b52f1ad84..3f92159deba19bb7257d920ec3b1f31c0e2bcf87 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -113,6 +113,28 @@ public class PurpurWorldConfig { - turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); - } +@@ -261,9 +261,28 @@ public class PurpurWorldConfig { + public boolean giantRidable = false; + public boolean giantRidableInWater = false; + public float giantStepHeight = 2.0F; + public float giantJumpHeight = 1.0F; + public double giantMovementSpeed = 0.5D; @@ -149,7 +149,9 @@ index e778601b9a075311715d24beffaa421abb25c153..abf4d0b330ceeb1bd50b1fc17651727e + public boolean giantHaveAI = false; + public boolean giantHaveHostileAI = false; + public double giantMaxHealth = 100.0D; -+ private void giantSettings() { + private void giantSettings() { + giantRidable = getBoolean("mobs.giant.ridable", giantRidable); + giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); + giantStepHeight = (float) getDouble("mobs.giant.step-height", giantStepHeight); + giantJumpHeight = (float) getDouble("mobs.giant.jump-height", giantJumpHeight); + giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); @@ -162,8 +164,6 @@ index e778601b9a075311715d24beffaa421abb25c153..abf4d0b330ceeb1bd50b1fc17651727e + set("mobs.giant.max-health", null); + } + giantMaxHealth = getDouble("mobs.giant.attributes.max-health", giantMaxHealth); -+ } -+ - public int villagerBrainTicks = 1; - public boolean villagerUseBrainTicksOnlyWhenLagging = true; - private void villagerSettings() { + } + + public boolean glowSquidRidable = false; diff --git a/patches/server/0025-Illusioners-AI-settings.patch b/patches/server/0026-Illusioners-AI-settings.patch similarity index 80% rename from patches/server/0025-Illusioners-AI-settings.patch rename to patches/server/0026-Illusioners-AI-settings.patch index 60d915f70..778654b2a 100644 --- a/patches/server/0025-Illusioners-AI-settings.patch +++ b/patches/server/0026-Illusioners-AI-settings.patch @@ -25,17 +25,19 @@ index c9fa01b910de7ecb494d3000afebea9a2bd1276a..c3ba23ed30d2e46a8e66d239ce026187 protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index abf4d0b330ceeb1bd50b1fc17651727ec9d8d5e3..d15f9d600e25fdb1f950a016c947da6711d77ff9 100644 +index 3f92159deba19bb7257d920ec3b1f31c0e2bcf87..6790836b719bbab7c5ab8ead6efd9723b4f58cd1 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -135,6 +135,20 @@ public class PurpurWorldConfig { - giantMaxHealth = getDouble("mobs.giant.attributes.max-health", giantMaxHealth); - } +@@ -323,9 +323,20 @@ public class PurpurWorldConfig { + public boolean illusionerRidable = false; + public boolean illusionerRidableInWater = false; + public double illusionerMovementSpeed = 0.5D; + public double illusionerFollowRange = 18.0D; + public double illusionerMaxHealth = 32.0D; -+ private void illusionerSettings() { + private void illusionerSettings() { + illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); + illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); + illusionerMovementSpeed = getDouble("mobs.illusioner.movement-speed", illusionerMovementSpeed); + illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); + if (PurpurConfig.version < 8) { @@ -44,8 +46,6 @@ index abf4d0b330ceeb1bd50b1fc17651727ec9d8d5e3..d15f9d600e25fdb1f950a016c947da67 + set("mobs.illusioner.max-health", null); + } + illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max-health", illusionerMaxHealth); -+ } -+ - public int villagerBrainTicks = 1; - public boolean villagerUseBrainTicksOnlyWhenLagging = true; - private void villagerSettings() { + } + + public boolean ironGolemRidable = false; diff --git a/patches/server/0026-Zombie-horse-naturally-spawn.patch b/patches/server/0027-Zombie-horse-naturally-spawn.patch similarity index 81% rename from patches/server/0026-Zombie-horse-naturally-spawn.patch rename to patches/server/0027-Zombie-horse-naturally-spawn.patch index 74fdb2167..8bf99af67 100644 --- a/patches/server/0026-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0027-Zombie-horse-naturally-spawn.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Zombie horse naturally spawn diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index fe6d8b93f5685b611f1f2fe6ac28a0b718e198cc..31b9f57f74ae53c3f6cd5a16811b360ccb746a7a 100644 +index 900b30c9ba0d7b9e0b19c23c1eb5b75dbf2d7141..e09f031f08efa7ed5145566de459b044313ff117 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -87,6 +87,7 @@ import net.minecraft.world.entity.ai.village.poi.PoiManager; @@ -16,7 +16,7 @@ index fe6d8b93f5685b611f1f2fe6ac28a0b718e198cc..31b9f57f74ae53c3f6cd5a16811b360c import net.minecraft.world.entity.animal.horse.SkeletonHorse; import net.minecraft.world.entity.boss.EnderDragonPart; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; -@@ -712,12 +713,18 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl +@@ -713,12 +714,18 @@ public class ServerLevel extends net.minecraft.world.level.Level implements Worl boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * paperConfig.skeleHorseSpawnChance && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper if (flag1) { @@ -42,16 +42,18 @@ index fe6d8b93f5685b611f1f2fe6ac28a0b718e198cc..31b9f57f74ae53c3f6cd5a16811b360c LightningBolt entitylightning = (LightningBolt) EntityType.LIGHTNING_BOLT.create((net.minecraft.world.level.Level) this); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index d15f9d600e25fdb1f950a016c947da6711d77ff9..bf943d2d293508da31eb7e2527dc33f1296dac03 100644 +index 6790836b719bbab7c5ab8ead6efd9723b4f58cd1..d8011e5fe28458ae62f764cc355838bd08491f94 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -155,4 +155,9 @@ public class PurpurWorldConfig { - villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); - villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); - } -+ +@@ -651,9 +651,11 @@ public class PurpurWorldConfig { + + public boolean zombieHorseRidableInWater = false; + public boolean zombieHorseCanSwim = false; + public double zombieHorseSpawnChance = 0.0D; -+ private void zombieHorseSettings() { + private void zombieHorseSettings() { + zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); + zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); + zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); -+ } - } + } + + public boolean zombieVillagerRidable = false; diff --git a/patches/server/0027-Charged-creeper-naturally-spawn.patch b/patches/server/0028-Charged-creeper-naturally-spawn.patch similarity index 86% rename from patches/server/0027-Charged-creeper-naturally-spawn.patch rename to patches/server/0028-Charged-creeper-naturally-spawn.patch index 915791251..67d63116a 100644 --- a/patches/server/0027-Charged-creeper-naturally-spawn.patch +++ b/patches/server/0028-Charged-creeper-naturally-spawn.patch @@ -57,18 +57,18 @@ index e8c36e8541f041a0d72a86f49ced2a3ce1549be0..27d8279b71f55ae711b0455bb4c5f152 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index bf943d2d293508da31eb7e2527dc33f1296dac03..340fa2e2029c4a118fdfef93b40377eb31f7828f 100644 +index d8011e5fe28458ae62f764cc355838bd08491f94..375eb6499a91e73310e93d6d42eaa799751f22a2 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -113,6 +113,11 @@ public class PurpurWorldConfig { - turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); +@@ -180,9 +180,11 @@ public class PurpurWorldConfig { + + public boolean creeperRidable = false; + public boolean creeperRidableInWater = false; ++ public double creeperChargedChance = 0.0D; + private void creeperSettings() { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); ++ creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); } -+ public double creeperChargedChance = 0.0D; -+ private void creeperSettings() { -+ creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); -+ } -+ - public float giantStepHeight = 2.0F; - public float giantJumpHeight = 1.0F; - public double giantMovementSpeed = 0.5D; + public boolean dolphinRidable = false; diff --git a/patches/server/0028-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0029-Rabbit-naturally-spawn-toast-and-killer.patch similarity index 78% rename from patches/server/0028-Rabbit-naturally-spawn-toast-and-killer.patch rename to patches/server/0029-Rabbit-naturally-spawn-toast-and-killer.patch index bbe93c839..c8f66e1e3 100644 --- a/patches/server/0028-Rabbit-naturally-spawn-toast-and-killer.patch +++ b/patches/server/0029-Rabbit-naturally-spawn-toast-and-killer.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Rabbit naturally spawn toast and killer diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index 3a9391b512974e812cac0d89119f68ba6728bfc9..2e6df2753b7a5397dea3dcef3e47750af7132d18 100644 +index 4a60afbb79ffb86d3c41b48d923ca8b3beca1c54..384f8abd0fd12906956d1459115f48738cc6e16d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java @@ -365,7 +365,11 @@ public class Rabbit extends Animal { @@ -38,20 +38,20 @@ index 3a9391b512974e812cac0d89119f68ba6728bfc9..2e6df2753b7a5397dea3dcef3e47750a int i = this.random.nextInt(100); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 340fa2e2029c4a118fdfef93b40377eb31f7828f..f9908c4edd1b47b447556feeb5de05a0fd3db468 100644 +index 375eb6499a91e73310e93d6d42eaa799751f22a2..100982bbf3f47a7c5d2da3e3f6957118c807b2f3 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -154,6 +154,13 @@ public class PurpurWorldConfig { - illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max-health", illusionerMaxHealth); - } +@@ -456,9 +456,13 @@ public class PurpurWorldConfig { + public boolean rabbitRidable = false; + public boolean rabbitRidableInWater = false; + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; -+ private void rabbitSettings() { + private void rabbitSettings() { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); + rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); + rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); -+ } -+ - public int villagerBrainTicks = 1; - public boolean villagerUseBrainTicksOnlyWhenLagging = true; - private void villagerSettings() { + } + + public boolean ravagerRidable = false; diff --git a/patches/server/0029-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch similarity index 100% rename from patches/server/0029-Fix-outdated-server-showing-in-ping-before-server-fu.patch rename to patches/server/0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch diff --git a/patches/server/0030-Make-Iron-Golems-Swim.patch b/patches/server/0030-Make-Iron-Golems-Swim.patch deleted file mode 100644 index e4c1add72..000000000 --- a/patches/server/0030-Make-Iron-Golems-Swim.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 15 Jun 2019 03:12:15 -0500 -Subject: [PATCH] Make Iron Golems Swim - - -diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index ec00c2dd8f969eb99ec6a014e3bcd09c7484b237..9604bda9ed7e0a87bd627521440e8b70f076584a 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -+++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -30,6 +30,7 @@ import net.minecraft.world.entity.Mob; - import net.minecraft.world.entity.NeutralMob; - import net.minecraft.world.entity.ai.attributes.AttributeSupplier; - import net.minecraft.world.entity.ai.attributes.Attributes; -+import net.minecraft.world.entity.ai.goal.FloatGoal; - import net.minecraft.world.entity.ai.goal.GolemRandomStrollInVillageGoal; - import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; - import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; -@@ -72,6 +73,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - - @Override - protected void registerGoals() { -+ if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new FloatGoal(this)); // Purpur - this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true)); - this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9D, 32.0F)); - this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6D, false)); -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index f9908c4edd1b47b447556feeb5de05a0fd3db468..d7a0d258fb150a595fc8fcbf47cc9dbdb899421a 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -154,6 +154,11 @@ public class PurpurWorldConfig { - illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max-health", illusionerMaxHealth); - } - -+ public boolean ironGolemCanSwim = false; -+ private void ironGolemSettings() { -+ ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); -+ } -+ - public double rabbitNaturalToast = 0.0D; - public double rabbitNaturalKiller = 0.0D; - private void rabbitSettings() { diff --git a/patches/server/0031-Dont-send-useless-entity-packets.patch b/patches/server/0031-Dont-send-useless-entity-packets.patch index a79ee7041..d6441aaa9 100644 --- a/patches/server/0031-Dont-send-useless-entity-packets.patch +++ b/patches/server/0031-Dont-send-useless-entity-packets.patch @@ -40,10 +40,10 @@ index 8ea4209400489116823eced292d8cd9654a1c809..d19a025337c4b0a2965184b4c872f23d this.entity.stopSeenByPlayer(player); player.connection.send(new ClientboundRemoveEntityPacket(this.entity.getId())); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 4e8f346cfe09b5806f53ae85729b3597b2e7c9eb..561c27bc5c23e3761018b8475ad1512d880418fc 100644 +index 4bac9e7c419c43b163bda6d1cebaa4c5fe42317f..94eb70018300ffd0c0796481118dba5ae1d954e3 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -177,6 +177,11 @@ public class PurpurConfig { +@@ -179,6 +179,11 @@ public class PurpurConfig { enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); } diff --git a/patches/server/0032-Tulips-change-fox-type.patch b/patches/server/0032-Tulips-change-fox-type.patch index f0efad7e9..5d94265a2 100644 --- a/patches/server/0032-Tulips-change-fox-type.patch +++ b/patches/server/0032-Tulips-change-fox-type.patch @@ -75,18 +75,18 @@ index 31f4e4a93ea5fd3ffe7e60dff2e2a9642b51daa2..26470e4e07387fcf0c02c1f8845950ec // Paper start - Cancellable death event protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(DamageSource source) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index d7a0d258fb150a595fc8fcbf47cc9dbdb899421a..142135c8058eb3f199f5f7d4572daaac45d997a0 100644 +index 100982bbf3f47a7c5d2da3e3f6957118c807b2f3..ce147273c7debd993af91df176cfe639ae95dfdc 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -118,6 +118,11 @@ public class PurpurWorldConfig { - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); +@@ -247,9 +247,11 @@ public class PurpurWorldConfig { + + public boolean foxRidable = false; + public boolean foxRidableInWater = false; ++ public boolean foxTypeChangesWithTulips = false; + private void foxSettings() { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); ++ foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); } -+ public boolean foxTypeChangesWithTulips = false; -+ private void foxSettings() { -+ foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); -+ } -+ - public float giantStepHeight = 2.0F; - public float giantJumpHeight = 1.0F; - public double giantMovementSpeed = 0.5D; + public boolean ghastRidable = false; diff --git a/patches/server/0033-Breedable-Polar-Bears.patch b/patches/server/0033-Breedable-Polar-Bears.patch index 6a6337c71..7ef522bcd 100644 --- a/patches/server/0033-Breedable-Polar-Bears.patch +++ b/patches/server/0033-Breedable-Polar-Bears.patch @@ -84,21 +84,21 @@ index 0694cd0b994ee595adca43c988485e6dc13c7244..583bb80059b9351d27d15859b1687dd8 this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 142135c8058eb3f199f5f7d4572daaac45d997a0..8191eba054e4d47a1310c6d57688d759b909443e 100644 +index ce147273c7debd993af91df176cfe639ae95dfdc..32b37da32b6cb2bb0a76a1759eacd28b8e32ece1 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -164,6 +164,14 @@ public class PurpurWorldConfig { - ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); - } +@@ -446,9 +446,14 @@ public class PurpurWorldConfig { + public boolean polarBearRidable = false; + public boolean polarBearRidableInWater = false; + public String polarBearBreedableItemString = ""; + public Item polarBearBreedableItem = null; -+ private void polarBearSettings() { + private void polarBearSettings() { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); + polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); + Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); + if (item != Items.AIR) polarBearBreedableItem = item; -+ } -+ - public double rabbitNaturalToast = 0.0D; - public double rabbitNaturalKiller = 0.0D; - private void rabbitSettings() { + } + + public boolean pufferfishRidable = false; diff --git a/patches/server/0034-Chickens-can-retaliate.patch b/patches/server/0034-Chickens-can-retaliate.patch index c33b96374..33adab1dc 100644 --- a/patches/server/0034-Chickens-can-retaliate.patch +++ b/patches/server/0034-Chickens-can-retaliate.patch @@ -66,18 +66,18 @@ index 8460bed561c09a647f6e0209f7c5448e5a42b281..56aee819372d4baacf73c345603ce889 @Override diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 8191eba054e4d47a1310c6d57688d759b909443e..615f7a3ccb925a8db52c5f2e4e0510f740784194 100644 +index 32b37da32b6cb2bb0a76a1759eacd28b8e32ece1..f6f3910c5a9f011e1513174cb9d70080ddb5b024 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -113,6 +113,11 @@ public class PurpurWorldConfig { - turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); +@@ -161,9 +161,11 @@ public class PurpurWorldConfig { + + public boolean chickenRidable = false; + public boolean chickenRidableInWater = false; ++ public boolean chickenRetaliate = false; + private void chickenSettings() { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); ++ chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); } -+ public boolean chickenRetaliate = false; -+ private void chickenSettings() { -+ chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); -+ } -+ - public double creeperChargedChance = 0.0D; - private void creeperSettings() { - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); + public boolean codRidable = false; diff --git a/patches/server/0036-Cat-spawning-options.patch b/patches/server/0036-Cat-spawning-options.patch index 3d0e480fb..125d00369 100644 --- a/patches/server/0036-Cat-spawning-options.patch +++ b/patches/server/0036-Cat-spawning-options.patch @@ -49,22 +49,22 @@ index 4cab98b5e441a174482893d3d289bbafa1f7a5fc..fa3cdff99a16b67ed86c8f7940ffa139 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 5d80cd3049e33d1bed7d347f4092a0ca476f711b..808803acb28dd6d7b2db1153a5a30cc3be46b2e4 100644 +index ea7da77cc31a2220609f760d5f454c455b50d416..1806b9121cc131e4d4f57f4da004666954be7268 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -118,6 +118,15 @@ public class PurpurWorldConfig { - turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts); - } +@@ -152,9 +152,15 @@ public class PurpurWorldConfig { + public boolean catRidable = false; + public boolean catRidableInWater = false; + public int catSpawnDelay = 1200; + public int catSpawnSwampHutScanRange = 16; + public int catSpawnVillageScanRange = 48; -+ private void catSettings() { + private void catSettings() { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); + catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); + catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); + catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); -+ } -+ - public boolean chickenRetaliate = false; - private void chickenSettings() { - chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); + } + + public boolean caveSpiderRidable = false; diff --git a/patches/server/0038-Cows-eat-mushrooms.patch b/patches/server/0038-Cows-eat-mushrooms.patch index 136dbb3f4..73a870135 100644 --- a/patches/server/0038-Cows-eat-mushrooms.patch +++ b/patches/server/0038-Cows-eat-mushrooms.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cows eat mushrooms diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index c9dcbc2dcb2736d0f448496c67121db29b7d4deb..c338dcca4242e472fe2290f0ec20ea67a90cdd06 100644 +index 1cb5342d63011605b567a4fe16d07de831f04216..a1f498081cb9e198f8796d800c6d130b30256098 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -1,6 +1,7 @@ @@ -24,15 +24,15 @@ index c9dcbc2dcb2736d0f448496c67121db29b7d4deb..c338dcca4242e472fe2290f0ec20ea67 import net.minecraft.world.level.block.state.BlockState; // CraftBukkit start import org.bukkit.craftbukkit.event.CraftEventFactory; -@@ -45,6 +47,7 @@ public class Cow extends Animal { - this.goalSelector.addGoal(0, new FloatGoal(this)); +@@ -58,6 +60,7 @@ public class Cow extends Animal { + this.goalSelector.addGoal(0, new net.pl3x.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); + if (level.purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); -@@ -99,11 +102,80 @@ public class Cow extends Animal { +@@ -113,11 +116,80 @@ public class Cow extends Animal { player.setItemInHand(hand, itemstack1); return InteractionResult.sidedSuccess(this.level.isClientSide); @@ -114,18 +114,18 @@ index c9dcbc2dcb2736d0f448496c67121db29b7d4deb..c338dcca4242e472fe2290f0ec20ea67 public Cow getBreedOffspring(ServerLevel world, AgeableMob entity) { return (Cow) EntityType.COW.create((Level) world); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 808803acb28dd6d7b2db1153a5a30cc3be46b2e4..37b4b1b749a961e1702408c86dd84bc0dcbfa12b 100644 +index 1806b9121cc131e4d4f57f4da004666954be7268..e9a00422f9952c98d04c0cbb2ea32ea6231f50ed 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -132,6 +132,11 @@ public class PurpurWorldConfig { - chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); +@@ -186,9 +186,11 @@ public class PurpurWorldConfig { + + public boolean cowRidable = false; + public boolean cowRidableInWater = false; ++ public int cowFeedMushrooms = 0; + private void cowSettings() { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); ++ cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); } -+ public int cowFeedMushrooms = 0; -+ private void cowSettings() { -+ cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); -+ } -+ - public double creeperChargedChance = 0.0D; - private void creeperSettings() { - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); + public boolean creeperRidable = false; diff --git a/patches/server/0040-Pigs-give-saddle-back.patch b/patches/server/0040-Pigs-give-saddle-back.patch index a518c38ff..afd0bc9b9 100644 --- a/patches/server/0040-Pigs-give-saddle-back.patch +++ b/patches/server/0040-Pigs-give-saddle-back.patch @@ -28,18 +28,18 @@ index 2c95b6eddfe46e5d2ad495bfc86ccc24ae75e704..8a99b04e8179a640a289c4853777aa88 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 37b4b1b749a961e1702408c86dd84bc0dcbfa12b..7a31a6973f1f7ec301befe00ce0153a0827f593e 100644 +index e9a00422f9952c98d04c0cbb2ea32ea6231f50ed..e1da56c301be94c56c8377034ab948a1e4ecd071 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -188,6 +188,11 @@ public class PurpurWorldConfig { - ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); +@@ -433,9 +433,11 @@ public class PurpurWorldConfig { + + public boolean pigRidable = false; + public boolean pigRidableInWater = false; ++ public boolean pigGiveSaddleBack = false; + private void pigSettings() { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); ++ pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); } -+ public boolean pigGiveSaddleBack = false; -+ private void pigSettings() { -+ pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); -+ } -+ - public String polarBearBreedableItemString = ""; - public Item polarBearBreedableItem = null; - private void polarBearSettings() { + public boolean piglinRidable = false; diff --git a/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch b/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch index ad801bf92..5d0ec38cc 100644 --- a/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch +++ b/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch @@ -32,20 +32,21 @@ index 2631f08496c8e45874b22760b559a91b7b2bf415..226cadfc5f109b8f5060b5147034ac27 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 7a31a6973f1f7ec301befe00ce0153a0827f593e..d04981114fa2bce174441558b4d1c7c43ae2ea34 100644 +index e1da56c301be94c56c8377034ab948a1e4ecd071..4b039c4cd94c2ea1a61452530ca200d10829c166 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -208,6 +208,13 @@ public class PurpurWorldConfig { - rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); - } - +@@ -546,10 +546,14 @@ public class PurpurWorldConfig { + public boolean snowGolemRidable = false; + public boolean snowGolemRidableInWater = false; + public boolean snowGolemLeaveTrailWhenRidden = false; + public boolean snowGolemDropsPumpkin = true; + public boolean snowGolemPutPumpkinBack = false; -+ private void snowGolemSettings() { + private void snowGolemSettings() { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); + snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + snowGolemDropsPumpkin = getBoolean("mobs.snow_golem.drop-pumpkin-when-sheared", snowGolemDropsPumpkin); + snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); -+ } -+ - public int villagerBrainTicks = 1; - public boolean villagerUseBrainTicksOnlyWhenLagging = true; - private void villagerSettings() { + } + + public boolean squidRidable = false; diff --git a/patches/server/0042-Ender-dragon-always-drop-full-exp.patch b/patches/server/0042-Ender-dragon-always-drop-full-exp.patch index ec3868520..de3ac0f5d 100644 --- a/patches/server/0042-Ender-dragon-always-drop-full-exp.patch +++ b/patches/server/0042-Ender-dragon-always-drop-full-exp.patch @@ -18,18 +18,19 @@ index c98202092752a9015aaf95bd1471135b88e84425..682b532967a501e21df93c28c4ee4b59 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index d04981114fa2bce174441558b4d1c7c43ae2ea34..33aedbee4508ced806c8b72b91a6d8b4a04a4b76 100644 +index 4b039c4cd94c2ea1a61452530ca200d10829c166..190c1d8878eb4d533d31c6b803b951cdf9747450 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -142,6 +142,11 @@ public class PurpurWorldConfig { - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); +@@ -233,10 +233,12 @@ public class PurpurWorldConfig { + public boolean enderDragonRidable = false; + public boolean enderDragonRidableInWater = false; + public double enderDragonMaxY = 256D; ++ public boolean enderDragonAlwaysDropsFullExp = false; + private void enderDragonSettings() { + enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); + enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); + enderDragonMaxY = getDouble("mobs.ender_dragon.ridable-max-y", enderDragonMaxY); ++ enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); } -+ public boolean enderDragonAlwaysDropsFullExp = false; -+ private void enderDragonSettings() { -+ enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); -+ } -+ - public boolean foxTypeChangesWithTulips = false; - private void foxSettings() { - foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); + public boolean endermanRidable = false; diff --git a/patches/server/0043-Signs-editable-on-right-click.patch b/patches/server/0043-Signs-editable-on-right-click.patch index 02a339e44..da5fe6bc9 100644 --- a/patches/server/0043-Signs-editable-on-right-click.patch +++ b/patches/server/0043-Signs-editable-on-right-click.patch @@ -35,7 +35,7 @@ index 1844ea93f8cea420f01937f85ed17c0ec1bb8bf0..9e80ba8970cad91ea22ac701f76e1413 } else { return InteractionResult.PASS; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 33aedbee4508ced806c8b72b91a6d8b4a04a4b76..26f5a224c7441a96ba4d4bd86eff4cdb100c28e6 100644 +index 190c1d8878eb4d533d31c6b803b951cdf9747450..b9447c92151a8508806d16f81c5f57debf90481b 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -109,6 +109,11 @@ public class PurpurWorldConfig { @@ -47,6 +47,6 @@ index 33aedbee4508ced806c8b72b91a6d8b4a04a4b76..26f5a224c7441a96ba4d4bd86eff4cdb + signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit); + } + - public boolean turtleEggsBreakFromExpOrbs = true; - public boolean turtleEggsBreakFromItems = true; - public boolean turtleEggsBreakFromMinecarts = true; + public boolean babiesAreRidable = true; + public boolean untamedTamablesAreRidable = true; + public boolean useNightVisionWhenRiding = false; diff --git a/patches/server/0044-Signs-allow-color-codes.patch b/patches/server/0044-Signs-allow-color-codes.patch index d7766ba3b..50e31aae1 100644 --- a/patches/server/0044-Signs-allow-color-codes.patch +++ b/patches/server/0044-Signs-allow-color-codes.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Signs allow color codes diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 4a489763b70b48ec6817853328bcfadd8505bffb..b0191d4c4348bf523d9231405e4822fe9d45056a 100644 +index 4816fd89517802dd00b37385d92e6711678ae373..2bf59d615800e9ccecf0f9fb5922a5733c68d188 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1449,6 +1449,7 @@ public class ServerPlayer extends Player { +@@ -1458,6 +1458,7 @@ public class ServerPlayer extends Player { @Override public void openTextEdit(SignBlockEntity sign) { @@ -17,10 +17,10 @@ index 4a489763b70b48ec6817853328bcfadd8505bffb..b0191d4c4348bf523d9231405e4822fe this.connection.send(new ClientboundBlockUpdatePacket(this.level, sign.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos())); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 5c4d8b3587ff2eae4669428be90df5bff4608045..df7ae2126c5b8b81fefadc4245ba956f5916920f 100644 +index 8e53ee171250d2e44c18d9dac379bc8db824b97b..b0874703991524cfaff7c62936d9311053a1d63b 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3000,9 +3000,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -3002,9 +3002,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser } // Paper end if (this.player.isTextFilteringEnabled()) { @@ -77,7 +77,7 @@ index 9b5d11ece006d7aa893360a84ba652c666517ac1..3373c21f90eb08e2bfbb71bc348d085a @Override public ClientboundBlockEntityDataPacket getUpdatePacket() { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 26f5a224c7441a96ba4d4bd86eff4cdb100c28e6..3a9efffb7579665e7360bfcaf4ba390aca3201cb 100644 +index b9447c92151a8508806d16f81c5f57debf90481b..6d7f140dfe4cd66811d2504f025a4d6808e77c20 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -109,8 +109,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0046-Minecart-settings-and-WASD-controls.patch b/patches/server/0046-Minecart-settings-and-WASD-controls.patch index acbdb1a1b..73ed0649b 100644 --- a/patches/server/0046-Minecart-settings-and-WASD-controls.patch +++ b/patches/server/0046-Minecart-settings-and-WASD-controls.patch @@ -4,28 +4,11 @@ Date: Sat, 29 Jun 2019 02:32:40 -0500 Subject: [PATCH] Minecart settings and WASD controls -diff --git a/src/main/java/net/minecraft/core/BlockPos.java b/src/main/java/net/minecraft/core/BlockPos.java -index 22ea0da3836b61bb018ae974d2b8c7546b9528d6..dea8abfd8443702e138823bd536aaac2c3395d6f 100644 ---- a/src/main/java/net/minecraft/core/BlockPos.java -+++ b/src/main/java/net/minecraft/core/BlockPos.java -@@ -41,6 +41,12 @@ public class BlockPos extends Vec3i { - private static final int X_OFFSET = 38; - // Paper end - -+ // Purpur start -+ public BlockPos(net.minecraft.world.entity.Entity entity) { -+ super(entity.getX(), entity.getY(), entity.getZ()); -+ } -+ // Purpur end -+ - public BlockPos(int x, int y, int z) { - super(x, y, z); - } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index b0191d4c4348bf523d9231405e4822fe9d45056a..70a071e55fef2d3e3501b6909ea67798fb1662be 100644 +index 2bf59d615800e9ccecf0f9fb5922a5733c68d188..ab3a0f5af549fed0e048db93c03b1da9b9f0429f 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -976,6 +976,7 @@ public class ServerPlayer extends Player { +@@ -985,6 +985,7 @@ public class ServerPlayer extends Player { if (this.isInvulnerableTo(source)) { return false; } else { @@ -165,7 +148,7 @@ index 933448659367b5f0b323bd91992fc9b59314b8a1..572e5f32a3c5aaffcec31da0cff9151e protected final float explosionResistance; protected final boolean isRandomlyTicking; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 42cf3dc7185408964e226c1fa41e4587c785e045..c63e46ae34a937a3ba5d1dc19afca256e306a224 100644 +index 3cb91a8bc2dda2245993b0b484dee974e024755b..91bfba8f10ee60af5eaf9e95a1b2eb9437820b80 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -4,10 +4,15 @@ import net.minecraft.core.Registry; diff --git a/patches/server/0047-Disable-loot-drops-on-death-by-cramming.patch b/patches/server/0047-Disable-loot-drops-on-death-by-cramming.patch index e5698aea9..edee24b36 100644 --- a/patches/server/0047-Disable-loot-drops-on-death-by-cramming.patch +++ b/patches/server/0047-Disable-loot-drops-on-death-by-cramming.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Disable loot drops on death by cramming diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 3c40cec55a1195f81ce453eaebe9487e140297ae..3cf3a6ba7bec27ce2ae9b294b0676fdc6c9e38b6 100644 +index c150a898c60a3477012e7d49e30f98cfcdc27247..e208c49adff06626ea64fa7d69e2e389f722461f 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1700,8 +1700,10 @@ public abstract class LivingEntity extends Entity { @@ -20,11 +20,11 @@ index 3c40cec55a1195f81ce453eaebe9487e140297ae..3cf3a6ba7bec27ce2ae9b294b0676fdc // CraftBukkit start - Call death event org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops); // Paper diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index c63e46ae34a937a3ba5d1dc19afca256e306a224..ecca777f038f90f5f731777dde2e6cfd39af9bb7 100644 +index 91bfba8f10ee60af5eaf9e95a1b2eb9437820b80..d22871c0ba693af412fbcf842a3a6151777696ed 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -146,6 +146,11 @@ public class PurpurWorldConfig { - idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); +@@ -73,6 +73,11 @@ public class PurpurWorldConfig { + armorstandStepHeight = (float) getDouble("gameplay-mechanics.armorstand.step-height", armorstandStepHeight); } + public boolean disableDropsOnCrammingDeath = false; @@ -32,6 +32,6 @@ index c63e46ae34a937a3ba5d1dc19afca256e306a224..ecca777f038f90f5f731777dde2e6cfd + disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath); + } + - public int playerSpawnInvulnerableTicks = 60; - public boolean playerInvulnerableWhileAcceptingResourcePack = false; - private void playerInvulnerabilities() { + public double minecartMaxSpeed = 0.4D; + public boolean minecartPlaceAnywhere = false; + public boolean minecartControllable = false; diff --git a/patches/server/0048-Players-should-not-cram-to-death.patch b/patches/server/0048-Players-should-not-cram-to-death.patch index 535262841..67c659bae 100644 --- a/patches/server/0048-Players-should-not-cram-to-death.patch +++ b/patches/server/0048-Players-should-not-cram-to-death.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Players should not cram to death diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 70a071e55fef2d3e3501b6909ea67798fb1662be..c965344a8828c9668864abac4caa341787bca9e1 100644 +index ab3a0f5af549fed0e048db93c03b1da9b9f0429f..eaaba6db13ac46c908b0fb52d4c41dfa71a58a10 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1426,7 +1426,7 @@ public class ServerPlayer extends Player { +@@ -1435,7 +1435,7 @@ public class ServerPlayer extends Player { @Override public boolean isInvulnerableTo(DamageSource damageSource) { diff --git a/patches/server/0049-Option-to-toggle-milk-curing-bad-omen.patch b/patches/server/0049-Option-to-toggle-milk-curing-bad-omen.patch index 2de4fc4c1..7acdf18c2 100644 --- a/patches/server/0049-Option-to-toggle-milk-curing-bad-omen.patch +++ b/patches/server/0049-Option-to-toggle-milk-curing-bad-omen.patch @@ -28,10 +28,10 @@ index f33977d95b6db473be4f95075ba99caf90ad0220..56dc04d8875971ee9a5d077a695509af return stack.isEmpty() ? new ItemStack(Items.BUCKET) : stack; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index ecca777f038f90f5f731777dde2e6cfd39af9bb7..d50fb2d82b1fc19d8d8249b72b80e0b11018e35f 100644 +index d22871c0ba693af412fbcf842a3a6151777696ed..4d9c39e78f26ffb43d36a8c729bfd4ed136ff619 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -147,8 +147,10 @@ public class PurpurWorldConfig { +@@ -74,8 +74,10 @@ public class PurpurWorldConfig { } public boolean disableDropsOnCrammingDeath = false; @@ -41,4 +41,4 @@ index ecca777f038f90f5f731777dde2e6cfd39af9bb7..d50fb2d82b1fc19d8d8249b72b80e0b1 + milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen); } - public int playerSpawnInvulnerableTicks = 60; + public double minecartMaxSpeed = 0.4D; diff --git a/patches/server/0054-Add-wither-skeleton-takes-wither-damage-option.patch b/patches/server/0054-Add-wither-skeleton-takes-wither-damage-option.patch index 55e38cdf5..80a23be64 100644 --- a/patches/server/0054-Add-wither-skeleton-takes-wither-damage-option.patch +++ b/patches/server/0054-Add-wither-skeleton-takes-wither-damage-option.patch @@ -17,18 +17,18 @@ index 033d6389e4b7d986fc63abd67e325b68a6132824..f290c7b50c48b798697c49c738700457 } } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index d50fb2d82b1fc19d8d8249b72b80e0b11018e35f..b22f020c24969cf66445570efc1984acb63f03ce 100644 +index 4d9c39e78f26ffb43d36a8c729bfd4ed136ff619..23b2895a3dd3e4d242ce11f89d4dad1c05e606fc 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -313,6 +313,11 @@ public class PurpurWorldConfig { - villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); +@@ -745,9 +745,11 @@ public class PurpurWorldConfig { + + public boolean witherSkeletonRidable = false; + public boolean witherSkeletonRidableInWater = false; ++ public boolean witherSkeletonTakesWitherDamage = false; + private void witherSkeletonSettings() { + witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); + witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); ++ witherSkeletonTakesWitherDamage = getBoolean("mobs.wither_skeleton.takes-wither-damage", witherSkeletonTakesWitherDamage); } -+ public boolean witherSkeletonTakesWitherDamage = false; -+ private void witherSkeletonSettings() { -+ witherSkeletonTakesWitherDamage = getBoolean("mobs.wither_skeleton.takes-wither-damage", witherSkeletonTakesWitherDamage); -+ } -+ - public double zombieHorseSpawnChance = 0.0D; - private void zombieHorseSettings() { - zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); + public boolean wolfRidable = false; diff --git a/patches/server/0055-Configurable-TPS-Catchup.patch b/patches/server/0055-Configurable-TPS-Catchup.patch index 266849572..4d1287020 100644 --- a/patches/server/0055-Configurable-TPS-Catchup.patch +++ b/patches/server/0055-Configurable-TPS-Catchup.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable TPS Catchup diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 33c0fad3f0a7283d193eb23afd210c0d912b5c2d..98b7ccbd1ee4d14fde0cdea2c08c432709fa6e56 100644 +index ba70f1276215620c75cda410ac5acb60c51ffcac..8e8980ef7b2273da6e7dbf4d8d5eb9529a3392af 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1182,7 +1182,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index c4f7c94255e4631a3c0355f9260132ba28296f50..11576b86368479c319691b58ad47f1f1e1479c68 100644 +index c4f7c94255e4631a3c0355f9260132ba28296f50..05fc739b8dfe2ec74a2b070f5cdcd945f5b04b1a 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -25,6 +25,7 @@ import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; @@ -73,29 +73,38 @@ index c4f7c94255e4631a3c0355f9260132ba28296f50..11576b86368479c319691b58ad47f1f1 this.goalSelector.addGoal(1, new PanicGoal(this, 0.5D)); this.goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this)); this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0D, 0.35D)); -+ if (level.purpurConfig.villagerTraderFollowEmeraldBlock) this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); // Purpur ++ if (level.purpurConfig.wanderingTraderFollowEmeraldBlock) this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); // Purpur this.goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 0.35D)); this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 0.35D)); this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F)); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index d69ec4ddb6e0d20546e26765eed9d7d9b3411674..3be920c0fd4b406668cc18fbbb2dec6a7f0c2ab2 100644 +index 53553a5aa2d7571fef895026f30dd4404101d5a3..a53f827843407ae4c8c6252796af66da41683caa 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -320,10 +320,17 @@ public class PurpurWorldConfig { +@@ -717,12 +717,14 @@ public class PurpurWorldConfig { public int villagerBrainTicks = 1; public boolean villagerUseBrainTicksOnlyWhenLagging = true; public boolean villagerFarmingBypassMobGriefing = false; + public boolean villagerFollowEmeraldBlock = false; private void villagerSettings() { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); villagerFarmingBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerFarmingBypassMobGriefing); + villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); -+ } -+ -+ public boolean villagerTraderFollowEmeraldBlock = false; -+ private void villagerTraderSettings() { -+ villagerTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", villagerTraderFollowEmeraldBlock); } - public boolean witherSkeletonTakesWitherDamage = false; + public boolean vindicatorRidable = false; +@@ -734,9 +736,11 @@ public class PurpurWorldConfig { + + public boolean wanderingTraderRidable = false; + public boolean wanderingTraderRidableInWater = false; ++ public boolean wanderingTraderFollowEmeraldBlock = false; + private void wanderingTraderSettings() { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); ++ wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); + } + + public boolean witchRidable = false; diff --git a/patches/server/0061-Allow-leashing-villagers.patch b/patches/server/0061-Allow-leashing-villagers.patch index cab32d253..8e83e2a4a 100644 --- a/patches/server/0061-Allow-leashing-villagers.patch +++ b/patches/server/0061-Allow-leashing-villagers.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Allow leashing villagers diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 4063bceb87da208db76da2a820e5338ba1b5119b..f4c9e6184f39dea9ea1fda98333734773858d0f8 100644 +index f605b87f8d0ea0f3646ab856e8fbf12a25c24594..0cbc90a8c1277a0f35e6636ca73b134b22544db3 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -47,6 +47,7 @@ import net.minecraft.world.entity.decoration.HangingEntity; @@ -16,7 +16,7 @@ index 4063bceb87da208db76da2a820e5338ba1b5119b..f4c9e6184f39dea9ea1fda9833373477 import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.Boat; import net.minecraft.world.item.ArmorItem; -@@ -1207,6 +1208,7 @@ public abstract class Mob extends LivingEntity { +@@ -1209,6 +1210,7 @@ public abstract class Mob extends LivingEntity { if (!this.isAlive()) { return InteractionResult.PASS; } else if (this.getLeashHolder() == player) { @@ -49,7 +49,7 @@ index 897dcb4eb6e5530fb612e16551eb9e4f457985f5..20cb368076017e6dfc28ef4c2af778c0 @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 11576b86368479c319691b58ad47f1f1e1479c68..a17f61874a8999973d7368cf729676dfa9da5569 100644 +index 05fc739b8dfe2ec74a2b070f5cdcd945f5b04b1a..f879faf7ebe01697ab36247dacdd46d4b4fbb77e 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -95,6 +95,13 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -59,7 +59,7 @@ index 11576b86368479c319691b58ad47f1f1e1479c68..a17f61874a8999973d7368cf729676df + // Purpur start + @Override + public boolean canBeLeashed(Player player) { -+ return level.purpurConfig.villagerTraderCanBeLeashed && !this.isLeashed(); ++ return level.purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); + } + // Purpur end + @@ -67,28 +67,35 @@ index 11576b86368479c319691b58ad47f1f1e1479c68..a17f61874a8999973d7368cf729676df @Override public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 3be920c0fd4b406668cc18fbbb2dec6a7f0c2ab2..b6b362befd94e4cca156296058019c8a26c7b2f4 100644 +index a53f827843407ae4c8c6252796af66da41683caa..ab902dc191c7bb0d90e7f3e6b045a017c8b50577 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -319,17 +319,21 @@ public class PurpurWorldConfig { - - public int villagerBrainTicks = 1; +@@ -718,6 +718,7 @@ public class PurpurWorldConfig { public boolean villagerUseBrainTicksOnlyWhenLagging = true; -+ public boolean villagerCanBeLeashed = false; public boolean villagerFarmingBypassMobGriefing = false; public boolean villagerFollowEmeraldBlock = false; ++ public boolean villagerCanBeLeashed = false; private void villagerSettings() { - villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -725,6 +726,7 @@ public class PurpurWorldConfig { villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); -+ villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerFarmingBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerFarmingBypassMobGriefing); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); ++ villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); } -+ public boolean villagerTraderCanBeLeashed = false; - public boolean villagerTraderFollowEmeraldBlock = false; - private void villagerTraderSettings() { -+ villagerTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", villagerTraderCanBeLeashed); - villagerTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", villagerTraderFollowEmeraldBlock); + public boolean vindicatorRidable = false; +@@ -737,10 +739,12 @@ public class PurpurWorldConfig { + public boolean wanderingTraderRidable = false; + public boolean wanderingTraderRidableInWater = false; + public boolean wanderingTraderFollowEmeraldBlock = false; ++ public boolean wanderingTraderCanBeLeashed = false; + private void wanderingTraderSettings() { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); + wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); ++ wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); } + public boolean witchRidable = false; diff --git a/patches/server/0062-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0062-Implement-configurable-search-radius-for-villagers-t.patch index 032a8c4ab..2470449cf 100644 --- a/patches/server/0062-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0062-Implement-configurable-search-radius-for-villagers-t.patch @@ -18,23 +18,24 @@ index 20cb368076017e6dfc28ef4c2af778c0971e8462..88d6b1596463d86f6e4e67da54f16da1 for (int i = 0; i < 10; ++i) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index b6b362befd94e4cca156296058019c8a26c7b2f4..da5a59e87db5374b7113a8515cbe134fca7a2917 100644 +index ab902dc191c7bb0d90e7f3e6b045a017c8b50577..6416319ebbf7822750f317b803eef9dbeefa7480 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -322,12 +322,16 @@ public class PurpurWorldConfig { - public boolean villagerCanBeLeashed = false; +@@ -719,6 +719,8 @@ public class PurpurWorldConfig { public boolean villagerFarmingBypassMobGriefing = false; public boolean villagerFollowEmeraldBlock = false; + public boolean villagerCanBeLeashed = false; + public int villagerSpawnIronGolemRadius = 0; + public int villagerSpawnIronGolemLimit = 0; private void villagerSettings() { - villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); - villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); - villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); +@@ -727,6 +729,8 @@ public class PurpurWorldConfig { villagerFarmingBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerFarmingBypassMobGriefing); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); + villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); + villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius); + villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); } - public boolean villagerTraderCanBeLeashed = false; + public boolean vindicatorRidable = false; diff --git a/patches/server/0065-Add-player-death-exp-control-options.patch b/patches/server/0065-Add-player-death-exp-control-options.patch index e49a0da4b..6ec3a0105 100644 --- a/patches/server/0065-Add-player-death-exp-control-options.patch +++ b/patches/server/0065-Add-player-death-exp-control-options.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Add player death exp control options diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 1cc9291f14a4d655cb1b91479b954d76cc1fcf7f..ea613f494c9c6fbf1aea40eed5164217072ffdc9 100644 +index 686f64000ca633fe58d8d479ef3c8462052ec9c5..b7d572b2ce34f9b856e023fd90d1c7999fc448e5 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -194,6 +194,8 @@ public abstract class Player extends LivingEntity { - // CraftBukkit end +@@ -196,6 +196,8 @@ public abstract class Player extends LivingEntity { + public abstract void resetLastActionTime(); // Purpur start + private javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino"); @@ -17,7 +17,7 @@ index 1cc9291f14a4d655cb1b91479b954d76cc1fcf7f..ea613f494c9c6fbf1aea40eed5164217 public void setAfk(boolean afk) { } -@@ -1888,9 +1890,18 @@ public abstract class Player extends LivingEntity { +@@ -1899,9 +1901,18 @@ public abstract class Player extends LivingEntity { @Override protected int getExperienceReward(Player player) { if (!this.level.getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) { @@ -40,11 +40,11 @@ index 1cc9291f14a4d655cb1b91479b954d76cc1fcf7f..ea613f494c9c6fbf1aea40eed5164217 return 0; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index be27a1c47d17992cfc7927fc5f0e5df23a225d96..d993ddd69022f4d9d9ceb3c449fde504419d1709 100644 +index 46ce3d663b7bbcc7bb40964245ddf0350081d000..b36f3a38ec80db8fef2850a37e839b9d1492d730 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -157,6 +157,13 @@ public class PurpurWorldConfig { - tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); +@@ -146,6 +146,13 @@ public class PurpurWorldConfig { + } } + public String playerDeathExpDropEquation = "expLevel * 7"; @@ -54,6 +54,6 @@ index be27a1c47d17992cfc7927fc5f0e5df23a225d96..d993ddd69022f4d9d9ceb3c449fde504 + playerDeathExpDropMax = getInt("gameplay-mechanics.player.exp-dropped-on-death.maximum", playerDeathExpDropMax); + } + - public int playerSpawnInvulnerableTicks = 60; - public boolean playerInvulnerableWhileAcceptingResourcePack = false; - private void playerInvulnerabilities() { + public boolean idleTimeoutKick = true; + public boolean idleTimeoutTickNearbyEntities = true; + public boolean idleTimeoutCountAsSleeping = false; diff --git a/patches/server/0066-Configurable-void-damage-height-and-damage.patch b/patches/server/0066-Configurable-void-damage-height-and-damage.patch index 447b40f73..6484227d4 100644 --- a/patches/server/0066-Configurable-void-damage-height-and-damage.patch +++ b/patches/server/0066-Configurable-void-damage-height-and-damage.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable void damage height and damage diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 6f5db4ea95603390912cb8c43543586449e6c55f..1d4f8835ba5c719dd3b6dfcab4c1db180a9513b5 100644 +index 227db0f572d96072f6a1e3e3ecaab8a2b588348e..717c4c9a0545e5217ee59b84849bc32733019ad1 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -698,7 +698,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, n @@ -18,7 +18,7 @@ index 6f5db4ea95603390912cb8c43543586449e6c55f..1d4f8835ba5c719dd3b6dfcab4c1db18 && this.getY() >= this.level.paperConfig.netherVoidTopDamageHeight)) { // Paper end diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 8e6a70ce404f499d7bbf26ebc5819ca88a6a7f53..4d9388ee79fd42d89a097127903a40700a28636e 100644 +index 3ebecde8d723b5dc391dc4589cb5ecc5995ea640..09e783519a4e73db804c68510dbb37341dca487d 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -2381,7 +2381,7 @@ public abstract class LivingEntity extends Entity { @@ -31,10 +31,10 @@ index 8e6a70ce404f499d7bbf26ebc5819ca88a6a7f53..4d9388ee79fd42d89a097127903a4070 protected void updateSwingTime() { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index d993ddd69022f4d9d9ceb3c449fde504419d1709..035883538cb4b4ad60b3b872c1348e95d5ebf2be 100644 +index b36f3a38ec80db8fef2850a37e839b9d1492d730..669c03fb31ece7c79100c9c85086b021eaaa0508 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -150,11 +150,15 @@ public class PurpurWorldConfig { +@@ -77,11 +77,15 @@ public class PurpurWorldConfig { public boolean entitiesPickUpLootBypassMobGriefing = false; public boolean milkCuresBadOmen = true; public double tridentLoyaltyVoidReturnHeight = 0.0D; @@ -49,4 +49,4 @@ index d993ddd69022f4d9d9ceb3c449fde504419d1709..035883538cb4b4ad60b3b872c1348e95 + voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); } - public String playerDeathExpDropEquation = "expLevel * 7"; + public double minecartMaxSpeed = 0.4D; diff --git a/patches/server/0067-Dispenser-curse-of-binding-protection.patch b/patches/server/0067-Dispenser-curse-of-binding-protection.patch index 8a556f439..2566e1c57 100644 --- a/patches/server/0067-Dispenser-curse-of-binding-protection.patch +++ b/patches/server/0067-Dispenser-curse-of-binding-protection.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispenser curse of binding protection diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index f4c9e6184f39dea9ea1fda98333734773858d0f8..5cca9a981fe74d9689c69f85e90d0c8ad94220d9 100644 +index 0cbc90a8c1277a0f35e6636ca73b134b22544db3..5ca7c4f73a05c3d2f4859e2abc3404bb71a6a8ac 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -63,6 +63,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; @@ -16,7 +16,7 @@ index f4c9e6184f39dea9ea1fda98333734773858d0f8..5cca9a981fe74d9689c69f85e90d0c8a import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.ItemLike; -@@ -1064,6 +1065,12 @@ public abstract class Mob extends LivingEntity { +@@ -1066,6 +1067,12 @@ public abstract class Mob extends LivingEntity { } @@ -43,7 +43,7 @@ index aab4a63e61aced51b1b6c885fd8b8426a4f14408..ad095c6bc7e00d286c83e37f84d8ed5d // CraftBukkit start Level world = pointer.getLevel(); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 035883538cb4b4ad60b3b872c1348e95d5ebf2be..5feabb6c542c8254d276ba45a634c2f25eb55ef3 100644 +index 669c03fb31ece7c79100c9c85086b021eaaa0508..313db66e32607b40613ba8d2088cad6710cebf0e 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -198,6 +198,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0068-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0068-Add-option-for-boats-to-eject-players-on-land.patch index 944b8a468..d53eb2b14 100644 --- a/patches/server/0068-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0068-Add-option-for-boats-to-eject-players-on-land.patch @@ -17,18 +17,18 @@ index aa7c022c4faade23bd9061311d4152cf845d3331..d4a19fc38027717e43353bc62ef23e56 } else { return Boat.Status.IN_AIR; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 5feabb6c542c8254d276ba45a634c2f25eb55ef3..7735506a31e9614f71498dbe04541b776bf5328d 100644 +index 313db66e32607b40613ba8d2088cad6710cebf0e..db1b55015b3515ff5c54c07f5fa4f526b5179c1a 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -146,6 +146,7 @@ public class PurpurWorldConfig { - idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); +@@ -73,6 +73,7 @@ public class PurpurWorldConfig { + armorstandStepHeight = (float) getDouble("gameplay-mechanics.armorstand.step-height", armorstandStepHeight); } + public boolean boatEjectPlayersOnLand = false; public boolean disableDropsOnCrammingDeath = false; public boolean entitiesPickUpLootBypassMobGriefing = false; public boolean milkCuresBadOmen = true; -@@ -153,6 +154,7 @@ public class PurpurWorldConfig { +@@ -80,6 +81,7 @@ public class PurpurWorldConfig { public double voidDamageHeight = -64.0D; public double voidDamageDealt = 4.0D; private void miscGameplayMechanicsSettings() { diff --git a/patches/server/0069-Mending-mends-most-damages-equipment-first.patch b/patches/server/0069-Mending-mends-most-damages-equipment-first.patch index 8a428c9f7..87e158a45 100644 --- a/patches/server/0069-Mending-mends-most-damages-equipment-first.patch +++ b/patches/server/0069-Mending-mends-most-damages-equipment-first.patch @@ -73,18 +73,18 @@ index 069ce59faab5184ab9da8ca3fe1cebf7449cd7fe..b391b6f457b9a2df9d59eac46473576b Entry entry = getRandomItemWith(enchantment, entityliving); return entry != null ? entry.getValue() : ItemStack.EMPTY; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 7735506a31e9614f71498dbe04541b776bf5328d..4f0da082391d6cf6a761c54a917a8181eefde457 100644 +index db1b55015b3515ff5c54c07f5fa4f526b5179c1a..f6ed942db08ecbcc67a70491b854c703978c63c0 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -146,6 +146,7 @@ public class PurpurWorldConfig { - idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); +@@ -73,6 +73,7 @@ public class PurpurWorldConfig { + armorstandStepHeight = (float) getDouble("gameplay-mechanics.armorstand.step-height", armorstandStepHeight); } + public boolean useBetterMending = false; public boolean boatEjectPlayersOnLand = false; public boolean disableDropsOnCrammingDeath = false; public boolean entitiesPickUpLootBypassMobGriefing = false; -@@ -154,6 +155,7 @@ public class PurpurWorldConfig { +@@ -81,6 +82,7 @@ public class PurpurWorldConfig { public double voidDamageHeight = -64.0D; public double voidDamageDealt = 4.0D; private void miscGameplayMechanicsSettings() { diff --git a/patches/server/0071-Implement-elytra-settings.patch b/patches/server/0071-Implement-elytra-settings.patch index 444851d07..24c8d5769 100644 --- a/patches/server/0071-Implement-elytra-settings.patch +++ b/patches/server/0071-Implement-elytra-settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement elytra settings diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 4d9388ee79fd42d89a097127903a40700a28636e..e3877948e0901f849caa9b530bbd930d526c57f6 100644 +index 09e783519a4e73db804c68510dbb37341dca487d..04a565e35deac75d03e9af4a47e3b28439e68694 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -3261,7 +3261,16 @@ public abstract class LivingEntity extends Entity { +@@ -3278,7 +3278,16 @@ public abstract class LivingEntity extends Entity { int j = i / 10; if (j % 2 == 0) { @@ -99,10 +99,10 @@ index 510ed67a7de2b503ab8b01db57ed09ee33b0d825..3f53dc8f250ad3f7616ce7ef0a2353ca entityhuman.startAutoSpinAttack(20); if (entityhuman.isOnGround()) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 4f0da082391d6cf6a761c54a917a8181eefde457..8306dc47d15492a5a7ad357c6c9073874b231394 100644 +index f6ed942db08ecbcc67a70491b854c703978c63c0..4e23880e93f73e645e160a1a73e4bd0776a01dba 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -165,6 +165,19 @@ public class PurpurWorldConfig { +@@ -92,6 +92,19 @@ public class PurpurWorldConfig { voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); } @@ -119,6 +119,6 @@ index 4f0da082391d6cf6a761c54a917a8181eefde457..8306dc47d15492a5a7ad357c6c907387 + elytraDamagePerTridentBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.trident", elytraDamagePerTridentBoost); + } + - public String playerDeathExpDropEquation = "expLevel * 7"; - public int playerDeathExpDropMax = 100; - private void playerDeathExpSettings() { + public double minecartMaxSpeed = 0.4D; + public boolean minecartPlaceAnywhere = false; + public boolean minecartControllable = false; diff --git a/patches/server/0072-Item-entity-immunities.patch b/patches/server/0072-Item-entity-immunities.patch index 23f3f5478..1cca2c3ba 100644 --- a/patches/server/0072-Item-entity-immunities.patch +++ b/patches/server/0072-Item-entity-immunities.patch @@ -93,11 +93,11 @@ index 158719d46c96bb733a00e08c8285f41a48406abf..623a8b38b9d0ccbfe807afe328495b19 + // Purpur end } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 8306dc47d15492a5a7ad357c6c9073874b231394..983598f6f51d1754dabd86c18368ec3bcaa97e99 100644 +index 4e23880e93f73e645e160a1a73e4bd0776a01dba..48d5dff7041f4e05e6c508ef23921ee8a5d71dd2 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -135,6 +135,49 @@ public class PurpurWorldConfig { - } +@@ -105,6 +105,49 @@ public class PurpurWorldConfig { + elytraDamagePerTridentBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.trident", elytraDamagePerTridentBoost); } + public List itemImmuneToCactus = new ArrayList<>(); @@ -143,6 +143,6 @@ index 8306dc47d15492a5a7ad357c6c9073874b231394..983598f6f51d1754dabd86c18368ec3b + }); + } + - public boolean idleTimeoutKick = true; - public boolean idleTimeoutTickNearbyEntities = true; - public boolean idleTimeoutCountAsSleeping = false; + public double minecartMaxSpeed = 0.4D; + public boolean minecartPlaceAnywhere = false; + public boolean minecartControllable = false; diff --git a/patches/server/0073-Add-ping-command.patch b/patches/server/0073-Add-ping-command.patch index 8c56688d6..9f1911eb5 100644 --- a/patches/server/0073-Add-ping-command.patch +++ b/patches/server/0073-Add-ping-command.patch @@ -17,18 +17,19 @@ index d478627dcd2b6e3d3d95b3fa224a25d44e6bbafb..158fc5748f175708a0c3415a2217663f if (environment.includeIntegrated) { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 3e70e16c5d1e515295efe7cbe6b718e388c01903..95bbde3892de77bff6181250812290cfbf5104d1 100644 +index 122e24306370c09a82716daf0c372bf0d6ce8dbe..5406eacf095c0f569a5900059524a6422a8f7557 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -131,10 +131,12 @@ public class PurpurConfig { - public static String afkBroadcastAway = "§e§o%s is now AFK"; - public static String afkBroadcastBack = "§e§o%s is no longer AFK"; +@@ -132,11 +132,13 @@ public class PurpurConfig { + public static String afkBroadcastBack = "%s is no longer AFK"; public static String afkTabListPrefix = "[AFK] "; + public static String cannotRideMob = "You cannot mount that mob"; + public static String pingCommandOutput = "§a%s's ping is %sms"; private static void messages() { afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); afkBroadcastBack = getString("settings.messages.afk-broadcast-back", afkBroadcastBack); afkTabListPrefix = getString("settings.messages.afk-tab-list-prefix", afkTabListPrefix); + cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); + pingCommandOutput = getString("settings.messages.ping-command-output", pingCommandOutput); } diff --git a/patches/server/0074-Configurable-jockey-options.patch b/patches/server/0074-Configurable-jockey-options.patch index b28b500a6..b2be30b10 100644 --- a/patches/server/0074-Configurable-jockey-options.patch +++ b/patches/server/0074-Configurable-jockey-options.patch @@ -184,74 +184,83 @@ index 233b390541acddcf815db4a8f299496eaea4f758..a50191aac887dffd3a7930455cb222fa public void setPersistentAngerTarget(@Nullable UUID uuid) { this.persistentAngerTarget = uuid; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 983598f6f51d1754dabd86c18368ec3bcaa97e99..d504e6b4fa0749ac268d0ab59084ff5fbc11f7ff 100644 +index 48d5dff7041f4e05e6c508ef23921ee8a5d71dd2..ad6c76a06a31d40ba5d5a8eb6af34d7e6f98c1b2 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -321,6 +321,15 @@ public class PurpurWorldConfig { - creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); - } +@@ -399,9 +399,15 @@ public class PurpurWorldConfig { + public boolean drownedRidable = false; + public boolean drownedRidableInWater = false; + public boolean drownedJockeyOnlyBaby = true; + public double drownedJockeyChance = 0.05D; + public boolean drownedJockeyTryExistingChickens = true; -+ private void drownedSettings() { + private void drownedSettings() { + drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); + drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); + drownedJockeyOnlyBaby = getBoolean("mobs.drowned.jockey.only-babies", drownedJockeyOnlyBaby); + drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); + drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); -+ } -+ - public boolean enderDragonAlwaysDropsFullExp = false; - private void enderDragonSettings() { - enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); -@@ -358,6 +367,15 @@ public class PurpurWorldConfig { - giantMaxHealth = getDouble("mobs.giant.attributes.max-health", giantMaxHealth); } + public boolean elderGuardianRidable = false; +@@ -518,9 +524,15 @@ public class PurpurWorldConfig { + + public boolean huskRidable = false; + public boolean huskRidableInWater = false; + public boolean huskJockeyOnlyBaby = true; + public double huskJockeyChance = 0.05D; + public boolean huskJockeyTryExistingChickens = true; -+ private void huskSettings() { + private void huskSettings() { + huskRidable = getBoolean("mobs.husk.ridable", huskRidable); + huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); + huskJockeyOnlyBaby = getBoolean("mobs.husk.jockey.only-babies", huskJockeyOnlyBaby); + huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); + huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); -+ } -+ - public double illusionerMovementSpeed = 0.5D; - public double illusionerFollowRange = 18.0D; - public double illusionerMaxHealth = 32.0D; -@@ -433,8 +451,35 @@ public class PurpurWorldConfig { - witherSkeletonTakesWitherDamage = getBoolean("mobs.wither_skeleton.takes-wither-damage", witherSkeletonTakesWitherDamage); } + public boolean illusionerRidable = false; +@@ -877,9 +889,15 @@ public class PurpurWorldConfig { + + public boolean zombieRidable = false; + public boolean zombieRidableInWater = false; + public boolean zombieJockeyOnlyBaby = true; + public double zombieJockeyChance = 0.05D; + public boolean zombieJockeyTryExistingChickens = true; -+ private void zombieSettings() { + 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); -+ } -+ - public double zombieHorseSpawnChance = 0.0D; - private void zombieHorseSettings() { - zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); } -+ + + public boolean zombieHorseRidableInWater = false; +@@ -893,15 +911,27 @@ public class PurpurWorldConfig { + + public boolean zombieVillagerRidable = false; + public boolean zombieVillagerRidableInWater = false; ++ public boolean zombieVillagerJockeyOnlyBaby = true; ++ public double zombieVillagerJockeyChance = 0.05D; ++ public boolean zombieVillagerJockeyTryExistingChickens = true; + private void zombieVillagerSettings() { + zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); + zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); ++ zombieVillagerJockeyOnlyBaby = getBoolean("mobs.zombie_villager.jockey.only-babies", zombieVillagerJockeyOnlyBaby); ++ zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); ++ zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); + } + + public boolean zombiefiedPiglinRidable = false; + public boolean zombiefiedPiglinRidableInWater = false; +- private void zombiefiedPiglinSettings() { + public boolean zombifiedPiglinJockeyOnlyBaby = true; + public double zombifiedPiglinJockeyChance = 0.05D; + public boolean zombifiedPiglinJockeyTryExistingChickens = true; + private void zombifiedPiglinSettings() { + zombiefiedPiglinRidable = getBoolean("mobs.zombiefied_piglin.ridable", zombiefiedPiglinRidable); + zombiefiedPiglinRidableInWater = getBoolean("mobs.zombiefied_piglin.ridable-in-water", zombiefiedPiglinRidableInWater); + zombifiedPiglinJockeyOnlyBaby = getBoolean("mobs.zombified_piglin.jockey.only-babies", zombifiedPiglinJockeyOnlyBaby); + zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); + zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); -+ } -+ -+ public boolean zombieVillagerJockeyOnlyBaby = true; -+ public double zombieVillagerJockeyChance = 0.05D; -+ public boolean zombieVillagerJockeyTryExistingChickens = true; -+ private void zombieVillagerSettings() { -+ zombieVillagerJockeyOnlyBaby = getBoolean("mobs.zombie_villager.jockey.only-babies", zombieVillagerJockeyOnlyBaby); -+ zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); -+ zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); -+ } + } }