Skip to content

Commit

Permalink
completed kyoyu placement meta saving
Browse files Browse the repository at this point in the history
  • Loading branch information
topi-banana committed Dec 5, 2024
1 parent d600b0d commit 33fce54
Show file tree
Hide file tree
Showing 12 changed files with 192 additions and 38 deletions.
53 changes: 53 additions & 0 deletions src/main/java/com/vulpeus/kyoyu/Kyoyu.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,20 @@
package com.vulpeus.kyoyu;

import com.vulpeus.kyoyu.placement.KyoyuPlacement;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

public class Kyoyu {
public static final String MOD_ID = "kyoyu";
Expand Down Expand Up @@ -53,4 +65,45 @@ private String serverVersion() {
return serverVersion;
}
}

private static final Path configsDir = Paths.get("kyoyu");

private static KyoyuPlacement readPlacement(Path configPath) {
try {
String json = new String(Files.readAllBytes(configPath), StandardCharsets.UTF_8);
return KyoyuPlacement.fromJson(json);
} catch (IOException e) {
LOGGER.error("Kyoyu.readPlacement: read KyoyuPlacement from {}", configPath);
LOGGER.error(e);
}
return null;
}

public static KyoyuPlacement findPlacement(UUID uuid) {

if (uuid == null) return null;

Path configPath = configsDir.resolve(uuid.toString() + ".json");
if (!configPath.toFile().exists()) return null;

return readPlacement(configPath);
}

public static List<KyoyuPlacement> getAllPlacement() {
File[] files = configsDir.toFile().listFiles();
if (files != null) {
return Arrays.stream(files).map(file -> readPlacement(file.toPath())).collect(Collectors.toList());
}
return null;
}

public static void savePlacement(KyoyuPlacement kyoyuPlacement) {
Path configPath = configsDir.resolve(kyoyuPlacement.getUuid().toString() + ".json");
try {
Files.write(configPath, Collections.singletonList(kyoyuPlacement.toJson()), StandardCharsets.UTF_8);
} catch (IOException e) {
LOGGER.error("Kyoyu.savePlacement: save KyoyuPlacement from {}", kyoyuPlacement.getUuid());
LOGGER.error(e);
}
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/vulpeus/kyoyu/client/ISchematicPlacement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.vulpeus.kyoyu.client;

import java.util.UUID;

public interface ISchematicPlacement {

void kyoyu$setKyoyuId(UUID uuid);

UUID kyoyu$getKyoyuId();

}
38 changes: 38 additions & 0 deletions src/main/java/com/vulpeus/kyoyu/client/LitematicHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.vulpeus.kyoyu.client;

//? if client {
import com.vulpeus.kyoyu.placement.KyoyuPlacement;
import com.vulpeus.kyoyu.placement.KyoyuRegion;
import fi.dy.masa.litematica.data.DataManager;
import fi.dy.masa.litematica.schematic.placement.SchematicPlacement;

public class LitematicHelper {

public static void newSchematicPlacementFromKyoyuPlacement(SchematicPlacement schematicPlacement, KyoyuPlacement kyoyuPlacement) {

changeSchematicPlacementFromKyoyuPlacement(schematicPlacement, kyoyuPlacement);
DataManager.getSchematicPlacementManager().addSchematicPlacement(schematicPlacement, true);
((ISchematicPlacement) schematicPlacement).kyoyu$setKyoyuId(kyoyuPlacement.getUuid());

}

public static void changeSchematicPlacementFromKyoyuPlacement(SchematicPlacement schematicPlacement, KyoyuPlacement kyoyuPlacement) {

if (schematicPlacement.isLocked()) {
schematicPlacement.toggleLocked();
}

schematicPlacement.setMirror(kyoyuPlacement.getRegion().getMirror(), null);
schematicPlacement.setRotation(kyoyuPlacement.getRegion().getRotation(), null);
for (KyoyuRegion subRegion: kyoyuPlacement.getSubRegions()) {
String subRegionName = subRegion.getName();

schematicPlacement.moveSubRegionTo(subRegionName, subRegion.getPos(), null);
schematicPlacement.setSubRegionMirror(subRegionName, subRegion.getMirror(), null);
schematicPlacement.setSubRegionRotation(subRegionName, subRegion.getRotation(), null);
}
schematicPlacement.toggleLocked();

}
}
//?}
2 changes: 1 addition & 1 deletion src/main/java/com/vulpeus/kyoyu/client/NetworkHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

public class NetworkHelper {
public static void openExplorer(List<KyoyuPlacement> kyoyuPlacementList){
if (Kyoyu.isClient() && Kyoyu.getClient().isPresent() && GuiUtils.getCurrentScreen() instanceof GuiBase) {
if (Kyoyu.isClient() && Kyoyu.getClient() != null && GuiUtils.getCurrentScreen() instanceof GuiBase) {
GuiBase currentGui = (GuiBase) GuiUtils.getCurrentScreen();
GuiBase.openGui(new Explorer_GuiList(currentGui.getParent(), kyoyuPlacementList));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

//? if client {
import com.vulpeus.kyoyu.Kyoyu;
import com.vulpeus.kyoyu.client.LitematicHelper;
import com.vulpeus.kyoyu.placement.KyoyuPlacement;
import com.vulpeus.kyoyu.placement.KyoyuRegion;
import fi.dy.masa.litematica.data.DataManager;
import fi.dy.masa.litematica.data.SchematicHolder;
import fi.dy.masa.litematica.gui.GuiMaterialList;
Expand All @@ -18,9 +18,6 @@
import fi.dy.masa.malilib.render.RenderUtils;
import fi.dy.masa.malilib.util.GuiUtils;
import fi.dy.masa.malilib.util.StringUtils;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.Rotation;

//? if >=1.20 {
import net.minecraft.client.gui.GuiGraphics;
Expand Down Expand Up @@ -162,32 +159,18 @@ void onAction(Explorer_WidgetListEntry entry) {
LOAD() {
@Override
void onAction(Explorer_WidgetListEntry entry) {
String name = entry.kyoyuPlacement.getName();
BlockPos pos = entry.kyoyuPlacement.getRegion().getPos();
Mirror mirror = entry.kyoyuPlacement.getRegion().getMirror();
Rotation rotation = entry.kyoyuPlacement.getRegion().getRotation();

LitematicaSchematic schematic = SchematicHolder.getInstance().getOrLoad(entry.kyoyuPlacement.getFile());
SchematicPlacement placement = SchematicPlacement.createFor(schematic, pos, name, true, true);

if (placement.isLocked()) {
placement.toggleLocked();
}
SchematicPlacement placement = SchematicPlacement.createFor(
SchematicHolder.getInstance().getOrLoad(entry.kyoyuPlacement.getFile()),
entry.kyoyuPlacement.getRegion().getPos(),
entry.kyoyuPlacement.getName(),
true,
true
);
LitematicHelper.newSchematicPlacementFromKyoyuPlacement(placement, entry.kyoyuPlacement);

placement.setMirror(mirror, null);
placement.setRotation(rotation, null);
for (KyoyuRegion subRegion: entry.kyoyuPlacement.getSubRegions()) {
String subRegionName = subRegion.getName();
Kyoyu.savePlacement(entry.kyoyuPlacement);

placement.moveSubRegionTo(subRegionName, subRegion.getPos(), null);
placement.setSubRegionMirror(subRegionName, subRegion.getMirror(), null);
placement.setSubRegionRotation(subRegionName, subRegion.getRotation(), null);
}
placement.toggleLocked();

DataManager.getSchematicPlacementManager().addSchematicPlacement(placement, true);
// TODO
// getClient().add(entry.kyoyuPlacement, placement);
}
},
DOWNLOAD() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

//? if client {
import com.vulpeus.kyoyu.Kyoyu;
import com.vulpeus.kyoyu.client.ISchematicPlacement;
import com.vulpeus.kyoyu.net.KyoyuPacketManager;
import com.vulpeus.kyoyu.net.packets.PlacementMetaPacket;
import com.vulpeus.kyoyu.placement.KyoyuPlacement;
Expand Down Expand Up @@ -34,9 +35,6 @@ public void actionPerformedWithButton(ButtonBase buttonBase, int i) {

buttonBase.setEnabled(false);

// TODO
// `schematicPlacement` add to client registry

File placementFile = schematicPlacement.getSchematicFile();
if (placementFile == null) {
// TODO: in memory placement
Expand Down Expand Up @@ -68,6 +66,9 @@ public void actionPerformedWithButton(ButtonBase buttonBase, int i) {
placementFile
);

Kyoyu.savePlacement(kyoyuPlacement);
((ISchematicPlacement) schematicPlacement).kyoyu$setKyoyuId(kyoyuPlacement.getUuid());

PlacementMetaPacket placementMetaPacket = new PlacementMetaPacket(kyoyuPlacement);
KyoyuPacketManager.sendC2S(placementMetaPacket);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public void initGui(CallbackInfo ci) {
int y = this.height - 26;

ButtonGeneric button = new ButtonGeneric(x, y, width, 20, text);
button.setEnabled(Kyoyu.getClient().isPresent());
button.setEnabled(Kyoyu.getClient() != null);
addButton(button, new LoadExplorer_ButtonActionListener(this));
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,70 @@
package com.vulpeus.kyoyu.client.mixins.litematica;

//? if client {
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.vulpeus.kyoyu.Kyoyu;
import com.vulpeus.kyoyu.client.ISchematicPlacement;
import com.vulpeus.kyoyu.client.LitematicHelper;
import com.vulpeus.kyoyu.placement.KyoyuPlacement;
import fi.dy.masa.litematica.schematic.placement.SchematicPlacement;
import fi.dy.masa.litematica.schematic.placement.SchematicPlacementManager;
import fi.dy.masa.malilib.util.JsonUtils;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.util.UUID;

@Mixin(SchematicPlacement.class)
public class SchematicPlacementMixin {
public class SchematicPlacementMixin implements ISchematicPlacement {

@Unique
private UUID kyoyu_id;

@Override
public void kyoyu$setKyoyuId(UUID uuid) {
kyoyu_id = uuid;
}

@Override
public UUID kyoyu$getKyoyuId() {
return kyoyu_id;
}

@Inject(method = "onModified(Lfi/dy/masa/litematica/schematic/placement/SchematicPlacementManager;)V", at = @At("HEAD"), remap = false)
public void onModified(SchematicPlacementManager manager, CallbackInfo ci) {
// TODO
// attention when connecting server is compatible
// if (getClient() != null)
}

@Inject(method = "toJson", at = @At("RETURN"), remap = false)
public void saveToJson(CallbackInfoReturnable<JsonObject> cir) {
JsonObject saveData = cir.getReturnValue();
if (saveData != null) {
saveData.add("kyoyu_id", new JsonPrimitive(kyoyu_id.toString()));
}
}

@Inject(method = "fromJson", at = @At("RETURN"), remap = false, cancellable = true)
private static void loadFromJson(JsonObject obj, CallbackInfoReturnable<SchematicPlacement> cir) {
if (JsonUtils.hasString(obj, "kyoyu_id")) {
SchematicPlacement self = cir.getReturnValue();
if (self != null) {
UUID uuid = UUID.fromString(obj.get("kyoyu_id").getAsString());
((ISchematicPlacement) self).kyoyu$setKyoyuId(uuid);
cir.setReturnValue(null);

KyoyuPlacement kyoyuPlacement = Kyoyu.findPlacement(uuid);
if (kyoyuPlacement != null) {
LitematicHelper.newSchematicPlacementFromKyoyuPlacement(self, kyoyuPlacement);
}
}
}
}
}
//?}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

//? if client {
import com.vulpeus.kyoyu.Kyoyu;
import com.vulpeus.kyoyu.client.ISchematicPlacement;
import com.vulpeus.kyoyu.client.gui.Shere_ButtonActionListener;
import fi.dy.masa.litematica.gui.widgets.WidgetListSchematicPlacements;
import fi.dy.masa.litematica.gui.widgets.WidgetSchematicPlacement;
Expand Down Expand Up @@ -34,7 +35,7 @@ protected WidgetSchematicPlacementMixin(int x, int y, int width, int height, @Nu
public void init(int x, int y, int width, int height, boolean isOdd, SchematicPlacement placement, int listIndex, WidgetListSchematicPlacements parent, CallbackInfo ci) {

ButtonGeneric shareButton = new ButtonGeneric(buttonsStartX, y + 1, -1, true, "kyoyu.gui.button.share_litematic");
shareButton.setEnabled(Kyoyu.getClient().isPresent());
shareButton.setEnabled(Kyoyu.findPlacement(((ISchematicPlacement) placement).kyoyu$getKyoyuId())==null);
addButton(shareButton, new Shere_ButtonActionListener(placement));
buttonsStartX = shareButton.getX() - 1;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import net.minecraft.server.level.ServerPlayer;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class LoadExplorerPacket extends IKyoyuPacket {
Expand Down Expand Up @@ -42,8 +41,7 @@ public byte[] encode() {
@Override
public void onServer(ServerPlayer player) {

// TODO: Get Kyoyu Placements
List<KyoyuPlacement> list = new ArrayList<>();
List<KyoyuPlacement> list = Kyoyu.getAllPlacement();

LoadExplorerPacket loadExplorerPacket = new LoadExplorerPacket(list);
KyoyuPacketManager.sendS2C(loadExplorerPacket, player);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,15 @@ public byte[] encode() {
@Override
public void onServer(ServerPlayer player) {
Kyoyu.LOGGER.info("New placement by {}", player.getName());
// TODO: new or modify
KyoyuPlacement preKyoyuPlacement = Kyoyu.findPlacement(kyoyuPlacement.getUuid());
if (preKyoyuPlacement == null) {
Kyoyu.savePlacement(kyoyuPlacement);
// TODO: New
// if i don't have file, request file download.
} else {
// TODO: Modify
// check diff and update `updater` field
}
}

@Override
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/vulpeus/kyoyu/placement/KyoyuPlacement.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import java.lang.reflect.Type;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

public class KyoyuPlacement {

private final UUID uuid;
private final KyoyuRegion region;
private final List<KyoyuRegion> subRegions;
private final String ownerName;
Expand All @@ -18,13 +20,22 @@ public class KyoyuPlacement {
private transient File file;

public KyoyuPlacement(KyoyuRegion region, List<KyoyuRegion> subRegions, String ownerName, String updaterName, File file) {
this(UUID.randomUUID(), region, subRegions, ownerName, updaterName, file);
}

public KyoyuPlacement(UUID uuid, KyoyuRegion region, List<KyoyuRegion> subRegions, String ownerName, String updaterName, File file) {
this.uuid = uuid;
this.region = region;
this.subRegions = subRegions;
this.ownerName = ownerName;
this.updaterName = updaterName;
this.file = file;
}

public UUID getUuid() {
return uuid;
}

public String getName() {
return this.region.getName();
}
Expand Down

0 comments on commit 33fce54

Please sign in to comment.