diff --git a/src/main/java/carpet/network/ClientNetworkHandler.java b/src/main/java/carpet/network/ClientNetworkHandler.java index 8d77dc5b..4d3cc1ad 100644 --- a/src/main/java/carpet/network/ClientNetworkHandler.java +++ b/src/main/java/carpet/network/ClientNetworkHandler.java @@ -1,9 +1,11 @@ package carpet.network; import carpet.CarpetServer; +import carpet.CarpetExtension; import carpet.CarpetSettings; import carpet.helpers.TickSpeed; import carpet.settings.ParsedRule; +import carpet.settings.SettingsManager; import io.netty.buffer.Unpooled; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.nbt.AbstractNumberTag; @@ -19,36 +21,62 @@ import java.util.function.BiConsumer; public class ClientNetworkHandler { - private static Map> dataHandlers = new HashMap>(){{ - put("Rules", (p, t) -> { + private static Map> dataHandlers = new HashMap>(); + static + { + dataHandlers.put("Rules", (p, t) -> { CompoundTag ruleset = (CompoundTag)t; - for (String ruleName: ruleset.getKeys()) + for (String ruleKey: ruleset.getKeys()) { - ParsedRule rule = CarpetServer.settingsManager.getRule(ruleName); - if (rule == null) - CarpetSettings.LOG.error("Received unknown rule: "+ruleName); - else + CompoundTag ruleNBT = (CompoundTag) ruleset.get(ruleKey); + SettingsManager manager = null; + String ruleName; + if (ruleNBT.contains("Manager")) + { + ruleName = ruleNBT.getString("Rule"); + String managerName = ruleNBT.getString("Manager"); + if (managerName.equals("carpet")) + { + manager = CarpetServer.settingsManager; + } + else + { + for (CarpetExtension extension: CarpetServer.extensions) { + SettingsManager eManager = extension.customSettingsManager(); + if (eManager != null && managerName.equals(eManager.getIdentifier())) + { + manager = eManager; + break; + } + } + } + } + else // Backwards compatibility + { + manager = CarpetServer.settingsManager; + ruleName = ruleKey; + } + ParsedRule rule = (manager != null) ? manager.getRule(ruleName) : null; + if (rule != null) { - CompoundTag ruleNBT = (CompoundTag) ruleset.get(ruleName); String value = ruleNBT.getString("Value"); rule.set(null, value); } } }); - put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false)); - put("scShape", (p, t) -> { // deprecated + dataHandlers.put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false)); + dataHandlers.put("scShape", (p, t) -> { // deprecated if (CarpetClient.shapes != null) CarpetClient.shapes.addShape((CompoundTag)t); }); - put("scShapes", (p, t) -> { + dataHandlers.put("scShapes", (p, t) -> { if (CarpetClient.shapes != null) CarpetClient.shapes.addShapes((ListTag) t); }); - put("clientCommand", (p, t) -> { + dataHandlers.put("clientCommand", (p, t) -> { CarpetClient.onClientCommand(t); }); - }}; - + }; public static void handleData(PacketByteBuf data, ClientPlayerEntity player) { diff --git a/src/main/java/carpet/network/ServerNetworkHandler.java b/src/main/java/carpet/network/ServerNetworkHandler.java index 8af2e19d..5971e93d 100644 --- a/src/main/java/carpet/network/ServerNetworkHandler.java +++ b/src/main/java/carpet/network/ServerNetworkHandler.java @@ -4,6 +4,7 @@ import carpet.CarpetServer; import carpet.CarpetSettings; import carpet.helpers.TickSpeed; import carpet.settings.ParsedRule; +import carpet.settings.SettingsManager; import io.netty.buffer.Unpooled; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -78,6 +79,12 @@ public class ServerNetworkHandler CarpetSettings.LOG.warn("Player "+playerEntity.getName().getString()+" joined with another carpet version: "+clientVersion); DataBuilder data = DataBuilder.create().withTickRate(); CarpetServer.settingsManager.getRules().forEach(data::withRule); + CarpetServer.extensions.forEach(e -> { + SettingsManager eManager = e.customSettingsManager(); + if (eManager != null) { + eManager.getRules().forEach(data::withRule); + } + }); playerEntity.networkHandler.sendPacket(new CustomPayloadS2CPacket(CarpetClient.CARPET_CHANNEL, data.build() )); } @@ -234,9 +241,14 @@ public class ServerNetworkHandler rules = new CompoundTag(); tag.put("Rules", rules); } + String identifier = rule.settingsManager.getIdentifier(); + String key = rule.name; + while (rules.contains(key)) { key = key+"2";} CompoundTag ruleNBT = new CompoundTag(); ruleNBT.putString("Value", rule.getAsString()); - rules.put(rule.name, ruleNBT); + ruleNBT.putString("Manager",identifier); + ruleNBT.putString("Rule",rule.name); + rules.put(key, ruleNBT); return this; }