Skip to content

Commit

Permalink
Version 1.3.5.8
Browse files Browse the repository at this point in the history
  • Loading branch information
EssentialGGBot committed Feb 26, 2025
1 parent daa04a2 commit 82ab7d8
Show file tree
Hide file tree
Showing 58 changed files with 1,342 additions and 963 deletions.
23 changes: 23 additions & 0 deletions changelog/release-1.3.5.8.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Title: Bug Patch
Summary: Minor bug fixes

## Improvements
- Added the ability to have more interactions between different cosmetics and emotes
- Improved cosmetic and emote settings and hide additional cosmetic/emote settings if cosmetics/emotes are disabled
- Improved nameplate and tab-list Essential Icon settings
- Improved game window title to say "Multiplayer (Hosted World)" when in a hosted world

## Wardrobe
- Added the ability to move emotes between emote wheels by dragging it over the "switch emote wheel" arrows
- Improved the layout of the Featured page

## Social Menu
- Increased the character limit of chat messages from 500 to 2500
- Added a visual indicator when a chat message approaches, or is over, the character limit
- Added confirmation toast when inviting players to a world
- Removed group invites for now due to various issues with how they behaved

## Bug Fixes
- Fixed Essential nameplate indicator not being correctly affected by lighting in 1.8.9 & 1.12.2
- Fixed the "Direct message notifications" and "Group message notifications" settings not working
- Fixed the show/hide cosmetic keybind doing things despite cosmetics being disabled
Original file line number Diff line number Diff line change
Expand Up @@ -81,14 +81,6 @@ class LayoutScope(
return IfDsl({ state() == null }, true)
}

fun if_(condition: StateByScope.() -> Boolean, cache: Boolean = false, block: LayoutScope.() -> Unit): IfDsl {
return if_(stateBy(condition), cache, block)
}

fun <T> ifNotNull(stateBlock: StateByScope.() -> T?, cache: Boolean = false, block: LayoutScope.(T) -> Unit): IfDsl {
return ifNotNull(stateBy(stateBlock), cache, block)
}

class IfDsl(internal val elseState: StateV2<Boolean>, internal var cache: Boolean)

infix fun IfDsl.`else`(block: LayoutScope.() -> Unit) {
Expand All @@ -105,11 +97,6 @@ class LayoutScope(
forEach({ trackedListOf(state()) }, cache) { block(it) }
}

/** Makes available to the inner scope the value derived from the given [stateBlock]. */
fun <T> bind(stateBlock: StateByScope.() -> T, cache: Boolean = false, block: LayoutScope.(T) -> Unit) {
bind(stateBy(stateBlock), cache, block)
}

/**
* Repeats the inner block for each element in the given list state.
* If the list state changes, components from old scopes are removed and new scopes are created and initialized as
Expand Down Expand Up @@ -314,12 +301,13 @@ inline fun UIComponent.layout(modifier: Modifier = Modifier, block: LayoutScope.
*
* Note: This does **not** change the size constrains of `this`. These must be set up manually or via [modifier].
*/
fun UIComponent.layoutAsBox(modifier: Modifier = Modifier, block: LayoutScope.() -> Unit) {
fun UIComponent.layoutAsBox(modifier: Modifier = Modifier, block: LayoutScope.() -> Unit): UIComponent {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
addChildModifier(Modifier.alignBoth(Alignment.Center))
layout(modifier, block)
return this
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ private class AnimationDriver(
override fun setup() {
previousDriverStateValue = driver.getUntracked()
durationFrames = (Window.of(boundComponent).animationFPS * duration).toInt().coerceAtLeast(1)
driverEffect = effect(ReferenceHolder.Weak) {
val input = driver()
driverEffect = driver.onChange(ReferenceHolder.Weak) { input ->
animationEventList.add(AnimationEvent(previousDriverStateValue, input, durationFrames))
previousDriverStateValue = input
}
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ org.gradle.configureondemand=true
org.gradle.parallel.threads=128
org.gradle.jvmargs=-Xmx16G
minecraftVersion=11202
version=1.3.5.7
version=1.3.5.8
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import gg.essential.elementa.utils.ObservableClearEvent
import gg.essential.elementa.utils.ObservableList
import gg.essential.elementa.utils.ObservableRemoveEvent
import gg.essential.gui.elementa.state.v2.toV1
import gg.essential.gui.util.hasWindow
import kotlin.reflect.KProperty

@Deprecated("Using StateV1 is discouraged, use StateV2 instead")
Expand Down Expand Up @@ -60,14 +59,6 @@ fun <T : UIComponent> T.bindParent(
index: Int? = null
) = bindParent(parent, state.toV1(parent), delayed, index)

fun <T : UIComponent> T.bindFloating(state: State<Boolean>) = apply {
state.onSetValueAndNow {
if (hasWindow) {
this.setFloating(it)
}
}
}

fun <T : UIComponent> T.bindEffect(effect: Effect, state: State<Boolean>, delayed: Boolean = true) = apply {
state.onSetValueAndNow {
val update = {
Expand Down
122 changes: 68 additions & 54 deletions gui/essential/src/main/kotlin/gg/essential/config/EssentialConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,9 @@ object EssentialConfig : Vigilant2(), GuiEssentialPlatform.Config {
val showQuickActionBarState = property("General.Experience.Quick Action Bar", true)
var showQuickActionBar by showQuickActionBarState

val replaceWindowTitleState = property("General.General.Replace Window Title", true)
var replaceWindowTitle by replaceWindowTitleState

val screenshotBrowserItemsPerRowState = property("Hidden.Hidden.screenshotBrowserItemsPerRow", 3)
var screenshotBrowserItemsPerRow by screenshotBrowserItemsPerRowState

Expand Down Expand Up @@ -384,62 +387,70 @@ object EssentialConfig : Vigilant2(), GuiEssentialPlatform.Config {
category("Emotes") {
subcategory("General") {
switch(!disableEmotesState) {
name = "Show emotes"
description = "Show emote animations on yourself and other players."
}

selector(allowEmoteSounds) {
name = "Allow emote sounds"
description = "Select who you can hear emote sounds from."
options = AllowEmoteSounds.entries.map { it.label }
}

switch(thirdPersonEmotesState) {
name = "Play emotes in third person view"
description = "Emotes will be shown in third-person view. You can still toggle between front and back view."
}

switch(emotePreviewState) {
name = "Emote preview"
description = "When playing emotes, show a model of your character performing the emote in the upper left corner of the screen."
name = "Emotes"
description = "Better express yourself with emotes."
}
dynamic {
if (!disableEmotesState()) {
selector(allowEmoteSounds) {
name = "Allow emote sounds"
description = "Select who you can hear emote sounds from."
options = AllowEmoteSounds.entries.map { it.label }
}

switch(thirdPersonEmotesState) {
name = "Play emotes in third person view"
description = "Emotes will be shown in third-person view. You can still toggle between front and back view."
}

switch(emotePreviewState) {
name = "Emote preview"
description = "When playing emotes, show a model of your character performing the emote in the upper left corner of the screen."
}
}
}
}
}

category("Cosmetics") {
subcategory("General") {
switch(!disableCosmeticsState) {
name = "Show cosmetics"
description = "Show cosmetics on yourself and other players."
}
switch(ownCosmeticsHiddenStateWithSource.bimap({ it.first }, { it to true })) {
name = "Hide your cosmetics"
description = "Hides your equipped cosmetics for all players."
}

val swapFirstTwo: (Int) -> Int = { if (it in 0..1) (it + 1) % 2 else it }

selector(cosmeticArmorSettingSelfState.bimap(swapFirstTwo, swapFirstTwo)) {
name = "Cosmetics & armor visibility on me"
description = "Cosmetics and armor may conflict with each other on your player. This setting does not effect what other players see."
options = listOf("Only cosmetics", "Only armor", "Cosmetics and armor")
}

selector(cosmeticArmorSettingOtherState.bimap(swapFirstTwo, swapFirstTwo)) {
name = "Cosmetics & armor visibility on others"
description = "Cosmetics and armor may conflict with each other on other players. This setting does not effect what other players see."
options = listOf("Only cosmetics", "Only armor", "Cosmetics and armor")
}

switch(disableCosmeticsInInventoryState) {
name = "Hide cosmetics in inventory"
description = "Hides your equipped cosmetics on the player preview inside your inventory."
name = "Cosmetics"
description = "Enhance your Minecraft character with cosmetics."
}
dynamic {
if (!disableCosmeticsState()) {
switch(ownCosmeticsHiddenStateWithSource.bimap({ it.first }, { it to true })) {
name = "Hide your cosmetics"
description = "Hide your equipped cosmetics for everyone."
}

val swapFirstTwo: (Int) -> Int = { if (it in 0..1) (it + 1) % 2 else it }

selector(cosmeticArmorSettingSelfState.bimap(swapFirstTwo, swapFirstTwo)) {
name = "Cosmetics & armor visibility on me"
description = "Cosmetics and armor may conflict with each other on your player. This setting does not effect what other players see."
options = listOf("Only cosmetics", "Only armor", "Cosmetics and armor")
}

selector(cosmeticArmorSettingOtherState.bimap(swapFirstTwo, swapFirstTwo)) {
name = "Cosmetics & armor visibility on others"
description = "Cosmetics and armor may conflict with each other on other players. This setting does not effect what other players see."
options = listOf("Only cosmetics", "Only armor", "Cosmetics and armor")
}

switch(disableCosmeticsInInventoryState) {
name = "Hide cosmetics in inventory"
description = "Hides your equipped cosmetics on the player preview inside your inventory."
}

switch(hideCosmeticsWhenServerOverridesSkinState) {
name = "Hide cosmetics on server skins"
description = "Hides cosmetics on players when the joined server modifies the user’s skins."
}
}
}

switch(hideCosmeticsWhenServerOverridesSkinState) {
name = "Hide cosmetics on server skins"
description = "Hides cosmetics on players when the joined server modifies the user’s skins."
}
}
}

Expand Down Expand Up @@ -512,14 +523,17 @@ object EssentialConfig : Vigilant2(), GuiEssentialPlatform.Config {
}
}

subcategory("Essential Indicator") {
switch(showEssentialIndicatorOnTabState) {
name = "Essential indicator in tab-list"
description = "Shows the indicator on other Essential players in the tab-list."
}
subcategory("Nameplates") {
switch(showEssentialIndicatorOnNametagState) {
name = "Essential indicator on nameplates"
description = "Shows the indicator on other Essential players’ nameplates."
name = "Essential icon on nameplates"
description = "Shows the Essential icon on Essential players’ nameplates."
}
}

subcategory("Tab-list") {
switch(showEssentialIndicatorOnTabState) {
name = "Essential icon in tab-list"
description = "Shows the Essential icon on Essential players in the tab-list."
}
}

Expand Down
Loading

0 comments on commit 82ab7d8

Please sign in to comment.