From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: huanli233 <392352840@qq.com> Date: Wed, 23 Oct 2024 23:10:48 +0800 Subject: [PATCH] Old raid behavior diff --git a/net/minecraft/world/effect/BadOmenMobEffect.java b/net/minecraft/world/effect/BadOmenMobEffect.java index 80f17f33f670018240c854df589cf90cdeab6e70..d7f443bcf91ac7817fe79881122960f49b331365 100644 --- a/net/minecraft/world/effect/BadOmenMobEffect.java +++ b/net/minecraft/world/effect/BadOmenMobEffect.java @@ -22,6 +22,11 @@ class BadOmenMobEffect extends MobEffect { && !serverPlayer.isSpectator() && level.getDifficulty() != Difficulty.PEACEFUL && level.isVillage(serverPlayer.blockPosition())) { + // Leaves start - Revert raid changes + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { + return level.getRaids().createOrExtendRaid(serverPlayer, serverPlayer.blockPosition()) == null; + } + // Leaves end - Revert raid changes Raid raidAt = level.getRaidAt(serverPlayer.blockPosition()); if (raidAt == null || raidAt.getRaidOmenLevel() < raidAt.getMaxRaidOmenLevel()) { serverPlayer.addEffect(new MobEffectInstance(MobEffects.RAID_OMEN, 600, amplifier)); diff --git a/net/minecraft/world/entity/raid/Raid.java b/net/minecraft/world/entity/raid/Raid.java index b3a29ce523fb5de71589c7c17598bba17622f988..8f90f3234c9b80b7a194d5dbffd8ea93835dfc06 100644 --- a/net/minecraft/world/entity/raid/Raid.java +++ b/net/minecraft/world/entity/raid/Raid.java @@ -256,7 +256,7 @@ public class Raid { } public boolean absorbRaidOmen(ServerPlayer player) { - MobEffectInstance effect = player.getEffect(MobEffects.RAID_OMEN); + MobEffectInstance effect = player.getEffect(org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior ? MobEffects.BAD_OMEN : MobEffects.RAID_OMEN); // Leaves - old Raid Behavior if (effect == null) { return false; } else { @@ -333,7 +333,13 @@ public class Raid { } if (flag1) { - this.waveSpawnPos = this.getValidSpawnPos(level); + // Leaves Start - old FindSpawnPosition + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { + this.waveSpawnPos = this.preCalcRavagerSpawnLocation(level, this.raidCooldownTicks < 100 ? 1 : 0); + } else { + this.waveSpawnPos = this.getValidSpawnPos(level); + } + // Leaves End - old FindSpawnPosition } if (this.raidCooldownTicks == 300 || this.raidCooldownTicks % 20 == 0) { @@ -368,7 +374,14 @@ public class Raid { int i = 0; while (this.shouldSpawnGroup()) { - BlockPos blockPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); + // Leaves Start - old FindSpawnPosition + BlockPos blockPos; + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { + blockPos = this.getRavagerSpawnLocation(level, i, 20); + } else { + blockPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); + } + // Leaves End - old FindSpawnPosition if (blockPos != null) { this.started = true; this.spawnGroup(level, blockPos); @@ -380,7 +393,7 @@ public class Raid { i++; } - if (i > 5) { + if (i > (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior ? 3 : 5)) { // Leaves - old FindSpawnPosition org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(level, this, org.bukkit.event.raid.RaidStopEvent.Reason.UNSPAWNABLE); // CraftBukkit this.stop(); break; @@ -667,7 +680,7 @@ public class Raid { int i2 = this.center.getX() + Mth.floor(Mth.cos(f2) * 32.0F * f) + level.random.nextInt(3) * Mth.floor(f); int i3 = this.center.getZ() + Mth.floor(Mth.sin(f2) * 32.0F * f) + level.random.nextInt(3) * Mth.floor(f); int height = level.getHeight(Heightmap.Types.WORLD_SURFACE, i2, i3); - if (Mth.abs(height - this.center.getY()) <= 96) { + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior || Mth.abs(height - this.center.getY()) <= 96) { // Leaves - skippable mutableBlockPos.set(i2, height, i3); if (!level.isVillage(mutableBlockPos) || i <= 7) { int i4 = 10; @@ -686,6 +699,36 @@ public class Raid { return null; } + // Leaves Start - old FindSpawnPosition + @Nullable + private BlockPos findRandomSpawnPos(ServerLevel level, int n, int n2) { + int n3 = 2 - n; + BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); + SpawnPlacementType spawnPlacementType = SpawnPlacements.getPlacementType(EntityType.RAVAGER); + for (int i = 0; i < n2; ++i) { + float f = level.random.nextFloat() * ((float)Math.PI * 2); + int n4 = this.center.getX() + Mth.floor(Mth.cos(f) * 32.0f * (float)n3) + level.random.nextInt(5); + int n5 = this.center.getZ() + Mth.floor(Mth.sin(f) * 32.0f * (float)n3) + level.random.nextInt(5); + int n6 = level.getHeight(Heightmap.Types.WORLD_SURFACE, n4, n5); + mutableBlockPos.set(n4, n6, n5); + if (level.isVillage(mutableBlockPos) && n < 2) continue; + if (!level.hasChunksAt(mutableBlockPos.getX() - 10, mutableBlockPos.getZ() - 10, mutableBlockPos.getX() + 10, mutableBlockPos.getZ() + 10) || !level.isPositionEntityTicking(mutableBlockPos) || !spawnPlacementType.isSpawnPositionOk(level, mutableBlockPos, EntityType.RAVAGER) && (!level.getBlockState((BlockPos)mutableBlockPos.below()).is(Blocks.SNOW) || !level.getBlockState(mutableBlockPos).isAir())) continue; + return mutableBlockPos; + } + return null; + } + + private Optional getValidSpawnPos(ServerLevel level, int n) { + for (int i = 0; i < 3; ++i) { + BlockPos blockPos = this.findRandomSpawnPos(level, n, 1); + if (blockPos == null) continue; + return Optional.of(blockPos); + } + return Optional.empty(); + } + // Leaves End - old FindSpawnPosition + + private boolean addWaveMob(ServerLevel level, int wave, Raider raider) { return this.addWaveMob(level, wave, raider, true); } @@ -843,4 +886,43 @@ public class Raid { this.spawnsPerWaveBeforeBonus = spawnsPerWaveBeforeBonus; } } + + // Leaves start - old FindSpawnPosition + private BlockPos getRavagerSpawnLocation(ServerLevel serverWorld, int proximity, int tries) { + int i = proximity == 0 ? 2 : 2 - proximity; + BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); + SpawnPlacementType spawnLocation = SpawnPlacements.getPlacementType(EntityType.RAVAGER); + + for (int j = 0; j < tries; j++) { + float f = serverWorld.random.nextFloat() * (float) (Math.PI * 2); + int k = this.center.getX() + Mth.floor(Mth.cos(f) * 32.0F * (float) i + serverWorld.random.nextInt(5)); + int l = this.center.getZ() + Mth.floor(Mth.sin(f) * 32.0F * (float) i + serverWorld.random.nextInt(5)); + int m = serverWorld.getHeight(Heightmap.Types.WORLD_SURFACE, k, l); + mutable.set(k, m, l); + + if (serverWorld.isVillage(mutable) && proximity < 2) { + continue; + } + if (serverWorld.hasChunksAt(mutable.getX() - 10, mutable.getZ() - 10, mutable.getX() + 10, mutable.getZ() + 10) + && serverWorld.isPositionEntityTicking(mutable) + && (spawnLocation.isSpawnPositionOk(serverWorld, mutable, EntityType.RAVAGER) + || serverWorld.getBlockState(mutable.below()).is(Blocks.SNOW) + && serverWorld.getBlockState(mutable).isAir()) + ) { + return mutable; + } + } + return null; + } + + private Optional preCalcRavagerSpawnLocation(ServerLevel serverWorld, int proximity) { + for (int i = 0; i < 3; i++) { + BlockPos blockPos = this.getRavagerSpawnLocation(serverWorld, proximity, 1); + if (blockPos != null) { + return Optional.of(blockPos); + } + } + return Optional.empty(); + } + // Leaves end - old FindSpawnPosition } diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java index 7b697f1dfe8131296ef55cd88a8b9d7cd884eb44..0e9cfb43d6620790f04b8a85e75308a306ec4ea5 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java @@ -128,6 +128,43 @@ public abstract class Raider extends PatrollingMonster { currentRaid.removeFromRaid(serverLevel, this, false); } + + // Leaves start - Revert raid changes + if (this.level() instanceof ServerLevel) { + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior && !this.hasRaid()) { + ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); + net.minecraft.world.entity.player.Player entityhuman = null; + if (entity instanceof net.minecraft.world.entity.player.Player player) { + entityhuman = player; + } else if (entity instanceof net.minecraft.world.entity.animal.wolf.Wolf wolf) { + LivingEntity entityliving = wolf.getOwner(); + if (wolf.isTame() && entityliving instanceof net.minecraft.world.entity.player.Player player) { + entityhuman = player; + } + } + + if (entityhuman != null && !itemstack.isEmpty() && this.isCaptain()) { + net.minecraft.world.effect.MobEffectInstance mobeffect = entityhuman.getEffect(net.minecraft.world.effect.MobEffects.BAD_OMEN); + int i = 1; + + if (mobeffect != null) { + i += mobeffect.getAmplifier(); + entityhuman.removeEffectNoUpdate(net.minecraft.world.effect.MobEffects.BAD_OMEN); + } else { + --i; + } + + i = net.minecraft.util.Mth.clamp(i, 0, 4); + net.minecraft.world.effect.MobEffectInstance mobeffect1 = new net.minecraft.world.effect.MobEffectInstance(net.minecraft.world.effect.MobEffects.BAD_OMEN, 120000, i, false, false, true); + + if (!serverLevel.getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_DISABLE_RAIDS)) { + entityhuman.addEffect(mobeffect1, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN); // CraftBukkit + } + this.setPatrolLeader(false); + } + } + } + // Leaves end - Revert raid changes } super.die(cause);