106 lines
4.7 KiB
Java
106 lines
4.7 KiB
Java
package jesse.keeblarcraft.EventMgr;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map.Entry;
|
|
|
|
import jesse.keeblarcraft.ConfigMgr.ConfigManager;
|
|
import jesse.keeblarcraft.Utils.ChatUtil;
|
|
import jesse.keeblarcraft.Utils.ChatUtil.CONSOLE_COLOR;
|
|
import jesse.keeblarcraft.world.dimension.ModDimensions;
|
|
import net.minecraft.entity.player.PlayerInventory;
|
|
import net.minecraft.nbt.NbtElement;
|
|
import net.minecraft.nbt.NbtList;
|
|
import net.minecraft.server.network.ServerPlayerEntity;
|
|
import net.minecraft.server.world.ServerWorld;
|
|
import net.minecraft.text.Text;
|
|
|
|
public class DimensionLoadingEvent {
|
|
private static DimensionLoadingEvent static_inst;
|
|
|
|
public static DimensionLoadingEvent GetInstance() {
|
|
if (static_inst == null) {
|
|
static_inst = new DimensionLoadingEvent();
|
|
}
|
|
|
|
return static_inst;
|
|
}
|
|
|
|
private static class InventoryWrapper {
|
|
public HashMap<String, NbtList> inventories = new HashMap<String, NbtList>();
|
|
}
|
|
|
|
private static InventoryWrapper iw = new InventoryWrapper();
|
|
|
|
private static String CONFIG_LOCATION = "misc/dim_loading_cached_inventories/";
|
|
ConfigManager config = new ConfigManager();
|
|
|
|
public DimensionLoadingEvent() {
|
|
// read config
|
|
iw.inventories = config.ReadAllNbtListFromDirectory(CONFIG_LOCATION, NbtElement.COMPOUND_TYPE);
|
|
}
|
|
|
|
// TODO: In the future when the attribute system is more complete this will need to filter a whitelist of items
|
|
// from the that system + story mode because some items will be able to transcend dimensions!
|
|
public void HandleWorldMove(ServerPlayerEntity player, ServerWorld origin, ServerWorld destination) {
|
|
System.out.println("World move event called!");
|
|
|
|
// Player is ENTERING the custom dimension; strip their inventory!
|
|
if (destination.getDimensionEntry().matchesKey(ModDimensions.KEEBLAR_DIM_TYPE) && (!iw.inventories.containsKey(player.getUuidAsString()))) {
|
|
// Make sure player is in map. For now we only care about storing OVERWORLD inventory. We DO NOT care about
|
|
// the dimension inventory!
|
|
// if (!iw.inventories.containsKey(player.getUuidAsString())) {
|
|
// Copy the nbt into the list
|
|
NbtList inventoryNbt = new NbtList();
|
|
player.getInventory().writeNbt(inventoryNbt);
|
|
|
|
iw.inventories.put(player.getUuidAsString(), inventoryNbt);
|
|
player.getInventory().clear();
|
|
// }
|
|
// Player is LEAVING the custom dimension. Give them their stuff back
|
|
} else if (origin.getDimensionEntry().matchesKey(ModDimensions.KEEBLAR_DIM_TYPE) && iw.inventories.containsKey(player.getUuidAsString())) {
|
|
// if (iw.inventories.containsKey(player.getUuidAsString())) {
|
|
player.getInventory().readNbt(iw.inventories.get(player.getUuidAsString()));
|
|
iw.inventories.remove(player.getUuidAsString());
|
|
// }
|
|
}
|
|
|
|
FlashConfig();
|
|
}
|
|
|
|
// Call on server close before we lose the volatile memory
|
|
public void SaveInventories() {
|
|
System.out.println("Call to save inventories. Flashing IW.Inventories with size " + iw.inventories.size());
|
|
FlashConfig();
|
|
}
|
|
|
|
public void CheckPlayer(ServerPlayerEntity player) {
|
|
// Check the players logged in world. If they are logging into the overworld - we need to see if they are in our
|
|
// map and give them the inventory back
|
|
if ((!player.getWorld().getDimensionEntry().matchesKey(ModDimensions.KEEBLAR_DIM_TYPE)) && iw.inventories.containsKey(player.getUuidAsString())) {
|
|
// We need to store the contents of the nbt into a regular inventory and magical chest and give it back to the player
|
|
player.sendMessage(Text.of("[IMPORTANT]: It appears you have a saved inventory of items on the server! You can claim it with /magic-inventory claim"));
|
|
}
|
|
}
|
|
|
|
// Fetches an inventory from this list. Use MagicInventory to store it along the transfer way!
|
|
public NbtList GetInventory(String uuid) {
|
|
NbtList nbt = iw.inventories.get(uuid);
|
|
iw.inventories.remove(uuid);
|
|
return nbt;
|
|
}
|
|
|
|
public void FlashConfig() {
|
|
try {
|
|
// config.WriteToJsonFile(CONFIG_LOCATION, iw);
|
|
// First, ensure list is size > 0
|
|
for (Entry<String, NbtList> list : iw.inventories.entrySet()) {
|
|
if (list.getValue().size() > 0) {
|
|
config.WriteNbtListToFile(CONFIG_LOCATION + list.getKey() + ".nbt", list.getKey(), list.getValue());
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
System.out.println(ChatUtil.ColoredString("Could not flash dimension loading configuration file", CONSOLE_COLOR.RED));
|
|
}
|
|
}
|
|
}
|