From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 29 Apr 2024 14:18:58 -0400 Subject: [PATCH] Fix Pufferfish and Purpur patches diff --git a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java index 23609a71a993fc91271578ee0a541a9c6ec7354f..34f7f74b374d319d0d578e498db7663dd58b8458 100644 --- a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java +++ b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java @@ -32,6 +32,7 @@ public record ServerBuildInfoImpl( private static final String BRAND_PAPER_NAME = "Paper"; private static final String BRAND_GALE_NAME = "Gale"; // Gale - branding changes + private static final String BRAND_PUFFERFISH_NAME = "Pufferfish"; // Leaf private static final String BRAND_PURPUR_NAME = "Purpur"; // Purpur private static final String BRAND_LEAF_NAME = "Leaf"; // Leaf @@ -66,7 +67,9 @@ public record ServerBuildInfoImpl( public boolean isBrandCompatible(final @NotNull Key brandId) { return brandId.equals(this.brandId) || brandId.equals(BRAND_PAPER_ID) - || brandId.equals(BRAND_GALE_ID); // Gale - branding changes // Leaf + || brandId.equals(BRAND_GALE_ID) // Gale - branding changes // Leaf + || brandId.equals(BRAND_PUFFERFISH_ID) // Leaf + || brandId.equals(BRAND_PURPUR_ID); // Leaf } @Override diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 2bdc050df0333dbd611d1eb2714aa2a00116a2be..332305f3112072ad2d3570af767cc9a3fbef7e46 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -300,7 +300,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); @@ -1306,9 +1306,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop byteAllowed) { - ServerGamePacketListenerImpl.LOGGER.warn("{} tried to send too large of a book. Book size: {} - Allowed: {} - Pages: {}", this.player.getScoreboardName(), byteTotal, byteAllowed, pageList.size()); + ServerGamePacketListenerImpl.LOGGER.warn("{} tried to send a book too large. Book size: {} - Allowed: {} - Pages: {}", this.player.getScoreboardName(), byteTotal, byteAllowed, pageList.size()); org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent event = new org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent(player.getBukkitEntity(), itemstack.asBukkitCopy()); if (event.shouldKickPlayer()) // Purpur this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect return; diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java index b652bfd4aea7eca7eebc0265a518956eac8b7e73..39be345524b621e6ae2eec9af9d46da3291c671b 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -562,13 +562,29 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // Purpur end // Purpur start - copied from Mob - API for any mob to burn daylight + // Gale start - JettPack - optimize sun burn tick - cache eye blockpos - copied from Mob#isSunBurnTick + private BlockPos cached_eye_blockpos; + private int cached_position_hashcode; + // Gale end - JettPack - optimize sun burn tick - cache eye blockpos - copied from Mob#isSunBurnTick + public boolean isSunBurnTick() { if (this.level().isDay() && !this.level().isClientSide) { - float f = this.getLightLevelDependentMagicValue(); - BlockPos blockposition = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); + // Gale start - JettPack - optimize sun burn tick - optimizations and cache eye blockpos - copied from Mob#isSunBurnTick + int positionHashCode = this.position.hashCode(); + if (this.cached_position_hashcode != positionHashCode) { + this.cached_eye_blockpos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); + this.cached_position_hashcode = positionHashCode; + } + + float f = this.getLightLevelDependentMagicValue(cached_eye_blockpos); // Pass BlockPos to getBrightness + + // Check brightness first + if (f <= 0.5F) return false; + if (this.random.nextFloat() * 30.0F >= (f - 0.4F) * 2.0F) return false; + // Gale end - JettPack - optimize sun burn tick - optimizations and cache eye blockpos - copied from Mob#isSunBurnTick boolean flag = this.isInWaterRainOrBubble() || this.isInPowderSnow || this.wasInPowderSnow; - if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && !flag && this.level().canSeeSky(blockposition)) { + if (!flag && this.level().canSeeSky(this.cached_eye_blockpos)) { // Gale - JettPack - optimize sun burn tick - optimizations and cache eye blockpos - copied from Mob#isSunBurnTick return true; } } @@ -874,7 +890,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess public void tick() { // Pufferfish start - entity TTL if (type != EntityType.PLAYER && type.ttl >= 0 && this.tickCount >= type.ttl) { - discard(); + discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Purpur return; } // Pufferfish end - entity TTL diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java index 92b0e53ca1e154dde919502a99e82b16b3092450..64013ae4bdaabf10ac0dbbab8ccfa6430df76b83 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1045,17 +1045,19 @@ public abstract class LivingEntity extends Entity implements Attackable { if (entity != null) { EntityType entitytypes = entity.getType(); + // Gale start - Petal - reduce skull ItemStack lookups for reduced visibility // Purpur start - if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL)) { + if (entitytypes == EntityType.SKELETON && this.getItemBySlot(EquipmentSlot.HEAD).is(Items.SKELETON_SKULL)) { d0 *= entity.level().purpurConfig.skeletonHeadVisibilityPercent; - } else if (entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD)) { + } else if (entitytypes == EntityType.ZOMBIE && this.getItemBySlot(EquipmentSlot.HEAD).is(Items.ZOMBIE_HEAD)) { d0 *= entity.level().purpurConfig.zombieHeadVisibilityPercent; - } else if (entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { + } else if (entitytypes == EntityType.CREEPER && this.getItemBySlot(EquipmentSlot.HEAD).is(Items.CREEPER_HEAD)) { d0 *= entity.level().purpurConfig.creeperHeadVisibilityPercent; - } else if ((entitytypes == EntityType.PIGLIN || entitytypes == EntityType.PIGLIN_BRUTE) && itemstack.is(Items.PIGLIN_HEAD)) { + } else if ((entitytypes == EntityType.PIGLIN || entitytypes == EntityType.PIGLIN_BRUTE) && this.getItemBySlot(EquipmentSlot.HEAD).is(Items.PIGLIN_HEAD)) { d0 *= entity.level().purpurConfig.piglinHeadVisibilityPercent; } // Purpur end + // Gale end - Petal - reduce skull ItemStack lookups for reduced visibility // Purpur start if (entity instanceof LivingEntity entityliving) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java index 78745bc7373c36a871ed9672b7fb4311f2ff3ebd..63b827d91a935d6b6f04266eea682da97af79cf2 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -705,7 +705,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @Override public void aiStep() { super.aiStep(); - if (!this.level().isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && (this.level().purpurConfig.entitiesPickUpLootBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { + if (!this.level().isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && (this.level().purpurConfig.entitiesPickUpLootBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // Purpur Vec3i baseblockposition = this.getPickupReach(); List list = this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); Iterator iterator = list.iterator(); @@ -1762,11 +1762,6 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab protected void playAttackSound() {} - // Gale start - JettPack - optimize sun burn tick - cache eye blockpos - private BlockPos cached_eye_blockpos; - private int cached_position_hashcode; - // Gale end - JettPack - optimize sun burn tick - cache eye blockpos - public boolean isSunBurnTick() { // Purpur - implemented in Entity - API for any mob to burn daylight return super.isSunBurnTick(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java index b96e596fb123f5b69d2b2f5b4a65537beaab33e6..0f6ff2fb3c5df42a44e5082c2408d5262c187870 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java @@ -21,6 +21,7 @@ public class TradeWithVillager extends Behavior { private static final Item[] WHEAT_SINGLETON_ARRAY = {Items.WHEAT}; private @org.jetbrains.annotations.NotNull Item @org.jetbrains.annotations.Nullable [] trades = null; // Gale end - optimize villager data storage + private static final Item[] NETHER_WART_SINGLETON_ARRAY = {Items.NETHER_WART}; // Leaf - sync with Gale's Optimize-villager-data-storage.patch public TradeWithVillager() { super( @@ -64,7 +65,7 @@ public class TradeWithVillager extends Behavior { // Purpur start if (world.purpurConfig.villagerClericsFarmWarts && world.purpurConfig.villagerClericFarmersThrowWarts && entity.getVillagerData().getProfession() == VillagerProfession.CLERIC && entity.getInventory().countItem(Items.NETHER_WART) > Items.NETHER_WART.getDefaultMaxStackSize() / 2) { - throwHalfStack(entity, ImmutableSet.of(Items.NETHER_WART), villager); + throwHalfStack(entity, NETHER_WART_SINGLETON_ARRAY, villager); // Leaf - sync with Gale's Optimize-villager-data-storage.patch } // Purpur end diff --git a/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java b/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java index 675126d9ab94b6c69d0436a42b9594a567aca6e4..67f16bd710e0c04b4e2dac2c2cf5862853f3f4f4 100644 --- a/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java +++ b/src/main/java/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java @@ -22,19 +22,15 @@ public class SecondaryPoiSensor extends Sensor { @Override protected void doTick(ServerLevel world, Villager entity) { + // Purpur start - make sure clerics don't wander to soul sand when the option is off // Gale start - Lithium - skip secondary POI sensor if absent var secondaryPoi = entity.getVillagerData().getProfession().secondaryPoi(); - if (secondaryPoi == null) { // Gale - optimize villager data storage - entity.getBrain().eraseMemory(MemoryModuleType.SECONDARY_JOB_SITE); - return; - } - // Gale end - Lithium - skip secondary POI sensor if absent - // Purpur start - make sure clerics don't wander to soul sand when the option is off Brain brain = entity.getBrain(); - if (!world.purpurConfig.villagerClericsFarmWarts && entity.getVillagerData().getProfession() == net.minecraft.world.entity.npc.VillagerProfession.CLERIC) { + if (secondaryPoi == null || (!world.purpurConfig.villagerClericsFarmWarts && entity.getVillagerData().getProfession() == net.minecraft.world.entity.npc.VillagerProfession.CLERIC)) { brain.eraseMemory(MemoryModuleType.SECONDARY_JOB_SITE); return; } + // Gale end - Lithium - skip secondary POI sensor if absent // Purpur end ResourceKey resourceKey = world.dimension(); BlockPos blockPos = entity.blockPosition(); diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java index c0383771b08e1d89dfa4996b979248da1de8aca1..3bb46ed871fd56bbbe52cfd2575f9e853e03cd73 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -687,7 +687,7 @@ public class ArmorStand extends LivingEntity { @Override public void tick() { - maxUpStep = level().purpurConfig.armorstandStepHeight; + maxUpStep = level().purpurConfig.armorstandStepHeight; // Purpur // Paper start - Allow ArmorStands not to tick if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Blaze.java b/src/main/java/net/minecraft/world/entity/monster/Blaze.java index 6c68c1df84e006f9992435f4c8e328c17e88c51c..f86f42863227494f7f71a7813fd49049d04aa081 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java @@ -72,7 +72,6 @@ public class Blaze extends Monster { setDeltaMovement(mot.scale(0.9D)); } } - // Purpur end @Override public void initAttributes() { @@ -84,6 +83,7 @@ public class Blaze extends Monster { protected boolean isAlwaysExperienceDropper() { return this.level().purpurConfig.blazeAlwaysDropExp; } + // Purpur end @Override protected void registerGoals() { diff --git a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java index 67ede6b9d6ff2953f155f50c0e92c517ee02c65f..759d808ee73dfb480d91ae6f17dc56f4ad0b0a20 100644 --- a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java +++ b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java @@ -31,7 +31,7 @@ public record VillagerProfession( public static final VillagerProfession ARMORER = register("armorer", PoiTypes.ARMORER, SoundEvents.VILLAGER_WORK_ARMORER); public static final VillagerProfession BUTCHER = register("butcher", PoiTypes.BUTCHER, SoundEvents.VILLAGER_WORK_BUTCHER); public static final VillagerProfession CARTOGRAPHER = register("cartographer", PoiTypes.CARTOGRAPHER, SoundEvents.VILLAGER_WORK_CARTOGRAPHER); - public static final VillagerProfession CLERIC = register("cleric", PoiTypes.CLERIC, ImmutableSet.of(Items.NETHER_WART), ImmutableSet.of(Blocks.SOUL_SAND), SoundEvents.VILLAGER_WORK_CLERIC); // Purpur + public static final VillagerProfession CLERIC = register("cleric", PoiTypes.CLERIC, new Item[] {Items.NETHER_WART}, Blocks.SOUL_SAND, SoundEvents.VILLAGER_WORK_CLERIC); // Purpur // Leaf - sync with Gale's Optimize-villager-data-storage.patch public static final VillagerProfession FARMER = register( "farmer", PoiTypes.FARMER, diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java index 0f143ed6b3448c8d40eb79dfe19b3d9e4e68d853..cbd510df8f1b886d1c40f431cb236d73f83417b9 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -77,7 +77,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { int maxChunkLoadsPerProjectile = maxProjectileChunkLoadsConfig.perProjectile.max; if (maxChunkLoadsPerProjectile >= 0 && this.chunksLoadedByProjectile >= maxChunkLoadsPerProjectile) { if (maxProjectileChunkLoadsConfig.perProjectile.removeFromWorldAfterReachLimit) { - this.discard(); + this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Purpur } else if (maxProjectileChunkLoadsConfig.perProjectile.resetMovementAfterReachLimit) { this.setDeltaMovement(0, this.getDeltaMovement().y, 0); } diff --git a/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java b/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java index fab5d5af9ec6a20810ce5e437dd617684cc5768f..d0a031014ec410142d59c8edd577bf035b7e407b 100644 --- a/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java +++ b/src/main/java/org/galemc/gale/version/AbstractPaperVersionFetcher.java @@ -101,10 +101,10 @@ public abstract class AbstractPaperVersionFetcher implements VersionFetcher { // Gale end - branding changes - version fetcher return switch (distance) { - case DISTANCE_ERROR -> text("Error obtaining version information", NamedTextColor.YELLOW); - case 0 -> text("You are running the latest version", NamedTextColor.GREEN); - case DISTANCE_UNKNOWN -> text("Unknown version", NamedTextColor.YELLOW); - default -> text("You are " + distance + " version(s) behind", NamedTextColor.YELLOW) + case DISTANCE_ERROR -> text("* Error obtaining version information", NamedTextColor.RED); // Purpur + case 0 -> text("* You are running the latest version", NamedTextColor.GREEN); // Purpur + case DISTANCE_UNKNOWN -> text("* Unknown version", NamedTextColor.YELLOW); // Purpur + default -> text("* You are " + distance + " version(s) behind", NamedTextColor.YELLOW) // Purpur .append(Component.newline()) .append(text("Download the new version at: ") .append(text(this.downloadPage, NamedTextColor.GOLD) // Gale - branding changes - version fetcher @@ -149,6 +149,6 @@ public abstract class AbstractPaperVersionFetcher implements VersionFetcher { return null; } - return text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); + return text("Previous: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); // Purpur } }