From fb6e6eb1d3f324ce9dd802f7dfffaa8cfddeecec Mon Sep 17 00:00:00 2001 From: loki5512344 Date: Wed, 9 Sep 2026 23:55:33 +0200 Subject: [PATCH] chore(history): squash 16 commit(s) from 2026-09-09 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docs: Cosmetics Overhaul design spec (slot-based cosmetics + built-in head/back modules) - chore: drop design doc, implementing directly from TODO.md - feat: Cosmetics module overhaul — 8 body-zone slots + 3D preview screen - feat: AlwaysVisibleHand module + KineticLyrics text scale & timing offset - feat: KillEffect Portal/Tornado procedural shader modes - feat: KineticLyrics sync — millisecond position prediction (playerctl-style) - feat: SkyShader Nebula mode, BlockHighlight shader outlines, crosshairs - feat: CombatLog module — damage dealt/taken log with DPS stats - refactor(8.5.1): regroup mixins/ 108 files into domain leaf packages (<=4 each) + regenerate mixins.json - refactor(8.5.1): split accessors into 12 groups, iris/sodium/security into leaves, fix plugin FQNs + mixins.json - refactor(8.5.1): split visuals/ 67 files into esp/nametags/hats/effects/weather/scene/camera/player/items/fx packages; lyrics->lrc; member visibility fixes; configs untouched (module ids preserved) - refactor(8.5.1): split features/gui/clickgui/settings 51 files into 18 leaf packages (core/color/slider/text/bind/...); visibility promotion only, no behavior changes - refactor(8.5.1): split features/gui/hud/draggable/impl 40 files into stats/metrics/status/combat/panels/targethud/scripted leaves; TargetHudModel records nested; visibility-only - refactor(8.5.1): split events tree (impl 32 -> 8 domains, top -> core/meta); TODO 8.5 progress notes - refactor(8.5.1): split features/gui/chat 31 files into model/render/text/input/suggestions/menu/messages leaves - fix(8.5.1 audit): delete dead unregistered ItemRenderStateLayerAccessor, drop ghost sodium FQNs from plugin, remove vestigial visuals.* star import --- TODO.md | 85 +++++ combatant-client-26.2/TODO.md | 158 ++++++++ .../lovisual/hud/draggable/combat_log.json | 3 + .../main/java/dev/loki/lovisual/LoVisual.java | 5 +- .../loki/lovisual/addon/AddonDescriptor.java | 2 +- .../lovisual/addon/AddonRegistration.java | 2 +- .../loki/lovisual/addon/AddonStateStore.java | 2 +- .../addon/LoVisualAddonContextImpl.java | 2 +- .../LoVisualAddonRuntimeContextImpl.java | 2 +- .../addon/LoVisualModuleLoadContextImpl.java | 2 +- .../addon/ModuleExtensionContextImpl.java | 2 +- .../api/v0/addon/LoVisualAddonContext.java | 2 +- .../v0/addon/LoVisualModuleLoadContext.java | 2 +- .../compat/xaero/XaeroWaypointRuntime.java | 2 +- .../dev/loki/lovisual/config/MainConfig.java | 1 - .../dev/loki/lovisual/config/SettingDef.java | 2 +- .../config/common/CommonSettingSchemas.java | 1 + .../profile/ConfigProfileValueCodec.java | 2 +- .../dev/loki/lovisual/events/EventBus.java | 2 + .../java/dev/loki/lovisual/events/Events.java | 1 + .../impl/{ => entity}/AttackEntityEvent.java | 2 +- .../CrosshairTargetUpdateEvent.java | 2 +- .../impl/{ => entity}/EventTargetChanged.java | 2 +- .../impl/{ => entity}/FireworkEvent.java | 2 +- .../impl/{ => input}/KeyInputEvent.java | 2 +- .../{ => input}/KeybindIsPressedEvent.java | 2 +- .../impl/{ => input}/RotationUpdateEvent.java | 2 +- .../impl/{ => input}/SprintControlEvent.java | 2 +- .../{ => movement}/MovementInputEvent.java | 2 +- .../{ => movement}/PlayerSafeWalkEvent.java | 2 +- .../impl/{ => movement}/PlayerStepEvent.java | 2 +- .../PlayerStepSuccessEvent.java | 2 +- .../impl/{ => network}/BlinkPacketEvent.java | 2 +- .../impl/{ => network}/EventPostSync.java | 2 +- .../events/impl/{ => network}/EventSync.java | 2 +- .../impl/{ => network}/PacketEvent.java | 2 +- .../I18nPreflightCollectEvent.java | 6 +- .../impl/{ => player}/PlayerJumpEvent.java | 2 +- .../impl/{ => player}/PlayerMoveEvent.java | 2 +- .../{ => player}/PostPlayerUpdateEvent.java | 2 +- .../{ => pvp}/CombatProtocolBossbarEvent.java | 2 +- .../events/impl/{ => pvp}/PvpChatEvent.java | 2 +- .../impl/{ => pvp}/PvpOverlayEvent.java | 2 +- .../events/impl/{ => pvp}/PvpTabEvent.java | 2 +- .../impl/{ => render}/GameTickEvent.java | 2 +- .../impl/{ => render}/LightmapEvent.java | 2 +- .../{ => render}/LightmapModifyEvent.java | 3 +- .../RenderPrewarmCollectEvent.java | 2 +- .../impl/{ => world}/EventBreakBlock.java | 2 +- .../impl/{ => world}/EventCollision.java | 2 +- .../{ => world}/EventPushOutOfBlocks.java | 2 +- .../{ => world}/PlayerVelocityStrafe.java | 2 +- .../events/{ => meta}/EventHandler.java | 3 +- .../events/{ => meta}/UsedImplicitly.java | 2 +- .../features/command/CommandInfo.java | 2 +- .../features/command/impl/CommandUtils.java | 2 +- .../features/command/impl/HideCommand.java | 1 + .../features/command/impl/PingCommand.java | 1 + .../command/impl/ServerInfoCommand.java | 1 + .../CosmeticAttachmentTransforms.java | 85 +++-- .../features/cosmetic/CosmeticManager.java | 56 +-- .../features/cosmetic/CosmeticModel.java | 18 +- .../features/cosmetic/CosmeticRenderer.java | 18 +- .../features/cosmetic/CosmeticRepository.java | 4 + .../features/cosmetic/CosmeticSlot.java | 62 ++++ .../features/gui/chat/BetterChatModel.java | 85 ----- .../features/gui/chat/BetterChatRenderer.java | 211 ----------- .../features/gui/chat/BetterChatViewport.java | 8 +- .../{ => input}/BetterChatEditBoxUtil.java | 14 +- .../{ => input}/BetterChatInputHandler.java | 27 +- .../{ => input}/BetterChatInputRenderer.java | 14 +- .../BetterChatMouseClickHandler.java | 14 +- .../BetterChatContextMenuHandler.java | 21 +- .../BetterChatContextMenuModel.java | 19 +- .../{ => menu}/BetterChatTooltipRenderer.java | 21 +- .../BetterChatMessageGrouping.java | 7 +- .../BetterChatMessageRenderer.java | 20 +- .../chat/{ => messages}/BetterChatSearch.java | 5 +- .../{ => messages}/BetterChatTabHandler.java | 7 +- .../gui/chat/model/BetterChatModel.java | 89 +++++ .../gui/chat/{ => model}/BetterChatStore.java | 3 +- .../{ => model}/BetterChatStoreManager.java | 6 +- .../gui/chat/{ => model}/ChatLine.java | 2 +- .../{ => render}/BetterChatFrameModel.java | 14 +- .../{ => render}/BetterChatFrameRenderer.java | 16 +- .../gui/chat/render/BetterChatRenderer.java | 224 ++++++++++++ .../BetterChatCommandMerge.java | 8 +- .../BetterChatSuggestionRenderer.java | 14 +- .../BetterChatSuggestionState.java | 37 +- .../CommandSuggestorBridge.java | 11 +- .../{ => text}/BetterChatGlyphRenderer.java | 11 +- .../{ => text}/BetterChatLayoutEngine.java | 20 +- .../chat/{ => text}/BetterChatLineLayout.java | 9 +- .../{ => text}/BetterChatSegmentUtil.java | 7 +- .../{ => text/util}/BetterChatDrawUtil.java | 27 +- .../{ => text/util}/BetterChatFontUtil.java | 30 +- .../{ => text/util}/BetterChatHoverCache.java | 2 +- .../chat/{ => text/util}/ChatHoverUtil.java | 5 +- .../gui/clickgui/ClickGuiDrawHelpers.java | 2 +- .../gui/clickgui/ClickGuiEditorManager.java | 6 +- .../features/gui/clickgui/ClickGuiFonts.java | 2 +- .../gui/clickgui/ClickGuiInputHandler.java | 2 +- .../gui/clickgui/ClickGuiKeyBindManager.java | 6 +- .../gui/clickgui/ClickGuiKeyboardHandler.java | 2 +- .../gui/clickgui/ClickGuiLifecycle.java | 2 +- .../clickgui/ClickGuiPickerIconManager.java | 2 +- .../gui/clickgui/ClickGuiRenderEngine.java | 2 +- .../gui/clickgui/ClickGuiRenderer.java | 6 +- .../gui/clickgui/ClickGuiScreenManager.java | 6 +- .../features/gui/clickgui/ClickGuiTabBar.java | 2 +- .../gui/clickgui/ClickGuiTabState.java | 2 +- .../gui/clickgui/ClickGuiTextBatch.java | 2 +- .../gui/clickgui/ClickGuiTopLayer.java | 2 +- .../editor/ClickGuiTextEditorState.java | 2 +- .../screen/modules/ModulesMenuPanel.java | 8 +- .../screen/modules/ModulesMenuResolver.java | 4 +- .../screen/modules/ModulesMenuScreen.java | 7 +- .../screen/modules/ModulesMenuStyle.java | 2 +- .../screen/settings/MenuSettingsResolver.java | 8 +- .../implement/main/MainSettingsComponent.java | 8 +- .../module/SettingsPanelComponent.java | 6 +- .../OnlineRelationPlayerPickerComponent.java | 2 +- .../clickgui/picker/ClickGuiPickerState.java | 4 +- .../gui/clickgui/picker/PickerCatalog.java | 2 +- .../clickgui/picker/PickerCatalogFactory.java | 2 +- .../CombatProtocolHeuristicsEditorState.java | 2 +- .../gui/clickgui/settings/ColorSetting.java | 143 -------- .../{ => bind}/FunctionBindSetting.java | 44 +-- .../FunctionBindSettingRenderer.java | 13 +- .../settings/{ => bind}/KeyBindSetting.java | 42 ++- .../{ => bind}/KeyBindSettingRenderer.java | 13 +- .../settings/{ => bool}/BooleanSetting.java | 30 +- .../{ => bool}/BooleanSettingRenderer.java | 15 +- .../clickgui/settings/color/ColorSetting.java | 145 ++++++++ .../{ => color}/ColorSettingMath.java | 8 +- .../{ => color}/ColorSettingNoAlpha.java | 3 +- .../ConfigColorSettingNoAlpha.java | 3 +- .../{ => color/hex}/ColorSettingHexInput.java | 20 +- .../{ => color/hex}/ColorSettingHexState.java | 10 +- .../{ => color/preset}/ColorPresetStore.java | 4 +- .../preset}/ColorSettingPresetHandler.java | 12 +- .../preset}/ColorSettingPresetRenderer.java | 14 +- .../{ => color/render}/ColorSettingDrag.java | 10 +- .../render}/ColorSettingLayout.java | 11 +- .../render}/ColorSettingRenderer.java | 26 +- .../render}/ColorSettingSquareRenderer.java | 9 +- .../{ => cooldown}/CooldownRulesSetting.java | 10 +- .../ProtocolHeuristicsSetting.java | 4 +- .../clickgui/settings/{ => core}/Setting.java | 2 +- .../settings/{ => core}/SettingFactory.java | 14 +- .../settings/{ => group}/GroupSetting.java | 22 +- .../{ => group}/GroupSettingRenderer.java | 13 +- .../{ => i18n}/I18nDuplicateScanner.java | 2 +- .../{ => i18n}/I18nPreflightContributors.java | 10 +- .../{ => i18n}/I18nPreflightManager.java | 5 +- .../settings/{ => mode}/ModeSetting.java | 24 +- .../{ => mode}/ModeSettingRenderer.java | 13 +- .../{ => owner}/PickerDetailOwner.java | 2 +- .../settings/{ => owner}/TextEditorOwner.java | 2 +- .../{ => render}/SettingRenderContext.java | 3 +- .../{ => render}/SettingRenderSurface.java | 2 +- .../{ => render}/SettingRendererBridge.java | 100 ++--- .../{ => render}/UnifiedSettingRenderer.java | 40 +- .../{ => skin}/ModulesSettingsSkin.java | 5 +- .../settings/{ => skin}/SettingSkinUtil.java | 22 +- .../{ => skin}/UnifiedSettingsSkin.java | 70 ++-- .../settings/{ => slider}/SliderSetting.java | 44 +-- .../{ => slider}/SliderSettingRenderer.java | 20 +- .../{ => slider}/SliderTextInputHandler.java | 19 +- .../{ => slider}/SliderTextInputState.java | 5 +- .../settings/{ => text}/TextSetting.java | 29 +- .../{ => text}/TextSettingRenderer.java | 17 +- .../TextSettingTextInputHandler.java | 12 +- .../{ => text/list}/TextListSetting.java | 33 +- .../list}/TextListSettingRenderer.java | 17 +- .../list}/TextListTextEditHandler.java | 13 +- .../settings/{ => util}/BindRendererUtil.java | 12 +- .../{ => util}/SettingTextInputUtil.java | 10 +- .../features/gui/hud/BaseHudElement.java | 6 +- .../features/gui/hud/HudElementInfo.java | 2 +- .../features/gui/hud/HudElementRegister.java | 2 +- .../features/gui/hud/HudGlobalConfig.java | 1 - .../gui/hud/draggable/impl/BetterChat.java | 2 +- .../draggable/impl/HudPanelLayoutModes.java | 18 +- .../gui/hud/draggable/impl/TargetHud.java | 335 ----------------- .../hud/draggable/impl/TargetHudModel.java | 29 -- .../gui/hud/draggable/impl/Triangulator.java | 1 + .../draggable/impl/combat/CombatLogHud.java | 84 +++++ .../impl/{ => combat}/Inventory.java | 5 +- .../draggable/impl/{ => combat}/Itemizer.java | 2 +- .../impl/{ => combat}/MediaPlayer.java | 4 +- .../impl/{ => hudnotifier}/HudNotifier.java | 16 +- .../impl/hudnotifier/ToastCardRenderer.java | 9 +- .../impl/hudnotifier/ToastGeometry.java | 11 +- .../hudnotifier/{ => model}/ToastModel.java | 4 +- .../hudnotifier/{ => model}/ToastStyle.java | 8 +- .../impl/{ => metrics}/Coordinates.java | 2 +- .../impl/{ => metrics}/GameTime.java | 4 +- .../impl/{ => metrics}/SpeedBps.java | 2 +- .../impl/{ => metrics}/SystemTime.java | 2 +- .../draggable/impl/{ => panels}/Keybinds.java | 6 +- .../impl/{ => panels}/ModuleList.java | 2 +- .../draggable/impl/{ => panels}/Radar.java | 3 +- .../impl/{ => panels}/Scoreboard.java | 4 +- .../ScriptedInventoryHudPanel.java | 12 +- .../{ => scripted}/ScriptedListHudPanel.java | 55 +-- .../ScriptedTriangulatorHudPanel.java | 5 +- .../hud/draggable/impl/{ => stats}/Fps.java | 2 +- .../draggable/impl/{ => stats}/Memory.java | 2 +- .../hud/draggable/impl/{ => stats}/Ping.java | 2 +- .../hud/draggable/impl/{ => stats}/Tps.java | 2 +- .../draggable/impl/{ => status}/Admins.java | 4 +- .../draggable/impl/{ => status}/Armor.java | 2 +- .../impl/{ => status}/Cooldowns.java | 8 +- .../draggable/impl/{ => status}/Potions.java | 4 +- .../draggable/impl/targethud/TargetHud.java | 336 +++++++++++++++++ .../{ => targethud}/TargetHudFormatter.java | 24 +- .../impl/targethud/TargetHudModel.java | 35 ++ .../TargetHudTargetResolver.java | 13 +- .../render}/TargetHudContentRenderer.java | 13 +- .../render}/TargetHudPanelRenderer.java | 17 +- .../render}/TargetHudRenderer.java | 21 +- .../render}/TargetHudTextRenderer.java | 14 +- .../render/parts}/TargetHudArcRenderer.java | 23 +- .../parts}/TargetHudEffectsRenderer.java | 17 +- .../parts}/TargetHudEquipmentRenderer.java | 17 +- .../render/parts}/TargetHudFaceRenderer.java | 18 +- .../triangulator/TriangulatorTracker.java | 2 + .../impl/triangulator/TriangulatorView.java | 3 +- .../render/TriangulatorMeasure.java | 5 +- .../render/TriangulatorPainter.java | 4 +- .../render/RegistryRenderPipeline.java | 2 +- .../hud/nondraggable/impl/BetterButtons.java | 4 +- .../gui/hud/nondraggable/impl/CustomBar.java | 2 +- .../hud/nondraggable/impl/CustomBarModel.java | 2 +- .../nondraggable/impl/CustomHealthBar.java | 1 + .../hud/nondraggable/impl/CustomHotbar.java | 4 +- .../impl/CustomJumpBarRenderer.java | 2 +- .../impl/CustomLocatorCollector.java | 2 +- .../nondraggable/impl/CustomLocatorHeads.java | 2 +- .../impl/CustomLocatorLabelCache.java | 2 +- .../impl/CustomLocatorLabelPanel.java | 2 +- .../impl/CustomLocatorLabels.java | 2 +- .../impl/CustomLocatorMarkers.java | 2 +- .../impl/CustomLocatorRenderer.java | 2 +- .../impl/CustomLocatorResolver.java | 2 +- .../impl/CustomXpBarRenderer.java | 2 +- .../impl/dynamicisland/IslandUiUtil.java | 2 +- .../impl/tab/TabListAnimator.java | 2 +- .../nondraggable/impl/tab/TabListModel.java | 4 +- .../impl/tab/TabRichTextRenderer.java | 2 +- .../gui/hud/script/HudScriptLayouts.java | 2 +- .../loki/lovisual/features/module/Module.java | 13 +- .../lovisual/features/module/ModuleInfo.java | 2 +- .../features/module/ModuleRegister.java | 2 +- .../lovisual/features/module/Notifier.java | 2 +- .../features/module/module/ModuleBinds.java | 6 +- .../module/module/ModuleConfigValues.java | 2 +- .../module/module/ModuleSettingValues.java | 2 +- .../module/modules/combat/Predictions.java | 2 +- .../modules/combat/ProjectilePuncher.java | 4 +- .../module/modules/combat/PvpCooldowns.java | 4 +- .../module/modules/combat/RubberHand.java | 4 +- .../modules/combat/combatlog/CombatLog.java | 137 +++++++ .../combat/combatlog/CombatLogEntry.java | 5 + .../combat/combatlog/CombatLogStats.java | 60 +++ .../module/modules/misc/DefineTarget.java | 2 +- .../module/modules/misc/MessageFilter.java | 2 +- .../features/module/modules/misc/NoSound.java | 2 +- .../module/modules/player/AutoAccept.java | 6 +- .../module/modules/player/AutoTool.java | 8 +- .../module/modules/player/ClickPearl.java | 2 +- .../module/modules/player/NoDelay.java | 6 +- .../module/modules/player/ShitDropper.java | 2 +- .../module/modules/player/TapeMouse.java | 2 +- .../module/modules/player/UseTracker.java | 4 +- .../modules/visuals/CosmeticDisplay.java | 76 ---- .../visuals/{ => camera}/AspectRatio.java | 2 +- .../visuals/{ => camera}/CameraClip.java | 2 +- .../modules/visuals/{ => camera}/Freecam.java | 9 +- .../visuals/{ => camera}/ViewModel.java | 4 +- .../visuals/cosmetics/CosmeticDisplay.java | 139 +++++++ .../visuals/cosmetics/CosmeticsHotspot.java | 81 ++++ .../visuals/cosmetics/CosmeticsScreen.java | 195 ++++++++++ .../visuals/cosmetics/CosmeticsSlotPanel.java | 153 ++++++++ .../visuals/{ => effects}/HitEffect.java | 3 +- .../visuals/{ => effects}/KillEffect.java | 101 ++++- .../modules/visuals/{ => effects}/Trails.java | 5 +- .../visuals/{ => effects}/WorldParticles.java | 2 +- .../module/modules/visuals/{ => esp}/ESP.java | 130 +++---- .../visuals/{ => esp}/EspColorUtil.java | 22 +- .../visuals/{ => esp}/EspEntityCollector.java | 12 +- .../modules/visuals/{ => esp}/EspModel.java | 18 +- .../{ => esp/audio}/LightningTargetESP.java | 7 +- .../visuals/{ => esp/audio}/SoundESP.java | 2 +- .../visuals/{ => esp/overlay}/BlockESP.java | 4 +- .../visuals/{ => esp/overlay}/DropESP.java | 5 +- .../visuals/{ => esp/overlay}/HoleESP.java | 2 +- .../visuals/{ => esp/overlay}/InvisEsp.java | 2 +- .../{ => esp/render}/Esp2DRenderer.java | 9 +- .../{ => esp/render}/Esp3DRenderer.java | 11 +- .../{ => esp/render}/EspOutlineRenderer.java | 6 +- .../{ => esp/render}/EspSearchOverlay.java | 10 +- .../{ => esp/shader}/EspMeshBuilder.java | 10 +- .../{ => esp/shader}/EspShaderColor.java | 6 +- .../{ => esp/shader}/EspShaderMask.java | 12 +- .../{ => esp/shader}/EspShaderRenderer.java | 13 +- .../modules/visuals/{ => fx}/MotionBlur.java | 3 +- .../modules/visuals/{ => fx}/PostFX.java | 4 +- .../modules/visuals/{ => fx}/TotemFX.java | 2 +- .../module/modules/visuals/{ => fx}/Zoom.java | 4 +- .../modules/visuals/{ => hats}/ChinaHat.java | 2 +- .../visuals/{ => hats}/ChinaHatModel.java | 12 +- .../visuals/{ => hats}/ChinaHatPalette.java | 32 +- .../modules/visuals/{ => hats}/TazikHat.java | 2 +- .../visuals/items/AlwaysVisibleHand.java | 67 ++++ .../visuals/{ => items}/BackSword.java | 2 +- .../visuals/{ => items}/HoldMyItems.java | 3 +- .../visuals/{ => items}/ShulkerPreview.java | 2 +- .../modules/visuals/lyrics/KineticLyrics.java | 14 +- .../visuals/lyrics/LyricParticle3D.java | 4 +- .../lyrics/{ => lrc}/LrcLibClient.java | 5 +- .../visuals/lyrics/{ => lrc}/LrcParser.java | 2 +- .../visuals/lyrics/{ => lrc}/LyricLine.java | 2 +- .../lyrics/{ => lrc}/LyricLineSplitter.java | 2 +- .../visuals/{ => nametags}/NameTagCache.java | 5 +- .../{ => nametags}/NameTagLayoutEngine.java | 15 +- .../visuals/{ => nametags}/NameTagModel.java | 8 +- .../visuals/{ => nametags}/NameTags.java | 60 +-- .../parts}/NameTagEquipmentRenderer.java | 12 +- .../parts}/NameTagFaceRenderer.java | 8 +- .../parts}/NameTagOpponentRenderer.java | 12 +- .../parts}/NameTagPlateRenderer.java | 13 +- .../render}/NameTagEffectsRenderer.java | 5 +- .../render}/NameTagEnchantFormatter.java | 10 +- .../render}/NameTagLabelBuilder.java | 11 +- .../render}/NameTagRenderer.java | 14 +- .../visuals/{ => player}/Animations.java | 2 +- .../visuals/{ => player}/Crosshair.java | 64 +++- .../visuals/{ => player}/FullBright.java | 6 +- .../visuals/{ => player}/JumpCircles.java | 2 +- .../visuals/{ => scene}/BlockHighlight.java | 99 ++++- .../modules/visuals/{ => scene}/Chams.java | 7 +- .../visuals/{ => scene}/ItemPhysic.java | 2 +- .../visuals/{ => scene}/ReimaginedVisual.java | 2 +- .../visuals/{ => visibility}/Hitboxes.java | 3 +- .../visuals/{ => visibility}/Light.java | 6 +- .../visuals/{ => visibility}/NoRender.java | 2 +- .../visuals/{ => weather}/AtmoDawnFog.java | 4 +- .../modules/visuals/{ => weather}/Rain.java | 22 +- .../visuals/{ => weather}/ShaderSky.java | 31 +- .../visuals/{ => weather}/WorldTweaks.java | 11 +- .../features/theme/EditableClickGuiTheme.java | 4 +- .../lovisual/features/theme/ThemeStore.java | 2 +- .../lovisual/mixins/LoVisualMixinPlugin.java | 37 +- .../ItemRenderStateLayerAccessor.java | 44 --- .../{ => blaze3d}/GlTextureInvoker.java | 2 +- .../{ => blaze3d}/GpuDeviceAccessor.java | 2 +- .../ShaderLoaderDefinitionsAccessor.java | 2 +- .../ShaderSourceKeyAccessor.java | 2 +- .../ChatInputSuggestorAccessor.java | 2 +- .../{ => chat}/ChatScreenAccessor.java | 2 +- .../ChatScreenSuggestorAccessor.java | 2 +- .../{ => chat}/SuggestionWindowAccessor.java | 2 +- .../{ => entity}/EntityAccessor.java | 2 +- .../accessors/{ => entity}/EntityInvoker.java | 2 +- .../{ => entity}/LivingEntityAccessor.java | 2 +- .../{ => entity}/LocalPlayerAccessor.java | 2 +- .../{ => hud}/BossHealthOverlayAccessor.java | 2 +- .../InGameOverlayRendererAccessor.java | 2 +- .../{ => hud}/PlayerTabOverlayAccessor.java | 2 +- .../TextIconButtonWidgetAccessor.java | 2 +- .../ItemCooldownEntryAccessor.java | 2 +- .../ItemCooldownManagerAccessor.java | 2 +- .../PlayerInventoryAccessor.java | 2 +- .../{ => inventory}/SlotAccessor.java | 2 +- .../accessors/{ => misc}/InputAccessor.java | 2 +- .../{ => misc}/KeyMappingAccessor.java | 2 +- .../{ => misc}/MinecraftAccessor.java | 2 +- .../MultiPlayerGameModeAccessor.java | 2 +- .../ClientboundExplodePacketAccessor.java | 2 +- ...entboundSetEntityMotionPacketAccessor.java | 2 +- .../ServerboundInteractPacketAccessor.java | 2 +- .../ServerboundMovePlayerPacketAccessor.java | 2 +- .../PersistentProjectileEntityAccessor.java | 2 +- .../EntityRenderManagerAccessor.java | 2 +- .../EntityRendererAccessor.java | 2 +- .../{ => renderer}/GameRendererAccessor.java | 2 +- .../RenderLayerInvokerAccessor.java | 2 +- .../EffectParticleEffectAccessor.java | 2 +- .../FireworksComponentAccessor.java | 2 +- .../LivingEntityRenderStateAccessor.java | 2 +- .../{ => widget}/ClickableWidgetAccessor.java | 2 +- .../CyclingButtonWidgetAccessor.java | 2 +- .../{ => widget}/SliderWidgetAccessor.java | 2 +- .../{ => widget}/TextFieldWidgetAccessor.java | 2 +- .../{ => world}/ClientLevelAccessor.java | 2 +- .../{ => world}/LevelExtractorAccessor.java | 2 +- .../{ => world}/LevelRendererAccessor.java | 2 +- .../accessors/{ => world}/WorldAccessor.java | 2 +- .../device}/GlDeviceBackendMixin.java | 2 +- .../{ => blaze3d/device}/GpuDeviceMixin.java | 2 +- .../{ => blaze3d/device}/GpuSurfaceMixin.java | 2 +- .../device}/VulkanDeviceMixin.java | 2 +- .../BatchingRenderCommandQueueMixin.java | 2 +- .../encoder}/CommandEncoderMixin.java | 2 +- .../encoder}/VulkanCommandEncoderMixin.java | 2 +- .../pipeline}/RenderPassMixin.java | 2 +- .../pipeline}/RenderPipelineMixin.java | 2 +- .../pipeline}/VulkanRenderPassMixin.java | 2 +- .../pipeline}/VulkanRenderPipelineMixin.java | 2 +- .../shader}/DynamicUniformStorageMixin.java | 2 +- .../shader}/GlStateManagerMixin.java | 2 +- .../shader}/ShaderLoaderMixin.java | 6 +- ...ufferManagerDefaultBufferManagerMixin.java | 2 +- .../{ => blaze3d/texture}/GlTextureMixin.java | 2 +- .../texture}/VulkanGpuTextureMixin.java | 2 +- .../texture}/VulkanGpuTextureViewMixin.java | 2 +- .../inventory}/ItemCooldownsMixin.java | 4 +- .../{ => entity/inventory}/ItemMixin.java | 2 +- .../inventory}/ItemStackMixin.java | 2 +- .../inventory}/PlayerInventoryMixin.java | 2 +- .../living}/LivingEntityMixin.java | 8 +- .../living}/LivingEntityRendererMixin.java | 8 +- .../player}/AbstractClientPlayerMixin.java | 2 +- .../player}/LocalPlayerDropMixin.java | 2 +- .../{ => entity/player}/LocalPlayerMixin.java | 25 +- .../player}/PlayerEntityMixin.java | 4 +- .../{ => entity/world}/EntityMixin.java | 14 +- .../world}/FireworkRocketEntityMixin.java | 4 +- .../world}/ProjectileUtilMixin.java | 2 +- .../{ => gui/chat}/ChatComponentMixin.java | 4 +- .../{ => gui/chat}/ChatScreenMixin.java | 8 +- .../{ => gui/chat}/ContextualBarMixin.java | 2 +- .../core}/AbstractContainerScreenMixin.java | 6 +- .../core}/AbstractSelectionListMixin.java | 2 +- .../core}/AbstractSliderButtonMixin.java | 4 +- .../{ => gui/core}/AbstractWidgetMixin.java | 2 +- .../JoinMultiplayerScreenMixin.java | 2 +- .../multiplayer}/RecipeBookScreenMixin.java | 2 +- .../{ => gui/screens}/GuiScreenMixin.java | 2 +- .../{ => gui/screens}/PauseScreenMixin.java | 2 +- .../mixins/{ => gui/screens}/ScreenMixin.java | 4 +- .../{ => gui/screens}/TitleScreenMixin.java | 2 +- .../widgets}/ButtonWidgetTextMixin.java | 2 +- .../{ => gui/widgets}/CycleButtonMixin.java | 4 +- .../SpriteIconButtonCenteredIconMixin.java | 2 +- .../SpriteIconButtonTextAndIconMixin.java | 2 +- .../mixins/{ => hud}/DebugHudMixin.java | 2 +- .../mixins/{ => hud}/GuiGraphicsMixin.java | 2 +- .../lovisual/mixins/{ => hud}/GuiMixin.java | 12 +- .../mixins/{ => hud}/GuiRendererMixin.java | 2 +- .../accessibility}/NarratorManagerMixin.java | 2 +- .../accessibility}/OptionsNarratorMixin.java | 2 +- .../bars}/BossHealthOverlayMixin.java | 6 +- .../{ => hud/bars}/ExperienceBarMixin.java | 2 +- .../mixins/{ => hud/bars}/JumpBarMixin.java | 2 +- .../{ => hud/bars}/LocatorBarMixin.java | 2 +- .../tablist}/PlayerTabOverlayMixin.java | 2 +- .../{ => hud/tooltips}/ToastManagerMixin.java | 4 +- .../tooltips}/TooltipRenderUtilMixin.java | 2 +- .../{ => input/keyboard}/KeyMappingMixin.java | 4 +- .../keyboard}/KeyboardInputMixin.java | 3 +- .../{ => input/keyboard}/KeyboardMixin.java | 13 +- .../mixins/{ => input/mouse}/InputMixin.java | 2 +- .../mixins/{ => input/mouse}/MouseMixin.java | 8 +- .../{ => hand}/IrisHandRendererAccessor.java | 2 +- .../{ => hand}/IrisHandRendererMixin.java | 2 +- .../IrisVanillaHandInteropMixin.java | 4 +- .../IrisIncludeProcessorMixin.java | 2 +- .../{ => render}/IrisCommonUniformsMixin.java | 2 +- .../IrisGameRendererInteropMixin.java | 2 +- .../IrisRenderingPipelineFinalizeMixin.java | 2 +- .../{ => render}/IrisShaderPackLoadMixin.java | 2 +- .../game}/ClientPacketListenerMixin.java | 12 +- .../game}/MultiPlayerGameModeMixin.java | 14 +- .../game}/MultiPlayerGameModeThrowMixin.java | 2 +- .../{ => network/game}/PlayerInfoMixin.java | 2 +- .../ClientCommonPacketListenerImplMixin.java | 2 +- .../{ => network/packet}/ConnectionMixin.java | 4 +- .../ServerboundUseItemPacketMixin.java | 2 +- .../entity}/ItemEntityRenderStateMixin.java | 2 +- .../entity}/ItemEntityRendererMixin.java | 4 +- .../entity}/LivingEntityRenderStateMixin.java | 2 +- .../fog}/AtmosphericFogEnvironmentMixin.java | 6 +- .../{ => render/fog}/FogRendererMixin.java | 6 +- .../fog}/LavaFogModifierMixin.java | 4 +- .../fog}/WaterFogEnvironmentMixin.java | 4 +- .../fogmod}/PowderSnowFogModifierMixin.java | 4 +- .../item}/EquipmentLayerRendererMixin.java | 2 +- .../item}/ItemFeatureRendererMixin.java | 2 +- .../item/ItemInHandAlwaysVisibleMixin.java | 50 +++ .../item}/ItemInHandRendererMixin.java | 7 +- .../{ => render/level}/CameraMixin.java | 8 +- .../level}/LevelRendererMixin.java | 14 +- .../level}/ParticleManagerMixin.java | 2 +- .../{ => render/level}/SkyRendererMixin.java | 2 +- .../{ => render/light}/LightmapMixin.java | 4 +- .../LightmapRenderStateExtractorMixin.java | 4 +- .../{ => render/main}/GameRendererMixin.java | 14 +- .../main}/GameRendererViewEffectsMixin.java | 6 +- .../{ => render/main}/MinecraftMixin.java | 8 +- .../main}/ScreenEffectRendererMixin.java | 6 +- .../{ => render/sound}/LibraryMixin.java | 2 +- .../{ => render/sound}/SoundEngineMixin.java | 2 +- .../{ => render/text}/FontManagerMixin.java | 2 +- .../ClientLoginNetworkHandlerMixin.java | 2 +- .../security/{ => net}/GameOptionsMixin.java | 2 +- .../security/{ => net}/NetworkUtilsMixin.java | 2 +- .../AbstractSignEditScreenMixin.java | 2 +- .../security/{ => text}/AnvilScreenMixin.java | 2 +- .../TranslatableTextContentMixin.java | 2 +- .../{ => text}/TranslationStorageMixin.java | 2 +- .../SodiumBlockRendererMixin.java | 2 +- .../SodiumChunkMeshFormatsMixin.java | 2 +- .../SodiumShaderChunkRendererMixin.java | 2 +- .../{ => vertex}/SodiumChunkVertexMixin.java | 2 +- .../SodiumVertexConsumerTrackerMixin.java | 2 +- .../SodiumWorldRendererFreecamMixin.java | 4 +- .../BlockCollisionSpliteratorMixin.java | 4 +- .../mixins/{ => world/block}/BlockMixin.java | 2 +- .../{ => world/block}/HoneyBlockMixin.java | 2 +- .../{ => world/block}/SlimeBlockMixin.java | 2 +- .../{ => world/fluid}/FlowingFluidMixin.java | 2 +- .../level}/ClientClockManagerMixin.java | 4 +- .../{ => world/level}/ClientLevelMixin.java | 4 +- .../level}/LevelExtractorMixin.java | 6 +- .../mixins/{ => world/level}/LevelMixin.java | 6 +- .../render/LoVisualEntityRenderTypes.java | 2 +- .../lovisual/render/SeeInvisiblesReveal.java | 2 +- .../render/effects/NetherPortalRiftPass.java | 2 +- .../engine/animation/AnimatedGlyphSlot.java | 2 +- .../ImmediatelyFastBridge.java | 2 +- .../core/policy/VanillaWorldFogProvider.java | 2 +- .../render/engine/msaa/MsaaWorldTarget.java | 2 +- .../pipeline/LoVisualRenderPipelines.java | 31 ++ .../pipeline/pipelines/WorldPipelines.java | 24 ++ .../engine/postprocess/SkyShaderRenderer.java | 81 +++- .../graph/PostProcessGraphResources.java | 2 +- .../prewarm/RenderPrewarmContributors.java | 4 +- .../engine/prewarm/RenderPrewarmManager.java | 2 +- .../render/engine/profiler/ProfilerLog.java | 2 +- .../render/engine/renderer/RenderWarp.java | 1 + .../renderer/ui/runtime/core/UiNode.java | 1 + .../renderer/ui/runtime/core/UiNodeSpec.java | 1 + .../runtime/render/UiPrimitiveRenderer.java | 1 - .../runtime/render/UiTextEffectRenderer.java | 2 +- .../script/JavetNativeResourceLoader.java | 2 +- .../runtime/script/JavetUiScriptEngine.java | 2 +- .../script/UiScriptModuleTransform.java | 2 +- .../runtime/script/UiScriptRuntimeSource.java | 2 +- .../runtime/script/UiTypeScriptStripper.java | 2 +- .../engine/rhi/backend/SodiumGlBackend.java | 1 - .../rhi/backend/gl/GlBackendAccess.java | 2 +- .../gl/clip/GlStencilFramebufferSupport.java | 2 +- .../backend/vulkan/LoVisualVulkanBackend.java | 1 - .../engine/rhi/msaa/SodiumGlMsaaControl.java | 2 +- .../engine/rhi/upload/Blaze3dFrameFence.java | 2 +- .../rhi/upload/Blaze3dMeshAllocation.java | 2 +- .../engine/rhi/upload/Blaze3dMeshArena.java | 2 +- .../render/engine/svg/SvgPathParser.java | 2 +- .../lovisual/render/engine/svg/SvgStyle.java | 2 +- .../render/engine/svg/SvgStyleUtil.java | 2 +- .../render/engine/text/TextRenderSystem.java | 1 - .../uniform/impl/HandChamsUniforms.java | 1 + .../uniform/impl/KillEffectBeamUniforms.java | 65 ++++ .../uniform/impl/MotionBlurUniforms.java | 1 + .../engine/uniform/impl/PostFXUniforms.java | 1 + .../uniform/impl/ShaderSkyUniforms.java | 1 + .../uniform/impl/SkyShaderNebulaUniforms.java | 105 ++++++ .../uniform/impl/WaterHighlightUniforms.java | 71 ++++ .../lovisual/render/helpers/ClipFunction.java | 1 - .../render/helpers/ScissorFunction.java | 1 + .../render/helpers/ScreenProjection.java | 2 +- .../helpers/SodiumSurfaceFlagContext.java | 4 +- .../render/iris/IrisCompatibilityGuards.java | 3 +- .../render/iris/IrisRuntimeBridge.java | 2 +- .../render/iris/LoVisualIrisUniforms.java | 4 +- .../render/sky/CustomSkyboxRenderer.java | 12 +- .../lovisual/util/aiming/RotationManager.java | 12 +- .../processors/FailRotationProcessor.java | 4 +- .../util/animation/EquipProgressComposer.java | 2 + .../util/animation/hand/HandDynamics.java | 2 +- .../util/block/bed/SelfBedTracker.java | 8 +- .../lovisual/util/click/AttackPressing.java | 4 +- .../lovisual/util/combat/AntiBotTracker.java | 6 +- .../loki/lovisual/util/combat/AttackUtil.java | 10 +- .../util/combat/SprintController.java | 10 +- .../protocol/CombatProtocolHeuristics.java | 8 +- .../loki/lovisual/util/entity/EagleUtil.java | 2 +- .../simulation/BoatSimulationCache.java | 4 +- .../loki/lovisual/util/input/KeyManager.java | 1 + .../lovisual/util/item/RarityColorConfig.java | 1 + .../lovisual/util/item/RarityColorUtil.java | 1 + .../lovisual/util/item/TopEnchantUtil.java | 3 + .../util/media/MediaSessionService.java | 24 +- .../util/network/BacktrackController.java | 10 +- .../lovisual/util/network/BlinkManager.java | 8 +- .../util/network/FakeLagController.java | 6 +- .../util/player/ElytraRecastUtil.java | 4 +- .../lovisual/util/player/InteractionUtil.java | 2 +- .../util/player/NetworkStatsUtil.java | 1 + .../player/effect/StatusEffectHeuristics.java | 2 +- .../util/player/inventory/InventorySwap.java | 16 +- .../simulation/LocalPlayerSimulation.java | 2 +- .../simulation/PlayerMovementSimulation.java | 4 +- .../simulation/PlayerSimulationCache.java | 6 +- .../simulation/RemotePlayerObservation.java | 2 +- .../simulation/RemotePlayerSimulation.java | 2 +- .../player/simulation/SimulatedInput.java | 6 +- .../util/projectile/PointFinding.java | 2 +- .../util/projectile/ProjectileMath.java | 2 +- .../util/projectile/TrajectoryData.java | 2 +- .../util/protection/SlotLockPolicy.java | 1 + .../util/proxy/ProxyHandshakeHandler.java | 2 +- .../lovisual/util/pvp/ItemUseCooldowns.java | 1 + .../lovisual/util/pvp/PvpTargetTracker.java | 6 +- .../lovisual/util/pvp/PvpTextPatternUtil.java | 2 +- .../loki/lovisual/util/pvp/PvpTracker.java | 8 +- .../util/resources/ResourceReloadHooks.java | 6 +- .../lovisual/util/session/SessionChanger.java | 2 +- .../util/session/microsoft/MicrosoftJson.java | 2 +- .../session/microsoft/MicrosoftTokens.java | 2 +- .../session/microsoft/MinecraftProfile.java | 2 +- .../util/session/microsoft/XboxToken.java | 2 +- .../lovisual/util/target/TargetManager.java | 2 +- .../lovisual/util/text/TextSelection.java | 1 + .../lovisual/util/time/TimerController.java | 4 +- .../dev/loki/lovisual/util/wav/WavSound.java | 4 +- .../lovisual/util/wav/WavSoundHelper.java | 2 +- .../resources/assets/lovisual/lang/en_us.json | 6 + .../resources/assets/lovisual/lang/ru_ru.json | 6 + .../shaders/block_highlight_hologram.frag | 60 +++ .../shaders/block_highlight_scanlines.frag | 43 +++ .../shaders/block_highlight_watercaustic.frag | 48 +++ .../lovisual/shaders/kill_effect_portal.frag | 162 ++++++++ .../lovisual/shaders/kill_effect_tornado.frag | 106 ++++++ .../lovisual/shaders/sky_shader_nebula.frag | 146 ++++++++ .../src/main/resources/lovisual.mixins.json | 345 +++++++++--------- .../profile/ConfigProfileDiffEngineTest.java | 2 +- .../profile/ConfigProfileStorageTest.java | 2 +- .../profile/ConfigProfileValueCodecTest.java | 2 +- .../config/values/ColorValueTest.java | 2 +- .../lovisual/config/values/EnumValueTest.java | 2 +- .../lovisual/config/values/ModeValueTest.java | 2 +- .../config/values/PrimitiveValuesTest.java | 2 +- .../loki/lovisual/events/EventBusTest.java | 5 +- .../command/CommandDiscoveryTest.java | 2 +- .../features/command/CommandPrefixTest.java | 2 +- .../features/command/UsageHintsTest.java | 2 +- .../impl/XaeroWaypointCommandTest.java | 2 +- .../settings/MenuSettingsResolverTest.java | 2 +- .../gui/hud/HudElementAutoLoaderTest.java | 2 +- .../triangulator/TriangulatorSolverTest.java | 3 +- .../combat/combatlog/CombatLogStatsTest.java | 78 ++++ .../module/modules/misc/NoServerPackTest.java | 2 +- .../module/modules/misc/NoSoundTest.java | 2 +- .../modules/misc/ScrollMovePolicyTest.java | 2 +- .../module/modules/player/AutoAcceptTest.java | 2 +- .../module/modules/player/AutoLeaveTest.java | 2 +- .../modules/player/AutoRespawnTest.java | 2 +- .../modules/player/DeathCoordsTest.java | 2 +- .../module/modules/player/NoInteractTest.java | 2 +- .../module/modules/player/TapeMouseTest.java | 2 +- .../module/modules/player/UseTrackerTest.java | 2 +- .../visuals/AlwaysVisibleHandTest.java | 46 +++ .../modules/visuals/AtmoDawnFogTest.java | 3 +- .../modules/visuals/ChinaHatModelTest.java | 3 +- .../modules/visuals/ChinaHatPaletteTest.java | 4 +- .../module/modules/visuals/LightTintTest.java | 3 +- .../modules/visuals/PostFxPresetTest.java | 3 +- .../cosmetics/CosmeticsHotspotTest.java | 45 +++ .../visuals/lyrics/LrcLibClientTest.java | 4 +- .../modules/visuals/lyrics/LrcParserTest.java | 4 +- .../visuals/lyrics/LyricLineSplitterTest.java | 4 +- .../security/BackdoorProtectionTest.java | 2 +- .../script/JavetUiScriptEngineTest.java | 2 +- .../util/animation/EaseCurvesTest.java | 3 +- .../animation/EquipProgressComposerTest.java | 4 +- .../util/animation/SmoothValueTest.java | 2 +- .../util/animation/hand/BobMathTest.java | 2 +- .../animation/hand/HandAnimStateTest.java | 2 +- .../util/animation/hand/HandPoseMathTest.java | 2 +- .../util/animation/hand/SwayStateTest.java | 2 +- .../lovisual/util/combat/ReachMeterTest.java | 2 +- .../util/protection/NotifyThrottleTest.java | 2 +- .../util/protection/SlotLockPolicyTest.java | 2 +- .../util/text/LegacyTextUtilTest.java | 2 +- .../lovisual/util/text/NameMaskerTest.java | 2 +- .../lovisual/util/text/NameProtectorTest.java | 2 +- 690 files changed, 5923 insertions(+), 2774 deletions(-) create mode 100644 combatant-client-26.2/config/lovisual/hud/draggable/combat_log.json rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => entity}/AttackEntityEvent.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => entity}/CrosshairTargetUpdateEvent.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => entity}/EventTargetChanged.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => entity}/FireworkEvent.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => input}/KeyInputEvent.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => input}/KeybindIsPressedEvent.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => input}/RotationUpdateEvent.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => input}/SprintControlEvent.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => movement}/MovementInputEvent.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => movement}/PlayerSafeWalkEvent.java (87%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => movement}/PlayerStepEvent.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => movement}/PlayerStepSuccessEvent.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => network}/BlinkPacketEvent.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => network}/EventPostSync.java (85%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => network}/EventSync.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => network}/PacketEvent.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => player}/I18nPreflightCollectEvent.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => player}/PlayerJumpEvent.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => player}/PlayerMoveEvent.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => player}/PostPlayerUpdateEvent.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => pvp}/CombatProtocolBossbarEvent.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => pvp}/PvpChatEvent.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => pvp}/PvpOverlayEvent.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => pvp}/PvpTabEvent.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => render}/GameTickEvent.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => render}/LightmapEvent.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => render}/LightmapModifyEvent.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => render}/RenderPrewarmCollectEvent.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => world}/EventBreakBlock.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => world}/EventCollision.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => world}/EventPushOutOfBlocks.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/{ => world}/PlayerVelocityStrafe.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/{ => meta}/EventHandler.java (83%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/events/{ => meta}/UsedImplicitly.java (95%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticSlot.java delete mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatModel.java delete mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatRenderer.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => input}/BetterChatEditBoxUtil.java (79%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => input}/BetterChatInputHandler.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => input}/BetterChatInputRenderer.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => input}/BetterChatMouseClickHandler.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => menu}/BetterChatContextMenuHandler.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => menu}/BetterChatContextMenuModel.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => menu}/BetterChatTooltipRenderer.java (87%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => messages}/BetterChatMessageGrouping.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => messages}/BetterChatMessageRenderer.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => messages}/BetterChatSearch.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => messages}/BetterChatTabHandler.java (90%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatModel.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => model}/BetterChatStore.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => model}/BetterChatStoreManager.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => model}/ChatLine.java (87%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => render}/BetterChatFrameModel.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => render}/BetterChatFrameRenderer.java (80%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatRenderer.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => suggestions}/BetterChatCommandMerge.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => suggestions}/BetterChatSuggestionRenderer.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => suggestions}/BetterChatSuggestionState.java (84%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => suggestions}/CommandSuggestorBridge.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text}/BetterChatGlyphRenderer.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text}/BetterChatLayoutEngine.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text}/BetterChatLineLayout.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text}/BetterChatSegmentUtil.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text/util}/BetterChatDrawUtil.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text/util}/BetterChatFontUtil.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text/util}/BetterChatHoverCache.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/{ => text/util}/ChatHoverUtil.java (97%) delete mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSetting.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => bind}/FunctionBindSetting.java (84%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => bind}/FunctionBindSettingRenderer.java (66%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => bind}/KeyBindSetting.java (77%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => bind}/KeyBindSettingRenderer.java (63%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => bool}/BooleanSetting.java (62%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => bool}/BooleanSettingRenderer.java (90%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSetting.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color}/ColorSettingMath.java (65%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color}/ColorSettingNoAlpha.java (72%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color}/ConfigColorSettingNoAlpha.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/hex}/ColorSettingHexInput.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/hex}/ColorSettingHexState.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/preset}/ColorPresetStore.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/preset}/ColorSettingPresetHandler.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/preset}/ColorSettingPresetRenderer.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/render}/ColorSettingDrag.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/render}/ColorSettingLayout.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/render}/ColorSettingRenderer.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => color/render}/ColorSettingSquareRenderer.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => cooldown}/CooldownRulesSetting.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => cooldown}/ProtocolHeuristicsSetting.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => core}/Setting.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => core}/SettingFactory.java (77%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => group}/GroupSetting.java (74%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => group}/GroupSettingRenderer.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => i18n}/I18nDuplicateScanner.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => i18n}/I18nPreflightContributors.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => i18n}/I18nPreflightManager.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => mode}/ModeSetting.java (78%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => mode}/ModeSettingRenderer.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => owner}/PickerDetailOwner.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => owner}/TextEditorOwner.java (82%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => render}/SettingRenderContext.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => render}/SettingRenderSurface.java (77%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => render}/SettingRendererBridge.java (64%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => render}/UnifiedSettingRenderer.java (73%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => skin}/ModulesSettingsSkin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => skin}/SettingSkinUtil.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => skin}/UnifiedSettingsSkin.java (79%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => slider}/SliderSetting.java (65%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => slider}/SliderSettingRenderer.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => slider}/SliderTextInputHandler.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => slider}/SliderTextInputState.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => text}/TextSetting.java (73%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => text}/TextSettingRenderer.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => text}/TextSettingTextInputHandler.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => text/list}/TextListSetting.java (81%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => text/list}/TextListSettingRenderer.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => text/list}/TextListTextEditHandler.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => util}/BindRendererUtil.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/{ => util}/SettingTextInputUtil.java (76%) delete mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHud.java delete mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudModel.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/CombatLogHud.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => combat}/Inventory.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => combat}/Itemizer.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => combat}/MediaPlayer.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => hudnotifier}/HudNotifier.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/{ => model}/ToastModel.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/{ => model}/ToastStyle.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => metrics}/Coordinates.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => metrics}/GameTime.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => metrics}/SpeedBps.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => metrics}/SystemTime.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => panels}/Keybinds.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => panels}/ModuleList.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => panels}/Radar.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => panels}/Scoreboard.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => scripted}/ScriptedInventoryHudPanel.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => scripted}/ScriptedListHudPanel.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => scripted}/ScriptedTriangulatorHudPanel.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => stats}/Fps.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => stats}/Memory.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => stats}/Ping.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => stats}/Tps.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => status}/Admins.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => status}/Armor.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => status}/Cooldowns.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => status}/Potions.java (99%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHud.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud}/TargetHudFormatter.java (80%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudModel.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud}/TargetHudTargetResolver.java (82%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render}/TargetHudContentRenderer.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render}/TargetHudPanelRenderer.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render}/TargetHudRenderer.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render}/TargetHudTextRenderer.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render/parts}/TargetHudArcRenderer.java (85%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render/parts}/TargetHudEffectsRenderer.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render/parts}/TargetHudEquipmentRenderer.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/{ => targethud/render/parts}/TargetHudFaceRenderer.java (86%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLog.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogEntry.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStats.java delete mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/CosmeticDisplay.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => camera}/AspectRatio.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => camera}/CameraClip.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => camera}/Freecam.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => camera}/ViewModel.java (99%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticDisplay.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspot.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsScreen.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsSlotPanel.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => effects}/HitEffect.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => effects}/KillEffect.java (80%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => effects}/Trails.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => effects}/WorldParticles.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp}/ESP.java (75%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp}/EspColorUtil.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp}/EspEntityCollector.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp}/EspModel.java (70%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/audio}/LightningTargetESP.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/audio}/SoundESP.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/overlay}/BlockESP.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/overlay}/DropESP.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/overlay}/HoleESP.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/overlay}/InvisEsp.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/render}/Esp2DRenderer.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/render}/Esp3DRenderer.java (87%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/render}/EspOutlineRenderer.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/render}/EspSearchOverlay.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/shader}/EspMeshBuilder.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/shader}/EspShaderColor.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/shader}/EspShaderMask.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => esp/shader}/EspShaderRenderer.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => fx}/MotionBlur.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => fx}/PostFX.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => fx}/TotemFX.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => fx}/Zoom.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => hats}/ChinaHat.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => hats}/ChinaHatModel.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => hats}/ChinaHatPalette.java (84%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => hats}/TazikHat.java (99%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/AlwaysVisibleHand.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => items}/BackSword.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => items}/HoldMyItems.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => items}/ShulkerPreview.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/{ => lrc}/LrcLibClient.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/{ => lrc}/LrcParser.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/{ => lrc}/LyricLine.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/{ => lrc}/LyricLineSplitter.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags}/NameTagCache.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags}/NameTagLayoutEngine.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags}/NameTagModel.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags}/NameTags.java (87%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/parts}/NameTagEquipmentRenderer.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/parts}/NameTagFaceRenderer.java (77%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/parts}/NameTagOpponentRenderer.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/parts}/NameTagPlateRenderer.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/render}/NameTagEffectsRenderer.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/render}/NameTagEnchantFormatter.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/render}/NameTagLabelBuilder.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => nametags/render}/NameTagRenderer.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => player}/Animations.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => player}/Crosshair.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => player}/FullBright.java (86%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => player}/JumpCircles.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => scene}/BlockHighlight.java (83%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => scene}/Chams.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => scene}/ItemPhysic.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => scene}/ReimaginedVisual.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => visibility}/Hitboxes.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => visibility}/Light.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => visibility}/NoRender.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => weather}/AtmoDawnFog.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => weather}/Rain.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => weather}/ShaderSky.java (71%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/{ => weather}/WorldTweaks.java (97%) delete mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemRenderStateLayerAccessor.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => blaze3d}/GlTextureInvoker.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => blaze3d}/GpuDeviceAccessor.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => blaze3d}/ShaderLoaderDefinitionsAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => blaze3d}/ShaderSourceKeyAccessor.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => chat}/ChatInputSuggestorAccessor.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => chat}/ChatScreenAccessor.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => chat}/ChatScreenSuggestorAccessor.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => chat}/SuggestionWindowAccessor.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => entity}/EntityAccessor.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => entity}/EntityInvoker.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => entity}/LivingEntityAccessor.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => entity}/LocalPlayerAccessor.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => hud}/BossHealthOverlayAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => hud}/InGameOverlayRendererAccessor.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => hud}/PlayerTabOverlayAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => hud}/TextIconButtonWidgetAccessor.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => inventory}/ItemCooldownEntryAccessor.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => inventory}/ItemCooldownManagerAccessor.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => inventory}/PlayerInventoryAccessor.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => inventory}/SlotAccessor.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => misc}/InputAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => misc}/KeyMappingAccessor.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => misc}/MinecraftAccessor.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => misc}/MultiPlayerGameModeAccessor.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => packet}/ClientboundExplodePacketAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => packet}/ClientboundSetEntityMotionPacketAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => packet}/ServerboundInteractPacketAccessor.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => packet}/ServerboundMovePlayerPacketAccessor.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => projectile}/PersistentProjectileEntityAccessor.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => renderer}/EntityRenderManagerAccessor.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => renderer}/EntityRendererAccessor.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => renderer}/GameRendererAccessor.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => renderer}/RenderLayerInvokerAccessor.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => state}/EffectParticleEffectAccessor.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => state}/FireworksComponentAccessor.java (89%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => state}/LivingEntityRenderStateAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => widget}/ClickableWidgetAccessor.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => widget}/CyclingButtonWidgetAccessor.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => widget}/SliderWidgetAccessor.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => widget}/TextFieldWidgetAccessor.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => world}/ClientLevelAccessor.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => world}/LevelExtractorAccessor.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => world}/LevelRendererAccessor.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/{ => world}/WorldAccessor.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/device}/GlDeviceBackendMixin.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/device}/GpuDeviceMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/device}/GpuSurfaceMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/device}/VulkanDeviceMixin.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/encoder}/BatchingRenderCommandQueueMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/encoder}/CommandEncoderMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/encoder}/VulkanCommandEncoderMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/pipeline}/RenderPassMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/pipeline}/RenderPipelineMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/pipeline}/VulkanRenderPassMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/pipeline}/VulkanRenderPipelineMixin.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/shader}/DynamicUniformStorageMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/shader}/GlStateManagerMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/shader}/ShaderLoaderMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/texture}/BufferManagerDefaultBufferManagerMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/texture}/GlTextureMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/texture}/VulkanGpuTextureMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => blaze3d/texture}/VulkanGpuTextureViewMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/inventory}/ItemCooldownsMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/inventory}/ItemMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/inventory}/ItemStackMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/inventory}/PlayerInventoryMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/living}/LivingEntityMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/living}/LivingEntityRendererMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/player}/AbstractClientPlayerMixin.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/player}/LocalPlayerDropMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/player}/LocalPlayerMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/player}/PlayerEntityMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/world}/EntityMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/world}/FireworkRocketEntityMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => entity/world}/ProjectileUtilMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/chat}/ChatComponentMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/chat}/ChatScreenMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/chat}/ContextualBarMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/core}/AbstractContainerScreenMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/core}/AbstractSelectionListMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/core}/AbstractSliderButtonMixin.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/core}/AbstractWidgetMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/multiplayer}/JoinMultiplayerScreenMixin.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/multiplayer}/RecipeBookScreenMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/screens}/GuiScreenMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/screens}/PauseScreenMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/screens}/ScreenMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/screens}/TitleScreenMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/widgets}/ButtonWidgetTextMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/widgets}/CycleButtonMixin.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/widgets}/SpriteIconButtonCenteredIconMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => gui/widgets}/SpriteIconButtonTextAndIconMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud}/DebugHudMixin.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud}/GuiGraphicsMixin.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud}/GuiMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud}/GuiRendererMixin.java (99%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/accessibility}/NarratorManagerMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/accessibility}/OptionsNarratorMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/bars}/BossHealthOverlayMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/bars}/ExperienceBarMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/bars}/JumpBarMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/bars}/LocatorBarMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/tablist}/PlayerTabOverlayMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/tooltips}/ToastManagerMixin.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => hud/tooltips}/TooltipRenderUtilMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => input/keyboard}/KeyMappingMixin.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => input/keyboard}/KeyboardInputMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => input/keyboard}/KeyboardMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => input/mouse}/InputMixin.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => input/mouse}/MouseMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => hand}/IrisHandRendererAccessor.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => hand}/IrisHandRendererMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => hand}/IrisVanillaHandInteropMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => processor}/IrisIncludeProcessorMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => render}/IrisCommonUniformsMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => render}/IrisGameRendererInteropMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => render}/IrisRenderingPipelineFinalizeMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/{ => render}/IrisShaderPackLoadMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => network/game}/ClientPacketListenerMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => network/game}/MultiPlayerGameModeMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => network/game}/MultiPlayerGameModeThrowMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => network/game}/PlayerInfoMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => network/packet}/ClientCommonPacketListenerImplMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => network/packet}/ConnectionMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => network/packet}/ServerboundUseItemPacketMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/entity}/ItemEntityRenderStateMixin.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/entity}/ItemEntityRendererMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/entity}/LivingEntityRenderStateMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/fog}/AtmosphericFogEnvironmentMixin.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/fog}/FogRendererMixin.java (94%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/fog}/LavaFogModifierMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/fog}/WaterFogEnvironmentMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/fogmod}/PowderSnowFogModifierMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/item}/EquipmentLayerRendererMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/item}/ItemFeatureRendererMixin.java (98%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemInHandAlwaysVisibleMixin.java rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/item}/ItemInHandRendererMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/level}/CameraMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/level}/LevelRendererMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/level}/ParticleManagerMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/level}/SkyRendererMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/light}/LightmapMixin.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/light}/LightmapRenderStateExtractorMixin.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/main}/GameRendererMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/main}/GameRendererViewEffectsMixin.java (88%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/main}/MinecraftMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/main}/ScreenEffectRendererMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/sound}/LibraryMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/sound}/SoundEngineMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => render/text}/FontManagerMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/{ => net}/ClientLoginNetworkHandlerMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/{ => net}/GameOptionsMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/{ => net}/NetworkUtilsMixin.java (98%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/{ => text}/AbstractSignEditScreenMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/{ => text}/AnvilScreenMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/{ => text}/TranslatableTextContentMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/{ => text}/TranslationStorageMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/{ => terrain}/SodiumBlockRendererMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/{ => terrain}/SodiumChunkMeshFormatsMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/{ => terrain}/SodiumShaderChunkRendererMixin.java (97%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/{ => vertex}/SodiumChunkVertexMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/{ => vertex}/SodiumVertexConsumerTrackerMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/{ => vertex}/SodiumWorldRendererFreecamMixin.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/block}/BlockCollisionSpliteratorMixin.java (92%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/block}/BlockMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/block}/HoneyBlockMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/block}/SlimeBlockMixin.java (95%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/fluid}/FlowingFluidMixin.java (96%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/level}/ClientClockManagerMixin.java (90%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/level}/ClientLevelMixin.java (93%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/level}/LevelExtractorMixin.java (91%) rename combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/{ => world/level}/LevelMixin.java (86%) create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/KillEffectBeamUniforms.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/SkyShaderNebulaUniforms.java create mode 100644 combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/WaterHighlightUniforms.java create mode 100644 combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_hologram.frag create mode 100644 combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_scanlines.frag create mode 100644 combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_watercaustic.frag create mode 100644 combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_portal.frag create mode 100644 combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_tornado.frag create mode 100644 combatant-client-26.2/src/main/resources/assets/lovisual/shaders/sky_shader_nebula.frag create mode 100644 combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStatsTest.java create mode 100644 combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AlwaysVisibleHandTest.java create mode 100644 combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspotTest.java diff --git a/TODO.md b/TODO.md index 27d73b2..bb748db 100644 --- a/TODO.md +++ b/TODO.md @@ -29,6 +29,10 @@ - [x] Фаза 5: Нормализация модулей (ленивый Minecraft, GameClock) - [x] Фаза 6: Тесты (EventBus, конфиг, утилиты) — см. `combatant-client-26.2/TODO.md` - [ ] Фаза 7: Новые модули по мотивам SoupVisuals — см. ниже +- [ ] Фаза 8.5: Аудит структуры ≤200/≤4 (244 файла, 86 папок) — гейт перед Фазой 9.2, + план в `combatant-client-26.2/TODO.md` +- [ ] Фаза 9: Оптимизация FPS (9.1 фиксы мёртвых грузов → 9.2 модуль Optimize), + план в `combatant-client-26.2/TODO.md` --- @@ -58,6 +62,87 @@ иконки-спутники (Atom/Ball/Cat/Donut/Flame/Flower/Gem/Ghost/MCTiers), трейл (цвет sync/custom, длина, толщина), звуки (типы + громкость), частицы (у Soup 315 стр.). Референс: `other/Trinket.java` +- [ ] **Cosmetics Overhaul (Unified Cosmetics)** — сейчас модуль бесполезен (next/prev + keybind без экрана). План (обсуждён в брейнсторме, черновик, детали могут + измениться): + - **Слоты вместо типов**: новый `CosmeticSlot` enum — `MODEL, PET, HEAD, + SHOULDERS, BACK, WAIST, LEGS, HELD` (8 шт). `CosmeticType` (MODEL/PET/ACCESSORY) + остаётся внутри `CosmeticModel` как есть (анимация/рендер-логика не трогается). + - Аксессуары (ACCESSORY) получают поле `slot` — парсится из `avatar.json` + (`"slot": "head"`), при отсутствии — вывод по имени папки (существующая + эвристика witch/hat→HEAD, wing→BACK, wheel→WAIST, иначе→HELD). + - `CosmeticManager`: `EnumMap` вместо 3 полей. + MODEL/PET — по одному активному. 6 accessory-слотов — **можно носить + несколько одновременно** (шляпа + крылья + пояс разом). + - Экран `CosmeticsScreen`: левая панель — живая 3D-модель игрока + (`InventoryScreen.renderEntityInInventoryFollowsMouse` или свой вызов + EntityRenderDispatcher), drag ЛКМ по превью — вращение (yaw/pitch, + pitch ограничен ±30°), скролл — zoom (0.5–2.0), кнопка сброса угла. + Открывается через **ПКМ по модулю в ClickGUI** (спецкейс вместо обычной + settings-панели — прецедент есть в `ClickGuiEditorScreen`). + - Hotspot-зоны поверх 3D-модели (HEAD/SHOULDERS/BACK/WAIST/LEGS + иконка + HELD сбоку) — клик открывает правую панель выбора модели для этого слота. + - Offset/rotation/scale — **на слот** (не на модель, т.к. модулей может быть + десятки, а статичных SettingDef-полей на каждую не сделать): 6 стандартных + num()-хелперов модуля (per-slot), visibleWhen(активный слот). Смена модели + в слоте может потребовать подстройки — ок, вписывается в существующий + SettingDef/SettingFactory конвейер без новой инфраструктуры. + - Цвета из Theme.theme() (windowBg/accent/textMuted), файлы по правилам + ≤200 строк/≤4 файла на папку: `CosmeticsModule`, `CosmeticsScreen`, + `CosmeticsSlot`(=CosmeticSlot), `CosmeticsSlotPanel`. + - i18n: `module.cosmetics.*`, `setting.cosmetics.active_slot`, + `offset_x/y/z`, `rotation`, `scale`, `setting.cosmetics.slot.` и т.д. + (en_us + ru_ru обязательно). + - Открытые вопросы для следующего захода: точные хитбокс-координаты зон + по проценту региона превью, формат хранения per-slot offset в .lvcfg, + нужен ли предпросмотр модели до эквипа в правой панели. + - **Портирование процедурных head/back-модулей в слоты** — из всех + `visuals/*` только 3 модуля реально являются «надетыми на игрока» + процедурными косметиками (нашёл через grep по HeadAnchor-хелперу): + - `ChinaHat` (+`ChinaHatModel`, `ChinaHatPalette`, 295+107+144 стр.) — + конус на голове → встроенная опция слота **HEAD**. + - `TazikHat` (859 стр.! требует разбивки на файлы ≤200 стр. при + портировании — геометрия/палитра/модуль отдельно, как у ChinaHat) — + «тазик»/чаша на голове → **HEAD**. + - `BackSword` (287 стр.) — катана на спине → **BACK**. + Остальные visuals-модули (ESP, Chams, Trails, Rain, PostFX и т.д.) — + НЕ переносятся, это общие эффекты, а не надеваемые предметы. + План: каждый становится встроенным вариантом (built-in entry, не + .bbmodel) внутри соответствующего слота — юзер выбирает между + своими .bbmodel-моделями И этими процедурными built-in вариантами + в одном и том же слоте. Настройки самого варианта (цвет/размер/сегменты + и т.д.) показываются в правой панели слота, когда built-in выбран + активным. Старые `@ModuleInfo`-модули `chinahat`/`tazikhat`/`backsword` + удаляются как отдельные модули из списка Visuals (их функциональность + полностью переезжает в Cosmetics) — конфиг-миграция/бэккомпат не нужны + (легит-клиент, публичного релиза со старыми конфигами ещё не было — + уточнить у пользователя перед удалением). + - **"None" в каждом слоте** — обязательный первый вариант в списке выбора + любого слота (Model/Pet/Head/Shoulders/Back/Waist/Legs/Held): "ничего + не надето", слот пуст, `CosmeticManager.active` для этого слота = null. + Не путать с выключенным модулем `CosmeticDisplay` целиком — None это + per-slot состояние, остальные слоты продолжают рендериться. + - Подтверждено пользователем: точно только 3 built-in кандидата + (ChinaHat/TazikHat/BackSword), остальные visuals-модули не переносятся. + - **Решённые вопросы (финал черновика):** + 1. Hotspot-координаты — **вариант B**: проекция костей игрока (голова/тело/ + ноги vanilla-модели) в экранные координаты через `ScreenProjection` + (уже есть в `render/helpers/`), а не фиксированные проценты региона — + точнее держит зоны при вращении/приседе. Fallback на фикс-проценты, + если в реализации окажется дороже, чем стоит. + 2. Хранение offset/rot/scale — **обычные `NumberValue`-поля модуля** + (6 слотов × offset_x/y/z/rot/scale), сохраняются в `.lvcfg` как + обычные настройки — без нового ConfigValue-типа. + 3. Правая панель — **live-apply**: клик по модели в списке слота сразу + применяет и показывает на превью, без отдельной кнопки Apply. + 4. Built-in процедурные варианты (ChinaHat/TazikHat/BackSword) — **просто + обычные записи в списке слота** (с иконкой-превью), не выделяются в + отдельную секцию; настройки открываются так же, как у .bbmodel-моделей. + 5. `TazikHat` (859 стр.) при портировании — **разбить как ChinaHat**: + `TazikHatGeometry` + `TazikHatPalette` + встраиваемый рендер-класс без + собственного `@ModuleInfo`/Module-обвязки (вызывается из слота HEAD). + 6. Старые модули `chinahat`/`tazikhat`/`backsword` — **удаляются + полностью** из списка Visuals, функциональность только в Cosmetics. - [ ] **Balancer** (mctiers) — тиры игроков с mctiers.info (у Soup отдельная категория MCTiers). Референс: `mctiers/Balancer.java` - [ ] **HandsShader: новые шейдеры руки** — у Soup 10 режимов (Solid, Chroma, Balatro, diff --git a/combatant-client-26.2/TODO.md b/combatant-client-26.2/TODO.md index 33e7190..ab70ead 100644 --- a/combatant-client-26.2/TODO.md +++ b/combatant-client-26.2/TODO.md @@ -241,3 +241,161 @@ - [ ] Не смешивать с Фазой 7: разбивка структуры — отдельными проходами, иначе diff-каша ### Проверка: `./gradlew test` зелёный + +## Фаза 8.5: Аудит структуры (правила ≤200 строк / ≤4 файла) — ПОЛНЫЙ СПИСОК НА РЕФАКТОРИНГ +> Снимок 2026-09-09 (`src/main/java`, 1459 файлов / 197k строк). +> **Гейт перед Фазой 9.2 (Optimize)**: движковые файлы, которые Optimize будет трогать, +> должны быть разбиты заранее. 9.1 (мёртвые грузы) от этого НЕ зависит — идёт своим порядком. +> Стратегия та же, что Фаза 3/8: фасад + package-private хелперы ≤200, 0 правок вызывающих, +> билд после каждого файла. Фасад-исключение (Renderer2D) — см. оговорку ниже. + +### Итоговая картина +- **Файлы >200 строк: 244 шт.** → >800 строк: 26 | 400–800: 78 | 201–400: 140 +- **Папки >4 файлов: 86 шт.** +- Разбивка больших файлов по зонам: features/gui — 73 | render/engine — 54 | + features/module — 35 | util — ~35 | mixins — 3 | config — ~6 | прочее — остальное + +### 8.5.1 Папки >4 файлов — топ должников (разбить на подпапки по смыслу) +- [x] `mixins/` — 108 файлов → leaf-пакеты (entity/blaze3d/input/world/network/gui/hud/render), + mixins.json перегенерирован, FQN-строки LoVisualMixinPlugin обновлены. Коммиты 94d5af7, 3c76817. +- [x] `mixins/accessors/` — 45 → 12 групп (entity/renderer/world/state/packet/inventory/...). Коммит 3c76817. + Также разбиты iris/sodium/security на подпакеты. +- [x] `features/module/modules/visuals/` — 67 → esp/nametags/hats/effects/weather/scene/camera/ + player/items/fx + lyrics/lrc. Конфиг-id НЕ менялись (проверено). Коммит 073ac26. +- [x] `features/gui/clickgui/settings/` — 51 → core/bool/mode/slider/text/text-list/group/bind/ + color(+render/preset/hex)/i18n/render/skin/owner/cooldown/util. Коммит 9db1fec. +- [x] `features/gui/hud/draggable/impl/` — 40 → stats/metrics/status/combat/panels/targethud(+/render, + render/parts)/scripted + hudnotifier/model, targethud-модель свёрнута в класс с record-ами. Коммит 6b89e40. +- [x] `events/impl/` — 32 → input/movement/world/network/entity/pvp/render/player; + events/ верхний уровень: core(Event,EventBus,Events) + meta(EventHandler,UsedImplicitly). +- [ ] `features/gui/chat/` — 31 → `render/`, `suggestions/`, `menu/`, `model/`. +- [ ] `render/engine/uniform/impl/` — 28 → по потребителям (`uniform/impl/pipeline/`, `uniform/impl/effects/`). +- [ ] `render/engine/renderer/ui/` — 28: верхний уровень разнести по уже существующим + `draw/`, `runtime/`, добавить `blur/`, `batches/`. +- [ ] `render/engine/text/` — 24 и `text/backend/` — 12 → `text/` разбить на `text/render/`, + `text/layout/`, `text/msdf/`. +- [ ] `render/engine/renderer/ui/runtime/script/` — 23, `ui/draw/` — 23 → внутри по 4-файловым кластерам. +- [ ] `features/gui/hud/nondraggable/impl/` — 20 (+`impl/tab/`) → `impl/overlays/`, `impl/tablist/`. +- [ ] `features/gui/clickgui/` — 20 на верхнем уровне → всё в существующие `layout/`, `sections/`, + `picker/`, `protocol/`, `util/`. +- [ ] `render/engine/command/` — 17, `render/helpers/` — 16, `features/command/impl/` — 16, + `config/values/` — 16 → по 2-3 подпапки (типам: `values/numeric/`, `values/color/`…). +- [ ] `render/engine/profiler/` — 14, `modules/player/` — 14, `features/gui/hud/` — 14, + `addon/` — 14 — средние: раскидать при касании. +- [ ] Хвост (5–13 файлов, ~55 папок): `util/pvp` 13, `util/projectile` 13, `render/iris` 13, + `config/profile` 13, `features/module/misc` 12, `features/module` 12, `config` 12 и т.д. — + НЕ выделенный проход, а «касаться = чинить» (см. 8.5.4). + +### 8.5.2 Файлы-гиганты >600 строк — приоритетная очередь разбивки (53 файла) +> Формат: файл (строк) → идея разбивки. Порядок сверху вниз. Facade-оговорка: +> Renderer2D остаётся фасадом-делегатом (правило Фазы 8), но его вспомогательные +> классы (kawase/blur/glass) — вынести из OrderedUiBatcher (935) в `ui/blur/`. +- [ ] Renderer2D 2166 — ФАСАД (исключение по правилу Фазы 8): оставить делегирование, + но блоки >200 строк переносить в package-private хелперы в `renderer/renderer2d/` + (частично уже есть Rects2D/Strokes2D) +- [ ] LoVisualAltManagerScreen 1113 — экран+список+диалоги → 4 файла `mainmenu/alt/` +- [ ] UiPrimitiveRenderer 1042 — по типам примитивов (rect/round/line/text-batch) +- [ ] BetterButtons 1032 — extraction+tooltip+render → `hud/nondraggable/impl/buttons/` +- [ ] InventorySwap 1031 — по стратегиям свапа; чистая логика отдельными классами с тестами +- [ ] SvgMeshBackend 1014 — parser/triangulate/cache разнести +- [ ] Themes 1012 — реестр тем в `theme/presets/` (по 4 темы/файл), дефолты отдельно +- [ ] WorldParticles 991 — типы частиц в `visuals/effects/particles/` +- [ ] Module 989 — базовый класс: settings-механику вынести в `module/ext/` (осторожно, общий предок!) +- [ ] LoVisualAddonManagerScreen 989 — как AltManager +- [ ] Chams 976 — режимы рендера в подклассы-политики (фасад модуля тонкий) +- [ ] ClickGuiPickerState 962 + CombatProtocolHeuristicsEditorState 932 — state/actions хелперы +- [ ] ModulesMenuScreen 960 — рендер категорий отдельно от состояния +- [ ] UiMeshGeometry 954 — по примитивам геометрии +- [ ] BetterTooltips 953, OrderedUiBatcher 935 (→ batches + blur), Scoreboard 924, + Rain 893 (+CompactHudStatModel 893), TazikHat 859 (обещан в Фазе 7 — разбить при портировании), + ShaderPatchCompiler 843, OnlineRelationPlayerPickerComponent 837, CustomTabList 830, + GameRendererMixin 810 (только хуки; тело вынести в `render/engine/entry/`-классы — + ВНИМАНИЕ: 9.1 тоже его трогает, координировать), Predictions 805 +- [ ] Хвост 400–800 (~78 файлов, см. /tmp-снимок в истории команд: ConfigProfilesComponent 791, + HitEffect 770, PlayerMovementSimulation 755, ProjectilePuncher 746, MediaPlayer 739, + Crosshair 737, MeshBuilder 729, SettingsPanelComponent 703, Admins 702, Cooldowns 701, + Itemizer 699, BlockHighlight 692, LocalPlayerMixin 687, Trails 681, ItemBatchRenderer 673, + CosmeticModel 671, MenuScreen 667, GlStencilFramebufferSupport 663, ConfigSerializer 663, + DynamicIsland 661, ReimaginedVisual 660, RelationsComponent 659, UiStyle 640, Potions 617, + ModuleComponent 612, MsdfFont 606, Keybinds 603, MediaSessionService 594 и др.) + +### 8.5.3 201–400 строк (~140 файлов) — проход «касаться = чинить» +- [ ] Не делать отдельным марафоном: при правке файла по другой фазе — первым коммитом + разбивка на ≤200, вторым — целевое изменение (иначе diff-каша, правило Фазы 8) + +### 8.5.4 Порядок и критерии готовности +- [ ] Очередь: 8.5.1 крупные папки (mixins, visuals, clickgui/settings, hud impl) → + 8.5.2 гиганты >800 → далее по убыванию. Каждая папка/файл = отдельный коммит. +- [ ] После каждого шага: `./gradlew build` ✓, `./gradlew test` ✓; конфиг-id модулей и + ключи сеттингов НЕ ломаем (совместимость .lvcfg); скрипты-переименования пакетов + не трогают string-literals id — проверять grep'ом после moves. +- [ ] Критерий закрытия для старта 9.2: ноль файлов >200 в путях, которые трогает Optimize + (Renderer2D-секции blur/glass, OrderedUiBatcher, HUD-имплементации bgEffect, + MsdfFont/CustomTextRenderer), и ноль папок >4 в этих же пакетах. Полный ноль по всем + 244/86 — долгий хвост, 9.2 им не блокируется. +- [ ] Обновить этот раздел при подходе к волне (отмечать [x], доснимать счётчики). + +## Фаза 9: Оптимизация FPS (аудит 2026-09-09) — ПЛАН +> Диагноз: у клиента есть «налог каждый кадр», который платится даже при +> выключенных модулях (друг: просадка FPS на чистом конфиге, Windows). +> Решение владельца: мёртвые грузы — ЧИНИМ в коде; авто-деградации по FPS НЕ ДЕЛАЕМ; +> вместо неё — ручной модуль **Optimize** (включил → порезали стекло/blur/тяжёлые проходы). + +### 9.1 Мёртвые грузы (чиним в коде всегда, независимо от модулей) — приоритет +- [ ] **glGetError на каждом render pass** — `GlStencilShapeClipBackend.endRenderPass` + (`:140`) и `beginRenderPass` (`:98/:104/:110/:124`) дёргают `checkGlErrors` + (`:428-434`) на КАЖДЫЙ проход (миксин `CommandEncoderMixin:102-112` висит на + submitRenderPass → это и все ванильные/Sodium проходы). `glGetError` = синк с + Windows-драйвером, несколько мс/кадр. Фикс: проверять только если + `mode != DISABLED || renderPassAttachmentRequired`, либо под dev-флагом; + в релизе — no-op. +- [ ] **`lovisual$isVulkanBackend()` на каждый submitRenderPass** + (`CommandEncoderMixin:66-74`) — `getDeviceInfo().backendName().toLowerCase()` + заново на кадр×проходы. Фикс: вычислить один раз, закэшировать boolean. +- [ ] **PreTranslucentDepth — полноэкранный depth-copy каждый кадр без нужды** — + `LevelRendererMixin:275-283` гейтится только «нет Iris». Фикс: гейт + `needsPreTranslucentDepthCapture()` по образцу `WorldSceneDepth` + (`LevelRendererMixin:160-218`); потребители: `PostProcessGraphResources:61`, + `LoVisualVisuals:79`, `WorldPassCompiler:174`. +- [ ] **copyMainColor каждый кадр ДО гейта** — `UiBlurResources.captureWorldSource` + (`:116-123`): полноэкранный color-copy делается до проверки + `liquidGlassBlurRequested` (`:122`). Фикс: переставить — copy только когда + blur реально запрошен. +- [ ] **Строки профайлера при выключенном профайлере** — конкатенации на call-site + каждый кадр: `PostProcessGraph:59` (`"graph:" + phase`), `ModuleManager:219-221/:290` + (`"3d:module:" + m.name()`). Фикс: ленивые supplier'ы / ранний isEnabled-check. +- [ ] **Мелочь, по ходу**: `new PoseStack`/`new Matrix4f`×2/`new Frustum`×2 в кадре + (`GameRendererMixin:203-239/:341-347/:609-617`) — закэшить переиспользуемые копии. + +### 9.2 Модуль **Optimize** (misc) — ручной рубильник экономии +> ⛔ ГЕЙТ: не начинать, пока не закрыта Фаза 8.5 (рефакторинг-аудитStructure ниже) — +> Optimize трогает Renderer2D/OrderedUiBatcher/HUD-имплементации, все они >200 строк. +> Идея владельца: один тумблер «хочу максимум FPS». НИКАКОГО автовключения по FPS. +> Пока активен — движок и HUD работают в лёгком режиме. +- [ ] Каркас: `modules/misc/Optimize.java` (≤200 строк, тест `OptimizeTest` на чистую логику). + Настройки (bool, дефолт on при включении модуля): + - `no_glass` — все glass/blur-эффекты HUD off: форсить bgEffect=None у всех + HUD-элементов (Fps сейчас по умолчанию "Blur", `Fps:70`), сделать + `Renderer2D.requestLiquidGlassBlur*` no-op, пропускать kawase-цепочку в + `OrderedUiBatcher.prepareSharedBlurInternal`. + - `lite_post` — резать тапы тяжёлых пост-проходов: MotionBlur 15→5 + (+ neighborhood 10→0), DoF 32→8 — через uniform, без переписывания шейдеров + (альтернатива жёстче: временно деактивировать проходы — решить на реализации, KISS). + - `lite_sky` — процедурные скайбоксы (reimagined_skybox / pulsar / thunder, + ~20 fbm-оценок на пиксель) — пропускать noise-слои. + - `lean_hud` — off для per-frame аллокационных прибамбасов: градиенты/бегущие + строки (`CustomTextRenderer:387` new String на глиф), анимации цифр. +- [ ] Механизм «как движок узнаёт»: НЕ тыкать статику модуля в лоб — сделать + `OptimizeState` (boolean + getter, обновление при enable/disable), читать через + него в движке (паттерн уже есть: `ReimaginedVisual.needsWorldSceneDepthCapture()`). +- [ ] Взаимодействие с 9.1: фиксы 9.1 НЕ отменяются модулем — copy/ошибки чиним всегда; + Optimize режет только то, что имеет визуальную цену. +- [ ] i18n en_us + ru_ru обязательно: `module.optimize.*`, `setting.optimize.*`. +- [ ] Нотификация при первом включении (chat/HUD): что именно порезано. + +### 9.3 Проверка +- [ ] A/B-мерка до/после 9.1 на чистом конфиге (F3/DebugHud, пустой мир, 1080p): + целевой эффект — минус 2 полноэкранных copy/кадр и минус N glGetError-синков + (N = проходов за кадр). +- [ ] `./gradlew build` после каждого пункта; `./gradlew test` зелёный. +- [ ] Порядок: 9.1 (по одному пункту на коммит) → 9.2. diff --git a/combatant-client-26.2/config/lovisual/hud/draggable/combat_log.json b/combatant-client-26.2/config/lovisual/hud/draggable/combat_log.json new file mode 100644 index 0000000..010732b --- /dev/null +++ b/combatant-client-26.2/config/lovisual/hud/draggable/combat_log.json @@ -0,0 +1,3 @@ +{ + "enabled": false +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/LoVisual.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/LoVisual.java index 6b01479..77d4fa2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/LoVisual.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/LoVisual.java @@ -7,7 +7,7 @@ package dev.loki.lovisual; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; @@ -25,7 +25,7 @@ import dev.loki.lovisual.events.Events; import dev.loki.lovisual.features.account.AccountConfig; import dev.loki.lovisual.features.command.CommandManager; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; -import dev.loki.lovisual.features.gui.clickgui.settings.I18nPreflightContributors; +import dev.loki.lovisual.features.gui.clickgui.settings.i18n.I18nPreflightContributors; import dev.loki.lovisual.features.gui.hud.HudElements; import dev.loki.lovisual.features.gui.hud.HudRenderSpace; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; @@ -72,6 +72,7 @@ import dev.loki.lovisual.util.pvp.PvpTargetTracker; import dev.loki.lovisual.util.pvp.PvpTracker; import dev.loki.lovisual.util.target.TargetManager; import dev.loki.lovisual.util.time.TimerController; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; public class LoVisual implements ClientModInitializer { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonDescriptor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonDescriptor.java index 1c2b21f..22ff5fc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonDescriptor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonDescriptor.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.addon; import java.util.List; -record AddonDescriptor( +public record AddonDescriptor( String id, String name, String version, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonRegistration.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonRegistration.java index 23fb9a4..544f457 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonRegistration.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonRegistration.java @@ -15,7 +15,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -final class AddonRegistration { +public final class AddonRegistration { final AddonDescriptor descriptor; final EntrypointContainer entrypoint; final List modules = new ArrayList<>(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonStateStore.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonStateStore.java index 6a7c424..cec8adc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonStateStore.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/AddonStateStore.java @@ -20,7 +20,7 @@ import java.nio.file.Path; import java.util.HashMap; import java.util.Map; -final class AddonStateStore { +public final class AddonStateStore { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private AddonStateStore() { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonContextImpl.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonContextImpl.java index 482234e..2a7ea3d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonContextImpl.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonContextImpl.java @@ -30,7 +30,7 @@ import net.fabricmc.loader.api.ModContainer; import java.nio.file.Path; -final class LoVisualAddonContextImpl implements LoVisualAddonContext { +public final class LoVisualAddonContextImpl implements LoVisualAddonContext { private final AddonRegistration registration; LoVisualAddonContextImpl(AddonRegistration registration) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonRuntimeContextImpl.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonRuntimeContextImpl.java index 2f536df..b6c11cb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonRuntimeContextImpl.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualAddonRuntimeContextImpl.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.addon; import dev.loki.lovisual.api.v0.addon.LoVisualAddonRuntimeContext; import dev.loki.lovisual.api.v0.client.LoVisualClientApi; -final class LoVisualAddonRuntimeContextImpl implements LoVisualAddonRuntimeContext { +public final class LoVisualAddonRuntimeContextImpl implements LoVisualAddonRuntimeContext { private final String addonId; LoVisualAddonRuntimeContextImpl(String addonId) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualModuleLoadContextImpl.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualModuleLoadContextImpl.java index 79904b6..98abb0d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualModuleLoadContextImpl.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/LoVisualModuleLoadContextImpl.java @@ -13,7 +13,7 @@ import dev.loki.lovisual.features.module.ModuleAutoLoader; import java.util.ArrayList; import java.util.List; -final class LoVisualModuleLoadContextImpl implements LoVisualModuleLoadContext { +public final class LoVisualModuleLoadContextImpl implements LoVisualModuleLoadContext { private final AddonRegistration registration; private final List pendingExclusions = new ArrayList<>(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/ModuleExtensionContextImpl.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/ModuleExtensionContextImpl.java index 4949b8c..1ec2452 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/ModuleExtensionContextImpl.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/addon/ModuleExtensionContextImpl.java @@ -13,7 +13,7 @@ import dev.loki.lovisual.config.values.ConfigValue; import dev.loki.lovisual.config.values.ModeValue; import dev.loki.lovisual.features.module.Module; -final class ModuleExtensionContextImpl implements ModuleExtensionContext { +public final class ModuleExtensionContextImpl implements ModuleExtensionContext { private final String addonId; private final Module module; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualAddonContext.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualAddonContext.java index 89f34b8..4283781 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualAddonContext.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualAddonContext.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.api.v0.addon; -import dev.loki.lovisual.events.UsedImplicitly; +import dev.loki.lovisual.events.meta.UsedImplicitly; import dev.loki.lovisual.features.command.ClientCommand; import dev.loki.lovisual.api.v0.clickgui.LoVisualClickGuiSection; import dev.loki.lovisual.features.gui.hud.AbstractHudElement; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualModuleLoadContext.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualModuleLoadContext.java index 8526e20..6967191 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualModuleLoadContext.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/api/v0/addon/LoVisualModuleLoadContext.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.api.v0.addon; -import dev.loki.lovisual.events.UsedImplicitly; +import dev.loki.lovisual.events.meta.UsedImplicitly; import dev.loki.lovisual.features.module.Module; /** diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/compat/xaero/XaeroWaypointRuntime.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/compat/xaero/XaeroWaypointRuntime.java index 5541be8..dbf6dc3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/compat/xaero/XaeroWaypointRuntime.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/compat/xaero/XaeroWaypointRuntime.java @@ -24,7 +24,7 @@ import xaero.hud.path.XaeroPath; import java.util.ArrayList; import java.util.List; -final class XaeroWaypointRuntime { +public final class XaeroWaypointRuntime { private XaeroWaypointRuntime() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/MainConfig.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/MainConfig.java index 33bf9d9..1619275 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/MainConfig.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/MainConfig.java @@ -7,7 +7,6 @@ package dev.loki.lovisual.config; -import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.render.iris.IrisRuntime; import dev.loki.lovisual.util.logging.DebugLog; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/SettingDef.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/SettingDef.java index 83e1d5c..11e6496 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/SettingDef.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/SettingDef.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.config; import dev.loki.lovisual.config.common.CommonSettingSchema; import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import java.lang.reflect.Field; import java.util.ArrayList; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/common/CommonSettingSchemas.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/common/CommonSettingSchemas.java index ea148c0..78dbb99 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/common/CommonSettingSchemas.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/common/CommonSettingSchemas.java @@ -8,6 +8,7 @@ package dev.loki.lovisual.config.common; import dev.loki.lovisual.config.common.impl.*; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; public enum CommonSettingSchemas { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodec.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodec.java index f2dc8ec..4efd2ee 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodec.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodec.java @@ -16,7 +16,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -enum ConfigProfileValueCodec { +public enum ConfigProfileValueCodec { ; private static final byte NULL = 0; private static final byte BOOLEAN = 1; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/EventBus.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/EventBus.java index ac19cb2..b67ab7d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/EventBus.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/EventBus.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; +import dev.loki.lovisual.events.Event; +import dev.loki.lovisual.events.meta.EventHandler; public final class EventBus { private static final Subscriber[] EMPTY_SUBSCRIBERS = new Subscriber[0]; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/Events.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/Events.java index 402fd7c..29559fa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/Events.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/Events.java @@ -6,6 +6,7 @@ */ package dev.loki.lovisual.events; +import dev.loki.lovisual.events.EventBus; public enum Events { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/AttackEntityEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/AttackEntityEvent.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/AttackEntityEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/AttackEntityEvent.java index 3abe1c1..74d1234 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/AttackEntityEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/AttackEntityEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.entity; import lombok.Getter; import net.minecraft.world.entity.Entity; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/CrosshairTargetUpdateEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/CrosshairTargetUpdateEvent.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/CrosshairTargetUpdateEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/CrosshairTargetUpdateEvent.java index 87d9875..b385417 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/CrosshairTargetUpdateEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/CrosshairTargetUpdateEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.entity; import lombok.Getter; import lombok.Setter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventTargetChanged.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/EventTargetChanged.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventTargetChanged.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/EventTargetChanged.java index beb899c..3c50733 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventTargetChanged.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/EventTargetChanged.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.entity; import net.minecraft.world.entity.LivingEntity; import dev.loki.lovisual.events.Event; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/FireworkEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/FireworkEvent.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/FireworkEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/FireworkEvent.java index 678a1ff..05019d2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/FireworkEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/entity/FireworkEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.entity; import lombok.Getter; import lombok.Setter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/KeyInputEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/KeyInputEvent.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/KeyInputEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/KeyInputEvent.java index e433a7b..041f9c7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/KeyInputEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/KeyInputEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.input; import lombok.Getter; import net.minecraft.client.input.KeyEvent; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/KeybindIsPressedEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/KeybindIsPressedEvent.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/KeybindIsPressedEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/KeybindIsPressedEvent.java index 4f2a141..219fa32 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/KeybindIsPressedEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/KeybindIsPressedEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.input; import lombok.Getter; import lombok.Setter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/RotationUpdateEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/RotationUpdateEvent.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/RotationUpdateEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/RotationUpdateEvent.java index ff9d86e..123c6ed 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/RotationUpdateEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/RotationUpdateEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.input; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/SprintControlEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/SprintControlEvent.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/SprintControlEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/SprintControlEvent.java index 11eda63..4c1584c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/SprintControlEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/input/SprintControlEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.input; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/MovementInputEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/MovementInputEvent.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/MovementInputEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/MovementInputEvent.java index 8c75337..78f81fe 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/MovementInputEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/MovementInputEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.movement; import lombok.Getter; import lombok.Setter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerSafeWalkEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerSafeWalkEvent.java similarity index 87% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerSafeWalkEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerSafeWalkEvent.java index cbd025a..c5fb53e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerSafeWalkEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerSafeWalkEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.movement; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerStepEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerStepEvent.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerStepEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerStepEvent.java index a9f9d3b..2075601 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerStepEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerStepEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.movement; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerStepSuccessEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerStepSuccessEvent.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerStepSuccessEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerStepSuccessEvent.java index 41b9016..7552f36 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerStepSuccessEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/movement/PlayerStepSuccessEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.movement; import lombok.Getter; import net.minecraft.world.phys.Vec3; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/BlinkPacketEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/BlinkPacketEvent.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/BlinkPacketEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/BlinkPacketEvent.java index d6f1fa5..fb0952f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/BlinkPacketEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/BlinkPacketEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.network; import lombok.Getter; import net.minecraft.network.protocol.Packet; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventPostSync.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/EventPostSync.java similarity index 85% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventPostSync.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/EventPostSync.java index 17ef052..3eed9a5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventPostSync.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/EventPostSync.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.network; import dev.loki.lovisual.events.Event; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventSync.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/EventSync.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventSync.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/EventSync.java index eeab483..4df3ece 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventSync.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/EventSync.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.network; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PacketEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/PacketEvent.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PacketEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/PacketEvent.java index 0d9ad7c..eb836dc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PacketEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/network/PacketEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.network; import lombok.Getter; import net.minecraft.network.protocol.Packet; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/I18nPreflightCollectEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/I18nPreflightCollectEvent.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/I18nPreflightCollectEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/I18nPreflightCollectEvent.java index 4b23fd1..a38610d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/I18nPreflightCollectEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/I18nPreflightCollectEvent.java @@ -5,13 +5,13 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.player; import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.config.SettingOwner; import dev.loki.lovisual.events.Event; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingFactory; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.SettingFactory; import java.util.ArrayList; import java.util.Collections; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerJumpEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PlayerJumpEvent.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerJumpEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PlayerJumpEvent.java index 9943cd6..a7665e9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerJumpEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PlayerJumpEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.player; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerMoveEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PlayerMoveEvent.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerMoveEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PlayerMoveEvent.java index 3ad7a1e..13586c9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerMoveEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PlayerMoveEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.player; import lombok.Getter; import lombok.Setter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PostPlayerUpdateEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PostPlayerUpdateEvent.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PostPlayerUpdateEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PostPlayerUpdateEvent.java index 2acb7cf..abd5983 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PostPlayerUpdateEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/player/PostPlayerUpdateEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.player; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/CombatProtocolBossbarEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/CombatProtocolBossbarEvent.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/CombatProtocolBossbarEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/CombatProtocolBossbarEvent.java index 467af63..51c94b8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/CombatProtocolBossbarEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/CombatProtocolBossbarEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.pvp; import dev.loki.lovisual.events.Event; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpChatEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpChatEvent.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpChatEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpChatEvent.java index ba42eab..edbaf09 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpChatEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpChatEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.pvp; import dev.loki.lovisual.events.Event; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpOverlayEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpOverlayEvent.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpOverlayEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpOverlayEvent.java index 561f2fc..02e7a52 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpOverlayEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpOverlayEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.pvp; import net.minecraft.network.chat.Component; import dev.loki.lovisual.events.Event; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpTabEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpTabEvent.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpTabEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpTabEvent.java index f812c06..25211da 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PvpTabEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/pvp/PvpTabEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.pvp; import dev.loki.lovisual.events.Event; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/GameTickEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/GameTickEvent.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/GameTickEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/GameTickEvent.java index 6179ca4..2d92a20 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/GameTickEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/GameTickEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.render; import dev.loki.lovisual.events.Event; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/LightmapEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/LightmapEvent.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/LightmapEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/LightmapEvent.java index 67ef721..10b4803 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/LightmapEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/LightmapEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.render; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/LightmapModifyEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/LightmapModifyEvent.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/LightmapModifyEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/LightmapModifyEvent.java index 03b247c..7c86791 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/LightmapModifyEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/LightmapModifyEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.render; import lombok.Getter; import net.minecraft.client.renderer.state.LightmapRenderState; @@ -13,6 +13,7 @@ import net.minecraft.util.Mth; import org.joml.Vector3f; import org.joml.Vector3fc; import dev.loki.lovisual.events.Event; +import dev.loki.lovisual.features.module.modules.visuals.player.FullBright; public class LightmapModifyEvent extends Event { private static final float EPSILON = 1.0e-4f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/RenderPrewarmCollectEvent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/RenderPrewarmCollectEvent.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/RenderPrewarmCollectEvent.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/RenderPrewarmCollectEvent.java index a2d4fc5..1abafdc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/RenderPrewarmCollectEvent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/render/RenderPrewarmCollectEvent.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.render; import dev.loki.lovisual.events.Event; import dev.loki.lovisual.render.engine.svg.SvgRegistry; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventBreakBlock.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventBreakBlock.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventBreakBlock.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventBreakBlock.java index 4c960c1..6b0e182 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventBreakBlock.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventBreakBlock.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.world; import lombok.Getter; import net.minecraft.core.BlockPos; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventCollision.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventCollision.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventCollision.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventCollision.java index 55dd0c8..37e5821 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventCollision.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventCollision.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.world; import lombok.Getter; import lombok.Setter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventPushOutOfBlocks.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventPushOutOfBlocks.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventPushOutOfBlocks.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventPushOutOfBlocks.java index 572b6b3..67cf688 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/EventPushOutOfBlocks.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/EventPushOutOfBlocks.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.world; import dev.loki.lovisual.events.Event; import lombok.Getter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerVelocityStrafe.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/PlayerVelocityStrafe.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerVelocityStrafe.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/PlayerVelocityStrafe.java index 5cfd9df..59c8bad 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/PlayerVelocityStrafe.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/impl/world/PlayerVelocityStrafe.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events.impl; +package dev.loki.lovisual.events.impl.world; import lombok.Getter; import lombok.Setter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/EventHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/meta/EventHandler.java similarity index 83% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/EventHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/meta/EventHandler.java index 6e1c7ca..30dbfa4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/EventHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/meta/EventHandler.java @@ -5,12 +5,13 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events; +package dev.loki.lovisual.events.meta; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import dev.loki.lovisual.events.meta.UsedImplicitly; @UsedImplicitly @Retention(RetentionPolicy.RUNTIME) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/UsedImplicitly.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/meta/UsedImplicitly.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/events/UsedImplicitly.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/events/meta/UsedImplicitly.java index 54743ac..3250c38 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/UsedImplicitly.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/events/meta/UsedImplicitly.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.events; +package dev.loki.lovisual.events.meta; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/CommandInfo.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/CommandInfo.java index 831c08b..9c25ad5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/CommandInfo.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/CommandInfo.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.features.command; -import dev.loki.lovisual.events.UsedImplicitly; +import dev.loki.lovisual.events.meta.UsedImplicitly; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/CommandUtils.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/CommandUtils.java index 59cb8d8..e09bb47 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/CommandUtils.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/CommandUtils.java @@ -17,7 +17,7 @@ import java.util.Comparator; import java.util.List; import java.util.Locale; -final class CommandUtils { +public final class CommandUtils { private CommandUtils() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/HideCommand.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/HideCommand.java index ac28ff2..0607efd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/HideCommand.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/HideCommand.java @@ -15,6 +15,7 @@ import dev.loki.lovisual.features.module.Module; import java.util.List; import java.util.Locale; +import dev.loki.lovisual.features.gui.hud.draggable.impl.panels.ModuleList; @CommandInfo( id = "hide", diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/PingCommand.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/PingCommand.java index 82e4006..dbf6548 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/PingCommand.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/PingCommand.java @@ -12,6 +12,7 @@ import dev.loki.lovisual.features.command.CommandContext; import dev.loki.lovisual.features.command.CommandInfo; import dev.loki.lovisual.features.command.CommandOutput; import dev.loki.lovisual.util.player.NetworkStatsUtil; +import dev.loki.lovisual.features.gui.hud.draggable.impl.stats.Ping; @CommandInfo( id = "ping", diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/ServerInfoCommand.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/ServerInfoCommand.java index 2e1823b..7903862 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/ServerInfoCommand.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/command/impl/ServerInfoCommand.java @@ -15,6 +15,7 @@ import dev.loki.lovisual.util.player.NetworkStatsUtil; import net.minecraft.client.multiplayer.ServerData; import java.util.Locale; +import dev.loki.lovisual.features.gui.hud.draggable.impl.stats.Ping; @CommandInfo( id = "serverinfo", diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticAttachmentTransforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticAttachmentTransforms.java index 72acb1f..7da169c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticAttachmentTransforms.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticAttachmentTransforms.java @@ -2,54 +2,89 @@ package dev.loki.lovisual.features.cosmetic; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; +import dev.loki.lovisual.features.module.Modules; +import dev.loki.lovisual.features.module.modules.visuals.cosmetics.CosmeticDisplay; public final class CosmeticAttachmentTransforms { private CosmeticAttachmentTransforms() { } - public static void apply(PoseStack matrices, CosmeticType type, CosmeticModel model) { - if (type == CosmeticType.PET) { - // TODO: replace with CosmeticAnimator.getPetHoverOffset() once the animator is ported. - float bob = 0f; - matrices.mulPose(Axis.YP.rotationDegrees(180f)); - matrices.translate(0.45f, 2.15f + bob, 0.12f); - matrices.scale(0.55f, 0.55f, 0.55f); - return; + /** + * Base attachment transform for a slot, then the user's per-slot offset/rotation/scale + * override from {@link CosmeticDisplay} (accessory slots only). + */ + public static void apply(PoseStack matrices, CosmeticSlot slot, CosmeticModel model) { + applyBase(matrices, slot); + if (slot.isAccessory()) { + applyUserOverride(matrices, slot); } - if (type == CosmeticType.ACCESSORY && model != null) { - String folder = model.getFolderName().toLowerCase(); - if (folder.contains("witch") || folder.contains("hat")) { + } + + private static void applyUserOverride(PoseStack matrices, CosmeticSlot slot) { + CosmeticDisplay module = Modules.get(CosmeticDisplay.class); + if (module == null) return; + CosmeticDisplay.SlotOffsetSettings offsets = module.offsetsFor(slot); + if (offsets == null) return; + + matrices.translate(offsets.offsetX().get(), offsets.offsetY().get(), offsets.offsetZ().get()); + matrices.mulPose(Axis.YP.rotationDegrees(offsets.rotation().get())); + float scale = offsets.scale().get(); + matrices.scale(scale, scale, scale); + } + + private static void applyBase(PoseStack matrices, CosmeticSlot slot) { + switch (slot) { + case PET -> { + // TODO: replace with CosmeticAnimator.getPetHoverOffset() once the animator is ported. + float bob = 0f; + matrices.mulPose(Axis.YP.rotationDegrees(180f)); + matrices.translate(0.45f, 2.15f + bob, 0.12f); + matrices.scale(0.55f, 0.55f, 0.55f); + } + case HEAD -> { matrices.translate(0f, 1.72f, 0f); matrices.scale(0.52f, 0.52f, 0.52f); - } else if (folder.contains("wing")) { + } + case SHOULDERS -> { + matrices.translate(0f, 1.45f, 0f); + matrices.scale(0.5f, 0.5f, 0.5f); + } + case BACK -> { matrices.translate(0f, 0.1f, -0.3f); matrices.mulPose(Axis.YP.rotationDegrees(180f)); matrices.scale(0.85f, 0.85f, 0.85f); - } else if (folder.contains("wheel")) { + } + case WAIST -> { matrices.translate(0f, 0.55f, 0.25f); matrices.scale(0.55f, 0.55f, 0.55f); - } else { + } + case LEGS -> { + matrices.translate(0f, 0.3f, 0f); + matrices.scale(0.5f, 0.5f, 0.5f); + } + case HELD -> { matrices.translate(0f, 1.3f, 0f); matrices.scale(0.5f, 0.5f, 0.5f); } + case MODEL -> { + // no base transform: full-body model replaces the player 1:1 + } } } public static void applyPreview(PoseStack matrices, CosmeticModel model) { if (model == null) return; - String folder = model.getFolderName().toLowerCase(); - if (model.getType() == CosmeticType.PET) { + CosmeticSlot slot = model.getSlot(); + if (slot == CosmeticSlot.PET) { matrices.translate(6f, 22f, 1f); matrices.scale(1.8f, 1.8f, 1.8f); - } else if (model.getType() == CosmeticType.ACCESSORY) { - if (folder.contains("witch") || folder.contains("hat")) { - matrices.translate(0f, 20f, 0f); - } else if (folder.contains("wing")) { - matrices.translate(0f, 2f, -4f); - matrices.scale(1.3f, 1.3f, 1.3f); - } else if (folder.contains("wheel")) { - matrices.translate(0f, 6f, 3f); - } + } else if (slot == CosmeticSlot.HEAD) { + matrices.translate(0f, 20f, 0f); + } else if (slot == CosmeticSlot.BACK) { + matrices.translate(0f, 2f, -4f); + matrices.scale(1.3f, 1.3f, 1.3f); + } else if (slot == CosmeticSlot.WAIST) { + matrices.translate(0f, 6f, 3f); } } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticManager.java index f2053e8..1594ea1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticManager.java @@ -1,15 +1,18 @@ package dev.loki.lovisual.features.cosmetic; +import java.util.EnumMap; +import java.util.Map; + /** - * Holds which cosmetic (model/pet/accessory) the local user currently has equipped. + * Holds which cosmetic the local user currently has equipped, per slot. + * MODEL/PET are single-active slots; the six accessory slots (HEAD/SHOULDERS/ + * BACK/WAIST/LEGS/HELD) are independent and can all be active at once. * Rendering and animation live in separate classes (not part of this core pass). */ public final class CosmeticManager { private static final CosmeticManager INSTANCE = new CosmeticManager(); - private CosmeticModel activeModel; - private CosmeticModel activePet; - private CosmeticModel activeAccessory; + private final Map active = new EnumMap<>(CosmeticSlot.class); private CosmeticManager() { } @@ -23,52 +26,55 @@ public final class CosmeticManager { * (by id) against the freshly loaded models. */ public void init() { - String modelId = activeModel != null ? activeModel.getId() : null; - String petId = activePet != null ? activePet.getId() : null; - String accessoryId = activeAccessory != null ? activeAccessory.getId() : null; + Map equippedIds = new EnumMap<>(CosmeticSlot.class); + for (Map.Entry entry : active.entrySet()) { + if (entry.getValue() != null) { + equippedIds.put(entry.getKey(), entry.getValue().getId()); + } + } for (CosmeticModel model : CosmeticRepository.get().all()) { model.resetTexture(); } CosmeticRepository.get().reload(); + active.clear(); CosmeticRepository repo = CosmeticRepository.get(); - activeModel = modelId != null ? repo.get(modelId) : null; - activePet = petId != null ? repo.get(petId) : null; - activeAccessory = accessoryId != null ? repo.get(accessoryId) : null; + for (Map.Entry entry : equippedIds.entrySet()) { + CosmeticModel resolved = repo.get(entry.getValue()); + if (resolved != null) { + active.put(entry.getKey(), resolved); + } + } } - public CosmeticModel getActive(CosmeticType type) { - return switch (type) { - case PET -> activePet; - case ACCESSORY -> activeAccessory; - case MODEL -> activeModel; - }; + public CosmeticModel getActive(CosmeticSlot slot) { + return active.get(slot); } - public void setActive(CosmeticType type, CosmeticModel model) { + public void setActive(CosmeticSlot slot, CosmeticModel model) { if (model != null) { CosmeticModel resolved = CosmeticRepository.get().get(model.getId()); if (resolved != null) { model = resolved; } } - switch (type) { - case PET -> activePet = model; - case ACCESSORY -> activeAccessory = model; - case MODEL -> activeModel = model; + if (model == null) { + active.remove(slot); + } else { + active.put(slot, model); } } - public void clear(CosmeticType type) { - setActive(type, null); + public void clear(CosmeticSlot slot) { + setActive(slot, null); } public boolean hasAnyActive() { - return activeModel != null || activePet != null || activeAccessory != null; + return !active.isEmpty(); } public boolean isActive() { - return activeModel != null; + return active.get(CosmeticSlot.MODEL) != null; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticModel.java index 168bae4..52992bc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticModel.java @@ -40,6 +40,7 @@ public class CosmeticModel { private final String accentColor; private final String folderName; private final CosmeticType type; + private final CosmeticSlot slot; private final File externalDirectory; @Setter private String source = "Своя"; @@ -63,18 +64,27 @@ public class CosmeticModel { private CosmeticTextureSlot fallbackSlot; private CosmeticModel(String id, String name, String description, String accentColor, - String folderName, CosmeticType type, File externalDirectory) { + String folderName, CosmeticType type, CosmeticSlot slot, File externalDirectory) { this.id = id; this.name = name; this.description = description; this.accentColor = accentColor; this.folderName = folderName; this.type = type; + this.slot = slot != null ? slot : defaultSlotFor(type, folderName); this.externalDirectory = externalDirectory; } + private static CosmeticSlot defaultSlotFor(CosmeticType type, String folderName) { + return switch (type) { + case MODEL -> CosmeticSlot.MODEL; + case PET -> CosmeticSlot.PET; + case ACCESSORY -> CosmeticSlot.guessFromFolderName(folderName); + }; + } + public CosmeticModel withType(CosmeticType newType) { - CosmeticModel copy = new CosmeticModel(id, name, description, accentColor, folderName, newType, externalDirectory); + CosmeticModel copy = new CosmeticModel(id, name, description, accentColor, folderName, newType, null, externalDirectory); copy.rootBones.addAll(rootBones); copy.renderRoots.addAll(renderRoots); copy.boneMap.putAll(boneMap); @@ -141,7 +151,8 @@ public class CosmeticModel { : avatar.has("type") ? avatar.get("type").getAsString() : null ); - CosmeticModel model = new CosmeticModel(catalogId, name, desc, color, folderName, type, externalDir); + CosmeticSlot slot = avatar.has("slot") ? CosmeticSlot.fromJson(avatar.get("slot").getAsString()) : null; + CosmeticModel model = new CosmeticModel(catalogId, name, desc, color, folderName, type, slot, externalDir); InputStream modelStream = openModelStream(externalDir, folderName); if (modelStream == null) { @@ -392,6 +403,7 @@ public class CosmeticModel { parent.getAccentColor(), petFolder, CosmeticType.PET, + null, null ); pet.source = parent.source; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRenderer.java index 58c42da..3e0fb33 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRenderer.java @@ -30,10 +30,10 @@ public final class CosmeticRenderer { private CosmeticRenderer() { } - public static void renderOnPlayer(Renderer3D renderer, Player player, CosmeticType type, float tickDelta) { + public static void renderOnPlayer(Renderer3D renderer, Player player, CosmeticSlot slot, float tickDelta) { if (renderer == null || player == null) return; - CosmeticModel model = CosmeticManager.get().getActive(type); + CosmeticModel model = CosmeticManager.get().getActive(slot); if (model == null) return; model.loadTexture(); @@ -45,7 +45,7 @@ public final class CosmeticRenderer { PoseStack matrices = new PoseStack(); matrices.translate(pos.x, pos.y, pos.z); - CosmeticAttachmentTransforms.apply(matrices, type, model); + CosmeticAttachmentTransforms.apply(matrices, slot, model); matrices.mulPose(Axis.YP.rotationDegrees(180f - bodyYaw)); Map> byTexture = new HashMap<>(); @@ -58,14 +58,14 @@ public final class CosmeticRenderer { Vec3 cam = RenderState.cameraPos; for (Map.Entry> entry : byTexture.entrySet()) { - CosmeticTextureSlot slot = model.getTextureSlot(entry.getKey()); - if (slot == null) continue; - if (!slot.isLoaded()) { - model.ensureTextureSlotLoaded(slot); + CosmeticTextureSlot textureSlot = model.getTextureSlot(entry.getKey()); + if (textureSlot == null) continue; + if (!textureSlot.isLoaded()) { + model.ensureTextureSlotLoaded(textureSlot); } - if (!slot.isLoaded()) continue; + if (!textureSlot.isLoaded()) continue; - AbstractTexture texture = mc.getTextureManager().getTexture(slot.getId()); + AbstractTexture texture = mc.getTextureManager().getTexture(textureSlot.getId()); if (texture == null || texture.getTextureView() == null || texture.getSampler() == null) continue; Renderer3D.BatchBindings bindings = Renderer3D.BatchBindings.none() diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRepository.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRepository.java index 1ddf345..454162d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRepository.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticRepository.java @@ -42,6 +42,10 @@ public final class CosmeticRepository { return catalog.values().stream().filter(m -> m.getType() == type).toList(); } + public List bySlot(CosmeticSlot slot) { + return catalog.values().stream().filter(m -> m.getSlot() == slot).toList(); + } + public CosmeticModel get(String id) { return catalog.get(id); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticSlot.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticSlot.java new file mode 100644 index 0000000..9d2333b --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/cosmetic/CosmeticSlot.java @@ -0,0 +1,62 @@ +package dev.loki.lovisual.features.cosmetic; + +/** + * Where a cosmetic is worn. MODEL/PET are whole-body/companion slots (one active + * item each); the remaining six are independent accessory slots that can all be + * active simultaneously (e.g. a hat + wings + a belt at once). + */ +public enum CosmeticSlot { + MODEL("model", "Модель"), + PET("pet", "Питомец"), + HEAD("head", "Голова"), + SHOULDERS("shoulders", "Плечи"), + BACK("back", "Спина"), + WAIST("waist", "Пояс"), + LEGS("legs", "Ноги"), + HELD("held", "В руке"); + + private final String id; + private final String displayName; + + CosmeticSlot(String id, String displayName) { + this.id = id; + this.displayName = displayName; + } + + public String getId() { + return id; + } + + public String getDisplayName() { + return displayName; + } + + public boolean isAccessory() { + return this != MODEL && this != PET; + } + + public static CosmeticSlot fromJson(String raw) { + if (raw == null || raw.isBlank()) return null; + return switch (raw.trim().toLowerCase()) { + case "model", "модель" -> MODEL; + case "pet", "pets", "питомец", "питомцы" -> PET; + case "head", "hat", "голова", "шляпа" -> HEAD; + case "shoulders", "shoulder", "плечи" -> SHOULDERS; + case "back", "спина" -> BACK; + case "waist", "belt", "пояс" -> WAIST; + case "legs", "leg", "ноги" -> LEGS; + case "held", "hand", "рука" -> HELD; + default -> null; + }; + } + + /** Best-effort slot guess from the model's folder name (legacy accessories without a "slot" key). */ + public static CosmeticSlot guessFromFolderName(String folderName) { + if (folderName == null) return HELD; + String folder = folderName.toLowerCase(); + if (folder.contains("witch") || folder.contains("hat")) return HEAD; + if (folder.contains("wing")) return BACK; + if (folder.contains("wheel")) return WAIST; + return HELD; + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatModel.java deleted file mode 100644 index c7b75d1..0000000 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatModel.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This file is part of the LoVisual Client distribution. - * Copyright (c) 2026 loki5512344. - * - * Licensed under the GNU General Public License v3.0. - */ - -package dev.loki.lovisual.features.gui.chat; - -import net.minecraft.network.chat.HoverEvent; -import net.minecraft.network.chat.Style; - -import java.util.List; - -/** - * Shared package-private records extracted from {@link BetterChatRenderer}. - * The only public-facing record kept nested on the facade is {@link BetterChatRenderer.Layout}. - * Records that own non-trivial rendering logic ({@code FrameLayout}, {@code ContextMenu}) live in - * their own files ({@link BetterChatFrameModel}, {@link BetterChatContextMenuModel}). - */ -final class BetterChatModel { - private BetterChatModel() { - } - - record MousePos(double rawX, double rawY, double fx, double fy) { - } - - record InputLine(int start, int end, float width) { - } - - record Segment(String text, Style style) { - } - - record VisualLine(ChatLine message, int messageIndex, int messageGroup, int startChar, int endChar, List glyphs) { - } - - record Glyph( - float x0, - float x1, - int charIndex, - int charEndExclusive, - int color, - HoverEvent hover, - String font, - String text, - Style style - ) { - } - - record GlyphBox( - float x0, - float y0, - float x1, - float y1, - int charIndex, - int charEndExclusive, - int color, - String font, - HoverEvent hover, - String text, - Style style - ) { - } - - record CachedLine(int startChar, int endChar, List glyphs) { - } - - record CachedMessageLayout(float fontSize, float maxWidth, List lines) { - } - - record FrameLine(ChatLine message, int messageIndex, int messageGroup, float y0, float y1, List glyphs) { - } - - record MessageBubble(ChatLine message, int messageGroup, float x, float y, float w, float h, FrameLine firstLine, FrameLine lastLine) { - } - - record MessageClipBounds(float x, float y, float w, float h) { - } - - record PickResult(FrameLine line, GlyphBox glyph) { - } - - record LayoutResult(List lines, int messagesSeen) { - } -} \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatRenderer.java deleted file mode 100644 index c357691..0000000 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatRenderer.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * This file is part of the LoVisual Client distribution. - * Copyright (c) 2026 loki5512344. - * - * Licensed under the GNU General Public License v3.0. - */ - -package dev.loki.lovisual.features.gui.chat; - -import com.mojang.brigadier.suggestion.Suggestion; -import dev.loki.lovisual.features.command.CommandOutput; -import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; -import dev.loki.lovisual.render.engine.color.RenderColor; -import dev.loki.lovisual.render.engine.renderer.Renderer2D; -import dev.loki.lovisual.render.engine.text.TextRenderer; -import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.screens.ChatScreen; -import net.minecraft.network.chat.Style; -import net.minecraft.util.Mth; - -import java.util.Collections; -import java.util.IdentityHashMap; -import java.util.List; - -import dev.loki.lovisual.util.text.TextSelection; - -/** - * Facade for the BetterChat HUD renderer. This enum singleton is now a thin delegation point: - * it owns the shared per-frame state and constants read/written by the package-private helpers, - * and re-exports the original public API exactly as before so no caller changes. - */ -public enum BetterChatRenderer { - ; - - // ---- Constants (package-private; read by helpers) ---- - static final int MAX_MESSAGE_CHARS = 256; - static final float PADDING = 8f; - static final float LINE_SPACING = 3f; - static final float RADIUS = 24f; - static final float MESSAGE_PAD_X = 8f; - static final float MESSAGE_PAD_Y = 5f; - static final float MESSAGE_GAP = 4f; - static final float MESSAGE_INPUT_GAP = 8f; - static final float MESSAGE_RADIUS = 9f; - static final float MESSAGE_TS_GAP = 8f; - static final float INPUT_RADIUS = 12f; - static final float SEARCH_ICON_WIDTH = 34f; - static final float SEARCH_ICON_HEIGHT = 22f; - static final float NEW_MESSAGE_REVEAL_SECONDS = 0.34f; - static final float NEW_MESSAGE_SLIDE_PX = 18f; - static final int MAX_HISTORY = 32000; - static final float CHAT_TOOLTIP_OFFSET_X = 6f; - static final float CHAT_TOOLTIP_OFFSET_Y = 12f; - static final double DRAG_SELECT_THRESHOLD = 4.0; - static final RenderColor TMP_COLOR = new RenderColor(0xFFFFFFFF); - - // ---- Layout caches (package-private) ---- - static final IdentityHashMap MESSAGE_LAYOUT_CACHE = new IdentityHashMap<>(); - static final IdentityHashMap> SEGMENT_CACHE = new IdentityHashMap<>(); - static final IdentityHashMap COMMAND_LINE_CACHE = new IdentityHashMap<>(); - static final TextSelection selection = new TextSelection(); - - // ---- Persistent UI state (package-private) ---- - static Renderer2D renderer; - static float lastRenderWidth = 0f; - static float lastRenderHeight = 0f; - static int scrollOffsetLines = 0; - static float smoothScrollOffsetLines = 0f; - static int maxScrollLines = 0; - static float lastFontSizeForUi = 16f; - static List lastMessages = Collections.emptyList(); - static boolean draggingScrollbar = false; - static float sbTrackX, sbTrackY, sbTrackW, sbTrackH; - static float sbThumbY, sbThumbH; - static float sbDragOffset = 0f; - static long lastScrollInteractionMs = 0L; - static boolean sbEnabled = false; - static int sbTotalLines = 0; - static int sbVisibleLines = 0; - static float inputBoxX = 0f, inputBoxY = 0f, inputBoxW = 0f, inputBoxH = 0f; - static boolean hasInputBox = false; - static boolean suggestActive = false; - static float suggestX, suggestY, suggestW, suggestH, suggestItemH; - static float suggestRowsX, suggestRowsY, suggestRowsW, suggestRowsH; - static int suggestStart, suggestVisible, suggestTotal; - static net.minecraft.client.gui.components.CommandSuggestions.SuggestionsList suggestWindow; - static List suggestEntries = Collections.emptyList(); - static boolean lastHoverWasOutsideSuggest = true; - static boolean suggestHasScrollbar = false; - static boolean suggestDraggingScrollbar = false; - static float suggestTrackX, suggestTrackY, suggestTrackW, suggestTrackH, suggestThumbH; - static int suggestCurrentStart = -1; - static int suggestCurrentSelection = -1; - static double lastMouseFx = 0.0; - static double lastMouseFy = 0.0; - static boolean lastMouseValid = false; - static boolean tooltipCaptured = false; - static String lastSuggestInput = ""; - static int lastSuggestCursor = -1; - static int lastSuggestSelStart = -1; - static int lastSuggestSelEnd = -1; - static CommandSuggestorBridge.SuggestionSnapshot lastSnapshot = null; - static long debugPerfWindowStartNs = 0L; - static long debugPerfAccumLayoutNs = 0L; - static long debugPerfAccumBuildNs = 0L; - static int debugPerfAccumFrames = 0; - static BetterChatFrameModel.FrameLayout frame = BetterChatFrameModel.FrameLayout.empty(); - static BetterChatContextMenuModel.ContextMenu contextMenu = BetterChatContextMenuModel.ContextMenu.closed(); - static boolean selecting = false; - static boolean searchHit = false; - static float searchRectX = 0f, searchRectY = 0f, searchRectW = 0f, searchRectH = 0f; - static boolean searchHotkeyDown = false; - static float chatHitX = 0f, chatHitY = 0f, chatHitW = 0f, chatHitH = 0f; - static String hoverEntityUuid = null; - static ChatScreen storedScreen; - static BetterChatStore previewStore; - static int lastSuggestionHash = 0; - static boolean leftPending = false; - static double leftDownFx = 0.0, leftDownFy = 0.0; - static int leftDownMsgIndex = -1; - static int leftDownCharIndex = -1; - static Style leftDownStyle = null; - - // ---- Per-frame transient context (package-private; populated by the phased helpers) ---- - static GuiGraphicsExtractor ctxGui; - static float ctxBaseX, ctxBaseY; - static BetterChat ctxSettings; - static net.minecraft.client.Minecraft ctxMc; - static boolean ctxPreview, ctxChatOpen, ctxActiveSurface; - static boolean ctxShowTs, ctxHasSeconds, ctxTipDate, ctxTipUnix, ctxAutoFollow; - static int ctxTsColor, ctxTotalMessages, ctxVisibleLimit, ctxMessagesSeen; - static float ctxWidth, ctxContentWidth, ctxTsWidth; - static float ctxLineHeight, ctxBoxHeight, ctxLineYOffset, ctxTargetVisible; - static float ctxStableBoxHeight, ctxFixedInputY, ctxFrameY; - static int[] ctxMessageGroups; - static List ctxAllLines; - static List ctxVisible; - static long ctxPerfT0, ctxPerfT1; - static ChatHoverUtil.HoverTip ctxHoverTip; - - // ---- Public API (delegating) ---- - - public static void markLayoutDirty() { - BetterChatLayoutEngine.markLayoutDirty(); - } - - public static void renderEngine(Renderer2D rendererIn, - TextRenderer fallback, - GuiGraphicsExtractor ctx, - int screenW, - float baseX, - float baseY) { - BetterChatFrameRenderer.renderEngine(rendererIn, fallback, ctx, screenW, baseX, baseY); - } - - public static void renderCapturedTooltip(GuiGraphicsExtractor ctx) { - BetterChatTooltipRenderer.renderCapturedTooltip(ctx); - } - - public static boolean onScroll(double delta) { - return BetterChatInputHandler.onScroll(delta); - } - - public static boolean onMouseButton(double mx, double my, int button, boolean pressed) { - return BetterChatMouseClickHandler.onMouseButton(mx, my, button, pressed); - } - - public static void onMouseMove(double mx, double my) { - BetterChatInputHandler.onMouseMove(mx, my); - } - - public static void copySelectionToClipboard() { - BetterChatContextMenuHandler.copySelectionToClipboard(); - } - - public static void resetScroll() { - BetterChatInputHandler.resetScroll(); - } - - public static void applyAutoPrefixIfNeeded(EditBox field) { - // Compact BetterChat no longer owns chat-prefix chips; hook kept for compatibility. - } - - public static void setSuggestionContext(ChatScreen screen, GuiGraphicsExtractor context, int mouseX, int mouseY) { - storedScreen = screen; - } - - public static void onNewMessage() { - BetterChatInputHandler.onNewMessage(); - } - - public static float getLastWidth() { - return lastRenderWidth; - } - - public static float getLastHeight() { - return lastRenderHeight; - } - - public static boolean contains(float mx, float my) { - return BetterChatInputHandler.contains(mx, my); - } - - public static boolean isInteractive(float mx, float my) { - return BetterChatInputHandler.isInteractive(mx, my); - } - - public record Layout(float x, float y) { - } -} \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatViewport.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatViewport.java index 7d9a600..6a17baa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatViewport.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatViewport.java @@ -12,13 +12,17 @@ import net.minecraft.util.Mth; import java.util.Collections; import java.util.List; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatFrameModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; /** * Second render phase: turns the laid-out visual lines into a viewport + frame layout * (bubbles/lines) and animates smooth scrolling. Writes the resulting {@link BetterChatFrameModel.FrameLayout} * back onto the facade and populates the per-frame sizing context used by every later phase. */ -final class BetterChatViewport { +public final class BetterChatViewport { private BetterChatViewport() { } @@ -67,7 +71,7 @@ final class BetterChatViewport { return safe; } - static void composeFrame() { + public static void composeFrame() { List allLines = BetterChatRenderer.ctxAllLines; BetterChatModel.LayoutResult layoutResult = new BetterChatModel.LayoutResult(allLines, BetterChatRenderer.ctxMessagesSeen); List messages = BetterChatRenderer.lastMessages; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatEditBoxUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatEditBoxUtil.java similarity index 79% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatEditBoxUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatEditBoxUtil.java index 76afdb3..b24602b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatEditBoxUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatEditBoxUtil.java @@ -5,25 +5,25 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.input; -import dev.loki.lovisual.mixins.accessors.TextFieldWidgetAccessor; +import dev.loki.lovisual.mixins.accessors.widget.TextFieldWidgetAccessor; import net.minecraft.client.gui.components.EditBox; import net.minecraft.util.Mth; /** * EditBox selection introspection + word-boundary helper, independent of the chat renderer. */ -final class BetterChatEditBoxUtil { +public final class BetterChatEditBoxUtil { private BetterChatEditBoxUtil() { } - static int selectionStart(EditBox field, int fallback) { + public static int selectionStart(EditBox field, int fallback) { if (field == null) return fallback; return Mth.clamp(field.getCursorPosition(), 0, field.getValue().length()); } - static int selectionEnd(EditBox field, int fallback) { + public static int selectionEnd(EditBox field, int fallback) { if (field == null) return fallback; try { return Mth.clamp(((TextFieldWidgetAccessor) field).lovisual$getSelectionEnd(), 0, field.getValue().length()); @@ -35,12 +35,12 @@ final class BetterChatEditBoxUtil { } } - static void setCursorSafe(EditBox field, int pos) { + public static void setCursorSafe(EditBox field, int pos) { if (field == null) return; field.moveCursorTo(Mth.clamp(pos, 0, field.getValue().length()), false); } - static String wordAt(String text, int charIndex) { + public static String wordAt(String text, int charIndex) { if (text == null || text.isEmpty()) return ""; int idx = Mth.clamp(charIndex, 0, Math.max(0, text.length() - 1)); int start = idx; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatInputHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatInputHandler.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatInputHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatInputHandler.java index a8fa7a1..5eca604 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatInputHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatInputHandler.java @@ -5,23 +5,28 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.input; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ChatScreen; import org.lwjgl.glfw.GLFW; +import dev.loki.lovisual.features.gui.chat.input.BetterChatMouseClickHandler; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionState; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; /** * Chat-surface interaction: scroll, drag-selection movement, scrollbar drag and hit-testing. * The mouse-button dispatch lives in {@link BetterChatMouseClickHandler}. */ -final class BetterChatInputHandler { +public final class BetterChatInputHandler { private BetterChatInputHandler() { } - static BetterChatModel.MousePos resolveMouse(double rawX, double rawY) { + public static BetterChatModel.MousePos resolveMouse(double rawX, double rawY) { return new BetterChatModel.MousePos(rawX, rawY, rawX, rawY); } @@ -58,7 +63,7 @@ final class BetterChatInputHandler { return new BetterChatModel.PickResult(bestLine, glyph); } - static boolean onScroll(double delta) { + public static boolean onScroll(double delta) { Minecraft mc = Minecraft.getInstance(); if (!BetterChat.isActive()) return false; if (!(ClientScreen.current() instanceof ChatScreen)) return false; @@ -81,7 +86,7 @@ final class BetterChatInputHandler { return false; } - static void onMouseMove(double mx, double my) { + public static void onMouseMove(double mx, double my) { if (!BetterChat.isActive()) return; BetterChatModel.MousePos mouse = resolveMouse(mx, my); double fx = mouse.fx(); @@ -116,7 +121,7 @@ final class BetterChatInputHandler { BetterChatRenderer.selection.updateCaret(pick.line().messageIndex(), selectionCaretIndex(pick.glyph())); } - static void resetScroll() { + public static void resetScroll() { BetterChatRenderer.scrollOffsetLines = 0; BetterChatRenderer.smoothScrollOffsetLines = 0f; BetterChatRenderer.draggingScrollbar = false; @@ -124,14 +129,14 @@ final class BetterChatInputHandler { BetterChatRenderer.sbDragOffset = 0f; } - static void onNewMessage() { + public static void onNewMessage() { if (BetterChatRenderer.scrollOffsetLines > 0 && BetterChatRenderer.scrollOffsetLines <= 2) { BetterChatRenderer.scrollOffsetLines = 0; BetterChatRenderer.smoothScrollOffsetLines = 0f; } } - static boolean isInteractive(float mx, float my) { + public static boolean isInteractive(float mx, float my) { boolean inChat = BetterChatRenderer.chatHitW > 0f && mx >= BetterChatRenderer.chatHitX && mx <= BetterChatRenderer.chatHitX + BetterChatRenderer.chatHitW && my >= BetterChatRenderer.chatHitY && my <= BetterChatRenderer.chatHitY + BetterChatRenderer.chatHitH; boolean inSearch = BetterChatRenderer.searchHit && mx >= BetterChatRenderer.searchRectX && mx <= BetterChatRenderer.searchRectX + BetterChatRenderer.searchRectW && my >= BetterChatRenderer.searchRectY && my <= BetterChatRenderer.searchRectY + BetterChatRenderer.searchRectH; boolean inInput = BetterChatRenderer.hasInputBox && mx >= BetterChatRenderer.inputBoxX && mx <= BetterChatRenderer.inputBoxX + BetterChatRenderer.inputBoxW && my >= BetterChatRenderer.inputBoxY && my <= BetterChatRenderer.inputBoxY + BetterChatRenderer.inputBoxH; @@ -141,11 +146,11 @@ final class BetterChatInputHandler { return inChat || inSearch || inInput || inSuggest || inContext || inScrollbar; } - static boolean contains(float mx, float my) { + public static boolean contains(float mx, float my) { return isInteractive(mx, my); } - static void updateChatHit() { + public static void updateChatHit() { float hitBottom = BetterChatRenderer.hasInputBox ? BetterChatRenderer.inputBoxY + BetterChatRenderer.inputBoxH : BetterChatRenderer.ctxFixedInputY; BetterChatRenderer.chatHitX = BetterChatRenderer.ctxBaseX; BetterChatRenderer.chatHitY = BetterChatRenderer.frame.y(); @@ -153,7 +158,7 @@ final class BetterChatInputHandler { BetterChatRenderer.chatHitH = Math.max(BetterChatRenderer.ctxBoxHeight, hitBottom - BetterChatRenderer.chatHitY); } - static void clearChatHit() { + public static void clearChatHit() { BetterChatRenderer.chatHitX = BetterChatRenderer.chatHitY = BetterChatRenderer.chatHitW = BetterChatRenderer.chatHitH = 0f; BetterChatRenderer.lastMouseValid = false; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatInputRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatInputRenderer.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatInputRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatInputRenderer.java index ea9ce16..2ee93ce 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatInputRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatInputRenderer.java @@ -4,8 +4,8 @@ * * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; -import dev.loki.lovisual.mixins.accessors.ChatScreenAccessor; +package dev.loki.lovisual.features.gui.chat.input; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenAccessor; import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; @@ -17,13 +17,19 @@ import net.minecraft.client.gui.screens.ChatScreen; import java.util.ArrayList; import java.util.List; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.chat.input.BetterChatEditBoxUtil; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatSearch; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; /** * Input-field rendering: wrapping, caret, selection highlight, char counter and search chip. */ -final class BetterChatInputRenderer { +public final class BetterChatInputRenderer { private BetterChatInputRenderer() { } - static void renderInput(Minecraft mc, float fontSize, float boxW, float x, float inputY) { + public static void renderInput(Minecraft mc, float fontSize, float boxW, float x, float inputY) { if (!(ClientScreen.current() instanceof ChatScreen chatScreen)) return; EditBox field = ((ChatScreenAccessor) chatScreen).getChatField(); if (field == null) return; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMouseClickHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatMouseClickHandler.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMouseClickHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatMouseClickHandler.java index 774b034..7896257 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMouseClickHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/input/BetterChatMouseClickHandler.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.input; import com.mojang.blaze3d.platform.InputConstants; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; @@ -14,16 +14,24 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.util.Mth; import org.lwjgl.glfw.GLFW; +import dev.loki.lovisual.features.gui.chat.input.BetterChatInputHandler; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatContextMenuHandler; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatContextMenuModel; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatSearch; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionState; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; /** * Mouse-button dispatch over the chat surface: scrollbar drag, suggest rows, search icon, * context menu and click/selection logic. Delegates textual actions to {@link BetterChatContextMenuHandler}. */ -final class BetterChatMouseClickHandler { +public final class BetterChatMouseClickHandler { private BetterChatMouseClickHandler() { } - static boolean onMouseButton(double mx, double my, int button, boolean pressed) { + public static boolean onMouseButton(double mx, double my, int button, boolean pressed) { Minecraft mc = Minecraft.getInstance(); if (!BetterChat.isActive()) return false; if (!(ClientScreen.current() instanceof ChatScreen)) return false; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatContextMenuHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatContextMenuHandler.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatContextMenuHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatContextMenuHandler.java index 22aa778..3861a2f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatContextMenuHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatContextMenuHandler.java @@ -4,11 +4,11 @@ * * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.menu; import dev.loki.lovisual.features.command.CommandManager; import dev.loki.lovisual.features.command.CommandPrefix; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; -import dev.loki.lovisual.mixins.accessors.ChatScreenAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenAccessor; import dev.loki.lovisual.util.screen.ClientScreen; import dev.loki.lovisual.util.text.ChatNameUtil; import dev.loki.lovisual.util.text.ClipboardUtil; @@ -22,13 +22,20 @@ import net.minecraft.util.Mth; import net.minecraft.util.Util; import java.util.ArrayList; import java.util.List; +import dev.loki.lovisual.features.gui.chat.input.BetterChatEditBoxUtil; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatContextMenuModel; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatTooltipRenderer; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; /** * Right-click context menu construction, click-event handling and chat prefill actions. */ -final class BetterChatContextMenuHandler { +public final class BetterChatContextMenuHandler { private BetterChatContextMenuHandler() { } - static void openContextMenu(BetterChatModel.PickResult pick, double mx, double my) { + public static void openContextMenu(BetterChatModel.PickResult pick, double mx, double my) { List entries = new ArrayList<>(); ChatLine msg = pick.line().message(); String full = msg.text().getString(); @@ -69,7 +76,7 @@ final class BetterChatContextMenuHandler { } BetterChatRenderer.contextMenu = BetterChatContextMenuModel.ContextMenu.open((float) mx, (float) my, entries); } - static void copySelectionToClipboard() { + public static void copySelectionToClipboard() { String selected = selectedText(); if (selected.isEmpty()) return; ClipboardUtil.copy(selected); @@ -98,7 +105,7 @@ final class BetterChatContextMenuHandler { } return out.toString(); } - static boolean handleClickEvent(net.minecraft.network.chat.Style style, boolean ctrlDown) { + public static boolean handleClickEvent(net.minecraft.network.chat.Style style, boolean ctrlDown) { if (style == null) return false; ClickEvent evt = style.getClickEvent(); if (evt == null) return false; @@ -142,7 +149,7 @@ final class BetterChatContextMenuHandler { return false; } } - static boolean tryPrefillTellFromClick(int msgIndex, int charIndex) { + public static boolean tryPrefillTellFromClick(int msgIndex, int charIndex) { if (msgIndex < 0 || msgIndex >= BetterChatRenderer.lastMessages.size()) return false; String full = BetterChatRenderer.lastMessages.get(msgIndex).text().getString(); List nickCandidates = ChatNameUtil.extractNicks(full); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatContextMenuModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatContextMenuModel.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatContextMenuModel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatContextMenuModel.java index 25fc7d8..31e222e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatContextMenuModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatContextMenuModel.java @@ -5,27 +5,30 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.menu; import java.util.Collections; import java.util.List; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; /** * Right-click context menu record + entry record, extracted from the renderer facade. * Rendering leans on {@link BetterChatDrawUtil} and {@link BetterChatFontUtil}. */ -final class BetterChatContextMenuModel { +public final class BetterChatContextMenuModel { private BetterChatContextMenuModel() { } - record ContextMenu(boolean open, float x, float y, List entries) { + public record ContextMenu(boolean open, float x, float y, List entries) { private static final float MENU_PAD_X = 8f; private static final float MENU_PAD_Y = 7f; private static final float MENU_RADIUS = 9f; - static ContextMenu closed() { + public static ContextMenu closed() { return new ContextMenu(false, 0, 0, Collections.emptyList()); } @@ -37,13 +40,13 @@ final class BetterChatContextMenuModel { return Math.max(20f, fontSize + 7f); } - boolean contains(double mx, double my) { + public boolean contains(double mx, double my) { if (!open) return false; float fontSize = BetterChatRenderer.lastFontSizeForUi * 0.92f; return mx >= x && mx <= x + width(fontSize) && my >= y && my <= y + height(fontSize); } - MenuEntry pick(double my) { + public MenuEntry pick(double my) { if (!open) return null; float fontSize = BetterChatRenderer.lastFontSizeForUi * 0.92f; float itemH = itemHeight(fontSize); @@ -58,7 +61,7 @@ final class BetterChatContextMenuModel { return null; } - void render(float mouseX, float mouseY, float fontSize) { + public void render(float mouseX, float mouseY, float fontSize) { if (!open || entries.isEmpty()) return; float fs = Math.max(12f, fontSize * 0.92f); float itemH = itemHeight(fs); @@ -106,7 +109,7 @@ final class BetterChatContextMenuModel { return MENU_PAD_Y * 2f + entries.size() * itemHeight(fontSize); } - record MenuEntry(String label, Runnable action) { + public record MenuEntry(String label, Runnable action) { } } } \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatTooltipRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatTooltipRenderer.java similarity index 87% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatTooltipRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatTooltipRenderer.java index 5ca52ed..b482d64 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatTooltipRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/menu/BetterChatTooltipRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.menu; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.BetterTooltips; import dev.loki.lovisual.util.text.ChatNameUtil; @@ -25,17 +25,22 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static dev.loki.lovisual.features.gui.chat.ChatHoverUtil.HoverTip; +import static dev.loki.lovisual.features.gui.chat.text.util.ChatHoverUtil.HoverTip; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.chat.input.BetterChatEditBoxUtil; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionState; +import dev.loki.lovisual.features.gui.chat.text.util.ChatHoverUtil; /** * Tooltip capture/render, timestamp formatting and post-pick hover inference. */ -final class BetterChatTooltipRenderer { +public final class BetterChatTooltipRenderer { private BetterChatTooltipRenderer() { } - static String formatTimestamp(long ms, boolean withSeconds) { + public static String formatTimestamp(long ms, boolean withSeconds) { LocalDateTime dt = LocalDateTime.ofInstant(Instant.ofEpochMilli(ms), ZoneId.systemDefault()); DateTimeFormatter fmt = DateTimeFormatter.ofPattern(withSeconds ? "HH:mm:ss" : "HH:mm"); return dt.format(fmt); @@ -46,7 +51,7 @@ final class BetterChatTooltipRenderer { return dt.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")); } - static HoverTip buildTimestampTooltip(long ms, boolean showDate, boolean showUnix) { + public static HoverTip buildTimestampTooltip(long ms, boolean showDate, boolean showUnix) { List lines = new ArrayList<>(); LocalDateTime dt = LocalDateTime.ofInstant(Instant.ofEpochMilli(ms), ZoneId.systemDefault()); if (showDate) { @@ -62,7 +67,7 @@ final class BetterChatTooltipRenderer { return new HoverTip(lines, null, false, net.minecraft.world.item.ItemStack.EMPTY); } - static void captureTooltip(HoverTip tip, float x, float y, GuiGraphicsExtractor ctx) { + public static void captureTooltip(HoverTip tip, float x, float y, GuiGraphicsExtractor ctx) { if (tip == null || ctx == null) return; Minecraft mc = Minecraft.getInstance(); if (mc == null || mc.getWindow() == null) return; @@ -81,7 +86,7 @@ final class BetterChatTooltipRenderer { BetterChatRenderer.tooltipCaptured = true; } - static void renderCapturedTooltip(GuiGraphicsExtractor ctx) { + public static void renderCapturedTooltip(GuiGraphicsExtractor ctx) { if (!BetterChatRenderer.tooltipCaptured) return; BetterTooltips.renderTooltipWithContext(ctx); BetterTooltips.resetTooltipScaleOverride(); @@ -103,7 +108,7 @@ final class BetterChatTooltipRenderer { /** * Mirror of the original post-pick hover/suggest-inference block (lines 466-518). */ - static void resolveHover(BetterChatModel.PickResult hover, Minecraft mc) { + public static void resolveHover(BetterChatModel.PickResult hover, Minecraft mc) { boolean overSuggestWindow = BetterChatSuggestionState.isInsideSuggestWindow( BetterChatRenderer.lastMouseFx, BetterChatRenderer.lastMouseFy, BetterChatRenderer.lastMouseFx, BetterChatRenderer.lastMouseFy); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMessageGrouping.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatMessageGrouping.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMessageGrouping.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatMessageGrouping.java index f2d26fd..3bfa011 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMessageGrouping.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatMessageGrouping.java @@ -5,19 +5,20 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.messages; import net.minecraft.network.chat.Component; import java.util.List; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; -final class BetterChatMessageGrouping { +public final class BetterChatMessageGrouping { private static final String BOX_PREFIXES = "┏┓┗┛┃│║╔╗╚╝╭╮╰╯┌┐└┘┣┫├┤╠╣"; private BetterChatMessageGrouping() { } - static int[] groupIds(List messages) { + public static int[] groupIds(List messages) { if (messages == null || messages.isEmpty()) { return new int[0]; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMessageRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatMessageRenderer.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMessageRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatMessageRenderer.java index e1b8fb9..34ce0d7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatMessageRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatMessageRenderer.java @@ -4,7 +4,7 @@ * * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.messages; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.renderer.Renderer2D; @@ -14,15 +14,23 @@ import net.minecraft.util.Mth; import java.util.List; import static dev.loki.lovisual.render.engine.text.TextGlyphFallback.isSvgFontKey; import static dev.loki.lovisual.features.theme.Theme.theme; -import static dev.loki.lovisual.features.gui.chat.ChatHoverUtil.HoverTip; +import static dev.loki.lovisual.features.gui.chat.text.util.ChatHoverUtil.HoverTip; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatTooltipRenderer; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatFrameModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.BetterChatGlyphRenderer; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; /** * Message-area drawing: glass bubbles, selection rectangles, timestamp overlays and glyph pickup. * Extracted from {@link BetterChatRenderer}; behavior unchanged. */ -final class BetterChatMessageRenderer { +public final class BetterChatMessageRenderer { private BetterChatMessageRenderer() { } - static float fade(float ageSeconds) { + public static float fade(float ageSeconds) { BetterChat cfg = BetterChat.get(); float life = cfg != null ? cfg.fadeSeconds() : 12f; if (life <= 0f) return 0f; @@ -34,7 +42,7 @@ final class BetterChatMessageRenderer { float inv = 1f - t; return inv * inv * inv; } - static float newMessageReveal(ChatLine message) { + public static float newMessageReveal(ChatLine message) { if (message == null) return 1f; float age = message.ageSeconds(); if (age <= 0f) return 0f; @@ -43,7 +51,7 @@ final class BetterChatMessageRenderer { float inv = 1f - t; return 1f - inv * inv * inv; } - static BetterChatModel.PickResult drawPhase() { + public static BetterChatModel.PickResult drawPhase() { BetterChatFrameModel.FrameLayout frame = BetterChatRenderer.frame; boolean activeChatSurface = BetterChatRenderer.ctxActiveSurface; boolean showTs = BetterChatRenderer.ctxShowTs; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSearch.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatSearch.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSearch.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatSearch.java index 6b77503..221a12c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSearch.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatSearch.java @@ -5,13 +5,16 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.messages; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicLong; +import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStore; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; /** * Minimal search state & async search runner for BetterChat, styled like ClickGuiSearch. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatTabHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatTabHandler.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatTabHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatTabHandler.java index 92da8c3..60435f3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatTabHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/messages/BetterChatTabHandler.java @@ -5,12 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.messages; import com.mojang.brigadier.suggestion.Suggestion; import dev.loki.lovisual.features.command.CommandManager; import dev.loki.lovisual.features.command.CommandPrefix; -import dev.loki.lovisual.mixins.accessors.ChatScreenAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenAccessor; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.EditBox; @@ -18,6 +18,9 @@ import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.client.input.KeyEvent; import java.util.List; +import dev.loki.lovisual.features.gui.chat.input.BetterChatEditBoxUtil; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionState; /** * Tab / arrow-key cycling through the custom {@code @}-command suggestion popup. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatModel.java new file mode 100644 index 0000000..e5edd84 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatModel.java @@ -0,0 +1,89 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.gui.chat.model; + +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.Style; + +import java.util.List; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatContextMenuModel; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatFrameModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; + +/** + * Shared package-private records extracted from {@link BetterChatRenderer}. + * The only public-facing record kept nested on the facade is {@link BetterChatRenderer.Layout}. + * Records that own non-trivial rendering logic ({@code FrameLayout}, {@code ContextMenu}) live in + * their own files ({@link BetterChatFrameModel}, {@link BetterChatContextMenuModel}). + */ +public final class BetterChatModel { + private BetterChatModel() { + } + + public record MousePos(double rawX, double rawY, double fx, double fy) { + } + + public record InputLine(int start, int end, float width) { + } + + public record Segment(String text, Style style) { + } + + public record VisualLine(ChatLine message, int messageIndex, int messageGroup, int startChar, int endChar, List glyphs) { + } + + public record Glyph( + float x0, + float x1, + int charIndex, + int charEndExclusive, + int color, + HoverEvent hover, + String font, + String text, + Style style + ) { + } + + public record GlyphBox( + float x0, + float y0, + float x1, + float y1, + int charIndex, + int charEndExclusive, + int color, + String font, + HoverEvent hover, + String text, + Style style + ) { + } + + public record CachedLine(int startChar, int endChar, List glyphs) { + } + + public record CachedMessageLayout(float fontSize, float maxWidth, List lines) { + } + + public record FrameLine(ChatLine message, int messageIndex, int messageGroup, float y0, float y1, List glyphs) { + } + + public record MessageBubble(ChatLine message, int messageGroup, float x, float y, float w, float h, FrameLine firstLine, FrameLine lastLine) { + } + + public record MessageClipBounds(float x, float y, float w, float h) { + } + + public record PickResult(FrameLine line, GlyphBox glyph) { + } + + public record LayoutResult(List lines, int messagesSeen) { + } +} \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatStore.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatStore.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatStore.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatStore.java index 46056e3..b3a0ff6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatStore.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatStore.java @@ -5,13 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.model; import net.minecraft.network.chat.Component; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; import java.util.ArrayList; import java.util.List; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; public final class BetterChatStore { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatStoreManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatStoreManager.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatStoreManager.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatStoreManager.java index 01d2441..4d5e6df 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatStoreManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/BetterChatStoreManager.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.model; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -30,6 +30,10 @@ import java.io.FileWriter; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.CompletableFuture; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStore; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatHoverCache; /** * Per-world chat storage + async Gson persistence. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/ChatLine.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/ChatLine.java similarity index 87% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/ChatLine.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/ChatLine.java index 6fb6070..03892f8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/ChatLine.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/model/ChatLine.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.model; import net.minecraft.network.chat.Component; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFrameModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatFrameModel.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFrameModel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatFrameModel.java index 46a7c65..be51203 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFrameModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatFrameModel.java @@ -5,28 +5,30 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.render; import net.minecraft.util.Mth; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; /** * Frame layout record: builds screen-space line/bubble geometry from laid-out visual lines. * Pure geometry + picking, no rendering or font work. */ -final class BetterChatFrameModel { +public final class BetterChatFrameModel { private BetterChatFrameModel() { } - record FrameLayout(float x, float y, float w, float h, List lines, List bubbles) { + public record FrameLayout(float x, float y, float w, float h, List lines, List bubbles) { static FrameLayout empty() { return new FrameLayout(0, 0, 0, 0, Collections.emptyList(), Collections.emptyList()); } - static FrameLayout build(List lines, float x, float y, float w, float h, float fontSize, float lineHeight, float yOffset, float timestampReserve) { + public static FrameLayout build(List lines, float x, float y, float w, float h, float fontSize, float lineHeight, float yOffset, float timestampReserve) { List list = new ArrayList<>(lines.size()); float cursorY = y + BetterChatRenderer.MESSAGE_PAD_Y + yOffset; int lastMessageGroup = Integer.MIN_VALUE; @@ -90,7 +92,7 @@ final class BetterChatFrameModel { return bubbles; } - BetterChatModel.MessageClipBounds messageClipBounds() { + public BetterChatModel.MessageClipBounds messageClipBounds() { if (lines.isEmpty() || h <= 0f) return null; float clipX = x + BetterChatRenderer.PADDING; float clipW = Math.max(1f, w - BetterChatRenderer.PADDING * 2f); @@ -101,7 +103,7 @@ final class BetterChatFrameModel { return mx >= x && mx <= x + w && my >= y && my <= y + h; } - BetterChatModel.PickResult pick(double mx, double my) { + public BetterChatModel.PickResult pick(double mx, double my) { if (!contains(mx, my)) return null; for (BetterChatModel.FrameLine line : lines) { if (my < line.y0() || my > line.y1() + BetterChatRenderer.LINE_SPACING) continue; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFrameRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatFrameRenderer.java similarity index 80% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFrameRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatFrameRenderer.java index c5efb67..da1015b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFrameRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatFrameRenderer.java @@ -5,18 +5,30 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.render; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.SystemCursor; import net.minecraft.client.gui.GuiGraphicsExtractor; +import dev.loki.lovisual.features.gui.chat.BetterChatViewport; +import dev.loki.lovisual.features.gui.chat.input.BetterChatInputHandler; +import dev.loki.lovisual.features.gui.chat.input.BetterChatInputRenderer; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatTooltipRenderer; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatMessageRenderer; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatSearch; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionState; +import dev.loki.lovisual.features.gui.chat.text.BetterChatLayoutEngine; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; /** * Single entry point for the chat HUD render pass; orchestrates the layout, message, input, * suggestion, scrollbar and tooltip phases. All real work lives in the other package-private helpers. */ -final class BetterChatFrameRenderer { +public final class BetterChatFrameRenderer { private BetterChatFrameRenderer() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatRenderer.java new file mode 100644 index 0000000..3440cd8 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/render/BetterChatRenderer.java @@ -0,0 +1,224 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.gui.chat.render; + +import com.mojang.brigadier.suggestion.Suggestion; +import dev.loki.lovisual.features.command.CommandOutput; +import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; +import dev.loki.lovisual.render.engine.color.RenderColor; +import dev.loki.lovisual.render.engine.renderer.Renderer2D; +import dev.loki.lovisual.render.engine.text.TextRenderer; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.ChatScreen; +import net.minecraft.network.chat.Style; +import net.minecraft.util.Mth; + +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.List; + +import dev.loki.lovisual.util.text.TextSelection; +import dev.loki.lovisual.features.gui.chat.input.BetterChatInputHandler; +import dev.loki.lovisual.features.gui.chat.input.BetterChatMouseClickHandler; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatContextMenuHandler; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatContextMenuModel; +import dev.loki.lovisual.features.gui.chat.menu.BetterChatTooltipRenderer; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStore; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatFrameModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatFrameRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.CommandSuggestorBridge; +import dev.loki.lovisual.features.gui.chat.text.BetterChatLayoutEngine; +import dev.loki.lovisual.features.gui.chat.text.util.ChatHoverUtil; + +/** + * Facade for the BetterChat HUD renderer. This enum singleton is now a thin delegation point: + * it owns the shared per-frame state and constants read/written by the package-private helpers, + * and re-exports the original public API exactly as before so no caller changes. + */ +public enum BetterChatRenderer { + ; + + // ---- Constants (package-private; read by helpers) ---- + public static final int MAX_MESSAGE_CHARS = 256; + public static final float PADDING = 8f; + public static final float LINE_SPACING = 3f; + public static final float RADIUS = 24f; + public static final float MESSAGE_PAD_X = 8f; + public static final float MESSAGE_PAD_Y = 5f; + public static final float MESSAGE_GAP = 4f; + public static final float MESSAGE_INPUT_GAP = 8f; + public static final float MESSAGE_RADIUS = 9f; + public static final float MESSAGE_TS_GAP = 8f; + public static final float INPUT_RADIUS = 12f; + public static final float SEARCH_ICON_WIDTH = 34f; + public static final float SEARCH_ICON_HEIGHT = 22f; + public static final float NEW_MESSAGE_REVEAL_SECONDS = 0.34f; + public static final float NEW_MESSAGE_SLIDE_PX = 18f; + public static final int MAX_HISTORY = 32000; + public static final float CHAT_TOOLTIP_OFFSET_X = 6f; + public static final float CHAT_TOOLTIP_OFFSET_Y = 12f; + public static final double DRAG_SELECT_THRESHOLD = 4.0; + public static final RenderColor TMP_COLOR = new RenderColor(0xFFFFFFFF); + + // ---- Layout caches (package-private) ---- + public static final IdentityHashMap MESSAGE_LAYOUT_CACHE = new IdentityHashMap<>(); + public static final IdentityHashMap> SEGMENT_CACHE = new IdentityHashMap<>(); + public static final IdentityHashMap COMMAND_LINE_CACHE = new IdentityHashMap<>(); + public static final TextSelection selection = new TextSelection(); + + // ---- Persistent UI state (package-private) ---- + public static Renderer2D renderer; + public static float lastRenderWidth = 0f; + public static float lastRenderHeight = 0f; + public static int scrollOffsetLines = 0; + public static float smoothScrollOffsetLines = 0f; + public static int maxScrollLines = 0; + public static float lastFontSizeForUi = 16f; + public static List lastMessages = Collections.emptyList(); + public static boolean draggingScrollbar = false; + public static float sbTrackX, sbTrackY, sbTrackW, sbTrackH; + public static float sbThumbY, sbThumbH; + public static float sbDragOffset = 0f; + public static long lastScrollInteractionMs = 0L; + public static boolean sbEnabled = false; + public static int sbTotalLines = 0; + public static int sbVisibleLines = 0; + public static float inputBoxX = 0f, inputBoxY = 0f, inputBoxW = 0f, inputBoxH = 0f; + public static boolean hasInputBox = false; + public static boolean suggestActive = false; + public static float suggestX, suggestY, suggestW, suggestH, suggestItemH; + public static float suggestRowsX, suggestRowsY, suggestRowsW, suggestRowsH; + public static int suggestStart, suggestVisible, suggestTotal; + public static net.minecraft.client.gui.components.CommandSuggestions.SuggestionsList suggestWindow; + public static List suggestEntries = Collections.emptyList(); + public static boolean lastHoverWasOutsideSuggest = true; + public static boolean suggestHasScrollbar = false; + public static boolean suggestDraggingScrollbar = false; + public static float suggestTrackX, suggestTrackY, suggestTrackW, suggestTrackH, suggestThumbH; + public static int suggestCurrentStart = -1; + public static int suggestCurrentSelection = -1; + public static double lastMouseFx = 0.0; + public static double lastMouseFy = 0.0; + public static boolean lastMouseValid = false; + public static boolean tooltipCaptured = false; + public static String lastSuggestInput = ""; + public static int lastSuggestCursor = -1; + public static int lastSuggestSelStart = -1; + public static int lastSuggestSelEnd = -1; + public static CommandSuggestorBridge.SuggestionSnapshot lastSnapshot = null; + public static long debugPerfWindowStartNs = 0L; + public static long debugPerfAccumLayoutNs = 0L; + public static long debugPerfAccumBuildNs = 0L; + public static int debugPerfAccumFrames = 0; + public static BetterChatFrameModel.FrameLayout frame = BetterChatFrameModel.FrameLayout.empty(); + public static BetterChatContextMenuModel.ContextMenu contextMenu = BetterChatContextMenuModel.ContextMenu.closed(); + public static boolean selecting = false; + public static boolean searchHit = false; + public static float searchRectX = 0f, searchRectY = 0f, searchRectW = 0f, searchRectH = 0f; + public static boolean searchHotkeyDown = false; + public static float chatHitX = 0f, chatHitY = 0f, chatHitW = 0f, chatHitH = 0f; + public static String hoverEntityUuid = null; + public static ChatScreen storedScreen; + public static BetterChatStore previewStore; + public static int lastSuggestionHash = 0; + public static boolean leftPending = false; + public static double leftDownFx = 0.0, leftDownFy = 0.0; + public static int leftDownMsgIndex = -1; + public static int leftDownCharIndex = -1; + public static Style leftDownStyle = null; + + // ---- Per-frame transient context (package-private; populated by the phased helpers) ---- + public static GuiGraphicsExtractor ctxGui; + public static float ctxBaseX, ctxBaseY; + public static BetterChat ctxSettings; + public static net.minecraft.client.Minecraft ctxMc; + public static boolean ctxPreview, ctxChatOpen, ctxActiveSurface; + public static boolean ctxShowTs, ctxHasSeconds, ctxTipDate, ctxTipUnix, ctxAutoFollow; + public static int ctxTsColor, ctxTotalMessages, ctxVisibleLimit, ctxMessagesSeen; + public static float ctxWidth, ctxContentWidth, ctxTsWidth; + public static float ctxLineHeight, ctxBoxHeight, ctxLineYOffset, ctxTargetVisible; + public static float ctxStableBoxHeight, ctxFixedInputY, ctxFrameY; + public static int[] ctxMessageGroups; + public static List ctxAllLines; + public static List ctxVisible; + public static long ctxPerfT0, ctxPerfT1; + public static ChatHoverUtil.HoverTip ctxHoverTip; + + // ---- Public API (delegating) ---- + + public static void markLayoutDirty() { + BetterChatLayoutEngine.markLayoutDirty(); + } + + public static void renderEngine(Renderer2D rendererIn, + TextRenderer fallback, + GuiGraphicsExtractor ctx, + int screenW, + float baseX, + float baseY) { + BetterChatFrameRenderer.renderEngine(rendererIn, fallback, ctx, screenW, baseX, baseY); + } + + public static void renderCapturedTooltip(GuiGraphicsExtractor ctx) { + BetterChatTooltipRenderer.renderCapturedTooltip(ctx); + } + + public static boolean onScroll(double delta) { + return BetterChatInputHandler.onScroll(delta); + } + + public static boolean onMouseButton(double mx, double my, int button, boolean pressed) { + return BetterChatMouseClickHandler.onMouseButton(mx, my, button, pressed); + } + + public static void onMouseMove(double mx, double my) { + BetterChatInputHandler.onMouseMove(mx, my); + } + + public static void copySelectionToClipboard() { + BetterChatContextMenuHandler.copySelectionToClipboard(); + } + + public static void resetScroll() { + BetterChatInputHandler.resetScroll(); + } + + public static void applyAutoPrefixIfNeeded(EditBox field) { + // Compact BetterChat no longer owns chat-prefix chips; hook kept for compatibility. + } + + public static void setSuggestionContext(ChatScreen screen, GuiGraphicsExtractor context, int mouseX, int mouseY) { + storedScreen = screen; + } + + public static void onNewMessage() { + BetterChatInputHandler.onNewMessage(); + } + + public static float getLastWidth() { + return lastRenderWidth; + } + + public static float getLastHeight() { + return lastRenderHeight; + } + + public static boolean contains(float mx, float my) { + return BetterChatInputHandler.contains(mx, my); + } + + public static boolean isInteractive(float mx, float my) { + return BetterChatInputHandler.isInteractive(mx, my); + } + + public record Layout(float x, float y) { + } +} \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatCommandMerge.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatCommandMerge.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatCommandMerge.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatCommandMerge.java index b5c600b..27e04d2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatCommandMerge.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatCommandMerge.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.suggestions; import dev.loki.lovisual.features.command.CommandOutput; @@ -13,16 +13,18 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.IdentityHashMap; import java.util.List; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; /** * Merges command-output lines into the visible chat tail, sharing the identity-keyed * command-line cache held on {@link BetterChatRenderer}. */ -final class BetterChatCommandMerge { +public final class BetterChatCommandMerge { private BetterChatCommandMerge() { } - static List mergeCommandOutput(List storeLines, + public static List mergeCommandOutput(List storeLines, List commandLines, int needed) { if (commandLines == null || commandLines.isEmpty()) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSuggestionRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatSuggestionRenderer.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSuggestionRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatSuggestionRenderer.java index 2be46b9..3d2781a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSuggestionRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatSuggestionRenderer.java @@ -4,22 +4,28 @@ * * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.suggestions; import dev.loki.lovisual.features.command.CommandPrefix; -import dev.loki.lovisual.mixins.accessors.ChatScreenAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenAccessor; import dev.loki.lovisual.render.helpers.SystemCursor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.EditBox; import net.minecraft.util.Mth; import java.util.List; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.chat.input.BetterChatEditBoxUtil; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionState; +import dev.loki.lovisual.features.gui.chat.suggestions.CommandSuggestorBridge; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; /** * Draws the autocomplete suggestion popup above the input field each frame. */ -final class BetterChatSuggestionRenderer { +public final class BetterChatSuggestionRenderer { private BetterChatSuggestionRenderer() { } - static void renderSuggestions() { + public static void renderSuggestions() { BetterChatRenderer.suggestActive = false; BetterChatRenderer.suggestHasScrollbar = false; if (BetterChatRenderer.storedScreen == null) return; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSuggestionState.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatSuggestionState.java similarity index 84% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSuggestionState.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatSuggestionState.java index da258cd..48b7ecc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSuggestionState.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/BetterChatSuggestionState.java @@ -5,12 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.suggestions; import dev.loki.lovisual.features.command.CommandManager; import dev.loki.lovisual.features.command.CommandPrefix; -import dev.loki.lovisual.mixins.accessors.ChatScreenAccessor; -import dev.loki.lovisual.mixins.accessors.SuggestionWindowAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenAccessor; +import dev.loki.lovisual.mixins.accessors.chat.SuggestionWindowAccessor; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.EditBox; @@ -24,36 +24,41 @@ import java.util.List; import static org.lwjgl.glfw.GLFW.GLFW_PRESS; import static org.lwjgl.glfw.GLFW.glfwGetKey; +import dev.loki.lovisual.features.gui.chat.input.BetterChatEditBoxUtil; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatSearch; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.CommandSuggestorBridge; /** * Autocomplete suggestion window state: hotkey, snapshot capture, window dragging and hit-test. * Rendering lives in {@link BetterChatSuggestionRenderer}. */ -final class BetterChatSuggestionState { +public final class BetterChatSuggestionState { private BetterChatSuggestionState() { } - static boolean isInsideSuggestRows(double mx, double my) { + public static boolean isInsideSuggestRows(double mx, double my) { if (!BetterChatRenderer.suggestActive) return false; return mx >= BetterChatRenderer.suggestRowsX && mx <= BetterChatRenderer.suggestRowsX + BetterChatRenderer.suggestRowsW && my >= BetterChatRenderer.suggestRowsY && my <= BetterChatRenderer.suggestRowsY + BetterChatRenderer.suggestRowsH; } - static boolean isInsideSuggestRows(double mx, double my, double rawX, double rawY) { + public static boolean isInsideSuggestRows(double mx, double my, double rawX, double rawY) { return isInsideSuggestRows(mx, my) || isInsideSuggestRows(rawX, rawY); } - static boolean isInsideSuggestWindow(double mx, double my) { + public static boolean isInsideSuggestWindow(double mx, double my) { if (!BetterChatRenderer.suggestActive) return false; return mx >= BetterChatRenderer.suggestX && mx <= BetterChatRenderer.suggestX + BetterChatRenderer.suggestW && my >= BetterChatRenderer.suggestY && my <= BetterChatRenderer.suggestY + BetterChatRenderer.suggestH; } - static boolean isInsideSuggestWindow(double mx, double my, double rawX, double rawY) { + public static boolean isInsideSuggestWindow(double mx, double my, double rawX, double rawY) { return isInsideSuggestWindow(mx, my) || isInsideSuggestWindow(rawX, rawY); } - static boolean isInsideSuggestScrollbar(double mx, double my) { + public static boolean isInsideSuggestScrollbar(double mx, double my) { if (!BetterChatRenderer.suggestActive || !BetterChatRenderer.suggestHasScrollbar) return false; float hitPad = 4f; return mx >= BetterChatRenderer.suggestTrackX - hitPad && @@ -62,7 +67,7 @@ final class BetterChatSuggestionState { my <= BetterChatRenderer.suggestTrackY + BetterChatRenderer.suggestTrackH + hitPad; } - static void resetSuggestionTracking() { + public static void resetSuggestionTracking() { BetterChatRenderer.lastSuggestInput = ""; BetterChatRenderer.lastSuggestCursor = -1; BetterChatRenderer.lastSuggestSelStart = -1; @@ -76,7 +81,7 @@ final class BetterChatSuggestionState { BetterChatRenderer.suggestCurrentSelection = -1; } - static char commandPrefix(String text) { + public static char commandPrefix(String text) { if (text == null) return 0; for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); @@ -101,7 +106,7 @@ final class BetterChatSuggestionState { return true; } - static void applySuggestionWindowState(int start, int selection) { + public static void applySuggestionWindowState(int start, int selection) { if (BetterChatRenderer.suggestWindow == null) return; SuggestionWindowAccessor acc = (SuggestionWindowAccessor) BetterChatRenderer.suggestWindow; acc.setLoVisual$inWindowIndex(Math.max(0, start)); @@ -110,7 +115,7 @@ final class BetterChatSuggestionState { } } - static void applySuggestion(int idx) { + public static void applySuggestion(int idx) { Minecraft mc = Minecraft.getInstance(); if (!(ClientScreen.current() instanceof ChatScreen chatScreen)) return; EditBox field = ((ChatScreenAccessor) chatScreen).getChatField(); @@ -134,7 +139,7 @@ final class BetterChatSuggestionState { } } - static void scrollSuggestToPosition(double my) { + public static void scrollSuggestToPosition(double my) { if (!BetterChatRenderer.suggestHasScrollbar || BetterChatRenderer.suggestVisible <= 0 || BetterChatRenderer.suggestTotal <= BetterChatRenderer.suggestVisible) return; float trackSpan = BetterChatRenderer.suggestTrackH - BetterChatRenderer.suggestThumbH; @@ -160,7 +165,7 @@ final class BetterChatSuggestionState { return new CommandSuggestorBridge.SuggestionSnapshot(0, 0, 0, 0, texts, suggestions, selection, start, visible); } - static void updateSearchHotkey(Minecraft mc, boolean chatOpen) { + public static void updateSearchHotkey(Minecraft mc, boolean chatOpen) { if (!chatOpen || mc == null || mc.getWindow() == null) { BetterChatRenderer.searchHotkeyDown = false; return; @@ -177,7 +182,7 @@ final class BetterChatSuggestionState { BetterChatRenderer.searchHotkeyDown = down; } - static void toggleSearchMode() { + public static void toggleSearchMode() { if (BetterChatSearch.isActive() || BetterChatSearch.hasQuery()) { BetterChatSearch.deactivate(); } else { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/CommandSuggestorBridge.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/CommandSuggestorBridge.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/CommandSuggestorBridge.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/CommandSuggestorBridge.java index c60a4a8..b3582e9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/CommandSuggestorBridge.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/suggestions/CommandSuggestorBridge.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.suggestions; import com.mojang.brigadier.context.StringRange; import com.mojang.brigadier.suggestion.Suggestion; @@ -16,15 +16,16 @@ import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.renderer.Rect2i; -import dev.loki.lovisual.mixins.accessors.ChatInputSuggestorAccessor; -import dev.loki.lovisual.mixins.accessors.ChatScreenAccessor; -import dev.loki.lovisual.mixins.accessors.ChatScreenSuggestorAccessor; -import dev.loki.lovisual.mixins.accessors.SuggestionWindowAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatInputSuggestorAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenSuggestorAccessor; +import dev.loki.lovisual.mixins.accessors.chat.SuggestionWindowAccessor; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; +import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; /** * Reflection helpers for vanilla ChatInputSuggestor; lets us draw suggestions in custom style. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatGlyphRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatGlyphRenderer.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatGlyphRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatGlyphRenderer.java index 5dba051..4678a92 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatGlyphRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatGlyphRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text; import dev.loki.lovisual.features.command.CommandOutput; import dev.loki.lovisual.render.engine.svg.SvgRenderOptions; @@ -15,15 +15,20 @@ import dev.loki.lovisual.util.time.GameClock; import net.minecraft.network.chat.Component; import java.util.List; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatMessageRenderer; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; /** * Glyph + command-prefix gradient rendering for laid-out frame lines. */ -final class BetterChatGlyphRenderer { +public final class BetterChatGlyphRenderer { private BetterChatGlyphRenderer() { } - static void renderGlyphs(List lines, float fontSize, float lineHeight, boolean activeChatSurface) { + public static void renderGlyphs(List lines, float fontSize, float lineHeight, boolean activeChatSurface) { if (lines == null || lines.isEmpty()) return; float scale = BetterChatFontUtil.scaleForSize(fontSize); TextRenderer current = null; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatLayoutEngine.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatLayoutEngine.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatLayoutEngine.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatLayoutEngine.java index 43a0af4..4f85067 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatLayoutEngine.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatLayoutEngine.java @@ -4,7 +4,7 @@ * * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text; import dev.loki.lovisual.features.command.CommandOutput; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; @@ -17,10 +17,22 @@ import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import java.util.Collections; import java.util.List; -final class BetterChatLayoutEngine { +import dev.loki.lovisual.features.gui.chat.menu.BetterChatContextMenuModel; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatMessageGrouping; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatSearch; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStore; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStoreManager; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatCommandMerge; +import dev.loki.lovisual.features.gui.chat.suggestions.BetterChatSuggestionState; +import dev.loki.lovisual.features.gui.chat.text.BetterChatLineLayout; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; +public final class BetterChatLayoutEngine { private BetterChatLayoutEngine() { } - static void markLayoutDirty() { + public static void markLayoutDirty() { } static BetterChatModel.LayoutResult layoutLinesTailCached(List messages, int[] messageGroups, float fontSize, float maxWidth, int maxLines) { if (messages.isEmpty()) return new BetterChatModel.LayoutResult(Collections.emptyList(), 0); @@ -57,7 +69,7 @@ final class BetterChatLayoutEngine { /** * @return false when there is nothing to render this frame (caller must bail before draw phase). */ - static boolean prepareFrame(GuiGraphicsExtractor ctx, int screenW, float baseX, float baseY) { + public static boolean prepareFrame(GuiGraphicsExtractor ctx, int screenW, float baseX, float baseY) { BetterChatRenderer.ctxGui = ctx; BetterChatRenderer.ctxBaseX = baseX; BetterChatRenderer.ctxBaseY = baseY; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatLineLayout.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatLineLayout.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatLineLayout.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatLineLayout.java index 927053f..4e7b937 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatLineLayout.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatLineLayout.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.Style; @@ -17,12 +17,17 @@ import dev.loki.lovisual.render.engine.text.TextGlyphFallback; import dev.loki.lovisual.render.engine.text.TextRenderer; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.model.ChatLine; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.BetterChatSegmentUtil; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatFontUtil; /** * Builds per-message wrapped glyph lines (cached on identity maps held by the facade). * Extracted from {@link BetterChatRenderer}; behavior unchanged. */ -final class BetterChatLineLayout { +public final class BetterChatLineLayout { private BetterChatLineLayout() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSegmentUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatSegmentUtil.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSegmentUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatSegmentUtil.java index 9068c02..9fb787c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatSegmentUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/BetterChatSegmentUtil.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; @@ -20,11 +20,14 @@ import java.util.List; import java.util.Optional; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.chat.model.BetterChatModel; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStoreManager; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatHoverCache; /** * Segment flattening and per-segment color resolution for the chat line layout. */ -final class BetterChatSegmentUtil { +public final class BetterChatSegmentUtil { private BetterChatSegmentUtil() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatDrawUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatDrawUtil.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatDrawUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatDrawUtil.java index 9b61c0e..89fb2dc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatDrawUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatDrawUtil.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text.util; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.SettingsGuiPalette; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; @@ -15,31 +15,32 @@ import dev.loki.lovisual.render.helpers.SystemCursor; import net.minecraft.util.Mth; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; /** * Low-level draw primitives + color helpers shared by the chat renderer helpers. */ -final class BetterChatDrawUtil { +public final class BetterChatDrawUtil { private BetterChatDrawUtil() { } - static int withAlpha(int argb, int alpha) { + public static int withAlpha(int argb, int alpha) { return (argb & 0x00FFFFFF) | ((alpha & 0xFF) << 24); } - static int mulAlpha(int argb, float a) { + public static int mulAlpha(int argb, float a) { int alpha = (int) (((argb >>> 24) & 0xFF) * a); return (argb & 0x00FFFFFF) | (Mth.clamp(alpha, 0, 255) << 24); } - static void applyColor(int argb) { + public static void applyColor(int argb) { BetterChatRenderer.TMP_COLOR.a = (argb >>> 24) & 0xFF; BetterChatRenderer.TMP_COLOR.r = (argb >>> 16) & 0xFF; BetterChatRenderer.TMP_COLOR.g = (argb >>> 8) & 0xFF; BetterChatRenderer.TMP_COLOR.b = argb & 0xFF; } - static void drawRoundedRect(float x, float y, float w, float h, float radius, int argb) { + public static void drawRoundedRect(float x, float y, float w, float h, float radius, int argb) { if (BetterChatRenderer.renderer == null) return; if (((argb >>> 24) & 0xFF) <= 0) return; BetterChat cfg = BetterChat.get(); @@ -47,7 +48,7 @@ final class BetterChatDrawUtil { HudRenderUtil.drawHudBackground(BetterChatRenderer.renderer, x, y, w, h, radius, 1.1f, argb, useGradient); } - static void drawRoundedRectStrokeGradient(float x, float y, float w, float h, float radius, float thickness, + public static void drawRoundedRectStrokeGradient(float x, float y, float w, float h, float radius, float thickness, int startArgb, int endArgb) { if (BetterChatRenderer.renderer == null) return; if (((startArgb >>> 24) & 0xFF) <= 0 && ((endArgb >>> 24) & 0xFF) <= 0) return; @@ -69,7 +70,7 @@ final class BetterChatDrawUtil { } } - static void drawGlassPill(float x, float y, float w, float h, float radius, float alpha, boolean softPanel) { + public static void drawGlassPill(float x, float y, float w, float h, float radius, float alpha, boolean softPanel) { if (BetterChatRenderer.renderer == null || w <= 0f || h <= 0f) return; BetterChat settings = BetterChat.get(); float drawAlpha = Mth.clamp(alpha, 0.0f, 1.0f); @@ -107,7 +108,7 @@ final class BetterChatDrawUtil { } } - static void drawLiquidHoverPill(float x, float y, float w, float h, float radius, float alpha) { + public static void drawLiquidHoverPill(float x, float y, float w, float h, float radius, float alpha) { if (BetterChatRenderer.renderer == null || w <= 0f || h <= 0f || alpha <= 0.001f) return; flushRenderer(); BetterChatRenderer.renderer.liquidGlassRect( @@ -130,7 +131,7 @@ final class BetterChatDrawUtil { withAlpha(theme().accent(), 0x34)); } - static void drawScrollbarGlass(float trackX, float trackY, float trackW, float trackH, + public static void drawScrollbarGlass(float trackX, float trackY, float trackW, float trackH, float thumbY, float thumbH, boolean hot, int trackAlpha, int thumbAlpha) { if (BetterChatRenderer.renderer == null || trackW <= 0f || trackH <= 0f || thumbH <= 0f) return; SettingsGuiPalette palette = SettingsGuiPalette.current(); @@ -143,7 +144,7 @@ final class BetterChatDrawUtil { BetterChatRenderer.renderer.roundedRectGradientQuad(trackX, thumbY, trackW, thumbH, radius, 1.0f, handleA, handleB, handleB, handleA); } - static void renderScrollbar(float boxX, float boxY, float boxW, float boxH, + public static void renderScrollbar(float boxX, float boxY, float boxW, float boxH, int startLine, int visibleLines, int totalLines, double mouseX, double mouseY) { if (visibleLines <= 0 || totalLines <= visibleLines) { BetterChatRenderer.sbEnabled = false; @@ -177,7 +178,7 @@ final class BetterChatDrawUtil { drawScrollbarGlass(trackX, trackY, trackW, trackH, thumbY, thumbH, hot, trackAlpha, thumbAlpha); } - static boolean isScrollbarHovered(double mx, double my) { + public static boolean isScrollbarHovered(double mx, double my) { float hitPad = 5f; return BetterChatRenderer.sbEnabled && mx >= BetterChatRenderer.sbTrackX - hitPad && @@ -186,7 +187,7 @@ final class BetterChatDrawUtil { my <= BetterChatRenderer.sbTrackY + BetterChatRenderer.sbTrackH + hitPad; } - static void scrollToPosition(double my) { + public static void scrollToPosition(double my) { if (!BetterChatRenderer.sbEnabled || BetterChatRenderer.sbVisibleLines <= 0 || BetterChatRenderer.sbTotalLines <= BetterChatRenderer.sbVisibleLines) return; float trackSpan = BetterChatRenderer.sbTrackH - BetterChatRenderer.sbThumbH; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFontUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatFontUtil.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFontUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatFontUtil.java index 15c8071..d33d790 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatFontUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatFontUtil.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text.util; import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; @@ -14,20 +14,22 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.engine.text.VanillaTextRenderer; import net.minecraft.network.chat.Style; import net.minecraft.util.Mth; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatDrawUtil; /** * Font resolution, glyph sizing and plain-text draw helpers for the chat renderer. * All public-facing metrics share the renderer singleton held on {@link BetterChatRenderer}. */ -final class BetterChatFontUtil { +public final class BetterChatFontUtil { private BetterChatFontUtil() { } - static TextRenderer getInterRegular() { + public static TextRenderer getInterRegular() { return Fonts.renderer("Inter", FontInfo.Type.Regular, TextRenderer.get()); } - static TextRenderer getIosevkaRegular() { + public static TextRenderer getIosevkaRegular() { return Fonts.renderer("Iosevka", FontInfo.Type.Regular, TextRenderer.get()); } @@ -43,7 +45,7 @@ final class BetterChatFontUtil { return Fonts.renderer("Iosevka", FontInfo.Type.BoldItalic, getIosevkaBold()); } - static TextRenderer fontRenderer(String key) { + public static TextRenderer fontRenderer(String key) { if (key == null) return getIosevkaRegular(); return switch (key) { case "iosevka_bold" -> getIosevkaBold(); @@ -59,12 +61,12 @@ final class BetterChatFontUtil { return TextGlyphFallback.rendererForGlyph(preferred, codePoint); } - static String fontForGlyph(String baseFont, int codePoint) { + public static String fontForGlyph(String baseFont, int codePoint) { TextRenderer preferred = fontRenderer(baseFont); return TextGlyphFallback.fontKeyForGlyph(baseFont, preferred, codePoint, "iosevka_medium"); } - static String fontForStyle(Style style) { + public static String fontForStyle(Style style) { boolean bold = style.isBold(); boolean italic = style.isItalic(); if (bold && italic) return "iosevka_bold_italic"; @@ -73,15 +75,15 @@ final class BetterChatFontUtil { return "iosevka_medium"; } - static float scaleForSize(float size) { + public static float scaleForSize(float size) { return size / 18.0f; } - static float svgGlyphSize(TextRenderer tr, float size, boolean shadow) { + public static float svgGlyphSize(TextRenderer tr, float size, boolean shadow) { return Math.max(1.0f, textHeight(tr, size)) * 0.92f; } - static float textHeight(TextRenderer tr, float size) { + public static float textHeight(TextRenderer tr, float size) { if (tr == null) return 0f; float scale = scaleForSize(size); tr.begin(scale, true, false); @@ -92,7 +94,7 @@ final class BetterChatFontUtil { } } - static float textWidth(TextRenderer tr, String text, float size) { + public static float textWidth(TextRenderer tr, String text, float size) { if (tr == null || text == null || text.isEmpty()) return 0f; float scale = scaleForSize(size); float svgAdvance = svgGlyphSize(tr, size, false); @@ -126,7 +128,7 @@ final class BetterChatFontUtil { } } - static void drawText(TextRenderer tr, String text, float x, float y, float size, int argb, boolean shadow) { + public static void drawText(TextRenderer tr, String text, float x, float y, float size, int argb, boolean shadow) { if (tr == null || text == null || text.isEmpty()) return; if (((argb >>> 24) & 0xFF) <= 0) return; float scale = scaleForSize(size); @@ -167,7 +169,7 @@ final class BetterChatFontUtil { } } - static String fitText(TextRenderer font, String text, float size, float maxWidth) { + public static String fitText(TextRenderer font, String text, float size, float maxWidth) { if (text == null) return ""; if (textWidth(font, text, size) <= maxWidth) return text; String suffix = "..."; @@ -179,7 +181,7 @@ final class BetterChatFontUtil { return end <= 0 ? suffix : text.substring(0, end) + suffix; } - static String safeSub(String s, int start, int end) { + public static String safeSub(String s, int start, int end) { if (s == null) return ""; int len = s.length(); start = Math.max(0, Math.min(len, start)); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatHoverCache.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatHoverCache.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatHoverCache.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatHoverCache.java index 981111e..a80e086 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/BetterChatHoverCache.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/BetterChatHoverCache.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text.util; import com.google.gson.*; import com.mojang.serialization.JsonOps; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/ChatHoverUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/ChatHoverUtil.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/ChatHoverUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/ChatHoverUtil.java index c3aca73..b65eab3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/ChatHoverUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/chat/text/util/ChatHoverUtil.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.chat; +package dev.loki.lovisual.features.gui.chat.text.util; import dev.loki.lovisual.util.item.TopEnchantUtil; import net.minecraft.client.Minecraft; @@ -25,6 +25,9 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStoreManager; +import dev.loki.lovisual.features.gui.chat.text.util.BetterChatHoverCache; /** * Hover payload helpers + cache fallbacks. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiDrawHelpers.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiDrawHelpers.java index 0af903c..76f1f09 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiDrawHelpers.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiDrawHelpers.java @@ -3,7 +3,7 @@ package dev.loki.lovisual.features.gui.clickgui; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.renderer.Renderer2D; -final class ClickGuiDrawHelpers { +public final class ClickGuiDrawHelpers { private ClickGuiDrawHelpers() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiEditorManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiEditorManager.java index b453b4c..92c226b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiEditorManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiEditorManager.java @@ -3,12 +3,12 @@ package dev.loki.lovisual.features.gui.clickgui; import dev.loki.lovisual.features.gui.clickgui.editor.ClickGuiTextEditorState; import dev.loki.lovisual.features.gui.clickgui.picker.ClickGuiPickerState; import dev.loki.lovisual.features.gui.clickgui.protocol.CombatProtocolHeuristicsEditorState; -import dev.loki.lovisual.features.gui.clickgui.settings.TextEditorOwner; -import dev.loki.lovisual.features.gui.clickgui.settings.TextSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.owner.TextEditorOwner; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSetting; import dev.loki.lovisual.features.module.ModuleManager; import dev.loki.lovisual.util.text.ClipboardUtil; -final class ClickGuiEditorManager { +public final class ClickGuiEditorManager { private ClickGuiEditorManager() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiFonts.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiFonts.java index 04057e1..1b1770b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiFonts.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiFonts.java @@ -5,7 +5,7 @@ import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; -final class ClickGuiFonts { +public final class ClickGuiFonts { private ClickGuiFonts() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiInputHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiInputHandler.java index e59310f..2550257 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiInputHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiInputHandler.java @@ -5,7 +5,7 @@ import dev.loki.lovisual.render.engine.math.HudScale; import dev.loki.lovisual.util.wav.ClickGuiSounds; import net.minecraft.client.Minecraft; -final class ClickGuiInputHandler { +public final class ClickGuiInputHandler { private ClickGuiInputHandler() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyBindManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyBindManager.java index fbead76..0d5b2f3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyBindManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyBindManager.java @@ -1,7 +1,7 @@ package dev.loki.lovisual.features.gui.clickgui; -import dev.loki.lovisual.features.gui.clickgui.settings.FunctionBindSetting; -import dev.loki.lovisual.features.gui.clickgui.settings.KeyBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; import dev.loki.lovisual.util.input.KeyUtil; import dev.loki.lovisual.util.wav.ClickGuiSounds; import org.lwjgl.glfw.GLFW; @@ -9,7 +9,7 @@ import org.lwjgl.glfw.GLFW; import java.util.LinkedHashSet; import java.util.Set; -final class ClickGuiKeyBindManager { +public final class ClickGuiKeyBindManager { private ClickGuiKeyBindManager() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyboardHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyboardHandler.java index 07b7743..c742b8c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyboardHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiKeyboardHandler.java @@ -8,7 +8,7 @@ import org.lwjgl.glfw.GLFW; import java.nio.file.Path; import java.util.List; -final class ClickGuiKeyboardHandler { +public final class ClickGuiKeyboardHandler { private ClickGuiKeyboardHandler() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiLifecycle.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiLifecycle.java index ea29457..29eec6b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiLifecycle.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiLifecycle.java @@ -8,7 +8,7 @@ import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; import org.lwjgl.glfw.GLFW; -final class ClickGuiLifecycle { +public final class ClickGuiLifecycle { private ClickGuiLifecycle() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiPickerIconManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiPickerIconManager.java index b138d43..3f754a4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiPickerIconManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiPickerIconManager.java @@ -7,7 +7,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.world.item.ItemStack; -final class ClickGuiPickerIconManager { +public final class ClickGuiPickerIconManager { private ClickGuiPickerIconManager() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderEngine.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderEngine.java index 502bf95..e9a0a87 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderEngine.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderEngine.java @@ -13,7 +13,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import org.lwjgl.glfw.GLFW; -final class ClickGuiRenderEngine { +public final class ClickGuiRenderEngine { private ClickGuiRenderEngine() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderer.java index 1ac4936..6fae00b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiRenderer.java @@ -12,7 +12,11 @@ import dev.loki.lovisual.features.gui.clickgui.picker.ClickGuiPickerState; import dev.loki.lovisual.features.gui.clickgui.protocol.CombatProtocolHeuristicsEditorState; import dev.loki.lovisual.features.gui.clickgui.sections.ModulesSection; import dev.loki.lovisual.features.gui.clickgui.sections.SettingsSection; -import dev.loki.lovisual.features.gui.clickgui.settings.*; +import dev.loki.lovisual.features.gui.clickgui.settings.cooldown.ProtocolHeuristicsSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.owner.TextEditorOwner; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; + import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.TextRenderer; import net.minecraft.client.gui.GuiGraphicsExtractor; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiScreenManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiScreenManager.java index 77d3f2c..1d3638e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiScreenManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiScreenManager.java @@ -4,15 +4,15 @@ import dev.loki.lovisual.config.ConfigSerializer; import dev.loki.lovisual.features.gui.clickgui.picker.ClickGuiPickerState; import dev.loki.lovisual.features.gui.clickgui.protocol.CombatProtocolHeuristicsEditorState; import dev.loki.lovisual.features.gui.clickgui.sections.settings.SettingsTabRuntime; -import dev.loki.lovisual.features.gui.clickgui.settings.ProtocolHeuristicsSetting; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.cooldown.ProtocolHeuristicsSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.util.screen.ClientScreen; import dev.loki.lovisual.util.wav.ClickGuiSounds; import net.minecraft.client.Minecraft; import java.util.concurrent.CompletableFuture; -final class ClickGuiScreenManager { +public final class ClickGuiScreenManager { private ClickGuiScreenManager() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabBar.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabBar.java index db23e64..60c2fb4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabBar.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabBar.java @@ -9,7 +9,7 @@ import java.util.List; import static dev.loki.lovisual.features.theme.Theme.theme; -final class ClickGuiTabBar { +public final class ClickGuiTabBar { private ClickGuiTabBar() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabState.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabState.java index d6ebcf4..17a0daa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabState.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTabState.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -final class ClickGuiTabState { +public final class ClickGuiTabState { private ClickGuiTabState() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTextBatch.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTextBatch.java index 96cde69..6e2a800 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTextBatch.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTextBatch.java @@ -7,7 +7,7 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; -final class ClickGuiTextBatch { +public final class ClickGuiTextBatch { private ClickGuiTextBatch() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTopLayer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTopLayer.java index c0b8ec1..579b6fa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTopLayer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/ClickGuiTopLayer.java @@ -13,7 +13,7 @@ import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; -final class ClickGuiTopLayer { +public final class ClickGuiTopLayer { private ClickGuiTopLayer() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/editor/ClickGuiTextEditorState.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/editor/ClickGuiTextEditorState.java index d2a91c6..f353a36 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/editor/ClickGuiTextEditorState.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/editor/ClickGuiTextEditorState.java @@ -11,7 +11,7 @@ import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.Minecraft; import org.lwjgl.glfw.GLFW; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; -import dev.loki.lovisual.features.gui.clickgui.settings.TextEditorOwner; +import dev.loki.lovisual.features.gui.clickgui.settings.owner.TextEditorOwner; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuPanel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuPanel.java index aec9741..17a0698 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuPanel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuPanel.java @@ -9,9 +9,9 @@ package dev.loki.lovisual.features.gui.clickgui.layout.screen.modules; import org.lwjgl.glfw.GLFW; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderContext; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderSurface; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderContext; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderSurface; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import java.util.ArrayList; @@ -19,7 +19,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -final class ModulesMenuPanel { +public final class ModulesMenuPanel { final ModulesMenuCategory category; final int index; final List hits = new ArrayList<>(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuResolver.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuResolver.java index c2095f3..dfb065e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuResolver.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuResolver.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.features.gui.clickgui.layout.screen.modules; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.implement.module.ModuleComponent; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleManager; @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -enum ModulesMenuResolver { +public enum ModulesMenuResolver { ; static List buildCards(ModulesMenuCategory category) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuScreen.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuScreen.java index a0f2f48..a2002ef 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuScreen.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuScreen.java @@ -15,9 +15,9 @@ import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.features.gui.clickgui.ClickGuiSearch; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.implement.module.ModuleComponent; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.render.LayoutRender2D; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderContext; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderSurface; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderContext; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderSurface; import dev.loki.lovisual.features.gui.clickgui.util.ClickGuiHintOverlay; import dev.loki.lovisual.features.gui.clickgui.util.ClickGuiI18n; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -33,6 +33,7 @@ import dev.loki.lovisual.util.logging.DebugLog; import java.util.ArrayList; import java.util.List; +import dev.loki.lovisual.features.gui.hud.draggable.impl.panels.ModuleList; public final class ModulesMenuScreen { private static final float INPUT_READY_PROGRESS = 0.72f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuStyle.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuStyle.java index 21f9f26..5803bf1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuStyle.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/modules/ModulesMenuStyle.java @@ -12,7 +12,7 @@ import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.SettingsGu import dev.loki.lovisual.features.theme.Themes; import dev.loki.lovisual.render.engine.animation.AnimationUtility; -enum ModulesMenuStyle { +public enum ModulesMenuStyle { ; static final int MODULE_LIST_ON = 0xFF5DE878; static final int MODULE_LIST_OFF = 0xFFFF5E66; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolver.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolver.java index ebb1db3..e47c092 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolver.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolver.java @@ -11,16 +11,16 @@ import dev.loki.lovisual.config.ConfigSerializer; import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.config.SettingOwner; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.implement.module.ModuleComponent; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingFactory; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.SettingFactory; import dev.loki.lovisual.features.gui.hud.AbstractHudElement; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; import dev.loki.lovisual.features.gui.hud.nondraggable.StaticHudElementRegistry; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.DropESP; -import dev.loki.lovisual.features.module.modules.visuals.NameTags; +import dev.loki.lovisual.features.module.modules.visuals.esp.overlay.DropESP; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import dev.loki.lovisual.features.relations.PlayerRelations; import dev.loki.lovisual.util.item.IllegalItemUtil; import dev.loki.lovisual.util.item.RarityColorConfig; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/main/MainSettingsComponent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/main/MainSettingsComponent.java index f5ac573..3d0bbfd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/main/MainSettingsComponent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/main/MainSettingsComponent.java @@ -13,10 +13,10 @@ import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.SettingsGuiPalette; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.render.LayoutRender2D; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingFactory; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderContext; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderSurface; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.SettingFactory; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderContext; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderSurface; import dev.loki.lovisual.features.gui.clickgui.util.ClickGuiMath; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.renderer.Renderer2D; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/module/SettingsPanelComponent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/module/SettingsPanelComponent.java index 2e1e916..a5a228e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/module/SettingsPanelComponent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/module/SettingsPanelComponent.java @@ -15,9 +15,9 @@ import org.lwjgl.glfw.GLFW; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.SettingsGuiPalette; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.render.LayoutRender2D; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderContext; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingRenderSurface; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderContext; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderSurface; import dev.loki.lovisual.features.gui.clickgui.util.ClickGuiHintOverlay; import dev.loki.lovisual.features.gui.clickgui.util.ClickGuiI18n; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/relations/OnlineRelationPlayerPickerComponent.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/relations/OnlineRelationPlayerPickerComponent.java index b13d1e5..c8d6647 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/relations/OnlineRelationPlayerPickerComponent.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/implement/relations/OnlineRelationPlayerPickerComponent.java @@ -53,7 +53,7 @@ import java.util.function.Consumer; * Online player picker for Relations/DefineTarget. * Visually follows the custom tab-list shape, but writes directly to PlayerRelations. */ -final class OnlineRelationPlayerPickerComponent { +public final class OnlineRelationPlayerPickerComponent { private static final int MAX_ROWS_PER_COLUMN = 13; private static final long STRUCTURE_REFRESH_MS = 350L; private static final long DYNAMIC_REFRESH_MS = 250L; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/ClickGuiPickerState.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/ClickGuiPickerState.java index 9ce76f0..01bf96c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/ClickGuiPickerState.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/ClickGuiPickerState.java @@ -14,8 +14,8 @@ import net.minecraft.world.item.ItemStack; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.SettingsGuiPalette; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.render.LayoutRender2D; -import dev.loki.lovisual.features.gui.clickgui.settings.PickerDetailOwner; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.owner.PickerDetailOwner; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.theme.Themes; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.helpers.ScissorFunction; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalog.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalog.java index 34e0504..74206d4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalog.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalog.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.features.gui.clickgui.picker; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import java.util.List; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalogFactory.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalogFactory.java index e4aaefb..d871b45 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalogFactory.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/picker/PickerCatalogFactory.java @@ -18,7 +18,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.equipment.Equippable; import net.minecraft.world.level.block.Block; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.util.item.EnchantMeta; import dev.loki.lovisual.util.item.EnchantRegistry; import dev.loki.lovisual.util.screen.ScreenCatalog; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/protocol/CombatProtocolHeuristicsEditorState.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/protocol/CombatProtocolHeuristicsEditorState.java index 4c0ce7a..8ce092b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/protocol/CombatProtocolHeuristicsEditorState.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/protocol/CombatProtocolHeuristicsEditorState.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.features.gui.clickgui.protocol; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.SettingsGuiPalette; -import dev.loki.lovisual.features.gui.clickgui.settings.ProtocolHeuristicsSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.cooldown.ProtocolHeuristicsSetting; import dev.loki.lovisual.features.gui.clickgui.util.ClickGuiI18n; import dev.loki.lovisual.features.theme.Theme; import dev.loki.lovisual.features.theme.Themes; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSetting.java deleted file mode 100644 index d3ed69f..0000000 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSetting.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * This file is part of the LoVisual Client distribution. - * Copyright (c) 2026 loki5512344. - * - * Licensed under the GNU General Public License v3.0. - */ - -package dev.loki.lovisual.features.gui.clickgui.settings; - -import dev.loki.lovisual.config.values.ColorValue; -import dev.loki.lovisual.config.values.ConfigValue; -import dev.loki.lovisual.util.text.TextSelection; - -public class ColorSetting extends Setting { - - private final ColorValue value; - private final UiState ui = new UiState(); - - public ColorSetting(String name, ColorValue value) { - super(name, asConfigValue(value)); - this.value = value; - } - - private static ConfigValue asConfigValue(ColorValue value) { - return value instanceof ConfigValue configValue ? configValue : null; - } - - ColorValue value() { - return value; - } - - UiState ui() { - return ui; - } - - @Override - public void render(float x, float y, float w, float mx, float my) { - SettingRendererBridge.render(this, x, y, w, mx, my); - } - - @Override - public void mouseClicked(double mx, double my, int button) { - SettingRendererBridge.mouseClicked(this, mx, my, button); - } - - @Override - public void mouseReleased(double mx, double my, int button) { - SettingRendererBridge.mouseReleased(this, mx, my, button); - } - - @Override - public void mouseClickedOutside(double mx, double my, int button) { - SettingRendererBridge.mouseClickedOutside(this, mx, my, button); - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - return SettingRendererBridge.keyPressed(this, keyCode, scanCode, modifiers); - } - - @Override - public boolean charTyped(char chr, int modifiers) { - return SettingRendererBridge.charTyped(this, chr, modifiers); - } - - @Override - public boolean mouseScrolled(double mx, double my, double amount) { - return SettingRendererBridge.mouseScrolled(this, mx, my, amount); - } - - @Override - public float getHeight() { - return SettingRendererBridge.getHeight(this); - } - - static final class UiState { - final TextSelection hexSelection = new TextSelection(); - boolean editing = false; - boolean showRgbBars = false; - boolean rainbow = false; - boolean sbFocused = false; - boolean hFocused = false; - boolean aFocused = false; - boolean rFocused = false; - boolean gFocused = false; - boolean bFocused = false; - boolean aRgbFocused = false; - float hue = 0f; - float saturation = 1f; - float brightness = 1f; - int alpha = 255; - int red = 255; - int green = 255; - int blue = 255; - int lastArgb = 0; - float previewGlowAnim = 0f; - float expandAnim = 0f; - float sliderHoverAnim = 0f; - float rnbHoverAnim = 0f; - float rnbOffAnim = 0f; - float rgbExpandAnim = 0f; - float lastX, lastY, lastW; - float popupX, popupY, popupW, popupH; - float moduleHoverAnim; - float squareX, squareY, squareW, squareH; - float hueX, hueY, hueW, hueH; - float alphaX, alphaY, alphaW, alphaH; - float rX, rY, rW, rH; - float gX, gY, gW, gH; - float bX, bY, bW, bH; - float aX, aY, aW, aH; - float rgbBottom; - float sliderX, sliderY, sliderW, sliderH; - float rnbX, rnbY, rnbW, rnbH; - boolean hexFocused = false; - String hexBuffer = ""; - int hexCursor = 0; - float hexAnim = 0f; - float hexErrorAnim = 0f; - float hexCursorBlink = 0f; - float presetHoverAnim = 0f; - float savePresetHoverAnim = 0f; - float deletePresetHoverAnim = 0f; - boolean presetsExpanded = false; - float presetsExpandAnim = 0f; - float presetsScroll = 0f; - float presetsMaxScroll = 0f; - float presetsContentH = 0f; - float presetsViewportH = 0f; - float presetsToggleHoverAnim = 0f; - float presetsScrollbarHoverAnim = 0f; - boolean presetsScrollbarDragging = false; - float presetsScrollbarDragOffset = 0f; - float hexX, hexY, hexW, hexH; - float presetX, presetY, presetW, presetH; - float presetListX, presetListY, presetListW, presetListH; - float presetToggleX, presetToggleY, presetToggleW, presetToggleH; - float presetScrollbarX, presetScrollbarY, presetScrollbarW, presetScrollbarH; - float presetScrollbarHandleY, presetScrollbarHandleH; - float savePresetX, savePresetY, savePresetW, savePresetH; - float deletePresetX, deletePresetY, deletePresetW, deletePresetH; - } -} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/FunctionBindSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/FunctionBindSetting.java similarity index 84% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/FunctionBindSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/FunctionBindSetting.java index d5c204c..5c525e0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/FunctionBindSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/FunctionBindSetting.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.bind; import dev.loki.lovisual.config.SettingOwner; import dev.loki.lovisual.config.values.BindMode; @@ -14,6 +14,8 @@ import dev.loki.lovisual.util.input.KeyManager; import dev.loki.lovisual.util.wav.ClickGuiSounds; import java.util.function.BooleanSupplier; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; /** * Function bind without toggle(): listens to active state (PRESS/HOLD). @@ -208,25 +210,25 @@ public class FunctionBindSetting extends Setting { registeredName = null; } - static final class UiState { - float lastX; - float lastY; - boolean waiting = false; - float lastW; - float lastH; - float lastBx, lastBy, lastBw, lastBh; - float hoverAnim = 0f; - float waitAnim = 0f; - float layoutW = Float.NaN; - String layoutLabel = null; - String layoutDisplay = null; - String[] layoutLines = new String[]{""}; - float layoutLineH = 0f; - float layoutLabelY = 0f; - float layoutMarkerY = 0f; - float layoutBoxY = 0f; - float layoutRowH = 54f; - float layoutBoxW = 36f; - float layoutTextW = 0f; + public static final class UiState { + public float lastX; + public float lastY; + public boolean waiting = false; + public float lastW; + public float lastH; + public float lastBx, lastBy, lastBw, lastBh; + public float hoverAnim = 0f; + public float waitAnim = 0f; + public float layoutW = Float.NaN; + public String layoutLabel = null; + public String layoutDisplay = null; + public String[] layoutLines = new String[]{""}; + public float layoutLineH = 0f; + public float layoutLabelY = 0f; + public float layoutMarkerY = 0f; + public float layoutBoxY = 0f; + public float layoutRowH = 54f; + public float layoutBoxW = 36f; + public float layoutTextW = 0f; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/FunctionBindSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/FunctionBindSettingRenderer.java similarity index 66% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/FunctionBindSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/FunctionBindSettingRenderer.java index 3030766..d82bcf2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/FunctionBindSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/FunctionBindSettingRenderer.java @@ -5,16 +5,19 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.bind; import dev.loki.lovisual.config.values.BindMode; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.util.BindRendererUtil; -final class FunctionBindSettingRenderer { +public final class FunctionBindSettingRenderer { private FunctionBindSettingRenderer() { } - static void render(FunctionBindSetting setting, float x, float y, float w, float mx, float my) { + public static void render(FunctionBindSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); FunctionBindSetting.UiState ui = setting.ui(); String pending = ClickGuiRenderer.getPendingBindDisplay(); @@ -23,7 +26,7 @@ final class FunctionBindSettingRenderer { BindRendererUtil.renderBindBase(setting.getDisplayName(), display, modeText, ui.waiting, x, y, w, mx, my, ui); } - static void mouseClicked(FunctionBindSetting setting, double mx, double my, int button) { + public static void mouseClicked(FunctionBindSetting setting, double mx, double my, int button) { if (button != 0) return; FunctionBindSetting.UiState ui = setting.ui(); if (!UnifiedSettingsSkin.inside(mx, my, ui.lastBx, ui.lastBy, ui.lastBw, ui.lastBh)) return; @@ -31,7 +34,7 @@ final class FunctionBindSettingRenderer { ClickGuiRenderer.beginKeyBind(setting); } - static float getHeight(FunctionBindSetting setting) { + public static float getHeight(FunctionBindSetting setting) { String modeText = setting.mode() == BindMode.HOLD ? "Hold" : "Press"; return BindRendererUtil.bindHeight(setting.ui().lastW, setting.getDisplayName(), setting.get(), modeText); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/KeyBindSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/KeyBindSetting.java similarity index 77% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/KeyBindSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/KeyBindSetting.java index d542beb..932eaff 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/KeyBindSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/KeyBindSetting.java @@ -5,12 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.bind; import dev.loki.lovisual.config.SettingOwner; import dev.loki.lovisual.config.values.KeyBindValue; import dev.loki.lovisual.util.input.KeyManager; import dev.loki.lovisual.util.wav.ClickGuiSounds; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; public class KeyBindSetting extends Setting { @@ -116,25 +118,25 @@ public class KeyBindSetting extends Setting { if (getParent() != null) getParent().saveConfig(); } - static final class UiState { - float lastX; - float lastY; - boolean waiting = false; - float lastW; - float lastH; - float lastBx, lastBy, lastBw, lastBh; - float hoverAnim = 0f; - float waitAnim = 0f; - float layoutW = Float.NaN; - String layoutLabel = null; - String layoutDisplay = null; - String[] layoutLines = new String[]{""}; - float layoutLineH = 0f; - float layoutLabelY = 0f; - float layoutBoxY = 0f; - float layoutRowH = 46f; - float layoutBoxW = 36f; - float layoutTextW = 0f; + public static final class UiState { + public float lastX; + public float lastY; + public boolean waiting = false; + public float lastW; + public float lastH; + public float lastBx, lastBy, lastBw, lastBh; + public float hoverAnim = 0f; + public float waitAnim = 0f; + public float layoutW = Float.NaN; + public String layoutLabel = null; + public String layoutDisplay = null; + public String[] layoutLines = new String[]{""}; + public float layoutLineH = 0f; + public float layoutLabelY = 0f; + public float layoutBoxY = 0f; + public float layoutRowH = 46f; + public float layoutBoxW = 36f; + public float layoutTextW = 0f; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/KeyBindSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/KeyBindSettingRenderer.java similarity index 63% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/KeyBindSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/KeyBindSettingRenderer.java index 4682de4..08e725f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/KeyBindSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bind/KeyBindSettingRenderer.java @@ -5,15 +5,18 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.bind; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.util.BindRendererUtil; -final class KeyBindSettingRenderer { +public final class KeyBindSettingRenderer { private KeyBindSettingRenderer() { } - static void render(KeyBindSetting setting, float x, float y, float w, float mx, float my) { + public static void render(KeyBindSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); KeyBindSetting.UiState ui = setting.ui(); String pending = ClickGuiRenderer.getPendingBindDisplay(); @@ -21,7 +24,7 @@ final class KeyBindSettingRenderer { BindRendererUtil.renderBindBase(setting.getDisplayName(), display, null, ui.waiting, x, y, w, mx, my, ui); } - static void mouseClicked(KeyBindSetting setting, double mx, double my, int button) { + public static void mouseClicked(KeyBindSetting setting, double mx, double my, int button) { if (button != 0) return; KeyBindSetting.UiState ui = setting.ui(); if (!UnifiedSettingsSkin.inside(mx, my, ui.lastBx, ui.lastBy, ui.lastBw, ui.lastBh)) return; @@ -29,7 +32,7 @@ final class KeyBindSettingRenderer { ClickGuiRenderer.beginKeyBind(setting); } - static float getHeight(KeyBindSetting setting) { + public static float getHeight(KeyBindSetting setting) { return BindRendererUtil.bindHeight(setting.ui().lastW, setting.getDisplayName(), setting.getValue().get(), null); } } \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BooleanSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bool/BooleanSetting.java similarity index 62% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BooleanSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bool/BooleanSetting.java index e4603d4..f21b7f4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BooleanSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bool/BooleanSetting.java @@ -5,9 +5,11 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.bool; import dev.loki.lovisual.config.values.BooleanValue; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; public class BooleanSetting extends Setting { @@ -57,18 +59,18 @@ public class BooleanSetting extends Setting { return SettingRendererBridge.getHeight(this); } - static final class UiState { - float lastX, lastY, lastW; - float lastH; - float lastControlX, lastControlY, lastControlW, lastControlH; - float anim = 0f; - float hoverAnim = 0f; - float layoutW = Float.NaN; - String layoutLabel = null; - String[] layoutLines = new String[]{""}; - float layoutLineH = 0f; - float layoutLabelY = 0f; - float layoutControlY = 0f; - float layoutRowH = 44f; + public static final class UiState { + public float lastX, lastY, lastW; + public float lastH; + public float lastControlX, lastControlY, lastControlW, lastControlH; + public float anim = 0f; + public float hoverAnim = 0f; + public float layoutW = Float.NaN; + public String layoutLabel = null; + public String[] layoutLines = new String[]{""}; + public float layoutLineH = 0f; + public float layoutLabelY = 0f; + public float layoutControlY = 0f; + public float layoutRowH = 44f; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BooleanSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bool/BooleanSettingRenderer.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BooleanSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bool/BooleanSettingRenderer.java index 47db65f..86861ba 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BooleanSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/bool/BooleanSettingRenderer.java @@ -5,21 +5,24 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.bool; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.wav.ClickGuiSounds; +import dev.loki.lovisual.features.gui.clickgui.settings.bool.BooleanSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class BooleanSettingRenderer { +public final class BooleanSettingRenderer { private BooleanSettingRenderer() { } - record LayoutBoolean(String[] lines, float lineH, float labelY, float controlY, float rowH) { + public record LayoutBoolean(String[] lines, float lineH, float labelY, float controlY, float rowH) { } - static void render(BooleanSetting setting, float x, float y, float w, float mx, float my) { + public static void render(BooleanSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); BooleanSetting.UiState ui = setting.ui(); LayoutBoolean layout = booleanLayout(setting, w); @@ -84,7 +87,7 @@ final class BooleanSettingRenderer { ClickGuiRenderer.endTextBatch(); } - static void mouseClicked(BooleanSetting setting, double mx, double my, int button) { + public static void mouseClicked(BooleanSetting setting, double mx, double my, int button) { if (button != 0) return; BooleanSetting.UiState ui = setting.ui(); if (!UnifiedSettingsSkin.inside(mx, my, ui.lastX, ui.lastY, ui.lastW, ui.lastH)) return; @@ -93,7 +96,7 @@ final class BooleanSettingRenderer { if (setting.getParent() != null) setting.getParent().saveConfig(); } - static float getHeight(BooleanSetting setting) { + public static float getHeight(BooleanSetting setting) { return booleanLayout(setting, setting.ui().lastW > 0f ? setting.ui().lastW : SettingSkinUtil.m(170f, 115f)).rowH; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSetting.java new file mode 100644 index 0000000..cfe0428 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSetting.java @@ -0,0 +1,145 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.gui.clickgui.settings.color; + +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; +import dev.loki.lovisual.config.values.ColorValue; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.config.values.ConfigValue; +import dev.loki.lovisual.util.text.TextSelection; + +public class ColorSetting extends Setting { + + private final ColorValue value; + private final UiState ui = new UiState(); + + public ColorSetting(String name, ColorValue value) { + super(name, asConfigValue(value)); + this.value = value; + } + + private static ConfigValue asConfigValue(ColorValue value) { + return value instanceof ConfigValue configValue ? configValue : null; + } + + public ColorValue value() { + return value; + } + + public UiState ui() { + return ui; + } + + @Override + public void render(float x, float y, float w, float mx, float my) { + SettingRendererBridge.render(this, x, y, w, mx, my); + } + + @Override + public void mouseClicked(double mx, double my, int button) { + SettingRendererBridge.mouseClicked(this, mx, my, button); + } + + @Override + public void mouseReleased(double mx, double my, int button) { + SettingRendererBridge.mouseReleased(this, mx, my, button); + } + + @Override + public void mouseClickedOutside(double mx, double my, int button) { + SettingRendererBridge.mouseClickedOutside(this, mx, my, button); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + return SettingRendererBridge.keyPressed(this, keyCode, scanCode, modifiers); + } + + @Override + public boolean charTyped(char chr, int modifiers) { + return SettingRendererBridge.charTyped(this, chr, modifiers); + } + + @Override + public boolean mouseScrolled(double mx, double my, double amount) { + return SettingRendererBridge.mouseScrolled(this, mx, my, amount); + } + + @Override + public float getHeight() { + return SettingRendererBridge.getHeight(this); + } + + public static final class UiState { + public final TextSelection hexSelection = new TextSelection(); + public boolean editing = false; + public boolean showRgbBars = false; + public boolean rainbow = false; + public boolean sbFocused = false; + public boolean hFocused = false; + public boolean aFocused = false; + public boolean rFocused = false; + public boolean gFocused = false; + public boolean bFocused = false; + public boolean aRgbFocused = false; + public float hue = 0f; + public float saturation = 1f; + public float brightness = 1f; + public int alpha = 255; + public int red = 255; + public int green = 255; + public int blue = 255; + public int lastArgb = 0; + public float previewGlowAnim = 0f; + public float expandAnim = 0f; + public float sliderHoverAnim = 0f; + public float rnbHoverAnim = 0f; + public float rnbOffAnim = 0f; + public float rgbExpandAnim = 0f; + public float lastX, lastY, lastW; + public float popupX, popupY, popupW, popupH; + public float moduleHoverAnim; + public float squareX, squareY, squareW, squareH; + public float hueX, hueY, hueW, hueH; + public float alphaX, alphaY, alphaW, alphaH; + public float rX, rY, rW, rH; + public float gX, gY, gW, gH; + public float bX, bY, bW, bH; + public float aX, aY, aW, aH; + public float rgbBottom; + public float sliderX, sliderY, sliderW, sliderH; + public float rnbX, rnbY, rnbW, rnbH; + public boolean hexFocused = false; + public String hexBuffer = ""; + public int hexCursor = 0; + public float hexAnim = 0f; + public float hexErrorAnim = 0f; + public float hexCursorBlink = 0f; + public float presetHoverAnim = 0f; + public float savePresetHoverAnim = 0f; + public float deletePresetHoverAnim = 0f; + public boolean presetsExpanded = false; + public float presetsExpandAnim = 0f; + public float presetsScroll = 0f; + public float presetsMaxScroll = 0f; + public float presetsContentH = 0f; + public float presetsViewportH = 0f; + public float presetsToggleHoverAnim = 0f; + public float presetsScrollbarHoverAnim = 0f; + public boolean presetsScrollbarDragging = false; + public float presetsScrollbarDragOffset = 0f; + public float hexX, hexY, hexW, hexH; + public float presetX, presetY, presetW, presetH; + public float presetListX, presetListY, presetListW, presetListH; + public float presetToggleX, presetToggleY, presetToggleW, presetToggleH; + public float presetScrollbarX, presetScrollbarY, presetScrollbarW, presetScrollbarH; + public float presetScrollbarHandleY, presetScrollbarHandleH; + public float savePresetX, savePresetY, savePresetW, savePresetH; + public float deletePresetX, deletePresetY, deletePresetW, deletePresetH; + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingMath.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSettingMath.java similarity index 65% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingMath.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSettingMath.java index 865470e..cead386 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingMath.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSettingMath.java @@ -5,19 +5,19 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color; import java.awt.Color; -final class ColorSettingMath { +public final class ColorSettingMath { private ColorSettingMath() { } - static int hsbToArgb(float h, float s, float b, int a) { + public static int hsbToArgb(float h, float s, float b, int a) { return (Math.max(0, Math.min(255, a)) << 24) | (Color.HSBtoRGB(h, s, b) & 0x00FFFFFF); } - static int withAlpha(int argb, int a) { + public static int withAlpha(int argb, int a) { return (argb & 0x00FFFFFF) | ((Math.max(0, Math.min(255, a)) & 0xFF) << 24); } } \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingNoAlpha.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSettingNoAlpha.java similarity index 72% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingNoAlpha.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSettingNoAlpha.java index 130f6a9..c5df50d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingNoAlpha.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ColorSettingNoAlpha.java @@ -5,9 +5,10 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color; import dev.loki.lovisual.config.values.RGBColorValue; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; public class ColorSettingNoAlpha extends ColorSetting { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ConfigColorSettingNoAlpha.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ConfigColorSettingNoAlpha.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ConfigColorSettingNoAlpha.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ConfigColorSettingNoAlpha.java index d724d95..ea4bf46 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ConfigColorSettingNoAlpha.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/ConfigColorSettingNoAlpha.java @@ -5,11 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color; import dev.loki.lovisual.config.ConfigObject; import dev.loki.lovisual.config.ConfigSerializer; import dev.loki.lovisual.config.values.RGBColorValue; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSettingNoAlpha; /** * Color setting that persists changes via a ConfigObject (non-Module owner). diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingHexInput.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/hex/ColorSettingHexInput.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingHexInput.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/hex/ColorSettingHexInput.java index 3193227..7d571e8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingHexInput.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/hex/ColorSettingHexInput.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.hex; import dev.loki.lovisual.config.values.ColorValue; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; @@ -16,12 +16,18 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; import dev.loki.lovisual.util.text.ClipboardUtil; import org.lwjgl.glfw.GLFW; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.hex.ColorSettingHexState; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingDrag; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class ColorSettingHexInput { +public final class ColorSettingHexInput { private ColorSettingHexInput() { } - static void beginHexEdit(ColorSetting.UiState ui, ColorValue value) { + public static void beginHexEdit(ColorSetting.UiState ui, ColorValue value) { ui.hexFocused = true; ui.hexBuffer = ColorSettingHexState.displayHex(value, value.supportsAlpha()); ui.hexCursor = ui.hexBuffer.length(); @@ -37,7 +43,7 @@ final class ColorSettingHexInput { ui.hexErrorAnim = 0f; } - static boolean commitHexEdit(ColorSetting setting, ColorValue value, ColorSetting.UiState ui, boolean save) { + public static boolean commitHexEdit(ColorSetting setting, ColorValue value, ColorSetting.UiState ui, boolean save) { Integer parsed = ColorSettingHexState.parseHexInput(ui.hexBuffer, value.supportsAlpha()); if (parsed == null) { ui.hexErrorAnim = 1f; @@ -51,7 +57,7 @@ final class ColorSettingHexInput { return true; } - static boolean keyPressed(ColorSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(ColorSetting setting, int keyCode, int scanCode, int modifiers) { ColorSetting.UiState ui = setting.ui(); if (!ui.hexFocused) return false; ColorValue value = setting.value(); @@ -114,7 +120,7 @@ final class ColorSettingHexInput { return true; } - static boolean charTyped(ColorSetting setting, char chr, int modifiers) { + public static boolean charTyped(ColorSetting setting, char chr, int modifiers) { ColorSetting.UiState ui = setting.ui(); if (!ui.hexFocused) return false; if (ColorSettingHexState.isHexChar(chr)) { @@ -127,7 +133,7 @@ final class ColorSettingHexInput { return true; } - static void renderHexInput(ColorSetting.UiState ui, ColorValue value, float mx, float my, float slide) { + public static void renderHexInput(ColorSetting.UiState ui, ColorValue value, float mx, float my, float slide) { float y = ui.hexY + slide; boolean hover = UnifiedSettingsSkin.inside(mx, my, ui.hexX, y, ui.hexW, ui.hexH); float dt = AnimationUtility.deltaTime(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingHexState.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/hex/ColorSettingHexState.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingHexState.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/hex/ColorSettingHexState.java index 1007ab1..05e2083 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingHexState.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/hex/ColorSettingHexState.java @@ -5,12 +5,16 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.hex; import dev.loki.lovisual.config.values.ColorValue; import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class ColorSettingHexState { +public final class ColorSettingHexState { private ColorSettingHexState() { } @@ -134,7 +138,7 @@ final class ColorSettingHexState { ui.hexCursorBlink = 0f; } - static void setHexCursorFromMouse(ColorSetting.UiState ui, float mx, boolean shift) { + public static void setHexCursorFromMouse(ColorSetting.UiState ui, float mx, boolean shift) { TextRenderer font = UnifiedSettingsSkin.fontMedium(); float size = SettingSkinUtil.m(11.5f, 5.4f); String label = "HEX"; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorPresetStore.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorPresetStore.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorPresetStore.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorPresetStore.java index 6d2364a..c2db154 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorPresetStore.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorPresetStore.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.preset; import com.google.gson.*; import dev.loki.lovisual.config.ConfigPaths; @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -enum ColorPresetStore { +public enum ColorPresetStore { ; private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); private static final Path FILE = ConfigPaths.root().resolve("color_presets.json"); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingPresetHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorSettingPresetHandler.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingPresetHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorSettingPresetHandler.java index 5d79a20..931cd1d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingPresetHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorSettingPresetHandler.java @@ -5,16 +5,22 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.preset; import dev.loki.lovisual.config.values.ColorValue; import dev.loki.lovisual.render.engine.animation.AnimationUtility; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.preset.ColorPresetStore; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingDrag; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingLayout; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class ColorSettingPresetHandler { +public final class ColorSettingPresetHandler { private ColorSettingPresetHandler() { } - static boolean handleColorPresetClick(ColorSetting setting, ColorValue value, ColorSetting.UiState ui, double mx, double my, int button) { + public static boolean handleColorPresetClick(ColorSetting setting, ColorValue value, ColorSetting.UiState ui, double mx, double my, int button) { if (button != 0 && button != 1) return false; float slide = (1f - ColorSettingLayout.colorReveal(ui)) * SettingSkinUtil.m(8f, 8f); float rowY = ui.presetY + slide; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingPresetRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorSettingPresetRenderer.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingPresetRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorSettingPresetRenderer.java index 27b75a5..e0aa4c1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingPresetRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/preset/ColorSettingPresetRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.preset; import dev.loki.lovisual.config.values.ColorValue; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; @@ -13,12 +13,18 @@ import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.svg.SvgRenderOptions; import dev.loki.lovisual.render.helpers.ScissorFunction; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.preset.ColorPresetStore; +import dev.loki.lovisual.features.gui.clickgui.settings.color.preset.ColorSettingPresetHandler; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingLayout; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class ColorSettingPresetRenderer { +public final class ColorSettingPresetRenderer { private ColorSettingPresetRenderer() { } - static void renderColorPresets(ColorSetting.UiState ui, ColorValue value, float mx, float my, float slide) { + public static void renderColorPresets(ColorSetting.UiState ui, ColorValue value, float mx, float my, float slide) { float y = ui.presetY + slide; float swatch = SettingSkinUtil.m(12f, 8f); float gap = SettingSkinUtil.m(4f, 3f); @@ -156,7 +162,7 @@ final class ColorSettingPresetRenderer { SvgRenderOptions.overrideColor(color)); } - static void renderColorActions(ColorSetting.UiState ui, ColorValue value, float mx, float my, float slide) { + public static void renderColorActions(ColorSetting.UiState ui, ColorValue value, float mx, float my, float slide) { float dt = AnimationUtility.deltaTime(); boolean rgbHover = UnifiedSettingsSkin.inside(mx, my, ui.sliderX, ui.sliderY + slide, ui.sliderW, ui.sliderH); boolean rnbHover = UnifiedSettingsSkin.inside(mx, my, ui.rnbX, ui.rnbY + slide, ui.rnbW, ui.rnbH); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingDrag.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingDrag.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingDrag.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingDrag.java index afb2e3c..7221746 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingDrag.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingDrag.java @@ -5,13 +5,15 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.render; import dev.loki.lovisual.config.values.ColorValue; import java.awt.Color; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class ColorSettingDrag { +public final class ColorSettingDrag { private ColorSettingDrag() { } @@ -62,7 +64,7 @@ final class ColorSettingDrag { } } - static void syncColorFromValue(ColorSetting.UiState ui, ColorValue value) { + public static void syncColorFromValue(ColorSetting.UiState ui, ColorValue value) { int argb = value.getArgb(); ui.lastArgb = argb; ui.red = (argb >>> 16) & 0xFF; @@ -91,7 +93,7 @@ final class ColorSettingDrag { applyColor(value, ((value.supportsAlpha() ? ui.alpha : 255) << 24) | (ui.red << 16) | (ui.green << 8) | ui.blue); } - static void applyColor(ColorValue value, int argb) { + public static void applyColor(ColorValue value, int argb) { if (value.supportsAlpha()) value.set(String.format("#%02X%02X%02X%02X", (argb >>> 24) & 0xFF, (argb >>> 16) & 0xFF, (argb >>> 8) & 0xFF, argb & 0xFF)); else value.set(String.format("#%02X%02X%02X", (argb >>> 16) & 0xFF, (argb >>> 8) & 0xFF, argb & 0xFF)); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingLayout.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingLayout.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingLayout.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingLayout.java index 394cf38..a75a98d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingLayout.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingLayout.java @@ -5,11 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.render; import dev.loki.lovisual.render.engine.animation.AnimationUtility; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class ColorSettingLayout { +public final class ColorSettingLayout { private ColorSettingLayout() { } @@ -31,7 +34,7 @@ final class ColorSettingLayout { return AnimationUtility.easeInOutCubic(UnifiedSettingsSkin.clamp01(ui.rgbExpandAnim)); } - static float colorPresetReveal(ColorSetting.UiState ui) { + public static float colorPresetReveal(ColorSetting.UiState ui) { return AnimationUtility.easeInOutCubic(UnifiedSettingsSkin.clamp01(ui.presetsExpandAnim)); } @@ -40,7 +43,7 @@ final class ColorSettingLayout { return ui.editing ? AnimationUtility.clamp(AnimationUtility.easeOutBack(t, 0.42f), 0f, 1.02f) : 1f - AnimationUtility.easeInCubic(1f - t); } - static float colorReveal(ColorSetting.UiState ui) { + public static float colorReveal(ColorSetting.UiState ui) { float t = UnifiedSettingsSkin.clamp01(ui.expandAnim); if (ui.editing) return AnimationUtility.easeInOutCubic(UnifiedSettingsSkin.clamp01((t - 0.08f) / 0.92f)); return 1f - AnimationUtility.easeInCubic(1f - t); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingRenderer.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingRenderer.java index 24c501b..bde5f4c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingRenderer.java @@ -5,19 +5,29 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.render; import dev.loki.lovisual.config.values.ColorValue; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.hex.ColorSettingHexInput; +import dev.loki.lovisual.features.gui.clickgui.settings.color.hex.ColorSettingHexState; +import dev.loki.lovisual.features.gui.clickgui.settings.color.preset.ColorSettingPresetHandler; +import dev.loki.lovisual.features.gui.clickgui.settings.color.preset.ColorSettingPresetRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingDrag; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingLayout; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingSquareRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class ColorSettingRenderer { +public final class ColorSettingRenderer { private ColorSettingRenderer() { } - static void render(ColorSetting setting, float x, float y, float w, float mx, float my) { + public static void render(ColorSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); ColorSetting.UiState ui = setting.ui(); ColorValue value = setting.value(); @@ -71,7 +81,7 @@ final class ColorSettingRenderer { if (clipped) ScissorFunction.pop(); } - static void mouseClicked(ColorSetting setting, double mx, double my, int button) { + public static void mouseClicked(ColorSetting setting, double mx, double my, int button) { if (button != 0 && button != 1 && button != 2) return; ColorSetting.UiState ui = setting.ui(); ColorValue value = setting.value(); @@ -141,7 +151,7 @@ final class ColorSettingRenderer { } } - static void mouseReleased(ColorSetting setting, double mx, double my, int button) { + public static void mouseReleased(ColorSetting setting, double mx, double my, int button) { if (button != 0) return; ColorSetting.UiState ui = setting.ui(); boolean changed = ui.sbFocused || ui.hFocused || ui.aFocused || ui.rFocused || ui.gFocused || ui.bFocused || ui.aRgbFocused; @@ -150,7 +160,7 @@ final class ColorSettingRenderer { if (changed && setting.getParent() != null) setting.getParent().saveConfig(); } - static void mouseClickedOutside(ColorSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(ColorSetting setting, double mx, double my, int button) { if (button != 0) return; ColorSetting.UiState ui = setting.ui(); if (ui.hexFocused) { @@ -160,7 +170,7 @@ final class ColorSettingRenderer { ColorSettingDrag.clearColorFocus(ui); } - static boolean mouseScrolled(ColorSetting setting, double mx, double my, double amount) { + public static boolean mouseScrolled(ColorSetting setting, double mx, double my, double amount) { ColorSetting.UiState ui = setting.ui(); if (!ui.editing || !ui.presetsExpanded || ui.presetsMaxScroll <= 0.5f) return false; float slide = (1f - ColorSettingLayout.colorReveal(ui)) * SettingSkinUtil.m(8f, 8f); @@ -171,7 +181,7 @@ final class ColorSettingRenderer { return true; } - static float getHeight(ColorSetting setting) { + public static float getHeight(ColorSetting setting) { ColorSetting.UiState ui = setting.ui(); boolean hasAlpha = setting.value().supportsAlpha(); float dt = AnimationUtility.deltaTime(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingSquareRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingSquareRenderer.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingSquareRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingSquareRenderer.java index 98d7027..4d0e5ba 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ColorSettingSquareRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/color/render/ColorSettingSquareRenderer.java @@ -5,13 +5,18 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.color.render; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSettingMath; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingLayout; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class ColorSettingSquareRenderer { +public final class ColorSettingSquareRenderer { private ColorSettingSquareRenderer() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/CooldownRulesSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/cooldown/CooldownRulesSetting.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/CooldownRulesSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/cooldown/CooldownRulesSetting.java index b053d46..b898d29 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/CooldownRulesSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/cooldown/CooldownRulesSetting.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.cooldown; import dev.loki.lovisual.config.values.*; import net.minecraft.core.registries.BuiltInRegistries; @@ -13,13 +13,19 @@ import net.minecraft.resources.Identifier; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; import dev.loki.lovisual.util.wav.ClickGuiSounds; import java.util.*; +import dev.loki.lovisual.features.gui.clickgui.settings.bool.BooleanSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.mode.ModeSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.owner.PickerDetailOwner; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; /** * Picker-backed editor for per-item cooldown rules. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ProtocolHeuristicsSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/cooldown/ProtocolHeuristicsSetting.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ProtocolHeuristicsSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/cooldown/ProtocolHeuristicsSetting.java index 63aa755..e3e62f8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ProtocolHeuristicsSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/cooldown/ProtocolHeuristicsSetting.java @@ -5,12 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.cooldown; import dev.loki.lovisual.config.values.BooleanMapValue; import dev.loki.lovisual.config.values.ConfigValue; import dev.loki.lovisual.config.values.SetValue; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; /** * Compact Edit entry backed by per-module source toggles. The actual regex diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/Setting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/core/Setting.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/Setting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/core/Setting.java index c83e58a..7c9a28e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/Setting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/core/Setting.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.core; import net.minecraft.client.resources.language.I18n; import dev.loki.lovisual.config.ConfigLang; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingFactory.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/core/SettingFactory.java similarity index 77% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingFactory.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/core/SettingFactory.java index 91fda0c..d086667 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingFactory.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/core/SettingFactory.java @@ -5,11 +5,21 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.core; import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.config.values.*; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bool.BooleanSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.cooldown.CooldownRulesSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.cooldown.ProtocolHeuristicsSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.group.GroupSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.mode.ModeSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; /** * Builds GUI settings from GUI-neutral SettingDef. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/GroupSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/group/GroupSetting.java similarity index 74% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/GroupSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/group/GroupSetting.java index 9ac0616..0d7c39a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/GroupSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/group/GroupSetting.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.group; import dev.loki.lovisual.config.values.BooleanMapValue; @@ -14,6 +14,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; public class GroupSetting extends Setting { @@ -80,17 +82,17 @@ public class GroupSetting extends Setting { return SettingRendererBridge.getHeight(this); } - static final class UiState { - final List optionLayouts = new ArrayList<>(); - final Map hoverAnims = new HashMap<>(); - final Map selectAnims = new HashMap<>(); - float baseX, baseY, baseW; - float lastLayoutW = Float.NaN; - int layoutOptionCount = -1; - float cachedHeight = 34f; + public static final class UiState { + public final List optionLayouts = new ArrayList<>(); + public final Map hoverAnims = new HashMap<>(); + public final Map selectAnims = new HashMap<>(); + public float baseX, baseY, baseW; + public float lastLayoutW = Float.NaN; + public int layoutOptionCount = -1; + public float cachedHeight = 34f; } - record OptionLayout(String id, String label, float x, float y, float w) { + public record OptionLayout(String id, String label, float x, float y, float w) { public String getId() { return id; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/GroupSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/group/GroupSettingRenderer.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/GroupSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/group/GroupSettingRenderer.java index 1ec7721..be0710d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/GroupSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/group/GroupSettingRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.group; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -14,12 +14,15 @@ import dev.loki.lovisual.util.wav.ClickGuiSounds; import java.util.HashSet; import java.util.Set; +import dev.loki.lovisual.features.gui.clickgui.settings.group.GroupSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class GroupSettingRenderer { +public final class GroupSettingRenderer { private GroupSettingRenderer() { } - static void render(GroupSetting setting, float x, float y, float w, float mx, float my) { + public static void render(GroupSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); GroupSetting.UiState ui = setting.ui(); ui.baseX = x; @@ -47,7 +50,7 @@ final class GroupSettingRenderer { } } - static void mouseClicked(GroupSetting setting, double mx, double my, int button) { + public static void mouseClicked(GroupSetting setting, double mx, double my, int button) { if (button != 0) return; GroupSetting.UiState ui = setting.ui(); for (GroupSetting.OptionLayout opt : ui.optionLayouts) { @@ -62,7 +65,7 @@ final class GroupSettingRenderer { } } - static float getHeight(GroupSetting setting) { + public static float getHeight(GroupSetting setting) { layoutGroup(setting); return setting.ui().cachedHeight; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nDuplicateScanner.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nDuplicateScanner.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nDuplicateScanner.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nDuplicateScanner.java index 1bc2dc5..b75a8e1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nDuplicateScanner.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nDuplicateScanner.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.i18n; import dev.loki.lovisual.util.logging.DebugLog; import net.minecraft.resources.Identifier; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nPreflightContributors.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nPreflightContributors.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nPreflightContributors.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nPreflightContributors.java index 4427d1a..705e472 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nPreflightContributors.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nPreflightContributors.java @@ -5,14 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.i18n; import dev.loki.lovisual.config.ConfigSerializer; import dev.loki.lovisual.config.MainConfig; import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.config.SettingOwner; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.I18nPreflightCollectEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.player.I18nPreflightCollectEvent; import dev.loki.lovisual.features.gui.hud.AbstractHudElement; import dev.loki.lovisual.features.gui.hud.HudGlobalConfig; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; @@ -22,8 +22,8 @@ import dev.loki.lovisual.features.gui.hud.nondraggable.StaticHudElementRegistry; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleManager; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.DropESP; -import dev.loki.lovisual.features.module.modules.visuals.NameTags; +import dev.loki.lovisual.features.module.modules.visuals.esp.overlay.DropESP; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import dev.loki.lovisual.features.relations.PlayerRelations; import dev.loki.lovisual.util.item.IllegalItemUtil; import dev.loki.lovisual.util.item.RarityColorConfig; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nPreflightManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nPreflightManager.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nPreflightManager.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nPreflightManager.java index eb8df39..ab18594 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/I18nPreflightManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/i18n/I18nPreflightManager.java @@ -5,10 +5,10 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.i18n; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.I18nPreflightCollectEvent; +import dev.loki.lovisual.events.impl.player.I18nPreflightCollectEvent; import dev.loki.lovisual.util.logging.DebugLog; import java.util.ArrayList; @@ -16,6 +16,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; public enum I18nPreflightManager { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModeSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/mode/ModeSetting.java similarity index 78% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModeSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/mode/ModeSetting.java index bf09749..ca059f2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModeSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/mode/ModeSetting.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.mode; import dev.loki.lovisual.config.values.EnumValue; import dev.loki.lovisual.config.values.ModeValue; @@ -14,6 +14,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; public class ModeSetting extends Setting { @@ -107,18 +109,18 @@ public class ModeSetting extends Setting { return SettingRendererBridge.getHeight(this); } - static final class UiState { - final List optionLayouts = new ArrayList<>(); - final Map hoverAnims = new HashMap<>(); - float baseX, baseY, baseW; - float cachedHeight = 64f; - float selectX, selectY, selectW; - boolean selectInit = false; - float lastLayoutW = Float.NaN; - int layoutOptionCount = -1; + public static final class UiState { + public final List optionLayouts = new ArrayList<>(); + public final Map hoverAnims = new HashMap<>(); + public float baseX, baseY, baseW; + public float cachedHeight = 64f; + public float selectX, selectY, selectW; + public boolean selectInit = false; + public float lastLayoutW = Float.NaN; + public int layoutOptionCount = -1; } - record OptionLayout(String id, String label, float x, float y, float w) { + public record OptionLayout(String id, String label, float x, float y, float w) { public String getId() { return id; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModeSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/mode/ModeSettingRenderer.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModeSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/mode/ModeSettingRenderer.java index 6be0471..c32eb1f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModeSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/mode/ModeSettingRenderer.java @@ -5,18 +5,21 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.mode; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.wav.ClickGuiSounds; +import dev.loki.lovisual.features.gui.clickgui.settings.mode.ModeSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class ModeSettingRenderer { +public final class ModeSettingRenderer { private ModeSettingRenderer() { } - static void render(ModeSetting setting, float x, float y, float w, float mx, float my) { + public static void render(ModeSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); ModeSetting.UiState ui = setting.ui(); ui.baseX = x; @@ -41,7 +44,7 @@ final class ModeSettingRenderer { } } - static void mouseClicked(ModeSetting setting, double mx, double my, int button) { + public static void mouseClicked(ModeSetting setting, double mx, double my, int button) { if (button != 0) return; ModeSetting.UiState ui = setting.ui(); for (ModeSetting.OptionLayout opt : ui.optionLayouts) { @@ -58,7 +61,7 @@ final class ModeSettingRenderer { } } - static float getHeight(ModeSetting setting) { + public static float getHeight(ModeSetting setting) { layoutMode(setting); return setting.ui().cachedHeight; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/PickerDetailOwner.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/owner/PickerDetailOwner.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/PickerDetailOwner.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/owner/PickerDetailOwner.java index 831d26d..901fb60 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/PickerDetailOwner.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/owner/PickerDetailOwner.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.owner; /** * Optional extension for picker-backed settings that need an inline editor inside the picker overlay. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextEditorOwner.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/owner/TextEditorOwner.java similarity index 82% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextEditorOwner.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/owner/TextEditorOwner.java index d6aebe2..2f3e214 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextEditorOwner.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/owner/TextEditorOwner.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.owner; public interface TextEditorOwner { void applyEditorText(String rawText); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRenderContext.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRenderContext.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRenderContext.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRenderContext.java index d039851..fe358d6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRenderContext.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRenderContext.java @@ -5,7 +5,8 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.render; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderSurface; public enum SettingRenderContext { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRenderSurface.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRenderSurface.java similarity index 77% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRenderSurface.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRenderSurface.java index 60b439e..ba01d94 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRenderSurface.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRenderSurface.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.render; public enum SettingRenderSurface { MODULES, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRendererBridge.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRendererBridge.java similarity index 64% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRendererBridge.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRendererBridge.java index bd834d2..3b6c7d5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingRendererBridge.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/SettingRendererBridge.java @@ -5,216 +5,228 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.render; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.SystemCursor; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bool.BooleanSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.group.GroupSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.mode.ModeSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.UnifiedSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; -enum SettingRendererBridge { +public enum SettingRendererBridge { ; private static final String ICON_WARN = "L"; - static void render(BooleanSetting setting, float x, float y, float w, float mx, float my) { + public static void render(BooleanSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(BooleanSetting setting, double mx, double my, int button) { + public static void mouseClicked(BooleanSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static float getHeight(BooleanSetting setting) { + public static float getHeight(BooleanSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(SliderSetting setting, float x, float y, float w, float mx, float my) { + public static void render(SliderSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(SliderSetting setting, double mx, double my, int button) { + public static void mouseClicked(SliderSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static void mouseReleased(SliderSetting setting, double mx, double my, int button) { + public static void mouseReleased(SliderSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseReleased(setting, mx, my, button); } - static void mouseClickedOutside(SliderSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(SliderSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClickedOutside(setting, mx, my, button); } - static boolean keyPressed(SliderSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(SliderSetting setting, int keyCode, int scanCode, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.keyPressed(setting, keyCode, scanCode, modifiers); } - static boolean charTyped(SliderSetting setting, char chr, int modifiers) { + public static boolean charTyped(SliderSetting setting, char chr, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.charTyped(setting, chr, modifiers); } - static float getHeight(SliderSetting setting) { + public static float getHeight(SliderSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(ColorSetting setting, float x, float y, float w, float mx, float my) { + public static void render(ColorSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(ColorSetting setting, double mx, double my, int button) { + public static void mouseClicked(ColorSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static void mouseReleased(ColorSetting setting, double mx, double my, int button) { + public static void mouseReleased(ColorSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseReleased(setting, mx, my, button); } - static void mouseClickedOutside(ColorSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(ColorSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClickedOutside(setting, mx, my, button); } - static boolean keyPressed(ColorSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(ColorSetting setting, int keyCode, int scanCode, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.keyPressed(setting, keyCode, scanCode, modifiers); } - static boolean charTyped(ColorSetting setting, char chr, int modifiers) { + public static boolean charTyped(ColorSetting setting, char chr, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.charTyped(setting, chr, modifiers); } - static boolean mouseScrolled(ColorSetting setting, double mx, double my, double amount) { + public static boolean mouseScrolled(ColorSetting setting, double mx, double my, double amount) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.mouseScrolled(setting, mx, my, amount); } - static float getHeight(ColorSetting setting) { + public static float getHeight(ColorSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(TextSetting setting, float x, float y, float w, float mx, float my) { + public static void render(TextSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(TextSetting setting, double mx, double my, int button) { + public static void mouseClicked(TextSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static void mouseClickedOutside(TextSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(TextSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClickedOutside(setting, mx, my, button); } - static boolean keyPressed(TextSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(TextSetting setting, int keyCode, int scanCode, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.keyPressed(setting, keyCode, scanCode, modifiers); } - static boolean charTyped(TextSetting setting, char chr, int modifiers) { + public static boolean charTyped(TextSetting setting, char chr, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.charTyped(setting, chr, modifiers); } - static float getHeight(TextSetting setting) { + public static float getHeight(TextSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(TextListSetting setting, float x, float y, float w, float mx, float my) { + public static void render(TextListSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(TextListSetting setting, double mx, double my, int button) { + public static void mouseClicked(TextListSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static void mouseClickedOutside(TextListSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(TextListSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClickedOutside(setting, mx, my, button); } - static boolean keyPressed(TextListSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(TextListSetting setting, int keyCode, int scanCode, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.keyPressed(setting, keyCode, scanCode, modifiers); } - static boolean charTyped(TextListSetting setting, char chr, int modifiers) { + public static boolean charTyped(TextListSetting setting, char chr, int modifiers) { if (!setting.isAvailable()) return false; return UnifiedSettingRenderer.charTyped(setting, chr, modifiers); } - static float getHeight(TextListSetting setting) { + public static float getHeight(TextListSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(GroupSetting setting, float x, float y, float w, float mx, float my) { + public static void render(GroupSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(GroupSetting setting, double mx, double my, int button) { + public static void mouseClicked(GroupSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static float getHeight(GroupSetting setting) { + public static float getHeight(GroupSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(ModeSetting setting, float x, float y, float w, float mx, float my) { + public static void render(ModeSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(ModeSetting setting, double mx, double my, int button) { + public static void mouseClicked(ModeSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static float getHeight(ModeSetting setting) { + public static float getHeight(ModeSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(KeyBindSetting setting, float x, float y, float w, float mx, float my) { + public static void render(KeyBindSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(KeyBindSetting setting, double mx, double my, int button) { + public static void mouseClicked(KeyBindSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static float getHeight(KeyBindSetting setting) { + public static float getHeight(KeyBindSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } - static void render(FunctionBindSetting setting, float x, float y, float w, float mx, float my) { + public static void render(FunctionBindSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingRenderer.render(setting, x, y, w, mx, my); renderUnavailable(setting, x, y, w, mx, my); } - static void mouseClicked(FunctionBindSetting setting, double mx, double my, int button) { + public static void mouseClicked(FunctionBindSetting setting, double mx, double my, int button) { if (!setting.isAvailable()) return; UnifiedSettingRenderer.mouseClicked(setting, mx, my, button); } - static float getHeight(FunctionBindSetting setting) { + public static float getHeight(FunctionBindSetting setting) { return UnifiedSettingRenderer.getHeight(setting); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/UnifiedSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/UnifiedSettingRenderer.java similarity index 73% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/UnifiedSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/UnifiedSettingRenderer.java index 3607da3..6fbfcd8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/UnifiedSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/render/UnifiedSettingRenderer.java @@ -5,9 +5,31 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.render; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.bool.BooleanSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bool.BooleanSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.color.hex.ColorSettingHexInput; +import dev.loki.lovisual.features.gui.clickgui.settings.color.render.ColorSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.group.GroupSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.group.GroupSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.mode.ModeSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.mode.ModeSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderTextInputHandler; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSettingTextInputHandler; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListTextEditHandler; -enum UnifiedSettingRenderer { +public enum UnifiedSettingRenderer { ; // ------------------------------------------------------------ @@ -30,31 +52,31 @@ enum UnifiedSettingRenderer { // Slider // ------------------------------------------------------------ - static void render(SliderSetting setting, float x, float y, float w, float mx, float my) { + public static void render(SliderSetting setting, float x, float y, float w, float mx, float my) { SliderSettingRenderer.render(setting, x, y, w, mx, my); } - static void mouseClicked(SliderSetting setting, double mx, double my, int button) { + public static void mouseClicked(SliderSetting setting, double mx, double my, int button) { SliderSettingRenderer.mouseClicked(setting, mx, my, button); } - static void mouseReleased(SliderSetting setting, double mx, double my, int button) { + public static void mouseReleased(SliderSetting setting, double mx, double my, int button) { SliderSettingRenderer.mouseReleased(setting, mx, my, button); } - static void mouseClickedOutside(SliderSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(SliderSetting setting, double mx, double my, int button) { SliderSettingRenderer.mouseClickedOutside(setting, mx, my, button); } - static boolean keyPressed(SliderSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(SliderSetting setting, int keyCode, int scanCode, int modifiers) { return SliderTextInputHandler.keyPressed(setting, keyCode, scanCode, modifiers); } - static boolean charTyped(SliderSetting setting, char chr, int modifiers) { + public static boolean charTyped(SliderSetting setting, char chr, int modifiers) { return SliderTextInputHandler.charTyped(setting, chr, modifiers); } - static float getHeight(SliderSetting setting) { + public static float getHeight(SliderSetting setting) { return SliderSettingRenderer.getHeight(setting); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModulesSettingsSkin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/ModulesSettingsSkin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModulesSettingsSkin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/ModulesSettingsSkin.java index 5efa247..ae92f2b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/ModulesSettingsSkin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/ModulesSettingsSkin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.skin; import dev.loki.lovisual.features.theme.Theme; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; @@ -15,8 +15,9 @@ import dev.loki.lovisual.render.engine.svg.SvgRenderOptions; import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderContext; -enum ModulesSettingsSkin { +public enum ModulesSettingsSkin { ; static final float HEADER_H = 19f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingSkinUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/SettingSkinUtil.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingSkinUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/SettingSkinUtil.java index bccf72f..6e67949 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingSkinUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/SettingSkinUtil.java @@ -5,29 +5,31 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.skin; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; +import dev.loki.lovisual.features.gui.clickgui.settings.color.ColorSettingMath; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class SettingSkinUtil { +public final class SettingSkinUtil { private SettingSkinUtil() { } - static float m(float settings, float modules) { + public static float m(float settings, float modules) { return UnifiedSettingsSkin.metric(settings, modules); } - static float s() { + public static float s() { return UnifiedSettingsSkin.scale(); } - static boolean modules() { + public static boolean modules() { return UnifiedSettingsSkin.modules(); } - static void renderOptionContainer(float x, float y, float w, float h, boolean active) { + public static void renderOptionContainer(float x, float y, float w, float h, boolean active) { float alpha = active ? 0.22f : 0.12f; if (active) { UnifiedSettingsSkin.drawAccent(x, y, Math.max(1f, w), Math.max(m(14f, 10f), h), m(3f, 3f), alpha); @@ -36,7 +38,7 @@ final class SettingSkinUtil { } } - static void renderChipButton(float x, float y, float w, float h, String label, float hoverAnim, boolean active) { + public static void renderChipButton(float x, float y, float w, float h, String label, float hoverAnim, boolean active) { TextRenderer font = UnifiedSettingsSkin.fontMedium(); int bg = active ? UnifiedSettingsSkin.withAlpha(UnifiedSettingsSkin.ACCENT, 70) : UnifiedSettingsSkin.SURFACE_SOFT; bg = UnifiedSettingsSkin.mix(bg, UnifiedSettingsSkin.SURFACE_HOVER, hoverAnim * 0.72f); @@ -52,7 +54,7 @@ final class SettingSkinUtil { ClickGuiRenderer.drawText(font, label, x + Math.max(m(2f, 2f), (w - tw) * 0.5f), ty, size, color, false); } - static void renderRainbowChipButton(float x, float y, float w, float h, float hoverAnim, boolean active) { + public static void renderRainbowChipButton(float x, float y, float w, float h, float hoverAnim, boolean active) { float t = (System.nanoTime() % 3_000_000_000L) / 3_000_000_000f; int c0 = ColorSettingMath.hsbToArgb((t + 0.00f) % 1f, 0.80f, 1.0f, active ? 205 : 92 + Math.round(hoverAnim * 34f)); int c1 = ColorSettingMath.hsbToArgb((t + 0.18f) % 1f, 0.80f, 1.0f, active ? 215 : 96 + Math.round(hoverAnim * 38f)); @@ -81,7 +83,7 @@ final class SettingSkinUtil { ClickGuiRenderer.drawText(font, label, x + Math.max(m(2f, 2f), (w - tw) * 0.5f), ty, size, labelColor, false); } - static void renderChecker(float x, float y, float w, float h, float cell, float radius) { + public static void renderChecker(float x, float y, float w, float h, float cell, float radius) { int light = 0xFFE7E7E7; int dark = 0xFF777777; ClickGuiRenderer.drawRoundedRect(x, y, w, h, radius, light); @@ -98,7 +100,7 @@ final class SettingSkinUtil { if (clipped) ScissorFunction.pop(); } - static void drawBindMarquee( + public static void drawBindMarquee( TextRenderer font, String text, float x, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/UnifiedSettingsSkin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/UnifiedSettingsSkin.java similarity index 79% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/UnifiedSettingsSkin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/UnifiedSettingsSkin.java index 2963b0f..aff05f1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/UnifiedSettingsSkin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/skin/UnifiedSettingsSkin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.skin; import dev.loki.lovisual.features.theme.Theme; import dev.loki.lovisual.render.engine.renderer.Renderer2D; @@ -15,22 +15,24 @@ import dev.loki.lovisual.render.engine.svg.SvgRenderOptions; import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderContext; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRenderSurface; -enum UnifiedSettingsSkin { +public enum UnifiedSettingsSkin { ; static final float ROW_GAP = 3f; - static int TEXT_PRIMARY = 0xFFE8ECF7; - static int TEXT_MUTED = 0xFFADB5C6; - static int TEXT_FAINT = 0x88ADB5C6; + public static int TEXT_PRIMARY = 0xFFE8ECF7; + public static int TEXT_MUTED = 0xFFADB5C6; + public static int TEXT_FAINT = 0x88ADB5C6; - static int SURFACE = 0x301A1F27; - static int SURFACE_HOVER = 0x40222932; - static int SURFACE_SOFT = 0x28161B23; + public static int SURFACE = 0x301A1F27; + public static int SURFACE_HOVER = 0x40222932; + public static int SURFACE_SOFT = 0x28161B23; static int SURFACE_GRADIENT_START = SURFACE_SOFT; static int SURFACE_GRADIENT_END = SURFACE_HOVER; static float SURFACE_GRADIENT_ANGLE = 90f; - static boolean SURFACE_GRADIENT_ENABLED = false; + public static boolean SURFACE_GRADIENT_ENABLED = false; static int CARD_GRADIENT_START = SURFACE_SOFT; static int CARD_GRADIENT_END = SURFACE_HOVER; static float CARD_GRADIENT_ANGLE = 90f; @@ -38,16 +40,16 @@ enum UnifiedSettingsSkin { static int STROKE_GRADIENT_START = TEXT_FAINT; static int STROKE_GRADIENT_END = TEXT_FAINT; static float STROKE_GRADIENT_ANGLE = 90f; - static boolean STROKE_GRADIENT_ENABLED = false; + public static boolean STROKE_GRADIENT_ENABLED = false; - static int ACCENT = 0xFF9747FF; - static int ACCENT_SOFT = 0x629747FF; + public static int ACCENT = 0xFF9747FF; + public static int ACCENT_SOFT = 0x629747FF; static int ACCENT_GRADIENT_START = ACCENT; static int ACCENT_GRADIENT_END = ACCENT_SOFT; - static float ACCENT_GRADIENT_ANGLE = 45f; + public static float ACCENT_GRADIENT_ANGLE = 45f; static int CHECK_COLOR = 0xFFEFF3FF; - static void syncTheme() { + public static void syncTheme() { Themes.Theme theme = Theme.theme(); if (theme == null) return; @@ -105,40 +107,40 @@ enum UnifiedSettingsSkin { return SettingRenderContext.current() == SettingRenderSurface.MODULES; } - static float scale() { + public static float scale() { syncTheme(); return Math.max(0.25f, Math.min(4.0f, SettingRenderContext.scale())); } - static float metric(float settings, float modules) { + public static float metric(float settings, float modules) { return (modules() ? modules : settings) * scale(); } - static TextRenderer fontRegular() { + public static TextRenderer fontRegular() { return Fonts.renderer("Onest", FontInfo.Type.Regular, ClickGuiRenderer.getInterRegular()); } - static TextRenderer fontMedium() { + public static TextRenderer fontMedium() { return Fonts.renderer("OnestMedium", FontInfo.Type.Regular, fontRegular()); } - static TextRenderer fontSemibold() { + public static TextRenderer fontSemibold() { return Fonts.renderer("OnestBold", FontInfo.Type.Regular, fontMedium()); } - static TextRenderer fontLight() { + public static TextRenderer fontLight() { return Fonts.renderer("OnestLight", FontInfo.Type.Regular, fontRegular()); } - static boolean inside(double mx, double my, float x, float y, float w, float h) { + public static boolean inside(double mx, double my, float x, float y, float w, float h) { return mx >= x && mx <= x + w && my >= y && my <= y + h; } - static float clamp01(float value) { + public static float clamp01(float value) { return Math.max(0f, Math.min(1f, value)); } - static int mix(int from, int to, float t) { + public static int mix(int from, int to, float t) { t = clamp01(t); int a = Math.round(((from >>> 24) & 0xFF) * (1f - t) + ((to >>> 24) & 0xFF) * t); int r = Math.round(((from >>> 16) & 0xFF) * (1f - t) + ((to >>> 16) & 0xFF) * t); @@ -147,13 +149,13 @@ enum UnifiedSettingsSkin { return ((a & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF); } - static int withAlpha(int color, float alpha01) { + public static int withAlpha(int color, float alpha01) { int base = (color >>> 24) & 0xFF; int a = Math.round(base * clamp01(alpha01)); return (color & 0x00FFFFFF) | ((a & 0xFF) << 24); } - static int withAlpha(int color, int alpha) { + public static int withAlpha(int color, int alpha) { int a = Math.max(0, Math.min(255, alpha)); return (color & 0x00FFFFFF) | (a << 24); } @@ -162,15 +164,15 @@ enum UnifiedSettingsSkin { return withAlpha(color, alpha); } - static String fit(TextRenderer font, String text, float size, float width) { + public static String fit(TextRenderer font, String text, float size, float width) { return ClickGuiRenderer.fitText(font, text, size, Math.max(1f, width)); } - static float textHeight(TextRenderer font, float size) { + public static float textHeight(TextRenderer font, float size) { return ClickGuiRenderer.textHeight(font, size); } - static float textWidth(TextRenderer font, String text, float size) { + public static float textWidth(TextRenderer font, String text, float size) { return ClickGuiRenderer.textWidth(font, text == null ? "" : text, size); } @@ -202,15 +204,15 @@ enum UnifiedSettingsSkin { return withAlpha(STROKE_GRADIENT_END, alpha); } - static int accentGradientStart(float alpha) { + public static int accentGradientStart(float alpha) { return withAlpha(ACCENT_GRADIENT_START, alpha); } - static int accentGradientEnd(float alpha) { + public static int accentGradientEnd(float alpha) { return withAlpha(ACCENT_GRADIENT_END, alpha); } - static void drawSurface(float x, float y, float w, float h, float radius, float alpha) { + public static void drawSurface(float x, float y, float w, float h, float radius, float alpha) { if (SURFACE_GRADIENT_ENABLED) { ClickGuiRenderer.drawRoundedRectGradient(x, y, w, h, radius, surfaceGradientStart(alpha), surfaceGradientEnd(alpha), SURFACE_GRADIENT_ANGLE); } else { @@ -218,7 +220,7 @@ enum UnifiedSettingsSkin { } } - static void drawCard(float x, float y, float w, float h, float radius, float alpha) { + public static void drawCard(float x, float y, float w, float h, float radius, float alpha) { if (CARD_GRADIENT_ENABLED) { ClickGuiRenderer.drawRoundedRectGradient(x, y, w, h, radius, cardGradientStart(alpha), cardGradientEnd(alpha), CARD_GRADIENT_ANGLE); } else { @@ -226,11 +228,11 @@ enum UnifiedSettingsSkin { } } - static void drawAccent(float x, float y, float w, float h, float radius, float alpha) { + public static void drawAccent(float x, float y, float w, float h, float radius, float alpha) { ClickGuiRenderer.drawRoundedRectGradient(x, y, w, h, radius, accentGradientStart(alpha), accentGradientEnd(alpha), ACCENT_GRADIENT_ANGLE); } - static void drawStroke(float x, float y, float w, float h, float radius, float thickness, float alpha) { + public static void drawStroke(float x, float y, float w, float h, float radius, float thickness, float alpha) { if (STROKE_GRADIENT_ENABLED) { ClickGuiRenderer.drawRoundedRectStrokeGradient(x, y, w, h, radius, thickness, strokeGradientStart(alpha), strokeGradientEnd(alpha), STROKE_GRADIENT_ANGLE); } else { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderSetting.java similarity index 65% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderSetting.java index a1b3679..a01715c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderSetting.java @@ -5,10 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.slider; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.util.text.TextSelection; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; public class SliderSetting extends Setting { @@ -20,11 +22,11 @@ public class SliderSetting extends Setting { this.value = value; } - NumberValue value() { + public NumberValue value() { return value; } - UiState ui() { + public UiState ui() { return ui; } @@ -77,23 +79,23 @@ public class SliderSetting extends Setting { return SettingRendererBridge.getHeight(this); } - static final class UiState { - final TextSelection editSelection = new TextSelection(); - boolean dragging; - float lastX, lastY, lastW; - float anim = 0f; - float hoverAnim = 0f; - float valueHoverAnim = 0f; - float editAnim = 0f; - float errorAnim = 0f; - float cursorBlink = 0f; - boolean editing = false; - String editBuffer = ""; - int editCursor = 0; - float inputHoverAnim = 0f; - float inputFocusGlowAnim = 0f; - float inputPressAnim = 0f; - float valueX, valueY, valueW, valueH; - float valueTextX, valueTextY, valueTextSize, valueTextPad; + public static final class UiState { + public final TextSelection editSelection = new TextSelection(); + public boolean dragging; + public float lastX, lastY, lastW; + public float anim = 0f; + public float hoverAnim = 0f; + public float valueHoverAnim = 0f; + public float editAnim = 0f; + public float errorAnim = 0f; + public float cursorBlink = 0f; + public boolean editing = false; + public String editBuffer = ""; + public int editCursor = 0; + public float inputHoverAnim = 0f; + public float inputFocusGlowAnim = 0f; + public float inputPressAnim = 0f; + public float valueX, valueY, valueW, valueH; + public float valueTextX, valueTextY, valueTextSize, valueTextPad; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderSettingRenderer.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderSettingRenderer.java index 9fbb8aa..206a2aa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderSettingRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.slider; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; @@ -13,12 +13,18 @@ import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; import dev.loki.lovisual.render.helpers.SystemCursor; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderTextInputHandler; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderTextInputState; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class SliderSettingRenderer { +public final class SliderSettingRenderer { private SliderSettingRenderer() { } - static void render(SliderSetting setting, float x, float y, float w, float mx, float my) { + public static void render(SliderSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); SliderSetting.UiState ui = setting.ui(); NumberValue value = setting.value(); @@ -146,7 +152,7 @@ final class SliderSettingRenderer { ClickGuiRenderer.drawRoundedRect(knobX, knobY, knobW, knobH, knobW * 0.5f, knobCol); } - static void mouseClicked(SliderSetting setting, double mx, double my, int button) { + public static void mouseClicked(SliderSetting setting, double mx, double my, int button) { if (button != 0) return; float trackPad = SettingSkinUtil.m(6f, 5f); SliderSetting.UiState ui = setting.ui(); @@ -172,20 +178,20 @@ final class SliderSettingRenderer { SliderTextInputHandler.setSliderValueFromMouse(setting, (float) mx, trackX, trackW, setting.value().getMin().doubleValue(), setting.value().getMax().doubleValue()); } - static void mouseReleased(SliderSetting setting, double mx, double my, int button) { + public static void mouseReleased(SliderSetting setting, double mx, double my, int button) { if (button != 0 || !setting.ui().dragging) return; setting.ui().dragging = false; if (setting.getParent() != null) setting.getParent().saveConfig(); } - static void mouseClickedOutside(SliderSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(SliderSetting setting, double mx, double my, int button) { if (button != 0) return; SliderSetting.UiState ui = setting.ui(); if (!ui.editing) return; SliderTextInputHandler.commitSliderEdit(setting, true); } - static float getHeight(SliderSetting setting) { + public static float getHeight(SliderSetting setting) { return SettingSkinUtil.m(58f, 24f); } } \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderTextInputHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderTextInputHandler.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderTextInputHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderTextInputHandler.java index b98eb4c..1ed685a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderTextInputHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderTextInputHandler.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.slider; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.config.values.NumberValue; @@ -13,8 +13,13 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.text.ClipboardUtil; import dev.loki.lovisual.util.wav.ClickGuiSounds; import org.lwjgl.glfw.GLFW; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderTextInputState; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class SliderTextInputHandler { +public final class SliderTextInputHandler { private SliderTextInputHandler() { } @@ -38,7 +43,7 @@ final class SliderTextInputHandler { ui.errorAnim = 0f; } - static void commitSliderEdit(SliderSetting setting, boolean save) { + public static void commitSliderEdit(SliderSetting setting, boolean save) { SliderSetting.UiState ui = setting.ui(); String raw = ui.editBuffer == null ? "" : ui.editBuffer.trim().replace(',', '.'); if (!SliderTextInputState.sliderTextCanCommit(setting, raw)) { @@ -71,7 +76,7 @@ final class SliderTextInputHandler { SliderTextInputState.setSliderCursor(ui, cursor, shift); } - static void insertSliderText(SliderSetting setting, String text) { + public static void insertSliderText(SliderSetting setting, String text) { String sanitized = SliderTextInputState.sanitizeSliderText(text, SliderTextInputState.sliderInteger(setting)); if (sanitized.isEmpty()) { SliderTextInputState.pulseSliderError(setting.ui()); @@ -94,7 +99,7 @@ final class SliderTextInputHandler { SliderTextInputState.validateSliderLive(setting, ui); } - static void setSliderValueFromMouse(SliderSetting setting, float mx, float trackX, float trackW, double min, double max) { + public static void setSliderValueFromMouse(SliderSetting setting, float mx, float trackX, float trackW, double min, double max) { float percent = UnifiedSettingsSkin.clamp01((mx - trackX) / Math.max(1f, trackW)); double nextRaw = min + (max - min) * percent; NumberValue value = setting.value(); @@ -109,7 +114,7 @@ final class SliderTextInputHandler { } } - static boolean keyPressed(SliderSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(SliderSetting setting, int keyCode, int scanCode, int modifiers) { SliderSetting.UiState ui = setting.ui(); if (!ui.editing) return false; boolean ctrl = (modifiers & GLFW.GLFW_MOD_CONTROL) != 0; @@ -148,7 +153,7 @@ final class SliderTextInputHandler { return true; } - static boolean charTyped(SliderSetting setting, char chr, int modifiers) { + public static boolean charTyped(SliderSetting setting, char chr, int modifiers) { SliderSetting.UiState ui = setting.ui(); if (!ui.editing) return false; if (chr == ',' || chr == '.') { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderTextInputState.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderTextInputState.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderTextInputState.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderTextInputState.java index 2bf69d4..ee4c1e1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SliderTextInputState.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/slider/SliderTextInputState.java @@ -5,9 +5,10 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.slider; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; -final class SliderTextInputState { +public final class SliderTextInputState { private SliderTextInputState() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSetting.java similarity index 73% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSetting.java index 08c918c..9c554be 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSetting.java @@ -5,10 +5,13 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.text; import dev.loki.lovisual.config.values.StringValue; import dev.loki.lovisual.util.text.TextSelection; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.owner.TextEditorOwner; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; public class TextSetting extends Setting implements TextEditorOwner { @@ -78,17 +81,17 @@ public class TextSetting extends Setting implements TextEditorOwner { return true; } - static final class UiState { - final TextSelection editSelection = new TextSelection(); - float fieldX, fieldY, fieldW, fieldH; - float textX, textY, textSize; - float textScroll; - float hoverAnim; - float focusAnim; - float errorAnim; - float cursorBlink; - boolean editing; - String editBuffer = ""; - int editCursor; + public static final class UiState { + public final TextSelection editSelection = new TextSelection(); + public float fieldX, fieldY, fieldW, fieldH; + public float textX, textY, textSize; + public float textScroll; + public float hoverAnim; + public float focusAnim; + public float errorAnim; + public float cursorBlink; + public boolean editing; + public String editBuffer = ""; + public int editCursor; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSettingRenderer.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSettingRenderer.java index ac35137..2b9dc4c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSettingRenderer.java @@ -5,18 +5,23 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.text; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSettingTextInputHandler; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class TextSettingRenderer { +public final class TextSettingRenderer { private TextSettingRenderer() { } - static void render(TextSetting setting, float x, float y, float w, float mx, float my) { + public static void render(TextSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); TextSetting.UiState ui = setting.ui(); TextRenderer font = UnifiedSettingsSkin.fontMedium(); @@ -81,7 +86,7 @@ final class TextSettingRenderer { if (clip) ScissorFunction.pop(); } - static void mouseClicked(TextSetting setting, double mx, double my, int button) { + public static void mouseClicked(TextSetting setting, double mx, double my, int button) { if (button != 0) return; TextSetting.UiState ui = setting.ui(); if (UnifiedSettingsSkin.inside(mx, my, ui.fieldX, ui.fieldY, ui.fieldW, ui.fieldH)) { @@ -92,12 +97,12 @@ final class TextSettingRenderer { } } - static void mouseClickedOutside(TextSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(TextSetting setting, double mx, double my, int button) { if (button != 0) return; if (setting.ui().editing) TextSettingTextInputHandler.commitTextEdit(setting, true); } - static float getHeight(TextSetting setting) { + public static float getHeight(TextSetting setting) { return SettingSkinUtil.m(50f, 28f); } } \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSettingTextInputHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSettingTextInputHandler.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSettingTextInputHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSettingTextInputHandler.java index 89e0c3e..376653f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextSettingTextInputHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/TextSettingTextInputHandler.java @@ -5,13 +5,17 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.text; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.text.ClipboardUtil; import org.lwjgl.glfw.GLFW; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.text.TextSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class TextSettingTextInputHandler { +public final class TextSettingTextInputHandler { private TextSettingTextInputHandler() { } @@ -125,7 +129,7 @@ final class TextSettingTextInputHandler { return true; } - static boolean keyPressed(TextSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(TextSetting setting, int keyCode, int scanCode, int modifiers) { TextSetting.UiState ui = setting.ui(); if (!ui.editing) return false; boolean ctrl = (modifiers & GLFW.GLFW_MOD_CONTROL) != 0; @@ -161,7 +165,7 @@ final class TextSettingTextInputHandler { return true; } - static boolean charTyped(TextSetting setting, char chr, int modifiers) { + public static boolean charTyped(TextSetting setting, char chr, int modifiers) { TextSetting.UiState ui = setting.ui(); if (!ui.editing) return false; if (chr == '\n' || chr == '\r') return true; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListSetting.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListSetting.java similarity index 81% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListSetting.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListSetting.java index 2324800..bec9600 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListSetting.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListSetting.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.text.list; import dev.loki.lovisual.config.values.ConfigValue; import dev.loki.lovisual.config.values.ItemIdSetValue; @@ -15,6 +15,9 @@ import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; import java.util.stream.Collectors; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.owner.TextEditorOwner; +import dev.loki.lovisual.features.gui.clickgui.settings.render.SettingRendererBridge; /** * Button + modal text editor or picker for editing Set-based values. @@ -40,7 +43,7 @@ public class TextListSetting extends Setting implements TextEditorOwner { return value; } - UiState ui() { + public UiState ui() { return ui; } @@ -136,18 +139,18 @@ public class TextListSetting extends Setting implements TextEditorOwner { ENTITIES } - static final class UiState { - final TextSelection editSelection = new TextSelection(); - float lastButtonX, lastButtonY, lastButtonW, lastButtonH; - float lastX, lastY, lastW; - float fieldX, fieldY, fieldW, fieldH; - float moduleHoverAnim; - float fieldHoverAnim; - float fieldFocusAnim; - float fieldErrorAnim; - float cursorBlink; - boolean editing; - String editBuffer = ""; - int editCursor; + public static final class UiState { + public final TextSelection editSelection = new TextSelection(); + public float lastButtonX, lastButtonY, lastButtonW, lastButtonH; + public float lastX, lastY, lastW; + public float fieldX, fieldY, fieldW, fieldH; + public float moduleHoverAnim; + public float fieldHoverAnim; + public float fieldFocusAnim; + public float fieldErrorAnim; + public float cursorBlink; + public boolean editing; + public String editBuffer = ""; + public int editCursor; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListSettingRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListSettingRenderer.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListSettingRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListSettingRenderer.java index cc5360b..27f9cb4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListSettingRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListSettingRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.text.list; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -14,12 +14,17 @@ import dev.loki.lovisual.render.helpers.ScissorFunction; import java.util.List; import java.util.Set; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListTextEditHandler; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class TextListSettingRenderer { +public final class TextListSettingRenderer { private TextListSettingRenderer() { } - static void render(TextListSetting setting, float x, float y, float w, float mx, float my) { + public static void render(TextListSetting setting, float x, float y, float w, float mx, float my) { UnifiedSettingsSkin.syncTheme(); TextListSetting.UiState ui = setting.ui(); ui.lastX = x; @@ -118,7 +123,7 @@ final class TextListSettingRenderer { if (clip) ScissorFunction.pop(); } - static void mouseClicked(TextListSetting setting, double mx, double my, int button) { + public static void mouseClicked(TextListSetting setting, double mx, double my, int button) { if (button != 0) return; TextListSetting.UiState ui = setting.ui(); if (isInlineTextList(setting)) { @@ -138,12 +143,12 @@ final class TextListSettingRenderer { } } - static void mouseClickedOutside(TextListSetting setting, double mx, double my, int button) { + public static void mouseClickedOutside(TextListSetting setting, double mx, double my, int button) { if (button != 0 || !isInlineTextList(setting)) return; if (setting.ui().editing) TextListTextEditHandler.commitTextListEdit(setting, true); } - static float getHeight(TextListSetting setting) { + public static float getHeight(TextListSetting setting) { return isInlineTextList(setting) ? inlineTextListHeight() : textListButtonHeight(setting); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListTextEditHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListTextEditHandler.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListTextEditHandler.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListTextEditHandler.java index 8e47d39..26736e6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/TextListTextEditHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/text/list/TextListTextEditHandler.java @@ -5,15 +5,20 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.text.list; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.text.ClipboardUtil; import org.lwjgl.glfw.GLFW; import java.util.LinkedHashSet; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSettingRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.util.SettingTextInputUtil; -final class TextListTextEditHandler { +public final class TextListTextEditHandler { private TextListTextEditHandler() { } @@ -113,7 +118,7 @@ final class TextListTextEditHandler { return true; } - static boolean keyPressed(TextListSetting setting, int keyCode, int scanCode, int modifiers) { + public static boolean keyPressed(TextListSetting setting, int keyCode, int scanCode, int modifiers) { if (!TextListSettingRenderer.isInlineTextList(setting)) return false; TextListSetting.UiState ui = setting.ui(); if (!ui.editing) return false; @@ -150,7 +155,7 @@ final class TextListTextEditHandler { return true; } - static boolean charTyped(TextListSetting setting, char chr, int modifiers) { + public static boolean charTyped(TextListSetting setting, char chr, int modifiers) { if (!TextListSettingRenderer.isInlineTextList(setting)) return false; TextListSetting.UiState ui = setting.ui(); if (!ui.editing) return false; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BindRendererUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/util/BindRendererUtil.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BindRendererUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/util/BindRendererUtil.java index b379f8e..0fafa1b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/BindRendererUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/util/BindRendererUtil.java @@ -5,18 +5,22 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.util; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class BindRendererUtil { +public final class BindRendererUtil { private BindRendererUtil() { } - static float bindHeight(float lastW, String label, String display, String modeText) { + public static float bindHeight(float lastW, String label, String display, String modeText) { float w = lastW > 0f ? lastW : SettingSkinUtil.m(160f, 115f); TextRenderer font = UnifiedSettingsSkin.fontMedium(); float size = SettingSkinUtil.m(17f, 7.0f); @@ -82,7 +86,7 @@ final class BindRendererUtil { ClickGuiRenderer.drawText(font, fitted, x + (w - tw) * 0.5f, y + (h - UnifiedSettingsSkin.textHeight(font, size)) * 0.5f, size, color, false); } - static void renderBindBase(String label, String display, String modeText, boolean waiting, float x, float y, float w, float mx, float my, Object uiObj) { + public static void renderBindBase(String label, String display, String modeText, boolean waiting, float x, float y, float w, float mx, float my, Object uiObj) { TextRenderer font = UnifiedSettingsSkin.fontMedium(); float size = SettingSkinUtil.m(17f, 7.0f); float small = SettingSkinUtil.m(11.5f, 5.7f); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingTextInputUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/util/SettingTextInputUtil.java similarity index 76% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingTextInputUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/util/SettingTextInputUtil.java index 756fb1f..3ecc730 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/SettingTextInputUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/clickgui/settings/util/SettingTextInputUtil.java @@ -5,16 +5,18 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.clickgui.settings; +package dev.loki.lovisual.features.gui.clickgui.settings.util; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.SettingSkinUtil; +import dev.loki.lovisual.features.gui.clickgui.settings.skin.UnifiedSettingsSkin; -final class SettingTextInputUtil { +public final class SettingTextInputUtil { private SettingTextInputUtil() { } - static int caretFromText(TextRenderer font, String text, float size, float textX, float mx) { + public static int caretFromText(TextRenderer font, String text, float size, float textX, float mx) { if (text == null || text.isEmpty()) return 0; float rel = mx - textX; if (rel <= 0f) return 0; @@ -26,7 +28,7 @@ final class SettingTextInputUtil { return text.length(); } - static void renderInlineSelection(TextRenderer font, String text, int start, int end, float textX, float textY, float size, float fieldH, float fieldY) { + public static void renderInlineSelection(TextRenderer font, String text, int start, int end, float textX, float textY, float size, float fieldH, float fieldY) { if (text == null || start < 0 || end < 0 || start == end) return; int a = Math.max(0, Math.min(start, text.length())); int b = Math.max(0, Math.min(end, text.length())); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/BaseHudElement.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/BaseHudElement.java index 52313d1..deea2a8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/BaseHudElement.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/BaseHudElement.java @@ -8,12 +8,10 @@ package dev.loki.lovisual.features.gui.hud; import dev.loki.lovisual.config.*; -import dev.loki.lovisual.events.impl.RenderPrewarmCollectEvent; +import dev.loki.lovisual.events.impl.render.RenderPrewarmCollectEvent; import dev.loki.lovisual.config.values.*; import net.minecraft.client.gui.GuiGraphicsExtractor; -import dev.loki.lovisual.config.*; -import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.HudPhase; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.FontInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementInfo.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementInfo.java index 949dc3e..7f961d3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementInfo.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementInfo.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.features.gui.hud; -import dev.loki.lovisual.events.UsedImplicitly; +import dev.loki.lovisual.events.meta.UsedImplicitly; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementRegister.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementRegister.java index bda5f6e..f614f1b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementRegister.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudElementRegister.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.features.gui.hud; -import dev.loki.lovisual.events.UsedImplicitly; +import dev.loki.lovisual.events.meta.UsedImplicitly; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudGlobalConfig.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudGlobalConfig.java index 875dadf..2ec1daf 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudGlobalConfig.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/HudGlobalConfig.java @@ -9,7 +9,6 @@ package dev.loki.lovisual.features.gui.hud; import dev.loki.lovisual.config.*; import dev.loki.lovisual.config.values.ConfigValue; -import dev.loki.lovisual.config.*; import dev.loki.lovisual.config.values.EnumValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.render.engine.math.HudScale; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/BetterChat.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/BetterChat.java index d1fb49e..c6d7d36 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/BetterChat.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/BetterChat.java @@ -15,7 +15,7 @@ import dev.loki.lovisual.config.values.BooleanMapValue; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.RGBColorValue; -import dev.loki.lovisual.features.gui.chat.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; import dev.loki.lovisual.features.gui.hud.HudElementInfo; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/HudPanelLayoutModes.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/HudPanelLayoutModes.java index d0e777f..37a6c32 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/HudPanelLayoutModes.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/HudPanelLayoutModes.java @@ -10,24 +10,24 @@ package dev.loki.lovisual.features.gui.hud.draggable.impl; import dev.loki.lovisual.config.values.ModeValue; import dev.loki.lovisual.config.values.NumberValue; -enum HudPanelLayoutModes { +public enum HudPanelLayoutModes { ; - static final String SPLIT_HEADER = "Split Header"; - static final String UNIFIED_DIVIDER = "Unified Divider"; + public static final String SPLIT_HEADER = "Split Header"; + public static final String UNIFIED_DIVIDER = "Unified Divider"; - static final double SCALE_DEFAULT = 1.0; - static final double SCALE_MIN = 1.0; - static final double SCALE_MAX = 1.4; - static final float SCALE_BASE_MULTIPLIER = 2.0f; + public static final double SCALE_DEFAULT = 1.0; + public static final double SCALE_MIN = 1.0; + public static final double SCALE_MAX = 1.4; + public static final float SCALE_BASE_MULTIPLIER = 2.0f; - static float effectiveScale(NumberValue value) { + public static float effectiveScale(NumberValue value) { if (value == null || value.get() == null) { return SCALE_BASE_MULTIPLIER; } return value.get().floatValue() * SCALE_BASE_MULTIPLIER; } - static String current(ModeValue value) { + public static String current(ModeValue value) { String mode = value != null ? value.get() : null; return UNIFIED_DIVIDER.equals(mode) ? UNIFIED_DIVIDER : SPLIT_HEADER; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHud.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHud.java deleted file mode 100644 index daef5b3..0000000 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHud.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * This file is part of the LoVisual Client distribution. - * Copyright (c) 2026 loki5512344. - * - * Licensed under the GNU General Public License v3.0. - */ - -package dev.loki.lovisual.features.gui.hud.draggable.impl; - -import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.config.SettingDef; -import dev.loki.lovisual.config.common.CommonSettingSchemas; -import dev.loki.lovisual.features.gui.hud.HudElementRegister; -import dev.loki.lovisual.features.gui.hud.HudGlobalConfig; -import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; -import dev.loki.lovisual.render.engine.math.HudScale; -import dev.loki.lovisual.render.engine.renderer.Renderer2D; -import dev.loki.lovisual.render.engine.text.TextRenderer; -import dev.loki.lovisual.util.pvp.opponents.TotemPopCounter; -import net.minecraft.client.gui.GuiGraphicsExtractor; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; - -import java.util.List; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -@HudElementRegister(order = 60) -public final class TargetHud extends DraggableHudElement { - - { - defaultLayout(7.6799927f, 721.12f, "CENTER", "FREE"); - } - - static final float BASE_WIDTH = 112.0f; - static final float BASE_HEIGHT = 40.0f; - static final float FACE_SIZE = 24.0f; - static final float FACE_X = 9.0f; - static final float FACE_Y = 8.0f; - static final float FACE_RADIUS = 4.0f; - static final float CONTENT_GAP = 6.0f; - static final float CONTENT_X_OFFSET = -2.0f; - static final float CONTENT_Y_OFFSET = -1.0f; - static final float PANEL_INSET = 2.0f; - static final float PANEL_RADIUS = 6.0f; - static final float NAME_Y = 13.0f; - static final float BAR_Y_OFFSET = 12.0f; - static final float BAR_WIDTH = 64.0f; - static final float BAR_HEIGHT = 4.0f; - static final float BAR_RADIUS = 2.0f; - static final float NAME_TEXT_SCALE = 0.34f; - static final float DISTANCE_TEXT_SCALE = 0.32f; - static final float HP_TEXT_SCALE = 0.34f; - static final float ARC_HP_TEXT_SCALE = 0.28f; - static final float DISTANCE_Y_OFFSET = 8.0f; - static final float ARC_CENTER_Y = 18.0f; - static final float ARC_RIGHT_INSET = 13.8f; - static final float ARC_RADIUS = 9.9f; - static final float ARC_THICKNESS = 3.5f; - static final float ARC_RESERVED_WIDTH = 34.0f; - static final float PLACEHOLDER_TEXT_SCALE = 0.62f; - static final float BASE_NAME_SCROLL_SPEED = 22.0f; - static final float BASE_NAME_SCROLL_GAP = 14.0f; - static final float BASE_NAME_FADE = 12.0f; - static final float NAME_SCROLL_PAUSE_SEC = 0.8f; - static final float EFFECTS_PANEL_GAP = 3.0f; - static final float EFFECTS_CHIP_HEIGHT = 10.0f; - static final float EFFECTS_CHIP_RADIUS = 3.0f; - static final float EFFECTS_CHIP_PAD_X = 3.0f; - static final float EFFECTS_CHIP_GAP = 2.0f; - static final float EFFECTS_ICON_SIZE = 8.0f; - static final float EFFECTS_TEXT_GAP = 2.0f; - static final float EFFECTS_TEXT_SCALE = 0.22f; - static final float EQUIPMENT_TOP_GAP = 2.0f; - static final float EQUIPMENT_BOTTOM_PAD = 2.0f; - static final float EQUIPMENT_SLOT = 11.0f; - static final float EQUIPMENT_GAP = 2.0f; - static final float EQUIPMENT_ROW_Y_OFFSET = 1.15f; - static final long HIT_FLASH_MS = 220L; - static final float HEALTH_SPEED = 6.0f; - static final float BAR_SPEED = 4.0f; - static final float BAR_TAIL_FADE_LENGTH = BAR_HEIGHT; - static final float ARC_TAIL_FADE_DEGREES = 20.0f; - static final float PROGRESS_SNAP_EPSILON = 0.0005f; - static final float DISTANCE_SPEED = 7.0f; - static final float EQUIPMENT_SPEED = 7.0f; - static final float HEALTH_TEXT_STEP = 0.25f; - static final float HEALTH_TEXT_SMALL_STEP = 0.10f; - static final float HEALTH_ZERO_CLAMP = 0.05f; - static final float HEALTH_ZERO_SNAP_THRESHOLD = 0.60f; - static final float TOTEM_BADGE_BOTTOM_PAD = 1.45f; - static final float TOTEM_BADGE_ICON_SIZE = 8.0f; - static final float TOTEM_BADGE_TEXT_GAP = 1.25f; - static final float TOTEM_BADGE_TEXT_SCALE = 0.24f; - static final float TOTEM_BADGE_ANIM_SPEED = 10.0f; - static final float TOTEM_BADGE_PULSE_SPEED = 8.0f; - - static final float FACE_U0 = 8f / 64f; - static final float FACE_V0 = 8f / 64f; - static final float FACE_U1 = 16f / 64f; - static final float FACE_V1 = 16f / 64f; - static final float HAT_U0 = 40f / 64f; - static final float HAT_V0 = 8f / 64f; - static final float HAT_U1 = 48f / 64f; - static final float HAT_V1 = 16f / 64f; - - static final String COLOR_THEME = "Theme"; - static final String COLOR_CUSTOM = "Custom"; - static final String EFFECT_NONE = "None"; - static final String EFFECT_BLUR = "Blur"; - static final String EFFECT_GLASS = "Glass"; - static final String EFFECTS_OFF = "Off"; - static final String EFFECTS_COMPACT = "Compact"; - static final String EQUIPMENT_OFF = "Off"; - static final String EQUIPMENT_COMPACT = "Compact"; - static final String HP_MODE_LINE = "Line"; - static final String HP_MODE_ARC = "Arc"; - - static final ConcurrentHashMap HIT_FLASH_MS_BY_ID = new ConcurrentHashMap<>(); - - final HudGlobalConfig hud = HudGlobalConfig.get(); - - final NumberValue scale = - new NumberValue<>("target_scale", 3.28, 0.5, 4.0); - final NumberValue holdMs = - new NumberValue<>("target_hold_ms", 1000, 0, 5000); - final BooleanValue totemPopCounter = TotemPopCounter.enabledValue(); - final NumberValue totemPopResetSeconds = TotemPopCounter.resetAfterSecondsValue(); - final RGBColorValue totemPopTextColor = - new RGBColorValue("target_totem_pop_text_color", "RNB#FFFFFF"); - final BooleanValue marquee = - new BooleanValue("target_marquee", true); - final BooleanValue playersOnly = - new BooleanValue("target_players_only", false); - final ModeValue effectsMode = - new ModeValue("target_effects_mode", "Off", EFFECTS_OFF, EFFECTS_COMPACT); - final BooleanValue effectsSelf = - new BooleanValue("target_effects_self", true); - final ModeValue equipmentMode = - new ModeValue("target_equipment_mode", "Off", EQUIPMENT_OFF, EQUIPMENT_COMPACT); - final ModeValue hpMode = - new ModeValue("target_hp_mode", "Arc", HP_MODE_LINE, HP_MODE_ARC); - final ModeValue colorMode = - new ModeValue("target_color_mode", "Theme", COLOR_THEME, COLOR_CUSTOM); - final RGBAColorValue bg = - new RGBAColorValue("target_bg", "#F7343434"); - final RGBAColorValue bg2 = - new RGBAColorValue("target_bg_secondary", "#F7161616"); - final RGBColorValue stroke = - new RGBColorValue("target_stroke", "#5A5A5A"); - final NumberValue blurAlpha = - new NumberValue<>("target_blur_alpha", 255, 0, 255); - final NumberValue bgAlpha = - new NumberValue<>("target_bg_alpha", 162, 0, 255); - final RGBColorValue text = - new RGBColorValue("target_text", "#FFFFFF"); - final RGBColorValue textSecondary = - new RGBColorValue("target_text_secondary", "#D7D7D7"); - final RGBColorValue barBg = - new RGBColorValue("target_bar_bg", "#1E1E1E"); - final RGBColorValue healthStart = - new RGBColorValue("target_health_start", "#F3F3F3"); - final RGBColorValue healthEnd = - new RGBColorValue("target_health_end", "#9E9E9E"); - final RGBColorValue trail = - new RGBColorValue("target_trail", "#373737"); - final RGBColorValue absorptionStart = - new RGBColorValue("target_absorption_start", "#FFC300"); - final RGBColorValue absorptionEnd = - new RGBColorValue("target_absorption_end", "#FFD96B"); - final RGBColorValue hitOuter = - new RGBColorValue("target_hit_outer", "#FF5A5A"); - final RGBColorValue hitInner = - new RGBColorValue("target_hit_inner", "#FF7373"); - final ModeValue bgEffect = - new ModeValue("target_bg_effect", "Glass", EFFECT_NONE, EFFECT_BLUR, EFFECT_GLASS); - final BooleanValue hitAnim = - new BooleanValue("target_hit_anim", true); - final NumberValue hitPulse = - new NumberValue<>("target_hit_pulse", 1.0, 0.0, 2.0); - - LivingEntity displayTarget; - float visibilityAnimation; - float healthAnimation; - float trailAnimation; - float absorptionAnimation; - float effectsAnimation; - float equipmentAnimation; - float totemPopAnimation; - float totemPopTextPulse; - int totemPopLastCount; - UUID totemPopTargetId; - float displayedHealth; - float displayedDistance; - long lastSeenMs; - long waveStartMs = System.currentTimeMillis(); - - int uiBgPrimary; - int uiBgSecondary; - int uiStroke; - int uiTextPrimary; - int uiTextSecondary; - int uiBarBackground; - int uiHealthStart; - int uiHealthEnd; - float uiHealthGradientAngle; - int uiTrail; - int uiAbsorptionStart; - int uiAbsorptionEnd; - float uiAbsorptionGradientAngle; - int uiHitOuter; - int uiHitInner; - - public TargetHud() { - super("target_hud", "TargetHUD", true); - } - - public static void notifyHit(Entity target) { - if (target == null) return; - HIT_FLASH_MS_BY_ID.put(target.getId(), System.currentTimeMillis()); - } - - @Override - protected void defineSettings(List defs) { - defs.add(SettingDef.number(scale)); - defs.add(SettingDef.number(holdMs)); - defs.add(SettingDef.bool(totemPopCounter) - .common(CommonSettingSchemas.TOTEM_POP_COUNTER.commonI18nKey())); - defs.add(SettingDef.number(totemPopResetSeconds) - .common(CommonSettingSchemas.TOTEM_POP_RESET_SECONDS.commonI18nKey()) - .visibleWhen(totemPopCounter::get)); - defs.add(SettingDef.colorNoAlpha(totemPopTextColor) - .visibleWhen(totemPopCounter::get)); - defs.add(SettingDef.bool(marquee)); - defs.add(SettingDef.bool(playersOnly)); - defs.add(SettingDef.mode(effectsMode)); - defs.add(SettingDef.bool(effectsSelf).visibleWhen(this::isEffectsEnabled)); - defs.add(SettingDef.mode(equipmentMode)); - defs.add(SettingDef.mode(hpMode)); - defs.add(SettingDef.mode(colorMode)); - defs.add(SettingDef.color(bg).visibleWhen(() -> isCustomMode() && !isGlassEffect())); - defs.add(SettingDef.color(bg2).visibleWhen(() -> isCustomMode() && !isGlassEffect())); - defs.add(SettingDef.colorNoAlpha(stroke).visibleWhen(() -> isCustomMode() && !isGlassEffect())); - defs.add(SettingDef.number(bgAlpha).visibleWhen(() -> isThemeMode() && !isGlassEffect())); - defs.add(SettingDef.colorNoAlpha(text).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(textSecondary).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(barBg).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(healthStart).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(healthEnd).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(trail).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(absorptionStart).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(absorptionEnd).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(hitOuter).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.colorNoAlpha(hitInner).visibleWhen(this::isCustomMode)); - defs.add(SettingDef.mode(bgEffect)); - defs.add(SettingDef.number(blurAlpha).visibleWhen(this::hasEffect)); - defs.add(SettingDef.bool(hitAnim)); - defs.add(SettingDef.number(hitPulse).visibleWhen(hitAnim::get)); - } - - @Override - public void applyDefaultPosition(int screenW, int screenH) { - float hudScale = HudScale.scale(screenW, screenH) * scale.get().floatValue(); - this.x = screenW / 2f - (BASE_WIDTH * hudScale) * 0.5f; - this.y = screenH / 2f + BASE_HEIGHT * hudScale; - } - - @Override - public boolean usesEngineRenderer() { - return true; - } - - @Override - public void renderEngine(Renderer2D renderer, - TextRenderer textRenderer, - GuiGraphicsExtractor ctx, - float tickDelta, - int screenW, - int screenH) { - TargetHudRenderer.render(this, renderer, textRenderer, ctx, tickDelta, screenW, screenH); - } - - float hudX() { - return x; - } - - float hudY() { - return y; - } - - float hudWidth() { - return width; - } - - float hudHeight() { - return height; - } - - void setHudSize(float w, float h) { - width = w; - height = h; - } - - boolean isThemeMode() { - return COLOR_THEME.equals(colorMode.get()); - } - - boolean isCustomMode() { - return COLOR_CUSTOM.equals(colorMode.get()); - } - - boolean hasEffect() { - return !EFFECT_NONE.equals(bgEffect.get()); - } - - boolean isBlurEffect() { - return EFFECT_BLUR.equals(bgEffect.get()); - } - - boolean isGlassEffect() { - return EFFECT_GLASS.equals(bgEffect.get()); - } - - boolean isEffectsEnabled() { - return !EFFECTS_OFF.equals(effectsMode.get()); - } - - boolean isEquipmentEnabled() { - return !EQUIPMENT_OFF.equals(equipmentMode.get()); - } - - boolean isArcHealthMode() { - return HP_MODE_ARC.equals(hpMode.get()); - } -} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudModel.java deleted file mode 100644 index 30d3efc..0000000 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudModel.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of the LoVisual Client distribution. - * Copyright (c) 2026 loki5512344. - * - * Licensed under the GNU General Public License v3.0. - */ - -package dev.loki.lovisual.features.gui.hud.draggable.impl; - -import net.minecraft.resources.Identifier; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.item.ItemStack; - -import java.util.List; - -record EquipmentEntry(ItemStack stack, float width) { -} - -record EquipmentLayout(List entries, float width, float height) { -} - -record EquipmentRenderTask(ItemStack stack, float x, float y, float scale) { -} - -record EffectChip(MobEffectInstance effect, Identifier iconId, String text, float width) { -} - -record EffectLayout(List chips, float width, float height) { -} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Triangulator.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Triangulator.java index e92a4a3..3b8ee6b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Triangulator.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Triangulator.java @@ -37,6 +37,7 @@ import dev.loki.lovisual.util.time.GameClock; import java.util.LinkedHashMap; import java.util.List; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedTriangulatorHudPanel; @HudElementInfo( id = "triangulator", diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/CombatLogHud.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/CombatLogHud.java new file mode 100644 index 0000000..10310c8 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/CombatLogHud.java @@ -0,0 +1,84 @@ +package dev.loki.lovisual.features.gui.hud.draggable.impl.combat; + +import dev.loki.lovisual.features.gui.hud.HudElementInfo; +import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; +import dev.loki.lovisual.features.module.Modules; +import dev.loki.lovisual.features.module.modules.combat.combatlog.CombatLog; +import dev.loki.lovisual.features.module.modules.combat.combatlog.CombatLogEntry; +import dev.loki.lovisual.features.module.modules.combat.combatlog.CombatLogStats; +import dev.loki.lovisual.features.theme.Theme; +import dev.loki.lovisual.render.engine.color.RenderColor; +import dev.loki.lovisual.render.engine.renderer.Renderer2D; +import dev.loki.lovisual.render.engine.text.FontInfo; +import dev.loki.lovisual.render.engine.text.Fonts; +import dev.loki.lovisual.render.engine.text.TextRenderer; +import net.minecraft.client.gui.GuiGraphicsExtractor; + +import java.util.List; + +/** + * Draggable panel for {@link CombatLog}: DPS dealt/taken summary plus the last few hits, newest + * first. Empty (zero width/height) when the module is disabled or nothing has happened yet. + */ +@HudElementInfo(id = "combat_log", displayName = "Combat Log", enabledByDefault = false, order = 200) +public final class CombatLogHud extends DraggableHudElement { + + private static final float PANEL_WIDTH = 140f; + private static final float ROW_HEIGHT = 11f; + private static final float PADDING = 5f; + private static final int MAX_VISIBLE_ROWS = 6; + + @Override + public void applyDefaultPosition(int screenW, int screenH) { + this.x = screenW - PANEL_WIDTH - 16f; + this.y = 16f; + } + + @Override + public boolean usesEngineRenderer() { + return true; + } + + @Override + public void renderEngine(Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, + float tickDelta, int screenW, int screenH) { + CombatLog module = Modules.get(CombatLog.class); + if (module == null || !module.isEnabled()) { + width = 0f; + height = 0f; + return; + } + + List entries = module.getEntries(); + int rows = Math.min(MAX_VISIBLE_ROWS, entries.size()); + width = PANEL_WIDTH; + height = PADDING * 2f + ROW_HEIGHT * (rows + 2); + + int bg = Theme.theme().windowBg(); + int accent = Theme.theme().accent(); + int textMuted = Theme.theme().textMuted(); + + renderer.roundedRect(x, y, width, height, 4f, bg); + + TextRenderer text = Fonts.renderer("Onest", FontInfo.Type.Regular, textRenderer); + text.begin(1.0, true, false); + + CombatLogStats.Summary summary = module.getSummary(); + String dealtLine = "DPS dealt: " + String.format("%.1f", summary.dpsDealt()); + String takenLine = "DPS taken: " + String.format("%.1f", summary.dpsTaken()); + text.render(dealtLine, x + PADDING, y + PADDING, new RenderColor(accent), false); + text.render(takenLine, x + PADDING, y + PADDING + ROW_HEIGHT, new RenderColor(textMuted), false); + + float rowY = y + PADDING + ROW_HEIGHT * 2f; + for (int i = entries.size() - 1, shown = 0; i >= 0 && shown < MAX_VISIBLE_ROWS; i--, shown++) { + CombatLogEntry entry = entries.get(i); + String sign = entry.dealtByMe() ? "-" : "+"; + String line = sign + String.format("%.1f", entry.damage()) + " " + entry.otherName(); + int color = entry.dealtByMe() ? accent : 0xFFE05252; + text.render(line, x + PADDING, rowY, new RenderColor(color), false); + rowY += ROW_HEIGHT; + } + + text.end(); + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Inventory.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/Inventory.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Inventory.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/Inventory.java index 1a3c352..8e06246 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Inventory.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/Inventory.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.combat; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.util.screen.ClientScreen; @@ -32,6 +32,9 @@ import java.util.ArrayList; import java.util.List; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.HudPanelLayoutModes; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedInventoryHudPanel; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedListHudPanel; @HudElementRegister(order = 220) public final class Inventory extends DraggableHudElement { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Itemizer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/Itemizer.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Itemizer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/Itemizer.java index f2e20ba..b011822 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Itemizer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/Itemizer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.combat; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.EnumValue; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/MediaPlayer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/MediaPlayer.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/MediaPlayer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/MediaPlayer.java index db6f3eb..896336c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/MediaPlayer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/combat/MediaPlayer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.combat; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.util.screen.ClientScreen; @@ -16,7 +16,7 @@ import net.minecraft.client.resources.language.I18n; import net.minecraft.resources.Identifier; import net.minecraft.util.Util; import dev.loki.lovisual.config.SettingDef; -import dev.loki.lovisual.events.impl.RenderPrewarmCollectEvent; +import dev.loki.lovisual.events.impl.render.RenderPrewarmCollectEvent; import dev.loki.lovisual.features.gui.hud.HudElementRegister; import dev.loki.lovisual.features.gui.hud.HudGlobalConfig; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/HudNotifier.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/HudNotifier.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/HudNotifier.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/HudNotifier.java index a891581..9515700 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/HudNotifier.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/HudNotifier.java @@ -5,14 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier; import com.mojang.blaze3d.platform.Window; import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.ModeValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.events.impl.RenderPrewarmCollectEvent; +import dev.loki.lovisual.events.impl.render.RenderPrewarmCollectEvent; import dev.loki.lovisual.features.gui.hud.HudElementRegister; import dev.loki.lovisual.features.gui.hud.HudGlobalConfig; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; @@ -22,12 +22,12 @@ import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastGeomet import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastGeometry.MessengerSide; import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastGeometry.ToastMetrics; import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastGeometry.ToastPosition; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.PreviewToast; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.Toast; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.ToastDraw; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.ToastVisual; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastStyle; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.PreviewToast; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.Toast; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.ToastDraw; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.ToastVisual; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastStyle; import dev.loki.lovisual.features.module.HudPhase; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastCardRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastCardRenderer.java index 9113e3b..5f02c7a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastCardRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastCardRenderer.java @@ -9,13 +9,16 @@ package dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastGeometry.ToastMetrics; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.Toast; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.ToastVisual; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastStyle.ToastPalette; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.Toast; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.ToastVisual; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastStyle.ToastPalette; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastStyle; /** * Card drawing routines for HudNotifier toasts: glass pill background, progress bar diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastGeometry.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastGeometry.java index 1761926..297d24c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastGeometry.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastGeometry.java @@ -8,13 +8,16 @@ package dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier; import dev.loki.lovisual.features.gui.hud.HudGlobalConfig; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.PreviewToast; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.Toast; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.ToastDraw; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.ToastVisual; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.PreviewToast; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.Toast; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.ToastDraw; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.ToastVisual; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.TextRenderer; import java.util.List; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastStyle; /** * Layout and measurement math for HudNotifier toasts: box metrics, text measurement, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/model/ToastModel.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastModel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/model/ToastModel.java index 41ebec3..822fd1e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/model/ToastModel.java @@ -5,9 +5,9 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier; +package dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model; -import dev.loki.lovisual.features.gui.hud.draggable.impl.HudNotifier; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastGeometry.ToastMetrics; import dev.loki.lovisual.render.engine.animation.AnimationUtility; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastStyle.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/model/ToastStyle.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastStyle.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/model/ToastStyle.java index 227a05e..db2cb92 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/ToastStyle.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/hudnotifier/model/ToastStyle.java @@ -5,12 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier; +package dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; -import dev.loki.lovisual.features.gui.hud.draggable.impl.HudNotifier; -import dev.loki.lovisual.features.gui.hud.draggable.impl.HudNotifier.NotifyType; -import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.ToastModel.Toast; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier.NotifyType; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.model.ToastModel.Toast; import dev.loki.lovisual.features.theme.Theme; import dev.loki.lovisual.features.theme.Themes; import dev.loki.lovisual.render.engine.animation.AnimationUtility; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Coordinates.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/Coordinates.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Coordinates.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/Coordinates.java index d0de580..50bbf5c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Coordinates.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/Coordinates.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.metrics; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/GameTime.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/GameTime.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/GameTime.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/GameTime.java index d3e666d..4e921b6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/GameTime.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/GameTime.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.metrics; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; @@ -22,7 +22,7 @@ import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; import dev.loki.lovisual.features.gui.hud.script.CompactHudStatModel; import dev.loki.lovisual.features.gui.hud.script.ScriptableHudStatWidget; import dev.loki.lovisual.features.gui.hud.script.ScriptedCompactHudStatRenderer; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.math.HudScale; import dev.loki.lovisual.render.engine.renderer.Renderer2D; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/SpeedBps.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/SpeedBps.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/SpeedBps.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/SpeedBps.java index 8e74c8c..83321bb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/SpeedBps.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/SpeedBps.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.metrics; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/SystemTime.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/SystemTime.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/SystemTime.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/SystemTime.java index 384433d..8621341 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/SystemTime.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/metrics/SystemTime.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.metrics; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Keybinds.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Keybinds.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Keybinds.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Keybinds.java index 068d580..3ec5111 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Keybinds.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Keybinds.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.panels; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.util.screen.ClientScreen; @@ -18,7 +18,7 @@ import dev.loki.lovisual.features.gui.hud.HudElementRegister; import dev.loki.lovisual.features.gui.hud.HudGlobalConfig; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.features.gui.hud.HudTextEffects; -import dev.loki.lovisual.features.gui.clickgui.settings.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; import dev.loki.lovisual.features.module.Module; @@ -35,6 +35,8 @@ import java.util.LinkedHashMap; import java.util.*; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.HudPanelLayoutModes; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedListHudPanel; @HudElementRegister(order = 45) public final class Keybinds extends DraggableHudElement { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ModuleList.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/ModuleList.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ModuleList.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/ModuleList.java index 8d105a0..dc2e18c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ModuleList.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/ModuleList.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.panels; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Radar.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Radar.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Radar.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Radar.java index feef963..1b29467 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Radar.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Radar.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.panels; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; @@ -31,6 +31,7 @@ import dev.loki.lovisual.util.player.PlayerHealthResolver; import java.util.List; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.stats.Ping; /** * Player radar widget with a rectangular map and text list. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Scoreboard.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Scoreboard.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Scoreboard.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Scoreboard.java index 2d5f939..0d103d7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Scoreboard.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/panels/Scoreboard.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.panels; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.features.module.Modules; @@ -28,7 +28,7 @@ import dev.loki.lovisual.features.gui.hud.HudTextEffects; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; import dev.loki.lovisual.features.module.HudPhase; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.math.HudScale; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedInventoryHudPanel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedInventoryHudPanel.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedInventoryHudPanel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedInventoryHudPanel.java index 1b5d311..2df773e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedInventoryHudPanel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedInventoryHudPanel.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.scripted; import java.util.LinkedHashMap; import net.minecraft.client.Minecraft; @@ -24,13 +24,15 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import java.util.ArrayList; import java.util.List; +import dev.loki.lovisual.features.gui.hud.draggable.impl.HudPanelLayoutModes; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedListHudPanel; -final class ScriptedInventoryHudPanel { +public final class ScriptedInventoryHudPanel { private static final String LAYOUT_ID = "lovisual:api/hud/draggable/inventory_panel"; private final UiScriptModuleHandle moduleHandle = HudScriptLayouts.handle(LAYOUT_ID); private final CachedUiScriptRuntime runtime = new CachedUiScriptRuntime(HudScriptLayouts.runtimeReporter()); - static List> cells(List stacks) { + public static List> cells(List stacks) { List> out = new ArrayList<>(); if (stacks == null) return out; for (int i = 0; i < stacks.size(); i++) { @@ -80,7 +82,7 @@ final class ScriptedInventoryHudPanel { patch.put(prop, value); } - boolean render(Renderer2D renderer, + public boolean render(Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, float tickDelta, @@ -130,7 +132,7 @@ final class ScriptedInventoryHudPanel { return moduleHandle.module(); } - record Panel(float x, + public record Panel(float x, float y, float width, float height, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedListHudPanel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedListHudPanel.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedListHudPanel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedListHudPanel.java index 65a7630..48ebc6d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedListHudPanel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedListHudPanel.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.scripted; import java.util.LinkedHashMap; import net.minecraft.client.Minecraft; @@ -24,45 +24,50 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import java.util.ArrayList; import java.util.List; import java.util.Map; +import dev.loki.lovisual.features.gui.hud.draggable.impl.HudPanelLayoutModes; +import dev.loki.lovisual.features.gui.hud.draggable.impl.panels.Keybinds; +import dev.loki.lovisual.features.gui.hud.draggable.impl.status.Admins; +import dev.loki.lovisual.features.gui.hud.draggable.impl.status.Cooldowns; +import dev.loki.lovisual.features.gui.hud.draggable.impl.status.Potions; -final class ScriptedListHudPanel { - static final Variant POTIONS = new Variant( +public final class ScriptedListHudPanel { + public static final Variant POTIONS = new Variant( "potions", "Potions", String.valueOf((char) 0x42), 95.0f, 18.0f, 5.0f, 22.0f, 22.0f, 3.0f, 3.5f, 8.0f, 14.0f, 7.0f, 18.0f, 8.0f, 2.1f ); - static final Variant COOLDOWNS = new Variant( + public static final Variant COOLDOWNS = new Variant( "cooldowns", "Cooldowns", "C", 110.0f, 18.0f, 4.0f, 22.0f, 22.0f, 2.5f, 3.5f, 8.0f, 15.0f, 6.0f, 18.0f, 8.0f, 1.9f ); - static final Variant ADMINS = new Variant( + public static final Variant ADMINS = new Variant( "admins", "Admins", String.valueOf((char) 0x45), 96.0f, 18.0f, 5.0f, 22.0f, 22.0f, 3.0f, 3.5f, 8.0f, 15.0f, 6.0f, 18.0f, 8.0f, 1.95f ); - static final Variant KEYBINDS = new Variant( + public static final Variant KEYBINDS = new Variant( "keybinds", "Keybinds", "M", 102.0f, 18.0f, 5.0f, 22.0f, 22.0f, 3.0f, 3.5f, 8.0f, 15.0f, 6.0f, 18.0f, 8.0f, 1.95f, "Icons", 1.18f ); - static final float HEADER_HEIGHT = 15.5f; - static final float BODY_Y_OFFSET = 18.5f; - static final float CONTENT_START_Y = 25.0f; - static final float BODY_INSET_Y = 6.5f; - static final float ROW_STEP = 11.0f; - static final float PANEL_RADIUS = 4.0f; - static final float PANEL_STROKE = 0.55f; + public static final float HEADER_HEIGHT = 15.5f; + public static final float BODY_Y_OFFSET = 18.5f; + public static final float CONTENT_START_Y = 25.0f; + public static final float BODY_INSET_Y = 6.5f; + public static final float ROW_STEP = 11.0f; + public static final float PANEL_RADIUS = 4.0f; + public static final float PANEL_STROKE = 0.55f; private static final String LAYOUT_ID = "lovisual:api/hud/draggable/list_panel"; private final UiScriptModuleHandle moduleHandle = HudScriptLayouts.handle(LAYOUT_ID); private final CachedUiScriptRuntime runtime = new CachedUiScriptRuntime(HudScriptLayouts.runtimeReporter()); - static String hex(int argb) { + public static String hex(int argb) { return String.format("#%08X", argb); } - static LinkedHashMap textPart(String text, int color, float x) { + public static LinkedHashMap textPart(String text, int color, float x) { LinkedHashMap part = new LinkedHashMap<>(); part.put("text", text != null ? text : ""); part.put("color", hex(color)); @@ -70,7 +75,7 @@ final class ScriptedListHudPanel { return part; } - static LinkedHashMap row(String key, + public static LinkedHashMap row(String key, String iconKind, String icon, List> nameParts, @@ -90,7 +95,7 @@ final class ScriptedListHudPanel { return row; } - static String idString(Identifier id) { + public static String idString(Identifier id) { return id != null ? id.toString() : ""; } @@ -118,11 +123,11 @@ final class ScriptedListHudPanel { patch.put(prop, value); } - static List> rows() { + public static List> rows() { return new ArrayList<>(); } - boolean render(Renderer2D renderer, + public boolean render(Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, float tickDelta, @@ -172,7 +177,7 @@ final class ScriptedListHudPanel { return moduleHandle.module(); } - record Variant(String id, + public record Variant(String id, String title, String headerIcon, float minWidth, @@ -234,7 +239,7 @@ final class ScriptedListHudPanel { } } - record Palette(int headerLeft, + public record Palette(int headerLeft, int headerRight, int bodyLeft, int bodyRight, @@ -245,7 +250,7 @@ final class ScriptedListHudPanel { int titleText, int divider, int blurTint) { - LinkedHashMap toProps() { + public LinkedHashMap toProps() { LinkedHashMap out = new LinkedHashMap<>(); out.put("headerLeft", hex(headerLeft)); out.put("headerRight", hex(headerRight)); @@ -262,12 +267,12 @@ final class ScriptedListHudPanel { } } - record Panel(Variant variant, Palette palette, float x, float y, float width, float height, float drawScale, + public record Panel(Variant variant, Palette palette, float x, float y, float width, float height, float drawScale, float baseScale, float fontScale, float headerIconHeight, float headerTextHeight, float rowTextHeight, float countLabelWidth, float countValueWidth, int activeCount, boolean blur, float blurAlpha, int headerIconColor, String layout, List> rows) { - Panel(Variant variant, + public Panel(Variant variant, Palette palette, float x, float y, @@ -309,7 +314,7 @@ final class ScriptedListHudPanel { this.rows = rows != null ? rows : List.of(); } - LinkedHashMap toProps() { + public LinkedHashMap toProps() { LinkedHashMap out = new LinkedHashMap<>(); out.put("id", variant.id); out.put("title", variant.title); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedTriangulatorHudPanel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedTriangulatorHudPanel.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedTriangulatorHudPanel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedTriangulatorHudPanel.java index ffd4bad..d22f0f1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/ScriptedTriangulatorHudPanel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/scripted/ScriptedTriangulatorHudPanel.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.scripted; import java.util.LinkedHashMap; import dev.loki.lovisual.features.gui.hud.script.HudScriptLayouts; @@ -23,13 +23,14 @@ import net.minecraft.resources.Identifier; import java.util.ArrayList; import java.util.List; +import dev.loki.lovisual.features.gui.hud.draggable.impl.Triangulator; public final class ScriptedTriangulatorHudPanel { private static final String LAYOUT_ID = "lovisual:api/hud/draggable/triangulator"; private final UiScriptModuleHandle moduleHandle = HudScriptLayouts.handle(LAYOUT_ID); private final CachedUiScriptRuntime runtime = new CachedUiScriptRuntime(HudScriptLayouts.runtimeReporter()); - static String hex(int argb) { + public static String hex(int argb) { return String.format("#%08X", argb); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Fps.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Fps.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Fps.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Fps.java index b11d916..aded3af 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Fps.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Fps.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.stats; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Memory.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Memory.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Memory.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Memory.java index 59290f1..ab7606b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Memory.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Memory.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.stats; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Ping.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Ping.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Ping.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Ping.java index 5e16845..caa1a39 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Ping.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Ping.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.stats; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Tps.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Tps.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Tps.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Tps.java index bc8f6e7..fa60a3c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Tps.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/stats/Tps.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.stats; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Admins.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Admins.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Admins.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Admins.java index df27387..20469f2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Admins.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Admins.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.status; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.util.screen.ClientScreen; @@ -46,6 +46,8 @@ import java.util.List; import java.util.Map; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.HudPanelLayoutModes; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedListHudPanel; @HudElementRegister(order = 50) public final class Admins extends DraggableHudElement { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Armor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Armor.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Armor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Armor.java index b30cb27..d4e19eb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Armor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Armor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.status; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.util.screen.ClientScreen; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Cooldowns.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Cooldowns.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Cooldowns.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Cooldowns.java index 46bcb9e..3c63b91 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Cooldowns.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Cooldowns.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.status; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.util.screen.ClientScreen; @@ -27,8 +27,8 @@ import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.PvpCooldowns; -import dev.loki.lovisual.mixins.accessors.ItemCooldownEntryAccessor; -import dev.loki.lovisual.mixins.accessors.ItemCooldownManagerAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.ItemCooldownEntryAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.ItemCooldownManagerAccessor; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.math.HudScale; @@ -47,6 +47,8 @@ import java.util.List; import java.util.Map; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.HudPanelLayoutModes; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedListHudPanel; @HudElementRegister(order = 30) public final class Cooldowns extends DraggableHudElement { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Potions.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Potions.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Potions.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Potions.java index fc04f05..faed4ba 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/Potions.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/status/Potions.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.status; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.util.screen.ClientScreen; @@ -39,6 +39,8 @@ import java.util.List; import java.util.Map; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.HudPanelLayoutModes; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedListHudPanel; @HudElementRegister(order = 20) public final class Potions extends DraggableHudElement { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHud.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHud.java new file mode 100644 index 0000000..383415a --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHud.java @@ -0,0 +1,336 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud; + +import dev.loki.lovisual.config.values.*; +import dev.loki.lovisual.config.SettingDef; +import dev.loki.lovisual.config.common.CommonSettingSchemas; +import dev.loki.lovisual.features.gui.hud.HudElementRegister; +import dev.loki.lovisual.features.gui.hud.HudGlobalConfig; +import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; +import dev.loki.lovisual.render.engine.math.HudScale; +import dev.loki.lovisual.render.engine.renderer.Renderer2D; +import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.util.pvp.opponents.TotemPopCounter; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudRenderer; + +@HudElementRegister(order = 60) +public final class TargetHud extends DraggableHudElement { + + { + defaultLayout(7.6799927f, 721.12f, "CENTER", "FREE"); + } + + public static final float BASE_WIDTH = 112.0f; + public static final float BASE_HEIGHT = 40.0f; + public static final float FACE_SIZE = 24.0f; + public static final float FACE_X = 9.0f; + public static final float FACE_Y = 8.0f; + public static final float FACE_RADIUS = 4.0f; + public static final float CONTENT_GAP = 6.0f; + public static final float CONTENT_X_OFFSET = -2.0f; + public static final float CONTENT_Y_OFFSET = -1.0f; + public static final float PANEL_INSET = 2.0f; + public static final float PANEL_RADIUS = 6.0f; + public static final float NAME_Y = 13.0f; + public static final float BAR_Y_OFFSET = 12.0f; + public static final float BAR_WIDTH = 64.0f; + public static final float BAR_HEIGHT = 4.0f; + public static final float BAR_RADIUS = 2.0f; + public static final float NAME_TEXT_SCALE = 0.34f; + public static final float DISTANCE_TEXT_SCALE = 0.32f; + public static final float HP_TEXT_SCALE = 0.34f; + public static final float ARC_HP_TEXT_SCALE = 0.28f; + public static final float DISTANCE_Y_OFFSET = 8.0f; + public static final float ARC_CENTER_Y = 18.0f; + public static final float ARC_RIGHT_INSET = 13.8f; + public static final float ARC_RADIUS = 9.9f; + public static final float ARC_THICKNESS = 3.5f; + public static final float ARC_RESERVED_WIDTH = 34.0f; + public static final float PLACEHOLDER_TEXT_SCALE = 0.62f; + public static final float BASE_NAME_SCROLL_SPEED = 22.0f; + public static final float BASE_NAME_SCROLL_GAP = 14.0f; + public static final float BASE_NAME_FADE = 12.0f; + public static final float NAME_SCROLL_PAUSE_SEC = 0.8f; + public static final float EFFECTS_PANEL_GAP = 3.0f; + public static final float EFFECTS_CHIP_HEIGHT = 10.0f; + public static final float EFFECTS_CHIP_RADIUS = 3.0f; + public static final float EFFECTS_CHIP_PAD_X = 3.0f; + public static final float EFFECTS_CHIP_GAP = 2.0f; + public static final float EFFECTS_ICON_SIZE = 8.0f; + public static final float EFFECTS_TEXT_GAP = 2.0f; + public static final float EFFECTS_TEXT_SCALE = 0.22f; + public static final float EQUIPMENT_TOP_GAP = 2.0f; + public static final float EQUIPMENT_BOTTOM_PAD = 2.0f; + public static final float EQUIPMENT_SLOT = 11.0f; + public static final float EQUIPMENT_GAP = 2.0f; + public static final float EQUIPMENT_ROW_Y_OFFSET = 1.15f; + public static final long HIT_FLASH_MS = 220L; + public static final float HEALTH_SPEED = 6.0f; + public static final float BAR_SPEED = 4.0f; + public static final float BAR_TAIL_FADE_LENGTH = BAR_HEIGHT; + public static final float ARC_TAIL_FADE_DEGREES = 20.0f; + public static final float PROGRESS_SNAP_EPSILON = 0.0005f; + public static final float DISTANCE_SPEED = 7.0f; + public static final float EQUIPMENT_SPEED = 7.0f; + public static final float HEALTH_TEXT_STEP = 0.25f; + public static final float HEALTH_TEXT_SMALL_STEP = 0.10f; + public static final float HEALTH_ZERO_CLAMP = 0.05f; + public static final float HEALTH_ZERO_SNAP_THRESHOLD = 0.60f; + public static final float TOTEM_BADGE_BOTTOM_PAD = 1.45f; + public static final float TOTEM_BADGE_ICON_SIZE = 8.0f; + public static final float TOTEM_BADGE_TEXT_GAP = 1.25f; + public static final float TOTEM_BADGE_TEXT_SCALE = 0.24f; + public static final float TOTEM_BADGE_ANIM_SPEED = 10.0f; + public static final float TOTEM_BADGE_PULSE_SPEED = 8.0f; + + public static final float FACE_U0 = 8f / 64f; + public static final float FACE_V0 = 8f / 64f; + public static final float FACE_U1 = 16f / 64f; + public static final float FACE_V1 = 16f / 64f; + public static final float HAT_U0 = 40f / 64f; + public static final float HAT_V0 = 8f / 64f; + public static final float HAT_U1 = 48f / 64f; + public static final float HAT_V1 = 16f / 64f; + + public static final String COLOR_THEME = "Theme"; + public static final String COLOR_CUSTOM = "Custom"; + public static final String EFFECT_NONE = "None"; + public static final String EFFECT_BLUR = "Blur"; + public static final String EFFECT_GLASS = "Glass"; + public static final String EFFECTS_OFF = "Off"; + public static final String EFFECTS_COMPACT = "Compact"; + public static final String EQUIPMENT_OFF = "Off"; + public static final String EQUIPMENT_COMPACT = "Compact"; + public static final String HP_MODE_LINE = "Line"; + public static final String HP_MODE_ARC = "Arc"; + + public static final ConcurrentHashMap HIT_FLASH_MS_BY_ID = new ConcurrentHashMap<>(); + + public final HudGlobalConfig hud = HudGlobalConfig.get(); + + public final NumberValue scale = + new NumberValue<>("target_scale", 3.28, 0.5, 4.0); + public final NumberValue holdMs = + new NumberValue<>("target_hold_ms", 1000, 0, 5000); + public final BooleanValue totemPopCounter = TotemPopCounter.enabledValue(); + public final NumberValue totemPopResetSeconds = TotemPopCounter.resetAfterSecondsValue(); + public final RGBColorValue totemPopTextColor = + new RGBColorValue("target_totem_pop_text_color", "RNB#FFFFFF"); + public final BooleanValue marquee = + new BooleanValue("target_marquee", true); + public final BooleanValue playersOnly = + new BooleanValue("target_players_only", false); + public final ModeValue effectsMode = + new ModeValue("target_effects_mode", "Off", EFFECTS_OFF, EFFECTS_COMPACT); + public final BooleanValue effectsSelf = + new BooleanValue("target_effects_self", true); + public final ModeValue equipmentMode = + new ModeValue("target_equipment_mode", "Off", EQUIPMENT_OFF, EQUIPMENT_COMPACT); + public final ModeValue hpMode = + new ModeValue("target_hp_mode", "Arc", HP_MODE_LINE, HP_MODE_ARC); + public final ModeValue colorMode = + new ModeValue("target_color_mode", "Theme", COLOR_THEME, COLOR_CUSTOM); + public final RGBAColorValue bg = + new RGBAColorValue("target_bg", "#F7343434"); + public final RGBAColorValue bg2 = + new RGBAColorValue("target_bg_secondary", "#F7161616"); + public final RGBColorValue stroke = + new RGBColorValue("target_stroke", "#5A5A5A"); + public final NumberValue blurAlpha = + new NumberValue<>("target_blur_alpha", 255, 0, 255); + public final NumberValue bgAlpha = + new NumberValue<>("target_bg_alpha", 162, 0, 255); + public final RGBColorValue text = + new RGBColorValue("target_text", "#FFFFFF"); + public final RGBColorValue textSecondary = + new RGBColorValue("target_text_secondary", "#D7D7D7"); + public final RGBColorValue barBg = + new RGBColorValue("target_bar_bg", "#1E1E1E"); + public final RGBColorValue healthStart = + new RGBColorValue("target_health_start", "#F3F3F3"); + public final RGBColorValue healthEnd = + new RGBColorValue("target_health_end", "#9E9E9E"); + public final RGBColorValue trail = + new RGBColorValue("target_trail", "#373737"); + public final RGBColorValue absorptionStart = + new RGBColorValue("target_absorption_start", "#FFC300"); + public final RGBColorValue absorptionEnd = + new RGBColorValue("target_absorption_end", "#FFD96B"); + public final RGBColorValue hitOuter = + new RGBColorValue("target_hit_outer", "#FF5A5A"); + public final RGBColorValue hitInner = + new RGBColorValue("target_hit_inner", "#FF7373"); + public final ModeValue bgEffect = + new ModeValue("target_bg_effect", "Glass", EFFECT_NONE, EFFECT_BLUR, EFFECT_GLASS); + public final BooleanValue hitAnim = + new BooleanValue("target_hit_anim", true); + public final NumberValue hitPulse = + new NumberValue<>("target_hit_pulse", 1.0, 0.0, 2.0); + + public LivingEntity displayTarget; + public float visibilityAnimation; + public float healthAnimation; + public float trailAnimation; + public float absorptionAnimation; + public float effectsAnimation; + public float equipmentAnimation; + public float totemPopAnimation; + public float totemPopTextPulse; + public int totemPopLastCount; + public UUID totemPopTargetId; + public float displayedHealth; + public float displayedDistance; + public long lastSeenMs; + public long waveStartMs = System.currentTimeMillis(); + + public int uiBgPrimary; + public int uiBgSecondary; + public int uiStroke; + public int uiTextPrimary; + public int uiTextSecondary; + public int uiBarBackground; + public int uiHealthStart; + public int uiHealthEnd; + public float uiHealthGradientAngle; + public int uiTrail; + public int uiAbsorptionStart; + public int uiAbsorptionEnd; + public float uiAbsorptionGradientAngle; + public int uiHitOuter; + public int uiHitInner; + + public TargetHud() { + super("target_hud", "TargetHUD", true); + } + + public static void notifyHit(Entity target) { + if (target == null) return; + HIT_FLASH_MS_BY_ID.put(target.getId(), System.currentTimeMillis()); + } + + @Override + protected void defineSettings(List defs) { + defs.add(SettingDef.number(scale)); + defs.add(SettingDef.number(holdMs)); + defs.add(SettingDef.bool(totemPopCounter) + .common(CommonSettingSchemas.TOTEM_POP_COUNTER.commonI18nKey())); + defs.add(SettingDef.number(totemPopResetSeconds) + .common(CommonSettingSchemas.TOTEM_POP_RESET_SECONDS.commonI18nKey()) + .visibleWhen(totemPopCounter::get)); + defs.add(SettingDef.colorNoAlpha(totemPopTextColor) + .visibleWhen(totemPopCounter::get)); + defs.add(SettingDef.bool(marquee)); + defs.add(SettingDef.bool(playersOnly)); + defs.add(SettingDef.mode(effectsMode)); + defs.add(SettingDef.bool(effectsSelf).visibleWhen(this::isEffectsEnabled)); + defs.add(SettingDef.mode(equipmentMode)); + defs.add(SettingDef.mode(hpMode)); + defs.add(SettingDef.mode(colorMode)); + defs.add(SettingDef.color(bg).visibleWhen(() -> isCustomMode() && !isGlassEffect())); + defs.add(SettingDef.color(bg2).visibleWhen(() -> isCustomMode() && !isGlassEffect())); + defs.add(SettingDef.colorNoAlpha(stroke).visibleWhen(() -> isCustomMode() && !isGlassEffect())); + defs.add(SettingDef.number(bgAlpha).visibleWhen(() -> isThemeMode() && !isGlassEffect())); + defs.add(SettingDef.colorNoAlpha(text).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(textSecondary).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(barBg).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(healthStart).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(healthEnd).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(trail).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(absorptionStart).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(absorptionEnd).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(hitOuter).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.colorNoAlpha(hitInner).visibleWhen(this::isCustomMode)); + defs.add(SettingDef.mode(bgEffect)); + defs.add(SettingDef.number(blurAlpha).visibleWhen(this::hasEffect)); + defs.add(SettingDef.bool(hitAnim)); + defs.add(SettingDef.number(hitPulse).visibleWhen(hitAnim::get)); + } + + @Override + public void applyDefaultPosition(int screenW, int screenH) { + float hudScale = HudScale.scale(screenW, screenH) * scale.get().floatValue(); + this.x = screenW / 2f - (BASE_WIDTH * hudScale) * 0.5f; + this.y = screenH / 2f + BASE_HEIGHT * hudScale; + } + + @Override + public boolean usesEngineRenderer() { + return true; + } + + @Override + public void renderEngine(Renderer2D renderer, + TextRenderer textRenderer, + GuiGraphicsExtractor ctx, + float tickDelta, + int screenW, + int screenH) { + TargetHudRenderer.render(this, renderer, textRenderer, ctx, tickDelta, screenW, screenH); + } + + public float hudX() { + return x; + } + + public float hudY() { + return y; + } + + public float hudWidth() { + return width; + } + + public float hudHeight() { + return height; + } + + public void setHudSize(float w, float h) { + width = w; + height = h; + } + + public boolean isThemeMode() { + return COLOR_THEME.equals(colorMode.get()); + } + + public boolean isCustomMode() { + return COLOR_CUSTOM.equals(colorMode.get()); + } + + public boolean hasEffect() { + return !EFFECT_NONE.equals(bgEffect.get()); + } + + public boolean isBlurEffect() { + return EFFECT_BLUR.equals(bgEffect.get()); + } + + public boolean isGlassEffect() { + return EFFECT_GLASS.equals(bgEffect.get()); + } + + public boolean isEffectsEnabled() { + return !EFFECTS_OFF.equals(effectsMode.get()); + } + + public boolean isEquipmentEnabled() { + return !EQUIPMENT_OFF.equals(equipmentMode.get()); + } + + public boolean isArcHealthMode() { + return HP_MODE_ARC.equals(hpMode.get()); + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudFormatter.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudFormatter.java similarity index 80% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudFormatter.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudFormatter.java index abaec9d..670b3b3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudFormatter.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudFormatter.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud; import dev.loki.lovisual.util.player.effect.StatusEffectTracker; import net.minecraft.resources.Identifier; @@ -13,19 +13,19 @@ import net.minecraft.world.effect.MobEffectInstance; import java.util.Locale; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; -final class TargetHudFormatter { +public final class TargetHudFormatter { private TargetHudFormatter() { } - static float snapToStep(float value, float step) { + public static float snapToStep(float value, float step) { if (step <= 0.0f) return value; return Math.round(value / step) * step; } - static float formatDisplayHealth(float health) { + public static float formatDisplayHealth(float health) { float clamped = Math.max(0.0f, health); if (clamped <= HEALTH_ZERO_CLAMP) { return 0.0f; @@ -35,7 +35,7 @@ final class TargetHudFormatter { return snapped <= HEALTH_ZERO_CLAMP ? 0.0f : snapped; } - static String formatHealth(float health) { + public static String formatHealth(float health) { if (health >= 100.0f) { return Integer.toString(Math.round(health)); } @@ -45,14 +45,14 @@ final class TargetHudFormatter { return String.format(Locale.ROOT, "%.2f", health); } - static String formatDistance(float distance) { + public static String formatDistance(float distance) { if (distance >= 100.0f) { return Integer.toString(Math.round(distance)); } return String.format(Locale.ROOT, "%.1f", distance); } - static Identifier resolveEffectIcon(MobEffectInstance inst) { + public static Identifier resolveEffectIcon(MobEffectInstance inst) { if (inst == null) { return null; } @@ -61,7 +61,7 @@ final class TargetHudFormatter { .orElse(null); } - static String compactEffectText(int entityId, MobEffectInstance inst) { + public static String compactEffectText(int entityId, MobEffectInstance inst) { if (inst == null) { return ""; } @@ -73,7 +73,7 @@ final class TargetHudFormatter { return level > 1 ? roman(level) : ""; } - static String formatEffectDuration(int entityId, MobEffectInstance inst) { + public static String formatEffectDuration(int entityId, MobEffectInstance inst) { if (inst == null) { return ""; } @@ -90,7 +90,7 @@ final class TargetHudFormatter { return seconds < 10 ? minutes + ":0" + seconds : minutes + ":" + seconds; } - static int rgba(int red, int green, int blue, int alpha) { + public static int rgba(int red, int green, int blue, int alpha) { int r = Math.max(0, Math.min(255, red)); int g = Math.max(0, Math.min(255, green)); int b = Math.max(0, Math.min(255, blue)); @@ -98,7 +98,7 @@ final class TargetHudFormatter { return (a << 24) | (r << 16) | (g << 8) | b; } - static String roman(int n) { + public static String roman(int n) { return switch (n) { case 1 -> "I"; case 2 -> "II"; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudModel.java new file mode 100644 index 0000000..aac3b6b --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudModel.java @@ -0,0 +1,35 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud; + +import net.minecraft.resources.Identifier; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public final class TargetHudModel { + + private TargetHudModel() { + } + + public record EquipmentEntry(ItemStack stack, float width) { + } + + public record EquipmentLayout(List entries, float width, float height) { + } + + public record EquipmentRenderTask(ItemStack stack, float x, float y, float scale) { + } + + public record EffectChip(MobEffectInstance effect, Identifier iconId, String text, float width) { + } + + public record EffectLayout(List chips, float width, float height) { + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudTargetResolver.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudTargetResolver.java similarity index 82% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudTargetResolver.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudTargetResolver.java index 6c1ec30..167f5cc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudTargetResolver.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/TargetHudTargetResolver.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud; import dev.loki.lovisual.util.player.PlayerHealthResolver; import dev.loki.lovisual.util.pvp.opponents.TotemPopCounter; @@ -16,13 +16,14 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.ChatScreen; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; -final class TargetHudTargetResolver { +public final class TargetHudTargetResolver { private TargetHudTargetResolver() { } - static LivingEntity resolveTarget(TargetHud element, boolean preview) { + public static LivingEntity resolveTarget(TargetHud element, boolean preview) { Minecraft mc = Minecraft.getInstance(); LivingEntity target = TargetManager.getTarget(); if (target != null && element.playersOnly.get() && !(target instanceof Player)) { @@ -34,7 +35,7 @@ final class TargetHudTargetResolver { return target; } - static void updateDisplayTarget(TargetHud element, LivingEntity target, long now) { + public static void updateDisplayTarget(TargetHud element, LivingEntity target, long now) { Minecraft mc = Minecraft.getInstance(); if (target != null) { if (element.displayTarget != target) { @@ -58,12 +59,12 @@ final class TargetHudTargetResolver { } } - static boolean shouldShow(TargetHud element, LivingEntity target, long now) { + public static boolean shouldShow(TargetHud element, LivingEntity target, long now) { if (target != null) return true; return element.displayTarget != null && element.lastSeenMs > 0L && now - element.lastSeenMs <= Math.max(0L, element.holdMs.get()); } - static TotemPopSnapshot resolveTotemPopSnapshot(TargetHud element, LivingEntity target) { + public static TotemPopSnapshot resolveTotemPopSnapshot(TargetHud element, LivingEntity target) { if (!(target instanceof Player player)) { return TotemPopSnapshot.empty(null); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudContentRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudContentRenderer.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudContentRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudContentRenderer.java index aee4b15..50d52ec 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudContentRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudContentRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -18,15 +18,18 @@ import dev.loki.lovisual.util.player.PlayerHealthResolver; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.LivingEntity; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHudFormatter.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudFormatter.*; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts.TargetHudArcRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudTextRenderer; -final class TargetHudContentRenderer { +public final class TargetHudContentRenderer { private TargetHudContentRenderer() { } - static void drawContent(TargetHud element, + public static void drawContent(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, LivingEntity target, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudPanelRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudPanelRenderer.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudPanelRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudPanelRenderer.java index 772f985..fcf5f4d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudPanelRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudPanelRenderer.java @@ -5,19 +5,20 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.renderer.Renderer2D; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.PANEL_RADIUS; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.PANEL_RADIUS; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; -final class TargetHudPanelRenderer { +public final class TargetHudPanelRenderer { private TargetHudPanelRenderer() { } - static void drawBackground(TargetHud element, + public static void drawBackground(TargetHud element, Renderer2D renderer, float x, float y, @@ -47,7 +48,7 @@ final class TargetHudPanelRenderer { ); } - static void drawHitPulse(TargetHud element, + public static void drawHitPulse(TargetHud element, Renderer2D renderer, float x, float y, @@ -76,7 +77,7 @@ final class TargetHudPanelRenderer { renderer.roundedRectStroke(x, y, width, height, radius, 1.0f, 0.9f + scaledPulse, innerColor); } - static void drawBlur(TargetHud element, + public static void drawBlur(TargetHud element, float x, float y, float width, @@ -91,7 +92,7 @@ final class TargetHudPanelRenderer { Renderer2D.COLOR.blurRect(x, y, width, height, radius, quality, brightness, alpha, 0xFFFFFF); } - static void drawGlass(TargetHud element, + public static void drawGlass(TargetHud element, float x, float y, float width, @@ -104,7 +105,7 @@ final class TargetHudPanelRenderer { HudRenderUtil.drawLiquidGlass(x, y, width, height, radius, glassScale, true, blurStrength, glassAlpha); } - static void drawGlassCard(TargetHud element, + public static void drawGlassCard(TargetHud element, float x, float y, float width, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudRenderer.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudRenderer.java index 57ba761..b29dfa4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; @@ -22,15 +22,24 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.world.entity.LivingEntity; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudModel.EffectLayout; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudModel.EquipmentLayout; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudTargetResolver; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudContentRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts.TargetHudEffectsRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts.TargetHudEquipmentRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts.TargetHudFaceRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudPanelRenderer; -final class TargetHudRenderer { +public final class TargetHudRenderer { private TargetHudRenderer() { } - static void render(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, float tickDelta, int screenW, int screenH) { + public static void render(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, float tickDelta, int screenW, int screenH) { Minecraft mc = Minecraft.getInstance(); try (ProfilerPhase.Scope ignored = ProfilerPhase.scope("2d:target_hud:main"); RenderProfiler2D.Section ignoredSection = RenderProfiler2D.section("target_hud:main")) { @@ -116,7 +125,7 @@ final class TargetHudRenderer { } } - static void updatePalette(TargetHud element) { + public static void updatePalette(TargetHud element) { if (element.isThemeMode()) { int panelAlpha = element.bgAlpha.get(); element.uiBgPrimary = HudRenderUtil.setAlpha(theme().windowBg(), panelAlpha); @@ -176,7 +185,7 @@ final class TargetHudRenderer { element.uiHitInner = element.hitInner.getArgb(); } - static float computeHitPulse(TargetHud element, long now) { + public static float computeHitPulse(TargetHud element, long now) { if (element.displayTarget == null) return 0.0f; Long hitAt = HIT_FLASH_MS_BY_ID.get(element.displayTarget.getId()); if (hitAt == null) return 0.0f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudTextRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudTextRenderer.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudTextRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudTextRenderer.java index 85de480..f76e7c1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudTextRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/TargetHudTextRenderer.java @@ -5,21 +5,21 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.text.TextRenderer; import net.minecraft.util.Util; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; -final class TargetHudTextRenderer { +public final class TargetHudTextRenderer { private TargetHudTextRenderer() { } - static float measureText(TextRenderer renderer, String text, float scale) { + public static float measureText(TextRenderer renderer, String text, float scale) { renderer.begin(scale, false, false); try { return (float) renderer.getWidth(text, false); @@ -28,7 +28,7 @@ final class TargetHudTextRenderer { } } - static float getTextHeight(TextRenderer renderer, float scale) { + public static float getTextHeight(TextRenderer renderer, float scale) { renderer.begin(scale, false, false); try { return (float) renderer.getHeight(false); @@ -37,7 +37,7 @@ final class TargetHudTextRenderer { } } - static String trimText(TextRenderer renderer, String text, float maxWidth, float scale) { + public static String trimText(TextRenderer renderer, String text, float maxWidth, float scale) { if (text == null || text.isEmpty()) return ""; renderer.begin(scale, false, false); try { @@ -56,7 +56,7 @@ final class TargetHudTextRenderer { } } - static void drawScrollingText(TextRenderer renderer, + public static void drawScrollingText(TextRenderer renderer, String text, float x, float y, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudArcRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudArcRenderer.java similarity index 85% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudArcRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudArcRenderer.java index 53af4ea..a38bea1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudArcRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudArcRenderer.java @@ -5,7 +5,15 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.ARC_CENTER_Y; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.ARC_RADIUS; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.ARC_RIGHT_INSET; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.ARC_TAIL_FADE_DEGREES; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.ARC_THICKNESS; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.CONTENT_X_OFFSET; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.CONTENT_Y_OFFSET; + import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -15,14 +23,15 @@ import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; -final class TargetHudArcRenderer { +public final class TargetHudArcRenderer { private TargetHudArcRenderer() { } - static void drawHealthArc(TargetHud element, + public static void drawHealthArc(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, float x, @@ -111,7 +120,7 @@ final class TargetHudArcRenderer { } } - static void drawAnimatedArcGradient(Renderer2D renderer, + public static void drawAnimatedArcGradient(Renderer2D renderer, float centerX, float centerY, float radius, @@ -156,7 +165,7 @@ final class TargetHudArcRenderer { } - static int[] buildWaveColors(long elapsedMs, + public static int[] buildWaveColors(long elapsedMs, float waveSpeedMs, float alphaFactor, int startColor, @@ -172,7 +181,7 @@ final class TargetHudArcRenderer { return colors; } - static float tailFade(float visibleLength, float fadeLength) { + public static float tailFade(float visibleLength, float fadeLength) { if (fadeLength <= 0.0f) return visibleLength > 0.0f ? 1.0f : 0.0f; return AnimationUtility.smoothstep(AnimationUtility.clamp01(visibleLength / fadeLength)); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudEffectsRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudEffectsRenderer.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudEffectsRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudEffectsRenderer.java index 7800527..be28287 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudEffectsRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudEffectsRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.color.RenderColor; @@ -23,15 +23,20 @@ import net.minecraft.world.entity.player.Player; import java.util.ArrayList; import java.util.List; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHudFormatter.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudFormatter.*; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudModel.EffectLayout; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudModel.EffectChip; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudPanelRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudTextRenderer; -final class TargetHudEffectsRenderer { +public final class TargetHudEffectsRenderer { private TargetHudEffectsRenderer() { } - static EffectLayout buildEffectLayout(TargetHud element, + public static EffectLayout buildEffectLayout(TargetHud element, LivingEntity target, boolean preview, TextRenderer textRenderer, @@ -70,7 +75,7 @@ final class TargetHudEffectsRenderer { return new EffectLayout(chips, totalWidth, totalHeight); } - static void drawEffects(TargetHud element, + public static void drawEffects(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, EffectLayout layout, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudEquipmentRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudEquipmentRenderer.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudEquipmentRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudEquipmentRenderer.java index 9518aca..b197c39 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudEquipmentRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudEquipmentRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -20,14 +20,19 @@ import net.minecraft.world.item.Items; import java.util.ArrayList; import java.util.List; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudModel.EquipmentRenderTask; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudModel.EquipmentLayout; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudModel.EquipmentEntry; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudPanelRenderer; -final class TargetHudEquipmentRenderer { +public final class TargetHudEquipmentRenderer { private TargetHudEquipmentRenderer() { } - static EquipmentLayout buildEquipmentLayout(TargetHud element, LivingEntity target, boolean preview, TextRenderer textRenderer, float scale) { + public static EquipmentLayout buildEquipmentLayout(TargetHud element, LivingEntity target, boolean preview, TextRenderer textRenderer, float scale) { if (!element.isEquipmentEnabled() || target == null || textRenderer == null || scale <= 0.0f) { return new EquipmentLayout(List.of(), 0.0f, 0.0f); } @@ -88,7 +93,7 @@ final class TargetHudEquipmentRenderer { entries.add(new EquipmentEntry(stack == null ? ItemStack.EMPTY : stack, baseWidth)); } - static void drawEquipment(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, + public static void drawEquipment(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, EquipmentLayout layout, float x, float y, float panelWidth, float equipmentHeight, float scaleFactor, float alphaFactor, boolean glassEnabled) { if (ctx == null || layout.entries().isEmpty() || alphaFactor <= 0.01f) { @@ -159,7 +164,7 @@ final class TargetHudEquipmentRenderer { } } - static void drawItem(Renderer2D renderer, ItemStack stack, float x, float y, float itemScale, int seed, float alphaFactor) { + public static void drawItem(Renderer2D renderer, ItemStack stack, float x, float y, float itemScale, int seed, float alphaFactor) { if (renderer == null || stack == null || stack.isEmpty() || alphaFactor <= 0.001f) { return; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudFaceRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudFaceRenderer.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudFaceRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudFaceRenderer.java index ab0e65e..a35d3f1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/TargetHudFaceRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/targethud/render/parts/TargetHudFaceRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.gui.hud.draggable.impl; +package dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -28,9 +28,13 @@ import net.minecraft.world.item.Items; import java.util.Locale; import java.util.UUID; -import static dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud.*; +import static dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud.*; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHudFormatter; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.parts.TargetHudEquipmentRenderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.render.TargetHudTextRenderer; -final class TargetHudFaceRenderer { +public final class TargetHudFaceRenderer { private static ItemStack totemBadgeStack; @@ -44,7 +48,7 @@ final class TargetHudFaceRenderer { return totemBadgeStack; } - static void updateTotemPopAnimation(TargetHud element, LivingEntity target, TotemPopSnapshot snapshot, float dt) { + public static void updateTotemPopAnimation(TargetHud element, LivingEntity target, TotemPopSnapshot snapshot, float dt) { UUID id = target instanceof Player player ? player.getUUID() : null; if (id == null || !id.equals(element.totemPopTargetId)) { element.totemPopTargetId = id; @@ -68,7 +72,7 @@ final class TargetHudFaceRenderer { element.totemPopTextPulse = AnimationUtility.snap(element.totemPopTextPulse, 0.0f, 0.001f); } - static void drawFace(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, LivingEntity target, float x, float y, float scaleFactor, float alphaFactor, TotemPopSnapshot totemPopSnapshot) { + public static void drawFace(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, GuiGraphicsExtractor ctx, LivingEntity target, float x, float y, float scaleFactor, float alphaFactor, TotemPopSnapshot totemPopSnapshot) { float faceSize = FACE_SIZE * scaleFactor; float faceX = x + (FACE_X + CONTENT_X_OFFSET) * scaleFactor; float faceY = y + (FACE_Y + CONTENT_Y_OFFSET) * scaleFactor; @@ -112,7 +116,7 @@ final class TargetHudFaceRenderer { ); } - static void drawPlaceholderFace(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, LivingEntity target, float x, float y, float size, float radius, float alphaFactor, float hurtPercent) { + public static void drawPlaceholderFace(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, LivingEntity target, float x, float y, float size, float radius, float alphaFactor, float hurtPercent) { Minecraft mc = Minecraft.getInstance(); int light = HudRenderUtil.scaleAlpha(HudRenderUtil.mixColor(element.uiBgSecondary, element.uiHealthEnd, 0.28f), alphaFactor); int dark = HudRenderUtil.scaleAlpha(HudRenderUtil.mixColor(element.uiBgPrimary, 0xFF000000, 0.22f), alphaFactor); @@ -146,7 +150,7 @@ final class TargetHudFaceRenderer { } } - static void drawTotemPopBadge(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, TotemPopSnapshot snapshot, float faceX, float faceY, float faceSize, float faceRadius, float scaleFactor, float alphaFactor) { + public static void drawTotemPopBadge(TargetHud element, Renderer2D renderer, TextRenderer textRenderer, TotemPopSnapshot snapshot, float faceX, float faceY, float faceSize, float faceRadius, float scaleFactor, float alphaFactor) { if (snapshot == null || snapshot.count() <= 0 || element.totemPopAnimation <= 0.001f) { return; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorTracker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorTracker.java index 5bc3f85..7f3fe88 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorTracker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorTracker.java @@ -22,6 +22,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TrackedEye; +import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver; public final class TriangulatorTracker { private static final float SEARCH_RANGE = 196.0f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorView.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorView.java index e7aa184..933ddb2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorView.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorView.java @@ -11,12 +11,13 @@ import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver.CachedThrow; import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver.SolveResult; import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.model.DisplayState; -import dev.loki.lovisual.features.gui.hud.draggable.impl.ScriptedTriangulatorHudPanel; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedTriangulatorHudPanel; import java.util.List; import java.util.Locale; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver; public final class TriangulatorView { private static final long RESET_FLASH_MS = 3000L; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorMeasure.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorMeasure.java index 042cdcc..5bf67b5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorMeasure.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorMeasure.java @@ -12,14 +12,15 @@ import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.Triangulat import dev.loki.lovisual.render.engine.text.TextRenderer; import java.util.List; +import dev.loki.lovisual.features.gui.hud.draggable.impl.Triangulator; /** * Text measurement pass that computes the animated panel width/height * targets and shared header metrics for the Triangulator HUD. */ public final class TriangulatorMeasure { - static final float CLEAR_BUTTON_SIZE = 9.0f; - static final float HEADER_BUTTON_GAP = 3.0f; + public static final float CLEAR_BUTTON_SIZE = 9.0f; + public static final float HEADER_BUTTON_GAP = 3.0f; private static final float MIN_WIDTH = 126.0f; private static final float ROW_STEP = 11.0f; private static final float CONTENT_START_Y = 23.0f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorPainter.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorPainter.java index 6e265a1..f7ac342 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorPainter.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/render/TriangulatorPainter.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.render; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.features.gui.hud.HudTextEffects; -import dev.loki.lovisual.features.gui.hud.draggable.impl.ScriptedTriangulatorHudPanel; +import dev.loki.lovisual.features.gui.hud.draggable.impl.scripted.ScriptedTriangulatorHudPanel; import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver.CachedThrow; import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver.SolveResult; import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver; @@ -20,6 +20,8 @@ import net.minecraft.util.Util; import java.util.LinkedHashMap; import java.util.List; +import dev.loki.lovisual.features.gui.hud.draggable.impl.Triangulator; +import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.render.TriangulatorMeasure; /** * Assembles the scripted Triangulator panel: header button hitboxes, row diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/render/RegistryRenderPipeline.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/render/RegistryRenderPipeline.java index 588388f..3f77de3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/render/RegistryRenderPipeline.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/draggable/render/RegistryRenderPipeline.java @@ -8,7 +8,7 @@ package dev.loki.lovisual.features.gui.hud.draggable.render; import dev.loki.lovisual.Lifecycle; -import dev.loki.lovisual.features.gui.chat.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; import dev.loki.lovisual.features.gui.hud.*; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElement; import dev.loki.lovisual.features.gui.hud.draggable.interaction.RegistryDragController; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/BetterButtons.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/BetterButtons.java index da7c551..3bf5d1b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/BetterButtons.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/BetterButtons.java @@ -29,8 +29,8 @@ import dev.loki.lovisual.features.gui.hud.AbstractHudElement; import dev.loki.lovisual.features.gui.hud.HudElementRegister; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.mixininterface.IRoundedHitbox; -import dev.loki.lovisual.mixins.accessors.ClickableWidgetAccessor; -import dev.loki.lovisual.mixins.accessors.TextIconButtonWidgetAccessor; +import dev.loki.lovisual.mixins.accessors.widget.ClickableWidgetAccessor; +import dev.loki.lovisual.mixins.accessors.hud.TextIconButtonWidgetAccessor; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.core.ViewportContext; import dev.loki.lovisual.render.engine.renderer.RenderWarpStack; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBar.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBar.java index 71fea5d..91ce4bd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBar.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBar.java @@ -12,7 +12,7 @@ import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.features.gui.hud.AbstractHudElement; import dev.loki.lovisual.features.gui.hud.HudElementRegister; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; -import dev.loki.lovisual.features.gui.hud.draggable.impl.HudNotifier; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.util.input.KeyManager; import net.minecraft.client.DeltaTracker; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBarModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBarModel.java index 62a0dbc..0737afa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBarModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomBarModel.java @@ -16,7 +16,7 @@ import net.minecraft.world.waypoints.TrackedWaypoint; import java.util.Locale; import java.util.UUID; -final class CustomBarModel { +public final class CustomBarModel { private CustomBarModel() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHealthBar.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHealthBar.java index 0481c57..e1919dc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHealthBar.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHealthBar.java @@ -35,6 +35,7 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import java.util.List; import static dev.loki.lovisual.features.theme.Theme.theme; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; @HudElementRegister(order = 50) public final class CustomHealthBar extends AbstractHudElement { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHotbar.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHotbar.java index dc5d7c6..b92be44 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHotbar.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomHotbar.java @@ -18,11 +18,11 @@ import net.minecraft.world.item.ItemStack; import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.features.gui.hud.AbstractHudElement; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Animations; +import dev.loki.lovisual.features.module.modules.visuals.player.Animations; import dev.loki.lovisual.features.gui.hud.HudElementRegister; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.features.theme.Themes; -import dev.loki.lovisual.mixins.accessors.PlayerInventoryAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.PlayerInventoryAccessor; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.render.engine.math.ColorMath; import dev.loki.lovisual.render.engine.renderer.Renderer2D; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomJumpBarRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomJumpBarRenderer.java index aefa9a7..9ebcb4e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomJumpBarRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomJumpBarRenderer.java @@ -16,7 +16,7 @@ import net.minecraft.util.Mth; import static dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomBar.*; -final class CustomJumpBarRenderer { +public final class CustomJumpBarRenderer { private CustomJumpBarRenderer() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorCollector.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorCollector.java index 9ec0381..e9b1404 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorCollector.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorCollector.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; -final class CustomLocatorCollector { +public final class CustomLocatorCollector { private CustomLocatorCollector() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorHeads.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorHeads.java index b08e719..53ab683 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorHeads.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorHeads.java @@ -14,7 +14,7 @@ import net.minecraft.client.gui.GuiGraphicsExtractor; import java.util.List; -final class CustomLocatorHeads { +public final class CustomLocatorHeads { private CustomLocatorHeads() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelCache.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelCache.java index 5f6c4c1..eba516b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelCache.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelCache.java @@ -16,7 +16,7 @@ import java.util.Set; import static dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomBar.*; -final class CustomLocatorLabelCache { +public final class CustomLocatorLabelCache { private static final Map ANIM = new HashMap<>(); private static final Map CACHE = new HashMap<>(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelPanel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelPanel.java index c247dbf..eecc79e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelPanel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabelPanel.java @@ -14,7 +14,7 @@ import net.minecraft.util.Mth; import static dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomBar.*; import static dev.loki.lovisual.features.theme.Theme.theme; -final class CustomLocatorLabelPanel { +public final class CustomLocatorLabelPanel { private CustomLocatorLabelPanel() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabels.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabels.java index b0a7c47..099966e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabels.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorLabels.java @@ -23,7 +23,7 @@ import java.util.List; import static dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomBar.*; import static dev.loki.lovisual.features.theme.Theme.theme; -final class CustomLocatorLabels { +public final class CustomLocatorLabels { private CustomLocatorLabels() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorMarkers.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorMarkers.java index f18fe59..1670e3c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorMarkers.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorMarkers.java @@ -20,7 +20,7 @@ import java.util.UUID; import static dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomBar.*; -final class CustomLocatorMarkers { +public final class CustomLocatorMarkers { private CustomLocatorMarkers() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorRenderer.java index 6228dbf..c4ab01a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorRenderer.java @@ -27,7 +27,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; -final class CustomLocatorRenderer { +public final class CustomLocatorRenderer { private CustomLocatorRenderer() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorResolver.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorResolver.java index a6da00a..3fbfbe2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorResolver.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomLocatorResolver.java @@ -20,7 +20,7 @@ import java.nio.charset.StandardCharsets; import java.util.Set; import java.util.UUID; -final class CustomLocatorResolver { +public final class CustomLocatorResolver { private CustomLocatorResolver() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomXpBarRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomXpBarRenderer.java index bd6ee9b..12ec4cd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomXpBarRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/CustomXpBarRenderer.java @@ -21,7 +21,7 @@ import net.minecraft.util.Mth; import static dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomBar.*; import static dev.loki.lovisual.features.theme.Theme.theme; -final class CustomXpBarRenderer { +public final class CustomXpBarRenderer { private CustomXpBarRenderer() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/dynamicisland/IslandUiUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/dynamicisland/IslandUiUtil.java index efca081..fac6da2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/dynamicisland/IslandUiUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/dynamicisland/IslandUiUtil.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.features.gui.hud.nondraggable.impl.dynamicisland; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.misc.ClickGui; -import dev.loki.lovisual.mixins.accessors.BossHealthOverlayAccessor; +import dev.loki.lovisual.mixins.accessors.hud.BossHealthOverlayAccessor; import dev.loki.lovisual.render.engine.math.HudScale; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.TextRenderer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListAnimator.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListAnimator.java index 9dbdd1e..6222994 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListAnimator.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListAnimator.java @@ -15,7 +15,7 @@ import java.util.Map; import java.util.Set; import java.util.UUID; -final class TabListAnimator { +public final class TabListAnimator { private final Map rows = new HashMap<>(); private float panelPresence; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListModel.java index 2297c5b..1fe72f4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabListModel.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.features.gui.hud.nondraggable.impl.tab; import com.mojang.authlib.GameProfile; import dev.loki.lovisual.features.relations.CategoryService; import dev.loki.lovisual.features.relations.CategoryType; -import dev.loki.lovisual.mixins.accessors.PlayerTabOverlayAccessor; +import dev.loki.lovisual.mixins.accessors.hud.PlayerTabOverlayAccessor; import dev.loki.lovisual.util.player.PlayerSkinResolver; import dev.loki.lovisual.util.text.LegacyTextUtil; import net.minecraft.client.Minecraft; @@ -36,7 +36,7 @@ import java.util.Locale; import java.util.Set; import java.util.UUID; -final class TabListModel { +public final class TabListModel { private static final int MAX_PLAYERS = 80; private static final int MAX_ROWS_PER_COLUMN = 13; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabRichTextRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabRichTextRenderer.java index b994d45..eeb7230 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabRichTextRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/nondraggable/impl/tab/TabRichTextRenderer.java @@ -25,7 +25,7 @@ import java.util.Map; import java.util.Optional; import java.util.WeakHashMap; -final class TabRichTextRenderer { +public final class TabRichTextRenderer { private static final RenderColor TMP = new RenderColor(255, 255, 255, 255); private static final int CACHE_LIMIT = 4096; private static final WeakHashMap> SEGMENT_CACHE = new WeakHashMap<>(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/script/HudScriptLayouts.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/script/HudScriptLayouts.java index 7727860..b7af562 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/script/HudScriptLayouts.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/gui/hud/script/HudScriptLayouts.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.features.gui.hud.script; import net.minecraft.client.Minecraft; import net.minecraft.server.packs.resources.ResourceManager; import org.lwjgl.glfw.GLFW; -import dev.loki.lovisual.features.gui.hud.draggable.impl.HudNotifier; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; import dev.loki.lovisual.render.engine.renderer.ui.runtime.core.UiRuntime; import dev.loki.lovisual.render.engine.renderer.ui.runtime.script.*; import dev.loki.lovisual.util.logging.DebugLog; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Module.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Module.java index 8c8d0fb..afbdca6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Module.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Module.java @@ -9,17 +9,20 @@ package dev.loki.lovisual.features.module; import com.mojang.blaze3d.vertex.PoseStack; import dev.loki.lovisual.config.*; -import dev.loki.lovisual.events.impl.RenderPrewarmCollectEvent; +import dev.loki.lovisual.events.impl.render.RenderPrewarmCollectEvent; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.addon.ModuleExtensionManager; -import dev.loki.lovisual.features.gui.clickgui.settings.*; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.SettingFactory; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; + import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.renderer.SubmitNodeCollector; -import dev.loki.lovisual.config.*; import dev.loki.lovisual.config.common.CommonBooleanGroupSchema; import dev.loki.lovisual.config.common.CommonSettingSchema; -import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.features.gui.clickgui.settings.*; + import dev.loki.lovisual.features.module.module.ModuleBinds; import dev.loki.lovisual.features.module.module.ModuleConfigValues; import dev.loki.lovisual.features.module.module.ModuleNames; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleInfo.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleInfo.java index 8d72110..849fb19 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleInfo.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleInfo.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.features.module; -import dev.loki.lovisual.events.UsedImplicitly; +import dev.loki.lovisual.events.meta.UsedImplicitly; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleRegister.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleRegister.java index 2bed1bc..fc44083 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleRegister.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/ModuleRegister.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.features.module; -import dev.loki.lovisual.events.UsedImplicitly; +import dev.loki.lovisual.events.meta.UsedImplicitly; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Notifier.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Notifier.java index ae625a3..8159e5a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Notifier.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/Notifier.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.features.module; -import dev.loki.lovisual.features.gui.hud.draggable.impl.HudNotifier; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; public enum Notifier { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleBinds.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleBinds.java index dcf9790..51056f5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleBinds.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleBinds.java @@ -9,9 +9,9 @@ package dev.loki.lovisual.features.module.module; import dev.loki.lovisual.config.values.BindMode; import dev.loki.lovisual.config.values.KeyBindValue; -import dev.loki.lovisual.features.gui.clickgui.settings.FunctionBindSetting; -import dev.loki.lovisual.features.gui.clickgui.settings.KeyBindSetting; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.KeyBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; import dev.loki.lovisual.util.input.KeyManager; import java.util.List; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleConfigValues.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleConfigValues.java index 9736c3f..4b13b20 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleConfigValues.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleConfigValues.java @@ -13,7 +13,7 @@ import dev.loki.lovisual.config.ConfigSerializer; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.ConfigValue; import dev.loki.lovisual.config.values.EnumValue; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; import dev.loki.lovisual.features.module.ModuleActivationSource; import java.util.ArrayList; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleSettingValues.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleSettingValues.java index 51091bf..21132d9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleSettingValues.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/module/ModuleSettingValues.java @@ -22,7 +22,7 @@ import dev.loki.lovisual.config.values.RGBAColorValue; import dev.loki.lovisual.config.values.RGBColorValue; import dev.loki.lovisual.config.values.SetValue; import dev.loki.lovisual.config.values.StringValue; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import java.util.Map; import java.util.Set; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/Predictions.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/Predictions.java index 8ffbb64..9cd6ebc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/Predictions.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/Predictions.java @@ -44,7 +44,7 @@ import dev.loki.lovisual.features.module.modules.combat.predictions.PredictionsM import dev.loki.lovisual.features.module.modules.combat.predictions.PredictionsModel.Kind; import dev.loki.lovisual.features.module.modules.combat.predictions.PredictionsModel.TimerPlate; import dev.loki.lovisual.features.module.modules.combat.predictions.PredictionsModel.TrajectoryResult; -import dev.loki.lovisual.mixins.accessors.PersistentProjectileEntityAccessor; +import dev.loki.lovisual.mixins.accessors.projectile.PersistentProjectileEntityAccessor; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.TextureStorage; import dev.loki.lovisual.render.engine.animation.AnimationUtility; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/ProjectilePuncher.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/ProjectilePuncher.java index b27cdbf..2bf0f4b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/ProjectilePuncher.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/ProjectilePuncher.java @@ -20,8 +20,8 @@ import dev.loki.lovisual.config.values.BooleanMapValue; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.EnumValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.RotationUpdateEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.input.RotationUpdateEvent; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/PvpCooldowns.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/PvpCooldowns.java index fdbd867..e159666 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/PvpCooldowns.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/PvpCooldowns.java @@ -15,8 +15,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import dev.loki.lovisual.config.SettingDef; -import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; @@ -27,6 +26,7 @@ import dev.loki.lovisual.util.pvp.PvpState; import dev.loki.lovisual.util.pvp.client.CooldownsState; import java.util.*; +import dev.loki.lovisual.features.gui.clickgui.settings.cooldown.CooldownRulesSetting; /** * Handles PvP cooldown rendering and optional local rule synthesis. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/RubberHand.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/RubberHand.java index 69fa873..6bb06bc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/RubberHand.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/RubberHand.java @@ -14,8 +14,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.item.Items; import net.minecraft.world.phys.EntityHitResult; import dev.loki.lovisual.config.values.BooleanMapValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.EventSync; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.network.EventSync; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLog.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLog.java new file mode 100644 index 0000000..547b46a --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLog.java @@ -0,0 +1,137 @@ +package dev.loki.lovisual.features.module.modules.combat.combatlog; + +import dev.loki.lovisual.config.values.NumberValue; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.entity.AttackEntityEvent; +import dev.loki.lovisual.features.module.Module; +import dev.loki.lovisual.features.module.ModuleCategory; +import dev.loki.lovisual.features.module.ModuleInfo; +import dev.loki.lovisual.util.time.GameClock; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * Tracks and attributes combat hits (damage dealt/taken) by watching health deltas of nearby + * living entities each tick, correlated with local {@link AttackEntityEvent}s for outgoing hits + * and nearby players' swing animation for incoming ones. No exact damage packet exists + * client-side, so this is a health-delta reconstruction, not a server-authoritative log. + */ +@ModuleInfo( + id = "combatlog", + displayName = "CombatLog", + category = ModuleCategory.COMBAT, + description = "Логирует нанесённый/полученный урон и считает DPS по бою" +) +public final class CombatLog extends Module { + + private static final int MAX_ENTRIES = 200; + private static final long OUTGOING_ATTRIBUTION_WINDOW_MS = 500L; + private static final long INCOMING_ATTACKER_WINDOW_MS = 300L; + private static final double INCOMING_ATTACKER_RANGE = 6.0; + private static final double SCAN_RADIUS = 24.0; + + private final NumberValue combatWindowSeconds = num("combatWindowSeconds", 10, 3, 60); + private final NumberValue historySeconds = num("combatHistorySeconds", 30, 5, 300); + + private final List entries = new ArrayList<>(); + private final Map prevHealth = new HashMap<>(); + private final Map pendingSelfHits = new HashMap<>(); + private float prevSelfHealth = -1f; + + @EventHandler + private void onAttack(AttackEntityEvent event) { + if (event == null || event.getTarget() == null) return; + pendingSelfHits.put(event.getTarget().getUUID(), GameClock.millis()); + } + + @Override + public void onTick() { + if (!isEnabled()) return; + + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || mc.player == null) return; + + long now = GameClock.millis(); + pendingSelfHits.entrySet().removeIf(e -> now - e.getValue() > OUTGOING_ATTRIBUTION_WINDOW_MS); + + trackOutgoingHits(mc, now); + trackIncomingHits(mc, now); + pruneHistory(now); + } + + private void trackOutgoingHits(Minecraft mc, long now) { + for (LivingEntity entity : mc.level.getEntitiesOfClass(LivingEntity.class, + mc.player.getBoundingBox().inflate(SCAN_RADIUS), e -> e != mc.player)) { + UUID id = entity.getUUID(); + float health = entity.getHealth(); + Float previous = prevHealth.put(id, health); + if (previous == null || previous <= health) continue; + + if (pendingSelfHits.containsKey(id)) { + float damage = previous - health; + entries.add(new CombatLogEntry(entity.getName().getString(), damage, true, now)); + pendingSelfHits.remove(id); + } + } + } + + private void trackIncomingHits(Minecraft mc, long now) { + float selfHealth = mc.player.getHealth() + mc.player.getAbsorptionAmount(); + if (prevSelfHealth < 0f) { + prevSelfHealth = selfHealth; + return; + } + if (selfHealth < prevSelfHealth) { + float damage = prevSelfHealth - selfHealth; + String attacker = findLikelyAttacker(mc, now); + entries.add(new CombatLogEntry(attacker, damage, false, now)); + } + prevSelfHealth = selfHealth; + } + + private String findLikelyAttacker(Minecraft mc, long now) { + Player nearest = null; + double nearestDistSq = INCOMING_ATTACKER_RANGE * INCOMING_ATTACKER_RANGE; + + for (Player player : mc.level.players()) { + if (player == mc.player || !player.swinging) continue; + double distSq = player.distanceToSqr(mc.player); + if (distSq <= nearestDistSq) { + nearestDistSq = distSq; + nearest = player; + } + } + return nearest != null ? nearest.getName().getString() : "Unknown"; + } + + private void pruneHistory(long now) { + long maxAgeMs = historySeconds.get() * 1000L; + entries.removeIf(e -> now - e.timestampMs() > maxAgeMs); + while (entries.size() > MAX_ENTRIES) { + entries.remove(0); + } + } + + @Override + public void onDisable() { + entries.clear(); + prevHealth.clear(); + pendingSelfHits.clear(); + prevSelfHealth = -1f; + } + + public List getEntries() { + return entries; + } + + public CombatLogStats.Summary getSummary() { + return CombatLogStats.summarize(entries, GameClock.millis(), combatWindowSeconds.get() * 1000L); + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogEntry.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogEntry.java new file mode 100644 index 0000000..66eaa2d --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogEntry.java @@ -0,0 +1,5 @@ +package dev.loki.lovisual.features.module.modules.combat.combatlog; + +/** A single attributed hit: either dealt by the local player or taken by them. */ +public record CombatLogEntry(String otherName, float damage, boolean dealtByMe, long timestampMs) { +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStats.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStats.java new file mode 100644 index 0000000..11360a8 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStats.java @@ -0,0 +1,60 @@ +package dev.loki.lovisual.features.module.modules.combat.combatlog; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Pure aggregation over a window of {@link CombatLogEntry}: damage dealt/taken, DPS, and who + * you're trading the most with. No Minecraft dependency — entries and "now" are passed in. + */ +public final class CombatLogStats { + + public record Summary(float totalDealt, float totalTaken, float dpsDealt, float dpsTaken, + String topTarget, String topAttacker) { + public static final Summary EMPTY = new Summary(0f, 0f, 0f, 0f, null, null); + } + + private CombatLogStats() { + } + + public static Summary summarize(List entries, long now, long windowMs) { + if (entries == null || entries.isEmpty() || windowMs <= 0) return Summary.EMPTY; + + float totalDealt = 0f; + float totalTaken = 0f; + long windowStart = now - windowMs; + Map dealtTo = new HashMap<>(); + Map takenFrom = new HashMap<>(); + + for (CombatLogEntry entry : entries) { + if (entry.timestampMs() < windowStart || entry.timestampMs() > now) continue; + + if (entry.dealtByMe()) { + totalDealt += entry.damage(); + dealtTo.merge(entry.otherName(), entry.damage(), Float::sum); + } else { + totalTaken += entry.damage(); + takenFrom.merge(entry.otherName(), entry.damage(), Float::sum); + } + } + + float seconds = windowMs / 1000f; + float dpsDealt = seconds > 0 ? totalDealt / seconds : 0f; + float dpsTaken = seconds > 0 ? totalTaken / seconds : 0f; + + return new Summary(totalDealt, totalTaken, dpsDealt, dpsTaken, topName(dealtTo), topName(takenFrom)); + } + + private static String topName(Map byName) { + String best = null; + float bestValue = -1f; + for (Map.Entry entry : byName.entrySet()) { + if (entry.getValue() > bestValue) { + bestValue = entry.getValue(); + best = entry.getKey(); + } + } + return best; + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/DefineTarget.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/DefineTarget.java index 60f7555..281c654 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/DefineTarget.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/DefineTarget.java @@ -21,7 +21,7 @@ import dev.loki.lovisual.config.values.BooleanMapValue; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.EnumValue; import dev.loki.lovisual.config.values.ModeValue; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/MessageFilter.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/MessageFilter.java index 25d3e44..7b53d41 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/MessageFilter.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/MessageFilter.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.features.module.modules.misc; import net.minecraft.network.chat.Component; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.SetValue; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/NoSound.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/NoSound.java index 991d00b..7e204aa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/NoSound.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/misc/NoSound.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.features.module.modules.misc; import dev.loki.lovisual.config.values.ModeValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.SetValue; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoAccept.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoAccept.java index 965bb94..37bfa0d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoAccept.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoAccept.java @@ -11,9 +11,9 @@ import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.SetValue; import dev.loki.lovisual.config.values.StringValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.PvpChatEvent; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.pvp.PvpChatEvent; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoTool.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoTool.java index e4693ea..4b090a1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoTool.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/AutoTool.java @@ -14,13 +14,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; -import dev.loki.lovisual.mixins.accessors.MultiPlayerGameModeAccessor; -import dev.loki.lovisual.mixins.accessors.PlayerInventoryAccessor; +import dev.loki.lovisual.mixins.accessors.misc.MultiPlayerGameModeAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.PlayerInventoryAccessor; import dev.loki.lovisual.util.player.inventory.InventorySwap; //todo Description diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ClickPearl.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ClickPearl.java index 5a1d96a..96b02a9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ClickPearl.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ClickPearl.java @@ -16,7 +16,7 @@ import net.minecraft.world.item.Items; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; -import dev.loki.lovisual.mixins.accessors.PlayerInventoryAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.PlayerInventoryAccessor; import dev.loki.lovisual.util.player.ResetAttackCooldown; import dev.loki.lovisual.util.player.inventory.InventorySwap; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/NoDelay.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/NoDelay.java index d087ded..e7c3b9e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/NoDelay.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/NoDelay.java @@ -31,9 +31,9 @@ import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; -import dev.loki.lovisual.mixins.accessors.LivingEntityAccessor; -import dev.loki.lovisual.mixins.accessors.MinecraftAccessor; -import dev.loki.lovisual.mixins.accessors.MultiPlayerGameModeAccessor; +import dev.loki.lovisual.mixins.accessors.entity.LivingEntityAccessor; +import dev.loki.lovisual.mixins.accessors.misc.MinecraftAccessor; +import dev.loki.lovisual.mixins.accessors.misc.MultiPlayerGameModeAccessor; import java.util.LinkedHashMap; import java.util.Map; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ShitDropper.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ShitDropper.java index c57aa20..f69e7d5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ShitDropper.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/ShitDropper.java @@ -11,7 +11,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; import dev.loki.lovisual.config.values.ItemIdSetValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/TapeMouse.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/TapeMouse.java index 53bca79..3d898d6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/TapeMouse.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/TapeMouse.java @@ -13,7 +13,7 @@ import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; -import dev.loki.lovisual.mixins.accessors.KeyMappingAccessor; +import dev.loki.lovisual.mixins.accessors.misc.KeyMappingAccessor; import dev.loki.lovisual.util.time.GameClock; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/UseTracker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/UseTracker.java index 09d2c1c..31fbb09 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/UseTracker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/player/UseTracker.java @@ -9,8 +9,8 @@ package dev.loki.lovisual.features.module.modules.player; import dev.loki.lovisual.config.values.BooleanMapValue; import dev.loki.lovisual.config.values.BooleanValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.PacketEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.network.PacketEvent; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/CosmeticDisplay.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/CosmeticDisplay.java deleted file mode 100644 index 536082f..0000000 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/CosmeticDisplay.java +++ /dev/null @@ -1,76 +0,0 @@ -package dev.loki.lovisual.features.module.modules.visuals; - -import dev.loki.lovisual.features.cosmetic.CosmeticManager; -import dev.loki.lovisual.features.cosmetic.CosmeticModel; -import dev.loki.lovisual.features.cosmetic.CosmeticRenderer; -import dev.loki.lovisual.features.cosmetic.CosmeticRepository; -import dev.loki.lovisual.features.cosmetic.CosmeticType; -import dev.loki.lovisual.features.module.Module; -import dev.loki.lovisual.features.module.ModuleCategory; -import dev.loki.lovisual.features.module.ModuleInfo; -import dev.loki.lovisual.features.module.WorldPhase; -import dev.loki.lovisual.render.engine.renderer.Renderer3D; -import net.minecraft.client.Minecraft; - -import java.util.List; - -/** - * Renders the locally equipped cosmetic (model/pet/accessory) attached to the local player. - * Equip picking is a minimal next/prev keybind for now; a proper catalog screen is a follow-up. - */ -@ModuleInfo( - id = "cosmeticdisplay", - displayName = "Cosmetics", - aliases = {"cosmetics"}, - category = ModuleCategory.VISUALS, - description = "Отображает надетую косметику (модель/питомец/аксессуар)" -) -public final class CosmeticDisplay extends Module { - - { - action("Next Cosmetic", "NONE"); - action("Prev Cosmetic", "NONE"); - } - - @Override - public void onEnable() { - CosmeticRepository.get().reload(); - } - - @Override - public void onTick() { - if (!isEnabled()) return; - - if (isActionPressedOnce("Next Cosmetic")) { - cycle(1); - } else if (isActionPressedOnce("Prev Cosmetic")) { - cycle(-1); - } - } - - private void cycle(int direction) { - List models = CosmeticRepository.get().byType(CosmeticType.MODEL); - if (models.isEmpty()) return; - - CosmeticModel current = CosmeticManager.get().getActive(CosmeticType.MODEL); - int index = current == null ? -1 : models.indexOf(current); - int next = Math.floorMod(index + direction, models.size()); - - CosmeticManager.get().setActive(CosmeticType.MODEL, models.get(next)); - } - - @Override - public WorldPhase getWorldPhase() { - return WorldPhase.AFTER_POST_PROCESS; - } - - @Override - public void onRenderWorldEngine(Renderer3D renderer, Renderer3D depthRenderer, float tickDelta) { - Minecraft mc = Minecraft.getInstance(); - if (!isEnabled() || mc.level == null || mc.player == null) return; - - CosmeticRenderer.renderOnPlayer(renderer, mc.player, CosmeticType.MODEL, tickDelta); - CosmeticRenderer.renderOnPlayer(renderer, mc.player, CosmeticType.PET, tickDelta); - CosmeticRenderer.renderOnPlayer(renderer, mc.player, CosmeticType.ACCESSORY, tickDelta); - } -} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/AspectRatio.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/AspectRatio.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/AspectRatio.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/AspectRatio.java index 7ed92cd..aa8bac3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/AspectRatio.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/AspectRatio.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.camera; import net.minecraft.util.Mth; import org.joml.Matrix4f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/CameraClip.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/CameraClip.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/CameraClip.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/CameraClip.java index 1c735a4..73de26f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/CameraClip.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/CameraClip.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.camera; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.features.module.Module; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Freecam.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/Freecam.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Freecam.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/Freecam.java index a850f27..b48e7a8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Freecam.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/Freecam.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.camera; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; @@ -14,14 +14,15 @@ import net.minecraft.world.phys.Vec3; import dev.loki.lovisual.config.values.BindMode; import dev.loki.lovisual.config.values.BooleanMapValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.LightmapModifyEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.render.LightmapModifyEvent; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.features.module.Notifier; import dev.loki.lovisual.util.entity.FreecamEntity; +import dev.loki.lovisual.features.module.modules.visuals.player.FullBright; import java.util.Map; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ViewModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/ViewModel.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ViewModel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/ViewModel.java index ce3bbcd..9e47226 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ViewModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/camera/ViewModel.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.camera; import dev.loki.lovisual.util.time.GameClock; @@ -20,7 +20,7 @@ import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.ItemIdSetValue; import dev.loki.lovisual.config.values.ModeValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticDisplay.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticDisplay.java new file mode 100644 index 0000000..2067a4b --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticDisplay.java @@ -0,0 +1,139 @@ +package dev.loki.lovisual.features.module.modules.visuals.cosmetics; + +import dev.loki.lovisual.config.values.EnumValue; +import dev.loki.lovisual.config.values.NumberValue; +import dev.loki.lovisual.features.cosmetic.CosmeticManager; +import dev.loki.lovisual.features.cosmetic.CosmeticModel; +import dev.loki.lovisual.features.cosmetic.CosmeticRenderer; +import dev.loki.lovisual.features.cosmetic.CosmeticRepository; +import dev.loki.lovisual.features.cosmetic.CosmeticSlot; +import dev.loki.lovisual.features.module.Module; +import dev.loki.lovisual.features.module.ModuleCategory; +import dev.loki.lovisual.features.module.ModuleInfo; +import dev.loki.lovisual.features.module.WorldPhase; +import dev.loki.lovisual.features.module.modules.visuals.cosmetics.CosmeticsScreen; +import dev.loki.lovisual.render.engine.renderer.Renderer3D; +import dev.loki.lovisual.util.screen.ClientScreen; +import net.minecraft.client.Minecraft; + +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +/** + * Renders the locally equipped cosmetics (per body-zone slot) attached to the local + * player. Right-click the module card in ClickGUI to open {@link CosmeticsScreen} + * (3D preview + per-slot pickers). Offset/rotation/scale overrides are per accessory + * slot (not per model) — see {@link #offsetsFor(CosmeticSlot)}. + */ +@ModuleInfo( + id = "cosmeticdisplay", + displayName = "Cosmetics", + aliases = {"cosmetics"}, + category = ModuleCategory.VISUALS, + description = "Отображает надетую косметику по слотам (модель/питомец/аксессуары)" +) +public final class CosmeticDisplay extends Module { + + /** Per-slot offset/rotation/scale user overrides, applied on top of the base attachment transform. */ + public record SlotOffsetSettings(NumberValue offsetX, NumberValue offsetY, + NumberValue offsetZ, NumberValue rotation, + NumberValue scale) { + } + + private static final CosmeticSlot[] ACCESSORY_SLOTS = { + CosmeticSlot.HEAD, CosmeticSlot.SHOULDERS, CosmeticSlot.BACK, + CosmeticSlot.WAIST, CosmeticSlot.LEGS, CosmeticSlot.HELD + }; + + private final EnumValue activeSlot = + enumSetting("cosmeticsActiveSlot", "active_slot", CosmeticSlot.HEAD, ACCESSORY_SLOTS); + + private final Map slotSettings = buildSlotSettings(); + + { + action("Next Cosmetic", "NONE"); + action("Prev Cosmetic", "NONE"); + action("Open Cosmetics", "NONE"); + } + + private Map buildSlotSettings() { + Map map = new EnumMap<>(CosmeticSlot.class); + for (CosmeticSlot slot : ACCESSORY_SLOTS) { + String prefix = "cosmetics" + capitalize(slot.getId()); + SlotOffsetSettings settings = new SlotOffsetSettings( + visibleWhen(num(prefix + "OffsetX", "offset_x", 0.0f, -1.0f, 1.0f), () -> activeSlot.get() == slot), + visibleWhen(num(prefix + "OffsetY", "offset_y", 0.0f, -1.0f, 1.0f), () -> activeSlot.get() == slot), + visibleWhen(num(prefix + "OffsetZ", "offset_z", 0.0f, -1.0f, 1.0f), () -> activeSlot.get() == slot), + visibleWhen(num(prefix + "Rotation", "rotation", 0.0f, -180.0f, 180.0f), () -> activeSlot.get() == slot), + visibleWhen(num(prefix + "Scale", "scale", 1.0f, 0.1f, 3.0f), () -> activeSlot.get() == slot) + ); + map.put(slot, settings); + } + return map; + } + + private static String capitalize(String s) { + return s.isEmpty() ? s : Character.toUpperCase(s.charAt(0)) + s.substring(1); + } + + public SlotOffsetSettings offsetsFor(CosmeticSlot slot) { + return slotSettings.get(slot); + } + + public CosmeticSlot getActiveSlot() { + return activeSlot.get(); + } + + public void setActiveSlot(CosmeticSlot slot) { + activeSlot.set(slot); + } + + @Override + public void onEnable() { + CosmeticRepository.get().reload(); + } + + @Override + public void onTick() { + if (!isEnabled()) return; + + if (isActionPressedOnce("Next Cosmetic")) { + cycle(1); + } else if (isActionPressedOnce("Prev Cosmetic")) { + cycle(-1); + } else if (isActionPressedOnce("Open Cosmetics")) { + openScreen(); + } + } + + public void openScreen() { + ClientScreen.show(new CosmeticsScreen()); + } + + private void cycle(int direction) { + List models = CosmeticRepository.get().bySlot(CosmeticSlot.MODEL); + if (models.isEmpty()) return; + + CosmeticModel current = CosmeticManager.get().getActive(CosmeticSlot.MODEL); + int index = current == null ? -1 : models.indexOf(current); + int next = Math.floorMod(index + direction, models.size()); + + CosmeticManager.get().setActive(CosmeticSlot.MODEL, models.get(next)); + } + + @Override + public WorldPhase getWorldPhase() { + return WorldPhase.AFTER_POST_PROCESS; + } + + @Override + public void onRenderWorldEngine(Renderer3D renderer, Renderer3D depthRenderer, float tickDelta) { + Minecraft mc = Minecraft.getInstance(); + if (!isEnabled() || mc.level == null || mc.player == null) return; + + for (CosmeticSlot slot : CosmeticSlot.values()) { + CosmeticRenderer.renderOnPlayer(renderer, mc.player, slot, tickDelta); + } + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspot.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspot.java new file mode 100644 index 0000000..e53581e --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspot.java @@ -0,0 +1,81 @@ +package dev.loki.lovisual.features.module.modules.visuals.cosmetics; + +import dev.loki.lovisual.features.cosmetic.CosmeticSlot; + +/** + * Pure geometry for the clickable body-zone rectangles overlaid on the 3D preview. + * Zones are fixed fractions of the preview region height (not bone-projected: the + * inventory-style entity preview renders through its own camera space, so world-camera + * bone projection doesn't apply here). + */ +public final class CosmeticsHotspot { + private final CosmeticSlot slot; + private final float x; + private final float y; + private final float width; + private final float height; + + public CosmeticsHotspot(CosmeticSlot slot, float x, float y, float width, float height) { + this.slot = slot; + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + public CosmeticSlot slot() { + return slot; + } + + public float x() { + return x; + } + + public float y() { + return y; + } + + public float width() { + return width; + } + + public float height() { + return height; + } + + public boolean contains(double mouseX, double mouseY) { + return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height; + } + + /** + * Builds the four body-zone hotspots for a preview region. BACK reuses the + * SHOULDERS rectangle (selected via a separate front/back view toggle in the screen). + */ + public static CosmeticsHotspot[] forRegion(float regionX, float regionY, float regionW, float regionH, boolean backView) { + float headH = regionH * 0.20f; + float shouldersH = regionH * 0.15f; + float waistH = regionH * 0.15f; + float legsH = regionH - headH - shouldersH - waistH; + + float y0 = regionY; + float y1 = y0 + headH; + float y2 = y1 + shouldersH; + float y3 = y2 + waistH; + + CosmeticSlot shouldersOrBack = backView ? CosmeticSlot.BACK : CosmeticSlot.SHOULDERS; + + return new CosmeticsHotspot[]{ + new CosmeticsHotspot(CosmeticSlot.HEAD, regionX, y0, regionW, headH), + new CosmeticsHotspot(shouldersOrBack, regionX, y1, regionW, shouldersH), + new CosmeticsHotspot(CosmeticSlot.WAIST, regionX, y2, regionW, waistH), + new CosmeticsHotspot(CosmeticSlot.LEGS, regionX, y3, regionW, legsH) + }; + } + + public static CosmeticSlot hitTest(CosmeticsHotspot[] hotspots, double mouseX, double mouseY) { + for (CosmeticsHotspot hotspot : hotspots) { + if (hotspot.contains(mouseX, mouseY)) return hotspot.slot(); + } + return null; + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsScreen.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsScreen.java new file mode 100644 index 0000000..d9da7da --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsScreen.java @@ -0,0 +1,195 @@ +package dev.loki.lovisual.features.module.modules.visuals.cosmetics; + +import dev.loki.lovisual.features.cosmetic.CosmeticSlot; +import dev.loki.lovisual.features.module.Modules; +import dev.loki.lovisual.features.module.modules.visuals.cosmetics.CosmeticDisplay; +import dev.loki.lovisual.features.theme.Theme; +import dev.loki.lovisual.render.engine.renderer.Renderer2D; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +/** + * Cosmetics editor: a live 3D player preview on the left (drag to rotate, scroll to + * zoom) with clickable body-zone hotspots, and a per-slot picker/offset panel on the + * right. Opened via the "Open Cosmetics" action / right-click on the module card. + * + * The preview uses {@link InventoryScreen#extractEntityInInventoryFollowsMouse}, which + * derives the entity's yaw/pitch from a "mouse position" argument — we don't feed it the + * real cursor, we feed it a synthetic position offset by {@link #previewYawPx}/ + * {@link #previewPitchPx} so the pose only changes while the user is dragging the preview. + */ +public final class CosmeticsScreen extends Screen { + private static final float DEFAULT_YAW_PX = -40f; + private static final float DEFAULT_PITCH_PX = 15f; + private static final float MAX_PITCH_PX = 60f; + private static final float PANEL_WIDTH = 160f; + private static final float MARGIN = 12f; + + private final CosmeticsSlotPanel slotPanel; + + private float previewYawPx = DEFAULT_YAW_PX; + private float previewPitchPx = DEFAULT_PITCH_PX; + private float previewScale = 1.0f; + private boolean backView = false; + private CosmeticSlot selectedSlot = CosmeticSlot.HEAD; + + private boolean draggingPreview = false; + private double pressX; + private double pressY; + + public CosmeticsScreen() { + super(Component.literal("Cosmetics")); + CosmeticDisplay module = Modules.get(CosmeticDisplay.class); + this.slotPanel = new CosmeticsSlotPanel(module); + } + + @Override + public void extractRenderState(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) { + int w = context.guiWidth(); + int h = context.guiHeight(); + + Renderer2D.COLOR.begin(); + try { + Renderer2D.COLOR.roundedRect(0, 0, w, h, 0f, Theme.theme().windowBg()); + + float previewW = w - PANEL_WIDTH - MARGIN * 3f; + float previewH = h - MARGIN * 2f; + renderPreview(context, MARGIN, MARGIN, previewW, previewH, delta); + renderHotspots(MARGIN, MARGIN, previewW, previewH, mouseX, mouseY); + + float panelX = MARGIN * 2f + previewW; + slotPanel.render(panelX, MARGIN, PANEL_WIDTH, previewH, selectedSlot, mouseX, mouseY); + } finally { + Renderer2D.COLOR.render(); + } + } + + @Override + public void extractBackground(GuiGraphicsExtractor context, int mouseX, int mouseY, float delta) { + } + + private void renderPreview(GuiGraphicsExtractor context, float x, float y, float width, float height, float tickDelta) { + Player player = Minecraft.getInstance().player; + if (player == null) return; + + int x1 = (int) x; + int y1 = (int) y; + int x2 = (int) (x + width); + int y2 = (int) (y + height); + int size = (int) (Math.min(width, height) * 0.45f * previewScale); + float centerX = x + width / 2f; + float centerY = y + height / 2f; + + InventoryScreen.extractEntityInInventoryFollowsMouse( + context, x1, y1, x2, y2, size, + centerX + previewYawPx, centerY + previewPitchPx, tickDelta, player + ); + } + + private void renderHotspots(float x, float y, float width, float height, double mouseX, double mouseY) { + CosmeticsHotspot[] zones = CosmeticsHotspot.forRegion(x, y, width, height, backView); + int accent = Theme.theme().accent(); + for (CosmeticsHotspot zone : zones) { + boolean hovered = zone.contains(mouseX, mouseY); + boolean active = zone.slot() == selectedSlot; + if (hovered || active) { + int alpha = active ? 70 : 35; + Renderer2D.COLOR.roundedRect(zone.x(), zone.y(), zone.width(), zone.height(), 3f, + (accent & 0x00FFFFFF) | (alpha << 24)); + } + } + } + + @Override + public boolean mouseClicked(MouseButtonEvent click, boolean doubled) { + pressX = click.x(); + pressY = click.y(); + + if (handlePanelClick(click.x(), click.y())) return true; + + if (click.button() == 0 && isInsidePreview((float) click.x(), (float) click.y())) { + draggingPreview = true; + return true; + } + return true; + } + + @Override + public boolean mouseDragged(MouseButtonEvent click, double dragX, double dragY) { + if (!draggingPreview) return false; + previewYawPx += (float) dragX; + previewPitchPx = Math.clamp(previewPitchPx + (float) dragY, -MAX_PITCH_PX, MAX_PITCH_PX); + return true; + } + + @Override + public boolean mouseReleased(MouseButtonEvent click) { + boolean wasDragging = draggingPreview; + draggingPreview = false; + + double moved = Math.hypot(click.x() - pressX, click.y() - pressY); + if (!wasDragging || moved > 4.0) return true; + if (moved <= 4.0) { + handlePreviewClick((float) click.x(), (float) click.y()); + } + return true; + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) { + previewScale = Math.clamp(previewScale + (float) verticalAmount * 0.1f, 0.5f, 2.0f); + return true; + } + + private void handlePreviewClick(float mouseX, float mouseY) { + int w = Minecraft.getInstance().getWindow().getGuiScaledWidth(); + int h = Minecraft.getInstance().getWindow().getGuiScaledHeight(); + float previewW = w - PANEL_WIDTH - MARGIN * 3f; + float previewH = h - MARGIN * 2f; + + CosmeticsHotspot[] zones = CosmeticsHotspot.forRegion(MARGIN, MARGIN, previewW, previewH, backView); + CosmeticSlot hit = CosmeticsHotspot.hitTest(zones, mouseX, mouseY); + if (hit == CosmeticSlot.BACK || hit == CosmeticSlot.SHOULDERS) { + backView = !backView; + } + if (hit != null) { + selectSlot(hit); + } + } + + private boolean handlePanelClick(double mouseX, double mouseY) { + int w = Minecraft.getInstance().getWindow().getGuiScaledWidth(); + int h = Minecraft.getInstance().getWindow().getGuiScaledHeight(); + float previewW = w - PANEL_WIDTH - MARGIN * 3f; + float previewH = h - MARGIN * 2f; + float panelX = MARGIN * 2f + previewW; + + return slotPanel.handleClick(panelX, MARGIN, PANEL_WIDTH, selectedSlot, mouseX, mouseY); + } + + private void selectSlot(CosmeticSlot slot) { + selectedSlot = slot; + CosmeticDisplay module = Modules.get(CosmeticDisplay.class); + if (module != null && slot.isAccessory()) { + module.setActiveSlot(slot); + } + } + + private boolean isInsidePreview(float mouseX, float mouseY) { + int w = Minecraft.getInstance().getWindow().getGuiScaledWidth(); + int h = Minecraft.getInstance().getWindow().getGuiScaledHeight(); + float previewW = w - PANEL_WIDTH - MARGIN * 3f; + float previewH = h - MARGIN * 2f; + return mouseX >= MARGIN && mouseX <= MARGIN + previewW && mouseY >= MARGIN && mouseY <= MARGIN + previewH; + } + + @Override + public boolean isPauseScreen() { + return false; + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsSlotPanel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsSlotPanel.java new file mode 100644 index 0000000..328fd26 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsSlotPanel.java @@ -0,0 +1,153 @@ +package dev.loki.lovisual.features.module.modules.visuals.cosmetics; + +import dev.loki.lovisual.features.cosmetic.CosmeticManager; +import dev.loki.lovisual.features.cosmetic.CosmeticModel; +import dev.loki.lovisual.features.cosmetic.CosmeticRepository; +import dev.loki.lovisual.features.cosmetic.CosmeticSlot; +import dev.loki.lovisual.features.module.modules.visuals.cosmetics.CosmeticDisplay; +import dev.loki.lovisual.features.theme.Theme; +import dev.loki.lovisual.render.engine.color.RenderColor; +import dev.loki.lovisual.render.engine.renderer.Renderer2D; +import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.render.engine.text.Fonts; +import dev.loki.lovisual.render.engine.text.FontInfo; +import net.minecraft.client.resources.language.I18n; + +import java.util.List; + +/** + * Right panel of {@link CosmeticsScreen}: model picker for the currently selected + * slot (live-apply on click, "None" always first) plus, for accessory slots, the + * five per-slot offset/rotation/scale sliders declared on {@link CosmeticDisplay}. + */ +public final class CosmeticsSlotPanel { + private static final float ROW_HEIGHT = 20f; + private static final float SLIDER_HEIGHT = 14f; + + private final CosmeticDisplay module; + + CosmeticsSlotPanel(CosmeticDisplay module) { + this.module = module; + } + + void render(float x, float y, float width, float height, CosmeticSlot slot, double mouseX, double mouseY) { + TextRenderer text = Fonts.renderer("Onest", FontInfo.Type.Regular, TextRenderer.get()); + int accent = Theme.theme().accent(); + int muted = Theme.theme().textMuted(); + + text.begin(1.0, true, false); + text.render(slot.getDisplayName(), x, y, new RenderColor(Theme.theme().textPrimary()), false); + text.end(); + + float rowY = y + 16f; + rowY = renderRow(x, rowY, width, "None", isNoneActive(slot), mouseX, mouseY, text, accent, muted); + + for (CosmeticModel model : CosmeticRepository.get().bySlot(slot)) { + boolean active = CosmeticManager.get().getActive(slot) == model; + rowY = renderRow(x, rowY, width, model.getName(), active, mouseX, mouseY, text, accent, muted); + } + + if (slot.isAccessory()) { + renderOffsetSliders(x, rowY + 10f, width, slot, mouseX, mouseY, text, accent, muted); + } + } + + /** @return the y position immediately below the rendered row. */ + private float renderRow(float x, float y, float width, String label, boolean active, + double mouseX, double mouseY, TextRenderer text, int accent, int muted) { + boolean hovered = mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + ROW_HEIGHT; + int bg = active ? Theme.theme().accentSoft() : hovered ? Theme.theme().surfaceHover() : Theme.theme().surface(); + Renderer2D.COLOR.roundedRect(x, y, width, ROW_HEIGHT - 2f, 3f, bg); + + text.begin(1.0, true, false); + text.render(label, x + 6f, y + 6f, new RenderColor(active ? accent : muted), false); + text.end(); + + return y + ROW_HEIGHT; + } + + private void renderOffsetSliders(float x, float y, float width, CosmeticSlot slot, + double mouseX, double mouseY, TextRenderer text, int accent, int muted) { + CosmeticDisplay.SlotOffsetSettings offsets = module.offsetsFor(slot); + if (offsets == null) return; + + float rowY = y; + rowY = slider(x, rowY, width, I18n.get("setting.cosmetics.offset_x"), offsets.offsetX(), text, accent, muted); + rowY = slider(x, rowY, width, I18n.get("setting.cosmetics.offset_y"), offsets.offsetY(), text, accent, muted); + rowY = slider(x, rowY, width, I18n.get("setting.cosmetics.offset_z"), offsets.offsetZ(), text, accent, muted); + rowY = slider(x, rowY, width, I18n.get("setting.cosmetics.rotation"), offsets.rotation(), text, accent, muted); + slider(x, rowY, width, I18n.get("setting.cosmetics.scale"), offsets.scale(), text, accent, muted); + } + + private float slider(float x, float y, float width, String label, + dev.loki.lovisual.config.values.NumberValue value, + TextRenderer text, int accent, int muted) { + text.begin(0.85, true, false); + text.render(label + ": " + String.format("%.2f", value.get()), x, y, new RenderColor(muted), false); + text.end(); + + float barY = y + 10f; + float min = value.getMin(); + float max = value.getMax(); + float fraction = max > min ? (value.get() - min) / (max - min) : 0f; + + Renderer2D.COLOR.roundedRect(x, barY, width, SLIDER_HEIGHT - 4f, 2f, Theme.theme().surface()); + Renderer2D.COLOR.roundedRect(x, barY, width * fraction, SLIDER_HEIGHT - 4f, 2f, accent); + + return barY + SLIDER_HEIGHT; + } + + /** + * Drag/click on a slider bar; call from the screen's mouse handlers with the same + * rect origin used in {@link #render}. Returns true if the point hit a slider for this slot. + */ + boolean handleSliderDrag(float x, float listBottomY, float width, CosmeticSlot slot, double mouseX, double mouseY) { + if (!slot.isAccessory()) return false; + CosmeticDisplay.SlotOffsetSettings offsets = module.offsetsFor(slot); + if (offsets == null) return false; + + List> sliders = List.of( + offsets.offsetX(), offsets.offsetY(), offsets.offsetZ(), offsets.rotation(), offsets.scale()); + + float rowY = listBottomY + 10f; + for (dev.loki.lovisual.config.values.NumberValue value : sliders) { + float barY = rowY + 10f; + if (mouseY >= barY && mouseY <= barY + SLIDER_HEIGHT - 4f && mouseX >= x && mouseX <= x + width) { + float fraction = (float) Math.clamp((mouseX - x) / width, 0.0, 1.0); + value.set(value.getMin() + fraction * (value.getMax() - value.getMin())); + return true; + } + rowY += SLIDER_HEIGHT; + } + return false; + } + + boolean handleClick(float x, float y, float width, CosmeticSlot slot, double mouseX, double mouseY) { + List models = CosmeticRepository.get().bySlot(slot); + float rowY = y + 16f; + + if (rowHit(x, rowY, width, mouseX, mouseY)) { + CosmeticManager.get().setActive(slot, null); + return true; + } + rowY += ROW_HEIGHT; + + for (CosmeticModel model : models) { + if (rowHit(x, rowY, width, mouseX, mouseY)) { + CosmeticManager.get().setActive(slot, model); + return true; + } + rowY += ROW_HEIGHT; + } + + return handleSliderDrag(x, rowY, width, slot, mouseX, mouseY); + } + + private boolean rowHit(float x, float y, float width, double mouseX, double mouseY) { + return mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + ROW_HEIGHT; + } + + private boolean isNoneActive(CosmeticSlot slot) { + return CosmeticManager.get().getActive(slot) == null; + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HitEffect.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/HitEffect.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HitEffect.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/HitEffect.java index daf3927..d0cd404 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HitEffect.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/HitEffect.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.effects; import dev.loki.lovisual.util.time.GameClock; @@ -26,7 +26,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; import org.joml.Quaternionf; import org.joml.Vector3f; -import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/KillEffect.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/KillEffect.java similarity index 80% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/KillEffect.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/KillEffect.java index fef0d3f..e02e522 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/KillEffect.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/KillEffect.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.effects; import dev.loki.lovisual.util.time.GameClock; @@ -26,7 +26,7 @@ import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.features.module.WorldPhase; -import dev.loki.lovisual.mixins.accessors.ClientLevelAccessor; +import dev.loki.lovisual.mixins.accessors.world.ClientLevelAccessor; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.TextureStorage; import dev.loki.lovisual.render.engine.color.ColorUtils; @@ -34,6 +34,8 @@ import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.renderer.Renderer3D; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; +import dev.loki.lovisual.render.engine.uniform.impl.KillEffectBeamUniforms; +import com.mojang.blaze3d.pipeline.RenderPipeline; import dev.loki.lovisual.util.time.Timer; import dev.loki.lovisual.util.wav.CustomSoundEngine; @@ -61,12 +63,16 @@ public class KillEffect extends Module { private static final String SETTING_SOUND_VOLUME = "sound_volume"; private static final String SETTING_COLOR = "color"; private static final String SETTING_MOBS = "mobs"; + private static final String SETTING_BEAM_INTENSITY = "beam_intensity"; + private static final String SETTING_BEAM_SIZE = "beam_size"; + private static final long BEAM_LIFE_MS = 2500L; private static final Identifier ORTHODOX_SOUND = Identifier.fromNamespaceAndPath("lovisual", "sounds/misc/orthodox.wav"); private static final long EMBER_GROUND_EXTRA_MS = 0; private final Random random = new Random(); private final ModeValue mode = - modeSetting("killEffectMode", SETTING_MODE, "Orthodox", "Orthodox", "FallingLava", "EmbersArc", "Lightning"); + modeSetting("killEffectMode", SETTING_MODE, "Orthodox", + "Orthodox", "FallingLava", "EmbersArc", "Lightning", "Portal", "Tornado"); private final NumberValue ySpeed = visibleWhen(num("killEffectYSpeed", SETTING_Y_SPEED, 0, -10, 10), () -> "Orthodox".equals(mode.get())); private final BooleanValue playSound = @@ -75,14 +81,26 @@ public class KillEffect extends Module { visibleWhen(num("killEffectSoundVolume", SETTING_SOUND_VOLUME, 1.0, 0.0, 2.0), () -> "Orthodox".equals(mode.get()) && playSound.get()); private final RGBAColorValue color = - visibleWhen(color("killEffectColor", SETTING_COLOR, "#FFFF9600"), - () -> "Orthodox".equals(mode.get()) || "Lightning".equals(mode.get())); + visibleWhen(color("killEffectColor", SETTING_COLOR, "#FFFF9600"), this::usesColorSetting); private final BooleanValue mobs = bool("killEffectMobs", SETTING_MOBS, false); + private final NumberValue beamIntensity = + visibleWhen(num("killEffectBeamIntensity", SETTING_BEAM_INTENSITY, 1.2f, 0.2f, 3.0f), this::usesBeamSettings); + private final NumberValue beamSize = + visibleWhen(num("killEffectBeamSize", SETTING_BEAM_SIZE, 2.0f, 0.5f, 5.0f), this::usesBeamSettings); private final Map handled = new HashMap<>(); private final List orthodoxMarks = new ArrayList<>(); private final List embers = new ArrayList<>(); private final List flashes = new ArrayList<>(); private final List lightningStrikes = new ArrayList<>(); + private final List beamEffects = new ArrayList<>(); + + private boolean usesColorSetting() { + return "Orthodox".equals(mode.get()) || "Lightning".equals(mode.get()) || usesBeamSettings(); + } + + private boolean usesBeamSettings() { + return "Portal".equals(mode.get()) || "Tornado".equals(mode.get()); + } private static void addBillboardQuad(MeshBuilder mesh, double cx, double cy, double cz, float size, Quaternionf camRot, int argb) { @@ -182,6 +200,10 @@ public class KillEffect extends Module { spawnEmbers(pos); } else if ("Lightning".equals(mode.get())) { lightningStrikes.add(new LightningStrike(pos, color.getArgb(), now)); + } else if ("Portal".equals(mode.get())) { + beamEffects.add(new BeamEffect(pos, color.getArgb(), now, BeamKind.PORTAL)); + } else if ("Tornado".equals(mode.get())) { + beamEffects.add(new BeamEffect(pos, color.getArgb(), now, BeamKind.TORNADO)); } } @@ -189,6 +211,10 @@ public class KillEffect extends Module { embers.removeIf(e -> e.update(mc.level)); } + if (!beamEffects.isEmpty()) { + beamEffects.removeIf(b -> now - b.createdAtMs > BEAM_LIFE_MS); + } + if (!flashes.isEmpty()) { flashes.removeIf(f -> f.timer.passedMs(f.lifeMs)); } @@ -209,6 +235,7 @@ public class KillEffect extends Module { embers.clear(); flashes.clear(); lightningStrikes.clear(); + beamEffects.clear(); } @Override @@ -224,6 +251,63 @@ public class KillEffect extends Module { renderEmbers(renderer, tickDelta); renderFlashRings(renderer); } + + renderBeams(renderer, mc, BeamKind.PORTAL, LoVisualRenderPipelines.WORLD_KILL_EFFECT_PORTAL); + renderBeams(renderer, mc, BeamKind.TORNADO, LoVisualRenderPipelines.WORLD_KILL_EFFECT_TORNADO); + } + + private void renderBeams(Renderer3D renderer, Minecraft mc, BeamKind kind, RenderPipeline pipeline) { + if (beamEffects.isEmpty()) return; + + Vec3 camPos = mc.gameRenderer.mainCamera().position(); + Quaternionf camRot = RenderState.cameraRotation; + long now = GameClock.millis(); + + for (BeamEffect beam : beamEffects) { + if (beam.kind != kind) continue; + + float progress = Math.min(1f, (now - beam.createdAtMs) / (float) BEAM_LIFE_MS); + float time = (now - beam.createdAtMs) / 1000f; + + int argb = beam.colorArgb; + float cr = ((argb >> 16) & 255) / 255f; + float cg = ((argb >> 8) & 255) / 255f; + float cb = (argb & 255) / 255f; + float ca = ((argb >> 24) & 255) / 255f; + + KillEffectBeamUniforms.update(time, progress, beamIntensity.get(), beamSize.get(), cr, cg, cb, ca); + + Renderer3D.BatchBindings bindings = Renderer3D.BatchBindings.none() + .withUniform("KillEffectBeam", KillEffectBeamUniforms.get()); + MeshBuilder mesh = renderer.batch(pipeline, Renderer3D.DepthMode.NONE, bindings); + if (mesh == null) continue; + + if (kind == BeamKind.PORTAL) { + addBillboardQuad(mesh, beam.pos.x, beam.pos.y + 1.0, beam.pos.z, beamSize.get(), camRot, 0xFFFFFFFF); + } else { + addVerticalQuad(mesh, beam.pos, beamSize.get(), beamSize.get() * 2f, camPos, 0xFFFFFFFF); + } + } + } + + private static void addVerticalQuad(MeshBuilder mesh, Vec3 basePos, float width, float height, Vec3 cameraPos, int argb) { + Vec3 toCam = new Vec3(cameraPos.x - basePos.x, 0.0, cameraPos.z - basePos.z); + if (toCam.lengthSqr() < 1.0E-6) toCam = new Vec3(1.0, 0.0, 0.0); + Vec3 forward = toCam.normalize(); + Vec3 right = new Vec3(-forward.z, 0.0, forward.x); + double halfWidth = width / 2.0; + + Vec3 p1 = basePos.add(right.scale(-halfWidth)); + Vec3 p2 = basePos.add(right.scale(halfWidth)); + Vec3 p3 = p2.add(0.0, height, 0.0); + Vec3 p4 = p1.add(0.0, height, 0.0); + + mesh.ensureQuadCapacity(); + int i1 = mesh.vec3(p1.x, p1.y, p1.z).vec2(0, 0).color(new RenderColor(argb)).next(); + int i2 = mesh.vec3(p2.x, p2.y, p2.z).vec2(1, 0).color(new RenderColor(argb)).next(); + int i3 = mesh.vec3(p3.x, p3.y, p3.z).vec2(1, 1).color(new RenderColor(argb)).next(); + int i4 = mesh.vec3(p4.x, p4.y, p4.z).vec2(0, 1).color(new RenderColor(argb)).next(); + mesh.quad(i1, i2, i3, i4); } private void renderOrthodox(Renderer3D renderer) { @@ -380,6 +464,13 @@ public class KillEffect extends Module { private record OrthodoxMark(Vec3 pos, long createdAtMs) { } + private enum BeamKind { + PORTAL, TORNADO + } + + private record BeamEffect(Vec3 pos, int colorArgb, long createdAtMs, BeamKind kind) { + } + private static class Ember { private final Timer timer; private final long lifeMs; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Trails.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/Trails.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Trails.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/Trails.java index 7605a11..2f84d43 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Trails.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/Trails.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.effects; import com.mojang.blaze3d.pipeline.RenderPipeline; import dev.loki.lovisual.config.values.*; @@ -16,13 +16,12 @@ import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import net.minecraft.world.phys.Vec3; import org.joml.Quaternionf; import org.joml.Vector3f; -import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.features.module.WorldPhase; import dev.loki.lovisual.mixininterface.IEntity; -import dev.loki.lovisual.mixins.accessors.PersistentProjectileEntityAccessor; +import dev.loki.lovisual.mixins.accessors.projectile.PersistentProjectileEntityAccessor; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.TextureStorage; import dev.loki.lovisual.render.engine.animation.AnimatedRenderColors; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/WorldParticles.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/WorldParticles.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/WorldParticles.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/WorldParticles.java index aa9f927..341fc7a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/WorldParticles.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/effects/WorldParticles.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.effects; import dev.loki.lovisual.util.time.GameClock; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ESP.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/ESP.java similarity index 75% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ESP.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/ESP.java index 1d63692..8b08115 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ESP.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/ESP.java @@ -5,13 +5,13 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp; import com.mojang.blaze3d.pipeline.TextureTarget; import com.mojang.blaze3d.textures.GpuTextureView; import dev.loki.lovisual.config.common.CommonSettingSchemas; import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.*; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.render.engine.msaa.MsaaFramebuffer; @@ -20,6 +20,10 @@ import dev.loki.lovisual.render.engine.postprocess.PostProcessPass; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.renderer.Renderer3D; import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.features.module.modules.visuals.esp.render.Esp2DRenderer; +import dev.loki.lovisual.features.module.modules.visuals.esp.render.Esp3DRenderer; +import dev.loki.lovisual.features.module.modules.visuals.esp.render.EspSearchOverlay; +import dev.loki.lovisual.features.module.modules.visuals.esp.shader.EspShaderRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.client.renderer.SubmitNodeStorage; @@ -41,24 +45,24 @@ public class ESP extends Module { static final String SHADER_FILL_SOLID = "Solid"; static final String SHADER_FILL_SMOKE = "Smoke"; static final String SHADER_COLOR_ENTITY = "Entity"; - static final String SHADER_COLOR_THEME = "Theme"; - static final String SHADER_COLOR_CUSTOM = "Custom"; - static final int OUTLINE_ALPHA = 145; - static final int COLOR_ALPHA = 210; - static final int HEALTH_ALPHA = 220; - static final int ABSORB_RGB = 0x3AA7FF; - static final float OUTLINE_EXPAND = 1.5f; - static final float OUTLINE_THICKNESS = 1.5f; - static final float COLOR_THICKNESS = 2.0f; - static final float GRAD_LIGHTEN = 0.30f; - static final float GRAD_DARKEN = 0.42f; - static final float HEALTH_BAR_WIDTH = 5.0f; - static final float HEALTH_BAR_GAP = 8.0f; - static final float HEALTH_BAR_INSET = 1.0f; - static final double AABB_TOP_OFFSET = 0.18; - static final float CORNER_SEGMENT_FRACTION = 0.27f; - static final float CHAMFER_FRACTION = 0.16f; - static final boolean PIXEL_SNAP = true; + public static final String SHADER_COLOR_THEME = "Theme"; + public static final String SHADER_COLOR_CUSTOM = "Custom"; + public static final int OUTLINE_ALPHA = 145; + public static final int COLOR_ALPHA = 210; + public static final int HEALTH_ALPHA = 220; + public static final int ABSORB_RGB = 0x3AA7FF; + public static final float OUTLINE_EXPAND = 1.5f; + public static final float OUTLINE_THICKNESS = 1.5f; + public static final float COLOR_THICKNESS = 2.0f; + public static final float GRAD_LIGHTEN = 0.30f; + public static final float GRAD_DARKEN = 0.42f; + public static final float HEALTH_BAR_WIDTH = 5.0f; + public static final float HEALTH_BAR_GAP = 8.0f; + public static final float HEALTH_BAR_INSET = 1.0f; + public static final double AABB_TOP_OFFSET = 0.18; + public static final float CORNER_SEGMENT_FRACTION = 0.27f; + public static final float CHAMFER_FRACTION = 0.16f; + public static final boolean PIXEL_SNAP = true; static final double SHADER_MAX_DISTANCE = 128.0; static final float BOX_3D_GRADIENT_SPEED = 0.00115f; @@ -83,90 +87,90 @@ public class ESP extends Module { TextListSetting.PickerMode.ENTITIES, Set.of("minecraft:end_crystal")), this::isShaderBox); final RGBColorValue shaderChamsEntityColor = visibleWhen(colorNoAlpha("espShaderChamsEntityColor", "shader_chams_entity_color", "#B064FF"), this::isShaderBox); - final BooleanValue healthBar = + public final BooleanValue healthBar = visibleWhen(boolCommon("espHealthBar", "health_bar_left", CommonSettingSchemas.ESP_HEALTH_BAR, true), () -> !is3DBox() && !isShaderBox()); - final BooleanValue healthBarGradient = + public final BooleanValue healthBarGradient = visibleWhen(boolCommon("espHealthBarGradient", "health_bar_gradient", CommonSettingSchemas.ESP_HEALTH_BAR_GRADIENT, true), () -> healthBar.get() && !is3DBox() && !isShaderBox()); - final NumberValue healthBarDistance = + public final NumberValue healthBarDistance = visibleWhen(numCommon("espHealthBarDistance", "health_bar_distance", CommonSettingSchemas.ESP_HEALTH_BAR_DISTANCE, 80, 5, 256), () -> healthBar.get() && !is3DBox() && !isShaderBox()); - final NumberValue box3dLineWidth = + public final NumberValue box3dLineWidth = visibleWhen(numCommon("esp3dLineWidth", "line_width", CommonSettingSchemas.ESP_LINE_WIDTH, 1.5f, 0.5f, 6.0f), this::is3DBox); - final NumberValue box3dGradientStrength = + public final NumberValue box3dGradientStrength = visibleWhen(num("esp3dGradientStrength", "gradient_strength", 1.35f, 0.0f, 2.5f), this::is3DBox); - final NumberValue box3dFillAlpha = + public final NumberValue box3dFillAlpha = visibleWhen(num("esp3dFillAlpha", "fill_alpha", 0.30f, 0.0f, 1.0f), this::is3DBox); - final NumberValue box3dOutlineAlpha = + public final NumberValue box3dOutlineAlpha = visibleWhen(num("esp3dOutlineAlpha", "outline_alpha", 1.0f, 0.0f, 1.0f), this::is3DBox); - final BooleanValue shaderGlow = + public final BooleanValue shaderGlow = visibleWhen(bool("espShaderGlowEnabled", "shader_glow_enabled", true), this::isShaderBox); - final NumberValue shaderGlowStrength = + public final NumberValue shaderGlowStrength = visibleWhen(num("espShaderGlowStrength", "shader_glow_strength", 8.0f, 1.0f, 48.0f), () -> isShaderBox() && shaderGlow.get()); - final NumberValue shaderGlowAlpha = + public final NumberValue shaderGlowAlpha = visibleWhen(num("espShaderGlowAlpha", "shader_glow_alpha", 0.72f, 0.0f, 1.0f), () -> isShaderBox() && shaderGlow.get()); - final NumberValue shaderGlowIntensity = + public final NumberValue shaderGlowIntensity = visibleWhen(num("espShaderGlowIntensity", "shader_glow_intensity", 1.25f, 0.10f, 4.0f), () -> isShaderBox() && shaderGlow.get()); - final ModeValue shaderGlowColorMode = + public final ModeValue shaderGlowColorMode = visibleWhen(mode("espShaderGlowColorMode", "shader_glow_color_mode", SHADER_COLOR_ENTITY, SHADER_COLOR_ENTITY, SHADER_COLOR_THEME, SHADER_COLOR_CUSTOM), () -> isShaderBox() && shaderGlow.get()); - final RGBColorValue shaderGlowColor = + public final RGBColorValue shaderGlowColor = visibleWhen(colorNoAlpha("espShaderGlowColor", "shader_glow_color", "#78C8FF"), () -> isShaderBox() && shaderGlow.get() && isCustomShaderColor(shaderGlowColorMode)); - final BooleanValue shaderOutline = + public final BooleanValue shaderOutline = visibleWhen(bool("espShaderOutlineEnabled", "shader_outline_enabled", true), this::isShaderBox); - final NumberValue shaderOutlineWidth = + public final NumberValue shaderOutlineWidth = visibleWhen(num("espShaderOutlineWidth", "shader_outline_width", 2.0f, 0.5f, 18.0f), () -> isShaderBox() && shaderOutline.get()); - final NumberValue shaderOutlineAlpha = + public final NumberValue shaderOutlineAlpha = visibleWhen(num("espShaderOutlineAlpha", "shader_outline_alpha", 0.92f, 0.0f, 1.0f), () -> isShaderBox() && shaderOutline.get()); - final NumberValue shaderOutlineIntensity = + public final NumberValue shaderOutlineIntensity = visibleWhen(num("espShaderOutlineIntensity", "shader_outline_intensity", 1.15f, 0.10f, 4.0f), () -> isShaderBox() && shaderOutline.get()); - final ModeValue shaderShadowColorMode = + public final ModeValue shaderShadowColorMode = visibleWhen(mode("espShaderShadowColorMode", "shader_shadow_color_mode", SHADER_COLOR_ENTITY, SHADER_COLOR_ENTITY, SHADER_COLOR_THEME, SHADER_COLOR_CUSTOM), () -> isShaderBox() && shaderOutline.get()); - final RGBColorValue shaderShadowColor = + public final RGBColorValue shaderShadowColor = visibleWhen(colorNoAlpha("espShaderShadowColor", "shader_shadow_color", "#78C8FF"), () -> isShaderBox() && shaderOutline.get() && isCustomShaderColor(shaderShadowColorMode)); - final BooleanValue shaderFill = + public final BooleanValue shaderFill = visibleWhen(bool("espShaderFillEnabled", "shader_fill_enabled", true), this::isShaderBox); final ModeValue shaderFillStyle = visibleWhen(mode("espShaderFillStyle", "shader_fill_style", SHADER_FILL_SOLID, SHADER_FILL_SOLID, SHADER_FILL_SMOKE), () -> isShaderBox() && shaderFill.get()); - final NumberValue shaderSmokeScale = + public final NumberValue shaderSmokeScale = visibleWhen(num("espShaderSmokeScale", "shader_smoke_scale", 2.60f, 0.35f, 8.0f), () -> isShaderBox() && shaderFill.get() && isShaderSmokeFill()); - final NumberValue shaderSmokeSpeed = + public final NumberValue shaderSmokeSpeed = visibleWhen(num("espShaderSmokeSpeed", "shader_smoke_speed", 0.55f, 0.0f, 3.0f), () -> isShaderBox() && shaderFill.get() && isShaderSmokeFill()); - final NumberValue shaderSmokeOctaves = + public final NumberValue shaderSmokeOctaves = visibleWhen(num("espShaderSmokeOctaves", "shader_smoke_octaves", 4, 1, 6), () -> isShaderBox() && shaderFill.get() && isShaderSmokeFill()); - final NumberValue shaderSmokeContrast = + public final NumberValue shaderSmokeContrast = visibleWhen(num("espShaderSmokeContrast", "shader_smoke_contrast", 1.20f, 0.35f, 3.0f), () -> isShaderBox() && shaderFill.get() && isShaderSmokeFill()); - final NumberValue shaderFillAlpha = + public final NumberValue shaderFillAlpha = visibleWhen(num("espShaderFillAlpha", "shader_fill_alpha", 0.41f, 0.0f, 1.0f), () -> isShaderBox() && shaderFill.get()); - final ModeValue shaderFillColorMode = + public final ModeValue shaderFillColorMode = visibleWhen(mode("espShaderFillColorMode", "shader_fill_color_mode", SHADER_COLOR_ENTITY, SHADER_COLOR_ENTITY, SHADER_COLOR_THEME, SHADER_COLOR_CUSTOM), () -> isShaderBox() && shaderFill.get()); - final RGBColorValue shaderFillColor = + public final RGBColorValue shaderFillColor = visibleWhen(colorNoAlpha("espShaderFillColor", "shader_fill_color", "#78C8FF"), () -> isShaderBox() && shaderFill.get() && isCustomShaderColor(shaderFillColorMode)); - final NumberValue shaderDarkMultiplier = + public final NumberValue shaderDarkMultiplier = visibleWhen(num("espShaderDarkMultiplier", "shader_dark_multiplier", 0.55f, 0.0f, 1.5f), this::isShaderBox); private final PostProcessPass shaderEspPass = new ShaderEspPass(); - final SubmitNodeStorage shaderEspCommandQueue = new SubmitNodeStorage(); - TextureTarget shaderMask; - TextureTarget shaderBlurBuffer; - TextureTarget shaderEffectBuffer; - MsaaFramebuffer shaderMaskMsaa; - FeatureRenderDispatcher shaderEspRenderDispatcher; - RenderBuffers shaderEspRenderBuffers; - int shaderBufferW = -1; - int shaderBufferH = -1; - int shaderMaskSamples; + public final SubmitNodeStorage shaderEspCommandQueue = new SubmitNodeStorage(); + public TextureTarget shaderMask; + public TextureTarget shaderBlurBuffer; + public TextureTarget shaderEffectBuffer; + public MsaaFramebuffer shaderMaskMsaa; + public FeatureRenderDispatcher shaderEspRenderDispatcher; + public RenderBuffers shaderEspRenderBuffers; + public int shaderBufferW = -1; + public int shaderBufferH = -1; + public int shaderMaskSamples; { PostProcessManager.register(shaderEspPass); @@ -222,7 +226,7 @@ public class ESP extends Module { || MODE_CHAMFERED.equalsIgnoreCase(boxMode.get()); } - boolean isShaderSmokeFill() { + public boolean isShaderSmokeFill() { return SHADER_FILL_SMOKE.equalsIgnoreCase(shaderFillStyle.get()); } @@ -230,19 +234,19 @@ public class ESP extends Module { return mode != null && SHADER_COLOR_CUSTOM.equalsIgnoreCase(mode.get()); } - boolean isCornerBox() { + public boolean isCornerBox() { return MODE_CORNERS.equalsIgnoreCase(boxMode.get()); } - boolean isChamferedBox() { + public boolean isChamferedBox() { return MODE_CHAMFERED.equalsIgnoreCase(boxMode.get()); } - boolean is3DBox() { + public boolean is3DBox() { return MODE_3D.equalsIgnoreCase(boxMode.get()); } - boolean isShaderBox() { + public boolean isShaderBox() { return MODE_SHADER.equalsIgnoreCase(boxMode.get()); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspColorUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspColorUtil.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspColorUtil.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspColorUtil.java index 8c6124d..a09ab8b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspColorUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspColorUtil.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp; import dev.loki.lovisual.util.time.GameClock; @@ -14,12 +14,12 @@ import net.minecraft.world.phys.AABB; import java.util.Locale; -final class EspColorUtil { +public final class EspColorUtil { private EspColorUtil() { } - static int boxGradientColor(int baseRgb, AABB box, double x, double y, double z, int alpha, float strength) { + public static int boxGradientColor(int baseRgb, AABB box, double x, double y, double z, int alpha, float strength) { double nx = safeRatio(x - box.minX, box.maxX - box.minX); double ny = safeRatio(y - box.minY, box.maxY - box.minY); double nz = safeRatio(z - box.minZ, box.maxZ - box.minZ); @@ -43,18 +43,18 @@ final class EspColorUtil { return value / length; } - static String formatHealth(float health) { + public static String formatHealth(float health) { if (Math.abs(health - Math.round(health)) < 0.05f) { return Math.round(health) + " HP"; } return String.format(Locale.ROOT, "%.1f HP", health); } - static float shaderSmokeTime() { + public static float shaderSmokeTime() { return (GameClock.millis() % 600_000L) / 1000.0f; } - static int deriveSmokeColor(int rgb, int layer) { + public static int deriveSmokeColor(int rgb, int layer) { int base = rgb & 0x00FFFFFF; return switch (layer) { case 0 -> mixRgb(base, 0xFFFFFF, 0.18f); @@ -63,16 +63,16 @@ final class EspColorUtil { }; } - static int withAlpha(int rgb, int alpha) { + public static int withAlpha(int rgb, int alpha) { int a = clamp(alpha); return (a << 24) | (rgb & 0x00FFFFFF); } - static int alpha255(float alpha) { + public static int alpha255(float alpha) { return clamp(Math.round(clamp01(alpha) * 255.0f)); } - static int mixRgb(int rgbA, int rgbB, float t) { + public static int mixRgb(int rgbA, int rgbB, float t) { float clamped = Math.max(0f, Math.min(1f, t)); int ar = (rgbA >>> 16) & 0xFF; int ag = (rgbA >>> 8) & 0xFF; @@ -95,13 +95,13 @@ final class EspColorUtil { return (clamp(r) << 16) | (clamp(g) << 8) | clamp(b); } - static float clamp01(float v) { + public static float clamp01(float v) { if (v < 0f) return 0f; if (v > 1f) return 1f; return v; } - static int healthRgb(float ratio) { + public static int healthRgb(float ratio) { float t = clamp01(ratio); if (t >= 0.5f) { float k = (t - 0.5f) / 0.5f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspEntityCollector.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspEntityCollector.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspEntityCollector.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspEntityCollector.java index f70be23..37b0a47 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspEntityCollector.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspEntityCollector.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp; import dev.loki.lovisual.features.relations.CategoryService; import net.minecraft.client.Minecraft; @@ -22,7 +22,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; -final class EspEntityCollector { +public final class EspEntityCollector { private EspEntityCollector() { } @@ -45,7 +45,7 @@ final class EspEntityCollector { return false; } - static List collectPlayerEntries(ESP esp, Vec3 camPos) { + public static List collectPlayerEntries(ESP esp, Vec3 camPos) { Minecraft mc = Minecraft.getInstance(); List entries = new ArrayList<>(); @@ -59,7 +59,7 @@ final class EspEntityCollector { return entries; } - static List collectSearchEntityEntries(ESP esp, Vec3 camPos) { + public static List collectSearchEntityEntries(ESP esp, Vec3 camPos) { Minecraft mc = Minecraft.getInstance(); List entries = new ArrayList<>(); if (!esp.renderEntities.get()) return entries; @@ -74,7 +74,7 @@ final class EspEntityCollector { return entries; } - static List collectShaderEntries(ESP esp, Vec3 camPos) { + public static List collectShaderEntries(ESP esp, Vec3 camPos) { List entries = new ArrayList<>(); double maxDistSq = ESP.SHADER_MAX_DISTANCE * ESP.SHADER_MAX_DISTANCE; @@ -181,7 +181,7 @@ final class EspEntityCollector { return CategoryService.getColor(p); } - static int resolve3DColor(Entity entity, int fallbackColor) { + public static int resolve3DColor(Entity entity, int fallbackColor) { if (entity instanceof Player player) { return CategoryService.getColor(player); } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspModel.java similarity index 70% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspModel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspModel.java index 9eec3b0..3db8e0b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/EspModel.java @@ -5,33 +5,33 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp; import dev.loki.lovisual.render.helpers.ScreenSpaceOverlay2D; import net.minecraft.world.entity.Entity; -final class EspModel { +public final class EspModel { private EspModel() { } @FunctionalInterface - interface ColorResolver { + public interface ColorResolver { int colorAt(double x, double y, double boxX1, double boxY1, double boxX2, double boxY2); } - record RenderEntry(Entity entity, int color, double distSq) { + public record RenderEntry(Entity entity, int color, double distSq) { } - record SearchLabelEntry(double distSq, ScreenSpaceOverlay2D.ScreenRect rect, int color, + public record SearchLabelEntry(double distSq, ScreenSpaceOverlay2D.ScreenRect rect, int color, ScreenSpaceOverlay2D.LabelEntry label) { } - record ScreenBox(double minX, double minY, double maxX, double maxY) { + public record ScreenBox(double minX, double minY, double maxX, double maxY) { } - record SolidColor(int color) implements ColorResolver { - static SolidColor of(int color) { + public record SolidColor(int color) implements ColorResolver { + public static SolidColor of(int color) { return new SolidColor(color); } @@ -41,7 +41,7 @@ final class EspModel { } } - record Gradient(int topLeft, int topRight, int bottomRight, int bottomLeft) implements ColorResolver { + public record Gradient(int topLeft, int topRight, int bottomRight, int bottomLeft) implements ColorResolver { private static double safeRatio(double value, double length) { if (length <= 0.0001) return 0.0; if (value <= 0.0) return 0.0; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/LightningTargetESP.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/audio/LightningTargetESP.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/LightningTargetESP.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/audio/LightningTargetESP.java index 5f70353..aba8f08 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/LightningTargetESP.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/audio/LightningTargetESP.java @@ -5,19 +5,20 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.audio; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.AttackEntityEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.entity.AttackEntityEvent; import dev.loki.lovisual.render.engine.renderer.Renderer3D; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; import dev.loki.lovisual.util.target.TargetManager; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/SoundESP.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/audio/SoundESP.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/SoundESP.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/audio/SoundESP.java index 054759f..10a75a8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/SoundESP.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/audio/SoundESP.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.audio; import dev.loki.lovisual.util.time.GameClock; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BlockESP.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/BlockESP.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BlockESP.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/BlockESP.java index 8a5d322..5dc9206 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BlockESP.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/BlockESP.java @@ -1,4 +1,4 @@ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.overlay; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -11,7 +11,7 @@ import dev.loki.lovisual.config.values.EnumValue; import dev.loki.lovisual.config.values.ItemIdSetValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.RGBAColorValue; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/DropESP.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/DropESP.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/DropESP.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/DropESP.java index 229ab31..08d9c9c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/DropESP.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/DropESP.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.overlay; import dev.loki.lovisual.config.values.*; import net.minecraft.client.Minecraft; @@ -19,8 +19,7 @@ import net.minecraft.world.item.Rarity; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import dev.loki.lovisual.config.SettingDef; -import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.HudPhase; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HoleESP.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/HoleESP.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HoleESP.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/HoleESP.java index f531d33..3f8b204 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HoleESP.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/HoleESP.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.overlay; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/InvisEsp.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/InvisEsp.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/InvisEsp.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/InvisEsp.java index 54bcd27..c512808 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/InvisEsp.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/overlay/InvisEsp.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.overlay; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.features.module.Module; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Esp2DRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/Esp2DRenderer.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Esp2DRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/Esp2DRenderer.java index fbe2880..ed4e4d1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Esp2DRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/Esp2DRenderer.java @@ -5,11 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.render; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.helpers.ScreenProjection; import dev.loki.lovisual.util.player.PlayerHealthResolver; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspColorUtil; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspModel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.AABB; @@ -18,12 +21,12 @@ import net.minecraft.world.phys.Vec3; import java.util.Comparator; import java.util.List; -final class Esp2DRenderer { +public final class Esp2DRenderer { private Esp2DRenderer() { } - static void renderPlayerEntries(ESP esp, Renderer2D renderer, float tickDelta, List entries) { + public static void renderPlayerEntries(ESP esp, Renderer2D renderer, float tickDelta, List entries) { entries.sort(Comparator.comparingDouble(EspModel.RenderEntry::distSq).reversed()); for (EspModel.RenderEntry entry : entries) { draw2DESP(esp, renderer, entry.entity(), tickDelta, entry.color(), entry.distSq()); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Esp3DRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/Esp3DRenderer.java similarity index 87% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Esp3DRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/Esp3DRenderer.java index 826546d..242e991 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Esp3DRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/Esp3DRenderer.java @@ -5,12 +5,17 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.render; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.renderer.Renderer3D; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspColorUtil; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspEntityCollector; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspModel; +import dev.loki.lovisual.features.module.modules.visuals.esp.shader.EspMeshBuilder; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.AABB; @@ -19,12 +24,12 @@ import net.minecraft.world.phys.Vec3; import java.util.Comparator; import java.util.List; -final class Esp3DRenderer { +public final class Esp3DRenderer { private Esp3DRenderer() { } - static void render(ESP esp, Renderer3D renderer, float tickDelta) { + public static void render(ESP esp, Renderer3D renderer, float tickDelta) { Minecraft mc = Minecraft.getInstance(); if (!esp.isEnabled() || !esp.is3DBox() || mc.level == null || mc.player == null) return; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspOutlineRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/EspOutlineRenderer.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspOutlineRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/EspOutlineRenderer.java index 57b3c18..eca4995 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspOutlineRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/EspOutlineRenderer.java @@ -5,11 +5,13 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.render; import dev.loki.lovisual.render.engine.renderer.Renderer2D; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspModel; -final class EspOutlineRenderer { +public final class EspOutlineRenderer { private EspOutlineRenderer() { } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspSearchOverlay.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/EspSearchOverlay.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspSearchOverlay.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/EspSearchOverlay.java index 953a1ea..4eaef62 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspSearchOverlay.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/render/EspSearchOverlay.java @@ -5,13 +5,17 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.render; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.MatteHudStyle; import dev.loki.lovisual.render.helpers.ScreenSpaceOverlay2D; import dev.loki.lovisual.util.player.PlayerHealthResolver; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspColorUtil; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspEntityCollector; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspModel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.AABB; @@ -21,12 +25,12 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -final class EspSearchOverlay { +public final class EspSearchOverlay { private EspSearchOverlay() { } - static void render(ESP esp, Renderer2D renderer, TextRenderer fallbackTextRenderer, float tickDelta, Vec3 camPos) { + public static void render(ESP esp, Renderer2D renderer, TextRenderer fallbackTextRenderer, float tickDelta, Vec3 camPos) { List entries = EspEntityCollector.collectSearchEntityEntries(esp, camPos); if (entries.isEmpty()) return; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspMeshBuilder.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspMeshBuilder.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspMeshBuilder.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspMeshBuilder.java index aaff3a5..0a6ded4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspMeshBuilder.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspMeshBuilder.java @@ -5,17 +5,17 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.shader; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; import net.minecraft.world.phys.AABB; -final class EspMeshBuilder { +public final class EspMeshBuilder { private EspMeshBuilder() { } - static void addFilledBox(MeshBuilder mesh, + public static void addFilledBox(MeshBuilder mesh, AABB box, int c000, int c001, int c010, int c011, int c100, int c101, int c110, int c111) { @@ -34,7 +34,7 @@ final class EspMeshBuilder { quad(mesh, minX, minY, minZ, c000, minX, minY, maxZ, c001, minX, maxY, maxZ, c011, minX, maxY, minZ, c010); } - static void addOutlineBox(MeshBuilder mesh, + public static void addOutlineBox(MeshBuilder mesh, AABB box, int c000, int c001, int c010, int c011, int c100, int c101, int c110, int c111) { @@ -92,7 +92,7 @@ final class EspMeshBuilder { mesh.quad(i1, i2, i3, i4); } - static void line(MeshBuilder mesh, + public static void line(MeshBuilder mesh, double x1, double y1, double z1, int c1, double x2, double y2, double z2, int c2) { mesh.ensureLineCapacity(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderColor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderColor.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderColor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderColor.java index a7c4fa1..980f9a6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderColor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderColor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.shader; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.systems.RenderSystem; @@ -21,10 +21,12 @@ import dev.loki.lovisual.render.engine.renderer.FullScreenRenderer; import dev.loki.lovisual.render.engine.uniform.impl.ShaderEspBlurUniforms; import dev.loki.lovisual.render.engine.uniform.impl.ShaderEspGradientUniforms; import dev.loki.lovisual.render.engine.uniform.impl.ShaderEspSmokeUniforms; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspColorUtil; import java.util.OptionalDouble; -final class EspShaderColor { +public final class EspShaderColor { private static GpuSampler shaderEspSampler; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderMask.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderMask.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderMask.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderMask.java index bebb979..e8bf196 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderMask.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderMask.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.shader; import com.mojang.blaze3d.ProjectionType; import com.mojang.blaze3d.buffers.GpuBufferSlice; @@ -13,9 +13,9 @@ import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.GpuTextureView; import com.mojang.blaze3d.vertex.PoseStack; -import dev.loki.lovisual.mixins.accessors.EntityRenderManagerAccessor; -import dev.loki.lovisual.mixins.accessors.EntityRendererAccessor; -import dev.loki.lovisual.mixins.accessors.LevelRendererAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.EntityRenderManagerAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.EntityRendererAccessor; +import dev.loki.lovisual.mixins.accessors.world.LevelRendererAccessor; import dev.loki.lovisual.render.ShaderEspRenderContext; import dev.loki.lovisual.render.compat.EntityCullingCompat; import dev.loki.lovisual.render.engine.RenderState; @@ -24,6 +24,8 @@ import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.msaa.MsaaFramebuffer; import dev.loki.lovisual.render.engine.msaa.MsaaWorldTarget; import dev.loki.lovisual.render.engine.renderer.MeshRenderer; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspModel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.feature.FeatureRenderDispatcher; import net.minecraft.client.renderer.LevelRenderer; @@ -39,7 +41,7 @@ import org.joml.Quaternionf; import java.util.List; -final class EspShaderMask { +public final class EspShaderMask { private static ProjectionMatrixBuffer shaderEspProjection; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderRenderer.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderRenderer.java index 613f337..dcb7128 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/EspShaderRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/esp/shader/EspShaderRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.esp.shader; import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.pipeline.TextureTarget; @@ -14,6 +14,9 @@ import dev.loki.lovisual.render.engine.msaa.MsaaFramebuffer; import dev.loki.lovisual.render.engine.msaa.MsaaWorldTarget; import dev.loki.lovisual.render.engine.postprocess.PostProcessManager; import dev.loki.lovisual.render.iris.IrisLoVisualFrameHooks; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspEntityCollector; +import dev.loki.lovisual.features.module.modules.visuals.esp.EspModel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.client.renderer.feature.FeatureRenderDispatcher; @@ -21,12 +24,12 @@ import net.minecraft.world.phys.Vec3; import java.util.List; -final class EspShaderRenderer { +public final class EspShaderRenderer { private EspShaderRenderer() { } - static boolean render(ESP esp, GpuTextureView src, GpuTextureView dst, float tickDelta) { + public static boolean render(ESP esp, GpuTextureView src, GpuTextureView dst, float tickDelta) { Minecraft mc = Minecraft.getInstance(); if (!esp.isEnabled() || !esp.isShaderBox() || mc.level == null || mc.player == null) { return false; @@ -103,7 +106,7 @@ final class EspShaderRenderer { if (IrisLoVisualFrameHooks.isRenderingAfterIrisFinalization()) { return getStandaloneShaderEspRenderDispatcher(esp); } - if (mc != null && mc.levelRenderer instanceof dev.loki.lovisual.mixins.accessors.LevelRendererAccessor accessor) { + if (mc != null && mc.levelRenderer instanceof dev.loki.lovisual.mixins.accessors.world.LevelRendererAccessor accessor) { FeatureRenderDispatcher dispatcher = accessor.lovisual$getEntityRenderDispatcher(); if (dispatcher != null) { return dispatcher; @@ -131,7 +134,7 @@ final class EspShaderRenderer { return esp.shaderEspRenderDispatcher; } - static void closeDispatcher(ESP esp) { + public static void closeDispatcher(ESP esp) { if (esp.shaderEspRenderDispatcher != null) { esp.shaderEspRenderDispatcher.close(); esp.shaderEspRenderDispatcher = null; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/MotionBlur.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/MotionBlur.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/MotionBlur.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/MotionBlur.java index fec1821..e547d95 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/MotionBlur.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/MotionBlur.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.fx; import com.mojang.blaze3d.textures.GpuTextureView; import dev.loki.lovisual.render.engine.postprocess.*; @@ -19,7 +19,6 @@ import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; -import dev.loki.lovisual.render.engine.postprocess.*; import dev.loki.lovisual.render.engine.renderer.FullScreenRenderer; import dev.loki.lovisual.render.engine.uniform.impl.MotionBlurUniforms; import dev.loki.lovisual.util.logging.DebugLog; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/PostFX.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/PostFX.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/PostFX.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/PostFX.java index ac9256a..71845e4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/PostFX.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/PostFX.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.fx; import dev.loki.lovisual.util.time.GameClock; @@ -241,7 +241,7 @@ public class PostFX extends Module implements PostProcessPass { } /** Чистое заполнение UBO пресетом — вынесено для тестов. */ - static void applyPresetTo(String name, float[] out) { + public static void applyPresetTo(String name, float[] out) { String presetName = name == null ? "Cinematic" : name; switch (presetName) { case "Vanilla" -> fillPresetVanilla(out); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/TotemFX.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/TotemFX.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/TotemFX.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/TotemFX.java index 86446da..3ec0e04 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/TotemFX.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/TotemFX.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.fx; import dev.loki.lovisual.util.time.GameClock; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Zoom.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/Zoom.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Zoom.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/Zoom.java index cfd7a42..e49b705 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Zoom.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/fx/Zoom.java @@ -5,13 +5,13 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.fx; import net.minecraft.util.Mth; import dev.loki.lovisual.config.values.BindMode; import dev.loki.lovisual.config.values.EnumValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.features.gui.clickgui.settings.FunctionBindSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.bind.FunctionBindSetting; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHat.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHat.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHat.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHat.java index ca9089f..ed1e3f3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHat.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHat.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.hats; import dev.loki.lovisual.config.common.CommonSettingSchemas; import dev.loki.lovisual.config.values.BooleanValue; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHatModel.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatModel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHatModel.java index ba8930d..ae5c6a5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHatModel.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.hats; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; import dev.loki.lovisual.render.helpers.HeadAnchor; @@ -19,20 +19,20 @@ import net.minecraft.world.phys.Vec3; * {@link #layout} is pure geometry (unit-testable); {@link #build} feeds the * result into MeshBuilder. Per-vertex colors come from the caller. */ -final class ChinaHatModel { +public final class ChinaHatModel { private ChinaHatModel() { } - interface Shade { + public interface Shade { int color(int index, float verticalLight, float alphaMul); } /** Apex plus rim circle vertices in anchor space; rim[i+1 wraps to rim[0]. */ - record Layout(Vec3 apex, Vec3[] rim) { + public record Layout(Vec3 apex, Vec3[] rim) { } - static Layout layout(float brimRadius, + public static Layout layout(float brimRadius, float coneHeight, int segments, float yawDeg, @@ -51,7 +51,7 @@ final class ChinaHatModel { return new Layout(apex, rim); } - static void build(MeshBuilder tris, + public static void build(MeshBuilder tris, MeshBuilder lines, HeadAnchor anchor, int segments, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatPalette.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHatPalette.java similarity index 84% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatPalette.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHatPalette.java index 7c1acfa..d37bc2a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatPalette.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/ChinaHatPalette.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.hats; import dev.loki.lovisual.features.relations.CategoryService; import dev.loki.lovisual.render.engine.animation.AnimatedRenderColors; @@ -18,16 +18,16 @@ import net.minecraft.world.entity.player.Player; * Color resolution helpers for ChinaHat. Shared color-math and per-vertex shading, * mirroring the TazikHat palette pipeline but reusable by the facade module. */ -final class ChinaHatPalette { +public final class ChinaHatPalette { private ChinaHatPalette() { } private static final double RAINBOW_SPATIAL_SCALE = 12.0; - record Palette(int primary, int secondary, int rim) { + public record Palette(int primary, int secondary, int rim) { } - static Palette resolve(Player player, + public static Palette resolve(Player player, boolean useRelations, int primaryArgb, int secondaryArgb, @@ -47,7 +47,7 @@ final class ChinaHatPalette { return new Palette(primaryArgb, secondaryArgb, rimArgb); } - static int colorAt(Palette palette, + public static int colorAt(Palette palette, AnimatedRenderColors.Mode mode, int speed, int index, @@ -61,7 +61,7 @@ final class ChinaHatPalette { return withAlpha(mixed, Math.round(alpha(mixed) * alphaMul)); } - static int rimColorAt(Palette palette, + public static int rimColorAt(Palette palette, AnimatedRenderColors.Mode mode, int speed, int index, @@ -74,7 +74,7 @@ final class ChinaHatPalette { return withAlpha(mixed, Math.round(alpha(mixed) * alphaMul)); } - static int getDynamicColor(int primary, + public static int getDynamicColor(int primary, int secondary, AnimatedRenderColors.Mode mode, int speed, @@ -83,7 +83,7 @@ final class ChinaHatPalette { return AnimatedRenderColors.resolve(mode, speed, spatialIndex, primary, secondary, true); } - static int mix(int a, int b, float t) { + public static int mix(int a, int b, float t) { float clamped = AnimationUtility.clamp01(t); int aa = alpha(a); @@ -104,7 +104,7 @@ final class ChinaHatPalette { return (ca << 24) | (cr << 16) | (cg << 8) | cb; } - static int multiplyRgb(int argb, float factor) { + public static int multiplyRgb(int argb, float factor) { int a = alpha(argb); int r = Mth.clamp(Math.round(red(argb) * factor), 0, 255); int g = Mth.clamp(Math.round(green(argb) * factor), 0, 255); @@ -112,33 +112,33 @@ final class ChinaHatPalette { return (a << 24) | (r << 16) | (g << 8) | b; } - static int brighten(int argb, float factor) { + public static int brighten(int argb, float factor) { return multiplyRgb(argb, factor); } - static int withAlpha(int argb, int alpha) { + public static int withAlpha(int argb, int alpha) { int a = Mth.clamp(alpha, 0, 255); return (a << 24) | (argb & 0x00FFFFFF); } - static int alphaOr(int argb, int fallback) { + public static int alphaOr(int argb, int fallback) { int alpha = alpha(argb); return alpha <= 0 ? Mth.clamp(fallback, 0, 255) : alpha; } - static int red(int argb) { + public static int red(int argb) { return (argb >>> 16) & 255; } - static int green(int argb) { + public static int green(int argb) { return (argb >>> 8) & 255; } - static int blue(int argb) { + public static int blue(int argb) { return argb & 255; } - static int alpha(int argb) { + public static int alpha(int argb) { return (argb >>> 24) & 255; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/TazikHat.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/TazikHat.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/TazikHat.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/TazikHat.java index fcf0c5d..8c4ec44 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/TazikHat.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/hats/TazikHat.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.hats; import dev.loki.lovisual.util.time.GameClock; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/AlwaysVisibleHand.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/AlwaysVisibleHand.java new file mode 100644 index 0000000..953f372 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/AlwaysVisibleHand.java @@ -0,0 +1,67 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.module.modules.visuals.items; + +import dev.loki.lovisual.config.values.BooleanValue; +import dev.loki.lovisual.config.values.ModeValue; +import dev.loki.lovisual.features.module.Module; +import dev.loki.lovisual.features.module.ModuleCategory; +import dev.loki.lovisual.features.module.ModuleInfo; + +/** + * Держит руки видимыми, когда ваниль их прячет: при еде/питье/натягивании лука + * ваниль выбирает RENDER_OFF_HAND_ONLY и предмет в главной руке исчезает. + * По мотивам Hold My Items (HandRenderTypeMixin) — пере-реализация под наши правила. + */ +@ModuleInfo( + id = "alwaysvisiblehand", + displayName = "AlwaysVisibleHand", + aliases = {"alwaysvisible", "hand"}, + category = ModuleCategory.VISUALS, + description = "Не даёт ванилле прятать руку с предметом при использовании другого предмета." +) +public final class AlwaysVisibleHand extends Module { + + public static final String SELECTION_BOTH = "Both"; + public static final String SELECTION_MAIN = "Main hand"; + public static final String SELECTION_OFF = "Off hand"; + + private static final String SETTING_KEEP = "keep_visible"; + + private final ModeValue keepVisible = + modeSetting("handKeepVisible", SETTING_KEEP, SELECTION_BOTH, SELECTION_BOTH, SELECTION_MAIN, SELECTION_OFF); + + private final BooleanValue keepDuringUse = + bool("hand_keep_during_use", SETTING_KEEP + "_during_use", true); + + public boolean renderMainHand(boolean vanillaDecision) { + return resolveHand(SELECTION_MAIN, vanillaDecision); + } + + public boolean renderOffHand(boolean vanillaDecision) { + return resolveHand(SELECTION_OFF, vanillaDecision); + } + + private boolean resolveHand(String handLabel, boolean vanillaDecision) { + if (!isEnabled() || !keepDuringUse.get()) return vanillaDecision; + String mode = keepVisible.get(); + return SELECTION_BOTH.equals(mode) || mode.equals(handLabel); + } + + /** + * Чистое правило для теста: какая рука должна остаться видимой при выбранном режиме. + */ + public static boolean[] resolveSelection(String mode, boolean vanillaMain, boolean vanillaOff) { + return switch (mode) { + case SELECTION_BOTH -> new boolean[]{true, true}; + case SELECTION_MAIN -> new boolean[]{true, vanillaOff}; + case SELECTION_OFF -> new boolean[]{vanillaMain, true}; + default -> new boolean[]{vanillaMain, vanillaOff}; + }; + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BackSword.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/BackSword.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BackSword.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/BackSword.java index 825a22f..514277e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BackSword.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/BackSword.java @@ -1,4 +1,4 @@ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.items; import dev.loki.lovisual.config.values.*; import dev.loki.lovisual.features.module.Module; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HoldMyItems.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/HoldMyItems.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HoldMyItems.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/HoldMyItems.java index fd0ee0a..55aedf0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/HoldMyItems.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/HoldMyItems.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.items; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; @@ -15,6 +15,7 @@ import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.util.animation.EaseCurves; import dev.loki.lovisual.util.animation.hand.HandAnimState; import dev.loki.lovisual.render.helpers.TickDelta; +import dev.loki.lovisual.features.module.modules.visuals.scene.Chams; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.InteractionHand; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ShulkerPreview.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/ShulkerPreview.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ShulkerPreview.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/ShulkerPreview.java index 4cff9ae..d2e9cca 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ShulkerPreview.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/items/ShulkerPreview.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.items; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/KineticLyrics.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/KineticLyrics.java index 6f8052e..81a4456 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/KineticLyrics.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/KineticLyrics.java @@ -16,6 +16,9 @@ import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.media.MediaSessionService; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LrcLibClient; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LyricLine; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LyricLineSplitter; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -51,12 +54,14 @@ public final class KineticLyrics extends Module { num("min_distance", 2.0f, 1.2f, 4.0f); private final NumberValue maxDistance = num("max_distance", 4.5f, 2.0f, 7.0f); + private final NumberValue textScale = + num("text_scale", 2.5f, 0.5f, 5.0f); private final NumberValue arcSpread = num("arc_spread", 70.0f, 20.0f, 85.0f); private final NumberValue floatHeight = num("float_height", 0.5f, 0.1f, 2.0f); private final NumberValue timeOffsetMs = - num("time_offset_ms", 0, -5000, 5000); + num("time_offset_ms", -1000, -5000, 5000); private final BooleanValue debugMode = bool("debug", false); @@ -124,6 +129,11 @@ public final class KineticLyrics extends Module { } if (lyricsQueue.isEmpty()) return; + // Позиция плеера (MPRIS/SMTC) — это внутренний таймер декодера: он + // опережает слышимый вывод на латентность аудио-тракта (0.3-1с+, до + // нескольких секунд через Bluetooth), а LRC-таймкоды привязаны к + // слышимому звуку. Дефолтный сдвиг назад компенсирует это (решение + // совпадает с lrcsnc: у автора ~0.75с задержки для mpd). long audioTimeMs = Math.max(0L, snapshot.predictedPositionSeconds() * 1000L + timeOffsetMs.get()); if (lastAudioTimeMs >= 0 && Math.abs(audioTimeMs - lastAudioTimeMs) > 1500L) { @@ -331,7 +341,7 @@ public final class KineticLyrics extends Module { long now = System.currentTimeMillis(); for (LyricParticle3D particle : activeParticles) { - particle.render(renderer, font, colorRgb, animMode, now); + particle.render(renderer, font, colorRgb, animMode, now, textScale.get()); } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricParticle3D.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricParticle3D.java index 8aab6ef..b325f59 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricParticle3D.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricParticle3D.java @@ -38,7 +38,7 @@ public class LyricParticle3D { /** * Renders this lyric line as a camera-facing 3D billboard with a selectable entrance/exit animation. */ - public void render(Renderer3D renderer, TextRenderer textRenderer, int colorRgb, String animMode, long nowMs) { + public void render(Renderer3D renderer, TextRenderer textRenderer, int colorRgb, String animMode, long nowMs, float userScale) { long elapsed = nowMs - spawnTimeMs; if (elapsed < 0 || elapsed > durationMs || forceExpire) return; @@ -125,7 +125,7 @@ public class LyricParticle3D { .withColor(color) .withCentered(true) .withShadow(true) - .withWorldScale(BASE_WORLD_SCALE * animScale) + .withWorldScale(BASE_WORLD_SCALE * userScale * animScale) .withDepthMode(Renderer3D.DepthMode.MAIN); WorldTextRenderer.drawBillboard(renderer, textRenderer, displayText, anchor, options); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcLibClient.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LrcLibClient.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcLibClient.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LrcLibClient.java index 0ca9d46..9a2682c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcLibClient.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LrcLibClient.java @@ -1,10 +1,11 @@ -package dev.loki.lovisual.features.module.modules.visuals.lyrics; +package dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import dev.loki.lovisual.util.logging.DebugLog; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.KineticLyrics; import java.net.URI; import java.net.URLEncoder; @@ -174,7 +175,7 @@ public final class LrcLibClient { return Collections.emptyList(); } - static String cleanTrackName(String trackName) { + public static String cleanTrackName(String trackName) { if (trackName == null) return ""; return trackName .replaceAll("\\(.*?\\)", "") diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcParser.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LrcParser.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcParser.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LrcParser.java index 65c8185..742c0c5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcParser.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LrcParser.java @@ -1,4 +1,4 @@ -package dev.loki.lovisual.features.module.modules.visuals.lyrics; +package dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc; import java.util.ArrayList; import java.util.Collections; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLine.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LyricLine.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLine.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LyricLine.java index bfcafef..bfca765 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLine.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LyricLine.java @@ -1,4 +1,4 @@ -package dev.loki.lovisual.features.module.modules.visuals.lyrics; +package dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc; public record LyricLine(long timestampMs, String text) implements Comparable { @Override diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLineSplitter.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LyricLineSplitter.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLineSplitter.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LyricLineSplitter.java index 43f3fb9..04ef7ff 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLineSplitter.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/lrc/LyricLineSplitter.java @@ -1,4 +1,4 @@ -package dev.loki.lovisual.features.module.modules.visuals.lyrics; +package dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc; import java.util.ArrayList; import java.util.Collections; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagCache.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagCache.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagCache.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagCache.java index a0eccc9..47c1602 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagCache.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagCache.java @@ -5,11 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags; import dev.loki.lovisual.render.engine.animation.AnimationUtility; import dev.loki.lovisual.util.player.effect.StatusEffectView; import dev.loki.lovisual.util.pvp.opponents.TotemPopSnapshot; +import dev.loki.lovisual.features.module.modules.visuals.nametags.render.NameTagEnchantFormatter; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; @@ -19,7 +20,7 @@ import net.minecraft.world.item.ItemStack; import java.util.List; import java.util.UUID; -final class NameTagCache { +public final class NameTagCache { private static final int EFFECT_CACHE_TICKS = 4; private static final int ENCHANT_CACHE_TICKS = 2; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagLayoutEngine.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagLayoutEngine.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagLayoutEngine.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagLayoutEngine.java index 1cfc878..e9ba102 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagLayoutEngine.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagLayoutEngine.java @@ -5,25 +5,30 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.relations.CategoryService; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.text.TextRenderUtil; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.nametags.parts.NameTagEquipmentRenderer; +import dev.loki.lovisual.features.module.modules.visuals.nametags.parts.NameTagFaceRenderer; +import dev.loki.lovisual.features.module.modules.visuals.nametags.render.NameTagLabelBuilder; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; -final class NameTagLayoutEngine { +public final class NameTagLayoutEngine { static final float NAMEPLATE_SCALE = 1.08f; - static final int DIST_TEXT_GAP = 5; + public static final int DIST_TEXT_GAP = 5; static final int NAMEPLATE_PAD_X = 4; static final int NAMEPLATE_PAD_Y = 2; - static final float TOTEM_BADGE_TEXT_GAP = 2.0f; - static final float TOTEM_BADGE_TEXT_SCALE = 0.72f; + public static final float TOTEM_BADGE_TEXT_GAP = 2.0f; + public static final float TOTEM_BADGE_TEXT_SCALE = 0.72f; private static final int PING_TEXT_GAP = 4; private static final int HP_TEXT_GAP = 4; private static final float MATTE_HEAD_MIN_SIZE = 12.0f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagModel.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagModel.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagModel.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagModel.java index 829ef55..bd708f3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagModel.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTagModel.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags; import dev.loki.lovisual.config.values.EnumValue; import net.minecraft.network.chat.Component; @@ -20,17 +20,17 @@ public final class NameTagModel { private NameTagModel() { } - enum NameplateStyle implements EnumValue.IdProvider { + public enum NameplateStyle implements EnumValue.IdProvider { LIQUID_GLASS, MATTE } - static final class EffectCache { + public static final class EffectCache { int lastTick = -1; List effects = List.of(); } - static final class EnchantCache { + public static final class EnchantCache { int lastTick = -1; int signature = 0; List> lines = List.of(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTags.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTags.java similarity index 87% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTags.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTags.java index 5de5d73..4934ef4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTags.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/NameTags.java @@ -5,12 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags; import dev.loki.lovisual.config.SettingDef; import dev.loki.lovisual.config.common.CommonSettingSchemas; import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.features.gui.clickgui.settings.TextListSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.text.list.TextListSetting; import dev.loki.lovisual.features.module.*; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.mixininterface.IEntity; @@ -23,6 +23,9 @@ import dev.loki.lovisual.util.item.TopEnchantUtil; import dev.loki.lovisual.util.player.effect.StatusEffectView; import dev.loki.lovisual.util.pvp.opponents.TotemPopCounter; import dev.loki.lovisual.util.pvp.opponents.TotemPopSnapshot; +import dev.loki.lovisual.features.module.modules.visuals.nametags.parts.NameTagOpponentRenderer; +import dev.loki.lovisual.features.module.modules.visuals.nametags.render.NameTagLabelBuilder; +import dev.loki.lovisual.features.module.modules.visuals.nametags.render.NameTagRenderer; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -34,12 +37,13 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import java.util.*; +import dev.loki.lovisual.features.gui.hud.draggable.impl.stats.Ping; //todo Description @ModuleInfo(id = "nametags", displayName = "NameTags", aliases = {"nametag", "tags", "names"}, category = ModuleCategory.VISUALS) public class NameTags extends Module { - static final int OPPONENT_DISTANCE = 80; + public static final int OPPONENT_DISTANCE = 80; private static final int INFO_COLOR_DEFAULT = 0xFFFF8A8A; private static final float NAMEPLATE_EXTRA_LIFT = 8f; private static final ItemStack[] EMPTY_SLOTS = new ItemStack[0]; @@ -83,7 +87,7 @@ public class NameTags extends Module { final Map totemPopLastCounts = new HashMap<>(); final HashSet seenIds = new HashSet<>(); - final BooleanMapValue toggles = group("nameTagsToggles", SETTING_TOGGLES, Map.of( + public final BooleanMapValue toggles = group("nameTagsToggles", SETTING_TOGGLES, Map.of( "Show nameplate", true, "Show distance", true, "Show armor row", true, @@ -91,7 +95,7 @@ public class NameTags extends Module { "Show effects", true, "Show self in 3rd person", false )); - final NumberValue durabilityStartPercent = + public final NumberValue durabilityStartPercent = visibleWhen(num("nameTagsDurabilityStartPercent", SETTING_DURABILITY_START, 99, 0, 100), () -> toggles.get("Item durability bar")); private final BooleanMapValue distanceToggles = @@ -109,20 +113,20 @@ public class NameTags extends Module { private final NumberValue effectsDistance = visibleWhen(num("nameTagsEffectsDistance", SETTING_EFFECTS_CUTOFF, 90, 5, 256), () -> toggles.get("Show effects")); - final NumberValue nameplateAlpha = + public final NumberValue nameplateAlpha = visibleWhen(num("nameTagsNameplateAlpha", SETTING_NAMEPLATE_ALPHA, 180, 0, 255), () -> toggles.get("Show nameplate")); - final EnumValue nameplateStyle = + public final EnumValue nameplateStyle = visibleWhen(enumSetting("nameTagsNameplateStyle", SETTING_NAMEPLATE_STYLE, NameTagModel.NameplateStyle.LIQUID_GLASS, NameTagModel.NameplateStyle.values()), () -> toggles.get("Show nameplate")); - final BooleanValue playerHead = + public final BooleanValue playerHead = visibleWhen(bool("nameTagsPlayerHead", SETTING_PLAYER_HEAD, false), () -> toggles.get("Show nameplate")); - final BooleanMapValue nameplateExtras = visibleWhen(group("nameTagsNameplateExtras", SETTING_NAMEPLATE_EXTRAS, new LinkedHashMap<>() {{ + public final BooleanMapValue nameplateExtras = visibleWhen(group("nameTagsNameplateExtras", SETTING_NAMEPLATE_EXTRAS, new LinkedHashMap<>() {{ put("Tab names", false); put("Ping", false); }}), () -> toggles.get("Show nameplate")); - final BooleanMapValue enchantArmor = group("nameTagsEnchantArmor", SETTING_ARMOR_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantArmor = group("nameTagsEnchantArmor", SETTING_ARMOR_ENCHANTS, Map.ofEntries( Map.entry("protection", true), Map.entry("fire_protection", false), Map.entry("feather_falling", false), @@ -136,7 +140,7 @@ public class NameTags extends Module { Map.entry("soul_speed", false), Map.entry("swift_sneak", false) )); - final BooleanMapValue enchantMelee = group("nameTagsEnchantMelee", SETTING_MELEE_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantMelee = group("nameTagsEnchantMelee", SETTING_MELEE_ENCHANTS, Map.ofEntries( Map.entry("sharpness", true), Map.entry("smite", false), Map.entry("bane_of_arthropods", false), @@ -145,61 +149,61 @@ public class NameTags extends Module { Map.entry("looting", true), Map.entry("sweeping_edge", false) )); - final BooleanMapValue enchantTools = group("nameTagsEnchantTools", SETTING_TOOLS_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantTools = group("nameTagsEnchantTools", SETTING_TOOLS_ENCHANTS, Map.ofEntries( Map.entry("efficiency", true), Map.entry("silk_touch", true), Map.entry("fortune", true) )); - final BooleanMapValue enchantBow = group("nameTagsEnchantBow", SETTING_BOW_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantBow = group("nameTagsEnchantBow", SETTING_BOW_ENCHANTS, Map.ofEntries( Map.entry("power", true), Map.entry("punch", true), Map.entry("flame", false), Map.entry("infinity", false) )); - final BooleanMapValue enchantFishing = group("nameTagsEnchantFishing", SETTING_FISHING_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantFishing = group("nameTagsEnchantFishing", SETTING_FISHING_ENCHANTS, Map.ofEntries( Map.entry("luck_of_the_sea", false), Map.entry("lure", false) )); - final BooleanMapValue enchantTrident = group("nameTagsEnchantTrident", SETTING_TRIDENT_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantTrident = group("nameTagsEnchantTrident", SETTING_TRIDENT_ENCHANTS, Map.ofEntries( Map.entry("loyalty", false), Map.entry("impaling", false), Map.entry("riptide", false), Map.entry("channeling", false) )); - final BooleanMapValue enchantCrossbow = group("nameTagsEnchantCrossbow", SETTING_CROSSBOW_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantCrossbow = group("nameTagsEnchantCrossbow", SETTING_CROSSBOW_ENCHANTS, Map.ofEntries( Map.entry("multishot", false), Map.entry("quick_charge", false), Map.entry("piercing", true) )); - final BooleanMapValue enchantMace = group("nameTagsEnchantMace", SETTING_MACE_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantMace = group("nameTagsEnchantMace", SETTING_MACE_ENCHANTS, Map.ofEntries( Map.entry("density", true), Map.entry("breach", false), Map.entry("wind_burst", true) )); - final BooleanMapValue enchantOther = group("nameTagsEnchantOther", SETTING_OTHER_ENCHANTS, Map.ofEntries( + public final BooleanMapValue enchantOther = group("nameTagsEnchantOther", SETTING_OTHER_ENCHANTS, Map.ofEntries( Map.entry("mending", false), Map.entry("unbreaking", false), Map.entry("vanishing_curse", false), Map.entry("lunge", true) )); - final BooleanValue illegalEnchantsAlways = bool("nameTagsIllegalEnchantsAlways", SETTING_ILLEGAL_ENCHANTS_ALWAYS, true); - final BooleanValue opponentAppleCooldowns = bool("nameTagsOpponentAppleCooldowns", SETTING_OPPONENT_APPLE_COOLDOWNS, true); + public final BooleanValue illegalEnchantsAlways = bool("nameTagsIllegalEnchantsAlways", SETTING_ILLEGAL_ENCHANTS_ALWAYS, true); + public final BooleanValue opponentAppleCooldowns = bool("nameTagsOpponentAppleCooldowns", SETTING_OPPONENT_APPLE_COOLDOWNS, true); final BooleanValue totemPopCounter = TotemPopCounter.enabledValue(); private final NumberValue totemPopResetSeconds = TotemPopCounter.resetAfterSecondsValue(); - final BooleanValue pvpPrefix = bool("nameTagsPvpPrefix", SETTING_PVP_PREFIX, false); - final RGBColorValue pvpPrefixColor = + public final BooleanValue pvpPrefix = bool("nameTagsPvpPrefix", SETTING_PVP_PREFIX, false); + public final RGBColorValue pvpPrefixColor = visibleWhen(colorNoAlpha("nameTagsPvpPrefixColor", SETTING_PVP_PREFIX_COLOR, "#FF0000"), pvpPrefix::get); - final BooleanValue hpDecimals = + public final BooleanValue hpDecimals = visibleWhen(bool("nameTagsHpDecimals", SETTING_HP_DECIMALS, false), () -> toggles.get("Show nameplate")); - final ModeValue hpColorMode = + public final ModeValue hpColorMode = visibleWhen(modeSetting("nameTagsHpColorMode", SETTING_HP_COLOR_MODE, "Static", "Static", "Gradient"), () -> toggles.get("Show nameplate")); - transient TextRenderer cachedNameTr; - transient TextRenderer cachedHpTr; - transient TextRenderer cachedLevelTr; - transient TextRenderer cachedTimeTr; + public transient TextRenderer cachedNameTr; + public transient TextRenderer cachedHpTr; + public transient TextRenderer cachedLevelTr; + public transient TextRenderer cachedTimeTr; { setting(SettingDef.bool(totemPopCounter) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEquipmentRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagEquipmentRenderer.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEquipmentRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagEquipmentRenderer.java index ab8031b..769d7d8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEquipmentRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagEquipmentRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.parts; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.renderer.Renderer2D; @@ -13,6 +13,8 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.util.pvp.CooldownRegistry; import dev.loki.lovisual.util.pvp.ItemCooldownSnapshot; import dev.loki.lovisual.util.pvp.opponents.OpponentCooldownManager; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagModel; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; @@ -21,7 +23,7 @@ import net.minecraft.world.item.ItemStack; import java.util.List; -final class NameTagEquipmentRenderer { +public final class NameTagEquipmentRenderer { private static final int ICON_SIZE = 24; private static final int ICON_GAP = 5; @@ -31,7 +33,7 @@ final class NameTagEquipmentRenderer { private NameTagEquipmentRenderer() { } - static int equipIconSize() { + public static int equipIconSize() { return Math.round(ICON_SIZE * EQUIP_ICON_SCALE); } @@ -39,7 +41,7 @@ final class NameTagEquipmentRenderer { return Math.round(ICON_GAP * EQUIP_ICON_SCALE); } - static void drawRow(NameTags self, GuiGraphicsExtractor ctx, Player player, ItemStack[] slots, int centerX, int y) { + public static void drawRow(NameTags self, GuiGraphicsExtractor ctx, Player player, ItemStack[] slots, int centerX, int y) { int iconSize = equipIconSize(); int gap = equipIconGap(); int rowWidth = slots.length * (iconSize + gap) - gap; @@ -85,7 +87,7 @@ final class NameTagEquipmentRenderer { ); } - static void drawRowText(TextRenderer textRenderer, ItemStack[] slots, + public static void drawRowText(TextRenderer textRenderer, ItemStack[] slots, List> enchantLines, int centerX, int y) { int iconSize = equipIconSize(); int gap = equipIconGap(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagFaceRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagFaceRenderer.java similarity index 77% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagFaceRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagFaceRenderer.java index 36b0e70..3f3798e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagFaceRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagFaceRenderer.java @@ -5,21 +5,23 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.parts; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.helpers.MatteHudStyle; import dev.loki.lovisual.render.helpers.PlayerHeadRenderer; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagModel; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.entity.player.Player; -final class NameTagFaceRenderer { +public final class NameTagFaceRenderer { private NameTagFaceRenderer() { } - static boolean shouldRenderPlayerHead(NameTags self, Player player) { + public static boolean shouldRenderPlayerHead(NameTags self, Player player) { return self.playerHead.get() && player instanceof AbstractClientPlayer; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagOpponentRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagOpponentRenderer.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagOpponentRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagOpponentRenderer.java index e8fc41f..30d9929 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagOpponentRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagOpponentRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.parts; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.PvpCooldowns; @@ -16,6 +16,8 @@ import dev.loki.lovisual.util.pvp.CooldownRegistry; import dev.loki.lovisual.util.pvp.ItemCooldownSnapshot; import dev.loki.lovisual.util.pvp.PvpTargetState; import dev.loki.lovisual.util.pvp.opponents.OpponentCooldownManager; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagModel; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.world.entity.player.Player; @@ -24,7 +26,7 @@ import net.minecraft.world.item.ItemStack; import java.util.UUID; -final class NameTagOpponentRenderer { +public final class NameTagOpponentRenderer { private static final int ICON_SIZE = 24; private static final int ICON_GAP = 5; @@ -48,7 +50,7 @@ final class NameTagOpponentRenderer { return !(maxDist > 0) || !(mc.player.distanceToSqr(p) > maxDist * maxDist); } - static boolean isOpponentAppleTrackingEnabled() { + public static boolean isOpponentAppleTrackingEnabled() { PvpCooldowns mod = Modules.get(PvpCooldowns.class); return mod != null && mod.isSystemEnabled(); } @@ -73,7 +75,7 @@ final class NameTagOpponentRenderer { return nameY + OPP_STACK_Y_OFFSET; } - static void drawOpponentCooldownsStackedIcons(NameTags self, GuiGraphicsExtractor ctx, Player player, + public static void drawOpponentCooldownsStackedIcons(NameTags self, GuiGraphicsExtractor ctx, Player player, NameTagModel.ScreenRect rect, int centerX, int nameY) { if (!shouldRenderOpponentStuff(self, player)) return; @@ -96,7 +98,7 @@ final class NameTagOpponentRenderer { } } - static void drawOpponentCooldownsStackedText(NameTags self, TextRenderer textRenderer, Player player, + public static void drawOpponentCooldownsStackedText(NameTags self, TextRenderer textRenderer, Player player, NameTagModel.ScreenRect rect, int centerX, int nameY) { if (!shouldRenderOpponentStuff(self, player)) return; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagPlateRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagPlateRenderer.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagPlateRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagPlateRenderer.java index d46aeba..c05ddb0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagPlateRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/parts/NameTagPlateRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.parts; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; import dev.loki.lovisual.render.engine.animation.AnimationUtility; @@ -15,6 +15,9 @@ import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.MatteHudStyle; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagLayoutEngine; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagModel; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.entity.player.Player; @@ -23,7 +26,7 @@ import net.minecraft.world.item.Items; import static dev.loki.lovisual.features.theme.Theme.theme; -final class NameTagPlateRenderer { +public final class NameTagPlateRenderer { private static final float NAMEPLATE_RADIUS = 7.0f; private static final float MATTE_NAMEPLATE_RADIUS = 4.0f; @@ -59,7 +62,7 @@ final class NameTagPlateRenderer { return Math.min(NAMEPLATE_RADIUS, Math.max(4.5f, layout.bgH() * 0.5f)); } - static void drawBackground(NameTags self, Renderer2D renderer, Player player, NameTagModel.NameplateLayout layout) { + public static void drawBackground(NameTags self, Renderer2D renderer, Player player, NameTagModel.NameplateLayout layout) { if (layout == null) return; int alpha = clampAlpha(self.nameplateAlpha.get()); if (alpha <= 0) return; @@ -99,7 +102,7 @@ final class NameTagPlateRenderer { ); } - static void drawHead(NameTags self, Renderer2D renderer, GuiGraphicsExtractor ctx, Player player, + public static void drawHead(NameTags self, Renderer2D renderer, GuiGraphicsExtractor ctx, Player player, NameTagModel.NameplateLayout layout) { if (ctx == null || layout == null || !layout.renderHead()) return; if (!(player instanceof AbstractClientPlayer clientPlayer)) return; @@ -132,7 +135,7 @@ final class NameTagPlateRenderer { ); } - static void drawTotemBadge(NameTags self, Renderer2D renderer, TextRenderer fallbackRenderer, + public static void drawTotemBadge(NameTags self, Renderer2D renderer, TextRenderer fallbackRenderer, NameTagModel.NameplateLayout layout, int count, float animation) { if (renderer == null || layout == null || !layout.renderTotemBadge()) return; if (count <= 0 || animation <= 0.001f) return; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEffectsRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagEffectsRenderer.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEffectsRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagEffectsRenderer.java index 7bb2853..46e8e83 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEffectsRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagEffectsRenderer.java @@ -5,18 +5,19 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.render; import dev.loki.lovisual.render.engine.color.RenderColor; import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.EffectIconRenderer; import dev.loki.lovisual.util.player.effect.StatusEffectTracker; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.world.effect.MobEffectInstance; import java.util.List; -final class NameTagEffectsRenderer { +public final class NameTagEffectsRenderer { private static final int ICON_SIZE = 24; private static final int EFFECT_LINE_HEIGHT = 26; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEnchantFormatter.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagEnchantFormatter.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEnchantFormatter.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagEnchantFormatter.java index 8bc53b3..0b1cb41 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagEnchantFormatter.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagEnchantFormatter.java @@ -5,13 +5,15 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.render; import dev.loki.lovisual.util.item.EnchantMeta; import dev.loki.lovisual.util.item.EnchantRegistry; import dev.loki.lovisual.util.item.EnchantUtil; import dev.loki.lovisual.util.item.IllegalItemUtil; import dev.loki.lovisual.util.item.TopEnchantUtil; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagModel; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; @@ -24,7 +26,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -final class NameTagEnchantFormatter { +public final class NameTagEnchantFormatter { private NameTagEnchantFormatter() { } @@ -81,7 +83,7 @@ final class NameTagEnchantFormatter { return map.getOrDefault(path, false); } - static List> buildEnchantLines(NameTags self, ItemStack[] slots) { + public static List> buildEnchantLines(NameTags self, ItemStack[] slots) { List> result = new ArrayList<>(slots.length); for (ItemStack stack : slots) { if (stack.isEmpty()) { @@ -94,7 +96,7 @@ final class NameTagEnchantFormatter { return result; } - static int maxEnchantLines(List> lines) { + public static int maxEnchantLines(List> lines) { int max = 0; for (List entry : lines) { int size = entry.size(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagLabelBuilder.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagLabelBuilder.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagLabelBuilder.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagLabelBuilder.java index edf5570..e4578e7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagLabelBuilder.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagLabelBuilder.java @@ -5,20 +5,23 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.render; import dev.loki.lovisual.features.relations.PlayerRelations; import dev.loki.lovisual.util.player.PlayerHealthResolver; import dev.loki.lovisual.util.pvp.PvpTargetState; import dev.loki.lovisual.util.text.LegacyTextUtil; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagModel; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.GameType; +import dev.loki.lovisual.features.gui.hud.draggable.impl.stats.Ping; -final class NameTagLabelBuilder { +public final class NameTagLabelBuilder { private static final int HP_GREEN = 0xFF55FF55; private static final int HP_CYAN = 0xFF55FFFF; @@ -27,7 +30,7 @@ final class NameTagLabelBuilder { private NameTagLabelBuilder() { } - static NameTagModel.LabelInfo buildLabelInfo(NameTags self, Player player) { + public static NameTagModel.LabelInfo buildLabelInfo(NameTags self, Player player) { Component styledName = resolveNameplateText(self, player); String name = styledName == null ? "" : styledName.getString(); String prefix = ""; @@ -72,7 +75,7 @@ final class NameTagLabelBuilder { return String.valueOf(value); } - static String formatNameplateHp(String hp) { + public static String formatNameplateHp(String hp) { return hp == null ? "" : hp; } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagRenderer.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagRenderer.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagRenderer.java index ed3145b..5b48094 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NameTagRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/nametags/render/NameTagRenderer.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.nametags.render; import dev.loki.lovisual.features.relations.CategoryService; import dev.loki.lovisual.render.engine.color.RenderColor; @@ -16,6 +16,12 @@ import dev.loki.lovisual.render.engine.text.TextRenderer; import dev.loki.lovisual.render.helpers.EffectIconRenderer; import dev.loki.lovisual.render.helpers.ScissorFunction; import dev.loki.lovisual.util.text.TextRenderUtil; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagLayoutEngine; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTagModel; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; +import dev.loki.lovisual.features.module.modules.visuals.nametags.parts.NameTagEquipmentRenderer; +import dev.loki.lovisual.features.module.modules.visuals.nametags.parts.NameTagOpponentRenderer; +import dev.loki.lovisual.features.module.modules.visuals.nametags.parts.NameTagPlateRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; @@ -23,7 +29,7 @@ import net.minecraft.world.entity.player.Player; import java.util.List; -final class NameTagRenderer { +public final class NameTagRenderer { static final float SMALL_TEXT_SCALE = 0.82f; private static final float NAMEPLATE_TEXT_SHADOW_OFFSET = 0.0f; @@ -31,14 +37,14 @@ final class NameTagRenderer { private NameTagRenderer() { } - static void ensureFontCache(NameTags self, TextRenderer fallback) { + public static void ensureFontCache(NameTags self, TextRenderer fallback) { self.cachedNameTr = Fonts.renderer("OnestBold", FontInfo.Type.Regular, fallback); self.cachedHpTr = Fonts.renderer("OnestMedium", FontInfo.Type.Regular, self.cachedNameTr); self.cachedLevelTr = Fonts.renderer("OnestBold", FontInfo.Type.Regular, fallback); self.cachedTimeTr = Fonts.renderer("OnestMedium", FontInfo.Type.Regular, fallback); } - static void renderNameTagForeground(NameTags self, Renderer2D renderer, GuiGraphicsExtractor ctx, + public static void renderNameTagForeground(NameTags self, Renderer2D renderer, GuiGraphicsExtractor ctx, TextRenderer textRenderer, NameTagModel.RenderEntry entry) { Player player = entry.player(); int centerX = entry.centerX(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Animations.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/Animations.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Animations.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/Animations.java index e9ce246..c54b387 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Animations.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/Animations.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.player; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.features.module.Module; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Crosshair.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/Crosshair.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Crosshair.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/Crosshair.java index 96e14f6..14f1d83 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Crosshair.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/Crosshair.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.player; import dev.loki.lovisual.features.module.*; import dev.loki.lovisual.features.module.Module; @@ -35,7 +35,7 @@ import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.RGBAColorValue; import dev.loki.lovisual.config.common.CommonSettingSchemas; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; -import dev.loki.lovisual.features.gui.hud.draggable.impl.Itemizer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.combat.Itemizer; import dev.loki.lovisual.features.relations.CategoryService; import dev.loki.lovisual.features.relations.EntityFilters; import dev.loki.lovisual.features.relations.PlayerRelations; @@ -48,6 +48,7 @@ import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.text.FontInfo; import dev.loki.lovisual.render.engine.text.Fonts; import dev.loki.lovisual.render.engine.text.TextRenderer; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; import java.util.List; @@ -301,6 +302,19 @@ public class Crosshair extends Module { } boolean outline = showOutline.get(); + + if (crosshairType.get() == CrosshairType.DOT) { + int dotColor = smoothCrosshairColor(resolveCrosshairTargetColor()); + float dotSize = thicknessPx * 2.0f; + drawSegment(renderer, centerX - dotSize * 0.5, centerY - dotSize * 0.5, dotSize, dotSize, dotColor, outline, outlinePx); + return; + } + + if (crosshairType.get() == CrosshairType.PINWHEEL) { + int pinwheelColor = smoothCrosshairColor(resolveCrosshairTargetColor()); + renderPinwheel(renderer, centerX, centerY, thicknessPx, lengthPx, pinwheelColor); + return; + } if (shouldShowRiptideBlocked(mc.player) || shouldShowCooldownCross(mc.player)) { int dangerColor = smoothCrosshairColor(RIPTIDE_BLOCK_COLOR); renderRiptideBlockedCross(renderer, centerX, centerY, thicknessPx, lengthPx, outline, outlinePx, dangerColor); @@ -367,6 +381,46 @@ public class Crosshair extends Module { return -1.0f; } + /** + * Four-blade pinwheel crosshair. Unlike Classic/T-Classic (which open a gap on attack), + * this one spins: fully wound up (0°) at full charge, unwinding toward + * {@link #PINWHEEL_SPIN_DEGREES} as the attack cooldown resets. + */ + private static final float PINWHEEL_SPIN_DEGREES = 130f; + + private void renderPinwheel(Renderer2D renderer, float centerX, float centerY, float thicknessPx, float lengthPx, int color) { + float chargeProgress = Mth.clamp(getAttackCooldownProgress(), 0.0f, 1.0f); + float spinDeg = (1.0f - chargeProgress) * PINWHEEL_SPIN_DEGREES; + + for (int i = 0; i < 4; i++) { + float bladeAngleDeg = 45f + i * 90f + spinDeg; + drawRotatedBlade(renderer, centerX, centerY, thicknessPx, lengthPx, bladeAngleDeg, color); + } + } + + private void drawRotatedBlade(Renderer2D renderer, float centerX, float centerY, + float thicknessPx, float lengthPx, float angleDeg, int color) { + double rad = Math.toRadians(angleDeg); + double dirX = Math.cos(rad); + double dirY = Math.sin(rad); + double perpX = -dirY; + double perpY = dirX; + + double innerX = centerX; + double innerY = centerY; + double outerX = centerX + dirX * lengthPx; + double outerY = centerY + dirY * lengthPx; + double halfThickness = thicknessPx * 0.5; + + double[] points = new double[]{ + innerX - perpX * halfThickness, innerY - perpY * halfThickness, + outerX - perpX * halfThickness, outerY - perpY * halfThickness, + outerX + perpX * halfThickness, outerY + perpY * halfThickness, + innerX + perpX * halfThickness, innerY + perpY * halfThickness + }; + renderer.polygon(points, 4, color); + } + private void renderOrbiz(Renderer2D renderer, float centerX, float centerY, float scale) { Minecraft mc = Minecraft.getInstance(); boolean danger = shouldShowRiptideBlocked(mc.player) || shouldShowCooldownCross(mc.player); @@ -653,7 +707,9 @@ public class Crosshair extends Module { private enum CrosshairType implements EnumValue.AliasProvider { CLASSIC, T_CLASSIC, - ORBIZ; + ORBIZ, + PINWHEEL, + DOT; @Override public List aliases() { @@ -661,6 +717,8 @@ public class Crosshair extends Module { case CLASSIC -> List.of("Classic"); case T_CLASSIC -> List.of("T-Classic"); case ORBIZ -> List.of("Orbiz"); + case PINWHEEL -> List.of("Pinwheel"); + case DOT -> List.of("Dot"); }; } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/FullBright.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/FullBright.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/FullBright.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/FullBright.java index ab21ace..91e5e30 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/FullBright.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/FullBright.java @@ -5,12 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.player; import net.minecraft.util.Mth; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.LightmapModifyEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.LightmapModifyEvent; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/JumpCircles.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/JumpCircles.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/JumpCircles.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/JumpCircles.java index 0497f15..1ac7f62 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/JumpCircles.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/player/JumpCircles.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.player; import com.mojang.blaze3d.pipeline.RenderPipeline; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BlockHighlight.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/BlockHighlight.java similarity index 83% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BlockHighlight.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/BlockHighlight.java index 81a0f57..830bb81 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/BlockHighlight.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/BlockHighlight.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.scene; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.MultiPlayerGameMode; @@ -28,12 +28,15 @@ import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.features.module.WorldPhase; -import dev.loki.lovisual.mixins.accessors.MultiPlayerGameModeAccessor; +import dev.loki.lovisual.mixins.accessors.misc.MultiPlayerGameModeAccessor; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.animation.AnimatedRenderColors; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.renderer.Renderer3D; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; +import dev.loki.lovisual.render.engine.uniform.impl.WaterHighlightUniforms; +import dev.loki.lovisual.util.time.GameClock; +import com.mojang.blaze3d.pipeline.RenderPipeline; //todo Description @ModuleInfo( @@ -74,6 +77,12 @@ public class BlockHighlight extends Module { "outline_color2", "#FFFFAA00" ), this::usesSecondaryOutlineColor); + private final EnumValue outlineShaderStyle = + visibleWhen(enumMode( + "outline_shader_style", + ShaderStyle.WATER_CAUSTIC, + ShaderStyle.values() + ), this::usesShaderOutline); private final NumberValue outlineColorSpeed = visibleWhen(num( "outline_color_speed", @@ -276,6 +285,68 @@ public class BlockHighlight extends Module { if (mode == OutlineMode.LINES || mode == OutlineMode.BOTH) { renderShapeLines(renderer, worldShape); } + + if (mode == OutlineMode.SHADER) { + renderShapeShader(renderer, worldShape); + } + } + + private void renderShapeShader(Renderer3D renderer, VoxelShape worldShape) { + RenderPipeline pipeline = switch (outlineShaderStyle.get()) { + case SCAN_LINES -> LoVisualRenderPipelines.WORLD_BLOCK_HIGHLIGHT_SCANLINES; + case HOLOGRAM -> LoVisualRenderPipelines.WORLD_BLOCK_HIGHLIGHT_HOLOGRAM; + default -> LoVisualRenderPipelines.WORLD_BLOCK_HIGHLIGHT_WATERCAUSTIC; + }; + + int color = outlineColor.getArgb(); + int color2 = outlineColor2.getArgb(); + float time = GameClock.millis() / 1000f; + + WaterHighlightUniforms.update( + red(color) / 255f, green(color) / 255f, blue(color) / 255f, alpha(color) / 255f, + red(color2) / 255f, green(color2) / 255f, blue(color2) / 255f, alpha(color2) / 255f, + time + ); + + Renderer3D.BatchBindings bindings = Renderer3D.BatchBindings.none() + .withUniform("WaterData", WaterHighlightUniforms.get()); + MeshBuilder mesh = renderer.batch(pipeline, Renderer3D.DepthMode.NONE, bindings); + if (mesh == null) return; + + worldShape.forAllBoxes((minX, minY, minZ, maxX, maxY, maxZ) -> { + double x1 = minX - GEOMETRY_EXPAND; + double y1 = minY - GEOMETRY_EXPAND; + double z1 = minZ - GEOMETRY_EXPAND; + double x2 = maxX + GEOMETRY_EXPAND; + double y2 = maxY + GEOMETRY_EXPAND; + double z2 = maxZ + GEOMETRY_EXPAND; + + addTexturedBox(mesh, x1, y1, z1, x2, y2, z2); + }); + } + + private static void addTexturedBox(MeshBuilder mesh, + double x1, double y1, double z1, + double x2, double y2, double z2) { + addTexturedQuad(mesh, x1, y1, z1, x2, y1, z1, x2, y2, z1, x1, y2, z1); + addTexturedQuad(mesh, x2, y1, z2, x1, y1, z2, x1, y2, z2, x2, y2, z2); + addTexturedQuad(mesh, x1, y1, z2, x1, y1, z1, x1, y2, z1, x1, y2, z2); + addTexturedQuad(mesh, x2, y1, z1, x2, y1, z2, x2, y2, z2, x2, y2, z1); + addTexturedQuad(mesh, x1, y2, z1, x2, y2, z1, x2, y2, z2, x1, y2, z2); + addTexturedQuad(mesh, x1, y1, z2, x2, y1, z2, x2, y1, z1, x1, y1, z1); + } + + private static void addTexturedQuad(MeshBuilder mesh, + double x1, double y1, double z1, + double x2, double y2, double z2, + double x3, double y3, double z3, + double x4, double y4, double z4) { + mesh.ensureQuadCapacity(); + int i1 = mesh.vec3(x1, y1, z1).vec2(0, 0).color(255, 255, 255, 255).next(); + int i2 = mesh.vec3(x2, y2, z2).vec2(1, 0).color(255, 255, 255, 255).next(); + int i3 = mesh.vec3(x3, y3, z3).vec2(1, 1).color(255, 255, 255, 255).next(); + int i4 = mesh.vec3(x4, y4, z4).vec2(0, 1).color(255, 255, 255, 255).next(); + mesh.quad(i1, i2, i3, i4); } private void renderShapeLines(Renderer3D renderer, VoxelShape worldShape) { @@ -528,6 +599,10 @@ public class BlockHighlight extends Module { return AnimatedRenderColors.usesSecondary(animatedOutlineColorMode()); } + private boolean usesShaderOutline() { + return outlineEnabled.get() && outlineMode.get() == OutlineMode.SHADER; + } + private AnimatedRenderColors.Mode animatedOutlineColorMode() { return switch (outlineColorMode.get()) { case RAINBOW -> AnimatedRenderColors.Mode.RAINBOW; @@ -566,7 +641,8 @@ public class BlockHighlight extends Module { public enum OutlineMode implements EnumValue.IdProvider { LINES("lines"), BOX("box"), - BOTH("both"); + BOTH("both"), + SHADER("shader"); private final String id; @@ -580,6 +656,23 @@ public class BlockHighlight extends Module { } } + public enum ShaderStyle implements EnumValue.IdProvider { + WATER_CAUSTIC("water_caustic"), + SCAN_LINES("scan_lines"), + HOLOGRAM("hologram"); + + private final String id; + + ShaderStyle(String id) { + this.id = id; + } + + @Override + public String id() { + return id; + } + } + public enum BreakAnimation implements EnumValue.IdProvider { GROW("grow"), SHRINK("shrink"), diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Chams.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/Chams.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Chams.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/Chams.java index ced84da..54ba030 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Chams.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/Chams.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.scene; import dev.loki.lovisual.features.theme.Theme; import com.mojang.blaze3d.GpuFormat; @@ -33,8 +33,8 @@ import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.mixins.accessors.GameRendererAccessor; -import dev.loki.lovisual.mixins.iris.IrisHandRendererAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.GameRendererAccessor; +import dev.loki.lovisual.mixins.iris.hand.IrisHandRendererAccessor; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.postprocess.PostProcessManager; import dev.loki.lovisual.render.engine.postprocess.PostProcessPass; @@ -48,6 +48,7 @@ import dev.loki.lovisual.render.engine.uniform.impl.HandSmokeUniforms; import dev.loki.lovisual.render.iris.IrisHandMaskState; import dev.loki.lovisual.render.iris.IrisRuntime; import dev.loki.lovisual.render.engine.RenderState; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; //todo Description @ModuleInfo(id = "chams", displayName = "Chams", category = ModuleCategory.VISUALS) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ItemPhysic.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/ItemPhysic.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ItemPhysic.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/ItemPhysic.java index 46bb43f..f124d49 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ItemPhysic.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/ItemPhysic.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.scene; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.features.module.Module; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ReimaginedVisual.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/ReimaginedVisual.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ReimaginedVisual.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/ReimaginedVisual.java index c15811f..b081b82 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ReimaginedVisual.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/scene/ReimaginedVisual.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.scene; import dev.loki.lovisual.features.theme.Theme; import com.mojang.blaze3d.textures.GpuTextureView; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Hitboxes.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/Hitboxes.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Hitboxes.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/Hitboxes.java index de271fb..d5c06e7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Hitboxes.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/Hitboxes.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.visibility; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.ModeValue; @@ -21,6 +21,7 @@ import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.renderer.Renderer3D; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; +import dev.loki.lovisual.features.module.modules.visuals.esp.shader.EspMeshBuilder; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Light.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/Light.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Light.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/Light.java index 6ee6561..86b2827 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Light.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/Light.java @@ -5,13 +5,13 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.visibility; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.RGBColorValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.LightmapModifyEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.LightmapModifyEvent; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NoRender.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/NoRender.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NoRender.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/NoRender.java index a429051..e4fd507 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/NoRender.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/visibility/NoRender.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.visibility; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/AtmoDawnFog.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/AtmoDawnFog.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/AtmoDawnFog.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/AtmoDawnFog.java index a97d291..3e2405d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/AtmoDawnFog.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/AtmoDawnFog.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.weather; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.RGBColorValue; @@ -66,7 +66,7 @@ public final class AtmoDawnFog extends Module { } /** Чистая математика силы эффекта — вынесена для тестов. */ - static float strengthFor(float timeOfDay, String mode, double cameraY, float scatterHeight) { + public static float strengthFor(float timeOfDay, String mode, double cameraY, float scatterHeight) { float byMode = switch (mode) { case "Dusk" -> timeCloseness(timeOfDay, 0.5f); case "Custom" -> 1.0f; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Rain.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/Rain.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Rain.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/Rain.java index 09c173f..8a6c628 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/Rain.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/Rain.java @@ -1,4 +1,4 @@ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.weather; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.EnumValue; @@ -460,7 +460,25 @@ public final class Rain extends Module implements PostProcessPass { && wetSurfaceDepthSupported && mc.player != null && mc.level != null - && (!onlyWhenRaining.get() || mc.level.isRaining()); + && (!onlyWhenRaining.get() || mc.level.isRaining()) + && playerSeesSky(mc); + } + + /** + * Gates the screen-space wet-surface pass by the player's own sky exposure. The shader + * has no per-pixel occlusion, so without this it wets cave floors and undersides of leaf + * canopy whenever it's raining anywhere in the world. Checking the player's own position + * (rather than every visible surface) is an approximation, but it correctly stops the + * effect the moment the player themself is indoors/underground/under leaves — the two + * cases actually being reported. + */ + private boolean playerSeesSky(Minecraft mc) { + if (!skyCheck.get() || mc.player == null || mc.level == null) return true; + try { + return mc.level.canSeeSky(mc.player.blockPosition()); + } catch (Throwable ignored) { + return true; + } } @Override diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ShaderSky.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/ShaderSky.java similarity index 71% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ShaderSky.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/ShaderSky.java index c0e7043..72b6ed1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/ShaderSky.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/ShaderSky.java @@ -1,7 +1,8 @@ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.weather; import dev.loki.lovisual.config.values.ModeValue; import dev.loki.lovisual.config.values.NumberValue; +import dev.loki.lovisual.config.values.RGBAColorValue; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; @@ -22,13 +23,25 @@ public class ShaderSky extends Module { private static final String SETTING_THUNDER_INTERVAL = "thunder_interval"; private static final String SETTING_THUNDER_CHANCE = "thunder_chance"; private static final String SETTING_THUNDER_GLOW = "thunder_glow"; + private static final String SETTING_NEBULA_INTENSITY = "nebula_intensity"; + private static final String SETTING_NEBULA_COLOR1 = "nebula_color1"; + private static final String SETTING_NEBULA_COLOR2 = "nebula_color2"; + private static final String SETTING_NEBULA_STAR_COLOR = "nebula_star_color"; private final ModeValue mode = modeSetting( "shaderSkyMode", SETTING_MODE, "Thunder", - "Thunder", "Pulsar", "Sky", "Water", "Caustic" + "Thunder", "Pulsar", "Sky", "Water", "Caustic", "Nebula" ); + private final NumberValue nebulaIntensity = + visibleWhen(num("shaderSkyNebulaIntensity", SETTING_NEBULA_INTENSITY, 1.2f, 0.2f, 3.0f), this::isNebulaMode); + private final RGBAColorValue nebulaColor1 = + visibleWhen(color("shaderSkyNebulaColor1", SETTING_NEBULA_COLOR1, "#FFFF7A1A"), this::isNebulaMode); + private final RGBAColorValue nebulaColor2 = + visibleWhen(color("shaderSkyNebulaColor2", SETTING_NEBULA_COLOR2, "#FFDC1466"), this::isNebulaMode); + private final RGBAColorValue nebulaStarColor = + visibleWhen(color("shaderSkyNebulaStarColor", SETTING_NEBULA_STAR_COLOR, "#FFFFD27A"), this::isNebulaMode); private final NumberValue speed = num("shaderSkySpeed", SETTING_SPEED, 1.0f, 0.1f, 5.0f); private final NumberValue scale = @@ -85,6 +98,10 @@ public class ShaderSky extends Module { return "Sky".equals(m) || "Water".equals(m) || "Caustic".equals(m); } + private boolean isNebulaMode() { + return "Nebula".equals(mode.get()); + } + @Override public WorldPhase getWorldPhase() { return WorldPhase.AFTER_POST_PROCESS; @@ -115,6 +132,16 @@ public class ShaderSky extends Module { alpha.get(), 0xFF6FA8DC & 0x00FFFFFF ); + } else if (isNebulaMode()) { + SkyShaderRenderer.renderNebula( + mc, + speed.get(), + nebulaIntensity.get(), + alpha.get(), + nebulaColor1.getArgb(), + nebulaColor2.getArgb(), + nebulaStarColor.getArgb() + ); } } } \ No newline at end of file diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/WorldTweaks.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/WorldTweaks.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/WorldTweaks.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/WorldTweaks.java index d7b92a2..2246d1b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/WorldTweaks.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/module/modules/visuals/weather/WorldTweaks.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.features.module.modules.visuals; +package dev.loki.lovisual.features.module.modules.visuals.weather; import dev.loki.lovisual.util.time.GameClock; @@ -20,15 +20,14 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.Heightmap; -import dev.loki.lovisual.config.values.*; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.PacketEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.network.PacketEvent; import dev.loki.lovisual.features.module.Module; import dev.loki.lovisual.features.module.ModuleCategory; import dev.loki.lovisual.features.module.ModuleInfo; import dev.loki.lovisual.features.module.WorldPhase; -import dev.loki.lovisual.mixins.accessors.WorldAccessor; +import dev.loki.lovisual.mixins.accessors.world.WorldAccessor; import dev.loki.lovisual.render.engine.RenderState; import java.time.LocalTime; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/EditableClickGuiTheme.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/EditableClickGuiTheme.java index 9f22b11..8fe7f9c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/EditableClickGuiTheme.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/EditableClickGuiTheme.java @@ -14,8 +14,8 @@ import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; import dev.loki.lovisual.config.values.RGBAColorValue; import dev.loki.lovisual.config.values.StringValue; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SettingFactory; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.SettingFactory; import java.util.ArrayList; import java.util.List; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/ThemeStore.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/ThemeStore.java index 6e8ad9d..1145be1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/ThemeStore.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/features/theme/ThemeStore.java @@ -17,7 +17,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -final class ThemeStore { +public final class ThemeStore { private static final Path LEGACY_FILE = ConfigPaths.root().resolve("clickgui_themes.json"); private static final Path THEME_ROOT = ConfigPaths.root().resolve("themes"); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LoVisualMixinPlugin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LoVisualMixinPlugin.java index e61b83f..15b7434 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LoVisualMixinPlugin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LoVisualMixinPlugin.java @@ -22,30 +22,27 @@ public final class LoVisualMixinPlugin implements IMixinConfigPlugin { private static final boolean STUB_IRIS = false; private static final Set DISABLED_SODIUM_SHADOW_GRAPH_MIXINS = Set.of(); private static final Set OPTIONAL_SODIUM_MIXINS = Set.of( - "dev.loki.lovisual.mixins.sodium.SodiumBlockRendererMixin", - "dev.loki.lovisual.mixins.sodium.SodiumBlockVisibilityMixin", - "dev.loki.lovisual.mixins.sodium.SodiumChunkMeshFormatsMixin", - "dev.loki.lovisual.mixins.sodium.SodiumChunkBuilderMeshingTaskMixin", - "dev.loki.lovisual.mixins.sodium.SodiumChunkVertexMixin", - "dev.loki.lovisual.mixins.sodium.SodiumShaderChunkRendererMixin", - "dev.loki.lovisual.mixins.sodium.SodiumVertexConsumerTrackerMixin" + "dev.loki.lovisual.mixins.sodium.terrain.SodiumBlockRendererMixin", + "dev.loki.lovisual.mixins.sodium.terrain.SodiumChunkMeshFormatsMixin", + "dev.loki.lovisual.mixins.sodium.vertex.SodiumChunkVertexMixin", + "dev.loki.lovisual.mixins.sodium.terrain.SodiumShaderChunkRendererMixin", + "dev.loki.lovisual.mixins.sodium.vertex.SodiumVertexConsumerTrackerMixin" ); private static final Set OPTIONAL_IRIS_MIXINS = Set.of( - "dev.loki.lovisual.mixins.iris.IrisCommonUniformsMixin", - "dev.loki.lovisual.mixins.iris.IrisGameRendererInteropMixin", - "dev.loki.lovisual.mixins.iris.IrisHandRendererAccessor", - "dev.loki.lovisual.mixins.iris.IrisHandRendererMixin", - "dev.loki.lovisual.mixins.iris.IrisIncludeProcessorMixin", - "dev.loki.lovisual.mixins.iris.IrisShaderPackLoadMixin", - "dev.loki.lovisual.mixins.iris.IrisRenderingPipelineFinalizeMixin", - "dev.loki.lovisual.mixins.iris.IrisVanillaHandInteropMixin" + "dev.loki.lovisual.mixins.iris.render.IrisCommonUniformsMixin", + "dev.loki.lovisual.mixins.iris.render.IrisGameRendererInteropMixin", + "dev.loki.lovisual.mixins.iris.hand.IrisHandRendererAccessor", + "dev.loki.lovisual.mixins.iris.hand.IrisHandRendererMixin", + "dev.loki.lovisual.mixins.iris.processor.IrisIncludeProcessorMixin", + "dev.loki.lovisual.mixins.iris.render.IrisShaderPackLoadMixin", + "dev.loki.lovisual.mixins.iris.render.IrisRenderingPipelineFinalizeMixin", + "dev.loki.lovisual.mixins.iris.hand.IrisVanillaHandInteropMixin" ); private static final Set DISABLED_WITH_IRIS_MIXINS = Set.of( - "dev.loki.lovisual.mixins.sodium.SodiumBlockRendererMixin", - "dev.loki.lovisual.mixins.sodium.SodiumChunkMeshFormatsMixin", - "dev.loki.lovisual.mixins.sodium.SodiumChunkBuilderMeshingTaskMixin", - "dev.loki.lovisual.mixins.sodium.SodiumChunkVertexMixin", - "dev.loki.lovisual.mixins.sodium.SodiumShaderChunkRendererMixin" + "dev.loki.lovisual.mixins.sodium.terrain.SodiumBlockRendererMixin", + "dev.loki.lovisual.mixins.sodium.terrain.SodiumChunkMeshFormatsMixin", + "dev.loki.lovisual.mixins.sodium.vertex.SodiumChunkVertexMixin", + "dev.loki.lovisual.mixins.sodium.terrain.SodiumShaderChunkRendererMixin" ); private static final Set OPTIONAL_XAERO_MINIMAP_MIXINS = Set.of( "dev.loki.lovisual.mixins.xaero.minimap.AbstractWaypointRenderProviderMixin" diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemRenderStateLayerAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemRenderStateLayerAccessor.java deleted file mode 100644 index 735117d..0000000 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemRenderStateLayerAccessor.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of the LoVisual Client distribution. - * Copyright (c) 2026 loki5512344. - * - * Licensed under the GNU General Public License v3.0. - */ - -package dev.loki.lovisual.mixins.accessors; - -import net.minecraft.client.renderer.item.ItemStackRenderState; -import net.minecraft.client.renderer.rendertype.RenderType; -import net.minecraft.client.renderer.special.SpecialModelRenderer; -import net.minecraft.client.resources.model.cuboid.ItemTransform; -import net.minecraft.client.resources.model.geometry.BakedQuad; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(ItemStackRenderState.LayerRenderState.class) -public interface ItemRenderStateLayerAccessor { - - @Accessor("renderType") - RenderType pvs$getRenderLayer(); - - @Accessor("quads") - List pvs$getQuads(); - - @Accessor("tintLayers") - int[] pvs$getTints(); - - @Accessor("foilType") - ItemStackRenderState.FoilType pvs$getGlint(); - - @Accessor("transform") - ItemTransform pvs$getTransform(); - - @Accessor("specialRenderer") - SpecialModelRenderer pvs$getSpecialModelType(); - - @Accessor("argumentForSpecialRendering") - Object pvs$getData(); -} - diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GlTextureInvoker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/GlTextureInvoker.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GlTextureInvoker.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/GlTextureInvoker.java index b5ad231..9eebc48 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GlTextureInvoker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/GlTextureInvoker.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.blaze3d; import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.opengl.FrameBufferCache; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GpuDeviceAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/GpuDeviceAccessor.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GpuDeviceAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/GpuDeviceAccessor.java index 64673bc..5887932 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GpuDeviceAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/GpuDeviceAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.blaze3d; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.GpuDeviceBackend; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ShaderLoaderDefinitionsAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/ShaderLoaderDefinitionsAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ShaderLoaderDefinitionsAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/ShaderLoaderDefinitionsAccessor.java index 8818a05..d7269bb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ShaderLoaderDefinitionsAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/ShaderLoaderDefinitionsAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.blaze3d; import net.minecraft.client.renderer.PostChainConfig; import net.minecraft.client.renderer.ShaderManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ShaderSourceKeyAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/ShaderSourceKeyAccessor.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ShaderSourceKeyAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/ShaderSourceKeyAccessor.java index a0e461b..9bc01ec 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ShaderSourceKeyAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/blaze3d/ShaderSourceKeyAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.blaze3d; import com.mojang.blaze3d.shaders.ShaderType; import net.minecraft.resources.Identifier; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatInputSuggestorAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatInputSuggestorAccessor.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatInputSuggestorAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatInputSuggestorAccessor.java index 3e7be5e..09dd01f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatInputSuggestorAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatInputSuggestorAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.chat; import com.mojang.brigadier.suggestion.Suggestions; import net.minecraft.client.gui.components.CommandSuggestions; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatScreenAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatScreenAccessor.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatScreenAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatScreenAccessor.java index e36e5a0..d441bd8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatScreenAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatScreenAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.chat; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.ChatScreen; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatScreenSuggestorAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatScreenSuggestorAccessor.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatScreenSuggestorAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatScreenSuggestorAccessor.java index f67e5b0..e3dd7a8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ChatScreenSuggestorAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/ChatScreenSuggestorAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.chat; import net.minecraft.client.gui.components.CommandSuggestions; import net.minecraft.client.gui.screens.ChatScreen; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SuggestionWindowAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/SuggestionWindowAccessor.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SuggestionWindowAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/SuggestionWindowAccessor.java index 9090e1b..65efcbd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SuggestionWindowAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/chat/SuggestionWindowAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.chat; import net.minecraft.client.gui.components.CommandSuggestions; import net.minecraft.client.renderer.Rect2i; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/EntityAccessor.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/EntityAccessor.java index 8022195..ee45f14 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/EntityAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.entity; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.PortalProcessor; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityInvoker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/EntityInvoker.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityInvoker.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/EntityInvoker.java index 2c1894a..f69c6c2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityInvoker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/EntityInvoker.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.entity; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LivingEntityAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/LivingEntityAccessor.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LivingEntityAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/LivingEntityAccessor.java index 9def05e..259d311 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LivingEntityAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/LivingEntityAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.entity; import net.minecraft.world.entity.LivingEntity; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LocalPlayerAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/LocalPlayerAccessor.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LocalPlayerAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/LocalPlayerAccessor.java index b7753cc..88f5765 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LocalPlayerAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/entity/LocalPlayerAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.entity; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/BossHealthOverlayAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/BossHealthOverlayAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/BossHealthOverlayAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/BossHealthOverlayAccessor.java index 61190e5..7dfdc8c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/BossHealthOverlayAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/BossHealthOverlayAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.hud; import net.minecraft.client.gui.components.BossHealthOverlay; import net.minecraft.client.gui.components.LerpingBossEvent; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/InGameOverlayRendererAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/InGameOverlayRendererAccessor.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/InGameOverlayRendererAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/InGameOverlayRendererAccessor.java index b3b9e34..2fb5ee4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/InGameOverlayRendererAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/InGameOverlayRendererAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.hud; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.ScreenEffectRenderer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PlayerTabOverlayAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/PlayerTabOverlayAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PlayerTabOverlayAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/PlayerTabOverlayAccessor.java index 484fef8..24258d8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PlayerTabOverlayAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/PlayerTabOverlayAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.hud; import net.minecraft.client.gui.components.PlayerTabOverlay; import net.minecraft.network.chat.Component; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/TextIconButtonWidgetAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/TextIconButtonWidgetAccessor.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/TextIconButtonWidgetAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/TextIconButtonWidgetAccessor.java index 8c8b8c9..56f8188 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/TextIconButtonWidgetAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/hud/TextIconButtonWidgetAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.hud; import net.minecraft.client.gui.components.SpriteIconButton; import net.minecraft.client.gui.components.WidgetSprites; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemCooldownEntryAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/ItemCooldownEntryAccessor.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemCooldownEntryAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/ItemCooldownEntryAccessor.java index 6d52953..5d5b407 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemCooldownEntryAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/ItemCooldownEntryAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.inventory; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemCooldownManagerAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/ItemCooldownManagerAccessor.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemCooldownManagerAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/ItemCooldownManagerAccessor.java index 1092208..f7de969 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ItemCooldownManagerAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/ItemCooldownManagerAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.inventory; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemCooldowns; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PlayerInventoryAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/PlayerInventoryAccessor.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PlayerInventoryAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/PlayerInventoryAccessor.java index 221ceed..f3c2223 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PlayerInventoryAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/PlayerInventoryAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.inventory; import net.minecraft.world.entity.player.Inventory; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SlotAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/SlotAccessor.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SlotAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/SlotAccessor.java index 4f66b5b..192f016 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SlotAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/inventory/SlotAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.inventory; import net.minecraft.world.inventory.Slot; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/InputAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/InputAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/InputAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/InputAccessor.java index c24a89a..f386b87 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/InputAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/InputAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.misc; import net.minecraft.client.player.ClientInput; import net.minecraft.world.entity.player.Input; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/KeyMappingAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/KeyMappingAccessor.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/KeyMappingAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/KeyMappingAccessor.java index a66b3f4..90fa62c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/KeyMappingAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/KeyMappingAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.misc; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.KeyMapping; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/MinecraftAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/MinecraftAccessor.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/MinecraftAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/MinecraftAccessor.java index e3ee771..8ef87b8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/MinecraftAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/MinecraftAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.misc; import com.mojang.authlib.minecraft.UserApiService; import com.mojang.authlib.yggdrasil.FriendsService; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/MultiPlayerGameModeAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/MultiPlayerGameModeAccessor.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/MultiPlayerGameModeAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/MultiPlayerGameModeAccessor.java index 4dae442..c1a3f73 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/MultiPlayerGameModeAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/misc/MultiPlayerGameModeAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.misc; import net.minecraft.client.multiplayer.MultiPlayerGameMode; import net.minecraft.core.BlockPos; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientboundExplodePacketAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ClientboundExplodePacketAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientboundExplodePacketAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ClientboundExplodePacketAccessor.java index 396f7f7..80eefa5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientboundExplodePacketAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ClientboundExplodePacketAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.packet; import net.minecraft.network.protocol.game.ClientboundExplodePacket; import net.minecraft.world.phys.Vec3; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientboundSetEntityMotionPacketAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ClientboundSetEntityMotionPacketAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientboundSetEntityMotionPacketAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ClientboundSetEntityMotionPacketAccessor.java index 4207f35..5bc659a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientboundSetEntityMotionPacketAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ClientboundSetEntityMotionPacketAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.packet; import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.world.phys.Vec3; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ServerboundInteractPacketAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ServerboundInteractPacketAccessor.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ServerboundInteractPacketAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ServerboundInteractPacketAccessor.java index ddcbb59..4cc6dd6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ServerboundInteractPacketAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ServerboundInteractPacketAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.packet; import net.minecraft.network.protocol.game.ServerboundInteractPacket; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ServerboundMovePlayerPacketAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ServerboundMovePlayerPacketAccessor.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ServerboundMovePlayerPacketAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ServerboundMovePlayerPacketAccessor.java index c027869..b220a09 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ServerboundMovePlayerPacketAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/packet/ServerboundMovePlayerPacketAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.packet; import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PersistentProjectileEntityAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/projectile/PersistentProjectileEntityAccessor.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PersistentProjectileEntityAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/projectile/PersistentProjectileEntityAccessor.java index f3c11a6..5cfc193 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/PersistentProjectileEntityAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/projectile/PersistentProjectileEntityAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.projectile; import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityRenderManagerAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/EntityRenderManagerAccessor.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityRenderManagerAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/EntityRenderManagerAccessor.java index 52fc4e8..445d8e1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityRenderManagerAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/EntityRenderManagerAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.renderer; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.SubmitNodeCollector; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityRendererAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/EntityRendererAccessor.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityRendererAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/EntityRendererAccessor.java index 988638c..0ac82c2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EntityRendererAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/EntityRendererAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.renderer; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.state.EntityRenderState; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GameRendererAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/GameRendererAccessor.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GameRendererAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/GameRendererAccessor.java index 3c24fe9..ba41960 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/GameRendererAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/GameRendererAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.renderer; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.pipeline.RenderTarget; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/RenderLayerInvokerAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/RenderLayerInvokerAccessor.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/RenderLayerInvokerAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/RenderLayerInvokerAccessor.java index c67da08..730bb11 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/RenderLayerInvokerAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/renderer/RenderLayerInvokerAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.renderer; import net.minecraft.client.renderer.rendertype.RenderSetup; import net.minecraft.client.renderer.rendertype.RenderType; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EffectParticleEffectAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/EffectParticleEffectAccessor.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EffectParticleEffectAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/EffectParticleEffectAccessor.java index da80aa6..9867bc8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/EffectParticleEffectAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/EffectParticleEffectAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.state; import net.minecraft.core.particles.SpellParticleOption; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/FireworksComponentAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/FireworksComponentAccessor.java similarity index 89% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/FireworksComponentAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/FireworksComponentAccessor.java index fee347d..18c11de 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/FireworksComponentAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/FireworksComponentAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.state; import net.minecraft.world.item.component.Fireworks; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LivingEntityRenderStateAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/LivingEntityRenderStateAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LivingEntityRenderStateAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/LivingEntityRenderStateAccessor.java index de566fb..adac897 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LivingEntityRenderStateAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/state/LivingEntityRenderStateAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.state; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClickableWidgetAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/ClickableWidgetAccessor.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClickableWidgetAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/ClickableWidgetAccessor.java index 5734062..f1c6b55 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClickableWidgetAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/ClickableWidgetAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.widget; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.WidgetTooltipHolder; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/CyclingButtonWidgetAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/CyclingButtonWidgetAccessor.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/CyclingButtonWidgetAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/CyclingButtonWidgetAccessor.java index ba3d1a5..58f1902 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/CyclingButtonWidgetAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/CyclingButtonWidgetAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.widget; import net.minecraft.client.gui.components.CycleButton; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SliderWidgetAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/SliderWidgetAccessor.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SliderWidgetAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/SliderWidgetAccessor.java index b95e10c..9a77399 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/SliderWidgetAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/SliderWidgetAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.widget; import net.minecraft.client.gui.components.AbstractSliderButton; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/TextFieldWidgetAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/TextFieldWidgetAccessor.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/TextFieldWidgetAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/TextFieldWidgetAccessor.java index f19ef3b..6d2de6a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/TextFieldWidgetAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/widget/TextFieldWidgetAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.widget; import net.minecraft.client.gui.components.EditBox; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientLevelAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/ClientLevelAccessor.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientLevelAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/ClientLevelAccessor.java index 83b385e..30f53ca 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/ClientLevelAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/ClientLevelAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.world; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.prediction.BlockStatePredictionHandler; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LevelExtractorAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/LevelExtractorAccessor.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LevelExtractorAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/LevelExtractorAccessor.java index a4acd3e..773f43b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LevelExtractorAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/LevelExtractorAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.world; import net.minecraft.client.renderer.entity.state.EntityRenderState; import net.minecraft.client.renderer.extract.LevelExtractor; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LevelRendererAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/LevelRendererAccessor.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LevelRendererAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/LevelRendererAccessor.java index 058b874..74a3abf 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/LevelRendererAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/LevelRendererAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.world; import com.mojang.blaze3d.textures.GpuSampler; import net.minecraft.client.renderer.*; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/WorldAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/WorldAccessor.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/WorldAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/WorldAccessor.java index 3ac26fe..a8f4cbd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/WorldAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/accessors/world/WorldAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.accessors; +package dev.loki.lovisual.mixins.accessors.world; import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlDeviceBackendMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GlDeviceBackendMixin.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlDeviceBackendMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GlDeviceBackendMixin.java index 1becb85..f251136 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlDeviceBackendMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GlDeviceBackendMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.device; import com.mojang.blaze3d.opengl.DirectStateAccess; import com.mojang.blaze3d.opengl.FrameBufferCache; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GpuDeviceMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GpuDeviceMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GpuDeviceMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GpuDeviceMixin.java index cf74490..0d7625c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GpuDeviceMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GpuDeviceMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.device; import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.systems.GpuDevice; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GpuSurfaceMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GpuSurfaceMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GpuSurfaceMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GpuSurfaceMixin.java index 5d7a043..51a7dba 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GpuSurfaceMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/GpuSurfaceMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.device; import com.mojang.blaze3d.systems.GpuSurface; import com.mojang.blaze3d.systems.CommandEncoder; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanDeviceMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/VulkanDeviceMixin.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanDeviceMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/VulkanDeviceMixin.java index 54f2624..46947cd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanDeviceMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/device/VulkanDeviceMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.device; import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.pipeline.RenderPipeline; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BatchingRenderCommandQueueMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/BatchingRenderCommandQueueMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BatchingRenderCommandQueueMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/BatchingRenderCommandQueueMixin.java index 92c07e1..a26abfd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BatchingRenderCommandQueueMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/BatchingRenderCommandQueueMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.encoder; import net.minecraft.client.renderer.SubmitNodeCollection; import net.minecraft.util.Mth; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CommandEncoderMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/CommandEncoderMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CommandEncoderMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/CommandEncoderMixin.java index dfa1cd8..3ccf051 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CommandEncoderMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/CommandEncoderMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.encoder; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.RenderPass; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanCommandEncoderMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/VulkanCommandEncoderMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanCommandEncoderMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/VulkanCommandEncoderMixin.java index e9a2138..3ff222c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanCommandEncoderMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/encoder/VulkanCommandEncoderMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.encoder; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderPassBackend; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RenderPassMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/RenderPassMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RenderPassMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/RenderPassMixin.java index 751919e..8d12e96 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RenderPassMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/RenderPassMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.pipeline; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.RenderPass; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RenderPipelineMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/RenderPipelineMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RenderPipelineMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/RenderPipelineMixin.java index d956efc..a00ae6b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RenderPipelineMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/RenderPipelineMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.pipeline; import com.mojang.blaze3d.pipeline.RenderPipeline; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanRenderPassMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/VulkanRenderPassMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanRenderPassMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/VulkanRenderPassMixin.java index 03c216a..b3b4d0d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanRenderPassMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/VulkanRenderPassMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.pipeline; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.vulkan.VulkanRenderPass; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanRenderPipelineMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/VulkanRenderPipelineMixin.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanRenderPipelineMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/VulkanRenderPipelineMixin.java index 98a4d31..364b7a1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanRenderPipelineMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/pipeline/VulkanRenderPipelineMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.pipeline; import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.pipeline.RenderPipeline; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/DynamicUniformStorageMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/DynamicUniformStorageMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/DynamicUniformStorageMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/DynamicUniformStorageMixin.java index 1f80ef2..b1ae657 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/DynamicUniformStorageMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/DynamicUniformStorageMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.shader; import net.minecraft.client.renderer.DynamicUniformStorage; import org.slf4j.Logger; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlStateManagerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/GlStateManagerMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlStateManagerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/GlStateManagerMixin.java index 400ac06..a817002 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlStateManagerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/GlStateManagerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.shader; import com.mojang.blaze3d.opengl.GlStateManager; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ShaderLoaderMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/ShaderLoaderMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ShaderLoaderMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/ShaderLoaderMixin.java index c126b31..57747a0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ShaderLoaderMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/shader/ShaderLoaderMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.shader; import com.google.common.collect.ImmutableMap; import com.llamalad7.mixinextras.injector.ModifyReturnValue; @@ -23,8 +23,8 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import dev.loki.lovisual.mixins.accessors.ShaderLoaderDefinitionsAccessor; -import dev.loki.lovisual.mixins.accessors.ShaderSourceKeyAccessor; +import dev.loki.lovisual.mixins.accessors.blaze3d.ShaderLoaderDefinitionsAccessor; +import dev.loki.lovisual.mixins.accessors.blaze3d.ShaderSourceKeyAccessor; import dev.loki.lovisual.render.engine.shader.LoVisualShaderSources; import dev.loki.lovisual.render.iris.IrisCompatibilityGuards; import dev.loki.lovisual.util.logging.DebugLog; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BufferManagerDefaultBufferManagerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/BufferManagerDefaultBufferManagerMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BufferManagerDefaultBufferManagerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/BufferManagerDefaultBufferManagerMixin.java index 83881ff..79ef00a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BufferManagerDefaultBufferManagerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/BufferManagerDefaultBufferManagerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.texture; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlTextureMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/GlTextureMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlTextureMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/GlTextureMixin.java index d33288e..44d1075 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GlTextureMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/GlTextureMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.texture; import com.mojang.blaze3d.opengl.GlTexture; import org.spongepowered.asm.mixin.Final; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanGpuTextureMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/VulkanGpuTextureMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanGpuTextureMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/VulkanGpuTextureMixin.java index 29230d6..0208943 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanGpuTextureMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/VulkanGpuTextureMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.texture; import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.vulkan.VulkanDevice; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanGpuTextureViewMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/VulkanGpuTextureViewMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanGpuTextureViewMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/VulkanGpuTextureViewMixin.java index 3568dc7..c546e15 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/VulkanGpuTextureViewMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/blaze3d/texture/VulkanGpuTextureViewMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.blaze3d.texture; import com.mojang.blaze3d.GpuFormat; import com.mojang.blaze3d.vulkan.VulkanDevice; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemCooldownsMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemCooldownsMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemCooldownsMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemCooldownsMixin.java index b6e6a4a..154aa5d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemCooldownsMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemCooldownsMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.inventory; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemCooldowns; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.TPSSync; -import dev.loki.lovisual.mixins.accessors.ItemCooldownEntryAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.ItemCooldownEntryAccessor; import java.util.Iterator; import java.util.Map; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemMixin.java index 1a6bdb6..65ed37a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemStackMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemStackMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemStackMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemStackMixin.java index 1566e05..c583cc4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemStackMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/ItemStackMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.inventory; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerInventoryMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/PlayerInventoryMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerInventoryMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/PlayerInventoryMixin.java index 3a6ea82..64a9673 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerInventoryMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/inventory/PlayerInventoryMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.inventory; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/living/LivingEntityMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/living/LivingEntityMixin.java index d5d4612..69eacd2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/living/LivingEntityMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.living; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; @@ -39,12 +39,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.config.values.ItemCooldownRulesValue; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.PlayerJumpEvent; +import dev.loki.lovisual.events.impl.player.PlayerJumpEvent; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.PvpCooldowns; import dev.loki.lovisual.features.module.modules.combat.TPSSync; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; import dev.loki.lovisual.util.aiming.RotationManager; import dev.loki.lovisual.util.aiming.data.Rotation; import dev.loki.lovisual.util.aiming.features.MovementCorrection; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/living/LivingEntityRendererMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/living/LivingEntityRendererMixin.java index 4c36bfb..3cbf5dd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/living/LivingEntityRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.living; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; @@ -32,9 +32,9 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.InvisEsp; -import dev.loki.lovisual.features.module.modules.visuals.NameTags; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.esp.overlay.InvisEsp; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; import dev.loki.lovisual.render.SeeInvisiblesReveal; import dev.loki.lovisual.render.SeeInvisiblesState; import dev.loki.lovisual.render.ViewObstructionFadeContext; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractClientPlayerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/AbstractClientPlayerMixin.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractClientPlayerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/AbstractClientPlayerMixin.java index 123487d..ca9e6f0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractClientPlayerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/AbstractClientPlayerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.player; import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocalPlayerDropMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/LocalPlayerDropMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocalPlayerDropMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/LocalPlayerDropMixin.java index 1a6f1d9..bf65d20 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocalPlayerDropMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/LocalPlayerDropMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.player; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.player.LockSlot; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocalPlayerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/LocalPlayerMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocalPlayerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/LocalPlayerMixin.java index 116262e..88560fb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocalPlayerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/LocalPlayerMixin.java @@ -5,10 +5,16 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.player; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import dev.loki.lovisual.events.impl.*; +import dev.loki.lovisual.events.Events; +import dev.loki.lovisual.events.impl.input.SprintControlEvent; +import dev.loki.lovisual.events.impl.movement.MovementInputEvent; +import dev.loki.lovisual.events.impl.network.EventPostSync; +import dev.loki.lovisual.events.impl.network.EventSync; +import dev.loki.lovisual.events.impl.player.PostPlayerUpdateEvent; +import dev.loki.lovisual.events.impl.world.EventPushOutOfBlocks; import dev.loki.lovisual.util.combat.SprintController; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.player.ClientInput; @@ -33,18 +39,23 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.*; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; import dev.loki.lovisual.mixininterface.ILocalPlayer; -import dev.loki.lovisual.mixins.accessors.EntityAccessor; -import dev.loki.lovisual.mixins.accessors.InputAccessor; -import dev.loki.lovisual.mixins.accessors.LocalPlayerAccessor; +import dev.loki.lovisual.mixins.accessors.entity.EntityAccessor; +import dev.loki.lovisual.mixins.accessors.misc.InputAccessor; +import dev.loki.lovisual.mixins.accessors.entity.LocalPlayerAccessor; import dev.loki.lovisual.util.aiming.RotationManager; import dev.loki.lovisual.util.aiming.data.Rotation; import java.util.ArrayList; import java.util.List; +import dev.loki.lovisual.events.impl.input.SprintControlEvent; +import dev.loki.lovisual.events.impl.movement.MovementInputEvent; +import dev.loki.lovisual.events.impl.network.EventPostSync; +import dev.loki.lovisual.events.impl.network.EventSync; +import dev.loki.lovisual.events.impl.player.PostPlayerUpdateEvent; +import dev.loki.lovisual.events.impl.world.EventPushOutOfBlocks; @Mixin(LocalPlayer.class) public abstract class LocalPlayerMixin implements ILocalPlayer { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerEntityMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/PlayerEntityMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerEntityMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/PlayerEntityMixin.java index 711ef4c..eac6921 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerEntityMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/player/PlayerEntityMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.player; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; @@ -23,7 +23,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.PlayerSafeWalkEvent; +import dev.loki.lovisual.events.impl.movement.PlayerSafeWalkEvent; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.player.NoDelay; import dev.loki.lovisual.features.module.modules.combat.TPSSync; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/EntityMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/EntityMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/EntityMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/EntityMixin.java index 0e5e242..a3355ac 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/EntityMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/EntityMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.world; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.client.player.LocalPlayer; @@ -22,14 +22,14 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.PlayerMoveEvent; -import dev.loki.lovisual.events.impl.PlayerStepEvent; -import dev.loki.lovisual.events.impl.PlayerStepSuccessEvent; -import dev.loki.lovisual.events.impl.PlayerVelocityStrafe; +import dev.loki.lovisual.events.impl.player.PlayerMoveEvent; +import dev.loki.lovisual.events.impl.movement.PlayerStepEvent; +import dev.loki.lovisual.events.impl.movement.PlayerStepSuccessEvent; +import dev.loki.lovisual.events.impl.world.PlayerVelocityStrafe; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.mixininterface.IEntity; -import dev.loki.lovisual.mixins.accessors.EntityAccessor; -import dev.loki.lovisual.mixins.accessors.EntityInvoker; +import dev.loki.lovisual.mixins.accessors.entity.EntityAccessor; +import dev.loki.lovisual.mixins.accessors.entity.EntityInvoker; import dev.loki.lovisual.render.helpers.TrailPoint; import dev.loki.lovisual.util.aiming.RotationManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FireworkRocketEntityMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/FireworkRocketEntityMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FireworkRocketEntityMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/FireworkRocketEntityMixin.java index e6116ae..baaa433 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FireworkRocketEntityMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/FireworkRocketEntityMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.world; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.FireworkEvent; +import dev.loki.lovisual.events.impl.entity.FireworkEvent; import dev.loki.lovisual.util.aiming.RotationManager; import dev.loki.lovisual.util.aiming.data.Rotation; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ProjectileUtilMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/ProjectileUtilMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ProjectileUtilMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/ProjectileUtilMixin.java index 1dc1c9d..d25d8fa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ProjectileUtilMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/entity/world/ProjectileUtilMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.entity.world; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ChatComponentMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ChatComponentMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ChatComponentMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ChatComponentMixin.java index 85f03ff..7c20257 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ChatComponentMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ChatComponentMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.chat; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.command.CommandOutput; -import dev.loki.lovisual.features.gui.chat.BetterChatStoreManager; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStoreManager; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.misc.MessageFilter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ChatScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ChatScreenMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ChatScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ChatScreenMixin.java index 0169e2f..c380411 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ChatScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ChatScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.chat; import net.minecraft.client.gui.ActiveTextCollector; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -22,10 +22,10 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.features.command.CommandManager; -import dev.loki.lovisual.features.gui.chat.BetterChatRenderer; -import dev.loki.lovisual.features.gui.chat.BetterChatTabHandler; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatTabHandler; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; -import dev.loki.lovisual.mixins.accessors.ChatScreenSuggestorAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenSuggestorAccessor; import dev.loki.lovisual.Lifecycle; @Mixin(ChatScreen.class) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ContextualBarMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ContextualBarMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ContextualBarMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ContextualBarMixin.java index f1cab1e..93993d4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ContextualBarMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/chat/ContextualBarMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.chat; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractContainerScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractContainerScreenMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractContainerScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractContainerScreenMixin.java index fd5820f..9b7590a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractContainerScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractContainerScreenMixin.java @@ -5,12 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.core; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.misc.ItemScroller; -import dev.loki.lovisual.features.module.modules.visuals.Animations; -import dev.loki.lovisual.features.module.modules.visuals.ShulkerPreview; +import dev.loki.lovisual.features.module.modules.visuals.player.Animations; +import dev.loki.lovisual.features.module.modules.visuals.items.ShulkerPreview; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.world.inventory.Slot; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractSelectionListMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractSelectionListMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractSelectionListMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractSelectionListMixin.java index d2bbce7..d106b68 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractSelectionListMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractSelectionListMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.core; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.AbstractSelectionList; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractSliderButtonMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractSliderButtonMixin.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractSliderButtonMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractSliderButtonMixin.java index 9e8bbbf..c61b671 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractSliderButtonMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractSliderButtonMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.core; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.BetterButtons; -import dev.loki.lovisual.mixins.accessors.SliderWidgetAccessor; +import dev.loki.lovisual.mixins.accessors.widget.SliderWidgetAccessor; @Mixin(AbstractSliderButton.class) public abstract class AbstractSliderButtonMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractWidgetMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractWidgetMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractWidgetMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractWidgetMixin.java index 6a607c6..206ac60 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AbstractWidgetMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/core/AbstractWidgetMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.core; import net.minecraft.client.gui.components.AbstractWidget; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/JoinMultiplayerScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/multiplayer/JoinMultiplayerScreenMixin.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/JoinMultiplayerScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/multiplayer/JoinMultiplayerScreenMixin.java index c0ac444..3209654 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/JoinMultiplayerScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/multiplayer/JoinMultiplayerScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.multiplayer; import dev.loki.lovisual.features.theme.Theme; import dev.loki.lovisual.features.gui.hud.HudRenderUtil; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RecipeBookScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/multiplayer/RecipeBookScreenMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RecipeBookScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/multiplayer/RecipeBookScreenMixin.java index f758913..234cc3e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/RecipeBookScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/multiplayer/RecipeBookScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.multiplayer; import net.minecraft.client.gui.screens.inventory.AbstractRecipeBookScreen; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/GuiScreenMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/GuiScreenMixin.java index 0407bd5..ac56321 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/GuiScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.screens; import com.llamalad7.mixinextras.sugar.Local; import dev.loki.lovisual.features.module.ModuleManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PauseScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/PauseScreenMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PauseScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/PauseScreenMixin.java index eb0b219..f4582a0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PauseScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/PauseScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.screens; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.Button; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/ScreenMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/ScreenMixin.java index c6cae29..66917a1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/ScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.screens; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -24,7 +24,7 @@ import dev.loki.lovisual.features.command.CommandManager; import dev.loki.lovisual.features.command.CommandPrefix; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.BetterButtons; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.core.RenderPhase; import dev.loki.lovisual.render.engine.core.RenderPhaseScope; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/TitleScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/TitleScreenMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/TitleScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/TitleScreenMixin.java index 616cc06..0fd0eb8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/TitleScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/screens/TitleScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.screens; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ButtonWidgetTextMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/ButtonWidgetTextMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ButtonWidgetTextMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/ButtonWidgetTextMixin.java index 7a95a0a..1758ce6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ButtonWidgetTextMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/ButtonWidgetTextMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.widgets; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CycleButtonMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/CycleButtonMixin.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CycleButtonMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/CycleButtonMixin.java index 80dfea9..d303b8b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CycleButtonMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/CycleButtonMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.widgets; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.BetterButtons; -import dev.loki.lovisual.mixins.accessors.CyclingButtonWidgetAccessor; +import dev.loki.lovisual.mixins.accessors.widget.CyclingButtonWidgetAccessor; @Mixin(CycleButton.class) public abstract class CycleButtonMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SpriteIconButtonCenteredIconMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/SpriteIconButtonCenteredIconMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SpriteIconButtonCenteredIconMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/SpriteIconButtonCenteredIconMixin.java index 74b453e..8ec18ad 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SpriteIconButtonCenteredIconMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/SpriteIconButtonCenteredIconMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.widgets; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SpriteIconButtonTextAndIconMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/SpriteIconButtonTextAndIconMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SpriteIconButtonTextAndIconMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/SpriteIconButtonTextAndIconMixin.java index dd77ffa..0a861c4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SpriteIconButtonTextAndIconMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/gui/widgets/SpriteIconButtonTextAndIconMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.gui.widgets; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/DebugHudMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/DebugHudMixin.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/DebugHudMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/DebugHudMixin.java index 9a9a632..2be5f26 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/DebugHudMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/DebugHudMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud; import net.minecraft.client.gui.components.DebugScreenOverlay; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiGraphicsMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiGraphicsMixin.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiGraphicsMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiGraphicsMixin.java index a5edd75..e53ab1c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiGraphicsMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiGraphicsMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiMixin.java index 95e59c3..46270a7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; @@ -29,18 +29,18 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.PvpOverlayEvent; +import dev.loki.lovisual.events.impl.pvp.PvpOverlayEvent; +import dev.loki.lovisual.features.gui.hud.draggable.impl.panels.Scoreboard; import dev.loki.lovisual.features.gui.hud.draggable.DraggableHudElementRegistry; -import dev.loki.lovisual.features.gui.hud.draggable.impl.Potions; -import dev.loki.lovisual.features.gui.hud.draggable.impl.Scoreboard; +import dev.loki.lovisual.features.gui.hud.draggable.impl.status.Potions; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.SwapTooltip; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomBar; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomHealthBar; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.CustomHotbar; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.misc.MessageFilter; -import dev.loki.lovisual.features.module.modules.visuals.Crosshair; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.player.Crosshair; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; import dev.loki.lovisual.mixininterface.IGuiGraphics; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.core.RenderPhase; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiRendererMixin.java similarity index 99% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiRendererMixin.java index 780b469..00d8525 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GuiRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/GuiRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud; import com.mojang.blaze3d.ProjectionType; import com.mojang.blaze3d.buffers.GpuBufferSlice; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/NarratorManagerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/accessibility/NarratorManagerMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/NarratorManagerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/accessibility/NarratorManagerMixin.java index 0f54b9f..5b742cc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/NarratorManagerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/accessibility/NarratorManagerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.accessibility; import net.minecraft.client.GameNarrator; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/OptionsNarratorMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/accessibility/OptionsNarratorMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/OptionsNarratorMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/accessibility/OptionsNarratorMixin.java index 8a0be9a..4a2f9b7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/OptionsNarratorMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/accessibility/OptionsNarratorMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.accessibility; import net.minecraft.client.Minecraft; import net.minecraft.client.NarratorStatus; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BossHealthOverlayMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/BossHealthOverlayMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BossHealthOverlayMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/BossHealthOverlayMixin.java index 4c3c9dd..25e147f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BossHealthOverlayMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/BossHealthOverlayMixin.java @@ -5,11 +5,11 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.bars; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.CombatProtocolBossbarEvent; -import dev.loki.lovisual.mixins.accessors.BossHealthOverlayAccessor; +import dev.loki.lovisual.events.impl.pvp.CombatProtocolBossbarEvent; +import dev.loki.lovisual.mixins.accessors.hud.BossHealthOverlayAccessor; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.BossHealthOverlay; import net.minecraft.client.gui.components.LerpingBossEvent; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ExperienceBarMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/ExperienceBarMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ExperienceBarMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/ExperienceBarMixin.java index 77f78d2..e56efc6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ExperienceBarMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/ExperienceBarMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.bars; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/JumpBarMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/JumpBarMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/JumpBarMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/JumpBarMixin.java index 92405e0..3ddca70 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/JumpBarMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/JumpBarMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.bars; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocatorBarMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/LocatorBarMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocatorBarMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/LocatorBarMixin.java index 13ebe03..bf305b2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LocatorBarMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/bars/LocatorBarMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.bars; import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerTabOverlayMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tablist/PlayerTabOverlayMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerTabOverlayMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tablist/PlayerTabOverlayMixin.java index f328e12..383e24b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerTabOverlayMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tablist/PlayerTabOverlayMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.tablist; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.tab.CustomTabList; import net.minecraft.client.gui.GuiGraphicsExtractor; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ToastManagerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tooltips/ToastManagerMixin.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ToastManagerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tooltips/ToastManagerMixin.java index d67623b..90375d9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ToastManagerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tooltips/ToastManagerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.tooltips; import net.minecraft.client.gui.components.toasts.Toast; import net.minecraft.client.gui.components.toasts.ToastManager; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; @Mixin(ToastManager.class) public abstract class ToastManagerMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/TooltipRenderUtilMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tooltips/TooltipRenderUtilMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/TooltipRenderUtilMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tooltips/TooltipRenderUtilMixin.java index eed9ea2..2b9629b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/TooltipRenderUtilMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/hud/tooltips/TooltipRenderUtilMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.hud.tooltips; import com.mojang.blaze3d.pipeline.RenderPipeline; import net.minecraft.client.gui.GuiGraphicsExtractor; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyMappingMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyMappingMixin.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyMappingMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyMappingMixin.java index 94c5c6e..b70f4ce 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyMappingMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyMappingMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.input.keyboard; import net.minecraft.client.KeyMapping; import org.spongepowered.asm.mixin.Mixin; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.KeybindIsPressedEvent; +import dev.loki.lovisual.events.impl.input.KeybindIsPressedEvent; @Mixin(KeyMapping.class) public class KeyMappingMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyboardInputMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyboardInputMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyboardInputMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyboardInputMixin.java index bb55237..d73daca 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyboardInputMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyboardInputMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.input.keyboard; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.Minecraft; @@ -17,6 +17,7 @@ import dev.loki.lovisual.util.aiming.RotationManager; import dev.loki.lovisual.util.aiming.RotationUtil; import dev.loki.lovisual.util.aiming.data.Rotation; import dev.loki.lovisual.util.aiming.features.MovementCorrection; +import dev.loki.lovisual.mixins.input.mouse.InputMixin; @Mixin(KeyboardInput.class) public abstract class KeyboardInputMixin extends InputMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyboardMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyboardMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyboardMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyboardMixin.java index d25df5c..ea42afe 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/KeyboardMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/keyboard/KeyboardMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.input.keyboard; import com.mojang.blaze3d.platform.InputConstants; import dev.loki.lovisual.features.gui.clickgui.*; @@ -26,14 +26,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.KeyInputEvent; -import dev.loki.lovisual.features.gui.chat.BetterChatRenderer; -import dev.loki.lovisual.features.gui.chat.BetterChatSearch; -import dev.loki.lovisual.features.gui.chat.BetterChatStoreManager; -import dev.loki.lovisual.features.gui.clickgui.*; +import dev.loki.lovisual.events.impl.input.KeyInputEvent; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.messages.BetterChatSearch; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStoreManager; import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; import dev.loki.lovisual.features.module.ModuleManager; -import dev.loki.lovisual.mixins.accessors.ChatScreenAccessor; +import dev.loki.lovisual.mixins.accessors.chat.ChatScreenAccessor; import dev.loki.lovisual.Lifecycle; import dev.loki.lovisual.util.NarratorBlocker; import dev.loki.lovisual.util.input.KeyManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/InputMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/mouse/InputMixin.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/InputMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/mouse/InputMixin.java index 899b640..dcba269 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/InputMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/mouse/InputMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.input.mouse; import net.minecraft.client.player.ClientInput; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MouseMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/mouse/MouseMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MouseMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/mouse/MouseMixin.java index b80b721..b8a93db 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MouseMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/input/mouse/MouseMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.input.mouse; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import dev.loki.lovisual.features.gui.mainmenu.LoVisualProxyManagerScreen; @@ -22,7 +22,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import dev.loki.lovisual.features.gui.chat.BetterChatRenderer; +import dev.loki.lovisual.features.gui.chat.render.BetterChatRenderer; import dev.loki.lovisual.features.gui.clickgui.ClickGuiEditorScreen; import dev.loki.lovisual.features.gui.clickgui.ClickGuiPickerScreen; import dev.loki.lovisual.features.gui.clickgui.ClickGuiRenderer; @@ -31,8 +31,8 @@ import dev.loki.lovisual.features.gui.hud.nondraggable.StaticHudElementRegistry; import dev.loki.lovisual.features.gui.hud.nondraggable.impl.DynamicIsland; import dev.loki.lovisual.features.module.ModuleManager; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; -import dev.loki.lovisual.features.module.modules.visuals.Zoom; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.fx.Zoom; import dev.loki.lovisual.features.module.modules.player.ThirdPerson; import dev.loki.lovisual.Lifecycle; import dev.loki.lovisual.util.input.KeyManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisHandRendererAccessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisHandRendererAccessor.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisHandRendererAccessor.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisHandRendererAccessor.java index d6781df..3a0e05f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisHandRendererAccessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisHandRendererAccessor.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.hand; import net.irisshaders.iris.pathways.HandRenderer; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisHandRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisHandRendererMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisHandRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisHandRendererMixin.java index 226b2ce..4ccac57 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisHandRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisHandRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.hand; import net.irisshaders.iris.pathways.HandRenderer; import net.irisshaders.iris.pipeline.WorldRenderingPipeline; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisVanillaHandInteropMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisVanillaHandInteropMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisVanillaHandInteropMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisVanillaHandInteropMixin.java index 9f1a840..77e1b74 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisVanillaHandInteropMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/hand/IrisVanillaHandInteropMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.hand; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Chams; +import dev.loki.lovisual.features.module.modules.visuals.scene.Chams; import dev.loki.lovisual.render.iris.IrisRuntime; @Mixin(value = GameRenderer.class, priority = 900) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisIncludeProcessorMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/processor/IrisIncludeProcessorMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisIncludeProcessorMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/processor/IrisIncludeProcessorMixin.java index 4a41037..6e0416b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisIncludeProcessorMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/processor/IrisIncludeProcessorMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.processor; import com.google.common.collect.ImmutableList; import com.llamalad7.mixinextras.injector.ModifyReturnValue; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisCommonUniformsMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisCommonUniformsMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisCommonUniformsMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisCommonUniformsMixin.java index 5722b15..cb7e26e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisCommonUniformsMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisCommonUniformsMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.render; import net.irisshaders.iris.gl.uniform.UniformHolder; import net.irisshaders.iris.shaderpack.IdMap; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisGameRendererInteropMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisGameRendererInteropMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisGameRendererInteropMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisGameRendererInteropMixin.java index af01fb6..67e441d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisGameRendererInteropMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisGameRendererInteropMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.render; import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.GameRenderer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisRenderingPipelineFinalizeMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisRenderingPipelineFinalizeMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisRenderingPipelineFinalizeMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisRenderingPipelineFinalizeMixin.java index f62658b..ba9578f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisRenderingPipelineFinalizeMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisRenderingPipelineFinalizeMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.render; import net.irisshaders.iris.pipeline.IrisRenderingPipeline; import net.irisshaders.iris.targets.RenderTargets; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisShaderPackLoadMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisShaderPackLoadMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisShaderPackLoadMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisShaderPackLoadMixin.java index 4185378..812f6fd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/IrisShaderPackLoadMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/iris/render/IrisShaderPackLoadMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.iris; +package dev.loki.lovisual.mixins.iris.render; import net.irisshaders.iris.Iris; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientPacketListenerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/ClientPacketListenerMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientPacketListenerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/ClientPacketListenerMixin.java index b6bd571..7935f51 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientPacketListenerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/ClientPacketListenerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.network.game; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -23,14 +23,14 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.config.values.ItemCooldownRulesValue; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.PvpChatEvent; -import dev.loki.lovisual.events.impl.PvpTabEvent; +import dev.loki.lovisual.events.impl.pvp.PvpChatEvent; +import dev.loki.lovisual.events.impl.pvp.PvpTabEvent; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.PvpCooldowns; import dev.loki.lovisual.features.module.modules.misc.NoSound; -import dev.loki.lovisual.features.module.modules.visuals.SoundESP; -import dev.loki.lovisual.features.module.modules.visuals.TotemFX; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.esp.audio.SoundESP; +import dev.loki.lovisual.features.module.modules.visuals.fx.TotemFX; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; import dev.loki.lovisual.features.relations.StaffTracker; import dev.loki.lovisual.util.logging.DebugLog; import dev.loki.lovisual.util.logging.ServerDumpUtil; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MultiPlayerGameModeMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/MultiPlayerGameModeMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MultiPlayerGameModeMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/MultiPlayerGameModeMixin.java index ed294f1..e076f7d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MultiPlayerGameModeMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/MultiPlayerGameModeMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.network.game; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.Minecraft; @@ -26,16 +26,16 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.config.values.ItemCooldownRulesValue; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.AttackEntityEvent; -import dev.loki.lovisual.events.impl.EventBreakBlock; -import dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud; +import dev.loki.lovisual.events.impl.entity.AttackEntityEvent; +import dev.loki.lovisual.events.impl.world.EventBreakBlock; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.NoFriendDamage; import dev.loki.lovisual.features.module.modules.combat.PvpCooldowns; import dev.loki.lovisual.features.module.modules.misc.HitSounds; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; -import dev.loki.lovisual.features.module.modules.visuals.HitEffect; -import dev.loki.lovisual.mixins.accessors.WorldAccessor; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.effects.HitEffect; +import dev.loki.lovisual.mixins.accessors.world.WorldAccessor; import dev.loki.lovisual.util.player.inventory.InventorySwap; import dev.loki.lovisual.util.combat.ReachMeter; import dev.loki.lovisual.util.target.TargetManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MultiPlayerGameModeThrowMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/MultiPlayerGameModeThrowMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MultiPlayerGameModeThrowMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/MultiPlayerGameModeThrowMixin.java index d2bf8ec..e24a177 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MultiPlayerGameModeThrowMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/MultiPlayerGameModeThrowMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.network.game; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.player.LockSlot; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerInfoMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/PlayerInfoMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerInfoMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/PlayerInfoMixin.java index f3e0e61..055c036 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PlayerInfoMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/game/PlayerInfoMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.network.game; import com.mojang.authlib.GameProfile; import net.minecraft.client.multiplayer.PlayerInfo; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientCommonPacketListenerImplMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ClientCommonPacketListenerImplMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientCommonPacketListenerImplMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ClientCommonPacketListenerImplMixin.java index 2a0423b..c0b5692 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientCommonPacketListenerImplMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ClientCommonPacketListenerImplMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.network.packet; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.misc.NoServerPack; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ConnectionMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ConnectionMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ConnectionMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ConnectionMixin.java index 58e5434..30a8f8d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ConnectionMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ConnectionMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.network.packet; import io.netty.channel.ChannelPipeline; import net.minecraft.network.Connection; @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.PacketEvent; +import dev.loki.lovisual.events.impl.network.PacketEvent; import dev.loki.lovisual.util.network.BlinkManager; import dev.loki.lovisual.util.proxy.ProxyNettyInstaller; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ServerboundUseItemPacketMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ServerboundUseItemPacketMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ServerboundUseItemPacketMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ServerboundUseItemPacketMixin.java index 4993ff7..b9752e1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ServerboundUseItemPacketMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/network/packet/ServerboundUseItemPacketMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.network.packet; import net.minecraft.network.protocol.game.ServerboundUseItemPacket; import net.minecraft.world.InteractionHand; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemEntityRenderStateMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/ItemEntityRenderStateMixin.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemEntityRenderStateMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/ItemEntityRenderStateMixin.java index 0cf9621..4097df5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemEntityRenderStateMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/ItemEntityRenderStateMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.entity; import net.minecraft.client.renderer.entity.state.ItemEntityRenderState; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemEntityRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/ItemEntityRendererMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemEntityRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/ItemEntityRendererMixin.java index 2bcfde6..8385bf4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemEntityRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/ItemEntityRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.entity; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; @@ -25,7 +25,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.ItemPhysic; +import dev.loki.lovisual.features.module.modules.visuals.scene.ItemPhysic; import dev.loki.lovisual.mixininterface.IItemEntityRenderState; import net.minecraft.util.Mth; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityRenderStateMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/LivingEntityRenderStateMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityRenderStateMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/LivingEntityRenderStateMixin.java index 240a240..ed701ca 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LivingEntityRenderStateMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/entity/LivingEntityRenderStateMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.entity; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AtmosphericFogEnvironmentMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/AtmosphericFogEnvironmentMixin.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AtmosphericFogEnvironmentMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/AtmosphericFogEnvironmentMixin.java index f0bf7b9..fcc8f13 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/AtmosphericFogEnvironmentMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/AtmosphericFogEnvironmentMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.fog; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; @@ -18,8 +18,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.AtmoDawnFog; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.AtmoDawnFog; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; @Mixin(value = AtmosphericFogEnvironment.class, priority = 1200) public class AtmosphericFogEnvironmentMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FogRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/FogRendererMixin.java similarity index 94% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FogRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/FogRendererMixin.java index 3c4b912..fb61e3c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FogRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/FogRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.fog; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -19,8 +19,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.AtmoDawnFog; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.AtmoDawnFog; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; @Mixin(value = FogRenderer.class, priority = 1200) public class FogRendererMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LavaFogModifierMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/LavaFogModifierMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LavaFogModifierMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/LavaFogModifierMixin.java index 94b3f87..aaa7d0f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LavaFogModifierMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/LavaFogModifierMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.fog; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; @Mixin(value = LavaFogEnvironment.class, priority = 1200) public class LavaFogModifierMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/WaterFogEnvironmentMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/WaterFogEnvironmentMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/WaterFogEnvironmentMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/WaterFogEnvironmentMixin.java index ecc5368..af33f3c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/WaterFogEnvironmentMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fog/WaterFogEnvironmentMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.fog; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; @Mixin(value = WaterFogEnvironment.class, priority = 1200) public class WaterFogEnvironmentMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PowderSnowFogModifierMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fogmod/PowderSnowFogModifierMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PowderSnowFogModifierMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fogmod/PowderSnowFogModifierMixin.java index 2f94d1b..73f9b19 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/PowderSnowFogModifierMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/fogmod/PowderSnowFogModifierMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.fogmod; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; @Mixin(value = PowderedSnowFogEnvironment.class, priority = 1200) public class PowderSnowFogModifierMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/EquipmentLayerRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/EquipmentLayerRendererMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/EquipmentLayerRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/EquipmentLayerRendererMixin.java index e864a2a..86707b0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/EquipmentLayerRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/EquipmentLayerRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.item; import net.minecraft.client.renderer.entity.layers.EquipmentLayerRenderer; import net.minecraft.client.renderer.rendertype.RenderType; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemFeatureRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemFeatureRendererMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemFeatureRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemFeatureRendererMixin.java index 0e62e2d..0a4b48b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemFeatureRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemFeatureRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.item; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemInHandAlwaysVisibleMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemInHandAlwaysVisibleMixin.java new file mode 100644 index 0000000..3ec3c41 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemInHandAlwaysVisibleMixin.java @@ -0,0 +1,50 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.mixins.render.item; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import dev.loki.lovisual.features.module.Modules; +import dev.loki.lovisual.features.module.modules.visuals.items.AlwaysVisibleHand; +import net.minecraft.client.renderer.ItemInHandRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * Ваниль прячет руку с предметом, пока игрок использует другой предмет + * (еда/щит/натянутый лук): evaluateWhichHandsToRender возвращает + * RENDER_OFF_HAND_ONLY/RENDER_MAIN_HAND_ONLY. Вместо подмены + * package-private enum переопределяем чтение его флагов в + * submitHandsWithItems — по настройке модуля AlwaysVisibleHand. + */ +@Mixin(ItemInHandRenderer.class) +public abstract class ItemInHandAlwaysVisibleMixin { + + @ModifyExpressionValue( + method = "submitHandsWithItems", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/renderer/ItemInHandRenderer$HandRenderSelection;renderMainHand:Z" + ) + ) + private boolean lovisual$alwaysRenderMainHand(boolean vanillaDecision) { + AlwaysVisibleHand module = Modules.get(AlwaysVisibleHand.class); + return module == null ? vanillaDecision : module.renderMainHand(vanillaDecision); + } + + @ModifyExpressionValue( + method = "submitHandsWithItems", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/client/renderer/ItemInHandRenderer$HandRenderSelection;renderOffHand:Z" + ) + ) + private boolean lovisual$alwaysRenderOffHand(boolean vanillaDecision) { + AlwaysVisibleHand module = Modules.get(AlwaysVisibleHand.class); + return module == null ? vanillaDecision : module.renderOffHand(vanillaDecision); + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemInHandRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemInHandRendererMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemInHandRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemInHandRendererMixin.java index df57fae..80d43ca 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ItemInHandRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/item/ItemInHandRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.item; import com.mojang.blaze3d.vertex.PoseStack; import net.fabricmc.api.EnvType; @@ -26,11 +26,12 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.HoldMyItems; +import dev.loki.lovisual.features.module.modules.visuals.items.HoldMyItems; import dev.loki.lovisual.util.animation.hand.HandDynamics; -import dev.loki.lovisual.features.module.modules.visuals.ViewModel; +import dev.loki.lovisual.features.module.modules.visuals.camera.ViewModel; import dev.loki.lovisual.util.animation.EquipProgressComposer; import dev.loki.lovisual.util.animation.hand.HandAnimState; +import dev.loki.lovisual.features.module.modules.visuals.scene.Chams; @Environment(EnvType.CLIENT) @Mixin(ItemInHandRenderer.class) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CameraMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/CameraMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CameraMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/CameraMixin.java index f883b82..d18b5e7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/CameraMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/CameraMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.level; import net.minecraft.client.Camera; import net.minecraft.client.CameraType; @@ -29,10 +29,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.player.ThirdPerson; -import dev.loki.lovisual.features.module.modules.visuals.CameraClip; +import dev.loki.lovisual.features.module.modules.visuals.camera.CameraClip; import dev.loki.lovisual.features.module.modules.visuals.FovControl; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; -import dev.loki.lovisual.features.module.modules.visuals.Zoom; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.fx.Zoom; @Mixin(Camera.class) public abstract class CameraMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/LevelRendererMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/LevelRendererMixin.java index 4a40cde..3427aef 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/LevelRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.level; import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; @@ -35,12 +35,12 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.BlockHighlight; -import dev.loki.lovisual.features.module.modules.visuals.ReimaginedVisual; -import dev.loki.lovisual.features.module.modules.visuals.ShaderSky; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; -import dev.loki.lovisual.mixins.accessors.GameRendererAccessor; -import dev.loki.lovisual.mixins.accessors.LevelRendererAccessor; +import dev.loki.lovisual.features.module.modules.visuals.scene.BlockHighlight; +import dev.loki.lovisual.features.module.modules.visuals.scene.ReimaginedVisual; +import dev.loki.lovisual.features.module.modules.visuals.weather.ShaderSky; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; +import dev.loki.lovisual.mixins.accessors.renderer.GameRendererAccessor; +import dev.loki.lovisual.mixins.accessors.world.LevelRendererAccessor; import dev.loki.lovisual.render.engine.core.LoVisualWorldMatrices; import dev.loki.lovisual.render.engine.depth.PreTranslucentDepth; import dev.loki.lovisual.render.engine.depth.WorldSceneDepth; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ParticleManagerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/ParticleManagerMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ParticleManagerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/ParticleManagerMixin.java index 25ef62a..57f2d8c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ParticleManagerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/ParticleManagerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.level; import net.minecraft.client.particle.ParticleEngine; import net.minecraft.core.particles.ParticleOptions; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SkyRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/SkyRendererMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SkyRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/SkyRendererMixin.java index 3100715..e972b39 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SkyRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/level/SkyRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.level; import com.mojang.blaze3d.pipeline.RenderTarget; import net.minecraft.client.renderer.SkyRenderer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LightmapMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/light/LightmapMixin.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LightmapMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/light/LightmapMixin.java index a4534cb..7e7bb55 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LightmapMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/light/LightmapMixin.java @@ -5,14 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.light; import net.minecraft.client.renderer.Lightmap; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.LightmapEvent; +import dev.loki.lovisual.events.impl.render.LightmapEvent; import dev.loki.lovisual.render.engine.light.LightmapState; @Mixin(Lightmap.class) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LightmapRenderStateExtractorMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/light/LightmapRenderStateExtractorMixin.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LightmapRenderStateExtractorMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/light/LightmapRenderStateExtractorMixin.java index c31c0a1..0d4048e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LightmapRenderStateExtractorMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/light/LightmapRenderStateExtractorMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.light; import net.minecraft.client.renderer.LightmapRenderStateExtractor; import net.minecraft.client.renderer.state.LightmapRenderState; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.LightmapModifyEvent; +import dev.loki.lovisual.events.impl.render.LightmapModifyEvent; import dev.loki.lovisual.render.engine.light.LightmapState; @Mixin(LightmapRenderStateExtractor.class) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GameRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/GameRendererMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GameRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/GameRendererMixin.java index 602a8cc..5883f9c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GameRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/GameRendererMixin.java @@ -5,13 +5,12 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.main; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.vertex.PoseStack; -import dev.loki.lovisual.features.module.modules.visuals.*; import dev.loki.lovisual.render.engine.postprocess.PostProcessPass; import dev.loki.lovisual.util.screen.ClientScreen; import net.minecraft.client.Camera; @@ -48,9 +47,8 @@ import dev.loki.lovisual.api.v0.render.LoVisualRenderStage; import dev.loki.lovisual.features.module.ModuleManager; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.WorldPhase; -import dev.loki.lovisual.features.module.modules.visuals.*; -import dev.loki.lovisual.mixins.accessors.GameRendererAccessor; -import dev.loki.lovisual.mixins.accessors.LocalPlayerAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.GameRendererAccessor; +import dev.loki.lovisual.mixins.accessors.entity.LocalPlayerAccessor; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.core.LoVisualWorldMatrices; @@ -76,6 +74,12 @@ import dev.loki.lovisual.render.iris.IrisFinalizedSceneRenderer; import dev.loki.lovisual.render.iris.IrisCompatibilityGuards; import dev.loki.lovisual.render.iris.IrisRuntime; import dev.loki.lovisual.util.logging.DebugLog; +import dev.loki.lovisual.features.module.modules.visuals.camera.AspectRatio; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.camera.ViewModel; +import dev.loki.lovisual.features.module.modules.visuals.scene.Chams; +import dev.loki.lovisual.features.module.modules.visuals.scene.ReimaginedVisual; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; @Mixin(GameRenderer.class) public abstract class GameRendererMixin implements IrisFinalizedSceneRenderer { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GameRendererViewEffectsMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/GameRendererViewEffectsMixin.java similarity index 88% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GameRendererViewEffectsMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/GameRendererViewEffectsMixin.java index 36e1d9c..0cc05a8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/GameRendererViewEffectsMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/GameRendererViewEffectsMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.main; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.GameRenderer; @@ -15,8 +15,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; @Mixin(GameRenderer.class) public abstract class GameRendererViewEffectsMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MinecraftMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/MinecraftMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MinecraftMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/MinecraftMixin.java index 146e226..0977de9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/MinecraftMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/MinecraftMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.main; import com.mojang.blaze3d.systems.GpuSurface; import dev.loki.lovisual.features.module.modules.combat.*; @@ -33,13 +33,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.CrosshairTargetUpdateEvent; -import dev.loki.lovisual.features.gui.chat.BetterChatStoreManager; +import dev.loki.lovisual.events.impl.entity.CrosshairTargetUpdateEvent; +import dev.loki.lovisual.features.gui.chat.model.BetterChatStoreManager; import dev.loki.lovisual.features.module.ModuleManager; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.player.NoDelay; import dev.loki.lovisual.features.module.modules.player.NoInteract; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; import dev.loki.lovisual.features.relations.StaffTracker; import dev.loki.lovisual.render.helpers.TickDelta; import dev.loki.lovisual.util.combat.AntiBotTracker; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ScreenEffectRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/ScreenEffectRendererMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ScreenEffectRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/ScreenEffectRendererMixin.java index d554f78..1c1a899 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ScreenEffectRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/main/ScreenEffectRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.main; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; @@ -18,8 +18,8 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; -import dev.loki.lovisual.mixins.accessors.InGameOverlayRendererAccessor; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; +import dev.loki.lovisual.mixins.accessors.hud.InGameOverlayRendererAccessor; @Mixin(ScreenEffectRenderer.class) public abstract class ScreenEffectRendererMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LibraryMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/sound/LibraryMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LibraryMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/sound/LibraryMixin.java index c82bbd6..49d8ed0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LibraryMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/sound/LibraryMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.sound; import com.mojang.blaze3d.audio.DeviceList; import com.mojang.blaze3d.audio.Library; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SoundEngineMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/sound/SoundEngineMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SoundEngineMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/sound/SoundEngineMixin.java index 60d02e1..aba4a09 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SoundEngineMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/sound/SoundEngineMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.sound; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.misc.NoSound; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FontManagerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/text/FontManagerMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FontManagerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/text/FontManagerMixin.java index a03798f..51f5c79 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FontManagerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/render/text/FontManagerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.render.text; import com.google.gson.JsonParseException; import net.minecraft.client.gui.font.FontManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/ClientLoginNetworkHandlerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/ClientLoginNetworkHandlerMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/ClientLoginNetworkHandlerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/ClientLoginNetworkHandlerMixin.java index d2d1ade..12fbb73 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/ClientLoginNetworkHandlerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/ClientLoginNetworkHandlerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.security; +package dev.loki.lovisual.mixins.security.net; import net.minecraft.client.multiplayer.ClientHandshakePacketListenerImpl; import net.minecraft.network.Connection; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/GameOptionsMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/GameOptionsMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/GameOptionsMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/GameOptionsMixin.java index 049c201..89d336d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/GameOptionsMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/GameOptionsMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.security; +package dev.loki.lovisual.mixins.security.net; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/NetworkUtilsMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/NetworkUtilsMixin.java similarity index 98% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/NetworkUtilsMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/NetworkUtilsMixin.java index 23d792a..27cc71a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/NetworkUtilsMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/net/NetworkUtilsMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.security; +package dev.loki.lovisual.mixins.security.net; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/AbstractSignEditScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/AbstractSignEditScreenMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/AbstractSignEditScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/AbstractSignEditScreenMixin.java index 15dffea..340f2cb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/AbstractSignEditScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/AbstractSignEditScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.security; +package dev.loki.lovisual.mixins.security.text; import net.minecraft.client.gui.screens.inventory.AbstractSignEditScreen; import net.minecraft.network.chat.Component; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/AnvilScreenMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/AnvilScreenMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/AnvilScreenMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/AnvilScreenMixin.java index 0252a66..f6fc4eb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/AnvilScreenMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/AnvilScreenMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.security; +package dev.loki.lovisual.mixins.security.text; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/TranslatableTextContentMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/TranslatableTextContentMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/TranslatableTextContentMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/TranslatableTextContentMixin.java index 136bd8d..6c318f6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/TranslatableTextContentMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/TranslatableTextContentMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.security; +package dev.loki.lovisual.mixins.security.text; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/TranslationStorageMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/TranslationStorageMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/TranslationStorageMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/TranslationStorageMixin.java index dff7759..6014ba5 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/TranslationStorageMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/security/text/TranslationStorageMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.security; +package dev.loki.lovisual.mixins.security.text; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumBlockRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumBlockRendererMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumBlockRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumBlockRendererMixin.java index 478e3c1..96684a4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumBlockRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumBlockRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.sodium; +package dev.loki.lovisual.mixins.sodium.terrain; import com.llamalad7.mixinextras.sugar.Local; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumChunkMeshFormatsMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumChunkMeshFormatsMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumChunkMeshFormatsMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumChunkMeshFormatsMixin.java index 940a661..13b4ff4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumChunkMeshFormatsMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumChunkMeshFormatsMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.sodium; +package dev.loki.lovisual.mixins.sodium.terrain; import dev.loki.lovisual.render.sodium.terrain.LoVisualChunkMeshFormats; import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkMeshFormats; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumShaderChunkRendererMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumShaderChunkRendererMixin.java similarity index 97% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumShaderChunkRendererMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumShaderChunkRendererMixin.java index 0505256..fcd2a98 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumShaderChunkRendererMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/terrain/SodiumShaderChunkRendererMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.sodium; +package dev.loki.lovisual.mixins.sodium.terrain; import net.minecraft.resources.Identifier; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumChunkVertexMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumChunkVertexMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumChunkVertexMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumChunkVertexMixin.java index 7140727..80bf7a6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumChunkVertexMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumChunkVertexMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.sodium; +package dev.loki.lovisual.mixins.sodium.vertex; import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkVertexEncoder; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumVertexConsumerTrackerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumVertexConsumerTrackerMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumVertexConsumerTrackerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumVertexConsumerTrackerMixin.java index c879a9b..a40319a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumVertexConsumerTrackerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumVertexConsumerTrackerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.sodium; +package dev.loki.lovisual.mixins.sodium.vertex; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumWorldRendererFreecamMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumWorldRendererFreecamMixin.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumWorldRendererFreecamMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumWorldRendererFreecamMixin.java index c677c0d..3851914 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/SodiumWorldRendererFreecamMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/sodium/vertex/SodiumWorldRendererFreecamMixin.java @@ -5,14 +5,14 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins.sodium; +package dev.loki.lovisual.mixins.sodium.vertex; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; @Pseudo @Mixin(targets = "net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer", remap = false) diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BlockCollisionSpliteratorMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/BlockCollisionSpliteratorMixin.java similarity index 92% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BlockCollisionSpliteratorMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/BlockCollisionSpliteratorMixin.java index d42683f..86593ac 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BlockCollisionSpliteratorMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/BlockCollisionSpliteratorMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.block; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockCollisions; @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.EventCollision; +import dev.loki.lovisual.events.impl.world.EventCollision; @Mixin(value = BlockCollisions.class, priority = 800) public abstract class BlockCollisionSpliteratorMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BlockMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/BlockMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BlockMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/BlockMixin.java index da5e384..dbd4b38 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/BlockMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/BlockMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.block; import net.minecraft.world.level.block.Block; import org.spongepowered.asm.mixin.Mixin; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/HoneyBlockMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/HoneyBlockMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/HoneyBlockMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/HoneyBlockMixin.java index 9433d27..825b2aa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/HoneyBlockMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/HoneyBlockMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.block; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.HoneyBlock; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SlimeBlockMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/SlimeBlockMixin.java similarity index 95% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SlimeBlockMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/SlimeBlockMixin.java index f9d6197..4a44703 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/SlimeBlockMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/block/SlimeBlockMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.block; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FlowingFluidMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/fluid/FlowingFluidMixin.java similarity index 96% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FlowingFluidMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/fluid/FlowingFluidMixin.java index d05940e..1f5dfa6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/FlowingFluidMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/fluid/FlowingFluidMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.fluid; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientClockManagerMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/ClientClockManagerMixin.java similarity index 90% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientClockManagerMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/ClientClockManagerMixin.java index e5b6ea8..9a920bb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientClockManagerMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/ClientClockManagerMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.level; import net.minecraft.client.ClientClockManager; import net.minecraft.core.Holder; @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; @Mixin(ClientClockManager.class) public abstract class ClientClockManagerMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientLevelMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/ClientLevelMixin.java similarity index 93% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientLevelMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/ClientLevelMixin.java index af88e09..3dd81c0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/ClientLevelMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/ClientLevelMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.level; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.particles.ItemParticleOption; @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; @Mixin(ClientLevel.class) public abstract class ClientLevelMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelExtractorMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/LevelExtractorMixin.java similarity index 91% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelExtractorMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/LevelExtractorMixin.java index 45536c7..64b4744 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelExtractorMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/LevelExtractorMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.level; import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; @@ -20,8 +20,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; -import dev.loki.lovisual.mixins.accessors.LevelExtractorAccessor; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.mixins.accessors.world.LevelExtractorAccessor; @Mixin(LevelExtractor.class) public abstract class LevelExtractorMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelMixin.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/LevelMixin.java similarity index 86% rename from combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelMixin.java rename to combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/LevelMixin.java index 0f6df53..6fe5716 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/LevelMixin.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/mixins/world/level/LevelMixin.java @@ -5,7 +5,7 @@ * Licensed under the GNU General Public License v3.0. */ -package dev.loki.lovisual.mixins; +package dev.loki.lovisual.mixins.world.level; import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; @@ -13,8 +13,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks.WeatherMode; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks.WeatherMode; @Mixin(Level.class) public abstract class LevelMixin { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/LoVisualEntityRenderTypes.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/LoVisualEntityRenderTypes.java index dd9bb8b..d10c203 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/LoVisualEntityRenderTypes.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/LoVisualEntityRenderTypes.java @@ -18,7 +18,7 @@ import net.minecraft.client.renderer.BindGroupLayouts; import net.minecraft.client.renderer.rendertype.RenderSetup; import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.resources.Identifier; -import dev.loki.lovisual.mixins.accessors.RenderLayerInvokerAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.RenderLayerInvokerAccessor; import java.util.List; import java.util.Map; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/SeeInvisiblesReveal.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/SeeInvisiblesReveal.java index b2cc78d..33a0a66 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/SeeInvisiblesReveal.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/SeeInvisiblesReveal.java @@ -8,7 +8,7 @@ package dev.loki.lovisual.render; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.InvisEsp; +import dev.loki.lovisual.features.module.modules.visuals.esp.overlay.InvisEsp; import dev.loki.lovisual.render.iris.IrisRuntime; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/effects/NetherPortalRiftPass.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/effects/NetherPortalRiftPass.java index 34c3224..03268eb 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/effects/NetherPortalRiftPass.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/effects/NetherPortalRiftPass.java @@ -12,7 +12,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.PortalProcessor; import net.minecraft.world.level.block.Blocks; -import dev.loki.lovisual.mixins.accessors.EntityAccessor; +import dev.loki.lovisual.mixins.accessors.entity.EntityAccessor; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.postprocess.PostProcessManager; import dev.loki.lovisual.render.engine.postprocess.PostProcessPass; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/animation/AnimatedGlyphSlot.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/animation/AnimatedGlyphSlot.java index 7384494..7a79396 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/animation/AnimatedGlyphSlot.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/animation/AnimatedGlyphSlot.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.render.engine.animation; -final class AnimatedGlyphSlot { +public final class AnimatedGlyphSlot { private char current; private char previous; private long animationStartMs; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/compat/immediatelyfast/ImmediatelyFastBridge.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/compat/immediatelyfast/ImmediatelyFastBridge.java index e02efbe..9d407c9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/compat/immediatelyfast/ImmediatelyFastBridge.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/compat/immediatelyfast/ImmediatelyFastBridge.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.render.engine.compat.immediatelyfast; import net.raphimc.immediatelyfast.ImmediatelyFast; import net.raphimc.immediatelyfast.feature.core.ImmediatelyFastConfig; -enum ImmediatelyFastBridge { +public enum ImmediatelyFastBridge { ; static ImmediatelyFastRuntimeSnapshot snapshot(String version) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/core/policy/VanillaWorldFogProvider.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/core/policy/VanillaWorldFogProvider.java index 90333f7..f88617c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/core/policy/VanillaWorldFogProvider.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/core/policy/VanillaWorldFogProvider.java @@ -11,7 +11,7 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.fog.FogRenderer; import org.jetbrains.annotations.Nullable; -import dev.loki.lovisual.mixins.accessors.GameRendererAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.GameRendererAccessor; /** * Vanilla world fog provider used by world pass compilation until Stage 8 pipeline metadata is global. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/msaa/MsaaWorldTarget.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/msaa/MsaaWorldTarget.java index 5f9b143..1f2b0b2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/msaa/MsaaWorldTarget.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/msaa/MsaaWorldTarget.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.render.engine.msaa; import com.mojang.blaze3d.pipeline.RenderTarget; import net.minecraft.client.Minecraft; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; -import dev.loki.lovisual.mixins.accessors.GameRendererAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.GameRendererAccessor; import dev.loki.lovisual.util.logging.DebugLog; public enum MsaaWorldTarget { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/LoVisualRenderPipelines.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/LoVisualRenderPipelines.java index 0b4021b..448bcf9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/LoVisualRenderPipelines.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/LoVisualRenderPipelines.java @@ -22,6 +22,12 @@ import dev.loki.lovisual.render.engine.rhi.pipeline.RenderPipelineRegistry; import dev.loki.lovisual.render.engine.shader.LoVisualShaderSources; import dev.loki.lovisual.render.engine.vertex.LoVisualVertexFormats; import dev.loki.lovisual.util.logging.DebugLog; +import dev.loki.lovisual.features.module.modules.visuals.effects.KillEffect; +import dev.loki.lovisual.features.module.modules.visuals.esp.ESP; +import dev.loki.lovisual.features.module.modules.visuals.fx.MotionBlur; +import dev.loki.lovisual.features.module.modules.visuals.fx.PostFX; +import dev.loki.lovisual.features.module.modules.visuals.scene.BlockHighlight; +import dev.loki.lovisual.features.module.modules.visuals.weather.ShaderSky; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; @@ -136,6 +142,15 @@ public enum LoVisualRenderPipelines { public static final Identifier SHADER_MENU_BACKGROUND_AURORA_FRAG = shader("menu_background_aurora.frag"); public static final Identifier SHADER_SKY_SHADER_SKY_FRAG = shader("sky_shader_sky.frag"); public static final Identifier SHADER_SKY_SHADER_WATER_FRAG = shader("sky_shader_water.frag"); + // KillEffect procedural beam shaders + public static final Identifier SHADER_KILL_EFFECT_PORTAL_FRAG = shader("kill_effect_portal.frag"); + public static final Identifier SHADER_KILL_EFFECT_TORNADO_FRAG = shader("kill_effect_tornado.frag"); + // BlockHighlight procedural shader outlines + public static final Identifier SHADER_BLOCK_HIGHLIGHT_WATERCAUSTIC_FRAG = shader("block_highlight_watercaustic.frag"); + public static final Identifier SHADER_BLOCK_HIGHLIGHT_SCANLINES_FRAG = shader("block_highlight_scanlines.frag"); + public static final Identifier SHADER_BLOCK_HIGHLIGHT_HOLOGRAM_FRAG = shader("block_highlight_hologram.frag"); + // SkyShader nebula + public static final Identifier SHADER_SKY_SHADER_NEBULA_FRAG = shader("sky_shader_nebula.frag"); public static final Identifier SHADER_SKY_SHADER_CAUSTIC_FRAG = shader("sky_shader_caustic.frag"); private static final List PIPELINES = new ArrayList<>(); @@ -230,6 +245,7 @@ public enum LoVisualRenderPipelines { public static final RenderPipeline SKY_SHADER_SKY = add(ScreenPipelines.screen("sky_shader_sky", SHADER_SKY_SHADER_SKY_FRAG, "SkyShader")); public static final RenderPipeline SKY_SHADER_WATER = add(ScreenPipelines.screen("sky_shader_water", SHADER_SKY_SHADER_WATER_FRAG, "SkyShader")); public static final RenderPipeline SKY_SHADER_CAUSTIC = add(ScreenPipelines.screen("sky_shader_caustic", SHADER_SKY_SHADER_CAUSTIC_FRAG, "SkyShader")); + public static final RenderPipeline SKY_SHADER_NEBULA = add(ScreenPipelines.screen("sky_shader_nebula", SHADER_SKY_SHADER_NEBULA_FRAG, "SkyShaderData")); /** Fullscreen main menu background (pos2). */ public static final RenderPipeline MENU_BACKGROUND_AURORA = add(ScreenPipelines.screen("menu_background_aurora", SHADER_MENU_BACKGROUND_AURORA_FRAG, "MenuBackground")); /** Fullscreen postprocess (pos2). */ @@ -253,6 +269,21 @@ public enum LoVisualRenderPipelines { public static final RenderPipeline SHADER_ESP_SMOKE = add(ScreenPipelines.screen("shader_esp_smoke", SHADER_ESP_SMOKE_FRAG, "ShaderEspSmoke", "u_Texture")); /** No depth test; additive; textured-color triangles with procedural sun shading. */ public static final RenderPipeline WORLD_SKY_SUN = add(WorldPipelines.skySun("world_sky_sun")); + /** No depth test; additive; KillEffect "Portal" procedural beam shader. */ + public static final RenderPipeline WORLD_KILL_EFFECT_PORTAL = + add(WorldPipelines.killEffectBeam("world_kill_effect_portal", SHADER_KILL_EFFECT_PORTAL_FRAG)); + /** No depth test; additive; KillEffect "Tornado" procedural beam shader. */ + public static final RenderPipeline WORLD_KILL_EFFECT_TORNADO = + add(WorldPipelines.killEffectBeam("world_kill_effect_tornado", SHADER_KILL_EFFECT_TORNADO_FRAG)); + /** No depth test; additive; BlockHighlight "WaterCaustic" shader outline. */ + public static final RenderPipeline WORLD_BLOCK_HIGHLIGHT_WATERCAUSTIC = + add(WorldPipelines.waterHighlight("world_block_highlight_watercaustic", SHADER_BLOCK_HIGHLIGHT_WATERCAUSTIC_FRAG)); + /** No depth test; additive; BlockHighlight "ScanLines" shader outline. */ + public static final RenderPipeline WORLD_BLOCK_HIGHLIGHT_SCANLINES = + add(WorldPipelines.waterHighlight("world_block_highlight_scanlines", SHADER_BLOCK_HIGHLIGHT_SCANLINES_FRAG)); + /** No depth test; additive; BlockHighlight "Hologram" shader outline. */ + public static final RenderPipeline WORLD_BLOCK_HIGHLIGHT_HOLOGRAM = + add(WorldPipelines.waterHighlight("world_block_highlight_hologram", SHADER_BLOCK_HIGHLIGHT_HOLOGRAM_FRAG)); /** Fullscreen nether portal rift (pos2). */ public static final RenderPipeline PORTAL_RIFT = add(ScreenPipelines.screen("portal_rift", SHADER_PORTAL_RIFT_FRAG, "Heat", "u_Texture")); /** Fullscreen sleep overlay (pos2). */ diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/pipelines/WorldPipelines.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/pipelines/WorldPipelines.java index 1bb0e5d..085fde6 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/pipelines/WorldPipelines.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/pipeline/pipelines/WorldPipelines.java @@ -15,6 +15,8 @@ import com.mojang.blaze3d.vertex.DefaultVertexFormat; import dev.loki.lovisual.render.engine.pipeline.ExtendedRenderPipelineBuilder; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.vertex.LoVisualVertexFormats; +import dev.loki.lovisual.features.module.modules.visuals.effects.KillEffect; +import dev.loki.lovisual.features.module.modules.visuals.scene.BlockHighlight; import net.minecraft.resources.Identifier; /** @@ -116,6 +118,28 @@ public final class WorldPipelines { .withUniform("SkySun", UniformType.UNIFORM_BUFFER), false, PipelineTemplates.ADDITIVE, false); } + /** + * Textured triangles with a procedural KillEffect beam shader ("KillEffectBeam" uniform), additive. + */ + public static RenderPipeline killEffectBeam(String name, Identifier fragmentShader) { + return PipelineTemplates.finish(base(name) + .withVertexFormat(DefaultVertexFormat.POSITION_TEX_COLOR, PrimitiveTopology.TRIANGLES) + .withVertexShader(LoVisualRenderPipelines.SHADER_POS_TEX_COLOR_VERT) + .withFragmentShader(fragmentShader) + .withUniform("KillEffectBeam", UniformType.UNIFORM_BUFFER), false, PipelineTemplates.ADDITIVE, false); + } + + /** + * Textured triangles with a procedural BlockHighlight shader outline ("WaterData" uniform), additive. + */ + public static RenderPipeline waterHighlight(String name, Identifier fragmentShader) { + return PipelineTemplates.finish(base(name) + .withVertexFormat(DefaultVertexFormat.POSITION_TEX_COLOR, PrimitiveTopology.TRIANGLES) + .withVertexShader(LoVisualRenderPipelines.SHADER_POS_TEX_COLOR_VERT) + .withFragmentShader(fragmentShader) + .withUniform("WaterData", UniformType.UNIFORM_BUFFER), false, PipelineTemplates.ADDITIVE, false); + } + /** * Textured skybox with vanilla sky/fog blending ("SkyboxShader" uniform + fog snippet). */ diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/SkyShaderRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/SkyShaderRenderer.java index 46a770a..8459f3f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/SkyShaderRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/SkyShaderRenderer.java @@ -16,12 +16,14 @@ import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.renderer.FullScreenRenderer; import dev.loki.lovisual.render.engine.renderer.MeshRenderer; +import dev.loki.lovisual.render.engine.uniform.impl.SkyShaderNebulaUniforms; import dev.loki.lovisual.render.engine.uniform.impl.SkyShaderUniforms; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ProjectionMatrixBuffer; import net.minecraft.util.Util; import org.joml.Matrix4f; +import org.joml.Quaternionf; /** * Fullscreen SkyShader pass: sky / water / caustic procedural GLSL effect drawn behind the world, @@ -31,7 +33,7 @@ public enum SkyShaderRenderer { ; public enum Mode { - SKY, WATER, CAUSTIC + SKY, WATER, CAUSTIC, NEBULA } private static final Matrix4f IDENTITY = new Matrix4f(); @@ -112,4 +114,81 @@ public enum SkyShaderRenderer { } } } + + /** Domain-warped nebula sky (quaternion-based ray dir instead of yaw/pitch). */ + public static void renderNebula(Minecraft mc, float speed, float intensity, float alpha, + int nebColor1Rgb, int nebColor2Rgb, int starColorRgb) { + if (mc == null || mc.level == null || mc.player == null) return; + + RenderTarget fb = mc.gameRenderer.mainRenderTarget(); + if (fb == null) return; + + int w = mc.getWindow().getWidth(); + int h = mc.getWindow().getHeight(); + if (w <= 0 || h <= 0) return; + + FullScreenRenderer.ensureInit(); + + if (startMillis < 0) startMillis = Util.getMillis(); + float time = (Util.getMillis() - startMillis) / 1000.0f; + + Camera cam = mc.gameRenderer.mainCamera(); + Quaternionf rot = cam.rotation(); + float fov = (float) mc.options.fov().get().intValue(); + + SkyShaderNebulaUniforms.update(w, h, time, speed, intensity, alpha, fov, + rot.x(), rot.y(), rot.z(), rot.w(), + channelR(nebColor1Rgb), channelG(nebColor1Rgb), channelB(nebColor1Rgb), + channelR(nebColor2Rgb), channelG(nebColor2Rgb), channelB(nebColor2Rgb), + channelR(starColorRgb), channelG(starColorRgb), channelB(starColorRgb)); + + var mv = RenderSystem.getModelViewStack(); + boolean pushedModelView = false; + + GpuBufferSlice prevProj = RenderSystem.getProjectionMatrixBuffer(); + ProjectionType prevProjType = RenderSystem.getProjectionType(); + Matrix4f prevMeshProjection = MeshRenderer.projection(); + boolean prevRendering3D = RenderState.rendering3D; + + try { + mv.pushMatrix(); + pushedModelView = true; + mv.identity(); + + if (projection == null) { + projection = new ProjectionMatrixBuffer("lovisual-sky-shader-projection"); + } + Matrix4f proj = IDENTITY.identity(); + RenderSystem.setProjectionMatrix(projection.getBuffer(proj), ProjectionType.PERSPECTIVE); + MeshRenderer.setProjection(proj); + RenderState.rendering3D = false; + + FullScreenRenderer.begin("LoVisual Fullscreen Pass") + .attachment(fb) + .pipeline(LoVisualRenderPipelines.SKY_SHADER_NEBULA) + .uniform("SkyShaderData", SkyShaderNebulaUniforms.get()) + .end(); + } finally { + if (pushedModelView) { + mv.popMatrix(); + } + MeshRenderer.setProjection(prevMeshProjection); + RenderState.rendering3D = prevRendering3D; + if (prevProj != null && prevProjType != null) { + RenderSystem.setProjectionMatrix(prevProj, prevProjType); + } + } + } + + private static float channelR(int rgb) { + return ((rgb >>> 16) & 0xFF) / 255f; + } + + private static float channelG(int rgb) { + return ((rgb >>> 8) & 0xFF) / 255f; + } + + private static float channelB(int rgb) { + return (rgb & 0xFF) / 255f; + } } diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/graph/PostProcessGraphResources.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/graph/PostProcessGraphResources.java index 21a0d90..5fad012 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/graph/PostProcessGraphResources.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/postprocess/graph/PostProcessGraphResources.java @@ -13,7 +13,7 @@ import com.mojang.blaze3d.textures.GpuTextureView; import net.minecraft.client.Minecraft; import org.jetbrains.annotations.Nullable; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.ReimaginedVisual; +import dev.loki.lovisual.features.module.modules.visuals.scene.ReimaginedVisual; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.depth.PreTranslucentDepth; import dev.loki.lovisual.render.engine.depth.WorldSceneDepth; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmContributors.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmContributors.java index 4a203b4..819488c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmContributors.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmContributors.java @@ -7,8 +7,8 @@ package dev.loki.lovisual.render.engine.prewarm; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.RenderPrewarmCollectEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.RenderPrewarmCollectEvent; import dev.loki.lovisual.features.gui.clickgui.layout.screen.modules.ModulesMenuCategory; import dev.loki.lovisual.features.gui.clickgui.layout.screen.settings.MenuScreen; import dev.loki.lovisual.features.gui.hud.AbstractHudElement; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmManager.java index 8b76ad1..0765462 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/prewarm/RenderPrewarmManager.java @@ -8,7 +8,7 @@ package dev.loki.lovisual.render.engine.prewarm; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.RenderPrewarmCollectEvent; +import dev.loki.lovisual.events.impl.render.RenderPrewarmCollectEvent; import dev.loki.lovisual.features.gui.hud.script.HudScriptLayouts; import dev.loki.lovisual.render.engine.svg.SvgMsdfRegistry; import dev.loki.lovisual.render.engine.text.Fonts; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/profiler/ProfilerLog.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/profiler/ProfilerLog.java index 57ef656..8135c59 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/profiler/ProfilerLog.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/profiler/ProfilerLog.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.render.engine.profiler; import dev.loki.lovisual.util.logging.DebugLog; -enum ProfilerLog { +public enum ProfilerLog { ; static void info(String message, Object... args) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/RenderWarp.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/RenderWarp.java index 5b01c32..bee2a4c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/RenderWarp.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/RenderWarp.java @@ -6,6 +6,7 @@ */ package dev.loki.lovisual.render.engine.renderer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.metrics.Coordinates; /** * Screen-space UI warp. Coordinates stay in the same 2D HUD space; only emitted vertices are remapped. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNode.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNode.java index 03e28d4..77b7328 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNode.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNode.java @@ -13,6 +13,7 @@ import dev.loki.lovisual.render.engine.renderer.ui.runtime.style.UiStyle; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; +import dev.loki.lovisual.events.Event; /** * Live runtime node produced by reconciliation. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNodeSpec.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNodeSpec.java index 3ba11db..e7c05ba 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNodeSpec.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/core/UiNodeSpec.java @@ -14,6 +14,7 @@ import dev.loki.lovisual.render.engine.renderer.ui.runtime.style.UiStyle; import java.util.Arrays; import java.util.List; import java.util.Map; +import dev.loki.lovisual.events.Event; /** * Immutable declarative description of a node. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiPrimitiveRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiPrimitiveRenderer.java index a063813..35a18cd 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiPrimitiveRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiPrimitiveRenderer.java @@ -9,7 +9,6 @@ package dev.loki.lovisual.render.engine.renderer.ui.runtime.render; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.renderer.ui.draw.*; -import dev.loki.lovisual.render.engine.renderer.ui.draw.*; import dev.loki.lovisual.render.engine.renderer.ui.runtime.core.UiBounds; import dev.loki.lovisual.render.engine.renderer.ui.runtime.core.UiNode; import dev.loki.lovisual.render.engine.renderer.ui.runtime.core.UiProps; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiTextEffectRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiTextEffectRenderer.java index f91a727..de3ee8c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiTextEffectRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/render/UiTextEffectRenderer.java @@ -11,7 +11,7 @@ import dev.loki.lovisual.render.engine.text.Font; import dev.loki.lovisual.render.engine.text.TextEffectSpec; import dev.loki.lovisual.render.engine.text.TextRenderer; -enum UiTextEffectRenderer { +public enum UiTextEffectRenderer { ; static boolean render(TextRenderer renderer, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetNativeResourceLoader.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetNativeResourceLoader.java index 3b1cf42..7cbc1a9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetNativeResourceLoader.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetNativeResourceLoader.java @@ -24,7 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * /javet/natives. If the resource bundle is not present, Javet's own classpath * loader is left untouched so dev-runtime native jars can still work. */ -enum JavetNativeResourceLoader { +public enum JavetNativeResourceLoader { ; private static final AtomicBoolean INSTALLED = new AtomicBoolean(false); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngine.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngine.java index a926a98..d6c65f8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngine.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngine.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; -final class JavetUiScriptEngine implements UiScriptEngine { +public final class JavetUiScriptEngine implements UiScriptEngine { private static final String BOOTSTRAP_SOURCE = """ globalThis.global = globalThis; globalThis.console = globalThis.console || { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptModuleTransform.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptModuleTransform.java index 6b45a65..d1deba9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptModuleTransform.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptModuleTransform.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.render.engine.renderer.ui.runtime.script; -enum UiScriptModuleTransform { +public enum UiScriptModuleTransform { ; static String toExecutableScript(String source) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptRuntimeSource.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptRuntimeSource.java index c571fdf..7aefb4f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptRuntimeSource.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiScriptRuntimeSource.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.render.engine.renderer.ui.runtime.script; -enum UiScriptRuntimeSource { +public enum UiScriptRuntimeSource { ; static final String UI_FACTORY = """ (() => { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiTypeScriptStripper.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiTypeScriptStripper.java index 55d4779..61ba629 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiTypeScriptStripper.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/UiTypeScriptStripper.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.render.engine.renderer.ui.runtime.script; -enum UiTypeScriptStripper { +public enum UiTypeScriptStripper { ; static String strip(String source) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/SodiumGlBackend.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/SodiumGlBackend.java index dff4700..105aca7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/SodiumGlBackend.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/SodiumGlBackend.java @@ -19,7 +19,6 @@ import org.joml.Vector4f; import org.joml.Vector4fc; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.profiler.RenderCostProfiler; -import dev.loki.lovisual.render.engine.rhi.*; import dev.loki.lovisual.render.engine.rhi.backend.gl.clip.GlStencilShapeClipBackend; import dev.loki.lovisual.render.engine.rhi.backend.gl.state.SodiumGlPipelineStateBackend; import dev.loki.lovisual.render.engine.rhi.blit.Blaze3dTextureBlitter; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/GlBackendAccess.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/GlBackendAccess.java index 82304db..57a923b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/GlBackendAccess.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/GlBackendAccess.java @@ -12,7 +12,7 @@ import com.mojang.blaze3d.systems.GpuDeviceBackend; import com.mojang.blaze3d.systems.RenderSystem; import org.jetbrains.annotations.Nullable; import dev.loki.lovisual.mixininterface.IGlBackendInfo; -import dev.loki.lovisual.mixins.accessors.GpuDeviceAccessor; +import dev.loki.lovisual.mixins.accessors.blaze3d.GpuDeviceAccessor; public enum GlBackendAccess { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/clip/GlStencilFramebufferSupport.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/clip/GlStencilFramebufferSupport.java index d88de22..5a91f4b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/clip/GlStencilFramebufferSupport.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/gl/clip/GlStencilFramebufferSupport.java @@ -35,7 +35,7 @@ import java.util.Map; * depth-stencil renderbuffer for the active clip scope and restores the original attachments when * shape clipping is disabled.

*/ -final class GlStencilFramebufferSupport { +public final class GlStencilFramebufferSupport { /** * GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT is not a core framebuffer attachment pname and * Mesa/X11 reports it through KHR_debug as GL_INVALID_ENUM. Do not use attachment-level sample diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/vulkan/LoVisualVulkanBackend.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/vulkan/LoVisualVulkanBackend.java index 50a1846..a636f4c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/vulkan/LoVisualVulkanBackend.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/backend/vulkan/LoVisualVulkanBackend.java @@ -19,7 +19,6 @@ import org.joml.Vector4f; import org.joml.Vector4fc; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.profiler.RenderCostProfiler; -import dev.loki.lovisual.render.engine.rhi.*; import dev.loki.lovisual.render.engine.rhi.backend.vulkan.clip.VulkanShapeClipBackend; import dev.loki.lovisual.render.engine.rhi.backend.vulkan.msaa.VulkanMsaaControl; import dev.loki.lovisual.render.engine.rhi.backend.vulkan.state.VulkanPipelineStateBackend; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/msaa/SodiumGlMsaaControl.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/msaa/SodiumGlMsaaControl.java index 3627aac..59b608e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/msaa/SodiumGlMsaaControl.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/msaa/SodiumGlMsaaControl.java @@ -21,7 +21,7 @@ import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL32; import dev.loki.lovisual.mixininterface.IGlBackendInfo; import dev.loki.lovisual.mixininterface.IMsaaTexture; -import dev.loki.lovisual.mixins.accessors.GlTextureInvoker; +import dev.loki.lovisual.mixins.accessors.blaze3d.GlTextureInvoker; import dev.loki.lovisual.render.engine.msaa.MsaaTextureRegistry; import dev.loki.lovisual.render.engine.msaa.MsaaWorldTarget; import dev.loki.lovisual.render.engine.rhi.backend.gl.GlBackendAccess; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dFrameFence.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dFrameFence.java index d424657..0a12720 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dFrameFence.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dFrameFence.java @@ -15,7 +15,7 @@ import com.mojang.blaze3d.buffers.GpuFence; * The important part is that the backend creates one GPU fence per presented frame, not one fence per * allocation/batch. Arenas hold references to this wrapper and release them when their memory is reusable. */ -final class Blaze3dFrameFence implements AutoCloseable { +public final class Blaze3dFrameFence implements AutoCloseable { private GpuFence fence; private int references = 1; private boolean completed; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshAllocation.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshAllocation.java index 5c5e3bf..69c603b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshAllocation.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshAllocation.java @@ -11,7 +11,7 @@ import dev.loki.lovisual.render.engine.rhi.GpuMeshHandle; import dev.loki.lovisual.render.engine.rhi.MeshOwnership; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; -record Blaze3dMeshAllocation(Blaze3dMeshArena arena, +public record Blaze3dMeshAllocation(Blaze3dMeshArena arena, int vertexOffsetBytes, int indexOffsetBytes, int vertexBytes, diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshArena.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshArena.java index e8afa14..ecd1e75 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshArena.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/rhi/upload/Blaze3dMeshArena.java @@ -21,7 +21,7 @@ import java.util.function.Supplier; * A frame can use several arenas. Persistent arenas are reused after their frame fence completes. Spill arenas * are allocated only when persistent arenas are exhausted or a single mesh is larger than the configured ring. */ -final class Blaze3dMeshArena implements AutoCloseable { +public final class Blaze3dMeshArena implements AutoCloseable { private final String name; private final boolean persistent; private final int vertexCapacity; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgPathParser.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgPathParser.java index 2d04ce1..9680dd7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgPathParser.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgPathParser.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.render.engine.svg; import java.awt.geom.Path2D; -final class SvgPathParser { +public final class SvgPathParser { private static final double EPS = 1e-7; private final String data; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyle.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyle.java index a77944a..2cd3644 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyle.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyle.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.Nullable; import java.awt.*; -final class SvgStyle { +public final class SvgStyle { @Nullable Integer fill; @Nullable Integer stroke; float strokeWidth; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyleUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyleUtil.java index 59e695c..8c9fc03 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyleUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/svg/SvgStyleUtil.java @@ -16,7 +16,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -enum SvgStyleUtil { +public enum SvgStyleUtil { ; private static final Map NAMED_COLORS = namedColors(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/text/TextRenderSystem.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/text/TextRenderSystem.java index c56f56a..b0b39e9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/text/TextRenderSystem.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/text/TextRenderSystem.java @@ -17,7 +17,6 @@ import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.rhi.GpuMeshHandle; import dev.loki.lovisual.render.engine.rhi.RhiDrawCommand; import dev.loki.lovisual.render.engine.rhi.resource.GlyphAtlasManager; -import dev.loki.lovisual.render.engine.text.backend.*; import dev.loki.lovisual.render.engine.uniform.MeshBuilder; import dev.loki.lovisual.render.engine.uniform.impl.MsdfTextUniforms; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/HandChamsUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/HandChamsUniforms.java index 3018563..daed279 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/HandChamsUniforms.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/HandChamsUniforms.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.rhi.uniform.LoVisualUniformAllocator; +import dev.loki.lovisual.features.module.modules.visuals.scene.Chams; import java.nio.ByteBuffer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/KillEffectBeamUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/KillEffectBeamUniforms.java new file mode 100644 index 0000000..b0262ac --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/KillEffectBeamUniforms.java @@ -0,0 +1,65 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.render.engine.uniform.impl; + +import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.buffers.Std140Builder; +import com.mojang.blaze3d.buffers.Std140SizeCalculator; +import dev.loki.lovisual.render.engine.rhi.uniform.LoVisualUniformAllocator; +import dev.loki.lovisual.features.module.modules.visuals.effects.KillEffect; + +/** Uniform buffer for the KillEffect "Portal"/"Tornado" world-space beam shaders. */ +public enum KillEffectBeamUniforms { + ; + public static final int SIZE = new Std140SizeCalculator() + .putVec4() + .putVec4() + .get(); + + private static final Data DATA = new Data(); + private static final String UNIFORM_NAME = "LoVisual - KillEffectBeam UBO"; + private static final int EXPECTED_WRITES_PER_FRAME = 8; + + public static void update(float time, float progress, float intensity, float size, + float colorR, float colorG, float colorB, float colorA) { + DATA.params0[0] = time; + DATA.params0[1] = progress; + DATA.params0[2] = intensity; + DATA.params0[3] = size; + + DATA.color[0] = colorR; + DATA.color[1] = colorG; + DATA.color[2] = colorB; + DATA.color[3] = colorA; + + LoVisualRenderSystem.uniforms().write(UNIFORM_NAME, SIZE, EXPECTED_WRITES_PER_FRAME, DATA); + } + + public static GpuBufferSlice get() { + return LoVisualRenderSystem.uniforms().current(UNIFORM_NAME); + } + + private static final class Data implements LoVisualUniformAllocator.UniformWriter { + private final float[] params0 = new float[4]; + private final float[] color = new float[4]; + + @Override + public void write(java.nio.ByteBuffer buffer) { + Std140Builder.intoBuffer(buffer) + .putFloat(params0[0]).putFloat(params0[1]).putFloat(params0[2]).putFloat(params0[3]) + .putFloat(color[0]).putFloat(color[1]).putFloat(color[2]).putFloat(color[3]); + } + + @Override + public boolean equals(Object o) { + return false; + } + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/MotionBlurUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/MotionBlurUniforms.java index 28870ee..cc2ad1a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/MotionBlurUniforms.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/MotionBlurUniforms.java @@ -13,6 +13,7 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import dev.loki.lovisual.render.engine.rhi.uniform.LoVisualUniformAllocator; +import dev.loki.lovisual.features.module.modules.visuals.fx.MotionBlur; public enum MotionBlurUniforms { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/PostFXUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/PostFXUniforms.java index 7c344ba..524e39b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/PostFXUniforms.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/PostFXUniforms.java @@ -13,6 +13,7 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import dev.loki.lovisual.render.engine.rhi.uniform.LoVisualUniformAllocator; +import dev.loki.lovisual.features.module.modules.visuals.fx.PostFX; public enum PostFXUniforms { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/ShaderSkyUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/ShaderSkyUniforms.java index 8022b78..70735e2 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/ShaderSkyUniforms.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/ShaderSkyUniforms.java @@ -5,6 +5,7 @@ import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.rhi.uniform.LoVisualUniformAllocator; +import dev.loki.lovisual.features.module.modules.visuals.weather.ShaderSky; import java.nio.ByteBuffer; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/SkyShaderNebulaUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/SkyShaderNebulaUniforms.java new file mode 100644 index 0000000..0559730 --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/SkyShaderNebulaUniforms.java @@ -0,0 +1,105 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.render.engine.uniform.impl; + +import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.buffers.Std140Builder; +import com.mojang.blaze3d.buffers.Std140SizeCalculator; +import dev.loki.lovisual.render.engine.rhi.uniform.LoVisualUniformAllocator; + +/** Uniform buffer for the SkyShader "Nebula" fullscreen mode (domain-warped fbm sky). */ +public enum SkyShaderNebulaUniforms { + ; + public static final int SIZE = new Std140SizeCalculator() + .putVec4().putVec4().putVec4().putVec4().putVec4() + .putVec4().putVec4().putVec4().putVec4().putVec4() + .get(); + + private static final Data DATA = new Data(); + private static final String UNIFORM_NAME = "LoVisual - SkyShaderNebula UBO"; + private static final int EXPECTED_WRITES_PER_FRAME = 4; + + public static void update(float width, float height, float time, float speed, + float intensity, float alpha, float fov, + float qx, float qy, float qz, float qw, + float neb1R, float neb1G, float neb1B, + float neb2R, float neb2G, float neb2B, + float starR, float starG, float starB) { + DATA.resolution[0] = width; + DATA.resolution[1] = height; + DATA.resolution[2] = time; + DATA.resolution[3] = speed; + + DATA.settings[0] = intensity; + DATA.settings[1] = alpha; + DATA.settings[2] = fov; + DATA.settings[3] = 0f; + + DATA.cameraDir[0] = qx; + DATA.cameraDir[1] = qy; + DATA.cameraDir[2] = qz; + DATA.cameraDir[3] = qw; + + DATA.nebColor1[0] = neb1R; + DATA.nebColor1[1] = neb1G; + DATA.nebColor1[2] = neb1B; + DATA.nebColor1[3] = 1f; + + DATA.nebColor2[0] = neb2R; + DATA.nebColor2[1] = neb2G; + DATA.nebColor2[2] = neb2B; + DATA.nebColor2[3] = 1f; + + DATA.starColor[0] = starR; + DATA.starColor[1] = starG; + DATA.starColor[2] = starB; + DATA.starColor[3] = 1f; + + LoVisualRenderSystem.uniforms().write(UNIFORM_NAME, SIZE, EXPECTED_WRITES_PER_FRAME, DATA); + } + + public static GpuBufferSlice get() { + return LoVisualRenderSystem.uniforms().current(UNIFORM_NAME); + } + + private static final class Data implements LoVisualUniformAllocator.UniformWriter { + private final float[] resolution = new float[4]; + private final float[] settings = new float[4]; + private final float[] cameraDir = new float[4]; + private final float[] zero = new float[4]; + private final float[] nebColor1 = new float[4]; + private final float[] nebColor2 = new float[4]; + private final float[] starColor = new float[4]; + + @Override + public void write(java.nio.ByteBuffer buffer) { + Std140Builder builder = Std140Builder.intoBuffer(buffer); + putVec4(builder, resolution); + putVec4(builder, settings); + putVec4(builder, cameraDir); + putVec4(builder, zero); // SkyZenith (unused by shader, reserved) + putVec4(builder, zero); // SkyHorizon (unused by shader, reserved) + putVec4(builder, nebColor1); + putVec4(builder, nebColor2); + putVec4(builder, starColor); + putVec4(builder, zero); // FogColor (unused by shader, reserved) + putVec4(builder, zero); // FogRange (unused by shader, reserved) + } + + private static void putVec4(Std140Builder builder, float[] v) { + builder.putFloat(v[0]).putFloat(v[1]).putFloat(v[2]).putFloat(v[3]); + } + + @Override + public boolean equals(Object o) { + return false; + } + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/WaterHighlightUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/WaterHighlightUniforms.java new file mode 100644 index 0000000..c49316e --- /dev/null +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/engine/uniform/impl/WaterHighlightUniforms.java @@ -0,0 +1,71 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.render.engine.uniform.impl; + +import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.buffers.Std140Builder; +import com.mojang.blaze3d.buffers.Std140SizeCalculator; +import dev.loki.lovisual.render.engine.rhi.uniform.LoVisualUniformAllocator; +import dev.loki.lovisual.features.module.modules.visuals.scene.BlockHighlight; + +/** Uniform buffer for BlockHighlight's shader-based outline styles (WaterCaustic/ScanLines/Hologram). */ +public enum WaterHighlightUniforms { + ; + public static final int SIZE = new Std140SizeCalculator() + .putVec4() + .putVec4() + .putFloat() + .get(); + + private static final Data DATA = new Data(); + private static final String UNIFORM_NAME = "LoVisual - WaterHighlight UBO"; + private static final int EXPECTED_WRITES_PER_FRAME = 6; + + public static void update(float colorR, float colorG, float colorB, float colorA, + float patternR, float patternG, float patternB, float patternA, + float time) { + DATA.color[0] = colorR; + DATA.color[1] = colorG; + DATA.color[2] = colorB; + DATA.color[3] = colorA; + + DATA.pattern[0] = patternR; + DATA.pattern[1] = patternG; + DATA.pattern[2] = patternB; + DATA.pattern[3] = patternA; + + DATA.time = time; + + LoVisualRenderSystem.uniforms().write(UNIFORM_NAME, SIZE, EXPECTED_WRITES_PER_FRAME, DATA); + } + + public static GpuBufferSlice get() { + return LoVisualRenderSystem.uniforms().current(UNIFORM_NAME); + } + + private static final class Data implements LoVisualUniformAllocator.UniformWriter { + private final float[] color = new float[4]; + private final float[] pattern = new float[4]; + private float time; + + @Override + public void write(java.nio.ByteBuffer buffer) { + Std140Builder.intoBuffer(buffer) + .putFloat(color[0]).putFloat(color[1]).putFloat(color[2]).putFloat(color[3]) + .putFloat(pattern[0]).putFloat(pattern[1]).putFloat(pattern[2]).putFloat(pattern[3]) + .putFloat(time); + } + + @Override + public boolean equals(Object o) { + return false; + } + } +} diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ClipFunction.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ClipFunction.java index 8dd8f68..7b8e715 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ClipFunction.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ClipFunction.java @@ -10,7 +10,6 @@ package dev.loki.lovisual.render.helpers; import dev.loki.lovisual.render.engine.core.LoVisualRenderSystem; import dev.loki.lovisual.render.engine.renderer.Renderer2D; import dev.loki.lovisual.render.engine.renderer.ui.draw.*; -import dev.loki.lovisual.render.engine.renderer.ui.draw.*; import dev.loki.lovisual.render.engine.rhi.clip.ShapeClipBackend; import dev.loki.lovisual.util.logging.DebugLog; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScissorFunction.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScissorFunction.java index 4ec8f53..53f7b3e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScissorFunction.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScissorFunction.java @@ -15,6 +15,7 @@ import dev.loki.lovisual.render.engine.renderer.Renderer2D; import java.util.ArrayDeque; import java.util.Deque; +import dev.loki.lovisual.features.gui.hud.draggable.impl.metrics.Coordinates; /** * Unified GPU scissor utility for both scaled (HUD/UI) and unscaled (screen) spaces. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScreenProjection.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScreenProjection.java index 315bdef..0fea78f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScreenProjection.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/ScreenProjection.java @@ -14,7 +14,7 @@ import net.minecraft.world.phys.Vec3; import org.joml.Matrix4f; import org.joml.Quaternionf; import org.joml.Vector4f; -import dev.loki.lovisual.features.module.modules.visuals.AspectRatio; +import dev.loki.lovisual.features.module.modules.visuals.camera.AspectRatio; import dev.loki.lovisual.render.engine.core.LoVisualWorldMatrices; /** diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/SodiumSurfaceFlagContext.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/SodiumSurfaceFlagContext.java index 60287f1..cbe0084 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/SodiumSurfaceFlagContext.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/helpers/SodiumSurfaceFlagContext.java @@ -15,8 +15,8 @@ import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.VegetationBlock; import net.minecraft.world.level.block.VineBlock; import net.minecraft.world.level.block.state.BlockState; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; -import dev.loki.lovisual.features.module.modules.visuals.ReimaginedVisual; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.scene.ReimaginedVisual; import dev.loki.lovisual.util.logging.DebugLog; import java.util.ArrayDeque; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisCompatibilityGuards.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisCompatibilityGuards.java index 0b8f32e..76c4cd7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisCompatibilityGuards.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisCompatibilityGuards.java @@ -8,8 +8,9 @@ package dev.loki.lovisual.render.iris; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.MotionBlur; +import dev.loki.lovisual.features.module.modules.visuals.fx.MotionBlur; import dev.loki.lovisual.Lifecycle; +import dev.loki.lovisual.features.module.modules.visuals.scene.Chams; public enum IrisCompatibilityGuards { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisRuntimeBridge.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisRuntimeBridge.java index a6ca753..995923e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisRuntimeBridge.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/IrisRuntimeBridge.java @@ -13,7 +13,7 @@ import net.irisshaders.iris.api.v0.IrisApi; import net.irisshaders.iris.api.v0.IrisProgram; import dev.loki.lovisual.render.LoVisualEntityRenderTypes; -enum IrisRuntimeBridge { +public enum IrisRuntimeBridge { ; static IrisRuntimeSnapshot snapshot() { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/LoVisualIrisUniforms.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/LoVisualIrisUniforms.java index 9eedf04..b5ea12c 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/LoVisualIrisUniforms.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/iris/LoVisualIrisUniforms.java @@ -14,8 +14,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.material.FogType; import org.joml.Vector3f; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.FullBright; -import dev.loki.lovisual.features.module.modules.visuals.WorldTweaks; +import dev.loki.lovisual.features.module.modules.visuals.player.FullBright; +import dev.loki.lovisual.features.module.modules.visuals.weather.WorldTweaks; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.light.LightmapState; import dev.loki.lovisual.util.logging.DebugLog; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/sky/CustomSkyboxRenderer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/sky/CustomSkyboxRenderer.java index db36bb1..f9699e9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/sky/CustomSkyboxRenderer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/render/sky/CustomSkyboxRenderer.java @@ -28,13 +28,13 @@ import org.joml.Matrix4fStack; import org.joml.Quaternionf; import org.joml.Vector3f; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.module.modules.visuals.Freecam; -import dev.loki.lovisual.features.module.modules.visuals.NoRender; -import dev.loki.lovisual.features.module.modules.visuals.ReimaginedVisual; -import dev.loki.lovisual.features.module.modules.visuals.ShaderSky; +import dev.loki.lovisual.features.module.modules.visuals.camera.Freecam; +import dev.loki.lovisual.features.module.modules.visuals.visibility.NoRender; +import dev.loki.lovisual.features.module.modules.visuals.scene.ReimaginedVisual; +import dev.loki.lovisual.features.module.modules.visuals.weather.ShaderSky; import dev.loki.lovisual.features.theme.Theme; -import dev.loki.lovisual.mixins.accessors.GameRendererAccessor; -import dev.loki.lovisual.mixins.accessors.LocalPlayerAccessor; +import dev.loki.lovisual.mixins.accessors.renderer.GameRendererAccessor; +import dev.loki.lovisual.mixins.accessors.entity.LocalPlayerAccessor; import dev.loki.lovisual.render.engine.RenderState; import dev.loki.lovisual.render.engine.core.LoVisualWorldMatrices; import dev.loki.lovisual.render.engine.animation.AnimationUtility; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/RotationManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/RotationManager.java index 968a008..30e605d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/RotationManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/RotationManager.java @@ -16,14 +16,14 @@ import net.minecraft.network.protocol.game.ServerboundUseItemPacket; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.events.EventHandler; +import dev.loki.lovisual.events.meta.EventHandler; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.EventSync; -import dev.loki.lovisual.events.impl.PacketEvent; -import dev.loki.lovisual.events.impl.PlayerVelocityStrafe; -import dev.loki.lovisual.events.impl.RotationUpdateEvent; +import dev.loki.lovisual.events.impl.network.EventSync; +import dev.loki.lovisual.events.impl.network.PacketEvent; +import dev.loki.lovisual.events.impl.world.PlayerVelocityStrafe; +import dev.loki.lovisual.events.impl.input.RotationUpdateEvent; import dev.loki.lovisual.mixininterface.ILocalPlayer; -import dev.loki.lovisual.mixins.accessors.EntityInvoker; +import dev.loki.lovisual.mixins.accessors.entity.EntityInvoker; import dev.loki.lovisual.util.aiming.data.Rotation; import dev.loki.lovisual.util.aiming.features.MovementCorrection; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/features/processors/FailRotationProcessor.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/features/processors/FailRotationProcessor.java index 070bb8a..07d87f3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/features/processors/FailRotationProcessor.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/aiming/features/processors/FailRotationProcessor.java @@ -9,8 +9,8 @@ package dev.loki.lovisual.util.aiming.features.processors; import dev.loki.lovisual.config.values.BooleanValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import dev.loki.lovisual.util.aiming.RotationManager; import dev.loki.lovisual.util.aiming.RotationTarget; import dev.loki.lovisual.util.aiming.data.Rotation; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/EquipProgressComposer.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/EquipProgressComposer.java index 7f48244..0a9d6ee 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/EquipProgressComposer.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/EquipProgressComposer.java @@ -6,6 +6,8 @@ */ package dev.loki.lovisual.util.animation; +import dev.loki.lovisual.features.module.modules.visuals.camera.ViewModel; +import dev.loki.lovisual.features.module.modules.visuals.items.HoldMyItems; /** * Единая цепочка обработки equip-прогресса руки: сначала кривая HoldMyItems diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/hand/HandDynamics.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/hand/HandDynamics.java index 369df10..a205400 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/hand/HandDynamics.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/animation/hand/HandDynamics.java @@ -13,7 +13,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.HumanoidArm; -import dev.loki.lovisual.features.module.modules.visuals.HoldMyItems; +import dev.loki.lovisual.features.module.modules.visuals.items.HoldMyItems; import dev.loki.lovisual.render.helpers.TickDelta; /** diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/block/bed/SelfBedTracker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/block/bed/SelfBedTracker.java index 34573a4..f442ec0 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/block/bed/SelfBedTracker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/block/bed/SelfBedTracker.java @@ -19,10 +19,10 @@ import net.minecraft.world.item.component.DyedItemColor; import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.PacketEvent; -import dev.loki.lovisual.features.gui.hud.draggable.impl.HudNotifier; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.network.PacketEvent; +import dev.loki.lovisual.features.gui.hud.draggable.impl.hudnotifier.HudNotifier; public final class SelfBedTracker { public static final SelfBedTracker INSTANCE = new SelfBedTracker(); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/click/AttackPressing.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/click/AttackPressing.java index e2e0ad5..9d34cd7 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/click/AttackPressing.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/click/AttackPressing.java @@ -12,8 +12,8 @@ import net.minecraft.network.protocol.game.ServerboundSetCarriedItemPacket; import net.minecraft.network.protocol.game.ServerboundSwingPacket; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Items; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.PacketEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.network.PacketEvent; import dev.loki.lovisual.util.combat.LethalStrikeCalculator; import dev.loki.lovisual.util.player.inventory.InventorySwap; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AntiBotTracker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AntiBotTracker.java index 6aca987..1efe647 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AntiBotTracker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AntiBotTracker.java @@ -17,9 +17,9 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.equipment.Equippable; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.PacketEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.network.PacketEvent; import java.nio.charset.StandardCharsets; import java.util.Locale; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AttackUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AttackUtil.java index e7ac4b0..4098c7a 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AttackUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/AttackUtil.java @@ -16,14 +16,14 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Items; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.AttackEntityEvent; -import dev.loki.lovisual.features.gui.hud.draggable.impl.TargetHud; +import dev.loki.lovisual.events.impl.entity.AttackEntityEvent; +import dev.loki.lovisual.features.gui.hud.draggable.impl.targethud.TargetHud; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.RubberHand; import dev.loki.lovisual.features.module.modules.misc.HitSounds; -import dev.loki.lovisual.features.module.modules.visuals.HitEffect; -import dev.loki.lovisual.mixins.accessors.LocalPlayerAccessor; -import dev.loki.lovisual.mixins.accessors.MultiPlayerGameModeAccessor; +import dev.loki.lovisual.features.module.modules.visuals.effects.HitEffect; +import dev.loki.lovisual.mixins.accessors.entity.LocalPlayerAccessor; +import dev.loki.lovisual.mixins.accessors.misc.MultiPlayerGameModeAccessor; import dev.loki.lovisual.util.item.FoodUtil; import dev.loki.lovisual.util.player.ResetAttackCooldown; import dev.loki.lovisual.util.target.TargetManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/SprintController.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/SprintController.java index d62f68b..4e5977b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/SprintController.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/SprintController.java @@ -10,11 +10,11 @@ package dev.loki.lovisual.util.combat; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.PacketEvent; -import dev.loki.lovisual.events.impl.SprintControlEvent; -import dev.loki.lovisual.mixins.accessors.LocalPlayerAccessor; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.network.PacketEvent; +import dev.loki.lovisual.events.impl.input.SprintControlEvent; +import dev.loki.lovisual.mixins.accessors.entity.LocalPlayerAccessor; /** * Shared sprint state/controller layer. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/protocol/CombatProtocolHeuristics.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/protocol/CombatProtocolHeuristics.java index 6049b9a..9001663 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/protocol/CombatProtocolHeuristics.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/combat/protocol/CombatProtocolHeuristics.java @@ -7,10 +7,10 @@ package dev.loki.lovisual.util.combat.protocol; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.CombatProtocolBossbarEvent; -import dev.loki.lovisual.events.impl.PvpChatEvent; -import dev.loki.lovisual.events.impl.PvpOverlayEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.pvp.CombatProtocolBossbarEvent; +import dev.loki.lovisual.events.impl.pvp.PvpChatEvent; +import dev.loki.lovisual.events.impl.pvp.PvpOverlayEvent; import dev.loki.lovisual.util.logging.DebugLog; import dev.loki.lovisual.util.text.LegacyTextUtil; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/EagleUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/EagleUtil.java index 707c843..fb7959f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/EagleUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/EagleUtil.java @@ -11,7 +11,7 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.events.impl.MovementInputEvent; +import dev.loki.lovisual.events.impl.movement.MovementInputEvent; import dev.loki.lovisual.render.helpers.TickDelta; public enum EagleUtil { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/simulation/BoatSimulationCache.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/simulation/BoatSimulationCache.java index 00b4f7f..08e5209 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/simulation/BoatSimulationCache.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/entity/simulation/BoatSimulationCache.java @@ -21,8 +21,8 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.BooleanOp; import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import java.util.ArrayList; import java.util.List; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/input/KeyManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/input/KeyManager.java index 44684fa..923a8d3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/input/KeyManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/input/KeyManager.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import dev.loki.lovisual.events.Event; public enum KeyManager { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorConfig.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorConfig.java index 921a345..e2c46e9 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorConfig.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorConfig.java @@ -13,6 +13,7 @@ import dev.loki.lovisual.config.ConfigObject; import dev.loki.lovisual.config.ConfigSerializer; import dev.loki.lovisual.config.values.ConfigValue; import dev.loki.lovisual.config.values.RGBColorValue; +import dev.loki.lovisual.features.module.modules.visuals.esp.overlay.DropESP; import java.util.ArrayList; import java.util.List; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorUtil.java index d4e0521..65e49aa 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/RarityColorUtil.java @@ -6,6 +6,7 @@ */ package dev.loki.lovisual.util.item; +import dev.loki.lovisual.features.module.modules.visuals.esp.overlay.DropESP; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/TopEnchantUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/TopEnchantUtil.java index d2cdab8..7dde3f3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/TopEnchantUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/item/TopEnchantUtil.java @@ -16,10 +16,13 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; import dev.loki.lovisual.config.values.ItemIdSetValue; import dev.loki.lovisual.config.values.RGBColorValue; +import dev.loki.lovisual.features.module.modules.visuals.esp.overlay.DropESP; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import java.util.LinkedHashSet; import java.util.Set; import java.util.function.BiConsumer; +import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; /** * Shared helper for highlighting top (max-level) legal enchants used by DropESP/NameTags/BetterChat. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/media/MediaSessionService.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/media/MediaSessionService.java index 237a07c..fcfb3f3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/media/MediaSessionService.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/media/MediaSessionService.java @@ -262,7 +262,7 @@ public final class MediaSessionService { } boolean hasSession = session != null && media != null; - long predictedPosition = hasSession ? getPredictedPosition(media) : 0L; + long predictedPosition = hasSession ? getPredictedPositionMs(media) / 1000L : 0L; long duration = hasSession ? lastRawDuration : 0L; snapshot = new Snapshot(mediaAvailable, session, media, artworkTexture, predictedPosition, duration, hasSession); } @@ -390,7 +390,12 @@ public final class MediaSessionService { } } - private long getPredictedPosition(MediaInfo media) { + // Каноническая схема MPRIS-клиентов (playerctl, mpris-rs): якорь + // (позиция_плеера, момент_опроса) + экстраполяция в реальном времени, + // т.к. свойство Position не шлёт PropertiesChanged и обновляется раз в + // ~1с с квантизацией до секунд. Считаем в миллисекундах: целочисленное + // деление дельты на 1000 давало квантование предсказания до целых секунд. + private long getPredictedPositionMs(MediaInfo media) { if (media == null) return 0L; long now = Util.getMillis(); long rawPos = Math.max(0L, media.position()); @@ -408,15 +413,18 @@ public final class MediaSessionService { lastRawUpdateMs = now; } - long predicted = lastRawPosition; + long predictedMs = lastRawPosition * 1000L; if (lastRawPlaying) { - long deltaMs = Math.max(0L, now - lastRawUpdateMs); - predicted += deltaMs / 1000L; + predictedMs += Math.max(0L, now - lastRawUpdateMs); } - if (lastRawDuration > 0L && predicted > lastRawDuration) { - predicted = lastRawDuration; + if (lastRawDuration > 0L && predictedMs > lastRawDuration * 1000L) { + predictedMs = lastRawDuration * 1000L; } - return predicted; + return predictedMs; + } + + private long getPredictedPosition(MediaInfo media) { + return getPredictedPositionMs(media) / 1000L; } private void resetPredictedAfterSkip() { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BacktrackController.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BacktrackController.java index dca28e1..498c393 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BacktrackController.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BacktrackController.java @@ -20,11 +20,11 @@ import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import dev.loki.lovisual.config.values.EnumValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.AttackEntityEvent; -import dev.loki.lovisual.events.impl.BlinkPacketEvent; -import dev.loki.lovisual.events.impl.EventTargetChanged; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.entity.AttackEntityEvent; +import dev.loki.lovisual.events.impl.network.BlinkPacketEvent; +import dev.loki.lovisual.events.impl.entity.EventTargetChanged; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import dev.loki.lovisual.util.target.TargetManager; import dev.loki.lovisual.util.target.TargetingUtil; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BlinkManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BlinkManager.java index b01b243..5821d99 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BlinkManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/BlinkManager.java @@ -23,11 +23,11 @@ import net.minecraft.network.protocol.ping.ServerboundPingRequestPacket; import net.minecraft.network.protocol.status.ServerboundStatusRequestPacket; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.events.EventHandler; +import dev.loki.lovisual.events.meta.EventHandler; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.BlinkPacketEvent; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.PacketEvent; +import dev.loki.lovisual.events.impl.network.BlinkPacketEvent; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.network.PacketEvent; import java.util.ArrayList; import java.util.List; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/FakeLagController.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/FakeLagController.java index d1dfaa3..7660927 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/FakeLagController.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/network/FakeLagController.java @@ -20,9 +20,9 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import dev.loki.lovisual.config.values.EnumValue; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.BlinkPacketEvent; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.network.BlinkPacketEvent; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import dev.loki.lovisual.util.item.FoodUtil; import dev.loki.lovisual.util.target.TargetingUtil; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/ElytraRecastUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/ElytraRecastUtil.java index 2b8a810..c0f4cc4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/ElytraRecastUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/ElytraRecastUtil.java @@ -16,8 +16,8 @@ import net.minecraft.world.entity.Pose; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.phys.AABB; -import dev.loki.lovisual.events.impl.EventSync; -import dev.loki.lovisual.events.impl.MovementInputEvent; +import dev.loki.lovisual.events.impl.network.EventSync; +import dev.loki.lovisual.events.impl.movement.MovementInputEvent; import java.util.IdentityHashMap; import java.util.Map; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/InteractionUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/InteractionUtil.java index bcff4e7..706db65 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/InteractionUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/InteractionUtil.java @@ -13,7 +13,7 @@ import net.minecraft.client.multiplayer.prediction.PredictiveAction; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.mixins.accessors.ClientLevelAccessor; +import dev.loki.lovisual.mixins.accessors.world.ClientLevelAccessor; public enum InteractionUtil { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/NetworkStatsUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/NetworkStatsUtil.java index 242843d..e6e017b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/NetworkStatsUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/NetworkStatsUtil.java @@ -9,6 +9,7 @@ package dev.loki.lovisual.util.player; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.PlayerInfo; +import dev.loki.lovisual.features.gui.hud.draggable.impl.stats.Ping; /** * Shared helpers for network stats (ping/TPS). diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/effect/StatusEffectHeuristics.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/effect/StatusEffectHeuristics.java index 465f656..4d71aef 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/effect/StatusEffectHeuristics.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/effect/StatusEffectHeuristics.java @@ -17,7 +17,7 @@ import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.mixins.accessors.EffectParticleEffectAccessor; +import dev.loki.lovisual.mixins.accessors.state.EffectParticleEffectAccessor; import java.util.ArrayList; import java.util.Arrays; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/inventory/InventorySwap.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/inventory/InventorySwap.java index fedcc1c..04236bf 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/inventory/InventorySwap.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/inventory/InventorySwap.java @@ -20,14 +20,14 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ContainerInput; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.MovementInputEvent; -import dev.loki.lovisual.events.impl.PacketEvent; -import dev.loki.lovisual.events.impl.SprintControlEvent; -import dev.loki.lovisual.mixins.accessors.MultiPlayerGameModeAccessor; -import dev.loki.lovisual.mixins.accessors.PlayerInventoryAccessor; -import dev.loki.lovisual.mixins.accessors.SlotAccessor; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.movement.MovementInputEvent; +import dev.loki.lovisual.events.impl.network.PacketEvent; +import dev.loki.lovisual.events.impl.input.SprintControlEvent; +import dev.loki.lovisual.mixins.accessors.misc.MultiPlayerGameModeAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.PlayerInventoryAccessor; +import dev.loki.lovisual.mixins.accessors.inventory.SlotAccessor; import java.util.ArrayDeque; import java.util.Deque; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/LocalPlayerSimulation.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/LocalPlayerSimulation.java index 4017937..606da98 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/LocalPlayerSimulation.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/LocalPlayerSimulation.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.util.player.simulation; import net.minecraft.world.entity.player.Player; -final class LocalPlayerSimulation extends PlayerMovementSimulation { +public final class LocalPlayerSimulation extends PlayerMovementSimulation { LocalPlayerSimulation(Player player, SimulatedInput input) { super(player, input); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerMovementSimulation.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerMovementSimulation.java index 0a71907..e07558e 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerMovementSimulation.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerMovementSimulation.java @@ -27,12 +27,12 @@ import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.mixins.accessors.EntityInvoker; +import dev.loki.lovisual.mixins.accessors.entity.EntityInvoker; import dev.loki.lovisual.util.player.effect.StatusEffectAccess; import java.util.List; -abstract class PlayerMovementSimulation { +public abstract class PlayerMovementSimulation { private static final double STEP_HEIGHT = 0.5; private final Player player; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerSimulationCache.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerSimulationCache.java index 094b1bf..41f3f75 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerSimulationCache.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/PlayerSimulationCache.java @@ -10,9 +10,9 @@ package dev.loki.lovisual.util.player.simulation; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; -import dev.loki.lovisual.events.impl.MovementInputEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; +import dev.loki.lovisual.events.impl.movement.MovementInputEvent; import java.util.*; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerObservation.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerObservation.java index 93e4edb..284eff3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerObservation.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerObservation.java @@ -17,7 +17,7 @@ import net.minecraft.world.phys.Vec3; import dev.loki.lovisual.features.relations.StaffTracker; import dev.loki.lovisual.util.player.effect.StatusEffectAccess; -final class RemotePlayerObservation { +public final class RemotePlayerObservation { private static final int HOVER_CONFIRM_TICKS = 3; private static final int FLIGHT_CONFIRM_TICKS = 4; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerSimulation.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerSimulation.java index b5f20bd..06c8e29 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerSimulation.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/RemotePlayerSimulation.java @@ -10,7 +10,7 @@ package dev.loki.lovisual.util.player.simulation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; -final class RemotePlayerSimulation extends PlayerMovementSimulation { +public final class RemotePlayerSimulation extends PlayerMovementSimulation { private final RemotePlayerObservation observation; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/SimulatedInput.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/SimulatedInput.java index 6e30404..f96f9c1 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/SimulatedInput.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/player/simulation/SimulatedInput.java @@ -11,10 +11,10 @@ import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.MovementInputEvent; -import dev.loki.lovisual.events.impl.PlayerSafeWalkEvent; +import dev.loki.lovisual.events.impl.movement.MovementInputEvent; +import dev.loki.lovisual.events.impl.movement.PlayerSafeWalkEvent; -final class SimulatedInput { +public final class SimulatedInput { private static final double MAX_WALKING_SPEED = 0.121; final boolean forward; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/PointFinding.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/PointFinding.java index f6c4f3e..3264981 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/PointFinding.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/PointFinding.java @@ -18,7 +18,7 @@ import java.util.Comparator; import java.util.List; import java.util.function.Consumer; -enum PointFinding { +public enum PointFinding { ; static Vec3 findVisiblePointFromVirtualEye(Vec3 virtualEyes, AABB box, double rangeToTest) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/ProjectileMath.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/ProjectileMath.java index 32d54b8..15d613f 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/ProjectileMath.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/ProjectileMath.java @@ -7,7 +7,7 @@ package dev.loki.lovisual.util.projectile; -enum ProjectileMath { +public enum ProjectileMath { ; static MinimumResult findFunctionMinimumByBisect(double from, double to, double minDelta, DoubleUnaryFunction function) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/TrajectoryData.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/TrajectoryData.java index 286048c..434331b 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/TrajectoryData.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/projectile/TrajectoryData.java @@ -19,7 +19,7 @@ import net.minecraft.world.entity.projectile.throwableitemprojectile.*; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.component.ChargedProjectiles; -import dev.loki.lovisual.mixins.accessors.PersistentProjectileEntityAccessor; +import dev.loki.lovisual.mixins.accessors.projectile.PersistentProjectileEntityAccessor; public enum TrajectoryData { ; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/protection/SlotLockPolicy.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/protection/SlotLockPolicy.java index 935c5fa..430cb57 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/protection/SlotLockPolicy.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/protection/SlotLockPolicy.java @@ -9,6 +9,7 @@ package dev.loki.lovisual.util.protection; import java.util.LinkedHashMap; import java.util.Map; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; /** * Pure decision logic for the LockSlot module: whether dropping an item diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/proxy/ProxyHandshakeHandler.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/proxy/ProxyHandshakeHandler.java index 8aa6fa7..3682930 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/proxy/ProxyHandshakeHandler.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/proxy/ProxyHandshakeHandler.java @@ -20,7 +20,7 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.charset.StandardCharsets; -final class ProxyHandshakeHandler extends ChannelDuplexHandler { +public final class ProxyHandshakeHandler extends ChannelDuplexHandler { private final ProxyEntry proxy; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/ItemUseCooldowns.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/ItemUseCooldowns.java index 32d0705..6604a42 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/ItemUseCooldowns.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/ItemUseCooldowns.java @@ -10,6 +10,7 @@ package dev.loki.lovisual.util.pvp; import net.minecraft.util.Util; import net.minecraft.world.item.Item; import dev.loki.lovisual.config.values.ItemCooldownRulesValue; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import java.util.*; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTargetTracker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTargetTracker.java index ddea302..b1901d4 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTargetTracker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTargetTracker.java @@ -10,9 +10,9 @@ package dev.loki.lovisual.util.pvp; import net.minecraft.client.Minecraft; import net.minecraft.util.Util; import net.minecraft.world.entity.player.Player; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.EventTargetChanged; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.entity.EventTargetChanged; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.PvpCooldowns; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTextPatternUtil.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTextPatternUtil.java index f557a8e..4b9f3dc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTextPatternUtil.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTextPatternUtil.java @@ -14,7 +14,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -enum PvpTextPatternUtil { +public enum PvpTextPatternUtil { ; static String normalize(String raw) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTracker.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTracker.java index b6cdc07..f7d5cac 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTracker.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/pvp/PvpTracker.java @@ -8,10 +8,10 @@ package dev.loki.lovisual.util.pvp; import net.minecraft.client.Minecraft; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.PvpChatEvent; -import dev.loki.lovisual.events.impl.PvpOverlayEvent; -import dev.loki.lovisual.events.impl.PvpTabEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.pvp.PvpChatEvent; +import dev.loki.lovisual.events.impl.pvp.PvpOverlayEvent; +import dev.loki.lovisual.events.impl.pvp.PvpTabEvent; import dev.loki.lovisual.features.module.Modules; import dev.loki.lovisual.features.module.modules.combat.PvpCooldowns; import dev.loki.lovisual.features.relations.PlayerRelations; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/resources/ResourceReloadHooks.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/resources/ResourceReloadHooks.java index 44a85c4..91ee0d8 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/resources/ResourceReloadHooks.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/resources/ResourceReloadHooks.java @@ -8,10 +8,10 @@ package dev.loki.lovisual.util.resources; import dev.loki.lovisual.features.module.Modules; -import dev.loki.lovisual.features.gui.clickgui.settings.I18nDuplicateScanner; -import dev.loki.lovisual.features.gui.clickgui.settings.I18nPreflightManager; +import dev.loki.lovisual.features.gui.clickgui.settings.i18n.I18nDuplicateScanner; +import dev.loki.lovisual.features.gui.clickgui.settings.i18n.I18nPreflightManager; import net.minecraft.server.packs.resources.ResourceManager; -import dev.loki.lovisual.features.module.modules.visuals.NameTags; +import dev.loki.lovisual.features.module.modules.visuals.nametags.NameTags; import dev.loki.lovisual.render.engine.TextureStorage; import dev.loki.lovisual.render.engine.pipeline.LoVisualRenderPipelines; import dev.loki.lovisual.render.engine.prewarm.RenderPrewarmManager; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/SessionChanger.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/SessionChanger.java index 6eb007d..d6f5830 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/SessionChanger.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/SessionChanger.java @@ -11,7 +11,7 @@ import com.mojang.authlib.minecraft.UserApiService; import com.mojang.authlib.yggdrasil.FriendsService; import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; -import dev.loki.lovisual.mixins.accessors.MinecraftAccessor; +import dev.loki.lovisual.mixins.accessors.misc.MinecraftAccessor; import dev.loki.lovisual.util.logging.DebugLog; import net.minecraft.client.Minecraft; import net.minecraft.client.User; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftJson.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftJson.java index 2aac4a2..23ceddc 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftJson.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftJson.java @@ -12,7 +12,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; -final class MicrosoftJson { +public final class MicrosoftJson { static final Gson GSON = new Gson(); private MicrosoftJson() { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftTokens.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftTokens.java index ddcb29b..df488ed 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftTokens.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MicrosoftTokens.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.util.session.microsoft; import com.google.gson.JsonObject; -record MicrosoftTokens(String accessToken, String refreshToken) { +public record MicrosoftTokens(String accessToken, String refreshToken) { static MicrosoftTokens fromJson(JsonObject json) { try { return new MicrosoftTokens( diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MinecraftProfile.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MinecraftProfile.java index 40c1758..9ccea7d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MinecraftProfile.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/MinecraftProfile.java @@ -12,7 +12,7 @@ import com.google.gson.JsonObject; import java.util.UUID; import java.util.regex.Pattern; -record MinecraftProfile(UUID uuid, String name) { +public record MinecraftProfile(UUID uuid, String name) { private static final Pattern DASHLESS_UUID = Pattern.compile("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})"); static MinecraftProfile fromJson(JsonObject json) { diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/XboxToken.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/XboxToken.java index ffe8329..833a128 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/XboxToken.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/session/microsoft/XboxToken.java @@ -11,7 +11,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -record XboxToken(String token, String userHash) { +public record XboxToken(String token, String userHash) { static XboxToken fromJson(JsonObject json) { try { String token = MicrosoftJson.string(json, "Token"); diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/target/TargetManager.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/target/TargetManager.java index 1ae5c54..d13825d 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/target/TargetManager.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/target/TargetManager.java @@ -13,7 +13,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import dev.loki.lovisual.events.Events; -import dev.loki.lovisual.events.impl.EventTargetChanged; +import dev.loki.lovisual.events.impl.entity.EventTargetChanged; import java.util.EnumMap; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/text/TextSelection.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/text/TextSelection.java index 991d11f..2ac6085 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/text/TextSelection.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/text/TextSelection.java @@ -6,6 +6,7 @@ */ package dev.loki.lovisual.util.text; +import dev.loki.lovisual.features.gui.hud.draggable.impl.BetterChat; /** * Tracks a text selection across one or more logical text rows/messages. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/time/TimerController.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/time/TimerController.java index 2c6a3bd..d5fd353 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/time/TimerController.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/time/TimerController.java @@ -8,8 +8,8 @@ package dev.loki.lovisual.util.time; import net.minecraft.util.Mth; -import dev.loki.lovisual.events.EventHandler; -import dev.loki.lovisual.events.impl.GameTickEvent; +import dev.loki.lovisual.events.meta.EventHandler; +import dev.loki.lovisual.events.impl.render.GameTickEvent; import java.util.Iterator; import java.util.LinkedHashMap; diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSound.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSound.java index 540d229..d0df501 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSound.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSound.java @@ -10,8 +10,8 @@ package dev.loki.lovisual.util.wav; import net.minecraft.resources.Identifier; import dev.loki.lovisual.config.values.ConfigValue; import dev.loki.lovisual.config.values.NumberValue; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; -import dev.loki.lovisual.features.gui.clickgui.settings.SliderSetting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.slider.SliderSetting; /** * Helper for modules: WAV sound entry with per-sound volume setting. diff --git a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSoundHelper.java b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSoundHelper.java index 8a868ad..1cd3de3 100644 --- a/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSoundHelper.java +++ b/combatant-client-26.2/src/main/java/dev/loki/lovisual/util/wav/WavSoundHelper.java @@ -9,7 +9,7 @@ package dev.loki.lovisual.util.wav; import net.minecraft.resources.Identifier; import dev.loki.lovisual.config.values.ConfigValue; -import dev.loki.lovisual.features.gui.clickgui.settings.Setting; +import dev.loki.lovisual.features.gui.clickgui.settings.core.Setting; import java.util.ArrayList; import java.util.List; diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/lang/en_us.json b/combatant-client-26.2/src/main/resources/assets/lovisual/lang/en_us.json index ad609e1..9dabdc1 100644 --- a/combatant-client-26.2/src/main/resources/assets/lovisual/lang/en_us.json +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/lang/en_us.json @@ -545,6 +545,12 @@ "setting.freecam.toggle_input": "Toggle input", "setting.fullbright.min_light": "Min light", "module.light.description": "Tints the world ambient light with a custom color.", + "module.alwaysvisiblehand.description": "Keeps your hand visible while eating, drinking or drawing a bow. Vanilla hides it by default.", + "setting.alwaysvisiblehand.keep_visible": "Keep visible", + "setting.alwaysvisiblehand.keep_visible.option.Both": "Both hands", + "setting.alwaysvisiblehand.keep_visible.option.Main hand": "Main hand", + "setting.alwaysvisiblehand.keep_visible.option.Off hand": "Off hand", + "setting.alwaysvisiblehand.keep_visible_during_use": "Apply while using items", "setting.light.tint_ambient": "Tint ambient", "setting.light.tint_sky": "Tint skylight", "setting.light.color": "Color", diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/lang/ru_ru.json b/combatant-client-26.2/src/main/resources/assets/lovisual/lang/ru_ru.json index c3f104b..0864e8f 100644 --- a/combatant-client-26.2/src/main/resources/assets/lovisual/lang/ru_ru.json +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/lang/ru_ru.json @@ -480,6 +480,12 @@ "setting.freecam.toggle_input": "Переключить ввод", "setting.fullbright.min_light": "Мин. свет", "module.light.description": "Окрашивает окружающее освещение в выбранный цвет.", + "module.alwaysvisiblehand.description": "Рука с предметом остаётся видимой при еде, питье и натягивании лука.", + "setting.alwaysvisiblehand.keep_visible": "Что показывать", + "setting.alwaysvisiblehand.keep_visible.option.Both": "Обе руки", + "setting.alwaysvisiblehand.keep_visible.option.Main hand": "Главная рука", + "setting.alwaysvisiblehand.keep_visible.option.Off hand": "Вторая рука", + "setting.alwaysvisiblehand.keep_visible_during_use": "Применять при использовании", "setting.light.tint_ambient": "Тонировать ambient", "setting.light.tint_sky": "Тонировать skylight", "setting.light.color": "Цвет", diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_hologram.frag b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_hologram.frag new file mode 100644 index 0000000..329011a --- /dev/null +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_hologram.frag @@ -0,0 +1,60 @@ +#version 330 core + +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + */ + +out vec4 color; + +layout (std140) uniform WaterData { + vec4 u_Color; + vec4 u_PatternColor; + float u_Time; +}; + +in vec2 v_TexCoord; + +float hexDist(vec2 p) { + p = abs(p); + float c = dot(p, normalize(vec2(1.0, 1.73205))); + c = max(c, p.x); + return c; +} + +vec2 hexCoords(vec2 uv) { + vec2 r = vec2(1.0, 1.73205); + vec2 h = r * 0.5; + vec2 a = mod(uv, r) - h; + vec2 b = mod(uv - h, r) - h; + return dot(a, a) < dot(b, b) ? a : b; +} + +void main() { + vec2 uv = v_TexCoord; + float time = u_Time; + + float distToEdge = min(min(uv.x, 1.0 - uv.x), min(uv.y, 1.0 - uv.y)); + float edgeFrame = smoothstep(0.02, 0.0, distToEdge); + float edgeGlow = exp(-distToEdge * 14.0); + + vec2 hexUv = uv * 8.0; + vec2 cell = hexCoords(hexUv); + float hex = hexDist(cell); + float hexLine = smoothstep(0.5, 0.46, hex) - smoothstep(0.46, 0.40, hex); + + float flicker = 0.85 + 0.15 * sin(time * 6.0 + uv.x * 20.0); + float rise = fract(uv.y * 2.0 - time * 0.5); + float riseBand = smoothstep(0.0, 0.08, rise) * smoothstep(0.24, 0.08, rise); + + vec3 baseColor = u_Color.rgb; + vec3 accentColor = u_PatternColor.rgb; + + vec3 finalRGB = baseColor * (edgeFrame * 2.0 + edgeGlow * 1.2) + + accentColor * hexLine * flicker + + accentColor * riseBand * 0.8; + + float finalAlpha = clamp(u_Color.w * (0.10 + edgeFrame * 0.9 + hexLine * 0.6 + riseBand * 0.4), 0.0, 1.0); + if (finalAlpha < 0.01) discard; + color = vec4(finalRGB, finalAlpha); +} diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_scanlines.frag b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_scanlines.frag new file mode 100644 index 0000000..10dd088 --- /dev/null +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_scanlines.frag @@ -0,0 +1,43 @@ +#version 330 core + +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + */ + +out vec4 color; + +layout (std140) uniform WaterData { + vec4 u_Color; + vec4 u_PatternColor; + float u_Time; +}; + +in vec2 v_TexCoord; + +void main() { + vec2 uv = v_TexCoord; + float time = u_Time; + + float distToEdge = min(min(uv.x, 1.0 - uv.x), min(uv.y, 1.0 - uv.y)); + float edgeGlow = exp(-distToEdge * 20.0); + + float scanY = fract(uv.y * 3.0 - time * 1.4); + float scanLine = smoothstep(0.0, 0.06, scanY) * smoothstep(0.18, 0.06, scanY); + float scanBand = smoothstep(0.0, 1.0, 1.0 - abs(fract(uv.y * 18.0) - 0.5) * 2.0) * 0.15; + + float sweep = smoothstep(0.02, 0.0, abs(fract(time * 0.35) - uv.y)); + float pulse = sin(time * 3.0) * 0.15 + 0.85; + + vec3 baseColor = u_Color.rgb; + vec3 accentColor = u_PatternColor.rgb; + + vec3 finalRGB = baseColor * (edgeGlow * 1.4) + + accentColor * (scanLine * 1.6 + sweep * 0.9) + + baseColor * scanBand; + finalRGB *= pulse; + + float finalAlpha = clamp(u_Color.w * (0.12 + edgeGlow * 0.7 + scanLine * 0.6 + sweep * 0.5), 0.0, 1.0); + if (finalAlpha < 0.01) discard; + color = vec4(finalRGB, finalAlpha); +} diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_watercaustic.frag b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_watercaustic.frag new file mode 100644 index 0000000..92512cc --- /dev/null +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/block_highlight_watercaustic.frag @@ -0,0 +1,48 @@ +#version 330 core + +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + */ + +out vec4 color; + +layout (std140) uniform WaterData { + vec4 u_Color; + vec4 u_PatternColor; + float u_Time; +}; + +in vec2 v_TexCoord; + +void main() { + vec2 vUV = v_TexCoord; + float time = u_Time; + + float distToEdge = min(min(vUV.x, 1.0 - vUV.x), min(vUV.y, 1.0 - vUV.y)); + float edgeGlow = exp(-distToEdge * 16.0); + float edgeFrame = smoothstep(0.03, 0.0, distToEdge); + + vec2 gridUV = vUV * 6.0; + float gridAnim = sin(gridUV.x + gridUV.y + time * 2.0) * 0.5 + 0.5; + vec2 f = abs(fract(gridUV - 0.5) - 0.5); + float gridLines = smoothstep(0.05, 0.0, min(f.x, f.y)); + gridLines *= (0.2 + 0.8 * gridAnim); + + vec2 p = vUV * 2.0 - 1.0; + float rLen = length(p); + float wave = sin(rLen * 10.0 - time * 3.5) * 0.5 + 0.5; + wave *= smoothstep(0.8, 0.1, rLen); + + float pulse = sin(time * 2.5) * 0.12 + 0.88; + + vec3 baseColor = u_Color.rgb; + vec3 accentColor = u_PatternColor.rgb; + vec3 borderRGB = baseColor * (edgeGlow * 1.6 + edgeFrame * 2.2); + vec3 gridRGB = mix(baseColor, accentColor, gridAnim) * (gridLines * 0.9); + vec3 waveRGB = accentColor * (wave * 0.35); + vec3 finalRGB = (borderRGB + gridRGB + waveRGB) * pulse; + + float finalAlpha = clamp(u_Color.w * (0.15 + edgeGlow * 0.85 + gridLines * 0.5 + wave * 0.2), 0.0, 1.0); + color = vec4(finalRGB, finalAlpha); +} diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_portal.frag b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_portal.frag new file mode 100644 index 0000000..9dd58cb --- /dev/null +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_portal.frag @@ -0,0 +1,162 @@ +#version 330 core + +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + */ + +out vec4 color; + +layout (std140) uniform KillEffectBeam { + vec4 u_Params0; // time, progress, intensity, size + vec4 u_Color; +}; + +in vec2 v_TexCoord; +in vec4 v_Color; + +float hash21(vec2 p) { + p = fract(p * vec2(443.8975, 397.2973)); + p += dot(p, p + 19.19); + return fract(p.x * p.y); +} + +void main() { + vec2 center = vec2(0.5); + vec2 uv = v_TexCoord; + vec2 dir = uv - center; + float dist = length(dir); + float angle = atan(dir.y, dir.x); + + float time = u_Params0.x; + float progress = u_Params0.y; + float intensity = u_Params0.z; + + float appear = smoothstep(0.0, 0.10, progress); + float vanish = 1.0 - smoothstep(0.70, 1.0, progress); + vanish = vanish * vanish * (3.0 - 2.0 * vanish); + + float radius = 0.05 + 0.55 * progress; + radius *= (0.9 + 0.1 * sin(time * 2.5)); + radius *= (0.15 + 0.85 * vanish); + radius = max(radius, 0.001); + + float phi = dist * 3.14159; + float theta = angle; + float sx = sin(phi) * cos(theta); + float sz = cos(phi); + float rotAngle = time * 0.6; + float cx = sx * cos(rotAngle) - sz * sin(rotAngle); + float cz = sx * sin(rotAngle) + sz * cos(rotAngle); + sx = cx; sz = cz; + + float sphereMask = 1.0 - smoothstep(0.0, radius, dist); + + float grid = 0.0; + float lat = sin(phi * 8.0 + time * 0.2) * 0.5 + 0.5; + float lon = sin(theta * 6.0 + time * 0.4) * 0.5 + 0.5; + grid = (lat > 0.97 || lon > 0.97) ? 1.0 : 0.0; + grid *= sphereMask * (0.6 + 0.4 * sz); + grid *= 1.5; + + float rings = 0.0; + for (int i = 0; i < 4; i++) { + float fi = float(i); + float radiusRing = 0.25 + fi * 0.15 + 0.05 * sin(time * 0.4 + fi * 1.1); + float ringDist = length(dir); + float ringWidth = 0.01 + 0.01 * (1.0 - progress); + float ring = 1.0 - smoothstep(radiusRing - ringWidth, radiusRing + ringWidth, ringDist); + ring *= (1.0 - abs(ringDist - radiusRing) * 4.0); + ring *= (0.7 + 0.3 * sin(time * 1.0 + fi * 1.3)); + ring *= sphereMask * (0.5 + 0.5 * sz); + rings += ring * 0.8; + } + rings *= 1.8; + + float lightning = 0.0; + for (int i = 0; i < 8; i++) { + float seed = float(i) * 1.73 + 0.5; + float a = hash21(vec2(seed, 0.0)) * 6.2832; + float len = 0.3 + 0.7 * hash21(vec2(seed, 1.0)); + float life = fract(time * 0.8 + seed * 0.5); + float bright = 1.0 - smoothstep(0.1, 0.9, life); + float rad = radius * (0.2 + 0.8 * len); + vec2 pos = vec2(0.5 + rad * cos(a + time * 0.4), 0.5 + rad * sin(a + time * 0.4)); + vec2 delta = uv - pos; + vec2 dirToPoint = normalize(pos - center); + vec2 perp = vec2(-dirToPoint.y, dirToPoint.x); + float proj = dot(delta, dirToPoint); + float perpDist = abs(dot(delta, perp)); + float line = 1.0 - smoothstep(0.0, 0.02, perpDist); + line *= smoothstep(0.0, 0.1, proj) * smoothstep(1.0, 0.85, proj / (rad + 0.001)); + lightning += line * bright * 1.2; + } + lightning *= sphereMask * (0.5 + 0.5 * sz); + lightning *= 1.5; + + float coreDist = length(dir) / (0.03 + 0.02 * progress); + float core = exp(-coreDist * coreDist) * 2.5; + core *= (1.0 - progress * 0.2); + core *= (0.6 + 0.4 * sz); + + float particles = 0.0; + for (int i = 0; i < 60; i++) { + float seed = float(i) * 1.37; + float a = hash21(vec2(seed, 0.0)) * 6.2832; + float r = radius * (0.1 + 0.9 * hash21(vec2(seed, 1.0))); + float life = fract(time * 0.5 + seed * 0.3); + float bright = 1.0 - smoothstep(0.1, 0.9, life); + float angleOff = time * (0.4 + 0.6 * hash21(vec2(seed, 2.0))); + float phiP = (r / radius) * 3.14159; + float thetaP = a + angleOff; + float sxP = sin(phiP) * cos(thetaP); + float syP = sin(phiP) * sin(thetaP); + float szP = cos(phiP); + vec2 pos = center + vec2(sxP, syP) * radius * 0.5; + float szFactor = 0.5 + 0.5 * szP; + float sz2 = 0.005 + 0.025 * hash21(vec2(seed, 3.0)); + float d = length(uv - pos); + float p = exp(-d * d / (2.0 * sz2 * sz2)); + particles += p * bright * 0.8 * szFactor; + } + particles *= (1.0 - progress * 0.5); + particles *= 1.8; + + float glow = exp(-dist * 5.0) * 0.6 * (1.0 + 0.3 * sin(time * 2.5)); + glow *= (1.0 - progress * 0.3); + glow *= (0.6 + 0.4 * sz); + float bloom = exp(-dist * 3.0) * 0.3; + + float ring2 = 0.0; + float r2 = radius * 1.7 * progress; + ring2 = 1.0 - smoothstep(r2 - 0.03, r2 + 0.03, dist); + ring2 *= 0.5 * (1.0 - progress) * sin(progress * 3.14159); + ring2 *= 1.5; + + vec3 baseColor = u_Color.rgb; + vec3 gridColor = mix(baseColor, vec3(0.9, 0.95, 1.0), 0.4); + vec3 ringColor = mix(baseColor, vec3(1.0, 0.9, 0.5), 0.5); + vec3 lightningColor = vec3(0.8, 0.9, 1.0); + vec3 coreColor = vec3(1.0, 0.98, 0.9); + vec3 particleColor = vec3(1.0, 0.85, 0.5); + vec3 glowColor = mix(baseColor, vec3(0.6, 0.8, 1.0), 0.5); + + float finalIntensity = grid + rings + lightning + core + particles + glow + bloom + ring2; + vec3 finalColor = gridColor * grid * 1.5 + + ringColor * rings * 1.2 + + lightningColor * lightning * 1.0 + + coreColor * core * 2.5 + + particleColor * particles * 0.9 + + glowColor * glow * 0.6 + + vec3(0.8, 0.9, 1.0) * bloom * 0.5 + + baseColor * ring2 * 0.6; + finalColor *= intensity * 1.2; + + float finalAlpha = clamp(finalIntensity * 1.6, 0.0, 1.0) * v_Color.a; + float vignette = 1.0 - dist * 0.5; + finalAlpha *= mix(vignette, 1.0, 0.5); + finalAlpha *= appear * vanish; + + if (finalAlpha < 0.01) discard; + color = vec4(clamp(finalColor, 0.0, 1.0), finalAlpha); +} diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_tornado.frag b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_tornado.frag new file mode 100644 index 0000000..0f048bd --- /dev/null +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/kill_effect_tornado.frag @@ -0,0 +1,106 @@ +#version 330 core + +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + */ + +out vec4 color; + +layout (std140) uniform KillEffectBeam { + vec4 u_Params0; // time, progress, intensity, size + vec4 u_Color; +}; + +in vec2 v_TexCoord; +in vec4 v_Color; + +float hash21(vec2 p) { + p = fract(p * vec2(443.8975, 397.2973)); + p += dot(p, p + 19.19); + return fract(p.x * p.y); +} + +float smoothNoise2D(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + return mix( + mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), + mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), + f.y + ); +} + +float fbm2D(vec2 p, int octaves) { + float v = 0.0, a = 0.5, freq = 1.0; + for (int k = 0; k < octaves; k++) { + v += a * smoothNoise2D(p * freq); + freq *= 2.03; + a *= 0.48; + } + return v; +} + +void main() { + if (v_TexCoord.y < 0.0) discard; + + float x = v_TexCoord.x * 2.0 - 1.0; + float y = v_TexCoord.y; + float t = u_Params0.x; + float prog = clamp(u_Params0.y, 0.0, 1.0); + float intensity = u_Params0.z; + + float baseFade = smoothstep(0.0, 0.05, y); + float topFade = 1.0 - smoothstep(0.55, 0.98, y); + + float rise = 0.10 + prog * 1.0; + float growing = 1.0 - smoothstep(rise - 0.12, rise, y); + float body = growing * topFade * baseFade; + if (body <= 0.001) discard; + + float radius = mix(0.10, 0.95, pow(y, 1.4)); + float r = abs(x) / max(radius, 1.0e-4); + + float wall = 1.0 - smoothstep(0.0, 1.0, abs(r - 0.72) * 2.2); + + vec2 sw = vec2(x * 3.0, y * 6.0 - t * 2.5); + float twirl = fbm2D(sw + vec2(t * 0.3, 0.0), 4); + float bands = smoothstep(0.30, 0.80, twirl + 0.2 * sin(x * 8.0 + y * 12.0 - t * 4.0)); + + float core = exp(-(x * x) / (2.0 * 0.11 * 0.11)) * smoothstep(0.0, 0.10, y); + + float particles = 0.0; + for (int i = 0; i < 20; i++) { + float seed = float(i) * 1.37 + 3.1; + float hgt = fract(t * 0.35 + hash21(vec2(seed, 0.0)) * 0.8); + if (hgt > rise - 0.1) continue; + float angular = (hgt * 3.0 + t) * 3.0; + float px = sin(angular + seed) * 0.55; + float sz = 0.03 + 0.05 * hash21(vec2(seed, 1.0)); + vec2 dc = vec2((x - px) * 1.2, (y - hgt) * 2.0); + particles += exp(-dot(dc, dc) / (2.0 * sz * sz)) * 0.7; + } + + float glow = exp(-abs(x) * 2.6) * 0.4 * (0.6 + 0.4 * sin(t * 2.0)); + + vec3 base = u_Color.rgb; + vec3 spiralColor = mix(base, vec3(0.45, 0.50, 1.00), 0.55); + vec3 coreColor = vec3(0.90, 0.85, 1.00); + vec3 particleColor = vec3(0.60, 0.80, 1.00); + + vec3 finalColor = spiralColor * bands * wall * 1.10 + + coreColor * core * 1.60 + + particleColor * particles * 0.90 + + vec3(0.40, 0.50, 1.00) * glow; + + float fin = (wall * bands * 0.80 + core + particles * 0.50 + glow * 0.30) * body; + float alpha = clamp(fin * 1.20, 0.0, 1.0) * v_Color.a; + + float fadeIn = smoothstep(0.0, 0.08, prog); + float fadeOut = 1.0 - smoothstep(0.60, 1.0, prog); + alpha *= fadeIn * fadeOut * intensity; + + if (alpha < 0.01) discard; + color = vec4(clamp(finalColor * intensity, 0.0, 1.0), alpha); +} diff --git a/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/sky_shader_nebula.frag b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/sky_shader_nebula.frag new file mode 100644 index 0000000..40facae --- /dev/null +++ b/combatant-client-26.2/src/main/resources/assets/lovisual/shaders/sky_shader_nebula.frag @@ -0,0 +1,146 @@ +#version 330 core + +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + */ + +out vec4 color; + +layout (std140) uniform SkyShaderData { + vec4 u_Resolution; // xy = size, z = time, w = speed + vec4 u_Settings; // x = intensity, y = alpha, z = FOV, w = spare + vec4 u_CameraDir; // orientation quaternion + vec4 u_SkyZenith; + vec4 u_SkyHorizon; + vec4 u_NebColor1; + vec4 u_NebColor2; + vec4 u_StarColor; + vec4 u_FogColor; + vec4 u_FogRange; +}; + +float hash21(vec2 p) { + p = fract(p * vec2(443.8975, 397.2973)); + p += dot(p, p + 19.19); + return fract(p.x * p.y); +} + +float smoothNoise2D(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + float a = hash21(i); + float b = hash21(i + vec2(1.0, 0.0)); + float c = hash21(i + vec2(0.0, 1.0)); + float d = hash21(i + vec2(1.0, 1.0)); + return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); +} + +float fbm(vec2 p) { + float v = 0.0, a = 0.5, freq = 1.0; + for (int k = 0; k < 5; k++) { + v += a * smoothNoise2D(p * freq); + freq *= 2.1; + a *= 0.48; + } + return v; +} + +vec2 warp(vec2 p, float t) { + vec2 q = vec2(fbm(p + vec2(0.0, 0.0) + t * 0.12), + fbm(p + vec2(5.2, 1.3) + t * 0.09)); + vec2 r = vec2(fbm(p + 4.0 * q + vec2(1.7, 9.2) + t * 0.06), + fbm(p + 4.0 * q + vec2(8.3, 2.8) + t * 0.07)); + return p + 1.8 * r; +} + +vec3 calcRayDir() { + vec2 uv = gl_FragCoord.xy / u_Resolution.xy; + vec2 sp = uv * 2.0 - 1.0; + float aspect = u_Resolution.x / u_Resolution.y; + float tanV = tan(radians(u_Settings.z) * 0.5); + vec3 ray = normalize(vec3(sp.x * tanV * aspect, sp.y * tanV, -1.0)); + + vec3 qv = u_CameraDir.xyz; + float qw = u_CameraDir.w; + mat3 rot = mat3( + 1.0 - 2.0*(qv.y*qv.y + qv.z*qv.z), 2.0*(qv.x*qv.y + qv.z*qw), 2.0*(qv.x*qv.z - qv.y*qw), + 2.0*(qv.x*qv.y - qv.z*qw), 1.0 - 2.0*(qv.x*qv.x + qv.z*qv.z), 2.0*(qv.y*qv.z + qv.x*qw), + 2.0*(qv.x*qv.z + qv.y*qw), 2.0*(qv.y*qv.z - qv.x*qw), 1.0 - 2.0*(qv.x*qv.x + qv.y*qv.y) + ); + return rot * ray; +} + +void main() { + vec3 dir = normalize(calcRayDir()); + vec2 uv = gl_FragCoord.xy / u_Resolution.xy; + float time = u_Resolution.z; + float speed = u_Resolution.w; + float anim = time * speed; + + float up = clamp(dir.y, 0.0, 1.0); + float horizonFade = smoothstep(-0.15, 0.05, dir.y); + if (horizonFade < 0.005) discard; + + float intensity = u_Settings.x; + float alpha = u_Settings.y; + + vec3 drift = vec3(0.0, anim * 0.025, anim * 0.04); + + vec2 p = dir.xz * 1.0 + drift.xz * 0.9; + p.y += dir.y * 0.2; + + float t = anim * 0.045; + vec2 wp = warp(p, t); + + float n1 = fbm(wp * 0.9 + vec2(0.0, 0.0)); + float n2 = fbm(wp * 1.5 + vec2(2.7, 4.3)); + float n3 = fbm(wp * 0.5 + vec2(-1.8, 3.1)); + float n4 = fbm(wp * 2.2 + vec2(-3.0, 1.2)); + + float juice = (n1 * 0.4 + n2 * 0.25 + n3 * 0.20 + n4 * 0.15); + juice = smoothstep(0.15, 0.85, juice); + + float heightMask = 0.7 + 0.3 * smoothstep(0.0, 0.6, up); + float flicker = 0.8 + 0.2 * sin(anim * 0.5 + dir.x * 14.0 + dir.z * 10.0); + flicker *= 0.9 + 0.1 * sin(anim * 0.9 + dir.y * 18.0); + juice = juice * heightMask * flicker; + + float glitter = 0.0; + for (int i = 0; i < 3; i++) { + float seed = float(i) * 2.13; + vec2 pos = vec2( + 0.5 + 0.8 * sin(seed * 1.7 + anim * 0.2 + p.x * 0.5), + 0.5 + 0.8 * cos(seed * 2.3 + anim * 0.15 + p.y * 0.5) + ); + float d = length(uv - pos); + float sz = 0.01 + 0.02 * sin(seed * 3.1 + anim * 0.3); + glitter += exp(-d * d / (2.0 * sz * sz)) * 0.6; + } + glitter *= (0.7 + 0.3 * sin(anim * 0.6 + p.x * 5.0)); + + float mix1 = 0.5 + 0.5 * sin(anim * 0.06 + p.x * 1.2 + p.y * 0.8 + juice * 1.5); + float mix2 = 0.5 + 0.5 * cos(anim * 0.08 + p.x * 0.9 - p.y * 1.1 + juice * 2.0); + vec3 color1 = mix(u_NebColor1.rgb, u_NebColor2.rgb, mix1); + vec3 color2 = mix(u_NebColor2.rgb, vec3(1.0, 0.9, 0.8), 0.3); + vec3 nebColor = mix(color1, color2, mix2); + + float hot = exp(-abs(juice - 0.4) * 6.0) * 0.6; + nebColor += vec3(1.0, 0.95, 0.7) * hot; + + nebColor += u_StarColor.rgb * glitter * 0.8; + + float bloom = exp(-juice * 3.0) * 0.4; + nebColor += vec3(0.9, 0.8, 1.0) * bloom * 0.5; + + float finalIntensity = juice * 1.3 + hot * 0.3 + glitter * 0.4; + vec3 finalColor = nebColor * finalIntensity * intensity; + + float finalAlpha = clamp(finalIntensity * 1.5, 0.0, 1.0) * alpha * horizonFade; + float vignette = 1.0 - length(dir.xz) * 0.15; + finalAlpha *= clamp(vignette, 0.0, 1.0); + + if (finalAlpha < 0.01) discard; + color = vec4(clamp(finalColor, 0.0, 1.0), finalAlpha); +} diff --git a/combatant-client-26.2/src/main/resources/lovisual.mixins.json b/combatant-client-26.2/src/main/resources/lovisual.mixins.json index aed0e13..8de260b 100644 --- a/combatant-client-26.2/src/main/resources/lovisual.mixins.json +++ b/combatant-client-26.2/src/main/resources/lovisual.mixins.json @@ -5,181 +5,182 @@ "package": "dev.loki.lovisual.mixins", "compatibilityLevel": "JAVA_21", "mixins": [ - "BlockCollisionSpliteratorMixin", - "BlockMixin", - "ConnectionMixin", - "EntityMixin", - "FlowingFluidMixin", - "HoneyBlockMixin", - "ItemCooldownsMixin", - "ItemMixin", - "LevelMixin", - "LivingEntityMixin", - "PlayerEntityMixin", - "PlayerInventoryMixin", - "ProjectileUtilMixin", - "SlimeBlockMixin", - "accessors.ClientboundExplodePacketAccessor", - "accessors.ClientboundSetEntityMotionPacketAccessor", - "accessors.EffectParticleEffectAccessor", - "accessors.EntityAccessor", - "accessors.EntityInvoker", - "accessors.ItemCooldownEntryAccessor", - "accessors.LivingEntityAccessor", - "accessors.PlayerInventoryAccessor", - "accessors.ServerboundInteractPacketAccessor", - "accessors.ServerboundMovePlayerPacketAccessor", - "accessors.SlotAccessor", - "accessors.WorldAccessor" + "accessors.entity.EntityAccessor", + "accessors.entity.EntityInvoker", + "accessors.entity.LivingEntityAccessor", + "accessors.inventory.ItemCooldownEntryAccessor", + "accessors.inventory.PlayerInventoryAccessor", + "accessors.inventory.SlotAccessor", + "accessors.packet.ClientboundExplodePacketAccessor", + "accessors.packet.ClientboundSetEntityMotionPacketAccessor", + "accessors.packet.ServerboundInteractPacketAccessor", + "accessors.packet.ServerboundMovePlayerPacketAccessor", + "accessors.state.EffectParticleEffectAccessor", + "accessors.world.WorldAccessor", + "entity.inventory.ItemCooldownsMixin", + "entity.inventory.ItemMixin", + "entity.inventory.PlayerInventoryMixin", + "entity.living.LivingEntityMixin", + "entity.player.PlayerEntityMixin", + "entity.world.EntityMixin", + "entity.world.ProjectileUtilMixin", + "network.packet.ConnectionMixin", + "world.block.BlockCollisionSpliteratorMixin", + "world.block.BlockMixin", + "world.block.HoneyBlockMixin", + "world.block.SlimeBlockMixin", + "world.fluid.FlowingFluidMixin", + "world.level.LevelMixin" ], "client": [ - "AbstractClientPlayerMixin", - "AbstractContainerScreenMixin", - "AbstractSelectionListMixin", - "AbstractSliderButtonMixin", - "AbstractWidgetMixin", - "AtmosphericFogEnvironmentMixin", - "BatchingRenderCommandQueueMixin", - "BossHealthOverlayMixin", - "BufferManagerDefaultBufferManagerMixin", - "ButtonWidgetTextMixin", - "CameraMixin", - "ChatComponentMixin", - "ChatScreenMixin", - "ClientClockManagerMixin", - "ClientCommonPacketListenerImplMixin", - "ClientLevelMixin", - "ClientPacketListenerMixin", - "CommandEncoderMixin", - "ContextualBarMixin", - "CycleButtonMixin", - "DebugHudMixin", - "DynamicUniformStorageMixin", - "EquipmentLayerRendererMixin", - "ExperienceBarMixin", - "FireworkRocketEntityMixin", - "FogRendererMixin", - "FontManagerMixin", - "GameRendererMixin", - "GameRendererViewEffectsMixin", - "GlDeviceBackendMixin", - "GlStateManagerMixin", - "GlTextureMixin", - "GpuDeviceMixin", - "GpuSurfaceMixin", - "GuiGraphicsMixin", - "GuiMixin", - "GuiRendererMixin", - "GuiScreenMixin", - "InputMixin", - "ItemEntityRendererMixin", - "ItemEntityRenderStateMixin", - "ItemFeatureRendererMixin", - "ItemInHandRendererMixin", - "ItemStackMixin", - "JoinMultiplayerScreenMixin", - "JumpBarMixin", - "KeyboardInputMixin", - "KeyboardMixin", - "KeyMappingMixin", - "LavaFogModifierMixin", - "LevelExtractorMixin", - "LevelRendererMixin", - "LibraryMixin", - "LightmapMixin", - "LightmapRenderStateExtractorMixin", - "LivingEntityRendererMixin", - "LivingEntityRenderStateMixin", - "LocalPlayerDropMixin", - "LocalPlayerMixin", - "LocatorBarMixin", - "MinecraftMixin", - "MouseMixin", - "MultiPlayerGameModeMixin", - "MultiPlayerGameModeThrowMixin", - "NarratorManagerMixin", - "OptionsNarratorMixin", - "ParticleManagerMixin", - "PauseScreenMixin", - "PlayerInfoMixin", - "PlayerTabOverlayMixin", - "PowderSnowFogModifierMixin", - "RecipeBookScreenMixin", - "RenderPassMixin", - "RenderPipelineMixin", - "ScreenEffectRendererMixin", - "ScreenMixin", - "SoundEngineMixin", - "ServerboundUseItemPacketMixin", - "ShaderLoaderMixin", - "SkyRendererMixin", - "SpriteIconButtonCenteredIconMixin", - "SpriteIconButtonTextAndIconMixin", - "TitleScreenMixin", - "ToastManagerMixin", - "TooltipRenderUtilMixin", - "VulkanCommandEncoderMixin", - "VulkanDeviceMixin", - "VulkanGpuTextureMixin", - "VulkanGpuTextureViewMixin", - "VulkanRenderPassMixin", - "VulkanRenderPipelineMixin", - "WaterFogEnvironmentMixin", - "accessors.BossHealthOverlayAccessor", - "accessors.ChatInputSuggestorAccessor", - "accessors.ChatScreenAccessor", - "accessors.ChatScreenSuggestorAccessor", - "accessors.ClickableWidgetAccessor", - "accessors.ClientLevelAccessor", - "accessors.CyclingButtonWidgetAccessor", - "accessors.EntityRendererAccessor", - "accessors.EntityRenderManagerAccessor", - "accessors.FireworksComponentAccessor", - "accessors.GameRendererAccessor", - "accessors.GlTextureInvoker", - "accessors.GpuDeviceAccessor", - "accessors.InGameOverlayRendererAccessor", - "accessors.InputAccessor", - "accessors.ItemCooldownEntryAccessor", - "accessors.ItemCooldownManagerAccessor", - "accessors.KeyMappingAccessor", - "accessors.LevelExtractorAccessor", - "accessors.LevelRendererAccessor", - "accessors.LivingEntityRenderStateAccessor", - "accessors.LocalPlayerAccessor", - "accessors.MinecraftAccessor", - "accessors.MultiPlayerGameModeAccessor", - "accessors.PersistentProjectileEntityAccessor", - "accessors.PlayerTabOverlayAccessor", - "accessors.RenderLayerInvokerAccessor", - "accessors.ShaderLoaderDefinitionsAccessor", - "accessors.ShaderSourceKeyAccessor", - "accessors.SliderWidgetAccessor", - "accessors.SuggestionWindowAccessor", - "accessors.TextFieldWidgetAccessor", - "accessors.TextIconButtonWidgetAccessor", - "iris.IrisCommonUniformsMixin", - "iris.IrisGameRendererInteropMixin", - "iris.IrisHandRendererAccessor", - "iris.IrisHandRendererMixin", - "iris.IrisIncludeProcessorMixin", - "iris.IrisRenderingPipelineFinalizeMixin", - "iris.IrisShaderPackLoadMixin", - "iris.IrisVanillaHandInteropMixin", + "accessors.blaze3d.GlTextureInvoker", + "accessors.blaze3d.GpuDeviceAccessor", + "accessors.blaze3d.ShaderLoaderDefinitionsAccessor", + "accessors.blaze3d.ShaderSourceKeyAccessor", + "accessors.chat.ChatInputSuggestorAccessor", + "accessors.chat.ChatScreenAccessor", + "accessors.chat.ChatScreenSuggestorAccessor", + "accessors.chat.SuggestionWindowAccessor", + "accessors.entity.LocalPlayerAccessor", + "accessors.hud.BossHealthOverlayAccessor", + "accessors.hud.InGameOverlayRendererAccessor", + "accessors.hud.PlayerTabOverlayAccessor", + "accessors.hud.TextIconButtonWidgetAccessor", + "accessors.inventory.ItemCooldownEntryAccessor", + "accessors.inventory.ItemCooldownManagerAccessor", + "accessors.misc.InputAccessor", + "accessors.misc.KeyMappingAccessor", + "accessors.misc.MinecraftAccessor", + "accessors.misc.MultiPlayerGameModeAccessor", + "accessors.projectile.PersistentProjectileEntityAccessor", + "accessors.renderer.EntityRenderManagerAccessor", + "accessors.renderer.EntityRendererAccessor", + "accessors.renderer.GameRendererAccessor", + "accessors.renderer.RenderLayerInvokerAccessor", + "accessors.state.FireworksComponentAccessor", + "accessors.state.LivingEntityRenderStateAccessor", + "accessors.widget.ClickableWidgetAccessor", + "accessors.widget.CyclingButtonWidgetAccessor", + "accessors.widget.SliderWidgetAccessor", + "accessors.widget.TextFieldWidgetAccessor", + "accessors.world.ClientLevelAccessor", + "accessors.world.LevelExtractorAccessor", + "accessors.world.LevelRendererAccessor", + "blaze3d.device.GlDeviceBackendMixin", + "blaze3d.device.GpuDeviceMixin", + "blaze3d.device.GpuSurfaceMixin", + "blaze3d.device.VulkanDeviceMixin", + "blaze3d.encoder.BatchingRenderCommandQueueMixin", + "blaze3d.encoder.CommandEncoderMixin", + "blaze3d.encoder.VulkanCommandEncoderMixin", + "blaze3d.pipeline.RenderPassMixin", + "blaze3d.pipeline.RenderPipelineMixin", + "blaze3d.pipeline.VulkanRenderPassMixin", + "blaze3d.pipeline.VulkanRenderPipelineMixin", + "blaze3d.shader.DynamicUniformStorageMixin", + "blaze3d.shader.GlStateManagerMixin", + "blaze3d.shader.ShaderLoaderMixin", + "blaze3d.texture.BufferManagerDefaultBufferManagerMixin", + "blaze3d.texture.GlTextureMixin", + "blaze3d.texture.VulkanGpuTextureMixin", + "blaze3d.texture.VulkanGpuTextureViewMixin", + "entity.inventory.ItemStackMixin", + "entity.living.LivingEntityRendererMixin", + "entity.player.AbstractClientPlayerMixin", + "entity.player.LocalPlayerDropMixin", + "entity.player.LocalPlayerMixin", + "entity.world.FireworkRocketEntityMixin", + "gui.chat.ChatComponentMixin", + "gui.chat.ChatScreenMixin", + "gui.chat.ContextualBarMixin", + "gui.core.AbstractContainerScreenMixin", + "gui.core.AbstractSelectionListMixin", + "gui.core.AbstractSliderButtonMixin", + "gui.core.AbstractWidgetMixin", + "gui.multiplayer.JoinMultiplayerScreenMixin", + "gui.multiplayer.RecipeBookScreenMixin", + "gui.screens.GuiScreenMixin", + "gui.screens.PauseScreenMixin", + "gui.screens.ScreenMixin", + "gui.screens.TitleScreenMixin", + "gui.widgets.ButtonWidgetTextMixin", + "gui.widgets.CycleButtonMixin", + "gui.widgets.SpriteIconButtonCenteredIconMixin", + "gui.widgets.SpriteIconButtonTextAndIconMixin", + "hud.DebugHudMixin", + "hud.GuiGraphicsMixin", + "hud.GuiMixin", + "hud.GuiRendererMixin", + "hud.accessibility.NarratorManagerMixin", + "hud.accessibility.OptionsNarratorMixin", + "hud.bars.BossHealthOverlayMixin", + "hud.bars.ExperienceBarMixin", + "hud.bars.JumpBarMixin", + "hud.bars.LocatorBarMixin", + "hud.tablist.PlayerTabOverlayMixin", + "hud.tooltips.ToastManagerMixin", + "hud.tooltips.TooltipRenderUtilMixin", + "input.keyboard.KeyMappingMixin", + "input.keyboard.KeyboardInputMixin", + "input.keyboard.KeyboardMixin", + "input.mouse.InputMixin", + "input.mouse.MouseMixin", + "iris.hand.IrisHandRendererAccessor", + "iris.hand.IrisHandRendererMixin", + "iris.hand.IrisVanillaHandInteropMixin", + "iris.processor.IrisIncludeProcessorMixin", + "iris.render.IrisCommonUniformsMixin", + "iris.render.IrisGameRendererInteropMixin", + "iris.render.IrisRenderingPipelineFinalizeMixin", + "iris.render.IrisShaderPackLoadMixin", "moreculling.CullingUtilsMixin", - "security.AbstractSignEditScreenMixin", - "security.AnvilScreenMixin", - "security.ClientLoginNetworkHandlerMixin", - "security.GameOptionsMixin", - "security.NetworkUtilsMixin", - "security.TranslatableTextContentMixin", - "security.TranslationStorageMixin", - "sodium.SodiumBlockRendererMixin", - "sodium.SodiumChunkMeshFormatsMixin", - "sodium.SodiumChunkVertexMixin", - "sodium.SodiumShaderChunkRendererMixin", - "sodium.SodiumVertexConsumerTrackerMixin", - "sodium.SodiumWorldRendererFreecamMixin", + "network.game.ClientPacketListenerMixin", + "network.game.MultiPlayerGameModeMixin", + "network.game.MultiPlayerGameModeThrowMixin", + "network.game.PlayerInfoMixin", + "network.packet.ClientCommonPacketListenerImplMixin", + "network.packet.ServerboundUseItemPacketMixin", + "render.entity.ItemEntityRenderStateMixin", + "render.entity.ItemEntityRendererMixin", + "render.entity.LivingEntityRenderStateMixin", + "render.fog.AtmosphericFogEnvironmentMixin", + "render.fog.FogRendererMixin", + "render.fog.LavaFogModifierMixin", + "render.fog.WaterFogEnvironmentMixin", + "render.fogmod.PowderSnowFogModifierMixin", + "render.item.EquipmentLayerRendererMixin", + "render.item.ItemFeatureRendererMixin", + "render.item.ItemInHandAlwaysVisibleMixin", + "render.item.ItemInHandRendererMixin", + "render.level.CameraMixin", + "render.level.LevelRendererMixin", + "render.level.ParticleManagerMixin", + "render.level.SkyRendererMixin", + "render.light.LightmapMixin", + "render.light.LightmapRenderStateExtractorMixin", + "render.main.GameRendererMixin", + "render.main.GameRendererViewEffectsMixin", + "render.main.MinecraftMixin", + "render.main.ScreenEffectRendererMixin", + "render.sound.LibraryMixin", + "render.sound.SoundEngineMixin", + "render.text.FontManagerMixin", + "security.net.ClientLoginNetworkHandlerMixin", + "security.net.GameOptionsMixin", + "security.net.NetworkUtilsMixin", + "security.text.AbstractSignEditScreenMixin", + "security.text.AnvilScreenMixin", + "security.text.TranslatableTextContentMixin", + "security.text.TranslationStorageMixin", + "sodium.terrain.SodiumBlockRendererMixin", + "sodium.terrain.SodiumChunkMeshFormatsMixin", + "sodium.terrain.SodiumShaderChunkRendererMixin", + "sodium.vertex.SodiumChunkVertexMixin", + "sodium.vertex.SodiumVertexConsumerTrackerMixin", + "sodium.vertex.SodiumWorldRendererFreecamMixin", + "world.level.ClientClockManagerMixin", + "world.level.ClientLevelMixin", + "world.level.LevelExtractorMixin", "xaero.minimap.AbstractWaypointRenderProviderMixin", "xaero.worldmap.WaypointRenderProviderMixin" ], diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileDiffEngineTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileDiffEngineTest.java index 2c86345..3145c3c 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileDiffEngineTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileDiffEngineTest.java @@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -final class ConfigProfileDiffEngineTest { +public final class ConfigProfileDiffEngineTest { private final ConfigProfileDiffEngine engine = new ConfigProfileDiffEngine(); diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileStorageTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileStorageTest.java index 382a658..faf17bd 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileStorageTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileStorageTest.java @@ -27,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; * совместимость с легаси-профилями .cbcfg (чтение, листинг, импорт, удаление). * Чистая файловая логика без инициализации Minecraft. */ -final class ConfigProfileStorageTest { +public final class ConfigProfileStorageTest { @TempDir Path tempDir; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodecTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodecTest.java index c12653e..0889413 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodecTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/profile/ConfigProfileValueCodecTest.java @@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; -final class ConfigProfileValueCodecTest { +public final class ConfigProfileValueCodecTest { @Test void roundTripsNull() throws IOException { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ColorValueTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ColorValueTest.java index 06dfb37..0f21c2a 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ColorValueTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ColorValueTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class ColorValueTest { +public final class ColorValueTest { @Test void rgbNormalizesSupportedFormats() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/EnumValueTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/EnumValueTest.java index 0524e90..7ecf397 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/EnumValueTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/EnumValueTest.java @@ -13,7 +13,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; -final class EnumValueTest { +public final class EnumValueTest { private enum Speed implements EnumValue.IdProvider, EnumValue.AliasProvider { FAST("fast-id", List.of("f", "turbo")), diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ModeValueTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ModeValueTest.java index 7572d95..7295aeb 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ModeValueTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/ModeValueTest.java @@ -16,7 +16,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -final class ModeValueTest { +public final class ModeValueTest { @Test void invalidDefaultFallsBackToFirstOption() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/PrimitiveValuesTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/PrimitiveValuesTest.java index 97806c7..62d8393 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/PrimitiveValuesTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/config/values/PrimitiveValuesTest.java @@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; -final class PrimitiveValuesTest { +public final class PrimitiveValuesTest { @Test void numberClampsDefaultToRange() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/events/EventBusTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/events/EventBusTest.java index 12192c6..4178b34 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/events/EventBusTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/events/EventBusTest.java @@ -20,8 +20,11 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; +import dev.loki.lovisual.events.Event; +import dev.loki.lovisual.events.EventBus; +import dev.loki.lovisual.events.meta.EventHandler; -final class EventBusTest { +public final class EventBusTest { static class BaseEvent extends Event { } diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandDiscoveryTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandDiscoveryTest.java index 194d59e..4176892 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandDiscoveryTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandDiscoveryTest.java @@ -14,7 +14,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; -class CommandDiscoveryTest { +public class CommandDiscoveryTest { @Test void discoversAnnotatedProductionCommandsWithoutManualRegistration() { List commands = CommandManager.getCommands(); diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandPrefixTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandPrefixTest.java index f1e8ea3..97af7a6 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandPrefixTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/CommandPrefixTest.java @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -final class CommandPrefixTest { +public final class CommandPrefixTest { @Test void percentIsTheActivePrefix() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/UsageHintsTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/UsageHintsTest.java index 59f9484..6b96948 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/UsageHintsTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/UsageHintsTest.java @@ -14,7 +14,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -final class UsageHintsTest { +public final class UsageHintsTest { @Test void extractsPlaceholdersFromUsage() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/impl/XaeroWaypointCommandTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/impl/XaeroWaypointCommandTest.java index 2f4cbd0..2437677 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/impl/XaeroWaypointCommandTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/command/impl/XaeroWaypointCommandTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -class XaeroWaypointCommandTest { +public class XaeroWaypointCommandTest { @Test void parsesAbsoluteAndCurrentCoordinates() { assertEquals(120, XaeroWaypointCommand.parseCoordinate("120", 7)); diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolverTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolverTest.java index 5954fa2..9abb140 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolverTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/clickgui/layout/screen/settings/MenuSettingsResolverTest.java @@ -10,7 +10,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -class MenuSettingsResolverTest { +public class MenuSettingsResolverTest { @BeforeAll static void loadWidgets() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/HudElementAutoLoaderTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/HudElementAutoLoaderTest.java index 5aaa69a..777206c 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/HudElementAutoLoaderTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/HudElementAutoLoaderTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertTrue; -class HudElementAutoLoaderTest { +public class HudElementAutoLoaderTest { @Test void registersDraggableWidgets() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorSolverTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorSolverTest.java index 7d3a5ce..09fed99 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorSolverTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/gui/hud/draggable/impl/triangulator/TriangulatorSolverTest.java @@ -12,8 +12,9 @@ import org.junit.jupiter.api.Test; import java.util.List; import static org.junit.jupiter.api.Assertions.*; +import dev.loki.lovisual.features.gui.hud.draggable.impl.triangulator.TriangulatorSolver; -class TriangulatorSolverTest { +public class TriangulatorSolverTest { @Test void solve_nullEmpty_returnsNull() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStatsTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStatsTest.java new file mode 100644 index 0000000..8425264 --- /dev/null +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/combat/combatlog/CombatLogStatsTest.java @@ -0,0 +1,78 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.module.modules.combat.combatlog; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public final class CombatLogStatsTest { + + @Test + void sumsDealtAndTakenSeparately() { + List entries = List.of( + new CombatLogEntry("Bob", 4.0f, true, 1000L), + new CombatLogEntry("Bob", 2.0f, false, 1200L) + ); + + CombatLogStats.Summary summary = CombatLogStats.summarize(entries, 2000L, 10_000L); + + assertEquals(4.0f, summary.totalDealt()); + assertEquals(2.0f, summary.totalTaken()); + } + + @Test + void computesDpsOverWindow() { + List entries = List.of( + new CombatLogEntry("Bob", 10.0f, true, 1000L) + ); + + CombatLogStats.Summary summary = CombatLogStats.summarize(entries, 1000L, 5000L); + + assertEquals(2.0f, summary.dpsDealt()); + } + + @Test + void ignoresEntriesOutsideWindow() { + List entries = List.of( + new CombatLogEntry("Bob", 10.0f, true, 0L) + ); + + CombatLogStats.Summary summary = CombatLogStats.summarize(entries, 20_000L, 5000L); + + assertEquals(0.0f, summary.totalDealt()); + } + + @Test + void picksTopTargetAndAttackerByTotalDamage() { + List entries = List.of( + new CombatLogEntry("Bob", 3.0f, true, 1000L), + new CombatLogEntry("Alice", 5.0f, true, 1000L), + new CombatLogEntry("Carol", 8.0f, false, 1000L), + new CombatLogEntry("Dan", 1.0f, false, 1000L) + ); + + CombatLogStats.Summary summary = CombatLogStats.summarize(entries, 1000L, 10_000L); + + assertEquals("Alice", summary.topTarget()); + assertEquals("Carol", summary.topAttacker()); + } + + @Test + void emptyEntriesGiveEmptySummary() { + CombatLogStats.Summary summary = CombatLogStats.summarize(List.of(), 1000L, 10_000L); + + assertEquals(0.0f, summary.totalDealt()); + assertEquals(0.0f, summary.totalTaken()); + assertNull(summary.topTarget()); + assertNull(summary.topAttacker()); + } +} diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoServerPackTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoServerPackTest.java index 77ab7f4..41a423b 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoServerPackTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoServerPackTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class NoServerPackTest { +public final class NoServerPackTest { @Test void declinesInDeclineModeWhenEnabled() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoSoundTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoSoundTest.java index 4e0247d..4018c7a 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoSoundTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/NoSoundTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -final class NoSoundTest { +public final class NoSoundTest { @Test void resolveScaleConvertsPercent() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/ScrollMovePolicyTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/ScrollMovePolicyTest.java index ce812a6..ab1e173 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/ScrollMovePolicyTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/misc/ScrollMovePolicyTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class ScrollMovePolicyTest { +public final class ScrollMovePolicyTest { @Test void tinyScrollIsIgnored() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoAcceptTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoAcceptTest.java index d05e19e..09051e2 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoAcceptTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoAcceptTest.java @@ -14,7 +14,7 @@ import java.util.Set; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -final class AutoAcceptTest { +public final class AutoAcceptTest { private static final Set PATTERNS = Set.of("просит телепортироваться к себе", "has requested to teleport"); diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoLeaveTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoLeaveTest.java index 898a47f..0823352 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoLeaveTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoLeaveTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class AutoLeaveTest { +public final class AutoLeaveTest { @Test void zeroDelayLeavesImmediatelyOnTriggerEdge() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoRespawnTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoRespawnTest.java index 1afc3a0..460b7ce 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoRespawnTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/AutoRespawnTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class AutoRespawnTest { +public final class AutoRespawnTest { @Test void deathAloneDoesNotTriggerImmediately() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/DeathCoordsTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/DeathCoordsTest.java index af321a7..63c01ba 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/DeathCoordsTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/DeathCoordsTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class DeathCoordsTest { +public final class DeathCoordsTest { @Test void detectsAliveToDeadTransition() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/NoInteractTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/NoInteractTest.java index 680b47d..4e4b70e 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/NoInteractTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/NoInteractTest.java @@ -16,7 +16,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; -final class NoInteractTest { +public final class NoInteractTest { @ParameterizedTest(name = "state mask {0}") @MethodSource("allStateCombinations") void blockInteractionDecisionCoversEveryStateCombination( diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/TapeMouseTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/TapeMouseTest.java index 72da510..aa05fce 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/TapeMouseTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/TapeMouseTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class TapeMouseTest { +public final class TapeMouseTest { @Test void firstCallIsDueImmediately() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/UseTrackerTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/UseTrackerTest.java index 24858f0..718e88a 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/UseTrackerTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/player/UseTrackerTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -final class UseTrackerTest { +public final class UseTrackerTest { @Test void defaultOptionsTrackInvisibilityOnly() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AlwaysVisibleHandTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AlwaysVisibleHandTest.java new file mode 100644 index 0000000..88f403b --- /dev/null +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AlwaysVisibleHandTest.java @@ -0,0 +1,46 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.module.modules.visuals; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import dev.loki.lovisual.features.module.modules.visuals.items.AlwaysVisibleHand; + +public final class AlwaysVisibleHandTest { + + @Test + void bothModeForcesBothHandsVisible() { + assertArrayEquals(new boolean[]{true, true}, + AlwaysVisibleHand.resolveSelection(AlwaysVisibleHand.SELECTION_BOTH, false, false)); + assertArrayEquals(new boolean[]{true, true}, + AlwaysVisibleHand.resolveSelection(AlwaysVisibleHand.SELECTION_BOTH, true, false)); + } + + @Test + void mainModeKeepsMainHandAndPreservesVanillaOffHand() { + assertArrayEquals(new boolean[]{true, false}, + AlwaysVisibleHand.resolveSelection(AlwaysVisibleHand.SELECTION_MAIN, false, false)); + assertArrayEquals(new boolean[]{true, true}, + AlwaysVisibleHand.resolveSelection(AlwaysVisibleHand.SELECTION_MAIN, false, true)); + } + + @Test + void offModeKeepsOffHandAndPreservesVanillaMainHand() { + assertArrayEquals(new boolean[]{false, true}, + AlwaysVisibleHand.resolveSelection(AlwaysVisibleHand.SELECTION_OFF, false, true)); + assertArrayEquals(new boolean[]{true, true}, + AlwaysVisibleHand.resolveSelection(AlwaysVisibleHand.SELECTION_OFF, true, true)); + } + + @Test + void unknownModeFallsBackToVanillaDecision() { + assertArrayEquals(new boolean[]{false, true}, + AlwaysVisibleHand.resolveSelection("Something", false, true)); + } +} diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AtmoDawnFogTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AtmoDawnFogTest.java index 4d0cf7e..8cd92d9 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AtmoDawnFogTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/AtmoDawnFogTest.java @@ -11,11 +11,12 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import dev.loki.lovisual.features.module.modules.visuals.weather.AtmoDawnFog; /** * Чистая математика AtmoDawnFog: окно времени суток и высотное затухание. */ -final class AtmoDawnFogTest { +public final class AtmoDawnFogTest { private static final float EPS = 1e-4f; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatModelTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatModelTest.java index 6f507b8..2540910 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatModelTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatModelTest.java @@ -13,8 +13,9 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; +import dev.loki.lovisual.features.module.modules.visuals.hats.ChinaHatModel; -final class ChinaHatModelTest { +public final class ChinaHatModelTest { private static final double EPS = 1e-3; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatPaletteTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatPaletteTest.java index 1a1de9e..85de213 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatPaletteTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/ChinaHatPaletteTest.java @@ -10,8 +10,10 @@ package dev.loki.lovisual.features.module.modules.visuals; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import dev.loki.lovisual.features.module.modules.visuals.hats.ChinaHat; +import dev.loki.lovisual.features.module.modules.visuals.hats.ChinaHatPalette; -final class ChinaHatPaletteTest { +public final class ChinaHatPaletteTest { @Test void channelsAreIsolatedAndPreserved() { int argb = 0xA1B2C3D4; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/LightTintTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/LightTintTest.java index 1231190..9da1811 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/LightTintTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/LightTintTest.java @@ -11,8 +11,9 @@ import org.joml.Vector3f; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import dev.loki.lovisual.features.module.modules.visuals.visibility.Light; -final class LightTintTest { +public final class LightTintTest { private static final float EPS = 1e-4f; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/PostFxPresetTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/PostFxPresetTest.java index d216742..1c28e8a 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/PostFxPresetTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/PostFxPresetTest.java @@ -13,12 +13,13 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import dev.loki.lovisual.features.module.modules.visuals.fx.PostFX; /** * Пресеты PostFX: Cinematic должен быть визуально заметным, * Vanilla — нейтральным (это причина «модуль ничего не делал»). */ -final class PostFxPresetTest { +public final class PostFxPresetTest { private static float[] preset(String name) { float[] out = new float[PostFXUniforms.FLOAT_COUNT]; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspotTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspotTest.java new file mode 100644 index 0000000..0ba3c0f --- /dev/null +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/cosmetics/CosmeticsHotspotTest.java @@ -0,0 +1,45 @@ +/* + * This file is part of the LoVisual Client distribution. + * Copyright (c) 2026 loki5512344. + * + * Licensed under the GNU General Public License v3.0. + */ + +package dev.loki.lovisual.features.module.modules.visuals.cosmetics; + +import dev.loki.lovisual.features.cosmetic.CosmeticSlot; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import dev.loki.lovisual.features.module.modules.visuals.cosmetics.CosmeticsHotspot; + +public final class CosmeticsHotspotTest { + + @Test + void headIsTopZone() { + CosmeticsHotspot[] zones = CosmeticsHotspot.forRegion(0f, 0f, 100f, 100f, false); + assertEquals(CosmeticSlot.HEAD, CosmeticsHotspot.hitTest(zones, 50, 5)); + } + + @Test + void legsIsBottomZone() { + CosmeticsHotspot[] zones = CosmeticsHotspot.forRegion(0f, 0f, 100f, 100f, false); + assertEquals(CosmeticSlot.LEGS, CosmeticsHotspot.hitTest(zones, 50, 95)); + } + + @Test + void shouldersZoneBecomesBackWhenBackViewToggled() { + CosmeticsHotspot[] front = CosmeticsHotspot.forRegion(0f, 0f, 100f, 100f, false); + CosmeticsHotspot[] back = CosmeticsHotspot.forRegion(0f, 0f, 100f, 100f, true); + + assertEquals(CosmeticSlot.SHOULDERS, CosmeticsHotspot.hitTest(front, 50, 25)); + assertEquals(CosmeticSlot.BACK, CosmeticsHotspot.hitTest(back, 50, 25)); + } + + @Test + void outsideRegionMissesAllZones() { + CosmeticsHotspot[] zones = CosmeticsHotspot.forRegion(10f, 10f, 100f, 100f, false); + assertNull(CosmeticsHotspot.hitTest(zones, 5, 5)); + } +} diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcLibClientTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcLibClientTest.java index 8d28d8b..a74f89f 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcLibClientTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcLibClientTest.java @@ -5,8 +5,10 @@ import org.junit.jupiter.api.Test; import java.util.List; import static org.junit.jupiter.api.Assertions.*; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LrcLibClient; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LyricLine; -final class LrcLibClientTest { +public final class LrcLibClientTest { @Test void cleanTrackNameRemovesParenthetical() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcParserTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcParserTest.java index 784d1e4..21eb764 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcParserTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LrcParserTest.java @@ -5,8 +5,10 @@ import org.junit.jupiter.api.Test; import java.util.List; import static org.junit.jupiter.api.Assertions.*; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LrcParser; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LyricLine; -final class LrcParserTest { +public final class LrcParserTest { @Test void parsesStandardLrcFormat() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLineSplitterTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLineSplitterTest.java index 773190b..804ab95 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLineSplitterTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/module/modules/visuals/lyrics/LyricLineSplitterTest.java @@ -7,8 +7,10 @@ import java.util.Collections; import java.util.List; import static org.junit.jupiter.api.Assertions.*; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LyricLine; +import dev.loki.lovisual.features.module.modules.visuals.lyrics.lrc.LyricLineSplitter; -final class LyricLineSplitterTest { +public final class LyricLineSplitterTest { @Test void returnsEmptyForNullInput() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/security/BackdoorProtectionTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/security/BackdoorProtectionTest.java index e27e513..c29513a 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/security/BackdoorProtectionTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/features/security/BackdoorProtectionTest.java @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.*; * Юнит-тесты чистой логики BackdoorProtection без инициализации Minecraft. * State очищается в @BeforeEach, т.к. INSTANCE — общий синглтон. */ -final class BackdoorProtectionTest { +public final class BackdoorProtectionTest { private final BackdoorProtection service = BackdoorProtection.INSTANCE; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngineTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngineTest.java index b7fcef2..e517094 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngineTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/render/engine/renderer/ui/runtime/script/JavetUiScriptEngineTest.java @@ -15,7 +15,7 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; -final class JavetUiScriptEngineTest { +public final class JavetUiScriptEngineTest { @Test void normalizesLongPropsToJavaScriptNumbersRecursively() { Object normalized = JavetUiScriptEngine.plainValue(Map.of( diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EaseCurvesTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EaseCurvesTest.java index 4d0c80d..eb007f0 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EaseCurvesTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EaseCurvesTest.java @@ -11,11 +11,12 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import dev.loki.lovisual.features.module.modules.visuals.items.HoldMyItems; /** * Математика ease-out-back для HoldMyItems. */ -final class EaseCurvesTest { +public final class EaseCurvesTest { private static final float EPS = 1e-4f; private static final float DEFAULT_C1 = 1.70158f; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EquipProgressComposerTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EquipProgressComposerTest.java index 73e5dc6..64aaa16 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EquipProgressComposerTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/EquipProgressComposerTest.java @@ -11,12 +11,14 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import dev.loki.lovisual.features.module.modules.visuals.camera.ViewModel; +import dev.loki.lovisual.features.module.modules.visuals.items.HoldMyItems; /** * Совместная работа HoldMyItems (кривая) и ViewModel (занижение): * конечная позиция определяется занижением, кривая добавляет перелёт. */ -final class EquipProgressComposerTest { +public final class EquipProgressComposerTest { private static final float EPS = 1e-4f; private static final float C1 = 1.6f; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/SmoothValueTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/SmoothValueTest.java index 27d089b..71900e6 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/SmoothValueTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/SmoothValueTest.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; /** * Pure-logic tests for the single-update-point animator. No Minecraft types involved. */ -final class SmoothValueTest { +public final class SmoothValueTest { private static final float EPS = 1.0e-4f; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/BobMathTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/BobMathTest.java index 8fbb253..01c0bfe 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/BobMathTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/BobMathTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** Фаза и амплитуда покачивания при ходьбе. */ -final class BobMathTest { +public final class BobMathTest { @Test void amplitudeIsZeroWhenIdle() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandAnimStateTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandAnimStateTest.java index 0fe8523..2172ce9 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandAnimStateTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandAnimStateTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; /** Покадровое состояние: одна правка цели за кадр, реакции на смену мира/игрока. */ -final class HandAnimStateTest { +public final class HandAnimStateTest { private static final Object PLAYER_A = new Object(); private static final Object PLAYER_B = new Object(); diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandPoseMathTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandPoseMathTest.java index fde3417..c64d3ca 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandPoseMathTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/HandPoseMathTest.java @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; /** Сборка позы руки из эффектов. */ -final class HandPoseMathTest { +public final class HandPoseMathTest { private static final float EPS = 1.0e-6f; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/SwayStateTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/SwayStateTest.java index 1a75f51..16dc328 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/SwayStateTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/animation/hand/SwayStateTest.java @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; /** Математика отставания предмета от поворота камеры. */ -final class SwayStateTest { +public final class SwayStateTest { private static final float DT = 0.5f; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/combat/ReachMeterTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/combat/ReachMeterTest.java index 84a13fe..b728759 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/combat/ReachMeterTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/combat/ReachMeterTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -final class ReachMeterTest { +public final class ReachMeterTest { private static final double EPS = 1e-6; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/NotifyThrottleTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/NotifyThrottleTest.java index 1cc493a..bc15e86 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/NotifyThrottleTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/NotifyThrottleTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class NotifyThrottleTest { +public final class NotifyThrottleTest { @Test void firstCallIsAllowed() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/SlotLockPolicyTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/SlotLockPolicyTest.java index 2959caa..d7f89ad 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/SlotLockPolicyTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/protection/SlotLockPolicyTest.java @@ -16,7 +16,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -final class SlotLockPolicyTest { +public final class SlotLockPolicyTest { private static Map states(int... lockedZeroBasedSlots) { Map out = SlotLockPolicy.defaultSlotStates(); diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/LegacyTextUtilTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/LegacyTextUtilTest.java index ac9009b..6048ad6 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/LegacyTextUtilTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/LegacyTextUtilTest.java @@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertSame; * convertLegacyCodes строит дерево: Component.empty() → сегмент-обёртка → стилизованные листья. * firstLeaf() спускается к первому листу с текстом. */ -final class LegacyTextUtilTest { +public final class LegacyTextUtilTest { private static Component firstLeaf(Component in) { Component cur = in; diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameMaskerTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameMaskerTest.java index aea9a3a..3ccc474 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameMaskerTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameMaskerTest.java @@ -14,7 +14,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; -final class NameMaskerTest { +public final class NameMaskerTest { @Test void masksNicknameTokenDeterministically() { diff --git a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameProtectorTest.java b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameProtectorTest.java index 7550c5e..317ce14 100644 --- a/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameProtectorTest.java +++ b/combatant-client-26.2/src/test/java/dev/loki/lovisual/util/text/NameProtectorTest.java @@ -12,7 +12,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -final class NameProtectorTest { +public final class NameProtectorTest { @Test void replacesNameCaseInsensitively() {