Skip to content

Commit

Permalink
remake wot data saving
Browse files Browse the repository at this point in the history
  • Loading branch information
IAFEnvoy committed Dec 31, 2024
1 parent 6e03845 commit 9f1d0cc
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 27 deletions.
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package com.iafenvoy.sow.item.block;

import com.iafenvoy.sow.SongsOfWar;
import com.iafenvoy.sow.item.block.entity.WallsOfTimeBlockEntity;
import com.iafenvoy.sow.util.BookUtils;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.block.BlockWithEntity;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.util.Identifier;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.NbtList;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;

public class WallsOfTimeBlock extends BlockWithEntity {
private static final Identifier FONT_ID = Identifier.of("minecraft", "alt");

public WallsOfTimeBlock(Settings settings) {
super(settings);
}
Expand All @@ -24,4 +31,16 @@ public BlockRenderType getRenderType(BlockState state) {
public @Nullable BlockEntity createBlockEntity(BlockPos pos, BlockState state) {
return new WallsOfTimeBlockEntity(pos, state);
}

@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
ItemStack stack = player.getStackInHand(hand);
if (stack.isOf(Items.WRITTEN_BOOK)) {
NbtList nbtList = stack.getOrCreateNbt().getList("pages", 8);
if (nbtList != null) {
SongsOfWar.LOGGER.info(BookUtils.nbtToString(nbtList));
}
}
return super.onUse(state, world, pos, player, hand, hit);
}
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,18 @@
package com.iafenvoy.sow.item.block.entity;

import com.iafenvoy.sow.SongsOfWar;
import com.iafenvoy.sow.registry.SowBlockEntities;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.text.MutableText;
import net.minecraft.text.Style;
import net.minecraft.util.Util;
import net.minecraft.nbt.NbtOps;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WallsOfTimeBlockEntity extends BlockEntity {
private static final List<Direction> HORIZONTAL = Arrays.stream(Direction.values()).filter(x -> x.getHorizontal() >= 0).toList();
private final Map<Direction, String> texts = Util.make(new HashMap<>(), map -> {
for (Direction dir : HORIZONTAL)
map.put(dir, "");
});
private WotContents contents = WotContents.EMPTY;

public WallsOfTimeBlockEntity(BlockPos pos, BlockState state) {
super(SowBlockEntities.WALLS_OF_TIME.get(), pos, state);
Expand All @@ -29,18 +21,89 @@ public WallsOfTimeBlockEntity(BlockPos pos, BlockState state) {
@Override
public void readNbt(NbtCompound nbt) {
super.readNbt(nbt);
for (Direction dir : HORIZONTAL)
this.texts.put(dir, nbt.getString(dir.getName()));
this.contents = WotContents.CODEC.parse(NbtOps.INSTANCE, nbt.get("content")).resultOrPartial(SongsOfWar.LOGGER::error).orElse(WotContents.EMPTY);
}

@Override
protected void writeNbt(NbtCompound nbt) {
super.writeNbt(nbt);
for (Direction dir : HORIZONTAL)
nbt.putString(dir.getName(), this.texts.get(dir));
nbt.put("content", WotContents.CODEC.encodeStart(NbtOps.INSTANCE, this.contents).resultOrPartial(SongsOfWar.LOGGER::error).orElse(new NbtCompound()));
}

public WotContents getContents() {
return this.contents;
}

public String getDisplayText(Direction dir) {
return this.texts.getOrDefault(dir, "");
public static final class WotContents {
public static final WotContents EMPTY = new WotContents(Direction.UP, "", 0, 0, 0, 0);
public static final Codec<WotContents> CODEC = RecordCodecBuilder.create(i -> i.group(
Direction.CODEC.optionalFieldOf("direction", EMPTY.direction).forGetter(WotContents::getDirection),
Codec.STRING.optionalFieldOf("content", EMPTY.content).forGetter(WotContents::getContent),
Codec.INT.optionalFieldOf("offsetX", EMPTY.offsetX).forGetter(WotContents::getOffsetX),
Codec.INT.optionalFieldOf("offsetY", EMPTY.offsetY).forGetter(WotContents::getOffsetY),
Codec.INT.optionalFieldOf("sizeX", EMPTY.sizeX).forGetter(WotContents::getSizeX),
Codec.INT.optionalFieldOf("sizeY", EMPTY.sizeY).forGetter(WotContents::getSizeY)
).apply(i, WotContents::new));
private Direction direction;
private String content;
private int offsetX;
private int offsetY;
private int sizeX;
private int sizeY;

public WotContents(Direction direction, String content, int offsetX, int offsetY, int sizeX, int sizeY) {
this.direction = direction;
this.content = content;
this.offsetX = offsetX;
this.offsetY = offsetY;
this.sizeX = sizeX;
this.sizeY = sizeY;
}

public Direction getDirection() {
return this.direction;
}

public String getContent() {
return this.content;
}

public int getOffsetX() {
return this.offsetX;
}

public int getOffsetY() {
return this.offsetY;
}

public int getSizeX() {
return this.sizeX;
}

public int getSizeY() {
return this.sizeY;
}

public WotContents withDirection(Direction direction) {
this.direction = direction;
return this;
}

public WotContents withContent(String content) {
this.content = content;
return this;
}

public WotContents withOffset(int x, int y) {
this.offsetX = x;
this.offsetY = y;
return this;
}

public WotContents withSize(int x, int y) {
this.sizeX = x;
this.sizeY = y;
return this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@
import java.util.Map;

public class PowerMergeHelper {
private static final Map<PlayerEntity, MergeData> data = new HashMap<>();
private static final Map<PlayerEntity, MergeData> DATA = new HashMap<>();

public static void run(SongPowerData songPowerData, PlayerEntity player, ServerWorld serverWorld) {
if (!data.containsKey(player)) data.put(player, new MergeData());
MergeData mergeData = data.get(player);
if (!DATA.containsKey(player)) DATA.put(player, new MergeData());
MergeData mergeData = DATA.get(player);
if (player.isSneaking()) {
Direction[] dirs = Direction.getEntityFacingOrder(player);
if (dirs[0].getAxis() != Direction.Axis.Y) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ public void render(WallsOfTimeBlockEntity entity, float tickDelta, MatrixStack m
private void renderSingle(String string, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) {
List<OrderedText> texts = this.textRenderer.wrapLines(Text.literal(string).fillStyle(STYLE), 32);
for (int i = 0; i < texts.size(); i++)
this.textRenderer.draw(texts.get(i), 0, i * 8, 0x777777, false, matrices.peek().getPositionMatrix(), vertexConsumers, TextRenderer.TextLayerType.NORMAL, 0, light);
this.textRenderer.draw(texts.get(i), 2, 2 + i * 10, 0x777777, false, matrices.peek().getPositionMatrix(), vertexConsumers, TextRenderer.TextLayerType.NORMAL, 0, light);
}
}
19 changes: 19 additions & 0 deletions common/src/main/java/com/iafenvoy/sow/util/BookUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.iafenvoy.sow.util;

import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;

public class BookUtils {
public static String nbtToString(NbtList nbtList) {
return nbtList.stream()
.map(NbtElement::asString)
.map(JsonParser::parseString)
.map(JsonElement::getAsJsonObject)
.map(x -> x.get("text"))
.map(JsonElement::getAsString)
.reduce(new StringBuilder(), StringBuilder::append, (a, b) -> a.append(b.toString()))
.toString();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "sow:block/walls_of_time"
"all": "minecraft:block/stone"
}
}
Binary file not shown.

0 comments on commit 9f1d0cc

Please sign in to comment.