net/minecraft/world/level/block/entity/trialspawner

This commit is contained in:
Bjarne Koll
2024-12-14 16:32:53 +01:00
parent bfcb0e71c9
commit 216f3118ae
6 changed files with 81 additions and 106 deletions

View File

@@ -1,63 +0,0 @@
--- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java
+++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java
@@ -46,6 +46,11 @@
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.event.block.BlockDispenseLootEvent;
+// CraftBukkit end
public final class TrialSpawner {
@@ -219,14 +224,21 @@
}
entityinsentient.setPersistenceRequired();
- Optional optional1 = mobspawnerdata.getEquipment();
+ Optional<net.minecraft.world.entity.EquipmentTable> optional1 = mobspawnerdata.getEquipment(); // CraftBukkit - decompile error
Objects.requireNonNull(entityinsentient);
optional1.ifPresent(entityinsentient::equip);
}
- if (!world.tryAddFreshEntityWithPassengers(entity)) {
+ entity.spawnedViaMobSpawner = true; // Paper
+ entity.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRIAL_SPAWNER; // Paper - Entity#getEntitySpawnReason
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callTrialSpawnerSpawnEvent(entity, pos).isCancelled()) {
return Optional.empty();
+ }
+ if (!world.tryAddFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRIAL_SPAWNER)) {
+ // CraftBukkit end
+ return Optional.empty();
} else {
TrialSpawner.FlameParticle trialspawner_a = this.isOminous ? TrialSpawner.FlameParticle.OMINOUS : TrialSpawner.FlameParticle.NORMAL;
@@ -248,6 +260,15 @@
ObjectArrayList<ItemStack> objectarraylist = loottable.getRandomItems(lootparams);
if (!objectarraylist.isEmpty()) {
+ // CraftBukkit start
+ BlockDispenseLootEvent spawnerDispenseLootEvent = CraftEventFactory.callBlockDispenseLootEvent(world, pos, null, objectarraylist);
+ if (spawnerDispenseLootEvent.isCancelled()) {
+ return;
+ }
+
+ objectarraylist = new ObjectArrayList<>(spawnerDispenseLootEvent.getDispensedLoot().stream().map(CraftItemStack::asNMSCopy).toList());
+ // CraftBukkit end
+
ObjectListIterator objectlistiterator = objectarraylist.iterator();
while (objectlistiterator.hasNext()) {
@@ -370,7 +391,7 @@
}
public void overrideEntityToSpawn(EntityType<?> entityType, Level world) {
- this.data.reset();
+ this.data.reset(this); // Paper
this.normalConfig = Holder.direct(((TrialSpawnerConfig) this.normalConfig.value()).withSpawning(entityType));
this.ominousConfig = Holder.direct(((TrialSpawnerConfig) this.ominousConfig.value()).withSpawning(entityType));
this.setState(world, TrialSpawnerState.INACTIVE);

View File

@@ -1,32 +0,0 @@
--- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java
+++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java
@@ -100,9 +100,9 @@
this.ejectingLootTable = rewardLootTable;
}
- public void reset() {
+ public void reset(TrialSpawner logic) { // Paper - Fix TrialSpawner forgets assigned mob; MC-273635
this.currentMobs.clear();
- this.nextSpawnData = Optional.empty();
+ if (!logic.getConfig().spawnPotentialsDefinition().isEmpty()) this.nextSpawnData = Optional.empty(); // Paper - Fix TrialSpawner forgets assigned mob; MC-273635
this.resetStatistics();
}
@@ -210,7 +210,7 @@
}
public void resetAfterBecomingOminous(TrialSpawner logic, ServerLevel world) {
- Stream stream = this.currentMobs.stream();
+ Stream<UUID> stream = this.currentMobs.stream(); // CraftBukkit - decompile error
Objects.requireNonNull(world);
stream.map(world::getEntity).forEach((entity) -> {
@@ -222,7 +222,7 @@
entityinsentient.dropPreservedEquipment(world);
}
- entity.remove(Entity.RemovalReason.DISCARDED);
+ entity.remove(Entity.RemovalReason.DISCARDED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - Add bukkit remove cause;
}
});
if (!logic.getOminousConfig().spawnPotentialsDefinition().isEmpty()) {

View File

@@ -1,11 +0,0 @@
--- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java
+++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java
@@ -145,7 +145,7 @@
yield ACTIVE;
} else if (trialSpawnerData.isCooldownFinished(world)) {
logic.removeOminous(world, pos);
- trialSpawnerData.reset();
+ trialSpawnerData.reset(logic); // Paper - Fix TrialSpawner forgets assigned mob; MC-273635
yield WAITING_FOR_PLAYERS;
} else {
yield this;