diff --git a/src/EntityComponents.c b/src/EntityComponents.c index 30b3af71a..cc8487e69 100644 --- a/src/EntityComponents.c +++ b/src/EntityComponents.c @@ -229,7 +229,7 @@ void HacksComp_RecheckFlags(struct HacksComp* hacks) { /* Can use hacks by default (also case with WoM), no need to check +hax */ cc_bool hax = !String_ContainsConst(&hacks->HacksFlags, "-hax"); HacksComp_SetAll(hacks, hax); - hacks->CanBePushed = true; + hacks->CanBePushed = true; HacksComp_ParseFlag(hacks, "+fly", "-fly", &hacks->CanFly); HacksComp_ParseFlag(hacks, "+noclip", "-noclip", &hacks->CanNoclip); diff --git a/src/Input.c b/src/Input.c index ef156abec..ca1a4ce65 100644 --- a/src/Input.c +++ b/src/Input.c @@ -420,12 +420,12 @@ static void Hotkeys_QuickSort(int left, int right) { } } -static void Hotkeys_AddNewHotkey(int trigger, cc_uint8 modifiers, const cc_string* text, cc_bool more) { +static void Hotkeys_AddNewHotkey(int trigger, cc_uint8 modifiers, const cc_string* text, cc_uint8 flags) { struct HotkeyData hKey; hKey.trigger = trigger; hKey.mods = modifiers; hKey.textIndex = HotkeysText.count; - hKey.staysOpen = more; + hKey.flags = flags; if (HotkeysText.count == HOTKEYS_MAX_COUNT) { Chat_AddRaw("&cCannot define more than 256 hotkeys"); @@ -449,7 +449,7 @@ static void Hotkeys_RemoveText(int index) { } -void Hotkeys_Add(int trigger, cc_uint8 modifiers, const cc_string* text, cc_bool more) { +void Hotkeys_Add(int trigger, cc_uint8 modifiers, const cc_string* text, cc_uint8 flags) { struct HotkeyData* hk = HotkeysList; int i; @@ -457,12 +457,12 @@ void Hotkeys_Add(int trigger, cc_uint8 modifiers, const cc_string* text, cc_bool if (hk->trigger != trigger || hk->mods != modifiers) continue; Hotkeys_RemoveText(hk->textIndex); - hk->staysOpen = more; + hk->flags = flags; hk->textIndex = HotkeysText.count; StringsBuffer_Add(&HotkeysText, text); return; } - Hotkeys_AddNewHotkey(trigger, modifiers, text, more); + Hotkeys_AddNewHotkey(trigger, modifiers, text, flags); } cc_bool Hotkeys_Remove(int trigger, cc_uint8 modifiers) { @@ -938,7 +938,7 @@ static void HandleHotkeyDown(int key) { hkey = &HotkeysList[i]; text = StringsBuffer_UNSAFE_Get(&HotkeysText, hkey->textIndex); - if (!hkey->staysOpen) { + if (!(hkey->flags & HOTKEY_FLAG_STAYS_OPEN)) { Chat_Send(&text, false); } else if (!Gui.InputGrab) { ChatScreen_OpenInput(&text); diff --git a/src/Input.h b/src/Input.h index ddd2e31ef..09e2fe9d7 100644 --- a/src/Input.h +++ b/src/Input.h @@ -141,12 +141,17 @@ CC_API cc_bool KeyBind_IsPressed(KeyBind binding); /* Set the key that the given key binding is bound to. (also updates options list) */ void KeyBind_Set(KeyBind binding, int key); +/* whether to leave text input open for user to enter further input */ +#define HOTKEY_FLAG_STAYS_OPEN 0x01 +/* Whether the hotkey was auto defined (e.g. by server) */ +#define HOTKEY_FLAG_AUTO_DEFINED 0x02 + extern const cc_uint8 Hotkeys_LWJGL[256]; struct HotkeyData { int textIndex; /* contents to copy directly into the input bar */ cc_uint8 trigger; /* Member of Key enumeration */ cc_uint8 mods; /* HotkeyModifiers bitflags */ - cc_bool staysOpen; /* whether the user is able to enter further input */ + cc_uint8 flags; /* HOTKEY_FLAG flags */ }; #define HOTKEYS_MAX_COUNT 256 @@ -157,7 +162,7 @@ enum HotkeyModifiers { }; /* Adds or updates a new hotkey. */ -void Hotkeys_Add(int trigger, cc_uint8 modifiers, const cc_string* text, cc_bool more); +void Hotkeys_Add(int trigger, cc_uint8 modifiers, const cc_string* text, cc_uint8 flags); /* Removes the given hotkey. */ cc_bool Hotkeys_Remove(int trigger, cc_uint8 modifiers); /* Returns the first hotkey which is bound to the given key and has its modifiers pressed. */ diff --git a/src/Menus.c b/src/Menus.c index b281aaae3..a1abe7b38 100644 --- a/src/Menus.c +++ b/src/Menus.c @@ -789,7 +789,8 @@ static void EditHotkeyScreen_UpdateLeaveOpen(struct EditHotkeyScreen* s) { String_InitArray(text, textBuffer); String_AppendConst(&text, "Input stays open: "); - String_AppendConst(&text, s->curHotkey.staysOpen ? "ON" : "OFF"); + String_AppendConst(&text, + (s->curHotkey.flags & HOTKEY_FLAG_STAYS_OPEN) ? "ON" : "OFF"); ButtonWidget_Set(&s->btns[2], &text, &s->titleFont); } @@ -817,7 +818,8 @@ static void EditHotkeyScreen_LeaveOpen(void* screen, void* b) { EditHotkeyScreen_UpdateModifiers(s); } - s->curHotkey.staysOpen = !s->curHotkey.staysOpen; + /* Toggle Input Stays Open flag */ + s->curHotkey.flags ^= HOTKEY_FLAG_STAYS_OPEN; EditHotkeyScreen_UpdateLeaveOpen(s); } @@ -829,12 +831,14 @@ static void EditHotkeyScreen_SaveChanges(void* screen, void* b) { Hotkeys_Remove(hk.trigger, hk.mods); StoredHotkeys_Remove(hk.trigger, hk.mods); } - hk = s->curHotkey; + if (hk.trigger) { - cc_string text = s->input.base.text; - Hotkeys_Add(hk.trigger, hk.mods, &text, hk.staysOpen); - StoredHotkeys_Add(hk.trigger, hk.mods, hk.staysOpen, &text); + cc_string text = s->input.base.text; + cc_bool staysOpen = hk.flags & HOTKEY_FLAG_STAYS_OPEN; + + Hotkeys_Add(hk.trigger, hk.mods, &text, hk.flags); + StoredHotkeys_Add(hk.trigger, hk.mods, staysOpen, &text); } HotkeyListScreen_Show(); } diff --git a/src/Protocol.c b/src/Protocol.c index 7a3ae857d..1c37be7dd 100644 --- a/src/Protocol.c +++ b/src/Protocol.c @@ -1015,9 +1015,11 @@ static void CPE_SetTextHotkey(cc_uint8* data) { StoredHotkeys_Load(key, keyMods); } else if (action.buffer[action.length - 1] == '\n') { action.length--; - Hotkeys_Add(key, keyMods, &action, false); + Hotkeys_Add(key, keyMods, &action, + HOTKEY_FLAG_AUTO_DEFINED); } else { /* more input needed by user */ - Hotkeys_Add(key, keyMods, &action, true); + Hotkeys_Add(key, keyMods, &action, + HOTKEY_FLAG_AUTO_DEFINED | HOTKEY_FLAG_STAYS_OPEN); } }