Skip to content

Commit 0a75cbc

Browse files
committed
Remove unnecessary entity tag snapshot in spawn transactions. Fix #4216
1. It's not supported by some mods 2. In practise, it's unused 3. I've searched what the purpose could have been. It would make sense if we do entity snapshots before creating the spawn event. However, the current contract of the spawn event is to lazy-init snapshots during Order.PRE. Feel free to revert this commit if you find any usage of a such snapshot. Be careful of 1. when implementing.
1 parent 413657b commit 0a75cbc

File tree

8 files changed

+20
-98
lines changed

8 files changed

+20
-98
lines changed

src/main/java/org/spongepowered/common/event/tracking/IPhaseState.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
5858
import org.spongepowered.api.item.inventory.Slot;
5959
import org.spongepowered.api.item.inventory.transaction.SlotTransaction;
60-
import org.spongepowered.api.util.Tuple;
6160
import org.spongepowered.api.world.BlockChangeFlag;
6261
import org.spongepowered.api.world.World;
6362
import org.spongepowered.common.block.SpongeBlockSnapshot;
@@ -69,7 +68,6 @@
6968
import org.spongepowered.common.entity.PlayerTracker;
7069
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
7170
import org.spongepowered.common.event.tracking.context.transaction.block.ChangeBlock;
72-
import org.spongepowered.common.event.tracking.context.transaction.world.SpawnEntityTransaction;
7371
import org.spongepowered.common.event.tracking.phase.general.ExplosionContext;
7472
import org.spongepowered.common.event.tracking.phase.packet.PacketPhase;
7573
import org.spongepowered.common.event.tracking.phase.tick.LocationBasedTickContext;
@@ -80,7 +78,6 @@
8078
import java.util.List;
8179
import java.util.function.BiConsumer;
8280
import java.util.function.Supplier;
83-
import java.util.stream.Collectors;
8481

8582
/**
8683
* A literal phase state of which the {@link World} is currently running
@@ -375,14 +372,10 @@ default Supplier<SpawnType> getSpawnTypeForTransaction(final C context, final En
375372

376373
default SpawnEntityEvent createSpawnEvent(final C context,
377374
final @Nullable GameTransaction<@NonNull ?> parent,
378-
final ImmutableList<Tuple<Entity, SpawnEntityTransaction.DummySnapshot>> collect,
375+
final ImmutableList<Entity> collect,
379376
final Cause currentCause
380377
) {
381-
return SpongeEventFactory.createSpawnEntityEvent(currentCause,
382-
collect.stream()
383-
.map(t -> (org.spongepowered.api.entity.Entity) t.first())
384-
.collect(Collectors.toList())
385-
);
378+
return SpongeEventFactory.createSpawnEntityEvent(currentCause, (List) collect);
386379
}
387380

388381
default void populateLootContext(final C phaseContext, final LootParams.Builder lootBuilder) {

src/main/java/org/spongepowered/common/event/tracking/PhaseStateProxy.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
5252
import org.spongepowered.api.item.inventory.Slot;
5353
import org.spongepowered.api.item.inventory.transaction.SlotTransaction;
54-
import org.spongepowered.api.util.Tuple;
5554
import org.spongepowered.api.world.BlockChangeFlag;
5655
import org.spongepowered.common.block.SpongeBlockSnapshot;
5756
import org.spongepowered.common.bridge.server.TickTaskBridge;
@@ -60,7 +59,6 @@
6059
import org.spongepowered.common.entity.PlayerTracker;
6160
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
6261
import org.spongepowered.common.event.tracking.context.transaction.block.ChangeBlock;
63-
import org.spongepowered.common.event.tracking.context.transaction.world.SpawnEntityTransaction;
6462
import org.spongepowered.common.event.tracking.phase.general.ExplosionContext;
6563
import org.spongepowered.common.event.tracking.phase.tick.LocationBasedTickContext;
6664
import org.spongepowered.common.world.BlockChange;
@@ -289,7 +287,7 @@ default Supplier<SpawnType> getSpawnTypeForTransaction(final Entity entityToSpaw
289287
}
290288

291289
default SpawnEntityEvent createSpawnEvent(final @Nullable GameTransaction<@NonNull ?> parent,
292-
final ImmutableList<Tuple<Entity, SpawnEntityTransaction.DummySnapshot>> collect,
290+
final ImmutableList<Entity> collect,
293291
final Cause currentCause
294292
) {
295293
return this.getState().createSpawnEvent(this.asContext(), parent, collect, currentCause);

src/main/java/org/spongepowered/common/event/tracking/context/transaction/world/EntityPerformingDropsTransaction.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
package org.spongepowered.common.event.tracking.context.transaction.world;
2626

2727
import com.google.common.collect.ImmutableList;
28-
import net.minecraft.nbt.CompoundTag;
29-
import net.minecraft.server.level.ServerLevel;
3028
import net.minecraft.world.damagesource.CombatEntry;
3129
import net.minecraft.world.damagesource.DamageSource;
3230
import net.minecraft.world.entity.Entity;
@@ -44,7 +42,6 @@
4442
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
4543
import org.spongepowered.common.event.tracking.context.transaction.type.TransactionTypes;
4644
import org.spongepowered.common.util.PrettyPrinter;
47-
import org.spongepowered.common.world.volume.VolumeStreamUtils;
4845

4946
import java.lang.ref.WeakReference;
5047
import java.util.List;
@@ -55,9 +52,7 @@
5552

5653
public final class EntityPerformingDropsTransaction extends WorldBasedTransaction<HarvestEntityEvent> {
5754

58-
private @MonotonicNonNull Supplier<ServerLevel> worldSupplier;
5955
final Entity destroyingEntity;
60-
private @MonotonicNonNull CompoundTag entityTag;
6156
private @MonotonicNonNull Supplier<Optional<DamageSource>> lastAttacker;
6257

6358
public EntityPerformingDropsTransaction(final Entity destroyingEntity) {
@@ -68,16 +63,10 @@ public EntityPerformingDropsTransaction(final Entity destroyingEntity) {
6863
@Override
6964
protected void captureState() {
7065
super.captureState();
71-
final Entity entity = this.destroyingEntity;
72-
this.worldSupplier = VolumeStreamUtils.createWeaklyReferencedSupplier((ServerLevel) entity.level(), "ServerLevel");
73-
74-
final CompoundTag tag = new CompoundTag();
75-
entity.saveWithoutId(tag);
76-
this.entityTag = tag;
7766

7867
final @Nullable DamageSource lastAttacker;
79-
if (entity instanceof LivingEntity) {
80-
final List<CombatEntry> entries = ((CombatTrackerAccessor) ((LivingEntity) entity).getCombatTracker()).accessor$entries();
68+
if (this.destroyingEntity instanceof LivingEntity living) {
69+
final List<CombatEntry> entries = ((CombatTrackerAccessor) living.getCombatTracker()).accessor$entries();
8170
if (!entries.isEmpty()) {
8271
final CombatEntry entry = entries.get(entries.size() - 1);
8372
lastAttacker = entry.source();

src/main/java/org/spongepowered/common/event/tracking/context/transaction/world/SpawnEntityTransaction.java

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,8 @@
2525
package org.spongepowered.common.event.tracking.context.transaction.world;
2626

2727
import com.google.common.collect.ImmutableList;
28-
import net.minecraft.nbt.CompoundTag;
2928
import net.minecraft.server.level.ServerLevel;
3029
import net.minecraft.world.entity.Entity;
31-
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
3230
import org.checkerframework.checker.nullness.qual.NonNull;
3331
import org.checkerframework.checker.nullness.qual.Nullable;
3432
import org.checkerframework.framework.qual.DefaultQualifier;
@@ -38,15 +36,13 @@
3836
import org.spongepowered.api.event.EventContextKeys;
3937
import org.spongepowered.api.event.cause.entity.SpawnType;
4038
import org.spongepowered.api.event.entity.SpawnEntityEvent;
41-
import org.spongepowered.api.util.Tuple;
4239
import org.spongepowered.common.bridge.CreatorTrackedBridge;
4340
import org.spongepowered.common.entity.PlayerTracker;
4441
import org.spongepowered.common.event.tracking.PhaseContext;
4542
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
4643
import org.spongepowered.common.event.tracking.context.transaction.block.ChangeBlock;
4744
import org.spongepowered.common.event.tracking.context.transaction.type.TransactionTypes;
4845
import org.spongepowered.common.util.PrettyPrinter;
49-
import org.spongepowered.math.vector.Vector3d;
5046

5147
import java.util.Optional;
5248
import java.util.StringJoiner;
@@ -57,43 +53,18 @@
5753
@DefaultQualifier(NonNull.class)
5854
public final class SpawnEntityTransaction extends WorldBasedTransaction<SpawnEntityEvent> {
5955

60-
final Supplier<ServerLevel> worldSupplier;
61-
@MonotonicNonNull CompoundTag entityTag;
6256
public final Entity entityToSpawn;
63-
final Vector3d originalPosition;
6457
final Supplier<SpawnType> deducedSpawnType;
6558

66-
public static final class DummySnapshot {
67-
final Vector3d originalPosition;
68-
final CompoundTag entityTag;
69-
final Supplier<ServerLevel> worldSupplier;
70-
71-
public DummySnapshot(final Vector3d originalPosition, final CompoundTag entityTag,
72-
final Supplier<ServerLevel> worldSupplier
73-
) {
74-
this.originalPosition = originalPosition;
75-
this.entityTag = entityTag;
76-
this.worldSupplier = worldSupplier;
77-
}
78-
}
79-
8059
public SpawnEntityTransaction(
8160
final Supplier<ServerLevel> worldSupplier, final Entity entityToSpawn,
8261
final Supplier<SpawnType> deducedSpawnType
8362
) {
8463
super(TransactionTypes.SPAWN_ENTITY.get(), ((org.spongepowered.api.world.server.ServerWorld) worldSupplier.get()).key());
85-
this.worldSupplier = worldSupplier;
8664
this.entityToSpawn = entityToSpawn;
87-
this.originalPosition = new Vector3d(entityToSpawn.getX(), entityToSpawn.getY(), entityToSpawn.getZ());
8865
this.deducedSpawnType = deducedSpawnType;
8966
}
9067

91-
@Override
92-
protected void captureState() {
93-
super.captureState();
94-
this.entityTag = this.entityToSpawn.saveWithoutId(new CompoundTag());
95-
}
96-
9768
@Override
9869
public Optional<BiConsumer<PhaseContext<@NonNull ?>, CauseStackManager.StackFrame>> getFrameMutator(
9970
final @Nullable GameTransaction<@NonNull ?> parent
@@ -131,14 +102,9 @@ public Optional<SpawnEntityEvent> generateEvent(
131102
final @Nullable GameTransaction<@NonNull ?> parent,
132103
final ImmutableList<GameTransaction<SpawnEntityEvent>> gameTransactions, final Cause currentCause
133104
) {
134-
final ImmutableList<Tuple<Entity, DummySnapshot>> collect = gameTransactions.stream()
135-
.map(transaction -> (SpawnEntityTransaction) transaction)
136-
.map(spawnRequest -> {
137-
return new Tuple<>(
138-
spawnRequest.entityToSpawn,
139-
new DummySnapshot(spawnRequest.originalPosition, spawnRequest.entityTag, spawnRequest.worldSupplier)
140-
);
141-
}).collect(ImmutableList.toImmutableList());
105+
final ImmutableList<Entity> collect = gameTransactions.stream()
106+
.map(transaction -> ((SpawnEntityTransaction) transaction).entityToSpawn)
107+
.collect(ImmutableList.toImmutableList());
142108
return Optional.of(context.createSpawnEvent(parent, collect, currentCause));
143109
}
144110

@@ -180,7 +146,6 @@ public String toString() {
180146
return new StringJoiner(", ", SpawnEntityTransaction.class.getSimpleName() + "[", "]")
181147
.add("worldKey=" + this.worldKey)
182148
.add("entityToSpawn=" + this.entityToSpawn)
183-
.add("originalPosition=" + this.originalPosition)
184149
.toString();
185150
}
186151
}

src/main/java/org/spongepowered/common/event/tracking/phase/general/ExplosionState.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,15 @@
3838
import org.spongepowered.api.event.EventContextKeys;
3939
import org.spongepowered.api.event.SpongeEventFactory;
4040
import org.spongepowered.api.event.entity.SpawnEntityEvent;
41-
import org.spongepowered.api.util.Tuple;
4241
import org.spongepowered.common.accessor.world.level.ExplosionAccessor;
4342
import org.spongepowered.common.bridge.CreatorTrackedBridge;
4443
import org.spongepowered.common.event.tracking.PhaseTracker;
4544
import org.spongepowered.common.event.tracking.TrackingUtil;
4645
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
4746
import org.spongepowered.common.event.tracking.context.transaction.block.ChangeBlock;
48-
import org.spongepowered.common.event.tracking.context.transaction.world.SpawnEntityTransaction;
4947

48+
import java.util.List;
5049
import java.util.function.BiConsumer;
51-
import java.util.stream.Collectors;
5250

5351
final class ExplosionState extends GeneralState<ExplosionContext> {
5452

@@ -102,14 +100,11 @@ public void unwind(final ExplosionContext context) {
102100
public SpawnEntityEvent createSpawnEvent(
103101
final ExplosionContext context,
104102
final @Nullable GameTransaction<@NonNull ?> parent,
105-
final ImmutableList<Tuple<Entity, SpawnEntityTransaction.DummySnapshot>> collect,
103+
final ImmutableList<Entity> collect,
106104
final Cause currentCause
107105
) {
108106
if (parent instanceof ChangeBlock) {
109-
return SpongeEventFactory.createDropItemEventDestruct(currentCause,
110-
collect.stream()
111-
.map(t -> (org.spongepowered.api.entity.Entity) t.first())
112-
.collect(Collectors.toList()));
107+
return SpongeEventFactory.createDropItemEventDestruct(currentCause, (List) collect);
113108
}
114109
return super.createSpawnEvent(context, parent, collect, currentCause);
115110
}

src/main/java/org/spongepowered/common/event/tracking/phase/packet/inventory/CloseWindowState.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,12 @@
3333
import org.spongepowered.api.event.cause.entity.SpawnType;
3434
import org.spongepowered.api.event.cause.entity.SpawnTypes;
3535
import org.spongepowered.api.event.entity.SpawnEntityEvent;
36-
import org.spongepowered.api.util.Tuple;
3736
import org.spongepowered.common.event.tracking.PhaseTracker;
3837
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
39-
import org.spongepowered.common.event.tracking.context.transaction.world.SpawnEntityTransaction;
4038
import org.spongepowered.common.event.tracking.phase.packet.PacketState;
4139

40+
import java.util.List;
4241
import java.util.function.Supplier;
43-
import java.util.stream.Collectors;
4442

4543
public final class CloseWindowState extends PacketState<CloseWindowContext> {
4644

@@ -56,11 +54,7 @@ public Supplier<SpawnType> getSpawnTypeForTransaction(final CloseWindowContext c
5654

5755
@Override
5856
public SpawnEntityEvent createSpawnEvent(final CloseWindowContext context, final @Nullable GameTransaction<@NonNull ?> parent,
59-
final ImmutableList<Tuple<Entity, SpawnEntityTransaction.DummySnapshot>> collect, final Cause currentCause) {
60-
return SpongeEventFactory.createDropItemEventClose(currentCause,
61-
collect.stream()
62-
.map(t -> (org.spongepowered.api.entity.Entity) t.first())
63-
.collect(Collectors.toList())
64-
);
57+
final ImmutableList<Entity> collect, final Cause currentCause) {
58+
return SpongeEventFactory.createDropItemEventClose(currentCause, (List) collect);
6559
}
6660
}

src/main/java/org/spongepowered/common/event/tracking/phase/packet/inventory/DropInventoryState.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,18 @@
2626

2727
import com.google.common.collect.ImmutableList;
2828
import org.checkerframework.checker.nullness.qual.NonNull;
29-
import org.spongepowered.api.entity.Entity;
3029
import org.spongepowered.api.event.Cause;
3130
import org.spongepowered.api.event.CauseStackManager;
3231
import org.spongepowered.api.event.EventContextKeys;
3332
import org.spongepowered.api.event.SpongeEventFactory;
3433
import org.spongepowered.api.event.entity.SpawnEntityEvent;
3534
import org.spongepowered.api.item.inventory.ItemStack;
3635
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
37-
import org.spongepowered.api.util.Tuple;
3836
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
39-
import org.spongepowered.common.event.tracking.context.transaction.world.SpawnEntityTransaction;
4037
import org.spongepowered.common.item.util.ItemStackUtil;
4138

39+
import java.util.List;
4240
import java.util.function.BiConsumer;
43-
import java.util.stream.Collectors;
4441

4542
public final class DropInventoryState extends BasicInventoryPacketState {
4643

@@ -58,13 +55,10 @@ public BiConsumer<CauseStackManager.StackFrame, InventoryPacketContext> getFrame
5855
@Override
5956
public SpawnEntityEvent createSpawnEvent(
6057
final InventoryPacketContext context, final GameTransaction<@NonNull ?> parent,
61-
final ImmutableList<Tuple<net.minecraft.world.entity.Entity, SpawnEntityTransaction.DummySnapshot>> collect,
58+
final ImmutableList<net.minecraft.world.entity.Entity> collect,
6259
final Cause currentCause
6360
) {
64-
return SpongeEventFactory.createDropItemEventDispense(currentCause, collect.stream()
65-
.map(Tuple::first).map(entity -> (Entity) entity)
66-
.collect(Collectors.toList())
67-
);
61+
return SpongeEventFactory.createDropItemEventDispense(currentCause, (List) collect);
6862
}
6963

7064
}

src/main/java/org/spongepowered/common/event/tracking/phase/packet/player/PacketCommandState.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,14 @@
3636
import org.spongepowered.api.event.SpongeEventFactory;
3737
import org.spongepowered.api.event.cause.entity.SpawnTypes;
3838
import org.spongepowered.api.event.entity.SpawnEntityEvent;
39-
import org.spongepowered.api.util.Tuple;
4039
import org.spongepowered.common.event.tracking.PhaseTracker;
4140
import org.spongepowered.common.event.tracking.TrackingUtil;
4241
import org.spongepowered.common.event.tracking.context.transaction.GameTransaction;
43-
import org.spongepowered.common.event.tracking.context.transaction.world.SpawnEntityTransaction;
4442
import org.spongepowered.common.event.tracking.phase.packet.PacketState;
4543
import org.spongepowered.common.world.BlockChange;
4644

45+
import java.util.List;
4746
import java.util.function.BiConsumer;
48-
import java.util.stream.Collectors;
4947

5048
public final class PacketCommandState extends PacketState<PlayerCommandPhaseContext> {
5149

@@ -85,18 +83,14 @@ public void postBlockTransactionApplication(
8583
@Override
8684
public SpawnEntityEvent createSpawnEvent(
8785
final PlayerCommandPhaseContext context, final GameTransaction<@NonNull ?> parent,
88-
final ImmutableList<Tuple<Entity, SpawnEntityTransaction.DummySnapshot>> collect, final Cause currentCause
86+
final ImmutableList<Entity> collect, final Cause currentCause
8987
) {
9088
final Cause newCauseWithSpawnType = Cause.builder().from(currentCause).build(
9189
EventContext.builder().from(currentCause.context()).add(
9290
EventContextKeys.SPAWN_TYPE,
9391
SpawnTypes.PLACEMENT.get()
9492
).build());
95-
return SpongeEventFactory.createSpawnEntityEvent(newCauseWithSpawnType,
96-
collect.stream()
97-
.map(t -> (org.spongepowered.api.entity.Entity) t.first())
98-
.collect(Collectors.toList())
99-
);
93+
return SpongeEventFactory.createSpawnEntityEvent(newCauseWithSpawnType, (List) collect);
10094
}
10195

10296

0 commit comments

Comments
 (0)