From c78045fe86093ea01d543fa2251b8703606bb20c Mon Sep 17 00:00:00 2001 From: XTerPL Date: Sun, 31 Dec 2023 12:29:52 +0100 Subject: [PATCH] updated to 1.20.2 and added boolean values - also added IF_TRUE, INVERT, AND, OR, XOR - added Repeat While and Set to Condition --- gradle.properties | 8 +- .../github/techstreet/dfscript/DFScript.java | 2 +- .../dfscript/event/ServerLeaveEvent.java | 2 +- .../dfscript/features/AuthHandler.java | 4 +- .../game/MClientCommonNetworkHandler.java | 29 ++++ .../mixin/game/MClientPlayNetworkHandler.java | 5 +- .../dfscript/mixin/render/MInGameHUD.java | 9 - .../mixin/render/MMultiplayerScreen.java | 6 +- .../techstreet/dfscript/screen/CScreen.java | 13 +- .../script/ScriptAddArgumentScreen.java | 31 +++- .../screen/script/ScriptAddPartScreen.java | 3 +- .../screen/script/ScriptAddSettingScreen.java | 2 + .../script/ScriptAddSettingSubtypeScreen.java | 4 +- .../script/ScriptConditionCategoryScreen.java | 61 +++++++ .../script/ScriptConditionSelectScreen.java | 69 ++++++++ .../screen/script/ScriptEditScreen.java | 4 +- .../screen/script/ScriptListScreen.java | 28 ++-- .../screen/script/ScriptSetValueScreen.java | 35 +++- .../screen/script/ScriptSettingsScreen.java | 2 +- .../screen/util/ItemMaterialSelectMenu.java | 2 +- .../dfscript/screen/widget/CPlainPanel.java | 4 +- .../dfscript/screen/widget/CScrollPanel.java | 6 +- .../dfscript/screen/widget/CTextField.java | 79 ++++----- .../screen/widget/CTexturedButton.java | 29 +--- .../dfscript/screen/widget/CWidget.java | 3 +- .../techstreet/dfscript/script/Script.java | 34 +++- .../dfscript/script/ScriptGroup.java | 12 -- .../dfscript/script/ScriptManager.java | 6 + .../dfscript/script/ScriptMigrator.java | 5 + .../dfscript/script/ScriptPart.java | 25 +++ .../script/action/ScriptActionArgument.java | 1 + .../script/action/ScriptActionCategory.java | 15 +- .../action/ScriptActionCategoryExtra.java | 22 ++- .../ScriptActionCategoryExtraPartCreator.java | 39 +++++ .../script/action/ScriptActionType.java | 74 +++++++-- .../script/argument/ScriptArgument.java | 1 + .../script/argument/ScriptBoolArgument.java | 99 +++++++++++ .../argument/ScriptVariableArgument.java | 6 + .../script/conditions/ScriptBooleanSet.java | 154 ++++++++++++++++++ .../conditions/ScriptBuiltinCondition.java | 7 + .../script/conditions/ScriptCondition.java | 4 + .../conditions/ScriptConditionType.java | 94 +++++------ .../dfscript/script/event/ScriptEvent.java | 3 - .../script/options/ScriptBoolOption.java | 12 +- .../options/ScriptLegacyBoolOption.java | 55 +++++++ .../script/options/ScriptOptionEnum.java | 30 +++- .../repetitions/ScriptRepetitionType.java | 5 - .../script/repetitions/ScriptWhile.java | 112 +++++++++++++ .../dfscript/script/util/ScriptValueJson.java | 20 +-- .../script/values/ScriptBoolValue.java | 67 ++++++++ .../script/values/ScriptDictionaryValue.java | 5 + .../script/values/ScriptListValue.java | 5 + .../script/values/ScriptNumberValue.java | 5 + .../script/values/ScriptTextValue.java | 5 + .../script/values/ScriptUnknownValue.java | 5 + .../dfscript/script/values/ScriptValue.java | 7 + .../script/values/ScriptVariable.java | 9 + .../techstreet/dfscript/util/RenderUtil.java | 37 +++-- .../render/BlendableTexturedButtonWidget.java | 11 +- src/main/resources/assets/dfscript/delete.png | Bin 899 -> 11404 bytes .../assets/dfscript/delete_highlight.png | Bin 0 -> 11462 bytes .../resources/assets/dfscript/disable.png | Bin 1066 -> 12413 bytes .../assets/dfscript/disable_highlight.png | Bin 0 -> 12531 bytes src/main/resources/assets/dfscript/enable.png | Bin 1071 -> 12169 bytes .../assets/dfscript/enable_highlight.png | Bin 0 -> 12325 bytes .../resources/assets/dfscript/off_button.png | Bin 12029 -> 13175 bytes .../assets/dfscript/off_button_highlight.png | Bin 0 -> 13374 bytes .../resources/assets/dfscript/on_button.png | Bin 10748 -> 11727 bytes .../assets/dfscript/on_button_highlight.png | Bin 0 -> 11797 bytes src/main/resources/assets/dfscript/reload.png | Bin 768 -> 10920 bytes .../assets/dfscript/reload_highlight.png | Bin 0 -> 11025 bytes .../resources/assets/dfscript/scripts.png | Bin 757 -> 11538 bytes .../assets/dfscript/scripts_highlight.png | Bin 0 -> 11642 bytes .../resources/assets/dfscript/settings.png | Bin 11659 -> 11214 bytes .../assets/dfscript/settings_highlight.png | Bin 0 -> 11345 bytes .../resources/assets/dfscript/unupload.png | Bin 992 -> 11085 bytes .../assets/dfscript/unupload_highlight.png | Bin 0 -> 11230 bytes src/main/resources/assets/dfscript/upload.png | Bin 1022 -> 11362 bytes .../assets/dfscript/upload_highlight.png | Bin 0 -> 11507 bytes src/main/resources/assets/dfscript/wrench.png | Bin 846 -> 10153 bytes .../assets/dfscript/wrench_highlight.png | Bin 0 -> 10375 bytes src/main/resources/dfscript.mixins.json | 5 +- src/main/resources/fabric.mod.json | 4 +- 83 files changed, 1170 insertions(+), 270 deletions(-) create mode 100644 src/main/java/io/github/techstreet/dfscript/mixin/game/MClientCommonNetworkHandler.java create mode 100644 src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionCategoryScreen.java create mode 100644 src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionSelectScreen.java delete mode 100644 src/main/java/io/github/techstreet/dfscript/script/ScriptGroup.java create mode 100644 src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtraPartCreator.java create mode 100644 src/main/java/io/github/techstreet/dfscript/script/argument/ScriptBoolArgument.java create mode 100644 src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBooleanSet.java create mode 100644 src/main/java/io/github/techstreet/dfscript/script/options/ScriptLegacyBoolOption.java create mode 100644 src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptWhile.java create mode 100644 src/main/java/io/github/techstreet/dfscript/script/values/ScriptBoolValue.java create mode 100644 src/main/resources/assets/dfscript/delete_highlight.png create mode 100644 src/main/resources/assets/dfscript/disable_highlight.png create mode 100644 src/main/resources/assets/dfscript/enable_highlight.png create mode 100644 src/main/resources/assets/dfscript/off_button_highlight.png create mode 100644 src/main/resources/assets/dfscript/on_button_highlight.png create mode 100644 src/main/resources/assets/dfscript/reload_highlight.png create mode 100644 src/main/resources/assets/dfscript/scripts_highlight.png create mode 100644 src/main/resources/assets/dfscript/settings_highlight.png create mode 100644 src/main/resources/assets/dfscript/unupload_highlight.png create mode 100644 src/main/resources/assets/dfscript/upload_highlight.png create mode 100644 src/main/resources/assets/dfscript/wrench_highlight.png diff --git a/gradle.properties b/gradle.properties index a46d3fd..807338d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,13 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.20 -yarn_mappings=1.20.1+build.1 -loader_version=0.14.21 +minecraft_version=1.20.2 +yarn_mappings=1.20.2+build.4 +loader_version=0.15.3 # Mod Properties mod_version=1.0-SNAPSHOT maven_group=io.github.techstreet.dfscript archives_base_name=DFScript # Dependencies # check this on https://modmuss50.me/fabric.html -fabric_version=0.83.0+1.20.1 \ No newline at end of file +fabric_version=0.91.2+1.20.2 \ No newline at end of file diff --git a/src/main/java/io/github/techstreet/dfscript/DFScript.java b/src/main/java/io/github/techstreet/dfscript/DFScript.java index c98dcf4..4a1c34e 100644 --- a/src/main/java/io/github/techstreet/dfscript/DFScript.java +++ b/src/main/java/io/github/techstreet/dfscript/DFScript.java @@ -47,7 +47,7 @@ public void onInitialize() { // allows FileDialog class to open without a HeadlessException System.setProperty("java.awt.headless", "false"); - PLAYER_UUID = MC.getSession().getUuid(); + PLAYER_UUID = MC.getSession().getUuidOrNull().toString(); PLAYER_NAME = MC.getSession().getUsername(); MOD_VERSION = FabricLoader.getInstance().getModContainer(MOD_ID).get().getMetadata().getVersion().getFriendlyString(); diff --git a/src/main/java/io/github/techstreet/dfscript/event/ServerLeaveEvent.java b/src/main/java/io/github/techstreet/dfscript/event/ServerLeaveEvent.java index 55fb341..43ad378 100644 --- a/src/main/java/io/github/techstreet/dfscript/event/ServerLeaveEvent.java +++ b/src/main/java/io/github/techstreet/dfscript/event/ServerLeaveEvent.java @@ -1,7 +1,7 @@ package io.github.techstreet.dfscript.event; import io.github.techstreet.dfscript.event.system.Event; -import net.minecraft.network.packet.s2c.play.DisconnectS2CPacket; +import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; public class ServerLeaveEvent implements Event { private final DisconnectS2CPacket packet; diff --git a/src/main/java/io/github/techstreet/dfscript/features/AuthHandler.java b/src/main/java/io/github/techstreet/dfscript/features/AuthHandler.java index 4b9acac..e7cb980 100644 --- a/src/main/java/io/github/techstreet/dfscript/features/AuthHandler.java +++ b/src/main/java/io/github/techstreet/dfscript/features/AuthHandler.java @@ -9,7 +9,7 @@ import io.github.techstreet.dfscript.loader.Loadable; import io.github.techstreet.dfscript.script.util.AuthcodeResponse; import io.github.techstreet.dfscript.script.util.ServercodeResponse; -import net.minecraft.client.util.Session; +import net.minecraft.client.session.Session; import org.apache.commons.codec.digest.DigestUtils; import java.io.BufferedReader; @@ -78,7 +78,7 @@ public static void regen() { // Authorization step two - Fake server connect try { Session session = DFScript.MC.getSession(); - DFScript.MC.getSessionService().joinServer(session.getProfile(), session.getAccessToken(), commonSecret); + DFScript.MC.getSessionService().joinServer(session.getUuidOrNull(), session.getAccessToken(), commonSecret); } catch (AuthenticationException e) { // DFScript.LOGGER.error(e.getMessage()); // e.printStackTrace(); diff --git a/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientCommonNetworkHandler.java b/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientCommonNetworkHandler.java new file mode 100644 index 0000000..1be8341 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientCommonNetworkHandler.java @@ -0,0 +1,29 @@ +package io.github.techstreet.dfscript.mixin.game; + +import com.mojang.blaze3d.systems.RenderSystem; +import io.github.techstreet.dfscript.DFScript; +import io.github.techstreet.dfscript.event.*; +import io.github.techstreet.dfscript.event.system.EventManager; +import io.github.techstreet.dfscript.util.hypercube.HypercubeRank; +import io.github.techstreet.dfscript.util.hypercube.HypercubeUtil; +import net.minecraft.client.network.ClientCommonNetworkHandler; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.ClientConnection; +import net.minecraft.network.listener.ClientCommonPacketListener; +import net.minecraft.network.packet.s2c.common.DisconnectS2CPacket; +import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; +import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket; +import net.minecraft.network.packet.s2c.play.TeamS2CPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientCommonNetworkHandler.class) +public class MClientCommonNetworkHandler { + @Inject(method = "onDisconnect", at = @At("RETURN"), cancellable = true) + private void onDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { + ServerLeaveEvent event = new ServerLeaveEvent(packet); + EventManager.getInstance().dispatch(event); + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java b/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java index 7de736d..1f8a4dc 100644 --- a/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java +++ b/src/main/java/io/github/techstreet/dfscript/mixin/game/MClientPlayNetworkHandler.java @@ -10,6 +10,7 @@ import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.network.ClientConnection; import net.minecraft.network.packet.s2c.play.*; +import net.minecraft.network.packet.s2c.common.*; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -80,11 +81,11 @@ private void onGameJoin(GameJoinS2CPacket packet, CallbackInfo ci) { // EventManager.getInstance().dispatch(event); } - @Inject(method = "onDisconnect", at = @At("RETURN"), cancellable = true) +/* @Inject(method = "onDisconnect", at = @At("RETURN"), cancellable = true) private void onDisconnect(DisconnectS2CPacket packet, CallbackInfo ci) { ServerLeaveEvent event = new ServerLeaveEvent(packet); EventManager.getInstance().dispatch(event); - } + }*/ @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) private void chat(String content, CallbackInfo ci) { diff --git a/src/main/java/io/github/techstreet/dfscript/mixin/render/MInGameHUD.java b/src/main/java/io/github/techstreet/dfscript/mixin/render/MInGameHUD.java index 8a62c9d..2dbf237 100644 --- a/src/main/java/io/github/techstreet/dfscript/mixin/render/MInGameHUD.java +++ b/src/main/java/io/github/techstreet/dfscript/mixin/render/MInGameHUD.java @@ -15,15 +15,6 @@ @Mixin(InGameHud.class) public class MInGameHUD { - - @Inject(at = @At("HEAD"), method = "renderScoreboardSidebar", cancellable = true) - private void renderScoreboardSidebar(CallbackInfo info) { - MinecraftClient client = DFScript.MC; - if (client.options.debugEnabled) { - info.cancel(); - } - } - @Inject(at = @At("HEAD"), method = "render") private void render(DrawContext context, float tickDelta, CallbackInfo ci) { OverlayManager.getInstance().render(context); diff --git a/src/main/java/io/github/techstreet/dfscript/mixin/render/MMultiplayerScreen.java b/src/main/java/io/github/techstreet/dfscript/mixin/render/MMultiplayerScreen.java index 153f0ba..6243034 100644 --- a/src/main/java/io/github/techstreet/dfscript/mixin/render/MMultiplayerScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/mixin/render/MMultiplayerScreen.java @@ -9,13 +9,17 @@ import net.minecraft.text.Text; import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MultiplayerScreen.class) public class MMultiplayerScreen extends Screen { + @Unique private final Identifier identifier_main = new Identifier(DFScript.MOD_ID + ":scripts.png"); + @Unique + private final Identifier identifier_main_highlight = new Identifier(DFScript.MOD_ID + ":scripts_highlight.png"); protected MMultiplayerScreen(Text title) { super(title); @@ -23,7 +27,7 @@ protected MMultiplayerScreen(Text title) { @Inject(at = @At("HEAD"), method = "init", cancellable = true) private void init(CallbackInfo ci) { - this.addDrawableChild(new BlendableTexturedButtonWidget(5, 5, 20, 20, 0, 0, 20, identifier_main, 20, 40, (button) -> { + this.addDrawableChild(new BlendableTexturedButtonWidget(5, 5, 20, 20, identifier_main, identifier_main_highlight, (button) -> { ScriptListScreen screen = new ScriptListScreen(false); DFScript.MC.setScreen(screen); })); diff --git a/src/main/java/io/github/techstreet/dfscript/screen/CScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/CScreen.java index 4f09b0f..7499eaa 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/CScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/CScreen.java @@ -26,12 +26,14 @@ protected CScreen(int width, int height) { @Override public void render(@NotNull DrawContext context, int mouseX, int mouseY, float tickDelta) { - renderBackground(context); + //renderBackground(context, mouseX, mouseY, tickDelta); + super.render(context, mouseX, mouseY, tickDelta); context.getMatrices().push(); MinecraftClient mc = DFScript.MC; MatrixStack stack = context.getMatrices(); + assert mc.currentScreen != null; stack.translate(mc.currentScreen.width/2f, mc.currentScreen.height/2f, 0); // float scaleFactor = (float) mc.getWindow().getScaleFactor(); @@ -58,7 +60,6 @@ public void render(@NotNull DrawContext context, int mouseX, int mouseY, float t cWidget.renderOverlay(context, mouseX, mouseY, tickDelta); } stack.pop(); - super.render(context, mouseX, mouseY, tickDelta); } @Override @@ -100,20 +101,21 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } @Override - public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + public boolean mouseScrolled(double mouseX, double mouseY, double horizontal, double vertical) { mouseX = translateMouseX(mouseX); mouseY = translateMouseY(mouseY); for (CWidget cWidget : widgets) { - cWidget.mouseScrolled(mouseX, mouseY, amount); + cWidget.mouseScrolled(mouseX, mouseY, vertical, horizontal); } - return super.mouseScrolled(mouseX, mouseY, amount); + return super.mouseScrolled(mouseX, mouseY, horizontal, vertical); } public double translateMouseX(double mouseX) { MinecraftClient mc = DFScript.MC; // float s = (float) mc.getWindow().getScaleFactor(); float scaleFactor = 2; + assert mc.currentScreen != null; mouseX += -mc.currentScreen.width/2f; mouseX /= scaleFactor; mouseX += width/2f; @@ -124,6 +126,7 @@ public double translateMouseY(double mouseY) { MinecraftClient mc = DFScript.MC; // float scaleFactor = (float) mc.getWindow().getScaleFactor(); float scaleFactor = 2; + assert mc.currentScreen != null; mouseY += -mc.currentScreen.height/2f; mouseY /= scaleFactor; mouseY += height/2f; diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddArgumentScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddArgumentScreen.java index c24112b..b85bfce 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddArgumentScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddArgumentScreen.java @@ -57,13 +57,22 @@ public ScriptAddArgumentScreen(Script script, ScriptParametrizedPart action, int functionArgumentIcon.setCustomName(Text.literal("Function Argument") .fillStyle(Style.EMPTY.withItalic(false))); + ItemStack trueIcon = new ItemStack(Items.LIME_DYE); + trueIcon.setCustomName(Text.literal("True") + .fillStyle(Style.EMPTY.withItalic(false))); + + ItemStack falseIcon = new ItemStack(Items.RED_DYE); + falseIcon.setCustomName(Text.literal("False") + .fillStyle(Style.EMPTY.withItalic(false))); CItem addNumber = new CItem(2, 40, numberIcon); CItem addText = new CItem(12, 40, textIcon); - CItem addVariable = new CItem(22, 40, variableIcon); - CItem addClientValue = new CItem(32, 40, clientValueIcon); - CItem addConfigValue = new CItem(42, 40, configValueIcon); - CItem addFunctionArgument = new CItem(52, 40, functionArgumentIcon); + CItem addTrue = new CItem(22, 40, trueIcon); + CItem addFalse = new CItem(32, 40, falseIcon); + CItem addVariable = new CItem(42, 40, variableIcon); + CItem addClientValue = new CItem(52, 40, clientValueIcon); + CItem addConfigValue = new CItem(62, 40, configValueIcon); + CItem addFunctionArgument = new CItem(72, 40, functionArgumentIcon); input.setChangedListener(() -> input.textColor = 0xFFFFFF); @@ -102,9 +111,23 @@ public ScriptAddArgumentScreen(Script script, ScriptParametrizedPart action, int DFScript.MC.setScreen(new ScriptAddFunctionArgValueScreen(action, script, index, header, overwrite)); }); + addTrue.setClickListener((btn) -> { + if(overwrite != null) action.getArguments().remove(index); + action.getArguments().add(index, new ScriptBoolArgument(true)); + close(); + }); + + addFalse.setClickListener((btn) -> { + if(overwrite != null) action.getArguments().remove(index); + action.getArguments().add(index, new ScriptBoolArgument(false)); + close(); + }); + widgets.add(input); widgets.add(addNumber); widgets.add(addText); + widgets.add(addTrue); + widgets.add(addFalse); widgets.add(addVariable); widgets.add(addClientValue); widgets.add(addConfigValue); diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddPartScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddPartScreen.java index b56c5e7..384b8de 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddPartScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddPartScreen.java @@ -55,8 +55,7 @@ public ScriptAddPartScreen(Script script, ScriptSnippet snippet, int insertIndex for(ScriptActionCategoryExtra extra : category.getExtras(script)) { CItem item = new CItem(x, y, extra.getIcon()); item.setClickListener((btn) -> { - snippet.add(insertIndex, extra.getPart()); - DFScript.MC.setScreen(new ScriptEditScreen(script)); + extra.click(script, snippet, insertIndex); }); widgets.add(item); x += 10; diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingScreen.java index a24723f..9175a0f 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingScreen.java @@ -28,6 +28,8 @@ public ScriptAddSettingScreen(Script script, int pos) { int y = 3; for(ScriptOptionEnum option : ScriptOptionEnum.values()) { + if(option.isDeprecated()) continue; + CItem citem = new CItem(x, y, option.getIcon()); if(option.getExtraTypes() == 0) { diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingSubtypeScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingSubtypeScreen.java index 985ff2e..b4610bd 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingSubtypeScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptAddSettingSubtypeScreen.java @@ -116,7 +116,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float tickDelta) } if(noNull) { - CTexturedButton button = new CTexturedButton(width - 10, 3, 8, 8, DFScript.MOD_ID + ":on_button.png", () -> { + CTexturedButton button = new CTexturedButton(width - 10, 3, 8, 8, DFScript.MOD_ID + ":on_button.png", DFScript.MOD_ID + ":on_button_highlight.png", () -> { try { script.addOption(pos, new ScriptNamedOption(ScriptOption.instantiate(option, subtypes), script.getUnnamedOption())); } catch (Exception e) { @@ -124,7 +124,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float tickDelta) } DFScript.MC.setScreen(new ScriptSettingsScreen(script, true)); - }, 0,0,1,0.5f,0,0.5f); + }); widgets.add(button); } diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionCategoryScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionCategoryScreen.java new file mode 100644 index 0000000..9a25950 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionCategoryScreen.java @@ -0,0 +1,61 @@ +package io.github.techstreet.dfscript.screen.script; + +import io.github.techstreet.dfscript.DFScript; +import io.github.techstreet.dfscript.screen.CScreen; +import io.github.techstreet.dfscript.screen.widget.CItem; +import io.github.techstreet.dfscript.script.Script; +import io.github.techstreet.dfscript.script.ScriptPart; +import io.github.techstreet.dfscript.script.ScriptSnippet; +import io.github.techstreet.dfscript.script.action.ScriptActionCategory; +import io.github.techstreet.dfscript.script.conditions.ScriptBuiltinCondition; +import io.github.techstreet.dfscript.script.conditions.ScriptCondition; +import io.github.techstreet.dfscript.script.conditions.ScriptConditionType; + +import java.util.function.Consumer; +import java.util.function.Function; + +public class ScriptConditionCategoryScreen extends CScreen { + + private static final int size; + + static { + size = (int) (Math.ceil(Math.sqrt(ScriptActionCategory.values().length)) * 10)+4; + } + + private final Script script; + + private final ScriptSnippet snippet; + + private final int insertIndex; + + private final Function partCreator; + + public ScriptConditionCategoryScreen(Script script, ScriptSnippet snippet, int insertIndex, Function partCreator) { + super(size, size); + this.script = script; + this.snippet = snippet; + this.insertIndex = insertIndex; + this.partCreator = partCreator; + + int x = 3; + int y = 3; + + for (ScriptActionCategory category : ScriptActionCategory.values()) { + CItem actionItem = new CItem(x, y, category.getIcon()); + widgets.add(actionItem); + + actionItem.setClickListener(btn -> DFScript.MC.setScreen(new ScriptConditionSelectScreen(script, snippet, insertIndex, partCreator, category))); + + x += 10; + if (x >= size - 10) { + x = 3; + y += 10; + } + } + } + + @Override + public void close() { + DFScript.MC.setScreen(new ScriptAddPartScreen(script, snippet, insertIndex, ScriptActionCategory.CONDITIONS)); + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionSelectScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionSelectScreen.java new file mode 100644 index 0000000..e959a8f --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptConditionSelectScreen.java @@ -0,0 +1,69 @@ +package io.github.techstreet.dfscript.screen.script; + +import io.github.techstreet.dfscript.DFScript; +import io.github.techstreet.dfscript.screen.CScreen; +import io.github.techstreet.dfscript.screen.widget.CItem; +import io.github.techstreet.dfscript.script.Script; +import io.github.techstreet.dfscript.script.ScriptPart; +import io.github.techstreet.dfscript.script.ScriptSnippet; +import io.github.techstreet.dfscript.script.action.*; +import io.github.techstreet.dfscript.script.conditions.*; +import io.github.techstreet.dfscript.script.repetitions.ScriptBuiltinRepetition; +import io.github.techstreet.dfscript.script.repetitions.ScriptRepetitionType; + +import java.util.ArrayList; +import java.util.function.Function; + +public class ScriptConditionSelectScreen extends CScreen { + private final Script script; + + private final ScriptSnippet snippet; + + private final int insertIndex; + + private final Function partCreator; + + public ScriptConditionSelectScreen(Script script, ScriptSnippet snippet, int insertIndex, Function partCreator, ScriptActionCategory category) { + super(size(category), size(category)); + int size = size(category); + this.script = script; + this.partCreator = partCreator; + this.insertIndex = insertIndex; + this.snippet = snippet; + + int x = 3; + int y = 3; + + for (ScriptConditionType type : ScriptConditionType.values()) { + if (type.getCategory() != category) continue; + if (type.isDeprecated()) continue; + + CItem item = new CItem(x, y, type.getIcon("")); + item.setClickListener((btn) -> { + snippet.add(insertIndex, partCreator.apply(new ScriptBuiltinCondition(type))); + DFScript.MC.setScreen(new ScriptEditScreen(script)); + }); + widgets.add(item); + x += 10; + if (x >= size-10) { + x = 3; + y += 10; + } + } + } + + private static int size(ScriptActionCategory category) { + int amount = 0; + for (ScriptConditionType type : ScriptConditionType.values()) { + if (type.getCategory() == category) { + amount++; + } + } + return (int) (Math.ceil(Math.sqrt(amount))*10)+4; + } + + @Override + public void close() { + DFScript.MC.setScreen(new ScriptConditionCategoryScreen(script, snippet, insertIndex, partCreator)); + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditScreen.java index 05be730..08fcad6 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptEditScreen.java @@ -271,9 +271,9 @@ public void reload() CText name = new CText(5,y+2,Text.literal(script.getName()),0,1,false,false); panel.add(name); - CButton settings = new CTexturedButton(120-8, y, 8, 8, DFScript.MOD_ID + ":settings.png", () -> { + CButton settings = new CTexturedButton(120-8, y, 8, 8, DFScript.MOD_ID + ":settings.png", DFScript.MOD_ID + ":settings_highlight.png", () -> { DFScript.MC.setScreen(new ScriptSettingsScreen(this.script, true)); - }, 0, 0, 1, 0.5f, 0, 0.5f); + }); panel.add(settings); y += 10; diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptListScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptListScreen.java index 1fe472c..11ac788 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptListScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptListScreen.java @@ -71,9 +71,9 @@ public boolean mouseClicked(double x, double y, int button) { if (allowEditAndUpload) { // Delete Button - CButton delete = new CTexturedButton(20 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":delete.png", () -> { + CButton delete = new CTexturedButton(20 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":delete.png", DFScript.MOD_ID + ":delete_highlight.png", () -> { DFScript.MC.setScreen(new ScriptDeletionScreen(s)); - }, 0, 0, 1, 0.5f, 0, 0.5f); + }); if (!Objects.equals(s.getServer(), "None") && s.getOwner() != null && s.getOwner().equals(DFScript.PLAYER_UUID)) { delete.setOnClick(() -> { @@ -87,17 +87,17 @@ public boolean mouseClicked(double x, double y, int button) { // Enable or Disable Button CButton enableDisable; if (s.disabled()) { - enableDisable = new CTexturedButton(30 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":enable.png", () -> { + enableDisable = new CTexturedButton(30 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":enable.png", DFScript.MOD_ID + ":enable_highlight.png", () -> { s.setDisabled(false); ScriptManager.getInstance().saveScript(s); DFScript.MC.setScreen(new ScriptListScreen(allowEditAndUpload)); - }, 0,0,1,0.5f,0,0.5f); + }); } else { - enableDisable = new CTexturedButton(30 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":disable.png", () -> { + enableDisable = new CTexturedButton(30 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":disable.png", DFScript.MOD_ID + ":disable_highlight.png", () -> { s.setDisabled(true); ScriptManager.getInstance().saveScript(s); DFScript.MC.setScreen(new ScriptListScreen(allowEditAndUpload)); - }, 0,0,1,0.5f,0,0.5f); + }); } panel.add(enableDisable); @@ -105,14 +105,14 @@ public boolean mouseClicked(double x, double y, int button) { if(allowEditAndUpload) { if (s.getOwner() != null && s.getOwner().equals(DFScript.PLAYER_UUID)) { // Edit Button - CButton edit = new CTexturedButton(addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":wrench.png", () -> { + CButton edit = new CTexturedButton(addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":wrench.png", DFScript.MOD_ID + ":wrench_highlight.png", () -> { DFScript.MC.setScreen(new ScriptEditScreen(s)); - }, 0, 0, 1, 0.5f, 0, 0.5f); + }); panel.add(edit); // Upload or Remove Button - CButton upload = new CTexturedButton(10 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":upload.png", () -> { + CButton upload = new CTexturedButton(10 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":upload.png", DFScript.MOD_ID + ":upload_highlight.png", () -> { try { // Encode the script JSON to GZIP Base64 byte[] bytes = Files.readAllBytes(s.getFile().toPath()); @@ -161,10 +161,10 @@ public boolean mouseClicked(double x, double y, int button) { DFScript.MC.setScreen(new ScriptMessageScreen(new ScriptListScreen(allowEditAndUpload), "Failed to upload script to the server, please report this to a DFScript developer!")); // e.printStackTrace(); } - }, 0, 0, 1, 0.5f, 0, 0.5f); + }); if (!Objects.equals(s.getServer(), "None")) { - upload = new CTexturedButton(10 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":unupload.png", () -> { + upload = new CTexturedButton(10 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":unupload.png", DFScript.MOD_ID + ":unupload_highlight.png", () -> { try { // Remove the script to the server URL url = new URL("https://DFScript-Server.techstreetdev.repl.co/scripts/remove/"); @@ -200,16 +200,16 @@ public boolean mouseClicked(double x, double y, int button) { DFScript.MC.setScreen(new ScriptMessageScreen(new ScriptListScreen(allowEditAndUpload), "Failed to remove the script from the server, please try again!")); // e.printStackTrace(); } - }, 0, 0, 1, 0.5f, 0, 0.5f); + }); } panel.add(upload); } else { //Script Settings Button - CButton settings = new CTexturedButton(10 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":settings.png", () -> { + CButton settings = new CTexturedButton(10 + addedX, y + addedY, 8, 8, DFScript.MOD_ID + ":settings.png", DFScript.MOD_ID + ":settings_highlight.png", () -> { DFScript.MC.setScreen(new ScriptSettingsScreen(s, false)); - }, 0, 0, 1, 0.5f, 0, 0.5f); + }); panel.add(settings); } diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSetValueScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSetValueScreen.java index 9e53099..bbcd16b 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSetValueScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSetValueScreen.java @@ -12,10 +12,7 @@ import io.github.techstreet.dfscript.script.argument.ScriptVariableScope; import io.github.techstreet.dfscript.script.event.ScriptFunction; import io.github.techstreet.dfscript.script.event.ScriptHeader; -import io.github.techstreet.dfscript.script.values.ScriptNumberValue; -import io.github.techstreet.dfscript.script.values.ScriptTextValue; -import io.github.techstreet.dfscript.script.values.ScriptUnknownValue; -import io.github.techstreet.dfscript.script.values.ScriptValue; +import io.github.techstreet.dfscript.script.values.*; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.text.Style; @@ -58,8 +55,18 @@ public ScriptSetValueScreen(Script script, Runnable onClose, Consumer { + onSave.accept(new ScriptBoolValue(true)); + close(); + }); + + addFalse.setClickListener((btn) -> { + onSave.accept(new ScriptBoolValue(false)); + close(); + }); + + widgets.add(addTrue); + widgets.add(addFalse); + } + addUnknown = new CItem(100-12, 40, unknownIcon); addUnknown.setClickListener((btn) -> { diff --git a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSettingsScreen.java b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSettingsScreen.java index 7475821..789a8b9 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSettingsScreen.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/script/ScriptSettingsScreen.java @@ -98,7 +98,7 @@ public boolean mouseClicked(double x, double y, int button) { DFScript.MC.setScreen(new ScriptAddSettingScreen(script, finalIndex + 1)); }); CButton delete = new CButton((int) x, (int) y+16, 40, 8, "Delete", () -> { - //script.removeOption(script.getOptions().get(finalIndex).getName()); + script.removeOption(script.getOptions().get(finalIndex).getName()); script.getOptions().remove(finalIndex); scroll = panel.getScroll(); DFScript.MC.setScreen(new ScriptSettingsScreen(script, true)); diff --git a/src/main/java/io/github/techstreet/dfscript/screen/util/ItemMaterialSelectMenu.java b/src/main/java/io/github/techstreet/dfscript/screen/util/ItemMaterialSelectMenu.java index 6718694..101544b 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/util/ItemMaterialSelectMenu.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/util/ItemMaterialSelectMenu.java @@ -34,7 +34,7 @@ public ItemMaterialSelectMenu(Item currentMaterial, Consumer onClose) { searchField.setMultiline(false); searchField.setChangedListener(this::reload); - CTexturedButton finishButton = new CTexturedButton(162-8-5, 2, 8, 8, DFScript.MOD_ID + ":on_button.png", this::close, 0, 0, 1, 0.5f, 0, 0.5f); + CTexturedButton finishButton = new CTexturedButton(162-8-5, 2, 8, 8, DFScript.MOD_ID + ":on_button.png", DFScript.MOD_ID + ":on_button_highlight.png", this::close); panel = new CScrollPanel(2, 12, 160, 100-8); diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java index 9c3e115..bdbd089 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CPlainPanel.java @@ -75,9 +75,9 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { } @Override - public void mouseScrolled(double mouseX, double mouseY, double amount) { + public void mouseScrolled(double mouseX, double mouseY, double vertical, double horizontal) { for (CWidget child : children) { - child.mouseScrolled(mouseX, mouseY, amount); + child.mouseScrolled(mouseX, mouseY, vertical, horizontal); } } diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java index e76e09a..5e3e904 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CScrollPanel.java @@ -89,7 +89,7 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { } @Override - public void mouseScrolled(double mouseX, double mouseY, double amount) { + public void mouseScrolled(double mouseX, double mouseY, double vertical, double horizontal) { if(!getBounds().contains(mouseX, mouseY)) { return; } @@ -97,9 +97,9 @@ public void mouseScrolled(double mouseX, double mouseY, double amount) { mouseX -= x; mouseY -= y; for (CWidget child : children) { - child.mouseScrolled(mouseX, mouseY, amount); + child.mouseScrolled(mouseX, mouseY, vertical, horizontal); } - scroll += amount * 5; + scroll += vertical * 5; if (scroll < -getMaxScroll()) { scroll = -getMaxScroll(); diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CTextField.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CTextField.java index 691579b..0330533 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CTextField.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CTextField.java @@ -162,36 +162,35 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { int selectionEnd = Math.max(selectionPos, cursorPos); switch (keyCode) { - case 259: //backspace + case 259 -> { //backspace if (hasSelection) { deleteSelection(selectionStart, selectionEnd); } else if (cursorPos > 0) { text = text.substring(0, cursorPos - 1) + text.substring(cursorPos); cursorPos--; } - break; - case 257: //enter - if(!multiline) { + } + case 257 -> { //enter + if (!multiline) { return; } - if (hasSelection) { deleteSelection(selectionStart, selectionEnd); } text = text.substring(0, cursorPos) + "\n" + text.substring(cursorPos); cursorPos++; - break; - case 263: //left + } + case 263 -> { //left if (cursorPos > 0) { cursorPos--; } - break; - case 262: //right + } + case 262 -> { //right if (cursorPos < text.length()) { cursorPos++; } - break; - case 265: //up + } + case 265 -> { //up if (getCursorLineIndex() > 0) { int x = f.getWidth(getCursorLine().substring(0, getIndexInCursorLine())); int charPos = f.trimToWidth(getLine(getCursorLineIndex() - 1), x, true).length(); @@ -199,8 +198,8 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { } else { cursorPos = 0; } - break; - case 264: //down + } + case 264 -> { //down if (getCursorLineIndex() < getLines().length - 1) { int x = f.getWidth(getCursorLine().substring(0, getIndexInCursorLine())); int charPos = f.trimToWidth(getLine(getCursorLineIndex() + 1), x, true).length(); @@ -208,29 +207,29 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { } else { cursorPos = text.length(); } - break; - case 261: //delete + } + case 261 -> { //delete if (hasSelection) { deleteSelection(selectionStart, selectionEnd); } else if (cursorPos < text.length()) { text = text.substring(0, cursorPos) + text.substring(cursorPos + 1); } - break; - case 65: //a + } + case 65 -> { //a if (modifiers == 2) { selectionPos = 0; cursorPos = text.length(); hasSelection = true; } - break; - case 67: //c + } + case 67 -> { //c if (modifiers == 2) { if (hasSelection) { DFScript.MC.keyboard.setClipboard(text.substring(selectionStart, selectionEnd)); } } - break; - case 86: //v + } + case 86 -> { //v if (modifiers == 2) { if (hasSelection) { deleteSelection(selectionStart, selectionEnd); @@ -239,14 +238,15 @@ public void keyPressed(int keyCode, int scanCode, int modifiers) { text = text.substring(0, cursorPos) + clipboard + text.substring(cursorPos); cursorPos += clipboard.length(); } - break; - case 88: //x + } + case 88 -> { //x if (modifiers == 2) { if (hasSelection) { DFScript.MC.keyboard.setClipboard(text.substring(selectionStart, selectionEnd)); deleteSelection(selectionStart, selectionEnd); } } + } } if (selectionPos == cursorPos) { @@ -318,36 +318,37 @@ public boolean mouseClicked(double x, double y, int button) { } @Override - public void mouseScrolled(double mouseX, double mouseY, double amount) { + public void mouseScrolled(double mouseX, double mouseY, double vertical, double horizontal) { if (!editable || !selected) { return; } TextRenderer f = DFScript.MC.textRenderer; - if(xScrolling) - { - int maxScroll = 0; + int maxScroll = 0; - for (String line : getLines()) { - int lineWidth = f.getWidth(line); + for (String line : getLines()) { + int lineWidth = f.getWidth(line); - if(maxScroll < lineWidth) { - maxScroll = lineWidth; - } + if(maxScroll < lineWidth) { + maxScroll = lineWidth; } + } - maxScroll /= 2; - maxScroll -= width - 2; - - xScroll += amount * 5; - xScroll = Math.min(0, Math.max(xScroll, -maxScroll)); + maxScroll /= 2; + maxScroll -= width - 2; - return; + if(xScrolling) + { + double temp = vertical; + vertical = horizontal; + horizontal = temp; } - scroll += amount * 5; + scroll += vertical * 5; scroll = Math.min(0, Math.max(scroll, -(getLines().length + 1) * f.fontHeight / 2 + height - 2)); + xScroll += horizontal * 5; + xScroll = Math.min(0, Math.max(xScroll, -maxScroll)); } public int getCursorLineIndex() { diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CTexturedButton.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CTexturedButton.java index 14ab590..321b485 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CTexturedButton.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CTexturedButton.java @@ -9,26 +9,17 @@ public class CTexturedButton extends CButton { private String texture; - private final float ux; - private final float uy; - private final float uw; - private final float uh; - private final float hoverUx; - private final float hoverUy; - - public CTexturedButton(int x, int y, int width, int height, String texture, Runnable onClick, float ux, float uy, float uw, float uh, float hoverUx, float hoverUy) { + private String highlightedTexture; + + public CTexturedButton(int x, int y, int width, int height, String texture, String highlightedTexture, Runnable onClick) { super(x, y, width, height, 0, "", onClick); this.texture = texture; - this.ux = ux; - this.uy = uy; - this.uw = uw; - this.uh = uh; - this.hoverUx = hoverUx; - this.hoverUy = hoverUy; + this.highlightedTexture = highlightedTexture; } - public void setTexture(String newTexture) { + public void setTexture(String newTexture, String newHighlightedTexture) { texture = newTexture; + highlightedTexture = newHighlightedTexture; } @Override @@ -40,14 +31,12 @@ public void render(DrawContext context, int mouseX, int mouseY, float tickDelta) Rectangle rect = new Rectangle(x, y, width, height); - float ux = this.ux; - float uy = this.uy; + String usedTexture = texture; if (rect.contains(mouseX, mouseY)) { - ux = hoverUx; - uy = hoverUy; + usedTexture = highlightedTexture; } - RenderUtil.renderImage(context, 0, 0, width * 2, height * 2, ux, uy, uw, uh, texture); + RenderUtil.renderImage(context, 0, 0, width * 2, height * 2, 0, 0, 1, 1, usedTexture); stack.pop(); } } diff --git a/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java b/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java index f6f01af..4555fbc 100644 --- a/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java +++ b/src/main/java/io/github/techstreet/dfscript/screen/widget/CWidget.java @@ -3,7 +3,6 @@ import java.awt.Rectangle; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.util.math.MatrixStack; public interface CWidget { @@ -22,7 +21,7 @@ default void keyPressed(int keyCode, int scanCode, int modifiers) { default void keyReleased(int keyCode, int scanCode, int modifiers) { } - default void mouseScrolled(double mouseX, double mouseY, double amount) { + default void mouseScrolled(double mouseX, double mouseY, double vertical, double horizontal) { } default void renderOverlay(DrawContext context, int mouseX, int mouseY, float tickDelta) { diff --git a/src/main/java/io/github/techstreet/dfscript/script/Script.java b/src/main/java/io/github/techstreet/dfscript/script/Script.java index 42c97e7..207f1e9 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/Script.java +++ b/src/main/java/io/github/techstreet/dfscript/script/Script.java @@ -1,13 +1,6 @@ package io.github.techstreet.dfscript.script; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; +import com.google.gson.*; import io.github.techstreet.dfscript.DFScript; import io.github.techstreet.dfscript.event.system.Event; import io.github.techstreet.dfscript.script.action.ScriptAction; @@ -25,9 +18,12 @@ import io.github.techstreet.dfscript.script.execution.ScriptPosStack; import io.github.techstreet.dfscript.script.execution.ScriptScopeVariables; import io.github.techstreet.dfscript.script.execution.ScriptTask; +import io.github.techstreet.dfscript.script.options.ScriptOption; +import io.github.techstreet.dfscript.script.options.ScriptOptionEnum; import io.github.techstreet.dfscript.script.repetitions.ScriptBuiltinRepetition; import io.github.techstreet.dfscript.script.repetitions.ScriptRepetition; import io.github.techstreet.dfscript.script.repetitions.ScriptRepetitionType; +import io.github.techstreet.dfscript.script.util.ScriptOptionSubtypeMismatchException; import io.github.techstreet.dfscript.script.values.ScriptUnknownValue; import io.github.techstreet.dfscript.script.values.ScriptValue; import io.github.techstreet.dfscript.util.chat.ChatType; @@ -42,7 +38,7 @@ import org.apache.logging.log4j.Logger; public class Script { - public static int scriptVersion = 6; + public static int scriptVersion = 7; private String name; private String owner; @@ -449,6 +445,26 @@ public Script deserialize(JsonElement json, Type typeOfT, JsonDeserializationCon script.setDescription(description); if (object.get("config") != null) for (JsonElement element : object.get("config").getAsJsonArray()) { + if(version < 7) { + if(element.isJsonObject()) { + JsonObject obj = element.getAsJsonObject(); + + if(obj.getAsJsonPrimitive("type").getAsString().equals("BOOL")) { + obj.addProperty("type", "OLD_BOOL"); + } + + if(obj.has("subtypes") && obj.get("subtypes").isJsonArray()) { + int i = 0; + for (JsonElement el : obj.getAsJsonArray("subtypes")) { + if(el.getAsString().equals("BOOL")) { + obj.getAsJsonArray("subtypes").set(i, new JsonPrimitive("OLD_BOOL")); + } + i++; + } + } + } + } + ScriptNamedOption option = context.deserialize(element, ScriptNamedOption.class); script.addOption(script.getOptions().size(), option); } diff --git a/src/main/java/io/github/techstreet/dfscript/script/ScriptGroup.java b/src/main/java/io/github/techstreet/dfscript/script/ScriptGroup.java deleted file mode 100644 index 140d9a1..0000000 --- a/src/main/java/io/github/techstreet/dfscript/script/ScriptGroup.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.techstreet.dfscript.script; - -public enum ScriptGroup { - //This class specifies whether an action type is an action, a condition or a repetition - //(important to SKIP_ITERATION, STOP_REPETITION and ELSE) - ACTION, - CONDITION, - REPETITION, - EVENT, - - COMMENT -} diff --git a/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java b/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java index b4f95ce..788461e 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java +++ b/src/main/java/io/github/techstreet/dfscript/script/ScriptManager.java @@ -13,12 +13,14 @@ import io.github.techstreet.dfscript.script.action.ScriptBuiltinAction; import io.github.techstreet.dfscript.script.action.ScriptFunctionCall; import io.github.techstreet.dfscript.script.argument.*; +import io.github.techstreet.dfscript.script.conditions.ScriptBooleanSet; import io.github.techstreet.dfscript.script.conditions.ScriptBranch; import io.github.techstreet.dfscript.script.conditions.ScriptBuiltinCondition; import io.github.techstreet.dfscript.script.conditions.ScriptCondition; import io.github.techstreet.dfscript.script.event.*; import io.github.techstreet.dfscript.script.options.ScriptNamedOption; import io.github.techstreet.dfscript.script.repetitions.ScriptBuiltinRepetition; +import io.github.techstreet.dfscript.script.repetitions.ScriptWhile; import io.github.techstreet.dfscript.script.util.ScriptValueJson; import io.github.techstreet.dfscript.script.values.*; import io.github.techstreet.dfscript.util.FileUtil; @@ -48,6 +50,7 @@ public class ScriptManager implements Loadable { .registerTypeAdapter(ScriptArgument.class, new ScriptArgument.Serializer()) .registerTypeAdapter(ScriptTextArgument.class, new ScriptTextArgument.Serializer()) .registerTypeAdapter(ScriptNumberArgument.class, new ScriptNumberArgument.Serializer()) + .registerTypeAdapter(ScriptBoolArgument.class, new ScriptBoolArgument.Serializer()) .registerTypeAdapter(ScriptVariableArgument.class, new ScriptVariableArgument.Serializer()) .registerTypeAdapter(ScriptClientValueArgument.class, new ScriptClientValueArgument.Serializer()) .registerTypeAdapter(ScriptConfigArgument.class, new ScriptConfigArgument.Serializer()) @@ -58,7 +61,9 @@ public class ScriptManager implements Loadable { .registerTypeAdapter(ScriptBuiltinCondition.class, new ScriptBuiltinCondition.Serializer()) .registerTypeAdapter(ScriptCondition.class, new ScriptCondition.Serializer()) .registerTypeAdapter(ScriptBuiltinRepetition.class, new ScriptBuiltinRepetition.Serializer()) + .registerTypeAdapter(ScriptWhile.class, new ScriptWhile.Serializer()) .registerTypeAdapter(ScriptBranch.class, new ScriptBranch.Serializer()) + .registerTypeAdapter(ScriptBooleanSet.class, new ScriptBooleanSet.Serializer()) .registerTypeAdapter(ScriptEvent.class, new ScriptEvent.Serializer()) .registerTypeAdapter(ScriptFunction.class, new ScriptFunction.Serializer()) .registerTypeAdapter(ScriptComment.class, new ScriptComment.Serializer()) @@ -72,6 +77,7 @@ public class ScriptManager implements Loadable { .registerTypeAdapter(ScriptTextValue.class, new ScriptTextValue.Serializer()) .registerTypeAdapter(ScriptListValue.class, new ScriptListValue.Serializer()) .registerTypeAdapter(ScriptDictionaryValue.class, new ScriptDictionaryValue.Serializer()) + .registerTypeAdapter(ScriptBoolValue.class, new ScriptDictionaryValue.Serializer()) .create(); public ScriptManager() { diff --git a/src/main/java/io/github/techstreet/dfscript/script/ScriptMigrator.java b/src/main/java/io/github/techstreet/dfscript/script/ScriptMigrator.java index 64e655d..fcfb154 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/ScriptMigrator.java +++ b/src/main/java/io/github/techstreet/dfscript/script/ScriptMigrator.java @@ -2,6 +2,7 @@ import io.github.techstreet.dfscript.DFScript; import io.github.techstreet.dfscript.script.action.ScriptActionType; +import io.github.techstreet.dfscript.script.options.ScriptOptionEnum; public class ScriptMigrator { public static void migrate(Script script) { @@ -43,6 +44,10 @@ public static void migrate(Script script) { script.setVersion(6); } + if(script.getVersion() == 6) { + script.setVersion(7); + } + if (previousVer != script.getVersion()) { ScriptManager.LOGGER.info("Migrated script '" + script.getName() + "' from version " + previousVer + " to version " + script.getVersion() + "!"); ScriptManager.getInstance().saveScript(script); diff --git a/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java b/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java index 567aa20..2cfb37b 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java +++ b/src/main/java/io/github/techstreet/dfscript/script/ScriptPart.java @@ -10,11 +10,13 @@ import io.github.techstreet.dfscript.script.action.ScriptBuiltinAction; import io.github.techstreet.dfscript.script.action.ScriptFunctionCall; import io.github.techstreet.dfscript.script.argument.ScriptArgument; +import io.github.techstreet.dfscript.script.conditions.ScriptBooleanSet; import io.github.techstreet.dfscript.script.conditions.ScriptBranch; import io.github.techstreet.dfscript.script.conditions.ScriptCondition; import io.github.techstreet.dfscript.script.render.ScriptPartRender; import io.github.techstreet.dfscript.script.repetitions.ScriptBuiltinRepetition; import io.github.techstreet.dfscript.script.repetitions.ScriptRepetitionType; +import io.github.techstreet.dfscript.script.repetitions.ScriptWhile; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; @@ -77,6 +79,17 @@ public ScriptPart deserialize(JsonElement json, Type typeOfT, JsonDeserializatio return part; } + case "booleanSet" -> { + List args = new ArrayList<>(); + for (JsonElement arg : obj.get("arguments").getAsJsonArray()) { + args.add(context.deserialize(arg, ScriptArgument.class)); + } + ScriptCondition condition = context.deserialize(obj.get("condition"), ScriptCondition.class); + + ScriptBooleanSet part = new ScriptBooleanSet(args, condition); + + return part; + } case "repetition" -> { String action = obj.get("repetition").getAsString(); List args = new ArrayList<>(); @@ -89,6 +102,18 @@ public ScriptPart deserialize(JsonElement json, Type typeOfT, JsonDeserializatio return part; } + case "while" -> { + ScriptCondition condition = context.deserialize(obj.get("condition"), ScriptCondition.class); + List args = new ArrayList<>(); + for (JsonElement arg : obj.get("arguments").getAsJsonArray()) { + args.add(context.deserialize(arg, ScriptArgument.class)); + } + ScriptWhile part = new ScriptWhile(args, condition); + + part.container().setSnippet(0, context.deserialize(obj.getAsJsonObject("snippet"), ScriptSnippet.class)); + + return part; + } case "comment" -> { String comment = obj.get("comment").getAsString(); return new ScriptComment(comment); diff --git a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionArgument.java b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionArgument.java index f211114..51191c9 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionArgument.java +++ b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionArgument.java @@ -179,6 +179,7 @@ public enum ScriptActionArgumentType { VARIABLE("Variable", Items.MAGMA_CREAM, null, false), NUMBER("Number", Items.SLIME_BALL, ScriptNumberValue.class), TEXT("Text", Items.BOOK, ScriptTextValue.class), + BOOL("Boolean", Items.LEVER, ScriptBoolValue.class), LIST("List", Items.CHEST, null), DICTIONARY("Dictionary", Items.CHEST_MINECART, null), ANY("Any", Items.ENDER_EYE, ScriptValue.class); diff --git a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java index 846fde4..088560c 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java +++ b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategory.java @@ -1,8 +1,12 @@ package io.github.techstreet.dfscript.script.action; +import io.github.techstreet.dfscript.DFScript; +import io.github.techstreet.dfscript.screen.script.ScriptConditionCategoryScreen; import io.github.techstreet.dfscript.script.Script; import io.github.techstreet.dfscript.script.ScriptComment; +import io.github.techstreet.dfscript.script.conditions.ScriptBooleanSet; import io.github.techstreet.dfscript.script.event.ScriptFunction; +import io.github.techstreet.dfscript.script.repetitions.ScriptWhile; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -19,9 +23,13 @@ public enum ScriptActionCategory { VISUALS("Visuals", Items.ENDER_EYE), ACTIONS("Actions", Items.PLAYER_HEAD), MISC("Misc", Items.COMPASS, List.of( - new ScriptActionCategoryExtra(new ItemStack(Items.MAP).setCustomName(Text.literal("Comment").setStyle(Style.EMPTY.withItalic(false))), () -> new ScriptComment("")) + new ScriptActionCategoryExtraPartCreator(new ItemStack(Items.MAP).setCustomName(Text.literal("Comment").setStyle(Style.EMPTY.withItalic(false))), () -> new ScriptComment("")) )), VARIABLES("Variables", Items.IRON_INGOT), + CONDITIONS("Conditions", Items.LEVER, List.of( + new ScriptActionCategoryExtra(ScriptBooleanSet.booleanSetIcon, (sc, sn, ii) -> DFScript.MC.setScreen(new ScriptConditionCategoryScreen(sc, sn, ii, (con) -> new ScriptBooleanSet(new ArrayList<>(), con)))), + new ScriptActionCategoryExtra(ScriptWhile.whileIcon, (sc, sn, ii) -> DFScript.MC.setScreen(new ScriptConditionCategoryScreen(sc, sn, ii, (con) -> new ScriptWhile(new ArrayList<>(), con)))) + )), NUMBERS("Numbers", Items.SLIME_BALL), LISTS("Lists", Items.BOOKSHELF), TEXTS("Texts", Items.BOOK), @@ -35,15 +43,14 @@ public enum ScriptActionCategory { List extras = new ArrayList<>(); for (ScriptFunction function : script.getFunctions()) { - extras.add(new ScriptActionCategoryExtra( + extras.add(new ScriptActionCategoryExtraPartCreator( function.getIcon(), () -> new ScriptFunctionCall(script, function.getName(), new ArrayList<>()) )); } return extras; - }) - ; + }); private final ItemStack icon; diff --git a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtra.java b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtra.java index ada08ca..6cb34cb 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtra.java +++ b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtra.java @@ -1,17 +1,33 @@ package io.github.techstreet.dfscript.script.action; +import io.github.techstreet.dfscript.script.Script; import io.github.techstreet.dfscript.script.ScriptPart; +import io.github.techstreet.dfscript.script.ScriptSnippet; import net.minecraft.item.ItemStack; +import org.apache.logging.log4j.util.TriConsumer; +import java.util.Objects; import java.util.function.Function; import java.util.function.Supplier; -public record ScriptActionCategoryExtra(ItemStack icon, Supplier createPartFunction) { +public class ScriptActionCategoryExtra { + private final ItemStack icon; + private final TriConsumer onClick; + + public ScriptActionCategoryExtra(ItemStack icon, TriConsumer onClick) { + this.icon = icon; + this.onClick = onClick; + } + public ItemStack getIcon() { return icon; } - public ScriptPart getPart() { - return createPartFunction.get(); + public ItemStack icon() { + return icon; + } + + public void click(Script script, ScriptSnippet snippet, int insertIndex) { + onClick.accept(script, snippet, insertIndex); } } diff --git a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtraPartCreator.java b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtraPartCreator.java new file mode 100644 index 0000000..2b4545a --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionCategoryExtraPartCreator.java @@ -0,0 +1,39 @@ +package io.github.techstreet.dfscript.script.action; + +import io.github.techstreet.dfscript.DFScript; +import io.github.techstreet.dfscript.screen.script.ScriptEditScreen; +import io.github.techstreet.dfscript.script.ScriptPart; +import net.minecraft.item.ItemStack; + +import java.util.Objects; +import java.util.function.Supplier; + +public class ScriptActionCategoryExtraPartCreator extends ScriptActionCategoryExtra { + private final ItemStack icon; + private final Supplier createPartFunction; + + public ScriptActionCategoryExtraPartCreator(ItemStack icon, Supplier createPartFunction) { + super(icon, (sc, sn, ii) -> { + sn.add(ii, createPartFunction.get()); + DFScript.MC.setScreen(new ScriptEditScreen(sc)); + }); + this.icon = icon; + this.createPartFunction = createPartFunction; + } + + public ItemStack getIcon() { + return icon; + } + + public ScriptPart getPart() { + return createPartFunction.get(); + } + + public ItemStack icon() { + return icon; + } + + public Supplier createPartFunction() { + return createPartFunction; + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java index be7691e..dfabccd 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java +++ b/src/main/java/io/github/techstreet/dfscript/script/action/ScriptActionType.java @@ -11,7 +11,6 @@ import io.github.techstreet.dfscript.event.HudRenderEvent; import io.github.techstreet.dfscript.event.system.CancellableEvent; import io.github.techstreet.dfscript.screen.overlay.OverlayManager; -import io.github.techstreet.dfscript.script.ScriptGroup; import io.github.techstreet.dfscript.script.ScriptManager; import io.github.techstreet.dfscript.script.action.ScriptActionArgument.ScriptActionArgumentType; import io.github.techstreet.dfscript.script.argument.ScriptArgument; @@ -480,7 +479,6 @@ public enum ScriptActionType { } ctx.task().stop();//Stop the current thread - ctx.task().stack().increase();//Go to the next action Scheduler.schedule((int) ctx.value("Ticks").asNumber(), () -> ctx.task().run());//Resume the task after the given amount of ticks })), @@ -1591,6 +1589,68 @@ public enum ScriptActionType { SimpleDateFormat format = new SimpleDateFormat(ctx.value("Format").asText()); ctx.setVariable("Result", new ScriptTextValue(format.format(date))); + })), + + INVERT(builder -> builder.name("Invert Boolean") + .description("Returns true if the boolean is false and vice versa.") + .icon(Items.REDSTONE_TORCH) + .arg("Result", ScriptActionArgumentType.VARIABLE) + .arg("Value", ScriptActionArgumentType.BOOL) + .category(ScriptActionCategory.CONDITIONS) + .action(ctx -> { + ctx.setVariable("Result", new ScriptBoolValue(!ctx.value("Value").asBoolean())); + })), + + AND(builder -> builder.name("Set to AND Result") + .description("Returns true if all booleans are true.") + .icon(Items.REDSTONE_BLOCK) + .arg("Result", ScriptActionArgumentType.VARIABLE) + .arg("Value", ScriptActionArgumentType.BOOL, b -> b.plural(true)) + .category(ScriptActionCategory.CONDITIONS) + .action(ctx -> { + for (ScriptValue val : ctx.pluralValue("Value")) { + if(!val.asBoolean()) { + ctx.setVariable("Result", new ScriptBoolValue(false)); + return; + } + } + + ctx.setVariable("Result", new ScriptBoolValue(true)); + })), + + OR(builder -> builder.name("Set to OR Result") + .description("Returns true if one of the booleans are true.") + .icon(Items.REDSTONE) + .arg("Result", ScriptActionArgumentType.VARIABLE) + .arg("Value", ScriptActionArgumentType.BOOL, b -> b.plural(true)) + .category(ScriptActionCategory.CONDITIONS) + .action(ctx -> { + for (ScriptValue val : ctx.pluralValue("Value")) { + if(val.asBoolean()) { + ctx.setVariable("Result", new ScriptBoolValue(true)); + return; + } + } + + ctx.setVariable("Result", new ScriptBoolValue(false)); + })), + + XOR(builder -> builder.name("Set to XOR Result") + .description("Returns true if an odd number of booleans are true.") + .icon(Items.REDSTONE, true) + .arg("Result", ScriptActionArgumentType.VARIABLE) + .arg("Value", ScriptActionArgumentType.BOOL, b -> b.plural(true)) + .category(ScriptActionCategory.CONDITIONS) + .action(ctx -> { + int trues = 0; + + for (ScriptValue val : ctx.pluralValue("Value")) { + if(val.asBoolean()) { + trues++; + } + } + + ctx.setVariable("Result", new ScriptBoolValue(trues % 2 == 1)); })); private Consumer action = (ctx) -> { @@ -1602,7 +1662,6 @@ public enum ScriptActionType { private boolean hasChildren = false; private ScriptActionCategory category = ScriptActionCategory.MISC; private List description = new ArrayList(); - private ScriptGroup group = ScriptGroup.ACTION; private ScriptActionType deprecated = null; //if deprecated == null, the action is not deprecated private final ScriptActionArgumentList arguments = new ScriptActionArgumentList(); @@ -1711,15 +1770,6 @@ private ScriptActionType description(String description) { return this; } - private ScriptActionType group(ScriptGroup group) { - this.group = group; - return this; - } - - public ScriptGroup getGroup() { - return group; - } - public ScriptActionType arg(String name, ScriptActionArgumentType type, Consumer builder) { ScriptActionArgument arg = new ScriptActionArgument(name, type); builder.accept(arg); diff --git a/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptArgument.java b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptArgument.java index 4c2a547..80d9bd4 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptArgument.java +++ b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptArgument.java @@ -41,6 +41,7 @@ public ScriptArgument deserialize(JsonElement json, Type typeOfT, JsonDeserializ return switch (type) { case "TEXT" -> new ScriptTextArgument(object.get("value").getAsString()); case "NUMBER" -> new ScriptNumberArgument(object.get("value").getAsDouble()); + case "BOOL" -> new ScriptBoolArgument(object.get("value").getAsBoolean()); case "VARIABLE" -> context.deserialize(object, ScriptVariableArgument.class); case "CLIENT_VALUE" -> ScriptClientValueArgument.valueOf(object.get("value").getAsString()); case "CONFIG_VALUE" -> new ScriptConfigArgument(object.get("value").getAsString(), null); diff --git a/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptBoolArgument.java b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptBoolArgument.java new file mode 100644 index 0000000..086ef62 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptBoolArgument.java @@ -0,0 +1,99 @@ +package io.github.techstreet.dfscript.script.argument; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import io.github.techstreet.dfscript.screen.ContextMenuButton; +import io.github.techstreet.dfscript.script.action.ScriptActionArgument.ScriptActionArgumentType; +import io.github.techstreet.dfscript.script.execution.ScriptTask; +import io.github.techstreet.dfscript.script.values.ScriptBoolValue; +import io.github.techstreet.dfscript.script.values.ScriptNumberValue; +import io.github.techstreet.dfscript.script.values.ScriptValue; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.lang.reflect.Type; +import java.math.RoundingMode; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public final class ScriptBoolArgument implements ScriptArgument { + private boolean value; + + public ScriptBoolArgument(boolean value) { + this.value = value; + } + + @Override + public ScriptValue getValue(ScriptTask task) { + return new ScriptBoolValue(value); + } + + @Override + public boolean convertableTo(ScriptActionArgumentType type) { + return ScriptActionArgumentType.BOOL.convertableTo(type); + } + + public static class Serializer implements JsonSerializer { + + @Override + public JsonElement serialize(ScriptBoolArgument src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject object = new JsonObject(); + object.addProperty("type", "BOOL"); + object.addProperty("value", src.value()); + return object; + } + } + + @Override + public ItemStack getArgIcon() { + return new ItemStack(value ? Items.LIME_DYE : Items.RED_DYE).setCustomName(Text.literal(value ? "True" : "False").setStyle(Style.EMPTY.withColor(Formatting.WHITE).withItalic(false))); + } + + @Override + public String getArgText() { + return value ? "True" : "False"; + } + + @Override + public List getContextMenu() { + List contextMenuButtons = new ArrayList<>(); + + contextMenuButtons.add(new ContextMenuButton( + "Invert", + () -> this.value = !this.value + )); + + return contextMenuButtons; + } + + public boolean value() { + return value; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (ScriptBoolArgument) obj; + return this.value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + return "ScriptBoolArgument[" + + "value=" + value + ']'; + } + +} diff --git a/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptVariableArgument.java b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptVariableArgument.java index cb4a07c..22c5dd4 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptVariableArgument.java +++ b/src/main/java/io/github/techstreet/dfscript/script/argument/ScriptVariableArgument.java @@ -5,6 +5,7 @@ import io.github.techstreet.dfscript.script.action.ScriptActionArgument.ScriptActionArgumentType; import io.github.techstreet.dfscript.script.execution.ScriptTask; import io.github.techstreet.dfscript.script.values.ScriptValue; +import io.github.techstreet.dfscript.script.values.ScriptVariable; import io.github.techstreet.dfscript.util.ComponentUtil; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -31,6 +32,10 @@ public ScriptVariableArgument(String name, ScriptVariableScope scope) { @Override public ScriptValue getValue(ScriptTask task) { + return getVariable(task); + } + + public ScriptVariable getVariable(ScriptTask task) { return scope.getMap(task).getReference(name); } @@ -84,6 +89,7 @@ public String toString() { "name=" + name + ']'; } + @Override public List getContextMenu() { List contextMenuButtons = new ArrayList<>(); diff --git a/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBooleanSet.java b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBooleanSet.java new file mode 100644 index 0000000..975b91d --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBooleanSet.java @@ -0,0 +1,154 @@ +package io.github.techstreet.dfscript.script.conditions; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import io.github.techstreet.dfscript.screen.ContextMenuButton; +import io.github.techstreet.dfscript.script.*; +import io.github.techstreet.dfscript.script.action.ScriptActionArgument; +import io.github.techstreet.dfscript.script.argument.ScriptArgument; +import io.github.techstreet.dfscript.script.argument.ScriptVariableArgument; +import io.github.techstreet.dfscript.script.execution.ScriptActionContext; +import io.github.techstreet.dfscript.script.execution.ScriptTask; +import io.github.techstreet.dfscript.script.render.ScriptPartRender; +import io.github.techstreet.dfscript.script.render.ScriptPartRenderIconElement; +import io.github.techstreet.dfscript.script.values.ScriptBoolValue; +import io.github.techstreet.dfscript.util.chat.ChatUtil; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.text.MutableText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class ScriptBooleanSet extends ScriptParametrizedPart { + + public static String booleanSetName = "Set to Condition"; + public static ItemStack booleanSetIcon = new ItemStack(Items.PISTON); + + static { + booleanSetIcon.setCustomName(Text.literal(booleanSetName) + .fillStyle(Style.EMPTY + .withColor(Formatting.WHITE) + .withItalic(false))); + + NbtList lore = new NbtList(); + + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("Sets a variable to the result of a condition.").setStyle(Style.EMPTY.withColor(Formatting.GRAY).withItalic(false))))); + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("")))); + + MutableText t = ScriptActionArgument.ScriptActionArgumentType.VARIABLE.text(); + t.append(Text.literal(" - ").fillStyle(Style.EMPTY.withItalic(false).withColor(Formatting.GRAY))) + .append(Text.literal("Result").fillStyle(Style.EMPTY.withItalic(false).withColor(Formatting.WHITE))); + + lore.add(NbtString.of(Text.Serializer.toJson(t))); + + booleanSetIcon.getSubNbt("display") + .put("Lore", lore); + } + boolean hasElse = false; + + ScriptCondition condition; + + public ScriptBooleanSet(List arguments, ScriptCondition condition) { + super(arguments); + this.condition = condition; + } + + @Override + public void create(ScriptPartRender render, Script script) { + render.addElement(new ScriptPartRenderIconElement(getName(), getIcon())); + } + + @Override + public void run(ScriptTask task) { + if(getArguments().isEmpty()) { + ChatUtil.error("You need to add a variable argument to Set to Condition."); + return; + } + + ScriptArgument variableArg = getArguments().get(0); + + if(!(variableArg instanceof ScriptVariableArgument)) { + ChatUtil.error("You need to add a VARIABLE argument to Set to Condition."); + return; + } + + ScriptVariableArgument variable = (ScriptVariableArgument) variableArg; + + List conditionArguments = new ArrayList<>(); + for(int i = 1; i < getArguments().size(); i++) { + conditionArguments.add(getArguments().get(i)); + } + + ScriptActionContext actionCtx = new ScriptActionContext(task, conditionArguments); + boolean result = condition.run(actionCtx); + + variable.getVariable(task).set(new ScriptBoolValue(result)); + } + + public ScriptCondition getCondition() { + return condition; + } + + @Override + public List getContextMenu() { + List extra = new ArrayList<>(); + extra.add(new ContextMenuButton("Invert", () -> condition.invert())); + return extra; + } + + @Override + public ItemStack getIcon() { + ItemStack icon = booleanSetIcon.copy(); + + icon.setCustomName(Text.literal(getName()).setStyle(Style.EMPTY.withColor(Formatting.WHITE).withItalic(false))); + + NbtList lore = new NbtList(); + + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("Sets a variable to the result of a condition.").setStyle(Style.EMPTY.withColor(Formatting.GRAY).withItalic(false))))); + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("")))); + + MutableText t = ScriptActionArgument.ScriptActionArgumentType.VARIABLE.text(); + t.append(Text.literal(" - ").fillStyle(Style.EMPTY.withItalic(false).withColor(Formatting.GRAY))) + .append(Text.literal("Result").fillStyle(Style.EMPTY.withItalic(false).withColor(Formatting.WHITE))); + + lore.add(NbtString.of(Text.Serializer.toJson(t))); + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("")))); + + for (Text txt : condition.getLore()) { + lore.add(NbtString.of(Text.Serializer.toJson(txt))); + } + + icon.getSubNbt("display") + .put("Lore", lore); + + return icon; + } + + @Override + public String getName() { + return booleanSetName + ":" + condition.getName("", " NOT"); + } + + public static class Serializer implements JsonSerializer { + + @Override + public JsonElement serialize(ScriptBooleanSet src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + obj.addProperty("type", "booleanSet"); + obj.add("condition", context.serialize(src.condition)); + obj.add("arguments", context.serialize(src.getArguments())); + return obj; + } + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBuiltinCondition.java b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBuiltinCondition.java index 071ba47..acc6560 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBuiltinCondition.java +++ b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptBuiltinCondition.java @@ -9,8 +9,10 @@ import io.github.techstreet.dfscript.script.render.ScriptPartRender; import io.github.techstreet.dfscript.script.render.ScriptPartRenderIconElement; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; import java.lang.reflect.Type; +import java.util.List; public class ScriptBuiltinCondition extends ScriptCondition { ScriptConditionType type; @@ -41,6 +43,11 @@ public String getName(String prefix, String invertedPrefix) { return (isInverted() ? invertedPrefix : prefix) + " " + getType().getName(); } + @Override + public List getLore() { + return type.getLore(); + } + public ScriptBuiltinCondition setType(ScriptConditionType newType) { type = newType; diff --git a/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptCondition.java b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptCondition.java index f8220b9..907673b 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptCondition.java +++ b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptCondition.java @@ -6,8 +6,10 @@ import io.github.techstreet.dfscript.script.execution.ScriptActionContext; import io.github.techstreet.dfscript.script.render.ScriptPartRender; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; import java.lang.reflect.Type; +import java.util.List; public abstract class ScriptCondition { boolean inverted = false; @@ -32,6 +34,8 @@ public boolean run(ScriptActionContext ctx) { public abstract ItemStack getIcon(String prefix, String invertedPrefix); public abstract String getName(String prefix, String invertedPrefix); + public abstract List getLore(); + public static class Serializer implements JsonDeserializer { @Override diff --git a/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptConditionType.java b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptConditionType.java index ec6daa3..dab8058 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptConditionType.java +++ b/src/main/java/io/github/techstreet/dfscript/script/conditions/ScriptConditionType.java @@ -1,56 +1,29 @@ package io.github.techstreet.dfscript.script.conditions; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.google.gson.JsonParser; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; import io.github.techstreet.dfscript.DFScript; -import io.github.techstreet.dfscript.event.HudRenderEvent; -import io.github.techstreet.dfscript.event.system.CancellableEvent; -import io.github.techstreet.dfscript.script.ScriptGroup; import io.github.techstreet.dfscript.script.action.ScriptActionArgument; import io.github.techstreet.dfscript.script.action.ScriptActionArgument.ScriptActionArgumentType; import io.github.techstreet.dfscript.script.action.ScriptActionArgumentList; import io.github.techstreet.dfscript.script.action.ScriptActionCategory; -import io.github.techstreet.dfscript.script.argument.ScriptArgument; import io.github.techstreet.dfscript.script.execution.ScriptActionContext; -import io.github.techstreet.dfscript.script.menu.*; -import io.github.techstreet.dfscript.script.util.ScriptValueItem; -import io.github.techstreet.dfscript.script.util.ScriptValueJson; import io.github.techstreet.dfscript.script.values.*; import io.github.techstreet.dfscript.util.*; import io.github.techstreet.dfscript.util.chat.ChatUtil; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.client.sound.SoundManager; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.nbt.NbtList; import net.minecraft.nbt.NbtString; -import net.minecraft.network.packet.s2c.play.CommandTreeS2CPacket; -import net.minecraft.sound.SoundEvent; import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; -import net.minecraft.world.GameMode; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; -import java.util.regex.Pattern; -import java.util.stream.Collectors; public enum ScriptConditionType { @@ -325,6 +298,13 @@ public enum ScriptConditionType { .arg("Value", ScriptActionArgumentType.ANY) .action(ctx -> (ctx.value("Value") instanceof ScriptUnknownValue))), + IF_BOOLEAN_TRUE(builder -> builder.name("Boolean Is True") + .description("Checks if a boolean is true.") + .icon(Items.YELLOW_WOOL) + .category(ScriptActionCategory.CONDITIONS) + .arg("Value", ScriptActionArgumentType.BOOL) + .action(ctx -> ctx.value("Value").asBoolean())), + TRUE(builder -> builder.name("True") .description("Always executes.\nLiterally the only reason for this is so the\nlegacy deserializer code doesn't have to discard ELSEs\nthat aren't tied to a CONDITION...") .icon(Items.LIME_WOOL) @@ -339,7 +319,6 @@ public enum ScriptConditionType { private boolean hasChildren = false; private ScriptActionCategory category = ScriptActionCategory.MISC; private List description = new ArrayList(); - private ScriptGroup group = ScriptGroup.ACTION; private ScriptConditionType deprecated = null; //if deprecated == null, the action is not deprecated private final ScriptActionArgumentList arguments = new ScriptActionArgumentList(); @@ -357,31 +336,8 @@ public ItemStack getIcon(String prefix) { NbtList lore = new NbtList(); - if(isDeprecated()) - { - lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("This action is deprecated!") - .fillStyle(Style.EMPTY - .withColor(Formatting.RED) - .withItalic(false))))); - lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("Use '" + deprecated.getName() + "'") - .fillStyle(Style.EMPTY - .withColor(Formatting.RED) - .withItalic(false))))); - } - - for (String descriptionLine: description) { - lore.add(NbtString.of(Text.Serializer.toJson(Text.literal(descriptionLine) - .fillStyle(Style.EMPTY - .withColor(Formatting.GRAY) - .withItalic(false))))); - } - - lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("")))); - - for (ScriptActionArgument arg : arguments) { - for (Text txt : arg.text()) { - lore.add(NbtString.of(Text.Serializer.toJson(txt))); - } + for (Text txt : getLore()) { + lore.add(NbtString.of(Text.Serializer.toJson(txt))); } item.getSubNbt("display") @@ -395,10 +351,42 @@ public ItemStack getIcon(String prefix) { return item; } + public String getName() { return name; } + public List getLore() { + List lore = new ArrayList<>(); + + if(isDeprecated()) + { + lore.add(Text.literal("This action is deprecated!") + .fillStyle(Style.EMPTY + .withColor(Formatting.RED) + .withItalic(false))); + lore.add(Text.literal("Use '" + deprecated.getName() + "'") + .fillStyle(Style.EMPTY + .withColor(Formatting.RED) + .withItalic(false))); + } + + for (String descriptionLine: description) { + lore.add(Text.literal(descriptionLine) + .fillStyle(Style.EMPTY + .withColor(Formatting.GRAY) + .withItalic(false))); + } + + lore.add(Text.literal("")); + + for (ScriptActionArgument arg : arguments) { + lore.addAll(arg.text()); + } + + return lore; + } + public boolean isDeprecated() { return deprecated != null; } diff --git a/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEvent.java b/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEvent.java index 310ef48..80ffd7b 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEvent.java +++ b/src/main/java/io/github/techstreet/dfscript/script/event/ScriptEvent.java @@ -5,9 +5,6 @@ import io.github.techstreet.dfscript.screen.widget.CScrollPanel; import io.github.techstreet.dfscript.screen.widget.CText; import io.github.techstreet.dfscript.script.Script; -import io.github.techstreet.dfscript.script.ScriptGroup; -import io.github.techstreet.dfscript.script.ScriptPart; -import io.github.techstreet.dfscript.script.ScriptSnippet; import net.minecraft.text.Text; import java.lang.reflect.Type; diff --git a/src/main/java/io/github/techstreet/dfscript/script/options/ScriptBoolOption.java b/src/main/java/io/github/techstreet/dfscript/script/options/ScriptBoolOption.java index 18a1660..a5af17b 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/options/ScriptBoolOption.java +++ b/src/main/java/io/github/techstreet/dfscript/script/options/ScriptBoolOption.java @@ -7,6 +7,7 @@ import io.github.techstreet.dfscript.screen.widget.CTexturedButton; import io.github.techstreet.dfscript.script.action.ScriptActionArgument; import io.github.techstreet.dfscript.script.argument.ScriptTextArgument; +import io.github.techstreet.dfscript.script.values.ScriptBoolValue; import io.github.techstreet.dfscript.script.values.ScriptTextValue; import io.github.techstreet.dfscript.script.values.ScriptValue; import net.minecraft.item.Item; @@ -24,20 +25,20 @@ public ScriptBoolOption() {} @Override public ScriptValue getValue() { - return new ScriptTextValue(value ? "true" : "false"); + return new ScriptBoolValue(value); } @Override public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg) { - return ScriptActionArgument.ScriptActionArgumentType.TEXT.convertableTo(arg); + return ScriptActionArgument.ScriptActionArgumentType.BOOL.convertableTo(arg); } @Override public int create(CScrollPanel panel, int x, int y, int width) { - CTexturedButton button = new CTexturedButton(x, y, 8, 8, getTexture(), null, 0, 0, 1, 0.5f, 0, 0.5f); + CTexturedButton button = new CTexturedButton(x, y, 8, 8, getTexture(), getHighlightedTexture(), null); button.setOnClick(() -> { value = !value; - button.setTexture(getTexture()); + button.setTexture(getTexture(), getHighlightedTexture()); }); panel.add(button); @@ -47,6 +48,9 @@ public int create(CScrollPanel panel, int x, int y, int width) { private String getTexture() { return DFScript.MOD_ID + (value ? ":on_button.png" : ":off_button.png"); } + private String getHighlightedTexture() { + return DFScript.MOD_ID + (value ? ":on_button_highlight.png" : ":disable_highlight.png"); + } @Override public JsonElement getJsonElement() { diff --git a/src/main/java/io/github/techstreet/dfscript/script/options/ScriptLegacyBoolOption.java b/src/main/java/io/github/techstreet/dfscript/script/options/ScriptLegacyBoolOption.java new file mode 100644 index 0000000..0bdc744 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/script/options/ScriptLegacyBoolOption.java @@ -0,0 +1,55 @@ +package io.github.techstreet.dfscript.script.options; + +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import io.github.techstreet.dfscript.DFScript; +import io.github.techstreet.dfscript.screen.widget.CScrollPanel; +import io.github.techstreet.dfscript.screen.widget.CTexturedButton; +import io.github.techstreet.dfscript.script.action.ScriptActionArgument; +import io.github.techstreet.dfscript.script.values.ScriptTextValue; +import io.github.techstreet.dfscript.script.values.ScriptValue; + +public class ScriptLegacyBoolOption implements ScriptOption { + + boolean value = false; + + public ScriptLegacyBoolOption(JsonElement value) { + this.value = value.getAsBoolean(); + } + + public ScriptLegacyBoolOption() {} + + @Override + public ScriptValue getValue() { + return new ScriptTextValue(value ? "true" : "false"); + } + + @Override + public boolean convertableTo(ScriptActionArgument.ScriptActionArgumentType arg) { + return ScriptActionArgument.ScriptActionArgumentType.TEXT.convertableTo(arg); + } + + @Override + public int create(CScrollPanel panel, int x, int y, int width) { + CTexturedButton button = new CTexturedButton(x, y, 8, 8, getTexture(), getHighlightedTexture(), null); + button.setOnClick(() -> { + value = !value; + button.setTexture(getTexture(), getHighlightedTexture()); + }); + panel.add(button); + + return y + 10; + } + + private String getTexture() { + return DFScript.MOD_ID + (value ? ":on_button.png" : ":off_button.png"); + } + private String getHighlightedTexture() { + return DFScript.MOD_ID + (value ? ":on_button_highlight.png" : ":disable_highlight.png"); + } + + @Override + public JsonElement getJsonElement() { + return new JsonPrimitive(value); + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/script/options/ScriptOptionEnum.java b/src/main/java/io/github/techstreet/dfscript/script/options/ScriptOptionEnum.java index a558133..294dde8 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/options/ScriptOptionEnum.java +++ b/src/main/java/io/github/techstreet/dfscript/script/options/ScriptOptionEnum.java @@ -16,16 +16,19 @@ public enum ScriptOptionEnum { INT("Integer", "A single option, must be an int.", Items.SLIME_BALL, ScriptIntOption.class), FLOAT("Floating-Point", "A single option, must be an int or a float.", Items.SLIME_BLOCK, ScriptFloatOption.class), KEY("Key", "A single option, acts as a key bind.", Items.STONE_BUTTON, ScriptKeyOption.class), - BOOL("Boolean", "A true/false option. Returns either \"true\" or \"false\".", Items.LEVER, ScriptBoolOption.class), + BOOL("Boolean", "A true/false option.", Items.LEVER, ScriptBoolOption.class), + OLD_BOOL("Boolean (Legacy)", "A true/false option. Returns either \"true\" or \"false\".", Items.LEVER, ScriptLegacyBoolOption.class, 0, BOOL), DUAL("Dual", "Two values, two types", Items.HOPPER, ScriptDualOption.class, 2), LIST("List", "A list of values, can contain a single type", Items.CHEST, ScriptListOption.class, 1), DICTIONARY("Dictionary", "A dictionary of values, two types", Items.CHEST_MINECART, ScriptDictionaryOption.class, 2); - String name; - String description; - Item icon; - Class optionType; - int extraTypes; + final String name; + final String description; + final Item icon; + final Class optionType; + final int extraTypes; + + final ScriptOptionEnum deprecate; ScriptOptionEnum(String name, String description, Item icon, Class optionType) { this.name = name; @@ -33,6 +36,7 @@ public enum ScriptOptionEnum { this.icon = icon; this.optionType = optionType; this.extraTypes = 0; + this.deprecate = null; } ScriptOptionEnum(String name, String description, Item icon, Class optionType, int extraTypes) { @@ -41,6 +45,16 @@ public enum ScriptOptionEnum { this.icon = icon; this.optionType = optionType; this.extraTypes = extraTypes; + this.deprecate = null; + } + + ScriptOptionEnum(String name, String description, Item icon, Class optionType, int extraTypes, ScriptOptionEnum deprecate) { + this.name = name; + this.description = description; + this.icon = icon; + this.optionType = optionType; + this.extraTypes = extraTypes; + this.deprecate = deprecate; } public ItemStack getIcon() @@ -93,4 +107,8 @@ public static ScriptOptionEnum fromClass(Class name) { throw new InvalidParameterException("Unknown option class: " + name.getName()); } + + public boolean isDeprecated() { + return deprecate != null; + } } diff --git a/src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptRepetitionType.java b/src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptRepetitionType.java index ac7dc52..39609e1 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptRepetitionType.java +++ b/src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptRepetitionType.java @@ -1,7 +1,5 @@ package io.github.techstreet.dfscript.script.repetitions; -import io.github.techstreet.dfscript.DFScript; -import io.github.techstreet.dfscript.script.ScriptGroup; import io.github.techstreet.dfscript.script.action.ScriptActionArgument; import io.github.techstreet.dfscript.script.action.ScriptActionArgument.ScriptActionArgumentType; import io.github.techstreet.dfscript.script.action.ScriptActionArgumentList; @@ -10,7 +8,6 @@ import io.github.techstreet.dfscript.script.values.ScriptNumberValue; import io.github.techstreet.dfscript.script.values.ScriptTextValue; import io.github.techstreet.dfscript.script.values.ScriptValue; -import io.github.techstreet.dfscript.util.FileUtil; import io.github.techstreet.dfscript.util.chat.ChatUtil; import net.minecraft.enchantment.Enchantments; import net.minecraft.item.Item; @@ -22,8 +19,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; diff --git a/src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptWhile.java b/src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptWhile.java new file mode 100644 index 0000000..f345136 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/script/repetitions/ScriptWhile.java @@ -0,0 +1,112 @@ +package io.github.techstreet.dfscript.script.repetitions; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import io.github.techstreet.dfscript.screen.ContextMenuButton; +import io.github.techstreet.dfscript.script.Script; +import io.github.techstreet.dfscript.script.action.ScriptActionArgument; +import io.github.techstreet.dfscript.script.argument.ScriptArgument; +import io.github.techstreet.dfscript.script.conditions.ScriptCondition; +import io.github.techstreet.dfscript.script.execution.ScriptActionContext; +import io.github.techstreet.dfscript.script.execution.ScriptTask; +import io.github.techstreet.dfscript.script.render.ScriptPartRender; +import io.github.techstreet.dfscript.script.render.ScriptPartRenderIconElement; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.text.MutableText; +import net.minecraft.text.Style; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class ScriptWhile extends ScriptRepetition { + + public static String whileName = "Repeat While"; + public static ItemStack whileIcon = new ItemStack(Items.GOLD_NUGGET); + + static { + whileIcon.setCustomName(Text.literal(whileName) + .fillStyle(Style.EMPTY + .withColor(Formatting.WHITE) + .withItalic(false))); + + NbtList lore = new NbtList(); + + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("Repeats while a condition is true.").setStyle(Style.EMPTY.withColor(Formatting.GRAY).withItalic(false))))); + + whileIcon.getSubNbt("display") + .put("Lore", lore); + } + private ScriptCondition condition; + + public ScriptWhile(List arguments, ScriptCondition condition) { + super(arguments); + this.condition = condition; + } + + @Override + public void create(ScriptPartRender render, Script script) { + render.addElement(new ScriptPartRenderIconElement(getName(), getIcon())); + + super.create(render, script); + } + + @Override + public ItemStack getIcon() { + ItemStack icon = whileIcon.copy(); + + icon.setCustomName(Text.literal(getName()).setStyle(Style.EMPTY.withColor(Formatting.WHITE).withItalic(false))); + + NbtList lore = new NbtList(); + + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("Repeats while a condition is true.").setStyle(Style.EMPTY.withColor(Formatting.GRAY).withItalic(false))))); + lore.add(NbtString.of(Text.Serializer.toJson(Text.literal("")))); + + for (Text txt : condition.getLore()) { + lore.add(NbtString.of(Text.Serializer.toJson(txt))); + } + + icon.getSubNbt("display") + .put("Lore", lore); + + return icon; + } + + @Override + public String getName() { + return whileName + ":" + condition.getName("", " NOT"); + } + + @Override + public List getContextMenu() { + List extra = new ArrayList<>(); + extra.add(new ContextMenuButton("Invert", () -> condition.invert())); + return extra; + } + + @Override + public boolean checkCondition(ScriptTask task) { + ScriptActionContext ctx = new ScriptActionContext(task, getArguments()); + return condition.run(ctx); + } + + public static class Serializer implements JsonSerializer { + + @Override + public JsonElement serialize(ScriptWhile src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + obj.addProperty("type", "while"); + obj.add("condition", context.serialize(src.condition)); + obj.add("arguments", context.serialize(src.getArguments())); + obj.add("snippet", context.serialize(src.container().getSnippet(0))); + return obj; + } + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/script/util/ScriptValueJson.java b/src/main/java/io/github/techstreet/dfscript/script/util/ScriptValueJson.java index 15b0c4e..fde0509 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/util/ScriptValueJson.java +++ b/src/main/java/io/github/techstreet/dfscript/script/util/ScriptValueJson.java @@ -1,16 +1,8 @@ package io.github.techstreet.dfscript.script.util; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import io.github.techstreet.dfscript.script.values.ScriptDictionaryValue; -import io.github.techstreet.dfscript.script.values.ScriptListValue; -import io.github.techstreet.dfscript.script.values.ScriptNumberValue; -import io.github.techstreet.dfscript.script.values.ScriptTextValue; -import io.github.techstreet.dfscript.script.values.ScriptUnknownValue; -import io.github.techstreet.dfscript.script.values.ScriptValue; +import com.google.gson.*; +import io.github.techstreet.dfscript.script.values.*; + import java.util.ArrayList; import java.util.HashMap; @@ -21,7 +13,9 @@ public static JsonElement toJson(ScriptValue value) { return new JsonPrimitive(snv.asNumber()); } else if (value instanceof ScriptTextValue stv) { return new JsonPrimitive(stv.asText()); - } else if (value instanceof ScriptListValue slv) { + } else if (value instanceof ScriptBoolValue sbv) { + return new JsonPrimitive(sbv.asBoolean()); + }else if (value instanceof ScriptListValue slv) { JsonArray array = new JsonArray(); for (ScriptValue sv : slv.asList()) { array.add(toJson(sv)); @@ -45,6 +39,8 @@ public static ScriptValue fromJson(JsonElement element) { return new ScriptNumberValue(primitive.getAsNumber().doubleValue()); } else if (primitive.isString()) { return new ScriptTextValue(primitive.getAsString()); + } else if (primitive.isBoolean()) { + return new ScriptBoolValue(primitive.getAsBoolean()); } else { return new ScriptUnknownValue(); } diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptBoolValue.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptBoolValue.java new file mode 100644 index 0000000..dc48781 --- /dev/null +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptBoolValue.java @@ -0,0 +1,67 @@ +package io.github.techstreet.dfscript.script.values; + +import com.google.gson.*; + +import java.lang.reflect.Type; + +public class ScriptBoolValue extends ScriptValue { + + private final boolean value; + + public ScriptBoolValue(boolean value) { + this.value = value; + } + + @Override + String typeName() { + return "Boolean"; + } + + @Override + public String asText() { + return value ? "true" : "false"; + } + + @Override + public double asNumber() { + return value ? 1 : 0; + } + + @Override + public boolean asBoolean() { + return value; + } + + @Override + public boolean valueEquals(ScriptValue other) { + if (!(other.get() instanceof ScriptNumberValue) + && !(other.get() instanceof ScriptUnknownValue)) { + return false; + } + return other.asBoolean() == value; + } + + @Override + public String formatAsText() { + return value ? "True" : "False"; + } + + public static class Serializer implements JsonSerializer, JsonDeserializer { + @Override + public ScriptBoolValue deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException { + if(jsonElement.isJsonPrimitive()) { + JsonPrimitive prim = jsonElement.getAsJsonPrimitive(); + if(prim.isBoolean()) { + return new ScriptBoolValue(prim.getAsBoolean()); + } + } + + throw new JsonParseException("Unable to convert the json into a script text value!"); + } + + @Override + public JsonElement serialize(ScriptBoolValue scriptValue, Type type, JsonSerializationContext context) { + return new JsonPrimitive(scriptValue.value); + } + } +} diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptDictionaryValue.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptDictionaryValue.java index db5e7ca..cd52a00 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptDictionaryValue.java +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptDictionaryValue.java @@ -52,6 +52,11 @@ public String asText() { return value.toString(); } + @Override + public boolean asBoolean() { + return !value.isEmpty(); + } + @Override public ScriptValue getCompareValue() { HashMap dict = asDictionary(); diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptListValue.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptListValue.java index 87b7c9d..5c0a777 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptListValue.java +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptListValue.java @@ -47,6 +47,11 @@ public String asText() { return value.toString(); } + @Override + public boolean asBoolean() { + return !value.isEmpty(); + } + @Override public ScriptValue getCompareValue() { return asList().get(0).getCompareValue(); diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptNumberValue.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptNumberValue.java index 5ff9cb2..418ed36 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptNumberValue.java +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptNumberValue.java @@ -43,6 +43,11 @@ public String asText() { return String.valueOf(value); } + @Override + public boolean asBoolean() { + return value != 0; + } + @Override public int compare(ScriptValue other) { if(other instanceof ScriptNumberValue) { diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptTextValue.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptTextValue.java index 1801547..086c962 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptTextValue.java +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptTextValue.java @@ -22,6 +22,11 @@ public String asText() { return value; } + @Override + public boolean asBoolean() { + return !value.equals(""); + } + @Override public boolean valueEquals(ScriptValue other) { return other.asText().equals(value); diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptUnknownValue.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptUnknownValue.java index 07e1433..3c0cfc4 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptUnknownValue.java +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptUnknownValue.java @@ -36,6 +36,11 @@ public double asNumber() { return 0; } + @Override + public boolean asBoolean() { + return false; + } + public int compare(ScriptValue other) { return 0; } diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptValue.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptValue.java index 70e3368..a633b91 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptValue.java +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptValue.java @@ -28,6 +28,10 @@ public HashMap asDictionary() { throw new UnsupportedOperationException("Cannot convert " + typeName() + " to directory"); } + public boolean asBoolean() { + throw new UnsupportedOperationException("Cannot convert " + typeName() + " to directory"); + } + public ScriptValue get() { return this; } @@ -65,6 +69,9 @@ public ScriptValue deserialize(JsonElement jsonElement, Type type, JsonDeseriali if(prim.isString()) { return context.deserialize(prim, ScriptTextValue.class); } + if(prim.isBoolean()) { + return context.deserialize(prim, ScriptBoolValue.class); + } } else { if(jsonElement.isJsonArray()) { diff --git a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptVariable.java b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptVariable.java index e5f7379..6b22566 100644 --- a/src/main/java/io/github/techstreet/dfscript/script/values/ScriptVariable.java +++ b/src/main/java/io/github/techstreet/dfscript/script/values/ScriptVariable.java @@ -28,22 +28,31 @@ public void set(ScriptValue value) { this.value = value; } + @Override public String asText() { return get().asText(); } + @Override public double asNumber() { return get().asNumber(); } + @Override public List asList() { return get().asList(); } + @Override public HashMap asDictionary() { return get().asDictionary(); } + @Override + public boolean asBoolean() { + return get().asBoolean(); + } + @Override String typeName() { return "Variable"; diff --git a/src/main/java/io/github/techstreet/dfscript/util/RenderUtil.java b/src/main/java/io/github/techstreet/dfscript/util/RenderUtil.java index 1b33d27..46b99b3 100644 --- a/src/main/java/io/github/techstreet/dfscript/util/RenderUtil.java +++ b/src/main/java/io/github/techstreet/dfscript/util/RenderUtil.java @@ -43,33 +43,36 @@ public static void renderImage(DrawContext context, int x, int y, int width, int } public static void renderButton(DrawContext context, int x, int y, int width, int height, boolean hovered, boolean disabled) { - final String image = "textures/gui/widgets.png"; - final int textureWidth = 256; - final int textureHeight = 256; - final int padding = 3; - int x1 = 0; - int y1 = 66; + String image = "textures/gui/sprites/widget/button.png"; if (disabled) { - y1 = 46; - } else if (hovered) { - y1 = 86; + image = "textures/gui/sprites/widget/button_disabled.png"; } + else if (hovered) { + image = "textures/gui/sprites/widget/button_highlighted.png"; + } + final int textureWidth = 200; + final int textureHeight = 20; + final int padding = 3; + int x1 = 0; + int y1 = 0; int x2 = 200; int y2 = y1 + 20; renderContinuousTexture(context, x, y, width, height, image, x1, y1, x2, y2, textureWidth, textureHeight, padding,1); } - public static void renderCustomButton(DrawContext context, int x, int y, int width, int height, boolean hovered, boolean disabled, String image) { - final int textureWidth = 256; - final int textureHeight = 256; + public static void renderCustomButton(DrawContext context, int x, int y, int width, int height, boolean hovered, boolean disabled, String image, String disabledImage, String highlightedImage) { + final int textureWidth = 200; + final int textureHeight = 20; final int padding = 3; - int x1 = 0; - int y1 = 66; + String imageUsed = image; if (disabled) { - y1 = 46; - } else if (hovered) { - y1 = 86; + imageUsed = disabledImage; } + else if (hovered) { + imageUsed = highlightedImage; + } + int x1 = 0; + int y1 = 0; int x2 = 200; int y2 = y1 + 20; renderContinuousTexture(context, x, y, width, height, image, x1, y1, x2, y2, textureWidth, textureHeight, padding,1); diff --git a/src/main/java/io/github/techstreet/dfscript/util/render/BlendableTexturedButtonWidget.java b/src/main/java/io/github/techstreet/dfscript/util/render/BlendableTexturedButtonWidget.java index fdd0043..7de7370 100644 --- a/src/main/java/io/github/techstreet/dfscript/util/render/BlendableTexturedButtonWidget.java +++ b/src/main/java/io/github/techstreet/dfscript/util/render/BlendableTexturedButtonWidget.java @@ -2,20 +2,23 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.ButtonTextures; +import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TexturedButtonWidget; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.screen.ScreenTexts; import net.minecraft.text.Text; import net.minecraft.util.Identifier; public class BlendableTexturedButtonWidget extends TexturedButtonWidget { - public BlendableTexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, Identifier texture, PressAction pressAction) { - super(x, y, width, height, u, v, hoveredVOffset, texture, 256, 256, pressAction); + public BlendableTexturedButtonWidget(int x, int y, int width, int height, Identifier unfocused, Identifier focused, PressAction pressAction) { + super(x, y, width, height, new ButtonTextures(unfocused, focused), pressAction); } - public BlendableTexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, Identifier texture, int textureWidth, int textureHeight, PressAction pressAction) { + /*public BlendableTexturedButtonWidget(int x, int y, int width, int height, Identifier unfocused, Identifier focused, int textureWidth, int textureHeight, PressAction pressAction) { super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, Text.empty()); - } + }*/ // public BlendableTexturedButtonWidget(int i, int j, int k, int l, int m, int n, int o, Identifier identifier, int p, int q, PressAction pressAction, Text text) { // super(i, j, k, l, m, n, o, identifier, p, q, pressAction, EMPTY, text); diff --git a/src/main/resources/assets/dfscript/delete.png b/src/main/resources/assets/dfscript/delete.png index ed07c12895ae1fa0cfc35f4f8d87e2db3e3ae009..c83c525652aa35b25c345a73db956bdd29b1498a 100644 GIT binary patch literal 11404 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 qSV6bS2q&!2aLyD)% delta 889 zcmV-<1BU#JS%U|V7k?-S1^@s6{xRCy00001b5ch_0Itp)=>Px&JxN4CR7i=C!*JEiwKPZNV$=LP~H*h_!JS zZQ3}cp&J{cI-{%tvPSc9yBOUojYomdsx$}0Vdm<*=RF^DUw;7@7HAq^Z*Q-5kmor7 zN~zZd3n4J3SfEdaK*wn`AK@jPz|m}MEp7zT0d z{&anFlm1`lCBWJ$fP4Pq>2Hoek|eHO4$$`Pvrj)kDaC_FkNNWEO~=qO`(ksGD2n*% z)-681`cbVN0It@eD3DT86oosyv$Mmm$H)Be{dWvr4u80_v%|r|hwi-9YO%JqRsqyd z?vtI85W@9uFkxtI_BlzC$_gb(GG%Ct!5D)Of<~hOl!LJAVu5C-9s~heYgbti1l5x5 z){jOb$1w2yGW!Jh?Ch+Hs7Z(>*z}a22 z_D*Y+=6{u@^B-KjM)OLuQZ~S7G^&>@rNsArHx!ue-(_#X?7Gd8aUX7$WfgYcezOh0 zk9Y6R^|LW{pbpUPp7q^Mn;-~ClEnGh5@)Ll!;s-{=vZoiqoX7G{k{XW*@7S-&vQJ_ zbDx(@qLivl-Su!hSqlK)_gP+Ep00tE7-Nu9B7cM+3`3MsmBe;+00fJc0DF%u3=m*{ zf4_EM2Q+U#t<7pmuh(OHdwaSzyz3Q~b%rp`jG@g=&gz^o`H2qm<&_{e%BU zQ*zqvHl0qV0=O_uu{Zs~G{wffy_zx{4y%CwR#R#vzulT*ub}@#Q}R5=_kH)vvWzec zT~eDwYyD=L5(EJ&D=RLeQVL@XN-2a8EG;dewIOH_7w7@B2LK_xloW1Y+y6^ki*WT-#vm>-Ll}U;35(5ALQdJd2 zZS48>uY-^P`yU;_KneiRDSGP~Vzi+iOfD#-4Z;!5gz<8LGr>I(HUNO)nqR)2p#(<ZON@C=Wa7H zmzh=bgw5SXl9{fe7MVUAiwBct6{z;T@y2)2VKS%Ud*kB!Bw=#?)uY`3p?7#8<5%9J zG?l*R*8W%Lr`x>9Y?IHTtlcp?ZT|kLyIVnLo-uv_)k8y%jyBhs(_L*222M|#CVCty zQ}uKi1>Jn94~;)wMx5QP94_1M8e7ghp`&Hlk_nYbE#3}!Uw<}tG71r-_TXI^5E$nH z9v?eP=p4A4i~I<#nQOd&y7yAgW}dGfcJrj0x^}>Qr|V{0su|IOXEk58C;d&<20C2I zKqQ4OCz~>p3({3d+U+Tl0aKA)Mh{>>QZG%52GW?6Lt2pIwYE#&t4IEBo&r4|)#8Gn zvv>0F_apF}C1+e=i)X!Z@gINyj^**d-dNK4MbJu6#G2*=2TZ{FgIr>X$+}a=H4Z$< zl>Ea%CExgR^8wc0?-iEyFl*e5*uDiDh&XuW(U z9Yza_#O+Em-7_HODoj9em)Ioxk%_M*p!pi8P3Uv(sPUAnYO9quR|}!OYJrDHK5bCk*=z)0-KZ11#@h_MidFp1JUG2>#p3}5V2W&Q|SDdL2T^!6J&FQ!m z{CvJ!=SF!;zKQWE9Z2L_HJSsfM^uY1Y<{n)EOYwG?>7%06t-{OqUErzn=o7MK^(%3 zjmiez4c+?M-`cf3q2Yy@Z+0{pHOsmy=^MUiQ^!LAaLH7yY)~`o)6Ei~rZp+k@NGZw z_@)8AHtrg_o@sfMJX!jp)tuyJfEQ@|u=#vz&Tz>~((^zXXZ-yTSJf&o0*p^^nG*8p zJyGaTs72bl_aSFLe$KA+;SE3$WE-%H1x^=;iTdev^a=7qTdT>{!riM==ZgS`^UbEi ztIQt^z|*p-v&P-M+TBgRFBffLbJ;Zh7j;!H%{fKQX!%~$z5I~C+pAYp&18gPb2l!j z?fVfM;ks741vHs?9lvHt+z|I39b4K$zK9miA>kM$P&i$E71NdW8U3T5klM8=&PZD@ zmqXi7q$f%YKN}I9P=)V8Z@7v~R_v)HVAm}4>K{(dDc!9Vc|d*R128nYU?6=uv#MQB z&FX>wz+=PCqt)l%6N~05NC--o2j735s!ORL9RBvL-;JQoIO^=928obal9{jZ>lg=_ zsmXgeoG-0M9O$aRp6HXywILc4(wpW(77GN$hhC?&0UHQ#VbM^2gIg0kBSczZ?r@~p zhuHGxfuvC0h2LI^6S*w(B7^FPG?eyr>4lr8(x=Wj#+AOLHow6e#)%ChGe~RAv*@6> z^#ZRkX?>BofSQo`)C0}#H}Z2(2x05J^g{azqv^IiQOQG(t4n*%<5A5?;1d7kMaC`- z`Oee2;I`(&dqmgGNv>e6J25SOzI5N%TulP#j=oVF^Jj14haD@$9s_GL505G&XF1JH zcI8c_96ITk-{SDcToS()?xXM&AkFUKJh6GELspgs87F?IKKf)UQ%Z80N;V}PPQ9)5 zetaOTSm0W(Kp47!hG+c#HwP4Z!CuVB$!Ti$qq|Sd3n$(`9_F(jXgw3+fZI zQtCi0iS|FQYj9cf+^JkSO5?i6P_Ac%_f#53XmzCQ+#e?lj~<$@-?K3FZmL?W`b2;G zlYkTR_Q>9uIKg{daQ8mO&Ou`icO-CtE0g{~RW3$b#FtEAo>wL3wi&aMG(n&OwWyo} znjnH?Mh%kvsd48SHG$~aL4)M1G7+2Fm@Hm$JF2=2LxPHbY8lBxaT^Jyq`R*`E`z=% z54QBISL~=RW#}fnnBdEf8)((-E^g&0<2R&Idlu~(l>H+NnNW!FiPVN##cDJbczCmw`1itHhr^MRkGCHDZ9aN{|W>)cZ<@i)hmlBX4Ur1~xpC%iv ziNmWngX5RiP>%s+u?L=Q%ZAF|+I%MVaE}4c;I!6iof&Ani^L~s0=`J+JD0=!G@tMDo3Nmi0fwx4sAx5{EspOPOzxkGS^d=aX$+< ztwSy%g#t}1qVVt?xGqd<&;^MM&N&%V-c>a@{ErxU@y^9E(7{fN9}Fp$MS-bfH=1XJ-(ze8W4#sz7Yo#8}-%BUbR$BNqf^8 zX>&0*%bkGUh9?pf&`kIAn$N3JqNMGQYJ+2CXae()KMQ>$CE+8gsU0y{uZUO`<>;qB zaE^Y6N$^f2oI-#jzFSSHvk={SG5$uFkg#fni08VIuAZY`b$M7%Rt`CniqHlw^UxWx zF5WwT{-__?glEmoPUMV%t%knt=#6hu?Rr=faru0;#I3H*D>8PbwjE!S;UGzgmqPRw zcs?ObpiIxxu~R)N!N3uiU7SW})f-OWC2t)c>lNqxS)C=;io~B8cX`f5o?4WrX0;pCoj26;iC+vKo}wbG z{GvtfXN07YuX{n8D}M6%wbHiLqwbfnPoo65h~BH*dZ=Ma=BpuZG%PTa9v<4dhvTwD zilTGb7rf5BJj{0c@L?P{h^g<1sxs32`q(RO!Y+YZvy1GMNIa=MC0co$5WWftMVwf1 z!{gxxTVlE%`sm(w=BfdwtQ?zEz)UMvXV*p{jz*2nEiJjs_FPxcwt8M7n@1y4{;M;mYYBfk0?^U0bp1>Wi3Ct`2DJ4Js$J2MJ;>g(BdPXEAnVxR9_ zlL7gRPWv|57$`JE$NIDE;U1kzEf=5m-m4cw+45wNOmT{_XiQp`(YU9J_Vh;&SH+UD-hq%fp;A9?hD*c9-5tG1I4(yZB3F2&?H^X7O(zIXWeF%YxUZ_Xi z!jZpih>j+lp_m|CYMVAcmt+XNrY5N9dldG1|#{o(AyP zV$i=!@igVd$-~0vZQX!=Zzgr@I%Ufk2ze$^?%?{5EiTXLF3pU)iiTCJn^q8ivK;kC6VfSecer&0XrPSkW+_>{14Fvm+$%CsE`*Ec5O!s zO>BajT-XVFaVAar+k5(|KIw22-Y>b4oL5dr(pam_=n9Hldc1ycOy)+I!069 zz8WYCkEGQ=Ty99{LVDd}nr%zH3GnQ_v@K}l%*>YEa9oZ^JP0L?sjEz8DH1w}? zffva@`-Tz{REzSvy1U|ImhL@Mn1R-Gp^9u&csyZ@8WHUP@eBH!>IJBFioi5;wFMP| zyc=r%nLni{)(c!rUx3zsKjK`<7Dcz3N`QwFs_( z59POqor;Ywe3@u|dbTLEle0a!#T4IJ^J#zJO$EtHT>cZC+y}{{Z{hp?p=Kf(5}@Hv z&=53WrkB$q+t;cS_q%cK`VNtACW#G+3q@7l6Hh1qk1Y6jFB)&TuzJo&1(D+_7w6dT zB=a05^gHAp(5evIvoJ8!MD|y|e7EUDk!fV?7wD<`Afi~}<;AU^<5F5t>#8&Ga|y_l z!j92uIArwV`m{lq5*q^1*})WdpSHPE?m|JA+yDX4W{F5hcEh)j63e@YHx1_gQ0^B$ zM=E!DqAGiL8CLXE85qOszB!|+dGj9g+@brSW_2A{_;9varuUrtMRF+{k0;G|GpXf* zw=)5-(EI6GHF)=FXT#-~l-6>wc46ZW$#aeLOLnJ<9j|NgcfUT&=4FSN-5t*0qT3x( zuqiGRrN?`3-SzV=_%`<~A%3?LpL;`VrYW544V?KcQK104b~8DDwE#KWm4xx2@r8ets&{Jf;=6LmDV*RlD%o&$P08 z*gu4fI)(Q|dtdDATU$}}i(a;vl1bUFilWe&lJlu{F%J{+>yzePw32l^qLV4v~5fVA9dc7G%K_sE9DH}PMm+d?v<(q9!72=hX+eQG0I1}_R zN?lqCm=iq=0Lt^_h66Z=>_~v-HR}mkXCWWBWRhP;-(l(^Ny|9TB3y8syS8{6H@sCl zGN{ZuyvN}4maq7<{P{!Ktr4A@#E*z5qTC`$bzN|QGq3x2sO?2J`HbKAm=q%PB?{}l zRWx9i;~PCGMBeE*!c&g}-0y7#hbSn9_3QQAV7t9bu2>weUPb8^{I(^s5u#)Abu;Vb z3m3Gnep!I|tBSUjNb2xNea}b2L{DGIeJe_e&17)!SdYwyN{eNzO%D~Aiybtayh+7 z%Y-_$4@?0*IZLOtl-RE#aaR)`FIBiHpbqWTsuxB}Z)Qf;^4=sF`Too@(S2S{kU`-V z{*@bWSla%jMB8xNE1XB|3q8D;K<1r$E&{jElm~&26OHYNSNy&aSN_m@r`t)v7v5I^_9_1IM51EfFGTZLy#al)zyBsAq4`HK{C)gx66z? zvi%C?5M0(|uce|LY69R95MqZ5EyE$ck($=cva9B22Xs$A^Za0m2$MLq-#ud-F!g2W zb!F*pt97zy`CPi9m@xZ2jC-pvs!lNaKxaxz#Aa6cX3_&mf*spyCtUJQ*&1@s>_ios zv~dU3zlb`4-zH4#zN$atd&sWTa$;FRCBi}XcD;qY3pgpRc2yWvV%5+Df8RcF ziUY+Nl~X`BgV8Y8^j&Mz2<2EKrZFf4Zi?jk0cNd0a_uuK$pAS-vafaVJnL`MwmBpy zCuQsDII39KFpunvka&rDH0niA#|nGqg6!e{*f|>b*^$rmkSn)I{l~Y*#Uxz|T=SJA zLz>@aV%+g#w3XdLtf$Y=wlJMgU5n(S$9Z*5F`G3zf*7W6;e|7k$GYuqF@@S}nbC1H z-*x=75<26gf}S4~=+?!(n1V4_dvm;rxbI}cdSUQMY`jTLt88s6)sd-+-J;<}p`dxk z4_~tr$wKsUfmpJeKmNPub&VuK8`*r9f@TXYySSZe#V)w6PV&4xHjB25PCvyKCWe^H zj^HQIirAF8apuy)BS7Dg-_hH%#g=SJlch_)?F8yw!gQeG39Wp}3FGz^N>X%1IW9zZ z%!(nB|Mj(~8^PM-ps!-$&j6C2-=O@8Q>Jt83%XU+*uU%~oV!1=8WNKI+)p_Z5Pg(& zM%Xny_tUXhXOvqpxb!$;S2^WGAuD{^!FMAOc_bVQmw5T={6?kondjZX;f;v^qM1$g zG3qihJ5&-&)+n3qJCcuNyko@R5pK$emRZPvDeL^x!3Ntqe*BeNb#*l zlOUYZxh9-};ubB}S$?d4<`+z{+t&x(>zyob`}G^X)o-pZ5;YaC`tKv^X(fxO2D0=Qg=$b z_AhK+c#ZX*$7Yzku)R|T(#$wc+^2fz7$Us@SLEGN-@G^GnO|i?6NGz-v`)op8_0p7 z5E-T!2D30(Z8;xJHjAB$!^56RQl{Z_v-pns6vB9~k!1a47J38J3B> zDjdW~mN=gm9wl-p*J2?55`W+}bMYm^p%%AJkAG!9!82R0oBJ79(q_aCCKbdeP-1(7 z08i{pV@q7Nu7CS3>f&^TH0UExn>tIML7yiiE-lz$Gj@{cG0b!)I3vm9_)NE=zjVQ& z(ZS99tW%;Sex9IL!YGjTvn}D+kt^~6LDbP5fw5&_(T@o}ti zdPjac9EUF=G_DTh&iwb8$S#5=`-=72|uyp%wEFX!TBtX zge>;W14A)$iRaY&0mlb2&r%mEEG%Gae4Qjf(H+5;41?RpKN%xSCwCHFU7BvL8>>x< z;p}Iu@UyJ>SRD8zFqo`0bX@p%*F1H|ehK#QZ`lE5?`I7;a0(xLS2*2e2PC+o;a7m8vmXcadcd-Tla6%9Y3RMZoGYUgx_u?HosnsxB~yW40grf8*G%QCk|S?9$xk=KJQt= zNn8Ff%ZK0<|K_ISdY|ir(Zo6f6-2V*JgihP5!0Vbr!FFIhTZH0;8Fk&6}<(o4gGK< zXSCSKlj=MBoc+?EH=SfRq7$tl%Ck(moC;B2Z+=8?!>-CK&3RAsYfxv5X|kFBiYdl$ zF%`-hpT`K*g9NirpoB+)ZXEU)};wwo%6}no%)fPOZ#gn7i=x_6D-QI3nDJAa}%rJMbvd#-w}2N6q^hr zR|_yd^fetNd&PUx6z$`%wQ_*dqh-)1`mUW>KtKPxTa3ps=ICfARX;!mQiV!+RCK<8 z-S?zLVD~o-AsP}eq!S<18fgXR^K^2-?tcORQZk+{P?!T8!(;`wML2_5cADB)m=M-r z76TAO0OFzmw?n9Squ@H;nz}G=2bj1ui;Og}l&1t1zzL3lGI=^VI-?~#!7RUVC9v1O zn)z9new$z%z$}IkEhYsd3eF_VC(I|ntK^Ar7h;hnW|Bf#+em0DKKv5`dk1E*!(dz_ z`1w6NJor3-d`Ofnzo59dIKO}pzmO0w)`A!9<&1%P@;akge?k0#p$JFAPzVVd{6xnn{8Oz400 zKX?m@pPZNSs#?CJy8kh6{jrtwf=syh5TtsHhkSC;}A&{srO@ z3V~H6)bX!b{erT_LIJG=#6jYsAYNghm=Le909=F@3bTUoT7v|zIl`dgP!Q}llr>D^ zArj>T#SSOJ32F=HcX77;-SLZX2{|oQFpChMz<*k_9HAH+tOIrqAe^m{9_asc=^~uq zIvD6LJ_SVufWlaDiVKQ~iwlc`{$r#MN1?G={Dmqgzz6&T`PaZmV9UW$3;m^3EWmFM zY&8-JC^!^@MCl@tj$oEwNiqHM{4H=MsXvBA1%bv|c>U7+pQ_h^yZ&+a$0Tq>{O)36 z`Yl`uDD00QXsA2f`gb6#-ydBtJE*fQ96Q7Rl+?f45&z3@!35z#a8Z~juK-*?gjd*F zSQyK(m^H7JhzJyFC29?X3XA<69gVcXctBBbIa_R{*lMs6`dtmv{Xfa%`n$b{9sCzl z0zyDuK_OltkglMhgph~?P>_ZH&tmz1&FOztE5-l+@FDfv;4g~+*6)ut?Bar5tN8!D zSpCV@FADz;e}9g{|6v3y^gluVD}Mi>>mR!QD+c~6vav#CI7PKM=SB0Jx7-73Flr`pOfB>?t4L{t$3HxTT>&gP)E_BnxCQE(nUz zVhgGq4xO?s?vs*FSmPRV@+i0)X_mH$#~>4@07(NfWg55o%fMBu^DAis(~r2Jx@U zsAW31N_DIaS#%T)S>Sv{47|L4toou;JwJn*&wOW_;?a}06M#WUD9Q-wedl+N1}{FW_dg_ifS7*fGLN%pYE>hPmg!LUTnXfbVmE4ma{ok zz`-| z>xkf`e^yYyz92}5`>F;{?#a!dt}dknZEK^o?gZ@@g&R};br&?dK_rZP8;4VQ!kimTh*ANI0+}(mCgy0?sPJrME?(XhE?TVw$eVCS+C(y;s*~-=d0)%XMV+7d;pmtmd3!Ehr4t@@W2a z66|;Jz>iQ7xOn}IBBo+kp0oCDVkER;%J`CeT~O5jp=8j;{?p1-WUJT48Po0U-ez+{ zu&>E#8=0_wz~hCx#ae^l-4=BIHc`g=e!aDo`qsU`yVbz-@iGUJ%U|>EDPgf%g`B^k zD%izji@*m4QsEF!4~(Zh{blsaD129ndC*!cyRA!a&tXzHANb%UR5$-M9P$u<(qG6u2&Xu+Y`-eG- zOFdTo+az@(5Z9KaLow~h4qNI9L9^-e=-zgkz_!PDQ*r93>T0b*^XY)F?Xd?b#6Ze} zChpVw&Ag#AegNa@SbTpRPRA<$UV-Xm|1iWJWZ5AVT_Q?j+>0deTrj;5Ymv!MJBxaV zV!=N{5dnEO|G76!INM1TEnPS)y1!V*gL;D zCNt}fe@+bOR;z(pSmr3O@Z@XpUv2gIyo~z;E z`qtEIsI_G?<^#;^;hel;^9~e3oF)4UJ4~2}oqEI#0pVc1=EF38mKam6IPo>oS(;_i zNO5xS@hknw9!IdB_58(0v8%@o!Ne|-wx+;6;b&9#sX4bh4NENox^KUoObU*_dGI?KUBj77Z zAwW>s`?4g5X+1l*mFt6W^gW0r@0W$4DN|1p_Stn-oWqF(gVSB6B0;C8;Zp&v%K0u4 zzLEeY_YW{8Su&UG_O`Q#gS&I+=ju?G&7iggO z$N9f@y91A8&L$!r7sED7i5|b=4ZUD`5Ge_?WH=Kae=JKLywZ4V(BoN>xu-EIX?SUn z>u6s;-Hb8U)3h57n!AB*y(n+puQUHHSWdk(i!)B(Jw0!`8$UX`?-MR*ImbcD{rMc* zczD15;%jM)AvaDv`KRo)nf&M>*%-*A0Usc>05x_X+reg0(uQBRtZ9BjD0kITxG4^= zG^(0=&_Oj%ZweXRpGJISnT~5Bhdk~VY3{pR22X`R)KiOZhc&l)mIv`yr%?^-p?rFx zIbyMF8OmcO?aw^Z16_^M6PrT6N*)7`xF`|8)iMK)ThYVWb3-+UQ+r+}1BRfZoN_t6 z$@fb+WFwM;8#hcwas;Th3&T3rlou~ihR17{tgH;4-+jUEO2cbVrI0V-H7lh!pT8qd zN8fGxTF%6pH%u4VH2q=<<@1J9%c`(}+JJ9ORu1WfETf3FZz%gxVmf#ZavA*&x$`l`<_AmeXs_Clqj!(AoMihj%#I&@%q&APA4epG~3QSLYu82{g57rW0 zgg9Ynzt*sG3kpK6#jx%eA#;&fH{>HWTJa(5DrSxMm|Uc$)jz8X6&5q&&A-mHn>VIt1CjV2?;;!g@dK@^PEafg>&y+2Uys&po>!=Y%GYr_W{G;NzI zz1P;#SJYdK8Y;Bj!%-QIT@9aX!W2EPS^1{Bu-IU{8%oEx+x)+_i8kpjw?3=X)YYaK z5}oZ>LyNN#Lfas3VMVDh9p~{ zNb`8P;$5u(uQUr$^0Y4ju`S|dh{~k2_j~689E-Um4qd}a=dpobhfM$yjYk%Yj@<#!Kzs6Ir?OhFM07z|HnN1*=cAi6WE` zHZ&(x%WBX?riFkO{V=5|hNO7*w}f`8?B!x)a#<ExT=q5Af1oeq^2W_OnxAgp6{u zdIK42NC4+Es&_;~S{g>Qrrxg|ki^#)3`MIZ2o(B2kqtbaD7DJOLWc5RlRwnNS(ZxT za#u-%!zE5L`*URVKOmN%p`6zpo}rekl5#ZHjqU?uArs97OwKn~?~8F|AY9BXoTh_{uxcs}spvGxwE?e|g`vqAX`4 z0qdG5-H&*Ejzxr_SCdaNiNiUTL-GlmQkYV9ayrHQT!M6>@mbP{`qu8>qt5Cxvyl`W zUkHe0w&SlCJfX4e_^{&7Z&bSXBtF?(23))$?L$rmW^ecRD>QU8uyA(Iv@>nhoXE&y zKxG`257UV+bi;{k=a1Hx8JcQkelo}JLTE0hvU(uVkRCn1NcK}`Vo!flakHX{@x4(#!(db{@VKTwZ=w?*l%6SD-l*Vv>sINVXNzgu`QiIt2Yfi00YTIhiX z;{@M5x_>&7Pa$+vv*ccrye!a?iU^EX(WOpi)Ezf^tPeV+cLQW4O*Am4Tlwn@9GO-3 z9LlRm6y~qYZFWWr9}EV0NZ6ab|jg681+IuZOAZFc6$~M zu2uVv*0UAzQ72a@TD`a^5T_pVME@%*gys?Njt?HdW%5%T( zUX=BSju;2&fH&!51mH^GyTz z#ayZdp5&|x$2f9LT;>>B%}@UvkTZU*9Y~w@92;sDWE5Z7KSdeL$vvJcru-{aOgn?@ zlwDb-$L%c2t$C?B>IdpcBg%9=4ZThj0y?V`*=zR#ufeb+#buJISlUg6?WznC=o5&v zKQU%SZvbaJxk)F@Br>aYl>hf-ItN4T!sxCsk@O-p+Wh37lH!SN6J<<}n5ErpIh3r3 z$j+|=G-FOr5bzUy^54CcgS>zB?j^#S?D;u87JDT6TVFO^hq(NKl05?liFkU{*f_xw z-63u|k^U4OS7Fe;85UWZjklziGMlcgdpWM87-LWift4ep^=$CBc1kJ2-2Or=Bhyns zsinqPbL`o6{!;E*YftiG;y#6AHKh1wZBD`VK`@7u-bf7p;$Obr0lHgKko!R>l!z)~ zT-*WWMM*CC?YB1&aUID1BEi6J#Y=P`rG1L+fi4njl@39B-w1#x!e7^mm^HpVs*?92 zm}Xnj=E1Dh0IS7I(nk~D@SS>4oyNs+f+m;2{pQoqnCMQ{P_LgB?y|I41ly7{?Ux#p zQ9bU=_lyeA4}KmtZU?(nRQ$4`L6UWpxVHVgL8q_SWqqF0_Yey-1XwmYN$0+L#CAvV zEZHe$Ix0OK{xT|ERuHTaf}e-pnu?<8HLfZ&Hk-YEtS`;&hxrmeG?XF`Z$zH)xH+NNpY#aGJn}L@0&R-+;E@2*&))0^XYTC z1S5Uoxjh+L(C~2Qpn*h0p_&05ni@bhe)KKc!q`xX7sDkPcF@3XRdSWa52PGXYm5b) z&Yn$19KTN_z$lwkRZ|=~-O*T$s#hd7fN$BeTmy*pYlRx<=xzX{oY(8qNBR*D0W7hX zOadRTi9hYdPs7U~ahgf(BRcJ%SOo|hze$j!39gFuXp)#iD>JRO zy^3Uan3%=cbV#K{4I9?mr$5X{T$oJ^#S@dgj7$tH!jes%mPbpY^V*9tVB)?U#-xj#>;5EZD48Lx@hT2oLRA~*R;E8 zQ$7gPI2kl85`w(U4z{A!;Uh{IKkJsl2}>9E`!L06!agtwd%NO(oC*V% zImV^dGkVY(1a@e7vTO6zWxrdgrRtP;pp_A{K|QS)KR4W&sbI^uC3uhR2I--X^M9(S z^QnRm^p!y%r`)8_kf(AG<(H;BgsxLrcNz99qrDJgEqMSMX@-JiJaWHJEFAh!8t<{B zWIEedL7ma0%Ew>u_$m4>d##PUU%cLv#c|Q#!Iu8^1^DR4COEq`-qfhnh=OvPWHj=7 z+OW&9!$%FFuWx=lcW~kF@yrpv4?lj(eGB9boTVbpWGfr0@E)3TM{{Q3zfjM?)C9YK z^2hHx{MD_8v{O2Pn_cjcNsu^4h67hsVR<7Bm#pE?VHT~Vi@0$(f{`l+xrE{)@3nliOE|ij{Ez)^5y3 zZo?e5I%yv!)Iw(|jZ{-2Bz8!Ln-R)PB{alK#xM8^UefE`8pPgyF~4@7t=xfz54?+_ zD_jvFej4I8vl|@DmPW>sU7X};`GwF(^DC2G1Ot|#yl_J8nO7?QT%G65e@Rkv( zqk@xNoBkC>pH8>c8K(Z$M9;O2L*=*7b8Lij^8TEIw2G3b!?4Tssmxz{neO*rMs6Xz z+ZKsaEixS>^o`9e*{iOX9jy~fLO+$ebDexcWU8~|hrB#T%I1w9GQKAwQq_S%^gP}5 z=hWFCRIfZd9~VA~`9F1FS=LCr*RIMOA3Tu-e~Jtn(1otfp|%Y;af2Gmh25%H*W&XV zpAHl2R%^cfagDze^to6TS)Vdt!FJ?e-yq^C{Y7<2Hxb9F%(#@?NXLkTU@|Dg&+}`Q zeRYdX{{gMzVYPbKaGng}320-UmLW#NPx0b`b^^nwAs#gL=Dx$gk%&52Z9;vvW5Q`h zR;%b0er%mpfZ!gx3d>yE(=qBE?e3^(S+8uB1!L6OXZfrc5xpi9#8;J4F5zSHYts zS)AgdG9w~+p$yX-yflh!ksESOLbG>KJcT76gOO_mp13|%?3A7Y5F?@O*5>-C0y+{r znXEYUa|7CUY!0T11esG3wDeT{b>m4F3MVgi6Mv!Vl;WD+_umyz#LU;*fx@t(JiSyH z_hrY392});S_RGrt>w8K2?jC(Ac#BQLvps>p};zOzlr!qz2Op98$;y%9mJ2=ZSF%@ zl!P$c>!{l9Xf`G}&HBpK!fb7@DOwdZl~bCvU@6jx_AN`R8j1hpOdAULn=t8!GLy8@ zl{o1dTX`+6MoBDQ&bsV_rmZy%GP@?{XW|6yQGuQKy9EXbWm%oY3@p5%h9=JvXJR%f zE2O${F)AI#W4aVdSINt8M#mcZgzp8owFojO2wf|=+bW1z`Zg1++mmC^roB5&*zC!V zVN+%@yAPvrT!eSlToF2s9k1o<9f0WX-q(oQ0dFNV$uz=XA_Uhv%#UbhruN|<($N-G z5(vJb%QJrGcF#o^%X-bfROc&jWI!m~Cy%6mjieOc z9YsPHyT(ejs2o-h&uqb#T-~J@5m+=U91UNks`(|FS<4eVAW5w|Pii501=EMxgJ6v7 zF}i2*SF2-9SX)JTBQu%BvshbNS+WO6u`ekAOuRvxW?9zMnSYA$WJ z1ti8LRmD0sUuL^kYdnss8(U?6W`ccuIhE-nt5Y{)igQne70;C*uGFh{jXl_G#CKg+Jd11qm$NRh6y^jxfcN5^!F%x31EXZ8p?dJkj{xWVc9v z%O=*fjwfD!bb^%Nfmw4MdMdy1oB{#)p{77;+_R@R5*xC#eXumt%%a@jhp+b_&MnL>xuBO ziv46cQyOz5` zH0X~i&kRc5n90Z=5YhT!+#p)gfBvSi2n>7Ax*8By{H{7GZvxkTG{>%51aD?!*FBG> zUILMi_={_Xxl!M96|i+%anzIqfj5rZt*_SYNCXm+pFP+3W7y>e*v=^<&}|bKIQQlH z3)FRlJRL9nyf{IGIMK6|Z+wr#Uvd|dJA(Pe@JT6hEK-djX_OrxnEk*#hTk-PY0g$i zbLoBt`3*iDy_G6y{Ir(~@=nz^;SlLnfPpGasG`Uh#Mbu>Y$y_a?d^L)BB{&x9YXTy zKcSZ&dkmbg5YlW-=8H6JBO|rtT&X%E*ST20)<%hWG6U@hw9gfNz3V(P^=z%##!VRs zxu#1F3Rt<|75S{3JThA}l(Ct3B7dDk+&lYc(q{!J8(n$Rp^v^lNK({fwc1P04i8@c zqI9x+4bFuS1qZu#Eq43Dh99A?aO_c@Eafba@s{wD+XYNi-OR*Jo;U<&Hei3L>Fxy= z7N1i36m4Rn<59>0ai~7AOWksL=qqkSIQxw<@*>Cbc*oUxLa!0&;-m;sB%6g4xbGtK zvLfkGj@s!_Q7n6&6|vUQma&1*$uP|yb~!y8w#PR(+7QgVVaL9 zQYnl-jh}798ig*YU+101XeN*;fg#rdlZEP%IFB@@iU>U60m{pRNAbXD&eV{$7vwI6w8&q=&dYyg4y?latjrcyNw6HM-7{FPQoKUrT zEi}t^Da**LDAgR~oEo8AY#uBjw*R{jvZ2&o5+eBkGrqITCy*7b^_we^no_7FDkkNt zgc1?l&4!n`OEn#h4uM zB`pr6!p2sn3mV^w6v^+wE5fJG-|>q9M*s_D(hht_HTBQ3o;J3{5!~^W6Jl`3<}Hz7 zNx8*dzmJj*rb6|_m3$WTiVJyr0qSf_Al)!iHU2EX;^?<7K^J3LSX+WBzQklB$d&3PDGd+9VI)-fDLLK*PL-lqPE+X1- z{g<)G6-*|>NXHGNSC`bSDZiCVt@Z+0DW-Gs9x2_fA2;Tjb}4+8#cm!U!eCC*Be_@`XHvgF3`}NWNYH4I`gl`a>*?Tg~{~d43*f-5%<9LAH zGyK7k#Z-E`4*vggJA9#fct2KXcgy8Y{z(%J+b_!Ht|zAc_7CaM$HfLP+HS?`NmJa~ zmq?0jlHtor#D-^1c&eM{c6f~s^}vP@vV;?NTzPkr6L}r9?vr1E$nDzcJgXvm+M*v& z@*gRB9uYXzCM4&vzHAt;L3utM+YV<`zkH*v#T3$Ef91+#!-T=Y3>du*;Q1(DCU#mdsQ98YUcTp z*i1U!-cHwNG6g-7HU5}=utQ3_r~kS*NhdG4B;ew@Fu5+i?1o0__k%&kjUKF;uK`#b z+0Jy6eB{74hWgqcteqqDX}lN^Z114u)+^k1kM+EQU0xog>ji>UE8Wu6KinGtEz}tI6HEhSvs3TIK3QQ;QJ2%05Pzai@(;YRp(E)8O#pzz~ zt8%Nl$Utmt6@1(v+CFMJ7C!bC!j^Pk2~06B5jcP&1ZD>Ga&&Nlig=0B{lOK1w|{qY z(Ee&lpw8}Y77#fPh!gDDzd~4A{L|jW-Ob@oI+hk(5C@1OTonrU3i>yf@`|b& z|Frl`fwirp%O5K^+5e^qv$gskvi>c$-;zJ+{A(a^^MB(0oAy6)|Dz1oQdJd^b+&N- z9iF1BINfjmB9_h;ww5A)n&u!&OFjrhfWv~%T$qE88^X;Y%qz&p0TJY}d=Pjv{16T^3t?^!UUM@+3kzX$UJD51 z50s^a$a7~mM>F_v+B%w9L%3X=tp5mp6D}g9p(swr!^!j=??nf>MyB*@Ln&&|y(1Oo91^6~x^^&dn%h#M4Mi@#Ap+?>3BA^#p25qLUq zYR!IEDjeVsEIb<#88?U-%-K!H+1Wvy?l%PRx8mPA`2TcCu<0NhW}ks|LC{I;Il9jIzTkNEvBUH_%)KVslNQvPps{gTHi z04$>4CjuZNixl3822)g(L)*e8!=yy0Nz6(F01)3Q%1Y@74U{E+wSOW-`Yn)Guo+8U z=x*65Vm%mH%d3x=g&px}{1YYgF{L}3Zf1`Mjvd+PWKCiABz#=cNrc>n@Qe|WX(!VwHWswu#kP*pVLmDAha4p3rYAJ`@Q<{C9gUdI1(B{^b)A;s!vz6`%cEZ)H@ZZOXK;5KaXF4$ zzPEZCz?HA{F1De(;|m4&@4Fr5inU5$7C;6=d!kIYCY2H$9zmUYCW`dyrM4i` Y;s>gk=!UU7c##4W<Px&R8-^VZv9LK47fTn2_i^VWQ z8R&T)x~^RKzR&rur((eupYFl7Z8|zSa2yBU_o-H^>L6VP3L!8I1J`xYG>xMpW88PE z@OXxNHV44%-+zlddVPv^-DJ+PXlrZ3wrwoSQlGBLl%*Ml!O@X1GHA5xrt+7{WdPcB zlMEU?H@>G>EYjH6h_34xh7k(7u1gRE1VKRmwMhm#^ZPbJ+CXQX4{zRMZEa1JO9{%l zog2SFKATh7+;^)=Ak*3!^OeeF^4T2k{5Z$*@^aXqXnzBuR>G(B>@$hX{ycY<67jv3 zWyJ-B5Q%X(+5DJ#KXmK_hmM^9z_#t!nl#(Cfd^fd_1kNfWwElg$q$9^09e`DjAauQ zlYTXHLWr6hZ(VqvTkKAP5Q5B}(x^{;FezHpxw5sX-t*ZU&rKI77K;cWa2$tfwMx&W zYicf|S$}VDZ^tv#G>xAJUWCuD(%;!lsa&SNvm2%hKtTz}wM=U(lk<0(>gy$w$xtel zl7hOf^UIqr!DnNfY|VtC5tAb|Ie(Xl)2Ddi$dTB(5_DZxId8x9GJJYPiSD(V+9=E)OB4< z(`2fz7tixz_nvLrSh~)}#zxJ2#V@Dy42Hxkr{v zaL@>-^@sc?L4b*giNu0zQ1q_cYth;k3IzrS2g9)`6bdzi>SfC6>S~yw46MbJzN^<` z!GDq|U0q!X=-W;1!b1CHr{#r z748r+CFlFVTw-tCOj%r9j4`GA;^mr5see=|@eDOhWB$F@;FB+sOqu?BrsQ(D{h9LX z`xoHj(Yl%P)bZo7^_ooi?St3hqe~BEiWEyQMRqtki}&7r6^6e|h`}yXp3G+JV~Xc_ zxUP$3S^RPS46f@YnDU5a)z1{mvS?{(Q75KSDS{v%l}aImprN4wUDp-7V7LB`;~M}V cf&*s2U#U()hwMLLWdHyG07*qoM6N<$f@9+m%K!iX diff --git a/src/main/resources/assets/dfscript/disable_highlight.png b/src/main/resources/assets/dfscript/disable_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..44eaae82f664c1840dcee0e585c4cef6213df7c5 GIT binary patch literal 12531 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dfscript/enable.png b/src/main/resources/assets/dfscript/enable.png index 32d637d091308c4fb1d7fcec31fd55fd224c3c15..86386ac1817cb2cef52155ae0df23c7af23b400b 100644 GIT binary patch literal 12169 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 diff --git a/src/main/resources/assets/dfscript/enable_highlight.png b/src/main/resources/assets/dfscript/enable_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..079cfe80986729bddf397005fdfd5288f85fa8af GIT binary patch literal 12325 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 IM6N<$f*z+=wg3PC delta 8892 zcmaJ`Q*ho7u>E4&wr$&LY&TY8w#Gt_I z!JcAOw2IsNp{EyF|JVs}Q?i3xG6}A^tH1Yo4}NOb(?rgiSJMrS-cmR+*N*k8g)>8b-N>JPNg%J(K=%fRy;`LdZ5H+zzz;=pMM@D0lHQ zNysIb0ocFY6tL-(KiD{Qy<2x1GQBL*?5@)uKjw;ce=~Y{ko6%O21o^#mYqNT{xxsE zoj6&){QD_TnbTpdGiza8dF!C=tkl-yx@iWFVvM3W-h3@~6Y17NXo^#t)B2}j9<{r~ zValRrzre7jWB=h@VAJx)tn)rnkB?YjE8CJ<0C0_+Ce&@Vh{O1hwS2C38_0Tz zx_-{>{d;U=+_l_Wc*2gDGB%cEno8DgnakC;fG z15mR$6O|UL11pWP(Vkks6Rd01=C>8M`j@Nbr1eo%-AU`B!mOiv<1-C~eJ1PORof524arb#hUEH6$mk&5M6G*YT=THFdi0$ba+rRW$sba7c9 zk7joW;oXV8!BfRq%92_w%*y7rPRDRf0>a}}jg#GPh)8dGzA4(ehJhWiOc$;5Qyu5+ z>z8o4LVa02bEBnMeru;!I_|Y~?;rO>I__+h&khX6dRx^)mBpPRe-OSTI!5$$MxjRI zrGvgdG^AIv%Ce1*S~vR^Q2NrQTQ(kAaxmk!+@7}btrL9eX{EkWb);kVtW18I0xUL` z?c2XMYQ0`Z?Un3oO`=8A%T$_zPlTG;gq>sS=ODTS3#~{KyuY|-5-fY1BR~5MTT8W2 zm`jE`nOdAZ+Gc*_RBL}!bbY^&6=*zL%t2a7juRN?C=DbwT-d0X_xIwef9M>#@pOl) zv)yb4UVZv+r@icw$H+U{UA`do0XW9et>02zza1GE|3u#CQgyfaKC;~^ag@?K*J|Nt zQhBhWak!R4*Iu=b_feYL8o4}u@oM}*BSTCO8=5=vL?`EJ8&%Ee)WlM=)>3cwtvOc@tjc9LchM>%rez$ z&m=H}{Q(;DiFv(7>pKHW8c=6XIV6|SInkoCOgxDTs%+EuKB*bc{-@CP!ilRVZItND z0|tyZoRk-%14JgwUZZiff9j)P-U}3Rs zct1}gNtbbn=e5aIs_nik#m-4>$A>SOBa{fN*W7sYE_ps&-~AF_nVUD_OkqLcX8*

Cz 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 diff --git a/src/main/resources/assets/dfscript/off_button_highlight.png b/src/main/resources/assets/dfscript/off_button_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..657fe0212d21e1a629614863f586f23aab55c301 GIT binary patch literal 13374 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 TRU(gt00000NkvXXu0mjfFkgPL diff --git a/src/main/resources/assets/dfscript/on_button_highlight.png b/src/main/resources/assets/dfscript/on_button_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..093250234fa5f4e9b2da239942e5076a6f7bac62 GIT binary patch literal 11797 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dfscript/reload.png b/src/main/resources/assets/dfscript/reload.png index 5d5a267d958b42d126ac1dc89d83d1563232800d..8fc7e926dec53689a8f3ed07ad96a3538dbe9fed 100644 GIT binary patch literal 10920 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 diff --git a/src/main/resources/assets/dfscript/reload_highlight.png b/src/main/resources/assets/dfscript/reload_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..1e275562ee8e7bd61b4c13b3ca792760ac0c5cc0 GIT binary patch literal 11025 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 delta 746 zcmVyq4h?)sTF&X&5HL<+*`2!H>u!x2#wMJ8j3%=LN=tw@%<<>DQmG_>oQW0zA~phq z1z;baKg{#_v}63&>$TmK&6>?-0(d%|VpakZL$Lzr>+7c#fSK1Z;ajWK5;s`TnH=;iGWLf<~heGUWO(3RHk%>$1X!w80;SLCDHESh}Eu zC7{RS5wpTif`1S)yKT4I*vSoFKnjry#2*o804M|6Wq%8Z1RHF4yJ)RpgL=K5oT1(_ zPW%1dI^slb>aAjf5t}i_#u$IJ_w;atGQuM-6bkWoxm>n$Xe5`*SuKB8e;4Y=?kGd6 z)iS+a&!z!$lqG=BY$iX(gvmE4a7~cyb_&t{eC|I%%Z1s zI-LYCi=GkyzS~ngz$|(SPtm&+(&n9>;xYVFPf_Xro1Q{J2^hZi6qSDgs}-o=k~X9i z=@o>moKxPhNZn6BY6bYX0%#C2yS>v>0zh|1mt(EMLyLV{Pw95M$rOqhI=GG0Bj c!DsaM3%WBb+f2|i;{X5v07*qoM6N<$f(;R7rT_o{ diff --git a/src/main/resources/assets/dfscript/scripts_highlight.png b/src/main/resources/assets/dfscript/scripts_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..ad5e507e9c0313e01c15e530404ca0549b1bb139 GIT binary patch literal 11642 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 byfY$MZ&MFM!Pp9_C;{@a$}&aL#)1C>`U~2l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dfscript/settings.png b/src/main/resources/assets/dfscript/settings.png index 488fe77dc9c824176f994e438c132c8017c1fe96..cec7c331986de5f4a2118805a335ce34bd468779 100644 GIT binary patch delta 8084 zcmV;FA8X)?Th3RI7k?B81^@s6jfou%000`qdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)I zW&i+q+NGOmb|Wjatp78LJA|Z%;n3w;cLs0x_X|kbmhC#-E0--ErR&*Nu(e-tZsyabNEo%Ja;o4$@|=G1F+5`L$Ea}|`1SSu zpZx0aV3d`WA{E2-GenQ}6AAowwC977$CHCL&u0Kk#H}NfAsd3lYt~1b?3JC%)?&zl zgBnwJK7Y852W*UPGD#P_Pxz)d-I`0X-5+()@v`A{zzk1BpM1tQ)i<0KLL`22D8x{U zK86@$iaC~8V@p1T6jMq$2^3rQIhY)C$~l)@b1S}t5=$z%lu}Epu6jT-)>LyXwbs_S zXJh2X)r}9d)?N2K^k{nOxtCsh8-&jYBaSrkD1W1lHr@0S{FrIxS!SJW*+nR=u;NN9 zud?cDH=%ZWbB8CSh#>)k%Q_PF)O*T3+ZeZ1zjr}V-6;Wb{(`89+UoJ9Eyhfzf= z9?xy{rRRS7?KiJYm7%dccCt`Ly*$~+`>Qn9lOH}W+xq~V5>)?g~d#_0h9w4qh$j?{dra@|b+1wN`v}n*J-LYK0fgQDt}W$z-m`ixEzFMB zn8jpH3wXzHJju5Yb^t1Q_$mbn$x&nlLDGw(|Vs2 zQ!>osV?wgU*C}z~-%N@SKGU+Wk%Hwe)}cxDGpRGBGa<@=>jeIpPi*_y&)FM&`tLsU zJ|a`(!@k}7Gc}(znlF}j`|-QUzRvE`Tt9qh-ktd0eQ4gD_}_hK-ktd0eQ4gD_lM}#ret2@7P_2phGrhMY+ z@~xdf9g&;OJ5AjZTAN)D5r}Me3kD1;Jp-3ByW9HSRYxtD23rl)&T-wLjhl&V%dEX< z04_%j9+%tM(7b`rYN}duIm>ZA#ed0iav>j98D(LZ*_uGDt_cwOK6;+PMP8~sH6Zgc zJ{3Pp?vVZrWVo3isBN<*OlHCO6+^qf6aCyY&4^ z^W4=R%l@3QW^8{A5iK>cRDaTjSTVm{=*moZ$=<8K2f`ea3|ztbJ(qzQ@8C4pBxx~D zgG3PUqqIqW1nxOYUyZ~-hp>{Y(477bng`Y{K+g(Pc4bm`ryLci2Bd@hSl-pR;v^H3 z^vBZdJ+vaV1%V+o{~{wzS+I)rBeCOI<}HaT2ue*35R8B|VK4aF1AoqoOoNY@QE@$K zVN;bv+iP!^@T>XS!W^C;7nCFb2xl;7OVHo3^_Y5{eoa4CiQv&lu@A6uNEQGHp)7uj zYa1Ra3Wj0QYZr-8P7>e9f!PR#{c43&5=Zil-K7}n3UCU3#=&UG9P6>fB{!kh@Df;x zq=>LB-vo*YY$7%c%YUwjJYNbttTs#p+o}V;1x(p?^V)KGIYm+FUNB1*bKeHqkwz7s zTfsL2q2%`{KVK{v0+2kS0N5V0m+F0IN>>~UQ6@CEsG~L+=wsDdiAwfaw!$ukEN-(x zPIDWb`oOQuz7g~C9bA0v)gFJHuska!X<76si;Pls9a~WFV}HaG1k1HPd)uYx4D!QC&I9ed_2_{dC(zpH-?K5XaK z9g$x?fC@g()s%wEqq2LF}eROguydJ;=e@^=ZI_jr-K zPRw0%=1{TkX-H@bLD#YKiqnj%$*DEMZ5Jym3%|2wV@VXFd#S)G%LPR!_ z7EETgO@F*}5VmfuP@!bVUK1K*mh`D&2#e?&waw7B_^2Wbk@~KRc1m8}S*r|zlvIY)uDha;VEe!Rcml{PPlhn(WFL=-KoT6m zL(tvEi`J(u>O2xyl9lK65ah2W9z9M9PJb820&kTLO!f!~yHwXU<_wiBlK(G2Wrw3Z zM7nHPI-vAGlKDHa@@SO@buch^G{;r8 z0Hlsw8}QnyhxtDRIz&LXr{?Znur;Bx{lJQ*d&pzRe5GJos% z2_FEw;L@tC3YYqWOCmW0SzmDE20Mtgf&!&*cd`SCnrq4yW7|QXS+&9H0TWyhNDqHO zOaK=ZXUZ+2TDe1Wl4C zF!SA6A}in5ip9YvKoSpX-3}XUjSe_p6`;jDn)i&RsfOE4PnO@|h9EekB{H4}vG}km z8_t>NymgCz!DS+Jpp*=mA;`_lX(3&(zqT2Wx@*R&#vj%O)AEI1l$B+Erhmhe4NEl{ zvr;RM%sM$Tx0EYTkX`zBY=0&J)W2&Jqtu~(u`2E^HHQA~vK*2B6ew2Cd+6!9j&UY;f;(&e)u8 z;5suZ9NrRvlngvuuBhf+!6oao^FU8==O^n=bEH?{tIDu>J^9yrf z8GIfb%SS;LyP>vShjj;eg3{3-ez%YpZ3M%kE<_P1ED;#U+n7f`{C_mCtj35%(@ri% z4Gj?>^#V0;Td^)txO8O|$npT5NB3{~1nvV5I49?CK{qx8=aDv{`U${b&w0=Mf%5&O zqI~NUJ(SSAal+Fm>QxkDcdZV!c#ANg7nI$S^eY`S;)6=iw091g)I&~u5nQl{T4$q# zUoVw4zQg4?jiIRMQ_}#<^Zg)C#Al zU@DYt3A-I;_K9_suW;2PvxqdRFv3CLHghpF4s*6cUtB42m!M>fx;XbsmP9CHf%{N-6l zZ-3f0u)+~}gz+`58;u7m-v9&Mt7^au?Pi^xNIu#_q^)#ydYz(uLM0cn7WS|G^{lY~ z>Ex)m&PfS4sZu}9HQ@l8+fzkq;MT}s$_w=Z5{+nIWD8f29$Yp`fZBoRSGbnuHWYTF zwp*I^k}5~k2p3>)G}{TK;W^z#DDtz66*~lM5hjfNiu}~Y_mYLsBB1)4nNnX zSj&#svsH>$DldHx{?8=H(1)|T?tIyb^=nTO*X1V@lA0$!d6#kR>6HC5# zkA{HJgk3y(*@fcN0-YlGtOkm(SFJdOMB>=yA0JrlAByIWiedh|!*_T;f#>FzU4IY? z27dmTCgw%zWKa@!9-DoJ`m3u3cI-yn0>ISf7;TsFetN@ont}{gbJ$bY-Bpz0n?FMT zKN{dC`<#&Ylk*qwb=i@ZC4LSpdw0#Vz$`z<)7upu75KrrV zHxf?kzCW$|ryJ0;<&mIUh|vQouv)T8K5Gx%iU)c(36j=*QJ}poE?>5!@k2#e0L(xs zULDocxDQ+*wI&`IYRMtq_O{h&Wd6=)b9su^;}f#~w8oB0FtmcWe{K)xLw}>ZsInJ3 zgh(%hsc#=7OB~C*NLK3)Z+$xMcR0>}Mp4t!cM}|v+yiD- zn=snegXNyR#kHQ+__#^YKJS{Q*k4x<-9}7LD(~clU8C1d+3D|P2NX&ufgZRxf`z=C zKe*eK-gfPFj+yU0^WS#uzJDd_mwh`v)Q<)?4?jb?w*^L*S6NijSh)HY!d zG##1YZ&YYw>T2DPsm6^2%dun_H|RMLt`}kE8}i(h*EUL`3IY5&N~Mhj)`cnT*%#4) zvs%nq7Lm4>e4^AjB1&tXQo|y2v;KuV+K=Y%KJZcx3ch}y;CpSs#DB8|<0r(zs9u8` z+5jY8QbbROfvL~--_4?S3aSG|ZEHetrvXZ@hf_lGq@>KV2g84lk4dZ8I+#AHg~Bb? zoTJA-Tbo08R#zYHGn9}W)Lc@|i1d7w3scqI-$anLk|-h;pB+&9Aq>731M^oJ{jb3O zJJy@8U=OTon6S6R%YR3N5qzFhJW*b(f9y;Z{!s55Bia-S%|4?VvKq2Cyvd zupYmK&wjORar)K51*4-0#U9Mg*Hhm=cN)~8+-GuOB~%q+719PJI~y_*tKK1{S1{_J zs;|P$bO7&ZApZMD^W}vxVCV>xG&5M^pgHZ?(9v1wxBVP|eSiA1opZJwqk(YweMaG- z5qlSkn$yodBn&R%bTq;JFu3n+`nDOIH)_+5_7?>G)utzs)Op+FTif+hGC6nuwC;_6 zwwr7@rTkm>adn-K`onu);m!QMB`A2?{YU>72Z`2Knql5~hI$!dlOH7HQ?;r-<#nY~ zJHGXELWBCvTYu0gAg+yANn0-g5*|Lg_0rxZ6GWzf%TD)Hd`A0i)P;rYy|Y=mZ|UM@ z>vW*uH|ju3lp^>dD1zXEE!Q7ycpVRk50Nkk=*a4q_K0AM>b@}by+_oXBgLcQ78=lb zIbVmEcAXkMqDC9l>OdJe+HFUZQFCiz|Lk<49S<&}9e?XfJ6394RgNK%NAQrYs_NQ| z4qX#nU4Mm9lD%9VOPEnMn5oIWPp#yaZhW*|1}|OH0RU|uQ*(`nqEE?a>gI(*-C$g~k9aCK={yx!W2EdCM?9DVJ$ibI6mITh~{Q+?H)PFp0LU6~TIDd=S# zjdN4G{eKMJs&=-zyua1*bv8-m{j6OXJJ)k&Fo|Su^|@*@n&RG;c{XKgQzzuCqN~*y z|1JpjUQ9HP75-xs@L%9gs+;d(e5Q}~!CwTy)t9p~LJz6*vr~IaLY1P#K!%Pa4?1u@ zsQK!*XlHb{qZMACfZ?Hp4QY4J`lXDS`Jr6)4u4zz*2P*!wfy0|FGmZ^U!5%&lsRB; z0KR+QUj2|nZ4C*7VQTo=VQf$nL#DTpf7{g1Axh$R$IRIfzt5>J!FzzKbGPb%kd!F* z2JttL(p*W{rP}WqdK74YDJdn3tQ}c8!o%xf4BGRe#^>)_9_GuQ$L%YMyKKq|E0qg< zf`3t!qCH=oWFe+c6E{6O4rD{nuk;8ufxFKX6_Vjenv>HR9Y0TB{1enWPSDU63}ArTTmW?Gs?(oQz8Vp zRo5(ubSO@2wy2kJ!3DMnJHnX1AHPRU5&)3PPaLec^w9BYTWG3!XFz8< z+(~wPM6v=I)vH6Alt^rpMVum^)olL@ zIy|#kotMikfcw<-p&D4bY1#SN?-~;rnGep7bEczhGaSzAbm(z!h-r(!uCBwjb;Wx@ zC>o|Pju^=*7ObaA1H%n@BkE7NoX;vDm$yZ)-P4~7Wr|B@Qo?GfstJCPB9#ORWA^}C zUE$e7)}hfBws`+|4O!<>*ndOm>>JBEAGiT+vR~2&5Ol*j6jVDCovNj-<+{`7*;nn> zueo#MP0e4sT>(uncR%8e7Eulw zAeo(Y!)W7*`rUdCI+MVibd0g+7{(>JLu^!#yTMQx)yLh8wp47DihnN$_RQb3E4$G=&$b}cqc!Q2KKEZ7 zsFSD7I4c>)(%>b%7X76`p4P;d?gySX4N!C4`s*C!E+UO{pR<3?sB+~#wm%pE;U}rB zQ>E41TP%^Psy;zbjDH_?R`>OBlX!@Nplv7f@{;HTuJD_JL8&%ci5NWPT8C=JeZ7XU zuVHlH+H;e$4YS9%t~1KsR@6Ay$R0w)NYCl=J)tuljUs6?_F=kbBJYFT`-s-OjDRZH z--eK_0OiM4s@E@D5kwkDwg!_!KhtO`;f1Jbn z6wEijJSPi(_~m7aAC`En#C$B}Ep$lK&&52`$-9#Q#d^h2|BR!mKdJg{HSgB=Ctfvw z=hi=aHSQtu6By=~A)a~YY)@+1*%+4}TkDPyOBb{{fUokKlz>E=m9Z0fcEoLr_UWLm+T+Z)Rz1WdHzpoPCi! zNW(xJ#a~m4QYsD>{JJ|`YG z=z_$LT$f#b<6LxD;F)0~lbRb`7kz)Z>sE`~#_#gc4 z)+|g-x=EoJ5O}fek5Qm|7iiXP`}^3onsZeTyuMC?IYv#0mx8S%QwKmAuv{?>~)WK_jLC5 z@0nJAKTWW5m`|tt-?O3}O9CV_GB9K@IWaaZWH>oxEi^MTGc92w=V>d7@VK*=`EiyDYG-EMgIASn4lb#@54>vF~H83$bF)=tYF*Y+X zlL{f#Br-TMV>UHoH!U}2FlH?@H(@d@Vr5}tEi^Y~Gd4J6F=RAhWs?IUM-VeDF)}SO zHB>P%IyE>tGcmJTB4`K}o_yyp00006VoOIv0EGYm0ROE=YY>yzDjt953>gYKABsXE z)Bpeh*GWV{R5;76mCcIkKoEt$?oM>0gedcX?g9Y`xbp%0+4zS6pCRwzleiZIi5Sw| zvyg7%7>9ddYFVi|b?Q`gMF5sRv;d$einkA1YXFo|ACrX;So`2}JRaF@w+}$)Xftaq z#u$`RXsufdNGUm;PEUV^E>UaEe!mAG%QB2H>~_1CvvShJXpp^2hOGnvRGkLXIy|w2UyBL5V2nfUQ30T)P z)>=lR(Hn3xvCWsJsh7(Gy4HHV9!Zk?^NOTtN)$!!YvZ(8E|-5F6SdYH4u=6ui~UKf-?VjI+-|p5hDs@-D0&0?&GI}aiX!T|es5Vy$!s?J@9Q#~ z&0Yp7n>w^j_)~nFKM#nTfq%D4ThrYTA(&r$$(GMV`EbGcm5S~D07063q| z{yug(9l|iA+wF3_Ua6{zudgo;UKGV+%2ic)=WsYA2m-3A!Wcsw#~5RfQev(3O#1!4 izcNxvk0Jj07w`>m9`lUjRBw_10000aB^>EX>4U6ba`-PAZ2)I zW&i+q+O3;ub|g7$g#YstK0dQvU<>k|69 zzhC#?ZQ!5Lk5Il(`;Y%;c5g<;@y;!8{lic1UlZ{9=ZtUsQP0oJh4%a%_}%=y*4_>I zZJ$2ADl^)eYJd3kqHk6y&+pcH|7Ct!E4bGs{>LV#kKez(ZfyMVhW{AHeH}TJ*I(}Y z>&w}3XY^zD^>6Q4_E|HlXd$uH>9wf$QqEso*BL@X7sJ%jlld2UL_Xh@?}AqkTwy-r z>3k1ct;1Z~20LxD+phC_*ufNoTgG84=iG4qyjZYZb$`RlenH=MyNo5LFBo|ovj^`! z=3>vV^%>@jRv39&E_IfNS^333{WkyfhP}17);_PzFUP*lX|tJzET^AbhDGdtZE8Fl z{Qmy=CA)eo7`4j^k;=yQ`-mRxCldH$XwQX_-!}$rp05Y6MGPI8jP+Omt63jyvQKs{ zTgyfk41d&^y7R$xEMQ}FlS#VZeZn@yX=rZA_FU?s<7My&D=E67Pd;NCVhv-35b>WJ z3O>}Lk0HjGVvZ%&*pg2n#gtM`0>zen4kpK(a?T~!+=?%u#F9!brPR`@s~*sdHPu{8 zt+h4AY&^MfcjJQAy6e7&9!*a@_tI-`1NRwW#D9@S9%a+2w6Yi$49mK>?b~+7U5mlNzb+v6i9RM@uJhyD&v)&EDWh5wb-{IWgoQS@p{8ElH%>}i?P+LkSA8FDYWMPi|KkRU zS3FDOj=p%Ukb`rPYdfB3lWw2*pMK*aPQRCHXE`NiLS^jTp2+B71TAgEn0u((GNxsu zw$4LdPv=Pq1Dr)Lo>$)_NW;6Yz}2j8@Wmm_7Dk0ydsG_jIOpC*>06*-WU<7JqQC zG#{?%{_N6yw0SKxrt>0;&0prD)%L%BEbA;W&E@9aMzkz!Ep(i1Ju8i`eJmIv)^V1Q zueogtEXwt8R^dJdHve?wzZ%%QE%?W>>|dH)`#gX8l=<$n;eRpq??ank#{OnwTk)BP z6B!IWb3uzBZu)nK*d zRd?zw0yP=DjsQ=@2rDO-mNUFuUDz%_ra}cC!GvwS#tVJgJUowOC@c||AKj)gn*-=w z%Z`;)hFl|cGZqt=L;%xeynhx!dU8SK65QO8S2SL)B&L8#3d23^47N~1m||MOr8onw zfGoIVY%8)gxwbVcscogs7gw^F(2H~l)Q_A9^=!Gfx-$F0 z^yJ5`%?ZAcDSAAw^j$8v2GS+lYzr2SMD)zdG|k%TgXsZjtpsVLG1bNQA5-#hURbYda>iCACzjF>-@g)0d=dHK?D zDo9}wM!<9s5`MZ(nt0ZniIIqI{AoVxt3NgQ5#FBg-5jE}t38U3P@o@O8h|+AHoU^y zj`K&7GTyWhC!}rG2Lxw!p_%E9Q#s3|cmOUKQ?D_&xsvaB^nV_~k?L^TsI4p!XWCv^ z-1~-J;JEmOHw7;M=hkB{CNil|I)0acw)MUYJn%&2@d^+<@XXZq@OaS3Q{ZC0qKgMz z+%ro!zVeAJ6VDr%^WO6H4&3gsETv%ng*_Qi+nYO@iohaPgJ-#^C%{mN2!6F<3%nbB z$Ly_@u_Dxe27lYuZljw>%+1)iZKu&9bZ3ILOQUOJ`6gVov8fY472B>MRlvIdtQ9#< z#Hls7H#-4+!g)Hr(CplVBf0n36%y#(08;#_$_338(cG{DJ~M_`+EgaDhIfLb0e|NzxCI`^%fJJ!<=D(My4-f; zGS`M~%4;8~VR@~*NNAuuSPZzN9fDNjvrCkTjaW9JjM!K-1Ajb&(d-=SY zem2ey{(*qm;3RAi2+j~br6-iYv zoD+(;dLB2E>3s$hX!8WO%fY zlpB++ql0v09jFdw09_&(ooEBI!%I#mIv>L9)JnX>gb4rK8DJ&IQ)6N*4Uh;60YqX5 zg@4H@pnOQ?8U85)=OG>^{H9?oU=K(pO31gN<_VR=zaegQmR-OZgcIxw&Jx&C{Di1B z>;~^cp=Mnm&4b&+s{r>@Ne&f|E9n`{dx(|j0%$`V;H3&hEX>X${-8C(!q#M%WAbYn zG6o{bBXst$`Gjtv0TOJq&Ele~uX&IX*bqsv{cnBU z{0xmel}$Rx0A@c(lLTL4447uyaR|Q0WpPf)9XniNX#SoV{z42DGF<+X7#fm+edMQb z-Sg0efU7DzF4khjm|rf8ukQ5X-^YuUVHbO9TdLD63%In{J@nS0bOVk(8my+^gnzId z67}$;_nD+69f|B2QbuU(Gq6~zew)%Y_)2es;^bMHbwc)v%=t>3o}}ONO`OO;l5ahU z69z|6ZD0fq4l2q~BSiBsc4*yUe4^|k4f-@DQ;l_JhbqilgA@(3o@^tjh10^{6Y zSuJM5gLd1;ag36lmAJwgRP@`&{`(rEsK^0Z%Vi*nju43UEYK6p!bTO?5`S#i^PniG z0vpGWs}2|^@?qjRbG{rqzk?%=%MW_ISkU>k1{1#=)>91oWm#CvUl zqXkR+)+49lnH#f+b*OA+FmtV3NW?KSE*2d_5+Cx5XtPk71Qo!2L4Uj?F*W@aQ}&1{ z(#m#gn&b&eH29fr#1R{a9NiD6fQaK=;<+j^kurgv%?0^XY;>v7wGE$F9Vk8hm>QWa z(R83x8vD?xzf{>?^($+>vka&LR6MFg(jn#qw~Hj&LAn*Vw@KQSH^nyKaT|irT6Ih@ z;MrC3Xm?4ZNZJEqaDTCR=oQ!wwB@R@23tNIXzS|iKx!l%NZx^+B$-u7+2V|iJZmQ! z6wHE*u$kmkNZi6;-w3jY7e>b>gey!>o>efKCUNUT2b*v*LbG6!!FLn`9z)XgHM^72 zAK^n#juQv;*ep(1cS4Q#X)06$!>}h4=AC$1Qj}DLXuJ$(i+_NU33`WPN{J_6p>A03 zfU1c0c3i<+(i#iABd~K*$rBr@zyM}$Q6n&uz@4f}9BPC}SF}NkSUE5oED>i0*(H+u!$F;Fc`G|S3}gu|PNd<7-U0sTYB7T* z*^O2w$#-SNUVq@9Cq4R=5%+s;mCWRIN@$y!c%VvlOO@TGh2r} zEIPge%~en=Kwj|VXRA79jrFi^5mmsr@r~QU#HuGQ2q>#ca!iO|DEbiit3zVhMbzqi zP-CPGC|QRdLu+#vuHeBPgd?6KRIy1)l~WXI3P9CORDY+*$TbMqshc2J);x6+_n55? zf#ln+Lp-jmlwoLA%_Tb|OrMQCM)+{J_^ZR2zwo&IhsXU74rd^(gaob4+QXK3QlPo@ z*9~x4cYkqb*nErO&#h@chcgeQ6;xXdY6Gy7eUOvFB!-T(GKWB3t%OJwUtO+tX{96b zaU{^I3X=j7oLAAF*pi^j;ieSEnu$dGBH}n*Q$?I$fPT1Txf@?N2&p2h z1|=A(qL=(Ybat1`JP;3`hU$|<@#(w3R0*h)@_#Gw`=}m$=jg;Mi-MAPn2ymwq}a{L zdtT)gzdeyM6N_xTW3yOmM`Olt{mFYyOOo37I8wdDr^m6l4Zw6o;`E) zzs&Jek82aR-lvA@?_v$~BOs=r0i)xZ>LBM3+1%N{QwRLr zBwDTkj_-@#R*ZRPQKmV%Tl_04)v|NXO|=LGt-I{l)hsN@=#lW{3a^^fL2x5LTcNs()li{WI3vb78sC)1O8?BiU*%H!A$SS9ngCXS_U;gvC8~cm#!`IEwsHh`%cLAL{^(1vuBvr&2 z>}hn7T)2;=Fjoi+COL9cZXt6zf8E0z|LC_z<<5X=4_$9#&+mYegs!Rt2S@@MB7bL} z!vzQ{%>Rl>2F%|E{O}+rHP?SUHvX}A^IAP34zm8WUG!st?)L@m>;Fz==#Kz+E$|fr zf7-8uxvx#*n%jSRx8cYlmV9;c2=4K>Y@5C?MaXRs~YTAq4;*$YeH93-Q!PV&HV5EMP;{hiGmu#Gg4R zX5p*9#+<9SZeV^E4tD&^aHREb8E%l8RloC9_2O?Ts~R^%AXJL)`?h&lfqzHos&G0; z=%-FeJ{oDAIwf0>5WBgPjmM*^%`vKOpo2DNKWQ8bdR5m@~cMH{l|v7~#|%*Zyd zix;u*-F4LTB^JJ0+({b(q2 z`UVLuj%?grL?(h$;nYg{yMJp?87{tr6B>7^hpoY2aURE62nA!|3^tL;kqIa>rw$l$ z;V`$WoKOj>I{W<~+YzG3c8jC?cuSg+?QvLB3UOM4sABYUg4pZ_(-R`3b=yuJmR97V zL+w`QRMN~vLas@6K}FT_2@jHE*g1>pap#P{$gh4DUU$(bDXwwvTYnn`_yxfO+EXYo<_-@ff&6EC*)jAP6y!2{^z`*k% zxkMuIirI%`Ekar?vwy+2+YSk1JR}PO7s-e29Mo`dh|_!)|9N*^9if=i`s+zu*OgA` z_rsTBTqfh`T_my*ENJjY-PT6fyxW?kUMW~6j{nisMCmj&@N!>7_A^P@$Dx485moxB z-gR^sOkd44wAg%gHA(o|N|>G+Ey0S(qN5U1g`BR(xNn6N^nWSHPn@}E3*7x)DX4cg zsgj>w)zTyloEr1RztxQ}uX0fE%1HK07wV&WbHt#n=klLdzdBGd|G(6OisoPHL1ptV z^`L_JmwHgn{6Bk8w*v*(nt!DOrDo_7oGRuQtg#QvyFkBqmCA8Vr(581 z<`(5~qcew3_jFrbr*TPsfn>0Ge5Fn(lXB61Izjh&RKT3G0^+p~0?`A7qSD4EY)?2^Al62!G;U7-UQ7ro=P+u}3KY1S^k{ zy1XXFQ;G!VOgX5=)*e}3CnhRRG~>0t>er?FQ_8W#1@hQu$xk*bv+$XrakV2D7E!tk zKzV7)wJiNU%%$pW~jJbOwq&$(E4#F}hvLDAX0U~5q~>I{EkOS9p>{$+FFthhIq6YZKznV2D@Mg2~`VpCP`{st+a^3N~(`YblHR7 zWvZ|$A!}7!X4JrwaXQ)M;?XtDImD5yPDvb#uL7Ybjm6Y`lz36r1DE30tk+J`Yitq7 zXI_-5rv2*0Tra;TE{dw`n`k_(fAreW5vxl24Szo)!r;Y~1UoZ|PNm>_aaxrNIcO~> z1g1aL&>I*1!^6KouelCx^+q1w4-5#bUy<}@Ao(ASDs%5rvk_(>A*%M8%5i8Rey1P;P+&b3v@`7L z9M94R4_*hvY-B<4t*>!M*!=43$s<7y7lbt>$kt8%{W$pJO&w6~a2jIdBSQbw@WdfK zgAEmq56gh}>3||HoYSCkZp&^(YzTv#!+*>y38Cx5Ok?QXp*Ar*83y?E1AfT;&`zt9JL(dUUA}g;x!=Nq;9tKu>^*-dN~OP0NA;rV%P14$P7$L&cJGrcOCp2!m^s%2wGpLgpRuF10b2Q3&ON86aH}Heh|Ixr?h(6>c7c(W zIEQeaSFulMEEyEy#*vs^*D-p3s7TrwtupVW)6Ju9-sMjDPEf5&UJXwA?k@ht@9mw$qw1e72k5F>39`5}`Su}|RPfv>`rXBVX*czQCxL9{wMQh55!TUdI6P`f>{3LrPb{+&6~M@d-48 zCj)JRb+;pnLg{dJ(fGOJX<0PH6?*aAX?h%N?Q5ec%&(0m^N%`Bf756(zjc~oO)*w- z_-Pa2)jC5db|mOgsX;_|bbn#%eiLDXuaIUdczLq8W?l}-Bl25Gr~RN~qBX0Nzwa?o zv4-jNsv;gqID-)ovr-XCNw=KQb?z|l4nl*=WLI0&>G)FjM?zJy#a39u(E|7&P220O z`>W9ew0x=iClJ}!Awta*Ct@0f)p$LKtg4Ws(+U81!2AQc&8j>S;(vpO$>KUx4qn)) z=zzk5z7Scsu+G#FoAo5J=bgxq5FQ&f<#-r;R$X4cwEa}Gde3`YZ$ufKaLPKB5hRv) zdSZqt;E=$+mX=#XYj~Fn8-<)HJCbqxRvGODy;;yJN7f1UELP55s|^<4*lR{BWvsy?6fUdMq;Q=jjf;4<@8eWu^1!xNJVF?b_}I)xFamW0%+ zvL)|qYF?`EHb8*IUg@Jl$v_CsuCQb**@I5r4*^O`QD;XWlvCAhCHqujK+Pdfk_ak7 zGkvr+%|Gfi{Y|6E{9UJseDAk(C=R8MD;)7u)eloYzk?_N{(k|k_gKu4Lm)4^o0_7ZAZ*Pk+p&)>xS=`iJ_1M-82 zyq$2>PYrrI>aOoiChSO}(K+0fQ*`7j{DR1{KhIhFs`6GsL2lI-yj8Dh14u>Kh?Cq; z9PrkY&f#*Mq<_UEYBx>h0DP#NTop$8oPr8bF1dSKJyonpq^L~GW&88J^GNxaD-{>* z_qv^yO``Ik_5I99)e!@IMgji;Fk{aFZ}rgQ zgeoYEi5TLK(-Z)=fnH6I_=@L%LHvCXCXru*n4hDp&3{g)`>6H?NV9Ou(o_#nO-R-T zn#V0fpC`O-=RxK5`5cB1O+Z~Mqh?x#59#y`k8Ym^{W2?oo(@lk%O5|VdOrLi_2UQ;;*R?! z-lNZE;xku0z&v*RBz){hIdcP}!w>7teLrV~riF*?_Xn+9BWt1>e=Xl(vsul51CvLo zbc@SoRFm-ttRyMK z=fvX%U6A;Z>$1yloQn<%JTq)$QuD-NVzJo4atE`Lp%PCMM-)|~d?D+y!g-6cTB)(t zJ^2emd2J=lb($lHV+jc)AwotCWmI4xN~=bSi4^U}Jp99sKS?f`TxBqFET9S%lH&*e zgWuhng@36@Hz^bYx?XJiV-yJP0?oQ@e;?a+^91le16NwxUu^)hpQP8@TI2}m-v%zO z+nT%wTj1?(+-Q(Te zoxS~grq$mMa%*y@GZd>6000dbX;fHrSWQeiW3!GNJ_00VWMMTpFfn2+GiG9BEi^f0 zGA%h_Wi>4}W@IopW@R)oHZnAm@E#u|Vq!NlFgIo}Ejck}H7zt|F*q$aI5lG}Gi5b0 zVKp-|IX5$AlQSPDBQZBLG&wh8H7zk@VKOZ=GB!6YVKF%{EjczcG&Ev2Vl+2qlYJju z4>mS3H8(OeIWsvnHaRdilj$GTBsMWLVPQ9BV=ZJfI590WGGt>dIbkt2EjVFgHZe0| zG-5SmW|QI|M-VbCFgYzSH&ih>Iy5mlGc&U}A!rB|bsn)d00006VoOIv09^oG09{Ca zAg`0RDIS032?r4=A&JFK1poj7b4f%&R7l6|md#2lF%-vtNv0i#iw&u7?6Uy zK0y6gXcY_Y-PPxC3n)9mw91U6oFq_RP zKNw>GP)e(Q368f<;l_oMU%)w<5gkSa+6XStwT!^r>|^ z9R`1c!7q$nm5#<3E-x=j=hNvFfYE5Q=(wM!pN3NfL^psHT4`rDQxF|MqqnkH@8k%H=xLb$C^pUl)k) zLHL%xUalKjU$5ndvMfU>6`~Y?+uz?0>*wX=1!D|pnga0j^c41EyWOVMY7xgVudlCY zt?BpsL3}ow&AY6%4u=~X8$?lr)*5RqyGyZ0r2qfP-4pZ`Z{qO^Zfjb)|#E2ogjX7bya1` z_V#v(DVv*{VGsJf2#}^JQ4|HH_&*v;!Zpl*Pb$yvV9}pyY5)KL07*qoM6N<$f>+FI A_W%F@ diff --git a/src/main/resources/assets/dfscript/settings_highlight.png b/src/main/resources/assets/dfscript/settings_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..313fcc35d04362a3eaacd8cebe661523aec6b6e7 GIT binary patch literal 11345 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dfscript/unupload.png b/src/main/resources/assets/dfscript/unupload.png index c9e76dc29cd71809a4c14d858151f7f08b74a9de..3361ee88c5ed2237e8698ea1d436691265406555 100644 GIT binary patch literal 11085 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 delta 983 zcmV;|11S8>R^SJa7k?-S1^@s6{xRCy00001b5ch_0Itp)=>Px&nn^@KR7i=%l}~FM zM;OL`JG-l0$*C1gW!ZJXE-fx;?!AQe;7c#P_YiVOa>=EqeuLy@=)s2`gAFDj^`ZFC zOX(rdVjXPq0cs?&vg_Isp#(wYm3DWg2YFs;Z3*1kkQanzXMf&#=6V0jJPu&EM)Lr+ zwze)TWLXA)>$(#+JC1`f13o)DJFKm(4FK)LI5WnewZ`{-k|Y^>fKrOX!^6RNbYq&P zIY+HEuIu8uu8b`+-}l8Qj$>K#?4)%{(-fr?3(ubm@T-*-=I7@Hz_Qj_)9dvJfj}+iK0kyY4=KjMhjp=KWe`guupH^6z4`1FBzM+4dy=ivUw7~F;@LA{ z_Q%_|?8Y(GCyxQB%*@Eh*d>|s@B5TWC4aizuCVj~_V)JVO4$uIe_590-aX59 z(mSaD`u)C46bc2Vr>BQ)pcKX!lu|g3L#b4f=gfv_^9|r|-4byAE?yZBV0(M}!h$W( zXiJ>8(cIQ*HC9(whiy}<)y8hRtfm|s91O;z8?T}%_FeQW*m+H?6FRw91z$R%*v)L5DiJD?_b6HK<-`|&9 zUYn*go6XB<%A5Q5d9l8JDNXsa-jHJ1mwv3K{QdCZf7X=njKD-qdGFC9j4}M{sLu=)T1002ovPDHLk FV1mPn<|qIF diff --git a/src/main/resources/assets/dfscript/unupload_highlight.png b/src/main/resources/assets/dfscript/unupload_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..3790a229c63eaee416e56022fb7a259577fb939f GIT binary patch literal 11230 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dfscript/upload.png b/src/main/resources/assets/dfscript/upload.png index 6b3956d7f491a1d0d04c0fb708d399e0748a2257..a4d7e21a6ac67844f73d910d80eab5164f257949 100644 GIT binary patch literal 11362 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 diff --git a/src/main/resources/assets/dfscript/upload_highlight.png b/src/main/resources/assets/dfscript/upload_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..fed93d19d81a4cc637d98b6324377a0e98aca793 GIT binary patch literal 11507 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%0A|rV1J~AR4)chheHGSC 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/dfscript/wrench.png b/src/main/resources/assets/dfscript/wrench.png index 1c382e4cf3548d39ad8988d9f1f9fe6fd7abd2e8..1cea67efe0c73cecdc8c0bf40d123b4835d8dc47 100644 GIT binary patch literal 10153 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 O002ovPDHLkV1fWd+>xyS diff --git a/src/main/resources/assets/dfscript/wrench_highlight.png b/src/main/resources/assets/dfscript/wrench_highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5e568c217fdfa8e778db15822b3029131ca0e8 GIT binary patch literal 10375 zcmeHtbyQSc+dd&mKOikNfOHNqFi3YuNP{2@6XXyxG!l{uB8^ChAV_zJbf z^T5A}`Hp(VNP>k$!{=jQ;-&}j1h}A_5q6GnfSb1q902#SLttTfO%!*ge@kYnSc*xV}Dq9=OWZ?d*B=@f-O1=!5tC!bL#?(Y#Z_Ir@zs z6W0)~R~$1gRL16tlaCFRi0aXrDJ&7q5|Jv$9s{KNQtunnj?qLnb$2e6_1*wH`#di zJ=ab$EM+TKchM2&%?;HnOsoy(=PF%%8^t9HJVI(_Seb z#p-t3=#}R0c&3eeg)pTHhEeZ#1Uz||eW`!i`=$;z)b*tP+prce$&G(`KxmXtVbRw8_YT&Lzw z7UXcb_xS|{Zu8I`Q9CJdfRdD?5bbggmZ^w9vh5xWDI6w;xNSgJ=ROA#wo)hymN(ls zzbihu_1PRJ$gO}RDOyk_{9})jRU$h|-<;ia?$+1%$2S$lY8Mpof!Q&N1Y&g?(5Jw6 zTzW;l>;XA3)*9ToarPdQ>oHJm@Oqp>d8d3zW=EWcK+Z^?2(M>}xdk|L43X;46k6Ds zWagAJO8U5NKePL_&tA?rB%J_#6f$)6iX6<7WrK9gN+xApD2&K}tvr0mzqk$b*(>IwObz<~Ne{c`y zvelbdn9HV}3kv(B18o;Bov}EE8N51={_eqk9V>pmkJ!`Ox)Me=ukCu8((@?#+3XZ4 z;2n8rn%5Q#BtnEMD^Qa8jXAX_rKb?>lvN2{}48J zEe7ER*cgtz%E)ZE`JFhpuI^TwvJKaX2<;p&SvpBGc#)d9eKCK?#p{H4z3C+IbRh7J zV};CY3QKgX=;HRrkXopI2bbPl$BZ zVc%z%UZpDPok+2ek` zsPAjg^BM%T1Wkqq1SD{ajK9(Eh=YIpRAL&n+j=UGO&%@ojPQiE_j5fiy6^S*fOmjV ze3)u^%P4a5eoafn_*O61i@LJw&d`i;@2ABf+C0`aw)d(j2NQFpA=Q$?W0iqAPL|!t zR#rg-4KENSZZWP|0ZjfG-P7)0izUEWVo_YIE0Y&R6nPs7gLx?cS7}_B%#nl4K0WF! zwS4$VWoQc6@MY89L)yOWVP3xg^V@8|=zx?wx(DE8?>#nuseQ@cMhsF|KP=;q49aPG z%Hz(8i!qBEhNQ6G5KbvP`vIH^Ag&kSn-{q7o;}JXY8{~%oqrArXj}OqGxW~z{mWh4 zSIiVg<>15>Dt{c75?-dRa`7DI^K!+fl*J>*3SS)`z%8(j;>v8 zl4tf*?)Ne`Z>DG3hij(S0-}@80e6~kK2IM%3*=z4Pl~B_rSOK!$w!qK5Wc7=MLZX7 zoR)#hDqSY_-KHRRr0;THr~On0Lvg?7b0SVur#qRM(h#>Fn4Ym97`CW+r$Wrw`rM*W zJ5rQwPe-@+7zddBIl;pu9<`%GAd#kFao^@B)#3#&jidHN!e=9a@8H@XmJs3R3BCt% zRMG7 zY$MGT`T5ql;D)IR`C`X~3cjGbKx32#Xym!56i|V(wB5aM=87^4pkZw#b->WwV3Wk3 zJIakvhK}$@aSgDc_T0S`WH>g<2-rT_fjX^pLnd{42*phJ=EKt?;x?=&{1w@XiInWK zM?uz1W#P^Bbr9}}24J|nzG4i!j(;C+`+(Yy%FUr|MA2KVw-uWH>?1DL1};_j3Pkur zi|=})*q@*5Afo4Y^{Z?TZ|q43@a^(6YDp~zA;NwHEzneIz`ni>Mk&oc=m@*D_@RW- zc+it`RF~oLjqM^7dzNf03Rkd>%fR7=7NcM-2lgHErOZ8DWMM>)8owZN`=(-l-)&9qKWGa3;Sm8bM+h*- zZ$qKcCZ>Tku3>!D2amETBv)Di{Im68c%Q1@x?`8_)|x=KxuFN#Q2#wvY6DXpy5gdO z1Q2?m=iT%M)Zo$H#=YaN*4NzaU4CEWGYCI-Wnc%KB6C_JJ~a0k)T+RcYS&bzYbLUb z`NAp$+>~!OswvBzy{;0X7AU$w!(W*S0}8%jQ|}Nxc3q}=eaI@$2&6~F6d1;TOCrnV zBaY&&YhQM^kYW1z+cavsrIgK6qg?G6rGdu6q}sUq5ltTLZC)Lmi7A!~UOr?!DG?E~O&^Ykq)(f)I<!Fl2)N96bXlK;?VJeTmfW=V}TF^h^J+5a0jo~rqi5z;G@pdKP&5~{7 zw&uwN5_G*aOsR@k)tc{=8$L`8itRdbQ9@}#Yjn&sygQL<%wYyye32%IgP=VBMVYeET z@649n7&*Iq!OgMF5gCk9r$qKuaQpAR;4=sT@g_s}TM<*pjFm$cD78)x%;%NNgvMd@ zX8fmz#fMU< z<-p`rgGC7^0_vA;8?}_JPkMdFwAR-ZXjh&!?Yz!VpN$p|k@V%9hM$<3%xpe|w6Uf4 z+Ifft8iK&Fe z1xlG)E?rNb?5Y%}oe@>@RC3BIINka{E34-bcwR`<1`VFuO&YD$C0Awa+s&&5kw zYkkS0oGP2{TME2;w4&shnoH#nLrK;g>ahYc^uP&xvX%@R zfLOak6p@HI-^;#HP{x}-o7>o%{4p+}U?!gi$0WrI5$Hom7rC6>d6}*Ej6u7)h^wy0NHQyd9gVEkP3!u&E@LZc} zZNo#e`bYV(2G+&wx-V$u->m4?>eLhT;Jhizw$EJ1j*8>I`I|zH^p;}lG*75NFRaA2 zTU2{hr)}BMSgtiS=lUJ9*Ckr~rJx|}RTAMR6VXDgjH9aUC_ zErb-&kkUOg%o4HfSnBQwKf*y!=cPWYPBI;t(c1Pd(93>EittR}&%uA;my~0aGg61! zBi3oarrPVBJOeThF}bIWHlYrK*GBjT!uw{HMTZ$Gy$dt8_fZphfchPN96ptMY0LKK zcI_+FWVpWVL3mR!)!G)}u@Jpd4qDIZ4L_P?Cr!`F$tLKh3dvLB_Bd)+NmK1ftv#b~ zCGo=uwb-x5bdleZbie6L*Eli$xI!A$k2JVu>YEQh-EV7_w(IQqi^oJgI9hl>fl90A z>Bw7SA5YTHD>?RRMcD@@kqC2~gQs(A%k|^@YKZl!@J>Io1hZstOfqk^HybetjE2{| zXYmxM)7WCO(6jnn-IzC`^0gFxWItp7KG?CACDl)TiOhSlilz63pYz#VBcO#ND?Wz0 zlfykBe^P~B$9pdGjVy}l)_-f zAQ*e)2Ck*R8hkWQ23f3Z(QW%e<*)j*$KKb_a$~}Q9yCd4?>G5LZwsh^U)CtnvP!8U zi}#tJntpG<(kr6hnJ7y6-a}H;H zj^$azQS$;#vQr}Jc%sbDizaElTrPYG7SsVQl%^lE=Fuo^f_3#2f(}db%dPxjZ**tO zbW%&#BZO6Boe(KN#v^`$zARXsf zq!&uOkA8&P%XqQp3iZ(EV>h|GFNe@&tyHQ3mFR*`Tm|($;ZYYQhfD1vErmpk%eZjV6znII6s+Fco!ubS8w@9T!(2o@&o& zvu}5cH=KJ-SNJ&w!8Hhqz;;RI8a9nH%oIG?>oS^o@DXPSNi@1OjSel9a znBxHvz;AM8RClWaCqb>Ey<^79<3;z}=b*rC>q%Q1ysWPi@2ieV7=3yDL+YJU)gNQ~ zgsaY6VQxx^EX>8m3py8EVHCG)u`lus@4zOc=Zke)i8!98YBp9iGN1SfzXS{(9NCb5 zC0=0Zi5_}mO*(He8>EVkdN{jP#Zg>~bgQnQFm5tcs5rFYG~+}LOg}intx}C>=yz~P zj}C9CA_5Y(k~V}k$IY@4?F%{2t_S6~We*x~6Y3NCBCj$}b&`i;i>fQbc#2l6EUNFB zAhLo7D6T247A0mSMjq01RCUPEx5$S!L$gf_@y8viQ?buIX(XJoE`z>vOp&bSZfVYU zi2v3c>z}UjS`nli9FJ2z^j_(cTJ*w=v%SL)!zJa5BV+p(PK0;A_!1DkGb}UM}xo+4!+<9MTm(8EWu}W1Z2@*(dr??kQXyKleEX&>XQE zZRYE2B*V1vHGXC0eG!t#jqx{w+ea}QHFgBdW|UK9v6-erR>z*av0Wyl2Hw`{A+xkT zkME+>&gmaGrLQ*rup`y`>>SIbAJ)vWm0*AKWVG2MUVln@@BEDCw*;5t^T<2jf5fq@ zxH`5Ugf{r~$)>T)e%Pm0o;m3IULF)D-MQ!Xt$DWKvLR8L1n@ShwlTD-w4rWPKs_E| zUfOro^lH@OTN^jJrRZ>Eu9U25EJXWdj!H$!!ux{Ln7bCa{iz}ih0xW5WJ3=3aM!)B zkL$zgjD|?B(eLUy$E1gR>vEWqbhh8yH0;}unT_~1*E4=Hc(A7;Gr#H`#hrHkF%Lvi zy(IST2>5RMw;}zLc>qmCas>Wv_u&aN+xP}YHGx*`{f|TA$xS31qHXOCS6{RWv-j~& zUtjyp9jO*w;H3ye^68RjGu!g4?XbvNzO-8HGvGUsoO{$AT(>?wvLmR)f^yGw+jHBi zY-;jYyk5*Z);qSS?L9hZn19ZBA$4_g$Jd&P#LiLaW4TqAp!c&aM#F>GFNeLR#=XXv zbdn%h$2v+l1w*CQqdbNgyp<7Yhm035i-;?m2-^AxcPF!yA8rKnoLOoax*awp?6qNG zVTaf$D(b2$D*pN29P_q3%`aA3tzC|x(^5ZDkB5}{qJ>4#y#m0q#AV1A6#B);cC>Zn zi=ge7nCw~!!V^sr9{uA4RA? zP(mO#%Ev|({cLikVB#`@ER3uJ3+J}Tk&+J(cj%k@Z_JkaSyKJyGZ}AO+#-w5i6Hh*d1zijSivhWJR7N5dNN)g#fnshHYkvP#S zMItNj&MJ}VORB+#X`>oZ)qA~`w0#b|b|u3M@(h}400MGhd#<-QL=Viw^zLWd%C0Rk zdt9iadRKUYW1-lFc`*#Kr_2|7V|@3u>eMr7$-K&UqaVESrLi4Do}W+Dq;dvc)75^N zy0XVjzP#HwH^!*?9=F$`AsiP%wm~o|4KR6qsMqthR1$E|P+Ro}Qipo+1LyC>uc_7z`E^ z5*8E|=EorT(cVsO5HEfwG}}*#-#L`vXei3g#m&yy3GkB>V(skiCe6x<=?DDjAJRoj z>o0mI^dBl<^bqudxCjCTganaD!M|Ie-IP5rB!4*czgnOTFxx?bdT_L}I|>R{_JBLN zvHhI_2K~$4#U17ND;yY95bg*^VxVZusK9>=sj9A}`AKFlVS8O!C(y0w^S8 z4MRZqttG%veo+Jj&MyIzfbk27Ld4;4QE?y$Ec7=jbtkkN#0d)jNrfR7u*2}cMJ2!z z;zCeaYi8_m~`49AvSP97blxvWBe3c zQeIbGnpIffcj&JcT}Ox;0%L%g19na@XHWEhzy@|mxV{_Yr=CD@ArUd4gfK`*3&bVBp~v8&(Fk2V#2{l3;9{87=l0JlvG5)A#Tnn17~MPY1W@E0DfBj zDsX_*?`cu9Lt_x$KWqMvs@I3R{{HLtN#JPrs|x`5Rk)H6=3u+5- zvVmh}_#Y+pXS?11k}i;hxP+Lv2%KLW21Z~qE+Niu4VDn*M~DKgfkF@=Yf*^EuQ2{% zM>`|jJRvB!ybUH&Of;Ah`V|d;>kl!x|B3gsh5uAaNLYj)D9kS`W&i|9iU1{rgjfat z2v+dtoc=RfDZ&3o52;^(zbyh7yWiU|iwkD068vki`a`du68;~4{>a1s;RqP&e+T)m z^!-<^f93kG6!@>e|5n$(a{X5d{8!+AtLy)pT!jC5+<`k`?tnZo4>O2+14Wnzp_|s4 zs!CX)n5*kzRR=Q6nZQNO6pe*NMDg>$#!5+}#Wdb>Q`b_ywN6a;8#C4>N}3-F3x`Wx zN!~!Bzc{f`ds~hywE40%62Nui?j0u5oXC~;Z{EDYzWt3->J}B1pgi7fJTow&0Zmi| zy;aLtV)SiLeElOGueM>L>|@rJ_V)H@nsy;9GKEv;a`cOW_07#^+uPfMfR^RuUmPwXmjry09lD+xRRK(w6MwHlWnWi+38l#8w~7m(tjBIvhc4U24OkY`RLi zh6agE`&w5grfX@vV3CX=?AnHg?0sK@QKb(1Vh(y}hp!GdylV0C#a3Zqp{rJt*opqb zIbTipAM`DV%Ck(LYO`;CQBbV`-)J-`d3lLgg5ioPu zZ5^FSr}rUbT}!k`UesWHW(b+C;n=nq4Gj(7OHF-`$B!G{Hpv*idU{c{)A(LHva>B> zYfwx}asFiOoj+K={+=9pIpzNT{;v5GDp2~O+uYy>a*5gcg9G$bjj|zFQj&H3z6QZM zgVylGETNQy1Yo^^zVF~b#M#*ytD&ihl{GuTDGbrp%;5brKX;C$tPWAm6t)^S zFk`3~O2QiwhU->dM+mB??wS F{{u$(P3Hgr literal 0 HcmV?d00001 diff --git a/src/main/resources/dfscript.mixins.json b/src/main/resources/dfscript.mixins.json index 87fa631..3d24293 100644 --- a/src/main/resources/dfscript.mixins.json +++ b/src/main/resources/dfscript.mixins.json @@ -11,9 +11,8 @@ "render.MInGameHUD", "render.MMultiplayerScreen", "render.MOptionsScreen", - "sound.MSoundSystem" - ], - "client": [ + "sound.MSoundSystem", + "game.MClientCommonNetworkHandler" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 7d0a613..6b5a4c4 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -18,8 +18,8 @@ "dfscript.mixins.json" ], "depends": { - "fabricloader": ">=0.14.6", - "fabric": "*", + "fabricloader": ">=0.15.3", + "fabric-api": "*", "minecraft": "~1.20", "java": ">=17" }