Skip to content

Commit

Permalink
1.21
Browse files Browse the repository at this point in the history
  • Loading branch information
gliscowo committed Jun 30, 2024
1 parent 833fab8 commit f867a0b
Show file tree
Hide file tree
Showing 31 changed files with 489 additions and 488 deletions.
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'fabric-loom' version '1.4-SNAPSHOT'
id 'fabric-loom' version '1.7-SNAPSHOT'
id 'maven-publish'
id 'io.github.juuxel.loom-quiltflower' version '1.7.1'
}
Expand Down Expand Up @@ -44,7 +44,7 @@ processResources {
}
}

def targetJavaVersion = 17
def targetJavaVersion = 21
tasks.withType(JavaCompile).configureEach {
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
Expand Down
18 changes: 9 additions & 9 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@
org.gradle.jvmargs=-Xmx1G
# Fabric Properties
# check these on https://fabricmc.net/develop
minecraft_base_version=1.20.3
minecraft_version=1.20.4
yarn_mappings=1.20.4+build.3
loader_version=0.15.3
minecraft_base_version=1.21
minecraft_version=1.21
yarn_mappings=1.21+build.2
loader_version=0.15.11
# Mod Properties
mod_version=0.3.2
maven_group=com.glisco
archives_base_name=deathlog
# Dependencies
fabric_version=0.92.0+1.20.4
fabric_version=0.100.1+1.21

# https://github.com/emilyploszaj/trinkets/releases
trinkets_version=3.8.0
trinkets_version=3.10.0-wf.1

# https://maven.ladysnake.org/#/releases/dev/onyxstudios/cardinal-components-api/cardinal-components-api/cardinal-components-base
cca_version=5.4.0
cca_version=6.1.0

# https://maven.terraformersmc.com/releases/com/terraformersmc/modmenu
modmenu_version=9.0.0
modmenu_version=11.0.0

# https://maven.wispforest.io/io/wispforest/owo-lib/
owo_version=0.12.0+1.20.3
owo_version=0.12.10+1.21

2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
22 changes: 17 additions & 5 deletions src/main/java/com/glisco/deathlog/DeathLogCommon.java
Original file line number Diff line number Diff line change
@@ -1,37 +1,49 @@
package com.glisco.deathlog;

import com.glisco.deathlog.death_info.DeathInfoPropertySerializer;
import com.glisco.deathlog.death_info.DeathInfoPropertyType;
import com.glisco.deathlog.death_info.DeathInfoPropertyTypes;
import com.glisco.deathlog.death_info.SpecialPropertyProvider;
import com.glisco.deathlog.death_info.properties.TrinketComponentProperty;
import com.glisco.deathlog.network.DeathLogPackets;
import com.glisco.deathlog.storage.DeathLogStorage;
import io.wispforest.owo.registration.reflect.AutoRegistryContainer;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.ApiStatus;

public class DeathLogCommon implements ModInitializer {

public static final Registry<DeathInfoPropertyType<?>> PROPERTY_TYPES = FabricRegistryBuilder
.createSimple(RegistryKey.<DeathInfoPropertyType<?>>ofRegistry(Identifier.of("deathlog", "property_type")))
.buildAndRegister();

private static DeathLogStorage currentStorage = null;
private static boolean usePermissions;

@Override
public void onInitialize() {
AutoRegistryContainer.register(DeathInfoPropertyTypes.class, "deathlog", false);

if (FabricLoader.getInstance().isModLoaded("trinkets")) {
SpecialPropertyProvider.register(TrinketComponentProperty::apply);
DeathInfoPropertySerializer.register(TrinketComponentProperty.Type.INSTANCE.getId(), TrinketComponentProperty.Type.INSTANCE);
Registry.register(PROPERTY_TYPES, Identifier.of("deathlog", "trinkets"), TrinketComponentProperty.Type.INSTANCE);
}

usePermissions = FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0");

DeathLogPackets.Server.registerCommonListeners();
DeathLogPackets.init();
}

public static boolean usePermissions() {
return usePermissions;
}

@ApiStatus.Internal
public static void setStorage(DeathLogStorage storage) {
if (DeathLogCommon.currentStorage != null) throw new IllegalStateException("Storage has already been set!");
if (storage == null) throw new IllegalArgumentException("Storage cannot be null!");
DeathLogCommon.currentStorage = storage;
}

Expand Down
45 changes: 31 additions & 14 deletions src/main/java/com/glisco/deathlog/client/ClientDeathLogStorage.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.glisco.deathlog.client;

import com.glisco.deathlog.client.gui.DeathLogToast;
import com.glisco.deathlog.death_info.SpecialPropertyProvider;
import com.glisco.deathlog.death_info.properties.*;
import com.glisco.deathlog.mixin.MinecraftServerAccessor;
Expand All @@ -9,11 +10,14 @@
import com.glisco.deathlog.storage.DirectDeathLogStorage;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.toast.SystemToast;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.Text;
import org.apache.commons.codec.digest.DigestUtils;
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.nio.file.Files;
import java.util.Date;
import java.util.List;
import java.util.UUID;
Expand All @@ -23,9 +27,23 @@ public class ClientDeathLogStorage extends BaseDeathLogStorage implements Direct
private final List<DeathInfo> deathInfos;
private final File deathLogFile;

public ClientDeathLogStorage() {
this.deathLogFile = FabricLoader.getInstance().getGameDir().resolve("deaths.dat").toFile();
this.deathInfos = load(deathLogFile).join();
public ClientDeathLogStorage(MinecraftClient client) {
super(client.world.getRegistryManager());
var worldSuffix = DigestUtils.sha1Hex(
client.isInSingleplayer()
? ((MinecraftServerAccessor) client.getServer()).deathlog_getSession().getDirectoryName()
: client.getCurrentServerEntry().name
).substring(0, 10);

this.deathLogFile = FabricLoader.getInstance().getGameDir().resolve("deathlog").resolve("deaths_" + worldSuffix + ".dat").toFile();
this.deathInfos = load(client.world.getRegistryManager(), deathLogFile).join();

var deathLogDir = FabricLoader.getInstance().getGameDir().resolve("deathlog").toAbsolutePath();

if (!Files.exists(deathLogDir) && !deathLogDir.toFile().mkdir()) {
raiseError("Failed to create directory");
LOGGER.error("Failed to create DeathLog storage directory, further disk operations have been disabled");
}
}

@Override
Expand All @@ -36,7 +54,7 @@ public List<DeathInfo> getDeathInfoList(@Nullable UUID profile) {
@Override
public void delete(DeathInfo info, @Nullable UUID profile) {
deathInfos.remove(info);
save(deathLogFile, deathInfos);
save(MinecraftClient.getInstance().world.getRegistryManager(), deathLogFile, deathInfos);
}

@Override
Expand All @@ -63,23 +81,22 @@ public void store(Text deathMessage, PlayerEntity player) {
DeathInfoCreatedCallback.EVENT.invoker().event(deathInfo);

deathInfos.add(deathInfo);
save(deathLogFile, deathInfos);
save(MinecraftClient.getInstance().world.getRegistryManager(), deathLogFile, deathInfos);
}

@Override
public void restore(int index, @Nullable UUID profile) {
DeathLogPackets.Client.requestRestore(MinecraftClient.getInstance().player.getUuid(), index);
DeathLogPackets.CHANNEL.clientHandle().send(new DeathLogPackets.RestoreRequest(
MinecraftClient.getInstance().player.getUuid(),
index
));
}

@Override
public String getDefaultFilter() {
var client = MinecraftClient.getInstance();
if (client.getCurrentServerEntry() != null) {
return client.getCurrentServerEntry().name;
} else if (client.isInSingleplayer()) {
return ((MinecraftServerAccessor) client.getServer()).deathlog_getSession().getDirectoryName();
}
protected void raiseError(String error) {
super.raiseError(error);

return "";
MinecraftClient.getInstance().getToastManager().add(new DeathLogToast(SystemToast.Type.PACK_LOAD_FAILURE, Text.of("DeathLog Database Error"), Text.of(error)));
MinecraftClient.getInstance().getToastManager().add(new DeathLogToast(SystemToast.Type.PACK_LOAD_FAILURE, Text.of("DeathLog Problem"), Text.of("Check your log for details")));
}
}
78 changes: 37 additions & 41 deletions src/main/java/com/glisco/deathlog/client/DeathInfo.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package com.glisco.deathlog.client;

import com.glisco.deathlog.death_info.DeathInfoProperty;
import com.glisco.deathlog.death_info.DeathInfoPropertySerializer;
import com.glisco.deathlog.death_info.RestorableDeathInfoProperty;
import com.glisco.deathlog.death_info.properties.InventoryProperty;
import com.glisco.deathlog.death_info.properties.TrinketComponentProperty;
import io.wispforest.endec.Endec;
import io.wispforest.endec.impl.StructEndecBuilder;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.minecraft.util.collection.DefaultedList;
Expand All @@ -19,6 +16,23 @@

public class DeathInfo {

public static final Endec<DeathInfo> ENDEC = StructEndecBuilder.of(
sequencedMapEndec(DeathInfoProperty.ENDEC).fieldOf("properties", info -> info.properties),
DeathInfo::new
);

public static final Endec<DeathInfo> PARTIAL_ENDEC = StructEndecBuilder.of(
sequencedMapEndec(DeathInfoProperty.ENDEC).xmap(properties -> {
SequencedMap<String, DeathInfoProperty> copy = new LinkedHashMap<>();
properties.forEach((key, property) -> {
if (property instanceof InventoryProperty || property instanceof TrinketComponentProperty) return;
copy.put(key, property);
});
return copy;
}, map -> map).fieldOf("properties", info -> info.properties),
DeathInfo::new
);

public static final String COORDINATES_KEY = "coordinates";
public static final String DIMENSION_KEY = "dimension";
public static final String LOCATION_KEY = "location";
Expand All @@ -27,47 +41,14 @@ public class DeathInfo {
public static final String TIME_OF_DEATH_KEY = "time_of_death";
public static final String INVENTORY_KEY = "inventory";

private final Map<String, DeathInfoProperty> properties;
private final SequencedMap<String, DeathInfoProperty> properties;

public DeathInfo() {
this.properties = new LinkedHashMap<>();
}

public static DeathInfo readFromNbt(NbtList nbt) {
final DeathInfo deathInfo = new DeathInfo();
nbt.forEach(element -> {
final var parsed = DeathInfoPropertySerializer.load((NbtCompound) element);
deathInfo.setProperty(parsed.getRight(), parsed.getLeft());
});
return deathInfo;
}

public NbtList writeNbt() {
final NbtList nbt = new NbtList();
properties.forEach((s, property) -> nbt.add(DeathInfoPropertySerializer.save(property, s)));
return nbt;
}

public static DeathInfo read(PacketByteBuf buffer) {
return readFromNbt(buffer.readNbt().getList("DeathInfo", NbtElement.COMPOUND_TYPE));
}

public void write(PacketByteBuf buffer) {
final var nbt = new NbtCompound();
nbt.put("DeathInfo", writeNbt());
buffer.writeNbt(nbt);
}

public void writePartial(PacketByteBuf buffer) {
final var list = new NbtList();
properties.forEach((s, property) -> {
if (property instanceof InventoryProperty || property instanceof TrinketComponentProperty) return;
list.add(DeathInfoPropertySerializer.save(property, s));
});

var nbt = new NbtCompound();
nbt.put("DeathInfo", list);
buffer.writeNbt(nbt);
public DeathInfo(SequencedMap<String, DeathInfoProperty> properties) {
this.properties = properties;
}

public void restore(ServerPlayerEntity player) {
Expand Down Expand Up @@ -133,4 +114,19 @@ public DefaultedList<ItemStack> getPlayerItems() {
if (propertyOptional.isEmpty()) return DefaultedList.of();
return ((InventoryProperty) propertyOptional.get()).getPlayerItems();
}

private static <T> Endec<SequencedMap<String, T>> sequencedMapEndec(Endec<T> in) {
return Endec.of((ctx, serializer, map) -> {
try (var mapState = serializer.map(ctx, in, map.size())) {
map.forEach(mapState::entry);
}
}, (ctx, deserializer) -> {
var mapState = deserializer.map(ctx, in);

var map = new LinkedHashMap<String, T>(mapState.estimatedSize());
mapState.forEachRemaining(entry -> map.put(entry.getKey(), entry.getValue()));

return map;
});
}
}
32 changes: 11 additions & 21 deletions src/main/java/com/glisco/deathlog/client/DeathLogClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,51 +3,41 @@
import com.glisco.deathlog.DeathLogCommon;
import com.glisco.deathlog.client.gui.DeathLogScreen;
import com.glisco.deathlog.network.DeathLogPackets;
import com.glisco.deathlog.storage.BaseDeathLogStorage;
import com.glisco.deathlog.storage.DirectDeathLogStorage;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
import net.fabricmc.fabric.api.client.screen.v1.Screens;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.StatsScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.text.Text;
import org.lwjgl.glfw.GLFW;

import java.nio.file.Files;

@Environment(EnvType.CLIENT)
public class DeathLogClient implements ClientModInitializer {

public static final com.glisco.deathlog.client.DeathLogConfig CONFIG;

static {
var configDir = FabricLoader.getInstance().getConfigDir();
if (Files.exists(configDir.resolve("deathlog.json")) && !Files.exists(configDir.resolve("deathlog.json5"))) {
if (configDir.resolve("deathlog.json").toFile().renameTo(configDir.resolve("deathlog.json5").toFile())) {
BaseDeathLogStorage.LOGGER.info("Migrated old '.json' config to '.json5'");
} else {
BaseDeathLogStorage.LOGGER.warn("Could not migrate old config file");
}
}

CONFIG = com.glisco.deathlog.client.DeathLogConfig.createAndLoad();
}
public static final com.glisco.deathlog.client.DeathLogConfig CONFIG = com.glisco.deathlog.client.DeathLogConfig.createAndLoad();

public static final KeyBinding OPEN_DEATH_SCREEN = new KeyBinding("key.deathlog.death_screen", GLFW.GLFW_KEY_END, "key.categories.misc");
private static ClientDeathLogStorage storage;

@Override
public void onInitializeClient() {
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
storage = new ClientDeathLogStorage(client);
DeathLogCommon.setStorage(storage);
});

storage = new ClientDeathLogStorage();
DeathLogCommon.setStorage(storage);
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> {
storage = null;
DeathLogCommon.setStorage(null);
});

ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
if (!(screen instanceof StatsScreen)) return;
Expand All @@ -63,7 +53,7 @@ public void onInitializeClient() {
}
});

DeathLogPackets.Client.registerListeners();
DeathLogPackets.initClient();
}

private void openScreen(DirectDeathLogStorage clientStorage) {
Expand Down
Loading

0 comments on commit f867a0b

Please sign in to comment.