Skip to content

Commit 72755b7

Browse files
committed
Clean up and serialize player history
1 parent 54a7060 commit 72755b7

File tree

6 files changed

+77
-18
lines changed

6 files changed

+77
-18
lines changed

src/main/java/dev/compactmods/machines/core/ModBusEvents.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import dev.compactmods.machines.advancement.AdvancementTriggers;
55
import dev.compactmods.machines.compat.theoneprobe.TheOneProbeCompat;
66
import dev.compactmods.machines.network.NetworkHandler;
7+
import dev.compactmods.machines.rooms.capability.CapabilityRoomHistory;
78
import net.minecraftforge.eventbus.api.SubscribeEvent;
89
import net.minecraftforge.fml.ModList;
910
import net.minecraftforge.fml.common.Mod;
@@ -20,6 +21,9 @@ public static void setup(final FMLCommonSetupEvent event) {
2021

2122
CompactMachines.LOGGER.trace("Registering advancement triggers.");
2223
AdvancementTriggers.init();
24+
25+
CompactMachines.LOGGER.trace("Registering capabilities.");
26+
CapabilityRoomHistory.register();
2327
}
2428

2529
@SubscribeEvent

src/main/java/dev/compactmods/machines/rooms/capability/CMRoomHistory.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
import java.util.ArrayDeque;
44
import java.util.Deque;
5+
import java.util.Optional;
6+
import com.mojang.serialization.DataResult;
7+
import dev.compactmods.machines.data.codec.NbtListCollector;
58
import dev.compactmods.machines.rooms.history.IRoomHistoryItem;
9+
import dev.compactmods.machines.rooms.history.PlayerRoomHistoryItem;
10+
import net.minecraft.nbt.INBT;
11+
import net.minecraft.nbt.ListNBT;
12+
import net.minecraft.nbt.NBTDynamicOps;
613

7-
public class CMRoomHistory implements IRoomHistory{
14+
public class CMRoomHistory implements IRoomHistory {
815

916
private final Deque<IRoomHistoryItem> history;
1017

@@ -36,4 +43,25 @@ public IRoomHistoryItem pop() {
3643
public void addHistory(IRoomHistoryItem item) {
3744
history.add(item);
3845
}
46+
47+
@Override
48+
public ListNBT serializeNBT() {
49+
return history.stream()
50+
.map(hi -> PlayerRoomHistoryItem.CODEC.encodeStart(NBTDynamicOps.INSTANCE, hi))
51+
.map(DataResult::result)
52+
.filter(Optional::isPresent)
53+
.map(Optional::get)
54+
.map(x -> x)
55+
.collect(NbtListCollector.toNbtList());
56+
}
57+
58+
@Override
59+
public void deserializeNBT(ListNBT nbt) {
60+
nbt.stream()
61+
.map(it -> PlayerRoomHistoryItem.CODEC.parse(NBTDynamicOps.INSTANCE, it))
62+
.map(DataResult::result)
63+
.filter(Optional::isPresent)
64+
.map(Optional::get)
65+
.forEach(history::addLast);
66+
}
3967
}
Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package dev.compactmods.machines.rooms.capability;
22

33
import javax.annotation.Nullable;
4-
import net.minecraft.nbt.CompoundNBT;
54
import net.minecraft.nbt.INBT;
5+
import net.minecraft.nbt.ListNBT;
66
import net.minecraft.util.Direction;
77
import net.minecraftforge.common.capabilities.Capability;
88
import net.minecraftforge.common.capabilities.CapabilityInject;
@@ -13,20 +13,21 @@ public class CapabilityRoomHistory {
1313
@CapabilityInject(IRoomHistory.class)
1414
public static Capability<IRoomHistory> HISTORY_CAPABILITY = null;
1515

16-
public static void setup() {
17-
CapabilityManager.INSTANCE.register(
18-
IRoomHistory.class,
19-
new Capability.IStorage<IRoomHistory>() {
20-
@Nullable
21-
@Override
22-
public INBT writeNBT(Capability<IRoomHistory> capability, IRoomHistory instance, Direction side) {
23-
return new CompoundNBT();
24-
}
16+
public static class CapabilityRoomHistoryStorage implements Capability.IStorage<IRoomHistory> {
17+
@Nullable
18+
@Override
19+
public INBT writeNBT(Capability<IRoomHistory> capability, IRoomHistory instance, Direction side) {
20+
return instance.serializeNBT();
21+
}
2522

26-
@Override
27-
public void readNBT(Capability<IRoomHistory> capability, IRoomHistory instance, Direction side, INBT nbt) {
23+
@Override
24+
public void readNBT(Capability<IRoomHistory> capability, IRoomHistory instance, Direction side, INBT nbt) {
25+
if(nbt instanceof ListNBT)
26+
instance.deserializeNBT((ListNBT) nbt);
27+
}
28+
}
2829

29-
}
30-
}, CMRoomHistory::new);
30+
public static void register() {
31+
CapabilityManager.INSTANCE.register(IRoomHistory.class, new CapabilityRoomHistoryStorage(), CMRoomHistory::new);
3132
}
3233
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package dev.compactmods.machines.rooms.capability;
22

33
import dev.compactmods.machines.rooms.history.IRoomHistoryItem;
4+
import net.minecraft.nbt.ListNBT;
5+
import net.minecraftforge.common.util.INBTSerializable;
46

5-
public interface IRoomHistory {
7+
public interface IRoomHistory extends INBTSerializable<ListNBT> {
68

79
void clear();
810
boolean hasHistory();
911
IRoomHistoryItem peek();
1012
IRoomHistoryItem pop();
1113

1214
void addHistory(IRoomHistoryItem item);
13-
1415
}

src/main/java/dev/compactmods/machines/rooms/capability/PlayerRoomHistoryCapProvider.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import javax.annotation.Nonnull;
44
import javax.annotation.Nullable;
55
import net.minecraft.entity.player.PlayerEntity;
6+
import net.minecraft.nbt.CompoundNBT;
67
import net.minecraft.util.Direction;
78
import net.minecraftforge.common.capabilities.Capability;
89
import net.minecraftforge.common.capabilities.ICapabilityProvider;
10+
import net.minecraftforge.common.util.Constants;
11+
import net.minecraftforge.common.util.INBTSerializable;
912
import net.minecraftforge.common.util.LazyOptional;
1013

11-
public class PlayerRoomHistoryCapProvider implements ICapabilityProvider {
14+
public class PlayerRoomHistoryCapProvider implements ICapabilityProvider, INBTSerializable<CompoundNBT> {
1215

1316
private final PlayerEntity player;
1417
private final CMRoomHistory history;
@@ -28,4 +31,19 @@ public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable D
2831

2932
return LazyOptional.empty();
3033
}
34+
35+
@Override
36+
public CompoundNBT serializeNBT() {
37+
CompoundNBT nbt = new CompoundNBT();
38+
nbt.put("history", history.serializeNBT());
39+
return nbt;
40+
}
41+
42+
@Override
43+
public void deserializeNBT(CompoundNBT nbt) {
44+
if(nbt.contains("history")) {
45+
history.clear();
46+
history.deserializeNBT(nbt.getList("history", Constants.NBT.TAG_COMPOUND));
47+
}
48+
}
3149
}

src/main/java/dev/compactmods/machines/rooms/history/PlayerRoomHistoryItem.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package dev.compactmods.machines.rooms.history;
22

3+
import com.mojang.serialization.Codec;
4+
import com.mojang.serialization.codecs.RecordCodecBuilder;
35
import dev.compactmods.machines.teleportation.DimensionalPosition;
46

57
public class PlayerRoomHistoryItem implements IRoomHistoryItem {
68

79
private final DimensionalPosition entry;
810
private final int machine;
911

12+
public static final Codec<IRoomHistoryItem> CODEC = RecordCodecBuilder.create(i -> i.group(
13+
DimensionalPosition.CODEC.fieldOf("position").forGetter(IRoomHistoryItem::getEntryLocation),
14+
Codec.INT.fieldOf("machine").forGetter(IRoomHistoryItem::getMachine)
15+
).apply(i, PlayerRoomHistoryItem::new));
16+
1017
public PlayerRoomHistoryItem(DimensionalPosition entry, int machine) {
1118
this.entry = entry;
1219
this.machine = machine;

0 commit comments

Comments
 (0)