Skip to content

Commit

Permalink
Breaking Changes: Improved Config Networking System
Browse files Browse the repository at this point in the history
Add Caches
  • Loading branch information
FirstMegaGame4 committed Aug 11, 2023
1 parent 2f60f2d commit 8f09ec9
Show file tree
Hide file tree
Showing 16 changed files with 241 additions and 71 deletions.
18 changes: 18 additions & 0 deletions src/main/java/com/mmodding/mmodding_lib/Events.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.mmodding.mmodding_lib;

import com.mmodding.mmodding_lib.ducks.GeneratorOptionsDuckInterface;
import com.mmodding.mmodding_lib.library.config.Config;
import com.mmodding.mmodding_lib.library.config.StaticConfig;
import com.mmodding.mmodding_lib.networking.server.ServerOperations;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.network.ServerPlayNetworkHandler;
Expand All @@ -22,13 +24,29 @@ private static void serverLoad(MinecraftServer server, ServerWorld world) {
}

private static void serverInit(ServerPlayNetworkHandler handler, MinecraftServer server) {
MModdingLib.CONFIGS.forEach((qualifier, config) -> {
if (config.getNetworkingSate() == Config.NetworkingState.LOCAL_CACHES) {
LocalCaches.CONFIGS.put(qualifier, StaticConfig.of(config));
}
});

if (MModdingLib.MMODDING_LIBRARY_CONFIG.getContent().getBoolean("showMModdingLibraryLocalCaches")) {
LocalCaches.debugCaches();
}

if (server.isDedicated()) {
ServerOperations.sendConfigsToClient(handler.getPlayer());
ServerOperations.sendGlintPacksToClient(handler.getPlayer());
}
}

private static void serverDisconnect(ServerPlayNetworkHandler handler, MinecraftServer server) {
LocalCaches.clearCaches();
}

public static void register() {
ServerWorldLoadEvents.LOAD.register(Events::serverLoad);
ServerPlayConnectionEvents.INIT.register(Events::serverInit);
ServerPlayConnectionEvents.DISCONNECT.register(Events::serverDisconnect);
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/mmodding/mmodding_lib/LocalCaches.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.mmodding.mmodding_lib;

import com.mmodding.mmodding_lib.library.caches.Caches;
import com.mmodding.mmodding_lib.library.config.Config;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
public class LocalCaches {

public static final Caches.Local<String, Config> CONFIGS = new Caches.Local<>("Configs", "Qualifier", "Config");

public static void debugCaches() {
CONFIGS.debug();
}

public static void clearCaches() {
CONFIGS.clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public String getFilePath() {
public ConfigObject defaultConfig() {
return new ConfigObject.Builder()
.addBooleanParameter("showMModdingLibraryMods", true)
.addBooleanParameter("showMModdingLibraryLocalCaches", false)
.build();
}

Expand Down
34 changes: 9 additions & 25 deletions src/main/java/com/mmodding/mmodding_lib/client/ClientCaches.java
Original file line number Diff line number Diff line change
@@ -1,48 +1,32 @@
package com.mmodding.mmodding_lib.client;

import com.mmodding.mmodding_lib.library.caches.Caches;
import com.mmodding.mmodding_lib.library.config.StaticConfig;
import com.mmodding.mmodding_lib.library.glint.GlintPackView;
import com.mmodding.mmodding_lib.library.glint.client.GlintPack;
import net.minecraft.item.Item;
import org.jetbrains.annotations.ApiStatus;
import org.quiltmc.loader.api.minecraft.ClientOnly;

import java.util.HashMap;

@ClientOnly
@ApiStatus.Internal
public class ClientCaches {

public static final ClientCache<Item, GlintPack> GLINT_PACKS = new ClientCache<>("Glint Packs", "Item", "Glint Pack");
public static final Caches.Client<String, StaticConfig> CONFIGS = new Caches.Client<>("Configs", "Qualifier", "Config");

public static final Caches.Client<Item, GlintPack> GLINT_PACKS = new Caches.Client<>("Glint Packs", "Item", "Glint Pack");

public static final ClientCache<Item, GlintPackView> GLINT_PACK_OVERRIDES = new ClientCache<>("Glint Pack Overrides", "Item", "Glint Pack View");
public static final Caches.Client<Item, GlintPackView> GLINT_PACK_OVERRIDES = new Caches.Client<>("Glint Pack Overrides", "Item", "Glint Pack View");

public static void debugCaches() {
CONFIGS.debug();
GLINT_PACKS.debug();
GLINT_PACK_OVERRIDES.debug();
}

public static void avoidCaches() {
public static void clearCaches() {
CONFIGS.clear();
GLINT_PACKS.clear();
GLINT_PACK_OVERRIDES.clear();
}

public static class ClientCache<K, V> extends HashMap<K, V> {

private final String cache;
private final String key;
private final String value;

public ClientCache(String cache, String key, String value) {
this.cache = cache;
this.key = key;
this.value = value;
}

public void debug() {
System.out.println("Client Cache {" + this.cache + "} :");
this.forEach((key, value) -> System.out.println(
"- " + this.key + " : " + key + " | " + this.value + " : " + value
));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ private static void serverJoin(ClientPlayNetworkHandler handler, PacketSender se
}

private static void serverDisconnect(ClientPlayNetworkHandler handler, MinecraftClient client) {
ClientCaches.avoidCaches();
ClientCaches.clearCaches();
}

private static void itemTooltipCallback(ItemStack stack, PlayerEntity player, TooltipContext context, List<Text> lines) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.google.common.collect.ImmutableList;
import com.mmodding.mmodding_lib.MModdingLib;
import com.mmodding.mmodding_lib.library.config.client.TemporaryConfig;
import com.mmodding.mmodding_lib.library.config.Config;
import com.mmodding.mmodding_lib.library.config.client.screen.ConfigScreen;
import net.minecraft.client.MinecraftClient;
Expand Down Expand Up @@ -59,11 +58,7 @@ public static class MModdingModConfigsListWidget extends ElementListWidget<MModd
public MModdingModConfigsListWidget(MModdingModConfigsScreen screen, MinecraftClient client, boolean clientConfigs, int width, int height, int top, int bottom, int itemHeight) {
super(client, width, height, top, bottom, itemHeight);
if (clientConfigs) {
MModdingLibClient.CLIENT_CONFIGS.forEach((qualifier, config) -> {
if (!(config instanceof TemporaryConfig)) {
this.addEntry(new MModdingModConfigsListEntry(screen, qualifier, config));
}
});
MModdingLibClient.CLIENT_CONFIGS.forEach((qualifier, config) -> this.addEntry(new MModdingModConfigsListEntry(screen, qualifier, config)));
}
else {
MModdingLib.CONFIGS.forEach((qualifier, config) -> this.addEntry(new MModdingModConfigsListEntry(screen, qualifier, config)));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package com.mmodding.mmodding_lib.library.base;

import com.mmodding.mmodding_lib.MModdingLib;
import com.mmodding.mmodding_lib.client.MModdingLibClient;
import com.mmodding.mmodding_lib.library.config.client.TemporaryConfig;
import com.mmodding.mmodding_lib.library.config.Config;
import com.mmodding.mmodding_lib.library.initializers.ElementsInitializer;
import net.fabricmc.api.EnvType;
import org.jetbrains.annotations.MustBeInvokedByOverriders;
import org.jetbrains.annotations.Nullable;
import org.quiltmc.loader.api.ModContainer;
import org.quiltmc.loader.api.minecraft.MinecraftQuiltLoader;
import org.quiltmc.qsl.base.api.entrypoint.ModInitializer;
import java.util.List;

Expand All @@ -27,9 +23,6 @@ default void onInitialize(ModContainer mod) {
if (this.getConfig() != null) {
this.getConfig().initializeConfig();
MModdingLib.CONFIGS.put(this.getConfig().getQualifier(), this.getConfig());
if (MinecraftQuiltLoader.getEnvironmentType() == EnvType.CLIENT) {
MModdingLibClient.CLIENT_CONFIGS.put(this.getConfig().getQualifier(), TemporaryConfig.fromConfig(this.getConfig()));
}
}
this.getElementsInitializers().forEach(ElementsInitializer::register);
}
Expand Down
55 changes: 55 additions & 0 deletions src/main/java/com/mmodding/mmodding_lib/library/caches/Caches.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.mmodding.mmodding_lib.library.caches;

import org.quiltmc.loader.api.minecraft.ClientOnly;

import java.util.HashMap;

public class Caches {

public abstract static class Cache<K, V> extends HashMap<K, V> {

protected final String cache;
protected final String key;
protected final String value;

private Cache(String cache, String key, String value) {
this.cache = cache;
this.key = key;
this.value = value;
}

abstract public boolean clientReserved();

public void debug() {
System.out.println((this.clientReserved() ? "Client " : "Local ") + "Cache {" + this.cache + "} :");
this.forEach((key, value) -> System.out.println(
"- " + this.key + " : " + key + " | " + this.value + " : " + value
));
}
}

public static class Local<K, V> extends Cache<K, V> {

public Local(String cache, String key, String value) {
super(cache, key, value);
}

@Override
public boolean clientReserved() {
return false;
}
}

@ClientOnly
public static class Client<K, V> extends Cache<K, V> {

public Client(String cache, String key, String value) {
super(cache, key, value);
}

@Override
public boolean clientReserved() {
return true;
}
}
}
37 changes: 33 additions & 4 deletions src/main/java/com/mmodding/mmodding_lib/library/config/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,38 @@ public interface Config {

/**
* The "identifier" of the config. Used to define the translations keys of the config.
* You can take example on {@link MModdingLibConfig#getQualifier()}.
* <br>You can take example on {@link MModdingLibConfig#getQualifier()}.
* @return the qualifier of the config
*/
String getQualifier();

/**
* The file path.
* You can take example on {@link MModdingLibConfig#getPath()}.
* <br>You can take example on {@link MModdingLibConfig#getPath()}.
* @return the path of the file (from the config directory and without file extension)
*/
String getFilePath();

/**
* The default config object.
* You can take example on {@link MModdingLibConfig#defaultConfig()}.
* <br>You can take example on {@link MModdingLibConfig#defaultConfig()}.
* @return the config object in its default state
* @see ConfigObject.Builder
*/
ConfigObject defaultConfig();

/**
* Some options used in the config screen.
* You can take example on {@link MModdingLibConfig#getConfigOptions()}.
* <br>You can take example on {@link MModdingLibConfig#getConfigOptions()}.
* @return the config screen options
* @see ConfigScreenOptions
*/
ConfigScreenOptions getConfigOptions();

default NetworkingState getNetworkingSate() {
return NetworkingState.CLIENT_CACHES;
}

/**
* The config content directly read from the config json file.
* @return the config content
Expand Down Expand Up @@ -120,4 +124,29 @@ default void initializeConfig() {
throw new RuntimeException(e);
}
}


/**
* Refers to the current config networking state
* @see Config#getNetworkingSate()
*/
enum NetworkingState {

/**
* When a world is joined, the current configuration is statically stored locally.
* <br>When a server is joined, the current configuration is sent to the client.
*/
LOCAL_CACHES,

/**
* When a server is joined, the current configuration is sent to the client.
* @apiNote Default value of {@link Config#getNetworkingSate()}
*/
CLIENT_CACHES,

/**
* The current configuration is never cached.
*/
WITHOUT_CACHES
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
package com.mmodding.mmodding_lib.library.config.client;
package com.mmodding.mmodding_lib.library.config;

import com.mmodding.mmodding_lib.library.config.Config;
import com.mmodding.mmodding_lib.library.config.ConfigObject;
import com.mmodding.mmodding_lib.library.config.client.screen.ConfigScreenOptions;

public abstract class TemporaryConfig implements Config {
public abstract class StaticConfig implements Config {

private ConfigObject configObject = Config.super.getContent();
@Override
public void saveConfig(ConfigObject configObject) {
this.configObject = configObject;
}

@Override
public ConfigObject getContent() {
return this.configObject;
}

public static TemporaryConfig fromConfig(Config config) {
@Override
public void saveConfig(ConfigObject configObject) {
this.configObject = configObject;
}

public static StaticConfig of(Config config) {

return new TemporaryConfig() {
return new StaticConfig() {

@Override
public String getQualifier() {
Expand All @@ -40,6 +39,11 @@ public ConfigObject defaultConfig() {
public ConfigScreenOptions getConfigOptions() {
return config.getConfigOptions();
}

@Override
public NetworkingState getNetworkingSate() {
return config.getNetworkingSate();
}
};
}
}
Loading

0 comments on commit 8f09ec9

Please sign in to comment.