Merge pull request #565 from altrisi/extension-sync

Sync extension's custom SettingsManager's rules
This commit is contained in:
gnembon authored and GitHub committed 2020-11-29 14:57:16 -04:00
commit c19bed79de
2 files changed
+55 -15

No files matched your search

@@ -1,9 +1,11 @@
package carpet.network; package carpet.network;
import carpet.CarpetServer; import carpet.CarpetServer;
import carpet.CarpetExtension;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.helpers.TickSpeed; import carpet.helpers.TickSpeed;
import carpet.settings.ParsedRule; import carpet.settings.ParsedRule;
import carpet.settings.SettingsManager;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.nbt.AbstractNumberTag; import net.minecraft.nbt.AbstractNumberTag;
@@ -19,36 +21,62 @@ import java.util.function.BiConsumer;
public class ClientNetworkHandler public class ClientNetworkHandler
{ {
private static Map<String, BiConsumer<ClientPlayerEntity, Tag>> dataHandlers = new HashMap<String, BiConsumer<ClientPlayerEntity, Tag>>(){{ private static Map<String, BiConsumer<ClientPlayerEntity, Tag>> dataHandlers = new HashMap<String, BiConsumer<ClientPlayerEntity, Tag>>();
put("Rules", (p, t) -> { static
CompoundTag ruleset = (CompoundTag)t;
for (String ruleName: ruleset.getKeys())
{ {
ParsedRule<?> rule = CarpetServer.settingsManager.getRule(ruleName); dataHandlers.put("Rules", (p, t) -> {
if (rule == null) CompoundTag ruleset = (CompoundTag)t;
CarpetSettings.LOG.error("Received unknown rule: "+ruleName); for (String ruleKey: ruleset.getKeys())
{
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 else
{ {
CompoundTag ruleNBT = (CompoundTag) ruleset.get(ruleName); 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)
{
String value = ruleNBT.getString("Value"); String value = ruleNBT.getString("Value");
rule.set(null, value); rule.set(null, value);
} }
} }
}); });
put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false)); dataHandlers.put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false));
put("scShape", (p, t) -> { // deprecated dataHandlers.put("scShape", (p, t) -> { // deprecated
if (CarpetClient.shapes != null) if (CarpetClient.shapes != null)
CarpetClient.shapes.addShape((CompoundTag)t); CarpetClient.shapes.addShape((CompoundTag)t);
}); });
put("scShapes", (p, t) -> { dataHandlers.put("scShapes", (p, t) -> {
if (CarpetClient.shapes != null) if (CarpetClient.shapes != null)
CarpetClient.shapes.addShapes((ListTag) t); CarpetClient.shapes.addShapes((ListTag) t);
}); });
put("clientCommand", (p, t) -> { dataHandlers.put("clientCommand", (p, t) -> {
CarpetClient.onClientCommand(t); CarpetClient.onClientCommand(t);
}); });
}}; };
public static void handleData(PacketByteBuf data, ClientPlayerEntity player) public static void handleData(PacketByteBuf data, ClientPlayerEntity player)
{ {
@@ -4,6 +4,7 @@ import carpet.CarpetServer;
import carpet.CarpetSettings; import carpet.CarpetSettings;
import carpet.helpers.TickSpeed; import carpet.helpers.TickSpeed;
import carpet.settings.ParsedRule; import carpet.settings.ParsedRule;
import carpet.settings.SettingsManager;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; 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); CarpetSettings.LOG.warn("Player "+playerEntity.getName().getString()+" joined with another carpet version: "+clientVersion);
DataBuilder data = DataBuilder.create().withTickRate(); DataBuilder data = DataBuilder.create().withTickRate();
CarpetServer.settingsManager.getRules().forEach(data::withRule); 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() )); playerEntity.networkHandler.sendPacket(new CustomPayloadS2CPacket(CarpetClient.CARPET_CHANNEL, data.build() ));
} }
@@ -234,9 +241,14 @@ public class ServerNetworkHandler
rules = new CompoundTag(); rules = new CompoundTag();
tag.put("Rules", rules); tag.put("Rules", rules);
} }
String identifier = rule.settingsManager.getIdentifier();
String key = rule.name;
while (rules.contains(key)) { key = key+"2";}
CompoundTag ruleNBT = new CompoundTag(); CompoundTag ruleNBT = new CompoundTag();
ruleNBT.putString("Value", rule.getAsString()); 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; return this;
} }