Skip to content

Commit 80f1287

Browse files
committed
fix end automata turtle cannot warp to unloaded chunk
close IntelligenceModding/Advanced-Peripherals-Features#110
1 parent 4ec486f commit 80f1287

4 files changed

Lines changed: 85 additions & 90 deletions

File tree

src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/owner/TurtlePeripheralOwner.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,24 @@
66
import dan200.computercraft.api.turtle.ITurtleAccess;
77
import dan200.computercraft.api.turtle.TurtleSide;
88
import dan200.computercraft.shared.util.InventoryUtil;
9+
import de.srendi.advancedperipherals.common.setup.APDataComponents;
910
import de.srendi.advancedperipherals.common.util.fakeplayer.APFakePlayer;
1011
import de.srendi.advancedperipherals.common.util.fakeplayer.FakePlayerProviderTurtle;
1112
import de.srendi.advancedperipherals.lib.peripherals.IBasePeripheral;
1213
import net.minecraft.core.BlockPos;
1314
import net.minecraft.core.Direction;
1415
import net.minecraft.core.FrontAndTop;
1516
import net.minecraft.core.component.DataComponentPatch;
17+
import net.minecraft.core.component.PatchedDataComponentMap;
1618
import net.minecraft.world.entity.Entity;
1719
import net.minecraft.world.entity.player.Player;
1820
import net.minecraft.world.item.ItemStack;
1921
import net.minecraft.world.level.Level;
2022
import org.jetbrains.annotations.NotNull;
2123
import org.jetbrains.annotations.Nullable;
2224

25+
import java.util.UUID;
26+
2327
public class TurtlePeripheralOwner extends BasePeripheralOwner {
2428
private final ITurtleAccess turtle;
2529
private final TurtleSide side;
@@ -83,6 +87,17 @@ public void putDataStorage(DataComponentPatch dataStorage) {
8387
turtle.setUpgradeData(side, dataStorage);
8488
}
8589

90+
public UUID getChunkLoadUUID() {
91+
PatchedDataComponentMap patchMap = this.getPatchedDataStorage();
92+
UUID id = patchMap.get(APDataComponents.CHUNKY_ID.get());
93+
if (id == null) {
94+
id = UUID.randomUUID();
95+
patchMap.set(APDataComponents.CHUNKY_ID.get(), id);
96+
this.putDataStorage(patchMap.asPatch());
97+
}
98+
return id;
99+
}
100+
86101
@Override
87102
public <T> T withPlayer(APFakePlayer.Action<T> function) throws LuaException {
88103
return FakePlayerProviderTurtle.withPlayer(turtle, function);
@@ -106,9 +121,8 @@ public void destroyUpgrade() {
106121
@Override
107122
public boolean isMovementPossible(@NotNull Level level, @NotNull BlockPos pos) {
108123
try {
109-
return FakePlayerProviderTurtle.withPlayer(turtle, player -> {
124+
return this.withPlayer(player -> {
110125
if (!level.isInWorldBounds(pos)) return false;
111-
if (!level.hasChunkAt(pos)) return false;
112126
return level.getWorldBorder().isWithinBounds(pos);
113127
});
114128
} catch (LuaException e) {

src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChunkyPeripheral.java

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,13 @@
66
import dan200.computercraft.api.turtle.TurtleSide;
77
import de.srendi.advancedperipherals.common.addons.computercraft.owner.TurtlePeripheralOwner;
88
import de.srendi.advancedperipherals.common.configuration.APConfig;
9-
import de.srendi.advancedperipherals.common.setup.APDataComponents;
109
import de.srendi.advancedperipherals.common.util.ChunkManager;
1110
import de.srendi.advancedperipherals.lib.peripherals.BasePeripheral;
12-
import net.minecraft.core.component.PatchedDataComponentMap;
1311
import net.minecraft.server.level.ServerLevel;
1412
import net.minecraft.world.level.ChunkPos;
1513
import org.jetbrains.annotations.NotNull;
1614
import org.jetbrains.annotations.Nullable;
1715

18-
import java.util.UUID;
19-
2016
public class ChunkyPeripheral extends BasePeripheral<TurtlePeripheralOwner> {
2117

2218
public static final String PERIPHERAL_TYPE = "chunky";
@@ -26,17 +22,6 @@ public ChunkyPeripheral(ITurtleAccess turtle, TurtleSide side) {
2622
super(PERIPHERAL_TYPE, new TurtlePeripheralOwner(turtle, side));
2723
}
2824

29-
protected UUID getUUID() {
30-
PatchedDataComponentMap patchMap = owner.getPatchedDataStorage();
31-
UUID id = patchMap.get(APDataComponents.CHUNKY_ID.get());
32-
if (id == null) {
33-
id = UUID.randomUUID();
34-
patchMap.set(APDataComponents.CHUNKY_ID.get(), id);
35-
owner.putDataStorage(patchMap.asPatch());
36-
}
37-
return id;
38-
}
39-
4025
public ChunkPos getChunkPos() {
4126
return new ChunkPos(getPos());
4227
}
@@ -58,22 +43,22 @@ public void update() {
5843
ChunkManager manager = ChunkManager.get(level.getServer());
5944
ChunkPos currentChunk = getChunkPos();
6045
setLoadedChunk(currentChunk, manager, level);
61-
manager.touch(getUUID());
46+
manager.touch(owner.getChunkLoadUUID());
6247
}
6348

6449
protected void setLoadedChunk(@Nullable ChunkPos newChunk, ChunkManager manager, ServerLevel level) {
6550
if (loadedCentralChunk != null) {
6651
if (loadedCentralChunk.equals(newChunk)) {
6752
return;
6853
}
69-
manager.removeForceChunk(level, getUUID());
54+
manager.removeForceChunk(level, owner.getChunkLoadUUID());
7055
// Should not be used
7156
// level.setChunkForced(loadedChunk.x, loadedChunk.z, false);
7257
loadedCentralChunk = null;
7358
}
7459
if (newChunk != null) {
7560
loadedCentralChunk = newChunk;
76-
manager.addForceChunk(level, getUUID(), loadedCentralChunk);
61+
manager.addForceChunk(level, owner.getChunkLoadUUID(), loadedCentralChunk);
7762
// Should not be used
7863
// level.setChunkForced(newChunk.x, newChunk.z, true);
7964
}

src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/plugins/AutomataWarpingPlugin.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import de.srendi.advancedperipherals.common.configuration.APConfig;
1414
import de.srendi.advancedperipherals.common.entity.TurtleEnderPearl;
1515
import de.srendi.advancedperipherals.common.setup.APDataComponents;
16+
import de.srendi.advancedperipherals.common.util.ChunkManager;
1617
import de.srendi.advancedperipherals.common.util.LuaConverter;
1718
import de.srendi.advancedperipherals.common.util.Pair;
1819
import de.srendi.advancedperipherals.common.util.ServerWorker;
@@ -23,6 +24,9 @@
2324
import net.minecraft.core.GlobalPos;
2425
import net.minecraft.core.component.PatchedDataComponentMap;
2526
import net.minecraft.resources.ResourceKey;
27+
import net.minecraft.server.MinecraftServer;
28+
import net.minecraft.server.level.ServerLevel;
29+
import net.minecraft.world.level.ChunkPos;
2630
import net.minecraft.world.level.Level;
2731
import org.jetbrains.annotations.NotNull;
2832
import org.jetbrains.annotations.Unmodifiable;
@@ -113,7 +117,7 @@ public final MethodResult deletePoint(String name) {
113117
}
114118

115119
@LuaFunction(mainThread = true)
116-
public final Collection<String> points() {
120+
public final Collection<String> listPoints() {
117121
Map<String, GlobalPos> data = getPointDatas();
118122
return data.keySet();
119123
}
@@ -127,11 +131,12 @@ public final MethodResult warpToPoint(String name) throws LuaException {
127131

128132
TurtlePeripheralOwner owner = automataCore.getPeripheralOwner();
129133
GlobalPos globalPos = pairData.right();
130-
Level newLevel = owner.getLevel().getServer().getLevel(globalPos.dimension());
134+
MinecraftServer server = owner.getLevel().getServer();
135+
ServerLevel newLevel = server.getLevel(globalPos.dimension());
131136
BlockPos newPosition = globalPos.pos();
132137

133138
return automataCore.withOperation(WARP, getWarpContext(globalPos.dimension(), newPosition), context -> {
134-
// TODO: load destination
139+
ChunkManager.get(server).addForceChunk(newLevel, owner.getChunkLoadUUID(), new ChunkPos(newPosition));
135140
boolean result = owner.move(newLevel, newPosition);
136141
if (!result) {
137142
return MethodResult.of(null, "Cannot teleport to location");

0 commit comments

Comments
 (0)