Skip to content

Commit d061a0b

Browse files
committed
fix: Defer fake player creation to avoid world load freeze
1 parent ef97d54 commit d061a0b

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

enderio-machines/src/main/java/com/enderio/machines/common/blocks/obelisks/attractor/AttractorObeliskBlockEntity.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
import com.enderio.machines.common.init.MachineBlockEntities;
1515
import com.enderio.machines.common.obelisk.ObeliskAreaManager;
1616
import com.mojang.authlib.GameProfile;
17-
import java.util.List;
18-
import java.util.UUID;
17+
import me.liliandev.ensure.ensures.EnsureSide;
1918
import net.minecraft.core.BlockPos;
2019
import net.minecraft.server.level.ServerLevel;
2120
import net.minecraft.world.entity.LivingEntity;
@@ -39,6 +38,8 @@
3938
import net.neoforged.neoforge.common.util.FakePlayer;
4039
import org.jetbrains.annotations.Nullable;
4140

41+
import java.util.List;
42+
4243
public class AttractorObeliskBlockEntity extends ObeliskBlockEntity<AttractorObeliskBlockEntity> {
4344

4445
private static final QuadraticScalable ENERGY_CAPACITY = new QuadraticScalable(CapacitorModifier.ENERGY_CAPACITY,
@@ -51,6 +52,7 @@ public class AttractorObeliskBlockEntity extends ObeliskBlockEntity<AttractorObe
5152
private final Vec3 targetPos;
5253

5354
@UseOnly(LogicalSide.SERVER)
55+
@Nullable
5456
private FakePlayer fakePlayer;
5557

5658
public AttractorObeliskBlockEntity(BlockPos worldPosition, BlockState blockState) {
@@ -59,6 +61,20 @@ public AttractorObeliskBlockEntity(BlockPos worldPosition, BlockState blockState
5961
targetPos = new Vec3(worldPosition.getX() + 0.5, worldPosition.getY() + 0.5, worldPosition.getZ() + 0.5);
6062
}
6163

64+
@EnsureSide(EnsureSide.Side.SERVER)
65+
private FakePlayer getFakePlayer() {
66+
if (!(level instanceof ServerLevel serverLevel)) {
67+
throw new IllegalStateException("Level is null");
68+
}
69+
70+
if (fakePlayer == null) {
71+
fakePlayer = new FakePlayer(serverLevel, new GameProfile(getMachineOwnerOrRandom(), "enderio:attractor:" + worldPosition));
72+
fakePlayer.setPos(targetPos.x, targetPos.y, targetPos.z);
73+
}
74+
75+
return fakePlayer;
76+
}
77+
6278
@Override
6379
protected @Nullable ObeliskAreaManager<AttractorObeliskBlockEntity> getAreaManager(ServerLevel level) {
6480
return null;
@@ -92,10 +108,6 @@ public String getColor() {
92108
@Override
93109
public void setLevel(Level level) {
94110
super.setLevel(level);
95-
if (level instanceof ServerLevel sl) {
96-
fakePlayer = new FakePlayer(sl, new GameProfile(getMachineOwnerOrRandom(), "enderio:attractor:" + worldPosition));
97-
fakePlayer.setPos(targetPos.x, targetPos.y, targetPos.z);
98-
}
99111
}
100112

101113
@Override
@@ -144,7 +156,7 @@ private boolean useTarget(Mob mob) {
144156

145157
private void setTarget(Mob mob) {
146158
assert level != null;
147-
mob.setTarget(fakePlayer);
159+
mob.setTarget(getFakePlayer());
148160
}
149161

150162
private void attractMob(Mob mob) {
@@ -168,8 +180,12 @@ private void directPull(LivingEntity mob, float speed) {
168180
@Override
169181
public void setRemoved() {
170182
super.setRemoved();
171-
if (!level.isClientSide) {
172-
fakePlayer.discard();
183+
184+
if (level != null && !level.isClientSide) {
185+
if (fakePlayer != null) {
186+
fakePlayer.discard();
187+
fakePlayer = null;
188+
}
173189
}
174190
}
175191
}

0 commit comments

Comments
 (0)