Skip to content

Commit 6338fae

Browse files
committed
Fix active field fields persistence
1 parent c4081f2 commit 6338fae

File tree

3 files changed

+96
-22
lines changed

3 files changed

+96
-22
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package dev.compactmods.crafting.command;
2+
3+
import com.mojang.brigadier.builder.ArgumentBuilder;
4+
import com.mojang.brigadier.context.CommandContext;
5+
import com.mojang.brigadier.exceptions.CommandSyntaxException;
6+
import dev.compactmods.crafting.CompactCrafting;
7+
import dev.compactmods.crafting.projector.FieldProjectorBlock;
8+
import dev.compactmods.crafting.projector.FieldProjectorEntity;
9+
import net.minecraft.commands.CommandSourceStack;
10+
import net.minecraft.commands.Commands;
11+
import net.minecraft.commands.arguments.coordinates.BlockPosArgument;
12+
import net.minecraft.core.BlockPos;
13+
import net.minecraft.network.chat.TextComponent;
14+
import net.minecraft.network.chat.TranslatableComponent;
15+
import net.minecraft.server.level.ServerLevel;
16+
17+
public class ProjectorInfoCommand {
18+
public static ArgumentBuilder<CommandSourceStack, ?> create() {
19+
20+
var fieldInfo = Commands.literal("fieldinfo");
21+
fieldInfo.then(Commands.argument("block", BlockPosArgument.blockPos())
22+
.executes(ProjectorInfoCommand::exe));
23+
24+
return fieldInfo;
25+
}
26+
27+
private static int exe(CommandContext<CommandSourceStack> ctx) throws CommandSyntaxException {
28+
final BlockPos pos = BlockPosArgument.getLoadedBlockPos(ctx, "block");
29+
final CommandSourceStack src = ctx.getSource();
30+
final ServerLevel level = src.getLevel();
31+
32+
if (level.getBlockState(pos).getBlock() instanceof FieldProjectorBlock fpb) {
33+
if (level.getBlockEntity(pos) instanceof FieldProjectorEntity proj) {
34+
proj.getField().ifPresent(field -> {
35+
src.sendSuccess(new TextComponent("Center: " + field.getCenter().toString()), false);
36+
src.sendSuccess(new TextComponent("Size: " + field.getFieldSize().getName()), false);
37+
field.getCurrentRecipe().ifPresent(rec -> {
38+
src.sendSuccess(new TextComponent("Recipe: " + rec.getRecipeIdentifier()), false);
39+
});
40+
});
41+
}
42+
} else {
43+
src.sendFailure(new TranslatableComponent("messages." + CompactCrafting.MOD_ID + ".not_a_projector", pos));
44+
}
45+
46+
return 0;
47+
}
48+
}
Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
11
package dev.compactmods.crafting.field.events;
22

3-
import javax.annotation.Nonnull;
4-
import javax.annotation.Nullable;
53
import dev.compactmods.crafting.CompactCrafting;
6-
import dev.compactmods.crafting.api.field.IActiveWorldFields;
7-
import dev.compactmods.crafting.core.CCCapabilities;
84
import dev.compactmods.crafting.field.ActiveWorldFields;
9-
import net.minecraft.core.Direction;
105
import net.minecraft.resources.ResourceLocation;
116
import net.minecraft.world.level.Level;
12-
import net.minecraftforge.common.capabilities.Capability;
13-
import net.minecraftforge.common.capabilities.ICapabilityProvider;
14-
import net.minecraftforge.common.util.LazyOptional;
157
import net.minecraftforge.event.AttachCapabilitiesEvent;
168
import net.minecraftforge.eventbus.api.SubscribeEvent;
179
import net.minecraftforge.fml.common.Mod;
@@ -24,21 +16,10 @@ public static void onCapWorldAttach(final AttachCapabilitiesEvent<Level> event)
2416
Level level = event.getObject();
2517

2618
ActiveWorldFields inst = new ActiveWorldFields(level);
19+
final LevelFieldsProvider provider = new LevelFieldsProvider(inst);
2720

28-
LazyOptional<ActiveWorldFields> opt = LazyOptional.of(() -> inst);
29-
final Capability<IActiveWorldFields> capInstance = CCCapabilities.FIELDS;
21+
event.addCapability(new ResourceLocation(CompactCrafting.MOD_ID, "fields"), provider);
3022

31-
event.addCapability(new ResourceLocation(CompactCrafting.MOD_ID, "world_fields"), new ICapabilityProvider() {
32-
@Nonnull
33-
@Override
34-
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
35-
if(capInstance == cap)
36-
return opt.cast();
37-
38-
return LazyOptional.empty();
39-
}
40-
});
41-
42-
event.addListener(opt::invalidate);
23+
event.addListener(provider::invalidate);
4324
}
4425
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package dev.compactmods.crafting.field.events;
2+
3+
import javax.annotation.Nonnull;
4+
import javax.annotation.Nullable;
5+
import dev.compactmods.crafting.api.field.IActiveWorldFields;
6+
import dev.compactmods.crafting.core.CCCapabilities;
7+
import net.minecraft.core.Direction;
8+
import net.minecraft.nbt.ListTag;
9+
import net.minecraftforge.common.capabilities.Capability;
10+
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
11+
import net.minecraftforge.common.util.INBTSerializable;
12+
import net.minecraftforge.common.util.LazyOptional;
13+
14+
class LevelFieldsProvider implements ICapabilitySerializable<ListTag> {
15+
16+
private final LazyOptional<IActiveWorldFields> inst;
17+
18+
LevelFieldsProvider(IActiveWorldFields inst) {
19+
this.inst = LazyOptional.of(() -> inst);
20+
}
21+
22+
@Nonnull
23+
@Override
24+
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
25+
26+
if (cap == CCCapabilities.FIELDS)
27+
return inst.cast();
28+
29+
return LazyOptional.empty();
30+
}
31+
32+
@Override
33+
public ListTag serializeNBT() {
34+
return inst.map(INBTSerializable::serializeNBT).orElse(new ListTag());
35+
}
36+
37+
@Override
38+
public void deserializeNBT(ListTag nbt) {
39+
inst.ifPresent(i -> i.deserializeNBT(nbt));
40+
}
41+
42+
public void invalidate() {
43+
inst.invalidate();
44+
}
45+
}

0 commit comments

Comments
 (0)