net.minecraft.world.entity.raid

This commit is contained in:
Jake Potrebic
2024-12-13 19:53:42 -08:00
parent aa7204fd62
commit 368d2116ba
4 changed files with 128 additions and 156 deletions

View File

@@ -0,0 +1,174 @@
--- a/net/minecraft/world/entity/raid/Raid.java
+++ b/net/minecraft/world/entity/raid/Raid.java
@@ -104,6 +_,11 @@
private Raid.RaidStatus status;
private int celebrationTicks;
private Optional<BlockPos> waveSpawnPos = Optional.empty();
+ // Paper start
+ private static final String PDC_NBT_KEY = "BukkitValues";
+ private static final org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry PDC_TYPE_REGISTRY = new org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry();
+ public final org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer persistentDataContainer = new org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer(PDC_TYPE_REGISTRY);
+ // Paper end
public Raid(int id, ServerLevel level, BlockPos center) {
this.id = id;
@@ -136,6 +_,11 @@
this.heroesOfTheVillage.add(NbtUtils.loadUUID(tag));
}
}
+ // Paper start
+ if (compound.contains(PDC_NBT_KEY, net.minecraft.nbt.Tag.TAG_COMPOUND)) {
+ this.persistentDataContainer.putAll(compound.getCompound(PDC_NBT_KEY));
+ }
+ // Paper end
}
public boolean isOver() {
@@ -162,6 +_,12 @@
return this.status == Raid.RaidStatus.LOSS;
}
+ // CraftBukkit start
+ public boolean isInProgress() {
+ return this.status == RaidStatus.ONGOING;
+ }
+ // CraftBukkit end
+
public float getTotalHealth() {
return this.totalHealth;
}
@@ -252,6 +_,7 @@
boolean flag = this.active;
this.active = this.level.hasChunkAt(this.center);
if (this.level.getDifficulty() == Difficulty.PEACEFUL) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(this, org.bukkit.event.raid.RaidStopEvent.Reason.PEACE); // CraftBukkit
this.stop();
return;
}
@@ -271,13 +_,16 @@
if (!this.level.isVillage(this.center)) {
if (this.groupsSpawned > 0) {
this.status = Raid.RaidStatus.LOSS;
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidFinishEvent(this, new java.util.ArrayList<>()); // CraftBukkit
} else {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(this, org.bukkit.event.raid.RaidStopEvent.Reason.NOT_IN_VILLAGE); // CraftBukkit
this.stop();
}
}
this.ticksActive++;
if (this.ticksActive >= 48000L) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(this, org.bukkit.event.raid.RaidStopEvent.Reason.TIMEOUT); // CraftBukkit
this.stop();
return;
}
@@ -346,6 +_,7 @@
}
if (i > 5) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(this, org.bukkit.event.raid.RaidStopEvent.Reason.UNSPAWNABLE); // CraftBukkit
this.stop();
break;
}
@@ -357,6 +_,7 @@
} else {
this.status = Raid.RaidStatus.VICTORY;
+ List<org.bukkit.entity.Player> winners = new java.util.ArrayList<>(); // CraftBukkit
for (UUID uuid : this.heroesOfTheVillage) {
Entity entity = this.level.getEntity(uuid);
if (entity instanceof LivingEntity) {
@@ -368,10 +_,12 @@
if (livingEntity instanceof ServerPlayer serverPlayer) {
serverPlayer.awardStat(Stats.RAID_WIN);
CriteriaTriggers.RAID_WIN.trigger(serverPlayer);
+ winners.add(serverPlayer.getBukkitEntity()); // CraftBukkit
}
}
}
}
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidFinishEvent(this, winners); // CraftBukkit
}
}
@@ -379,6 +_,7 @@
} else if (this.isOver()) {
this.celebrationTicks++;
if (this.celebrationTicks >= 600) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(this, org.bukkit.event.raid.RaidStopEvent.Reason.FINISHED); // CraftBukkit
this.stop();
return;
}
@@ -491,6 +_,10 @@
DifficultyInstance currentDifficultyAt = this.level.getCurrentDifficultyAt(pos);
boolean shouldSpawnBonusGroup = this.shouldSpawnBonusGroup();
+ // CraftBukkit start
+ Raider leader = null;
+ List<Raider> raiders = new java.util.ArrayList<>();
+ // CraftBukkit end
for (Raid.RaiderType raiderType : Raid.RaiderType.VALUES) {
int i1 = this.getDefaultNumSpawns(raiderType, i, shouldSpawnBonusGroup)
+ this.getPotentialBonusSpawns(raiderType, this.random, i, currentDifficultyAt, shouldSpawnBonusGroup);
@@ -506,9 +_,11 @@
raider.setPatrolLeader(true);
this.setLeader(i, raider);
flag = true;
+ leader = raider; // CraftBukkit
}
this.joinRaid(i, raider, pos, false);
+ raiders.add(raider); // CraftBukkit
if (raiderType.entityType == EntityType.RAVAGER) {
Raider raider1 = null;
if (i == this.getNumGroups(Difficulty.NORMAL)) {
@@ -526,6 +_,7 @@
this.joinRaid(i, raider1, pos, false);
raider1.moveTo(pos, 0.0F, 0.0F);
raider1.startRiding(raider);
+ raiders.add(raider); // CraftBukkit
}
}
}
@@ -535,6 +_,7 @@
this.groupsSpawned++;
this.updateBossbar();
this.setDirty();
+ org.bukkit.craftbukkit.event.CraftEventFactory.callRaidSpawnWaveEvent(this, leader, raiders); // CraftBukkit
}
public void joinRaid(int wave, Raider raider, @Nullable BlockPos pos, boolean isRecruited) {
@@ -549,7 +_,7 @@
raider.finalizeSpawn(this.level, this.level.getCurrentDifficultyAt(pos), EntitySpawnReason.EVENT, null);
raider.applyRaidBuffs(this.level, wave, false);
raider.setOnGround(true);
- this.level.addFreshEntityWithPassengers(raider);
+ this.level.addFreshEntityWithPassengers(raider, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.RAID); // CraftBukkit
}
}
}
@@ -770,6 +_,11 @@
}
compound.put("HeroesOfTheVillage", listTag);
+ // Paper start
+ if (!this.persistentDataContainer.isEmpty()) {
+ compound.put(PDC_NBT_KEY, this.persistentDataContainer.toTagCompound());
+ }
+ // Paper end
return compound;
}
@@ -802,6 +_,12 @@
public void addHeroOfTheVillage(Entity player) {
this.heroesOfTheVillage.add(player.getUUID());
}
+
+ // CraftBukkit start - a method to get all raiders
+ public java.util.Collection<Raider> getRaiders() {
+ return this.groupRaiderMap.values().stream().flatMap(Set::stream).collect(java.util.stream.Collectors.toSet());
+ }
+ // CraftBukkit end
static enum RaidStatus {
ONGOING,

View File

@@ -0,0 +1,54 @@
--- a/net/minecraft/world/entity/raid/Raider.java
+++ b/net/minecraft/world/entity/raid/Raider.java
@@ -212,17 +_,24 @@
if (this.hasActiveRaid()
&& !flag
&& ItemStack.matches(item, Raid.getOminousBannerInstance(this.registryAccess().lookupOrThrow(Registries.BANNER_PATTERN)))) {
+ // Paper start - EntityPickupItemEvent fixes
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityPickupItemEvent(this, entity, 0, false).isCancelled()) {
+ return;
+ }
+ // Paper end - EntityPickupItemEvent fixes
EquipmentSlot equipmentSlot = EquipmentSlot.HEAD;
ItemStack itemBySlot = this.getItemBySlot(equipmentSlot);
double d = this.getEquipmentDropChance(equipmentSlot);
if (!itemBySlot.isEmpty() && Math.max(this.random.nextFloat() - 0.1F, 0.0F) < d) {
+ this.forceDrops = true; // Paper - Add missing forceDrop toggles
this.spawnAtLocation(level, itemBySlot);
+ this.forceDrops = false; // Paper - Add missing forceDrop toggles
}
this.onItemPickup(entity);
this.setItemSlot(equipmentSlot, item);
this.take(entity, item.getCount());
- entity.discard();
+ entity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.PICKUP); // CraftBukkit - add Bukkit remove cause
this.getCurrentRaid().setLeader(this.getWave(), this);
this.setPatrolLeader(true);
} else {
@@ -296,7 +_,7 @@
for (Raider raider : getServerLevel(this.mob)
.getNearbyEntities(Raider.class, this.shoutTargeting, this.mob, this.mob.getBoundingBox().inflate(8.0, 8.0, 8.0))) {
- raider.setTarget(this.mob.getTarget());
+ raider.setTarget(this.mob.getTarget(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.FOLLOW_LEADER, true); // CraftBukkit
}
}
@@ -307,7 +_,7 @@
if (target != null) {
for (Raider raider : getServerLevel(this.mob)
.getNearbyEntities(Raider.class, this.shoutTargeting, this.mob, this.mob.getBoundingBox().inflate(8.0, 8.0, 8.0))) {
- raider.setTarget(target);
+ raider.setTarget(target, org.bukkit.event.entity.EntityTargetEvent.TargetReason.FOLLOW_LEADER, true); // CraftBukkit
raider.setAggressive(true);
}
@@ -392,6 +_,7 @@
}
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 (!this.mob.hasActiveRaid()) {
return true;
} else if (this.mob.getCurrentRaid().isOver()) {

View File

@@ -0,0 +1,28 @@
--- a/net/minecraft/world/entity/raid/Raids.java
+++ b/net/minecraft/world/entity/raid/Raids.java
@@ -112,11 +_,23 @@
}
Raid raid = this.getOrCreateRaid(player.serverLevel(), blockPos);
+ /* CraftBukkit - moved down
if (!raid.isStarted() && !this.raidMap.containsKey(raid.getId())) {
this.raidMap.put(raid.getId(), raid);
}
-
- if (!raid.isStarted() || raid.getRaidOmenLevel() < raid.getMaxRaidOmenLevel()) {
+ */
+
+ if (!raid.isStarted() || (raid.isInProgress() && raid.getRaidOmenLevel() < raid.getMaxRaidOmenLevel())) { // CraftBukkit - fixed a bug with raid: players could add up Bad Omen level even when the raid had finished
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callRaidTriggerEvent(raid, player)) {
+ player.removeEffect(net.minecraft.world.effect.MobEffects.RAID_OMEN);
+ return null;
+ }
+
+ if (!raid.isStarted() && !this.raidMap.containsKey(raid.getId())) {
+ this.raidMap.put(raid.getId(), raid);
+ }
+ // CraftBukkit end
raid.absorbRaidOmen(player);
}