From 6832bfdfab3d1f8ef1ced1d4872c71cc692c0244 Mon Sep 17 00:00:00 2001 From: Combimagnetron Date: Wed, 20 Aug 2025 22:53:51 +0100 Subject: [PATCH 1/4] v2 --- .../bedrock/BedrockCompatibility.java | 4 - .../sunscreen/bedrock/jsonui/JUIBinding.java | 5 - .../sunscreen/bedrock/jsonui/JUIElement.java | 4 - .../sunscreen/bedrock/jsonui/JUIGrid.java | 4 - .../sunscreen/bedrock/jsonui/JUIScreen.java | 4 - .../sunscreen/bedrock/jsonui/JsonUI.java | 10 - .../sunscreen/config/CachedConfigDiv.java | 13 - .../sunscreen/config/Config.java | 5 - .../sunscreen/config/ConfigTypeAdapter.java | 55 -- .../sunscreen/config/MenuConfig.java | 36 -- .../config/MenuConfigTransformer.java | 478 ----------------- .../config/adapters/ActionsTypeAdapter.java | 82 --- .../config/adapters/CanvasTypeAdapter.java | 27 - .../adapters/IdentifierTypeAdapter.java | 36 -- .../config/adapters/PositionTypeAdapter.java | 28 - .../config/adapters/SizeTypeAdapter.java | 28 - .../sunscreen/element/Element.java | 77 --- .../sunscreen/element/FlexArea.java | 4 - .../sunscreen/element/Grid.java | 4 - .../sunscreen/element/Interactable.java | 49 -- .../sunscreen/element/Operator.java | 97 ---- .../sunscreen/element/Padding.java | 4 - .../element/SimpleBufferedElement.java | 88 ---- .../sunscreen/element/UIProperty.java | 9 - .../element/animated/AnimatedElement.java | 236 --------- .../sunscreen/element/animated/Keyframe.java | 19 - .../sunscreen/element/div/Div.java | 481 ------------------ .../sunscreen/element/div/Edit.java | 60 --- .../sunscreen/element/div/ScrollableDiv.java | 106 ---- .../sunscreen/element/impl/ButtonElement.java | 169 ------ .../element/impl/DropdownElement.java | 145 ------ .../sunscreen/element/impl/ImageElement.java | 46 -- .../element/impl/SelectorElement.java | 289 ----------- .../sunscreen/element/impl/ShapeElement.java | 78 --- .../sunscreen/element/impl/TextElement.java | 134 ----- .../element/impl/TextInputElement.java | 155 ------ .../sunscreen/image/effect/Effect.java | 13 - .../image/effect/GreyscaleEffect.java | 19 - .../sunscreen/menu/AspectRatioMenu.java | 347 ------------- .../sunscreen/menu/Geometry.java | 5 - .../sunscreen/menu/MenuMagicValues.java | 7 - .../sunscreen/menu/MenuTemplate.java | 89 ---- .../sunscreen/menu/OpenedMenu.java | 4 +- .../sunscreen/menu/Position.java | 102 ---- .../menu/RuntimeDefinableGeometry.java | 147 ------ .../combimagnetron/sunscreen/menu/Size.java | 113 ---- .../sunscreen/menu/editor/Editable.java | 4 - .../sunscreen/menu/editor/EditableField.java | 11 - .../sunscreen/menu/editor/EditableType.java | 4 - .../editor/field/EditorFieldTypeWidget.java | 22 - .../field/WidgetAnnotationProcessor.java | 7 - .../menu/editor/field/WidgetContext.java | 6 - .../widget/PositionEditorFieldTypeWidget.java | 69 --- .../menu/editor/menu/EditorMenu.java | 348 ------------- .../element/CheckerBoardEditorElement.java | 155 ------ .../menu/element/ElementDrawerElement.java | 70 --- .../editor/menu/element/SectionElement.java | 47 -- .../menu/editor/menu/element/TreeElement.java | 32 -- .../element/sidebar/ElementTabElement.java | 47 -- .../menu/element/sidebar/LayerTabElement.java | 123 ----- .../menu/element/toolbar/ToolbarDiv.java | 12 - .../element/toolbar/ToolbarWidgetElement.java | 15 - .../menu/emulator/ChestMenuEmulator.java | 70 --- .../sunscreen/menu/input/Click.java | 7 - .../sunscreen/menu/input/Input.java | 70 --- .../menu/input/InputBackgroundShader.java | 93 ---- .../sunscreen/menu/input/InputHandler.java | 67 --- .../sunscreen/menu/input/KeyPress.java | 5 - .../sunscreen/menu/input/Scroll.java | 5 - .../sunscreen/menu/input/TextInput.java | 110 ---- .../menu/simulate/ChestMenuEmulator.java | 107 ---- .../menu/simulate/ForwardClickAction.java | 53 -- .../sunscreen/menu/simulate/Simulator.java | 13 - .../sunscreen/menu/timing/DebugElement.java | 63 --- .../sunscreen/menu/timing/MenuTicker.java | 83 --- .../sunscreen/menu/timing/Tick.java | 24 - .../menu/timing/TickFailException.java | 7 - .../sunscreen/menu/timing/Tickable.java | 7 - .../sunscreen/registry/MenuRegistry.java | 79 --- .../sunscreen/registry/VariableRegistry.java | 14 - .../sunscreen/style/ColorStyle.java | 32 -- .../combimagnetron/sunscreen/style/Style.java | 15 - .../combimagnetron/sunscreen/style/Text.java | 76 --- .../sunscreen/style/sheet/StyleConfig.java | 31 -- .../sunscreen/style/type/StyleType.java | 7 - .../sunscreen/style/type/TileStyleType.java | 66 --- .../sunscreen/ui/MenuTemplate.java | 9 + .../sunscreen/ui/ModernLayout.java | 13 + .../sunscreen/ui/ModernMenu.java | 4 + .../sunscreen/ui/element/ElementGroup.java | 17 + .../sunscreen/ui/element/ElementLike.java | 29 ++ .../sunscreen/ui/element/Elements.java | 4 + .../sunscreen/ui/element/ModernElement.java | 5 + .../ui/element/impl/ImageElement.java | 20 + .../ui/element/tree/ElementTree.java | 12 + .../sunscreen/ui/graphic/GraphicLike.java | 13 + .../sunscreen/ui/graphic/NineSlice.java | 4 + .../sunscreen/ui/graphic/color/ColorLike.java | 144 ++++++ .../ui/graphic/modifier/GraphicModifier.java | 4 + .../sunscreen/ui/graphic/shape/Rectangle.java | 4 + .../sunscreen/ui/graphic/shape/Shape.java | 4 + .../sunscreen/ui/property/Margin.java | 47 ++ .../sunscreen/ui/property/Padding.java | 46 ++ .../sunscreen/ui/property/Position.java | 46 ++ .../sunscreen/ui/property/Property.java | 12 + .../ui/property/RelativeMeasure.java | 164 ++++++ .../sunscreen/ui/property/Size.java | 46 ++ .../ui/property/handler/PropertyHandler.java | 14 + .../sunscreen/ui/render/RenderAction.java | 28 + .../sunscreen/ui/render/phase/Phase.java | 9 + .../ui/render/phase/context/PhaseContext.java | 11 + .../sunscreen/ui/style/Style.java | 4 + .../sunscreen/ui/style/StyleAttribute.java | 9 + .../sunscreen/ui/style/Styles.java | 4 + .../sunscreen/ui/theme/ModernTheme.java | 12 + .../sunscreen/ui/theme/ThemeDecorator.java | 4 + .../sunscreen/ui/theme/Themes.java | 4 + .../sunscreen/ui/theme/color/ColorScheme.java | 46 ++ .../ui/theme/color/ColorSchemes.java | 4 + .../sunscreen/util/RuntimeDefinable.java | 34 +- api/src/main/resources/example.shine | 2 +- api/src/main/resources/example.style | 6 +- api/src/main/resources/test.menu | 6 +- api/src/test/java/TestModernTemplate.java | 10 + common/build.gradle.kts | 14 + .../FeatherClientSunscreenHook.java | 0 .../protocol/FeatherClientMessage.java | 0 .../hook/labymod/LabyModSunscreenHook.java | 0 .../hook/labymod/protocol/LabyModMessage.java | 0 ...ClientboundLabyModAddonDisableMessage.java | 0 .../hook/lunar/LunarClientSunscreenHook.java | 0 .../lunar/protocol/LunarClientMessage.java | 0 ...lientboundLunarClientModActionMessage.java | 0 gradlew | 4 +- gradlew.bat | 4 +- settings.gradle.kts | 1 + .../sunscreen/SunscreenPlugin.java | 3 + 137 files changed, 855 insertions(+), 6016 deletions(-) delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/bedrock/BedrockCompatibility.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIBinding.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIGrid.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIScreen.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JsonUI.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/CachedConfigDiv.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/Config.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/ConfigTypeAdapter.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfig.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfigTransformer.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/adapters/ActionsTypeAdapter.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/adapters/CanvasTypeAdapter.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/adapters/IdentifierTypeAdapter.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/adapters/PositionTypeAdapter.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/config/adapters/SizeTypeAdapter.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/Element.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/FlexArea.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/Grid.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/Interactable.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/Operator.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/Padding.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/SimpleBufferedElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/UIProperty.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/animated/AnimatedElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/animated/Keyframe.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/div/Div.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/element/div/Edit.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/div/ScrollableDiv.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/impl/ButtonElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/impl/DropdownElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/impl/ImageElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/impl/SelectorElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/impl/ShapeElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextInputElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/image/effect/Effect.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/image/effect/GreyscaleEffect.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/AspectRatioMenu.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/Geometry.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/MenuMagicValues.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/MenuTemplate.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/Position.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/RuntimeDefinableGeometry.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/Size.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/Editable.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableField.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableType.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/EditorFieldTypeWidget.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetAnnotationProcessor.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetContext.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/widget/PositionEditorFieldTypeWidget.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/EditorMenu.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/CheckerBoardEditorElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/ElementDrawerElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/SectionElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/TreeElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/ElementTabElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/LayerTabElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarDiv.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarWidgetElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/emulator/ChestMenuEmulator.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/input/Click.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/input/Input.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputBackgroundShader.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputHandler.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/input/KeyPress.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/input/Scroll.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/input/TextInput.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ChestMenuEmulator.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ForwardClickAction.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/Simulator.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/timing/DebugElement.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/timing/MenuTicker.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tick.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/timing/TickFailException.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tickable.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/registry/MenuRegistry.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/registry/VariableRegistry.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/style/ColorStyle.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/style/Style.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/style/Text.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/style/sheet/StyleConfig.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/style/type/StyleType.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/style/type/TileStyleType.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/MenuTemplate.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/ModernLayout.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/element/Elements.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/element/ModernElement.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/element/tree/ElementTree.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/NineSlice.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/color/ColorLike.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/modifier/GraphicModifier.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Rectangle.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Shape.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/property/Property.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ModernTheme.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ThemeDecorator.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/theme/Themes.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorScheme.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorSchemes.java create mode 100644 api/src/test/java/TestModernTemplate.java create mode 100644 common/build.gradle.kts rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/FeatherClientSunscreenHook.java (100%) rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/protocol/FeatherClientMessage.java (100%) rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/labymod/LabyModSunscreenHook.java (100%) rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/LabyModMessage.java (100%) rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/clientbound/ClientboundLabyModAddonDisableMessage.java (100%) rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/lunar/LunarClientSunscreenHook.java (100%) rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/LunarClientMessage.java (100%) rename {api => common}/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/clientbound/ClientboundLunarClientModActionMessage.java (100%) diff --git a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/BedrockCompatibility.java b/api/src/main/java/me/combimagnetron/sunscreen/bedrock/BedrockCompatibility.java deleted file mode 100644 index 0409f09..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/BedrockCompatibility.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.bedrock; - -public interface BedrockCompatibility { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIBinding.java b/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIBinding.java deleted file mode 100644 index 5ad68cc..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIBinding.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.combimagnetron.sunscreen.bedrock.jsonui; - -public interface JUIBinding { - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIElement.java b/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIElement.java deleted file mode 100644 index bfceb03..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIElement.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.bedrock.jsonui; - -public interface JUIElement { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIGrid.java b/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIGrid.java deleted file mode 100644 index 57210ef..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIGrid.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.bedrock.jsonui; - -public interface JUIGrid { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIScreen.java b/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIScreen.java deleted file mode 100644 index b240300..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JUIScreen.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.bedrock.jsonui; - -public interface JUIScreen { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JsonUI.java b/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JsonUI.java deleted file mode 100644 index 479627b..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/bedrock/jsonui/JsonUI.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.combimagnetron.sunscreen.bedrock.jsonui; - -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import org.jetbrains.annotations.NotNull; - -public interface JsonUI { - - JUIScreen transform(@NotNull OpenedMenu openedMenu); - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/CachedConfigDiv.java b/api/src/main/java/me/combimagnetron/sunscreen/config/CachedConfigDiv.java deleted file mode 100644 index 6197e57..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/CachedConfigDiv.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.combimagnetron.sunscreen.config; - -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.passport.util.condition.Condition; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.util.Identifier; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; - -public record CachedConfigDiv(Collection
elements, Identifier identifier, Collection> geometry, @Nullable Condition condition, double order) { - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/Config.java b/api/src/main/java/me/combimagnetron/sunscreen/config/Config.java deleted file mode 100644 index 6fd7e4b..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/Config.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.combimagnetron.sunscreen.config; - -@me.combimagnetron.passport.config.annotation.Config -public record Config(double screenDistance, boolean forceShaderFov, boolean screenSetup, String setupImageUrl) { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/ConfigTypeAdapter.java b/api/src/main/java/me/combimagnetron/sunscreen/config/ConfigTypeAdapter.java deleted file mode 100644 index 27a4c2b..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/ConfigTypeAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -package me.combimagnetron.sunscreen.config; - -import me.combimagnetron.passport.config.element.ConfigElement; -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.config.element.Section; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public interface ConfigTypeAdapter { - - @Nullable T direct(@NotNull ConfigElement element); - - @Nullable T find(@NotNull Section section); - - static boolean isSection(ConfigElement element) { - return element instanceof Section; - } - - static boolean isNode(ConfigElement element) { - return element instanceof Node; - } - - static @Nullable Section find(ConfigElement element, String name) { - if (isSection(element) && element.name().equals(name)) { - return (Section) element; - } - Section section = (Section) element; - for (ConfigElement child : section.elements()) { - if (!child.name().equals(name)) { - continue; - } - return (Section) child; - } - return null; - } - - static @Nullable Node find(ConfigElement element, String name, Class type) { - if (!isNode(element) && ((Section) element).elements().stream().anyMatch(element1 -> element1.name().equals(name))) { - return ((Section) element).elements().stream() - .filter(element1 -> element1.name().equals(name)) - .map(element1 -> (Node) element1) - .findFirst() - .orElse(null); - } - Node node = (Node) element; - if (!node.name().equals(name)) { - return null; - } - if (!(node.type().equals(type))) { - return null; - } - return (Node) node; - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfig.java b/api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfig.java deleted file mode 100644 index 25ac2ad..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.combimagnetron.sunscreen.config; - -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.util.Identifier; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; - -public interface MenuConfig { - - @NotNull Identifier identifier(); - - @NotNull Collection divs(); - - interface DivConfig { - - Identifier identifier(); - - Collection elements(); - - Position position(); - - } - - interface ElementConfig { - - Identifier identifier(); - - Position position(); - - Class type(); - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfigTransformer.java b/api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfigTransformer.java deleted file mode 100644 index 8ade1dc..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/MenuConfigTransformer.java +++ /dev/null @@ -1,478 +0,0 @@ -package me.combimagnetron.sunscreen.config; - -import me.combimagnetron.passport.config.Config; -import me.combimagnetron.passport.config.element.ConfigElement; -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.passport.util.condition.Condition; -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.element.impl.*; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.Color; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.*; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.input.InputHandler; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.util.*; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.nio.file.Path; -import java.util.*; -import java.util.stream.Collectors; - -@SuppressWarnings("unchecked") -public interface MenuConfigTransformer { - - @NotNull Collection read(@NotNull Path folder); - - @Nullable MenuTemplate handle(Config config, String fileName); - - class Impl implements MenuConfigTransformer { - public final static String ErrorMessage = "\nPlease revisit the menu config or contact plugin developers.\nWhen contacting the developers please provide the fault code in the square brackets and your config file."; - - @Override - public @NotNull Collection read(@NotNull Path folder) { - List menuTemplates = new ArrayList<>(); - for (File file : Objects.requireNonNull(folder.toFile().listFiles())) { - if (!file.getName().endsWith(".menu")) { - continue; - } - Config config = Config.file(file.toPath()); - MenuTemplate menuTemplate = handle(config, file.getName()); - if (menuTemplate != null) { - menuTemplates.add(menuTemplate); - } - } - return menuTemplates; - } - - private boolean exists(String entry, Config config) { - return config.nodes().stream().anyMatch(configElement -> configElement.name().equals(entry)) || - config.sections().stream().anyMatch(configElement -> configElement.name().equals(entry)); - } - - private String get(String entry, Config config) { - return ((Node)config.nodes().stream().filter(configElement -> configElement.name().equals(entry)).findFirst().get()).value(); - } - - @Override - public @Nullable MenuTemplate handle(Config config, String fileName) { - if (!exists("identifier", config)) { - SunscreenLibrary.library().logger().error("[CR001] No identifier found in config file \"{}\".{}", fileName, ErrorMessage); - return null; - } - Identifier identifier = Identifier.split(get("identifier", config)); - if (!exists("type", config)) { - SunscreenLibrary.library().logger().error("[CR002] No menu type defined in config file \"{}\".{}", fileName, ErrorMessage); - return null; - } - String menuType = get("type", config); - MenuTemplate.Type openedMenuType = MenuTemplate.Type.valueOf(menuType.toUpperCase()); - if (openedMenuType == null) { - SunscreenLibrary.library().logger().error("[CR003] Invalid menu type \"{}\" in config file \"{}\".{}", menuType, fileName, ErrorMessage); - return null; - } - MenuTemplate openedMenu = MenuTemplate.simple(openedMenuType, identifier); - if (openedMenu == null) { - SunscreenLibrary.library().logger().error("[CR004] Failed to create menu from config file \"{}\".{}", fileName, ErrorMessage); - return null; - } - if (!exists("divs", config)) { - SunscreenLibrary.library().logger().error("[CR005] No divs defined in config file \"{}\".{}", fileName, ErrorMessage); - return null; - } - Section divsSection = config.sections().stream().filter(configElement -> configElement.name().equals("divs")).findFirst().get(); - for (ConfigElement divConfigElement : divsSection.elements()) { - if (divConfigElement instanceof Section divSection) { - Identifier id = Identifier.split(((Node)divSection.find("identifier")).value()); - Section elements = divSection.find("elements"); - Node orderNode = divSection.find("order"); - double order = 0; - if (orderNode != null) { - if (orderNode.value() != null) { - order = orderNode.value(); - } - } - Collection
elementConfigElements = new LinkedList<>(); - elements.elements().stream().filter(c -> c instanceof Section).map(c -> (Section) c).sorted(Comparator.comparing(c -> { - Node integerNode = c.find("order"); - if (integerNode == null) { - return 0; - } - if (integerNode.value() == null) { - return 0; - } - return integerNode.value(); - })).forEachOrdered(elementConfigElements::add); - for (ConfigElement configElement : elements.elements()) { - if (!(configElement instanceof Section section)) { - continue; - } - elementConfigElements.add(section); - } - if (elementConfigElements.isEmpty()) { - SunscreenLibrary.library().logger().error("[CR006] No elements found in config file \"{}\".{}", divConfigElement.name(), fileName, ErrorMessage); - return null; - } - Node conditionNode = divSection.find("condition"); - Condition condition = null; - if (conditionNode != null) { - if (conditionNode.value() != null) { - String conditionString = conditionNode.value(); - condition = Condition.of(conditionString); - } - } - Section positionSection = divSection.find("position"); - List> geometryBuilders = List.of(Position.config(positionSection), Size.config(divSection.find("size"))); - CachedConfigDiv div = new CachedConfigDiv(elementConfigElements, id, geometryBuilders, condition, order); - openedMenu.div(div); - } else { - SunscreenLibrary.library().logger().error("[CR006] Invalid div \"{}\" in config file \"{}\".{}", divConfigElement.name(), fileName, ErrorMessage); - } - } - return openedMenu; - } - - } - - interface ElementTransformer { - Map Transformers = Map.of( - "image", new ImageElementTransformer(), - "button", new ButtonElementTransformer(), - "text", new TextElementTransformer(), - "shape", new ShapeElementTransformer(), - "text_input", new TextInputElementTransformer(), - "selector", new SelectorElementTransformer() - ); - - static Element transform(Section section, String fileName) { - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("type"))) { - SunscreenLibrary.library().logger().error("[CR008] No element type defined in config file \"{}\".{}", fileName, Impl.ErrorMessage); - return null; - } - String elementType = ((Node)section.elements().stream().filter(configElement -> configElement.name().equals("type")).findFirst().get()).value(); - ElementTransformer transformer = Transformers.get(elementType); - if (transformer == null) { - SunscreenLibrary.library().logger().error("[CR009] Invalid element type \"{}\" in config file \"{}\".{}", elementType, fileName, Impl.ErrorMessage); - return null; - } - return transformer.transform(section); - } - - Element transform(Section section); - - private static Canvas text(Section section, Canvas canvas) { - Section textSection = section.find("text"); - String text = ((Node)textSection.find("text")).value(); - Section positionSection = textSection.find("position"); - Position.PositionBuilder positionBuilder = Position.config(positionSection); - Position position = positionBuilder.finish(canvas.size(), canvas.size()); - Vec2i vec2d = ViewportHelper.fromPosition(position); - Text.Font font = Text.Fonts.stream().filter(f -> f.name().equals(((Node)textSection.find("font")).value())).findFirst().orElse(Text.Font.vanilla()); - Text style = Text.text(text, font); - Section colorSection = textSection.find("color"); - Color color = Color.of(((Node)colorSection.find("red")).value(), ((Node)colorSection.find("green")).value(), ((Node)colorSection.find("blue")).value()); - return canvas.text(style, vec2d, color); - } - - static Map get(Section section) { - Map canvases = new LinkedHashMap<>(); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("canvas"))) { - SunscreenLibrary.library().logger().error("[CR008] No canvas defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return canvases; - } - ConfigElement canvasElement = section.elements().stream().filter(configElement -> configElement.name().equals("canvas")).findFirst().get(); - boolean hasText; - if (canvasElement instanceof Node canvasNode) { - Node node = (Node)canvasNode; - if (!node.value().startsWith("file(")) { - return canvases; - } - Canvas file = file(node.value().substring(5, node.value().length() - 1)); - canvases.put(node.name(), file); - return canvases; - } else if (canvasElement instanceof Section canvasSection) { - hasText = canvasSection.elements().stream().anyMatch(configElement -> configElement.name().equals("text")); - boolean hasSplit = canvasSection.elements().stream().anyMatch(configElement -> configElement.name().equals("split")); - boolean shouldSplit = hasSplit && ((Node) canvasSection.find("split")).value() != null; - if (shouldSplit) { - int split = ((Node) canvasSection.find("split")).value(); - String image = ((Node) canvasSection.find("image")).value(); - System.out.println(image); - Canvas canvas = file(image.substring(5, image.length() - 1)); - ArrayList types = ((Node>)canvasSection.find("order")).value(); - int y = (int) (canvas.size().y() / split); - for (int i = 0; i < canvas.size().y(); i+= y) { - Canvas sub = canvas.sub(Vec2i.of(canvas.size().x(), y), Vec2i.of(0, i)); - if (hasText) { - sub = text(canvasSection, sub); - } - canvases.put(types.get(i/y), sub); - } - return canvases; - } - for (ConfigElement element : canvasSection.elements()) { - if (element instanceof Node canvasNode) { - Node node = (Node)canvasNode; - if (node.value().startsWith("file(")) { - Canvas file = file(node.value().substring(5, node.value().length() - 1)); - if (hasText) { - file = text(canvasSection, file); - } - canvases.put(node.name(), file); - } - return canvases; - } else if (element instanceof Section canvasNode) { - Section canvasSection1 = (Section) element; - if (canvasSection1.elements().stream().noneMatch(configElement -> configElement.name().equals("file"))) { - SunscreenLibrary.library().logger().error("[CR008] No file defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return canvases; - } - String fileName = ((Node)canvasSection1.find("canvas")).value(); - Canvas file = file(fileName.substring(5, fileName.length() - 1)); - if (hasText) { - file = text(canvasSection, file); - } - canvases.put(canvasNode.name(), file); - } - } - return canvases; - } else { - SunscreenLibrary.library().logger().error("[CR009] Invalid canvas \"{}\" in config file \"{}\".{}", canvasElement.name(), section.name(), Impl.ErrorMessage); - return canvases; - } - } - - static Canvas file(String fileName) { - Path path = Path.of(fileName); - if (!SunscreenLibrary.library().path().resolve(path).toFile().exists()) { - SunscreenLibrary.library().logger().error("[CR010] File \"{}\" does not exist.{}", fileName, Impl.ErrorMessage); - return null; - } - return Canvas.image(Canvas.ImageProvider.file(path)); - } - - class ImageElementTransformer implements ElementTransformer { - @Override - public Element transform(Section section) { - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("identifier"))) { - SunscreenLibrary.library().logger().error("[CR011] No identifier defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Identifier identifier = Identifier.split(((Node)section.find("identifier")).value()); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("position"))) { - SunscreenLibrary.library().logger().error("[CR012] No position defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Section positionSection = section.find("position"); - Position.PositionBuilder position = Position.config(positionSection); - Map canvases = get(section); - if (canvases.isEmpty()) { - SunscreenLibrary.library().logger().error("[CR013] No canvas found in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - SimpleBufferedElement element = ImageElement.imageElement(canvases.values().stream().findAny().get(), identifier, position); - return element; - } - } - - class ShapeElementTransformer implements ElementTransformer { - - @Override - public Element transform(Section section) { - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("identifier"))) { - SunscreenLibrary.library().logger().error("[CR014] No identifier defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Identifier identifier = Identifier.split(((Node)section.find("identifier")).value()); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("position"))) { - SunscreenLibrary.library().logger().error("[CR015] No position defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Section positionSection = section.find("position"); - Position.PositionBuilder position = Position.config(positionSection); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("size"))) { - SunscreenLibrary.library().logger().error("[CR016] No size defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Section sizeSection = section.find("size"); - Size.SizeBuilder size = Size.config(sizeSection); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("color"))) { - SunscreenLibrary.library().logger().error("[CR017] No color defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Color color; - Section colorSection = section.find("color"); - int red = ((Node)colorSection.find("red")).value(); - int green = ((Node)colorSection.find("green")).value(); - int blue = ((Node)colorSection.find("blue")).value(); - color = Color.of(red, green, blue); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("shape"))) { - SunscreenLibrary.library().logger().error("[CR018] No shape defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - String shape = ((Node)section.find("shape")).value(); - if (shape == null) { - SunscreenLibrary.library().logger().error("[CR019] No shape found in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - if (shape.equals("rectangle")) { - SimpleBufferedElement element = ShapeElement.rectangle(null, identifier, position, color); - element.geometry(size); - return element; - } else if (shape.equals("circle")) { - - } - return null; - } - } - - class ButtonElementTransformer implements ElementTransformer { - @Override - public Element transform(Section section) { - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("identifier"))) { - SunscreenLibrary.library().logger().error("[CR014] No identifier defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Identifier identifier = Identifier.split(((Node)section.find("identifier")).value()); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("position"))) { - SunscreenLibrary.library().logger().error("[CR015] No position defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Section positionSection = section.find("position"); - Position.PositionBuilder position = Position.config(positionSection); - Map canvases = get(section); - if (canvases.isEmpty()) { - SunscreenLibrary.library().logger().error("[CR016] No canvas found in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Map icons = new HashMap<>(); - canvases.forEach((key, value) -> icons.put(ButtonElement.State.valueOf(key.toUpperCase()), value)); - Size size = Size.pixel(canvases.values().stream().findAny().get().size()); - boolean hasSize = section.elements().stream().anyMatch(configElement -> configElement.name().equals("size")); - if (hasSize) { - size = null; - } - SimpleBufferedElement element = ButtonElement.buttonElement(size, identifier, position, icons); - if (hasSize) { - element.geometry(Size.config(section.find("size"))); - } - return element; - } - } - - class TextElementTransformer implements ElementTransformer { - @Override - public Element transform(Section section) { - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("identifier"))) { - SunscreenLibrary.library().logger().error("[CR017] No identifier defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Identifier identifier = Identifier.split(((Node)section.find("identifier")).value()); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("position"))) { - SunscreenLibrary.library().logger().error("[CR018] No position defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Section positionSection = section.find("position"); - Position.PositionBuilder position = Position.config(positionSection); - Text.Font font = Text.Fonts.stream().filter(f -> f.name().equals(((Node)section.find("font")).value())).findFirst().orElse(Text.Font.vanilla()); - String text = ((Node)section.find("text")).value(); - if (text == null) { - SunscreenLibrary.library().logger().error("[CR020] No text found in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Text text1 = Text.text(text, font); - SimpleBufferedElement element = TextElement.textElement(identifier, position, text1); - return element; - } - } - - private static boolean exists(String entry, Section section) { - return section.elements().stream().anyMatch(configElement -> configElement.name().equals(entry)); - } - - private static A get(Class clazz, String entry, Section section) { - if (!exists(entry, section)) { - SunscreenLibrary.library().logger().error("[CR021] No {} defined in config file \"{}\".{}", entry, section.name(), Impl.ErrorMessage); - return null; - } - return ((Node)section.find(entry)).value(); - } - - private static String get(String entry, Section section) { - return get(String.class, entry, section); - } - - class TextInputElementTransformer implements ElementTransformer { - - @Override - public Element transform(Section section) { - Identifier identifier = Identifier.split(ElementTransformer.get("identifier", section)); - if (!ElementTransformer.exists("position", section)) { - SunscreenLibrary.library().logger().error("[CR018] No position defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("size"))) { - SunscreenLibrary.library().logger().error("[CR019] No input handler defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Position.PositionBuilder position = Position.config(section.find("position")); - Size.SizeBuilder size = Size.config(section.find("size")); - TextInputElement element = TextInputElement.of(null, identifier, position, null); - element.add(size); - RuntimeDefinable.Type type = new RuntimeDefinable.Impl.Type<>(InputHandler.class, OpenedMenu::inputHandler); - element.add(type); - Map actionWrappers = Map.of();//Impl.action(section); - if (actionWrappers != null) { - actionWrappers.forEach(element::action); - } - return element; - } - - } - - class SelectorElementTransformer implements ElementTransformer { - @Override - public Element transform(Section section) { - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("identifier"))) { - SunscreenLibrary.library().logger().error("[CR022] No identifier defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Identifier identifier = Identifier.split(((Node)section.find("identifier")).value()); - if (section.elements().stream().noneMatch(configElement -> configElement.name().equals("position"))) { - SunscreenLibrary.library().logger().error("[CR023] No position defined in config file \"{}\".{}", section.name(), Impl.ErrorMessage); - return null; - } - Section positionSection = section.find("position"); - Position.PositionBuilder position = Position.config(positionSection); - SelectorElement.Builder selectorElement = SelectorElement.selectorElement(null, identifier, null); - Section entries = section.find("entries"); - selectorElement.spacing(0); - Size size = null; - for (ConfigElement element : entries.elements()) { - Map canvases1 = get((Section) element).entrySet().stream().map(entry -> { - ButtonElement.State state = ButtonElement.State.valueOf(entry.getKey().toUpperCase()); - Canvas canvas = entry.getValue(); - return Map.entry(state, canvas); - }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - ButtonElement buttonElement = ButtonElement.buttonElement(Size.pixel(canvases1.values().stream().findAny().get().size()), null, Position.pixel(0, 0), canvases1); - selectorElement.button(buttonElement); - if (size == null) { - size = buttonElement.size(); - } - } - selectorElement.size(size); - SelectorElement element = selectorElement.build(); - element.geometry(position); - return element; - } - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/ActionsTypeAdapter.java b/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/ActionsTypeAdapter.java deleted file mode 100644 index d9e5349..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/ActionsTypeAdapter.java +++ /dev/null @@ -1,82 +0,0 @@ -package me.combimagnetron.sunscreen.config.adapters; - -import me.combimagnetron.passport.config.element.ConfigElement; -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.config.ConfigTypeAdapter; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.logic.action.adapter.TypeAdapter; -import me.combimagnetron.sunscreen.util.Identifier; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -public class ActionsTypeAdapter implements ConfigTypeAdapter> { - @Override - public @Nullable Map direct(@NotNull ConfigElement element) { - Section section = Section.required("temp"); - section.section((Section) element); - return action(section); - } - - @Override - public @Nullable Map find(@NotNull Section section) { - return action(section); - } - - protected static Map action(@NotNull Section elementConfigElement) { - Section actionsSection = elementConfigElement.find("actions"); - Map actionWrappers = new HashMap<>(); - for (ConfigElement element : actionsSection.elements()) { - Section elementSection = (Section) element; - Node listen = ConfigTypeAdapter.find(elementSection, "listen", String.class); - Section executeSection = ConfigTypeAdapter.find(element, "execute"); - Node actionType = ConfigTypeAdapter.find(executeSection, "type", String.class); - if (actionType == null || listen == null) { - return actionWrappers; - } - if (actionType.value() == null || listen.value() == null) { - return actionWrappers; - } - Action action = Action.ACTION_MAP.get(Identifier.split(actionType.value())); - if (action == null) { - return actionWrappers; - } - Collection> arguments = get(action, executeSection); - ActionWrapper actionWrapper = ActionWrapper.of(element.name(), null, action, arguments); - actionWrappers.put(Interactable.ActionType.valueOf(listen.value().toUpperCase()), actionWrapper); - } - return actionWrappers; - } - - private static Collection> get(Action action, Section executeSection) { - List> arguments = new ArrayList<>(); - for (ArgumentType argumentType : action.argumentType()) { - String key = argumentType.name(); - if (executeSection.elements().stream().noneMatch(configElement -> configElement.name().equals(key))) { - return arguments; - } - TypeAdapter typeAdapter = TypeAdapter.VALUES.stream().filter(typeAdapter1 -> typeAdapter1.type().equals(argumentType.type())).findFirst().orElse(null); - if (typeAdapter == null) { - return arguments; - } - Object value = ((Node)executeSection.find(key)).value(); - Argument argument; - if (value instanceof String stringVal) { - argument = Argument.of(null, key, typeAdapter.adapt(stringVal)); - } else if (value.getClass() == argumentType.type()) { - argument = Argument.of(null, key, value); - } else { - return arguments; - } - arguments.add(argument); - } - return arguments; - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/CanvasTypeAdapter.java b/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/CanvasTypeAdapter.java deleted file mode 100644 index bc85b82..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/CanvasTypeAdapter.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.combimagnetron.sunscreen.config.adapters; - -import me.combimagnetron.passport.config.element.ConfigElement; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.config.ConfigTypeAdapter; -import me.combimagnetron.sunscreen.config.MenuConfigTransformer; -import me.combimagnetron.sunscreen.image.Canvas; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Map; - -public class CanvasTypeAdapter implements ConfigTypeAdapter> { - @Override - public @Nullable Map direct(@NotNull ConfigElement element) { - return MenuConfigTransformer.ElementTransformer.get((Section) element); - } - - @Override - public @Nullable Map find(@NotNull Section section) { - Section section1 = ConfigTypeAdapter.find(section, "canvas"); - if (section1 == null) { - return null; - } - return MenuConfigTransformer.ElementTransformer.get(section1); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/IdentifierTypeAdapter.java b/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/IdentifierTypeAdapter.java deleted file mode 100644 index a95c98b..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/IdentifierTypeAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.combimagnetron.sunscreen.config.adapters; - -import me.combimagnetron.passport.config.element.ConfigElement; -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.config.ConfigTypeAdapter; -import me.combimagnetron.sunscreen.util.Identifier; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class IdentifierTypeAdapter implements ConfigTypeAdapter { - @Override - public @Nullable Identifier direct(@NotNull ConfigElement element) { - if (!ConfigTypeAdapter.isNode(element)) { - return null; - } - String string = ConfigTypeAdapter.find(element, "identifier", String.class).value(); - if (string == null) { - return null; - } - return Identifier.split(string); - } - - @Override - public @Nullable Identifier find(@NotNull Section section) { - Node node = ConfigTypeAdapter.find(section, "identifier", String.class); - if (node == null) { - return null; - } - String string = node.value(); - if (string == null) { - return null; - } - return Identifier.split(string); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/PositionTypeAdapter.java b/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/PositionTypeAdapter.java deleted file mode 100644 index b8d0314..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/PositionTypeAdapter.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.combimagnetron.sunscreen.config.adapters; - -import me.combimagnetron.passport.config.element.ConfigElement; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.config.ConfigTypeAdapter; -import me.combimagnetron.sunscreen.menu.Position; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class PositionTypeAdapter implements ConfigTypeAdapter { - @Override - public Position.@Nullable PositionBuilder direct(@NotNull ConfigElement element) { - if (!ConfigTypeAdapter.isSection(element)) { - return null; - } - Section section = (Section) element; - return Position.config(section); - } - - @Override - public Position.@Nullable PositionBuilder find(@NotNull Section section) { - Section section1 = ConfigTypeAdapter.find(section, "position"); - if (section1 == null) { - return null; - } - return Position.config(section1); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/SizeTypeAdapter.java b/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/SizeTypeAdapter.java deleted file mode 100644 index 880808d..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/config/adapters/SizeTypeAdapter.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.combimagnetron.sunscreen.config.adapters; - -import me.combimagnetron.passport.config.element.ConfigElement; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.config.ConfigTypeAdapter; -import me.combimagnetron.sunscreen.menu.Size; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class SizeTypeAdapter implements ConfigTypeAdapter { - @Override - public Size.@Nullable SizeBuilder direct(@NotNull ConfigElement element) { - if (!ConfigTypeAdapter.isSection(element)) { - return null; - } - Section section = (Section) element; - return Size.config(section); - } - - @Override - public Size.@Nullable SizeBuilder find(@NotNull Section section) { - Section section1 = ConfigTypeAdapter.find(section, "size"); - if (section1 == null) { - return null; - } - return Size.config(section1); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/Element.java b/api/src/main/java/me/combimagnetron/sunscreen/element/Element.java deleted file mode 100644 index 0a032b7..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/Element.java +++ /dev/null @@ -1,77 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -import me.combimagnetron.sunscreen.menu.*; -import me.combimagnetron.sunscreen.menu.editor.Editable; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.RuntimeDefinable; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; - -public interface Element extends Editable, RuntimeDefinable.Holder { - - /** - * The identifier of this element. - * @return the identifier - */ - @NotNull Identifier identifier(); - - /** - * The canvas of this element. - * @return the canvas - */ - @NotNull T canvas(); - - /** - * The position of this element. - * @return the position - */ - @NotNull Position position(); - - @NotNull Collection> definables(); - - @NotNull Element geometry(RuntimeDefinableGeometry.GeometryBuilder geometry); - - @NotNull Element geometry(Geometry geometry); - - /** - * The size of this element. - * @return a Vec2d containing the size of the element - */ - - /** - * Sets the position of this element. - * - * @param pos the position to set - * @return this element - */ - @NotNull Element position(Position pos); - - /** - * Applies a style to this element. - * @param style the style to apply - * @param pos2D the position to apply the style to - * @param s the value to apply the style with - * @return this element, updated with the given style - */ - Element style(Style style, Position pos2D, S s); - - /** - * Applies a style to this element. - * @param style the style to apply - * @param s the value to apply the style with - * @return this element, updated with the given style - */ - Element style(Style style, S s); - - @NotNull Size size(); - - /** - * Sets the size of this element. - * @param size the size to set - * @return this element - */ - @NotNull Element size(Size size); - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/FlexArea.java b/api/src/main/java/me/combimagnetron/sunscreen/element/FlexArea.java deleted file mode 100644 index c00fe23..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/FlexArea.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -public interface FlexArea { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/Grid.java b/api/src/main/java/me/combimagnetron/sunscreen/element/Grid.java deleted file mode 100644 index d250886..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/Grid.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -public interface Grid { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/Interactable.java b/api/src/main/java/me/combimagnetron/sunscreen/element/Interactable.java deleted file mode 100644 index 26a0248..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/Interactable.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; - -public interface Interactable { - - /** - * Whether the element is reactive to hover. - * @return true if the element is reactive to hover. - */ - boolean reactiveToHover(); - - /** - * Whether the element is reactive to click. - * @return true if the element is reactive to click. - */ - boolean reactiveToClick(); - - /** - * Indicates to the element to do hover calculations with the cursor at the given Vec2d position. - * @param pos position of the cursor. - * @return true if the element should be rendered again. - */ - boolean hover(Vec2i pos); - - /** - * Indicates to the element to do click calculations with the cursor at the given Vec2d position. - * @param pos position of the cursor. - * @return true if the element should be rendered again. - */ - boolean click(Vec2i pos); - - @NotNull Map actions(); - - default void action(ActionType type, ActionWrapper action) { - actions().put(type, action); - } - - enum ActionType { - HOVER, - CLICK - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/Operator.java b/api/src/main/java/me/combimagnetron/sunscreen/element/Operator.java deleted file mode 100644 index ca22657..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/Operator.java +++ /dev/null @@ -1,97 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -import java.lang.reflect.InvocationTargetException; -import java.util.Map; - -public interface Operator { - - Map operators = Map.of( - "+", new AdditionOperator(), "-", new SubtractionOperator(), "*", new MultiplicationOperator(), - "/", new DivisionOperator(), "%", new ModuloOperator() - ); - - String operator(); - - default String operatorWithSpaces() { - return " " + operator() + " "; - } - - double calc(double a, double b); - - static Operator find(String string) { - if (string.split(" ").length < 2) { - return operators.get("+"); - } - return operators.get(string.split(" ")[1]); - } - - static Operator get(String operator) { - return operators.get(operator.trim()); - } - - class AdditionOperator implements Operator { - - @Override - public String operator() { - return "\\+"; - } - - @Override - public double calc(double a, double b) { - return a + b; - } - } - - class SubtractionOperator implements Operator { - - @Override - public String operator() { - return "\\-"; - } - - @Override - public double calc(double a, double b) { - return a - b; - } - } - - class MultiplicationOperator implements Operator { - - @Override - public String operator() { - return "\\*"; - } - - @Override - public double calc(double a, double b) { - return a * b; - } - } - - class DivisionOperator implements Operator { - - @Override - public String operator() { - return "\\/"; - } - - @Override - public double calc(double a, double b) { - return a / b; - } - } - - class ModuloOperator implements Operator { - - @Override - public String operator() { - return "\\%"; - } - - @Override - public double calc(double a, double b) { - return a % b; - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/Padding.java b/api/src/main/java/me/combimagnetron/sunscreen/element/Padding.java deleted file mode 100644 index f4c4509..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/Padding.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -public interface Padding { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/SimpleBufferedElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/SimpleBufferedElement.java deleted file mode 100644 index 18bbb17..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/SimpleBufferedElement.java +++ /dev/null @@ -1,88 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -import me.combimagnetron.sunscreen.menu.Geometry; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.editor.EditableField; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.util.RuntimeDefinable; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public abstract class SimpleBufferedElement implements Element { - private Size size; - protected final Identifier identifier; - protected Position position; - protected List> geometryBuilders = new ArrayList<>(); - protected Canvas canvas; - - public SimpleBufferedElement(Size size, Identifier identifier, Position position) { - this.size = size; - this.canvas = Canvas.image(size); - this.identifier = identifier; - this.position = position; - } - - @Override - public @NotNull Element position(Position pos) { - this.position = pos; - return this; - } - - @Override - public void add(RuntimeDefinable.Type definable) { - geometryBuilders.add(definable); - } - - @Override - public @NotNull Identifier identifier() { - return identifier; - } - - @Override - public @NotNull Collection> definables() { - return geometryBuilders; - } - - @Override - public @NotNull Element geometry(RuntimeDefinableGeometry.GeometryBuilder geometry) { - geometryBuilders.add(geometry); - return this; - } - - @Override - public abstract @NotNull Canvas canvas(); - - @Override - public @NotNull Position position() { - return position; - } - - @Override - public @NotNull Element geometry(Geometry geometry) { - if (geometry instanceof Position) { - this.position = (Position) geometry; - } else if (geometry instanceof Size) { - this.canvas = Canvas.image((Size) geometry); - this.size = (Size) geometry; - } - return this; - } - - @Override - public @NotNull Size size() { - return size; - } - - @Override - public @NotNull Element size(Size size) { - this.size = size; - return this; - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/UIProperty.java b/api/src/main/java/me/combimagnetron/sunscreen/element/UIProperty.java deleted file mode 100644 index b171ea0..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/UIProperty.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.combimagnetron.sunscreen.element; - -public interface UIProperty { - - interface Scope { - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/animated/AnimatedElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/animated/AnimatedElement.java deleted file mode 100644 index 295859c..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/animated/AnimatedElement.java +++ /dev/null @@ -1,236 +0,0 @@ -package me.combimagnetron.sunscreen.element.animated; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Geometry; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.timing.Tick; -import me.combimagnetron.sunscreen.menu.timing.TickFailException; -import me.combimagnetron.sunscreen.menu.timing.Tickable; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.RuntimeDefinable; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -public interface AnimatedElement extends Element, Tickable { - - Collection keyframes(); - - void next(); - - Keyframe current(); - - Keyframe keyframe(int index); - - void loopMode(LoopMode mode); - - LoopMode loopMode(); - - AnimatedElement keyframe(Keyframe keyframe); - - AnimatedElement keyframes(Collection keyframes); - - AnimatedElement keyframes(Keyframe... keyframes); - - enum LoopMode { - NONE, - HOLD, - LOOP, - REVERSE - } - - static AnimatedElement of(List keyframes, Position position, Size size, Identifier identifier) { - return new Impl(keyframes, position, size, identifier); - } - - static AnimatedElement of(Canvas canvas, Vec2i grid, long holdTime, Position position, Size size, Identifier identifier) { - List keyframes = new ArrayList<>(); - for (int x = 0; x < grid.x(); x++) { - Vec2i section = canvas.size().div(grid.x(), grid.y()); - for (int y = 0; y < grid.y(); y++) { - keyframes.add(Keyframe.of(canvas.sub(section, Vec2i.of(x * section.x(), y * section.y())), holdTime)); - } - } - return new Impl(keyframes, position, size, identifier); - } - - static AnimatedElement of(Canvas canvas, Vec2i grid, Position position, Size size, Identifier identifier) { - return of(canvas, grid, 1, position, size, identifier); - } - - class Impl implements AnimatedElement { - private final List keyframes; - private final Position position; - private final Size size; - private final Identifier identifier; - private Keyframe currentKeyframe; - private long time = 0; - private int index = 0; - private long totalTime = 0; - private LoopMode loopMode = LoopMode.LOOP; - - public Impl(List keyframes, Position position, Size size, Identifier identifier) { - this.keyframes = keyframes; - for (Keyframe keyframe : keyframes) { - totalTime += keyframe.holdTime(); - } - this.currentKeyframe = keyframes.getFirst(); - this.position = position; - this.size = size; - this.identifier = identifier; - } - - @Override - public Collection keyframes() { - return keyframes; - } - - @Override - public void next() { - index++; - if (index > keyframes.size() - 1) { - index = 0; - } - currentKeyframe = keyframe(index); - } - - @Override - public Keyframe current() { - return currentKeyframe; - } - - @Override - public Keyframe keyframe(int index) { - return keyframes.get(index); - } - - @Override - public void loopMode(LoopMode mode) { - this.loopMode = mode; - } - - @Override - public LoopMode loopMode() { - return loopMode; - } - - @Override - public AnimatedElement keyframe(Keyframe keyframe) { - this.currentKeyframe = keyframe; - this.totalTime += keyframe.holdTime(); - return this; - } - - @Override - public AnimatedElement keyframes(Collection keyframes) { - this.keyframes.clear(); - this.keyframes.addAll(keyframes); - for (Keyframe keyframe : keyframes) { - totalTime += keyframe.holdTime(); - } - return this; - } - - @Override - public AnimatedElement keyframes(Keyframe... keyframes) { - this.keyframes.addAll(Arrays.asList(keyframes)); - for (Keyframe keyframe : keyframes) { - totalTime += keyframe.holdTime(); - } - return this; - } - - @Override - public @NotNull Identifier identifier() { - return identifier; - } - - @Override - public @NotNull Canvas canvas() { - return render(); - } - - private Canvas render() { - Keyframe currentKeyframe = current(); - return currentKeyframe.canvas(); - } - - @Override - public @NotNull Position position() { - return position; - } - - @Override - public @NotNull Collection> definables() { - return List.of(); - } - - @Override - public void add(RuntimeDefinable.Type definable) { - - } - - @Override - public @NotNull Element geometry(RuntimeDefinableGeometry.GeometryBuilder geometry) { - return this; - } - - @Override - public @NotNull Element geometry(Geometry geometry) { - return this; - } - - @Override - public @NotNull Element position(Position pos) { - return this; - } - - @Override - public Element style(Style style, Position pos2D, S s) { - return null; - } - - @Override - public Element style(Style style, S s) { - return null; - } - - @Override - public @NotNull Size size() { - return size; - } - - @Override - public @NotNull Element size(Size size) { - return this; - } - - @Override - public boolean tick(Tick tick) throws TickFailException { - time++; - if (time + currentKeyframe.holdTime() > totalTime) { - switch (loopMode) { - case NONE: - return false; - case HOLD, REVERSE, LOOP: - time = 0; - break; - } - } - if (time >= currentKeyframe.holdTime()) { - next(); - time = 0; - } - return true; - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/animated/Keyframe.java b/api/src/main/java/me/combimagnetron/sunscreen/element/animated/Keyframe.java deleted file mode 100644 index 31634ca..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/animated/Keyframe.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.combimagnetron.sunscreen.element.animated; - -import me.combimagnetron.sunscreen.image.Canvas; - -public interface Keyframe { - - Canvas canvas(); - - long holdTime(); - - static Keyframe of(Canvas canvas, long holdTime) { - return new Impl(canvas, holdTime); - } - - record Impl(Canvas canvas, long holdTime) implements Keyframe { - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/div/Div.java b/api/src/main/java/me/combimagnetron/sunscreen/element/div/Div.java deleted file mode 100644 index 3ea194a..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/div/Div.java +++ /dev/null @@ -1,481 +0,0 @@ -package me.combimagnetron.sunscreen.element.div; - -import me.combimagnetron.passport.event.Dispatcher; -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.passport.util.condition.Condition; -import me.combimagnetron.sunscreen.event.ClickElementEvent; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.menu.*; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.menu.editor.Editable; -import me.combimagnetron.sunscreen.menu.input.Input; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.*; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -public sealed interface Div extends Editable permits Div.Impl, ScrollableDiv { - - /** - * The identifier of the div. - * @return identifier of the div. - */ - Identifier identifier(); - - /** - * The canvas of the div. - * @return current render iteration canvas of the div. - */ - T canvas(); - - /** - * The size of the div. - * @return Vec2d representing size of the div, always in rounded integers. - */ - Vec2i size(); - - /** - * The scale of the div. - * @return Vector3d representing scale of the div. - */ - Vector3d scale(); - - /** - * The position of the div. - * @return Position representing position of the div, can be in pixels, percentages or a mix. - */ - Position position(); - - /** - * The condition under which the div renders. - * @return Condition representing the condition under which the div renders. - */ - Condition condition(); - - Collection> definables(); - - boolean hidden(); - - /** - * The order of the div. - * @return double representing the order of the div. - */ - double order(); - - default @Nullable Element element(@NotNull Identifier identifier) { - return elements().stream().filter(e -> e.identifier().equals(identifier)).findFirst().orElse(null); - } - - /** - * Sets the size of the div. - * @param size new size of the div. - * @return current div. - */ - Div size(Size size); - - default Div size(Size.SizeBuilder builder) { - return geometry(builder); - } - - /** - * Sets the condition of the div. - * @param condition new condition of the div. - * @return current div. - */ - Div condition(Condition condition); - - /** - * Fits the div to the size of the canvas. - * @return current div. - */ - Div fit(); - - /** - * Sets the scale of the div. - * @param scale new scale of the div. - * @return current div. - */ - Div scale(Vector3d scale); - - /** - * Sets the position of the div. - * @param pos new position of the div. - * @return current div. - */ - Div position(Position pos); - - default Div position(RuntimeDefinableGeometry.GeometryBuilder builder) { - return geometry(builder); - } - - Div geometry(Geometry builder); - - Div geometry(RuntimeDefinableGeometry.GeometryBuilder builder); - - /** - * Adds an element to the div. - * @param element element to add. - * @return current div. - */ - Div add(Element element); - - /** - * Removes an element from the div. - * @param identifier identifier of the element to remove. - * @return current div. - */ - Div remove(Identifier identifier); - - /** - * Removes an element from the div. - * @param element element to remove. - * @return current div. - */ - Div remove(Element element); - - /** - * Hides an element from the div. - * @param identifier identifier of the element to hide. - * @return current div. - */ - Div hide(Identifier identifier); - - /** - * Hides an element from the div. - * @param element element to hide. - * @return current div. - */ - Div hide(Element element); - - /** - * Shows an element from the div. - * @param identifier identifier of the element to show. - * @return current div. - */ - Div show(Identifier identifier); - - /** - * Shows an element from the div. - * @param element element to show. - * @return current div. - */ - Div show(Element element); - - /** - * Sets the order of the div. - * @param order new order of the div. - * @return current div. - */ - Div order(double order); - - /** - * The elements of the div. - * @return collection of elements in the div. - */ - Collection> elements(); - - /** - * Renders the div to an image. - * @param image canvas to render to. - * @return rendered canvas. - */ - Canvas render(Canvas image, SunscreenUser user); - - /** - * Renders the div. - */ - Canvas render(SunscreenUser user); - - /** - * Constructs and returns a new div. - * @param identifier identifier of the to-be-constructed div - * @return new div. - */ - static Div div(Identifier identifier) { - return new Impl(identifier); - } - - /** - * Constructs and returns a new scrollable div. - * @param identifier identifier of the to-be-constructed scrollable div - * @return new scrollable div. - */ - static ScrollableDiv scroll(Identifier identifier) { - return new ScrollableDiv.Impl(identifier); - } - - /** - * Constructs and returns a new non-rendering div. - * @param identifier identifier of the to-be-constructed non-rendering div - * @return new non-rendering div. - */ - static Div nonRender(Identifier identifier) { - return new NonRenderDiv(identifier); - } - - non-sealed class Impl implements Div { - private final UUID uniqueIdentifier = UUID.randomUUID(); - private final LinkedHashMap> elements = new LinkedHashMap<>(); - private final HashSet> hidden = new HashSet<>(); - private final List> geometryBuilders = new ArrayList<>(); - private final Identifier identifier; - private Size size = Size.pixel(512, 512); - private Position pos = Position.pixel(0, 0); - private Vector3d scale = Vector3d.vec3(1); - private double order = 0; - private boolean isHidden = false; - private Condition condition; - private Canvas canvas; - - public Canvas render(Canvas image, SunscreenUser user) { - for (Element element : elements.values()) { - for (RuntimeDefinableGeometry definable : element.definables().stream().filter(runtimeDefinable -> runtimeDefinable instanceof RuntimeDefinableGeometry).map(runtimeDefinable -> (RuntimeDefinableGeometry) runtimeDefinable).toList()) { - definable.build(Pair.of(user.screenSize().pixel(), size())); - } - if (!hidden.contains(element)) { - if (element.canvas() == null) { - continue; - } - image = image.place(element.canvas(), Vec2i.of((int)element.position().x().pixel(), (int)element.position().y().pixel())); - } - } - return image; - } - - protected HashSet> hiddenElements() { - return hidden; - } - - @Override - public boolean hidden() { - return isHidden; - } - - public void hide(boolean isHidden) { - this.isHidden = isHidden; - } - - public boolean handleClick(Vec2i pos, Input.Type.MouseClick click, SunscreenUser user) { - boolean update = false; - for (Element element : elements.values()) { - if (element instanceof Interactable interactable && interactable.reactiveToClick()) { - if (!HoverHelper.isHovered(pos, ViewportHelper.fromPosition(element.position()), element.size())) { - boolean a = interactable.click(null); - if (a) { - update = true; - } - continue; - } - Dispatcher.dispatcher().post(ClickElementEvent.create(element, user, pos.sub(Vec2i.of(element.position().x().pixel(), element.position().y().pixel())), click)); - boolean keep = update; - List actions = interactable.actions().entrySet().stream().filter(actionTypeActionEntry -> actionTypeActionEntry.getKey() == Interactable.ActionType.CLICK).map(Map.Entry::getValue).toList(); - for (ActionWrapper actionWrapper : actions) { - Action action = actionWrapper.action(); - action.execute(user, actionWrapper.arguments().toArray(new Argument[0])); - } - update = interactable.click(pos.sub(Vec2i.of(element.position().x().pixel(), element.position().y().pixel()))); - if (keep) { - update = true; - } - } - } - return update; - } - - public boolean handleHover(Vec2i pos, SunscreenUser user) { - boolean update = false; - for (Element element : elements.values()) { - if (element instanceof Interactable interactable && interactable.reactiveToHover()) { - if (!HoverHelper.isHovered(pos, ViewportHelper.fromPosition(element.position()), element.size())) { - boolean a = interactable.hover(null); - if (a) { - update = true; - } - continue; - } - Dispatcher.dispatcher().post(ClickElementEvent.create(element, user, pos, new Input.Type.MouseClick(false))); - List actions = interactable.actions().entrySet().stream().filter(actionTypeActionEntry -> actionTypeActionEntry.getKey() == Interactable.ActionType.HOVER).map(Map.Entry::getValue).toList(); - for (ActionWrapper actionWrapper : actions) { - Action action = actionWrapper.action(); - action.execute(user, actionWrapper.arguments().toArray(new Argument[0])); - } - boolean keep = update; - update = interactable.hover(pos.sub(Vec2i.of(element.position().x().pixel(), element.position().y().pixel()))); - if (keep) { - update = true; - } - } - } - return update; - } - - public Canvas render(SunscreenUser user) { - return render(canvas, user); - } - - public Impl(Identifier identifier) { - this.identifier = identifier; - this.canvas = Canvas.image(Vec2i.of(size.x().pixel(), size.y().pixel())); - } - - @Override - public Identifier identifier() { - return identifier; - } - - @Override - public Canvas canvas() { - return canvas; - } - - @Override - public Vec2i size() { - return canvas.size(); - } - - @Override - public Vector3d scale() { - return scale; - } - - @Override - public Position position() { - return pos; - } - - @Override - public Condition condition() { - return condition; - } - - @Override - public Collection> definables() { - return geometryBuilders; - } - - @Override - public double order() { - return order; - } - - @Override - public Div size(Size size) { - this.size = size; - /*if (size.x() < this.canvas.size().x() && size.y() < this.canvas.size().y()) { - this.canvas = this.canvas.sub(size, Vec2d.of(0,0)); - return this; - }*/ - this.canvas = Canvas.image(Vec2i.of(size.x().pixel(), size.y().pixel())); - return this; - } - - @Override - public Div condition(Condition condition) { - this.condition = condition; - return this; - } - - @Override - public Div fit() { - - return this; - } - - @Override - public Div scale(Vector3d scale) { - this.scale = scale; - return this; - } - - @Override - public Div position(Position pos) { - this.pos = pos; - return this; - } - - @Override - public Div geometry(Geometry geometry) { - if (geometry instanceof Position position) { - this.pos = position; - } else if (geometry instanceof Size size) { - this.size = size; - this.canvas = Canvas.image(size); - } - return this; - } - - @Override - public Div geometry(RuntimeDefinableGeometry.GeometryBuilder builder) { - this.geometryBuilders.add(builder); - return this; - } - - @Override - public Div add(Element element) { - elements.put(element.identifier(), element); - return this; - } - - @Override - public Div remove(Identifier identifier) { - elements.remove(identifier); - return this; - } - - @Override - public Div remove(Element element) { - elements.remove(element.identifier()); - return this; - } - - @Override - public Div hide(Identifier identifier) { - hidden.add(elements.get(identifier)); - return this; - } - - @Override - public Div hide(Element element) { - hidden.add(element); - return this; - } - - @Override - public Div show(Identifier identifier) { - hidden.remove(elements.get(identifier)); - return this; - } - - @Override - public Div show(Element element) { - hidden.remove(element); - return this; - } - - @Override - public Div order(double order) { - this.order = order; - return this; - } - - @Override - public Collection> elements() { - return elements.values(); - } - } - - final class NonRenderDiv extends Impl { - - NonRenderDiv(Identifier identifier) { - super(identifier); - } - - } - -} \ No newline at end of file diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/div/Edit.java b/api/src/main/java/me/combimagnetron/sunscreen/element/div/Edit.java deleted file mode 100755 index 750e3f7..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/div/Edit.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.combimagnetron.sunscreen.element.div; - -import me.combimagnetron.sunscreen.menu.draft.Draft; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.menu.editor.Editable; -import me.combimagnetron.sunscreen.element.Element; - -import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; - -public record Edit(Identifier identifier, List> edits, Class type) { - - public static EditBuilder div() { - EditBuilder builder = new EditBuilder<>(Div.class); - builder.supplier(() -> new Draft.DivSubSection(builder)); - return builder; - } - - public static EditBuilder scrollableDiv() { - EditBuilder builder = new EditBuilder<>(Div.class); - //builder.supplier(() -> new Draft.ScrollDivSubSection(builder)); - return builder; - } - - public static EditBuilder element() { - EditBuilder builder = new EditBuilder(Element.class); - builder.supplier(() -> new Draft.ElementSubSection(builder)); - return builder; - } - - public static class EditBuilder> { - private Identifier identifier; - private Supplier supplier; - private final Class type; - - public EditBuilder(Class type) { - this.type = type; - } - - void supplier(Supplier supplier) { - this.supplier = supplier; - } - - public V section() { - return supplier.get(); - } - - public EditBuilder identifier(Identifier identifier) { - this.identifier = identifier; - return this; - } - - public Edit done() { - return new Edit<>(identifier, section().product(), type); - } - - } - - } \ No newline at end of file diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/div/ScrollableDiv.java b/api/src/main/java/me/combimagnetron/sunscreen/element/div/ScrollableDiv.java deleted file mode 100644 index d8345ee..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/div/ScrollableDiv.java +++ /dev/null @@ -1,106 +0,0 @@ -package me.combimagnetron.sunscreen.element.div; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.input.InputHandler; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.*; - -public non-sealed interface ScrollableDiv extends Div { - - ScrollableDiv scroll(double percentage); - - ScrollableDiv scroll(int slot); - - ScrollableDiv visibleSize(Vec2i size); - - Vec2i visibleSize(); - - class Impl extends Div.Impl implements ScrollableDiv { - private final static double Multiplier = 0.1; - private Vec2i visibleSize = size(); - private int lastSlot = 0; - private double scroll = 0.0; - - public Impl(Identifier identifier) { - super(identifier); - } - - @Override - public ScrollableDiv scroll(double percentage) { - this.scroll = percentage; - return this; - } - - @Override - public ScrollableDiv scroll(int slot) { - if (lastSlot == 8 && slot == 0) { - this.scroll -= 1; - System.out.println("Scroll: " + scroll + " Slot: " + slot); - return this; - } - if (lastSlot == 0 && slot == 8) { - this.scroll += 1; - System.out.println("Scroll: " + scroll + " Slot: " + slot); - return this; - } - if (lastSlot < slot) { - this.scroll += 1; - System.out.println("Scroll: " + scroll + " Slot: " + slot); - return this; - } - if (lastSlot > slot) { - this.scroll -= 1; - System.out.println("Scroll: " + scroll + " Slot: " + slot); - return this; - } - if (scroll < 0 || (visibleSize.y() + scroll) > size().y()) { - scroll = 0; - } - System.out.println("Scroll: " + scroll + " Slot: " + slot); - return this; - } - - @Override - public ScrollableDiv visibleSize(Vec2i size) { - this.visibleSize = size; - return this; - } - - @Override - public Vec2i visibleSize() { - return visibleSize; - } - - @Override - public Canvas render(SunscreenUser user) { - Canvas canvas = canvas(); - int slot = (int) (scroll / Multiplier); - lastSlot = slot; - for (Element element : elements()) { - for (RuntimeDefinable.Type definable : element.definables()) { - if (definable instanceof RuntimeDefinableGeometry.GeometryBuilder geometry) { - element.geometry(geometry.finish(Pair.of(user.screenSize().pixel(), size()))); - } - } - if (!hiddenElements().contains(element)) { - if (element.canvas() == null) { - continue; - } - canvas = canvas.place(element.canvas(), ViewportHelper.fromPosition(element.position())); - - } - } - if (visibleSize.add(Vec2i.of(0, (int) scroll)).y() > canvas.size().y() || scroll < 0) { - scroll = 0; - } - System.out.println("Scroll: " + scroll); - canvas = canvas.sub(visibleSize, Vec2i.of(0, (int) scroll)); - return canvas; - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ButtonElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ButtonElement.java deleted file mode 100644 index 0d3945a..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ButtonElement.java +++ /dev/null @@ -1,169 +0,0 @@ -package me.combimagnetron.sunscreen.element.impl; - -import me.combimagnetron.sunscreen.event.ClickElementEvent; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.input.Input; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Scheduler; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; - -public class ButtonElement extends SimpleBufferedElement implements Interactable { - private final Map actions = new HashMap<>(); - private final Map icons = new HashMap<>(); - private final Consumer> click; - private Canvas selected; - - protected ButtonElement(Size size, Position position, Identifier identifier, Map icon, Consumer> click) { - super(size, identifier, position); - this.click = click; - icons.putAll(icon); - if (icon.containsKey(State.DEFAULT)) { - selected = icon.get(State.DEFAULT); - } else { - selected = icon.values().stream().findFirst().orElseThrow(); - } - } - - public static ButtonElement buttonElement(Size size, Identifier identifier, Position position, Map icon) { - return new ButtonElement(size, position, identifier, icon, (t) -> {}); - } - - public static ButtonElement buttonElement(Size size, Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position) { - ButtonElement buttonElement = new ButtonElement(size, null, identifier, new HashMap<>(), (t) -> {}); - buttonElement.geometry(position); - return buttonElement; - } - - public static ButtonElement buttonElement(Size size, Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position, Map icon) { - ButtonElement buttonElement = new ButtonElement(size, null, identifier, icon, (t) -> {}); - buttonElement.geometry(position); - return buttonElement; - } - - public static Builder buttonElement(Size size, Identifier identifier, Position position) { - return new Builder(size, identifier, position); - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } - - @Override - public @NotNull Map actions() { - return actions; - } - - @Override - public @NotNull Canvas canvas() { - return selected != null ? selected : icons.get(State.DEFAULT); - } - - public Map icons() { - return icons; - } - - @Override - public boolean reactiveToHover() { - return true; - } - - @Override - public boolean reactiveToClick() { - return true; - } - - @Override - public boolean hover(Vec2i pos) { - if (pos == null) { - if (selected != icons.get(State.DEFAULT)) { - selected = icons.get(State.DEFAULT); - return true; - } - return false; - } - if (selected == icons.get(State.HOVER) || selected == icons.get(State.CLICK)) { - return false; - } - selected = icons.get(State.HOVER); - return true; - } - - @Override - public boolean click(Vec2i pos) { - if (click != null) { - click.accept(ClickElementEvent.create(this, null, pos, new Input.Type.MouseClick(false))); - } - if (selected == icons.get(State.CLICK)) { - return false; - } - selected = icons.get(State.CLICK); - Scheduler.delay(() -> selected = icons.get(State.DEFAULT), 100); - return true; - } - - public static class Builder { - private final Size size; - private final Identifier identifier; - private final Position position; - private final HashMap icons = new HashMap<>(); - private Consumer> click = (t) -> {}; - - public Builder(Size size, Identifier identifier, Position position) { - this.size = size; - this.identifier = identifier; - this.position = position; - } - - public Builder icon(State state, Canvas icon) { - icons.put(state, icon); - return this; - } - - public Builder standard(Canvas icon) { - return icon(State.DEFAULT, icon); - } - - public Builder click(Consumer> click) { - this.click = click; - return this; - } - - public Builder hover(Canvas icon) { - return icon(State.HOVER, icon); - } - - public Builder click(Canvas icon) { - return icon(State.CLICK, icon); - } - - public ButtonElement build() { - return new ButtonElement(size, position, identifier, icons, click); - } - } - - public enum State { - DEFAULT, - HOVER, - CLICK - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/DropdownElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/impl/DropdownElement.java deleted file mode 100644 index ca1dc20..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/DropdownElement.java +++ /dev/null @@ -1,145 +0,0 @@ -package me.combimagnetron.sunscreen.element.impl; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.util.HoverHelper; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.Map; - -public class DropdownElement extends SimpleBufferedElement implements Interactable { - private final Map actions = new HashMap<>(); - private final LinkedList buttons; - private final SelectorElement selector; - private String defaultLabel = "Select"; - private boolean folded = true; - - public DropdownElement(Size size, Identifier identifier, Position position, LinkedList buttons) { - super(size, identifier, position); - this.buttons = buttons; - this.selector = SelectorElement.selectorElement(Size.pixel(size.vec2i().sub(0, 11)), identifier, position, buttons).vertical(true).unselectable(false); - } - - public static DropdownElement dropdownElement(Size size, Identifier identifier, Position position, LinkedList buttons) { - return new DropdownElement(size, identifier, position, buttons); - } - - public static DropdownElement dropdownElement(Size size, Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position, LinkedList buttons) { - DropdownElement element = new DropdownElement(size, identifier, null, buttons); - element.geometry(position); - return element; - } - - public static DropdownElement.Builder dropdownElement(Size size, Identifier identifier, Position position) { - return new DropdownElement.Builder(size, identifier, position); - } - - public DropdownElement defaultLabel(String label) { - this.defaultLabel = label; - return this; - } - - @Override - public @NotNull Map actions() { - return actions; - } - - @Override - public @NotNull Canvas canvas() { - Vec2i size = !folded ? this.size().vec2i() : Vec2i.of(size().x().pixel(), 11); - Canvas canvas = Canvas.image(size); - canvas.fill(Vec2i.of(0, 0), size, EditorMenu.Colors.Background); - canvas.fill(Vec2i.of(1, 1), size.sub(Vec2i.of(2, 2)), EditorMenu.Colors.Secondary); - canvas.fill(Vec2i.of(1, 1), Vec2i.of(size().x().pixel() - 2, 9), EditorMenu.Colors.Background); - if (selector.selected() == null) { - canvas.text(Text.text(defaultLabel), Vec2i.of(1, 8), EditorMenu.Colors.PrimaryText); - } else { - canvas.place(selector.selected().icons().get(ButtonElement.State.CLICK), Vec2i.of(0, 0)); - } - if (folded) { - return canvas; - } - canvas.place(selector.canvas(), Vec2i.of(0, 11)); - return canvas; - } - - @Override - public Element style(Style style, Position pos2D, S s) { - return null; - } - - @Override - public Element style(Style style, S S) { - return null; - } - - @Override - public boolean reactiveToHover() { - return false; - } - - @Override - public boolean reactiveToClick() { - return true; - } - - @Override - public boolean hover(Vec2i pos) { - if (HoverHelper.isHovered(pos, Vec2i.of(0, 0), Vec2i.of(size().x().pixel(), 11))) { - return true; - } - return selector.hover(pos.sub(0, 11)); - } - - @Override - public boolean click(Vec2i pos) { - if (pos == null) { - if (!folded) { - folded = true; - return true; - } - return false; - } - if (HoverHelper.isHovered(pos, Vec2i.of(0, 0), Vec2i.of(size().x().pixel(), 11))) { - folded = !folded; - return true; - } - return selector.click(pos.sub(0, 11)); - } - - public static class Builder { - private final Size size; - private final Identifier identifier; - private final Position position; - private final LinkedList buttons = new LinkedList<>(); - - public Builder(Size size, Identifier identifier, Position position) { - this.size = size; - this.identifier = identifier; - this.position = position; - } - - public Builder button(ButtonElement button) { - this.buttons.add(button); - return this; - } - - public DropdownElement build() { - return new DropdownElement(size, identifier, position, buttons); - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ImageElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ImageElement.java deleted file mode 100644 index 26de6f3..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ImageElement.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.combimagnetron.sunscreen.element.impl; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import org.jetbrains.annotations.NotNull; - -public class ImageElement extends SimpleBufferedElement { - private Canvas canvas; - - protected ImageElement(Canvas canvas, Identifier identifier, Position position) { - super(Size.pixel(canvas.size().x(), canvas.size().y()), identifier, position); - this.canvas = canvas; - } - - public static ImageElement imageElement(Canvas canvas, Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position) { - ImageElement imageElement = new ImageElement(canvas, identifier, Position.pixel(0, 0)); - imageElement.geometry(position); - return imageElement; - } - - public static ImageElement imageElement(Canvas canvas, Identifier identifier, Position position) { - return new ImageElement(canvas, identifier, position); - } - - @Override - public Element style(Style style, Position pos2D, T t) { - this.canvas = style.edit(canvas(), pos2D, t); - return this; - } - - @Override - public Element style(Style style, T t) { - return style(style, Position.pixel(0,0), t); - } - - @Override - public @NotNull Canvas canvas() { - return canvas; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/SelectorElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/impl/SelectorElement.java deleted file mode 100644 index e41cbb2..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/SelectorElement.java +++ /dev/null @@ -1,289 +0,0 @@ -package me.combimagnetron.sunscreen.element.impl; - -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.*; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import org.jetbrains.annotations.NotNull; - -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.Map; - -public class SelectorElement extends SimpleBufferedElement implements Interactable { - private final Map actions = new LinkedHashMap<>(); - private final LinkedHashMap buttons = new LinkedHashMap<>(); - private final LinkedHashMap> bounds = new LinkedHashMap<>(); - private boolean vertical; - private boolean unselectable = true; - private int spacing; - private Canvas canvas; - - protected SelectorElement(Size size, Identifier identifier, Position position, LinkedList buttons, boolean vertical, int spacing) { - super(size, identifier, position); - int i = 0; - int x = 0, y = 0; - for (ButtonElement button : buttons) { - this.buttons.put(button, ButtonElement.State.DEFAULT); - if (vertical) { - int pos = i * buttons.getFirst().size().y().pixel() + i * 2; - this.bounds.put(button, Pair.of(Vec2i.of(0, pos), button.size().vec2i())); - i++; - } else { - if (button.size().x().pixel() + x > size().x().pixel()) { - x = button.size().x().pixel() + spacing; - y += button.size().y().pixel() + spacing; - } else { - x += button.size().x().pixel() + spacing; - } - Vec2i pos = Vec2i.of(x, y).sub(button.size().x().pixel(), 0); - this.bounds.put(button, Pair.of(pos, button.size().vec2i())); - } - } - this.vertical = vertical; - this.canvas = render(); - this.spacing = spacing; - } - - public static SelectorElement selectorElement(Size size, Identifier identifier, Position position, LinkedList buttons) { - return new SelectorElement(size, identifier, position, buttons, true, 2); - } - - public static Builder selectorElement(Size size, Identifier identifier, Position position) { - return new Builder(size, identifier, position); - } - - public SelectorElement unselectable(boolean unselectable) { - this.unselectable = unselectable; - return this; - } - - public void select(Identifier identifier) { - for (Map.Entry entry : buttons.entrySet()) { - if (entry.getKey().identifier().equals(identifier)) { - buttons.replace(entry.getKey(), ButtonElement.State.CLICK); - } else { - buttons.replace(entry.getKey(), ButtonElement.State.DEFAULT); - } - } - this.canvas = render(); - } - - public SelectorElement vertical(boolean vertical) { - this.vertical = vertical; - return this; - } - - public SelectorElement horizontal() { - this.vertical = false; - return this; - } - - public ButtonElement selected() { - for (Map.Entry entry : buttons.entrySet()) { - if (entry.getValue().equals(ButtonElement.State.CLICK)) { - return entry.getKey(); - } - } - return null; - } - - @Override - public @NotNull Map actions() { - return actions; - } - - protected Canvas render() { - return vertical ? renderVert() : renderHor(); - } - - protected Canvas renderHor() { - ButtonElement first = buttons.keySet().stream().findFirst().get(); - int y = first.size().y().pixel(); - int x = 0; - Canvas canvas = Canvas.image(Vec2i.of(256, 256)); - for (Map.Entry entry : buttons.entrySet()) { - if (entry.getKey().size().x().pixel() + x > size().x().pixel()) { - x = entry.getKey().size().x().pixel() + spacing; - y += entry.getKey().size().y().pixel() + spacing; - } else { - x += entry.getKey().size().x().pixel() + spacing; - } - Canvas buttonImage = entry.getKey().icons().get(entry.getValue()); - canvas.place(buttonImage, Vec2i.of(x, y).sub(entry.getKey().size().vec2i())); - } - canvas = canvas.trim(); - size(Size.pixel(canvas.size())); - return canvas; - } - - protected Canvas renderVert() { - ButtonElement first = buttons.keySet().stream().findFirst().get(); - int x = first.size().x().pixel(); - int y = buttons.size() * first.size().y().pixel() + (buttons.size() + 1) * spacing + 2; - Canvas image = Canvas.image(Vec2i.of(x, y)); - int i = 0; - for (Map.Entry entry : buttons.entrySet()) { - image.place(entry.getKey().icons().get(entry.getValue()), Vec2i.of(0, i * first.size().y().pixel() + i * spacing)); - i++; - } - this.size(Size.pixel(size().x().pixel(), y +4)); - return image; - } - - @Override - public @NotNull Canvas canvas() { - return canvas; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } - - @Override - public boolean reactiveToHover() { - return true; - } - - @Override - public boolean reactiveToClick() { - return true; - } - - @Override - public boolean hover(Vec2i pos) { - return vertical ? hoverVertical(pos) : hoverHorizontal(pos); - } - - private boolean hoverHorizontal(Vec2i pos) { - if (pos == null) { - return outOfBounds(); - } - reset(); - for (Map.Entry> entry : bounds.entrySet()) { - if (buttons.get(entry.getKey()).equals(ButtonElement.State.CLICK)) continue; - if (HoverHelper.isHovered(pos, entry.getValue().k(), entry.getValue().v())) { - buttons.replace(entry.getKey(), ButtonElement.State.HOVER); - } - } - this.canvas = render(); - return true; - } - - private void reset() { - for (Map.Entry button : buttons.entrySet()) { - if (button.getValue().equals(ButtonElement.State.HOVER)) buttons.replace(button.getKey(), ButtonElement.State.DEFAULT); - } - } - - private boolean outOfBounds() { - boolean update = false; - for (Map.Entry button : buttons.entrySet()) { - if (button.getValue().equals(ButtonElement.State.HOVER)) { - buttons.replace(button.getKey(), ButtonElement.State.DEFAULT); - update = true; - } - } - if (update) { - this.canvas = render(); - } - return update; - } - - private boolean hoverVertical(Vec2i pos) { - if (pos == null) { - return outOfBounds(); - } - //pos = pos.sub(0, 8); - reset(); - for (Map.Entry> entry : bounds.entrySet()) { - if (buttons.get(entry.getKey()).equals(ButtonElement.State.CLICK)) continue; - if (HoverHelper.isHovered(pos, entry.getValue().k(), entry.getValue().v())) { - buttons.replace(entry.getKey(), ButtonElement.State.HOVER); - } - } - this.canvas = render(); - return true; - } - - @Override - public boolean click(Vec2i pos) { - if (pos == null) { - return false; - } - //pos = pos.sub(0, 8); - for (Map.Entry button : buttons.entrySet()) { - if ((button.getValue() == null || button.getKey() == null) && !unselectable) { - continue; - } - buttons.replace(button.getKey(), ButtonElement.State.DEFAULT); - } - for (Map.Entry> entry : bounds.entrySet()) { - if (entry.getKey() == null || entry.getValue() == null) { - continue; - } - if (HoverHelper.isHovered(pos, entry.getValue().k(), entry.getValue().v())) { - buttons.replace(entry.getKey(), ButtonElement.State.CLICK); - entry.getKey().click(pos); - } - } - this.canvas = render(); - return true; - } - - public static class Builder { - private final LinkedList buttons = new LinkedList<>(); - private Size size; - private final Identifier identifier; - private final Position position; - private boolean vertical = true; - private int spacing = 2; - - public Builder(Size size, Identifier identifier, Position position) { - this.size = size; - this.identifier = identifier; - this.position = position; - } - - public Builder size(Size size) { - this.size = size; - return this; - } - - public Builder button(ButtonElement button) { - buttons.add(button); - return this; - } - - public Builder horizontal() { - this.vertical = false; - return this; - } - - public Builder vertical() { - this.vertical = true; - return this; - } - - public Builder spacing(int spacing) { - this.spacing = spacing; - return this; - } - - public SelectorElement build() { - return new SelectorElement(size, identifier, position, buttons, vertical, spacing); - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ShapeElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ShapeElement.java deleted file mode 100644 index 881519d..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/ShapeElement.java +++ /dev/null @@ -1,78 +0,0 @@ -package me.combimagnetron.sunscreen.element.impl; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.Color; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -public abstract class ShapeElement extends SimpleBufferedElement { - - public ShapeElement(Size size, Identifier identifier, Position position) { - super(size, identifier, position); - } - - @Override - public abstract @NotNull Canvas canvas(); - - @Override - public Element style(Style style, Position pos2D, T t) { - this.canvas = style.edit(canvas, pos2D, t); - return this; - } - - @Override - public Element style(Style style, T t) { - this.canvas = style.edit(canvas, Position.pixel(0, 0) ,t); - return this; - } - - public static Circle circle(Size size, Identifier identifier, Position position) { - return new Circle(size, identifier, position); - } - - public static Rectangle rectangle(Size size, Identifier identifier, Position position, Color color) { - return new Rectangle(size, identifier, position, color); - } - - public static Rectangle rectangle(Size size, Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position, Color color) { - Rectangle rectangle = new Rectangle(size, identifier, null, color); - rectangle.geometry(position); - return rectangle; - } - - public static class Circle extends ShapeElement { - public Circle(Size size, Identifier identifier, Position position) { - super(size, identifier, position); - } - - @Override - public @NotNull Canvas canvas() { - double r = 0.5*size().x().pixel(); - - return canvas; - } - } - - public static class Rectangle extends ShapeElement { - private final Color color; - public Rectangle(Size size, Identifier identifier, Position position, Color color) { - super(size, identifier, position); - this.color = color; - } - - @Override - public @NotNull Canvas canvas() { - canvas = canvas.fill(Vec2i.of(0, 0), size().vec2i(), color); - return canvas; - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextElement.java deleted file mode 100644 index f06afed..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextElement.java +++ /dev/null @@ -1,134 +0,0 @@ -package me.combimagnetron.sunscreen.element.impl; - -import me.combimagnetron.passport.util.placeholder.Placeholder; -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.style.Text; -import org.jetbrains.annotations.NotNull; - -import java.awt.*; -import java.awt.font.FontRenderContext; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; - -public class TextElement extends SimpleBufferedElement { - private final Options options; - private Text text; - - public static TextElement textElement(Identifier identifier, Position position, Text text) { - return new TextElement(identifier, position, Size.pixel(256, 256), text, Options.options()); - } - - public static TextElement textElement(Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position, Text text) { - TextElement textElement = new TextElement(identifier, null, Size.pixel(256, 256), text, Options.options()); - textElement.geometry(position); - return textElement; - } - - public static TextElement textElement(Identifier identifier, Position position, Text text, Options options) { - return new TextElement(identifier, position, Size.pixel(256, 256), text, options); - } - - private TextElement(Identifier identifier, Position position, Size size, Text text, Options options) { - super(size, identifier, position); - this.text = text; - this.options = options; - text(text); - } - - public Element text(Text text) { - this.text = text; - render(); - return this; - } - - private void render() { - BufferedImage image = ((Canvas.StaticImpl) canvas).image(); - Graphics2D graphics = image.createGraphics(); - graphics.setFont(text.font().internal()); - if (options.lineBreaks && text.content().contains("\n")) { - String[] lines = text.content().split("\n"); - for (int i = 0; i < lines.length; i++) { - graphics.drawString(lines[i], 0, 10 + i * 10); - } - } else if (options.wordWrap && text.font().internal().getStringBounds(text.content(), new FontRenderContext(new AffineTransform(), true, true)).getWidth() > size().x().pixel()) { - String[] words = text.content().split(" "); - StringBuilder line = new StringBuilder(); - int y = 10; - for (String word : words) { - //word = SunscreenLibrary.library().passport().placeholders().parse(Placeholder.of()); - if (text.font().internal().getStringBounds(line + word, new FontRenderContext(new AffineTransform(), true, true)).getWidth() > size().x().pixel()) { - graphics.drawString(line.toString(), 0 , 11 * y); - line = new StringBuilder(); - y++; - } - line.append(word).append(" "); - } - } else { - graphics.drawString(text.content(), 0, 10); - } - graphics.dispose(); - canvas = Canvas.image(image).trim(); - } - - public Text text() { - return text; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - this.canvas = style.edit(canvas, pos2D, t); - return this; - } - - @Override - public Element style(Style style, T t) { - this.canvas = style.edit(canvas, Position.pixel(0, 0), t); - return this; - } - - @Override - public @NotNull Canvas canvas() { - return canvas; - } - - public record Options(boolean wordWrap, boolean lineBreaks, boolean shadow) { - public static Options options(boolean wordWrap, boolean lineBreaks, boolean shadow) { - return new Options(wordWrap, lineBreaks, shadow); - } - - public static Options options(boolean wordWrap, boolean lineBreaks) { - return new Options(wordWrap, lineBreaks, false); - } - - public static Options options(boolean wordWrap) { - return new Options(wordWrap, false, false); - } - - public static Options options() { - return new Options(true, true, false); - } - - public Options wordWrap(boolean wordWrap) { - return new Options(wordWrap, lineBreaks, shadow); - } - - public Options lineBreaks(boolean lineBreaks) { - return new Options(wordWrap, lineBreaks, shadow); - } - - public Options shadow(boolean shadow) { - return new Options(wordWrap, lineBreaks, shadow); - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextInputElement.java b/api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextInputElement.java deleted file mode 100644 index a439c62..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/element/impl/TextInputElement.java +++ /dev/null @@ -1,155 +0,0 @@ -package me.combimagnetron.sunscreen.element.impl; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.input.InputHandler; -import me.combimagnetron.sunscreen.menu.input.TextInput; -import me.combimagnetron.sunscreen.menu.timing.Tick; -import me.combimagnetron.sunscreen.menu.timing.TickFailException; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; - -public class TextInputElement extends SimpleBufferedElement implements /*Tickable,*/ Interactable { - private final Map actions = new HashMap<>(); - private InputHandler inputHandler; - private String input = ""; - private Style style = Style.SIMPLE; - private String result; - - protected TextInputElement(Size size, Identifier identifier, Position position, InputHandler inputHandler) { - super(size, identifier, position); - this.inputHandler = inputHandler; - } - - public static TextInputElement of(Size size, Identifier identifier, Position position, InputHandler inputHandler) { - return new TextInputElement(size, identifier, position, inputHandler); - } - - public void handle(String text) { - this.input = text; - this.canvas(); - } - - public static TextInputElement of(Size size, Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position, InputHandler inputHandler) { - TextInputElement element = new TextInputElement(size, identifier, null, inputHandler); - element.geometry(position); - return element; - } - - public String result() { - return result == null ? "" : result; - } - - public TextInputElement style(Style style) { - this.style = style; - return this; - } - - @Override - public @NotNull Canvas canvas() { - return style == Style.SIMPLE ? simple() : bordered(); - } - - private Canvas simple() { - Canvas canvas = Canvas.image(size()); - canvas.fill(Vec2i.of(0, 0), size().vec2i(), EditorMenu.Colors.Tertiary); - if (inputHandler.active()) { - canvas.text(Text.text(this.input), Vec2i.of(1, 8), EditorMenu.Colors.PrimaryText); - } else if (result != null) { - canvas.text(Text.text(result), Vec2i.of(1, 8), EditorMenu.Colors.PrimaryText); - } else { - canvas.text(Text.text("Click to edit"), Vec2i.of(1, 8), EditorMenu.Colors.PrimaryText); - } - return canvas; - } - - @Override - public @NotNull Map actions() { - return actions; - } - - private Canvas bordered() { - Canvas canvas = Canvas.image(size()); - canvas.fill(Vec2i.of(0, 0), size().vec2i(), EditorMenu.Colors.Background); - canvas.fill(Vec2i.of(1, 1), size().vec2i().sub(Vec2i.of(2, 2)), EditorMenu.Colors.Secondary); - canvas.fill(Vec2i.of(2, 2), size().vec2i().sub(Vec2i.of(4, 4)), EditorMenu.Colors.Background); - if (inputHandler.active()) { - canvas.text(Text.text(input), Vec2i.of(3, 10), EditorMenu.Colors.PrimaryText); - } else if (result != null) { - canvas.text(Text.text(result), Vec2i.of(3, 10), EditorMenu.Colors.PrimaryText); - } - return canvas; - } - - @Override - public Element style(me.combimagnetron.sunscreen.style.Style style, Position pos2D, S s) { - return null; - } - - @Override - public Element style(me.combimagnetron.sunscreen.style.Style style, S S) { - return null; - } - - //@Override - public boolean tick(Tick tick) throws TickFailException { - if (inputHandler.active()) { - if (inputHandler.textInput().changed()) { - this.canvas(); - this.result = inputHandler.textInput().input(); - return true; - } - } - return false; - } - - @Override - public boolean reactiveToHover() { - return false; - } - - @Override - public boolean reactiveToClick() { - return true; - } - - @Override - public boolean hover(Vec2i pos) { - return false; - } - - @Override - public boolean click(Vec2i pos) { - if (pos == null) { - return false; - } - if (inputHandler.active()) { - inputHandler.quit(); - } - TextInput input = inputHandler.open(); - input.position(Position.pixel(10, 20)); - return true; - } - - public TextInputElement inputHandler(InputHandler inputHandler) { - this.inputHandler = inputHandler; - return this; - } - - public enum Style { - SIMPLE, BORDERED - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/effect/Effect.java b/api/src/main/java/me/combimagnetron/sunscreen/image/effect/Effect.java deleted file mode 100644 index c5e8f37..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/effect/Effect.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.combimagnetron.sunscreen.image.effect; - -import me.combimagnetron.sunscreen.image.Canvas; - -public interface Effect { - - Canvas apply(Canvas canvas); - - static Effect greyscale() { - return new GreyscaleEffect(); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/effect/GreyscaleEffect.java b/api/src/main/java/me/combimagnetron/sunscreen/image/effect/GreyscaleEffect.java deleted file mode 100644 index 93b5207..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/effect/GreyscaleEffect.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.combimagnetron.sunscreen.image.effect; - -import me.combimagnetron.sunscreen.image.Canvas; - -import java.awt.image.BufferedImage; - -public class GreyscaleEffect implements Effect { - - @Override - public Canvas apply(Canvas canvas) { - if (!(canvas instanceof Canvas.StaticImpl impl)) { - throw new IllegalArgumentException("Canvas must be a StaticImpl"); - } - BufferedImage original = impl.image(); - BufferedImage greyscale = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_BYTE_GRAY); - greyscale.getGraphics().drawImage(original, 0, 0, null); - return Canvas.image(greyscale); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/AspectRatioMenu.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/AspectRatioMenu.java deleted file mode 100644 index b19d9ec..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/AspectRatioMenu.java +++ /dev/null @@ -1,347 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.event.PacketListener; -import com.github.retrooper.packetevents.event.PacketListenerCommon; -import com.github.retrooper.packetevents.event.PacketListenerPriority; -import com.github.retrooper.packetevents.event.PacketReceiveEvent; -import com.github.retrooper.packetevents.protocol.entity.data.EntityData; -import com.github.retrooper.packetevents.protocol.packettype.PacketType; -import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientEntityAction; -import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerInput; -import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPlayerRotation; -import com.github.retrooper.packetevents.wrapper.play.server.*; -import me.combimagnetron.passport.config.Config; -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.internal.entity.impl.display.Display; -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.passport.user.User; -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.element.animated.AnimatedElement; -import me.combimagnetron.sunscreen.element.animated.Keyframe; -import me.combimagnetron.sunscreen.hook.SunscreenHook; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.CanvasRenderer; -import me.combimagnetron.sunscreen.image.Color; -import me.combimagnetron.sunscreen.menu.draft.Draft; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.element.div.Edit; -import me.combimagnetron.sunscreen.element.impl.ImageElement; -import me.combimagnetron.sunscreen.element.impl.TextElement; -import me.combimagnetron.sunscreen.menu.input.InputHandler; -import me.combimagnetron.sunscreen.menu.simulate.Simulator; -import me.combimagnetron.sunscreen.menu.timing.Tick; -import me.combimagnetron.sunscreen.menu.timing.TickFailException; -import me.combimagnetron.sunscreen.menu.timing.Tickable; -import me.combimagnetron.sunscreen.session.Session; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.*; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.ArrayUtils; - -import java.nio.file.Path; -import java.util.*; -import java.util.function.Function; - -public final class AspectRatioMenu implements OpenedMenu, Tickable { - private final static Map CHAR_MAP = Map.of(Identifier.of("upper_left"), "1a", - Identifier.of("upper_right"), "2b", - Identifier.of("lower_left"), "1c", - Identifier.of("lower_right"), "2d"); - private final static double PixelFactor = /*((40.75/16)*1/24)/100;*/0.0010;//0.04/24; - private final Canvas spriteSheet = Canvas.image(Canvas.ImageProvider.file(Path.of("assets/sunscreen/setup/spritesheet.png"))); - private final Canvas animationSpriteSheet = Canvas.image(Canvas.ImageProvider.file(Path.of("assets/sunscreen/setup/animation.png"))); - private final SunscreenUser viewer; - private final HashMap> divHashMap = new HashMap<>(); - private final HashMap divEntityIdHashMap = new HashMap<>(); - private final TextDisplay cursorDisplay; - private final TextDisplay instructionDisplay; - private final TextDisplay cameraDisplay; - private final TextDisplay temp; - private boolean cursorLocked = false; - private int gameMode; - private Vec2d lastInput = Vec2d.of(0, 0); - private PacketListenerCommon listener; - - - - public AspectRatioMenu(SunscreenUser viewer) { - this.viewer = viewer; - this.gameMode = viewer.gameMode(); - cursorDisplay = TextDisplay.textDisplay(viewer.position()); - instructionDisplay = TextDisplay.textDisplay(viewer.position()); - cameraDisplay = TextDisplay.textDisplay(viewer.position().add(Vector3d.vec3(0, 1.7, 0))); - temp = TextDisplay.textDisplay(viewer.position()); - build(); - hideCursor(); - open(viewer); - SunscreenLibrary.library().sessionHandler().session(Session.session(this, viewer)); - } - - private void build() { - Div upperLeft = Div.nonRender(Identifier.of("upper_left")); - //.add(ImageElement.imageElement(Canvas.image(Canvas.ImageProvider.url("https://i.imgur.com/79sGWjB.png")), Identifier.of("arrow"), Position.pixel(0,0))); - div(upperLeft); - Div upperRight = Div.nonRender(Identifier.of("upper_right")); - //.add(ImageElement.imageElement(Canvas.image(Canvas.ImageProvider.url("https://i.imgur.com/79sGWjB.png")), Identifier.of("arrow"), Position.pixel(0,0))); - div(upperRight); - Div lowerLeft = Div.nonRender(Identifier.of("lower_left")); - //.add(ImageElement.imageElement(Canvas.image(Canvas.ImageProvider.url("https://i.imgur.com/79sGWjB.png")), Identifier.of("arrow"), Position.pixel(0,0))); - div(lowerLeft); - Div lowerRight = Div.nonRender(Identifier.of("lower_right")); - //.add(ImageElement.imageElement(Canvas.image(Canvas.ImageProvider.url("https://i.imgur.com/79sGWjB.png")), Identifier.of("arrow"), Position.pixel(0,0))); - div(lowerRight); - List keyframes = new ArrayList<>(); - for (int i = 0; i < 13; i++) { - int holdTime = 1; - if (i == 12) { - holdTime = 4; - } - keyframes.add(Keyframe.of(animationSpriteSheet.sub(Vec2i.of(40, 40), Vec2i.of(i * 40, 0)), holdTime)); - } - AnimatedElement element = AnimatedElement.of(keyframes, Position.pixel(29, 70), Size.pixel(keyframes.getFirst().canvas().size()), Identifier.of("center", "animation")); - element.loopMode(AnimatedElement.LoopMode.LOOP); - Div center = Div.div(Identifier.of("center")).size(Size.pixel(114, 140)) - .add(ImageElement.imageElement(spriteSheet.sub(Vec2i.of(114, 140), Vec2i.of(594, 0)), Identifier.of("center", "bg"), Position.pixel(0, 0))) - .add(ImageElement.imageElement(spriteSheet.sub(Vec2i.of(101, 12), Vec2i.of(115, 194)), Identifier.of("center", "button"), Position.pixel(3, 125))) - .add(TextElement.textElement(Identifier.of("center", "button_label"), Position.pixel(13, 127), Text.text("Sneak to continue", Text.Font.vanilla())) - .style(Style.color(), Color.of(155, 171, 178))) - .add(TextElement.textElement(Identifier.of("center", "label"), Position.pixel(3, 3), Text.text("Move the arrows to\nthe corner of your\nscreen by moving\nyour mouse.", Text.Font.vanilla())) - .style(Style.color(), Color.of(155, 171, 178))) - .add(element); - div(center); - } - - private void hideCursor() { - cursorDisplay.text(Component.empty()); - List> entityData = cursorDisplay.type().metadata().entityData(); - WrapperPlayServerEntityMetadata clientEntityMetadata = new WrapperPlayServerEntityMetadata(cursorDisplay.id().intValue(), entityData); - viewer.connection().send(clientEntityMetadata); - } - - private void showCursor() { - cursorDisplay.text(Component.text("e").font(Key.key("comet:arrow"))); - cursorDisplay.backgroundColor(0); - cursorDisplay.billboard(Display.Billboard.CENTER); - Display.Transformation transformation = Display.Transformation.transformation().translation(Vector3d.vec3(0, 0, -0.24999)).scale(Vector3d.vec3((double) 1/24, (double) 1/24, (double) 1/24)); - cursorDisplay.transformation(transformation); - viewer.show(cursorDisplay); - } - - private void leave() { - viewer.connection().send(new WrapperPlayServerChangeGameState(WrapperPlayServerChangeGameState.Reason.CHANGE_GAME_MODE, gameMode)); - viewer.connection().send(new WrapperPlayServerCamera(viewer.entityId())); - viewer.connection().send(new WrapperPlayServerSetPassengers(cursorDisplay.id().intValue(), new int[]{})); - viewer.connection().send(new WrapperPlayServerDestroyEntities(cursorDisplay.id().intValue(), temp.id().intValue(), cameraDisplay.id().intValue())); - divEntityIdHashMap.forEach((div, display) -> viewer.connection().send(new WrapperPlayServerDestroyEntities(display.id().intValue()))); - PacketEvents.getAPI().getEventManager().unregisterListener(listener); - SunscreenHook.HOOKS.stream().filter(SunscreenHook::canRun).forEach(hook -> hook.onMenuLeave(viewer, this)); - SunscreenLibrary.library().sessionHandler().session(Session.session(null, viewer)); - SunscreenLibrary.library().menuTicker().stop(this); - } - - private void initListener() { - this.listener = PacketEvents.getAPI().getEventManager().registerListener(new PacketListener() { - @Override - public void onPacketReceive(PacketReceiveEvent event) { - if (event.getPacketType() == PacketType.Play.Client.PLAYER_ROTATION) { - WrapperPlayClientPlayerRotation packet = new WrapperPlayClientPlayerRotation(event); - float yaw = packet.getYaw(); - float pitch = -packet.getPitch(); - lastInput = Vec2d.of(yaw, pitch).sub(lastInput).div(250); - move(); - } else if (event.getPacketType() == PacketType.Play.Client.ENTITY_ACTION) { - WrapperPlayClientEntityAction packet = new WrapperPlayClientEntityAction(event); - if (packet.getAction() == WrapperPlayClientEntityAction.Action.STOP_SNEAKING) { - Vector3d begin = divEntityIdHashMap.get(Identifier.of("lower_left")).transformation().translation(); - Vector3d end = divEntityIdHashMap.get(Identifier.of("upper_right")).transformation().translation(); - final double add = (8.5)*PixelFactor; - begin = begin.add(Vector3d.vec3(-add, add, 0)); - end = end.add(Vector3d.vec3(add, -add, 0)); - Vec2i screenSize = Vec2i.of((int)((end.x() - begin.x())*40.75*24 - 17*((double) 960 /978)), (int)((end.y() - begin.y())*40.75*24 + 17*2*((double) 960 /978))); - ScreenSize actual = ScreenSize.of(screenSize, Pair.of(Vec2d.of(begin.x(), begin.y()), Vec2d.of(end.x(), end.y()))); - viewer.screenSize(actual); - final Path data = SunscreenLibrary.library().path().resolve("data.dt"); - Config.file(data).node(Node.required(viewer.uniqueIdentifier().toString(), actual.compress())).save(data); - leave(); - } - - } else if (event.getPacketType() == PacketType.Play.Client.PLAYER_INPUT) { - WrapperPlayClientPlayerInput packet = new WrapperPlayClientPlayerInput(event); - if (!packet.isShift()) { - return; - } - leave(); - } - } - }, PacketListenerPriority.LOWEST); - } - - private static void send(User viewer, TextDisplay textDisplay) { - List> entityData = textDisplay.type().metadata().entityData(); - WrapperPlayServerEntityMetadata clientEntityMetadata = new WrapperPlayServerEntityMetadata(textDisplay.id().intValue(), entityData); - viewer.connection().send(clientEntityMetadata); - } - - private boolean isHovered(Vec2d position, Vec2d size) { - Vector3d translation = cursorDisplay.transformation().translation(); - Vec2d cursor = Vec2d.of(translation.x(), translation.y()); - return cursor.x() > position.x() && cursor.x() < position.x() + size.x() && cursor.y() > position.y() && cursor.y() < position.y() + size.y(); - } - - private void move() { - Vec2d translation = lastInput.mul(1); - if (!cursorLocked) { - Display.Transformation transformation = Display.Transformation.transformation().translation(Vector3d.vec3(translation.x(), translation.y(), -0.24999)).scale(Vector3d.vec3((double) 1/24, (double) 1/24, (double) 1/24)); - cursorDisplay.transformation(transformation); - cursorDisplay.text(Component.text("e").font(Key.key("comet:arrow"))); - cursorDisplay.backgroundColor(0); - send(viewer, cursorDisplay); - } - Display.Transformation previewTransformation = Display.Transformation.transformation().translation(Vector3d.vec3(translation.x(), translation.y(), -0.24998)).scale(Vector3d.vec3((double) 1/24, (double) 1/24, (double) 1/24)); - divEntityIdHashMap.forEach((identifier, display) -> { - if (!CHAR_MAP.containsKey(identifier)) return; - display.brightness(15, 15); - display.onFire(true); - display.text(Component.text(CHAR_MAP.get(identifier)).font(Key.key("comet:arrow"))); - double xMov = translation.x(); - double yMov = translation.y(); - if (identifier.string().contains("right")) { - xMov = -xMov; - } - if (identifier.string().contains("lower")) { - yMov = -yMov; - } - Display.Transformation transformation = Display.Transformation.transformation().translation(Vector3d.vec3(xMov, yMov, -0.24999)).scale(Vector3d.vec3((double) 1/24, (double) 1/24, (double) 1/24)); - display.transformation(transformation); - display.backgroundColor(0); - send(viewer, display); - }); - double xMov = translation.x(); - double yMov = -translation.y(); - } - - public void open(SunscreenUser user) { - SunscreenHook.HOOKS.stream().filter(SunscreenHook::canRun).forEach(hook -> hook.onMenuEnter(user, this)); - Vector3d rotation = Vector3d.vec3(user.rotation().y(), user.rotation().x(), user.rotation().z()); - user.connection().send(new WrapperPlayServerPlayerRotation(0, -180)); - initListener(); - cameraDisplay.rotation(rotation); - user.show(cameraDisplay); - if (SunscreenLibrary.library().config().forceShaderFov()) { - user.fov(70); - } - user.connection().send(new WrapperPlayServerCamera(cameraDisplay.id().intValue())); - user.connection().send(new WrapperPlayServerChangeGameState(WrapperPlayServerChangeGameState.Reason.CHANGE_GAME_MODE, 3)); - for (Div div : divHashMap.values()) { - divEntityIdHashMap.put(div.identifier(), spawn(div, user)); - } - temp.backgroundColor(-16184812); - temp.text(Component.text(" ")); - temp.brightness(15, 15); - temp.billboard(Display.Billboard.CENTER); - Display.Transformation tempTransformation = Display.Transformation.transformation().translation(Vector3d.vec3(0, -60, -0.27)).scale(Vector3d.vec3(500, 500, (double) 1/24)); - temp.transformation(tempTransformation); - viewer.show(temp); - List entityIds = new ArrayList<>(); - entityIds.add(user.entityId()); - entityIds.add(temp.id().intValue()); - entityIds.add(cursorDisplay.id().intValue()); - Scheduler.async(() -> { - entityIds.addAll(divEntityIdHashMap.values().stream().map(entity -> entity.id().intValue()).toList()); - user.connection().send(new WrapperPlayServerSetPassengers(cameraDisplay.id().intValue(), ArrayUtils.toPrimitive(entityIds.toArray(new Integer[0])))); - return null; - }); - } - - private TextDisplay spawn(Div div, User user) { - TextDisplay display = TextDisplay.textDisplay(user.position()); - display.billboard(Display.Billboard.CENTER); - Div divDisplay = (Div) div; - double yOffset = divDisplay.canvas().size().y() * PixelFactor * (0.5); - Display.Transformation transformation = Display.Transformation.transformation().translation(Vector3d.vec3(0, -yOffset, -0.25)).scale(Vector3d.vec3((double) 1/24, (double) 1/24, (double) 1/24)); - display.transformation(transformation); - Component component = Component.text(" "); - if (!(div instanceof Div.NonRenderDiv)) { - component = CanvasRenderer.optimized().render(div.render(viewer)).component(); - } - display.onFire(true); - display.backgroundColor(0); - display.brightness(15, 15); - display.text(component); - display.lineWidth(200000); - user.show(display); - return display; - } - - public OpenedMenu apply(Draft draft) { - Draft.Impl draftImpl = (Draft.Impl) draft; - for (Edit edit : draftImpl.edits()) { - if (edit.type() == Div.class) { - Edit> divEdit = (Edit>) edit; - Div div = divHashMap.get(edit.identifier()); - for (Function, Div> draftEdit : divEdit.edits()) { - div = draftEdit.apply(div); - } - divHashMap.put(edit.identifier(), div); - } else if (edit.type() == Element.class) { - Edit> elementEdit = (Edit>) edit; - Element element = (Element) divHashMap.get(edit.identifier()).elements().stream().filter(e -> e.identifier().equals(edit.identifier())).findFirst().orElse(null); - for (Function, Element> draftEdit : elementEdit.edits()) { - element = draftEdit.apply(element); - } - Div div = divHashMap.get(edit.identifier()); - div.remove(edit.identifier()); - div.add(element); - divHashMap.put(edit.identifier(), div); - } - } - return this; - } - - public OpenedMenu div(Div div) { - divHashMap.put(div.identifier(), div); - return this; - } - - @Override - public boolean close() { - return false; - } - - @Override - public InputHandler inputHandler() { - return null; - } - - @Override - public Simulator simulator() { - return null; - } - - @Override - public boolean tick(Tick tick) throws TickFailException { - for (Map.Entry> identifierDivEntry : divHashMap.entrySet()) { - Div div = identifierDivEntry.getValue(); - for (Element element : div.elements()) { - if (element instanceof Tickable tickable) { - - boolean update = tickable.tick(tick); - if (!update) { - return false; - } - TextDisplay display = divEntityIdHashMap.get(identifierDivEntry.getKey()); - display.text(CanvasRenderer.optimized().render(div.render(viewer)).component()); - send(viewer, display); - return true; - } - } - } - return false; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/Geometry.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/Geometry.java deleted file mode 100644 index d1d61bf..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/Geometry.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -public interface Geometry { - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/MenuMagicValues.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/MenuMagicValues.java deleted file mode 100644 index 64af02e..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/MenuMagicValues.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -public interface MenuMagicValues { - - double PixelFactor = 0.0010;//0.04/24;//0.0010; - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/MenuTemplate.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/MenuTemplate.java deleted file mode 100644 index 4d0da19..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/MenuTemplate.java +++ /dev/null @@ -1,89 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.config.CachedConfigDiv; -import me.combimagnetron.sunscreen.config.MenuConfigTransformer; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.menu.draft.Draft; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.element.div.Edit; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.function.Function; - -public interface MenuTemplate { - - MenuTemplate div(CachedConfigDiv div); - - Identifier identifier(); - - static MenuTemplate simple(Type type, Identifier identifier) { - return new Simple(type, identifier); - } - - class Simple implements MenuTemplate { - private final Type type; - private final Identifier identifier; - protected final HashMap divHashMap = new HashMap<>(); - protected final HashMap> actionHashMap = new HashMap<>(); - - protected Simple(Type type, Identifier identifier) { - this.type = type; - this.identifier = identifier; - } - - public HashMap divHashMap() { - return divHashMap; - } - - public HashMap> actionHashMap() { - return actionHashMap; - } - - @Override - public Identifier identifier() { - return identifier; - } - - public HashMap> create() { - HashMap> divs = new HashMap<>(); - for (CachedConfigDiv div : divHashMap.values()) { - Div d = Div.div(div.identifier()); - d.order(div.order()); - for (Section element : div.elements()) { - Element e = MenuConfigTransformer.ElementTransformer.transform(element, identifier.string()); - d.add(e); - } - if (div.condition() != null) { - d.condition(div.condition()); - } - for (RuntimeDefinableGeometry.GeometryBuilder geometry : div.geometry()) { - d.geometry(geometry); - } - divs.put(div.identifier(), d); - } - return divs; - } - - @Override - public MenuTemplate div(CachedConfigDiv div) { - divHashMap.put(div.identifier(), div); - return this; - } - - } - - enum Type { - FLOAT, - SINGLE, - MAP, - HYBRID - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java index b0513ad..e1975a8 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java @@ -81,12 +81,12 @@ protected void forceDivGeometry(SunscreenUser viewer) { for (RuntimeDefinableGeometry.GeometryBuilder definable : div.definables()) { div.geometry(definable.finish(viewer.screenSize().pixel(), div.size())); } - for (RuntimeDefinable.Type definable : element.definables().stream().sorted(Comparator.comparingInt(RuntimeDefinable.Type::priority)).toList()) { + for (RuntimeDefinable.Builder definable : element.definables().stream().sorted(Comparator.comparingInt(RuntimeDefinable.Builder::priority)).toList()) { if (definable instanceof RuntimeDefinableGeometry.GeometryBuilder geometry) { element.geometry(geometry.finish(div.size(), div.size())); } if (definable.type() == InputHandler.class) { - RuntimeDefinable.Type inputHandler = (RuntimeDefinable.Type) definable; + RuntimeDefinable.Builder inputHandler = (RuntimeDefinable.Builder) definable; TextInputElement textInputElement = (TextInputElement) element; textInputElement.inputHandler(inputHandler.finish(this)); } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/Position.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/Position.java deleted file mode 100644 index fa812ab..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/Position.java +++ /dev/null @@ -1,102 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.menu.editor.EditableType; -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; - -public non-sealed interface Position extends RuntimeDefinableGeometry, Geometry { - - static PositionBuilder position() { - return new PositionBuilder(); - } - - static Position pixel(int x, int y) { - return new Impl(CoordType.pixel(x), CoordType.pixel(y)); - } - - static PositionBuilder config(Section section) { - String x = ((Node)section.find("x")).value(); - String y = ((Node)section.find("y")).value(); - GeometryBuilder.Section xSection = RuntimeDefinableGeometry.GeometryBuilder.parse(x); - GeometryBuilder.Section ySection = RuntimeDefinableGeometry.GeometryBuilder.parse(y); - PositionBuilder builder = new PositionBuilder(xSection, ySection); - xSection.parent(builder); - ySection.parent(builder); - return builder; - } - - final class PositionBuilder extends RuntimeDefinableGeometry.GeometryBuilder implements EditableType { - - protected PositionBuilder(Section x, Section y) { - super(x, y); - } - - protected PositionBuilder() { - super(); - } - - @Override - public Position finish(Vec2i size, Vec2i divSize) { - return new Impl(finalise(x(), true, size, divSize), finalise(y(), false, size, divSize)); - } - - @Override - public int priority() { - return 1; - } - - @Override - public Class type() { - return Position.class; - } - - @Override - public Position finish(Pair vec2dVec2dPair) { - return finish(vec2dVec2dPair.k(), vec2dVec2dPair.v()); - } - - } - - final class Impl implements Position { - private final CoordType x; - private final CoordType y; - private PositionBuilder builder; - - public Impl(CoordType x, CoordType y) { - this.x = x; - this.y = y; - } - - @Override - public Geometry build(Pair var) { - return builder.finish(var); - } - - @Override - public PositionBuilder builder() { - return builder; - } - - @Override - public void builder(GeometryBuilder builder) { - if (builder instanceof PositionBuilder) { - this.builder = (PositionBuilder) builder; - } else { - throw new IllegalArgumentException("Builder must be of type PositionBuilder"); - } - } - - public CoordType x() { - return x; - } - - public CoordType y() { - return y; - } - - } - -} \ No newline at end of file diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/RuntimeDefinableGeometry.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/RuntimeDefinableGeometry.java deleted file mode 100644 index 5e86047..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/RuntimeDefinableGeometry.java +++ /dev/null @@ -1,147 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -import me.combimagnetron.passport.util.matcher.*; -import me.combimagnetron.sunscreen.element.Operator; -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.RuntimeDefinable; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; - -import java.util.ArrayList; -import java.util.List; - -public sealed interface RuntimeDefinableGeometry extends RuntimeDefinable, Pair> permits Position, Size { - - CoordType x(); - - CoordType y(); - - abstract class GeometryBuilder implements RuntimeDefinable.Type> { - private final Section x; - private final Section y; - - protected GeometryBuilder(Section x, Section y) { - this.x = x; - this.y = y; - } - - protected GeometryBuilder() { - this.x = new Section<>(this); - this.y = new Section<>(this); - } - - public Section x() { - return x; - } - - public Section y() { - return y; - } - - public abstract G finish(Vec2i size, Vec2i div); - - protected CoordType finalise(Section section, boolean x, Vec2i input, Vec2i div) { - CoordType finalCoord = CoordType.pixel(0); - for (CoordType coord : section.coords) { - if (coord instanceof CoordType.PixelCoordType pixelCoordType) { - finalCoord = CoordType.pixel(finalCoord.pixel() + pixelCoordType.pixel()); - } else if (coord instanceof CoordType.PercentageCoordType percentageCoordType) { - double size = x ? input.x() : input.y(); - finalCoord = CoordType.pixel((int) (finalCoord.pixel() + (percentageCoordType.pixel() / 100 * size))); - } else if (coord instanceof CoordType.SizePercentage sizePercentage) { - double size = x ? div.x() : div.y(); - finalCoord = CoordType.pixel((int) (finalCoord.pixel() + (sizePercentage.pixel() / 100 * size))); - } - } - return finalCoord; - } - - public static final class Section { - private GeometryBuilder parent; - private final List coords = new ArrayList<>(); - - private Section(GeometryBuilder parent) { - this.parent = parent; - } - - protected void parent(GeometryBuilder parent) { - this.parent = parent; - } - - public Section pixel(int pixel) { - coords.add(CoordType.pixel(pixel)); - return this; - } - - public Section percentage(double percentage) { - coords.add(CoordType.percentage(percentage)); - return this; - } - - public Section sizePercentage(double percentage) { - coords.add(CoordType.sizePercentage(percentage)); - return this; - } - - public GeometryBuilder back() { - return parent; - } - } - - protected static Section parse(String position) { - Token.Type token = Token.Type.of("\\s\\+\\s|\\s\\*\\s|\\s\\/\\s|\\s\\-\\s"); - position = position.replaceAll("center", "50% - 50&").replaceAll("left", "0px").replaceAll("right", "100%").replaceAll("top", "0px").replaceAll("bottom", "100%"); - TokenizedResult result = TokenMatcher.matcher(position).section(MatcherSection.section().token(MatcherToken.optional(token))).validate(); - Operator operator = Operator.find(position); - String[] split = new String[]{position}; - if (!result.empty()) { - operator = Operator.get(result.ordered().next().token().captured()); - split = position.split(operator.operator()); - } - Section section = new Section<>(null); - for (String string : split) { - if (string.contains("%")) { - section.percentage(Double.parseDouble(string.replace("%", ""))); - } else if (string.contains("&")) { - double x = operator.calc(0, Double.parseDouble(string.replace("&", ""))); - section.sizePercentage(x); - } else { - double x = operator.calc(0, Double.parseDouble(string.replace("px", ""))); - section.pixel((int) x); - } - } - return section; - } - } - - interface CoordType { - - T pixel(); - - static CoordType pixel(int pixel) { - return new PixelCoordType(pixel); - } - - static CoordType percentage(double percentage) { - return new PercentageCoordType(percentage); - } - - static CoordType sizePercentage(double percentage) { - return new SizePercentage(percentage); - } - - record PixelCoordType(Integer pixel) implements CoordType { - - } - - record PercentageCoordType(Double pixel) implements CoordType { - - } - - record SizePercentage(Double pixel) implements CoordType { - - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/Size.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/Size.java deleted file mode 100644 index 6844979..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/Size.java +++ /dev/null @@ -1,113 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.config.element.Section; -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; - -public non-sealed interface Size extends RuntimeDefinableGeometry, Geometry { - - static SizeBuilder size() { - return new SizeBuilder(); - } - - static Size pixel(int x, int y) { - return new Impl(RuntimeDefinableGeometry.CoordType.pixel(x), RuntimeDefinableGeometry.CoordType.pixel(y)); - } - - static Size pixel(Vec2i size) { - return new Impl(RuntimeDefinableGeometry.CoordType.pixel(size.x()), RuntimeDefinableGeometry.CoordType.pixel(size.y())); - } - - static SizeBuilder config(Section section) { - String x = ((Node)section.find("width")).value(); - String y = ((Node)section.find("height")).value(); - GeometryBuilder.Section xSection = RuntimeDefinableGeometry.GeometryBuilder.parse(x); - GeometryBuilder.Section ySection = RuntimeDefinableGeometry.GeometryBuilder.parse(y); - SizeBuilder builder = new SizeBuilder(xSection, ySection); - xSection.parent(builder); - ySection.parent(builder); - return builder; - } - - Vec2i vec2i(); - - final class SizeBuilder extends RuntimeDefinableGeometry.GeometryBuilder { - - protected SizeBuilder(Section x, Section y) { - super(x, y); - } - - private SizeBuilder() { - super(); - } - - @Override - public Size finish(Vec2i size, Vec2i div) { - return new Impl(finalise(x(), true, size, div), finalise(y(), false, size, size)); - - } - - @Override - public int priority() { - return 0; - } - - @Override - public Class type() { - return Size.class; - } - - @Override - public Size finish(Pair vec2dVec2dPair) { - return finish(vec2dVec2dPair.k(), vec2dVec2dPair.v()); - } - - } - - final class Impl implements Size { - private final CoordType x; - private final CoordType y; - private SizeBuilder builder; - - public Impl(CoordType x, CoordType y) { - this.x = x; - this.y = y; - } - - @Override - public Geometry build(Pair var) { - return builder.finish(var); - } - - @Override - public GeometryBuilder builder() { - return builder; - } - - @Override - public void builder(GeometryBuilder builder) { - if (builder instanceof SizeBuilder) { - this.builder = (SizeBuilder) builder; - } else { - throw new IllegalArgumentException("Builder must be of type SizeBuilder"); - } - } - - public CoordType x() { - return x; - } - - public CoordType y() { - return y; - } - - @Override - public Vec2i vec2i() { - return Vec2i.of((int) x.pixel(), (int) y.pixel()); - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/Editable.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/Editable.java deleted file mode 100644 index fb6e416..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/Editable.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor; - -public interface Editable { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableField.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableField.java deleted file mode 100644 index f0fa7bf..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableField.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface EditableField { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableType.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableType.java deleted file mode 100644 index 13c2d2d..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/EditableType.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor; - -public interface EditableType { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/EditorFieldTypeWidget.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/EditorFieldTypeWidget.java deleted file mode 100644 index fb54bd1..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/EditorFieldTypeWidget.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.field; - -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.menu.editor.EditableType; - -public abstract class EditorFieldTypeWidget implements Interactable { - private final WidgetContext widgetContext; - - protected EditorFieldTypeWidget(WidgetContext widgetContext) { - this.widgetContext = widgetContext; - } - - public abstract T value(); - - public abstract Canvas render(); - - public WidgetContext widgetContext() { - return widgetContext; - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetAnnotationProcessor.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetAnnotationProcessor.java deleted file mode 100644 index dbde927..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetAnnotationProcessor.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.field; - -public class WidgetAnnotationProcessor { - - - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetContext.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetContext.java deleted file mode 100644 index d81ec71..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/WidgetContext.java +++ /dev/null @@ -1,6 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.field; - -import me.combimagnetron.sunscreen.menu.Size; - -public record WidgetContext(Size size) { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/widget/PositionEditorFieldTypeWidget.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/widget/PositionEditorFieldTypeWidget.java deleted file mode 100644 index eab017a..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/field/widget/PositionEditorFieldTypeWidget.java +++ /dev/null @@ -1,69 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.field.widget; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.editor.field.EditorFieldTypeWidget; -import me.combimagnetron.sunscreen.menu.editor.field.WidgetContext; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.util.HoverHelper; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; - -public class PositionEditorFieldTypeWidget extends EditorFieldTypeWidget { - private Position.PositionBuilder builder; - - protected PositionEditorFieldTypeWidget(WidgetContext widgetContext) { - super(widgetContext); - } - - @Override - public Position.PositionBuilder value() { - return builder; - } - - @Override - public Canvas render() { - Size size = widgetContext().size(); - Canvas canvas = Canvas.image(size); - canvas = canvas.fill(Vec2i.of(0, 0), size.vec2i(), EditorMenu.Colors.Secondary); - canvas = canvas.fill(Vec2i.of(0, 0), Vec2i.of(size.x().pixel(), 10), EditorMenu.Colors.Tertiary); - canvas = canvas.fill(Vec2i.of(1, 11), Vec2i.of(size.x().pixel() - 2, 10), EditorMenu.Colors.Tertiary); - return canvas; - } - - @Override - public boolean reactiveToHover() { - return true; - } - - @Override - public boolean reactiveToClick() { - return true; - } - - @Override - public boolean hover(Vec2i pos) { - if (pos == null) { - return false; - } - if (!HoverHelper.isHovered(pos, Vec2i.zero(), widgetContext().size())) { - return false; - } - - return true; - } - - @Override - public boolean click(Vec2i pos) { - return false; - } - - @Override - public @NotNull Map actions() { - return Map.of(); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/EditorMenu.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/EditorMenu.java deleted file mode 100644 index a39d69d..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/EditorMenu.java +++ /dev/null @@ -1,348 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu; - -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.sunscreen.config.MenuConfigTransformer; -import me.combimagnetron.sunscreen.element.impl.*; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.Color; -import me.combimagnetron.sunscreen.menu.*; -import me.combimagnetron.sunscreen.menu.editor.menu.element.CheckerBoardEditorElement; -import me.combimagnetron.sunscreen.menu.editor.menu.element.SectionElement; -import me.combimagnetron.sunscreen.menu.editor.menu.element.sidebar.ElementTabElement; -import me.combimagnetron.sunscreen.menu.editor.menu.element.sidebar.LayerTabElement; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.menu.timing.Tick; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Scheduler; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.awt.image.BufferedImage; -import java.util.*; - -@SuppressWarnings("unchecked") -public class EditorMenu extends OpenedMenu.FloatImpl { - public final static double PreviewScale = 0.7806122449; - private final LinkedHashMap> editorElements = new LinkedHashMap<>(); - private final SunscreenUser viewer; - private final Vec2i previewSize; - private SidebarTab lastTab; - private SidebarTab currentTab; - - public EditorMenu(SunscreenUser viewer) { - super(viewer, MenuTemplate.simple(MenuTemplate.Type.FLOAT, null)); - this.viewer = viewer; - this.previewSize = Vec2i.of((int) (viewer.screenSize().pixel().x() * (PreviewScale)), (int) (viewer.screenSize().pixel().y() * (PreviewScale))); - divHashMap.putAll((build())); - forceDivGeometry(viewer); - open(viewer); - hide(Identifier.of("editor", "preview")); - hide(Identifier.of("editor", "creation_popup")); - } - - @Override - public boolean tick(@NotNull Tick tick) { - super.tick(tick); - return tickSidebar(); - } - - private Map> build() { - CheckerBoardEditorElement editorElement = CheckerBoardEditorElement.of(Size.pixel(viewer.screenSize().pixel()), Identifier.of("editor", "background"), Position.pixel(0, 0), Vec2i.of(8, 8)); - Div editor = Div.div(Identifier.of("editor", "preview")) - .scale(Vector3d.vec3(PreviewScale)) - .size(Size.pixel(viewer.screenSize().pixel().x(), viewer.screenSize().pixel().y())) - .position(Position.position() - .x() - .percentage(100 - (PreviewScale * 100)) - .pixel((int) (-8/PreviewScale)) - .back() - .y() - .pixel((int) (2/PreviewScale)) - .back() - ) - .add( - editorElement - ); - //editorElements.put(Identifier.of("editor", "image"), ImageElement.imageElement(Canvas.image(Canvas.ImageProvider.file(Path.of("assets/sunscreen/editor/island.png"))), Identifier.of("editor", "image"), Position.position().x().percentage(50).back().x().percentage(50).back())); - editorElements.put(Identifier.of("editor","shape"), ShapeElement.rectangle(Size.pixel(100, 100), Identifier.of("editor", "shape"), Position.pixel(100, 100), Color.of(255, 0, 0))); - editorElements.values().forEach(editorElement::element); - Map> divs = new LinkedHashMap<>(); - divs.put(editor.identifier(), editor); - Div sidebar = constructSidebar(); - divs.put(sidebar.identifier(), sidebar); - Div editbar = constructEditbar(); - divs.put(editbar.identifier(), editbar); - Div creationPopup = creationPopup(); - divs.put(creationPopup.identifier(), creationPopup); - return divs; - } - - private Div constructEditbar() { - Size editbarSize = Size.pixel(viewer.screenSize().pixel().x() - 4, viewer.screenSize().pixel().y() - previewSize.y()); - return Div.div(Identifier.of("editor", "editbar")) - .size(editbarSize) - .position( - Position.position() - .x() - .pixel(2) - .back() - .y() - .pixel(250) - .back() - ) - .add( - SectionElement.sectionElement(Identifier.of("editbar", "background"), Position.pixel(0, 0), editbarSize) - ); - } - - private boolean tickSidebar() { - Div sidebar = (Div) divHashMap.get(Identifier.of("editor", "sidebar")); - if (sidebar == null) { - return false; - } - if (lastTab == currentTab) { - return false; - } - switch (currentTab) { - case ELEMENT: - sidebar.hide(Identifier.of("sidebar", "layer_tab")); - sidebar.hide(Identifier.of("sidebar", "files_tab")); - divHashMap.entrySet().stream().filter(entry -> entry.getKey().namespace().string().equals("preview") || entry.getKey().namespace().string().equals("element_tab") || entry.getKey().namespace().string().equals("files_tab")).forEach(entry -> { - Div previewDiv = divHashMap.get(entry.getKey()); - if (previewDiv != null) { - hide(previewDiv); - } - }); - ElementTabElement elementTab = ElementTabElement.of(Size.pixel(sidebar.size().x(), sidebar.size().y() - 15), Identifier.of("sidebar", "element_tab"), Position.pixel(0, 30)); - SelectorElement selectorElement = SelectorElement.selectorElement(Size.pixel(sidebar.size().x(), 15), Identifier.of("element_tab", "selector_bar"), Position.pixel(2, 16)).horizontal() - .button( - ButtonElement.buttonElement(Size.pixel(33, 11), Identifier.of("element_tab", "local"), Position.pixel(2, 2)) - .standard(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Colors.Background).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Secondary).text(Text.text("Local", Text.Font.vanilla()), Vec2i.of(2, 9))) - .hover(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Secondary).text(Text.text("Local", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Quaternary).text(Text.text("Local", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(event -> System.out.println("Local")) - .build() - ) - .button( - ButtonElement.buttonElement(Size.pixel(39, 11), Identifier.of("element_tab", "asset_lib"), Position.pixel(2, 2)) - .standard(Canvas.image(Vec2i.of(39, 11)).fill(Vec2i.of(0, 0), Vec2i.of(39, 11), Colors.Background).fill(Vec2i.of(1, 1), Vec2i.of(37, 9), Colors.Secondary).text(Text.text("Asset Lib", Text.Font.vanilla()), Vec2i.of(2, 9))) - .hover(Canvas.image(Vec2i.of(39, 11)).fill(Vec2i.of(0, 0), Vec2i.of(39, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(37, 9), Colors.Secondary).text(Text.text("Asset Lib", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(Canvas.image(Vec2i.of(39, 11)).fill(Vec2i.of(0, 0), Vec2i.of(39, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(37, 9), Colors.Quaternary).text(Text.text("Asset Lib", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(event -> System.out.println("Asset Lib")) - .build() - ) - .build(); - sidebar.add( - elementTab - ).add( - selectorElement - ); - break; - case FILES: - sidebar.hide(Identifier.of("sidebar", "layer_tab")); - sidebar.hide(Identifier.of("sidebar", "element_tab")); - divHashMap.entrySet().stream().filter(entry -> entry.getKey().namespace().string().equals("preview") || entry.getKey().namespace().string().equals("element_tab") || entry.getKey().namespace().string().equals("layer_tab")).forEach(entry -> { - Div previewDiv = divHashMap.get(entry.getKey()); - if (previewDiv != null) { - hide(previewDiv); - } - }); - break; - case LAYER: - Div editor = divHashMap.get(Identifier.of("editor", "preview")); - sidebar.hide(Identifier.of("sidebar", "element_tab")); - sidebar.hide(Identifier.of("sidebar", "files_tab")); - CheckerBoardEditorElement editorElement = (CheckerBoardEditorElement) editor.elements().stream().filter(element -> element instanceof CheckerBoardEditorElement).findFirst().get(); - LayerTabElement layerTab = LayerTabElement.of(Size.pixel(sidebar.size().x(), sidebar.size().y() - 15), Identifier.of("sidebar", "layer_tab"), Position.pixel(0, 15), editorElements); - divHashMap.entrySet().stream().filter(entry -> entry.getKey().namespace().string().equals("element_tab") || entry.getKey().namespace().string().equals("files_tab")).forEach(entry -> { - Div previewDiv = (Div) divHashMap.get(entry.getKey()); - if (previewDiv != null) { - hide(previewDiv); - } - }); - layerTab.consumer(e -> { - currentTab = SidebarTab.ELEMENT; - SelectorElement element = (SelectorElement) sidebar.elements().stream().filter(el -> el.identifier().equals(Identifier.of("sidebar", "selector_bar"))).findFirst().get(); - element.select(Identifier.of("selector_bar", "element")); - Identifier elementId = Identifier.of("editor", "creation_popup"); - show(elementId); - focus(elementId); - }); - Collection> selected = editorElement.selected(); - int add = 0; - for (Element preview : editorElements.values()) { - Identifier previewId = Identifier.of("preview", preview.identifier().key().string()); - if (divHashMap.get(previewId) != null) { - Div previewDiv = (Div) divHashMap.get(previewId); - show(previewDiv); - continue; - } - double scale = (double) 18 / Math.max(preview.size().x().pixel(), preview.size().y().pixel()); - Div previewDiv = Div.div(previewId) - .size(preview.size()) - .position(Position.position().x().pixel(5).back().y().pixel((14 + add)).back()) - .add(preview) - .scale(Vector3d.vec3(scale)) - .order(1); - divHashMap.put(previewId, previewDiv); - BufferedImage canvas = ((Canvas.StaticImpl)previewDiv.render(viewer)).image(); - forceDivGeometry(viewer); - render(previewDiv); - add += 25; - } - for (Element element : editorElements.values()) { - if (selected.contains(element)) { - layerTab.selected(element.identifier()); - continue; - } - layerTab.unselected(element.identifier()); - } - sidebar.add( - layerTab - ); - break; - default: - break; - } - update(sidebar); - lastTab = currentTab; - return true; - } - - private Div creationPopup() { - Div div = Div.div(Identifier.of("editor", "creation_popup")) - .size(Size.pixel(200, 200)) - .position( - Position.position() - .x() - .percentage(50) - .pixel(-100) - .back() - .y() - .percentage(50) - .pixel(-100) - .back() - ) - .add( - SectionElement.sectionElement(Identifier.of("creation_popup", "background"), Position.pixel(0, 0), Size.pixel(200, 200)) - ).add( - ShapeElement.rectangle(Size.pixel(196, 11), Identifier.of("creation_popup", "text_input_background"), Position.pixel(3, 14), Colors.Secondary) - ).add( - TextInputElement.of(Size.pixel(100, 9), Identifier.of("creation_popup", "text_input"), Position.pixel(96, 15), inputHandler()) - ).add( - TextElement.textElement(Identifier.of("creation_popup", "text"), Position.pixel(3, 3), Text.text("Create a new element", Text.Font.vanilla())).style(Style.color(), Colors.PrimaryText) - ).add( - TextElement.textElement(Identifier.of("creation_popup", "name_field_text"), Position.pixel(5, 16), Text.text("Name", Text.Font.vanilla())).style(Style.color(), Colors.SecondaryText) - ).add( - ShapeElement.rectangle(Size.pixel(196, 11), Identifier.of("creation_popup", "element_type_background"), Position.pixel(3, 27), Colors.Secondary) - ).add( - TextElement.textElement(Identifier.of("creation_popup", "type_dropdown_text"), Position.pixel(5, 29), Text.text("Type", Text.Font.vanilla())).style(Style.color(), Colors.SecondaryText) - ) - .order(1); - DropdownElement.Builder builder = DropdownElement.dropdownElement(Size.pixel(100, 100), Identifier.of("creation_popup", "element_type_dropdown"), Position.pixel(96, 28)); - for (Map.Entry entry : MenuConfigTransformer.ElementTransformer.Transformers.entrySet()) { - String string = entry.getKey(); - string = string.replace("_", " "); - StringBuilder stringBuilder = new StringBuilder(); - for (String s : string.split(" ")) { - stringBuilder.append(s.substring(0, 1).toUpperCase()); - stringBuilder.append(s.substring(1)); - stringBuilder.append(" "); - } - ButtonElement element = ButtonElement.buttonElement(Size.pixel(100, 9), Identifier.of("creation_popup", "layer"), Position.pixel(2, 2)) - .standard(Canvas.image(Vec2i.of(100, 9)).fill(Vec2i.of(0, 0), Vec2i.of(100, 9), Colors.Background).text(Text.text(stringBuilder.toString(), Text.Font.vanilla()), Vec2i.of(2, 8))) - .hover(Canvas.image(Vec2i.of(100, 9)).fill(Vec2i.of(0, 0), Vec2i.of(100, 9), Colors.Tertiary).text(Text.text(stringBuilder.toString(), Text.Font.vanilla()), Vec2i.of(2, 8))) - .click(Canvas.image(Vec2i.of(100, 9)).fill(Vec2i.of(0, 0), Vec2i.of(100, 9), Colors.Tertiary).text(Text.text(stringBuilder.toString(), Text.Font.vanilla()), Vec2i.of(2, 8))).build(); - builder.button(element); - } - div.add(builder.build()); - ButtonElement button = ButtonElement.buttonElement(Size.pixel(96, 9), Identifier.of("creation_popup", "close"), Position.pixel(2, 187)) - .standard(Canvas.image(Vec2i.of(96, 9)).fill(Vec2i.of(0, 0), Vec2i.of(96, 9), Colors.Background).text(Text.text("Close", Text.Font.vanilla()), Vec2i.of(2, 8))) - .hover(Canvas.image(Vec2i.of(96, 9)).fill(Vec2i.of(0, 0), Vec2i.of(96, 9), Colors.Tertiary).text(Text.text("Close", Text.Font.vanilla()), Vec2i.of(2, 8))) - .click(Canvas.image(Vec2i.of(96, 9)).fill(Vec2i.of(0, 0), Vec2i.of(96, 9), Colors.Tertiary).text(Text.text("Close", Text.Font.vanilla()), Vec2i.of(2, 8))) - .click(e -> { - if (e.coords() == null) { - return; - } - unfocus(); - Scheduler.delay(() -> hide(Identifier.of("editor", "creation_popup")), 1); - }) - .build(); - div.add(button); - return div; - } - - private Div constructSidebar() { - int sidebarWidth = (int) (viewer.screenSize().pixel().x() * (1 - PreviewScale) - 6); - Vec2i sizeBarSize = Vec2i.of(sidebarWidth, previewSize.y()); - return Div.div(Identifier.of("editor", "sidebar")) - .size(Size.pixel(sizeBarSize)) - .position( - Position.position() - .x() - .pixel(2) - .back() - .y() - .pixel(2) - .back() - ) - .add( - SectionElement.sectionElement(Identifier.of("sidebar", "background"), Position.pixel(0, 0), Size.pixel(sidebarWidth, 15)) - ) - .add( - SectionElement.sectionElement(Identifier.of("sidebar", "background_w"), Position.pixel(0, 14), Size.pixel(sidebarWidth, previewSize.y() - 15)) - ) - .add( - SelectorElement.selectorElement(Size.pixel(sidebarWidth, 15), Identifier.of("sidebar", "selector_bar"), Position.pixel(2, 2)).horizontal() - .button( - ButtonElement.buttonElement(Size.pixel(33, 11), Identifier.of("selector_bar", "layer"), Position.pixel(2, 2)) - .standard(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Colors.Background).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Secondary).text(Text.text("Layer", Text.Font.vanilla()), Vec2i.of(2, 9))) - .hover(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Secondary).text(Text.text("Layer", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Quaternary).text(Text.text("Layer", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(event -> this.currentTab = SidebarTab.LAYER) - .build() - ) - .button( - ButtonElement.buttonElement(Size.pixel(39, 11), Identifier.of("selector_bar", "element"), Position.pixel(2, 2)) - .standard(Canvas.image(Vec2i.of(39, 11)).fill(Vec2i.of(0, 0), Vec2i.of(39, 11), Colors.Background).fill(Vec2i.of(1, 1), Vec2i.of(37, 9), Colors.Secondary).text(Text.text("Element", Text.Font.vanilla()), Vec2i.of(2, 9))) - .hover(Canvas.image(Vec2i.of(39, 11)).fill(Vec2i.of(0, 0), Vec2i.of(39, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(37, 9), Colors.Secondary).text(Text.text("Element", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(Canvas.image(Vec2i.of(39, 11)).fill(Vec2i.of(0, 0), Vec2i.of(39, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(37, 9), Colors.Quaternary).text(Text.text("Element", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(event -> this.currentTab = SidebarTab.ELEMENT) - .build() - ) - .button( - ButtonElement.buttonElement(Size.pixel(19, 11), Identifier.of("selector_bar", "file"), Position.pixel(2, 2)) - .standard(Canvas.image(Vec2i.of(19, 11)).fill(Vec2i.of(0, 0), Vec2i.of(19, 11), Colors.Background).fill(Vec2i.of(1, 1), Vec2i.of(17, 9), Colors.Secondary).text(Text.text("File", Text.Font.vanilla()), Vec2i.of(2, 9))) - .hover(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Secondary).text(Text.text("File", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(Canvas.image(Vec2i.of(33, 11)).fill(Vec2i.of(0, 0), Vec2i.of(33, 11), Color.white()).fill(Vec2i.of(1, 1), Vec2i.of(31, 9), Colors.Quaternary).text(Text.text("File", Text.Font.vanilla()), Vec2i.of(2, 9))) - .click(event -> this.currentTab = SidebarTab.FILES) - .build() - ).build() - ); - } - - enum SidebarTab { - ELEMENT, - FILES, - LAYER - } - - public static class Colors { - public static final Color Background = Color.of(9, 10, 20); - public static final Color Secondary = Color.of(16, 20, 31); - public static final Color Tertiary = Color.of(21, 29, 40); - public static final Color Quaternary = Color.of(32, 46, 55); - public static final Color Fifth = Color.of(51, 65, 75); - public static final Color Sixth = Color.of(76, 91, 101); - - public static final Color PrimaryText = Color.of(199, 220, 208); - public static final Color SecondaryText = Color.of(155, 171, 178); - - } - - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/CheckerBoardEditorElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/CheckerBoardEditorElement.java deleted file mode 100644 index 7f09112..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/CheckerBoardEditorElement.java +++ /dev/null @@ -1,155 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.Color; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.element.impl.ButtonElement; -import me.combimagnetron.sunscreen.element.impl.ImageElement; -import me.combimagnetron.sunscreen.element.impl.ShapeElement; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.util.*; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; - -public class CheckerBoardEditorElement extends SimpleBufferedElement implements Interactable { - private final LinkedHashMap, Boolean>> elements = new LinkedHashMap<>(); - private final Vec2i tileSize; - - public static CheckerBoardEditorElement of(Size size, Identifier identifier, Position position, Vec2i tileSize) { - return new CheckerBoardEditorElement(size, identifier, position, tileSize); - } - - public void element(Element element) { - elements.put(element.identifier(), Pair.of(element, false)); - } - - CheckerBoardEditorElement(Size size, Identifier identifier, Position position, Vec2i tileSize) { - super(size, identifier, position); - this.tileSize = tileSize; - } - - @Override - public @NotNull Canvas canvas() { - return render(); - } - - private Canvas render() { - Canvas result = Canvas.image(size()); - result.fill(Vec2i.of(0, 0), size().vec2i(), Color.lightGray()); - for (int x = 0; x < size().x().pixel(); x++) { - for (int y = 0; y < size().y().pixel(); y++) { - if ((x + y) % 2 == 0) { - result.fill(Vec2i.of(x, y).mul(tileSize), tileSize, Color.white()); - } - } - } - for (Pair, Boolean> element : elements.values()) { - Canvas elementCanvas = element.k().canvas(); - result.place(elementCanvas, ViewportHelper.fromPosition(element.k().position())); - } - return result; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } - - @Override - public boolean reactiveToHover() { - return true; - } - - @Override - public boolean reactiveToClick() { - return true; - } - - public Collection> selected() { - return elements.values().stream().filter(Pair::v).map(Pair::k).filter(e -> !e.identifier().namespace().string().equals("toolbar_internal263") && e.identifier().key().string().equals("hover_262")).toList(); - } - - @Override - public boolean hover(Vec2i pos) { - /*for (Element element : elements.values()) { - if (element.identifier().key().string().equals("hover_262") && !HoverHelper.isHovered(pos, ViewportHelper.fromPosition(element.position()).mul(EditorMenu.PreviewScale), element.size())) { - System.out.println(element.identifier() + " true"); - elements.remove(element.identifier()); - elements.remove(Identifier.of("toolbar_internal263", "hover_263")); - return true; - } - }*/ - return false; - } - - private Canvas generateToolBar() { - Div div = Div.div(Identifier.of("editor", "toolbar")) - .size(Size.pixel(195, 17)) - .add( - ShapeElement.rectangle(Size.pixel(194, 15), Identifier.of("toolbar", "background"), Position.pixel(1, 1), EditorMenu.Colors.Background) - ) - .add( - ButtonElement.buttonElement(Size.pixel(55, 17), Identifier.of("toolbar", "ai_assistant"), Position.pixel(0, 0)) - .standard(Canvas.image(Vec2i.of(55, 17)).fill(Vec2i.of(0, 0), Vec2i.of(55, 17), Color.of(255, 255, 255)).text(Text.text("Assist", Text.Font.vanilla()), Vec2i.of(19, 5))) - .hover(Canvas.image(Vec2i.of(55, 17)).fill(Vec2i.of(0, 0), Vec2i.of(55, 17), Color.of(255, 255, 255))) - .click(Canvas.image(Vec2i.of(55, 17)).fill(Vec2i.of(0, 0), Vec2i.of(55, 17), Color.of(255, 255, 255))) - .build() - ); - - return div.render(null); - } - - @Override - public boolean click(Vec2i pos) { - boolean update = false; - for (Pair, Boolean> element : elements.values()) { - if (element == null) { - continue; - } - if (element.k().identifier().key().string().equals("hover_262")) { - elements.remove(element.k().identifier()); - elements.remove(Identifier.of("toolbar_internal263", "hover_263")); - update = true; - } - if (!HoverHelper.isHovered(pos, ViewportHelper.fromPosition(element.k().position()).mul((int) EditorMenu.PreviewScale), element.k().size().vec2i().mul((int) EditorMenu.PreviewScale))) { - continue; - } - Canvas canvas1 = Canvas.image(element.k().size().vec2i().add(4, 4)); - canvas1.fill(Vec2i.of(1, 1), Vec2i.of(element.k().size().x().pixel(), 1), Color.of(77, 155, 230)); - canvas1.fill(Vec2i.of(element.k().size().x().pixel() + 1, 1), Vec2i.of(1, element.k().size().y().pixel()), Color.of(77, 155, 230)); - canvas1.fill(Vec2i.of(1, element.k().size().y().pixel() + 1), Vec2i.of(element.k().size().x().pixel(), 1), Color.of(77, 155, 230)); - canvas1.fill(Vec2i.of(1, 1), Vec2i.of(1, element.k().size().y().pixel()), Color.of(77, 155, 230)); - canvas1.fill(Vec2i.of(0, 0), Vec2i.of(2, 2), Color.of(72, 74, 119)); - canvas1.fill(Vec2i.of(element.k().size().x().pixel() + 1, 0), Vec2i.of(2, 2), Color.of(72, 74, 119)); - canvas1.fill(Vec2i.of(0, element.k().size().y().pixel() + 1), Vec2i.of(2, 2), Color.of(72, 74, 119)); - canvas1.fill(Vec2i.of(element.k().size().x().pixel() + 1, element.k().size().y().pixel() + 1), Vec2i.of(2, 2), Color.of(72, 74, 119)); - ImageElement imageElement = ImageElement.imageElement(canvas1, Identifier.of(element.k().identifier().key().string(), "hover_262"), Position.pixel(element.k().position().x().pixel() - 2, element.k().position().y().pixel() - 2)); - ImageElement toolBar = ImageElement.imageElement(generateToolBar(), Identifier.of("toolbar_internal263", "hover_263"), Position.pixel(element.k().position().x().pixel(), element.k().position().y().pixel() - 25)); - elements.put(Identifier.of(element.k().identifier().key().string(), "hover_262"), Pair.of(imageElement, true)); - elements.put(Identifier.of("toolbar_internal263", "hover_263"), Pair.of(toolBar, false)); - return true; - } - return update; - } - - @Override - public @NotNull Map actions() { - return Map.of(); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/ElementDrawerElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/ElementDrawerElement.java deleted file mode 100644 index 96123cb..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/ElementDrawerElement.java +++ /dev/null @@ -1,70 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; - -public class ElementDrawerElement extends SimpleBufferedElement implements Interactable { - - public ElementDrawerElement(Size size, Identifier identifier, Position position) { - super(size, identifier, position); - } - - public static ElementDrawerElement elementDrawerElement(Size size, Identifier identifier, Position position) { - return new ElementDrawerElement(size, identifier, position); - } - - private void build() { - - } - - @Override - public @NotNull Canvas canvas() { - return null; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } - - @Override - public boolean reactiveToHover() { - return false; - } - - @Override - public boolean reactiveToClick() { - return false; - } - - @Override - public boolean hover(Vec2i pos) { - return false; - } - - @Override - public boolean click(Vec2i pos) { - return false; - } - - @Override - public @NotNull Map actions() { - return Map.of(); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/SectionElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/SectionElement.java deleted file mode 100644 index aac6d58..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/SectionElement.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -public class SectionElement extends SimpleBufferedElement { - public SectionElement(Size size, Identifier identifier, Position position) { - super(size, identifier, position); - } - - public static SectionElement sectionElement(Identifier identifier, Position position, Size size) { - return new SectionElement(size, identifier, position); - } - - public static SectionElement sectionElement(Identifier identifier, RuntimeDefinableGeometry.GeometryBuilder position, Size size) { - SectionElement sectionElement = new SectionElement(size, identifier, null); - sectionElement.geometry(position); - return sectionElement; - } - - @Override - public @NotNull Canvas canvas() { - canvas = canvas.fill(Vec2i.of(0,0), size().vec2i(), EditorMenu.Colors.Background); - canvas = canvas.fill(Vec2i.of(1,1), Vec2i.of(size().x().pixel() - 2, size().y().pixel() - 2), EditorMenu.Colors.Secondary); - canvas = canvas.fill(Vec2i.of(2,2), Vec2i.of(size().x().pixel() - 4, size().y().pixel() - 4), EditorMenu.Colors.Background); - return canvas; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/TreeElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/TreeElement.java deleted file mode 100644 index 87db9a7..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/TreeElement.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2d; -import org.jetbrains.annotations.NotNull; - -public class TreeElement extends SimpleBufferedElement { - public TreeElement(Size size, Identifier identifier, Position position) { - super(size, identifier, position); - } - - @Override - public @NotNull Canvas canvas() { - return null; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/ElementTabElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/ElementTabElement.java deleted file mode 100644 index 71b5902..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/ElementTabElement.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element.sidebar; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.menu.editor.menu.element.SectionElement; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -public class ElementTabElement extends SimpleBufferedElement { - private Position position = Position.pixel(0, 0); - - public ElementTabElement(Size size, Identifier identifier, Position position) { - super(size, identifier, position); - } - - public static ElementTabElement of(Size size, Identifier identifier, Position position) { - return new ElementTabElement(size, identifier, position); - } - - @Override - public @NotNull Canvas canvas() { - return render(); - } - - private Canvas render() { - Canvas result = Canvas.image(size()); - result.place(SectionElement.sectionElement(Identifier.of("_"), Position.pixel(0, 0), size()).canvas(), Vec2i.of(0, 0)); - result.fill(Vec2i.of(2, 2), Vec2i.of(size().x().pixel() - 4, 21), EditorMenu.Colors.Secondary); - return result; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/LayerTabElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/LayerTabElement.java deleted file mode 100644 index 00baaf4..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/sidebar/LayerTabElement.java +++ /dev/null @@ -1,123 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element.sidebar; - -import me.combimagnetron.sunscreen.event.ClickElementEvent; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.Color; -import me.combimagnetron.sunscreen.logic.action.ActionWrapper; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.menu.editor.menu.element.SectionElement; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.input.Input; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.util.HoverHelper; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.LinkedList; -import java.util.Map; -import java.util.function.Consumer; - -public class LayerTabElement extends SimpleBufferedElement implements Interactable { - private final Map> elements; - private final Collection selected = new LinkedList<>(); - private Consumer> elementEventConsumer = (e) -> {}; - - public static LayerTabElement of(Size size, Identifier identifier, Position position, Map> elements) { - return new LayerTabElement(size, identifier, position, elements); - } - - public LayerTabElement(Size size, Identifier identifier, Position position, Map> elements) { - super(size, identifier, position); - this.elements = elements; - } - - @Override - public @NotNull Canvas canvas() { - return render(); - } - - public void selected(Identifier identifier) { - selected.add(identifier); - } - - public void consumer(Consumer> consumer) { - this.elementEventConsumer = consumer; - } - - public void unselected(Identifier identifier) { - selected.remove(identifier); - } - - private Canvas render() { - Canvas result = Canvas.image(size()); - result.place(SectionElement.sectionElement(Identifier.of("_"), Position.pixel(0, 0), size()).canvas(), Vec2i.of(0, 0)); - int y = 1; - for (Element element : elements.values()) { - Canvas elementCanvas = Canvas.image(Vec2i.of(size().vec2i().x() - 2, 23)); - if (selected.contains(element.identifier())) { - elementCanvas.fill(Vec2i.of(1, 1), Vec2i.of(size().vec2i().x(), 23), Color.white()); - } else { - elementCanvas.fill(Vec2i.of(1, 1), Vec2i.of(size().x().pixel() - 2, 23), EditorMenu.Colors.Background); - } - elementCanvas.fill(Vec2i.of(2, 2), Vec2i.of(size().x().pixel() - 2, 21), EditorMenu.Colors.Secondary); - elementCanvas.fill(Vec2i.of(3, 3), Vec2i.of(19, 19), EditorMenu.Colors.Tertiary); - elementCanvas.text(Text.text(element.identifier().key().string(), Text.Font.vanilla()), Vec2i.of(24, 10), EditorMenu.Colors.PrimaryText); - elementCanvas.text(Text.text("1 element", Text.Font.five()), Vec2i.of(23, 17), EditorMenu.Colors.SecondaryText); - elementCanvas.text(Text.text(element.size().x().pixel() + "x" + element.size().y().pixel() + "px", Text.Font.five()), Vec2i.of(23, 23), EditorMenu.Colors.SecondaryText); - result.place(elementCanvas, Vec2i.of(1, y)); - y += 22; - } - result.fill(Vec2i.of(3, size().y().pixel() - 13), Vec2i.of(size().x().pixel() - 6, 10), EditorMenu.Colors.Secondary); - result.text(Text.text("Add Layer", Text.Font.vanilla()), Vec2i.of(4, size().y().pixel() - 5), EditorMenu.Colors.PrimaryText); - return result; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return null; - } - - @Override - public Element style(Style style, T t) { - return null; - } - - @Override - public boolean reactiveToHover() { - return true; - } - - @Override - public boolean reactiveToClick() { - return true; - } - - @Override - public boolean hover(Vec2i pos) { - return false; - } - - @Override - public boolean click(Vec2i pos) { - if (pos == null) { - return false; - } - if (HoverHelper.isHovered(pos, Vec2i.of(3, size().y().pixel() - 13), Vec2i.of(size().x().pixel() - 6, 10))) { - elementEventConsumer.accept(new ClickElementEvent<>(this, null, pos, new Input.Type.MouseClick(false))); - return true; - } - return false; - } - - @Override - public @NotNull Map actions() { - return Map.of(); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarDiv.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarDiv.java deleted file mode 100644 index 6eb9302..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarDiv.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element.toolbar; - -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.util.Identifier; - -public class ToolbarDiv extends Div.Impl { - - public ToolbarDiv() { - super(Identifier.of("editor", "toolbar")); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarWidgetElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarWidgetElement.java deleted file mode 100644 index 8271b56..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/editor/menu/element/toolbar/ToolbarWidgetElement.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.combimagnetron.sunscreen.menu.editor.menu.element.toolbar; - -import me.combimagnetron.sunscreen.element.Interactable; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.util.Identifier; - -public abstract class ToolbarWidgetElement extends SimpleBufferedElement implements Interactable { - - public ToolbarWidgetElement(Size size, Identifier identifier, Position position) { - super(size, identifier, position); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/emulator/ChestMenuEmulator.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/emulator/ChestMenuEmulator.java deleted file mode 100644 index 3f61015..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/emulator/ChestMenuEmulator.java +++ /dev/null @@ -1,70 +0,0 @@ -package me.combimagnetron.sunscreen.menu.emulator; - -import com.github.retrooper.packetevents.protocol.component.ComponentType; -import com.github.retrooper.packetevents.protocol.component.StaticComponentType; -import com.github.retrooper.packetevents.protocol.item.ItemStack; -import me.combimagnetron.passport.internal.item.Item; -import me.combimagnetron.passport.internal.menu.ChestMenu; -import me.combimagnetron.passport.util.Pos2D; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.ComponentIteratorFlag; -import net.kyori.adventure.text.ComponentIteratorType; - -import java.util.Iterator; - -public interface ChestMenuEmulator { - - ChestMenu chestMenu(); - - void click(int slot); - - Settings settings(); - - void close(); - - default void test() { - Item item = chestMenu().contents().get(Pos2D.of(3, 3)); - Item found = chestMenu().contents().all().stream().filter(i -> i.lore().stream().anyMatch(s -> s.contains(Component.text("Hello")))).findFirst().get(); - Iterator iterator = item.name().iterator(ComponentIteratorType.DEPTH_FIRST, ComponentIteratorFlag.INCLUDE_TRANSLATABLE_COMPONENT_ARGUMENTS); - while (iterator.hasNext()) { - Component next = iterator.next(); - } - } - - record Settings(int size, Component title, boolean hide) { - public static Settings settings(int size, Component title, boolean hide) { - return new Settings(size, title, hide); - } - - public static Builder settings() { - return new Builder(); - } - - public static class Builder { - private int size; - private Component title; - private boolean hide; - - public Builder size(int size) { - this.size = size; - return this; - } - - public Builder title(Component title) { - this.title = title; - return this; - } - - public Builder hide(boolean hide) { - this.hide = hide; - return this; - } - - public Settings build() { - return new Settings(size, title, hide); - } - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Click.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Click.java deleted file mode 100644 index f99b5bc..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Click.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.combimagnetron.sunscreen.menu.input; - -import org.jetbrains.annotations.Nullable; - -public record Click(Type.MouseClick value, Type type) implements Input { - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Input.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Input.java deleted file mode 100644 index 2dccfe3..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Input.java +++ /dev/null @@ -1,70 +0,0 @@ -package me.combimagnetron.sunscreen.menu.input; - -import org.jetbrains.annotations.Nullable; - -public interface Input { - - @Nullable T value(); - - Type type(); - - record Impl(T value, Type type) implements Input { - - } - - static Input of(T value, Type type) { - return new Impl<>(value, type); - } - - interface Type { - class MouseClick implements Type { - public final boolean right; - public MouseClick(boolean right) { - this.right = right; - } - } - - class KeyPress implements Type { - public final int key; - public KeyPress(int key) { - this.key = key; - } - } - - class CursorMove implements Type { - public final int x; - public final int y; - public CursorMove(int x, int y) { - this.x = x; - this.y = y; - } - } - - class Scroll implements Type { - public final double scroll; - public final Direction direction; - public Scroll(double scroll, Direction direction) { - this.scroll = scroll; - this.direction = direction; - } - public enum Direction { - UP, DOWN - } - } - - class Sneak implements Type { - public final boolean sneak; - public Sneak(boolean sneak) { - this.sneak = sneak; - } - } - - class Jump implements Type { - public final boolean jump; - public Jump(boolean jump) { - this.jump = jump; - } - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputBackgroundShader.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputBackgroundShader.java deleted file mode 100644 index 3dad068..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputBackgroundShader.java +++ /dev/null @@ -1,93 +0,0 @@ -package me.combimagnetron.sunscreen.menu.input; - -import me.combimagnetron.sunscreen.resourcepack.CodeBlock; -import me.combimagnetron.sunscreen.resourcepack.ResourcePackPath; -import me.combimagnetron.sunscreen.resourcepack.feature.shader.Shader; -import me.combimagnetron.sunscreen.resourcepack.feature.shader.ShaderOverride; -import me.combimagnetron.sunscreen.resourcepack.meta.PackVersion; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Range; - -import java.util.Collection; -import java.util.List; - -public class InputBackgroundShader implements Shader { - @Override - public Collection shaderOverrides() { - return List.of(); - } - - @Override - public PackVersion version() { - return PackVersion.version(Range.of(48, 59)); - } - - @Override - public String name() { - return "gui"; - } - - @Override - public String description() { - return "Removes background from the input anvil."; - } - - @Override - public String author() { - return "Combimagnetron"; - } - - @Override - public Section fragment() { - return Section.mojang( - CodeBlock.shader() - .line("void main() {") - .line(" vec4 color = vertexColor;") - .line(" if (color.a == 0.0) {") - .line(" discard;") - .line(" }") - .line(" fragColor = color * ColorModulator;") - .line("}"), - CodeBlock.shader() - .line("in vec4 vertexColor;") - .line("in float vertexDistance;") - .line("in vec3 xyzPos;"), - CodeBlock.shader() - .line("uniform float GameTime;") - .line("uniform float GameTime;") - .line("uniform vec4 ColorModulator;") - .line("uniform vec2 u_resolution;") - .line("uniform vec2 ScreenSize;") - .line("out vec4 fragColor;"), - CodeBlock.shader() - ); - } - - @Override - public Section vertex() { - return null; - } - - @Override - public Section customFragment() { - return Section.custom( - CodeBlock.shader().line("void main() {}"), - CodeBlock.shader(), - "input_background_fragment", ShaderOverride.OverrideType.BEFORE, "fragColor = color * ColorModulator;"); - } - - @Override - public Section customVertex() { - return null; - } - - @Override - public Identifier identifier() { - return null; - } - - @Override - public ResourcePackPath path() { - return null; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputHandler.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputHandler.java deleted file mode 100644 index be04eec..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/InputHandler.java +++ /dev/null @@ -1,67 +0,0 @@ -package me.combimagnetron.sunscreen.menu.input; - -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.user.SunscreenUser; - -public interface InputHandler { - - boolean active(); - - int encoded(); - - TextInput textInput(); - - TextInput open(); - - void quit(); - - class Impl implements InputHandler { - private final SunscreenUser user; - private final OpenedMenu menu; - private boolean active = false; - private int encoded = 0; - private TextInput textInput = null; - - public Impl(SunscreenUser user, OpenedMenu menu) { - this.user = user; - this.menu = menu; - } - - public void active(boolean active) { - this.active = active; - } - - @Override - public boolean active() { - return active; - } - - @Override - public int encoded() { - if (textInput == null) { - return 0; - } - return textInput.encoded(); - } - - @Override - public void quit() { - this.textInput.quit(); - this.textInput = null; - this.active = false; - } - - @Override - public TextInput open() { - this.textInput = new TextInput.Impl(user, menu); - this.active = true; - return textInput; - } - - @Override - public TextInput textInput() { - return this.textInput; - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/KeyPress.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/input/KeyPress.java deleted file mode 100644 index e68c5cf..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/KeyPress.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.combimagnetron.sunscreen.menu.input; - -public record KeyPress(Type.KeyPress value, Type type) implements Input { - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Scroll.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Scroll.java deleted file mode 100644 index 577a380..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/Scroll.java +++ /dev/null @@ -1,5 +0,0 @@ -package me.combimagnetron.sunscreen.menu.input; - -public record Scroll(Type.Scroll value, Type type) implements Input { - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/TextInput.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/input/TextInput.java deleted file mode 100644 index 551c23e..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/input/TextInput.java +++ /dev/null @@ -1,110 +0,0 @@ -package me.combimagnetron.sunscreen.menu.input; - -import com.github.retrooper.packetevents.protocol.component.ComponentTypes; -import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemCustomModelData; -import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemModel; -import com.github.retrooper.packetevents.protocol.item.ItemStack; -import com.github.retrooper.packetevents.protocol.item.type.ItemTypes; -import com.github.retrooper.packetevents.resources.ResourceLocation; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerWindowItems; -import me.combimagnetron.passport.internal.menu.AnvilMenu; -import me.combimagnetron.passport.internal.menu.Title; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.ShaderHelper; -import net.kyori.adventure.text.Component; - -import java.util.ArrayList; -import java.util.List; - -public interface TextInput { - - void open(); - - TextInput defaultValue(Component component); - - TextInput position(Position position); - - String input(); - - void handle(String input); - - int encoded(); - - boolean changed(); - - void quit(); - - class Impl implements TextInput { - private final SunscreenUser viewer; - private final OpenedMenu openedMenu; - public final AnvilMenu menu; - private Position position = Position.pixel(0, 0); - private String lastInput = ""; - private String input = ""; - - protected Impl(SunscreenUser viewer, OpenedMenu menu) { - this.viewer = viewer; - this.menu = AnvilMenu.of(viewer); - this.openedMenu = menu; - open(); - } - - @Override - public void open() { - menu.title(Title.fixed(Component.empty())); - ArrayList items = new ArrayList<>(); - for (int i = 0; i < 39; i++) { - if (i == 0) { - items.add(ItemStack.builder().type(ItemTypes.PAPER).component(ComponentTypes.ITEM_MODEL, new ItemModel(ResourceLocation.minecraft("air"))).component(ComponentTypes.ITEM_NAME, Component.empty()).amount(1).build()); - continue; - } - items.add(ItemStack.EMPTY); - } - viewer.connection().send(new WrapperPlayServerWindowItems(menu.windowId(), 0, items, ItemStack.EMPTY)); - } - - @Override - public TextInput defaultValue(Component component) { - return null; - } - - @Override - public TextInput position(Position position) { - this.position = position; - return this; - } - - @Override - public String input() { - return input; - } - - @Override - public void handle(String input) { - this.lastInput = this.input; - this.input = input; - if (!(openedMenu instanceof OpenedMenu.FloatImpl floatImpl)) { - return; - } - floatImpl.handleText(input); - } - - @Override - public int encoded() { - return -ShaderHelper.encode(position, viewer); - } - - @Override - public boolean changed() { - return !input.equals(lastInput); - } - - @Override - public void quit() { - menu.close(); - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ChestMenuEmulator.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ChestMenuEmulator.java deleted file mode 100644 index 37d3c67..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ChestMenuEmulator.java +++ /dev/null @@ -1,107 +0,0 @@ -package me.combimagnetron.sunscreen.menu.simulate; - -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerOpenWindow; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerWindowItems; -import me.combimagnetron.passport.internal.item.Item; -import me.combimagnetron.passport.internal.menu.ChestMenu; -import me.combimagnetron.passport.util.Pos2D; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.ComponentIteratorFlag; -import net.kyori.adventure.text.ComponentIteratorType; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; - -import java.util.Iterator; - -public interface ChestMenuEmulator { - - ChestMenu chestMenu(); - - void click(int slot); - - Settings settings(); - - void close(); - - default void test() { - Item item = chestMenu().contents().get(Pos2D.of(3, 2)); - Item found = chestMenu().contents().all().stream().filter(i -> i.lore().stream().anyMatch(s -> s.contains(Component.text("Hello")))).findFirst().get(); - Iterator iterator = item.name().iterator(ComponentIteratorType.DEPTH_FIRST, ComponentIteratorFlag.INCLUDE_TRANSLATABLE_COMPONENT_ARGUMENTS); - while (iterator.hasNext()) { - Component next = iterator.next(); - System.out.println(PlainTextComponentSerializer.plainText().serialize(next)); - } - } - - static ChestMenuEmulator of(ChestMenu chestMenu, Settings settings) { - return new Impl(chestMenu, settings); - } - - class Impl implements ChestMenuEmulator { - private final ChestMenu chestMenu; - private final Settings settings; - - public Impl(ChestMenu chestMenu, Settings settings) { - this.chestMenu = chestMenu; - this.settings = settings; - } - - @Override - public ChestMenu chestMenu() { - return chestMenu; - } - - @Override - public Settings settings() { - return settings; - } - - @Override - public void click(int slot) { - int x = slot % 9; - int y = slot / 9; - chestMenu.click(Pos2D.of(x, y)); - } - - @Override - public void close() { - chestMenu.close(); - } - } - - record Settings(int size, Component title, boolean hide) { - public static Settings settings(int size, Component title, boolean hide) { - return new Settings(size, title, hide); - } - - public static Builder settings() { - return new Builder(); - } - - public static class Builder { - private int size; - private Component title; - private boolean hide; - - public Builder size(int size) { - this.size = size; - return this; - } - - public Builder title(Component title) { - this.title = title; - return this; - } - - public Builder hide(boolean hide) { - this.hide = hide; - return this; - } - - public Settings build() { - return new Settings(size, title, hide); - } - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ForwardClickAction.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ForwardClickAction.java deleted file mode 100644 index 44184f4..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/ForwardClickAction.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.combimagnetron.sunscreen.menu.simulate; - -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.util.Collection; -import java.util.List; - -public class ForwardClickAction extends Action.AbstractAction { - public static final Identifier ActionIdentifier = Identifier.of("sunscreen", "forward_click"); - - public ForwardClickAction() { - super(ActionIdentifier); - } - - static { - ACTION_MAP.put(ActionIdentifier, new ForwardClickAction()); - } - - @Override - public void execute(SunscreenUser user, Argument... arguments) { - if (!validate(arguments)) { - throw new IllegalArgumentException("Invalid arguments provided to action " + ActionIdentifier); - } - if (user == null || user.session().menu() == null) { - throw new IllegalArgumentException("User and its menu cannot be null"); - } - int slot = ((int) arguments[0].value()); - OpenedMenu menu = user.session().menu(); - if (!(menu instanceof OpenedMenu.Base base)) { - return; - } - if (!base.simulator().active()) { - return; - } - base.simulator().chestMenuEmulator().click(slot); - } - - @Override - public boolean validate(Argument... arguments) { - return arguments.length == 1 && arguments[0].type() == int.class; - } - - @Override - public Collection argumentType() { - return List.of(ArgumentType.of("slot", int.class)); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/Simulator.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/Simulator.java deleted file mode 100644 index 8413e3c..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/simulate/Simulator.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.combimagnetron.sunscreen.menu.simulate; - -import java.util.Collection; - -public interface Simulator { - - Collection command(); - - boolean active(); - - ChestMenuEmulator chestMenuEmulator(); - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/DebugElement.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/DebugElement.java deleted file mode 100644 index 9769b33..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/DebugElement.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.combimagnetron.sunscreen.menu.timing; - -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Vec2i; -import org.jetbrains.annotations.NotNull; - -public class DebugElement extends SimpleBufferedElement implements Tickable { - private final SunscreenUser user; - private Position position = Position.pixel(0, 0); - - public DebugElement(Size size, Identifier identifier, Position position, SunscreenUser user) { - super(size, identifier, position); - this.user = user; - } - - @Override - public @NotNull Canvas canvas() { - OpenedMenu openedMenu = user.session().menu(); - if (openedMenu == null) { - return Canvas.image(size()); - } - if (!(openedMenu instanceof OpenedMenu.FloatImpl floatImpl)) { - return Canvas.image(size()); - } - MenuTicker.ExecutingTickable executingTickable = SunscreenLibrary.library().menuTicker().get(floatImpl); - if (executingTickable == null) { - return Canvas.image(size()); - } - Canvas canvas = Canvas.image(size()); - canvas.fill(Vec2i.of(0, 0), size().vec2i(), EditorMenu.Colors.Background); - canvas.fill(Vec2i.of(1, 1), size().vec2i().sub(1, 1), EditorMenu.Colors.Secondary); - canvas.text(Text.text("Time: " + executingTickable.time() + "ms", Text.Font.vanilla()), Vec2i.of(3, 2), EditorMenu.Colors.PrimaryText); - canvas.text(Text.text("Time since last tick: " + executingTickable.timeSinceLastTick() + "ms", Text.Font.vanilla()), Vec2i.of(3, 10), EditorMenu.Colors.PrimaryText); - return canvas; - } - - @Override - public Element style(Style style, Position pos2D, T t) { - return this; - } - - @Override - public Element style(Style style, T t) { - return this; - } - - @Override - public boolean tick(Tick tick) throws TickFailException { - canvas(); - return true; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/MenuTicker.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/MenuTicker.java deleted file mode 100644 index 63307c1..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/MenuTicker.java +++ /dev/null @@ -1,83 +0,0 @@ -package me.combimagnetron.sunscreen.menu.timing; - -import java.util.Map; -import java.util.Objects; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -public class MenuTicker { - private final static ScheduledExecutorService Executor = Executors.newScheduledThreadPool(3, f -> {Thread thread = new Thread(f, "Sunscreen/MenuTicker"); thread.setDaemon(true); return thread;}); - private final Map tickables = new java.util.HashMap<>(); - - public ExecutingTickable start(Tickable tickable) { - ExecutingTickable executingTickable = new ExecutingTickable(tickable); - Future future = Executor.scheduleAtFixedRate(executingTickable::tick, 0L, 50L, TimeUnit.MILLISECONDS); - executingTickable.future(future); - tickables.put(tickable.hashCode(), executingTickable); - return executingTickable; - } - - public void stop(Tickable tickable) { - ExecutingTickable executingTickable = tickables.remove(tickable.hashCode()); - if (executingTickable != null) { - executingTickable.cancel(); - } - } - - public ExecutingTickable get(Tickable tickable) { - return tickables.get(tickable.hashCode()); - } - - public static class ExecutingTickable { - private Future future; - private final Tickable tickable; - private final UUID uuid = UUID.randomUUID(); - private long lastTickTime; - private long timeSinceLastTick; - private long time; - - protected ExecutingTickable(Tickable tickable) { - this.tickable = tickable; - this.lastTickTime = System.currentTimeMillis(); - this.timeSinceLastTick = 0; - this.time = 0; - } - - public UUID uuid() { - return uuid; - } - - void future(Future future) { - this.future = future; - } - - public void cancel() { - future.cancel(true); - } - - private void tick() { - long currentTime = System.currentTimeMillis(); - time += currentTime - lastTickTime; - timeSinceLastTick = currentTime - lastTickTime; - lastTickTime = currentTime; - try { - tickable.tick(Tick.traceable(time, timeSinceLastTick)); - } catch (TickFailException e) { - throw new RuntimeException(e); - } - } - - public long time() { - return time; - } - - public long timeSinceLastTick() { - return timeSinceLastTick; - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tick.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tick.java deleted file mode 100644 index d9676d7..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tick.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.combimagnetron.sunscreen.menu.timing; - -public interface Tick { - - long time(); - - long timeSinceLastTick(); - - int id(); - - static Tick traceable(long time, long timeSinceLastTick) { - return new TraceableTick(time, timeSinceLastTick); - } - - record TraceableTick(long time, long timeSinceLastTick) implements Tick { - - @Override - public int id() { - return hashCode(); - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/TickFailException.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/TickFailException.java deleted file mode 100644 index 3cb7b6d..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/TickFailException.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.combimagnetron.sunscreen.menu.timing; - -public class TickFailException extends RuntimeException { - public TickFailException(Tick tick, String message) { - super(String.format("Tick %s failed: %s", tick.id(), message)); - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tickable.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tickable.java deleted file mode 100644 index eb99776..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/timing/Tickable.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.combimagnetron.sunscreen.menu.timing; - -public interface Tickable { - - boolean tick(Tick tick) throws TickFailException; - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/registry/MenuRegistry.java b/api/src/main/java/me/combimagnetron/sunscreen/registry/MenuRegistry.java deleted file mode 100644 index d3b4534..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/registry/MenuRegistry.java +++ /dev/null @@ -1,79 +0,0 @@ -package me.combimagnetron.sunscreen.registry; - -import me.combimagnetron.passport.data.Identifier; -import me.combimagnetron.passport.internal.registry.Registry; -import me.combimagnetron.passport.util.Pair; -import me.combimagnetron.sunscreen.menu.MenuTemplate; - -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; - -public interface MenuRegistry extends Registry { - - default void register(MenuTemplate menuTemplate) { - register(Identifier.split(menuTemplate.identifier().string()), menuTemplate); - } - - static MenuRegistry create() { - return new Impl(); - } - - default MenuTemplate get(me.combimagnetron.sunscreen.util.Identifier identifier) { - return get(Identifier.of(identifier.namespace().string(), identifier.key().string())); - } - - Collection all(); - - void clear(); - - class Impl implements MenuRegistry { - private final Registry registry = Registry.empty(); - - public Impl() { - } - - @Override - public MenuTemplate register(Identifier identifier, MenuTemplate menuTemplate) { - return registry.register(identifier, menuTemplate); - } - - @Override - public MenuTemplate get(Identifier identifier) { - return registry.get(identifier); - } - - @Override - public MenuTemplate unregister(Identifier identifier) { - return registry.unregister(identifier); - } - - @Override - public boolean contains(Identifier identifier) { - return registry.contains(identifier); - } - - @Override - public Pair find(MenuTemplate menuTemplate) { - return registry.find(menuTemplate); - } - - - @Override - public synchronized Collection all() { - return ((Registry.Impl) registry).registry().values(); - } - - @Override - public void clear() { - Map map = ((Registry.Impl) registry).registry(); - Iterator> iterator = map.entrySet().iterator(); - while (iterator.hasNext()) { - Identifier identifier = iterator.next().getKey(); - map.remove(identifier); - } - - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/registry/VariableRegistry.java b/api/src/main/java/me/combimagnetron/sunscreen/registry/VariableRegistry.java deleted file mode 100644 index f073f23..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/registry/VariableRegistry.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.combimagnetron.sunscreen.registry; - -import me.combimagnetron.passport.data.Identifier; -import me.combimagnetron.passport.internal.registry.Registry; -import me.combimagnetron.sunscreen.logic.variable.Variable; -import me.combimagnetron.sunscreen.user.SunscreenUser; - -public interface VariableRegistry extends Registry> { - - default Variable register(Variable variable, SunscreenUser holder) { - return register(Identifier.of(variable.identifier().namespace() + "&" + holder.uniqueIdentifier().toString(), variable.identifier().key().string()), variable); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/style/ColorStyle.java b/api/src/main/java/me/combimagnetron/sunscreen/style/ColorStyle.java deleted file mode 100755 index 3e49fba..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/style/ColorStyle.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.combimagnetron.sunscreen.style; - -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.Color; - -import java.awt.image.BufferedImage; - -public class ColorStyle implements Style { - - @Override - public Canvas edit(Canvas canvas, Position position, Color color) { - Canvas.InternalCanvas internalCanvas = (Canvas.InternalCanvas) canvas; - BufferedImage image = internalCanvas.image(); - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - int pixel = image.getRGB(x, y); - int alpha = (pixel >> 24) & 0xff; - if (alpha != 0) { - int newPixel = (alpha << 24) | (color.red() << 16) | (color.green() << 8) | color.blue(); - image.setRGB(x, y, newPixel); - } - } - } - return Canvas.image(image); - } - - public static ColorStyle colorStyle() { - return new ColorStyle(); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/style/Style.java b/api/src/main/java/me/combimagnetron/sunscreen/style/Style.java deleted file mode 100755 index b82b479..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/style/Style.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.combimagnetron.sunscreen.style; - -import me.combimagnetron.sunscreen.menu.editor.Editable; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.image.Canvas; - -public interface Style extends Editable { - - Canvas edit(Canvas canvas, Position position, T t); - - static ColorStyle color() { - return new ColorStyle(); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/style/Text.java b/api/src/main/java/me/combimagnetron/sunscreen/style/Text.java deleted file mode 100755 index 239af8c..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/style/Text.java +++ /dev/null @@ -1,76 +0,0 @@ -package me.combimagnetron.sunscreen.style; - -import me.combimagnetron.sunscreen.util.FileProvider; -import me.combimagnetron.sunscreen.util.Values; - -import java.awt.*; -import java.awt.font.TextAttribute; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.Map; - -public record Text(String content, Font font) { - private static final Font Vanilla = Font.load("vanilla", FileProvider.resource().find("minecraft_font.ttf"), 8); - private static final Font Five = Font.load("five", FileProvider.resource().find("minecraft_five.ttf"), 5.5f, -0.15f); - public static final Values Fonts = Values.of(Vanilla, Five); - - public static Text text(String content, Font font) { - return new Text(content, font); - } - - public static Text text(String content) { - return new Text(content, Vanilla); - } - - - public record Font(String name, java.awt.Font internal, float size) { - - public static Font vanilla() { - return Vanilla; - } - - public static Font five() { - return Five; - } - - public static Font load(File provider, float size) { - try { - return new Font(provider.getName(), java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, provider).deriveFont(size), size); - } catch (FontFormatException | IOException e) { - throw new RuntimeException(e); - } - } - - public static Font load(File provider, float size, float tracking) { - try { - return new Font(provider.getName(), java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, provider).deriveFont(size).deriveFont(Map.of(TextAttribute.TRACKING, tracking)), size); - } catch (FontFormatException | IOException e) { - throw new RuntimeException(e); - } - } - - public static Font load(String name, File provider, float size) { - try { - return new Font(name, java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, provider).deriveFont(size), size); - } catch (FontFormatException | IOException e) { - throw new RuntimeException(e); - } - } - - public static Font load(String name, File provider, float size, float tracking) { - try { - return new Font(name, java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, provider).deriveFont(size).deriveFont(Map.of(TextAttribute.TRACKING, tracking)), size); - } catch (FontFormatException | IOException e) { - throw new RuntimeException(e); - } - } - - - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/style/sheet/StyleConfig.java b/api/src/main/java/me/combimagnetron/sunscreen/style/sheet/StyleConfig.java deleted file mode 100644 index 23a5c50..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/style/sheet/StyleConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.combimagnetron.sunscreen.style.sheet; - -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.passport.config.Config; -import me.combimagnetron.passport.config.element.Node; -import me.combimagnetron.passport.config.element.Section; - -import java.nio.file.Path; - -public class StyleConfig { - private final String name; - - StyleConfig(String name) { - this.name = name; - } - - public void write() { - Config.config() - .section(Section.required("style") - .section(Section.required("tile") - .node(Node.required("type", String.class)) - .node(Node.required("layout", String[].class)) - .section(Section.required("color") - .node(Node.required("default", String.class)) - .node(Node.required("hover", String.class)) - .node(Node.required("click", String.class)) - )) - ).save(SunscreenLibrary.library().path().resolve(Path.of(name + ".style"))); - - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/style/type/StyleType.java b/api/src/main/java/me/combimagnetron/sunscreen/style/type/StyleType.java deleted file mode 100644 index 81ce36e..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/style/type/StyleType.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.combimagnetron.sunscreen.style.type; - -public interface StyleType { - - T apply(T t); - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/style/type/TileStyleType.java b/api/src/main/java/me/combimagnetron/sunscreen/style/type/TileStyleType.java deleted file mode 100644 index 4e86984..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/style/type/TileStyleType.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.combimagnetron.sunscreen.style.type; - -import me.combimagnetron.sunscreen.image.Canvas; - -import java.awt.image.BufferedImage; -import java.util.Map; - -public class TileStyleType implements StyleType { - private Type type = Type.SOLID; - private String[] layout = {"A"}; - private Color color = Color.of("default", Map.of("A", "#000000")); - private String file; - - @Override - public Canvas apply(Canvas canvas) { - Canvas background = Canvas.image(canvas.size()); - BufferedImage image = ((Canvas.InternalCanvas)background).image(); - if (type == Type.SOLID) { - applySolid(image); - } else if (type == Type.TILED && file != null) { - applyTiledFile(image); - } else if (type == Type.TILED) { - applyTiled(image); - } - return canvas; - } - - private void applySolid(BufferedImage image) { - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - image.setRGB(x, y, color.color().get(layout[0]).hashCode()); - } - } - } - - public void applyTiled(BufferedImage image) { - int width = image.getWidth(); - int height = image.getHeight(); - int tileWidth = width / layout[0].length(); - int tileHeight = height / layout.length; - for (int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - int tileX = x / tileWidth; - int tileY = y / tileHeight; - image.setRGB(x, y, color.color().get(layout[tileY].substring(tileX, tileX + 1)).hashCode()); - } - } - } - - public void applyTiledFile(BufferedImage image) { - // TODO - } - - public enum Type { - SOLID, - TILED - } - - public record Color(String state, Map color) { - public static Color of(String state, Map color) { - return new Color(state, color); - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/MenuTemplate.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/MenuTemplate.java new file mode 100644 index 0000000..8710eab --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/MenuTemplate.java @@ -0,0 +1,9 @@ +package me.combimagnetron.sunscreen.ui; + +import org.jetbrains.annotations.NotNull; + +public interface MenuTemplate { + + void build(@NotNull ModernLayout root); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernLayout.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernLayout.java new file mode 100644 index 0000000..bcc2743 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernLayout.java @@ -0,0 +1,13 @@ +package me.combimagnetron.sunscreen.ui; + +import me.combimagnetron.sunscreen.ui.element.ElementLike; +import me.combimagnetron.sunscreen.ui.theme.ModernTheme; +import org.jetbrains.annotations.NotNull; + +public interface ModernLayout { + + > @NotNull ModernLayout element(@NotNull E e); + + @NotNull ModernLayout theme(@NotNull ModernTheme theme); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java new file mode 100644 index 0000000..925b757 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui; + +public interface ModernMenu { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java new file mode 100644 index 0000000..b75e776 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java @@ -0,0 +1,17 @@ +package me.combimagnetron.sunscreen.ui.element; + +import me.combimagnetron.sunscreen.util.Identifier; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface ElementGroup> extends ElementLike { + + > @NotNull ElementGroup<@NotNull E> add(@NotNull L elementLike); + + > @NotNull ElementGroup<@NotNull E> add(@NotNull Iterable<@NotNull L> elementLike); + + > @NotNull ElementGroup<@NotNull E> remove(@NotNull L elementLike); + + @NotNull ElementGroup<@NotNull E> remove(@Nullable Identifier identifier); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java new file mode 100644 index 0000000..b1018b5 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java @@ -0,0 +1,29 @@ +package me.combimagnetron.sunscreen.ui.element; + +import me.combimagnetron.sunscreen.ui.property.*; +import me.combimagnetron.sunscreen.util.Identifier; +import org.jetbrains.annotations.NotNull; + +public interface ElementLike> { + + @NotNull Identifier identifier(); + + @NotNull E property(@NotNull Property<@NotNull T, @NotNull C> property); + + default @NotNull E size(@NotNull Size size) { + return property(size); + } + + default @NotNull E position(@NotNull Position position) { + return property(position); + } + + default @NotNull E padding(@NotNull Padding padding) { + return property(padding); + } + + default @NotNull E margin(@NotNull Margin margin) { + return property(margin); + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/Elements.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/Elements.java new file mode 100644 index 0000000..fa86617 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/Elements.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.element; + +public interface Elements { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ModernElement.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ModernElement.java new file mode 100644 index 0000000..7287146 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ModernElement.java @@ -0,0 +1,5 @@ +package me.combimagnetron.sunscreen.ui.element; + +public interface ModernElement> extends ElementLike { + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java new file mode 100644 index 0000000..e63bd6a --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java @@ -0,0 +1,20 @@ +package me.combimagnetron.sunscreen.ui.element.impl; + +import me.combimagnetron.sunscreen.ui.element.ModernElement; +import me.combimagnetron.sunscreen.ui.property.Property; +import me.combimagnetron.sunscreen.util.Identifier; +import org.jetbrains.annotations.NotNull; + +public class ImageElement implements ModernElement { + + @Override + public @NotNull Identifier identifier() { + return null; + } + + @Override + public @NotNull ImageElement property(@NotNull Property property) { + return null; + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/tree/ElementTree.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/tree/ElementTree.java new file mode 100644 index 0000000..641ad20 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/tree/ElementTree.java @@ -0,0 +1,12 @@ +package me.combimagnetron.sunscreen.ui.element.tree; + +import me.combimagnetron.sunscreen.ui.element.ElementLike; +import org.jetbrains.annotations.NotNull; + +public interface ElementTree { + + > ElementTree add(@NotNull E element); + + + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java new file mode 100644 index 0000000..6bc2ad6 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java @@ -0,0 +1,13 @@ +package me.combimagnetron.sunscreen.ui.graphic; + +import me.combimagnetron.sunscreen.ui.graphic.modifier.GraphicModifier; +import me.combimagnetron.sunscreen.ui.style.Style; +import org.jetbrains.annotations.NotNull; + +public interface GraphicLike> { + + @NotNull G modifier(@NotNull M modifier); + + @NotNull G style(@NotNull S style); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/NineSlice.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/NineSlice.java new file mode 100644 index 0000000..57b42c6 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/NineSlice.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.graphic; + +public interface NineSlice { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/color/ColorLike.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/color/ColorLike.java new file mode 100644 index 0000000..692a350 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/color/ColorLike.java @@ -0,0 +1,144 @@ +package me.combimagnetron.sunscreen.ui.graphic.color; + +import net.kyori.adventure.text.format.TextColor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface ColorLike { + + /** + * @return the red value of this color + */ + int red(); + + /** + * @return the green value of this color + */ + int green(); + + /** + * @return the blue value of this color + */ + int blue(); + + /** + * @return the alpha value of this color + */ + int alpha(); + + /** + * @return the rgb representation of this color + */ + default int rgb() { + return (red() << 16) | (green() << 8) | blue(); + } + + default int rgba() { + return (int) (((long)alpha() << 24) | (red() << 16) | (green() << 8) | blue()); + } + /** + * @return the text color representation of this color + */ + @NotNull TextColor textColor(); + + /** + * @param color the text color to convert to a color + * @return TextColor converted to a Color + */ + static @NotNull ColorLike of(@NotNull TextColor color) { + return SimpleArgbColor.of(color); + } + + static @Nullable ColorLike hex(@NotNull String hexColor) { + return switch (hexColor.length()) { + case 6 -> rgbHex(hexColor); + case 8 -> argbHex(hexColor); + default -> null; + }; + } + + static @NotNull ColorLike rgbHex(@NotNull String hexColor) { + return new SimpleArgbColor( + Integer.valueOf(hexColor.substring(0, 2), 16), + Integer.valueOf(hexColor.substring(2, 4), 16), + Integer.valueOf(hexColor.substring(4, 6), 16), + 255); + } + + + static @NotNull ColorLike argbHex(@NotNull String hexColor) { + return new SimpleArgbColor( + Integer.valueOf(hexColor.substring(2, 4), 16), + Integer.valueOf(hexColor.substring(4, 6), 16), + Integer.valueOf(hexColor.substring(6, 8), 16), + Integer.valueOf(hexColor.substring(0, 2), 16)); + } + + /** + * @param red int value between 0 and 255, representing the red value of the color + * @param green int value between 0 and 255, representing the green value of the color + * @param blue int value between 0 and 255, representing the blue value of the color + * @param alpha int value between 0 and 255, representing the alpha value of the color + * @return a new color with the given red, green, blue, and alpha values + */ + static @NotNull ColorLike of(int red, int green, int blue, int alpha) { + return SimpleArgbColor.of(red, green, blue, alpha); + } + + /** + * @param red int value between 0 and 255, representing the red value of the color + * @param green int value between 0 and 255, representing the green value of the color + * @param blue int value between 0 and 255, representing the blue value of the color + * @return a new color with the given red, green, and blue values + */ + static @NotNull ColorLike of(int red, int green, int blue) { + return SimpleArgbColor.of(red, green, blue); + } + + /** + * @param rgb int value representing the red, green, and blue values of the color + * @return a new color with the given red, green, and blue values + */ + static @NotNull ColorLike of(int rgb) { + return SimpleArgbColor.of(rgb); + } + + /** + * @param rgb int value representing the red, green, and blue values of the color + * @param alpha int value between 0 and 255, representing the alpha value of the color + * @return a new color with the given red, green, blue, and alpha values + */ + static @NotNull ColorLike of(int rgb, int alpha) { + return SimpleArgbColor.of(rgb, alpha); + } + + record SimpleArgbColor(int red, int green, int blue, int alpha) implements ColorLike { + + public static @NotNull ColorLike of(int red, int green, int blue, int alpha) { + return new SimpleArgbColor(red, green, blue, alpha); + } + + public static @NotNull ColorLike of(int red, int green, int blue) { + return new SimpleArgbColor(red, green, blue, 255); + } + + public static @NotNull ColorLike of(int rgb) { + return new SimpleArgbColor((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF, 255); + } + + public static @NotNull ColorLike of(int rgb, int alpha) { + return new SimpleArgbColor((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF, alpha); + } + + public static @NotNull ColorLike of(@NotNull TextColor color) { + return new SimpleArgbColor(color.red(), color.green(), color.blue(), 255); + } + + @Override + public @NotNull TextColor textColor() { + return TextColor.color(red, green, blue); + } + } + + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/modifier/GraphicModifier.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/modifier/GraphicModifier.java new file mode 100644 index 0000000..352b1e9 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/modifier/GraphicModifier.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.graphic.modifier; + +public interface GraphicModifier { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Rectangle.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Rectangle.java new file mode 100644 index 0000000..d277429 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Rectangle.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.graphic.shape; + +public class Rectangle { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Shape.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Shape.java new file mode 100644 index 0000000..846fd0d --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/shape/Shape.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.graphic.shape; + +public interface Shape { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java new file mode 100644 index 0000000..7289ed3 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java @@ -0,0 +1,47 @@ +package me.combimagnetron.sunscreen.ui.property; + +import me.combimagnetron.sunscreen.menu.ScreenSize; +import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; +import me.combimagnetron.sunscreen.util.Vec2i; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +public final class Margin extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { + private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; + + private final Map> axisMap = new LinkedHashMap<>(); + + public Margin(@NotNull Vec2i vec2i) { + super(vec2i); + } + + public Margin(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + } + + public static @NotNull Margin relative(RelativeMeasure.Vec2iRelativeMeasureGroup<@NotNull C> measureGroup) { + return new Margin(measureGroup); + } + + public static @NotNull Margin fixed(@NotNull Vec2i vec2i) { + return new Margin(vec2i); + } + + @Override + public @NotNull Class<@NotNull Vec2i> type() { + return Vec2i.class; + } + + @Override + public @NotNull PropertyHandler<@NotNull Vec2i, @NotNull Margin> handler() { + return PROPERTY_HANDLER; + } + + @Override + public void finish(@NotNull ScreenSize screenSize) { + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java new file mode 100644 index 0000000..07a5789 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java @@ -0,0 +1,46 @@ +package me.combimagnetron.sunscreen.ui.property; + +import me.combimagnetron.sunscreen.menu.ScreenSize; +import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; +import me.combimagnetron.sunscreen.util.Vec2i; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +public final class Padding extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { + private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; + private final Map> axisMap = new LinkedHashMap<>(); + + public Padding(@NotNull Vec2i vec2i) { + super(vec2i); + } + + public Padding(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + } + + public static @NotNull Padding relative(RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + return new Padding(measureGroup); + } + + public static @NotNull Padding fixed(Vec2i vec2i) { + return new Padding(vec2i); + } + + @Override + public @NotNull Class type() { + return Vec2i.class; + } + + @Override + public @NotNull PropertyHandler handler() { + return PROPERTY_HANDLER; + } + + @Override + public void finish(@NotNull ScreenSize screenSize) { + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java new file mode 100644 index 0000000..85dd241 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java @@ -0,0 +1,46 @@ +package me.combimagnetron.sunscreen.ui.property; + +import me.combimagnetron.sunscreen.menu.ScreenSize; +import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; +import me.combimagnetron.sunscreen.util.Vec2i; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +public final class Position extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { + private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; + private final Map> axisMap = new LinkedHashMap<>(); + + public Position(@NotNull Vec2i vec2i) { + super(vec2i); + } + + public Position(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + } + + public static @NotNull Position relative(RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + return new Position(measureGroup); + } + + public static @NotNull Position fixed(Vec2i vec2i) { + return new Position(vec2i); + } + + @Override + public @NotNull Class type() { + return Vec2i.class; + } + + @Override + public @NotNull PropertyHandler handler() { + return PROPERTY_HANDLER; + } + + @Override + public void finish(@NotNull ScreenSize screenSize) { + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Property.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Property.java new file mode 100644 index 0000000..2e85373 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Property.java @@ -0,0 +1,12 @@ +package me.combimagnetron.sunscreen.ui.property; + +import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; +import org.jetbrains.annotations.NotNull; + +public interface Property { + + @NotNull Class<@NotNull T> type(); + + @NotNull PropertyHandler<@NotNull T, @NotNull C> handler(); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java new file mode 100644 index 0000000..851d296 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java @@ -0,0 +1,164 @@ +package me.combimagnetron.sunscreen.ui.property; + +import me.combimagnetron.sunscreen.menu.ScreenSize; +import me.combimagnetron.sunscreen.util.RuntimeDefinable; +import me.combimagnetron.sunscreen.util.Vec2i; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.function.Function; + +/** + * + * @param class for the relative measure + * @param type for builder + * @param builder type + * @param variable to input and get the relative shizzle + * @param measure again, to return for builder methods + * @param segment types + */ +public interface RelativeMeasure, V, R extends RelativeMeasure, L> extends RuntimeDefinable { + + default @NotNull R percentage(double percentage) { + return offset(OffsetType.percentage(percentage)); + } + + default @NotNull R pixel(int pixel) { + return offset(OffsetType.pixel(pixel)); + } + + @NotNull R offset(@NotNull OffsetType<@NotNull N> offsetType); + + static @NotNull Vec2iRelativeMeasureGroup<@NotNull C> relative() { + return new DummyVec2iRelativeMeasureGroup<>(); + } + + final class DummyVec2iRelativeMeasureGroup extends Vec2iRelativeMeasureGroup<@NotNull C> { + + @Override + public void finish(@NotNull ScreenSize unused) { + + } + + } + + abstract class Vec2iRelativeMeasureGroup implements RelativeMeasureGroup, Vec2i, Vec2iRelativeMeasureGroup.Vec2iRelativeBuilder, Axis> { + private final Map> axisBuilderMap = Map.of(Axis.X, new Vec2iRelativeBuilder<>(this), Axis.Y, new Vec2iRelativeBuilder<>(this)); + private final Function, C> constructor; + protected Vec2i vec2i; + + public Vec2iRelativeMeasureGroup(@NotNull Vec2i vec2i) { + this.vec2i = vec2i; + constructor = (cVec2iRelativeMeasureGroup -> null); + } + + public Vec2iRelativeMeasureGroup() { + constructor = (cVec2iRelativeMeasureGroup -> null); + } + + public @NotNull Map<@NotNull Axis, @NotNull Vec2iRelativeBuilder> axisBuilderMap() { + return axisBuilderMap; + } + + public @NotNull Vec2iRelativeBuilder x() { + return axisBuilderMap.get(Axis.X); + } + + public @NotNull Vec2iRelativeBuilder y() { + return axisBuilderMap.get(Axis.Y); + } + + public @Nullable Vec2i vec2i() { + return vec2i; + } + + public abstract void finish(@NotNull ScreenSize screenSize); + + @Override + public void add(@Nullable Vec2iRelativeBuilder<@Nullable C> cVec2iRelativeBuilder, @Nullable Axis axis) { + + } + + public static final class Vec2iRelativeBuilder implements Builder, RelativeMeasure, Vec2i, Vec2iRelativeBuilder, Axis> { + private final Vec2iRelativeMeasureGroup parent; + + private Vec2iRelativeBuilder(Vec2iRelativeMeasureGroup parent) { + this.parent = parent; + } + + public Vec2iRelativeMeasureGroup back() { + return parent; + } + + @Override + public @NotNull Vec2iRelativeBuilder<@NotNull C> offset(@NotNull OffsetType<@NotNull N> offsetType) { + return this; + } + + @Override + public @NotNull C build(@NotNull Vec2i var) { + return null; + } + + @Override + public @NotNull Vec2iRelativeBuilder<@NotNull C> builder(@NotNull Axis axis) { + return this; + } + + @Override + public void builder(@NotNull Axis axis, @NotNull Vec2iRelativeBuilder<@NotNull C> builder) { + + } + + @Override + public int priority() { + return 0; + } + + @Override + public @NotNull Class type() { + return null; + } + + @Override + public Integer finish(Integer integer) { + return 0; + } + } + + } + + interface RelativeMeasureGroup, V, M extends RelativeMeasure, L> { + + void add(M m, L l); + + } + + enum Axis { + X, Y + } + + interface OffsetType { + + T pixel(); + + static OffsetType pixel(int pixel) { + return new PixelOffsetType(pixel); + } + + static OffsetType percentage(double percentage) { + return new PercentageOffsetType(percentage); + } + + record PixelOffsetType(Integer pixel) implements OffsetType { + + } + + record PercentageOffsetType(Double pixel) implements OffsetType { + + } + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java new file mode 100644 index 0000000..19486eb --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java @@ -0,0 +1,46 @@ +package me.combimagnetron.sunscreen.ui.property; + +import me.combimagnetron.sunscreen.menu.ScreenSize; +import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; +import me.combimagnetron.sunscreen.util.Vec2i; +import org.jetbrains.annotations.NotNull; + +import java.util.LinkedHashMap; +import java.util.Map; + +public final class Size extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { + private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; + private final Map> axisMap = new LinkedHashMap<>(); + + public Size(@NotNull Vec2i vec2i) { + super(vec2i); + } + + public Size(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + } + + public static @NotNull Size relative(RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + return new Size(measureGroup); + } + + public static @NotNull Size fixed(Vec2i vec2i) { + return new Size(vec2i); + } + + @Override + public @NotNull Class type() { + return Vec2i.class; + } + + @Override + public @NotNull PropertyHandler handler() { + return PROPERTY_HANDLER; + } + + @Override + public void finish(@NotNull ScreenSize screenSize) { + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java new file mode 100644 index 0000000..44ab1dc --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java @@ -0,0 +1,14 @@ +package me.combimagnetron.sunscreen.ui.property.handler; + +import me.combimagnetron.sunscreen.ui.element.ElementLike; +import me.combimagnetron.sunscreen.ui.render.RenderAction; +import me.combimagnetron.sunscreen.ui.render.phase.Phase; +import me.combimagnetron.sunscreen.ui.render.phase.context.PhaseContext; +import org.jetbrains.annotations.NotNull; + +@FunctionalInterface +public interface PropertyHandler { + + RenderAction apply(@NotNull ElementLike> element, @NotNull PhaseContext phaseContext); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java new file mode 100644 index 0000000..48db732 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java @@ -0,0 +1,28 @@ +package me.combimagnetron.sunscreen.ui.render; + +import me.combimagnetron.sunscreen.ui.graphic.GraphicLike; +import me.combimagnetron.sunscreen.ui.graphic.modifier.GraphicModifier; + +import java.util.Collection; +import java.util.List; + +public interface RenderAction> { + + G current(); + + Collection modifiers(); + + final class SimpleRenderAction> implements RenderAction { + + @Override + public G current() { + return null; + } + + @Override + public Collection modifiers() { + return List.of(); + } + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java new file mode 100644 index 0000000..ee5fd4f --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java @@ -0,0 +1,9 @@ +package me.combimagnetron.sunscreen.ui.render.phase; + +public interface Phase { + + class Render implements Phase { + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java new file mode 100644 index 0000000..3008ce3 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java @@ -0,0 +1,11 @@ +package me.combimagnetron.sunscreen.ui.render.phase.context; + +import me.combimagnetron.sunscreen.ui.render.phase.Phase; + +public interface PhaseContext

{ + + final class RenderPhaseContext implements PhaseContext { + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java new file mode 100644 index 0000000..b2bf4d1 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.style; + +public interface Style { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java new file mode 100644 index 0000000..222364e --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java @@ -0,0 +1,9 @@ +package me.combimagnetron.sunscreen.ui.style; + +import org.jetbrains.annotations.NotNull; + +public interface StyleAttribute { + + @NotNull Class<@NotNull T> type(); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java new file mode 100644 index 0000000..dc0ffd7 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.style; + +public interface Styles { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ModernTheme.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ModernTheme.java new file mode 100644 index 0000000..a203ab1 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ModernTheme.java @@ -0,0 +1,12 @@ +package me.combimagnetron.sunscreen.ui.theme; + +import me.combimagnetron.sunscreen.ui.element.ModernElement; +import org.jetbrains.annotations.NotNull; + +public interface ModernTheme { + + > @NotNull ModernTheme map(@NotNull E element, @NotNull ThemeDecorator themeDecorator); + + > @NotNull ThemeDecorator find(@NotNull Class<@NotNull E> clazz); + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ThemeDecorator.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ThemeDecorator.java new file mode 100644 index 0000000..52c67ed --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/ThemeDecorator.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.theme; + +public interface ThemeDecorator { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/Themes.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/Themes.java new file mode 100644 index 0000000..ad6a2cc --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/Themes.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.theme; + +public interface Themes { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorScheme.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorScheme.java new file mode 100644 index 0000000..c9c566f --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorScheme.java @@ -0,0 +1,46 @@ +package me.combimagnetron.sunscreen.ui.theme.color; + +import me.combimagnetron.sunscreen.ui.graphic.color.ColorLike; +import org.jetbrains.annotations.NotNull; + +public interface ColorScheme { + + @NotNull ColorMode mode(); + + @NotNull ColorLike main(); + + @NotNull ColorLike background(); + + @NotNull ColorLike accent(); + + enum ColorMode { + DARK, LIGHT + } + + static @NotNull ColorScheme basicDark(@NotNull ColorLike main, @NotNull ColorLike background, @NotNull ColorLike accent) { + return new BasicDarkColorScheme(main, background, accent); + } + + static @NotNull ColorScheme basicLight(@NotNull ColorLike main, @NotNull ColorLike background, @NotNull ColorLike accent) { + return new BasicLightColorScheme(main, background, accent); + } + + record BasicDarkColorScheme(ColorLike main, ColorLike background, ColorLike accent) implements ColorScheme { + + @Override + public @NotNull ColorMode mode() { + return ColorMode.DARK; + } + + } + + record BasicLightColorScheme(ColorLike main, ColorLike background, ColorLike accent) implements ColorScheme { + + @Override + public @NotNull ColorMode mode() { + return ColorMode.LIGHT; + } + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorSchemes.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorSchemes.java new file mode 100644 index 0000000..366e17d --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/theme/color/ColorSchemes.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.theme.color; + +public interface ColorSchemes { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/RuntimeDefinable.java b/api/src/main/java/me/combimagnetron/sunscreen/util/RuntimeDefinable.java index f9a55e0..be073a2 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/RuntimeDefinable.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/RuntimeDefinable.java @@ -5,19 +5,21 @@ import me.combimagnetron.sunscreen.menu.Size; import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.function.Function; @SuppressWarnings("rawtypes") -public interface RuntimeDefinable { +public interface RuntimeDefinable { Values> Types = Values.of(Position.class, Size.class); T build(V var); - B builder(); + B builder(L l); - void builder(B builder); + void builder(L l, B builder); - interface Type { + interface Builder { int priority(); @@ -29,20 +31,20 @@ interface Type { interface Holder { - Collection> definables(); + Collection> definables(); - void add(RuntimeDefinable.Type definable); + void add(Builder definable); } - class Impl implements RuntimeDefinable { + class Impl implements RuntimeDefinable { private final Class type; - private B builder; + private final Map lbMap = new LinkedHashMap<>(); private final T instance; - public Impl(Class type, B builder, T instance) { + public Impl(Class type, Map lbMap, T instance) { this.type = type; - this.builder = builder; + this.lbMap.putAll(lbMap); this.instance = instance; } @@ -52,20 +54,20 @@ public T build(V var) { } @Override - public B builder() { - return builder; + public B builder(L l) { + return lbMap.get(l); } @Override - public void builder(B builder) { - this.builder = builder; + public void builder(L l, B builder) { + lbMap.put(l, builder); } - public static class Type implements RuntimeDefinable.Type { + public static class SimpleBuilder implements Builder { private final Class type; private final Function function; - public Type(Class type, Function function) { + public SimpleBuilder(Class type, Function function) { this.type = type; this.function = function; } diff --git a/api/src/main/resources/example.shine b/api/src/main/resources/example.shine index b068645..6d131b6 100644 --- a/api/src/main/resources/example.shine +++ b/api/src/main/resources/example.shine @@ -39,7 +39,7 @@ class ShopItem(Item item, Number value) { // Classes use the java records style return registry.get(name) } - func(Player player) give : Item { // Declaring the return type is optional. + func(Player player) give : Item { // Declaring the return builder is optional. player.inventory.item(9, item) } diff --git a/api/src/main/resources/example.style b/api/src/main/resources/example.style index 11f1184..c46ee3e 100644 --- a/api/src/main/resources/example.style +++ b/api/src/main/resources/example.style @@ -1,5 +1,5 @@ background { - type: solid + builder: solid color { default: "#FF1122" hover: "#000000" @@ -7,7 +7,7 @@ background { } } background { - type: nine_slice + builder: nine_slice layout: [A, A, A, A, A, A A, B, B, B, B, A A, B, C, C, B, A @@ -21,7 +21,7 @@ background { } } background { - type: tiled + builder: tiled file: "styles/tiled_1.png" } text_input { diff --git a/api/src/main/resources/test.menu b/api/src/main/resources/test.menu index 7f6f75b..a46a7ca 100644 --- a/api/src/main/resources/test.menu +++ b/api/src/main/resources/test.menu @@ -1,5 +1,5 @@ PlanetMenu { - type = "hover" + builder = "hover" simulate { title = "Auction House" command = "/ah" @@ -45,7 +45,7 @@ PlanetMenu { click_listener { listen = click execute { - type = slot_press + builder = slot_press slot = 27 click_type = right } @@ -53,7 +53,7 @@ PlanetMenu { bla_listener { listen = hover execute { - type = command + builder = command console = true command = "announce hello" } diff --git a/api/src/test/java/TestModernTemplate.java b/api/src/test/java/TestModernTemplate.java new file mode 100644 index 0000000..78147e1 --- /dev/null +++ b/api/src/test/java/TestModernTemplate.java @@ -0,0 +1,10 @@ +import me.combimagnetron.sunscreen.ui.MenuTemplate; +import me.combimagnetron.sunscreen.ui.ModernLayout; +import org.jetbrains.annotations.NotNull; + +public class TestModernTemplate implements MenuTemplate { + @Override + public void build(@NotNull ModernLayout root) { + root. + } +} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..c76500b --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + id("java") +} + +group = "me.combimagnetro" +version = "unspecified" + +repositories { + mavenCentral() +} + +dependencies { + implementation(project(":api")) +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/FeatherClientSunscreenHook.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/FeatherClientSunscreenHook.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/FeatherClientSunscreenHook.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/FeatherClientSunscreenHook.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/protocol/FeatherClientMessage.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/protocol/FeatherClientMessage.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/protocol/FeatherClientMessage.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/featherclient/protocol/FeatherClientMessage.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/labymod/LabyModSunscreenHook.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/labymod/LabyModSunscreenHook.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/labymod/LabyModSunscreenHook.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/labymod/LabyModSunscreenHook.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/LabyModMessage.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/LabyModMessage.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/LabyModMessage.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/LabyModMessage.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/clientbound/ClientboundLabyModAddonDisableMessage.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/clientbound/ClientboundLabyModAddonDisableMessage.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/clientbound/ClientboundLabyModAddonDisableMessage.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/labymod/protocol/clientbound/ClientboundLabyModAddonDisableMessage.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/lunar/LunarClientSunscreenHook.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/lunar/LunarClientSunscreenHook.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/lunar/LunarClientSunscreenHook.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/lunar/LunarClientSunscreenHook.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/LunarClientMessage.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/LunarClientMessage.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/LunarClientMessage.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/LunarClientMessage.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/clientbound/ClientboundLunarClientModActionMessage.java b/common/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/clientbound/ClientboundLunarClientModActionMessage.java similarity index 100% rename from api/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/clientbound/ClientboundLunarClientModActionMessage.java rename to common/src/main/java/me/combimagnetron/sunscreen/hook/lunar/protocol/clientbound/ClientboundLunarClientModActionMessage.java diff --git a/gradlew b/gradlew index faf9300..23d15a9 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9b42019..5eed7ee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/settings.gradle.kts b/settings.gradle.kts index 3ef8f29..ec8863c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,3 +14,4 @@ rootProject.name = "Sunscreen" include("api") include("spigot") include("minestom") +include("common") \ No newline at end of file diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java index bf997e1..9cf1509 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java @@ -4,6 +4,7 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.event.PacketListenerPriority; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; +import io.papermc.paper.datacomponent.DataComponentType; import me.combimagnetron.passport.Passport; import me.combimagnetron.passport.event.EventBus; import me.combimagnetron.sunscreen.action.RunCommandAction; @@ -30,6 +31,7 @@ import org.apache.commons.io.IOUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import org.codehaus.plexus.util.IOUtil; @@ -49,6 +51,7 @@ public void onLoad() { PacketEvents.getAPI().load(); PacketEvents.getAPI().getEventManager().registerListener(new MenuListener(), PacketListenerPriority.LOWEST); PacketEvents.getAPI().getEventManager().registerListener(new AnvilListener(), PacketListenerPriority.LOWEST); + } @Override From 565a498a915ed36da36d739e23f099be98be844d Mon Sep 17 00:00:00 2001 From: Combimagnetron Date: Sun, 24 Aug 2025 20:24:38 +0200 Subject: [PATCH 2/4] wooop --- .../sunscreen/image/Canvas.java | 2 +- .../sunscreen/session/Session.java | 9 +-- .../sunscreen/ui/ModernMenu.java | 3 + .../sunscreen/ui/graphic/GraphicLike.java | 5 +- .../sunscreen/ui/property/Margin.java | 2 +- .../ui/property/handler/PropertyHandler.java | 3 +- .../sunscreen/ui/render/RenderAction.java | 22 +++++-- .../ui/render/engine/RenderEngine.java | 4 ++ .../sunscreen/ui/render/phase/Phase.java | 63 ++++++++++++++++++- .../ui/render/phase/context/PhaseContext.java | 12 +++- .../sunscreen/ui/style/Style.java | 4 -- .../sunscreen/ui/style/StyleAttribute.java | 9 --- .../sunscreen/ui/style/Styles.java | 4 -- .../sunscreen/user/SunscreenUser.java | 13 +++- 14 files changed, 116 insertions(+), 39 deletions(-) create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/RenderEngine.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java b/api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java index 5ed181e..5c3b347 100755 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java @@ -31,7 +31,7 @@ public interface Canvas { Canvas text(Text text, Vec2i coords, Color color); - Canvas text(Text text, Vec2i coords); + Canvas text(Text text, Vec2i coords);,4, Vec2i size(); diff --git a/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java b/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java index 679d874..749e0b0 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java @@ -2,24 +2,25 @@ import me.combimagnetron.sunscreen.SunscreenLibrary; import me.combimagnetron.sunscreen.menu.OpenedMenu; +import me.combimagnetron.sunscreen.ui.ModernMenu; import me.combimagnetron.sunscreen.user.SunscreenUser; public sealed interface Session permits Session.Impl { - OpenedMenu menu(); + ModernMenu menu(); SunscreenUser user(); boolean close(); - static Session session(OpenedMenu openedMenu, SunscreenUser user) { + static Session session(ModernMenu openedMenu, SunscreenUser user) { return new Impl(openedMenu, user); } - record Impl(OpenedMenu openedMenu, SunscreenUser user) implements Session { + record Impl(ModernMenu openedMenu, SunscreenUser user) implements Session { @Override - public OpenedMenu menu() { + public ModernMenu menu() { return openedMenu; } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java index 925b757..95f4fcf 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/ModernMenu.java @@ -1,4 +1,7 @@ package me.combimagnetron.sunscreen.ui; public interface ModernMenu { + + void close(); + } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java index 6bc2ad6..cc96758 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java @@ -1,13 +1,10 @@ package me.combimagnetron.sunscreen.ui.graphic; import me.combimagnetron.sunscreen.ui.graphic.modifier.GraphicModifier; -import me.combimagnetron.sunscreen.ui.style.Style; import org.jetbrains.annotations.NotNull; public interface GraphicLike> { - @NotNull G modifier(@NotNull M modifier); - - @NotNull G style(@NotNull S style); + @NotNull G modifier(@NotNull GraphicModifier modifier); } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java index 7289ed3..1bd8387 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java @@ -9,7 +9,7 @@ import java.util.Map; public final class Margin extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { - private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; + private static final PropertyHandler PROPERTY_HANDLER = (element, context) -> null; private final Map> axisMap = new LinkedHashMap<>(); diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java index 44ab1dc..bf92813 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/handler/PropertyHandler.java @@ -1,6 +1,7 @@ package me.combimagnetron.sunscreen.ui.property.handler; import me.combimagnetron.sunscreen.ui.element.ElementLike; +import me.combimagnetron.sunscreen.ui.graphic.GraphicLike; import me.combimagnetron.sunscreen.ui.render.RenderAction; import me.combimagnetron.sunscreen.ui.render.phase.Phase; import me.combimagnetron.sunscreen.ui.render.phase.context.PhaseContext; @@ -9,6 +10,6 @@ @FunctionalInterface public interface PropertyHandler { - RenderAction apply(@NotNull ElementLike> element, @NotNull PhaseContext phaseContext); + @NotNull RenderAction> apply(@NotNull ElementLike> element, @NotNull PhaseContext phaseContext); } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java index 48db732..c3b4a46 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/RenderAction.java @@ -2,27 +2,41 @@ import me.combimagnetron.sunscreen.ui.graphic.GraphicLike; import me.combimagnetron.sunscreen.ui.graphic.modifier.GraphicModifier; +import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.List; public interface RenderAction> { - G current(); + @NotNull G current(); - Collection modifiers(); + @NotNull Collection modifiers(); + + static > @NotNull RenderAction none(@NotNull L current) { + return new NoneRenderAction<>(current); + } final class SimpleRenderAction> implements RenderAction { @Override - public G current() { + public @NotNull G current() { return null; } @Override - public Collection modifiers() { + public @NotNull Collection modifiers() { return List.of(); } } + record NoneRenderAction>(G current) implements RenderAction { + + @Override + public @NotNull Collection modifiers() { + return List.of(); + } + + } + } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/RenderEngine.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/RenderEngine.java new file mode 100644 index 0000000..5349de5 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/RenderEngine.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.render.engine; + +public interface RenderEngine { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java index ee5fd4f..cc5ecb0 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/Phase.java @@ -1,8 +1,67 @@ package me.combimagnetron.sunscreen.ui.render.phase; -public interface Phase { +import me.combimagnetron.sunscreen.ui.render.phase.context.PhaseContext; +import org.jetbrains.annotations.NotNull; - class Render implements Phase { +public interface Phase

, N extends Phase>> { + + @NotNull Class<@NotNull N> nextType(); + + @NotNull N advance(PhaseContext<@NotNull P, @NotNull N> phaseContext); + + class Build implements Phase { + + @Override + public @NotNull Class nextType() { + return Render.class; + } + + @Override + public @NotNull Render advance(PhaseContext phaseContext) { + return null; + } + + } + + class Render implements Phase { + + @Override + public @NotNull Class nextType() { + return Send.class; + } + + @Override + public @NotNull Send advance(PhaseContext phaseContext) { + return null; + } + + } + + class Send implements Phase { + + @Override + public @NotNull Class nextType() { + return Empty.class; + } + + @Override + public @NotNull Empty advance(PhaseContext phaseContext) { + return null; + } + + } + + class Empty implements Phase { + + @Override + public @NotNull Class nextType() { + return Empty.class; + } + + @Override + public @NotNull Empty advance(PhaseContext phaseContext) { + return null; + } } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java index 3008ce3..405d5d6 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/phase/context/PhaseContext.java @@ -2,9 +2,17 @@ import me.combimagnetron.sunscreen.ui.render.phase.Phase; -public interface PhaseContext

{ +public interface PhaseContext

, N extends Phase>> { - final class RenderPhaseContext implements PhaseContext { + final class BuildPhaseContext implements PhaseContext { + + } + + final class RenderPhaseContext implements PhaseContext { + + } + + final class SendPhaseContext implements PhaseContext { } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java deleted file mode 100644 index b2bf4d1..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Style.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.ui.style; - -public interface Style { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java deleted file mode 100644 index 222364e..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/StyleAttribute.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.combimagnetron.sunscreen.ui.style; - -import org.jetbrains.annotations.NotNull; - -public interface StyleAttribute { - - @NotNull Class<@NotNull T> type(); - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java deleted file mode 100644 index dc0ffd7..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/style/Styles.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.ui.style; - -public interface Styles { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/user/SunscreenUser.java b/api/src/main/java/me/combimagnetron/sunscreen/user/SunscreenUser.java index 4bb1c90..0d23254 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/user/SunscreenUser.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/user/SunscreenUser.java @@ -1,12 +1,15 @@ package me.combimagnetron.sunscreen.user; +import com.github.retrooper.packetevents.wrapper.PacketWrapper; +import com.github.retrooper.packetevents.wrapper.common.client.WrapperCommonClientCustomClickAction; import me.combimagnetron.passport.user.User; -import me.combimagnetron.sunscreen.menu.MenuTemplate; -import me.combimagnetron.sunscreen.menu.OpenedMenu; import me.combimagnetron.sunscreen.menu.ScreenSize; import me.combimagnetron.sunscreen.session.Session; +import me.combimagnetron.sunscreen.ui.ModernLayout; import net.kyori.adventure.audience.Audience; +import java.util.Arrays; + public interface SunscreenUser extends User { ScreenSize screenSize(); @@ -21,6 +24,10 @@ public interface SunscreenUser extends User { Session session(); - Session open(MenuTemplate template); + Session open(ModernLayout template); + + default void send(PacketWrapper... packetWrappers) { + Arrays.stream(packetWrappers).forEach(wrapper -> connection().send(wrapper)); + } } From f5e96670d772b49aaafa591b50dfa57156feefe5 Mon Sep 17 00:00:00 2001 From: Combimagnetron Date: Sat, 30 Aug 2025 22:21:51 +0200 Subject: [PATCH 3/4] remove like everything ever and add map stuff --- api/build.gradle.kts | 8 + .../sunscreen/SunscreenLibrary.java | 12 - .../sunscreen/command/SunscreenCommand.java | 165 -- .../sunscreen/event/ClickElementEvent.java | 12 +- .../sunscreen/event/FinishTextInputEvent.java | 4 +- .../sunscreen/event/HoverElementEvent.java | 6 +- .../hook/ResourcePackProviderHook.java | 3 +- .../sunscreen/hook/SunscreenHook.java | 12 +- .../sunscreen/image/Canvas.java | 311 ---- .../sunscreen/image/CanvasRenderer.java | 235 --- .../combimagnetron/sunscreen/image/Color.java | 193 -- .../combimagnetron/sunscreen/image/Pixel.java | 19 - .../sunscreen/image/PixelPattern.java | 1640 ----------------- .../sunscreen/image/SimpleCanvas.java | 136 -- .../sunscreen/logic/action/Action.java | 7 +- .../logic/action/adapter/TypeAdapter.java | 14 +- .../logic/action/impl/EditElementAction.java | 75 - .../logic/action/impl/HideDivAction.java | 56 - .../logic/action/impl/HideElementAction.java | 53 - .../logic/action/impl/ShowDivAction.java | 49 - .../logic/action/impl/ShowElementAction.java | 54 - .../logic/variable/SimpleVariable.java | 2 +- .../sunscreen/logic/variable/Variable.java | 2 +- .../sunscreen/menu/OpenedMenu.java | 545 ------ .../sunscreen/menu/ScreenSize.java | 6 +- .../menu/cursor/ClientsideCursor.java | 101 - .../sunscreen/menu/cursor/Cursor.java | 25 - .../sunscreen/menu/cursor/EntityCursor.java | 59 - .../sunscreen/menu/draft/Draft.java | 180 -- .../menu/listener/AnvilListener.java | 38 - .../sunscreen/menu/listener/MenuListener.java | 272 --- .../sunscreen/renderer/MapMenuRenderer.java | 4 - .../sunscreen/renderer/MenuRenderer.java | 4 - .../renderer/div/CombinedDivRenderer.java | 27 - .../sunscreen/renderer/div/DivRenderer.java | 22 - .../renderer/div/FontDivRenderer.java | 49 - .../renderer/div/ItemDivRenderer.java | 35 - .../sunscreen/renderer/div/Reference.java | 31 - .../renderer/div/ReferenceHolder.java | 103 -- .../sunscreen/renderer/map/MapProtocol.java | 43 - .../sunscreen/renderer/map/MapShader.java | 113 -- .../sunscreen/resourcepack/Asset.java | 2 +- .../resourcepack/feature/font/Font.java | 3 +- .../feature/font/FontFeature.java | 2 +- .../resourcepack/feature/font/Glyph.java | 3 +- .../sunscreen/resourcepack/meta/PackMeta.java | 47 +- .../resourcepack/meta/PackVersion.java | 2 +- .../sunscreen/resourcepack/sprite/Sprite.java | 121 -- .../resourcepack/sprite/SpriteSheet.java | 74 - .../sunscreen/session/Session.java | 1 - .../sunscreen/session/SessionHandler.java | 3 - .../ui/editor/EditorMenuTemplate.java | 14 + .../ui/editor/widget/EditorWidget.java | 4 + .../sunscreen/ui/element/ElementGroup.java | 2 +- .../sunscreen/ui/element/ElementLike.java | 2 +- .../ui/element/GenericModernElement.java | 29 + .../ui/element/impl/ImageElement.java | 15 +- .../sunscreen/ui/graphic/GraphicLike.java | 4 + .../sunscreen/ui/input/InputHandler.java | 7 + .../sunscreen/ui/property/Margin.java | 28 +- .../sunscreen/ui/property/Padding.java | 28 +- .../sunscreen/ui/property/Position.java | 6 +- .../ui/property/RelativeMeasure.java | 145 +- .../sunscreen/ui/property/Size.java | 6 +- .../ui/render/engine/binary/BinaryMasks.java | 12 + .../render/engine/binary/BitOutputStream.java | 145 ++ .../ui/render/engine/encode/MapEncoder.java | 203 ++ .../exception/FatalEncodeException.java | 9 + .../ui/render/engine/map/SendableMap.java | 4 + .../ui/render/engine/map/SendableMapMenu.java | 11 + .../sunscreen/util/{ => data}/Identifier.java | 2 +- .../sunscreen/util/{ => data}/Pair.java | 2 +- .../util/{ => data}/ProtocolUtil.java | 4 +- .../sunscreen/util/{ => data}/Range.java | 2 +- .../util/{ => data}/RuntimeDefinable.java | 11 +- .../sunscreen/util/{ => data}/Tree.java | 2 +- .../sunscreen/util/{ => data}/Values.java | 3 +- .../sunscreen/util/{ => helper}/FontUtil.java | 5 +- .../util/{ => helper}/HoverHelper.java | 8 +- .../util/{ => helper}/ShaderHelper.java | 9 +- .../util/{ => helper}/ViewportHelper.java | 7 +- .../sunscreen/util/{ => math}/Box.java | 2 +- .../sunscreen/util/{ => math}/Pos2D.java | 2 +- .../sunscreen/util/{ => math}/Vec2d.java | 44 +- .../sunscreen/util/{ => math}/Vec2f.java | 43 +- .../sunscreen/util/{ => math}/Vec2i.java | 43 +- .../sunscreen/util/math/Vec4i.java | 93 + api/src/test/java/MapEncoderTest.java | 44 + api/src/test/java/TestModernTemplate.java | 2 +- .../sunscreen/user/UserImpl.java | 7 +- .../sunscreen/SunscreenPlugin.java | 10 +- .../sunscreen/action/RunCommandAction.java | 2 +- .../sunscreen/user/UserImpl.java | 10 +- 93 files changed, 936 insertions(+), 5078 deletions(-) delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/command/SunscreenCommand.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/image/CanvasRenderer.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/image/Color.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/image/Pixel.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/image/PixelPattern.java delete mode 100755 api/src/main/java/me/combimagnetron/sunscreen/image/SimpleCanvas.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/EditElementAction.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideDivAction.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideElementAction.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowDivAction.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowElementAction.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/ClientsideCursor.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/Cursor.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/EntityCursor.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/draft/Draft.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/listener/AnvilListener.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/menu/listener/MenuListener.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/MapMenuRenderer.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/MenuRenderer.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/div/CombinedDivRenderer.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/div/DivRenderer.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/div/FontDivRenderer.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ItemDivRenderer.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/div/Reference.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ReferenceHolder.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapProtocol.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapShader.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/Sprite.java delete mode 100644 api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/SpriteSheet.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/editor/EditorMenuTemplate.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/editor/widget/EditorWidget.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/element/GenericModernElement.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/input/InputHandler.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BinaryMasks.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/exception/FatalEncodeException.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMap.java create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMapMenu.java rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => data}/Identifier.java (96%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => data}/Pair.java (73%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => data}/ProtocolUtil.java (96%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => data}/Range.java (87%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => data}/RuntimeDefinable.java (77%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => data}/Tree.java (94%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => data}/Values.java (88%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => helper}/FontUtil.java (97%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => helper}/HoverHelper.java (75%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => helper}/ShaderHelper.java (62%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => helper}/ViewportHelper.java (88%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => math}/Box.java (95%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => math}/Pos2D.java (96%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => math}/Vec2d.java (52%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => math}/Vec2f.java (51%) rename api/src/main/java/me/combimagnetron/sunscreen/util/{ => math}/Vec2i.java (51%) create mode 100644 api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec4i.java create mode 100644 api/src/test/java/MapEncoderTest.java diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 76a98cc..fa71ad1 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -21,11 +21,15 @@ java { } dependencies { + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation("org.junit.platform:junit-platform-suite:1.13.4") implementation("net.kyori:adventure-api:4.20.0") implementation("net.kyori:adventure-text-serializer-gson:4.20.0") implementation("net.kyori:adventure-text-serializer-plain:4.20.0") implementation("com.typesafe:config:1.4.2") implementation("co.aikar:acf-core:0.5.1-SNAPSHOT") + implementation("it.unimi.dsi:fastutil:8.5.16") //implementation("net.bytebuddy:byte-buddy:1.17.5") compileOnly("me.combimagnetron:Passport:1.0-SNAPSHOT") compileOnly("com.google.guava:guava:31.1-jre") @@ -35,6 +39,10 @@ dependencies { compileOnly("com.github.retrooper:packetevents-spigot:2.9.1") } +tasks.test { + useJUnitPlatform() +} + publishing { repositories { maven { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrary.java b/api/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrary.java index 8cee0ee..eb5f40a 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrary.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrary.java @@ -2,10 +2,6 @@ import me.combimagnetron.passport.Passport; import me.combimagnetron.passport.user.UserHandler; -import me.combimagnetron.sunscreen.config.Config; -import me.combimagnetron.sunscreen.config.MenuConfigTransformer; -import me.combimagnetron.sunscreen.registry.MenuRegistry; -import me.combimagnetron.sunscreen.menu.timing.MenuTicker; import me.combimagnetron.sunscreen.session.SessionHandler; import me.combimagnetron.sunscreen.user.SunscreenUser; import net.kyori.adventure.audience.Audience; @@ -29,18 +25,10 @@ static SunscreenLibrary library() { SessionHandler sessionHandler(); - MenuTicker menuTicker(); - UserHandler> users(); - Config config(); - Logger logger(); - MenuRegistry menuRegistry(); - - MenuConfigTransformer menuConfigTransformer(); - final class Holder { public static SunscreenLibrary INSTANCE = null; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/command/SunscreenCommand.java b/api/src/main/java/me/combimagnetron/sunscreen/command/SunscreenCommand.java deleted file mode 100644 index 1bc50c7..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/command/SunscreenCommand.java +++ /dev/null @@ -1,165 +0,0 @@ -package me.combimagnetron.sunscreen.command; - -import co.aikar.commands.BaseCommand; -import co.aikar.commands.CommandIssuer; -import co.aikar.commands.annotation.*; -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.config.MenuConfigTransformer; -import me.combimagnetron.sunscreen.menu.*; -import me.combimagnetron.sunscreen.menu.editor.menu.EditorMenu; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.registry.MenuRegistry; -import me.combimagnetron.sunscreen.menu.timing.DebugElement; -import me.combimagnetron.sunscreen.session.Session; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; -import net.kyori.adventure.audience.Audience; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.ComponentBuilder; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.event.ClickEvent; -import net.kyori.adventure.text.event.HoverEvent; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.Style; -import net.kyori.adventure.text.format.TextColor; -import net.kyori.adventure.text.format.TextDecoration; - -import java.nio.file.Path; -import java.util.Collection; - -@CommandAlias("sunscreen|screen|ss") -public class SunscreenCommand extends BaseCommand { - - @Default - @Syntax("help") - public void helpP(CommandIssuer actor) { - sendHelp(actor); - } - - private static SunscreenUser sunscreenUser(CommandIssuer actor) { - SunscreenUser sunscreenUser = SunscreenLibrary.library().users().user(actor.getUniqueId()).orElse(null); - if (sunscreenUser == null) { - actor.sendMessage("Something went wrong, please contact support."); - throw new IllegalArgumentException("User not found"); - } - return sunscreenUser; - } - - private void sendHelp(CommandIssuer actor) { - SunscreenUser sunscreenUser = sunscreenUser(actor); - ComponentBuilder builder = Component.text(); - builder.append(Component.text("Sunscreen Commands").style(Style.style().decorate(TextDecoration.BOLD)).color(TextColor.color(230, 144, 78))); - builder.append(Component.newline()); - builder.append(Component.text("/sunscreen resolution|aspectratio").style(Style.style().decorate(TextDecoration.UNDERLINED).color(TextColor.color(77, 155, 230)) - .clickEvent(ClickEvent.runCommand("/sunscreen resolution " + sunscreenUser.name())) - .hoverEvent(HoverEvent.showText(Component.text("Click to run").color(NamedTextColor.GRAY))))); - builder.append(Component.space()); - builder.append(Component.text("Opens the aspect ratio menu.", TextColor.color(143, 211, 255))); - sunscreenUser.message(builder.build()); - } - - @Subcommand("debug") - public void debug(CommandIssuer actor) { - SunscreenUser sunscreenUser = sunscreenUser(actor); - Session session = sunscreenUser.session(); - if (session == null || session.menu() == null) { - actor.sendMessage("You don't have a menu opened."); - return; - } - OpenedMenu openedMenu = session.menu(); - if (!(openedMenu instanceof OpenedMenu.FloatImpl impl)) { - actor.sendMessage("You don't the have the right menu type specified. Contact and administrator."); - return; - } - DebugElement element = new DebugElement(Size.pixel(100, 100), Identifier.of("debug"), Position.pixel(0,0), sunscreenUser); - Div debugDiv = Div.div(Identifier.of("internal", "debug")).size(Size.pixel(100, 100)).position(Position.position().x().percentage(50).back().y().percentage(50).back()); - debugDiv.add(element); - //impl.div(debugDiv); - impl.render(debugDiv); - } - - @Subcommand("reload") - public void reload(CommandIssuer actor) { - SunscreenUser sunscreenUser = sunscreenUser(actor); - MenuRegistry menuRegistry = SunscreenLibrary.library().menuRegistry(); - menuRegistry.clear(); - MenuConfigTransformer menuConfigTransformer = SunscreenLibrary.library().menuConfigTransformer(); - Collection templates = menuConfigTransformer.read(SunscreenLibrary.library().path().resolve(Path.of("menus"))); - SunscreenLibrary.library().logger().info("Loaded {} menu(s).", templates.size()); - for (MenuTemplate template : templates) { - SunscreenLibrary.library().menuRegistry().register(template); - } - sunscreenUser.message(Component.text(menuRegistry.all().size() + " menu(s) loaded.").color(TextColor.color(143, 211, 255))); - } - - @Subcommand("open") - @Syntax("

") - @CommandCompletion("@menus") - public void open(CommandIssuer actor, Identifier identifier) { - SunscreenUser sunscreenUser = sunscreenUser(actor); - MenuTemplate template = SunscreenLibrary.library().menuRegistry().get(identifier); - sunscreenUser.open(template); - } - - @Subcommand("editor") - @CommandAlias("edit") - public void editor(CommandIssuer actor, @Optional Identifier identifier) { - SunscreenUser sunscreenUser = sunscreenUser(actor); - if (sunscreenUser.screenSize() == null) { - TextComponent.Builder builder = Component.text(); - builder.append(Component.text("You need to set a screen size before opening the editor ", TextColor.color(232, 59, 59))); - builder.append(Component.text("/sunscreen resolution").style(Style.style().decorate(TextDecoration.UNDERLINED).color(TextColor.color(77, 155, 230)) - .clickEvent(ClickEvent.runCommand("/sunscreen resolution " + sunscreenUser.name())) - .hoverEvent(HoverEvent.showText(Component.text("Click to run").color(NamedTextColor.GRAY))))); - sunscreenUser.message( - builder.build() - ); - return; - } - if (sunscreenUser.session() != null) { - if (sunscreenUser.session().menu() != null) { - actor.sendMessage("You already have a openedMenu opened."); - return; - } - } - OpenedMenu.FloatImpl menu = new EditorMenu(sunscreenUser); - SunscreenLibrary.library().menuTicker().start(menu); - Session session = Session.session(menu, sunscreenUser); - SunscreenLibrary.library().sessionHandler().session(session); - } - - @Subcommand("list") - public void list(CommandIssuer actor) { - SunscreenUser sunscreenUser = sunscreenUser(actor); - MenuRegistry menuRegistry = SunscreenLibrary.library().menuRegistry(); - final Component line = Component.text("-".repeat(15), Style.style(TextColor.color(230, 144, 78), TextDecoration.STRIKETHROUGH)); - ComponentBuilder builder = Component.text(); - builder.append(Component.text(menuRegistry.all().size() + " menu(s) loaded.").style(Style.style().decoration(TextDecoration.BOLD, true)).color(TextColor.color(143, 211, 255)), Component.newline(), line); - for (MenuTemplate template : menuRegistry.all()) { - builder.append(Component.newline()).append(Component.text(template.identifier().string()) - .style(Style.style().decorate(TextDecoration.UNDERLINED).color(TextColor.color(77, 155, 230)) - .clickEvent(ClickEvent.runCommand("/sunscreen open " + template.identifier().string())) - .hoverEvent(HoverEvent.showText(Component.text("Click to open").color(NamedTextColor.GRAY))))); - } - builder.append(Component.newline(), line, Component.newline(), Component.text("Open overview of all menus.", Style.style(TextColor.color(205, 104, 61), TextDecoration.UNDERLINED).hoverEvent(HoverEvent.showText(Component.text("Click to open").color(NamedTextColor.GRAY))).clickEvent(ClickEvent.runCommand("/sunscreen overview")))); - sunscreenUser.message(builder.build()); - } - - @Subcommand("aspectratio") - @CommandAlias("resolution") - @CommandCompletion("@users") - @Syntax("") - public void aspectRatio(CommandIssuer actor, @Optional SunscreenUser user) { - SunscreenUser sunscreenUser = user == null ? SunscreenLibrary.library().users().user(actor.getUniqueId()).orElse(null) : (SunscreenUser) user; - if (sunscreenUser == null) { - actor.sendMessage("Something went wrong, please contact support."); - throw new IllegalArgumentException("User not found"); - } - if (sunscreenUser.session().menu() != null) { - actor.sendMessage("You already have a menu opened."); - return; - } - SunscreenLibrary.library().menuTicker().start(new AspectRatioMenu(sunscreenUser)); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/event/ClickElementEvent.java b/api/src/main/java/me/combimagnetron/sunscreen/event/ClickElementEvent.java index 095f53b..9b60e33 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/event/ClickElementEvent.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/event/ClickElementEvent.java @@ -1,16 +1,14 @@ package me.combimagnetron.sunscreen.event; import me.combimagnetron.passport.event.Event; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.input.Input; +import me.combimagnetron.sunscreen.ui.element.ModernElement; import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.math.Vec2i; -public record ClickElementEvent>(T element, SunscreenUser user, Vec2i coords, Input.Type.MouseClick click) implements Event { +public record ClickElementEvent>(E element, SunscreenUser user, Vec2i coords, boolean right) implements Event { - public static > ClickElementEvent create(T element, SunscreenUser user, Vec2i coords, Input.Type.MouseClick click) { - return new ClickElementEvent<>(element, user, coords, click); + public static > ClickElementEvent create(T element, SunscreenUser user, Vec2i coords, boolean right) { + return new ClickElementEvent<>(element, user, coords, right); } @Override diff --git a/api/src/main/java/me/combimagnetron/sunscreen/event/FinishTextInputEvent.java b/api/src/main/java/me/combimagnetron/sunscreen/event/FinishTextInputEvent.java index ffdcbcd..9022e91 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/event/FinishTextInputEvent.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/event/FinishTextInputEvent.java @@ -1,10 +1,10 @@ package me.combimagnetron.sunscreen.event; import me.combimagnetron.passport.event.Event; -import me.combimagnetron.sunscreen.element.Element; +import me.combimagnetron.sunscreen.ui.element.ElementLike; import me.combimagnetron.sunscreen.user.SunscreenUser; -public record FinishTextInputEvent>(T element, SunscreenUser user, String input) implements Event { +public record FinishTextInputEvent>(E element, SunscreenUser user, String input) implements Event { @Override public Class eventType() { return FinishTextInputEvent.class; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/event/HoverElementEvent.java b/api/src/main/java/me/combimagnetron/sunscreen/event/HoverElementEvent.java index 4383ddc..0af1d4a 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/event/HoverElementEvent.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/event/HoverElementEvent.java @@ -1,11 +1,11 @@ package me.combimagnetron.sunscreen.event; import me.combimagnetron.passport.event.Event; -import me.combimagnetron.sunscreen.element.Element; +import me.combimagnetron.sunscreen.ui.element.ElementLike; import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Vec2d; +import me.combimagnetron.sunscreen.util.math.Vec2d; -public record HoverElementEvent>(T element, SunscreenUser user, Vec2d coords) implements Event { +public record HoverElementEvent>(E element, SunscreenUser user, Vec2d coords) implements Event { @Override public Class eventType() { return HoverElementEvent.class; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/ResourcePackProviderHook.java b/api/src/main/java/me/combimagnetron/sunscreen/hook/ResourcePackProviderHook.java index 3a9afe1..df6ee66 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/hook/ResourcePackProviderHook.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/hook/ResourcePackProviderHook.java @@ -1,11 +1,10 @@ package me.combimagnetron.sunscreen.hook; -import me.combimagnetron.sunscreen.image.Canvas; import me.combimagnetron.sunscreen.resourcepack.ResourcePack; public interface ResourcePackProviderHook extends SunscreenHook { - Canvas font(char ch); + Object font(char ch); boolean merge(ResourcePack resourcePack); diff --git a/api/src/main/java/me/combimagnetron/sunscreen/hook/SunscreenHook.java b/api/src/main/java/me/combimagnetron/sunscreen/hook/SunscreenHook.java index 8e5d206..ca9754a 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/hook/SunscreenHook.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/hook/SunscreenHook.java @@ -1,8 +1,6 @@ package me.combimagnetron.sunscreen.hook; -import me.combimagnetron.sunscreen.hook.labymod.LabyModSunscreenHook; -import me.combimagnetron.sunscreen.hook.lunar.LunarClientSunscreenHook; -import me.combimagnetron.sunscreen.menu.OpenedMenu; +import me.combimagnetron.sunscreen.ui.ModernMenu; import me.combimagnetron.sunscreen.user.SunscreenUser; import java.util.ArrayList; @@ -11,8 +9,8 @@ public interface SunscreenHook { Collection HOOKS = new ArrayList<>(List.of( - new LabyModSunscreenHook(), - new LunarClientSunscreenHook() + //new LabyModSunscreenHook(), + //new LunarClientSunscreenHook() )); boolean canRun(); @@ -21,8 +19,8 @@ public interface SunscreenHook { void disable(); - void onMenuEnter(SunscreenUser user, OpenedMenu menu); + void onMenuEnter(SunscreenUser user, ModernMenu menu); - void onMenuLeave(SunscreenUser user, OpenedMenu menu); + void onMenuLeave(SunscreenUser user, ModernMenu menu); } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java b/api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java deleted file mode 100755 index 5c3b347..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/Canvas.java +++ /dev/null @@ -1,311 +0,0 @@ -package me.combimagnetron.sunscreen.image; - -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.image.effect.Effect; -import me.combimagnetron.sunscreen.menu.Size; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.net.URI; -import java.net.URL; -import java.nio.file.Path; - -public interface Canvas { - - Canvas sub(Vec2i size, Vec2i coords); - - Canvas pixel(Pixel pixel); - - Canvas place(Canvas canvas, Vec2i coords); - - Canvas fill(Vec2i coords, Vec2i size, me.combimagnetron.sunscreen.image.Color color); - - Canvas trim(); - - Canvas scale(Vec2d scale); - - Canvas text(Text text, Vec2i coords, Color color); - - Canvas text(Text text, Vec2i coords);,4, - - Vec2i size(); - - Pixel pixel(Vec2i coords); - - boolean animated(); - - default Canvas effect(Effect effect) { - return effect.apply(this); - } - - static Canvas image(BufferedImage image) { - return new StaticImpl(image); - } - - static Canvas image(Size size) { - if (size == null) { - return new StaticImpl(new BufferedImage(256, 256, 2)); - } - return new StaticImpl(new BufferedImage((int) size.x().pixel(), (int) size.y().pixel(), 2)); - } - - static Canvas image(Vec2i size) { - return new StaticImpl(new BufferedImage(size.x(), size.y(), 2)); - } - - static Canvas image(ImageProvider imageProvider) { - return image(imageProvider.image()); - } - - interface InternalCanvas extends Canvas { - BufferedImage image(); - } - - class StaticImpl implements InternalCanvas { - private final BufferedImage image; - - protected StaticImpl(BufferedImage image) { - this.image = image; - } - - @Override - public Canvas sub(Vec2i size, Vec2i coords) { - return new StaticImpl(image.getSubimage(coords.x(), coords.y(), size.x(), size.y())); - } - - public BufferedImage image() { - return image; - } - - @Override - public Canvas pixel(Pixel pixel) { - image.setRGB(pixel.x(), pixel.y(), pixel.color().rgb()); - return new StaticImpl(image); - } - - @Override - public Canvas place(Canvas canvas, Vec2i coords) { - BufferedImage place = ((InternalCanvas) canvas).image(); - Graphics2D graphics = image.createGraphics(); - graphics.drawImage(place, coords.x(), coords.y(), null); - graphics.dispose(); - return new StaticImpl(image); - } - - @Override - public Canvas fill(Vec2i coords, Vec2i size, me.combimagnetron.sunscreen.image.Color color) { - Graphics2D graphics = image.createGraphics(); - graphics.setColor(new java.awt.Color(color.rgb())); - graphics.fillRect(coords.x(), coords.y(), size.x(), size.y()); - graphics.dispose(); - return new StaticImpl(image); - } - - @Override - public Canvas trim() { - return Canvas.image(Canvas.trim(image)); - } - - @Override - public Canvas scale(Vec2d scale) { - return Canvas.image((BufferedImage) image.getScaledInstance(1, 1, Image.SCALE_DEFAULT)); - } - - @Override - public Canvas text(Text text, Vec2i coords, Color color) { - Graphics2D graphics = image.createGraphics(); - graphics.setColor(new java.awt.Color(color.rgb())); - graphics.setFont(text.font().internal()); - graphics.drawString(text.content(), coords.x(), coords.y()); - graphics.dispose(); - return this; - } - - @Override - public Canvas text(Text text, Vec2i coords) { - return text(text, coords, Color.white()); - } - - @Override - public Vec2i size() { - return Vec2i.of(image.getWidth(), image.getHeight()); - } - - @Override - public Pixel pixel(Vec2i coords) { - return Pixel.of(coords, me.combimagnetron.sunscreen.image.Color.of(image.getRGB(coords.x(), coords.y()))); - } - - @Override - public boolean animated() { - return false; - } - } - - class IntArrayImpl implements InternalCanvas { - private final int[][] pixels; - - protected IntArrayImpl(Vec2i size) { - pixels = new int[size.x()][size.y()]; - } - - @Override - public BufferedImage image() { - return null; - } - - @Override - public Canvas sub(Vec2i size, Vec2i coords) { - return null; - } - - @Override - public Canvas pixel(Pixel pixel) { - return null; - } - - @Override - public Canvas place(Canvas canvas, Vec2i coords) { - return null; - } - - @Override - public Canvas fill(Vec2i coords, Vec2i size, Color color) { - return null; - } - - @Override - public Canvas trim() { - return null; - } - - @Override - public Canvas scale(Vec2d scale) { - return null; - } - - @Override - public Canvas text(Text text, Vec2i coords, Color color) { - return null; - } - - @Override - public Canvas text(Text text, Vec2i coords) { - return null; - } - - @Override - public Vec2i size() { - return null; - } - - @Override - public Pixel pixel(Vec2i coords) { - return null; - } - - @Override - public boolean animated() { - return false; - } - } - - interface ImageProvider { - - BufferedImage image(); - - static FileImageProvider file(Path path) { - return new FileImageProvider(path); - } - - static UrlImageProvider url(String url) { - return new UrlImageProvider(url); - } - - static ResourcesImageProvider resources(String path) { - return new ResourcesImageProvider(path); - } - - record UrlImageProvider(String url) implements ImageProvider { - - @Override - public BufferedImage image() { - try { - return ImageIO.read(URI.create(url).toURL()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - record FileImageProvider(Path path) implements ImageProvider { - - @Override - public BufferedImage image() { - try { - return ImageIO.read(SunscreenLibrary.library().path().resolve(path).toFile()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - record ResourcesImageProvider(String path) implements ImageProvider { - - @Override - public BufferedImage image() { - try { - return ImageIO.read(SunscreenLibrary.library().resource(path)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - } - - static BufferedImage trim(BufferedImage image) { - int width = image.getWidth(); - int height = image.getHeight(); - - int top, bottom, left, right; - boolean emptyRow; - searchTop: - for (top = 0; top < height; top++) { - for (int x = 0; x < width; x++) { - if (isNonEmptyPixel(image, x, top)) break searchTop; - } - } - searchBottom: - for (bottom = height - 1; bottom > top; bottom--) { - for (int x = 0; x < width; x++) { - if (isNonEmptyPixel(image, x, bottom)) break searchBottom; - } - } - searchLeft: - for (left = 0; left < width; left++) { - for (int y = top; y <= bottom; y++) { - if (isNonEmptyPixel(image, left, y)) break searchLeft; - } - } - searchRight: - for (right = width - 1; right > left; right--) { - for (int y = top; y <= bottom; y++) { - if (isNonEmptyPixel(image, right, y)) break searchRight; - } - } - return image.getSubimage(left, top, (right - left + 1), (bottom - top + 1)); - } - - private static boolean isNonEmptyPixel(BufferedImage image, int x, int y) { - int pixel = image.getRGB(x, y); - java.awt.Color color = new java.awt.Color(pixel, true); - return color.getAlpha() != 0; - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/CanvasRenderer.java b/api/src/main/java/me/combimagnetron/sunscreen/image/CanvasRenderer.java deleted file mode 100755 index 3fd3908..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/CanvasRenderer.java +++ /dev/null @@ -1,235 +0,0 @@ -package me.combimagnetron.sunscreen.image; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.google.common.cache.CacheBuilder; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import me.combimagnetron.passport.util.Pair; -import me.combimagnetron.sunscreen.util.*; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.minimessage.MiniMessage; - -import java.awt.image.BufferedImage; -import java.awt.image.ImageFilter; -import java.time.Duration; -import java.time.temporal.ChronoUnit; -import java.time.temporal.TemporalUnit; -import java.util.*; - -public interface CanvasRenderer { - OptimizedCanvasRenderer OPTIMIZED = new OptimizedCanvasRenderer(); - CachedOptimizedCanvasRenderer CACHED_OPTIMIZED = new CachedOptimizedCanvasRenderer(); - SelectiveCachedOptimizedCanvasRenderer SELECTIVE_CACHED_OPTIMIZED = new SelectiveCachedOptimizedCanvasRenderer(); - - Frame render(Canvas canvas); - - record Frame(Component component, int width, int height, int r) { - - public static Frame wrap(Component component, int width, int height, int r) { - return new Frame(component, width, height, r); - } - - } - - record Pattern(Collection pattern, Map colorMap) { - - public static Pattern of(Collection pattern, BiMap colorMap) { - return new Pattern(pattern, colorMap); - } - } - - class CanvasPattenizer { - - public Pattern patternize(BufferedImage image) { - Collection pattern = new ArrayList<>(); - BiMap colorMap = HashBiMap.create(); - for (int x = 0; x < image.getHeight(); x += 1) { - for (int y = 0; y < image.getWidth(); y += 1) { - if (x + 1 > image.getHeight() || y + 1 > image.getWidth()) { - continue; - } - BufferedImage section = image.getSubimage(y, x, 1, 1); - String patterned = patternize(section, null); - pattern.add(patterned); - colorMap.put(patterned, Color.of(section.getRGB(0, 0))); - } - } - return Pattern.of(pattern, colorMap); - } - - private String patternize(BufferedImage image, BiMap colorMap) { - StringBuilder builder = new StringBuilder(); - for (int x = 0; x < image.getHeight(); x++) { - for (int y = 0; y < image.getWidth(); y++) { - if (x + 1 > image.getHeight() || y + 1 > image.getWidth()) { - continue; - } - Color color = Color.of(image.getRGB(y, x)); - if (colorMap != null && colorMap.containsValue(color)) { - builder.append(colorMap.inverse().get(color)); - } else { - builder.append(" "); - } - } - } - return builder.toString(); - } - - } - - static CanvasRenderer optimized() { - return OPTIMIZED; - } - - static CanvasRenderer cachedOptimized() { - return CACHED_OPTIMIZED; - } - - static CanvasRenderer selectiveCachedOptimized() { - return SELECTIVE_CACHED_OPTIMIZED; - } - - class OptimizedCanvasRenderer implements CanvasRenderer { - @Override - public Frame render(Canvas canvas) { - return old(canvas); - } - - private static Frame updated(Canvas canvas) { - return Scheduler.async(() -> { - Canvas.InternalCanvas internalCanvas = (Canvas.InternalCanvas) canvas; - BufferedImage image = internalCanvas.image(); - int fontLine = 3; - - return null; - }); - } - - private static Frame old(Canvas canvas) { - return Scheduler.async(() -> {Canvas.InternalCanvas internalCanvas = (Canvas.InternalCanvas) canvas; - BufferedImage image = internalCanvas.image(); - int r = 3; - TextComponent.Builder component = Component.text(); - int realHeight = image.getHeight() - 1; - int realWidth = image.getWidth() - 1; - boolean isPerfect = image.getWidth() % 3 == 0; - for (int x = 0; x <= realHeight; x += 3) { - int heightAdd = 3; - if (x + 3 > realHeight) { - heightAdd = realHeight - x; - } - for (int y = 0; y <= realWidth; y += 3) { - int widthAdd = 3; - if (y + 3 > realWidth) { - widthAdd = realWidth - y; - } - if (widthAdd <= 0 || heightAdd <= 0) { - continue; - } - BufferedImage section = image.getSubimage(y, x, widthAdd, heightAdd); - me.combimagnetron.sunscreen.util.Pair pair = PixelPattern.optimize(section, r); - /*if (widthAdd != 3) { - component.append(FontUtil.offset(-1 + (pair.v() - 3)));//.append(FontUtil.offset(1)); - } else if (y != 0 && y + widthAdd != realWidth) {*/ - component.append(FontUtil.offset(-1)); - //} - component.append(pair.k()); - } - if (r == -7) { - r = 2; - component.append(Component.newline(), Component.newline(), Component.newline()); - } else if (!(realHeight - x <= 3)) { - r--; - component.append(FontUtil.offset(-(image.getWidth()))); - } - } - Component finished = component.build(); - return Frame.wrap(finished, image.getWidth(), image.getHeight(), r);}); - } - } - - class CachedOptimizedCanvasRenderer extends OptimizedCanvasRenderer { - private final Cache cache = Caffeine.newBuilder().expireAfterWrite(Duration.of(30, ChronoUnit.MINUTES)).build(); - - @Override - public Frame render(Canvas canvas) { - BufferedImage image = ((Canvas.InternalCanvas) canvas).image(); - if (cache.asMap().containsKey(canvas.hashCode())) { - return Frame.wrap(cache.getIfPresent(canvas.hashCode()), image.getWidth(), image.getHeight(), -1); - } - Frame frame = super.render(canvas); - cache.put(frame.component.hashCode(), frame.component); - return frame; - } - - } - - class SelectiveCachedOptimizedCanvasRenderer extends OptimizedCanvasRenderer { - private final Cache> cache = Caffeine.newBuilder().expireAfterWrite(Duration.of(30, ChronoUnit.MINUTES)).build(); - - @Override - public Frame render(Canvas canvas) { - BufferedImage image = ((Canvas.InternalCanvas) canvas).image(); - List> possibilities = cache.asMap().values().stream().filter(pair -> pair.first().size().equals(canvas.size())).toList(); - if (possibilities.isEmpty()) { - Frame frame = super.render(canvas); - cache.put(frame.component.hashCode(), Pair.of(canvas, MiniMessage.miniMessage().serialize(frame.component()))); - return frame; - } - Pair possibility = possibilities.getFirst(); - Result difference = differences(canvas, possibility.first()); - BufferedImage changed = difference.difference(); - String find = MiniMessage.miniMessage().serialize(super.render(Canvas.image(changed)).component()); - Canvas remove = Canvas.image(canvas.size()); - for (Box box : difference.changes()) { - remove = remove.place(possibility.first().sub(Vec2i.of(box.size().x(), box.size().y()), Vec2i.of(box.pos().x(), box.pos().y())), Vec2i.of(box.pos().x(), box.pos().y())); - } - String replace = MiniMessage.miniMessage().serialize(super.render(remove).component()); - String result = find.replaceAll(replace, find); - return Frame.wrap(MiniMessage.miniMessage().deserialize(result), image.getWidth(), image.getHeight(), -1); - } - - //TODO Use boundingboxes to find the differences and only rerender the changed parts and replace them in the cached component - private static Result differences(Canvas first, Canvas second) { - BufferedImage firstImage = ((Canvas.InternalCanvas) first).image(); - BufferedImage secondImage = ((Canvas.InternalCanvas) second).image(); - BufferedImage difference = new BufferedImage(firstImage.getWidth(), firstImage.getHeight(), BufferedImage.TYPE_INT_ARGB); - Collection boxes = new ArrayList<>(); - for (int x = 0; x < firstImage.getWidth(); x++) { - for (int y = 0; y < firstImage.getHeight(); y++) { - if (firstImage.getRGB(x, y) != secondImage.getRGB(x, y)) { - difference.setRGB(x, y, secondImage.getRGB(x, y)); - resize(boxes, Vec2i.of(x, y)); - } else { - difference.setRGB(x, y, 0); - } - } - } - return Result.of(difference, boxes); - } - - record Result(BufferedImage difference, Collection changes) { - - static Result of(BufferedImage difference, Collection changes) { - return new Result(difference, changes); - } - - } - - private static void resize(Collection boxes, Vec2i pos) { - for (Box box : boxes) { - if (box.inBox(pos)) { - box.extend(pos); - return; - } - } - boxes.add(Box.of(pos, Vec2i.of(1, 1))); - } - - - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/Color.java b/api/src/main/java/me/combimagnetron/sunscreen/image/Color.java deleted file mode 100755 index 8949aed..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/Color.java +++ /dev/null @@ -1,193 +0,0 @@ -package me.combimagnetron.sunscreen.image; - -import net.kyori.adventure.text.format.TextColor; - -public interface Color { - Color WHITE = of(255, 255, 255); - Color LIGHT_GRAY = of(192, 192, 192); - Color GRAY = of(128, 128, 128); - Color DARK_GRAY = of(64, 64, 64); - Color BLACK = of(0, 0, 0); - Color RED = of(255, 0, 0); - Color PINK = of(255, 175, 175); - Color ORANGE = of(255, 200, 0); - Color YELLOW = of(255, 255, 0); - Color GREEN = of(0, 255, 0); - Color MAGENTA = of(255, 0, 255); - Color CYAN = of(0, 255, 255); - Color BLUE = of(0, 0, 255); - Color TRANSPARENT = of(0, 0, 0, 0); - - static Color white() { - return WHITE; - } - - static Color lightGray() { - return LIGHT_GRAY; - } - - static Color gray() { - return GRAY; - } - - static Color darkGray() { - return DARK_GRAY; - } - - static Color black() { - return BLACK; - } - - static Color red_() { - return RED; - } - - static Color pink() { - return PINK; - } - - static Color orange() { - return ORANGE; - } - - static Color yellow() { - return YELLOW; - } - - static Color green_() { - return GREEN; - } - - static Color magenta() { - return MAGENTA; - } - - static Color cyan() { - return CYAN; - } - - static Color blue_() { - return BLUE; - } - - static Color transparent() { - return TRANSPARENT; - } - - /** - * @return the red value of this color - */ - int red(); - - /** - * @return the green value of this color - */ - int green(); - - /** - * @return the blue value of this color - */ - int blue(); - - /** - * @return the alpha value of this color - */ - int alpha(); - - /** - * @return the rgb representation of this color - */ - int rgb(); - - int rgba(); - - /** - * @return the text color representation of this color - */ - TextColor textColor(); - - /** - * @param color the text color to convert to a color - * @return TextColor converted to a Color - */ - static Color of(TextColor color) { - return Impl.of(color); - } - - /** - * @param red int value between 0 and 255, representing the red value of the color - * @param green int value between 0 and 255, representing the green value of the color - * @param blue int value between 0 and 255, representing the blue value of the color - * @param alpha int value between 0 and 255, representing the alpha value of the color - * @return a new color with the given red, green, blue, and alpha values - */ - static Color of(int red, int green, int blue, int alpha) { - return Impl.of(red, green, blue, alpha); - } - - /** - * @param red int value between 0 and 255, representing the red value of the color - * @param green int value between 0 and 255, representing the green value of the color - * @param blue int value between 0 and 255, representing the blue value of the color - * @return a new color with the given red, green, and blue values - */ - static Color of(int red, int green, int blue) { - return Impl.of(red, green, blue); - } - - /** - * @param rgb int value representing the red, green, and blue values of the color - * @return a new color with the given red, green, and blue values - */ - static Color of(int rgb) { - return Impl.of(rgb); - } - - /** - * @param rgb int value representing the red, green, and blue values of the color - * @param alpha int value between 0 and 255, representing the alpha value of the color - * @return a new color with the given red, green, blue, and alpha values - */ - static Color of(int rgb, int alpha) { - return Impl.of(rgb, alpha); - } - - record Impl(int red, int green, int blue, int alpha) implements Color { - - public static Color of(int red, int green, int blue, int alpha) { - return new Impl(red, green, blue, alpha); - } - - public static Color of(int red, int green, int blue) { - return new Impl(red, green, blue, 255); - } - - public static Color of(int rgb) { - return new Impl((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF, 255); - } - - public static Color of(int rgb, int alpha) { - return new Impl((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF, alpha); - } - - public static Color of(TextColor color) { - return new Impl(color.red(), color.green(), color.blue(), 255); - } - - @Override - public int rgb() { - return (red << 16) | (green << 8) | blue; - } - - @Override - public int rgba() { - return (int) (((long)alpha << 24) | (red << 16) | (green << 8) | blue); - } - - @Override - public TextColor textColor() { - return TextColor.color(red, green, blue); - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/Pixel.java b/api/src/main/java/me/combimagnetron/sunscreen/image/Pixel.java deleted file mode 100755 index 7c26458..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/Pixel.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.combimagnetron.sunscreen.image; - -import me.combimagnetron.sunscreen.util.Vec2i; - -public record Pixel(int x, int y, Color color) { - - public static Pixel of(int x, int y, Color color) { - return new Pixel(x, y, color); - } - - public static Pixel of(int x, int y, int rgb) { - return new Pixel(x, y, Color.of(rgb)); - } - - public static Pixel of(Vec2i pos, Color color) { - return new Pixel(pos.x(), pos.y(), color); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/PixelPattern.java b/api/src/main/java/me/combimagnetron/sunscreen/image/PixelPattern.java deleted file mode 100755 index ffaed95..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/PixelPattern.java +++ /dev/null @@ -1,1640 +0,0 @@ -package me.combimagnetron.sunscreen.image; - -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.Vec2d; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.TextColor; - -import java.awt.image.BufferedImage; -import java.util.*; -import java.util.List; -import java.util.Map; -import java.util.HashMap; - -public interface PixelPattern { - - PixelPattern R00_00 = of(new String[] {"000", "000", "000"},0, 0, Vec2d.of(0, 0), ''); - - PixelPattern R00_01 = of(new String[] {"100", "000", "000"},1, 1, Vec2d.of(1, 0), ''); - - PixelPattern R00_02 = of(new String[] {"010", "000", "000"},1, 1, Vec2d.of(2, 0), ''); - - PixelPattern R00_03 = of(new String[] {"110", "000", "000"},2, 2, Vec2d.of(3, 0), ''); - - PixelPattern R00_04 = of(new String[] {"001", "000", "000"},1, 1, Vec2d.of(4, 0), ''); - - PixelPattern R00_05 = of(new String[] {"101", "000", "000"},2, 3, Vec2d.of(5, 0), ''); - - PixelPattern R00_06 = of(new String[] {"011", "000", "000"},2, 2, Vec2d.of(6, 0), ''); - - PixelPattern R00_07 = of(new String[] {"111", "000", "000"},3, 3, Vec2d.of(7, 0), ''); - - PixelPattern R00_08 = of(new String[] {"000", "100", "000"},1, 1, Vec2d.of(8, 0), ''); - - PixelPattern R00_09 = of(new String[] {"100", "100", "000"},2, 1, Vec2d.of(9, 0), ''); - - PixelPattern R00_10 = of(new String[] {"010", "100", "000"},2, 2, Vec2d.of(10, 0), ''); - - PixelPattern R00_11 = of(new String[] {"110", "100", "000"},3, 2, Vec2d.of(11, 0), ''); - - PixelPattern R00_12 = of(new String[] {"001", "100", "000"},2, 3, Vec2d.of(12, 0), ''); - - PixelPattern R00_13 = of(new String[] {"101", "100", "000"},3, 3, Vec2d.of(13, 0), ''); - - PixelPattern R00_14 = of(new String[] {"011", "100", "000"},3, 3, Vec2d.of(14, 0), ''); - - PixelPattern R00_15 = of(new String[] {"111", "100", "000"},4, 3, Vec2d.of(15, 0), ''); - - PixelPattern R01_00 = of(new String[] {"000", "010", "000"},1, 1, Vec2d.of(0, 1), ''); - - PixelPattern R01_01 = of(new String[] {"100", "010", "000"},2, 2, Vec2d.of(1, 1), ''); - - PixelPattern R01_02 = of(new String[] {"010", "010", "000"},2, 1, Vec2d.of(2, 1), ''); - - PixelPattern R01_03 = of(new String[] {"110", "010", "000"},3, 2, Vec2d.of(3, 1), ''); - - PixelPattern R01_04 = of(new String[] {"001", "010", "000"},2, 2, Vec2d.of(4, 1), ''); - - PixelPattern R01_05 = of(new String[] {"101", "010", "000"},3, 3, Vec2d.of(5, 1), ''); - - PixelPattern R01_06 = of(new String[] {"011", "010", "000"},3, 2, Vec2d.of(6, 1), ''); - - PixelPattern R01_07 = of(new String[] {"111", "010", "000"},4, 3, Vec2d.of(7, 1), ''); - - PixelPattern R01_08 = of(new String[] {"000", "110", "000"},2, 2, Vec2d.of(8, 1), ''); - - PixelPattern R01_09 = of(new String[] {"100", "110", "000"},3, 2, Vec2d.of(9, 1), ''); - - PixelPattern R01_10 = of(new String[] {"010", "110", "000"},3, 2, Vec2d.of(10, 1), ''); - - PixelPattern R01_11 = of(new String[] {"110", "110", "000"},4, 2, Vec2d.of(11, 1), ''); - - PixelPattern R01_12 = of(new String[] {"001", "110", "000"},3, 3, Vec2d.of(12, 1), ''); - - PixelPattern R01_13 = of(new String[] {"101", "110", "000"},4, 3, Vec2d.of(13, 1), ''); - - PixelPattern R01_14 = of(new String[] {"011", "110", "000"},4, 3, Vec2d.of(14, 1), ''); - - PixelPattern R01_15 = of(new String[] {"111", "110", "000"},5, 3, Vec2d.of(15, 1), ''); - - PixelPattern R02_00 = of(new String[] {"000", "001", "000"},1, 1, Vec2d.of(0, 2), ''); - - PixelPattern R02_01 = of(new String[] {"100", "001", "000"},2, 3, Vec2d.of(1, 2), ''); - - PixelPattern R02_02 = of(new String[] {"010", "001", "000"},2, 2, Vec2d.of(2, 2), ''); - - PixelPattern R02_03 = of(new String[] {"110", "001", "000"},3, 3, Vec2d.of(3, 2), ''); - - PixelPattern R02_04 = of(new String[] {"001", "001", "000"},2, 1, Vec2d.of(4, 2), ''); - - PixelPattern R02_05 = of(new String[] {"101", "001", "000"},3, 3, Vec2d.of(5, 2), ''); - - PixelPattern R02_06 = of(new String[] {"011", "001", "000"},3, 2, Vec2d.of(6, 2), ''); - - PixelPattern R02_07 = of(new String[] {"111", "001", "000"},4, 3, Vec2d.of(7, 2), ''); - - PixelPattern R02_08 = of(new String[] {"000", "101", "000"},2, 3, Vec2d.of(8, 2), ''); - - PixelPattern R02_09 = of(new String[] {"100", "101", "000"},3, 3, Vec2d.of(9, 2), ''); - - PixelPattern R02_10 = of(new String[] {"010", "101", "000"},3, 3, Vec2d.of(10, 2), ''); - - PixelPattern R02_11 = of(new String[] {"110", "101", "000"},4, 3, Vec2d.of(11, 2), ''); - - PixelPattern R02_12 = of(new String[] {"001", "101", "000"},3, 3, Vec2d.of(12, 2), ''); - - PixelPattern R02_13 = of(new String[] {"101", "101", "000"},4, 3, Vec2d.of(13, 2), ''); - - PixelPattern R02_14 = of(new String[] {"011", "101", "000"},4, 3, Vec2d.of(14, 2), ''); - - PixelPattern R02_15 = of(new String[] {"111", "101", "000"},5, 3, Vec2d.of(15, 2), ''); - - PixelPattern R03_00 = of(new String[] {"000", "011", "000"},2, 2, Vec2d.of(0, 3), ''); - - PixelPattern R03_01 = of(new String[] {"100", "011", "000"},3, 3, Vec2d.of(1, 3), ''); - - PixelPattern R03_02 = of(new String[] {"010", "011", "000"},3, 2, Vec2d.of(2, 3), ''); - - PixelPattern R03_03 = of(new String[] {"110", "011", "000"},4, 3, Vec2d.of(3, 3), ''); - - PixelPattern R03_04 = of(new String[] {"001", "011", "000"},3, 2, Vec2d.of(4, 3), ''); - - PixelPattern R03_05 = of(new String[] {"101", "011", "000"},4, 3, Vec2d.of(5, 3), ''); - - PixelPattern R03_06 = of(new String[] {"011", "011", "000"},4, 2, Vec2d.of(6, 3), ''); - - PixelPattern R03_07 = of(new String[] {"111", "011", "000"},5, 3, Vec2d.of(7, 3), ''); - - PixelPattern R03_08 = of(new String[] {"000", "111", "000"},3, 3, Vec2d.of(8, 3), ''); - - PixelPattern R03_09 = of(new String[] {"100", "111", "000"},4, 3, Vec2d.of(9, 3), ''); - - PixelPattern R03_10 = of(new String[] {"010", "111", "000"},4, 3, Vec2d.of(10, 3), ''); - - PixelPattern R03_11 = of(new String[] {"110", "111", "000"},5, 3, Vec2d.of(11, 3), ''); - - PixelPattern R03_12 = of(new String[] {"001", "111", "000"},4, 3, Vec2d.of(12, 3), ''); - - PixelPattern R03_13 = of(new String[] {"101", "111", "000"},5, 3, Vec2d.of(13, 3), ''); - - PixelPattern R03_14 = of(new String[] {"011", "111", "000"},5, 3, Vec2d.of(14, 3), ''); - - PixelPattern R03_15 = of(new String[] {"111", "111", "000"},6, 3, Vec2d.of(15, 3), ''); - - PixelPattern R04_00 = of(new String[] {"000", "000", "100"},1, 1, Vec2d.of(0, 4), ''); - - PixelPattern R04_01 = of(new String[] {"100", "000", "100"},2, 1, Vec2d.of(1, 4), ''); - - PixelPattern R04_02 = of(new String[] {"010", "000", "100"},2, 2, Vec2d.of(2, 4), ''); - - PixelPattern R04_03 = of(new String[] {"110", "000", "100"},3, 2, Vec2d.of(3, 4), ''); - - PixelPattern R04_04 = of(new String[] {"001", "000", "100"},2, 3, Vec2d.of(4, 4), ''); - - PixelPattern R04_05 = of(new String[] {"101", "000", "100"},3, 3, Vec2d.of(5, 4), ''); - - PixelPattern R04_06 = of(new String[] {"011", "000", "100"},3, 3, Vec2d.of(6, 4), ''); - - PixelPattern R04_07 = of(new String[] {"111", "000", "100"},4, 3, Vec2d.of(7, 4), ''); - - PixelPattern R04_08 = of(new String[] {"000", "100", "100"},2, 1, Vec2d.of(8, 4), ''); - - PixelPattern R04_09 = of(new String[] {"100", "100", "100"},3, 1, Vec2d.of(9, 4), ''); - - PixelPattern R04_10 = of(new String[] {"010", "100", "100"},3, 2, Vec2d.of(10, 4), ''); - - PixelPattern R04_11 = of(new String[] {"110", "100", "100"},4, 2, Vec2d.of(11, 4), ''); - - PixelPattern R04_12 = of(new String[] {"001", "100", "100"},3, 3, Vec2d.of(12, 4), ''); - - PixelPattern R04_13 = of(new String[] {"101", "100", "100"},4, 3, Vec2d.of(13, 4), ''); - - PixelPattern R04_14 = of(new String[] {"011", "100", "100"},4, 3, Vec2d.of(14, 4), ''); - - PixelPattern R04_15 = of(new String[] {"111", "100", "100"},5, 3, Vec2d.of(15, 4), ''); - - PixelPattern R05_00 = of(new String[] {"000", "010", "100"},2, 2, Vec2d.of(0, 5), ''); - - PixelPattern R05_01 = of(new String[] {"100", "010", "100"},3, 2, Vec2d.of(1, 5), ''); - - PixelPattern R05_02 = of(new String[] {"010", "010", "100"},3, 2, Vec2d.of(2, 5), ''); - - PixelPattern R05_03 = of(new String[] {"110", "010", "100"},4, 2, Vec2d.of(3, 5), ''); - - PixelPattern R05_04 = of(new String[] {"001", "010", "100"},3, 3, Vec2d.of(4, 5), ''); - - PixelPattern R05_05 = of(new String[] {"101", "010", "100"},4, 3, Vec2d.of(5, 5), ''); - - PixelPattern R05_06 = of(new String[] {"011", "010", "100"},4, 3, Vec2d.of(6, 5), ''); - - PixelPattern R05_07 = of(new String[] {"111", "010", "100"},5, 3, Vec2d.of(7, 5), ''); - - PixelPattern R05_08 = of(new String[] {"000", "110", "100"},3, 2, Vec2d.of(8, 5), ''); - - PixelPattern R05_09 = of(new String[] {"100", "110", "100"},4, 2, Vec2d.of(9, 5), ''); - - PixelPattern R05_10 = of(new String[] {"010", "110", "100"},4, 2, Vec2d.of(10, 5), ''); - - PixelPattern R05_11 = of(new String[] {"110", "110", "100"},5, 2, Vec2d.of(11, 5), ''); - - PixelPattern R05_12 = of(new String[] {"001", "110", "100"},4, 3, Vec2d.of(12, 5), ''); - - PixelPattern R05_13 = of(new String[] {"101", "110", "100"},5, 3, Vec2d.of(13, 5), ''); - - PixelPattern R05_14 = of(new String[] {"011", "110", "100"},5, 3, Vec2d.of(14, 5), ''); - - PixelPattern R05_15 = of(new String[] {"111", "110", "100"},6, 3, Vec2d.of(15, 5), ''); - - PixelPattern R06_00 = of(new String[] {"000", "001", "100"},2, 3, Vec2d.of(0, 6), ''); - - PixelPattern R06_01 = of(new String[] {"100", "001", "100"},3, 3, Vec2d.of(1, 6), ''); - - PixelPattern R06_02 = of(new String[] {"010", "001", "100"},3, 3, Vec2d.of(2, 6), ''); - - PixelPattern R06_03 = of(new String[] {"110", "001", "100"},4, 3, Vec2d.of(3, 6), ''); - - PixelPattern R06_04 = of(new String[] {"001", "001", "100"},3, 3, Vec2d.of(4, 6), ''); - - PixelPattern R06_05 = of(new String[] {"101", "001", "100"},4, 3, Vec2d.of(5, 6), ''); - - PixelPattern R06_06 = of(new String[] {"011", "001", "100"},4, 3, Vec2d.of(6, 6), ''); - - PixelPattern R06_07 = of(new String[] {"111", "001", "100"},5, 3, Vec2d.of(7, 6), ''); - - PixelPattern R06_08 = of(new String[] {"000", "101", "100"},3, 3, Vec2d.of(8, 6), ''); - - PixelPattern R06_09 = of(new String[] {"100", "101", "100"},4, 3, Vec2d.of(9, 6), ''); - - PixelPattern R06_10 = of(new String[] {"010", "101", "100"},4, 3, Vec2d.of(10, 6), ''); - - PixelPattern R06_11 = of(new String[] {"110", "101", "100"},5, 3, Vec2d.of(11, 6), ''); - - PixelPattern R06_12 = of(new String[] {"001", "101", "100"},4, 3, Vec2d.of(12, 6), ''); - - PixelPattern R06_13 = of(new String[] {"101", "101", "100"},5, 3, Vec2d.of(13, 6), ''); - - PixelPattern R06_14 = of(new String[] {"011", "101", "100"},5, 3, Vec2d.of(14, 6), ''); - - PixelPattern R06_15 = of(new String[] {"111", "101", "100"},6, 3, Vec2d.of(15, 6), ''); - - PixelPattern R07_00 = of(new String[] {"000", "011", "100"},3, 3, Vec2d.of(0, 7), ''); - - PixelPattern R07_01 = of(new String[] {"100", "011", "100"},4, 3, Vec2d.of(1, 7), ''); - - PixelPattern R07_02 = of(new String[] {"010", "011", "100"},4, 3, Vec2d.of(2, 7), ''); - - PixelPattern R07_03 = of(new String[] {"110", "011", "100"},5, 3, Vec2d.of(3, 7), ''); - - PixelPattern R07_04 = of(new String[] {"001", "011", "100"},4, 3, Vec2d.of(4, 7), ''); - - PixelPattern R07_05 = of(new String[] {"101", "011", "100"},5, 3, Vec2d.of(5, 7), ''); - - PixelPattern R07_06 = of(new String[] {"011", "011", "100"},5, 3, Vec2d.of(6, 7), ''); - - PixelPattern R07_07 = of(new String[] {"111", "011", "100"},6, 3, Vec2d.of(7, 7), ''); - - PixelPattern R07_08 = of(new String[] {"000", "111", "100"},4, 3, Vec2d.of(8, 7), ''); - - PixelPattern R07_09 = of(new String[] {"100", "111", "100"},5, 3, Vec2d.of(9, 7), ''); - - PixelPattern R07_10 = of(new String[] {"010", "111", "100"},5, 3, Vec2d.of(10, 7), ''); - - PixelPattern R07_11 = of(new String[] {"110", "111", "100"},6, 3, Vec2d.of(11, 7), ''); - - PixelPattern R07_12 = of(new String[] {"001", "111", "100"},5, 3, Vec2d.of(12, 7), ''); - - PixelPattern R07_13 = of(new String[] {"101", "111", "100"},6, 3, Vec2d.of(13, 7), ''); - - PixelPattern R07_14 = of(new String[] {"011", "111", "100"},6, 3, Vec2d.of(14, 7), ''); - - PixelPattern R07_15 = of(new String[] {"111", "111", "100"},7, 3, Vec2d.of(15, 7), ''); - - PixelPattern R08_00 = of(new String[] {"000", "000", "010"},1, 1, Vec2d.of(0, 8), ''); - - PixelPattern R08_01 = of(new String[] {"100", "000", "010"},2, 2, Vec2d.of(1, 8), ''); - - PixelPattern R08_02 = of(new String[] {"010", "000", "010"},2, 1, Vec2d.of(2, 8), ''); - - PixelPattern R08_03 = of(new String[] {"110", "000", "010"},3, 2, Vec2d.of(3, 8), ''); - - PixelPattern R08_04 = of(new String[] {"001", "000", "010"},2, 2, Vec2d.of(4, 8), ''); - - PixelPattern R08_05 = of(new String[] {"101", "000", "010"},3, 3, Vec2d.of(5, 8), ''); - - PixelPattern R08_06 = of(new String[] {"011", "000", "010"},3, 2, Vec2d.of(6, 8), ''); - - PixelPattern R08_07 = of(new String[] {"111", "000", "010"},4, 3, Vec2d.of(7, 8), ''); - - PixelPattern R08_08 = of(new String[] {"000", "100", "010"},2, 2, Vec2d.of(8, 8), ''); - - PixelPattern R08_09 = of(new String[] {"100", "100", "010"},3, 2, Vec2d.of(9, 8), ''); - - PixelPattern R08_10 = of(new String[] {"010", "100", "010"},3, 2, Vec2d.of(10, 8), ''); - - PixelPattern R08_11 = of(new String[] {"110", "100", "010"},4, 2, Vec2d.of(11, 8), ''); - - PixelPattern R08_12 = of(new String[] {"001", "100", "010"},3, 3, Vec2d.of(12, 8), ''); - - PixelPattern R08_13 = of(new String[] {"101", "100", "010"},4, 3, Vec2d.of(13, 8), ''); - - PixelPattern R08_14 = of(new String[] {"011", "100", "010"},4, 3, Vec2d.of(14, 8), ''); - - PixelPattern R08_15 = of(new String[] {"111", "100", "010"},5, 3, Vec2d.of(15, 8), ''); - - PixelPattern R09_00 = of(new String[] {"000", "010", "010"},2, 1, Vec2d.of(0, 9), ''); - - PixelPattern R09_01 = of(new String[] {"100", "010", "010"},3, 2, Vec2d.of(1, 9), ''); - - PixelPattern R09_02 = of(new String[] {"010", "010", "010"},3, 1, Vec2d.of(2, 9), ''); - - PixelPattern R09_03 = of(new String[] {"110", "010", "010"},4, 2, Vec2d.of(3, 9), ''); - - PixelPattern R09_04 = of(new String[] {"001", "010", "010"},3, 2, Vec2d.of(4, 9), ''); - - PixelPattern R09_05 = of(new String[] {"101", "010", "010"},4, 3, Vec2d.of(5, 9), ''); - - PixelPattern R09_06 = of(new String[] {"011", "010", "010"},4, 2, Vec2d.of(6, 9), ''); - - PixelPattern R09_07 = of(new String[] {"111", "010", "010"},5, 3, Vec2d.of(7, 9), ''); - - PixelPattern R09_08 = of(new String[] {"000", "110", "010"},3, 2, Vec2d.of(8, 9), ''); - - PixelPattern R09_09 = of(new String[] {"100", "110", "010"},4, 2, Vec2d.of(9, 9), ''); - - PixelPattern R09_10 = of(new String[] {"010", "110", "010"},4, 2, Vec2d.of(10, 9), ''); - - PixelPattern R09_11 = of(new String[] {"110", "110", "010"},5, 2, Vec2d.of(11, 9), ''); - - PixelPattern R09_12 = of(new String[] {"001", "110", "010"},4, 3, Vec2d.of(12, 9), ''); - - PixelPattern R09_13 = of(new String[] {"101", "110", "010"},5, 3, Vec2d.of(13, 9), ''); - - PixelPattern R09_14 = of(new String[] {"011", "110", "010"},5, 3, Vec2d.of(14, 9), ''); - - PixelPattern R09_15 = of(new String[] {"111", "110", "010"},6, 3, Vec2d.of(15, 9), ''); - - PixelPattern R10_00 = of(new String[] {"000", "001", "010"},2, 2, Vec2d.of(0, 10), ''); - - PixelPattern R10_01 = of(new String[] {"100", "001", "010"},3, 3, Vec2d.of(1, 10), ''); - - PixelPattern R10_02 = of(new String[] {"010", "001", "010"},3, 2, Vec2d.of(2, 10), ''); - - PixelPattern R10_03 = of(new String[] {"110", "001", "010"},4, 3, Vec2d.of(3, 10), ''); - - PixelPattern R10_04 = of(new String[] {"001", "001", "010"},3, 2, Vec2d.of(4, 10), ''); - - PixelPattern R10_05 = of(new String[] {"101", "001", "010"},4, 3, Vec2d.of(5, 10), ''); - - PixelPattern R10_06 = of(new String[] {"011", "001", "010"},4, 2, Vec2d.of(6, 10), ''); - - PixelPattern R10_07 = of(new String[] {"111", "001", "010"},5, 3, Vec2d.of(7, 10), ''); - - PixelPattern R10_08 = of(new String[] {"000", "101", "010"},3, 3, Vec2d.of(8, 10), ''); - - PixelPattern R10_09 = of(new String[] {"100", "101", "010"},4, 3, Vec2d.of(9, 10), ''); - - PixelPattern R10_10 = of(new String[] {"010", "101", "010"},4, 3, Vec2d.of(10, 10), ''); - - PixelPattern R10_11 = of(new String[] {"110", "101", "010"},5, 3, Vec2d.of(11, 10), ''); - - PixelPattern R10_12 = of(new String[] {"001", "101", "010"},4, 3, Vec2d.of(12, 10), ''); - - PixelPattern R10_13 = of(new String[] {"101", "101", "010"},5, 3, Vec2d.of(13, 10), ''); - - PixelPattern R10_14 = of(new String[] {"011", "101", "010"},5, 3, Vec2d.of(14, 10), ''); - - PixelPattern R10_15 = of(new String[] {"111", "101", "010"},6, 3, Vec2d.of(15, 10), ''); - - PixelPattern R11_00 = of(new String[] {"000", "011", "010"},3, 2, Vec2d.of(0, 11), ''); - - PixelPattern R11_01 = of(new String[] {"100", "011", "010"},4, 3, Vec2d.of(1, 11), ''); - - PixelPattern R11_02 = of(new String[] {"010", "011", "010"},4, 2, Vec2d.of(2, 11), ''); - - PixelPattern R11_03 = of(new String[] {"110", "011", "010"},5, 3, Vec2d.of(3, 11), ''); - - PixelPattern R11_04 = of(new String[] {"001", "011", "010"},4, 2, Vec2d.of(4, 11), ''); - - PixelPattern R11_05 = of(new String[] {"101", "011", "010"},5, 3, Vec2d.of(5, 11), ''); - - PixelPattern R11_06 = of(new String[] {"011", "011", "010"},5, 2, Vec2d.of(6, 11), ''); - - PixelPattern R11_07 = of(new String[] {"111", "011", "010"},6, 3, Vec2d.of(7, 11), ''); - - PixelPattern R11_08 = of(new String[] {"000", "111", "010"},4, 3, Vec2d.of(8, 11), ''); - - PixelPattern R11_09 = of(new String[] {"100", "111", "010"},5, 3, Vec2d.of(9, 11), ''); - - PixelPattern R11_10 = of(new String[] {"010", "111", "010"},5, 3, Vec2d.of(10, 11), ''); - - PixelPattern R11_11 = of(new String[] {"110", "111", "010"},6, 3, Vec2d.of(11, 11), ''); - - PixelPattern R11_12 = of(new String[] {"001", "111", "010"},5, 3, Vec2d.of(12, 11), ''); - - PixelPattern R11_13 = of(new String[] {"101", "111", "010"},6, 3, Vec2d.of(13, 11), ''); - - PixelPattern R11_14 = of(new String[] {"011", "111", "010"},6, 3, Vec2d.of(14, 11), ''); - - PixelPattern R11_15 = of(new String[] {"111", "111", "010"},7, 3, Vec2d.of(15, 11), ''); - - PixelPattern R12_00 = of(new String[] {"000", "000", "110"},2, 2, Vec2d.of(0, 12), ''); - - PixelPattern R12_01 = of(new String[] {"100", "000", "110"},3, 2, Vec2d.of(1, 12), ''); - - PixelPattern R12_02 = of(new String[] {"010", "000", "110"},3, 2, Vec2d.of(2, 12), ''); - - PixelPattern R12_03 = of(new String[] {"110", "000", "110"},4, 2, Vec2d.of(3, 12), ''); - - PixelPattern R12_04 = of(new String[] {"001", "000", "110"},3, 3, Vec2d.of(4, 12), ''); - - PixelPattern R12_05 = of(new String[] {"101", "000", "110"},4, 3, Vec2d.of(5, 12), ''); - - PixelPattern R12_06 = of(new String[] {"011", "000", "110"},4, 3, Vec2d.of(6, 12), ''); - - PixelPattern R12_07 = of(new String[] {"111", "000", "110"},5, 3, Vec2d.of(7, 12), ''); - - PixelPattern R12_08 = of(new String[] {"000", "100", "110"},3, 2, Vec2d.of(8, 12), ''); - - PixelPattern R12_09 = of(new String[] {"100", "100", "110"},4, 2, Vec2d.of(9, 12), ''); - - PixelPattern R12_10 = of(new String[] {"010", "100", "110"},4, 2, Vec2d.of(10, 12), ''); - - PixelPattern R12_11 = of(new String[] {"110", "100", "110"},5, 2, Vec2d.of(11, 12), ''); - - PixelPattern R12_12 = of(new String[] {"001", "100", "110"},4, 3, Vec2d.of(12, 12), ''); - - PixelPattern R12_13 = of(new String[] {"101", "100", "110"},5, 3, Vec2d.of(13, 12), ''); - - PixelPattern R12_14 = of(new String[] {"011", "100", "110"},5, 3, Vec2d.of(14, 12), ''); - - PixelPattern R12_15 = of(new String[] {"111", "100", "110"},6, 3, Vec2d.of(15, 12), ''); - - PixelPattern R13_00 = of(new String[] {"000", "010", "110"},3, 2, Vec2d.of(0, 13), ''); - - PixelPattern R13_01 = of(new String[] {"100", "010", "110"},4, 2, Vec2d.of(1, 13), ''); - - PixelPattern R13_02 = of(new String[] {"010", "010", "110"},4, 2, Vec2d.of(2, 13), ''); - - PixelPattern R13_03 = of(new String[] {"110", "010", "110"},5, 2, Vec2d.of(3, 13), ''); - - PixelPattern R13_04 = of(new String[] {"001", "010", "110"},4, 3, Vec2d.of(4, 13), ''); - - PixelPattern R13_05 = of(new String[] {"101", "010", "110"},5, 3, Vec2d.of(5, 13), ''); - - PixelPattern R13_06 = of(new String[] {"011", "010", "110"},5, 3, Vec2d.of(6, 13), ''); - - PixelPattern R13_07 = of(new String[] {"111", "010", "110"},6, 3, Vec2d.of(7, 13), ''); - - PixelPattern R13_08 = of(new String[] {"000", "110", "110"},4, 2, Vec2d.of(8, 13), ''); - - PixelPattern R13_09 = of(new String[] {"100", "110", "110"},5, 2, Vec2d.of(9, 13), ''); - - PixelPattern R13_10 = of(new String[] {"010", "110", "110"},5, 2, Vec2d.of(10, 13), ''); - - PixelPattern R13_11 = of(new String[] {"110", "110", "110"},6, 2, Vec2d.of(11, 13), ''); - - PixelPattern R13_12 = of(new String[] {"001", "110", "110"},5, 3, Vec2d.of(12, 13), ''); - - PixelPattern R13_13 = of(new String[] {"101", "110", "110"},6, 3, Vec2d.of(13, 13), ''); - - PixelPattern R13_14 = of(new String[] {"011", "110", "110"},6, 3, Vec2d.of(14, 13), ''); - - PixelPattern R13_15 = of(new String[] {"111", "110", "110"},7, 3, Vec2d.of(15, 13), ''); - - PixelPattern R14_00 = of(new String[] {"000", "001", "110"},3, 3, Vec2d.of(0, 14), ''); - - PixelPattern R14_01 = of(new String[] {"100", "001", "110"},4, 3, Vec2d.of(1, 14), ''); - - PixelPattern R14_02 = of(new String[] {"010", "001", "110"},4, 3, Vec2d.of(2, 14), ''); - - PixelPattern R14_03 = of(new String[] {"110", "001", "110"},5, 3, Vec2d.of(3, 14), ''); - - PixelPattern R14_04 = of(new String[] {"001", "001", "110"},4, 3, Vec2d.of(4, 14), ''); - - PixelPattern R14_05 = of(new String[] {"101", "001", "110"},5, 3, Vec2d.of(5, 14), ''); - - PixelPattern R14_06 = of(new String[] {"011", "001", "110"},5, 3, Vec2d.of(6, 14), ''); - - PixelPattern R14_07 = of(new String[] {"111", "001", "110"},6, 3, Vec2d.of(7, 14), ''); - - PixelPattern R14_08 = of(new String[] {"000", "101", "110"},4, 3, Vec2d.of(8, 14), ''); - - PixelPattern R14_09 = of(new String[] {"100", "101", "110"},5, 3, Vec2d.of(9, 14), ''); - - PixelPattern R14_10 = of(new String[] {"010", "101", "110"},5, 3, Vec2d.of(10, 14), ''); - - PixelPattern R14_11 = of(new String[] {"110", "101", "110"},6, 3, Vec2d.of(11, 14), ''); - - PixelPattern R14_12 = of(new String[] {"001", "101", "110"},5, 3, Vec2d.of(12, 14), ''); - - PixelPattern R14_13 = of(new String[] {"101", "101", "110"},6, 3, Vec2d.of(13, 14), ''); - - PixelPattern R14_14 = of(new String[] {"011", "101", "110"},6, 3, Vec2d.of(14, 14), ''); - - PixelPattern R14_15 = of(new String[] {"111", "101", "110"},7, 3, Vec2d.of(15, 14), ''); - - PixelPattern R15_00 = of(new String[] {"000", "011", "110"},4, 3, Vec2d.of(0, 15), ''); - - PixelPattern R15_01 = of(new String[] {"100", "011", "110"},5, 3, Vec2d.of(1, 15), ''); - - PixelPattern R15_02 = of(new String[] {"010", "011", "110"},5, 3, Vec2d.of(2, 15), ''); - - PixelPattern R15_03 = of(new String[] {"110", "011", "110"},6, 3, Vec2d.of(3, 15), ''); - - PixelPattern R15_04 = of(new String[] {"001", "011", "110"},5, 3, Vec2d.of(4, 15), ''); - - PixelPattern R15_05 = of(new String[] {"101", "011", "110"},6, 3, Vec2d.of(5, 15), ''); - - PixelPattern R15_06 = of(new String[] {"011", "011", "110"},6, 3, Vec2d.of(6, 15), ''); - - PixelPattern R15_07 = of(new String[] {"111", "011", "110"},7, 3, Vec2d.of(7, 15), ''); - - PixelPattern R15_08 = of(new String[] {"000", "111", "110"},5, 3, Vec2d.of(8, 15), ''); - - PixelPattern R15_09 = of(new String[] {"100", "111", "110"},6, 3, Vec2d.of(9, 15), ''); - - PixelPattern R15_10 = of(new String[] {"010", "111", "110"},6, 3, Vec2d.of(10, 15), ''); - - PixelPattern R15_11 = of(new String[] {"110", "111", "110"},7, 3, Vec2d.of(11, 15), ''); - - PixelPattern R15_12 = of(new String[] {"001", "111", "110"},6, 3, Vec2d.of(12, 15), ''); - - PixelPattern R15_13 = of(new String[] {"101", "111", "110"},7, 3, Vec2d.of(13, 15), ''); - - PixelPattern R15_14 = of(new String[] {"011", "111", "110"},7, 3, Vec2d.of(14, 15), ''); - - PixelPattern R15_15 = of(new String[] {"111", "111", "110"},8, 3, Vec2d.of(15, 15), ''); - - PixelPattern R16_00 = of(new String[] {"000", "000", "001"},1, 1, Vec2d.of(0, 16), ''); - - PixelPattern R16_01 = of(new String[] {"100", "000", "001"},2, 3, Vec2d.of(1, 16), ''); - - PixelPattern R16_02 = of(new String[] {"010", "000", "001"},2, 2, Vec2d.of(2, 16), ''); - - PixelPattern R16_03 = of(new String[] {"110", "000", "001"},3, 3, Vec2d.of(3, 16), ''); - - PixelPattern R16_04 = of(new String[] {"001", "000", "001"},2, 1, Vec2d.of(4, 16), ''); - - PixelPattern R16_05 = of(new String[] {"101", "000", "001"},3, 3, Vec2d.of(5, 16), ''); - - PixelPattern R16_06 = of(new String[] {"011", "000", "001"},3, 2, Vec2d.of(6, 16), ''); - - PixelPattern R16_07 = of(new String[] {"111", "000", "001"},4, 3, Vec2d.of(7, 16), ''); - - PixelPattern R16_08 = of(new String[] {"000", "100", "001"},2, 3, Vec2d.of(8, 16), ''); - - PixelPattern R16_09 = of(new String[] {"100", "100", "001"},3, 3, Vec2d.of(9, 16), ''); - - PixelPattern R16_10 = of(new String[] {"010", "100", "001"},3, 3, Vec2d.of(10, 16), ''); - - PixelPattern R16_11 = of(new String[] {"110", "100", "001"},4, 3, Vec2d.of(11, 16), ''); - - PixelPattern R16_12 = of(new String[] {"001", "100", "001"},3, 3, Vec2d.of(12, 16), ''); - - PixelPattern R16_13 = of(new String[] {"101", "100", "001"},4, 3, Vec2d.of(13, 16), ''); - - PixelPattern R16_14 = of(new String[] {"011", "100", "001"},4, 3, Vec2d.of(14, 16), ''); - - PixelPattern R16_15 = of(new String[] {"111", "100", "001"},5, 3, Vec2d.of(15, 16), ''); - - PixelPattern R17_00 = of(new String[] {"000", "010", "001"},2, 2, Vec2d.of(0, 17), ''); - - PixelPattern R17_01 = of(new String[] {"100", "010", "001"},3, 3, Vec2d.of(1, 17), ''); - - PixelPattern R17_02 = of(new String[] {"010", "010", "001"},3, 2, Vec2d.of(2, 17), ''); - - PixelPattern R17_03 = of(new String[] {"110", "010", "001"},4, 3, Vec2d.of(3, 17), ''); - - PixelPattern R17_04 = of(new String[] {"001", "010", "001"},3, 2, Vec2d.of(4, 17), ''); - - PixelPattern R17_05 = of(new String[] {"101", "010", "001"},4, 3, Vec2d.of(5, 17), ''); - - PixelPattern R17_06 = of(new String[] {"011", "010", "001"},4, 2, Vec2d.of(6, 17), ''); - - PixelPattern R17_07 = of(new String[] {"111", "010", "001"},5, 3, Vec2d.of(7, 17), ''); - - PixelPattern R17_08 = of(new String[] {"000", "110", "001"},3, 3, Vec2d.of(8, 17), ''); - - PixelPattern R17_09 = of(new String[] {"100", "110", "001"},4, 3, Vec2d.of(9, 17), ''); - - PixelPattern R17_10 = of(new String[] {"010", "110", "001"},4, 3, Vec2d.of(10, 17), ''); - - PixelPattern R17_11 = of(new String[] {"110", "110", "001"},5, 3, Vec2d.of(11, 17), ''); - - PixelPattern R17_12 = of(new String[] {"001", "110", "001"},4, 3, Vec2d.of(12, 17), ''); - - PixelPattern R17_13 = of(new String[] {"101", "110", "001"},5, 3, Vec2d.of(13, 17), ''); - - PixelPattern R17_14 = of(new String[] {"011", "110", "001"},5, 3, Vec2d.of(14, 17), ''); - - PixelPattern R17_15 = of(new String[] {"111", "110", "001"},6, 3, Vec2d.of(15, 17), ''); - - PixelPattern R18_00 = of(new String[] {"000", "001", "001"},2, 1, Vec2d.of(0, 18), ''); - - PixelPattern R18_01 = of(new String[] {"100", "001", "001"},3, 3, Vec2d.of(1, 18), ''); - - PixelPattern R18_02 = of(new String[] {"010", "001", "001"},3, 2, Vec2d.of(2, 18), ''); - - PixelPattern R18_03 = of(new String[] {"110", "001", "001"},4, 3, Vec2d.of(3, 18), ''); - - PixelPattern R18_04 = of(new String[] {"001", "001", "001"},3, 1, Vec2d.of(4, 18), ''); - - PixelPattern R18_05 = of(new String[] {"101", "001", "001"},4, 3, Vec2d.of(5, 18), ''); - - PixelPattern R18_06 = of(new String[] {"011", "001", "001"},4, 2, Vec2d.of(6, 18), ''); - - PixelPattern R18_07 = of(new String[] {"111", "001", "001"},5, 3, Vec2d.of(7, 18), ''); - - PixelPattern R18_08 = of(new String[] {"000", "101", "001"},3, 3, Vec2d.of(8, 18), ''); - - PixelPattern R18_09 = of(new String[] {"100", "101", "001"},4, 3, Vec2d.of(9, 18), ''); - - PixelPattern R18_10 = of(new String[] {"010", "101", "001"},4, 3, Vec2d.of(10, 18), ''); - - PixelPattern R18_11 = of(new String[] {"110", "101", "001"},5, 3, Vec2d.of(11, 18), ''); - - PixelPattern R18_12 = of(new String[] {"001", "101", "001"},4, 3, Vec2d.of(12, 18), ''); - - PixelPattern R18_13 = of(new String[] {"101", "101", "001"},5, 3, Vec2d.of(13, 18), ''); - - PixelPattern R18_14 = of(new String[] {"011", "101", "001"},5, 3, Vec2d.of(14, 18), ''); - - PixelPattern R18_15 = of(new String[] {"111", "101", "001"},6, 3, Vec2d.of(15, 18), ''); - - PixelPattern R19_00 = of(new String[] {"000", "011", "001"},3, 2, Vec2d.of(0, 19), ''); - - PixelPattern R19_01 = of(new String[] {"100", "011", "001"},4, 3, Vec2d.of(1, 19), ''); - - PixelPattern R19_02 = of(new String[] {"010", "011", "001"},4, 2, Vec2d.of(2, 19), ''); - - PixelPattern R19_03 = of(new String[] {"110", "011", "001"},5, 3, Vec2d.of(3, 19), ''); - - PixelPattern R19_04 = of(new String[] {"001", "011", "001"},4, 2, Vec2d.of(4, 19), ''); - - PixelPattern R19_05 = of(new String[] {"101", "011", "001"},5, 3, Vec2d.of(5, 19), ''); - - PixelPattern R19_06 = of(new String[] {"011", "011", "001"},5, 2, Vec2d.of(6, 19), ''); - - PixelPattern R19_07 = of(new String[] {"111", "011", "001"},6, 3, Vec2d.of(7, 19), ''); - - PixelPattern R19_08 = of(new String[] {"000", "111", "001"},4, 3, Vec2d.of(8, 19), ''); - - PixelPattern R19_09 = of(new String[] {"100", "111", "001"},5, 3, Vec2d.of(9, 19), ''); - - PixelPattern R19_10 = of(new String[] {"010", "111", "001"},5, 3, Vec2d.of(10, 19), ''); - - PixelPattern R19_11 = of(new String[] {"110", "111", "001"},6, 3, Vec2d.of(11, 19), ''); - - PixelPattern R19_12 = of(new String[] {"001", "111", "001"},5, 3, Vec2d.of(12, 19), ''); - - PixelPattern R19_13 = of(new String[] {"101", "111", "001"},6, 3, Vec2d.of(13, 19), ''); - - PixelPattern R19_14 = of(new String[] {"011", "111", "001"},6, 3, Vec2d.of(14, 19), ''); - - PixelPattern R19_15 = of(new String[] {"111", "111", "001"},7, 3, Vec2d.of(15, 19), ''); - - PixelPattern R20_00 = of(new String[] {"000", "000", "101"},2, 3, Vec2d.of(0, 20), ''); - - PixelPattern R20_01 = of(new String[] {"100", "000", "101"},3, 3, Vec2d.of(1, 20), ''); - - PixelPattern R20_02 = of(new String[] {"010", "000", "101"},3, 3, Vec2d.of(2, 20), ''); - - PixelPattern R20_03 = of(new String[] {"110", "000", "101"},4, 3, Vec2d.of(3, 20), ''); - - PixelPattern R20_04 = of(new String[] {"001", "000", "101"},3, 3, Vec2d.of(4, 20), ''); - - PixelPattern R20_05 = of(new String[] {"101", "000", "101"},4, 3, Vec2d.of(5, 20), ''); - - PixelPattern R20_06 = of(new String[] {"011", "000", "101"},4, 3, Vec2d.of(6, 20), ''); - - PixelPattern R20_07 = of(new String[] {"111", "000", "101"},5, 3, Vec2d.of(7, 20), ''); - - PixelPattern R20_08 = of(new String[] {"000", "100", "101"},3, 3, Vec2d.of(8, 20), ''); - - PixelPattern R20_09 = of(new String[] {"100", "100", "101"},4, 3, Vec2d.of(9, 20), ''); - - PixelPattern R20_10 = of(new String[] {"010", "100", "101"},4, 3, Vec2d.of(10, 20), ''); - - PixelPattern R20_11 = of(new String[] {"110", "100", "101"},5, 3, Vec2d.of(11, 20), ''); - - PixelPattern R20_12 = of(new String[] {"001", "100", "101"},4, 3, Vec2d.of(12, 20), ''); - - PixelPattern R20_13 = of(new String[] {"101", "100", "101"},5, 3, Vec2d.of(13, 20), ''); - - PixelPattern R20_14 = of(new String[] {"011", "100", "101"},5, 3, Vec2d.of(14, 20), ''); - - PixelPattern R20_15 = of(new String[] {"111", "100", "101"},6, 3, Vec2d.of(15, 20), ''); - - PixelPattern R21_00 = of(new String[] {"000", "010", "101"},3, 3, Vec2d.of(0, 21), ''); - - PixelPattern R21_01 = of(new String[] {"100", "010", "101"},4, 3, Vec2d.of(1, 21), ''); - - PixelPattern R21_02 = of(new String[] {"010", "010", "101"},4, 3, Vec2d.of(2, 21), ''); - - PixelPattern R21_03 = of(new String[] {"110", "010", "101"},5, 3, Vec2d.of(3, 21), ''); - - PixelPattern R21_04 = of(new String[] {"001", "010", "101"},4, 3, Vec2d.of(4, 21), ''); - - PixelPattern R21_05 = of(new String[] {"101", "010", "101"},5, 3, Vec2d.of(5, 21), ''); - - PixelPattern R21_06 = of(new String[] {"011", "010", "101"},5, 3, Vec2d.of(6, 21), ''); - - PixelPattern R21_07 = of(new String[] {"111", "010", "101"},6, 3, Vec2d.of(7, 21), ''); - - PixelPattern R21_08 = of(new String[] {"000", "110", "101"},4, 3, Vec2d.of(8, 21), ''); - - PixelPattern R21_09 = of(new String[] {"100", "110", "101"},5, 3, Vec2d.of(9, 21), ''); - - PixelPattern R21_10 = of(new String[] {"010", "110", "101"},5, 3, Vec2d.of(10, 21), ''); - - PixelPattern R21_11 = of(new String[] {"110", "110", "101"},6, 3, Vec2d.of(11, 21), ''); - - PixelPattern R21_12 = of(new String[] {"001", "110", "101"},5, 3, Vec2d.of(12, 21), ''); - - PixelPattern R21_13 = of(new String[] {"101", "110", "101"},6, 3, Vec2d.of(13, 21), ''); - - PixelPattern R21_14 = of(new String[] {"011", "110", "101"},6, 3, Vec2d.of(14, 21), ''); - - PixelPattern R21_15 = of(new String[] {"111", "110", "101"},7, 3, Vec2d.of(15, 21), ''); - - PixelPattern R22_00 = of(new String[] {"000", "001", "101"},3, 3, Vec2d.of(0, 22), ''); - - PixelPattern R22_01 = of(new String[] {"100", "001", "101"},4, 3, Vec2d.of(1, 22), ''); - - PixelPattern R22_02 = of(new String[] {"010", "001", "101"},4, 3, Vec2d.of(2, 22), ''); - - PixelPattern R22_03 = of(new String[] {"110", "001", "101"},5, 3, Vec2d.of(3, 22), ''); - - PixelPattern R22_04 = of(new String[] {"001", "001", "101"},4, 3, Vec2d.of(4, 22), ''); - - PixelPattern R22_05 = of(new String[] {"101", "001", "101"},5, 3, Vec2d.of(5, 22), ''); - - PixelPattern R22_06 = of(new String[] {"011", "001", "101"},5, 3, Vec2d.of(6, 22), ''); - - PixelPattern R22_07 = of(new String[] {"111", "001", "101"},6, 3, Vec2d.of(7, 22), ''); - - PixelPattern R22_08 = of(new String[] {"000", "101", "101"},4, 3, Vec2d.of(8, 22), ''); - - PixelPattern R22_09 = of(new String[] {"100", "101", "101"},5, 3, Vec2d.of(9, 22), ''); - - PixelPattern R22_10 = of(new String[] {"010", "101", "101"},5, 3, Vec2d.of(10, 22), ''); - - PixelPattern R22_11 = of(new String[] {"110", "101", "101"},6, 3, Vec2d.of(11, 22), ''); - - PixelPattern R22_12 = of(new String[] {"001", "101", "101"},5, 3, Vec2d.of(12, 22), ''); - - PixelPattern R22_13 = of(new String[] {"101", "101", "101"},6, 3, Vec2d.of(13, 22), ''); - - PixelPattern R22_14 = of(new String[] {"011", "101", "101"},6, 3, Vec2d.of(14, 22), ''); - - PixelPattern R22_15 = of(new String[] {"111", "101", "101"},7, 3, Vec2d.of(15, 22), ''); - - PixelPattern R23_00 = of(new String[] {"000", "011", "101"},4, 3, Vec2d.of(0, 23), ''); - - PixelPattern R23_01 = of(new String[] {"100", "011", "101"},5, 3, Vec2d.of(1, 23), ''); - - PixelPattern R23_02 = of(new String[] {"010", "011", "101"},5, 3, Vec2d.of(2, 23), ''); - - PixelPattern R23_03 = of(new String[] {"110", "011", "101"},6, 3, Vec2d.of(3, 23), ''); - - PixelPattern R23_04 = of(new String[] {"001", "011", "101"},5, 3, Vec2d.of(4, 23), ''); - - PixelPattern R23_05 = of(new String[] {"101", "011", "101"},6, 3, Vec2d.of(5, 23), ''); - - PixelPattern R23_06 = of(new String[] {"011", "011", "101"},6, 3, Vec2d.of(6, 23), ''); - - PixelPattern R23_07 = of(new String[] {"111", "011", "101"},7, 3, Vec2d.of(7, 23), ''); - - PixelPattern R23_08 = of(new String[] {"000", "111", "101"},5, 3, Vec2d.of(8, 23), ''); - - PixelPattern R23_09 = of(new String[] {"100", "111", "101"},6, 3, Vec2d.of(9, 23), ''); - - PixelPattern R23_10 = of(new String[] {"010", "111", "101"},6, 3, Vec2d.of(10, 23), ''); - - PixelPattern R23_11 = of(new String[] {"110", "111", "101"},7, 3, Vec2d.of(11, 23), ''); - - PixelPattern R23_12 = of(new String[] {"001", "111", "101"},6, 3, Vec2d.of(12, 23), ''); - - PixelPattern R23_13 = of(new String[] {"101", "111", "101"},7, 3, Vec2d.of(13, 23), ''); - - PixelPattern R23_14 = of(new String[] {"011", "111", "101"},7, 3, Vec2d.of(14, 23), ''); - - PixelPattern R23_15 = of(new String[] {"111", "111", "101"},8, 3, Vec2d.of(15, 23), ''); - - PixelPattern R24_00 = of(new String[] {"000", "000", "011"},2, 2, Vec2d.of(0, 24), ''); - - PixelPattern R24_01 = of(new String[] {"100", "000", "011"},3, 3, Vec2d.of(1, 24), ''); - - PixelPattern R24_02 = of(new String[] {"010", "000", "011"},3, 2, Vec2d.of(2, 24), ''); - - PixelPattern R24_03 = of(new String[] {"110", "000", "011"},4, 3, Vec2d.of(3, 24), ''); - - PixelPattern R24_04 = of(new String[] {"001", "000", "011"},3, 2, Vec2d.of(4, 24), ''); - - PixelPattern R24_05 = of(new String[] {"101", "000", "011"},4, 3, Vec2d.of(5, 24), ''); - - PixelPattern R24_06 = of(new String[] {"011", "000", "011"},4, 2, Vec2d.of(6, 24), ''); - - PixelPattern R24_07 = of(new String[] {"111", "000", "011"},5, 3, Vec2d.of(7, 24), ''); - - PixelPattern R24_08 = of(new String[] {"000", "100", "011"},3, 3, Vec2d.of(8, 24), ''); - - PixelPattern R24_09 = of(new String[] {"100", "100", "011"},4, 3, Vec2d.of(9, 24), ''); - - PixelPattern R24_10 = of(new String[] {"010", "100", "011"},4, 3, Vec2d.of(10, 24), ''); - - PixelPattern R24_11 = of(new String[] {"110", "100", "011"},5, 3, Vec2d.of(11, 24), ''); - - PixelPattern R24_12 = of(new String[] {"001", "100", "011"},4, 3, Vec2d.of(12, 24), ''); - - PixelPattern R24_13 = of(new String[] {"101", "100", "011"},5, 3, Vec2d.of(13, 24), ''); - - PixelPattern R24_14 = of(new String[] {"011", "100", "011"},5, 3, Vec2d.of(14, 24), ''); - - PixelPattern R24_15 = of(new String[] {"111", "100", "011"},6, 3, Vec2d.of(15, 24), ''); - - PixelPattern R25_00 = of(new String[] {"000", "010", "011"},3, 2, Vec2d.of(0, 25), ''); - - PixelPattern R25_01 = of(new String[] {"100", "010", "011"},4, 3, Vec2d.of(1, 25), ''); - - PixelPattern R25_02 = of(new String[] {"010", "010", "011"},4, 2, Vec2d.of(2, 25), ''); - - PixelPattern R25_03 = of(new String[] {"110", "010", "011"},5, 3, Vec2d.of(3, 25), ''); - - PixelPattern R25_04 = of(new String[] {"001", "010", "011"},4, 2, Vec2d.of(4, 25), ''); - - PixelPattern R25_05 = of(new String[] {"101", "010", "011"},5, 3, Vec2d.of(5, 25), ''); - - PixelPattern R25_06 = of(new String[] {"011", "010", "011"},5, 2, Vec2d.of(6, 25), ''); - - PixelPattern R25_07 = of(new String[] {"111", "010", "011"},6, 3, Vec2d.of(7, 25), ''); - - PixelPattern R25_08 = of(new String[] {"000", "110", "011"},4, 3, Vec2d.of(8, 25), ''); - - PixelPattern R25_09 = of(new String[] {"100", "110", "011"},5, 3, Vec2d.of(9, 25), ''); - - PixelPattern R25_10 = of(new String[] {"010", "110", "011"},5, 3, Vec2d.of(10, 25), ''); - - PixelPattern R25_11 = of(new String[] {"110", "110", "011"},6, 3, Vec2d.of(11, 25), ''); - - PixelPattern R25_12 = of(new String[] {"001", "110", "011"},5, 3, Vec2d.of(12, 25), ''); - - PixelPattern R25_13 = of(new String[] {"101", "110", "011"},6, 3, Vec2d.of(13, 25), ''); - - PixelPattern R25_14 = of(new String[] {"011", "110", "011"},6, 3, Vec2d.of(14, 25), ''); - - PixelPattern R25_15 = of(new String[] {"111", "110", "011"},7, 3, Vec2d.of(15, 25), ''); - - PixelPattern R26_00 = of(new String[] {"000", "001", "011"},3, 2, Vec2d.of(0, 26), ''); - - PixelPattern R26_01 = of(new String[] {"100", "001", "011"},4, 3, Vec2d.of(1, 26), ''); - - PixelPattern R26_02 = of(new String[] {"010", "001", "011"},4, 2, Vec2d.of(2, 26), ''); - - PixelPattern R26_03 = of(new String[] {"110", "001", "011"},5, 3, Vec2d.of(3, 26), ''); - - PixelPattern R26_04 = of(new String[] {"001", "001", "011"},4, 2, Vec2d.of(4, 26), ''); - - PixelPattern R26_05 = of(new String[] {"101", "001", "011"},5, 3, Vec2d.of(5, 26), ''); - - PixelPattern R26_06 = of(new String[] {"011", "001", "011"},5, 2, Vec2d.of(6, 26), ''); - - PixelPattern R26_07 = of(new String[] {"111", "001", "011"},6, 3, Vec2d.of(7, 26), ''); - - PixelPattern R26_08 = of(new String[] {"000", "101", "011"},4, 3, Vec2d.of(8, 26), ''); - - PixelPattern R26_09 = of(new String[] {"100", "101", "011"},5, 3, Vec2d.of(9, 26), ''); - - PixelPattern R26_10 = of(new String[] {"010", "101", "011"},5, 3, Vec2d.of(10, 26), ''); - - PixelPattern R26_11 = of(new String[] {"110", "101", "011"},6, 3, Vec2d.of(11, 26), ''); - - PixelPattern R26_12 = of(new String[] {"001", "101", "011"},5, 3, Vec2d.of(12, 26), ''); - - PixelPattern R26_13 = of(new String[] {"101", "101", "011"},6, 3, Vec2d.of(13, 26), ''); - - PixelPattern R26_14 = of(new String[] {"011", "101", "011"},6, 3, Vec2d.of(14, 26), ''); - - PixelPattern R26_15 = of(new String[] {"111", "101", "011"},7, 3, Vec2d.of(15, 26), ''); - - PixelPattern R27_00 = of(new String[] {"000", "011", "011"},4, 2, Vec2d.of(0, 27), ''); - - PixelPattern R27_01 = of(new String[] {"100", "011", "011"},5, 3, Vec2d.of(1, 27), ''); - - PixelPattern R27_02 = of(new String[] {"010", "011", "011"},5, 2, Vec2d.of(2, 27), ''); - - PixelPattern R27_03 = of(new String[] {"110", "011", "011"},6, 3, Vec2d.of(3, 27), ''); - - PixelPattern R27_04 = of(new String[] {"001", "011", "011"},5, 2, Vec2d.of(4, 27), ''); - - PixelPattern R27_05 = of(new String[] {"101", "011", "011"},6, 3, Vec2d.of(5, 27), ''); - - PixelPattern R27_06 = of(new String[] {"011", "011", "011"},6, 2, Vec2d.of(6, 27), ''); - - PixelPattern R27_07 = of(new String[] {"111", "011", "011"},7, 3, Vec2d.of(7, 27), ''); - - PixelPattern R27_08 = of(new String[] {"000", "111", "011"},5, 3, Vec2d.of(8, 27), ''); - - PixelPattern R27_09 = of(new String[] {"100", "111", "011"},6, 3, Vec2d.of(9, 27), ''); - - PixelPattern R27_10 = of(new String[] {"010", "111", "011"},6, 3, Vec2d.of(10, 27), ''); - - PixelPattern R27_11 = of(new String[] {"110", "111", "011"},7, 3, Vec2d.of(11, 27), ''); - - PixelPattern R27_12 = of(new String[] {"001", "111", "011"},6, 3, Vec2d.of(12, 27), ''); - - PixelPattern R27_13 = of(new String[] {"101", "111", "011"},7, 3, Vec2d.of(13, 27), ''); - - PixelPattern R27_14 = of(new String[] {"011", "111", "011"},7, 3, Vec2d.of(14, 27), ''); - - PixelPattern R27_15 = of(new String[] {"111", "111", "011"},8, 3, Vec2d.of(15, 27), ''); - - PixelPattern R28_00 = of(new String[] {"000", "000", "111"},3, 3, Vec2d.of(0, 28), ''); - - PixelPattern R28_01 = of(new String[] {"100", "000", "111"},4, 3, Vec2d.of(1, 28), ''); - - PixelPattern R28_02 = of(new String[] {"010", "000", "111"},4, 3, Vec2d.of(2, 28), ''); - - PixelPattern R28_03 = of(new String[] {"110", "000", "111"},5, 3, Vec2d.of(3, 28), ''); - - PixelPattern R28_04 = of(new String[] {"001", "000", "111"},4, 3, Vec2d.of(4, 28), ''); - - PixelPattern R28_05 = of(new String[] {"101", "000", "111"},5, 3, Vec2d.of(5, 28), ''); - - PixelPattern R28_06 = of(new String[] {"011", "000", "111"},5, 3, Vec2d.of(6, 28), ''); - - PixelPattern R28_07 = of(new String[] {"111", "000", "111"},6, 3, Vec2d.of(7, 28), ''); - - PixelPattern R28_08 = of(new String[] {"000", "100", "111"},4, 3, Vec2d.of(8, 28), ''); - - PixelPattern R28_09 = of(new String[] {"100", "100", "111"},5, 3, Vec2d.of(9, 28), ''); - - PixelPattern R28_10 = of(new String[] {"010", "100", "111"},5, 3, Vec2d.of(10, 28), ''); - - PixelPattern R28_11 = of(new String[] {"110", "100", "111"},6, 3, Vec2d.of(11, 28), ''); - - PixelPattern R28_12 = of(new String[] {"001", "100", "111"},5, 3, Vec2d.of(12, 28), ''); - - PixelPattern R28_13 = of(new String[] {"101", "100", "111"},6, 3, Vec2d.of(13, 28), ''); - - PixelPattern R28_14 = of(new String[] {"011", "100", "111"},6, 3, Vec2d.of(14, 28), ''); - - PixelPattern R28_15 = of(new String[] {"111", "100", "111"},7, 3, Vec2d.of(15, 28), ''); - - PixelPattern R29_00 = of(new String[] {"000", "010", "111"},4, 3, Vec2d.of(0, 29), ''); - - PixelPattern R29_01 = of(new String[] {"100", "010", "111"},5, 3, Vec2d.of(1, 29), ''); - - PixelPattern R29_02 = of(new String[] {"010", "010", "111"},5, 3, Vec2d.of(2, 29), ''); - - PixelPattern R29_03 = of(new String[] {"110", "010", "111"},6, 3, Vec2d.of(3, 29), ''); - - PixelPattern R29_04 = of(new String[] {"001", "010", "111"},5, 3, Vec2d.of(4, 29), ''); - - PixelPattern R29_05 = of(new String[] {"101", "010", "111"},6, 3, Vec2d.of(5, 29), ''); - - PixelPattern R29_06 = of(new String[] {"011", "010", "111"},6, 3, Vec2d.of(6, 29), ''); - - PixelPattern R29_07 = of(new String[] {"111", "010", "111"},7, 3, Vec2d.of(7, 29), ''); - - PixelPattern R29_08 = of(new String[] {"000", "110", "111"},5, 3, Vec2d.of(8, 29), ''); - - PixelPattern R29_09 = of(new String[] {"100", "110", "111"},6, 3, Vec2d.of(9, 29), ''); - - PixelPattern R29_10 = of(new String[] {"010", "110", "111"},6, 3, Vec2d.of(10, 29), ''); - - PixelPattern R29_11 = of(new String[] {"110", "110", "111"},7, 3, Vec2d.of(11, 29), ''); - - PixelPattern R29_12 = of(new String[] {"001", "110", "111"},6, 3, Vec2d.of(12, 29), ''); - - PixelPattern R29_13 = of(new String[] {"101", "110", "111"},7, 3, Vec2d.of(13, 29), ''); - - PixelPattern R29_14 = of(new String[] {"011", "110", "111"},7, 3, Vec2d.of(14, 29), ''); - - PixelPattern R29_15 = of(new String[] {"111", "110", "111"},8, 3, Vec2d.of(15, 29), ''); - - PixelPattern R30_00 = of(new String[] {"000", "001", "111"},4, 3, Vec2d.of(0, 30), ''); - - PixelPattern R30_01 = of(new String[] {"100", "001", "111"},5, 3, Vec2d.of(1, 30), ''); - - PixelPattern R30_02 = of(new String[] {"010", "001", "111"},5, 3, Vec2d.of(2, 30), ''); - - PixelPattern R30_03 = of(new String[] {"110", "001", "111"},6, 3, Vec2d.of(3, 30), ''); - - PixelPattern R30_04 = of(new String[] {"001", "001", "111"},5, 3, Vec2d.of(4, 30), ''); - - PixelPattern R30_05 = of(new String[] {"101", "001", "111"},6, 3, Vec2d.of(5, 30), ''); - - PixelPattern R30_06 = of(new String[] {"011", "001", "111"},6, 3, Vec2d.of(6, 30), ''); - - PixelPattern R30_07 = of(new String[] {"111", "001", "111"},7, 3, Vec2d.of(7, 30), ''); - - PixelPattern R30_08 = of(new String[] {"000", "101", "111"},5, 3, Vec2d.of(8, 30), ''); - - PixelPattern R30_09 = of(new String[] {"100", "101", "111"},6, 3, Vec2d.of(9, 30), ''); - - PixelPattern R30_10 = of(new String[] {"010", "101", "111"},6, 3, Vec2d.of(10, 30), ''); - - PixelPattern R30_11 = of(new String[] {"110", "101", "111"},7, 3, Vec2d.of(11, 30), ''); - - PixelPattern R30_12 = of(new String[] {"001", "101", "111"},6, 3, Vec2d.of(12, 30), ''); - - PixelPattern R30_13 = of(new String[] {"101", "101", "111"},7, 3, Vec2d.of(13, 30), ''); - - PixelPattern R30_14 = of(new String[] {"011", "101", "111"},7, 3, Vec2d.of(14, 30), ''); - - PixelPattern R30_15 = of(new String[] {"111", "101", "111"},8, 3, Vec2d.of(15, 30), ''); - - PixelPattern R31_00 = of(new String[] {"000", "011", "111"},5, 3, Vec2d.of(0, 31), ''); - - PixelPattern R31_01 = of(new String[] {"100", "011", "111"},6, 3, Vec2d.of(1, 31), ''); - - PixelPattern R31_02 = of(new String[] {"010", "011", "111"},6, 3, Vec2d.of(2, 31), ''); - - PixelPattern R31_03 = of(new String[] {"110", "011", "111"},7, 3, Vec2d.of(3, 31), ''); - - PixelPattern R31_04 = of(new String[] {"001", "011", "111"},6, 3, Vec2d.of(4, 31), ''); - - PixelPattern R31_05 = of(new String[] {"101", "011", "111"},7, 3, Vec2d.of(5, 31), ''); - - PixelPattern R31_06 = of(new String[] {"011", "011", "111"},7, 3, Vec2d.of(6, 31), ''); - - PixelPattern R31_07 = of(new String[] {"111", "011", "111"},8, 3, Vec2d.of(7, 31), ''); - - PixelPattern R31_08 = of(new String[] {"000", "111", "111"},6, 3, Vec2d.of(8, 31), ''); - - PixelPattern R31_09 = of(new String[] {"100", "111", "111"},7, 3, Vec2d.of(9, 31), ''); - - PixelPattern R31_10 = of(new String[] {"010", "111", "111"},7, 3, Vec2d.of(10, 31), ''); - - PixelPattern R31_11 = of(new String[] {"110", "111", "111"},8, 3, Vec2d.of(11, 31), ''); - - PixelPattern R31_12 = of(new String[] {"001", "111", "111"},7, 3, Vec2d.of(12, 31), ''); - - PixelPattern R31_13 = of(new String[] {"101", "111", "111"},8, 3, Vec2d.of(13, 31), ''); - - PixelPattern R31_14 = of(new String[] {"011", "111", "111"},8, 3, Vec2d.of(14, 31), ''); - - PixelPattern R31_15 = of(new String[] {"111", "111", "111"},9, 3, Vec2d.of(15, 31), ''); - - static class DummyStatic { - public static final Map VALUES = new HashMap<>(); - - - static { - VALUES.put("000100100", R04_08); - VALUES.put("011010110", R13_06); - VALUES.put("000100101", R20_08); - VALUES.put("011010111", R29_06); - VALUES.put("110100001", R16_11); - VALUES.put("000111111", R31_08); - VALUES.put("000111110", R15_08); - VALUES.put("100000000", R00_01); - VALUES.put("001001000", R02_04); - VALUES.put("100000001", R16_01); - VALUES.put("001001001", R18_04); - VALUES.put("011101000", R02_14); - VALUES.put("011101001", R18_14); - VALUES.put("110100000", R00_11); - VALUES.put("100011010", R11_01); - VALUES.put("100011011", R27_01); - VALUES.put("000100111", R28_08); - VALUES.put("011010101", R21_06); - VALUES.put("011010100", R05_06); - VALUES.put("110100111", R28_11); - VALUES.put("111001010", R10_07); - VALUES.put("001001010", R10_04); - VALUES.put("000111001", R19_08); - VALUES.put("000111000", R03_08); - VALUES.put("100000110", R12_01); - VALUES.put("001001011", R26_04); - VALUES.put("100000111", R28_01); - VALUES.put("011101010", R10_14); - VALUES.put("011101011", R26_14); - VALUES.put("111001011", R26_07); - VALUES.put("110100110", R12_11); - VALUES.put("100011001", R19_01); - VALUES.put("100011000", R03_01); - VALUES.put("000100110", R12_08); - VALUES.put("011011100", R07_06); - VALUES.put("000100001", R16_08); - VALUES.put("011010011", R25_06); - VALUES.put("011010010", R09_06); - VALUES.put("011011101", R23_06); - VALUES.put("011101101", R22_14); - VALUES.put("110111000", R03_11); - VALUES.put("100001110", R14_01); - VALUES.put("001001101", R22_04); - VALUES.put("000111011", R27_08); - VALUES.put("000111010", R11_08); - VALUES.put("100001111", R30_01); - VALUES.put("001000010", R08_04); - VALUES.put("001001100", R06_04); - VALUES.put("001000011", R24_04); - VALUES.put("110111001", R19_11); - VALUES.put("011100010", R08_14); - VALUES.put("011101100", R06_14); - VALUES.put("011100011", R24_14); - VALUES.put("111001000", R02_07); - VALUES.put("110101110", R14_11); - VALUES.put("111001001", R18_07); - VALUES.put("110101111", R30_11); - VALUES.put("110010101", R21_03); - VALUES.put("110010100", R05_03); - VALUES.put("000100000", R00_08); - VALUES.put("011010000", R01_06); - VALUES.put("000101101", R22_08); - VALUES.put("011010001", R17_06); - VALUES.put("110101101", R22_11); - VALUES.put("110111010", R11_11); - VALUES.put("110111011", R27_11); - VALUES.put("010110100", R05_10); - VALUES.put("100000010", R08_01); - VALUES.put("100001100", R06_01); - VALUES.put("010110101", R21_10); - VALUES.put("100000011", R24_01); - VALUES.put("001001110", R14_04); - VALUES.put("100001101", R22_01); - VALUES.put("001001111", R30_04); - VALUES.put("011101110", R14_14); - VALUES.put("011101111", R30_14); - VALUES.put("110100010", R08_11); - VALUES.put("111001110", R14_07); - VALUES.put("110101100", R06_11); - VALUES.put("110100011", R24_11); - VALUES.put("111001111", R30_07); - VALUES.put("110010111", R29_03); - VALUES.put("000101100", R06_08); - VALUES.put("000100010", R08_08); - VALUES.put("110010110", R13_03); - VALUES.put("000100011", R24_08); - VALUES.put("001011000", R03_04); - VALUES.put("001011001", R19_04); - VALUES.put("110110010", R09_11); - VALUES.put("000110101", R21_08); - VALUES.put("000110100", R05_08); - VALUES.put("100001010", R10_01); - VALUES.put("100001011", R26_01); - VALUES.put("001000111", R28_04); - VALUES.put("001000110", R12_04); - VALUES.put("110111100", R07_11); - VALUES.put("110110011", R25_11); - VALUES.put("110111101", R23_11); - VALUES.put("111000011", R24_07); - VALUES.put("111000010", R08_07); - VALUES.put("111001100", R06_07); - VALUES.put("111001101", R22_07); - VALUES.put("100101011", R26_09); - VALUES.put("100101010", R10_09); - VALUES.put("110010001", R17_03); - VALUES.put("110010000", R01_03); - VALUES.put("001011010", R11_04); - VALUES.put("110011100", R07_03); - VALUES.put("001011011", R27_04); - VALUES.put("110011101", R23_03); - VALUES.put("111011010", R11_07); - VALUES.put("111011011", R27_07); - VALUES.put("110111110", R15_11); - VALUES.put("000110110", R13_08); - VALUES.put("000110111", R29_08); - VALUES.put("100001000", R02_01); - VALUES.put("001000001", R16_04); - VALUES.put("100001001", R18_01); - VALUES.put("001000000", R00_04); - VALUES.put("110111111", R31_11); - VALUES.put("111000001", R16_07); - VALUES.put("111000000", R00_07); - VALUES.put("110010011", R25_03); - VALUES.put("110010010", R09_03); - VALUES.put("110011110", R15_03); - VALUES.put("001010010", R09_04); - VALUES.put("110011111", R31_03); - VALUES.put("001011100", R07_04); - VALUES.put("001010011", R25_04); - VALUES.put("001011101", R23_04); - VALUES.put("111011001", R19_07); - VALUES.put("100101111", R30_09); - VALUES.put("110100100", R04_11); - VALUES.put("111011000", R03_07); - VALUES.put("110100101", R20_11); - VALUES.put("000110000", R01_08); - VALUES.put("000110001", R17_08); - VALUES.put("110000100", R04_03); - VALUES.put("110000101", R20_03); - VALUES.put("110110110", R13_11); - VALUES.put("111000111", R28_07); - VALUES.put("110110111", R29_11); - VALUES.put("111000110", R12_07); - VALUES.put("100101110", R14_09); - VALUES.put("110011000", R03_03); - VALUES.put("001011110", R15_04); - VALUES.put("110011001", R19_03); - VALUES.put("001011111", R31_04); - VALUES.put("111011111", R31_07); - VALUES.put("100101001", R18_09); - VALUES.put("111011110", R15_07); - VALUES.put("000111101", R23_08); - VALUES.put("000110011", R25_08); - VALUES.put("000111100", R07_08); - VALUES.put("001000100", R04_04); - VALUES.put("110000111", R28_03); - VALUES.put("000110010", R09_08); - VALUES.put("110000110", R12_03); - VALUES.put("001000101", R20_04); - VALUES.put("110110000", R01_11); - VALUES.put("111000101", R20_07); - VALUES.put("111000100", R04_07); - VALUES.put("110110001", R17_11); - VALUES.put("100101000", R02_09); - VALUES.put("010100101", R20_10); - VALUES.put("001010110", R13_04); - VALUES.put("001010111", R29_04); - VALUES.put("111011100", R07_07); - VALUES.put("111010010", R09_07); - VALUES.put("111011101", R23_07); - VALUES.put("001101001", R18_12); - VALUES.put("111010011", R25_07); - VALUES.put("010111000", R03_10); - VALUES.put("010111001", R19_10); - VALUES.put("011110000", R01_14); - VALUES.put("011110001", R17_14); - VALUES.put("001101000", R02_12); - VALUES.put("000011110", R15_00); - VALUES.put("000011111", R31_00); - VALUES.put("010100100", R04_10); - VALUES.put("001010000", R01_04); - VALUES.put("001010001", R17_04); - VALUES.put("111010001", R17_07); - VALUES.put("111010000", R01_07); - VALUES.put("001101111", R30_12); - VALUES.put("000000101", R20_00); - VALUES.put("000000100", R04_00); - VALUES.put("010111010", R11_10); - VALUES.put("010111011", R27_10); - VALUES.put("011110110", R13_14); - VALUES.put("011110111", R29_14); - VALUES.put("001101110", R14_12); - VALUES.put("000011101", R23_00); - VALUES.put("000010011", R25_00); - VALUES.put("000010010", R09_00); - VALUES.put("000011100", R07_00); - VALUES.put("001101101", R22_12); - VALUES.put("001100011", R24_12); - VALUES.put("111010111", R29_07); - VALUES.put("001101100", R06_12); - VALUES.put("111010110", R13_07); - VALUES.put("011110101", R21_14); - VALUES.put("011110100", R05_14); - VALUES.put("000010000", R01_00); - VALUES.put("001100010", R08_12); - VALUES.put("100010101", R21_01); - VALUES.put("000010001", R17_00); - VALUES.put("100010100", R05_01); - VALUES.put("111010101", R21_07); - VALUES.put("001010100", R05_04); - VALUES.put("001010101", R21_04); - VALUES.put("001100000", R00_12); - VALUES.put("111010100", R05_07); - VALUES.put("001100001", R16_12); - VALUES.put("000010111", R29_00); - VALUES.put("000010110", R13_00); - VALUES.put("011111010", R11_14); - VALUES.put("011100111", R28_14); - VALUES.put("011111011", R27_14); - VALUES.put("001111010", R11_12); - VALUES.put("111101101", R22_15); - VALUES.put("111100011", R24_15); - VALUES.put("111101100", R06_15); - VALUES.put("010110110", R13_10); - VALUES.put("010110111", R29_10); - VALUES.put("111100010", R08_15); - VALUES.put("001111011", R27_12); - VALUES.put("011100110", R12_14); - VALUES.put("000010100", R05_00); - VALUES.put("110101011", R26_11); - VALUES.put("000010101", R21_00); - VALUES.put("110101010", R10_11); - VALUES.put("100010000", R01_01); - VALUES.put("010101111", R30_10); - VALUES.put("100010001", R17_01); - VALUES.put("000101111", R30_08); - VALUES.put("000101110", R14_08); - VALUES.put("010101110", R14_10); - VALUES.put("101010100", R05_05); - VALUES.put("101010101", R21_05); - VALUES.put("011100001", R16_14); - VALUES.put("011111000", R03_14); - VALUES.put("111101111", R30_15); - VALUES.put("010110000", R01_10); - VALUES.put("010110001", R17_10); - VALUES.put("111101110", R14_15); - VALUES.put("011111001", R19_14); - VALUES.put("011100000", R00_14); - VALUES.put("110101000", R02_11); - VALUES.put("110101001", R18_11); - VALUES.put("010101100", R06_10); - VALUES.put("010100010", R08_10); - VALUES.put("100010110", R13_01); - VALUES.put("010101101", R22_10); - VALUES.put("100010111", R29_01); - VALUES.put("000101001", R18_08); - VALUES.put("000101000", R02_08); - VALUES.put("010100011", R24_10); - VALUES.put("101010111", R29_05); - VALUES.put("101010110", R13_05); - VALUES.put("011111110", R15_14); - VALUES.put("111101001", R18_15); - VALUES.put("010110010", R09_10); - VALUES.put("010111100", R07_10); - VALUES.put("010110011", R25_10); - VALUES.put("010111101", R23_10); - VALUES.put("111101000", R02_15); - VALUES.put("100000100", R04_01); - VALUES.put("100000101", R20_01); - VALUES.put("011111111", R31_14); - VALUES.put("000101010", R10_08); - VALUES.put("100011111", R31_01); - VALUES.put("010100001", R16_10); - VALUES.put("010100000", R00_10); - VALUES.put("100011110", R15_01); - VALUES.put("000101011", R26_08); - VALUES.put("101010001", R17_05); - VALUES.put("101010000", R01_05); - VALUES.put("011100100", R04_14); - VALUES.put("011110010", R09_14); - VALUES.put("011100101", R20_14); - VALUES.put("010111110", R15_10); - VALUES.put("010111111", R31_10); - VALUES.put("111101011", R26_15); - VALUES.put("111101010", R10_15); - VALUES.put("011111100", R07_14); - VALUES.put("011110011", R25_14); - VALUES.put("011111101", R23_14); - VALUES.put("001101011", R26_12); - VALUES.put("001101010", R10_12); - VALUES.put("100011100", R07_01); - VALUES.put("100010011", R25_01); - VALUES.put("100011101", R23_01); - VALUES.put("010100111", R28_10); - VALUES.put("100010010", R09_01); - VALUES.put("010100110", R12_10); - VALUES.put("101011101", R23_05); - VALUES.put("010011110", R15_02); - VALUES.put("101011100", R07_05); - VALUES.put("101010010", R09_05); - VALUES.put("101010011", R25_05); - VALUES.put("001110000", R01_12); - VALUES.put("001110001", R17_12); - VALUES.put("111111111", R31_15); - VALUES.put("111111110", R15_15); - VALUES.put("010011111", R31_02); - VALUES.put("010011000", R03_02); - VALUES.put("101011111", R31_05); - VALUES.put("101011110", R15_05); - VALUES.put("101101011", R26_13); - VALUES.put("111100100", R04_15); - VALUES.put("111100101", R20_15); - VALUES.put("101000101", R20_05); - VALUES.put("001111100", R07_12); - VALUES.put("101101010", R10_13); - VALUES.put("001110011", R25_12); - VALUES.put("101000100", R04_05); - VALUES.put("001110010", R09_12); - VALUES.put("001111101", R23_12); - VALUES.put("111111101", R23_15); - VALUES.put("111111100", R07_15); - VALUES.put("111110010", R09_15); - VALUES.put("010011001", R19_02); - VALUES.put("111110011", R25_15); - VALUES.put("111111010", R11_15); - VALUES.put("101011001", R19_05); - VALUES.put("101011000", R03_05); - VALUES.put("111100110", R12_15); - VALUES.put("000001001", R18_00); - VALUES.put("010000111", R28_02); - VALUES.put("111100111", R28_15); - VALUES.put("010000110", R12_02); - VALUES.put("000001000", R02_00); - VALUES.put("101000110", R12_05); - VALUES.put("001111111", R31_12); - VALUES.put("001111110", R15_12); - VALUES.put("101000111", R28_05); - VALUES.put("010010001", R17_02); - VALUES.put("010010000", R01_02); - VALUES.put("111111011", R27_15); - VALUES.put("010101010", R10_10); - VALUES.put("010101011", R26_10); - VALUES.put("010010010", R09_02); - VALUES.put("101011010", R11_05); - VALUES.put("101011011", R27_05); - VALUES.put("111100000", R00_15); - VALUES.put("010000101", R20_02); - VALUES.put("010000100", R04_02); - VALUES.put("111100001", R16_15); - VALUES.put("000001010", R10_00); - VALUES.put("000001011", R26_00); - VALUES.put("101000000", R00_05); - VALUES.put("001111001", R19_12); - VALUES.put("001111000", R03_12); - VALUES.put("101000001", R16_05); - VALUES.put("111111001", R19_15); - VALUES.put("010011101", R23_02); - VALUES.put("111111000", R03_15); - VALUES.put("010011100", R07_02); - VALUES.put("010010011", R25_02); - VALUES.put("010101001", R18_10); - VALUES.put("010101000", R02_10); - VALUES.put("001100110", R12_12); - VALUES.put("001100111", R28_12); - VALUES.put("101101101", R22_13); - VALUES.put("101101100", R06_13); - VALUES.put("101100011", R24_13); - VALUES.put("101100010", R08_13); - VALUES.put("000000011", R24_00); - VALUES.put("000001100", R06_00); - VALUES.put("000001101", R22_00); - VALUES.put("000000010", R08_00); - VALUES.put("101001101", R22_05); - VALUES.put("101000011", R24_05); - VALUES.put("101001100", R06_05); - VALUES.put("101000010", R08_05); - VALUES.put("111110100", R05_15); - VALUES.put("010010101", R21_02); - VALUES.put("111110101", R21_15); - VALUES.put("010010100", R05_02); - VALUES.put("001100101", R20_12); - VALUES.put("001100100", R04_12); - VALUES.put("101100001", R16_13); - VALUES.put("101100000", R00_13); - VALUES.put("000001111", R30_00); - VALUES.put("000001110", R14_00); - VALUES.put("101001111", R30_05); - VALUES.put("101001110", R14_05); - VALUES.put("010010111", R29_02); - VALUES.put("010010110", R13_02); - VALUES.put("000011010", R11_00); - VALUES.put("101101001", R18_13); - VALUES.put("000000111", R28_00); - VALUES.put("101101000", R02_13); - VALUES.put("000000110", R12_00); - VALUES.put("101001001", R18_05); - VALUES.put("101001000", R02_05); - VALUES.put("001110101", R21_12); - VALUES.put("001110100", R05_12); - VALUES.put("111110001", R17_15); - VALUES.put("101111011", R27_13); - VALUES.put("101111010", R11_13); - VALUES.put("000011011", R27_00); - VALUES.put("111110000", R01_15); - VALUES.put("000000001", R16_00); - VALUES.put("101101111", R30_13); - VALUES.put("000000000", R00_00); - VALUES.put("101101110", R14_13); - VALUES.put("001110110", R13_12); - VALUES.put("101001011", R26_05); - VALUES.put("101001010", R10_05); - VALUES.put("001110111", R29_12); - VALUES.put("111110111", R29_15); - VALUES.put("000011000", R03_00); - VALUES.put("111110110", R13_15); - VALUES.put("000011001", R19_00); - VALUES.put("110011011", R27_03); - VALUES.put("100100001", R16_09); - VALUES.put("100100000", R00_09); - VALUES.put("011001000", R02_06); - VALUES.put("110000001", R16_03); - VALUES.put("110000000", R00_03); - VALUES.put("011001001", R18_06); - VALUES.put("101111110", R15_13); - VALUES.put("101111111", R31_13); - VALUES.put("110011010", R11_03); - VALUES.put("100101101", R22_09); - VALUES.put("100101100", R06_09); - VALUES.put("100100011", R24_09); - VALUES.put("100111010", R11_09); - VALUES.put("011001110", R14_06); - VALUES.put("110000010", R08_03); - VALUES.put("010001010", R10_02); - VALUES.put("110001101", R22_03); - VALUES.put("110001100", R06_03); - VALUES.put("110000011", R24_03); - VALUES.put("010001011", R26_02); - VALUES.put("100111011", R27_09); - VALUES.put("011001111", R30_06); - VALUES.put("110110100", R05_11); - VALUES.put("110110101", R21_11); - VALUES.put("101111000", R03_13); - VALUES.put("100100010", R08_09); - VALUES.put("101111001", R19_13); - VALUES.put("100100100", R04_09); - VALUES.put("100100101", R20_09); - VALUES.put("101100111", R28_13); - VALUES.put("101100110", R12_13); - VALUES.put("110001110", R14_03); - VALUES.put("110001111", R30_03); - VALUES.put("100111001", R19_09); - VALUES.put("100111000", R03_09); - VALUES.put("101110001", R17_13); - VALUES.put("101110000", R01_13); - VALUES.put("100100111", R28_09); - VALUES.put("100100110", R12_09); - VALUES.put("101100101", R20_13); - VALUES.put("101100100", R04_13); - VALUES.put("011001011", R26_06); - VALUES.put("011001010", R10_06); - VALUES.put("110001000", R02_03); - VALUES.put("110001001", R18_03); - VALUES.put("100111111", R31_09); - VALUES.put("100111110", R15_09); - VALUES.put("101110010", R09_13); - VALUES.put("101111101", R23_13); - VALUES.put("101111100", R07_13); - VALUES.put("101110011", R25_13); - VALUES.put("011011001", R19_06); - VALUES.put("011011000", R03_06); - VALUES.put("010001101", R22_02); - VALUES.put("110001011", R26_03); - VALUES.put("110001010", R10_03); - VALUES.put("100111101", R23_09); - VALUES.put("010001100", R06_02); - VALUES.put("100111100", R07_09); - VALUES.put("010000011", R24_02); - VALUES.put("100110011", R25_09); - VALUES.put("011000111", R28_06); - VALUES.put("010000010", R08_02); - VALUES.put("100110010", R09_09); - VALUES.put("011000110", R12_06); - VALUES.put("101110100", R05_13); - VALUES.put("101110101", R21_13); - VALUES.put("011011111", R31_06); - VALUES.put("011011110", R15_06); - VALUES.put("010000001", R16_02); - VALUES.put("100110001", R17_09); - VALUES.put("011000101", R20_06); - VALUES.put("010000000", R00_02); - VALUES.put("100110000", R01_09); - VALUES.put("011000100", R04_06); - VALUES.put("101110111", R29_13); - VALUES.put("101110110", R13_13); - VALUES.put("010011011", R27_02); - VALUES.put("010011010", R11_02); - VALUES.put("011000010", R08_06); - VALUES.put("100110111", R29_09); - VALUES.put("100110110", R13_09); - VALUES.put("010001001", R18_02); - VALUES.put("011001101", R22_06); - VALUES.put("010001000", R02_02); - VALUES.put("011001100", R06_06); - VALUES.put("011000011", R24_06); - VALUES.put("011011011", R27_06); - VALUES.put("100110101", R21_09); - VALUES.put("100110100", R05_09); - VALUES.put("011000001", R16_06); - VALUES.put("010001111", R30_02); - VALUES.put("011000000", R00_06); - VALUES.put("010001110", R14_02); - VALUES.put("011011010", R11_06); - } - } - - String[] pattern(); - - int filled(); - - int width(); - - Vec2d coords(); - - char symbol(); - - default int empty() { - return 9 - filled(); - } - - String NAMESPACE = "comet"; - - static PixelPattern of(String[] pattern, int filled, int width, Vec2d coords, char symbol) { - return new Impl(pattern, filled, width, coords, symbol); - } - - record Impl(String[] pattern, int filled, int width, Vec2d coords, char symbol) implements PixelPattern { - - } - - static Pair optimize(BufferedImage section, int font) { - LinkedHashMap colorGroups = new LinkedHashMap<>(); - for (int y = 0; y < section.getHeight(); y++) { - for (int x = 0; x < section.getWidth(); x++) { - int rgb = section.getRGB(x, y); - java.awt.Color color = new java.awt.Color(rgb); - colorGroups.computeIfAbsent(color, c -> new ColorGroup()); - colorGroups.get(color).add(Vec2d.of(x, y)); - } - } - boolean first = true; - Component component = Component.empty(); - int width = 0; - for (Map.Entry group : colorGroups.entrySet()) { - PixelPattern pixelPattern = find(group.getValue()); - if (pixelPattern == null) { - continue; - } - width = Math.max(width, pixelPattern.width()); - if (!first) { - component = component.append(Component.text("4").font(Key.key(NAMESPACE, "patterns_" + font))); - } - first = false; - component = component.append(Component.text(pixelPattern.symbol()).color(TextColor.color(group.getKey().getRGB()))).font(Key.key(NAMESPACE, "patterns_" + font)); - } - return Pair.of(component, width); - } - - static PixelPattern find(ColorGroup group) { - String[] pattern = new String[]{"000", "000", "000"}; - for (Vec2d coord : group.coords) { - StringBuilder builder = new StringBuilder(pattern[coord.yi()]); - builder.setCharAt(coord.xi(), '1'); - pattern[coord.yi()] = builder.toString(); - } - return DummyStatic.VALUES.get(String.join("", pattern)); - } - - class ColorGroup { - private final List coords = new ArrayList<>(); - - public void add(Vec2d pos) { - coords.add(pos); - } - - public List coords() { - return coords; - } - - public int filled() { - return coords.size(); - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/image/SimpleCanvas.java b/api/src/main/java/me/combimagnetron/sunscreen/image/SimpleCanvas.java deleted file mode 100755 index 7c95f53..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/image/SimpleCanvas.java +++ /dev/null @@ -1,136 +0,0 @@ -package me.combimagnetron.sunscreen.image; - -import me.combimagnetron.sunscreen.util.Scheduler; -import me.combimagnetron.sunscreen.util.Vec2d; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.format.TextColor; - -import java.awt.image.BufferedImage; -import java.lang.reflect.Array; - -public class SimpleCanvas { - private static final String NAMESPACE = "sunscreen"; - private final BufferedImage bufferedImage; - private final TextComponent[][] image; - private final int width; - private final int height; - - protected SimpleCanvas(int width, int height) { - this.bufferedImage = new BufferedImage(width, height, 2); - image = (TextComponent[][]) Array.newInstance(TextComponent.class, width, height); - this.width = width; - this.height = height; - } - - public SimpleCanvas(int width, int height, BufferedImage image) { - this.bufferedImage = image; - this.image = (TextComponent[][]) Array.newInstance(TextComponent.class, height, width); - this.width = width; - this.height = height; - } - - - public Vec2d dimensions() { - return Vec2d.of(width, height); - } - - public SimpleCanvas splice(Vec2d size, Vec2d coords) { - final BufferedImage spliced = bufferedImage.getSubimage((int)coords.x(), (int)coords.y(), (int)size.x(), (int)size.y()); - return new SimpleCanvas((int)size.x(), (int)size.y(), spliced); - } - - public BufferedImage image() { - return bufferedImage; - } - - - public static SimpleCanvas empty(Vec2d size) { - return new SimpleCanvas((int) size.x(), (int) size.y()); - } - - public Component render() { - Component component = Component.empty(); - for (int row = image.length - 1; row > 0; row--) { - for (int col = 0; col < image[row].length; col++) { - component = component.append(image[row][col]).append(Component.text("x")).font(Key.key(NAMESPACE + ":dynamic")); - } - component = component.append(Component.text("z").font(Key.key(NAMESPACE + ":dynamic"))); - } - return component; - } - - public Component renderAsync() { - return Scheduler.async(this::render); - } - - static SimpleCanvas image(BufferedImage image) { - SimpleCanvas simpleCanvas = new SimpleCanvas(image.getWidth(), image.getHeight(), image); - SampleColor lastColor = SampleColor.of(0, 0, 0); - int i = 57344; - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - java.awt.Color c = new java.awt.Color(image.getRGB(x, y), true); - TextColor color = TextColor.color(c.getRGB()); - SampleColor currentColor = SampleColor.of(color); - if (c.getAlpha() == 0) { - simpleCanvas.image[x][y] = Component.text(' '); - /*} else if (currentColor.skip(lastColor)) { - simpleCanvas.image[x][y] = Component.text((char) i);*/ - } else { - simpleCanvas.image[x][y] = Component.text((char) i, color); - lastColor = currentColor; - } - i++; - } - i = 57344; - } - return simpleCanvas; - } - - record SampleColor(int r, int g, int b) { - - public static SampleColor of(int r, int g, int b) { - return new SampleColor(r, g, b); - } - - public static SampleColor of(TextColor textColor) { - return new SampleColor(textColor.red(), textColor.green(), textColor.blue()); - } - - public java.awt.Color color() { - return new java.awt.Color(r, g, b); - } - - public boolean skip(SampleColor other) { - //return isClose(other, 0); - if (other.r == 256 && other.g == 256 && other.b == 256) { - return true; - } - - return similar(color(), other.color(), 0); - } - - private boolean isClose(SampleColor sampleColor, int threshold) { - var external = sampleColor.color(); - var local = color(); - int r = external.getRed() - local.getRed(), g = external.getGreen() - local.getGreen(), b = external.getBlue()- local.getBlue(); - return (r*r + g*g + b*b) <= threshold*threshold; - } - - public static boolean similar(java.awt.Color color1, java.awt.Color color2, int threshold) { - int redDiff = Math.abs(color1.getRed() - color2.getRed()); - int greenDiff = Math.abs(color1.getGreen() - color2.getGreen()); - int blueDiff = Math.abs(color1.getBlue() - color2.getBlue()); - - int totalDifference = redDiff + greenDiff + blueDiff; - - return totalDifference <= threshold; - } - - } - - - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/Action.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/Action.java index cd47d45..728a58b 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/Action.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/Action.java @@ -1,9 +1,8 @@ package me.combimagnetron.sunscreen.logic.action; import me.combimagnetron.passport.util.condition.Condition; -import me.combimagnetron.sunscreen.logic.action.impl.*; import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; import java.util.Collection; import java.util.HashMap; @@ -26,11 +25,11 @@ abstract class AbstractAction implements Action { static { ACTION_MAP.putAll(Map.of( - EditElementAction.ActionIdentifier, new EditElementAction(), + /*EditElementAction.ActionIdentifier, new EditElementAction(), ShowElementAction.ActionIdentifier, new ShowElementAction(), HideElementAction.ActionIdentifier, new HideElementAction(), ShowDivAction.ActionIdentifier, new ShowDivAction(), - HideDivAction.ActionIdentifier, new HideDivAction() + HideDivAction.ActionIdentifier, new HideDivAction()*/ )); } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/adapter/TypeAdapter.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/adapter/TypeAdapter.java index 25364c1..cd6cf08 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/adapter/TypeAdapter.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/adapter/TypeAdapter.java @@ -1,20 +1,11 @@ package me.combimagnetron.sunscreen.logic.action.adapter; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.style.Text; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Values; +import me.combimagnetron.sunscreen.util.data.Identifier; +import me.combimagnetron.sunscreen.util.data.Values; import java.util.function.Function; public interface TypeAdapter { - TypeAdapter TEXT = of(Text.class, string -> { - String content = string.substring(4, string.length() - 1); - String[] parts = content.split(","); - String text = parts[0].trim(); - String font = parts[1].trim(); - return Text.text(text, Text.Fonts.stream().filter(f -> f.name().equals(font)).findFirst().orElse(Text.Font.vanilla())); - }); TypeAdapter IDENTIFIER = of(Identifier.class, Identifier::split); TypeAdapter INTEGER = of(Integer.class, Integer::parseInt); TypeAdapter DOUBLE = of(Double.class, Double::parseDouble); @@ -25,7 +16,6 @@ public interface TypeAdapter { TypeAdapter BOOLEAN = of(Boolean.class, Boolean::parseBoolean); TypeAdapter STRING = of(String.class, string -> string); Values> VALUES = Values.of( - TEXT, IDENTIFIER, INTEGER, DOUBLE, diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/EditElementAction.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/EditElementAction.java deleted file mode 100644 index ccbfe91..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/EditElementAction.java +++ /dev/null @@ -1,75 +0,0 @@ -package me.combimagnetron.sunscreen.logic.action.impl; - -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.div.Edit; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.menu.draft.Draft; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.List; - -public class EditElementAction extends Action.AbstractAction { - public static final Identifier ActionIdentifier = Identifier.of("sunscreen", "edit_element"); - - public EditElementAction() { - super(ActionIdentifier); - } - - @Override - public void execute(SunscreenUser user, Argument... arguments) { - if (!validate(arguments)) { - throw new IllegalArgumentException("Invalid arguments provided to action " + ActionIdentifier); - } - if (user == null || user.session().menu() == null) { - throw new IllegalArgumentException("User and its menu cannot be null"); - } - if (!(user.session().menu() instanceof OpenedMenu.Float floatMenu)) { - return; - } - Identifier divId = ((Identifier) arguments[0].value()); - Identifier elementId = ((Identifier) arguments[1].value()); - String property = ((String) arguments[2].value()); - Object value = arguments[3].value(); - Element element = floatMenu.div(divId).element(elementId); - Edit edit = Edit.element().identifier(elementId).section().edit(element.getClass(), e -> { - Method method; - try { - method = e.getClass().getDeclaredMethod(property, value.getClass()); - } catch (NoSuchMethodException ex) { - throw new RuntimeException(ex); - } - try { - return (Element) method.invoke(e, value); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new RuntimeException(ex); - } - }).back().done(); - Draft draft = Draft.draft().edit(edit); - floatMenu.apply(draft); - } - - @Override - public boolean validate(Argument... arguments) { - return arguments.length == 4 - && containsType(Identifier.class, 2, arguments) - && containsType(String.class, 2, arguments); - } - - @Override - public Collection argumentType() { - return List.of( - ArgumentType.of("div", Identifier.class), - ArgumentType.of("element", Identifier.class), - ArgumentType.of("property", String.class), - ArgumentType.of("value", String.class) - ); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideDivAction.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideDivAction.java deleted file mode 100644 index c882bbe..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideDivAction.java +++ /dev/null @@ -1,56 +0,0 @@ -package me.combimagnetron.sunscreen.logic.action.impl; - -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; -import net.kyori.adventure.text.Component; - -import java.util.Collection; -import java.util.List; - -public class HideDivAction extends Action.AbstractAction { - public static final Identifier ActionIdentifier = Identifier.of("sunscreen", "hide_div"); - - public HideDivAction() { - super(ActionIdentifier); - } - - @Override - public void execute(SunscreenUser user, Argument... arguments) { - if (!validate(arguments)) { - throw new IllegalArgumentException("Invalid arguments provided to action " + ActionIdentifier); - } - if (user == null || user.session().menu() == null) { - throw new IllegalArgumentException("User and its menu cannot be null"); - } - Identifier id = ((Identifier) arguments[0].value()); - OpenedMenu menu = user.session().menu(); - if (!(menu instanceof OpenedMenu.Float floatMenu)) { - return; - } - TextDisplay display = floatMenu.renderer().referenceHolder().reference(id).t(); - display.text(Component.empty()); - floatMenu.hide(id); - OpenedMenu.FloatImpl.MenuHelper.send(user, display); - } - - @Override - public boolean validate(Argument... arguments) { - if (arguments.length != 1) { - return false; - } - return arguments[0].type() == Identifier.class; - } - - @Override - public Collection argumentType() { - return List.of(ArgumentType.of("div", Identifier.class)); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideElementAction.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideElementAction.java deleted file mode 100644 index 7c67478..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/HideElementAction.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.combimagnetron.sunscreen.logic.action.impl; - -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.util.Collection; -import java.util.List; - -public class HideElementAction extends Action.AbstractAction { - public final static Identifier ActionIdentifier = Identifier.of("sunscreen", "hide_element"); - - public HideElementAction() { - super(ActionIdentifier); - } - - @Override - public void execute(SunscreenUser user, Argument... arguments) { - if (!validate(arguments)) { - throw new IllegalArgumentException("Invalid arguments provided to action " + ActionIdentifier); - } - if (user == null || user.session().menu() == null) { - throw new IllegalArgumentException("User and its menu cannot be null"); - } - Identifier divId = ((Identifier) arguments[0].value()); - Identifier elementId = ((Identifier) arguments[1].value()); - OpenedMenu menu = user.session().menu(); - if (!(menu instanceof OpenedMenu.Float floatMenu)) { - return; - } - Div div = floatMenu.div(divId); - div.hide(elementId); - } - - @Override - public boolean validate(Argument... arguments) { - if (arguments.length != 2) { - return false; - } - return arguments[0].type() == Identifier.class && arguments[1].type() == Identifier.class; - } - - @Override - public Collection argumentType() { - return List.of(ArgumentType.of("div", Identifier.class), ArgumentType.of("element", Identifier.class)); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowDivAction.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowDivAction.java deleted file mode 100644 index c2f7e63..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowDivAction.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.combimagnetron.sunscreen.logic.action.impl; - -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.util.Collection; -import java.util.List; - -public class ShowDivAction extends Action.AbstractAction { - public static final Identifier ActionIdentifier = Identifier.of("sunscreen", "show_div"); - - public ShowDivAction() { - super(ActionIdentifier); - } - - @Override - public void execute(SunscreenUser user, Argument... arguments) { - if (!validate(arguments)) { - throw new IllegalArgumentException("Invalid arguments provided to action " + ActionIdentifier); - } - if (user == null || user.session().menu() == null) { - throw new IllegalArgumentException("User and its menu cannot be null"); - } - Identifier id = ((Identifier) arguments[0].value()); - OpenedMenu menu = user.session().menu(); - if (!(menu instanceof OpenedMenu.Float floatMenu)) { - return; - } - floatMenu.show(id); - } - - @Override - public boolean validate(Argument... arguments) { - if (arguments.length != 1) { - return false; - } - return arguments[0].type() == Identifier.class; - } - - @Override - public Collection argumentType() { - return List.of(ArgumentType.of("div", Identifier.class)); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowElementAction.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowElementAction.java deleted file mode 100644 index a9c3140..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/action/impl/ShowElementAction.java +++ /dev/null @@ -1,54 +0,0 @@ -package me.combimagnetron.sunscreen.logic.action.impl; - -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.util.Collection; -import java.util.List; - -public class ShowElementAction extends Action.AbstractAction { - public final static Identifier ActionIdentifier = Identifier.of("sunscreen", "show_element"); - - public ShowElementAction() { - super(ActionIdentifier); - } - - @Override - public void execute(SunscreenUser user, Argument... arguments) { - if (!validate(arguments)) { - throw new IllegalArgumentException("Invalid arguments provided to action " + ActionIdentifier); - } - if (user == null || user.session().menu() == null) { - throw new IllegalArgumentException("User and its menu cannot be null"); - } - Identifier divId = ((Identifier) arguments[0].value()); - Identifier elementId = ((Identifier) arguments[1].value()); - OpenedMenu menu = user.session().menu(); - if (!(menu instanceof OpenedMenu.Float floatMenu)) { - return; - } - Div div = floatMenu.div(divId); - div.show(elementId); - } - - @Override - public boolean validate(Argument... arguments) { - if (arguments.length != 2) { - return false; - } - return arguments[0].type() == Identifier.class && arguments[1].type() == Identifier.class; - } - - @Override - public Collection argumentType() { - return List.of(ArgumentType.of("div", Identifier.class), ArgumentType.of("element", Identifier.class)); - } - - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/SimpleVariable.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/SimpleVariable.java index e9ac729..33eec97 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/SimpleVariable.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/SimpleVariable.java @@ -1,6 +1,6 @@ package me.combimagnetron.sunscreen.logic.variable; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; public record SimpleVariable(T value, Identifier identifier) implements Variable { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/Variable.java b/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/Variable.java index 9ed7dd1..d85a850 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/Variable.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/logic/variable/Variable.java @@ -1,6 +1,6 @@ package me.combimagnetron.sunscreen.logic.variable; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; public interface Variable { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java deleted file mode 100644 index e1975a8..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/OpenedMenu.java +++ /dev/null @@ -1,545 +0,0 @@ -package me.combimagnetron.sunscreen.menu; - -import com.github.retrooper.packetevents.protocol.entity.data.EntityData; -import com.github.retrooper.packetevents.protocol.player.GameMode; -import com.github.retrooper.packetevents.protocol.player.UserProfile; -import com.github.retrooper.packetevents.wrapper.play.server.*; -import me.combimagnetron.passport.internal.entity.Entity; -import me.combimagnetron.passport.internal.entity.impl.display.Display; -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.passport.util.condition.Condition; -import me.combimagnetron.passport.util.condition.Supplier; -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.element.div.Edit; -import me.combimagnetron.sunscreen.element.impl.TextInputElement; -import me.combimagnetron.sunscreen.hook.SunscreenHook; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.CanvasRenderer; -import me.combimagnetron.sunscreen.image.Color; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.element.SimpleBufferedElement; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.element.div.ScrollableDiv; -import me.combimagnetron.sunscreen.menu.cursor.ClientsideCursor; -import me.combimagnetron.sunscreen.menu.cursor.Cursor; -import me.combimagnetron.sunscreen.menu.cursor.EntityCursor; -import me.combimagnetron.sunscreen.menu.draft.Draft; -import me.combimagnetron.sunscreen.menu.input.Input; -import me.combimagnetron.sunscreen.menu.input.InputHandler; -import me.combimagnetron.sunscreen.menu.simulate.Simulator; -import me.combimagnetron.sunscreen.renderer.div.DivRenderer; -import me.combimagnetron.sunscreen.renderer.div.Reference; -import me.combimagnetron.sunscreen.renderer.div.ReferenceHolder; -import me.combimagnetron.sunscreen.menu.timing.Tick; -import me.combimagnetron.sunscreen.menu.timing.Tickable; -import me.combimagnetron.sunscreen.session.Session; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.*; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.ArrayUtils; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.function.Function; - -public sealed interface OpenedMenu permits OpenedMenu.Base, AspectRatioMenu { - - boolean close(); - - InputHandler inputHandler(); - - Simulator simulator(); - - OpenedMenu apply(Draft draft); - - sealed abstract class Base implements OpenedMenu permits FloatImpl { - protected final HashMap> divHashMap = new HashMap<>(); - - public abstract void handleClick(); - - public abstract void handleRot(float yaw, float pitch); - - public abstract void handleSneak(); - - public abstract void handleScroll(int slot); - - public abstract void handleDamage(); - - public abstract void handlePing(long ping); - - public abstract void handleText(String text); - - protected void forceDivGeometry(SunscreenUser viewer) { - for (Map.Entry> entry : divHashMap.entrySet()) { - Div div = entry.getValue(); - for (Element element : div.elements()) { - if (!(element instanceof SimpleBufferedElement)) { - continue; - } - for (RuntimeDefinableGeometry.GeometryBuilder definable : div.definables()) { - div.geometry(definable.finish(viewer.screenSize().pixel(), div.size())); - } - for (RuntimeDefinable.Builder definable : element.definables().stream().sorted(Comparator.comparingInt(RuntimeDefinable.Builder::priority)).toList()) { - if (definable instanceof RuntimeDefinableGeometry.GeometryBuilder geometry) { - element.geometry(geometry.finish(div.size(), div.size())); - } - if (definable.type() == InputHandler.class) { - RuntimeDefinable.Builder inputHandler = (RuntimeDefinable.Builder) definable; - TextInputElement textInputElement = (TextInputElement) element; - textInputElement.inputHandler(inputHandler.finish(this)); - } - } - } - } - } - - } - - non-sealed abstract class FloatImpl extends Base implements Tickable { - private static final int Y_OFFSET = 8; - private final UUID uuid = UUID.randomUUID(); - private final DivRenderer renderer = DivRenderer.font(); - private final ReferenceHolder referenceHolder = renderer.referenceHolder(); - private final SunscreenUser viewer; - private final InputHandler inputHandler; - private final HashMap lastPasses = new HashMap<>(); - private final List riding = new ArrayList<>(); - private final Cursor cursor; - private final TextDisplay cursorDisplay; - private final TextDisplay background; - private final Vector3d rotation; - private final Simulator simulator; - private Identifier focused = null; - private TextDisplay camera; - private Color backgroundColor = Color.of(0, 0, 0, 255); - private Vec2d lastInput = Vec2d.of(0, 0); - private int damageTick = 0; - - public FloatImpl(SunscreenUser viewer, MenuTemplate template) { - this.rotation = viewer.rotation(); - this.viewer = viewer; - this.inputHandler = new InputHandler.Impl(viewer, this); - MenuTemplate.Simple menuTemplate = (MenuTemplate.Simple) template; - divHashMap.putAll(menuTemplate.create()); - forceDivGeometry(viewer); - this.cursor = Cursor.client(viewer); - this.background = TextDisplay.textDisplay(viewer.position()); - this.cursorDisplay = TextDisplay.textDisplay(viewer.position()); - Collection hooks = SunscreenHook.HOOKS.stream().filter(SunscreenHook::canRun).toList(); - for (SunscreenHook hook : hooks) { - hook.onMenuEnter(viewer, this); - } - this.simulator = null; - } - - @Override - public InputHandler inputHandler() { - return inputHandler; - } - - public UUID uuid() { - return uuid; - } - - /** - * Tick method for the openedMenu, called every tick. - * @param tick Tick to calculate generation time. - */ - @Override - public boolean tick(@NotNull Tick tick) { - if (damageTick > 0) { - damageTick--; - background.backgroundColor(Color.of(backgroundColor.red(), backgroundColor.green(), backgroundColor.blue(), 123).rgb()); - MenuHelper.send(viewer, background); - } else { - background(backgroundColor); - } - for (Div div : divHashMap.values()) { - boolean update = false; - if (div instanceof Tickable tickable) { - update = tickable.tick(tick); - } - for (Element element : div.elements()) { - if (element instanceof Tickable tickable) { - update = tickable.tick(tick); - } - } - if (update && !div.hidden()) { - update(div); - } - if (div.condition() == null) { - continue; - } - Condition.Result result = div.condition().eval(Supplier.of(viewer.platformSpecificPlayer(), viewer)); - if (result == null) { - continue; - } - if (lastPasses.get(div.identifier()) == result.value()) { - continue; - } - if (!result.value()) { - hide(div); - } else { - show(div); - } - lastPasses.put(div.identifier(), result.value()); - } - return true; - } - - @Override - public void handleRot(float yaw, float pitch) { - lastInput = Vec2d.of(yaw, -pitch).sub(lastInput).div(400, 500); - move(); - } - - @Override - public void handleText(String text) { - for (Reference reference : referenceHolder.references()) { - Div div = reference.div(); - boolean update = false; - for (Element element : div.elements()) { - if (!(element instanceof TextInputElement textInputElement)) { - continue; - } - update = true; - textInputElement.handle(text); - textInputElement.canvas(); - } - if (!update) { - continue; - } - update(div); - } - } - - @Override - public void handleSneak() { - close(); - } - - @Override - public void handlePing(long ping) { - int offset = Math.clamp((int) Math.ceil((double) ping /50), 1, 10); - //cursorDisplay.transformationDuration(offset); - //cursorDisplay.teleportationDuration(offset); - //MenuHelper.send(viewer, cursorDisplay); - } - - @Override - public void handleClick() { - for (Reference reference : referenceHolder.references()) { - Div div = reference.div(); - if (focused != null && !div.identifier().equals(focused)) { - continue; - } - if (div instanceof Div.NonRenderDiv) continue; - if (div.hidden()) continue; - Vec2i divPos = Vec2i.of(div.position().x().pixel(), div.position().y().pixel()); - Vector3d cursorTranslation = Vector3d.vec3(lastInput.x(), lastInput.y(), 0); - Vec2i cursorPos = ViewportHelper.toScreen(cursorTranslation, viewer.screenSize()); - cursorPos = cursorPos.add(0, Y_OFFSET); - if (HoverHelper.isHovered(cursorTranslation, viewer, divPos, div.size())) { - boolean update = ((Div.Impl)div).handleClick(cursorPos.sub(divPos), new Input.Type.MouseClick(false), viewer); - if (!update) { - continue; - } - reference.t().text(CanvasRenderer.optimized().render(div.render(viewer)).component()); - MenuHelper.send(viewer, reference.t()); - } - } - } - - @Override - public Simulator simulator() { - return simulator; - } - - @Override - public void handleScroll(int slot) { - for (Reference entry : referenceHolder.references()) { - Div div = entry.div(); - if (!(div instanceof ScrollableDiv scrollableDiv)) { - return; - } - scrollableDiv.scroll(slot); - entry.t().text(CanvasRenderer.optimized().render(div.render(viewer)).component()); - MenuHelper.send(viewer, entry.t()); - } - } - - @Override - public void handleDamage() { - damageTick += 20; - } - - /** - * Takes Color argument and sets the background accordingly, defaults to black. - * @param color Color to set the background to, can be transparent. - */ - public void background(Color color) { - background.backgroundColor(color.rgb()); - background.text(Component.text(" ")); - this.backgroundColor = color; - MenuHelper.send(viewer, background); - } - - public void update(Div div) { - TextDisplay display = referenceHolder.reference(div.identifier()).t(); - display.text(CanvasRenderer.optimized().render(div.render(viewer)).component()); - MenuHelper.send(viewer, display); - } - - public void hide(Div div) { - TextDisplay display = referenceHolder.reference(div.identifier()).t(); - display.text(Component.empty()); - if (div instanceof Div.Impl impl) { - impl.hide(true); - } - MenuHelper.send(viewer, display); - } - - public void hide(Identifier identifier) { - Reference reference = referenceHolder.reference(identifier); - TextDisplay display = reference.t(); - Div div = reference.div(); - display.text(Component.empty()); - if (div instanceof Div.Impl impl) { - impl.hide(true); - } - MenuHelper.send(viewer, display); - } - - public void show(Identifier identifier) { - Reference reference = referenceHolder.reference(identifier); - TextDisplay display = reference.t(); - Div div = reference.div(); - display.text(CanvasRenderer.optimized().render(divHashMap.get(identifier).render(viewer)).component()); - if (div instanceof Div.Impl impl) { - impl.hide(false); - } - MenuHelper.send(viewer, display); - } - - public void update(Identifier identifier) { - TextDisplay display = referenceHolder.reference(identifier).t(); - display.text(CanvasRenderer.optimized().render(divHashMap.get(identifier).render(viewer)).component()); - MenuHelper.send(viewer, display); - } - - public void render(Div div) { - Reference reference = renderer.render(div, viewer); - TextDisplay display = reference.t(); - //display.text(CanvasRenderer.optimized().render(div.render(viewer)).component()); - riding.add(display.id().intValue()); - viewer.connection().send(new WrapperPlayServerSetPassengers(camera.id().intValue(), ArrayUtils.toPrimitive(riding.toArray(new Integer[0])))); - } - - public void show(Div div) { - TextDisplay display = referenceHolder.reference(div.identifier()).t(); - display.text(CanvasRenderer.optimized().render(div.render(viewer)).component()); - if (div instanceof Div.Impl impl) { - impl.hide(false); - } - MenuHelper.send(viewer, display); - } - - public DivRenderer renderer() { - return renderer; - } - - public void focus(Identifier identifier) { - this.focused = identifier; - } - - public void unfocus() { - this.focused = null; - } - - private void move() { - Vec2d translation = lastInput.mul(1); - translation = translation.add(0.003, -0.010); - viewer.message(Component.text("a")); - cursor.move(Vec2i.of(translation.xi(), translation.yi())); - for (Reference reference: referenceHolder.references()) { - Div div = reference.div(); - if (focused != null && !div.identifier().equals(focused)) { - continue; - } - if (div.hidden()) continue; - if (div instanceof Div.NonRenderDiv) continue; - Vec2i divPos = Vec2i.of((int) div.position().x().pixel(), (int) div.position().y().pixel()); - Vector3d cursorTranslation = Vector3d.vec3(translation.x(), translation.y(), -0.2499); - cursorDisplay.transformation(Display.Transformation.transformation().scale(Vector3d.vec3((double)1/24)).translation(cursorTranslation)); - MenuHelper.send(viewer, cursorDisplay); - Vec2i cursorPos = ViewportHelper.toScreen(cursorTranslation, viewer.screenSize()); - cursorPos = cursorPos.add(0, Y_OFFSET); - if (HoverHelper.isHovered(cursorTranslation, viewer, divPos.mul(ViewportHelper.fromVector3d(div.scale())), div.size().mul(ViewportHelper.fromVector3d(div.scale())))) { - boolean render = ((Div.Impl)div).handleHover(cursorPos.sub(divPos), viewer); - if (!render) { - continue; - } - reference.t().text(CanvasRenderer.optimized().render(div.render(viewer)).component()); - MenuHelper.send(viewer, reference.t()); - } - } - } - - /** - * Closes the openedMenu and sends the necessary packets to the viewer. - * @return True if the openedMenu was closed successfully. - */ - @Override - public boolean close() { - leave(); - SunscreenLibrary.library().menuTicker().stop(this); - viewer.resendInv(); - Collection hooks = SunscreenHook.HOOKS.stream().filter(SunscreenHook::canRun).toList(); - for (SunscreenHook hook : hooks) { - hook.onMenuLeave(viewer, this); - } - SunscreenLibrary.library().sessionHandler().session(Session.session(null, viewer)); - return true; - } - - private void leave() { - cursor.remove(); - viewer.connection().send(new WrapperPlayServerChangeGameState(WrapperPlayServerChangeGameState.Reason.CHANGE_GAME_MODE, viewer.gameMode())); - viewer.connection().send(new WrapperPlayServerPlayerInfoUpdate(WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_GAME_MODE, new WrapperPlayServerPlayerInfoUpdate.PlayerInfo(new UserProfile(viewer.uniqueIdentifier(), viewer.name()), true, 0, GameMode.getById(viewer.gameMode()), Component.empty(), null))); - viewer.connection().send(new WrapperPlayServerCamera(viewer.entityId())); - viewer.connection().send(new WrapperPlayServerDestroyEntities(background.id().intValue(), camera.id().intValue(), cursorDisplay.id().intValue())); - viewer.connection().send(new WrapperPlayServerPlayerRotation((float) rotation.x(), (float) rotation.y())); - viewer.connection().send(new WrapperPlayServerPlayerPositionAndLook(viewer.position().x(), viewer.position().y(), viewer.position().z(), (float) rotation.x(), (float) rotation.y(), (byte)0, 0, false)); - referenceHolder.references().forEach(reference -> viewer.connection().send(new WrapperPlayServerDestroyEntities(reference.t().id().intValue()))); - } - - @Override - public OpenedMenu apply(Draft draft) { - Draft.Impl draftImpl = (Draft.Impl) draft; - for (Edit edit : draftImpl.edits()) { - if (edit.type() == Div.class) { - Edit
divEdit = (Edit
) edit; - Div div = divHashMap.get(edit.identifier()); - for (Function draftEdit : divEdit.edits()) { - div = draftEdit.apply(div); - } - divHashMap.put(edit.identifier(), div); - update(div); - } else if (edit.type() == Element.class) { - Edit> elementEdit = (Edit>) edit; - Element element = divHashMap.get(edit.identifier()).elements().stream().filter(e -> e.identifier().equals(edit.identifier())).findFirst().orElse(null); - for (Function, Element> draftEdit : elementEdit.edits()) { - element = draftEdit.apply(element); - } - Div div = divHashMap.get(edit.identifier()); - div.remove(edit.identifier()); - div.add(element); - divHashMap.put(edit.identifier(), div); - update(div); - } - } - return this; - } - - public Div div(Identifier identifier) { - return (Div) divHashMap.get(identifier); - } - - protected void showCursor(Vec2d start) { - start = start.add(0.003, 0.010); - cursorDisplay.text(Component.text("e").font(Key.key("comet:arrow"))); - cursorDisplay.backgroundColor(0); - cursorDisplay.transformationDuration(1); - cursorDisplay.teleportationDuration(1); - cursorDisplay.billboard(Display.Billboard.CENTER); - cursorDisplay.brightness(15, 15); - Display.Transformation transformation = Display.Transformation.transformation().translation(Vector3d.vec3(0, start.y(), -0.24999)).scale(Vector3d.vec3((double) 1/24, (double) 1/24, (double) 1/24)); - cursorDisplay.transformation(transformation); - viewer.show(cursorDisplay); - } - - /** - * Opens the openedMenu and sends the necessary packets to the viewer. - * @param user User to open the openedMenu for. - */ - public void open(SunscreenUser user) { - user.connection().send(new WrapperPlayServerPlayerRotation(0, -180)); - camera = TextDisplay.textDisplay(user.position().add(Vector3d.vec3(0, 1.62, 0))); - Vector3d rotation = Vector3d.vec3(user.rotation().y(), user.rotation().x(), user.rotation().z()); - camera.rotation(rotation); - user.show(camera); - if (SunscreenLibrary.library().config().forceShaderFov()) { - user.fov(70); - } - user.connection().send(new WrapperPlayServerCamera(camera.id().intValue())); - user.connection().send(new WrapperPlayServerChangeGameState(WrapperPlayServerChangeGameState.Reason.CHANGE_GAME_MODE, 3)); - user.connection().send(new WrapperPlayServerPlayerInfoUpdate(WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_GAME_MODE, new WrapperPlayServerPlayerInfoUpdate.PlayerInfo(new UserProfile(user.uniqueIdentifier(), user.name()), true, 0, GameMode.SPECTATOR, Component.empty(), null))); - List entityIds = new ArrayList<>(); - if (cursor instanceof EntityCursor entityCursor) { - entityIds.add(entityCursor.entity().id().intValue()); - entityIds.add(user.entityId()); - } else if (cursor instanceof ClientsideCursor clientsideCursor) { - entityIds.add(clientsideCursor.horse().id().intValue()); - } - initBackground(); - lastInput = cursor.startPos(viewer); - //showCursor(Vec2d.of(0, lastInput.y())); - entityIds.add(cursorDisplay.id().intValue()); - entityIds.add(background.id().intValue()); - Scheduler.async(() -> { - divHashMap.values().forEach(d -> renderer.render((Div) d, user)); - entityIds.addAll(referenceHolder.references().stream().map(Reference::t).map(TextDisplay::id).map(Entity.EntityId::intValue).toList()); - riding.addAll(entityIds); - user.connection().send(new WrapperPlayServerSetPassengers(camera.id().intValue(), ArrayUtils.toPrimitive(entityIds.toArray(new Integer[0])))); - cursor.show(viewer); - return null; - }); - } - - private void initBackground() { - Display.Transformation tempTransformation = Display.Transformation.transformation().translation(Vector3d.vec3(0, -60, -0.27)).scale(Vector3d.vec3(500, 500, (double) 1/24)); - background.billboard(Display.Billboard.CENTER); - background.text(Component.text(" ")); - background.transformation(tempTransformation); - background.brightness(15, 15); - background.backgroundColor(-16184812); - viewer.show(background); - } - - } - - class Float extends FloatImpl { - public Float(SunscreenUser viewer, MenuTemplate template) { - super(viewer, template); - } - - public Float(SunscreenUser viewer) { - super(viewer, new MenuTemplate.Simple(MenuTemplate.Type.FLOAT, null)); - MenuTemplate template = template(); - if (template == null) { - throw new IllegalStateException("template() in Float menu isn't overridden, please change or contact devs if you did override."); - } - divHashMap.putAll(((MenuTemplate.Simple)template()).create()); - forceDivGeometry(viewer); - open(viewer); - } - - public MenuTemplate template() { - //OVERRIDE - return null; - } - - } - - class MenuHelper { - public static void send(SunscreenUser viewer, Entity textDisplay) { - List> entityData = textDisplay.type().metadata().entityData(); - WrapperPlayServerEntityMetadata clientEntityMetadata = new WrapperPlayServerEntityMetadata(textDisplay.id().intValue(), entityData); - viewer.connection().send(clientEntityMetadata); - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/ScreenSize.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/ScreenSize.java index f3f2270..dd99c9f 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/ScreenSize.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/menu/ScreenSize.java @@ -1,9 +1,9 @@ package me.combimagnetron.sunscreen.menu; import me.combimagnetron.passport.internal.network.ByteBuffer; -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.data.Pair; +import me.combimagnetron.sunscreen.util.math.Vec2d; +import me.combimagnetron.sunscreen.util.math.Vec2i; import java.util.*; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/ClientsideCursor.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/ClientsideCursor.java deleted file mode 100644 index 535597a..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/ClientsideCursor.java +++ /dev/null @@ -1,101 +0,0 @@ -package me.combimagnetron.sunscreen.menu.cursor; - -import com.github.retrooper.packetevents.protocol.attribute.Attributes; -import com.github.retrooper.packetevents.protocol.item.ItemStack; -import com.github.retrooper.packetevents.protocol.item.type.ItemTypes; -import com.github.retrooper.packetevents.protocol.player.ClientVersion; -import com.github.retrooper.packetevents.protocol.player.Equipment; -import com.github.retrooper.packetevents.protocol.player.EquipmentSlot; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDestroyEntities; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityEquipment; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSetPassengers; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerUpdateAttributes; -import me.combimagnetron.passport.internal.entity.impl.passive.horse.Color; -import me.combimagnetron.passport.internal.entity.impl.passive.horse.Horse; -import me.combimagnetron.passport.internal.entity.impl.passive.horse.Marking; -import me.combimagnetron.passport.internal.entity.impl.passive.horse.Variant; -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.sunscreen.element.impl.ImageElement; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; -import me.combimagnetron.sunscreen.util.ViewportHelper; - -import java.util.List; -import java.util.UUID; - -public class ClientsideCursor implements Cursor { - private static final WrapperPlayServerUpdateAttributes.PropertyModifier MODIFIER = new WrapperPlayServerUpdateAttributes.PropertyModifier(UUID.randomUUID(), 0, WrapperPlayServerUpdateAttributes.PropertyModifier.Operation.MULTIPLY_BASE); - private static final Variant VARIANT = Variant.of(Color.BLACK, Marking.NONE); - private final SunscreenUser user; - private final Horse horse; - - protected ClientsideCursor(SunscreenUser user) { - this.user = user; - this.horse = Horse.horse(user.position()); - horse.variant(VARIANT); - } - - @Override - public void show(SunscreenUser user) { - EquipmentSlot equipmentSlot = EquipmentSlot.BODY; - if (user.clientVersion().getProtocolVersion() >= ClientVersion.V_1_21_5.getProtocolVersion()) { - equipmentSlot = EquipmentSlot.SADDLE; - } else { - horse.saddled(true); - } - WrapperPlayServerEntityEquipment entityEquipment = new WrapperPlayServerEntityEquipment(horse.id().intValue(), List.of(new Equipment(equipmentSlot, ItemStack.builder().type(ItemTypes.SADDLE).build()))); - WrapperPlayServerSetPassengers passengers = new WrapperPlayServerSetPassengers(horse.id().intValue(), new int[]{user.entityId()}); - List attributes = List.of( - new WrapperPlayServerUpdateAttributes.Property( - Attributes.JUMP_STRENGTH, - 0.0D, - List.of(MODIFIER) - ), - new WrapperPlayServerUpdateAttributes.Property( - Attributes.SCALE, - 0.01, - List.of(MODIFIER) - ) - ); - WrapperPlayServerUpdateAttributes updateAttributes = new WrapperPlayServerUpdateAttributes(horse.id().intValue(), attributes); - user.show(horse); - user.connection().send(updateAttributes); - user.connection().send(entityEquipment); - user.connection().send(passengers); - } - - public Horse horse() { - return horse; - } - - @Override - public void move(Vec2i vec2i) { - - } - - @Override - public void hide() { - - } - - @Override - public void show() { - - } - - @Override - public void remove() { - WrapperPlayServerDestroyEntities destroyEntities = new WrapperPlayServerDestroyEntities(horse.id().intValue()); - user.connection().send(destroyEntities); - } - - @Override - public Vec2d startPos(SunscreenUser user) { - Position position = Position.position().x().percentage(50).back().y().pixel(10).back().finish(user.screenSize().pixel(), Vec2i.of(0, 0)); - Vector3d vector3d = ViewportHelper.toTranslation(Vec2i.of(position.x().pixel(), position.y().pixel()), user.screenSize()); - return Vec2d.of(vector3d.x(), vector3d.y()); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/Cursor.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/Cursor.java deleted file mode 100644 index a678289..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/Cursor.java +++ /dev/null @@ -1,25 +0,0 @@ -package me.combimagnetron.sunscreen.menu.cursor; - -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; - -public interface Cursor { - - void show(SunscreenUser user); - - void move(Vec2i vec2i); - - void hide(); - - void show(); - - void remove(); - - Vec2d startPos(SunscreenUser user); - - static Cursor client(SunscreenUser user) { - return new ClientsideCursor(user); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/EntityCursor.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/EntityCursor.java deleted file mode 100644 index 8a169d0..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/cursor/EntityCursor.java +++ /dev/null @@ -1,59 +0,0 @@ -package me.combimagnetron.sunscreen.menu.cursor; - -import me.combimagnetron.passport.internal.entity.Entity; -import me.combimagnetron.passport.internal.entity.impl.display.Display; -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; - -public interface EntityCursor extends Cursor { - - Entity entity(); - - class TextDisplayCursor implements EntityCursor { - private final TextDisplay textDisplay; - - protected TextDisplayCursor(SunscreenUser user) { - textDisplay = TextDisplay.textDisplay(user.position()); - } - - @Override - public Entity entity() { - return null; - } - - @Override - public void show(SunscreenUser user) { - - } - - @Override - public void move(Vec2i vec2i) { - Display.Transformation transformation = Display.Transformation.transformation().translation(Vector3d.vec3(vec2i.x(), vec2i.y(), -0.24999)).scale(Vector3d.vec3((double) 1/24, (double) 1/24, (double) 1/24)); - textDisplay.transformation(transformation); - } - - @Override - public void hide() { - - } - - @Override - public void show() { - - } - - @Override - public void remove() { - - } - - @Override - public Vec2d startPos(SunscreenUser user) { - return null; - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/draft/Draft.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/draft/Draft.java deleted file mode 100644 index e512214..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/draft/Draft.java +++ /dev/null @@ -1,180 +0,0 @@ -package me.combimagnetron.sunscreen.menu.draft; - -import me.combimagnetron.sunscreen.menu.editor.Editable; -import me.combimagnetron.sunscreen.element.div.Edit; -import me.combimagnetron.sunscreen.element.div.ScrollableDiv; -import me.combimagnetron.sunscreen.style.Style; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.element.Element; -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.element.div.Div; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Function; - -public interface Draft { - Draft element(Element element, Position position); - - Draft div(Div div, Position position); - - Draft edit(Edit edit); - - final class ElementSubSection implements SubSection { - private final List> element = new ArrayList<>(); - private final Edit.EditBuilder editBuilder; - - public ElementSubSection(Edit.EditBuilder element) { - this.editBuilder = element; - } - - public ElementSubSection position(Position pos) { - element.add(d -> d.position(pos)); - return this; - } - - public ElementSubSection edit(Class type, Function edit) { - element.add((Function) edit); - return this; - } - - public ElementSubSection style(Style style, Position position, T t) { - element.add(d -> d.style(style, position, t)); - return this; - } - - public ElementSubSection style(Style style, T t) { - element.add(d -> d.style(style, t)); - return this; - } - - @Override - public List> product() { - return element; - } - - @Override - public Edit.EditBuilder back() { - return editBuilder; - } - - } - - final class ScrollDivSubSection extends DivSubSection { - - public ScrollDivSubSection(Edit.EditBuilder builder) { - super(builder); - } - - public ScrollDivSubSection scroll(double percentage) { - div.add(d -> ((ScrollableDiv)d).scroll(percentage)); - return this; - } - - public ScrollDivSubSection scroll(int pixel) { - div.add(d -> ((ScrollableDiv)d).scroll(pixel)); - return this; - } - - } - - class DivSubSection implements SubSection
{ - protected final List> div = new ArrayList<>(); - private final Edit.EditBuilder editBuilder; - - public DivSubSection(Edit.EditBuilder builder) { - this.editBuilder = builder; - } - - public DivSubSection position(Position pos) { - div.add(d -> d.position(pos)); - return this; - } - - public DivSubSection add(Element element) { - div.add(d -> d.add(element)); - return this; - } - - public DivSubSection remove(Identifier identifier) { - div.add(d -> d.remove(identifier)); - return this; - } - - public DivSubSection remove(Element element) { - div.add(d -> d.remove(element)); - return this; - } - - public DivSubSection hide(Identifier identifier) { - div.add(d -> d.hide(identifier)); - return this; - } - - public DivSubSection hide(Element element) { - div.add(d -> d.hide(element)); - return this; - } - - public DivSubSection show(Identifier identifier) { - div.add(d -> d.show(identifier)); - return this; - } - - public DivSubSection show(Element element) { - div.add(d -> d.show(element)); - return this; - } - - @Override - public List> product() { - return div; - } - - @Override - public Edit.EditBuilder back() { - return editBuilder; - } - - - } - - static Draft draft() { - return new Impl(); - } - - class Impl implements Draft { - private final Set> edits = new HashSet<>(); - - @Override - public Draft element(Element element, Position position) { - return this; - } - - @Override - public Draft div(Div div, Position position) { - return this; - } - - public Set> edits() { - return edits; - } - - @Override - public Draft edit(Edit edit) { - edits.add(edit); - return this; - } - } - - interface SubSection { - - List> product(); - - > Edit.EditBuilder back(); - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/listener/AnvilListener.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/listener/AnvilListener.java deleted file mode 100644 index bb0e230..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/listener/AnvilListener.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.combimagnetron.sunscreen.menu.listener; - -import com.github.retrooper.packetevents.event.PacketListener; -import com.github.retrooper.packetevents.event.PacketSendEvent; -import com.github.retrooper.packetevents.protocol.packettype.PacketType; -import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerOpenWindow; -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.FontUtil; -import net.kyori.adventure.key.Key; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; - -public class AnvilListener implements PacketListener { - private final static Component ANVIL = Component.empty().append(FontUtil.offset(-60).font(Key.key("comet:offset"))).append(Component.text("a").font(Key.key("comet:anvil"))).append(FontUtil.offset(-118)).append(Component.text("b").font(Key.key("comet:anvil"))).color(NamedTextColor.WHITE).append(FontUtil.offset(-110)); - - @Override - public void onPacketSend(PacketSendEvent event) { - if (event.getPacketType() != PacketType.Play.Server.OPEN_WINDOW) { - return; - } - WrapperPlayServerOpenWindow openWindow = new WrapperPlayServerOpenWindow(event); - if (openWindow.getType() != 8) { - return; - } - SunscreenUser user = SunscreenLibrary.library().users().user(event.getUser().getUUID()).orElse(null); - if (user == null) { - return; - } - if (user.session().menu() != null) { - return; - } - Component title = openWindow.getTitle(); - Component product = ANVIL.append(title.color(NamedTextColor.DARK_GRAY)).font(Key.key("default")); - openWindow.setTitle(product); - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/menu/listener/MenuListener.java b/api/src/main/java/me/combimagnetron/sunscreen/menu/listener/MenuListener.java deleted file mode 100644 index cef92a8..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/menu/listener/MenuListener.java +++ /dev/null @@ -1,272 +0,0 @@ -package me.combimagnetron.sunscreen.menu.listener; - -import com.github.retrooper.packetevents.event.PacketListener; -import com.github.retrooper.packetevents.event.PacketReceiveEvent; -import com.github.retrooper.packetevents.event.PacketSendEvent; -import com.github.retrooper.packetevents.protocol.packettype.PacketType; -import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon; -import com.github.retrooper.packetevents.protocol.player.InteractionHand; -import com.github.retrooper.packetevents.wrapper.play.client.*; -import com.github.retrooper.packetevents.wrapper.play.server.*; -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.menu.input.InputHandler; -import me.combimagnetron.sunscreen.menu.simulate.ChestMenuEmulator; -import me.combimagnetron.sunscreen.session.Session; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import net.kyori.adventure.audience.Audience; - -import java.util.*; - -public class MenuListener implements PacketListener { - private final List inChestEmulator = new ArrayList<>(); - - @Override - public void onPacketReceive(PacketReceiveEvent event) { - Optional> userOptional = SunscreenLibrary.library().users().user(event.getUser().getUUID()); - if (userOptional.isEmpty()) { - return; - } - SunscreenUser user = userOptional.get(); - if (user.session() == null) { - return; - } - switch(event.getPacketType()) { - case PacketType.Play.Client.PLAYER_ROTATION: - handlePlayerRotation(new WrapperPlayClientPlayerRotation(event), user); - break; - case PacketType.Play.Client.ENTITY_ACTION: - handleEntityAction(new WrapperPlayClientEntityAction(event), user); - break; - case PacketType.Play.Client.ANIMATION: - handleAnimation(new WrapperPlayClientAnimation(event), user); - break; - case PacketType.Play.Client.CHAT_MESSAGE: - handleChatMessage(new WrapperPlayClientChatMessage(event), user); - break; - case PacketType.Play.Client.PLAYER_INPUT: - handlePlayerInput(new WrapperPlayClientPlayerInput(event), user); - case PacketType.Play.Client.NAME_ITEM: - handleItemName(new WrapperPlayClientNameItem(event), user); - break; - case PacketType.Play.Client.CLICK_WINDOW: - handleClickWindow(new WrapperPlayClientClickWindow(event), user); - break; - case PacketType.Play.Client.HELD_ITEM_CHANGE: - handleHeldItemChange(new WrapperPlayClientHeldItemChange(event), user); - break; - case PacketType.Play.Client.INTERACT_ENTITY: - handleInteractEntity(event, user); - break; - case PacketType.Play.Client.DEBUG_PING: - handleDebugPing(event, user); - break; - default: - break; - } - } - - private void handleDebugPing(PacketReceiveEvent event, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - WrapperPlayClientDebugPing wrapperPlayClientDebugPing = new WrapperPlayClientDebugPing(event); - long ping = System.currentTimeMillis() - wrapperPlayClientDebugPing.getTimestamp(); - if (openedMenu instanceof OpenedMenu.Base base) { - base.handlePing(ping); - } - } - - private void handleInteractEntity(PacketReceiveEvent event, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - WrapperPlayClientInteractEntity wrapperPlayClientInteractEntity = new WrapperPlayClientInteractEntity(event); - if (wrapperPlayClientInteractEntity.getEntityId() != user.entityId()) { - return; - } - event.setCancelled(true); - } - - private void handleHeldItemChange(WrapperPlayClientHeldItemChange wrapperPlayClientHeldItemChange, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (openedMenu instanceof OpenedMenu.Base base) { - base.handleScroll(wrapperPlayClientHeldItemChange.getSlot()); - } - } - - private void handlePlayerInput(WrapperPlayClientPlayerInput wrapperPlayClientPlayerInput, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (!(openedMenu instanceof OpenedMenu.Base base)) { - return; - } - if (!wrapperPlayClientPlayerInput.isShift()) { - return; - } - base.handleSneak(); - } - - private void handleClickWindow(WrapperPlayClientClickWindow packet, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (openedMenu instanceof OpenedMenu.Base base && base.inputHandler().active()) { - InputHandler inputHandler = base.inputHandler(); - inputHandler.quit(); - } - } - - private void handleItemName(WrapperPlayClientNameItem packet, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (openedMenu instanceof OpenedMenu.Base base && base.inputHandler().active()) { - InputHandler inputHandler = base.inputHandler(); - //inputHandler.textInput().handle(packet.getItemName()); - base.handleText(packet.getItemName()); - } - } - - private void handlePlayerRotation(WrapperPlayClientPlayerRotation packet, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (openedMenu instanceof OpenedMenu.Base base) { - base.handleRot(packet.getYaw(), packet.getPitch()); - } - } - - private static OpenedMenu menu(SunscreenUser user) { - Session session = user.session(); - if (session == null) { - return null; - } - return session.menu(); - } - - private void handleEntityAction(WrapperPlayClientEntityAction packet, SunscreenUser user) { - if (packet.getAction() == WrapperPlayClientEntityAction.Action.STOP_SNEAKING || packet.getAction() == WrapperPlayClientEntityAction.Action.OPEN_HORSE_INVENTORY) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (openedMenu instanceof OpenedMenu.Base base) { - base.handleSneak(); - } - } - } - - private void handleAnimation(WrapperPlayClientAnimation packet, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (packet.getHand() != InteractionHand.MAIN_HAND) { - return; - } - if (openedMenu instanceof OpenedMenu.Base base) { - base.handleClick(); - } - } - - private void handleChatMessage(WrapperPlayClientChatMessage packet, SunscreenUser user) { - } - - @Override - public void onPacketSend(PacketSendEvent event) { - Optional> userOptional = SunscreenLibrary.library().users().user(event.getUser().getUUID()); - if (userOptional.isEmpty()) { - return; - } - SunscreenUser user = userOptional.get(); - if (user.session() == null) { - return; - } - switch (event.getPacketType()) { - case PacketType.Play.Server.SYSTEM_CHAT_MESSAGE: - handleSystemChatMessageSend(event, user); - break; - case PacketType.Play.Server.CHAT_MESSAGE: - handleChatMessageSend(event, user); - break; - case PacketType.Play.Server.DAMAGE_EVENT: - handleDamageEventSend(event, user); - case PacketType.Play.Server.TIME_UPDATE: - handleTimeUpdateSend(event, user); - case PacketType.Play.Server.PLAYER_POSITION_AND_LOOK, PacketType.Play.Server.PLAYER_ROTATION: - //event.setCancelled(true); - break; - case PacketType.Play.Server.OPEN_WINDOW: - handleOpenWindowSend(event, user); - break; - default: - break; - } - } - - private void handleSystemChatMessageSend(PacketSendEvent event, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - event.setCancelled(true); - } - - private void handleOpenWindowSend(PacketSendEvent event, SunscreenUser user) { - WrapperPlayServerOpenWindow packet = new WrapperPlayServerOpenWindow(event); - if (!inChestEmulator.contains(user.uniqueIdentifier())) { - return; - } - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - - } - - private void handleTimeUpdateSend(PacketSendEvent event, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - if (!event.getPacketType().equals(PacketType.Play.Server.TIME_UPDATE)) { - return; - } - WrapperPlayServerTimeUpdate packet = new WrapperPlayServerTimeUpdate(event); - packet.setWorldAge(-1000); - } - - private void handleChatMessageSend(PacketSendEvent event, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - event.setCancelled(true); - } - - private void handleDamageEventSend(PacketSendEvent event, SunscreenUser user) { - OpenedMenu openedMenu = menu(user); - if (openedMenu == null) { - return; - } - WrapperPlayServerDamageEvent packet = new WrapperPlayServerDamageEvent(event); - if (packet.getEntityId() != user.entityId()) { - return; - } - if (openedMenu instanceof OpenedMenu.Base base) { - base.handleDamage(); - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/MapMenuRenderer.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/MapMenuRenderer.java deleted file mode 100644 index b4e45a5..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/MapMenuRenderer.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.renderer; - -public interface MapMenuRenderer extends MenuRenderer { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/MenuRenderer.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/MenuRenderer.java deleted file mode 100644 index 2f9298e..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/MenuRenderer.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.combimagnetron.sunscreen.renderer; - -public interface MenuRenderer { -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/CombinedDivRenderer.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/CombinedDivRenderer.java deleted file mode 100644 index 8e08a15..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/CombinedDivRenderer.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.div; - -import me.combimagnetron.passport.internal.entity.impl.display.ItemDisplay; -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.user.SunscreenUser; - -public final class CombinedDivRenderer implements DivRenderer { - private final ReferenceHolder referenceHolder = ReferenceHolder.object(); - private final DivRenderer fontDivRenderer = DivRenderer.font(); - private final DivRenderer itemDivRenderer = DivRenderer.item(); - - @Override - public Reference render(Div div, SunscreenUser user) { - if (div.canvas() instanceof TextDisplay) { - //return fontDivRenderer.render((Div) div, user); - } else if (div.canvas() instanceof ItemDisplay) { - ///return itemDivRenderer.render((Div) div, user); - } - return null; - } - - @Override - public ReferenceHolder referenceHolder() { - return referenceHolder; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/DivRenderer.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/DivRenderer.java deleted file mode 100644 index c6215d5..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/DivRenderer.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.div; - -import me.combimagnetron.passport.internal.entity.impl.display.ItemDisplay; -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.user.SunscreenUser; - -public sealed interface DivRenderer permits CombinedDivRenderer, FontDivRenderer, ItemDivRenderer { - - static DivRenderer font() { - return new FontDivRenderer(); - } - - static DivRenderer item() { - return new ItemDivRenderer(); - } - - Reference render(Div div, SunscreenUser user); - - ReferenceHolder referenceHolder(); - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/FontDivRenderer.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/FontDivRenderer.java deleted file mode 100644 index 81ddcf4..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/FontDivRenderer.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.div; - -import me.combimagnetron.passport.internal.entity.impl.display.Display; -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.image.CanvasRenderer; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.menu.ScreenSize; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.ViewportHelper; -import net.kyori.adventure.text.Component; - -public final class FontDivRenderer implements DivRenderer { - private final ReferenceHolder referenceHolder = ReferenceHolder.font(); - - @Override - public Reference render(Div div, SunscreenUser user) { - return referenceHolder.reference(subrender(div, user), div); - } - - @Override - public ReferenceHolder referenceHolder() { - return referenceHolder; - } - - private TextDisplay subrender(Div div, SunscreenUser user) { - TextDisplay textDisplay = TextDisplay.textDisplay(user.position()); - Canvas canvas = div.render(user); - CanvasRenderer.Frame frame = CanvasRenderer.optimized().render(canvas); - Component text = frame.component(); - textDisplay.text(text); - textDisplay.billboard(Display.Billboard.CENTER); - textDisplay.brightness(15, 15); - textDisplay.lineWidth(200000); - //textDisplay.backgroundColor(0); - Display.Transformation transformation = Display.Transformation.transformation(); - ScreenSize screenSize = user.screenSize(); - transformation = transformation.translation( - ViewportHelper.toTranslation( - ViewportHelper.fromPosition(div.position()), user.screenSize()) - .add(Vector3d.vec3(((screenSize.coordinates().v().x() - screenSize.coordinates().k().x() - 0.0072)/screenSize.pixel().x()) * div.size().x() * 0.5, -((screenSize.coordinates().v().y() - screenSize.coordinates().k().y() + 0.01314)/screenSize.pixel().y()) * (div.size().y())/* - 0.00005 * frame.r() * div.size().y() */, -0.25 + ((double) 1 /1_000_000) * div.order())).mul(div.scale())); - transformation = transformation.scale(Vector3d.vec3((double) 1 /24).mul(div.scale())); - textDisplay.transformation(transformation); - user.show(textDisplay); - return textDisplay; - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ItemDivRenderer.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ItemDivRenderer.java deleted file mode 100644 index 7bb5795..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ItemDivRenderer.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.div; - -import me.combimagnetron.passport.internal.entity.impl.display.Display; -import me.combimagnetron.passport.internal.entity.impl.display.ItemDisplay; -import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.passport.internal.item.Item; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.ViewportHelper; - -public final class ItemDivRenderer implements DivRenderer { - private final ReferenceHolder referenceHolder = ReferenceHolder.item(); - - @Override - public Reference render(Div div, SunscreenUser user) { - if (div.canvas() instanceof Item item) { - ItemDisplay itemDisplay = ItemDisplay.itemDisplay(user.position()); - itemDisplay.item(item); - itemDisplay.billboard(ItemDisplay.Billboard.CENTER); - itemDisplay.brightness(15, 15); - itemDisplay.displayType(ItemDisplay.DisplayType.GUI); - Display.Transformation transformation = Display.Transformation.transformation(); - transformation = transformation.translation(ViewportHelper.toTranslation(ViewportHelper.fromPosition(div.position()).add((int) (div.size().x() * 0.5 * div.scale().x()), (int) (div.size().y() * div.scale().y())), user.screenSize()).add(Vector3d.vec3(0, 0, -0.25 + Integer.MIN_VALUE * div.order()))); - transformation = transformation.scale(Vector3d.vec3((double) 1 / 24).mul(div.scale())); - itemDisplay.transformation(transformation); - return referenceHolder.reference(itemDisplay, div); - } - return null; - } - - @Override - public ReferenceHolder referenceHolder() { - return referenceHolder; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/Reference.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/Reference.java deleted file mode 100644 index 8ce0918..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/Reference.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.div; - -import me.combimagnetron.passport.internal.entity.Entity; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.util.Identifier; - -public interface Reference { - - Div div(); - - T t(); - - Identifier identifier(); - - static Reference of(T t, Div div) { - return new ReferenceImpl<>(t, div.identifier(), div); - } - - static Reference entity(Entity t, Div div) { - return new EntityReference(t, div.identifier(), div); - } - - record ReferenceImpl(T t, Identifier identifier, Div div) implements Reference { - - } - - record EntityReference(Entity t, Identifier identifier, Div div) implements Reference { - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ReferenceHolder.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ReferenceHolder.java deleted file mode 100644 index f65cff1..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/div/ReferenceHolder.java +++ /dev/null @@ -1,103 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.div; - -import me.combimagnetron.passport.internal.entity.impl.display.ItemDisplay; -import me.combimagnetron.passport.internal.entity.impl.display.TextDisplay; -import me.combimagnetron.sunscreen.element.div.Div; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.util.Collection; -import java.util.concurrent.ConcurrentHashMap; - -public interface ReferenceHolder { - - Reference reference(T t, Div div); - - Reference reference(Identifier identifier); - - Collection> references(); - - static ReferenceHolder font() { - return new FontImpl(); - } - - static ReferenceHolder item() { - return new ItemImpl(); - } - - static ReferenceHolder object() { - return new ObjectImpl(); - } - - class FontImpl implements ReferenceHolder { - private final ConcurrentHashMap> references = new ConcurrentHashMap<>(); - - @Override - public Reference reference(TextDisplay t, Div div) { - Reference reference = Reference.of(t, div); - references.put(div, reference); - return reference; - } - - @Override - public Reference reference(Identifier identifier) { - return references.values().stream() - .filter(reference -> reference.identifier().equals(identifier)) - .findFirst() - .orElse(null); - } - - @Override - public Collection> references() { - return references.values(); - } - } - - class ItemImpl implements ReferenceHolder { - private final ConcurrentHashMap> references = new ConcurrentHashMap<>(); - - @Override - public Reference reference(ItemDisplay t, Div div) { - Reference reference = Reference.of(t, div); - references.put(div, reference); - return reference; - } - - @Override - public Reference reference(Identifier identifier) { - return references.values().stream() - .filter(reference -> reference.identifier().equals(identifier)) - .findFirst() - .orElse(null); - } - - @Override - public Collection> references() { - return references.values(); - } - } - - class ObjectImpl implements ReferenceHolder { - private final ConcurrentHashMap> references = new ConcurrentHashMap<>(); - - @Override - public Reference reference(Object t, Div div) { - Reference reference = Reference.of(t, div); - references.put(div, reference); - return reference; - } - - @Override - public Reference reference(Identifier identifier) { - return references.values().stream() - .filter(reference -> reference.identifier().equals(identifier)) - .findFirst() - .orElse(null); - } - - @Override - public Collection> references() { - return references.values(); - } - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapProtocol.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapProtocol.java deleted file mode 100644 index 95c7d50..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapProtocol.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.map; - -import me.combimagnetron.passport.internal.network.ByteBuffer; -import me.combimagnetron.sunscreen.util.Vec2i; - -import java.awt.image.BufferedImage; - -public final class MapProtocol { - private static final byte Magic = 0x24; - - public static ByteBuffer write(Vec2i pos, Vec2i size, byte[] data) { - ByteBuffer byteBuffer = ByteBuffer.empty(); - byteBuffer.write(ByteBuffer.Adapter.BYTE, Magic); - byteBuffer.write(ByteBuffer.Adapter.INT, pos.x()); - byteBuffer.write(ByteBuffer.Adapter.INT, pos.y()); - byteBuffer.write(ByteBuffer.Adapter.INT, size.x()); - byteBuffer.write(ByteBuffer.Adapter.INT, size.y()); - byteBuffer.write(data); - return byteBuffer; - } - - public static byte[] encode(BufferedImage image) { - byte[] buffer = new byte[16384]; - - for (int x = 0; x < image.getWidth(); x++) { - for (int y = 0; y < image.getHeight(); y++) { - int d = image.getRGB(x, y); - int b1 = d & 0xFF; int msb1 = b1 >> 7; - int b2 = (d >> 8) & 0xFF; int msb2 = b2 >> 7; - int b3 = (d >> 16) & 0xFF; int msb3 = b3 >> 7; - int b4 = (msb3 << 2) | (msb2 << 1) | msb1; - b1 &= 0x7F; b2 &= 0x7F; b3 &= 0x7F; - buffer[(y * 2) * image.getWidth() * 2 + x * 2] = (byte) (b1 + 4); - buffer[(y * 2) * image.getWidth() * 2 + x * 2 + 1] = (byte) (b2 + 4); - buffer[(y * 2 + 1) * image.getWidth() * 2 + x * 2] = (byte) (b3 + 4); - buffer[(y * 2 + 1) * image.getWidth() * 2 + x * 2 + 1] = (byte) (b4 + 4); - } - } - - return buffer; - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapShader.java b/api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapShader.java deleted file mode 100644 index 48ac974..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/renderer/map/MapShader.java +++ /dev/null @@ -1,113 +0,0 @@ -package me.combimagnetron.sunscreen.renderer.map; - -import me.combimagnetron.sunscreen.resourcepack.CodeBlock; -import me.combimagnetron.sunscreen.resourcepack.ResourcePackManager; -import me.combimagnetron.sunscreen.resourcepack.ResourcePackPath; -import me.combimagnetron.sunscreen.resourcepack.feature.shader.Shader; -import me.combimagnetron.sunscreen.resourcepack.feature.shader.ShaderOverride; -import me.combimagnetron.sunscreen.resourcepack.meta.PackVersion; -import me.combimagnetron.sunscreen.util.Identifier; - -import java.util.Collection; -import java.util.List; - -public class MapShader implements Shader { - @Override - public Collection shaderOverrides() { - return List.of(); - } - - @Override - public PackVersion version() { - return null; - } - - @Override - public String name() { - return ""; - } - - @Override - public String description() { - return "Contains the map renderer and protocol implementation."; - } - - @Override - public String author() { - return "Combimagnetron"; - } - - @Override - public Section fragment() { - return Section.mojang( - CodeBlock.shader() - .line("void main() {") - , - CodeBlock.shader() - .line("// Generated by Sunscreen") - .line("// About:" + description()) - .line("// Author(s): " + author()) - .line("#include ") - .line("#include ") - , - CodeBlock.shader() - .line("uniform sampler2D map_texture;") - .line("uniform vec2 map_size;") - .line("uniform vec2 map_position;") - .line("uniform vec2 map_scale;") - .line("uniform vec2 map_rotation;") - , - CodeBlock.shader() - .line("vec2 map_position = vec2(0.0, 0.0);") - .line("vec2 map_scale = vec2(1.0, 1.0);") - .line("vec2 map_rotation = vec2(0.0, 0.0);") - ); - } - - @Override - public Section vertex() { - return Section.mojang( - CodeBlock.shader() - .line("void main() {") - , - CodeBlock.shader() - .line("// Generated by Sunscreen") - .line("// About:" + description()) - .line("// Author(s): " + author()) - .line("#moj_import ") - .line("#include ") - , - CodeBlock.shader() - .line("uniform sampler2D map_texture;") - .line("uniform vec2 map_size;") - .line("uniform vec2 map_position;") - .line("uniform vec2 map_scale;") - .line("uniform vec2 map_rotation;") - , - CodeBlock.shader() - .line("vec2 map_position = vec2(0.0, 0.0);") - .line("vec2 map_scale = vec2(1.0, 1.0);") - .line("vec2 map_rotation = vec2(0.0, 0.0);") - ); - } - - @Override - public Section customFragment() { - return null; - } - - @Override - public Section customVertex() { - return null; - } - - @Override - public Identifier identifier() { - return Identifier.of("sunscreen", "map_shader"); - } - - @Override - public ResourcePackPath path() { - return null; - } -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/Asset.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/Asset.java index 842789c..7b68a76 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/Asset.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/Asset.java @@ -1,6 +1,6 @@ package me.combimagnetron.sunscreen.resourcepack; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; public interface Asset { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Font.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Font.java index 209ef27..0930b48 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Font.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Font.java @@ -2,8 +2,7 @@ import me.combimagnetron.sunscreen.resourcepack.Asset; import me.combimagnetron.sunscreen.resourcepack.CodeBlock; -import me.combimagnetron.sunscreen.resourcepack.ResourcePackFeature; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; import java.util.Collection; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/FontFeature.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/FontFeature.java index a90715f..0ff9f0d 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/FontFeature.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/FontFeature.java @@ -1,7 +1,7 @@ package me.combimagnetron.sunscreen.resourcepack.feature.font; import me.combimagnetron.sunscreen.resourcepack.ResourcePackFeature; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; import java.util.Collection; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Glyph.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Glyph.java index 645e861..0691e28 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Glyph.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/feature/font/Glyph.java @@ -1,8 +1,7 @@ package me.combimagnetron.sunscreen.resourcepack.feature.font; import me.combimagnetron.sunscreen.resourcepack.Asset; -import me.combimagnetron.sunscreen.resourcepack.sprite.Sprite; -import me.combimagnetron.sunscreen.util.Pair; +import me.combimagnetron.sunscreen.util.data.Pair; public interface Glyph extends Asset { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackMeta.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackMeta.java index c9b0797..7d2106b 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackMeta.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackMeta.java @@ -1,9 +1,6 @@ package me.combimagnetron.sunscreen.resourcepack.meta; import me.combimagnetron.sunscreen.resourcepack.CodeBlock; -import me.combimagnetron.sunscreen.resourcepack.sprite.Sprite; - -import java.util.Objects; public interface PackMeta { @@ -15,12 +12,6 @@ public interface PackMeta { String name(); - Sprite icon(); - - static PackMeta meta(PackVersion version, String description, String name, Sprite icon) { - return new Impl(version, description, name, icon); - } - static PackMeta meta(PackVersion version, String description, String name) { return new Impl(version, description, name); } @@ -29,17 +20,11 @@ final class Impl implements PackMeta { private final PackVersion version; private final String description; private final String name; - private Sprite icon; - public Impl(PackVersion version, String description, String name, Sprite icon) { + public Impl(PackVersion version, String description, String name) { this.version = version; this.description = description; this.name = name; - this.icon = icon; - } - - public Impl(PackVersion version, String description, String name) { - this(version, description, name, null); } @Override @@ -62,36 +47,6 @@ public String name() { return name; } - @Override - public Sprite icon() { - return icon; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) return true; - if (obj == null || obj.getClass() != this.getClass()) return false; - var that = (Impl) obj; - return Objects.equals(this.version, that.version) && - Objects.equals(this.description, that.description) && - Objects.equals(this.name, that.name) && - Objects.equals(this.icon, that.icon); - } - - @Override - public int hashCode() { - return Objects.hash(version, description, name, icon); - } - - @Override - public String toString() { - return "Impl[" + - "version=" + version + ", " + - "description=" + description + ", " + - "name=" + name + ", " + - "icon=" + icon + ']'; - } - } } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackVersion.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackVersion.java index dee85a8..27ead8b 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackVersion.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/meta/PackVersion.java @@ -1,6 +1,6 @@ package me.combimagnetron.sunscreen.resourcepack.meta; -import me.combimagnetron.sunscreen.util.Range; +import me.combimagnetron.sunscreen.util.data.Range; public interface PackVersion { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/Sprite.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/Sprite.java deleted file mode 100644 index 206569e..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/Sprite.java +++ /dev/null @@ -1,121 +0,0 @@ -package me.combimagnetron.sunscreen.resourcepack.sprite; - -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.resourcepack.ResourcePackPath; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.file.Path; - -public interface Sprite { - - ResourcePackPath path(); - - Canvas canvas(); - - Identifier identifier(); - - static Builder sprite() { - return new Builder(); - } - - class Builder { - private Identifier identifier; - private Type type = Type.BITMAP_SINGLE; - private Source source = Source.FILE; - private Path location; - private URL url; - - public Builder identifier(Identifier identifier) { - if (!check(this.identifier)) - return this; - this.identifier = identifier; - return this; - } - - public Builder type(Type type) { - this.type = type; - return this; - } - - public Builder source(Source source) { - this.source = source; - return this; - } - - public Builder location(Path path) { - if (this.source != Source.FILE) - return this; - this.location = path; - return this; - } - - public Builder url(String url) { - if (this.source != Source.URL) - return this; - try { - this.url = new URL(url); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - return this; - } - - public Sprite build() { - if (this.source == Source.URL && this.url == null || this.source == Source.FILE && this.location == null) - throw new IllegalArgumentException(); - BufferedImage image = switch (source) { - case URL -> { - try { - yield ImageIO.read(url); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - case FILE -> { - try { - yield ImageIO.read(location.toFile()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }; - return new Sprite() { - @Override - public ResourcePackPath path() { - return null; - } - - @Override - public Canvas canvas() { - return Canvas.image(image); - } - - @Override - public Identifier identifier() { - return identifier; - } - - }; - } - - private boolean check(Object object) { - return object == null; - } - - public enum Type { - BITMAP_SINGLE, BITMAP_SHEET - } - - public enum Source { - URL, FILE - } - } - - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/SpriteSheet.java b/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/SpriteSheet.java deleted file mode 100644 index 80238b9..0000000 --- a/api/src/main/java/me/combimagnetron/sunscreen/resourcepack/sprite/SpriteSheet.java +++ /dev/null @@ -1,74 +0,0 @@ -package me.combimagnetron.sunscreen.resourcepack.sprite; - -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.util.Vec2i; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.Map; - -public class SpriteSheet { - private final Canvas raster; - private final Vec2i tileSize; - private final Map sprites = new LinkedHashMap<>(); - - public static SpriteSheet of(Canvas raster, BufferedImage dataImage, Vec2i tileSize) { - return new SpriteSheet(raster, dataImage, tileSize); - } - - protected SpriteSheet(Canvas raster, BufferedImage dataImage, Vec2i tileSize) { - this.raster = raster; - this.tileSize = tileSize; - if (raster.size().x() % tileSize.x() != 0 || raster.size().y() % tileSize.y() != 0) - throw new RuntimeException("Raster doesn't tile correctly with given size!"); - int xSize = (int) ((raster.size().x() / tileSize.x()) - 1); - int ySize = (int) ((raster.size().y() / tileSize.y()) - 1); - for (int x = 0; x < xSize; x++) { - for (int y = 0; y < ySize; y++) { - raster.sub(tileSize, Vec2i.of(x, y)); - TileType type = TileType.byColor(new Color(dataImage.getRGB(x, y))); - sprites.put(Identifier.of("sprite_sheet", type.name().toLowerCase()), null); - } - } - } - - - - public Map sprites() { - return sprites; - } - - public enum TileType { - TOGGLE_BACKDROP(new Color(255, 255, 255)), TOGGLE_OFF(new Color(199, 220, 208)), TOGGLE_ON(new Color(166, 171, 178)), - BUTTON_VARIANT_1_START(new Color(249, 194, 43)), BUTTON_VARIANT_1_CENTER(new Color(247, 150, 23)), BUTTON_VARIANT_1_END(new Color(251, 107, 29)), - BUTTON_VARIANT_2_START(new Color(251, 185, 84)), BUTTON_VARIANT_2_CENTER(new Color(230, 144, 78)), BUTTON_VARIANT_2_END(new Color(205, 104, 61)), - TAB_VARIANT_1(new Color(234, 173, 237)), TAB_VARIANT_2(new Color(168, 132, 243)), TAB_VARIANT_3(new Color(144, 94, 169)), - TEXT_BOX_START(new Color(143, 211, 255)), TEXT_BOX_CENTER(new Color(77, 155, 230)), TEXT_BOX_END(new Color(77, 101, 180)), - MINIMIZE(new Color(178, 186, 144)), ENLARGE(new Color(146, 169, 132)), CLOSE(new Color(84, 126, 100)), - MINIMIZE_OFF(new Color(143, 248, 226)), ENLARGE_OFF(new Color(48, 225, 185)), CLOSE_OFF(new Color(14, 175, 155)), - WINDOW_TOP_LEFT(new Color(235, 203, 176)), WINDOW_TOP_CENTER(new Color(252, 167, 144)), WINDOW_TOP_RIGHT(new Color(246, 129, 129)), - WINDOW_MIDDLE_LEFT(new Color(240, 79, 120)), WINDOW_MIDDLE_CENTER(new Color(195, 36, 84)), WINDOW_MIDDLE_RIGHT(new Color(131, 28, 93)), - WINDOW_BOTTOM_LEFT(new Color(237, 128, 153)), WINDOW_BOTTOM_CENTER(new Color(207, 101, 127)), WINDOW_BOTTOM_RIGHT(new Color(162, 75, 111)), - UNKNOWN(new Color(0,0,0));//continue with rest of data file and set color. - - private final Color color; - - TileType(Color color) { - this.color = color; - } - - public Color color() { - return color; - } - - public static TileType byColor(Color color) { - return Arrays.stream(TileType.values()).filter(type -> type.color == color).findFirst().orElse(UNKNOWN); - } - - } - -} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java b/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java index 749e0b0..807d1c4 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/session/Session.java @@ -1,7 +1,6 @@ package me.combimagnetron.sunscreen.session; import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.menu.OpenedMenu; import me.combimagnetron.sunscreen.ui.ModernMenu; import me.combimagnetron.sunscreen.user.SunscreenUser; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/session/SessionHandler.java b/api/src/main/java/me/combimagnetron/sunscreen/session/SessionHandler.java index 22722f1..8d5243e 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/session/SessionHandler.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/session/SessionHandler.java @@ -1,11 +1,8 @@ package me.combimagnetron.sunscreen.session; -import me.combimagnetron.passport.user.User; import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; import java.util.*; -import java.util.function.Function; public class SessionHandler { private final Map sessions = new HashMap<>(); diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/editor/EditorMenuTemplate.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/editor/EditorMenuTemplate.java new file mode 100644 index 0000000..8bf1d6b --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/editor/EditorMenuTemplate.java @@ -0,0 +1,14 @@ +package me.combimagnetron.sunscreen.ui.editor; + +import me.combimagnetron.sunscreen.ui.MenuTemplate; +import me.combimagnetron.sunscreen.ui.ModernLayout; +import org.jetbrains.annotations.NotNull; + +public class EditorMenuTemplate implements MenuTemplate { + + @Override + public void build(@NotNull ModernLayout root) { + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/editor/widget/EditorWidget.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/editor/widget/EditorWidget.java new file mode 100644 index 0000000..09e5d63 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/editor/widget/EditorWidget.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.editor.widget; + +public interface EditorWidget { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java index b75e776..f75b62e 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementGroup.java @@ -1,6 +1,6 @@ package me.combimagnetron.sunscreen.ui.element; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java index b1018b5..8f77fc9 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/ElementLike.java @@ -1,7 +1,7 @@ package me.combimagnetron.sunscreen.ui.element; import me.combimagnetron.sunscreen.ui.property.*; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; import org.jetbrains.annotations.NotNull; public interface ElementLike> { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/GenericModernElement.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/GenericModernElement.java new file mode 100644 index 0000000..3ad57dd --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/GenericModernElement.java @@ -0,0 +1,29 @@ +package me.combimagnetron.sunscreen.ui.element; + +import me.combimagnetron.sunscreen.ui.property.Property; +import me.combimagnetron.sunscreen.util.data.Identifier; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public abstract class GenericModernElement> implements ModernElement { + private final List> properties = new ArrayList<>(); + private final Identifier identifier; + + protected GenericModernElement(Identifier identifier) { + this.identifier = identifier; + } + + @Override + public @NotNull Identifier identifier() { + return identifier; + } + + @Override + public @NotNull E property(@NotNull Property property) { + properties.add(property); + return (E) this; + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java index e63bd6a..7b7b4f5 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/element/impl/ImageElement.java @@ -1,20 +1,15 @@ package me.combimagnetron.sunscreen.ui.element.impl; +import me.combimagnetron.sunscreen.ui.element.GenericModernElement; import me.combimagnetron.sunscreen.ui.element.ModernElement; import me.combimagnetron.sunscreen.ui.property.Property; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; import org.jetbrains.annotations.NotNull; -public class ImageElement implements ModernElement { +public class ImageElement extends GenericModernElement { - @Override - public @NotNull Identifier identifier() { - return null; - } - - @Override - public @NotNull ImageElement property(@NotNull Property property) { - return null; + protected ImageElement(Identifier identifier) { + super(identifier); } } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java index cc96758..3aec846 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/graphic/GraphicLike.java @@ -3,8 +3,12 @@ import me.combimagnetron.sunscreen.ui.graphic.modifier.GraphicModifier; import org.jetbrains.annotations.NotNull; +import java.awt.image.BufferedImage; + public interface GraphicLike> { @NotNull G modifier(@NotNull GraphicModifier modifier); + @NotNull BufferedImage image(); + } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/input/InputHandler.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/input/InputHandler.java new file mode 100644 index 0000000..d69d667 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/input/InputHandler.java @@ -0,0 +1,7 @@ +package me.combimagnetron.sunscreen.ui.input; + +public interface InputHandler { + + + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java index 1bd8387..943181e 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Margin.java @@ -2,40 +2,40 @@ import me.combimagnetron.sunscreen.menu.ScreenSize; import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.math.Vec4i; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; import java.util.Map; -public final class Margin extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { - private static final PropertyHandler PROPERTY_HANDLER = (element, context) -> null; +public final class Margin extends RelativeMeasure.Vec4iRelativeMeasureGroup implements Property { + private static final PropertyHandler PROPERTY_HANDLER = (element, context) -> null; - private final Map> axisMap = new LinkedHashMap<>(); + private final Map> axisMap = new LinkedHashMap<>(); - public Margin(@NotNull Vec2i vec2i) { - super(vec2i); + public Margin(@NotNull Vec4i Vec4i) { + super(Vec4i); } - public Margin(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { - //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + public Margin(@NotNull RelativeMeasure.Vec4iRelativeMeasureGroup measureGroup) { + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); } - public static @NotNull Margin relative(RelativeMeasure.Vec2iRelativeMeasureGroup<@NotNull C> measureGroup) { + public static @NotNull Margin relative(RelativeMeasure.Vec4iRelativeMeasureGroup<@NotNull C> measureGroup) { return new Margin(measureGroup); } - public static @NotNull Margin fixed(@NotNull Vec2i vec2i) { - return new Margin(vec2i); + public static @NotNull Margin fixed(@NotNull Vec4i Vec4i) { + return new Margin(Vec4i); } @Override - public @NotNull Class<@NotNull Vec2i> type() { - return Vec2i.class; + public @NotNull Class<@NotNull Vec4i> type() { + return Vec4i.class; } @Override - public @NotNull PropertyHandler<@NotNull Vec2i, @NotNull Margin> handler() { + public @NotNull PropertyHandler<@NotNull Vec4i, @NotNull Margin> handler() { return PROPERTY_HANDLER; } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java index 07a5789..dc4aea6 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Padding.java @@ -2,39 +2,39 @@ import me.combimagnetron.sunscreen.menu.ScreenSize; import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.math.Vec4i; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; import java.util.Map; -public final class Padding extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { - private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; - private final Map> axisMap = new LinkedHashMap<>(); +public final class Padding extends RelativeMeasure.Vec4iRelativeMeasureGroup implements Property { + private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; + private final Map> axisMap = new LinkedHashMap<>(); - public Padding(@NotNull Vec2i vec2i) { - super(vec2i); + public Padding(@NotNull Vec4i Vec4i) { + super(Vec4i); } - public Padding(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { - //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + public Padding(@NotNull RelativeMeasure.Vec4iRelativeMeasureGroup measureGroup) { + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); } - public static @NotNull Padding relative(RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { + public static @NotNull Padding relative(RelativeMeasure.Vec4iRelativeMeasureGroup measureGroup) { return new Padding(measureGroup); } - public static @NotNull Padding fixed(Vec2i vec2i) { - return new Padding(vec2i); + public static @NotNull Padding fixed(Vec4i Vec4i) { + return new Padding(Vec4i); } @Override - public @NotNull Class type() { - return Vec2i.class; + public @NotNull Class type() { + return Vec4i.class; } @Override - public @NotNull PropertyHandler handler() { + public @NotNull PropertyHandler handler() { return PROPERTY_HANDLER; } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java index 85dd241..d766a01 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Position.java @@ -2,7 +2,7 @@ import me.combimagnetron.sunscreen.menu.ScreenSize; import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.math.Vec2i; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; @@ -10,14 +10,14 @@ public final class Position extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; - private final Map> axisMap = new LinkedHashMap<>(); + private final Map> axisMap = new LinkedHashMap<>(); public Position(@NotNull Vec2i vec2i) { super(vec2i); } public Position(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { - //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); } public static @NotNull Position relative(RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java index 851d296..f211718 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/RelativeMeasure.java @@ -1,8 +1,9 @@ package me.combimagnetron.sunscreen.ui.property; import me.combimagnetron.sunscreen.menu.ScreenSize; -import me.combimagnetron.sunscreen.util.RuntimeDefinable; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.data.RuntimeDefinable; +import me.combimagnetron.sunscreen.util.math.Vec2i; +import me.combimagnetron.sunscreen.util.math.Vec4i; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -18,7 +19,7 @@ * @param measure again, to return for builder methods * @param segment types */ -public interface RelativeMeasure, V, R extends RelativeMeasure, L> extends RuntimeDefinable { +public interface RelativeMeasure, V, R extends RelativeMeasure, L> extends RuntimeDefinable { default @NotNull R percentage(double percentage) { return offset(OffsetType.percentage(percentage)); @@ -30,10 +31,14 @@ public interface RelativeMeasure, @NotNull R offset(@NotNull OffsetType<@NotNull N> offsetType); - static @NotNull Vec2iRelativeMeasureGroup<@NotNull C> relative() { + static @NotNull Vec2iRelativeMeasureGroup<@NotNull C> vec2d() { return new DummyVec2iRelativeMeasureGroup<>(); } + static @NotNull Vec4iRelativeMeasureGroup<@NotNull C> vec4d() { + return new DummyVec4iRelativeMeasureGroup<>(); + } + final class DummyVec2iRelativeMeasureGroup extends Vec2iRelativeMeasureGroup<@NotNull C> { @Override @@ -43,8 +48,17 @@ public void finish(@NotNull ScreenSize unused) { } - abstract class Vec2iRelativeMeasureGroup implements RelativeMeasureGroup, Vec2i, Vec2iRelativeMeasureGroup.Vec2iRelativeBuilder, Axis> { - private final Map> axisBuilderMap = Map.of(Axis.X, new Vec2iRelativeBuilder<>(this), Axis.Y, new Vec2iRelativeBuilder<>(this)); + final class DummyVec4iRelativeMeasureGroup extends Vec4iRelativeMeasureGroup<@NotNull C> { + + @Override + public void finish(@NotNull ScreenSize unused) { + + } + + } + + abstract class Vec2iRelativeMeasureGroup implements RelativeMeasureGroup, Vec2i, Vec2iRelativeMeasureGroup.Vec2iRelativeBuilder, Axis2d> { + private final Map> axisBuilderMap = Map.of(Axis2d.X, new Vec2iRelativeBuilder<>(this), Axis2d.Y, new Vec2iRelativeBuilder<>(this)); private final Function, C> constructor; protected Vec2i vec2i; @@ -57,16 +71,16 @@ public Vec2iRelativeMeasureGroup() { constructor = (cVec2iRelativeMeasureGroup -> null); } - public @NotNull Map<@NotNull Axis, @NotNull Vec2iRelativeBuilder> axisBuilderMap() { + public @NotNull Map<@NotNull Axis2d, @NotNull Vec2iRelativeBuilder> axisBuilderMap() { return axisBuilderMap; } public @NotNull Vec2iRelativeBuilder x() { - return axisBuilderMap.get(Axis.X); + return axisBuilderMap.get(Axis2d.X); } public @NotNull Vec2iRelativeBuilder y() { - return axisBuilderMap.get(Axis.Y); + return axisBuilderMap.get(Axis2d.Y); } public @Nullable Vec2i vec2i() { @@ -76,11 +90,11 @@ public Vec2iRelativeMeasureGroup() { public abstract void finish(@NotNull ScreenSize screenSize); @Override - public void add(@Nullable Vec2iRelativeBuilder<@Nullable C> cVec2iRelativeBuilder, @Nullable Axis axis) { + public void add(@Nullable Vec2iRelativeBuilder<@Nullable C> cVec2iRelativeBuilder, @Nullable RelativeMeasure.Axis2d axis2d) { } - public static final class Vec2iRelativeBuilder implements Builder, RelativeMeasure, Vec2i, Vec2iRelativeBuilder, Axis> { + public static final class Vec2iRelativeBuilder implements Builder, RelativeMeasure, Vec2i, Vec2iRelativeBuilder, Axis2d> { private final Vec2iRelativeMeasureGroup parent; private Vec2iRelativeBuilder(Vec2iRelativeMeasureGroup parent) { @@ -102,12 +116,12 @@ public Vec2iRelativeMeasureGroup back() { } @Override - public @NotNull Vec2iRelativeBuilder<@NotNull C> builder(@NotNull Axis axis) { + public @NotNull Vec2iRelativeBuilder<@NotNull C> builder(@NotNull RelativeMeasure.Axis2d axis2d) { return this; } @Override - public void builder(@NotNull Axis axis, @NotNull Vec2iRelativeBuilder<@NotNull C> builder) { + public void builder(@NotNull RelativeMeasure.Axis2d axis2d, @NotNull Vec2iRelativeBuilder<@NotNull C> builder) { } @@ -129,16 +143,117 @@ public Integer finish(Integer integer) { } - interface RelativeMeasureGroup, V, M extends RelativeMeasure, L> { + + + interface RelativeMeasureGroup, V, M extends RelativeMeasure, L> { void add(M m, L l); } - enum Axis { + abstract class Vec4iRelativeMeasureGroup implements RelativeMeasureGroup, Vec2i, Vec4iRelativeMeasureGroup.Vec4iRelativeBuilder, Axis4d> { + private final Map> axisBuilderMap = Map.of(Axis4d.UP, new Vec4iRelativeBuilder<>(this), Axis4d.DOWN, new Vec4iRelativeBuilder<>(this), Axis4d.LEFT, new Vec4iRelativeBuilder<>(this), Axis4d.RIGHT, new Vec4iRelativeBuilder<>(this)); + private final Function, C> constructor; + protected Vec4i vec4i; + + public Vec4iRelativeMeasureGroup(@NotNull Vec4i vec4i) { + this.vec4i = vec4i; + constructor = (cVec2iRelativeMeasureGroup -> null); + } + + public Vec4iRelativeMeasureGroup() { + constructor = (cVec2iRelativeMeasureGroup -> null); + } + + public @NotNull Map<@NotNull Axis4d, @NotNull Vec4iRelativeBuilder> axisBuilderMap() { + return axisBuilderMap; + } + + public @NotNull Vec4iRelativeBuilder up() { + return axisBuilderMap.get(Axis4d.UP); + } + + public @NotNull Vec4iRelativeBuilder down() { + return axisBuilderMap.get(Axis4d.DOWN); + } + + public @NotNull Vec4iRelativeBuilder left() { + return axisBuilderMap.get(Axis4d.LEFT); + } + + public @NotNull Vec4iRelativeBuilder right() { + return axisBuilderMap.get(Axis4d.RIGHT); + } + + public @Nullable Vec4i vec4i() { + return vec4i; + } + + public abstract void finish(@NotNull ScreenSize screenSize); + + @Override + public void add(@Nullable Vec4iRelativeBuilder<@Nullable C> cVec2iRelativeBuilder, @Nullable Axis4d axis) { + + } + + public static final class Vec4iRelativeBuilder implements Builder, RelativeMeasure, Vec2i, Vec4iRelativeBuilder, Axis4d> { + private final Vec4iRelativeMeasureGroup parent; + + private Vec4iRelativeBuilder(Vec4iRelativeMeasureGroup parent) { + this.parent = parent; + } + + public Vec4iRelativeMeasureGroup back() { + return parent; + } + + @Override + public @NotNull Vec4iRelativeBuilder<@NotNull C> offset(@NotNull OffsetType<@NotNull N> offsetType) { + return this; + } + + @Override + public @NotNull C build(@NotNull Vec2i var) { + return null; + } + + @Override + public @NotNull Vec4iRelativeBuilder<@NotNull C> builder(@NotNull Axis4d axis) { + return this; + } + + @Override + public void builder(@NotNull Axis4d axis, @NotNull Vec4iRelativeBuilder<@NotNull C> builder) { + + } + + @Override + public int priority() { + return 0; + } + + @Override + public @NotNull Class type() { + return null; + } + + @Override + public Vec4i finish(Vec2i vec2i) { + return null; + } + + } + + } + + enum Axis2d { X, Y } + enum Axis4d { + UP, DOWN, LEFT, RIGHT + } + interface OffsetType { T pixel(); diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java index 19486eb..904bad2 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/property/Size.java @@ -2,7 +2,7 @@ import me.combimagnetron.sunscreen.menu.ScreenSize; import me.combimagnetron.sunscreen.ui.property.handler.PropertyHandler; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.math.Vec2i; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; @@ -10,14 +10,14 @@ public final class Size extends RelativeMeasure.Vec2iRelativeMeasureGroup implements Property { private static final PropertyHandler PROPERTY_HANDLER = (element, property) -> null; - private final Map> axisMap = new LinkedHashMap<>(); + private final Map> axisMap = new LinkedHashMap<>(); public Size(@NotNull Vec2i vec2i) { super(vec2i); } public Size(@NotNull RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { - //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); + //axisMap.putAll((Map>) measureGroup.axisBuilderMap()); } public static @NotNull Size relative(RelativeMeasure.Vec2iRelativeMeasureGroup measureGroup) { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BinaryMasks.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BinaryMasks.java new file mode 100644 index 0000000..fb00e29 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BinaryMasks.java @@ -0,0 +1,12 @@ +package me.combimagnetron.sunscreen.ui.render.engine.binary; + +public interface BinaryMasks { + int ONE_BIT_MASK = 0x1; + int TWO_BIT_MASK = 0x3; + int THREE_BIT_MASK = 0x7; + int FOUR_BIT_MASK = 0xF; + int FIVE_BIT_MASK = 0x1F; + int SIX_BIT_MASK = 0x3F; + int SEVEN_BIT_MASK = 0x7F; + int EIGHT_BIT_MASK = 0xFF; +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java new file mode 100644 index 0000000..c210a4b --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java @@ -0,0 +1,145 @@ +package me.combimagnetron.sunscreen.ui.render.engine.binary; + +import org.jetbrains.annotations.NotNull; + +import java.io.*; + +// Credits: https://stackoverflow.com/questions/13385603/does-anyone-have-a-good-java-bitbuffer & https://courses.cs.duke.edu/spring11/cps100e/assign/huff/code/BitOutputStream.html, I aint doing this myself brah + +/** + * Write bits-at-a-time where the number of bits is between 1 and 32. + * Client programs must call flush or + * close when finished writing or not all bits will be written. + * This class is intended to be used with BitInputStream to + * facilitate reading and writing data in a bits-at-a-time manner. + *

+ * Updated for version 2.0 to extend java.io.OutputStream + *

+ * Any exceptions generated are rethrown as RuntimeException objects + * so client code does not have to catch or rethrow them. + *

+ * @author Owen Astrachan + * @version 1.0, July 2000 + * @version 2.0, October 2004 + * @version 2.1, March 2010, Fixed >> to >>> bug in writeBits + */ + + +public class BitOutputStream extends OutputStream +{ + + + private OutputStream myOutput; + private int myBuffer; + private int myBitsToGo; + + private static final int bmask[] = { + 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff,0x3ff,0x7ff,0xfff,0x1fff,0x3fff,0x7fff,0xffff, + 0x1ffff,0x3ffff,0x7ffff,0xfffff,0x1fffff,0x3fffff, + 0x7fffff,0xffffff,0x1ffffff,0x3ffffff,0x7ffffff, + 0xfffffff,0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff + }; + + private static final int BITS_PER_BYTE = 8; + + /** + * Required by OutputStream subclasses, write the low + * 8-bits to the underlying outputstream + */ + public void write(int b) throws IOException { + myOutput.write(b); + } + + /** + * Create a stream that writes-through to the OutputStream object + * passed as a parameter. + * @param out is the output stream to which bits are written + */ + public BitOutputStream(@NotNull OutputStream out){ + myOutput = out; + initialize(); + } + + private void initialize(){ + myBuffer = 0; + myBitsToGo = BITS_PER_BYTE; + } + + /** + * Flushes bits not yet written, must be called by client + * programs if close isn't called. + * @throws RuntimeException if there's a problem writing bits + */ + public void flush() + { + if (myBitsToGo != BITS_PER_BYTE) { + try{ + write( (myBuffer << myBitsToGo) ); + } + catch (java.io.IOException ioe){ + throw new RuntimeException("error writing bits on flush " + ioe); + } + myBuffer = 0; + myBitsToGo = BITS_PER_BYTE; + } + + try{ + myOutput.flush(); + } + catch (java.io.IOException ioe){ + throw new RuntimeException("error on flush " + ioe); + } + } + + /** + * Releases system resources associated with file and + * flushes bits not yet written. Either this function + * or flush must be called or not all bits will be written + * @throws RuntimeException if close fails + */ + public void close() + { + flush(); + try{ + myOutput.close(); + } + catch (IOException ioe){ + throw new RuntimeException("error closing BitOutputStream " + ioe); + } + } + + /** + * Write specified number of bits from value to a file. + * @param howManyBits is number of bits to write (1-32) + * @param value is source of bits, rightmost bits are written + * @throws RuntimeException if there's an I/O problem writing bits + */ + + public BitOutputStream writeBits(int howManyBits, int value) + { + value &= bmask[howManyBits]; // only right most bits valid + + while (howManyBits >= myBitsToGo){ + myBuffer = (myBuffer << myBitsToGo) | + (value >>> (howManyBits - myBitsToGo)); + try{ + write(myBuffer); + } + catch (java.io.IOException ioe){ + throw new RuntimeException("error writing bits " + ioe); + } + + value &= bmask[howManyBits - myBitsToGo]; + howManyBits -= myBitsToGo; + myBitsToGo = BITS_PER_BYTE; + myBuffer = 0; + } + + if (howManyBits > 0) { + myBuffer = (myBuffer << howManyBits) | value; + myBitsToGo -= howManyBits; + } + return this; + } +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java new file mode 100644 index 0000000..21c7a8f --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java @@ -0,0 +1,203 @@ +package me.combimagnetron.sunscreen.ui.render.engine.encode; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import me.combimagnetron.sunscreen.ui.graphic.GraphicLike; +import me.combimagnetron.sunscreen.ui.render.engine.binary.BinaryMasks; +import me.combimagnetron.sunscreen.ui.render.engine.binary.BitOutputStream; +import me.combimagnetron.sunscreen.ui.render.engine.exception.FatalEncodeException; +import me.combimagnetron.sunscreen.ui.render.engine.map.SendableMapMenu; +import org.jetbrains.annotations.NotNull; + +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.util.concurrent.atomic.AtomicInteger; + +public class MapEncoder { + private final static int MAGIC_ID = 0x5611E & ((1 << 28) - 1); + private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(14336); + private final Object lock = new Object(); + private final AtomicInteger paletteId = new AtomicInteger(0); + private final ThreadLocal bytes = ThreadLocal.withInitial(() -> new BitOutputStream(byteArrayOutputStream)); + private final ThreadLocal localPalettes = ThreadLocal.withInitial(() -> new LocalPalette[47]); + private final ThreadLocal imageTiles = ThreadLocal.withInitial(() -> new ImageTile[4096]); + private final ThreadLocal bitTiles = ThreadLocal.withInitial(() -> new BitTile[4096]); + private final BufferedImage image; + + public MapEncoder(@NotNull GraphicLike graphicLike) { + if (graphicLike.image().getWidth() != 128 || graphicLike.image().getWidth() != 128) { + throw new FatalEncodeException("Buffered image inside sliced GraphicLike exceeds size limit of 128x128."); + } + this.image = graphicLike.image(); + + formTiles(); + packPalettesAndTiles(); + write(); + } + + public static SendableMapMenu encode(@NotNull GraphicLike> graphicLike) { + new MapEncoder(graphicLike); + return SendableMapMenu.of(); + } + + private void formTiles() { + final int tilesX = image.getWidth() / 2; + final int tilesY = image.getHeight() / 2; + int index = 0; + + for (int ty = 0; ty < tilesY; ty++) { + for (int tx = 0; tx < tilesX; tx++) { + imageTiles.get()[index++] = new ImageTile(IntArrayList.of( + image.getRGB(tx * 2,ty * 2), + image.getRGB(tx * 2 + 1, ty * 2), + image.getRGB(tx * 2, ty * 2 + 1), + image.getRGB(tx * 2 + 1, ty * 2 + 1) + )); + } + } + } + + private static IntArrayList uniqueColorsPalette(ImageTile imageTile, LocalPalette localPalette) { + IntOpenHashSet openHashSet = new IntOpenHashSet(); + for (int color : imageTile.colors()) { + if (!localPalette.colors().contains(color)) openHashSet.add(color); + } + return new IntArrayList(openHashSet); + } + + private static IntOpenHashSet uniqueColors(ImageTile imageTile) { + return new IntOpenHashSet(imageTile.colors()); + } + + private static int allUniqueColorAmount(ImageTile[] imageTiles) { + IntOpenHashSet intOpenHashSet = new IntOpenHashSet(); + for (ImageTile imageTile : imageTiles) { + intOpenHashSet.addAll(uniqueColors(imageTile)); + } + return intOpenHashSet.size(); + } + + private void packPalettesAndTiles() { + ImageTile[] tiles = imageTiles.get(); + if (allUniqueColorAmount(tiles) > 752) { + //TODO add more algorithms + throw new FatalEncodeException("We did not implement anything beyond this, make simpler art."); + } + LocalPalette[] palettes = localPalettes.get(); + for (int i = 0; i < 47; i++) { + palettes[i] = new LocalPalette(); + } + for (int i = 0; i < tiles.length; i++) { + ImageTile imageTile = tiles[i]; + IntArrayList indices = null; + LocalPalette match = null; + + for (LocalPalette localPalette : palettes) { + //Check for palette that has all the colors; + indices = containsAll(localPalette.colors(), imageTile.colors()); + if (indices != null) { + match = localPalette; + break; + } + indices = IntArrayList.of(); + + //Look if there's enough space to fill with the tile's colors. + IntArrayList uniqueColors = uniqueColorsPalette(imageTile, localPalette); + if (localPalette.colors().size() + uniqueColors.size() <= 16) { + localPalette.colors().addAll(uniqueColors); + for (int color : imageTile.colors()) { + indices.add(localPalette.colors().indexOf(color)); + } + match = localPalette; + break; + } + } + if (indices.isEmpty()) throw new FatalEncodeException("We did not implement anything beyond this, make simpler art."); + + bitTiles.get()[i] = new BitTile(indices, match); + } + for (LocalPalette localPalette : localPalettes.get()) { + if (localPalette.colors().size() != 16) { + int missing = 16 - localPalette.colors.size(); + for (int i1 = 0; i1 < missing; i1++) { + localPalette.colors().add(0); + } + } + } + } + + private IntArrayList containsAll(IntArrayList colors, IntArrayList subset) { + IntArrayList indices = new IntArrayList(subset.size()); + + int i = 0, j = 0; + while (i < colors.size() && j < subset.size()) { + int a = colors.getInt(i); + int b = subset.getInt(j); + + if (a == b) { + indices.add(i); + j++; + } + i++; + } + + return (j == subset.size()) ? indices : null; + } + + public ByteArrayOutputStream bytes() { + return byteArrayOutputStream; + } + + private void write() { + synchronized (lock) { + BitOutputStream bitOutputStream = bytes.get(); + bitOutputStream.writeBits(28, MAGIC_ID); + for (LocalPalette localPalette : localPalettes.get()) { + //bitOutputStream.writeBits(6, localPalette.serializedId()); + for (int color : localPalette.colors) { + bitOutputStream.writeBits(32, color); + } + } + for (BitTile bitTile : bitTiles.get()) { + bitOutputStream.writeBits(6, bitTile.palette().serializedId()); + for (int index : bitTile.indices) { + bitOutputStream.writeBits(4, index); + } + } + bitOutputStream.flush(); + bitOutputStream.close(); + } + } + + record ImageTile(IntArrayList colors) {} + + record BitTile(IntArrayList indices, LocalPalette palette) {} + + public final class LocalPalette { + //private final int[] colors = new int[16]; + private final IntArrayList colors = IntArrayList.of(); + private final int id; + + public LocalPalette(int id) { + this.id = id; + } + + public LocalPalette() { + this(paletteId.getAndIncrement()); + } + + public byte serializedId() { + return (byte) (id & BinaryMasks.FIVE_BIT_MASK); + } + + public IntArrayList colors() { + return colors; + } + + public int id() { + return id; + } + + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/exception/FatalEncodeException.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/exception/FatalEncodeException.java new file mode 100644 index 0000000..2647679 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/exception/FatalEncodeException.java @@ -0,0 +1,9 @@ +package me.combimagnetron.sunscreen.ui.render.engine.exception; + +public class FatalEncodeException extends RuntimeException { + private static final String PREFIX = "Fatal encode error; see and report details below\n%s"; + + public FatalEncodeException(String message) { + super(String.format(PREFIX, message)); + } +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMap.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMap.java new file mode 100644 index 0000000..bbfe3ce --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMap.java @@ -0,0 +1,4 @@ +package me.combimagnetron.sunscreen.ui.render.engine.map; + +public record SendableMap(byte[] bytes) { +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMapMenu.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMapMenu.java new file mode 100644 index 0000000..4ae327b --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/map/SendableMapMenu.java @@ -0,0 +1,11 @@ +package me.combimagnetron.sunscreen.ui.render.engine.map; + +import java.util.Arrays; + +public record SendableMapMenu(SendableMap[] sendableMaps) { + + public static SendableMapMenu of(SendableMap... maps) { + return new SendableMapMenu((SendableMap[]) Arrays.stream(maps).toArray()); + } + +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Identifier.java b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Identifier.java similarity index 96% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Identifier.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/data/Identifier.java index 8f68b13..63fed84 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Identifier.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Identifier.java @@ -1,4 +1,4 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.data; public record Identifier(Namespace namespace, Key key) { public static final Namespace DEFAULT_NAMESPACE = Namespace.of("sunscreen"); diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Pair.java b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Pair.java similarity index 73% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Pair.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/data/Pair.java index f2ccfe1..3b55fa5 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Pair.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Pair.java @@ -1,4 +1,4 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.data; public record Pair(K k, V v) { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/ProtocolUtil.java b/api/src/main/java/me/combimagnetron/sunscreen/util/data/ProtocolUtil.java similarity index 96% rename from api/src/main/java/me/combimagnetron/sunscreen/util/ProtocolUtil.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/data/ProtocolUtil.java index 335bef5..a6df176 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/ProtocolUtil.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/data/ProtocolUtil.java @@ -1,10 +1,8 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.data; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataOutput; -import java.nio.ByteBuffer; - public class ProtocolUtil { private static final int SEGMENT_BITS = 0x7F; private static final int CONTINUE_BIT = 0x80; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Range.java b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Range.java similarity index 87% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Range.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/data/Range.java index 8d55a38..ee78fa0 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Range.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Range.java @@ -1,4 +1,4 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.data; public record Range>(T min, T max) { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/RuntimeDefinable.java b/api/src/main/java/me/combimagnetron/sunscreen/util/data/RuntimeDefinable.java similarity index 77% rename from api/src/main/java/me/combimagnetron/sunscreen/util/RuntimeDefinable.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/data/RuntimeDefinable.java index be073a2..853a31d 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/RuntimeDefinable.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/data/RuntimeDefinable.java @@ -1,8 +1,4 @@ -package me.combimagnetron.sunscreen.util; - -import me.combimagnetron.sunscreen.menu.Position; -import me.combimagnetron.sunscreen.menu.RuntimeDefinableGeometry; -import me.combimagnetron.sunscreen.menu.Size; +package me.combimagnetron.sunscreen.util.data; import java.util.Collection; import java.util.LinkedHashMap; @@ -11,7 +7,6 @@ @SuppressWarnings("rawtypes") public interface RuntimeDefinable { - Values> Types = Values.of(Position.class, Size.class); T build(V var); @@ -38,12 +33,10 @@ interface Holder { } class Impl implements RuntimeDefinable { - private final Class type; private final Map lbMap = new LinkedHashMap<>(); private final T instance; - public Impl(Class type, Map lbMap, T instance) { - this.type = type; + public Impl(Class> type, Map lbMap, T instance) { this.lbMap.putAll(lbMap); this.instance = instance; } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Tree.java b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Tree.java similarity index 94% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Tree.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/data/Tree.java index 8625f01..85bfa68 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Tree.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Tree.java @@ -1,4 +1,4 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.data; public interface Tree { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Values.java b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Values.java similarity index 88% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Values.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/data/Values.java index 0ecb3c6..771337e 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Values.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/data/Values.java @@ -1,7 +1,6 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.data; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import java.util.ArrayList; import java.util.Collection; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/FontUtil.java b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/FontUtil.java similarity index 97% rename from api/src/main/java/me/combimagnetron/sunscreen/util/FontUtil.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/helper/FontUtil.java index 7c31fda..eee06db 100755 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/FontUtil.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/FontUtil.java @@ -1,10 +1,9 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.helper; -import com.github.retrooper.packetevents.protocol.component.ComponentType; +import me.combimagnetron.sunscreen.util.math.Vec2d; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import java.util.HashMap; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/HoverHelper.java b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/HoverHelper.java similarity index 75% rename from api/src/main/java/me/combimagnetron/sunscreen/util/HoverHelper.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/helper/HoverHelper.java index 46e2c89..73f25d7 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/HoverHelper.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/HoverHelper.java @@ -1,8 +1,8 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.helper; import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; -import me.combimagnetron.sunscreen.menu.Size; import me.combimagnetron.sunscreen.user.SunscreenUser; +import me.combimagnetron.sunscreen.util.math.Vec2i; public class HoverHelper { @@ -15,8 +15,8 @@ public static boolean isHovered(Vec2i cursor, Vec2i position, Vec2i size) { return cursor.x() > position.x() && cursor.x() < position.x() + size.x() && cursor.y() > position.y() && cursor.y() < position.y() + size.y(); } - public static boolean isHovered(Vec2i cursor, Vec2i position, Size size) { - return cursor.x() > position.x() && cursor.x() < position.x() + size.x().pixel() && cursor.y() > position.y() && cursor.y() < position.y() + size.y().pixel(); + public static boolean isHovered(Vec2i cursor, Vec2i position, me.combimagnetron.sunscreen.ui.property.Size size) { + return cursor.x() > position.x() && cursor.x() < position.x() + size.x().finish(0) && cursor.y() > position.y() && cursor.y() < position.y() + size.y().finish(0); } } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/ShaderHelper.java b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/ShaderHelper.java similarity index 62% rename from api/src/main/java/me/combimagnetron/sunscreen/util/ShaderHelper.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/helper/ShaderHelper.java index b54d754..3c79bbd 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/ShaderHelper.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/ShaderHelper.java @@ -1,14 +1,15 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.helper; -import me.combimagnetron.sunscreen.menu.Position; +import me.combimagnetron.sunscreen.ui.property.Position; import me.combimagnetron.sunscreen.user.SunscreenUser; +import me.combimagnetron.sunscreen.util.math.Vec2i; public class ShaderHelper { public static int encode(Position position, SunscreenUser user) { Vec2i screenSize = user.screenSize().pixel(); - int x = decimals((double) position.x().pixel() /screenSize.x()); - int y = decimals((double) position.y().pixel() /screenSize.y()); + int x = decimals((double) position.x().finish(0) /screenSize.x()); + int y = decimals((double) position.y().finish(0) /screenSize.y()); x = Math.max(0, Math.min(153, x)); y = Math.max(0, Math.min(153, y)); return x * 154 + y; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/ViewportHelper.java b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/ViewportHelper.java similarity index 88% rename from api/src/main/java/me/combimagnetron/sunscreen/util/ViewportHelper.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/helper/ViewportHelper.java index 7aeae82..3dcd1b3 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/ViewportHelper.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/helper/ViewportHelper.java @@ -1,8 +1,9 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.helper; import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; import me.combimagnetron.sunscreen.menu.ScreenSize; -import me.combimagnetron.sunscreen.menu.Position; +import me.combimagnetron.sunscreen.ui.property.Position; +import me.combimagnetron.sunscreen.util.math.Vec2i; public class ViewportHelper { @@ -40,7 +41,7 @@ public static Vec2i fromVector3d(Vector3d vector3d) { } public static Vec2i fromPosition(Position position) { - return Vec2i.of((int) position.x().pixel(), (int) position.y().pixel()); + return Vec2i.of((int) position.x().finish(0), (int) position.y().finish(0)); } } diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Box.java b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Box.java similarity index 95% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Box.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/math/Box.java index 32750c9..a5d628d 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Box.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Box.java @@ -1,4 +1,4 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.math; public final class Box { private Vec2i pos; diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Pos2D.java b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Pos2D.java similarity index 96% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Pos2D.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/math/Pos2D.java index 9c67652..1d4eecf 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Pos2D.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Pos2D.java @@ -1,4 +1,4 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.math; public record Pos2D(double x, double y) { diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Vec2d.java b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2d.java similarity index 52% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Vec2d.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2d.java index bdc08ed..ef5d033 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Vec2d.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2d.java @@ -1,65 +1,95 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.math; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; public record Vec2d(double x, double y) { + @Contract(pure = true) public int xi() { return Math.round((float)x); } + @Contract(pure = true) public int yi() { return Math.round((float) y); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public static Vec2d of(double x, double y) { return new Vec2d(x, y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2d mul(double factor) { return new Vec2d(this.x * factor, this.y * factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2d mul(double x, double y) { return new Vec2d(this.x * x, this.y * y); } - public Vec2d mul(Vec2d vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2d mul(@NotNull Vec2d vec2d) { return mul(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2d div(double factor) { return new Vec2d(this.x / factor, this.y / factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2d div(double x, double y) { return new Vec2d(this.x / x, this.y / y); } - public Vec2d div(Vec2d vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2d div(@NotNull Vec2d vec2d) { return div(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2d add(double factor) { return new Vec2d(this.x + factor, this.y + factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2d add(double x, double y) { return new Vec2d(this.x + x, this.y + y); } - public Vec2d add(Vec2d vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2d add(@NotNull Vec2d vec2d) { return add(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2d sub(double factor) { return new Vec2d(this.x - factor, this.y - factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2d sub(double x, double y) { return new Vec2d(this.x - x, this.y - y); } - public Vec2d sub(Vec2d vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2d sub(@NotNull Vec2d vec2d) { return sub(vec2d.x, vec2d.y); } - -} \ No newline at end of file +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Vec2f.java b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2f.java similarity index 51% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Vec2f.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2f.java index a8ce1ce..1975410 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Vec2f.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2f.java @@ -1,65 +1,96 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.math; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; public record Vec2f(float x, float y) { + @Contract(pure = true) public int xi() { return (int) x; } + @Contract(pure = true) public int yi() { return (int) y; } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public static Vec2f of(float x, float y) { return new Vec2f(x, y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2f mul(float factor) { return new Vec2f(this.x * factor, this.y * factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2f mul(float x, float y) { return new Vec2f(this.x * x, this.y * y); } - public Vec2f mul(Vec2f vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2f mul(@NotNull Vec2f vec2d) { return mul(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2f div(float factor) { return new Vec2f(this.x / factor, this.y / factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2f div(float x, float y) { return new Vec2f(this.x / x, this.y / y); } - public Vec2f div(Vec2f vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2f div(@NotNull Vec2f vec2d) { return div(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2f add(float factor) { return new Vec2f(this.x + factor, this.y + factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2f add(float x, float y) { return new Vec2f(this.x + x, this.y + y); } - public Vec2f add(Vec2f vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2f add(@NotNull Vec2f vec2d) { return add(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2f sub(float factor) { return new Vec2f(this.x - factor, this.y - factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2f sub(float x, float y) { return new Vec2f(this.x - x, this.y - y); } - public Vec2f sub(Vec2f vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2f sub(@NotNull Vec2f vec2d) { return sub(vec2d.x, vec2d.y); } -} \ No newline at end of file +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/Vec2i.java b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2i.java similarity index 51% rename from api/src/main/java/me/combimagnetron/sunscreen/util/Vec2i.java rename to api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2i.java index f8e4d64..66dabde 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/util/Vec2i.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec2i.java @@ -1,62 +1,93 @@ -package me.combimagnetron.sunscreen.util; +package me.combimagnetron.sunscreen.util.math; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; public record Vec2i(int x, int y) { private static final Vec2i ZERO = Vec2i.of(0, 0); + @Contract(pure = true) + @NotNull public static Vec2i zero() { return ZERO; } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public static Vec2i of(int x, int y) { return new Vec2i(x, y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2i mul(int factor) { return new Vec2i(this.x * factor, this.y * factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2i mul(int x, int y) { return new Vec2i(this.x * x, this.y * y); } - public Vec2i mul(Vec2i vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2i mul(@NotNull Vec2i vec2d) { return mul(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2i div(int factor) { return new Vec2i(this.x / factor, this.y / factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2i div(int x, int y) { return new Vec2i(this.x / x, this.y / y); } - public Vec2i div(Vec2i vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2i div(@NotNull Vec2i vec2d) { return div(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2i add(int factor) { return new Vec2i(this.x + factor, this.y + factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2i add(int x, int y) { return new Vec2i(this.x + x, this.y + y); } - public Vec2i add(Vec2i vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2i add(@NotNull Vec2i vec2d) { return add(vec2d.x, vec2d.y); } + @Contract(value = "_ -> new", pure = true) + @NotNull public Vec2i sub(int factor) { return new Vec2i(this.x - factor, this.y - factor); } + @Contract(value = "_, _ -> new", pure = true) + @NotNull public Vec2i sub(int x, int y) { return new Vec2i(this.x - x, this.y - y); } - public Vec2i sub(Vec2i vec2d) { + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec2i sub(@NotNull Vec2i vec2d) { return sub(vec2d.x, vec2d.y); } -} \ No newline at end of file +} diff --git a/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec4i.java b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec4i.java new file mode 100644 index 0000000..589aad2 --- /dev/null +++ b/api/src/main/java/me/combimagnetron/sunscreen/util/math/Vec4i.java @@ -0,0 +1,93 @@ +package me.combimagnetron.sunscreen.util.math; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +public record Vec4i(int first, int second, int third, int fourth) { + private static final Vec4i ZERO = Vec4i.of(0, 0, 0, 0); + + @Contract(pure = true) + @NotNull + public static Vec4i zero() { + return ZERO; + } + + @Contract(value = "_, _, _, _ -> new", pure = true) + @NotNull + public static Vec4i of(int first, int second, int third, int fourth) { + return new Vec4i(first, second, third, fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i mul(int factor) { + return new Vec4i(this.first * factor, this.second * factor, this.third * factor, this.fourth * factor); + } + + @Contract(value = "_, _, _, _ -> new", pure = true) + @NotNull + public Vec4i mul(int first, int second, int third, int fourth) { + return new Vec4i(this.first * first, this.second * second, this.third * third, this.fourth * fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i mul(@NotNull Vec4i vec4i) { + return mul(vec4i.first, vec4i.second, vec4i.third, vec4i.fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i div(int factor) { + return new Vec4i(this.first / factor, this.second / factor, this.third / factor, this.fourth / factor); + } + + @Contract(value = "_, _, _, _ -> new", pure = true) + @NotNull + public Vec4i div(int first, int second, int third, int fourth) { + return new Vec4i(this.first / first, this.second / second, this.third / third, this.fourth / fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i div(@NotNull Vec4i vec4i) { + return div(vec4i.first, vec4i.second, vec4i.third, vec4i.fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i add(int factor) { + return new Vec4i(this.first + factor, this.second + factor, this.third + factor, this.fourth + factor); + } + + @Contract(value = "_, _, _, _ -> new", pure = true) + @NotNull + public Vec4i add(int first, int second, int third, int fourth) { + return new Vec4i(this.first + first, this.second + second, this.third + third, this.fourth + fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i add(@NotNull Vec4i vec4i) { + return add(vec4i.first, vec4i.second, vec4i.third, vec4i.fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i sub(int factor) { + return new Vec4i(this.first - factor, this.second - factor, this.third - factor, this.fourth - factor); + } + + @Contract(value = "_, _, _, _ -> new", pure = true) + @NotNull + public Vec4i sub(int first, int second, int third, int fourth) { + return new Vec4i(this.first - first, this.second - second, this.third - third, this.fourth - fourth); + } + + @Contract(value = "_ -> new", pure = true) + @NotNull + public Vec4i sub(@NotNull Vec4i vec4i) { + return sub(vec4i.first, vec4i.second, vec4i.third, vec4i.fourth); + } + +} diff --git a/api/src/test/java/MapEncoderTest.java b/api/src/test/java/MapEncoderTest.java new file mode 100644 index 0000000..ba97350 --- /dev/null +++ b/api/src/test/java/MapEncoderTest.java @@ -0,0 +1,44 @@ +import me.combimagnetron.sunscreen.ui.graphic.GraphicLike; +import me.combimagnetron.sunscreen.ui.graphic.modifier.GraphicModifier; +import me.combimagnetron.sunscreen.ui.render.engine.encode.MapEncoder; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Test; +import org.junit.platform.suite.api.SelectClasses; +import org.junit.platform.suite.api.Suite; +import org.junit.platform.suite.api.SuiteDisplayName; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; + +@Suite +@SuiteDisplayName("MapEncoder") +@SelectClasses({ GraphicLike.class, MapEncoder.class }) +public class MapEncoderTest { + + @Test + public void mapEncoder() throws IOException { + BufferedImage image = ImageIO.read(new URL("https://i.imgur.com/4zDrYvx.png")); + GraphicLike graphicLike = new GraphicLike() { + @Override + public @NotNull GraphicLike modifier(@NotNull GraphicModifier modifier) { + return this; + } + + @Override + public @NotNull BufferedImage image() { + return image; + } + }; + ArrayList times = new ArrayList<>(); + for (int i = 0; i < 100_000; i++) { + long nanos = System.nanoTime(); + MapEncoder mapEncoder = new MapEncoder(graphicLike); + times.add(((float) System.nanoTime() - nanos)/1_000_000); + } + System.out.println(times.stream().mapToDouble(Float::doubleValue).average()); + } + +} diff --git a/api/src/test/java/TestModernTemplate.java b/api/src/test/java/TestModernTemplate.java index 78147e1..75568de 100644 --- a/api/src/test/java/TestModernTemplate.java +++ b/api/src/test/java/TestModernTemplate.java @@ -5,6 +5,6 @@ public class TestModernTemplate implements MenuTemplate { @Override public void build(@NotNull ModernLayout root) { - root. + } } diff --git a/minestom/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java b/minestom/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java index 9e9a3e3..0e607e5 100644 --- a/minestom/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java +++ b/minestom/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java @@ -5,7 +5,6 @@ import com.github.retrooper.packetevents.protocol.player.ClientVersion; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityMetadata; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity; -import me.combimagnetron.passport.PacketEventsConnectionImpl; import me.combimagnetron.passport.internal.entity.Entity; import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; import me.combimagnetron.passport.internal.network.Connection; @@ -13,9 +12,9 @@ import me.combimagnetron.sunscreen.menu.MenuTemplate; import me.combimagnetron.sunscreen.menu.ScreenSize; import me.combimagnetron.sunscreen.session.Session; -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; +import me.combimagnetron.sunscreen.util.data.Pair; +import me.combimagnetron.sunscreen.util.math.Vec2d; +import me.combimagnetron.sunscreen.util.math.Vec2i; import net.minestom.server.entity.Player; import java.util.List; diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java index 9cf1509..d04a53c 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java @@ -4,12 +4,9 @@ import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.event.PacketListenerPriority; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; -import io.papermc.paper.datacomponent.DataComponentType; import me.combimagnetron.passport.Passport; -import me.combimagnetron.passport.event.EventBus; import me.combimagnetron.sunscreen.action.RunCommandAction; import me.combimagnetron.sunscreen.command.SunscreenCommand; -import me.combimagnetron.sunscreen.event.ClickElementEvent; import me.combimagnetron.sunscreen.hook.SunscreenHook; import me.combimagnetron.sunscreen.hook.betterhud.BetterHudSunscreenHook; import me.combimagnetron.sunscreen.hook.mythichud.MythicHudSunscreenHook; @@ -26,14 +23,11 @@ import me.combimagnetron.sunscreen.resourcepack.meta.PackVersion; import me.combimagnetron.sunscreen.user.SunscreenUser; import me.combimagnetron.sunscreen.user.UserManager; -import me.combimagnetron.sunscreen.util.Identifier; -import me.combimagnetron.sunscreen.util.Range; +import me.combimagnetron.sunscreen.util.data.Identifier; +import me.combimagnetron.sunscreen.util.data.Range; import org.apache.commons.io.IOUtils; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; -import org.codehaus.plexus.util.IOUtil; import java.io.*; import java.nio.file.Path; diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java b/spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java index 344fa3e..0a7d6ff 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java @@ -5,7 +5,7 @@ import me.combimagnetron.sunscreen.logic.action.Argument; import me.combimagnetron.sunscreen.logic.action.ArgumentType; import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.Identifier; +import me.combimagnetron.sunscreen.util.data.Identifier; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java b/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java index d50aa45..a784716 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java @@ -1,7 +1,6 @@ package me.combimagnetron.sunscreen.user; import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.PacketEventsAPI; import com.github.retrooper.packetevents.protocol.entity.data.EntityData; import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes; import com.github.retrooper.packetevents.protocol.player.ClientVersion; @@ -12,7 +11,6 @@ import me.combimagnetron.passport.config.Config; import me.combimagnetron.passport.config.element.Node; import me.combimagnetron.passport.internal.entity.Entity; -import me.combimagnetron.passport.internal.entity.impl.passive.horse.Horse; import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; import me.combimagnetron.passport.internal.network.Connection; import me.combimagnetron.sunscreen.SunscreenLibrary; @@ -22,11 +20,9 @@ import me.combimagnetron.sunscreen.menu.ScreenSize; import me.combimagnetron.sunscreen.menu.timing.MenuTicker; import me.combimagnetron.sunscreen.session.Session; -import me.combimagnetron.sunscreen.util.Pair; -import me.combimagnetron.sunscreen.util.Vec2d; -import me.combimagnetron.sunscreen.util.Vec2i; -import net.kyori.adventure.inventory.Book; -import net.kyori.adventure.text.Component; +import me.combimagnetron.sunscreen.util.data.Pair; +import me.combimagnetron.sunscreen.util.math.Vec2d; +import me.combimagnetron.sunscreen.util.math.Vec2i; import org.bukkit.entity.Player; import java.util.List; From e8cd01e74183c035aa224d70f236c2c911da3ca2 Mon Sep 17 00:00:00 2001 From: Combimagnetron Date: Sun, 31 Aug 2025 20:40:35 +0200 Subject: [PATCH 4/4] woop --- .../render/engine/binary/BitOutputStream.java | 113 ++++++++++-------- .../ui/render/engine/encode/MapEncoder.java | 32 ++++- .../sunscreen/SunscreenLibrarySpigot.java | 27 ----- .../sunscreen/SunscreenPlugin.java | 75 +++++++++--- .../sunscreen/action/RunCommandAction.java | 52 -------- .../betterhud/BetterHudSunscreenHook.java | 6 +- .../mythichud/MythicHudSunscreenHook.java | 6 +- .../hook/nexo/NexoSunscreenHook.java | 109 ----------------- .../sunscreen/hook/tab/TABSunscreenHook.java | 7 +- .../sunscreen/user/UserImpl.java | 17 ++- 10 files changed, 162 insertions(+), 282 deletions(-) delete mode 100644 spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java delete mode 100644 spigot/src/main/java/me/combimagnetron/sunscreen/hook/nexo/NexoSunscreenHook.java diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java index c210a4b..4bfe7f6 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/binary/BitOutputStream.java @@ -1,11 +1,7 @@ package me.combimagnetron.sunscreen.ui.render.engine.binary; -import org.jetbrains.annotations.NotNull; - import java.io.*; -// Credits: https://stackoverflow.com/questions/13385603/does-anyone-have-a-good-java-bitbuffer & https://courses.cs.duke.edu/spring11/cps100e/assign/huff/code/BitOutputStream.html, I aint doing this myself brah - /** * Write bits-at-a-time where the number of bits is between 1 and 32. * Client programs must call flush or @@ -18,30 +14,31 @@ * Any exceptions generated are rethrown as RuntimeException objects * so client code does not have to catch or rethrow them. *

+ * Modified to write in 7-bit units instead of 8-bit bytes. + * Each output "byte" will only contain 7 meaningful bits (0–127). + *

* @author Owen Astrachan * @version 1.0, July 2000 * @version 2.0, October 2004 * @version 2.1, March 2010, Fixed >> to >>> bug in writeBits + * @version 3.0, Aug 2025, Modified to 7-bit units */ - - -public class BitOutputStream extends OutputStream -{ - +public class BitOutputStream extends OutputStream { private OutputStream myOutput; private int myBuffer; private int myBitsToGo; - - private static final int bmask[] = { - 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, - 0x1ff,0x3ff,0x7ff,0xfff,0x1fff,0x3fff,0x7fff,0xffff, - 0x1ffff,0x3ffff,0x7ffff,0xfffff,0x1fffff,0x3fffff, - 0x7fffff,0xffffff,0x1ffffff,0x3ffffff,0x7ffffff, - 0xfffffff,0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff + + private static final int[] bmask = { + 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, + 0x1ff,0x3ff,0x7ff,0xfff,0x1fff,0x3fff,0x7fff,0xffff, + 0x1ffff,0x3ffff,0x7ffff,0xfffff,0x1fffff,0x3fffff, + 0x7fffff,0xffffff,0x1ffffff,0x3ffffff,0x7ffffff, + 0xfffffff,0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff }; - private static final int BITS_PER_BYTE = 8; + // instead of 8 bits per byte, we now use 7 bits per output unit + private static final int BITS_PER_UNIT = 7; /** * Required by OutputStream subclasses, write the low @@ -50,20 +47,38 @@ public class BitOutputStream extends OutputStream public void write(int b) throws IOException { myOutput.write(b); } - + /** * Create a stream that writes-through to the OutputStream object * passed as a parameter. * @param out is the output stream to which bits are written */ - public BitOutputStream(@NotNull OutputStream out){ + public BitOutputStream(OutputStream out){ myOutput = out; initialize(); } - + private void initialize(){ myBuffer = 0; - myBitsToGo = BITS_PER_BYTE; + myBitsToGo = BITS_PER_UNIT; + } + + /** + * Construct a bit-at-a-time output stream with specified file + * name. + * @param filename is the name of the file being written + * @throws RuntimeException if opening file fails for either FileNotFound + * or for Security exceptions + */ + public BitOutputStream(String filename) { + try { + myOutput = new BufferedOutputStream(new FileOutputStream(filename)); + } catch (FileNotFoundException fnf) { + throw new RuntimeException("could not create " + filename + " " + fnf); + } catch(SecurityException se) { + throw new RuntimeException("security exception on write " + se); + } + initialize(); } /** @@ -71,23 +86,21 @@ private void initialize(){ * programs if close isn't called. * @throws RuntimeException if there's a problem writing bits */ - public void flush() - { - if (myBitsToGo != BITS_PER_BYTE) { - try{ - write( (myBuffer << myBitsToGo) ); - } - catch (java.io.IOException ioe){ + public void flush() { + if (myBitsToGo != BITS_PER_UNIT) { + try { + // Shift by 4 to avoid values 0-3 that don't exist in the client + write((myBuffer << myBitsToGo) + 4); // pad remaining bits on the right and shift by 4 + } catch (IOException ioe) { throw new RuntimeException("error writing bits on flush " + ioe); } myBuffer = 0; - myBitsToGo = BITS_PER_BYTE; + myBitsToGo = BITS_PER_UNIT; } - - try{ - myOutput.flush(); - } - catch (java.io.IOException ioe){ + + try { + myOutput.flush(); + } catch (IOException ioe) { throw new RuntimeException("error on flush " + ioe); } } @@ -98,13 +111,11 @@ public void flush() * or flush must be called or not all bits will be written * @throws RuntimeException if close fails */ - public void close() - { + public void close() { flush(); - try{ + try { myOutput.close(); - } - catch (IOException ioe){ + } catch (IOException ioe) { throw new RuntimeException("error closing BitOutputStream " + ioe); } } @@ -115,31 +126,27 @@ public void close() * @param value is source of bits, rightmost bits are written * @throws RuntimeException if there's an I/O problem writing bits */ - - public BitOutputStream writeBits(int howManyBits, int value) - { - value &= bmask[howManyBits]; // only right most bits valid + public void writeBits(int howManyBits, int value) { + value &= bmask[howManyBits]; // only rightmost bits valid - while (howManyBits >= myBitsToGo){ + while (howManyBits >= myBitsToGo) { myBuffer = (myBuffer << myBitsToGo) | - (value >>> (howManyBits - myBitsToGo)); - try{ - write(myBuffer); - } - catch (java.io.IOException ioe){ + (value >>> (howManyBits - myBitsToGo)); + try { + write(myBuffer + 4); // now each written unit only contains 7 bits (0–127) + } catch (IOException ioe) { throw new RuntimeException("error writing bits " + ioe); } value &= bmask[howManyBits - myBitsToGo]; howManyBits -= myBitsToGo; - myBitsToGo = BITS_PER_BYTE; + myBitsToGo = BITS_PER_UNIT; myBuffer = 0; } - + if (howManyBits > 0) { myBuffer = (myBuffer << howManyBits) | value; myBitsToGo -= howManyBits; } - return this; } -} +} \ No newline at end of file diff --git a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java index 21c7a8f..e90d2e2 100644 --- a/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java +++ b/api/src/main/java/me/combimagnetron/sunscreen/ui/render/engine/encode/MapEncoder.java @@ -9,13 +9,17 @@ import me.combimagnetron.sunscreen.ui.render.engine.map.SendableMapMenu; import org.jetbrains.annotations.NotNull; +import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.concurrent.atomic.AtomicInteger; public class MapEncoder { - private final static int MAGIC_ID = 0x5611E & ((1 << 28) - 1); - private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(14336); + private final static int MAGIC_ID = 0x1234567; + private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(16384); private final Object lock = new Object(); private final AtomicInteger paletteId = new AtomicInteger(0); private final ThreadLocal bytes = ThreadLocal.withInitial(() -> new BitOutputStream(byteArrayOutputStream)); @@ -120,7 +124,7 @@ private void packPalettesAndTiles() { if (localPalette.colors().size() != 16) { int missing = 16 - localPalette.colors.size(); for (int i1 = 0; i1 < missing; i1++) { - localPalette.colors().add(0); + localPalette.colors().add(6); } } } @@ -128,7 +132,6 @@ private void packPalettesAndTiles() { private IntArrayList containsAll(IntArrayList colors, IntArrayList subset) { IntArrayList indices = new IntArrayList(subset.size()); - int i = 0, j = 0; while (i < colors.size() && j < subset.size()) { int a = colors.getInt(i); @@ -140,7 +143,6 @@ private IntArrayList containsAll(IntArrayList colors, IntArrayList subset) { } i++; } - return (j == subset.size()) ? indices : null; } @@ -148,10 +150,21 @@ public ByteArrayOutputStream bytes() { return byteArrayOutputStream; } + public void write(File file) throws IOException { + int index = 0; + try (FileWriter fileWriter = new FileWriter(file)) { + for (byte b : byteArrayOutputStream.toByteArray()) { + fileWriter.append(String.valueOf(index++)).append(" ").append(String.valueOf(b)).append("\n"); + } + } + } + private void write() { synchronized (lock) { BitOutputStream bitOutputStream = bytes.get(); bitOutputStream.writeBits(28, MAGIC_ID); + System.out.println(new Color(localPalettes.get()[0].colors.getInt(0))); + bitOutputStream.writeBits(32, 69420); for (LocalPalette localPalette : localPalettes.get()) { //bitOutputStream.writeBits(6, localPalette.serializedId()); for (int color : localPalette.colors) { @@ -166,6 +179,15 @@ private void write() { } bitOutputStream.flush(); bitOutputStream.close(); + int size = byteArrayOutputStream.size(); + System.out.println(size); + if (!(size < 16384)) return; + try { + byteArrayOutputStream.write(new byte[16384 - size]); + } catch (IOException e) { + throw new RuntimeException(e); + } + System.out.println(size); } } diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrarySpigot.java b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrarySpigot.java index fe846d7..5becb4b 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrarySpigot.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenLibrarySpigot.java @@ -3,10 +3,6 @@ import me.combimagnetron.passport.Passport; import me.combimagnetron.passport.user.UserHandler; import me.combimagnetron.passport.util.placeholder.PlaceholderRegistry; -import me.combimagnetron.sunscreen.config.Config; -import me.combimagnetron.sunscreen.config.MenuConfigTransformer; -import me.combimagnetron.sunscreen.registry.MenuRegistry; -import me.combimagnetron.sunscreen.menu.timing.MenuTicker; import me.combimagnetron.sunscreen.session.SessionHandler; import me.combimagnetron.sunscreen.user.SunscreenUser; import org.bukkit.entity.Player; @@ -16,11 +12,8 @@ import java.nio.file.Path; public class SunscreenLibrarySpigot implements SunscreenLibrary { - private final MenuTicker menuTicker = new MenuTicker(); private final SessionHandler sessionHandler = new SessionHandler(); private final PlaceholderRegistry placeholderRegistry = new PlaceholderRegistry.Impl(); - private final MenuRegistry menuRegistry = MenuRegistry.create(); - private final MenuConfigTransformer menuConfigTransformer = new MenuConfigTransformer.Impl(); private final SunscreenPlugin plugin; public SunscreenLibrarySpigot(SunscreenPlugin plugin) { @@ -72,34 +65,14 @@ public SessionHandler sessionHandler() { return sessionHandler; } - @Override - public MenuTicker menuTicker() { - return menuTicker; - } - @Override public UserHandler> users() { return plugin.userManager(); } - @Override - public Config config() { - return new Config(0, true, false, ""); - } - @Override public Logger logger() { return plugin.getComponentLogger(); } - @Override - public MenuConfigTransformer menuConfigTransformer() { - return menuConfigTransformer; - } - - @Override - public MenuRegistry menuRegistry() { - return (MenuRegistry) menuRegistry; - } - } diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java index d04a53c..16aaa8b 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/SunscreenPlugin.java @@ -2,40 +2,54 @@ import co.aikar.commands.PaperCommandManager; import com.github.retrooper.packetevents.PacketEvents; -import com.github.retrooper.packetevents.event.PacketListenerPriority; +import com.github.retrooper.packetevents.PacketEventsAPI; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerMapData; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; import me.combimagnetron.passport.Passport; -import me.combimagnetron.sunscreen.action.RunCommandAction; -import me.combimagnetron.sunscreen.command.SunscreenCommand; import me.combimagnetron.sunscreen.hook.SunscreenHook; import me.combimagnetron.sunscreen.hook.betterhud.BetterHudSunscreenHook; import me.combimagnetron.sunscreen.hook.mythichud.MythicHudSunscreenHook; import me.combimagnetron.sunscreen.hook.tab.TABSunscreenHook; import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.menu.MenuTemplate; -import me.combimagnetron.sunscreen.menu.listener.AnvilListener; -import me.combimagnetron.sunscreen.menu.listener.MenuListener; import me.combimagnetron.sunscreen.placeholder.PapiPlaceholderProvider; import me.combimagnetron.sunscreen.resourcepack.ResourcePack; import me.combimagnetron.sunscreen.resourcepack.feature.shader.Shader; import me.combimagnetron.sunscreen.resourcepack.feature.shader.ShaderFeature; import me.combimagnetron.sunscreen.resourcepack.meta.PackMeta; import me.combimagnetron.sunscreen.resourcepack.meta.PackVersion; +import me.combimagnetron.sunscreen.ui.graphic.GraphicLike; +import me.combimagnetron.sunscreen.ui.graphic.modifier.GraphicModifier; +import me.combimagnetron.sunscreen.ui.render.engine.encode.MapEncoder; import me.combimagnetron.sunscreen.user.SunscreenUser; import me.combimagnetron.sunscreen.user.UserManager; import me.combimagnetron.sunscreen.util.data.Identifier; import me.combimagnetron.sunscreen.util.data.Range; import org.apache.commons.io.IOUtils; +import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.MapMeta; +import org.bukkit.map.MapCanvas; +import org.bukkit.map.MapRenderer; +import org.bukkit.map.MapView; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; import java.io.*; -import java.nio.file.Path; -import java.util.Collection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -public class SunscreenPlugin extends JavaPlugin { +public class SunscreenPlugin extends JavaPlugin implements Listener { private SunscreenLibrary library; private UserManager userManager; @@ -43,11 +57,37 @@ public class SunscreenPlugin extends JavaPlugin { public void onLoad() { PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this)); PacketEvents.getAPI().load(); - PacketEvents.getAPI().getEventManager().registerListener(new MenuListener(), PacketListenerPriority.LOWEST); - PacketEvents.getAPI().getEventManager().registerListener(new AnvilListener(), PacketListenerPriority.LOWEST); + //PacketEvents.getAPI().getEventManager().registerListener(new MenuListener(), PacketListenerPriority.LOWEST); + //PacketEvents.getAPI().getEventManager().registerListener(new AnvilListener(), PacketListenerPriority.LOWEST); } + @EventHandler + public void onSneak(PlayerSwapHandItemsEvent sneakEvent) throws IOException { + BufferedImage image = ImageIO.read(new URL("https://i.imgur.com/4zDrYvx.png")); + GraphicLike graphicLike = new GraphicLike() { + @Override + public @NotNull GraphicLike modifier(@NotNull GraphicModifier modifier) { + return this; + } + + @Override + public @NotNull BufferedImage image() { + return image; + } + }; + MapEncoder mapEncoder = new MapEncoder(graphicLike); + WrapperPlayServerMapData serverMapData = new WrapperPlayServerMapData(99, (byte) 0, false, false, null, 128, 128, 0, 0, mapEncoder.bytes().toByteArray()); + PacketEvents.getAPI().getPlayerManager().sendPacket(sneakEvent.getPlayer(), serverMapData); + ItemStack itemStack = new ItemStack(Material.FILLED_MAP); + itemStack.editMeta(MapMeta.class, mapMeta -> { + mapMeta.setMapId(99); + }); + File file = getDataPath().resolve("bytes.txt").toFile(); + mapEncoder.write(file); + sneakEvent.getPlayer().getInventory().addItem(itemStack); + } + @Override public void onEnable() { PacketEvents.getAPI().init(); @@ -58,9 +98,10 @@ public void onEnable() { this.userManager = new UserManager(this); unzip(); commands(); - menus(); + //menus(); platformSpecific(); resourcePack(); + Bukkit.getPluginManager().registerEvents(this, this); } private void unzip() { @@ -120,20 +161,20 @@ private void resourcePack() { } private void platformSpecific() { - Action.ACTION_MAP.put(RunCommandAction.ActionIdentifier, new RunCommandAction()); + //Action.ACTION_MAP.put(RunCommandAction.ActionIdentifier, new RunCommandAction()); SunscreenHook.HOOKS.add(new MythicHudSunscreenHook()); SunscreenHook.HOOKS.add(new BetterHudSunscreenHook()); SunscreenHook.HOOKS.add(new TABSunscreenHook()); library.passport().placeholders().register(new PapiPlaceholderProvider()); } - private void menus() { + /*private void menus() { Collection templates = library.menuConfigTransformer().read(getDataFolder().toPath().resolve(Path.of("menus"))); library.logger().info("Loaded {} menu(s).", templates.size()); for (MenuTemplate template : templates) { library.menuRegistry().register(template); } - } + }*/ private void commands() { PaperCommandManager manager = new PaperCommandManager(this); @@ -144,8 +185,8 @@ private void commands() { }); manager.enableUnstableAPI("brigadier"); manager.getCommandCompletions().registerAsyncCompletion("users", (bukkitCommandCompletionContext) -> userManager.users().stream().map(SunscreenUser::name).filter(name -> name.startsWith(bukkitCommandCompletionContext.getInput())).toList()); - manager.getCommandCompletions().registerAsyncCompletion("menus", (bukkitCommandCompletionContext) -> library.menuRegistry().all().stream().map(menu -> menu.identifier().string()).filter(name -> name.startsWith(bukkitCommandCompletionContext.getInput())).toList()); - manager.registerCommand(new SunscreenCommand()); + ///manager.getCommandCompletions().registerAsyncCompletion("menus", (bukkitCommandCompletionContext) -> library.menuRegistry().all().stream().map(menu -> menu.identifier().string()).filter(name -> name.startsWith(bukkitCommandCompletionContext.getInput())).toList()); + //manager.registerCommand(new SunscreenCommand()); } @Override diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java b/spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java deleted file mode 100644 index 0a7d6ff..0000000 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/action/RunCommandAction.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.combimagnetron.sunscreen.action; - -import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.logic.action.Action; -import me.combimagnetron.sunscreen.logic.action.Argument; -import me.combimagnetron.sunscreen.logic.action.ArgumentType; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import me.combimagnetron.sunscreen.util.data.Identifier; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; - -import java.util.Collection; -import java.util.List; - -public class RunCommandAction extends Action.AbstractAction { - public static final Identifier ActionIdentifier = Identifier.of("sunscreen", "run_command"); - - public RunCommandAction() { - super(ActionIdentifier); - } - - @Override - public void execute(SunscreenUser user, Argument... arguments) { - if (!validate(arguments)) { - throw new IllegalArgumentException("Invalid arguments provided to action " + ActionIdentifier); - } - if (user == null) { - throw new IllegalArgumentException("User cannot be null"); - } - String command = (String) arguments[0].value(); - boolean console = arguments.length == 2 && (Boolean) arguments[1].value(); - if (console) { - Bukkit.getGlobalRegionScheduler().run((JavaPlugin) SunscreenLibrary.library().plugin(), (s) -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command)); - return; - } - Player player = (Player) user.platformSpecificPlayer(); - Bukkit.getGlobalRegionScheduler().run((JavaPlugin)SunscreenLibrary.library().plugin(), (s) -> player.chat("/" + command)); - } - - @Override - public boolean validate(Argument... arguments) { - return arguments.length == 1 && arguments[0].type() == String.class || - arguments.length == 2 && arguments[0].type() == String.class && arguments[1].type() == Boolean.class; - } - - @Override - public Collection argumentType() { - return List.of(ArgumentType.of("command", String.class), ArgumentType.of("console", Boolean.class)); - } - -} diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/betterhud/BetterHudSunscreenHook.java b/spigot/src/main/java/me/combimagnetron/sunscreen/hook/betterhud/BetterHudSunscreenHook.java index 5cac79d..e01d484 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/betterhud/BetterHudSunscreenHook.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/hook/betterhud/BetterHudSunscreenHook.java @@ -3,7 +3,7 @@ import kr.toxicity.hud.api.BetterHudAPI; import kr.toxicity.hud.api.player.HudPlayer; import me.combimagnetron.sunscreen.hook.SunscreenHook; -import me.combimagnetron.sunscreen.menu.OpenedMenu; +import me.combimagnetron.sunscreen.ui.ModernMenu; import me.combimagnetron.sunscreen.user.SunscreenUser; import org.bukkit.Bukkit; @@ -25,7 +25,7 @@ public void disable() { } @Override - public void onMenuEnter(SunscreenUser user, OpenedMenu menu) { + public void onMenuEnter(SunscreenUser user, ModernMenu menu) { HudPlayer hudPlayer = BetterHudAPI.inst().getPlayerManager().getHudPlayer(user.uniqueIdentifier()); if (hudPlayer == null) { return; @@ -34,7 +34,7 @@ public void onMenuEnter(SunscreenUser user, OpenedMenu menu) { } @Override - public void onMenuLeave(SunscreenUser user, OpenedMenu menu) { + public void onMenuLeave(SunscreenUser user, ModernMenu menu) { HudPlayer hudPlayer = BetterHudAPI.inst().getPlayerManager().getHudPlayer(user.uniqueIdentifier()); if (hudPlayer == null) { return; diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/mythichud/MythicHudSunscreenHook.java b/spigot/src/main/java/me/combimagnetron/sunscreen/hook/mythichud/MythicHudSunscreenHook.java index d87c355..39e353d 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/mythichud/MythicHudSunscreenHook.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/hook/mythichud/MythicHudSunscreenHook.java @@ -1,7 +1,7 @@ package me.combimagnetron.sunscreen.hook.mythichud; import me.combimagnetron.sunscreen.hook.SunscreenHook; -import me.combimagnetron.sunscreen.menu.OpenedMenu; +import me.combimagnetron.sunscreen.ui.ModernMenu; import me.combimagnetron.sunscreen.user.SunscreenUser; import org.bukkit.event.Listener; @@ -22,12 +22,12 @@ public void disable() { } @Override - public void onMenuEnter(SunscreenUser user, OpenedMenu menu) { + public void onMenuEnter(SunscreenUser user, ModernMenu menu) { } @Override - public void onMenuLeave(SunscreenUser user, OpenedMenu menu) { + public void onMenuLeave(SunscreenUser user, ModernMenu menu) { } /*private final Map> previouslyActive = new HashMap<>(); diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/nexo/NexoSunscreenHook.java b/spigot/src/main/java/me/combimagnetron/sunscreen/hook/nexo/NexoSunscreenHook.java deleted file mode 100644 index 8c7d15b..0000000 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/nexo/NexoSunscreenHook.java +++ /dev/null @@ -1,109 +0,0 @@ -package me.combimagnetron.sunscreen.hook.nexo; - -import com.nexomc.nexo.NexoPlugin; -import com.nexomc.nexo.api.NexoPack; -import com.nexomc.nexo.fonts.FontManager; -import com.nexomc.nexo.fonts.Glyph; -import me.combimagnetron.sunscreen.hook.ResourcePackProviderHook; -import me.combimagnetron.sunscreen.hook.SunscreenHook; -import me.combimagnetron.sunscreen.image.Canvas; -import me.combimagnetron.sunscreen.menu.OpenedMenu; -import me.combimagnetron.sunscreen.user.SunscreenUser; -import net.kyori.adventure.key.Key; -import org.bukkit.Bukkit; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import team.unnamed.creative.BuiltResourcePack; -import team.unnamed.creative.ResourcePack; -import team.unnamed.creative.base.Writable; -import team.unnamed.creative.font.BitMapFontProvider; -import team.unnamed.creative.font.Font; -import team.unnamed.creative.metadata.overlays.OverlayEntry; -import team.unnamed.creative.metadata.overlays.OverlaysMeta; -import team.unnamed.creative.overlay.Overlay; -import team.unnamed.creative.texture.Texture; - -import javax.imageio.ImageIO; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -public class NexoSunscreenHook implements ResourcePackProviderHook { - @Override - public boolean canRun() { - return Bukkit.getPluginManager().isPluginEnabled("Nexo"); - } - - @Override - public void enable() { - - } - - public @Nullable Canvas font(char ch) { - String character = String.valueOf(ch); - FontManager manager = NexoPlugin.instance().fontManager(); - Glyph glyph = manager.glyphs().stream().filter(g -> g.getUnicodes().contains(character)).findAny().orElseThrow(); - ResourcePack pack = NexoPlugin.instance().packGenerator().resourcePack(); - Font font = pack.font(glyph.getFont()); - if (font == null) { - return null; - } - List providers = font.providers().stream().filter(fontProvider -> fontProvider instanceof BitMapFontProvider).map(fontProvider -> (BitMapFontProvider) fontProvider).toList(); - for (BitMapFontProvider provider : providers) { - if (!provider.characters().contains(character)) { - continue; - } - Key file = provider.file(); - Texture texture = pack.texture(file); - Canvas canvas; - try { - canvas = Canvas.image(ImageIO.read(new ByteArrayInputStream(texture.data().toByteArray()))); - } catch (IOException e) { - throw new RuntimeException(e); - } - return canvas; - } - return null; - } - - public boolean merge(me.combimagnetron.sunscreen.resourcepack.ResourcePack resourcePack) { - ResourcePack pack = NexoPack.resourcePack(); - OverlaysMeta overlaysMeta = pack.overlaysMeta(); - if (overlaysMeta == null) { - return false; - } - for (OverlayEntry entry : overlaysMeta.entries()) { - Overlay overlay = pack.overlay(entry.directory()); - if (overlay == null) { - continue; - } - Map files = overlay.unknownFiles(); - files.forEach((path, writable) -> { - String shader; - try { - shader = writable.toUTF8String(); - } catch (IOException e) { - throw new RuntimeException(e); - } - - }); - } - return false; - } - - @Override - public void disable() { - - } - - @Override - public void onMenuEnter(@NotNull SunscreenUser user, @Nullable OpenedMenu menu) { - - } - - @Override - public void onMenuLeave(@NotNull SunscreenUser user, @Nullable OpenedMenu menu) { - - } -} diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/tab/TABSunscreenHook.java b/spigot/src/main/java/me/combimagnetron/sunscreen/hook/tab/TABSunscreenHook.java index d7991fe..261ea01 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/hook/tab/TABSunscreenHook.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/hook/tab/TABSunscreenHook.java @@ -1,11 +1,10 @@ package me.combimagnetron.sunscreen.hook.tab; import me.combimagnetron.sunscreen.hook.SunscreenHook; -import me.combimagnetron.sunscreen.menu.OpenedMenu; +import me.combimagnetron.sunscreen.ui.ModernMenu; import me.combimagnetron.sunscreen.user.SunscreenUser; import me.neznamy.tab.api.TabAPI; import me.neznamy.tab.api.TabPlayer; -import me.neznamy.tab.api.bossbar.BossBar; import me.neznamy.tab.api.bossbar.BossBarManager; import me.neznamy.tab.api.scoreboard.ScoreboardManager; import org.bukkit.Bukkit; @@ -27,7 +26,7 @@ public void disable() { } @Override - public void onMenuEnter(SunscreenUser user, OpenedMenu menu) { + public void onMenuEnter(SunscreenUser user, ModernMenu menu) { TabPlayer tabPlayer = TabAPI.getInstance().getPlayer(user.uniqueIdentifier()); if (tabPlayer == null) { return; @@ -45,7 +44,7 @@ public void onMenuEnter(SunscreenUser user, OpenedMenu menu) { } @Override - public void onMenuLeave(SunscreenUser user, OpenedMenu menu) { + public void onMenuLeave(SunscreenUser user, ModernMenu menu) { TabPlayer tabPlayer = TabAPI.getInstance().getPlayer(user.uniqueIdentifier()); if (tabPlayer == null) { return; diff --git a/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java b/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java index a784716..fd89b98 100644 --- a/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java +++ b/spigot/src/main/java/me/combimagnetron/sunscreen/user/UserImpl.java @@ -14,12 +14,10 @@ import me.combimagnetron.passport.internal.entity.metadata.type.Vector3d; import me.combimagnetron.passport.internal.network.Connection; import me.combimagnetron.sunscreen.SunscreenLibrary; -import me.combimagnetron.sunscreen.menu.AspectRatioMenu; -import me.combimagnetron.sunscreen.menu.MenuTemplate; -import me.combimagnetron.sunscreen.menu.OpenedMenu; import me.combimagnetron.sunscreen.menu.ScreenSize; -import me.combimagnetron.sunscreen.menu.timing.MenuTicker; import me.combimagnetron.sunscreen.session.Session; +import me.combimagnetron.sunscreen.ui.ModernLayout; +import me.combimagnetron.sunscreen.ui.ModernMenu; import me.combimagnetron.sunscreen.util.data.Pair; import me.combimagnetron.sunscreen.util.math.Vec2d; import me.combimagnetron.sunscreen.util.math.Vec2i; @@ -45,7 +43,7 @@ private UserImpl(Player player) { this.connection = new PacketEventsConnectionImpl<>(player); Node node = Config.file(SunscreenLibrary.library().path().resolve("data.dt")).reader().node(uniqueIdentifier().toString()); this.version = PacketEvents.getAPI().getPlayerManager().getUser(player).getClientVersion(); - if (node == null) { + /*if (node == null) { AspectRatioMenu menu = new AspectRatioMenu(this); SunscreenLibrary.library().menuTicker().start(menu); SunscreenLibrary.library().sessionHandler().session(Session.session(menu, this)); @@ -55,7 +53,7 @@ private UserImpl(Player player) { //SunscreenLibrary.library().menuTicker().start(new UserSetupMenu(this)); return; } - this.screenSize = ScreenSize.fromString(node.value()); + this.screenSize = ScreenSize.fromString(node.value());*/ } @Override @@ -143,12 +141,13 @@ public Session session() { } @Override - public Session open(MenuTemplate template) { - OpenedMenu.FloatImpl menu = new OpenedMenu.Float(this, template); + public Session open(ModernLayout template) { + /*OpenedMenu.FloatImpl menu = new OpenedMenu.Float(this, template); SunscreenLibrary.library().menuTicker().start(menu); menu.open(this); Session session = Session.session(menu, this); - return SunscreenLibrary.library().sessionHandler().session(session); + return SunscreenLibrary.library().sessionHandler().session(session);*/ + return null; } @Override