mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-20 18:07:43 +01:00
all feature patches applied?? that was too easy...
This commit is contained in:
5107
purpur-server/minecraft-patches/features/0001-Ridables.patch
Normal file
5107
purpur-server/minecraft-patches/features/0001-Ridables.patch
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,219 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Thu, 23 May 2019 21:50:37 -0500
|
||||
Subject: [PATCH] Barrels and enderchests 6 rows
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
|
||||
index 7a247b713ceb3a513de1f91cdda1d30a32845d13..f9f3deed9f892ece5568a6ede9955c8e19937b60 100644
|
||||
--- a/net/minecraft/server/players/PlayerList.java
|
||||
+++ b/net/minecraft/server/players/PlayerList.java
|
||||
@@ -1040,6 +1040,27 @@ public abstract class PlayerList {
|
||||
player.getBukkitEntity().recalculatePermissions(); // CraftBukkit
|
||||
this.server.getCommands().sendCommands(player);
|
||||
} // Paper - Add sendOpLevel API
|
||||
+
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ if (org.purpurmc.purpur.PurpurConfig.enderChestSixRows && org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) {
|
||||
+ org.bukkit.craftbukkit.entity.CraftHumanEntity bukkit = player.getBukkitEntity();
|
||||
+ if (bukkit.hasPermission("purpur.enderchest.rows.six")) {
|
||||
+ player.sixRowEnderchestSlotCount = 54;
|
||||
+ } else if (bukkit.hasPermission("purpur.enderchest.rows.five")) {
|
||||
+ player.sixRowEnderchestSlotCount = 45;
|
||||
+ } else if (bukkit.hasPermission("purpur.enderchest.rows.four")) {
|
||||
+ player.sixRowEnderchestSlotCount = 36;
|
||||
+ } else if (bukkit.hasPermission("purpur.enderchest.rows.three")) {
|
||||
+ player.sixRowEnderchestSlotCount = 27;
|
||||
+ } else if (bukkit.hasPermission("purpur.enderchest.rows.two")) {
|
||||
+ player.sixRowEnderchestSlotCount = 18;
|
||||
+ } else if (bukkit.hasPermission("purpur.enderchest.rows.one")) {
|
||||
+ player.sixRowEnderchestSlotCount = 9;
|
||||
+ }
|
||||
+ } else {
|
||||
+ player.sixRowEnderchestSlotCount = -1;
|
||||
+ }
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
}
|
||||
|
||||
public boolean isWhiteListed(GameProfile profile) {
|
||||
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
|
||||
index c421cc7dc6c401a19eaf193abd970f21e910f927..acb53dba83fe9481508fa4d4704203a08f575450 100644
|
||||
--- a/net/minecraft/world/entity/player/Player.java
|
||||
+++ b/net/minecraft/world/entity/player/Player.java
|
||||
@@ -221,6 +221,7 @@ public abstract class Player extends LivingEntity {
|
||||
public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage
|
||||
public int burpDelay = 0; // Purpur - Burp delay
|
||||
public boolean canPortalInstant = false; // Purpur - Add portal permission bypass
|
||||
+ public int sixRowEnderchestSlotCount = -1; // Purpur - Barrels and enderchests 6 rows
|
||||
|
||||
// CraftBukkit start
|
||||
public boolean fauxSleeping;
|
||||
diff --git a/net/minecraft/world/inventory/ChestMenu.java b/net/minecraft/world/inventory/ChestMenu.java
|
||||
index 0fffa384f928ab84451331380968fb4650eafe26..0399092c9f7a43ac100c11505176ade6d95a39da 100644
|
||||
--- a/net/minecraft/world/inventory/ChestMenu.java
|
||||
+++ b/net/minecraft/world/inventory/ChestMenu.java
|
||||
@@ -66,10 +66,30 @@ public class ChestMenu extends AbstractContainerMenu {
|
||||
return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, 6);
|
||||
}
|
||||
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ public static ChestMenu oneRow(int syncId, Inventory playerInventory, Container inventory) {
|
||||
+ return new ChestMenu(MenuType.GENERIC_9x1, syncId, playerInventory, inventory, 1);
|
||||
+ }
|
||||
+
|
||||
+ public static ChestMenu twoRows(int syncId, Inventory playerInventory, Container inventory) {
|
||||
+ return new ChestMenu(MenuType.GENERIC_9x2, syncId, playerInventory, inventory, 2);
|
||||
+ }
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
+
|
||||
public static ChestMenu threeRows(int containerId, Inventory playerInventory, Container container) {
|
||||
return new ChestMenu(MenuType.GENERIC_9x3, containerId, playerInventory, container, 3);
|
||||
}
|
||||
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ public static ChestMenu fourRows(int syncId, Inventory playerInventory, Container inventory) {
|
||||
+ return new ChestMenu(MenuType.GENERIC_9x4, syncId, playerInventory, inventory, 4);
|
||||
+ }
|
||||
+
|
||||
+ public static ChestMenu fiveRows(int syncId, Inventory playerInventory, Container inventory) {
|
||||
+ return new ChestMenu(MenuType.GENERIC_9x5, syncId, playerInventory, inventory, 5);
|
||||
+ }
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
+
|
||||
public static ChestMenu sixRows(int containerId, Inventory playerInventory, Container container) {
|
||||
return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, container, 6);
|
||||
}
|
||||
diff --git a/net/minecraft/world/inventory/PlayerEnderChestContainer.java b/net/minecraft/world/inventory/PlayerEnderChestContainer.java
|
||||
index beb74bc8398de8b48f41af7daef14d624826310e..7ae8d115b6f4af45db9309b46ed4b4fdd8e25c08 100644
|
||||
--- a/net/minecraft/world/inventory/PlayerEnderChestContainer.java
|
||||
+++ b/net/minecraft/world/inventory/PlayerEnderChestContainer.java
|
||||
@@ -25,11 +25,18 @@ public class PlayerEnderChestContainer extends SimpleContainer {
|
||||
}
|
||||
|
||||
public PlayerEnderChestContainer(Player owner) {
|
||||
- super(27);
|
||||
+ super(org.purpurmc.purpur.PurpurConfig.enderChestSixRows ? 54 : 27); // Purpur - Barrels and enderchests 6 rows
|
||||
this.owner = owner;
|
||||
// CraftBukkit end
|
||||
}
|
||||
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ @Override
|
||||
+ public int getContainerSize() {
|
||||
+ return owner.sixRowEnderchestSlotCount < 0 ? super.getContainerSize() : owner.sixRowEnderchestSlotCount;
|
||||
+ }
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
+
|
||||
public void setActiveChest(EnderChestBlockEntity enderChestBlockEntity) {
|
||||
this.activeChest = enderChestBlockEntity;
|
||||
}
|
||||
diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java
|
||||
index 5077a9ff7b78801bdc53536a37aee07b8d86ee4d..72794e204f7fcc31ece94913b7fd9f36ae022b10 100644
|
||||
--- a/net/minecraft/world/level/block/EnderChestBlock.java
|
||||
+++ b/net/minecraft/world/level/block/EnderChestBlock.java
|
||||
@@ -85,8 +85,8 @@ public class EnderChestBlock extends AbstractChestBlock<EnderChestBlockEntity> i
|
||||
enderChestInventory.setActiveChest(enderChestBlockEntity); // Needs to happen before ChestMenu.threeRows as it is required for opening animations
|
||||
if (level instanceof ServerLevel serverLevel && player.openMenu(
|
||||
new SimpleMenuProvider(
|
||||
- (containerId, playerInventory, player1) -> ChestMenu.threeRows(containerId, playerInventory, enderChestInventory), CONTAINER_TITLE
|
||||
- )
|
||||
+ (containerId, playerInventory, player1) -> org.purpurmc.purpur.PurpurConfig.enderChestSixRows ? getEnderChestSixRows(containerId, playerInventory, player, enderChestInventory) : ChestMenu.threeRows(containerId, playerInventory, enderChestInventory), CONTAINER_TITLE
|
||||
+ ) // Purpur - Barrels and enderchests 6 rows
|
||||
).isPresent()) {
|
||||
// Paper end - Fix InventoryOpenEvent cancellation - moved up;
|
||||
player.awardStat(Stats.OPEN_ENDERCHEST);
|
||||
@@ -100,6 +100,35 @@ public class EnderChestBlock extends AbstractChestBlock<EnderChestBlockEntity> i
|
||||
}
|
||||
}
|
||||
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ private ChestMenu getEnderChestSixRows(int syncId, net.minecraft.world.entity.player.Inventory inventory, Player player, PlayerEnderChestContainer playerEnderChestContainer) {
|
||||
+ if (org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) {
|
||||
+ org.bukkit.craftbukkit.entity.CraftHumanEntity bukkitPlayer = player.getBukkitEntity();
|
||||
+ if (bukkitPlayer.hasPermission("purpur.enderchest.rows.six")) {
|
||||
+ player.sixRowEnderchestSlotCount = 54;
|
||||
+ return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer);
|
||||
+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.five")) {
|
||||
+ player.sixRowEnderchestSlotCount = 45;
|
||||
+ return ChestMenu.fiveRows(syncId, inventory, playerEnderChestContainer);
|
||||
+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.four")) {
|
||||
+ player.sixRowEnderchestSlotCount = 36;
|
||||
+ return ChestMenu.fourRows(syncId, inventory, playerEnderChestContainer);
|
||||
+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.three")) {
|
||||
+ player.sixRowEnderchestSlotCount = 27;
|
||||
+ return ChestMenu.threeRows(syncId, inventory, playerEnderChestContainer);
|
||||
+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.two")) {
|
||||
+ player.sixRowEnderchestSlotCount = 18;
|
||||
+ return ChestMenu.twoRows(syncId, inventory, playerEnderChestContainer);
|
||||
+ } else if (bukkitPlayer.hasPermission("purpur.enderchest.rows.one")) {
|
||||
+ player.sixRowEnderchestSlotCount = 9;
|
||||
+ return ChestMenu.oneRow(syncId, inventory, playerEnderChestContainer);
|
||||
+ }
|
||||
+ }
|
||||
+ player.sixRowEnderchestSlotCount = -1;
|
||||
+ return ChestMenu.sixRows(syncId, inventory, playerEnderChestContainer);
|
||||
+ }
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
+
|
||||
@Override
|
||||
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
|
||||
return new EnderChestBlockEntity(pos, state);
|
||||
diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java
|
||||
index d679ab599dfd0bdbdc3ab5530d7fcd1c38baf7fa..0e4f6455ec48c5a7fcd4613c1c5b79d599e4960a 100644
|
||||
--- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java
|
||||
+++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java
|
||||
@@ -56,7 +56,17 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
||||
- private NonNullList<ItemStack> items = NonNullList.withSize(27, ItemStack.EMPTY);
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ private NonNullList<ItemStack> items = NonNullList.withSize(switch (org.purpurmc.purpur.PurpurConfig.barrelRows) {
|
||||
+ case 6 -> 54;
|
||||
+ case 5 -> 45;
|
||||
+ case 4 -> 36;
|
||||
+ case 2 -> 18;
|
||||
+ case 1 -> 9;
|
||||
+ default -> 27;
|
||||
+ }, ItemStack.EMPTY);
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
+
|
||||
public final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() {
|
||||
@Override
|
||||
protected void onOpen(Level level, BlockPos pos, BlockState state) {
|
||||
@@ -108,7 +118,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
|
||||
|
||||
@Override
|
||||
public int getContainerSize() {
|
||||
- return 27;
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ return switch (org.purpurmc.purpur.PurpurConfig.barrelRows) {
|
||||
+ case 6 -> 54;
|
||||
+ case 5 -> 45;
|
||||
+ case 4 -> 36;
|
||||
+ case 2 -> 18;
|
||||
+ case 1 -> 9;
|
||||
+ default -> 27;
|
||||
+ };
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -128,7 +147,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity {
|
||||
|
||||
@Override
|
||||
protected AbstractContainerMenu createMenu(int id, Inventory player) {
|
||||
- return ChestMenu.threeRows(id, player, this);
|
||||
+ // Purpur start - Barrels and enderchests 6 rows
|
||||
+ return switch (org.purpurmc.purpur.PurpurConfig.barrelRows) {
|
||||
+ case 6 -> ChestMenu.sixRows(id, player, this);
|
||||
+ case 5 -> ChestMenu.fiveRows(id, player, this);
|
||||
+ case 4 -> ChestMenu.fourRows(id, player, this);
|
||||
+ case 2 -> ChestMenu.twoRows(id, player, this);
|
||||
+ case 1 -> ChestMenu.oneRow(id, player, this);
|
||||
+ default -> ChestMenu.threeRows(id, player, this);
|
||||
+ };
|
||||
+ // Purpur end - Barrels and enderchests 6 rows
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -0,0 +1,76 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Sun, 12 May 2019 00:43:12 -0500
|
||||
Subject: [PATCH] Giants AI settings
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/monster/Giant.java b/net/minecraft/world/entity/monster/Giant.java
|
||||
index e673f488bfab9648075857bc40e1339f974a903c..f5565d314ded2145219debc446c7ddcb93b660e9 100644
|
||||
--- a/net/minecraft/world/entity/monster/Giant.java
|
||||
+++ b/net/minecraft/world/entity/monster/Giant.java
|
||||
@@ -30,8 +30,25 @@ public class Giant extends Monster {
|
||||
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
- this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this));
|
||||
- this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this));
|
||||
+ // Purpur start - Giants AI settings
|
||||
+ if (level().purpurConfig.giantHaveAI) {
|
||||
+ this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this));
|
||||
+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this));
|
||||
+ this.goalSelector.addGoal(7, new net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal(this, 1.0D));
|
||||
+ this.goalSelector.addGoal(8, new net.minecraft.world.entity.ai.goal.LookAtPlayerGoal(this, net.minecraft.world.entity.player.Player.class, 16.0F));
|
||||
+ this.goalSelector.addGoal(8, new net.minecraft.world.entity.ai.goal.RandomLookAroundGoal(this));
|
||||
+ this.goalSelector.addGoal(5, new net.minecraft.world.entity.ai.goal.MoveTowardsRestrictionGoal(this, 1.0D));
|
||||
+ if (level().purpurConfig.giantHaveHostileAI) {
|
||||
+ this.goalSelector.addGoal(2, new net.minecraft.world.entity.ai.goal.MeleeAttackGoal(this, 1.0D, false));
|
||||
+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this));
|
||||
+ this.targetSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal(this).setAlertOthers(ZombifiedPiglin.class));
|
||||
+ this.targetSelector.addGoal(2, new net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal<>(this, net.minecraft.world.entity.player.Player.class, true));
|
||||
+ this.targetSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal<>(this, net.minecraft.world.entity.npc.Villager.class, false));
|
||||
+ this.targetSelector.addGoal(4, new net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal<>(this, net.minecraft.world.entity.animal.IronGolem.class, true));
|
||||
+ this.targetSelector.addGoal(5, new net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal<>(this, net.minecraft.world.entity.animal.Turtle.class, true));
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Giants AI settings
|
||||
}
|
||||
// Purpur end - Ridables
|
||||
|
||||
@@ -53,8 +70,36 @@ public class Giant extends Monster {
|
||||
.add(Attributes.CAMERA_DISTANCE, 16.0);
|
||||
}
|
||||
|
||||
+ // Purpur - Giants AI settings
|
||||
+ @Override
|
||||
+ public net.minecraft.world.entity.SpawnGroupData finalizeSpawn(net.minecraft.world.level.ServerLevelAccessor world, net.minecraft.world.DifficultyInstance difficulty, net.minecraft.world.entity.EntitySpawnReason spawnReason, @org.jetbrains.annotations.Nullable net.minecraft.world.entity.SpawnGroupData entityData) {
|
||||
+ net.minecraft.world.entity.SpawnGroupData groupData = super.finalizeSpawn(world, difficulty, spawnReason, entityData);
|
||||
+ if (groupData == null) {
|
||||
+ populateDefaultEquipmentSlots(this.random, difficulty);
|
||||
+ populateDefaultEquipmentEnchantments(world, this.random, difficulty);
|
||||
+ }
|
||||
+ return groupData;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ protected void populateDefaultEquipmentSlots(net.minecraft.util.RandomSource random, net.minecraft.world.DifficultyInstance difficulty) {
|
||||
+ super.populateDefaultEquipmentSlots(this.random, difficulty);
|
||||
+ // TODO make configurable
|
||||
+ if (random.nextFloat() < (level().getDifficulty() == net.minecraft.world.Difficulty.HARD ? 0.1F : 0.05F)) {
|
||||
+ this.setItemSlot(net.minecraft.world.entity.EquipmentSlot.MAINHAND, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.IRON_SWORD));
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public float getJumpPower() {
|
||||
+ // make giants jump as high as everything else relative to their size
|
||||
+ // 1.0 makes bottom of feet about as high as their waist when they jump
|
||||
+ return level().purpurConfig.giantJumpHeight;
|
||||
+ }
|
||||
+ // Purpur end - Giants AI settings
|
||||
+
|
||||
@Override
|
||||
public float getWalkTargetValue(BlockPos pos, LevelReader level) {
|
||||
- return level.getPathfindingCostFromLightLevels(pos);
|
||||
+ return super.getWalkTargetValue(pos, level); // Purpur - Giants AI settings - fix light requirements for natural spawns
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Sun, 12 Apr 2020 13:19:34 -0500
|
||||
Subject: [PATCH] Chickens can retaliate
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java
|
||||
index b4b2cebbc8d4645dec0b1bfe4243426a1e7ccda5..6f6d99c075b3e402742e3c7401dea366f2d871b6 100644
|
||||
--- a/net/minecraft/world/entity/animal/Chicken.java
|
||||
+++ b/net/minecraft/world/entity/animal/Chicken.java
|
||||
@@ -94,6 +94,11 @@ public class Chicken extends Animal {
|
||||
public void initAttributes() {
|
||||
this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.chickenMaxHealth);
|
||||
this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.chickenScale);
|
||||
+ // Purpur start - Chickens can retaliate
|
||||
+ if (level().purpurConfig.chickenRetaliate) {
|
||||
+ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D);
|
||||
+ }
|
||||
+ // Purpur end - Chickens can retaliate
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
@@ -101,13 +106,21 @@ public class Chicken extends Animal {
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
|
||||
- this.goalSelector.addGoal(1, new PanicGoal(this, 1.4));
|
||||
+ //this.goalSelector.addGoal(1, new PanicGoal(this, 1.4)); // Purpur - Chickens can retaliate - moved down
|
||||
this.goalSelector.addGoal(2, new BreedGoal(this, 1.0));
|
||||
this.goalSelector.addGoal(3, new TemptGoal(this, 1.0, itemStack -> itemStack.is(ItemTags.CHICKEN_FOOD), false));
|
||||
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.1));
|
||||
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
||||
this.goalSelector.addGoal(7, new RandomLookAroundGoal(this));
|
||||
+ // Purpur start - Chickens can retaliate
|
||||
+ if (level().purpurConfig.chickenRetaliate) {
|
||||
+ this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.MeleeAttackGoal(this, 1.0D, false));
|
||||
+ this.targetSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal(this));
|
||||
+ } else {
|
||||
+ this.goalSelector.addGoal(1, new PanicGoal(this, 1.4D));
|
||||
+ }
|
||||
+ // Purpur end - Chickens can retaliate
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -116,7 +129,7 @@ public class Chicken extends Animal {
|
||||
}
|
||||
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
- return Animal.createAnimalAttributes().add(Attributes.MAX_HEALTH, 4.0).add(Attributes.MOVEMENT_SPEED, 0.25);
|
||||
+ return Animal.createAnimalAttributes().add(Attributes.MAX_HEALTH, 4.0).add(Attributes.MOVEMENT_SPEED, 0.25).add(Attributes.ATTACK_DAMAGE, 0.0D); // Purpur - Chickens can retaliate
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -0,0 +1,152 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Sat, 29 Jun 2019 02:32:40 -0500
|
||||
Subject: [PATCH] Minecart settings and WASD controls
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index 0c489a6d3357ed0d3dc9341440b87623d007da3f..ed63c0cc2750485ab4d53c242fec94c1a66e9dbe 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -1170,6 +1170,11 @@ public class ServerPlayer extends Player {
|
||||
} else {
|
||||
// Purpur start - Add boat fall damage config
|
||||
if (damageSource.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) {
|
||||
+ // Purpur start - Minecart settings and WASD controls
|
||||
+ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level().purpurConfig.minecartControllable && !level().purpurConfig.minecartControllableFallDamage) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ // Purpur end - Minecart settings and WASD controls
|
||||
if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.Boat && !level().purpurConfig.boatsDoFallDamage) {
|
||||
return false;
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||||
index 7e61d68b36ca2768f70dc1fc130a8d7b95347b6b..00eb9aef52ee54f9750c44832f2b3a9321a9f81a 100644
|
||||
--- a/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||||
+++ b/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||||
@@ -102,6 +102,10 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
||||
private double flyingY = 0.95;
|
||||
private double flyingZ = 0.95;
|
||||
public @Nullable Double maxSpeed;
|
||||
+ // Purpur start - Minecart settings and WASD controls
|
||||
+ public double storedMaxSpeed;
|
||||
+ public boolean isNewBehavior;
|
||||
+ // Purpur end - Minecart settings and WASD controls
|
||||
public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
|
||||
// CraftBukkit end
|
||||
|
||||
@@ -110,8 +114,13 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
||||
this.blocksBuilding = true;
|
||||
if (useExperimentalMovement(level)) {
|
||||
this.behavior = new NewMinecartBehavior(this);
|
||||
+ this.isNewBehavior = true; // Purpur - Minecart settings and WASD controls
|
||||
} else {
|
||||
this.behavior = new OldMinecartBehavior(this);
|
||||
+ // Purpur start - Minecart settings and WASD controls
|
||||
+ this.isNewBehavior = false;
|
||||
+ maxSpeed = storedMaxSpeed = level.purpurConfig.minecartMaxSpeed;
|
||||
+ // Purpur end - Minecart settings and WASD controls
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,6 +285,14 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
+ // Purpur start - Minecart settings and WASD controls
|
||||
+ if (!this.isNewBehavior) {
|
||||
+ if (storedMaxSpeed != level().purpurConfig.minecartMaxSpeed) {
|
||||
+ maxSpeed = storedMaxSpeed = level().purpurConfig.minecartMaxSpeed;
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Minecart settings and WASD controls
|
||||
+
|
||||
// CraftBukkit start
|
||||
double prevX = this.getX();
|
||||
double prevY = this.getY();
|
||||
@@ -390,15 +407,61 @@ public abstract class AbstractMinecart extends VehicleEntity {
|
||||
this.behavior.moveAlongTrack(level);
|
||||
}
|
||||
|
||||
+ // Purpur start - Minecart settings and WASD controls
|
||||
+ private Double lastSpeed;
|
||||
+
|
||||
+ public double getControllableSpeed() {
|
||||
+ BlockState blockState = level().getBlockState(this.blockPosition());
|
||||
+ if (!blockState.isSolid()) {
|
||||
+ blockState = level().getBlockState(this.blockPosition().relative(Direction.DOWN));
|
||||
+ }
|
||||
+ Double speed = level().purpurConfig.minecartControllableBlockSpeeds.get(blockState.getBlock());
|
||||
+ if (!blockState.isSolid()) {
|
||||
+ speed = lastSpeed;
|
||||
+ }
|
||||
+ if (speed == null) {
|
||||
+ speed = level().purpurConfig.minecartControllableBaseSpeed;
|
||||
+ }
|
||||
+ return lastSpeed = speed;
|
||||
+ }
|
||||
+ // Purpur end - Minecart settings and WASD controls
|
||||
+
|
||||
protected void comeOffTrack(ServerLevel level) {
|
||||
double maxSpeed = this.getMaxSpeed(level);
|
||||
Vec3 deltaMovement = this.getDeltaMovement();
|
||||
this.setDeltaMovement(Mth.clamp(deltaMovement.x, -maxSpeed, maxSpeed), deltaMovement.y, Mth.clamp(deltaMovement.z, -maxSpeed, maxSpeed));
|
||||
+
|
||||
+ // Purpur start - Minecart settings and WASD controls
|
||||
+ if (level().purpurConfig.minecartControllable && !isInWater() && !isInLava() && !passengers.isEmpty()) {
|
||||
+ Entity passenger = passengers.get(0);
|
||||
+ if (passenger instanceof net.minecraft.server.level.ServerPlayer player) {
|
||||
+ net.minecraft.world.entity.player.Input lastClientInput = player.getLastClientInput();
|
||||
+ float forward = (lastClientInput.forward() == lastClientInput.backward() ? 0.0F : lastClientInput.forward() ? 1.0F : -1.0F);
|
||||
+ if (lastClientInput.jump() && this.onGround) {
|
||||
+ setDeltaMovement(new Vec3(getDeltaMovement().x, level().purpurConfig.minecartControllableHopBoost, getDeltaMovement().z));
|
||||
+ }
|
||||
+ if (forward != 0.0F) {
|
||||
+ org.bukkit.util.Vector velocity = player.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(getControllableSpeed());
|
||||
+ if (forward < 0.0) {
|
||||
+ velocity.multiply(-0.5);
|
||||
+ }
|
||||
+ setDeltaMovement(new Vec3(velocity.getX(), getDeltaMovement().y, velocity.getZ()));
|
||||
+ }
|
||||
+ this.setYRot(passenger.getYRot() - 90);
|
||||
+ maxUpStep = level().purpurConfig.minecartControllableStepHeight;
|
||||
+ } else {
|
||||
+ maxUpStep = 0.0F;
|
||||
+ }
|
||||
+ } else {
|
||||
+ maxUpStep = 0.0F;
|
||||
+ }
|
||||
+ // Purpur end - Minecart settings and WASD controls
|
||||
if (this.onGround()) {
|
||||
// CraftBukkit start - replace magic numbers with our variables
|
||||
this.setDeltaMovement(new Vec3(this.getDeltaMovement().x * this.derailedX, this.getDeltaMovement().y * this.derailedY, this.getDeltaMovement().z * this.derailedZ));
|
||||
// CraftBukkit end
|
||||
}
|
||||
+ else if (level().purpurConfig.minecartControllable) setDeltaMovement(new Vec3(getDeltaMovement().x * derailedX, getDeltaMovement().y, getDeltaMovement().z * derailedZ)); // Purpur - Minecart settings and WASD controls
|
||||
|
||||
this.move(MoverType.SELF, this.getDeltaMovement());
|
||||
if (!this.onGround()) {
|
||||
diff --git a/net/minecraft/world/item/MinecartItem.java b/net/minecraft/world/item/MinecartItem.java
|
||||
index 620069daba04d48b57fc933328eda77f6ca9333e..0403b9b01994269d394820e8c8710ba1b9808bf0 100644
|
||||
--- a/net/minecraft/world/item/MinecartItem.java
|
||||
+++ b/net/minecraft/world/item/MinecartItem.java
|
||||
@@ -30,8 +30,9 @@ public class MinecartItem extends Item {
|
||||
BlockPos clickedPos = context.getClickedPos();
|
||||
BlockState blockState = level.getBlockState(clickedPos);
|
||||
if (!blockState.is(BlockTags.RAILS)) {
|
||||
- return InteractionResult.FAIL;
|
||||
- } else {
|
||||
+ if (!level.purpurConfig.minecartPlaceAnywhere) return InteractionResult.FAIL; // Purpur - Minecart settings and WASD controls
|
||||
+ if (blockState.isSolid()) clickedPos = clickedPos.relative(context.getClickedFace());
|
||||
+ } // else { // Purpur - Minecart settings and WASD controls
|
||||
ItemStack itemInHand = context.getItemInHand();
|
||||
RailShape railShape = blockState.getBlock() instanceof BaseRailBlock
|
||||
? blockState.getValue(((BaseRailBlock)blockState.getBlock()).getShapeProperty())
|
||||
@@ -72,6 +73,6 @@ public class MinecartItem extends Item {
|
||||
itemInHand.shrink(1);
|
||||
return InteractionResult.SUCCESS;
|
||||
}
|
||||
- }
|
||||
+ // } // Purpur - Minecart settings and WASD controls
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Fri, 29 Nov 2019 22:10:12 -0600
|
||||
Subject: [PATCH] Villagers follow emerald blocks
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java
|
||||
index 4bb7a8955182d786a09fd2667b37a93373ff47be..bead2f6800bdc404228500c12caf326559fa47de 100644
|
||||
--- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java
|
||||
+++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java
|
||||
@@ -164,7 +164,7 @@ public class DefaultAttributes {
|
||||
.put(EntityType.VILLAGER, Villager.createAttributes().build())
|
||||
.put(EntityType.VINDICATOR, Vindicator.createAttributes().build())
|
||||
.put(EntityType.WARDEN, Warden.createAttributes().build())
|
||||
- .put(EntityType.WANDERING_TRADER, Mob.createMobAttributes().build())
|
||||
+ .put(EntityType.WANDERING_TRADER, net.minecraft.world.entity.npc.WanderingTrader.createAttributes().build()) // Purpur - Villagers follow emerald blocks
|
||||
.put(EntityType.WITCH, Witch.createAttributes().build())
|
||||
.put(EntityType.WITHER, WitherBoss.createAttributes().build())
|
||||
.put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build())
|
||||
diff --git a/net/minecraft/world/entity/ai/goal/TemptGoal.java b/net/minecraft/world/entity/ai/goal/TemptGoal.java
|
||||
index dae935cc68e2e571d50e56ac8913c099a11cf771..a805c9426630c2c46db9d0dd536f1d16769395d3 100644
|
||||
--- a/net/minecraft/world/entity/ai/goal/TemptGoal.java
|
||||
+++ b/net/minecraft/world/entity/ai/goal/TemptGoal.java
|
||||
@@ -71,7 +71,7 @@ public class TemptGoal extends Goal {
|
||||
}
|
||||
|
||||
private boolean shouldFollow(LivingEntity entity) {
|
||||
- return this.items.test(entity.getMainHandItem()) || this.items.test(entity.getOffhandItem());
|
||||
+ return (this.items.test(entity.getMainHandItem()) || this.items.test(entity.getOffhandItem())) && (!(this.mob instanceof net.minecraft.world.entity.npc.Villager villager) || !villager.isSleeping()); // Purpur - Villagers follow emerald blocks
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/net/minecraft/world/entity/npc/AbstractVillager.java b/net/minecraft/world/entity/npc/AbstractVillager.java
|
||||
index f8782cdcf3015cad2693663a3c222bd60822f45b..d1a77544df7bcaa5f1dbca3139324107d687ae0d 100644
|
||||
--- a/net/minecraft/world/entity/npc/AbstractVillager.java
|
||||
+++ b/net/minecraft/world/entity/npc/AbstractVillager.java
|
||||
@@ -35,6 +35,7 @@ import net.minecraft.world.level.storage.ValueOutput;
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
|
||||
public abstract class AbstractVillager extends AgeableMob implements InventoryCarrier, Npc, Merchant {
|
||||
+ static final net.minecraft.world.item.crafting.Ingredient TEMPT_ITEMS = net.minecraft.world.item.crafting.Ingredient.of(net.minecraft.world.level.block.Blocks.EMERALD_BLOCK.asItem()); // Purpur - Villagers follow emerald blocks
|
||||
private static final EntityDataAccessor<Integer> DATA_UNHAPPY_COUNTER = SynchedEntityData.defineId(AbstractVillager.class, EntityDataSerializers.INT);
|
||||
public static final int VILLAGER_SLOT_OFFSET = 300;
|
||||
private static final int VILLAGER_INVENTORY_SIZE = 8;
|
||||
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
|
||||
index b91c7bdfa4df80bf52ed714efc877a30cdcb3f36..4a68a8124716a57801f2d42a87e4d68c99d2f348 100644
|
||||
--- a/net/minecraft/world/entity/npc/Villager.java
|
||||
+++ b/net/minecraft/world/entity/npc/Villager.java
|
||||
@@ -269,6 +269,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this));
|
||||
+ if (level().purpurConfig.villagerFollowEmeraldBlock) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); // Purpur - Villagers follow emerald blocks
|
||||
}
|
||||
// Purpur end - Ridables
|
||||
|
||||
@@ -277,6 +278,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
public void initAttributes() {
|
||||
this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.villagerMaxHealth);
|
||||
this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.villagerScale);
|
||||
+ this.getAttribute(Attributes.TEMPT_RANGE).setBaseValue(this.level().purpurConfig.villagerTemptRange); // Purpur - Villagers follow emerald blocks
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
@@ -345,7 +347,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
}
|
||||
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
- return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.5);
|
||||
+ return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.5).add(Attributes.TEMPT_RANGE, 10.0D); // Purpur - Villagers follow emerald blocks
|
||||
}
|
||||
|
||||
public boolean assignProfessionWhenSpawned() {
|
||||
diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
index 28c86505efa994f9c7657538f5ffdf12772fb0a9..2917820bf01b1a2ca7301a7099b7b3dcd6c3ee67 100644
|
||||
--- a/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
+++ b/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
@@ -88,9 +88,16 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
|
||||
@Override
|
||||
public void initAttributes() {
|
||||
this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wanderingTraderMaxHealth);
|
||||
+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.TEMPT_RANGE).setBaseValue(this.level().purpurConfig.wanderingTraderTemptRange); // Purpur - Villagers follow emerald blocks
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Villagers follow emerald blocks
|
||||
+ public static net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder createAttributes() {
|
||||
+ return Mob.createMobAttributes().add(net.minecraft.world.entity.ai.attributes.Attributes.TEMPT_RANGE, 10.0D);
|
||||
+ }
|
||||
+ // Purpur end - Villagers follow emerald blocks
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
@@ -125,6 +132,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
|
||||
this.goalSelector.addGoal(1, new PanicGoal(this, 0.5));
|
||||
this.goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this));
|
||||
this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0, 0.35));
|
||||
+ if (level().purpurConfig.wanderingTraderFollowEmeraldBlock) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.TemptGoal(this, 1.0D, TEMPT_ITEMS, false)); // Purpur - Villagers follow emerald blocks
|
||||
this.goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 0.35));
|
||||
this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 0.35));
|
||||
this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F));
|
||||
@@ -0,0 +1,94 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Thu, 25 Jul 2019 18:07:37 -0500
|
||||
Subject: [PATCH] Implement elytra settings
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
||||
index ae0c2f41c522656bde37d4f31699ee6172b5a79d..4f149e5e17d2d2f2964e2f6626e20f52121e72d9 100644
|
||||
--- a/net/minecraft/world/entity/LivingEntity.java
|
||||
+++ b/net/minecraft/world/entity/LivingEntity.java
|
||||
@@ -3699,7 +3699,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||
.filter(equipmentSlot1 -> canGlideUsing(this.getItemBySlot(equipmentSlot1), equipmentSlot1))
|
||||
.toList();
|
||||
EquipmentSlot equipmentSlot = Util.getRandom(list, this.random);
|
||||
- this.getItemBySlot(equipmentSlot).hurtAndBreak(1, this, equipmentSlot);
|
||||
+
|
||||
+ // Purpur start - Implement elytra settings
|
||||
+ int damage = level().purpurConfig.elytraDamagePerSecond;
|
||||
+ if (level().purpurConfig.elytraDamageMultiplyBySpeed > 0) {
|
||||
+ double speed = getDeltaMovement().lengthSqr();
|
||||
+ if (speed > level().purpurConfig.elytraDamageMultiplyBySpeed) {
|
||||
+ damage *= (int) speed;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ this.getItemBySlot(equipmentSlot).hurtAndBreak(damage, this, equipmentSlot);
|
||||
+ // Purpur end - Implement elytra settings
|
||||
}
|
||||
|
||||
this.gameEvent(GameEvent.ELYTRA_GLIDE);
|
||||
diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java
|
||||
index 83cfe63b0245f79d0873477ab3aae75f690ecb68..f32370217735b5e9556a0df7652682d89f23c595 100644
|
||||
--- a/net/minecraft/world/item/FireworkRocketItem.java
|
||||
+++ b/net/minecraft/world/item/FireworkRocketItem.java
|
||||
@@ -72,6 +72,17 @@ public class FireworkRocketItem extends Item implements ProjectileItem {
|
||||
if (player.dropAllLeashConnections(null)) {
|
||||
level.playSound(null, player, SoundEvents.LEAD_BREAK, SoundSource.NEUTRAL, 1.0F, 1.0F);
|
||||
}
|
||||
+ // Purpur start - Implement elytra settings
|
||||
+ if (level.purpurConfig.elytraDamagePerFireworkBoost > 0) {
|
||||
+ java.util.List<net.minecraft.world.entity.EquipmentSlot> list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> net.minecraft.world.entity.LivingEntity.canGlideUsing(player.getItemBySlot(enumitemslot), enumitemslot)).toList();
|
||||
+ net.minecraft.world.entity.EquipmentSlot enumitemslot = net.minecraft.Util.getRandom(list, player.random);
|
||||
+
|
||||
+ ItemStack glideItem = player.getItemBySlot(enumitemslot);
|
||||
+ if (player.canGlide()) {
|
||||
+ glideItem.hurtAndBreak(level.purpurConfig.elytraDamagePerFireworkBoost, player, enumitemslot);
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Implement elytra settings
|
||||
if (event.shouldConsume() && !player.hasInfiniteMaterials()) {
|
||||
itemInHand.shrink(1); // Moved up from below
|
||||
} else {
|
||||
diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java
|
||||
index 52aaa325476af53eca97fc14ad5f82fbb9193c80..d512ee6b1039b80b908816b625ef1aa9cd50461c 100644
|
||||
--- a/net/minecraft/world/item/ItemStack.java
|
||||
+++ b/net/minecraft/world/item/ItemStack.java
|
||||
@@ -700,6 +700,14 @@ public final class ItemStack implements DataComponentHolder {
|
||||
org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent
|
||||
}
|
||||
// CraftBukkit end
|
||||
+
|
||||
+ // Purpur start - Implement elytra settings
|
||||
+ if (this.has(DataComponents.GLIDER)) {
|
||||
+ setDamageValue(this.getMaxDamage() - 1);
|
||||
+ return;
|
||||
+ }
|
||||
+ // Purpur end - Implement elytra settings
|
||||
+
|
||||
this.shrink(1);
|
||||
onBreak.accept(item);
|
||||
}
|
||||
diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java
|
||||
index 122e24ed6fb319c951841ac8ef328c5eb70514d4..34d15412b8f68ed1bae45b81ecf759c9c4d7e20c 100644
|
||||
--- a/net/minecraft/world/item/TridentItem.java
|
||||
+++ b/net/minecraft/world/item/TridentItem.java
|
||||
@@ -127,6 +127,18 @@ public class TridentItem extends Item implements ProjectileItem {
|
||||
f1 *= tridentSpinAttackStrength / squareRoot;
|
||||
f2 *= tridentSpinAttackStrength / squareRoot;
|
||||
org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(player, stack, f, f1, f2); // CraftBukkit
|
||||
+
|
||||
+ // Purpur start - Implement elytra settings
|
||||
+ List<net.minecraft.world.entity.EquipmentSlot> list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> LivingEntity.canGlideUsing(entity.getItemBySlot(enumitemslot), enumitemslot)).toList();
|
||||
+ if (!list.isEmpty()) {
|
||||
+ net.minecraft.world.entity.EquipmentSlot enumitemslot = net.minecraft.Util.getRandom(list, entity.random);
|
||||
+ ItemStack glideItem = entity.getItemBySlot(enumitemslot);
|
||||
+ if (glideItem.has(net.minecraft.core.component.DataComponents.GLIDER) && level.purpurConfig.elytraDamagePerTridentBoost > 0) {
|
||||
+ glideItem.hurtAndBreak(level.purpurConfig.elytraDamagePerTridentBoost, entity, enumitemslot);
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Implement elytra settings
|
||||
+
|
||||
player.push(f, f1, f2);
|
||||
player.startAutoSpinAttack(20, 8.0F, stack);
|
||||
if (player.onGround()) {
|
||||
@@ -0,0 +1,177 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Thu, 26 Mar 2020 21:39:32 -0500
|
||||
Subject: [PATCH] Configurable jockey options
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java
|
||||
index ec0f27d04125765e91e43c4c18415b29db62b181..ffd9e34b4d57bdafc597b2208f754c7454afd48a 100644
|
||||
--- a/net/minecraft/world/entity/monster/Drowned.java
|
||||
+++ b/net/minecraft/world/entity/monster/Drowned.java
|
||||
@@ -106,6 +106,23 @@ public class Drowned extends Zombie implements RangedAttackMob {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Configurable jockey options
|
||||
+ @Override
|
||||
+ public boolean jockeyOnlyBaby() {
|
||||
+ return level().purpurConfig.drownedJockeyOnlyBaby;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public double jockeyChance() {
|
||||
+ return level().purpurConfig.drownedJockeyChance;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean jockeyTryExistingChickens() {
|
||||
+ return level().purpurConfig.drownedJockeyTryExistingChickens;
|
||||
+ }
|
||||
+ // Purpur end - Configurable jockey options
|
||||
+
|
||||
@Override
|
||||
protected void addBehaviourGoals() {
|
||||
this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0));
|
||||
diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java
|
||||
index 5b0794bd87423715cada1f860b4141fdacd9ede6..75cb1db5584c04e442583ab2f50a26132ed48bfb 100644
|
||||
--- a/net/minecraft/world/entity/monster/Husk.java
|
||||
+++ b/net/minecraft/world/entity/monster/Husk.java
|
||||
@@ -50,6 +50,23 @@ public class Husk extends Zombie {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Configurable jockey options
|
||||
+ @Override
|
||||
+ public boolean jockeyOnlyBaby() {
|
||||
+ return level().purpurConfig.huskJockeyOnlyBaby;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public double jockeyChance() {
|
||||
+ return level().purpurConfig.huskJockeyChance;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean jockeyTryExistingChickens() {
|
||||
+ return level().purpurConfig.huskJockeyTryExistingChickens;
|
||||
+ }
|
||||
+ // Purpur end - Configurable jockey options
|
||||
+
|
||||
public static boolean checkHuskSpawnRules(
|
||||
EntityType<Husk> entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random
|
||||
) {
|
||||
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
|
||||
index 6f26221e6982db3c97a77d4496686c666a80e3a4..ede9101c44ba53c5bd67254bea6fcff7f00b5b47 100644
|
||||
--- a/net/minecraft/world/entity/monster/Zombie.java
|
||||
+++ b/net/minecraft/world/entity/monster/Zombie.java
|
||||
@@ -128,6 +128,20 @@ public class Zombie extends Monster {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Configurable jockey options
|
||||
+ public boolean jockeyOnlyBaby() {
|
||||
+ return level().purpurConfig.zombieJockeyOnlyBaby;
|
||||
+ }
|
||||
+
|
||||
+ public double jockeyChance() {
|
||||
+ return level().purpurConfig.zombieJockeyChance;
|
||||
+ }
|
||||
+
|
||||
+ public boolean jockeyTryExistingChickens() {
|
||||
+ return level().purpurConfig.zombieJockeyTryExistingChickens;
|
||||
+ }
|
||||
+ // Purpur end - Configurable jockey options
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
|
||||
@@ -557,19 +571,18 @@ public class Zombie extends Monster {
|
||||
}
|
||||
|
||||
if (spawnGroupData instanceof Zombie.ZombieGroupData zombieGroupData) {
|
||||
- if (zombieGroupData.isBaby) {
|
||||
- this.setBaby(true);
|
||||
+ if (!jockeyOnlyBaby() || zombieGroupData.isBaby) { // Purpur - Configurable jockey options
|
||||
+ this.setBaby(zombieGroupData.isBaby); // Purpur - Configurable jockey options
|
||||
if (zombieGroupData.canSpawnJockey) {
|
||||
- if (random.nextFloat() < 0.05) {
|
||||
- List<Chicken> entitiesOfClass = level.getEntitiesOfClass(
|
||||
+ if (random.nextFloat() < jockeyChance()) { // Purpur - Configurable jockey options
|
||||
+ List<Chicken> entitiesOfClass = jockeyTryExistingChickens() ? level.getEntitiesOfClass( // Purpur - Configurable jockey options
|
||||
Chicken.class, this.getBoundingBox().inflate(5.0, 3.0, 5.0), EntitySelector.ENTITY_NOT_BEING_RIDDEN
|
||||
- );
|
||||
+ ) : java.util.Collections.emptyList(); // Purpur - Configurable jockey options
|
||||
if (!entitiesOfClass.isEmpty()) {
|
||||
Chicken chicken = entitiesOfClass.get(0);
|
||||
chicken.setChickenJockey(true);
|
||||
this.startRiding(chicken);
|
||||
- }
|
||||
- } else if (random.nextFloat() < 0.05) {
|
||||
+ } else { // Purpur - Configurable jockey options
|
||||
Chicken chicken1 = EntityType.CHICKEN.create(this.level(), EntitySpawnReason.JOCKEY);
|
||||
if (chicken1 != null) {
|
||||
chicken1.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F);
|
||||
@@ -578,6 +591,7 @@ public class Zombie extends Monster {
|
||||
this.startRiding(chicken1);
|
||||
level.addFreshEntity(chicken1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit
|
||||
}
|
||||
+ } // Purpur - Configurable jockey options
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java
|
||||
index 537bff97a27e043ed2f71fc82580689ecb784ac8..02b503453fb8b64cbf0b9db1e498566289c6bbe3 100644
|
||||
--- a/net/minecraft/world/entity/monster/ZombieVillager.java
|
||||
+++ b/net/minecraft/world/entity/monster/ZombieVillager.java
|
||||
@@ -105,6 +105,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Configurable jockey options
|
||||
+ @Override
|
||||
+ public boolean jockeyOnlyBaby() {
|
||||
+ return level().purpurConfig.zombieVillagerJockeyOnlyBaby;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public double jockeyChance() {
|
||||
+ return level().purpurConfig.zombieVillagerJockeyChance;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean jockeyTryExistingChickens() {
|
||||
+ return level().purpurConfig.zombieVillagerJockeyTryExistingChickens;
|
||||
+ }
|
||||
+ // Purpur end - Configurable jockey options
|
||||
+
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java
|
||||
index f0a809464d9e7f1839e1932955a7313e744384b1..2adee917a4275742968a2e1e8b65bce4b9ac3cc3 100644
|
||||
--- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java
|
||||
+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java
|
||||
@@ -89,6 +89,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Configurable jockey options
|
||||
+ @Override
|
||||
+ public boolean jockeyOnlyBaby() {
|
||||
+ return level().purpurConfig.zombifiedPiglinJockeyOnlyBaby;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public double jockeyChance() {
|
||||
+ return level().purpurConfig.zombifiedPiglinJockeyChance;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean jockeyTryExistingChickens() {
|
||||
+ return level().purpurConfig.zombifiedPiglinJockeyTryExistingChickens;
|
||||
+ }
|
||||
+ // Purpur end - Configurable jockey options
|
||||
+
|
||||
@Override
|
||||
public void setPersistentAngerTarget(@Nullable UUID target) {
|
||||
this.persistentAngerTarget = target;
|
||||
@@ -0,0 +1,255 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Thu, 9 May 2019 18:26:06 -0500
|
||||
Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||
index 5bff703ae4f95091620dec5347246d7c0cbe5d5e..220a828717e1933a44c5282b56713ba0053d2440 100644
|
||||
--- a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||
+++ b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||
@@ -27,6 +27,12 @@ public class EndCrystal extends Entity {
|
||||
private static final boolean DEFAULT_SHOW_BOTTOM = true;
|
||||
public int time;
|
||||
public boolean generatedByDragonFight = false; // Paper - Fix invulnerable end crystals
|
||||
+ // Purpur start - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
+ private net.minecraft.world.entity.monster.Phantom targetPhantom;
|
||||
+ private int phantomBeamTicks = 0;
|
||||
+ private int phantomDamageCooldown = 0;
|
||||
+ private int idleCooldown = 0;
|
||||
+ // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
|
||||
public EndCrystal(EntityType<? extends EndCrystal> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
@@ -95,6 +101,49 @@ public class EndCrystal extends Entity {
|
||||
// Paper end - Fix invulnerable end crystals
|
||||
if (this.level().purpurConfig.endCrystalCramming > 0 && this.level().getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level().purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur - End Crystal Cramming
|
||||
|
||||
+ // Purpur start - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
+ if (level().purpurConfig.phantomAttackedByCrystalRadius <= 0 || --idleCooldown > 0) {
|
||||
+ return; // on cooldown
|
||||
+ }
|
||||
+
|
||||
+ if (targetPhantom == null) {
|
||||
+ for (net.minecraft.world.entity.monster.Phantom phantom : level().getEntitiesOfClass(net.minecraft.world.entity.monster.Phantom.class, getBoundingBox().inflate(level().purpurConfig.phantomAttackedByCrystalRadius))) {
|
||||
+ if (phantom.hasLineOfSight(this)) {
|
||||
+ attackPhantom(phantom);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ setBeamTarget(new BlockPos(targetPhantom).offset(0, -2, 0));
|
||||
+ if (--phantomBeamTicks > 0 && targetPhantom.isAlive()) {
|
||||
+ phantomDamageCooldown--;
|
||||
+ if (targetPhantom.hasLineOfSight(this)) {
|
||||
+ if (phantomDamageCooldown <= 0) {
|
||||
+ phantomDamageCooldown = 20;
|
||||
+ targetPhantom.hurt(targetPhantom.damageSources().indirectMagic(this, this), level().purpurConfig.phantomAttackedByCrystalDamage);
|
||||
+ }
|
||||
+ } else {
|
||||
+ forgetPhantom(); // no longer in sight
|
||||
+ }
|
||||
+ } else {
|
||||
+ forgetPhantom(); // attacked long enough
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ private void attackPhantom(net.minecraft.world.entity.monster.Phantom phantom) {
|
||||
+ phantomDamageCooldown = 0;
|
||||
+ phantomBeamTicks = 60;
|
||||
+ targetPhantom = phantom;
|
||||
+ }
|
||||
+
|
||||
+ private void forgetPhantom() {
|
||||
+ targetPhantom = null;
|
||||
+ setBeamTarget(null);
|
||||
+ phantomBeamTicks = 0;
|
||||
+ phantomDamageCooldown = 0;
|
||||
+ idleCooldown = 60;
|
||||
+ // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java
|
||||
index 96ef89704122485948a526bcc323379474ac9343..f9f6199f5b64733be69e9e8dbdb3cd26700d822b 100644
|
||||
--- a/net/minecraft/world/entity/monster/Phantom.java
|
||||
+++ b/net/minecraft/world/entity/monster/Phantom.java
|
||||
@@ -49,6 +49,7 @@ public class Phantom extends Mob implements Enemy {
|
||||
@Nullable
|
||||
public BlockPos anchorPoint;
|
||||
Phantom.AttackPhase attackPhase = Phantom.AttackPhase.CIRCLE;
|
||||
+ Vec3 crystalPosition; // Purpur - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
// Paper start
|
||||
@Nullable
|
||||
public java.util.UUID spawningEntity;
|
||||
@@ -120,6 +121,25 @@ public class Phantom extends Mob implements Enemy {
|
||||
}
|
||||
// Purpur end - Ridables
|
||||
|
||||
+ // Purpur start - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
+ @Override
|
||||
+ protected void dropFromLootTable(ServerLevel world, DamageSource damageSource, boolean causedByPlayer) {
|
||||
+ boolean dropped = false;
|
||||
+ if (lastHurtByPlayer == null && damageSource.getEntity() instanceof net.minecraft.world.entity.boss.enderdragon.EndCrystal) {
|
||||
+ if (random.nextInt(5) < 1) {
|
||||
+ dropped = spawnAtLocation(world, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.PHANTOM_MEMBRANE)) != null;
|
||||
+ }
|
||||
+ }
|
||||
+ if (!dropped) {
|
||||
+ super.dropFromLootTable(world, damageSource, causedByPlayer);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public boolean isCirclingCrystal() {
|
||||
+ return crystalPosition != null;
|
||||
+ }
|
||||
+ // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
+
|
||||
@Override
|
||||
public boolean isFlapping() {
|
||||
return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0;
|
||||
@@ -133,9 +153,15 @@ public class Phantom extends Mob implements Enemy {
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
|
||||
- this.goalSelector.addGoal(1, new Phantom.PhantomAttackStrategyGoal());
|
||||
- this.goalSelector.addGoal(2, new Phantom.PhantomSweepAttackGoal());
|
||||
- this.goalSelector.addGoal(3, new Phantom.PhantomCircleAroundAnchorGoal());
|
||||
+ // Purpur start - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
+ if (level().purpurConfig.phantomOrbitCrystalRadius > 0) {
|
||||
+ this.goalSelector.addGoal(1, new PhantomFindCrystalGoal(this));
|
||||
+ this.goalSelector.addGoal(2, new PhantomOrbitCrystalGoal(this));
|
||||
+ }
|
||||
+ this.goalSelector.addGoal(3, new Phantom.PhantomAttackStrategyGoal());
|
||||
+ this.goalSelector.addGoal(4, new Phantom.PhantomSweepAttackGoal());
|
||||
+ this.goalSelector.addGoal(5, new Phantom.PhantomCircleAroundAnchorGoal());
|
||||
+ // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
|
||||
this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal());
|
||||
}
|
||||
@@ -517,6 +543,124 @@ public class Phantom extends Mob implements Enemy {
|
||||
}
|
||||
}
|
||||
|
||||
+ // Purpur start - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
+ class PhantomFindCrystalGoal extends Goal {
|
||||
+ private final Phantom phantom;
|
||||
+ private net.minecraft.world.entity.boss.enderdragon.EndCrystal crystal;
|
||||
+ private Comparator<net.minecraft.world.entity.boss.enderdragon.EndCrystal> comparator;
|
||||
+
|
||||
+ PhantomFindCrystalGoal(Phantom phantom) {
|
||||
+ this.phantom = phantom;
|
||||
+ this.comparator = Comparator.comparingDouble(phantom::distanceToSqr);
|
||||
+ this.setFlags(EnumSet.of(Flag.LOOK));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean canUse() {
|
||||
+ double range = maxTargetRange();
|
||||
+ List<net.minecraft.world.entity.boss.enderdragon.EndCrystal> crystals = level().getEntitiesOfClass(net.minecraft.world.entity.boss.enderdragon.EndCrystal.class, phantom.getBoundingBox().inflate(range));
|
||||
+ if (crystals.isEmpty()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ crystals.sort(comparator);
|
||||
+ crystal = crystals.get(0);
|
||||
+ if (phantom.distanceToSqr(crystal) > range * range) {
|
||||
+ crystal = null;
|
||||
+ return false;
|
||||
+ }
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean canContinueToUse() {
|
||||
+ if (crystal == null || !crystal.isAlive()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ double range = maxTargetRange();
|
||||
+ return phantom.distanceToSqr(crystal) <= (range * range) * 2;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void start() {
|
||||
+ phantom.crystalPosition = new Vec3(crystal.getX(), crystal.getY() + (phantom.random.nextInt(10) + 10), crystal.getZ());
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void stop() {
|
||||
+ crystal = null;
|
||||
+ phantom.crystalPosition = null;
|
||||
+ super.stop();
|
||||
+ }
|
||||
+
|
||||
+ private double maxTargetRange() {
|
||||
+ return phantom.level().purpurConfig.phantomOrbitCrystalRadius;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ class PhantomOrbitCrystalGoal extends Goal {
|
||||
+ private final Phantom phantom;
|
||||
+ private float offset;
|
||||
+ private float radius;
|
||||
+ private float verticalChange;
|
||||
+ private float direction;
|
||||
+
|
||||
+ PhantomOrbitCrystalGoal(Phantom phantom) {
|
||||
+ this.phantom = phantom;
|
||||
+ this.setFlags(EnumSet.of(Flag.MOVE));
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean canUse() {
|
||||
+ return phantom.isCirclingCrystal();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void start() {
|
||||
+ this.radius = 5.0F + phantom.random.nextFloat() * 10.0F;
|
||||
+ this.verticalChange = -4.0F + phantom.random.nextFloat() * 9.0F;
|
||||
+ this.direction = phantom.random.nextBoolean() ? 1.0F : -1.0F;
|
||||
+ updateOffset();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void tick() {
|
||||
+ if (phantom.random.nextInt(350) == 0) {
|
||||
+ this.verticalChange = -4.0F + phantom.random.nextFloat() * 9.0F;
|
||||
+ }
|
||||
+ if (phantom.random.nextInt(250) == 0) {
|
||||
+ ++this.radius;
|
||||
+ if (this.radius > 15.0F) {
|
||||
+ this.radius = 5.0F;
|
||||
+ this.direction = -this.direction;
|
||||
+ }
|
||||
+ }
|
||||
+ if (phantom.random.nextInt(450) == 0) {
|
||||
+ this.offset = phantom.random.nextFloat() * 2.0F * 3.1415927F;
|
||||
+ updateOffset();
|
||||
+ }
|
||||
+ if (phantom.moveTargetPoint.distanceToSqr(phantom.getX(), phantom.getY(), phantom.getZ()) < 4.0D) {
|
||||
+ updateOffset();
|
||||
+ }
|
||||
+ if (phantom.moveTargetPoint.y < phantom.getY() && !phantom.level().isEmptyBlock(new BlockPos(phantom).below(1))) {
|
||||
+ this.verticalChange = Math.max(1.0F, this.verticalChange);
|
||||
+ updateOffset();
|
||||
+ }
|
||||
+ if (phantom.moveTargetPoint.y > phantom.getY() && !phantom.level().isEmptyBlock(new BlockPos(phantom).above(1))) {
|
||||
+ this.verticalChange = Math.min(-1.0F, this.verticalChange);
|
||||
+ updateOffset();
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ private void updateOffset() {
|
||||
+ this.offset += this.direction * 15.0F * 0.017453292F;
|
||||
+ phantom.moveTargetPoint = phantom.crystalPosition.add(
|
||||
+ this.radius * Mth.cos(this.offset),
|
||||
+ -4.0F + this.verticalChange,
|
||||
+ this.radius * Mth.sin(this.offset));
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms
|
||||
+
|
||||
class PhantomMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables
|
||||
private float speed = 0.1F;
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: draycia <lonelyyordle@gmail.com>
|
||||
Date: Sun, 12 Apr 2020 20:41:59 -0700
|
||||
Subject: [PATCH] Phantoms burn in light
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java
|
||||
index f9f6199f5b64733be69e9e8dbdb3cd26700d822b..f0351975340dec2b2bd51670f193baf44a62ae16 100644
|
||||
--- a/net/minecraft/world/entity/monster/Phantom.java
|
||||
+++ b/net/minecraft/world/entity/monster/Phantom.java
|
||||
@@ -55,6 +55,7 @@ public class Phantom extends Mob implements Enemy {
|
||||
public java.util.UUID spawningEntity;
|
||||
public boolean shouldBurnInDay = true;
|
||||
// Paper end
|
||||
+ private static final net.minecraft.world.item.crafting.Ingredient TORCH = net.minecraft.world.item.crafting.Ingredient.of(net.minecraft.world.item.Items.TORCH, net.minecraft.world.item.Items.SOUL_TORCH); // Purpur - Phantoms burn in light
|
||||
|
||||
public Phantom(EntityType<? extends Phantom> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
@@ -255,7 +256,11 @@ public class Phantom extends Mob implements Enemy {
|
||||
|
||||
@Override
|
||||
public void aiStep() {
|
||||
- if (this.isAlive() && this.shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API
|
||||
+ // Purpur start - Phantoms burn in light
|
||||
+ boolean burnFromDaylight = this.shouldBurnInDay && this.isSunBurnTick() && this.level().purpurConfig.phantomBurnInDaylight;
|
||||
+ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight;
|
||||
+ if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API
|
||||
+ // Purpur end - Phantoms burn in light
|
||||
if (getRider() == null || !this.isControllable()) // Purpur - Ridables
|
||||
this.igniteForSeconds(8.0F);
|
||||
}
|
||||
@@ -378,6 +383,7 @@ public class Phantom extends Mob implements Enemy {
|
||||
List<Player> nearbyPlayers = serverLevel.getNearbyPlayers(
|
||||
this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0, 64.0, 16.0)
|
||||
);
|
||||
+ if (level().purpurConfig.phantomIgnorePlayersWithTorch) nearbyPlayers.removeIf(human -> TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND))); // Purpur - Phantoms burn in light
|
||||
if (!nearbyPlayers.isEmpty()) {
|
||||
nearbyPlayers.sort(Comparator.<Player, Double>comparing(Entity::getY).reversed());
|
||||
|
||||
@@ -747,6 +753,12 @@ public class Phantom extends Mob implements Enemy {
|
||||
return false;
|
||||
} else if (!target.isAlive()) {
|
||||
return false;
|
||||
+ // Purpur start - Phantoms burn in light
|
||||
+ } else if (level().purpurConfig.phantomBurnInLight > 0 && level().getLightEmission(new BlockPos(Phantom.this)) >= level().purpurConfig.phantomBurnInLight) {
|
||||
+ return false;
|
||||
+ } else if (level().purpurConfig.phantomIgnorePlayersWithTorch && (TORCH.test(target.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(target.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND)))) {
|
||||
+ return false;
|
||||
+ // Purpur end - Phantoms burn in light
|
||||
} else if (target instanceof Player player && (target.isSpectator() || player.isCreative())) {
|
||||
return false;
|
||||
} else if (!this.canUse()) {
|
||||
@@ -0,0 +1,614 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Sun, 15 Nov 2020 02:18:15 -0800
|
||||
Subject: [PATCH] Make entity breeding times configurable
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java
|
||||
index 2591e4bbd234e51ff2c6b00db888d3b158f5a07d..e3d48c7c6615185f8a14bc96476a665bdadc275b 100644
|
||||
--- a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java
|
||||
+++ b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java
|
||||
@@ -118,8 +118,10 @@ public class VillagerMakeLove extends Behavior<Villager> {
|
||||
if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(breedOffspring, parent, partner, null, null, 0).isCancelled()) {
|
||||
return Optional.empty();
|
||||
}
|
||||
- parent.setAge(6000);
|
||||
- partner.setAge(6000);
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ parent.setAge(level.purpurConfig.villagerBreedingTicks);
|
||||
+ partner.setAge(level.purpurConfig.villagerBreedingTicks);
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
level.addFreshEntityWithPassengers(breedOffspring, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING);
|
||||
// CraftBukkit end - call EntityBreedEvent
|
||||
level.broadcastEntityEvent(breedOffspring, (byte)12);
|
||||
diff --git a/net/minecraft/world/entity/animal/Animal.java b/net/minecraft/world/entity/animal/Animal.java
|
||||
index 235f6514328338d28c2bf967bcd06f1413f12c65..4d99a1bf2dc141630a76942ccbf1f60824cf7495 100644
|
||||
--- a/net/minecraft/world/entity/animal/Animal.java
|
||||
+++ b/net/minecraft/world/entity/animal/Animal.java
|
||||
@@ -43,6 +43,7 @@ public abstract class Animal extends AgeableMob {
|
||||
@Nullable
|
||||
public EntityReference<ServerPlayer> loveCause;
|
||||
public @Nullable ItemStack breedItem; // CraftBukkit - Add breedItem variable
|
||||
+ public abstract int getPurpurBreedTime(); // Purpur - Make entity breeding times configurable
|
||||
|
||||
protected Animal(EntityType<? extends Animal> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
@@ -279,8 +280,10 @@ public abstract class Animal extends AgeableMob {
|
||||
player.awardStat(Stats.ANIMALS_BRED);
|
||||
CriteriaTriggers.BRED_ANIMALS.trigger(player, this, animal, baby);
|
||||
} // Paper - Call EntityBreedEvent
|
||||
- this.setAge(6000);
|
||||
- animal.setAge(6000);
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ this.setAge(this.getPurpurBreedTime());
|
||||
+ animal.setAge(animal.getPurpurBreedTime());
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
this.resetLove();
|
||||
animal.resetLove();
|
||||
level.broadcastEntityEvent(this, (byte)18);
|
||||
diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java
|
||||
index bdb16d355dac48760c9a083303035265f6a1fc74..11a7cbb1781e396ecb2b9fdbad7af2c55ea2606a 100644
|
||||
--- a/net/minecraft/world/entity/animal/Bee.java
|
||||
+++ b/net/minecraft/world/entity/animal/Bee.java
|
||||
@@ -481,6 +481,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.beeBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
public int getRemainingPersistentAngerTime() {
|
||||
return this.entityData.get(DATA_REMAINING_ANGER_TIME);
|
||||
diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java
|
||||
index d429beb03da8b499f19c3ed721b110d916849698..5e6a66c1a3532d39dae82eaeb2428605536e2155 100644
|
||||
--- a/net/minecraft/world/entity/animal/Cat.java
|
||||
+++ b/net/minecraft/world/entity/animal/Cat.java
|
||||
@@ -125,6 +125,13 @@ public class Cat extends TamableAnimal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.catBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true);
|
||||
diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java
|
||||
index 6f6d99c075b3e402742e3c7401dea366f2d871b6..e4702a5a89147bd83fa73a969fab7077ddd623f6 100644
|
||||
--- a/net/minecraft/world/entity/animal/Chicken.java
|
||||
+++ b/net/minecraft/world/entity/animal/Chicken.java
|
||||
@@ -102,6 +102,13 @@ public class Chicken extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.chickenBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java
|
||||
index 9dbc5f7b3896acb199577afa85451da38f2d2a01..753ed26cc6bfc8276d4405091b78b0e50182b84a 100644
|
||||
--- a/net/minecraft/world/entity/animal/Cow.java
|
||||
+++ b/net/minecraft/world/entity/animal/Cow.java
|
||||
@@ -54,6 +54,13 @@ public class Cow extends AbstractCow {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.cowBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java
|
||||
index 869a0154c81593db8933f9daa6a7d3a9d02facc5..37b6bfa8dc1fd4ed0006f6531d2056bcd3c3abae 100644
|
||||
--- a/net/minecraft/world/entity/animal/Fox.java
|
||||
+++ b/net/minecraft/world/entity/animal/Fox.java
|
||||
@@ -188,6 +188,13 @@ public class Fox extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.foxBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
@@ -993,8 +1000,10 @@ public class Fox extends Animal {
|
||||
CriteriaTriggers.BRED_ANIMALS.trigger(serverPlayer, this.animal, this.partner, fox);
|
||||
}
|
||||
|
||||
- this.animal.setAge(6000);
|
||||
- this.partner.setAge(6000);
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ this.animal.setAge(this.animal.getPurpurBreedTime());
|
||||
+ this.partner.setAge(this.partner.getPurpurBreedTime());
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
this.animal.resetLove();
|
||||
this.partner.resetLove();
|
||||
serverLevel.addFreshEntityWithPassengers(fox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
|
||||
diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java
|
||||
index 8cfbe37df24647c3f0a2d64bcc3451de1402c86f..3e4cb7680e6082ebab95e2b8307eedb0d3fcfbcd 100644
|
||||
--- a/net/minecraft/world/entity/animal/MushroomCow.java
|
||||
+++ b/net/minecraft/world/entity/animal/MushroomCow.java
|
||||
@@ -86,6 +86,13 @@ public class MushroomCow extends AbstractCow implements Shearable {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.mooshroomBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
public float getWalkTargetValue(BlockPos pos, LevelReader level) {
|
||||
return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos);
|
||||
diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java
|
||||
index 84664a62dcae89dff1b63b0ac952756440ee090f..c4ed3f906d4b47c07915afd07db7a731e99b7215 100644
|
||||
--- a/net/minecraft/world/entity/animal/Ocelot.java
|
||||
+++ b/net/minecraft/world/entity/animal/Ocelot.java
|
||||
@@ -89,6 +89,13 @@ public class Ocelot extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.ocelotBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
public boolean isTrusting() {
|
||||
return this.entityData.get(DATA_TRUSTING);
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/animal/Panda.java b/net/minecraft/world/entity/animal/Panda.java
|
||||
index 4ec69b45049b2c947e0d9ef71619e8acd358e7ad..c7686698a9615a51c653658cf6a46ccfb9c4d168 100644
|
||||
--- a/net/minecraft/world/entity/animal/Panda.java
|
||||
+++ b/net/minecraft/world/entity/animal/Panda.java
|
||||
@@ -142,6 +142,13 @@ public class Panda extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.pandaBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) {
|
||||
return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot();
|
||||
diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java
|
||||
index d997102941a6add1b116053c119bcd6690eb42a5..6019406d7c7e51c53d8822e44070e626091495af 100644
|
||||
--- a/net/minecraft/world/entity/animal/Parrot.java
|
||||
+++ b/net/minecraft/world/entity/animal/Parrot.java
|
||||
@@ -201,6 +201,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return 6000;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Nullable
|
||||
@Override
|
||||
public SpawnGroupData finalizeSpawn(
|
||||
diff --git a/net/minecraft/world/entity/animal/Pig.java b/net/minecraft/world/entity/animal/Pig.java
|
||||
index 9f511a6a2692dc46c14e0e0e59518c0a3040cfb9..885135fb301eeb6149aa53d581b4073d3724264d 100644
|
||||
--- a/net/minecraft/world/entity/animal/Pig.java
|
||||
+++ b/net/minecraft/world/entity/animal/Pig.java
|
||||
@@ -91,6 +91,13 @@ public class Pig extends Animal implements ItemSteerable {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.pigBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||
diff --git a/net/minecraft/world/entity/animal/PolarBear.java b/net/minecraft/world/entity/animal/PolarBear.java
|
||||
index 28919a96de837a15d116c6b863eba5c8a1cf6a7b..e39ca22a871c911defdbfe1cb0f1b15cde8d4612 100644
|
||||
--- a/net/minecraft/world/entity/animal/PolarBear.java
|
||||
+++ b/net/minecraft/world/entity/animal/PolarBear.java
|
||||
@@ -125,6 +125,13 @@ public class PolarBear extends Animal implements NeutralMob {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.polarBearBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Nullable
|
||||
@Override
|
||||
public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) {
|
||||
diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java
|
||||
index d74b492c5d1c3a323106b5de5bbf595a38d976a1..5fc1d6ba3cb54f2ea8c6fe3f994ffea2cca5784b 100644
|
||||
--- a/net/minecraft/world/entity/animal/Rabbit.java
|
||||
+++ b/net/minecraft/world/entity/animal/Rabbit.java
|
||||
@@ -153,6 +153,13 @@ public class Rabbit extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.rabbitBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
public void registerGoals() {
|
||||
this.goalSelector.addGoal(1, new FloatGoal(this));
|
||||
diff --git a/net/minecraft/world/entity/animal/Turtle.java b/net/minecraft/world/entity/animal/Turtle.java
|
||||
index e26b97e92ecfadb351e91aeae38beb4c4da87e26..f5735e5bcc34b78db544aa8971234bc86e0ddfa9 100644
|
||||
--- a/net/minecraft/world/entity/animal/Turtle.java
|
||||
+++ b/net/minecraft/world/entity/animal/Turtle.java
|
||||
@@ -111,6 +111,13 @@ public class Turtle extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.turtleBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
public void setHomePos(BlockPos homePos) {
|
||||
this.homePos = homePos;
|
||||
}
|
||||
@@ -351,8 +358,10 @@ public class Turtle extends Animal {
|
||||
}
|
||||
|
||||
this.turtle.setHasEgg(true);
|
||||
- this.animal.setAge(6000);
|
||||
- this.partner.setAge(6000);
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ this.animal.setAge(this.animal.getPurpurBreedTime());
|
||||
+ this.partner.setAge(this.partner.getPurpurBreedTime());
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
this.animal.resetLove();
|
||||
this.partner.resetLove();
|
||||
RandomSource random = this.animal.getRandom();
|
||||
diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java
|
||||
index e4c8376c009984e40b90c01f78c65e76e260ee0b..0da5c51c4830cf1826261f4d8877303b34c6cb87 100644
|
||||
--- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java
|
||||
+++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java
|
||||
@@ -107,6 +107,13 @@ public class Armadillo extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.armadilloBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java
|
||||
index 17b20b36a3edafaea089288d22ad3e07795b9770..e32a78cb9574505d78f3e298a38a28a2422d34b3 100644
|
||||
--- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java
|
||||
+++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java
|
||||
@@ -147,6 +147,13 @@ public class Axolotl extends Animal implements Bucketable {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.axolotlBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
public float getWalkTargetValue(BlockPos pos, LevelReader level) {
|
||||
return 0.0F;
|
||||
diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java
|
||||
index f45d1ba8dc0bb4b7041c5efba5d6261a3a5f5ff4..0c698241b10f84afb17ae10d3661a90bc62ec243 100644
|
||||
--- a/net/minecraft/world/entity/animal/camel/Camel.java
|
||||
+++ b/net/minecraft/world/entity/animal/camel/Camel.java
|
||||
@@ -98,6 +98,13 @@ public class Camel extends AbstractHorse {
|
||||
}
|
||||
// Purpur end - Ridables
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.camelBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void addAdditionalSaveData(ValueOutput output) {
|
||||
super.addAdditionalSaveData(output);
|
||||
diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java
|
||||
index 0bb0c875b12c94e9fb42b81210c5935cb5efecf8..1d5079602e7ae1042e2bb92209dded4007f703da 100644
|
||||
--- a/net/minecraft/world/entity/animal/frog/Frog.java
|
||||
+++ b/net/minecraft/world/entity/animal/frog/Frog.java
|
||||
@@ -165,6 +165,13 @@ public class Frog extends Animal {
|
||||
}
|
||||
// Purpur end - Ridables
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.frogBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected Brain.Provider<Frog> brainProvider() {
|
||||
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
|
||||
diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java
|
||||
index f106d5bbbe9227b2c7cc4cc24ade57d8df9b4e10..8da2cdf5a308b4c1359f94127934ee90e9cef558 100644
|
||||
--- a/net/minecraft/world/entity/animal/goat/Goat.java
|
||||
+++ b/net/minecraft/world/entity/animal/goat/Goat.java
|
||||
@@ -132,6 +132,13 @@ public class Goat extends Animal {
|
||||
}
|
||||
// Purpur end - Ridables
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.goatBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected Brain.Provider<Goat> brainProvider() {
|
||||
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
|
||||
diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java
|
||||
index 3aa12702cd1f4ef160180bc6ba64a6566cbddc9d..9e1100d672bfb712854d23203d0b730b8cc78a3d 100644
|
||||
--- a/net/minecraft/world/entity/animal/horse/Donkey.java
|
||||
+++ b/net/minecraft/world/entity/animal/horse/Donkey.java
|
||||
@@ -40,6 +40,13 @@ public class Donkey extends AbstractChestedHorse {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.donkeyBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
public SoundEvent getAmbientSound() {
|
||||
return SoundEvents.DONKEY_AMBIENT;
|
||||
diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java
|
||||
index 53c0eac62018a0d88e30b8c13de94216ff829cd8..3678c767818abb9e4180c2ade378ca09761ad784 100644
|
||||
--- a/net/minecraft/world/entity/animal/horse/Horse.java
|
||||
+++ b/net/minecraft/world/entity/animal/horse/Horse.java
|
||||
@@ -71,6 +71,13 @@ public class Horse extends AbstractHorse {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.horseBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void randomizeAttributes(RandomSource random) {
|
||||
this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt));
|
||||
diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java
|
||||
index 6fe6507edbf4c3c2795b8fe000d230d5fe6a2486..9cfc31b9acca44c56b78ba6d935bcb6c1d6c5697 100644
|
||||
--- a/net/minecraft/world/entity/animal/horse/Llama.java
|
||||
+++ b/net/minecraft/world/entity/animal/horse/Llama.java
|
||||
@@ -147,6 +147,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.llamaBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
public boolean isTraderLlama() {
|
||||
return false;
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/animal/horse/Mule.java b/net/minecraft/world/entity/animal/horse/Mule.java
|
||||
index 0107bb5fc029c5390d73e9a4cd08c13838a2ded5..fe2570ceb96d39ff6598a67a4ac4b4707eb28656 100644
|
||||
--- a/net/minecraft/world/entity/animal/horse/Mule.java
|
||||
+++ b/net/minecraft/world/entity/animal/horse/Mule.java
|
||||
@@ -39,6 +39,13 @@ public class Mule extends AbstractChestedHorse {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.muleBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
public SoundEvent getAmbientSound() {
|
||||
return SoundEvents.MULE_AMBIENT;
|
||||
diff --git a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
|
||||
index a7bcc0ff10e429ebfe91173c392e9a0c07903289..042b73f0807438327ebf4a2fd3a9d54d52159511 100644
|
||||
--- a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
|
||||
+++ b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
|
||||
@@ -66,6 +66,13 @@ public class SkeletonHorse extends AbstractHorse {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return 6000;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F);
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/animal/horse/TraderLlama.java b/net/minecraft/world/entity/animal/horse/TraderLlama.java
|
||||
index 39175d4537e84ef39bcbdafc5200ed7b14482d62..b36064e58ecc1512fed2d53c20bde333a405e8b0 100644
|
||||
--- a/net/minecraft/world/entity/animal/horse/TraderLlama.java
|
||||
+++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java
|
||||
@@ -70,6 +70,13 @@ public class TraderLlama extends Llama {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.traderLlamaBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
public boolean isTraderLlama() {
|
||||
return true;
|
||||
diff --git a/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/net/minecraft/world/entity/animal/horse/ZombieHorse.java
|
||||
index 3d597bd355b6c918ea1bf4b7d537ad4f76e218d2..69b9ae449e58f13bf0950fdfe3f89742af89956e 100644
|
||||
--- a/net/minecraft/world/entity/animal/horse/ZombieHorse.java
|
||||
+++ b/net/minecraft/world/entity/animal/horse/ZombieHorse.java
|
||||
@@ -62,6 +62,13 @@ public class ZombieHorse extends AbstractHorse {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return 6000;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
public static AttributeSupplier.Builder createAttributes() {
|
||||
return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F);
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java
|
||||
index 8e4a14ca6a0cef1c52c64de3502077d7d25b0308..1fee6d36abe42ff9998287c47d0f498bbba910e3 100644
|
||||
--- a/net/minecraft/world/entity/animal/sheep/Sheep.java
|
||||
+++ b/net/minecraft/world/entity/animal/sheep/Sheep.java
|
||||
@@ -87,6 +87,13 @@ public class Sheep extends Animal implements Shearable {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.sheepBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.eatBlockGoal = new EatBlockGoal(this);
|
||||
diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java
|
||||
index 683c9f82bfb2306f81b094464462d7d372ef5b22..9ad310cbc5fa41c949a37c1a5db6d6cd024f1483 100644
|
||||
--- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java
|
||||
+++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java
|
||||
@@ -114,6 +114,13 @@ public class Sniffer extends Animal {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.snifferBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java
|
||||
index 7326debf3725844bfe8730dab480da7b1d6e99aa..372360baedbe4f8b59e94c261bc60346ba3cfbbe 100644
|
||||
--- a/net/minecraft/world/entity/animal/wolf/Wolf.java
|
||||
+++ b/net/minecraft/world/entity/animal/wolf/Wolf.java
|
||||
@@ -216,6 +216,13 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.wolfBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@Override
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(1, new FloatGoal(this));
|
||||
diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java
|
||||
index a68e9f3f96f37b6dd685fd02072f38b9e320fffc..4e300141b0c7fa967e3d0b9ef952097efeb2bef6 100644
|
||||
--- a/net/minecraft/world/entity/monster/Strider.java
|
||||
+++ b/net/minecraft/world/entity/monster/Strider.java
|
||||
@@ -117,6 +117,13 @@ public class Strider extends Animal implements ItemSteerable {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.striderBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
public static boolean checkStriderSpawnRules(
|
||||
EntityType<Strider> entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random
|
||||
) {
|
||||
diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
|
||||
index c2de8c58f43a43df77f28e077fbbf00e0f930ba7..298246318f5103ff416f076467d3b6bfec297c5e 100644
|
||||
--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java
|
||||
+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
|
||||
@@ -121,6 +121,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
+ // Purpur start - Make entity breeding times configurable
|
||||
+ @Override
|
||||
+ public int getPurpurBreedTime() {
|
||||
+ return this.level().purpurConfig.hoglinBreedingTicks;
|
||||
+ }
|
||||
+ // Purpur end - Make entity breeding times configurable
|
||||
+
|
||||
@VisibleForTesting
|
||||
public void setTimeInOverworld(int timeInOverworld) {
|
||||
this.timeInOverworld = timeInOverworld;
|
||||
@@ -0,0 +1,112 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Tue, 17 Nov 2020 03:23:48 -0800
|
||||
Subject: [PATCH] Apply display names from item forms of entities to entities
|
||||
and vice versa
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java
|
||||
index 5dfd78a0e00cae85feff8acd785cdfdf23433ba6..e6813da9d002b90acd44db1435f5fa9bf1bbed47 100644
|
||||
--- a/net/minecraft/world/entity/decoration/ArmorStand.java
|
||||
+++ b/net/minecraft/world/entity/decoration/ArmorStand.java
|
||||
@@ -450,6 +450,7 @@ public class ArmorStand extends LivingEntity {
|
||||
|
||||
private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(ServerLevel level, DamageSource damageSource) { // Paper
|
||||
ItemStack itemStack = new ItemStack(Items.ARMOR_STAND);
|
||||
+ if (level.purpurConfig.persistentDroppableEntityDisplayNames) // Purpur - Apply display names from item forms of entities to entities and vice versa
|
||||
itemStack.set(DataComponents.CUSTOM_NAME, this.getCustomName());
|
||||
this.drops.add(new DefaultDrop(itemStack, stack -> Block.popResource(this.level(), this.blockPosition(), stack))); // CraftBukkit - add to drops // Paper - Restore vanilla drops behavior
|
||||
return this.brokenByAnything(level, damageSource); // Paper
|
||||
diff --git a/net/minecraft/world/entity/decoration/ItemFrame.java b/net/minecraft/world/entity/decoration/ItemFrame.java
|
||||
index 90fd3ca5ecd29befa9237222e9f86a8a79a011e4..7e96617f0d5e8777873b4c2cccd012d656612f96 100644
|
||||
--- a/net/minecraft/world/entity/decoration/ItemFrame.java
|
||||
+++ b/net/minecraft/world/entity/decoration/ItemFrame.java
|
||||
@@ -237,7 +237,11 @@ public class ItemFrame extends HangingEntity {
|
||||
this.removeFramedMap(item);
|
||||
} else {
|
||||
if (dropItem) {
|
||||
- this.spawnAtLocation(level, this.getFrameItemStack());
|
||||
+ // Purpur start - Apply display names from item forms of entities to entities and vice versa
|
||||
+ final ItemStack itemFrame = this.getFrameItemStack();
|
||||
+ if (!level.purpurConfig.persistentDroppableEntityDisplayNames) itemFrame.set(DataComponents.CUSTOM_NAME, null);
|
||||
+ this.spawnAtLocation(level, itemFrame);
|
||||
+ // Purpur end - Apply display names from item forms of entities to entities and vice versa
|
||||
}
|
||||
|
||||
if (!item.isEmpty()) {
|
||||
diff --git a/net/minecraft/world/entity/decoration/Painting.java b/net/minecraft/world/entity/decoration/Painting.java
|
||||
index cc34cadac8896a5f546d0879e795fea08d0c3f98..26a08b16de2318d5080be59a29c5f11e3597426d 100644
|
||||
--- a/net/minecraft/world/entity/decoration/Painting.java
|
||||
+++ b/net/minecraft/world/entity/decoration/Painting.java
|
||||
@@ -182,7 +182,11 @@ public class Painting extends HangingEntity {
|
||||
if (level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
|
||||
this.playSound(SoundEvents.PAINTING_BREAK, 1.0F, 1.0F);
|
||||
if (!(entity instanceof Player player && player.hasInfiniteMaterials())) {
|
||||
- this.spawnAtLocation(level, Items.PAINTING);
|
||||
+ // Purpur start - Apply display names from item forms of entities to entities and vice versa
|
||||
+ final ItemStack painting = new ItemStack(Items.PAINTING);
|
||||
+ if (!this.level().purpurConfig.persistentDroppableEntityDisplayNames) painting.set(net.minecraft.core.component.DataComponents.CUSTOM_NAME, null);
|
||||
+ this.spawnAtLocation(level, painting);
|
||||
+ // Purpur end - Apply display names from item forms of entities to entities and vice versa
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/vehicle/AbstractBoat.java b/net/minecraft/world/entity/vehicle/AbstractBoat.java
|
||||
index 4dcf6daa146645f096ac8815588c837715073c22..d947801b616af5b5dcdcc8bb70b36f97d6a69fdd 100644
|
||||
--- a/net/minecraft/world/entity/vehicle/AbstractBoat.java
|
||||
+++ b/net/minecraft/world/entity/vehicle/AbstractBoat.java
|
||||
@@ -825,7 +825,13 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable {
|
||||
|
||||
@Override
|
||||
public final ItemStack getPickResult() {
|
||||
- return new ItemStack(this.dropItem.get());
|
||||
+ // Purpur start - Apply display names from item forms of entities to entities and vice versa
|
||||
+ final ItemStack boat = new ItemStack(this.dropItem.get());
|
||||
+ if (!this.level().purpurConfig.persistentDroppableEntityDisplayNames) {
|
||||
+ boat.set(net.minecraft.core.component.DataComponents.CUSTOM_NAME, null);
|
||||
+ }
|
||||
+ return boat;
|
||||
+ // Purpur end - Apply display names from item forms of entities to entities and vice versa
|
||||
}
|
||||
|
||||
public static enum Status {
|
||||
diff --git a/net/minecraft/world/item/ArmorStandItem.java b/net/minecraft/world/item/ArmorStandItem.java
|
||||
index 962483d6f7225f13f121141882262d36dacad8cb..89d4bc00898fd8f6d40cda87c04c5983e2ea223c 100644
|
||||
--- a/net/minecraft/world/item/ArmorStandItem.java
|
||||
+++ b/net/minecraft/world/item/ArmorStandItem.java
|
||||
@@ -51,6 +51,10 @@ public class ArmorStandItem extends Item {
|
||||
return InteractionResult.FAIL;
|
||||
}
|
||||
// CraftBukkit end
|
||||
+ // Purpur start - Apply display names from item forms of entities to entities and vice versa
|
||||
+ if (!serverLevel.purpurConfig.persistentDroppableEntityDisplayNames) armorStand.setCustomName(null);
|
||||
+ if (serverLevel.purpurConfig.armorstandSetNameVisible && armorStand.getCustomName() != null) armorStand.setCustomNameVisible(true);
|
||||
+ // Purpur end - Apply display names from item forms of entities to entities and vice versa
|
||||
serverLevel.addFreshEntityWithPassengers(armorStand);
|
||||
level.playSound(
|
||||
null, armorStand.getX(), armorStand.getY(), armorStand.getZ(), SoundEvents.ARMOR_STAND_PLACE, SoundSource.BLOCKS, 0.75F, 0.8F
|
||||
diff --git a/net/minecraft/world/item/BoatItem.java b/net/minecraft/world/item/BoatItem.java
|
||||
index 13ce174e4f7e406f57a68ea0d3ef0ee3367f3f3b..ca86122e38688b29340cd8413ccf1746315e292a 100644
|
||||
--- a/net/minecraft/world/item/BoatItem.java
|
||||
+++ b/net/minecraft/world/item/BoatItem.java
|
||||
@@ -63,6 +63,7 @@ public class BoatItem extends Item {
|
||||
return InteractionResult.FAIL;
|
||||
} else {
|
||||
boat.setYRot(player.getYRot());
|
||||
+ if (!level.purpurConfig.persistentDroppableEntityDisplayNames) boat.setCustomName(null); // Purpur - Apply display names from item forms of entities to entities and vice versa
|
||||
if (!level.noCollision(boat, boat.getBoundingBox())) {
|
||||
return InteractionResult.FAIL;
|
||||
} else {
|
||||
diff --git a/net/minecraft/world/item/HangingEntityItem.java b/net/minecraft/world/item/HangingEntityItem.java
|
||||
index 5f9c166b8ba9e9dcabb7398308e7520a88335eae..e9e3a036290a5facc36cf6a484d03d4d3bfb65a5 100644
|
||||
--- a/net/minecraft/world/item/HangingEntityItem.java
|
||||
+++ b/net/minecraft/world/item/HangingEntityItem.java
|
||||
@@ -59,7 +59,7 @@ public class HangingEntityItem extends Item {
|
||||
hangingEntity = new GlowItemFrame(level, blockPos, clickedFace);
|
||||
}
|
||||
|
||||
- EntityType.<HangingEntity>createDefaultStackConfig(level, itemInHand, player).accept(hangingEntity);
|
||||
+ EntityType.<HangingEntity>appendDefaultStackConfig(entity -> {if (!level.purpurConfig.persistentDroppableEntityDisplayNames) entity.setCustomName(null);}, level, itemInHand, player).accept(hangingEntity); // Purpur - Apply display names from item forms of entities to entities and vice versa
|
||||
if (hangingEntity.survives()) {
|
||||
if (!level.isClientSide) {
|
||||
// CraftBukkit start - fire HangingPlaceEvent
|
||||
@@ -0,0 +1,171 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
||||
Date: Sat, 5 Dec 2020 01:20:16 -0800
|
||||
Subject: [PATCH] Option for Villager Clerics to farm Nether Wart
|
||||
|
||||
Adds an option so that Villagers with the Cleric profession are able to
|
||||
farm Nether Wart. Reimplemented based on a feature of the carpet-extra
|
||||
mod.
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java
|
||||
index de89e45ecd4ac4c6db8b74bbe3dd6b4a7cf21671..f15e4cfd8c0ac5e08779dbe6b9aa40bfe9ce4d8f 100644
|
||||
--- a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java
|
||||
+++ b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java
|
||||
@@ -32,6 +32,7 @@ public class HarvestFarmland extends Behavior<Villager> {
|
||||
private long nextOkStartTime;
|
||||
private int timeWorkedSoFar;
|
||||
private final List<BlockPos> validFarmlandAroundVillager = Lists.newArrayList();
|
||||
+ private boolean clericWartFarmer = false; // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
|
||||
public HarvestFarmland() {
|
||||
super(
|
||||
@@ -50,9 +51,10 @@ public class HarvestFarmland extends Behavior<Villager> {
|
||||
protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) {
|
||||
if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
return false;
|
||||
- } else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER)) {
|
||||
+ } else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER) && !(level.purpurConfig.villagerClericsFarmWarts && owner.getVillagerData().profession().is(VillagerProfession.CLERIC))) { // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
return false;
|
||||
} else {
|
||||
+ if (!this.clericWartFarmer && owner.getVillagerData().profession().is(VillagerProfession.CLERIC)) this.clericWartFarmer = true; // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
BlockPos.MutableBlockPos mutableBlockPos = owner.blockPosition().mutable();
|
||||
this.validFarmlandAroundVillager.clear();
|
||||
|
||||
@@ -83,6 +85,7 @@ public class HarvestFarmland extends Behavior<Villager> {
|
||||
BlockState blockState = serverLevel.getBlockState(pos);
|
||||
Block block = blockState.getBlock();
|
||||
Block block1 = serverLevel.getBlockState(pos.below()).getBlock();
|
||||
+ if (this.clericWartFarmer) return block == net.minecraft.world.level.block.Blocks.NETHER_WART && blockState.getValue(net.minecraft.world.level.block.NetherWartBlock.AGE) == 3 || blockState.isAir() && block1 == net.minecraft.world.level.block.Blocks.SOUL_SAND; // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
return block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState) || blockState.isAir() && block1 instanceof FarmBlock;
|
||||
}
|
||||
|
||||
@@ -109,19 +112,19 @@ public class HarvestFarmland extends Behavior<Villager> {
|
||||
BlockState blockState = level.getBlockState(this.aboveFarmlandPos);
|
||||
Block block = blockState.getBlock();
|
||||
Block block1 = level.getBlockState(this.aboveFarmlandPos.below()).getBlock();
|
||||
- if (block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState)) {
|
||||
+ if (block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState) && !this.clericWartFarmer || this.clericWartFarmer && block == net.minecraft.world.level.block.Blocks.NETHER_WART && blockState.getValue(net.minecraft.world.level.block.NetherWartBlock.AGE) == 3) { // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(owner, this.aboveFarmlandPos, blockState.getFluidState().createLegacyBlock())) { // CraftBukkit // Paper - fix wrong block state
|
||||
level.destroyBlock(this.aboveFarmlandPos, true, owner);
|
||||
} // CraftBukkit
|
||||
}
|
||||
|
||||
- if (blockState.isAir() && block1 instanceof FarmBlock && owner.hasFarmSeeds()) {
|
||||
+ if (blockState.isAir() && block1 instanceof FarmBlock && !this.clericWartFarmer || this.clericWartFarmer && block1 == net.minecraft.world.level.block.Blocks.SOUL_SAND && owner.hasFarmSeeds()) { // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
SimpleContainer inventory = owner.getInventory();
|
||||
|
||||
for (int i = 0; i < inventory.getContainerSize(); i++) {
|
||||
ItemStack item = inventory.getItem(i);
|
||||
boolean flag = false;
|
||||
- if (!item.isEmpty() && item.is(ItemTags.VILLAGER_PLANTABLE_SEEDS) && item.getItem() instanceof BlockItem blockItem) {
|
||||
+ if (!item.isEmpty() && (item.is(ItemTags.VILLAGER_PLANTABLE_SEEDS) || this.clericWartFarmer && item.getItem() == net.minecraft.world.item.Items.NETHER_WART) && item.getItem() instanceof BlockItem blockItem) { // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
BlockState blockState1 = blockItem.getBlock().defaultBlockState();
|
||||
if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(owner, this.aboveFarmlandPos, blockState1)) { // CraftBukkit
|
||||
level.setBlockAndUpdate(this.aboveFarmlandPos, blockState1);
|
||||
@@ -136,7 +139,7 @@ public class HarvestFarmland extends Behavior<Villager> {
|
||||
this.aboveFarmlandPos.getX(),
|
||||
this.aboveFarmlandPos.getY(),
|
||||
this.aboveFarmlandPos.getZ(),
|
||||
- SoundEvents.CROP_PLANTED,
|
||||
+ this.clericWartFarmer ? SoundEvents.NETHER_WART_PLANTED : SoundEvents.CROP_PLANTED, // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
SoundSource.BLOCKS,
|
||||
1.0F,
|
||||
1.0F
|
||||
diff --git a/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java b/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java
|
||||
index 623dd33a85cb67ecb835de18e9aac29f3394ce28..72cca4897f9697573fd6987a5f0d2df52761b8c3 100644
|
||||
--- a/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java
|
||||
+++ b/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java
|
||||
@@ -59,6 +59,12 @@ public class TradeWithVillager extends Behavior<Villager> {
|
||||
throwHalfStack(owner, ImmutableSet.of(Items.WHEAT), villager);
|
||||
}
|
||||
|
||||
+ // Purpur start - Option for Villager Clerics to farm Nether Wart
|
||||
+ if (level.purpurConfig.villagerClericsFarmWarts && level.purpurConfig.villagerClericFarmersThrowWarts && owner.getVillagerData().profession().is(VillagerProfession.CLERIC) && owner.getInventory().countItem(Items.NETHER_WART) > Items.NETHER_WART.getDefaultMaxStackSize() / 2) {
|
||||
+ throwHalfStack(owner, ImmutableSet.of(Items.NETHER_WART), villager);
|
||||
+ }
|
||||
+ // Purpur end - Option for Villager Clerics to farm Nether Wart
|
||||
+
|
||||
if (!this.trades.isEmpty() && owner.getInventory().hasAnyOf(this.trades)) {
|
||||
throwHalfStack(owner, this.trades, villager);
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java b/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java
|
||||
index c65f80aadeb27685653f6a4731888c612d4a59d6..bb07aa944ce60ec7db96e2b57bd6c2c862e2f787 100644
|
||||
--- a/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java
|
||||
+++ b/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java
|
||||
@@ -79,8 +79,13 @@ public class VillagerGoalPackages {
|
||||
public static ImmutableList<Pair<Integer, ? extends BehaviorControl<? super Villager>>> getWorkPackage(
|
||||
Holder<VillagerProfession> profession, float speedModifier
|
||||
) {
|
||||
+ // Purpur start - Option for Villager Clerics to farm Nether Wart
|
||||
+ return getWorkPackage(profession, speedModifier, false);
|
||||
+ }
|
||||
+ public static ImmutableList<Pair<Integer, ? extends BehaviorControl<? super Villager>>> getWorkPackage(Holder<VillagerProfession> profession, float speedModifier, boolean clericsFarmWarts) {
|
||||
+ // Purpur end - Option for Villager Clerics to farm Nether Wart
|
||||
WorkAtPoi workAtPoi;
|
||||
- if (profession.is(VillagerProfession.FARMER)) {
|
||||
+ if (profession.is(VillagerProfession.FARMER) || (clericsFarmWarts && profession.is(VillagerProfession.CLERIC))) { // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
workAtPoi = new WorkAtComposter();
|
||||
} else {
|
||||
workAtPoi = new WorkAtPoi();
|
||||
diff --git a/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java b/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java
|
||||
index f0583076ef62189508a392a76c3fb6b741bbdde9..dc4a9ddb8479e9d0c4895b19d7d677cdd8ad3faa 100644
|
||||
--- a/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java
|
||||
+++ b/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java
|
||||
@@ -22,6 +22,13 @@ public class SecondaryPoiSensor extends Sensor<Villager> {
|
||||
|
||||
@Override
|
||||
protected void doTick(ServerLevel level, Villager entity) {
|
||||
+ // Purpur start - Option for Villager Clerics to farm Nether Wart - make sure clerics don't wander to soul sand when the option is off
|
||||
+ Brain<?> brain = entity.getBrain();
|
||||
+ if (!level.purpurConfig.villagerClericsFarmWarts && entity.getVillagerData().profession().is(net.minecraft.world.entity.npc.VillagerProfession.CLERIC)) {
|
||||
+ brain.eraseMemory(MemoryModuleType.SECONDARY_JOB_SITE);
|
||||
+ return;
|
||||
+ }
|
||||
+ // Purpur end - Option for Villager Clerics to farm Nether Wart
|
||||
ResourceKey<Level> resourceKey = level.dimension();
|
||||
BlockPos blockPos = entity.blockPosition();
|
||||
List<GlobalPos> list = Lists.newArrayList();
|
||||
@@ -38,7 +45,7 @@ public class SecondaryPoiSensor extends Sensor<Villager> {
|
||||
}
|
||||
}
|
||||
|
||||
- Brain<?> brain = entity.getBrain();
|
||||
+ //Brain<?> brain = entity.getBrain(); // Purpur - Option for Villager Clerics to farm Nether Wart - moved up
|
||||
if (!list.isEmpty()) {
|
||||
brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list);
|
||||
} else {
|
||||
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
|
||||
index 4a68a8124716a57801f2d42a87e4d68c99d2f348..3b78e25de462a6fc393175f7992b9a1d4d08c64b 100644
|
||||
--- a/net/minecraft/world/entity/npc/Villager.java
|
||||
+++ b/net/minecraft/world/entity/npc/Villager.java
|
||||
@@ -315,7 +315,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
villagerBrain.setSchedule(Schedule.VILLAGER_DEFAULT);
|
||||
villagerBrain.addActivityWithConditions(
|
||||
Activity.WORK,
|
||||
- VillagerGoalPackages.getWorkPackage(holder, 0.5F),
|
||||
+ VillagerGoalPackages.getWorkPackage(holder, 0.5F, this.level().purpurConfig.villagerClericsFarmWarts), // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT))
|
||||
);
|
||||
}
|
||||
@@ -966,7 +966,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
}
|
||||
|
||||
public boolean hasFarmSeeds() {
|
||||
- return this.getInventory().hasAnyMatching(stack -> stack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS));
|
||||
+ return this.getInventory().hasAnyMatching(stack -> this.level().purpurConfig.villagerClericsFarmWarts && this.getVillagerData().profession().is(VillagerProfession.CLERIC) ? stack.is(Items.NETHER_WART) : stack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS)); // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/net/minecraft/world/entity/npc/VillagerProfession.java b/net/minecraft/world/entity/npc/VillagerProfession.java
|
||||
index 0b7fdbc19f8a977be8168bca198c157fbe90044b..abfc2542a486d5a64bf88eac69f7d9587869d3cf 100644
|
||||
--- a/net/minecraft/world/entity/npc/VillagerProfession.java
|
||||
+++ b/net/minecraft/world/entity/npc/VillagerProfession.java
|
||||
@@ -103,7 +103,7 @@ public record VillagerProfession(
|
||||
register(registry, ARMORER, PoiTypes.ARMORER, SoundEvents.VILLAGER_WORK_ARMORER);
|
||||
register(registry, BUTCHER, PoiTypes.BUTCHER, SoundEvents.VILLAGER_WORK_BUTCHER);
|
||||
register(registry, CARTOGRAPHER, PoiTypes.CARTOGRAPHER, SoundEvents.VILLAGER_WORK_CARTOGRAPHER);
|
||||
- register(registry, CLERIC, PoiTypes.CLERIC, SoundEvents.VILLAGER_WORK_CLERIC);
|
||||
+ register(registry, CLERIC, PoiTypes.CLERIC, ImmutableSet.of(Items.NETHER_WART), ImmutableSet.of(Blocks.SOUL_SAND), SoundEvents.VILLAGER_WORK_CLERIC); // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
register(
|
||||
registry,
|
||||
FARMER,
|
||||
@@ -0,0 +1,378 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Encode42 <me@encode42.dev>
|
||||
Date: Tue, 5 Jan 2021 22:21:56 -0500
|
||||
Subject: [PATCH] Add mobGriefing override to everything affected
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
||||
index 4f149e5e17d2d2f2964e2f6626e20f52121e72d9..a70fddd19b24bb25edde63e4fda4685ee6997eba 100644
|
||||
--- a/net/minecraft/world/entity/LivingEntity.java
|
||||
+++ b/net/minecraft/world/entity/LivingEntity.java
|
||||
@@ -1936,7 +1936,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||
if (this.level() instanceof ServerLevel serverLevel) {
|
||||
boolean var6 = false;
|
||||
if (this.dead && entitySource instanceof WitherBoss) { // Paper
|
||||
- if (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
BlockPos blockPos = this.blockPosition();
|
||||
BlockState blockState = Blocks.WITHER_ROSE.defaultBlockState();
|
||||
if (this.level().getBlockState(blockPos).isAir() && blockState.canSurvive(this.level(), blockPos)) {
|
||||
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
|
||||
index 3215ca469e0e469089a559672739e91c9db0edaf..e05cf29c630d43c66614012c50b9dd4ece4c44f6 100644
|
||||
--- a/net/minecraft/world/entity/Mob.java
|
||||
+++ b/net/minecraft/world/entity/Mob.java
|
||||
@@ -532,7 +532,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||||
&& this.canPickUpLoot()
|
||||
&& this.isAlive()
|
||||
&& !this.dead
|
||||
- && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.entitiesPickUpLootMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
Vec3i pickupReach = this.getPickupReach();
|
||||
|
||||
for (ItemEntity itemEntity : this.level()
|
||||
diff --git a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java
|
||||
index f15e4cfd8c0ac5e08779dbe6b9aa40bfe9ce4d8f..ec03365dc786596521d280ea4d6948c651ee8deb 100644
|
||||
--- a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java
|
||||
+++ b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java
|
||||
@@ -49,7 +49,7 @@ public class HarvestFarmland extends Behavior<Villager> {
|
||||
|
||||
@Override
|
||||
protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) {
|
||||
- if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.villagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
return false;
|
||||
} else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER) && !(level.purpurConfig.villagerClericsFarmWarts && owner.getVillagerData().profession().is(VillagerProfession.CLERIC))) { // Purpur - Option for Villager Clerics to farm Nether Wart
|
||||
return false;
|
||||
diff --git a/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java b/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java
|
||||
index e026e07ca86700c864a3dceda6817fb7b6cb11e9..cf380a13d6d54d1a9e8d10b31124942d59fca80c 100644
|
||||
--- a/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java
|
||||
+++ b/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java
|
||||
@@ -30,7 +30,7 @@ public class BreakDoorGoal extends DoorInteractGoal {
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
return super.canUse()
|
||||
- && getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)
|
||||
+ && getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.mob.level().purpurConfig.zombieMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected
|
||||
&& this.isValidDifficulty(this.mob.level().getDifficulty())
|
||||
&& !this.isOpen();
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java
|
||||
index 7a75415a469bc99f45a5cfaab038181717903f1d..3c0b94e011f029a54460c878f1f7d4f603a5e3b0 100644
|
||||
--- a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java
|
||||
+++ b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java
|
||||
@@ -67,7 +67,7 @@ public class EatBlockGoal extends Goal {
|
||||
BlockPos blockPos = this.mob.blockPosition();
|
||||
final BlockState blockState = this.level.getBlockState(blockPos); // Paper - fix wrong block state
|
||||
if (IS_EDIBLE.test(blockState)) { // Paper - fix wrong block state
|
||||
- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state
|
||||
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected
|
||||
this.level.destroyBlock(blockPos, false);
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public class EatBlockGoal extends Goal {
|
||||
} else {
|
||||
BlockPos blockPos1 = blockPos.below();
|
||||
if (this.level.getBlockState(blockPos1).is(Blocks.GRASS_BLOCK)) {
|
||||
- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state
|
||||
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - Fix wrong block state // Purpur - Add mobGriefing override to everything affected
|
||||
this.level.levelEvent(2001, blockPos1, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState()));
|
||||
this.level.setBlock(blockPos1, Blocks.DIRT.defaultBlockState(), 2);
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java
|
||||
index 3d40911970caf6f1de2a1ebee1df4c077703226a..179597558e93c6e9172207f716f9294de3926c49 100644
|
||||
--- a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java
|
||||
+++ b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java
|
||||
@@ -35,7 +35,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
- if (!getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (!getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.removerMob).purpurConfig.zombieMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
return false;
|
||||
} else if (this.nextStartTick > 0) {
|
||||
this.nextStartTick--;
|
||||
diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java
|
||||
index 37b6bfa8dc1fd4ed0006f6531d2056bcd3c3abae..07767c9d649e7ef2b8fd8e3ac62d99ce13271fe4 100644
|
||||
--- a/net/minecraft/world/entity/animal/Fox.java
|
||||
+++ b/net/minecraft/world/entity/animal/Fox.java
|
||||
@@ -1058,7 +1058,7 @@ public class Fox extends Animal {
|
||||
}
|
||||
|
||||
protected void onReachedTarget() {
|
||||
- if (getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(Fox.this.level()).purpurConfig.foxMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
BlockState blockState = Fox.this.level().getBlockState(this.blockPos);
|
||||
if (blockState.is(Blocks.SWEET_BERRY_BUSH)) {
|
||||
this.pickSweetBerries(blockState);
|
||||
diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java
|
||||
index 5fc1d6ba3cb54f2ea8c6fe3f994ffea2cca5784b..39154b01e23c626cc29b587ae96c611062e5b791 100644
|
||||
--- a/net/minecraft/world/entity/animal/Rabbit.java
|
||||
+++ b/net/minecraft/world/entity/animal/Rabbit.java
|
||||
@@ -648,7 +648,7 @@ public class Rabbit extends Animal {
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
if (this.nextStartTick <= 0) {
|
||||
- if (!getServerLevel(this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (!getServerLevel(this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.rabbit).purpurConfig.rabbitMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
return false;
|
||||
}
|
||||
|
||||
diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java
|
||||
index 2350e5a0ba3d4c3782332a4ef51e2b0ef0b53f39..a747c4bd3a41025c6dc225e5d809ba03f57069f8 100644
|
||||
--- a/net/minecraft/world/entity/animal/SnowGolem.java
|
||||
+++ b/net/minecraft/world/entity/animal/SnowGolem.java
|
||||
@@ -136,7 +136,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM
|
||||
this.hurtServer(serverLevel, this.damageSources().onFire().knownCause(org.bukkit.event.entity.EntityDamageEvent.DamageCause.MELTING), 1.0F); // CraftBukkit
|
||||
}
|
||||
|
||||
- if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.snowGolemMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
return;
|
||||
}
|
||||
|
||||
diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
|
||||
index 40c92ff02c22ef18b36f5d8677096dc82a60f1bb..6191a58d09fd0ca4625ecb90be78cce2049e4696 100644
|
||||
--- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
|
||||
+++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
|
||||
@@ -544,7 +544,7 @@ public class EnderDragon extends Mob implements Enemy {
|
||||
BlockPos blockPos = new BlockPos(i, i1, i2);
|
||||
BlockState blockState = level.getBlockState(blockPos);
|
||||
if (!blockState.isAir() && !blockState.is(BlockTags.DRAGON_TRANSPARENT)) {
|
||||
- if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !blockState.is(BlockTags.DRAGON_IMMUNE)) {
|
||||
+ if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.enderDragonMobGriefingOverride) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { // Purpur - Add mobGriefing override to everything affected
|
||||
// CraftBukkit start - Add blocks to list rather than destroying them
|
||||
//flag1 = level.removeBlock(blockPos, false) || flag1;
|
||||
flag1 = true;
|
||||
diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java
|
||||
index 7aaa905034979e557db97456eae3563614aab8d1..72a7fde24a132f986318c9730aad9e4cefc70fdb 100644
|
||||
--- a/net/minecraft/world/entity/boss/wither/WitherBoss.java
|
||||
+++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java
|
||||
@@ -495,7 +495,7 @@ public class WitherBoss extends Monster implements RangedAttackMob {
|
||||
|
||||
if (this.destroyBlocksTick > 0) {
|
||||
this.destroyBlocksTick--;
|
||||
- if (this.destroyBlocksTick == 0 && level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (this.destroyBlocksTick == 0 && level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
boolean flag = false;
|
||||
int alternativeTarget = Mth.floor(this.getBbWidth() / 2.0F + 1.0F);
|
||||
int floor = Mth.floor(this.getBbHeight());
|
||||
diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java
|
||||
index c83d7c43969a94432f6bec076f78fb500f672926..002fef87101e2c98c8a091d416cb4729bd092455 100644
|
||||
--- a/net/minecraft/world/entity/monster/EnderMan.java
|
||||
+++ b/net/minecraft/world/entity/monster/EnderMan.java
|
||||
@@ -507,7 +507,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||
public boolean canUse() {
|
||||
if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur - Add enderman and creeper griefing controls
|
||||
return this.enderman.getCarriedBlock() != null
|
||||
- && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)
|
||||
+ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected
|
||||
&& this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0;
|
||||
}
|
||||
|
||||
@@ -657,7 +657,7 @@ public class EnderMan extends Monster implements NeutralMob {
|
||||
public boolean canUse() {
|
||||
if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur - Add enderman and creeper griefing controls
|
||||
return this.enderman.getCarriedBlock() == null
|
||||
- && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)
|
||||
+ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected
|
||||
&& this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0;
|
||||
}
|
||||
|
||||
diff --git a/net/minecraft/world/entity/monster/Evoker.java b/net/minecraft/world/entity/monster/Evoker.java
|
||||
index e8aac93cffa3a9d4105c03c1aeb4d571ee0eba6c..4d1d746e39d136243dc620c89b29daf80dc62230 100644
|
||||
--- a/net/minecraft/world/entity/monster/Evoker.java
|
||||
+++ b/net/minecraft/world/entity/monster/Evoker.java
|
||||
@@ -306,7 +306,7 @@ public class Evoker extends SpellcasterIllager {
|
||||
return false;
|
||||
} else {
|
||||
ServerLevel serverLevel = getServerLevel(Evoker.this.level());
|
||||
- if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.evokerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
return false;
|
||||
} else {
|
||||
List<Sheep> nearbyEntities = serverLevel.getNearbyEntities(
|
||||
diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java
|
||||
index 9e7b07f353fb8f0650b8805014c371368eaabcd5..23b6d3c9746e1ee641d8b19ec50805cb271a9cc9 100644
|
||||
--- a/net/minecraft/world/entity/monster/Ravager.java
|
||||
+++ b/net/minecraft/world/entity/monster/Ravager.java
|
||||
@@ -179,7 +179,7 @@ public class Ravager extends Raider {
|
||||
|
||||
if (this.level() instanceof ServerLevel serverLevel
|
||||
&& this.horizontalCollision
|
||||
- && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) {
|
||||
+ && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected
|
||||
boolean flag = false;
|
||||
AABB aabb = this.getBoundingBox().inflate(0.2);
|
||||
|
||||
diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java
|
||||
index c200d57841304ba0d7a76fdd9a440fe9f2b25136..6f4aaeb645d9638764c3516d2f1501661ac56170 100644
|
||||
--- a/net/minecraft/world/entity/monster/Silverfish.java
|
||||
+++ b/net/minecraft/world/entity/monster/Silverfish.java
|
||||
@@ -170,7 +170,7 @@ public class Silverfish extends Monster {
|
||||
return false;
|
||||
} else {
|
||||
RandomSource random = this.mob.getRandom();
|
||||
- if (getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && random.nextInt(reducedTickDelay(10)) == 0) {
|
||||
+ if (getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.mob).purpurConfig.silverfishMobGriefingOverride) && random.nextInt(reducedTickDelay(10)) == 0) { // Purpur - Add mobGriefing override to everything affected
|
||||
this.selectedDirection = Direction.getRandom(random);
|
||||
BlockPos blockPos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5, this.mob.getZ()).relative(this.selectedDirection);
|
||||
BlockState blockState = this.mob.level().getBlockState(blockPos);
|
||||
@@ -247,7 +247,7 @@ public class Silverfish extends Monster {
|
||||
Block block = blockState.getBlock();
|
||||
if (block instanceof InfestedBlock) {
|
||||
// CraftBukkit start
|
||||
- BlockState afterState = getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state
|
||||
+ BlockState afterState = getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(level).purpurConfig.silverfishMobGriefingOverride) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected
|
||||
if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockPos1, afterState)) { // Paper - fix wrong block state
|
||||
continue;
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java
|
||||
index a86cd2da7d0467e5b7d79ec2daceb65c86750445..c600c9b1ea4fe08abdce0aed30f61ef073039c7c 100644
|
||||
--- a/net/minecraft/world/entity/monster/piglin/Piglin.java
|
||||
+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java
|
||||
@@ -450,7 +450,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
|
||||
|
||||
@Override
|
||||
public boolean wantsToPickUp(ServerLevel level, ItemStack stack) {
|
||||
- return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack);
|
||||
+ return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Add mobGriefing override to everything affected
|
||||
}
|
||||
|
||||
protected boolean canReplaceCurrentItem(ItemStack candidate) {
|
||||
diff --git a/net/minecraft/world/entity/projectile/LargeFireball.java b/net/minecraft/world/entity/projectile/LargeFireball.java
|
||||
index dd0ec97ea4561d2dccf735580faf0d65d6ac4b0d..779879f8d678a5e45e2752e6e033cc350acac89b 100644
|
||||
--- a/net/minecraft/world/entity/projectile/LargeFireball.java
|
||||
+++ b/net/minecraft/world/entity/projectile/LargeFireball.java
|
||||
@@ -20,20 +20,20 @@ public class LargeFireball extends Fireball {
|
||||
|
||||
public LargeFireball(EntityType<? extends LargeFireball> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit
|
||||
+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected
|
||||
}
|
||||
|
||||
public LargeFireball(Level level, LivingEntity owner, Vec3 movement, int explosionPower) {
|
||||
super(EntityType.FIREBALL, owner, movement, level);
|
||||
this.explosionPower = explosionPower;
|
||||
- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit
|
||||
+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHit(HitResult result) {
|
||||
super.onHit(result);
|
||||
if (this.level() instanceof ServerLevel serverLevel) {
|
||||
- boolean _boolean = serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING);
|
||||
+ boolean _boolean = serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected
|
||||
// CraftBukkit start - fire ExplosionPrimeEvent
|
||||
org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity());
|
||||
if (event.callEvent()) {
|
||||
diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java
|
||||
index ee16a05b8b2747ce95fcae1616c96143a5dec74e..f8bc051167c0266824edb816060999e6d7db6639 100644
|
||||
--- a/net/minecraft/world/entity/projectile/Projectile.java
|
||||
+++ b/net/minecraft/world/entity/projectile/Projectile.java
|
||||
@@ -436,7 +436,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
|
||||
@Override
|
||||
public boolean mayInteract(ServerLevel level, BlockPos pos) {
|
||||
Entity owner = this.getOwner();
|
||||
- return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING);
|
||||
+ return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.projectilesMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected
|
||||
}
|
||||
|
||||
public boolean mayBreak(ServerLevel level) {
|
||||
diff --git a/net/minecraft/world/entity/projectile/SmallFireball.java b/net/minecraft/world/entity/projectile/SmallFireball.java
|
||||
index 8c84cea43fc0e42a576004663670977eac99f1a6..6a0ec832226894687b28f35e1a8a190ba1542201 100644
|
||||
--- a/net/minecraft/world/entity/projectile/SmallFireball.java
|
||||
+++ b/net/minecraft/world/entity/projectile/SmallFireball.java
|
||||
@@ -25,7 +25,7 @@ public class SmallFireball extends Fireball {
|
||||
super(EntityType.SMALL_FIREBALL, owner, movement, level);
|
||||
// CraftBukkit start
|
||||
if (this.getOwner() != null && this.getOwner() instanceof Mob) {
|
||||
- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING);
|
||||
+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected
|
||||
}
|
||||
// CraftBukkit end
|
||||
}
|
||||
diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java
|
||||
index df0753c89b7c613f2abac9c50ce7f897ba280803..3baba21d106ab09ae476238f2636169c371f43cf 100644
|
||||
--- a/net/minecraft/world/entity/raid/Raider.java
|
||||
+++ b/net/minecraft/world/entity/raid/Raider.java
|
||||
@@ -401,7 +401,7 @@ public abstract class Raider extends PatrollingMonster {
|
||||
}
|
||||
|
||||
private boolean cannotPickUpBanner() {
|
||||
- if (!getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items
|
||||
+ if (!getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING, this.mob.level().purpurConfig.pillagerMobGriefingOverride) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing override to everything affected
|
||||
if (!this.mob.hasActiveRaid()) {
|
||||
return true;
|
||||
} else if (this.mob.getCurrentRaid().isOver()) {
|
||||
diff --git a/net/minecraft/world/level/GameRules.java b/net/minecraft/world/level/GameRules.java
|
||||
index d5536dd40a1e9a2e05967652f690abbbca287852..d510503a8ad272255aeba20a916642828023fd19 100644
|
||||
--- a/net/minecraft/world/level/GameRules.java
|
||||
+++ b/net/minecraft/world/level/GameRules.java
|
||||
@@ -354,6 +354,13 @@ public class GameRules {
|
||||
this.<T>getRule(key).setFrom(rule, level); // CraftBukkit - per-world
|
||||
}
|
||||
|
||||
+ public boolean getBoolean(GameRules.Key<GameRules.BooleanValue> key, Boolean gameRuleOverride) {
|
||||
+ if (gameRuleOverride != null) {
|
||||
+ return gameRuleOverride;
|
||||
+ }
|
||||
+ return this.getBoolean(key);
|
||||
+ }
|
||||
+
|
||||
public boolean getBoolean(GameRules.Key<GameRules.BooleanValue> key) {
|
||||
return this.getRule(key).get();
|
||||
}
|
||||
diff --git a/net/minecraft/world/level/block/CropBlock.java b/net/minecraft/world/level/block/CropBlock.java
|
||||
index b370b955ac8636275dfada4f38a7ca10297f7dac..d345235db5a8d5f1ebbeb5bbb5e7924cb1a75518 100644
|
||||
--- a/net/minecraft/world/level/block/CropBlock.java
|
||||
+++ b/net/minecraft/world/level/block/CropBlock.java
|
||||
@@ -169,7 +169,7 @@ public class CropBlock extends VegetationBlock implements BonemealableBlock {
|
||||
@Override
|
||||
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
|
||||
if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
|
||||
- if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list
|
||||
+ if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list // Purpur - Add mobGriefing override to everything affected
|
||||
serverLevel.destroyBlock(pos, true, entity);
|
||||
}
|
||||
|
||||
diff --git a/net/minecraft/world/level/block/FarmBlock.java b/net/minecraft/world/level/block/FarmBlock.java
|
||||
index 9883e6d1a1b76155c8ba1817fda6615b4742e18e..dc1ad33f801c308871931d271f97ff9185e9effb 100644
|
||||
--- a/net/minecraft/world/level/block/FarmBlock.java
|
||||
+++ b/net/minecraft/world/level/block/FarmBlock.java
|
||||
@@ -114,7 +114,7 @@ public class FarmBlock extends Block {
|
||||
if (level instanceof ServerLevel serverLevel
|
||||
&& (serverLevel.purpurConfig.farmlandTrampleHeight >= 0D ? fallDistance >= serverLevel.purpurConfig.farmlandTrampleHeight : level.random.nextFloat() < fallDistance - 0.5) // Purpur - Configurable farmland trample height
|
||||
&& entity instanceof LivingEntity
|
||||
- && (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))
|
||||
+ && (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.farmlandMobGriefingOverride)) // Purpur - Add mobGriefing override to everything affected
|
||||
&& entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) {
|
||||
// CraftBukkit start - Interact soil
|
||||
org.bukkit.event.Cancellable cancellable;
|
||||
diff --git a/net/minecraft/world/level/block/PowderSnowBlock.java b/net/minecraft/world/level/block/PowderSnowBlock.java
|
||||
index 248ac9bc820a96fc7653471308b18834fc735a77..ef70ba88e492904c426c7d35df442fa6f8d68844 100644
|
||||
--- a/net/minecraft/world/level/block/PowderSnowBlock.java
|
||||
+++ b/net/minecraft/world/level/block/PowderSnowBlock.java
|
||||
@@ -89,7 +89,7 @@ public class PowderSnowBlock extends Block implements BucketPickup {
|
||||
// CraftBukkit - move down
|
||||
&& entity1.mayInteract(serverLevel, blockPos)) {
|
||||
// CraftBukkit start
|
||||
- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player))) {
|
||||
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.powderSnowMobGriefingOverride) || entity1 instanceof Player))) { // Purpur - Add mobGriefing override to everything affected
|
||||
return;
|
||||
}
|
||||
// CraftBukkit end
|
||||
diff --git a/net/minecraft/world/level/block/TurtleEggBlock.java b/net/minecraft/world/level/block/TurtleEggBlock.java
|
||||
index a23626dbfacf98ef1bc7918ca35406fa71307bed..41e51cb4f1a2443361b52c8523688e2c307a1d75 100644
|
||||
--- a/net/minecraft/world/level/block/TurtleEggBlock.java
|
||||
+++ b/net/minecraft/world/level/block/TurtleEggBlock.java
|
||||
@@ -214,7 +214,7 @@ public class TurtleEggBlock extends Block {
|
||||
// Purpur end - Option to disable turtle egg trampling with feather falling
|
||||
if (entity instanceof Player) return true;
|
||||
|
||||
- return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING);
|
||||
+ return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.turtleEggsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected
|
||||
// Purpur end - Add turtle egg block options
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Mariell Hoversholm <proximyst@proximyst.com>
|
||||
Date: Sat, 9 Jan 2021 15:26:04 +0100
|
||||
Subject: [PATCH] Add EntityTeleportHinderedEvent
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java
|
||||
index 68914268ca9350a6c1d794e011e1f9a8aecd609c..8e53b45dbf740de6c6fe499ef424d11b2b15f9d8 100644
|
||||
--- a/net/minecraft/world/level/block/EndGatewayBlock.java
|
||||
+++ b/net/minecraft/world/level/block/EndGatewayBlock.java
|
||||
@@ -99,6 +99,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal {
|
||||
org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.END_GATEWAY); // Paper - add portal type
|
||||
if (!event.callEvent()) return;
|
||||
// Paper end - call EntityPortalEnterEvent
|
||||
+ // Purpur start - Add EntityTeleportHinderedEvent
|
||||
+ if (level.purpurConfig.imposeTeleportRestrictionsOnGateways && (entity.isVehicle() || entity.isPassenger())) {
|
||||
+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY).callEvent()) {
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Add EntityTeleportHinderedEvent
|
||||
entity.setAsInsidePortal(this, pos);
|
||||
TheEndGatewayBlockEntity.triggerCooldown(level, pos, state, theEndGatewayBlockEntity);
|
||||
}
|
||||
diff --git a/net/minecraft/world/level/block/EndPortalBlock.java b/net/minecraft/world/level/block/EndPortalBlock.java
|
||||
index f6c64277c3d6e16250e2bf963b6427404e27aa9b..997831c2b916899da8518c1415233812e6ec16b8 100644
|
||||
--- a/net/minecraft/world/level/block/EndPortalBlock.java
|
||||
+++ b/net/minecraft/world/level/block/EndPortalBlock.java
|
||||
@@ -60,6 +60,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal {
|
||||
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
|
||||
if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
|
||||
if (entity.canUsePortal(false)) {
|
||||
+ // Purpur start - Add EntityTeleportHinderedEvent
|
||||
+ if (level.purpurConfig.imposeTeleportRestrictionsOnEndPortals && (entity.isVehicle() || entity.isPassenger())) {
|
||||
+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_PORTAL).callEvent()) {
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Add EntityTeleportHinderedEvent
|
||||
// CraftBukkit start - Entity in portal
|
||||
org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.ENDER); // Paper - add portal type
|
||||
level.getCraftServer().getPluginManager().callEvent(event);
|
||||
diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java
|
||||
index f408bdd8083210b2ef660e6194610462a3e113b6..44707c0bf2c11f7bf7e30f747357ca2a1c6057d6 100644
|
||||
--- a/net/minecraft/world/level/block/NetherPortalBlock.java
|
||||
+++ b/net/minecraft/world/level/block/NetherPortalBlock.java
|
||||
@@ -113,6 +113,13 @@ public class NetherPortalBlock extends Block implements Portal {
|
||||
protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) {
|
||||
if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
|
||||
if (entity.canUsePortal(false)) {
|
||||
+ // Purpur start - Add EntityTeleportHinderedEvent
|
||||
+ if (level.purpurConfig.imposeTeleportRestrictionsOnNetherPortals && (entity.isVehicle() || entity.isPassenger())) {
|
||||
+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.NETHER_PORTAL).callEvent()) {
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - Add EntityTeleportHinderedEvent
|
||||
// CraftBukkit start - Entity in portal
|
||||
org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.NETHER); // Paper - add portal type
|
||||
level.getCraftServer().getPluginManager().callEvent(event);
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,347 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Kerllenevich <ben@omega24.dev>
|
||||
Date: Tue, 25 May 2021 16:31:09 -0400
|
||||
Subject: [PATCH] API for any mob to burn daylight
|
||||
|
||||
Co-authored by: Encode42 <me@encode42.dev>
|
||||
|
||||
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
|
||||
index bce2b06cd7c0b9928a6538ddcd370f2c4d84a9ae..5a6db2d02204cf98de02c30b63666692ed03c000 100644
|
||||
--- a/net/minecraft/world/entity/Entity.java
|
||||
+++ b/net/minecraft/world/entity/Entity.java
|
||||
@@ -435,6 +435,24 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
}
|
||||
// Purpur end - Add canSaveToDisk to Entity
|
||||
|
||||
+ // Purpur start - copied from Mob - API for any mob to burn daylight
|
||||
+ public boolean isSunBurnTick() {
|
||||
+ if (this.level().isBrightOutside() && !this.level().isClientSide) {
|
||||
+ float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue();
|
||||
+ BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ());
|
||||
+ boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow;
|
||||
+ if (lightLevelDependentMagicValue > 0.5F
|
||||
+ && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F
|
||||
+ && !flag
|
||||
+ && this.level().canSeeSky(blockPos)) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+ }
|
||||
+ // Purpur end - copied from Mob - API for any mob to burn daylight
|
||||
+
|
||||
public Entity(EntityType<?> entityType, Level level) {
|
||||
this.type = entityType;
|
||||
this.level = level;
|
||||
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
||||
index a70fddd19b24bb25edde63e4fda4685ee6997eba..eabee40979ab8a1611b2d4eff04414f303b672f1 100644
|
||||
--- a/net/minecraft/world/entity/LivingEntity.java
|
||||
+++ b/net/minecraft/world/entity/LivingEntity.java
|
||||
@@ -286,6 +286,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||
public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event
|
||||
public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
|
||||
public int shieldBlockingDelay = this.level().paperConfig().misc.shieldBlockingDelay; // Paper - Make shield blocking delay configurable
|
||||
+ protected boolean shouldBurnInDay = false; public boolean shouldBurnInDay() { return this.shouldBurnInDay; } public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } // Purpur - API for any mob to burn daylight
|
||||
// CraftBukkit end
|
||||
|
||||
protected LivingEntity(EntityType<? extends LivingEntity> entityType, Level level) {
|
||||
@@ -789,6 +790,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||
this.getSleepingPos().ifPresent(blockPos -> output.store("sleeping_pos", BlockPos.CODEC, blockPos));
|
||||
DataResult<Dynamic<?>> dataResult = this.brain.serializeStart(NbtOps.INSTANCE).map(tag -> new Dynamic<>(NbtOps.INSTANCE, tag));
|
||||
dataResult.resultOrPartial(LOGGER::error).ifPresent(dynamic -> output.store("Brain", Codec.PASSTHROUGH, (Dynamic<?>)dynamic));
|
||||
+ output.putBoolean("Purpur.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - API for any mob to burn daylight
|
||||
if (this.lastHurtByPlayer != null) {
|
||||
this.lastHurtByPlayer.store(output, "last_hurt_by_player");
|
||||
output.putInt("last_hurt_by_player_memory_time", this.lastHurtByPlayerMemoryTime);
|
||||
@@ -915,6 +917,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||
} // Paper - The sleeping pos will always also set the actual pos, so a desync suggests something is wrong
|
||||
}, this::clearSleepingPos);
|
||||
input.read("Brain", Codec.PASSTHROUGH).ifPresent(dynamic -> this.brain = this.makeBrain((Dynamic<?>)dynamic));
|
||||
+ this.shouldBurnInDay = input.getBooleanOr("Purpur.ShouldBurnInDay", false); // Purpur - API for any mob to burn daylight
|
||||
this.lastHurtByPlayer = EntityReference.read(input, "last_hurt_by_player");
|
||||
this.lastHurtByPlayerMemoryTime = input.getIntOr("last_hurt_by_player_memory_time", 0);
|
||||
this.lastHurtByMob = EntityReference.read(input, "last_hurt_by_mob");
|
||||
@@ -3666,6 +3669,32 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||
if (this.level() instanceof ServerLevel serverLevel && this.isSensitiveToWater() && this.isInWaterOrRain()) {
|
||||
this.hurtServer(serverLevel, this.damageSources().drown(), 1.0F);
|
||||
}
|
||||
+
|
||||
+ // Purpur start - copied from Zombie - API for any mob to burn daylight
|
||||
+ if (this.isAlive()) {
|
||||
+ boolean flag = this.shouldBurnInDay() && this.isSunBurnTick(); // Paper - shouldBurnInDay API // Purpur - use shouldBurnInDay() method to handle Phantoms properly - API for any mob to burn daylight
|
||||
+ if (flag) {
|
||||
+ ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD);
|
||||
+ if (!itemBySlot.isEmpty()) {
|
||||
+ if (itemBySlot.isDamageableItem()) {
|
||||
+ Item item = itemBySlot.getItem();
|
||||
+ itemBySlot.setDamageValue(itemBySlot.getDamageValue() + this.random.nextInt(2));
|
||||
+ if (itemBySlot.getDamageValue() >= itemBySlot.getMaxDamage()) {
|
||||
+ this.onEquippedItemBroken(item, EquipmentSlot.HEAD);
|
||||
+ this.setItemSlot(EquipmentSlot.HEAD, ItemStack.EMPTY);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ flag = false;
|
||||
+ }
|
||||
+
|
||||
+ if (flag) {
|
||||
+ if (getRider() == null || !this.isControllable()) // Purpur - ignore mobs which are uncontrollable or without rider - API for any mob to burn daylight
|
||||
+ this.igniteForSeconds(8.0F);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ // Purpur end - copied from Zombie - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
protected void applyInput() {
|
||||
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
|
||||
index e05cf29c630d43c66614012c50b9dd4ece4c44f6..b0a5f79eb2c3ea84fd37eaa653a4f2c83caeab5d 100644
|
||||
--- a/net/minecraft/world/entity/Mob.java
|
||||
+++ b/net/minecraft/world/entity/Mob.java
|
||||
@@ -1557,19 +1557,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||||
}
|
||||
|
||||
public boolean isSunBurnTick() {
|
||||
- if (this.level().isBrightOutside() && !this.level().isClientSide) {
|
||||
- float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue();
|
||||
- BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ());
|
||||
- boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow;
|
||||
- if (lightLevelDependentMagicValue > 0.5F
|
||||
- && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F
|
||||
- && !flag
|
||||
- && this.level().canSeeSky(blockPos)) {
|
||||
- return true;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return false;
|
||||
+ // Purpur - implemented in Entity - API for any mob to burn daylight
|
||||
+ return super.isSunBurnTick();
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/net/minecraft/world/entity/monster/AbstractSkeleton.java b/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
||||
index caa018d1dd0b6e97ec9d3fa70bbffe9eb3b1edec..d69d5b575e93b4ae9a0e2b311352fd3790d464c6 100644
|
||||
--- a/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
||||
+++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java
|
||||
@@ -64,11 +64,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
|
||||
AbstractSkeleton.this.setAggressive(true);
|
||||
}
|
||||
};
|
||||
- private boolean shouldBurnInDay = true; // Paper - shouldBurnInDay API
|
||||
+ //private boolean shouldBurnInDay = true; // Paper - shouldBurnInDay API // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight
|
||||
|
||||
protected AbstractSkeleton(EntityType<? extends AbstractSkeleton> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
this.reassessWeaponGoal();
|
||||
+ this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -110,27 +111,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
|
||||
|
||||
@Override
|
||||
public void aiStep() {
|
||||
- boolean isSunBurnTick = this.shouldBurnInDay && this.isSunBurnTick(); // Paper - shouldBurnInDay API
|
||||
- if (isSunBurnTick) {
|
||||
- ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD);
|
||||
- if (!itemBySlot.isEmpty()) {
|
||||
- if (itemBySlot.isDamageableItem()) {
|
||||
- Item item = itemBySlot.getItem();
|
||||
- itemBySlot.setDamageValue(itemBySlot.getDamageValue() + this.random.nextInt(2));
|
||||
- if (itemBySlot.getDamageValue() >= itemBySlot.getMaxDamage()) {
|
||||
- this.onEquippedItemBroken(item, EquipmentSlot.HEAD);
|
||||
- this.setItemSlot(EquipmentSlot.HEAD, ItemStack.EMPTY);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- isSunBurnTick = false;
|
||||
- }
|
||||
-
|
||||
- if (isSunBurnTick) {
|
||||
- this.igniteForSeconds(8.0F);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
+ // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
super.aiStep();
|
||||
}
|
||||
|
||||
@@ -242,14 +223,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo
|
||||
protected void readAdditionalSaveData(ValueInput input) {
|
||||
super.readAdditionalSaveData(input);
|
||||
this.reassessWeaponGoal();
|
||||
- this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - shouldBurnInDay API
|
||||
+ //this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - shouldBurnInDay API // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
// Paper start - shouldBurnInDay API
|
||||
@Override
|
||||
protected void addAdditionalSaveData(final net.minecraft.world.level.storage.ValueOutput output) {
|
||||
super.addAdditionalSaveData(output);
|
||||
- output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay);
|
||||
+ //output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
}
|
||||
// Paper end - shouldBurnInDay API
|
||||
|
||||
diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java
|
||||
index 9baec22561093d64157d93449e84c23b3f238b39..3f331215ef49c52fa3a53bcf744159d2221111f5 100644
|
||||
--- a/net/minecraft/world/entity/monster/Husk.java
|
||||
+++ b/net/minecraft/world/entity/monster/Husk.java
|
||||
@@ -19,6 +19,7 @@ import net.minecraft.world.level.ServerLevelAccessor;
|
||||
public class Husk extends Zombie {
|
||||
public Husk(EntityType<? extends Husk> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
+ this.setShouldBurnInDay(false); // Purpur - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
// Purpur start - Ridables
|
||||
@@ -82,7 +83,7 @@ public class Husk extends Zombie {
|
||||
|
||||
@Override
|
||||
public boolean isSunSensitive() {
|
||||
- return false;
|
||||
+ return this.shouldBurnInDay; // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java
|
||||
index 3e66363e0677d98b5c406fbaac2d4eaa533c6eb2..bfd4d7eef537c0d3688159d6db99236d6ed2f810 100644
|
||||
--- a/net/minecraft/world/entity/monster/Phantom.java
|
||||
+++ b/net/minecraft/world/entity/monster/Phantom.java
|
||||
@@ -62,6 +62,7 @@ public class Phantom extends Mob implements Enemy {
|
||||
this.xpReward = 5;
|
||||
this.moveControl = new Phantom.PhantomMoveControl(this);
|
||||
this.lookControl = new Phantom.PhantomLookControl(this);
|
||||
+ this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
// Purpur start - Ridables
|
||||
@@ -148,6 +149,16 @@ public class Phantom extends Mob implements Enemy {
|
||||
}
|
||||
// Purpur end - Toggle for water sensitive mob damage
|
||||
|
||||
+ //private boolean shouldBurnInDay = true; // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight
|
||||
+ // Purpur start - API for any mob to burn daylight
|
||||
+ public boolean shouldBurnInDay() {
|
||||
+ boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight;
|
||||
+ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight;
|
||||
+ return burnFromDaylight || burnFromLightSource;
|
||||
+ }
|
||||
+ public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; }
|
||||
+ // Purpur end - API for any mob to burn daylight
|
||||
+
|
||||
@Override
|
||||
public boolean isFlapping() {
|
||||
return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0;
|
||||
@@ -263,15 +274,7 @@ public class Phantom extends Mob implements Enemy {
|
||||
|
||||
@Override
|
||||
public void aiStep() {
|
||||
- // Purpur start - Phantoms burn in light
|
||||
- boolean burnFromDaylight = this.shouldBurnInDay && this.isSunBurnTick() && this.level().purpurConfig.phantomBurnInDaylight;
|
||||
- boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight;
|
||||
- if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API
|
||||
- // Purpur end - Phantoms burn in light
|
||||
- if (getRider() == null || !this.isControllable()) // Purpur - Ridables
|
||||
- this.igniteForSeconds(8.0F);
|
||||
- }
|
||||
-
|
||||
+ // Purpur - implemented in LivingEntity; moved down to shouldBurnInDay() - API for any mob to burn daylight
|
||||
super.aiStep();
|
||||
}
|
||||
|
||||
@@ -309,7 +312,7 @@ public class Phantom extends Mob implements Enemy {
|
||||
this.setPhantomSize(input.getIntOr("size", 0));
|
||||
// Paper start
|
||||
this.spawningEntity = input.read("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC).orElse(null);
|
||||
- this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true);
|
||||
+ //this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
// Paper end
|
||||
}
|
||||
|
||||
@@ -320,7 +323,7 @@ public class Phantom extends Mob implements Enemy {
|
||||
output.putInt("size", this.getPhantomSize());
|
||||
// Paper start
|
||||
output.storeNullable("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC, this.spawningEntity);
|
||||
- output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay);
|
||||
+ output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
// Paper end
|
||||
}
|
||||
|
||||
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
|
||||
index 51cd12a8173d9f95c6a7c2503c3e0e4d40c427c5..147c030a2f8fd0d430070a36946fa42af177ea68 100644
|
||||
--- a/net/minecraft/world/entity/monster/Zombie.java
|
||||
+++ b/net/minecraft/world/entity/monster/Zombie.java
|
||||
@@ -92,11 +92,12 @@ public class Zombie extends Monster {
|
||||
private boolean canBreakDoors = false;
|
||||
private int inWaterTime = 0;
|
||||
public int conversionTime;
|
||||
- private boolean shouldBurnInDay = true; // Paper - Add more Zombie API
|
||||
+ //private boolean shouldBurnInDay = true; // Paper - Add more Zombie API // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
|
||||
public Zombie(EntityType<? extends Zombie> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
this.breakDoorGoal = new BreakDoorGoal(this, com.google.common.base.Predicates.in(level.paperConfig().entities.behavior.doorBreakingDifficulty.getOrDefault(entityType, level.paperConfig().entities.behavior.doorBreakingDifficulty.get(EntityType.ZOMBIE)))); // Paper - Configurable door breaking difficulty
|
||||
+ this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
public Zombie(Level level) {
|
||||
@@ -293,29 +294,7 @@ public class Zombie extends Monster {
|
||||
|
||||
@Override
|
||||
public void aiStep() {
|
||||
- if (this.isAlive()) {
|
||||
- boolean flag = this.isSunSensitive() && this.isSunBurnTick();
|
||||
- if (flag) {
|
||||
- ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD);
|
||||
- if (!itemBySlot.isEmpty()) {
|
||||
- if (itemBySlot.isDamageableItem()) {
|
||||
- Item item = itemBySlot.getItem();
|
||||
- itemBySlot.setDamageValue(itemBySlot.getDamageValue() + this.random.nextInt(2));
|
||||
- if (itemBySlot.getDamageValue() >= itemBySlot.getMaxDamage()) {
|
||||
- this.onEquippedItemBroken(item, EquipmentSlot.HEAD);
|
||||
- this.setItemSlot(EquipmentSlot.HEAD, ItemStack.EMPTY);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- flag = false;
|
||||
- }
|
||||
-
|
||||
- if (flag) {
|
||||
- this.igniteForSeconds(8.0F);
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
+ // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
super.aiStep();
|
||||
}
|
||||
|
||||
@@ -374,6 +353,7 @@ public class Zombie extends Monster {
|
||||
// CraftBukkit end
|
||||
}
|
||||
|
||||
+ public boolean shouldBurnInDay() { return this.isSunSensitive(); } // Purpur - for ABI compatibility - API for any mob to burn daylight
|
||||
public boolean isSunSensitive() {
|
||||
return this.shouldBurnInDay; // Paper - Add more Zombie API
|
||||
}
|
||||
@@ -511,7 +491,7 @@ public class Zombie extends Monster {
|
||||
output.putBoolean("CanBreakDoors", this.canBreakDoors());
|
||||
output.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1);
|
||||
output.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1);
|
||||
- output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API
|
||||
+ //output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -526,7 +506,7 @@ public class Zombie extends Monster {
|
||||
} else {
|
||||
this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, false);
|
||||
}
|
||||
- this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - Add more Zombie API
|
||||
+ //this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - Add more Zombie API // Purpur - implemented in LivingEntity - API for any mob to burn daylight
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -0,0 +1,79 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||||
Date: Mon, 30 Aug 2021 22:49:53 -0500
|
||||
Subject: [PATCH] Cows naturally aggressive to players chance
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java
|
||||
index bead2f6800bdc404228500c12caf326559fa47de..e6ef56d94e29a6629c9b672ed4ac4ef29ad6a286 100644
|
||||
--- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java
|
||||
+++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java
|
||||
@@ -128,7 +128,7 @@ public class DefaultAttributes {
|
||||
.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.MOOSHROOM, net.minecraft.world.entity.animal.AbstractCow.createAttributes().build()) // Purpur - Cows naturally aggressive to players chance
|
||||
.put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build())
|
||||
.put(EntityType.OCELOT, Ocelot.createAttributes().build())
|
||||
.put(EntityType.PANDA, Panda.createAttributes().build())
|
||||
diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java
|
||||
index d584ffe3cc8dfb5fd4ce352b1da18af6a143d575..09ee10a17e15431a2937cf753e670dc000a2e36f 100644
|
||||
--- a/net/minecraft/world/entity/animal/Cow.java
|
||||
+++ b/net/minecraft/world/entity/animal/Cow.java
|
||||
@@ -23,6 +23,8 @@ import net.minecraft.world.level.storage.ValueInput;
|
||||
import net.minecraft.world.level.storage.ValueOutput;
|
||||
|
||||
public class Cow extends AbstractCow {
|
||||
+ private boolean isNaturallyAggressiveToPlayers; // Purpur - Cows naturally aggressive to players chance
|
||||
+
|
||||
private static final EntityDataAccessor<Holder<CowVariant>> DATA_VARIANT_ID = SynchedEntityData.defineId(Cow.class, EntityDataSerializers.COW_VARIANT);
|
||||
|
||||
public Cow(EntityType<? extends Cow> entityType, Level level) {
|
||||
@@ -49,8 +51,9 @@ public class Cow extends AbstractCow {
|
||||
// Purpur start - Configurable entity base attributes
|
||||
@Override
|
||||
public void initAttributes() {
|
||||
- this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth);
|
||||
- this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.cowScale);
|
||||
+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth);
|
||||
+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SCALE).setBaseValue(this.level().purpurConfig.cowScale);
|
||||
+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.ATTACK_DAMAGE).setBaseValue(this.level().purpurConfig.cowNaturallyAggressiveToPlayersDamage); // Purpur - Cows naturally aggressive to players chance
|
||||
}
|
||||
// Purpur end - Configurable entity base attributes
|
||||
|
||||
@@ -68,6 +71,13 @@ public class Cow extends AbstractCow {
|
||||
}
|
||||
// Purpur end - Toggle for water sensitive mob damage
|
||||
|
||||
+ @Override
|
||||
+ protected void registerGoals() {
|
||||
+ super.registerGoals();
|
||||
+ this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.MeleeAttackGoal(this, 1.2000000476837158D, true)); // Purpur - Cows naturally aggressive to players chance
|
||||
+ this.targetSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal<>(this, net.minecraft.world.entity.player.Player.class, 10, true, false, (ignored, ignored2) -> isNaturallyAggressiveToPlayers)); // Purpur - Cows naturally aggressive to players chance
|
||||
+ }
|
||||
+
|
||||
@Override
|
||||
protected void defineSynchedData(SynchedEntityData.Builder builder) {
|
||||
super.defineSynchedData(builder);
|
||||
@@ -80,6 +90,12 @@ public class Cow extends AbstractCow {
|
||||
VariantUtils.writeVariant(output, this.getVariant());
|
||||
}
|
||||
|
||||
+ // Purpur start - Cows naturally aggressive to players chance
|
||||
+ public static net.minecraft.world.entity.ai.attributes.AttributeSupplier.Builder createAttributes() {
|
||||
+ return AbstractCow.createAttributes().add(net.minecraft.world.entity.ai.attributes.Attributes.ATTACK_DAMAGE, 0.0D);
|
||||
+ }
|
||||
+ // Purpur end - Cows naturally aggressive to players chance
|
||||
+
|
||||
@Override
|
||||
protected void readAdditionalSaveData(ValueInput input) {
|
||||
super.readAdditionalSaveData(input);
|
||||
@@ -101,6 +117,7 @@ public class Cow extends AbstractCow {
|
||||
public SpawnGroupData finalizeSpawn(
|
||||
ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData
|
||||
) {
|
||||
+ this.isNaturallyAggressiveToPlayers = level.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance > 0.0D && random.nextDouble() <= level.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance; // Purpur - Cows naturally aggressive to players chance
|
||||
VariantUtils.selectVariantToSpawn(SpawnContext.create(level, this.blockPosition()), Registries.COW_VARIANT).ifPresent(this::setVariant);
|
||||
return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user