From 54a6c5a6feea12ecf8ee288fd79c4c00844ea643 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 27 Feb 2020 23:58:49 -0700 Subject: [PATCH 01/14] Typing indicators --- code/controllers/subsystem/input.dm | 39 ++++++++++++++++ code/modules/keybindings/bindings_living.dm | 1 - code/modules/keybindings/bindings_mob.dm | 11 +++++ .../mob/living/carbon/human/species.dm | 8 ++++ .../living/carbon/human/typing_indicator.dm | 2 + code/modules/mob/living/say.dm | 2 +- code/modules/mob/mob_defines.dm | 10 ++++ code/modules/mob/typing_indicator.dm | 44 ++++++++++++++++++ icons/mob/talk.dmi | Bin 5497 -> 5491 bytes tgstation.dme | 4 +- 10 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/typing_indicator.dm create mode 100644 code/modules/mob/typing_indicator.dm diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 0970b23a16..8a8e0ac7c9 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -8,6 +8,12 @@ SUBSYSTEM_DEF(input) var/list/macro_sets var/list/movement_keys + /*! Special thing (until we get custom keybinds that also support clientside macros :weary:) that lets us do stuff like look up "which key is say/me bound to". Special format too, the value of a key should be list(key, modifier1, modifier2, ...). "default" unless override. + * USE get_key_for_macro_id or get_typing_indicator_binds TO ACCESS! + */ + var/list/macro_set_reverse_lookups + /// cache these for speed. + var/list/typing_indicator_binds /datum/controller/subsystem/input/Initialize() setup_default_macro_sets() @@ -58,6 +64,32 @@ SUBSYSTEM_DEF(input) ), ) + macro_set_reverse_lookups = list( + "default" = list( + "say" = list("T"), + "whisper" = list("T", "Ctrl"), + "me" = list("M"), + "subtle" = list("M", "Ctrl") + ), + "old_default" = list( + "say" = list("T", "Ctrl"), + ), + "old_hotkeys" = list( + "say" = list("T"), + "me" = list("M"), + ) + ) + + typing_indicator_binds = list() + var/static/list/typing_indicator_verbs = list("me", "say") + for(var/check_verb in typing_indicator_verbs) + for(var/macro_set in macro_set_reverse_lookups) + var/list/keylist = macro_set_reverse_lookups[macro_set][check_verb] + if(!keylist) + continue + var/key = keylist[1] + typing_indicator_binds[key] = TRUE + // Because i'm lazy and don't want to type all these out twice var/list/old_default = default_macro_sets["old_default"] @@ -117,3 +149,10 @@ SUBSYSTEM_DEF(input) for(var/i in 1 to length(clients)) var/client/C = clients[i] C.keyLoop() + +/datum/controller/subsystem/input/proc/get_key_for_macro_id(macro_id, macroset) + return macro_set_reverse_lookups[macroset][macro_id] || macro_set_reverse_lookups["default"][macro_id] + +/// Returns an associative list of keys without modifiers like ctrl. You have to do another lookup, this is for the first check to be faster. +/datum/controller/subsystem/input/proc/get_typing_indicator_binds(macroset) + return typing_indicator_binds[macroset] diff --git a/code/modules/keybindings/bindings_living.dm b/code/modules/keybindings/bindings_living.dm index ec6c5dd539..b338c5e899 100644 --- a/code/modules/keybindings/bindings_living.dm +++ b/code/modules/keybindings/bindings_living.dm @@ -23,5 +23,4 @@ lay_down() return - return ..() \ No newline at end of file diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index 964ee65047..6d413b4166 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -3,6 +3,17 @@ // Or we can have NPC's send actual keypresses and detect that by seeing no client /mob/key_down(_key, client/user) + if(SSinput.typing_indicator_binds[_key]) + var/macroset = winget(user, "mainwindow", "macro") + var/list/L = SSinput.macro_set_reverse_lookups[macroset] + var/valid = TRUE + if(length(L) > 1) + for(var/modifier in 2 to length(L)) + if(!client.keys_held[modifier]) + valid = FALSE + break + if(valid) + display_typing_indicator() switch(_key) if("Delete", "H") if(!pulling) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index b1bc47ea4a..52e14a43e4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -106,6 +106,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/whitelist = list() //List the ckeys that can use this species, if it's whitelisted.: list("John Doe", "poopface666", "SeeALiggerPullTheTrigger") Spaces & capitalization can be included or ignored entirely for each key as it checks for both. var/should_draw_citadel = FALSE + /// Our default override for typing indicator state + var/typing_indicator_state + /////////// // PROCS // /////////// @@ -2218,3 +2221,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/start_wagging_tail(mob/living/carbon/human/H) /datum/species/proc/stop_wagging_tail(mob/living/carbon/human/H) + + +/////// TYPING INDICATORS /////// +/datum/species/proc/get_typing_indicator_state() + return typing_indicator_state diff --git a/code/modules/mob/living/carbon/human/typing_indicator.dm b/code/modules/mob/living/carbon/human/typing_indicator.dm new file mode 100644 index 0000000000..6d420c1f7b --- /dev/null +++ b/code/modules/mob/living/carbon/human/typing_indicator.dm @@ -0,0 +1,2 @@ +/mob/living/carbon/human/get_typing_indicator_icon_state() + return dna?.species?.get_typing_indicator_state() || ..() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 35b49cce8e..f90b285d2d 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -354,7 +354,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(cultslurring) message = cultslur(message) - + if(clockcultslurring) message = CLOCK_CULT_SLUR(message) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index c45f6eec13..7a3959ed8f 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -128,3 +128,13 @@ var/flavor_text = "" var/flavor_text_2 = "" //version of the above that only lasts for the current round. + + ///////TYPING INDICATORS/////// + /// Set to true if we want to show typing indicators. + var/typing_indicator_enabled = FALSE + /// Default icon_state of our typing indicator. Currently only supports paths (because anything else is, as of time of typing this, unnecesary. + var/typing_indicator_state = /obj/effect/overlay/typing_indicator + /// The timer that will remove our indicator for early aborts (like when an user finishes their message) + var/typing_indicator_timerid + /// Default typing indicator timeout + var/typing_indicator_timeout = 30 SECONDS diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm new file mode 100644 index 0000000000..92710e2434 --- /dev/null +++ b/code/modules/mob/typing_indicator.dm @@ -0,0 +1,44 @@ +/// state = overlay/image/object/type/whatever add_overlay will accept +GLOBAL_LIST_EMPTY(typing_indicator_overlays) + +/// Fetches the typing indicator we'll use from GLOB.typing_indicator_overlays +/mob/proc/get_indicator_overlay(state) + . = GLOB.typing_indicator_overlays[state] + if(.) + return + // doesn't exist, make it and cache it + if(ispath(state)) + . = GLOB.typing_indicator_overlays[state] = state + // We only support paths for now because anything else isn't necessary yet. + +/// Gets the state we will use for typing indicators. Defaults to src.typing_indicator_state +/mob/proc/get_typing_indicator_icon_state() + return typing_indicator_state + +/*! + * Displays typing indicator. + * @param timeout_override - Sets how long until this will disappear on its own without the user finishing their message or logging out. Defaults to src.typing_indicator_timeout + * @param state_override - Sets the state that we will fetch. Defaults to src.get_typing_indicator_icon_state() + * @param force - shows even if src.typing_indcator_enabled is FALSE. + */ +/mob/proc/display_typing_indicator(timeout_override = typing_indicator_timeout, state_override = get_typing_indicator_icon_state(), force = FALSE) + if(!typing_indicator_enabled || force) + return + add_overlay(get_indicator_overlay(state_override)) + addtimer(CALLBACK(src, .proc/clear_typing_indicator, state_override), timeout_override, TIMER_STOPPABLE) + +/*! + * Removes typing indicator. + * @param state_override Sets the state that we will remove. Defaults to src.get_typing_indicator_icon_state() + */ +/mob/proc/clear_typing_indicator(state_override = get_typing_indicator_icon_state()) + deltimer(typing_indicator_timerid) + cut_overlay(get_indicator_overlay(state_override)) + +/// Default typing indicator +/obj/effect/overlay/typing_indicator + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon = 'icons/mob/talk.dmi' + icon_state = "default_typing" + appearance_flags = RESET_COLOR | TILE_BOUND | PIXEL_SCALE + layer = LARGE_MOB_LAYER diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index 05fe6f56236377f0227fcb4b11800a2bd837ba17..2e300b5a290ba932ecb8408f5b1f2b41e652b455 100644 GIT binary patch delta 4148 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 QLcq^iXD_Gf(}>&u1vJCV9{>OV delta 4153 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 gzq`c7JvIk Date: Wed, 4 Mar 2020 02:42:24 -0700 Subject: [PATCH 02/14] whew! --- icons/mob/talk.dmi | Bin 5491 -> 8698 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index 2e300b5a290ba932ecb8408f5b1f2b41e652b455..0a563210378ee6a14a958cff5a1dc88fe6501434 100644 GIT binary patch literal 8698 zcmd6Nc~leGws$c*g53^?3~@#V!BzwnA=ua=V1ouBDnqclK?Wg+%n*X2a=U3nB@i$| zupyuX2r|l)ps37)Op!56VNQUA5JD=+SFyi)-&^;6Ykljz^(m+c`R%=b zd++-7vYpk|O?x&00I=2i;&}uB$XZC-21Nh>Jf8O(1Aq)M;_9`a^B#A94)hKP@<#gu zK-ddX$~zy~@3uYasJ8!RMfV41mY?AdI$A5En{iEtgO#+^toxd&7?mqGyjr#lPP{h( z8HeGPIa40os$l}p-x<4xdz$6l%DL%=Lpi`Z_eV>-TOC|a+aF8)lHv-(EJLNz0*(9WD3Yn(34)+=*O25#(bmEW5r~&eQ%}Jb!WV$K5ReuotjC zf9`773)V2|ca6|{+DoX|>#Y5Op`Su zDHWWkJ}+JaZQH!FKF^FArFiU_>}ZvAiaK1tbuO`=E4{ltg8We;eL9igF}RV_VJCj) zW#q$DhelZri>hBkD#o7su=fZyN=(|y;YV-7!A&KWeE8kv4E}KN%hRG{BIt!iD$DWwgS)i>PolI4^&jVxMxl?h7PZP_5!B~VCQCJv@1AED0pC#ug zrjQ%Q7IX#%J2&^9E5eZ@<#H;rS*bW04w1J&`en+HIdEnM5j_pa6sRROv`j3ARqB4f zGU%jKX0RpN@6~jk4ayOi_t?7+t3$W3FH`O#pl{qbY7u)5jhaMTC&PoyjJUZ4aXy{s zksNQfjCIoU+Dd+|IdJ%uq9o#*=c~tArRy0qgDG?w;1{%e@40{bV$^r!*`e2KefCj) z%27O-fUb?jn4(@69RXdB>e{q;a3-Y@Mue{)ye25&b~IZT`8~xNb1EX#qDav*2W~F; zK0}FZ-jC7`Vx7cOWZ_&k9Z?mk7NkB&Oa}{8GjT|8{wYfQ;2heFGtH#Xlv=ZqpsN}< zuwSw;iDqrPrh`<8J*X1RX_!XYsDpEp9qkMfa=m*mmd~xY5d#2Kjl#bKQvX13iSNMX zfD)}LNm@J!$Kg%GOL9*a_;-nT-X%8T1rWHMn5Jhz!Uc8+*;SWeE9`KFtLk&E(IS?q z4Iij>XrUWJf|3iESIqkCHP8~!{dJ@y#adnsCke)4b(1C50#%ei9K{p7j5IHGq1lV0 znM$L5ZI@&Q7IsQJ=OO{mJI98ONXGRTM2gCK8^v}uRBV%6ohXp`;&vkV+ZD6L>iPHC z?KYh_wX(7XInvfS?bPf6N- zO9;HAYvwG#0+VTJvMW+`ijri&Gs4y;I?Z4=3W>ruBU(@Ri-L*GNd{>d3iC`#k4kKT zNg`N6fW@#*I^f?)L?5w3&Ne!W3n%#`6^Qz>?oL=YtlNVuzzR&pC5uCmsar0mC{ zIC4c8&nexassa~96nt`-uPS+ioQ}RKApf4!Y(d%s3RAIJ;p^ZUBx6q>mCHIw3|?rL zK$C|AdtWA+Z-MmCaoM^JW!y}iAfF3)D4pv1gJLoD)?ydrRPtr24uyq-g9>EF2*@OpP3@oX{Jcpy>VKJs+xB^lY6l%Q~xM!T6nnX56Ghi28Oy4bl0 zuPJ+Hm07`jm5b~^AG5(#=6=dS^omVo%HIve3Ygq8lx#2^x^s7_dvI_t%jRzeuDl|L zNjxfAK<=paIkqPur*=!HY5iD$x4(a3eqmwAl$l}3Gmz6_h^2G&EIOZ!1-$KHYGVh# zev@0Pq5jn;*xgtB%l*MWl=rW3KmT#M_CjOoY``g(f!i6My@HAoh{Fn;7Fz#V=(4@# z_|~uYu1yRZ8C?>tva&LG(b?72Z@wYq5y+ufMGJ&>(E@rm2~@r(Q*hl(0G}c!dKf;w3JB;DYJ&Auc!eYDy=)m9JS=?+ zXE9TE37Cr!VyDg901MU1En0sSKlqOa^e^Kq)dOoeQkj*6U W&Nw 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 Ai2wiq From e243dc689bda5e7a5a78690aa9f599b6b1aceb2a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 4 Mar 2020 03:12:46 -0700 Subject: [PATCH 03/14] index --- code/modules/keybindings/bindings_mob.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index 6d413b4166..c3ffa97237 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -8,8 +8,8 @@ var/list/L = SSinput.macro_set_reverse_lookups[macroset] var/valid = TRUE if(length(L) > 1) - for(var/modifier in 2 to length(L)) - if(!client.keys_held[modifier]) + for(var/i in 2 to length(L)) + if(!client.keys_held[L[i]]) valid = FALSE break if(valid) From 1ae4ef16bc328d5c5cd82ab7f11fb922c9b97458 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 4 Mar 2020 06:03:51 -0700 Subject: [PATCH 04/14] sigh --- code/controllers/subsystem/input.dm | 4 +++- code/modules/keybindings/bindings_mob.dm | 20 ++++++++++++++------ code/modules/mob/typing_indicator.dm | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 8a8e0ac7c9..2d80cb7f3c 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -14,6 +14,8 @@ SUBSYSTEM_DEF(input) var/list/macro_set_reverse_lookups /// cache these for speed. var/list/typing_indicator_binds + /// same + var/static/list/typing_indicator_verbs /datum/controller/subsystem/input/Initialize() setup_default_macro_sets() @@ -80,8 +82,8 @@ SUBSYSTEM_DEF(input) ) ) + typing_indicator_verbs = list("me", "say") typing_indicator_binds = list() - var/static/list/typing_indicator_verbs = list("me", "say") for(var/check_verb in typing_indicator_verbs) for(var/macro_set in macro_set_reverse_lookups) var/list/keylist = macro_set_reverse_lookups[macro_set][check_verb] diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index c3ffa97237..07df11f343 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -3,15 +3,22 @@ // Or we can have NPC's send actual keypresses and detect that by seeing no client /mob/key_down(_key, client/user) + to_chat(world, "DEBUG: key_down [_key]") if(SSinput.typing_indicator_binds[_key]) var/macroset = winget(user, "mainwindow", "macro") var/list/L = SSinput.macro_set_reverse_lookups[macroset] - var/valid = TRUE - if(length(L) > 1) - for(var/i in 2 to length(L)) - if(!client.keys_held[L[i]]) - valid = FALSE - break + to_chat(world, "DEBUG: Looking up list [macroset] = [english_list(L)]") + to_chat(world, "DEBUG: Client.keys_held = [english_list(client.keys_held)]") + var/valid = FALSE + for(var/the_verb in L) + if(the_verb in SSinput.typing_indicator_verbs) + var/list/keys = L[the_verb] + valid = TRUE + if(length(keys) > 1) + for(var/i in 2 to length(keys)) + if(!client.keys_held[keys[i]]) + valid = FALSE + break if(valid) display_typing_indicator() switch(_key) @@ -86,6 +93,7 @@ return ..() /mob/key_up(_key, client/user) + to_chat(world, "DEBUG: key_up [_key]") switch(_key) if("Alt") toggle_move_intent() diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 92710e2434..2587839cb8 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -39,6 +39,6 @@ GLOBAL_LIST_EMPTY(typing_indicator_overlays) /obj/effect/overlay/typing_indicator mouse_opacity = MOUSE_OPACITY_TRANSPARENT icon = 'icons/mob/talk.dmi' - icon_state = "default_typing" + icon_state = "normal_typing" appearance_flags = RESET_COLOR | TILE_BOUND | PIXEL_SCALE layer = LARGE_MOB_LAYER From c28a78de3d9c717e7447f91277b77aec9877be4a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 4 Mar 2020 06:41:53 -0700 Subject: [PATCH 05/14] ok --- code/modules/keybindings/bindings_mob.dm | 4 ---- code/modules/mob/living/living_defines.dm | 2 ++ code/modules/mob/say.dm | 4 +++- code/modules/mob/say_vr.dm | 1 - 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index 07df11f343..159134508b 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -3,12 +3,9 @@ // Or we can have NPC's send actual keypresses and detect that by seeing no client /mob/key_down(_key, client/user) - to_chat(world, "DEBUG: key_down [_key]") if(SSinput.typing_indicator_binds[_key]) var/macroset = winget(user, "mainwindow", "macro") var/list/L = SSinput.macro_set_reverse_lookups[macroset] - to_chat(world, "DEBUG: Looking up list [macroset] = [english_list(L)]") - to_chat(world, "DEBUG: Client.keys_held = [english_list(client.keys_held)]") var/valid = FALSE for(var/the_verb in L) if(the_verb in SSinput.typing_indicator_verbs) @@ -93,7 +90,6 @@ return ..() /mob/key_up(_key, client/user) - to_chat(world, "DEBUG: key_up [_key]") switch(_key) if("Alt") toggle_move_intent() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 7106d003ee..f57edee9d1 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -5,6 +5,8 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,NANITE_HUD,DIAG_NANITE_FULL_HUD,RAD_HUD) pressure_resistance = 10 + typing_indicator_enabled = TRUE + var/resize = 1 //Badminnery resize var/lastattacker = null var/lastattackerckey = null diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index f348829b71..8b2d9ef0c4 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -2,6 +2,7 @@ /mob/verb/say_verb(message as text) set name = "Say" set category = "IC" + clear_typing_indicator() // clear it immediately! if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return @@ -19,6 +20,7 @@ /mob/verb/whisper_verb(message as text) set name = "Whisper" set category = "IC" + clear_typing_indicator() // clear it immediately! if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return @@ -30,7 +32,7 @@ /mob/verb/me_verb(message as message) set name = "Me" set category = "IC" - + clear_typing_indicator() // clear it immediately! if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 377bb1c5fc..ec82b41cca 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -23,7 +23,6 @@ proc/get_top_level_mob(var/mob/S) message = null mob_type_blacklist_typecache = list(/mob/living/brain) - /datum/emote/living/subtle/proc/check_invalid(mob/user, input) if(stop_bad_mime.Find(input, 1, 1)) to_chat(user, "Invalid emote.") From 0d312b8dff347c14bf996a9421889c4ef0658cc8 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 4 Mar 2020 08:02:28 -0700 Subject: [PATCH 06/14] only way --- code/modules/keybindings/bindings_mob.dm | 2 ++ code/modules/mob/say.dm | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index 159134508b..6c7b3031c5 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -19,6 +19,8 @@ if(valid) display_typing_indicator() switch(_key) + if("Escape") + clear_typing_indicator() if("Delete", "H") if(!pulling) to_chat(src, "You are not pulling anything.") diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 8b2d9ef0c4..ac5924f6d8 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -3,11 +3,12 @@ set name = "Say" set category = "IC" clear_typing_indicator() // clear it immediately! + if(!length(message)) + return if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return - if(message) - say(message) + say(message) /mob/say_mod(input, message_mode) var/customsayverb = findtext(input, "*") @@ -21,6 +22,8 @@ set name = "Whisper" set category = "IC" clear_typing_indicator() // clear it immediately! + if(!length(message)) + return if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return @@ -33,6 +36,8 @@ set name = "Me" set category = "IC" clear_typing_indicator() // clear it immediately! + if(!length(message)) + return if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return From d1f161fe0f56973ecce55df22e2fa1c35395728c Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 4 Mar 2020 15:42:01 -0700 Subject: [PATCH 07/14] changes --- code/controllers/subsystem/input.dm | 10 ++++---- code/modules/keybindings/bindings_mob.dm | 2 +- .../mob/living/carbon/human/species.dm | 5 ---- .../living/carbon/human/typing_indicator.dm | 2 +- code/modules/mob/say.dm | 23 +++++++++++++++++-- code/modules/mob/typing_indicator.dm | 23 ++++++++++--------- 6 files changed, 40 insertions(+), 25 deletions(-) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 2d80cb7f3c..add2682b35 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -68,17 +68,17 @@ SUBSYSTEM_DEF(input) macro_set_reverse_lookups = list( "default" = list( - "say" = list("T"), + "say_keybind" = list("T"), "whisper" = list("T", "Ctrl"), - "me" = list("M"), + "me_keybind" = list("M"), "subtle" = list("M", "Ctrl") ), "old_default" = list( - "say" = list("T", "Ctrl"), + "say_keybind" = list("T", "Ctrl"), ), "old_hotkeys" = list( - "say" = list("T"), - "me" = list("M"), + "say_keybind" = list("T"), + "me_keybind" = list("M"), ) ) diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index 6c7b3031c5..50770c130a 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -19,7 +19,7 @@ if(valid) display_typing_indicator() switch(_key) - if("Escape") + if("Escape") //escape breaks out of clientside verb text input without executing at all, meaning we can't hook the verb to do this for us. clear_typing_indicator() if("Delete", "H") if(!pulling) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 52e14a43e4..e3123dddd4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -2221,8 +2221,3 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/start_wagging_tail(mob/living/carbon/human/H) /datum/species/proc/stop_wagging_tail(mob/living/carbon/human/H) - - -/////// TYPING INDICATORS /////// -/datum/species/proc/get_typing_indicator_state() - return typing_indicator_state diff --git a/code/modules/mob/living/carbon/human/typing_indicator.dm b/code/modules/mob/living/carbon/human/typing_indicator.dm index 6d420c1f7b..16ed95790a 100644 --- a/code/modules/mob/living/carbon/human/typing_indicator.dm +++ b/code/modules/mob/living/carbon/human/typing_indicator.dm @@ -1,2 +1,2 @@ /mob/living/carbon/human/get_typing_indicator_icon_state() - return dna?.species?.get_typing_indicator_state() || ..() + return dna?.species?.typing_indicator_state || ..() diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index ac5924f6d8..bca634ada9 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -1,7 +1,17 @@ //Speech verbs. -/mob/verb/say_verb(message as text) +// the _keybind verbs uses "as text" versus "as text|null" to force a popup when pressed by a keybind. +/mob/verb/say_keybind(message as text) + set name = "say_keybind" + set hidden = TRUE + set category = "IC" + return say_verb(message) + +/mob/verb/say_verb(message as text|null) set name = "Say" set category = "IC" + display_typing_indicator() + if(!length(message)) + message = input(usr, "Say something!", "Say") as text|null clear_typing_indicator() // clear it immediately! if(!length(message)) return @@ -32,9 +42,18 @@ /mob/proc/whisper(message, datum/language/language=null) say(message, language) //only living mobs actually whisper, everything else just talks -/mob/verb/me_verb(message as message) +/mob/verb/me_keybind(message as message) + set name = "me_keybind" + set hidden = TRUE + set category = "IC" + return me_verb(message) + +/mob/verb/me_verb(message as message|null) set name = "Me" set category = "IC" + display_typing_indicator() + if(!length(message)) + message = input(usr, "What do you want to emote?" , "Emote") as message|null clear_typing_indicator() // clear it immediately! if(!length(message)) return diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 2587839cb8..7ca9eb72e9 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -15,24 +15,25 @@ GLOBAL_LIST_EMPTY(typing_indicator_overlays) /mob/proc/get_typing_indicator_icon_state() return typing_indicator_state -/*! - * Displays typing indicator. - * @param timeout_override - Sets how long until this will disappear on its own without the user finishing their message or logging out. Defaults to src.typing_indicator_timeout - * @param state_override - Sets the state that we will fetch. Defaults to src.get_typing_indicator_icon_state() - * @param force - shows even if src.typing_indcator_enabled is FALSE. - */ +/** + * Displays typing indicator. + * @param timeout_override - Sets how long until this will disappear on its own without the user finishing their message or logging out. Defaults to src.typing_indicator_timeout + * @param state_override - Sets the state that we will fetch. Defaults to src.get_typing_indicator_icon_state() + * @param force - shows even if src.typing_indcator_enabled is FALSE. + */ /mob/proc/display_typing_indicator(timeout_override = typing_indicator_timeout, state_override = get_typing_indicator_icon_state(), force = FALSE) - if(!typing_indicator_enabled || force) + if(!typing_indicator_enabled && !force) return add_overlay(get_indicator_overlay(state_override)) addtimer(CALLBACK(src, .proc/clear_typing_indicator, state_override), timeout_override, TIMER_STOPPABLE) -/*! - * Removes typing indicator. - * @param state_override Sets the state that we will remove. Defaults to src.get_typing_indicator_icon_state() - */ +/** + * Removes typing indicator. + * @param state_override Sets the state that we will remove. Defaults to src.get_typing_indicator_icon_state() + */ /mob/proc/clear_typing_indicator(state_override = get_typing_indicator_icon_state()) deltimer(typing_indicator_timerid) + typing_indicator_timerid = null cut_overlay(get_indicator_overlay(state_override)) /// Default typing indicator From 8d1e36e0769415c27538e01ae01f36bd9d51793a Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 4 Mar 2020 15:49:47 -0700 Subject: [PATCH 08/14] k --- code/__DEFINES/mobs.dm | 2 ++ code/modules/mob/mob_defines.dm | 2 -- code/modules/mob/typing_indicator.dm | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index dc67de3150..f70f8c55bc 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -277,3 +277,5 @@ #define PULL_PRONE_SLOWDOWN 0.6 #define HUMAN_CARRY_SLOWDOWN 0 + +#define TYPING_INDICATOR_TIMEOUT 10 SECONDS diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 7a3959ed8f..8cda504149 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -136,5 +136,3 @@ var/typing_indicator_state = /obj/effect/overlay/typing_indicator /// The timer that will remove our indicator for early aborts (like when an user finishes their message) var/typing_indicator_timerid - /// Default typing indicator timeout - var/typing_indicator_timeout = 30 SECONDS diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 7ca9eb72e9..b8a68b336a 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -21,11 +21,12 @@ GLOBAL_LIST_EMPTY(typing_indicator_overlays) * @param state_override - Sets the state that we will fetch. Defaults to src.get_typing_indicator_icon_state() * @param force - shows even if src.typing_indcator_enabled is FALSE. */ -/mob/proc/display_typing_indicator(timeout_override = typing_indicator_timeout, state_override = get_typing_indicator_icon_state(), force = FALSE) - if(!typing_indicator_enabled && !force) +/mob/proc/display_typing_indicator(timeout_override = TYPING_INDICATOR_TIMEOUT, state_override = get_typing_indicator_icon_state(), force = FALSE) + if((!typing_indicator_enabled && !force) || typing_indicator_timerid) return + typing_indicator_timerid = addtimer(CALLBACK(src, .proc/clear_typing_indicator, state_override), timeout_override, TIMER_STOPPABLE) + var/overlay = get_indicator_overlay(state_override) add_overlay(get_indicator_overlay(state_override)) - addtimer(CALLBACK(src, .proc/clear_typing_indicator, state_override), timeout_override, TIMER_STOPPABLE) /** * Removes typing indicator. From 76541ff57ad4f34c82d65900aaa1c132100f8705 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 5 Mar 2020 00:16:22 -0700 Subject: [PATCH 09/14] getting worse --- code/controllers/subsystem/input.dm | 12 ++++++------ code/modules/mob/typing_indicator.dm | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index add2682b35..ac27d43775 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -41,9 +41,9 @@ SUBSYSTEM_DEF(input) "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "O" = "ooc", "Ctrl+O" = "looc", - "T" = "say", + "T" = "say_keybind", "Ctrl+T" = "whisper", - "M" = "me", + "M" = "me_keybind", "Ctrl+M" = "subtle", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs "Any" = "\"KeyDown \[\[*\]\]\"", @@ -51,15 +51,15 @@ SUBSYSTEM_DEF(input) ), "old_default" = list( "Tab" = "\".winset \\\"mainwindow.macro=old_hotkeys map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"", - "Ctrl+T" = "say", + "Ctrl+T" = "say_keybind", "Ctrl+O" = "ooc", ), "old_hotkeys" = list( "Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "O" = "ooc", "L" = "looc", - "T" = "say", - "M" = "me", + "T" = "say_keybind", + "M" = "me_keybind", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", @@ -82,7 +82,7 @@ SUBSYSTEM_DEF(input) ) ) - typing_indicator_verbs = list("me", "say") + typing_indicator_verbs = list("me", "say", "say_keybind", "me_keybind") typing_indicator_binds = list() for(var/check_verb in typing_indicator_verbs) for(var/macro_set in macro_set_reverse_lookups) diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index b8a68b336a..4ecf930aee 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -25,7 +25,6 @@ GLOBAL_LIST_EMPTY(typing_indicator_overlays) if((!typing_indicator_enabled && !force) || typing_indicator_timerid) return typing_indicator_timerid = addtimer(CALLBACK(src, .proc/clear_typing_indicator, state_override), timeout_override, TIMER_STOPPABLE) - var/overlay = get_indicator_overlay(state_override) add_overlay(get_indicator_overlay(state_override)) /** From 032b973d827cc434efaea69e86ca4ddb09d97c29 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 5 Mar 2020 00:51:05 -0700 Subject: [PATCH 10/14] wow that's a lot of effort --- code/__DEFINES/layers.dm | 5 +- code/__DEFINES/mobs.dm | 2 +- code/_onclick/click.dm | 3 + code/modules/mob/living/living_movement.dm | 2 + code/modules/mob/mob_defines.dm | 2 + code/modules/mob/say.dm | 69 ++++++++++++++-------- code/modules/mob/typing_indicator.dm | 20 ++++--- 7 files changed, 65 insertions(+), 38 deletions(-) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index e0a22667ac..78d1264f66 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -67,8 +67,9 @@ #define SPACEVINE_LAYER 4.8 #define SPACEVINE_MOB_LAYER 4.9 //#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define -#define GASFIRE_LAYER 5.05 -#define RIPPLE_LAYER 5.1 +#define ABOVE_FLY_LAYER 5.1 +#define GASFIRE_LAYER 5.2 +#define RIPPLE_LAYER 5.3 #define GHOST_LAYER 6 #define LOW_LANDMARK_LAYER 9 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index f70f8c55bc..c7f19e600f 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -278,4 +278,4 @@ #define PULL_PRONE_SLOWDOWN 0.6 #define HUMAN_CARRY_SLOWDOWN 0 -#define TYPING_INDICATOR_TIMEOUT 10 SECONDS +#define TYPING_INDICATOR_TIMEOUT 30 SECONDS diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index e8a57bb257..a728d13deb 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -69,6 +69,9 @@ return next_click = world.time + world.tick_lag + // Hide typing indicator if we click + hide_typing_indicator_auto() + if(check_click_intercept(params,A)) return diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index e0ea6350d7..271b18f86f 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -1,6 +1,8 @@ /mob/living/Moved() . = ..() update_turf_movespeed(loc) + //Hide typing indicator if we move. + hide_typing_indicator_auto() /mob/living/CanPass(atom/movable/mover, turf/target) if((mover.pass_flags & PASSMOB)) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 8cda504149..4ce11b4f86 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -136,3 +136,5 @@ var/typing_indicator_state = /obj/effect/overlay/typing_indicator /// The timer that will remove our indicator for early aborts (like when an user finishes their message) var/typing_indicator_timerid + /// Current state of our typing indicator. Used for cut overlay, DO NOT RUNTIME ASSIGN OTHER THAN FROM SHOW/CLEAR. Used to absolutely ensure we do not get stuck overlays. + var/typing_indicator_current diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index bca634ada9..95e504aece 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -4,14 +4,23 @@ set name = "say_keybind" set hidden = TRUE set category = "IC" - return say_verb(message) + // If they don't type anything just drop the message. + clear_typing_indicator() // clear it immediately! + if(!length(message)) + return + return do_sayverb(message) /mob/verb/say_verb(message as text|null) set name = "Say" set category = "IC" display_typing_indicator() if(!length(message)) - message = input(usr, "Say something!", "Say") as text|null + // We don't use input because that can't be broken out of with ESC key. + winset(src, null, "command=\"say_keybind\"") + else + return do_sayverb(message) + +/mob/proc/do_sayverb(message) clear_typing_indicator() // clear it immediately! if(!length(message)) return @@ -20,6 +29,38 @@ return say(message) +/mob/verb/me_keybind(message as message) + set name = "me_keybind" + set hidden = TRUE + set category = "IC" + // If they don't type anything just drop the message. + clear_typing_indicator() // clear it immediately! + if(!length(message)) + return + return do_meverb(message) + +/mob/verb/me_verb(message as message|null) + set name = "Me" + set category = "IC" + display_typing_indicator() + if(!length(message)) + // Do not use input because it can't be broken out of with ESC key. + winset(src, null, "command=\"me_keybind\"") + else + return do_meverb(message) + +/mob/proc/do_meverb(message) + clear_typing_indicator() // clear it immediately! + if(!length(message)) + return + if(GLOB.say_disabled) //This is here to try to identify lag problems + to_chat(usr, "Speech is currently admin-disabled.") + return + + message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) + + usr.emote("me",1,message,TRUE) + /mob/say_mod(input, message_mode) var/customsayverb = findtext(input, "*") if(customsayverb && message_mode != MODE_WHISPER_CRIT) @@ -31,7 +72,6 @@ /mob/verb/whisper_verb(message as text) set name = "Whisper" set category = "IC" - clear_typing_indicator() // clear it immediately! if(!length(message)) return if(GLOB.say_disabled) //This is here to try to identify lag problems @@ -42,29 +82,6 @@ /mob/proc/whisper(message, datum/language/language=null) say(message, language) //only living mobs actually whisper, everything else just talks -/mob/verb/me_keybind(message as message) - set name = "me_keybind" - set hidden = TRUE - set category = "IC" - return me_verb(message) - -/mob/verb/me_verb(message as message|null) - set name = "Me" - set category = "IC" - display_typing_indicator() - if(!length(message)) - message = input(usr, "What do you want to emote?" , "Emote") as message|null - clear_typing_indicator() // clear it immediately! - if(!length(message)) - return - if(GLOB.say_disabled) //This is here to try to identify lag problems - to_chat(usr, "Speech is currently admin-disabled.") - return - - message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - - usr.emote("me",1,message,TRUE) - /mob/proc/say_dead(var/message) var/name = real_name var/alt_name = "" diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 4ecf930aee..f28cbe4385 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -22,19 +22,21 @@ GLOBAL_LIST_EMPTY(typing_indicator_overlays) * @param force - shows even if src.typing_indcator_enabled is FALSE. */ /mob/proc/display_typing_indicator(timeout_override = TYPING_INDICATOR_TIMEOUT, state_override = get_typing_indicator_icon_state(), force = FALSE) - if((!typing_indicator_enabled && !force) || typing_indicator_timerid) + if((!typing_indicator_enabled && !force) || typing_indicator_current) return - typing_indicator_timerid = addtimer(CALLBACK(src, .proc/clear_typing_indicator, state_override), timeout_override, TIMER_STOPPABLE) - add_overlay(get_indicator_overlay(state_override)) + typing_indicator_current = state_override + add_overlay(state_override) + typing_indicator_timerid = addtimer(CALLBACK(src, .proc/clear_typing_indicator), timeout_override, TIMER_STOPPABLE) /** * Removes typing indicator. - * @param state_override Sets the state that we will remove. Defaults to src.get_typing_indicator_icon_state() */ -/mob/proc/clear_typing_indicator(state_override = get_typing_indicator_icon_state()) - deltimer(typing_indicator_timerid) - typing_indicator_timerid = null - cut_overlay(get_indicator_overlay(state_override)) +/mob/proc/clear_typing_indicator() + cut_overlay(typing_indicator_current) + typing_indicator_current = null + if(typing_indicator_timerid) + deltimer(typing_indicator_timerid) + typing_indicator_timerid = null /// Default typing indicator /obj/effect/overlay/typing_indicator @@ -42,4 +44,4 @@ GLOBAL_LIST_EMPTY(typing_indicator_overlays) icon = 'icons/mob/talk.dmi' icon_state = "normal_typing" appearance_flags = RESET_COLOR | TILE_BOUND | PIXEL_SCALE - layer = LARGE_MOB_LAYER + layer = ABOVE_FLY_LAYER From e027d22fd887a3248c12c024c55955bead017379 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 5 Mar 2020 00:53:18 -0700 Subject: [PATCH 11/14] eh ok --- code/__DEFINES/mobs.dm | 2 +- code/_onclick/click.dm | 2 +- code/modules/mob/living/living_movement.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index c7f19e600f..f70f8c55bc 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -278,4 +278,4 @@ #define PULL_PRONE_SLOWDOWN 0.6 #define HUMAN_CARRY_SLOWDOWN 0 -#define TYPING_INDICATOR_TIMEOUT 30 SECONDS +#define TYPING_INDICATOR_TIMEOUT 10 SECONDS diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index a728d13deb..a6c0792a5d 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -70,7 +70,7 @@ next_click = world.time + world.tick_lag // Hide typing indicator if we click - hide_typing_indicator_auto() + clear_typing_indicator() if(check_click_intercept(params,A)) return diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 271b18f86f..a9c80740a1 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -2,7 +2,7 @@ . = ..() update_turf_movespeed(loc) //Hide typing indicator if we move. - hide_typing_indicator_auto() + clear_typing_indicator() /mob/living/CanPass(atom/movable/mover, turf/target) if((mover.pass_flags & PASSMOB)) From 62fd71c50edb2f7cfda5732b78a7677b68f3a365 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 24 Apr 2020 23:31:34 -0700 Subject: [PATCH 12/14] kay --- code/controllers/subsystem/input.dm | 59 +++++------------------- code/modules/keybindings/bindings_mob.dm | 17 ------- code/modules/mob/say.dm | 38 ++++++--------- interface/skin.dmf | 6 +-- tgstation.dme | 1 + 5 files changed, 28 insertions(+), 93 deletions(-) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index ac27d43775..c6c03e2cbd 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -8,14 +8,6 @@ SUBSYSTEM_DEF(input) var/list/macro_sets var/list/movement_keys - /*! Special thing (until we get custom keybinds that also support clientside macros :weary:) that lets us do stuff like look up "which key is say/me bound to". Special format too, the value of a key should be list(key, modifier1, modifier2, ...). "default" unless override. - * USE get_key_for_macro_id or get_typing_indicator_binds TO ACCESS! - */ - var/list/macro_set_reverse_lookups - /// cache these for speed. - var/list/typing_indicator_binds - /// same - var/static/list/typing_indicator_verbs /datum/controller/subsystem/input/Initialize() setup_default_macro_sets() @@ -41,57 +33,35 @@ SUBSYSTEM_DEF(input) "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "O" = "ooc", "Ctrl+O" = "looc", - "T" = "say_keybind", - "Ctrl+T" = "whisper", - "M" = "me_keybind", - "Ctrl+M" = "subtle", + "T" = "Say", + "Ctrl+T" = "SayWithIndicator", + "Y" = "whisper", + "M" = "Me", + "Ctrl+M" = "MeWithIndicator", + "5" = "subtle", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", ), "old_default" = list( "Tab" = "\".winset \\\"mainwindow.macro=old_hotkeys map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"", - "Ctrl+T" = "say_keybind", + "Ctrl+T" = "Say", "Ctrl+O" = "ooc", ), "old_hotkeys" = list( "Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "O" = "ooc", "L" = "looc", - "T" = "say_keybind", - "M" = "me_keybind", + "T" = "Say", + "Ctrl+T" = "SayWithIndicator", + "M" = "Me", + "Ctrl+M" = "MeWithIndicator", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", ), ) - macro_set_reverse_lookups = list( - "default" = list( - "say_keybind" = list("T"), - "whisper" = list("T", "Ctrl"), - "me_keybind" = list("M"), - "subtle" = list("M", "Ctrl") - ), - "old_default" = list( - "say_keybind" = list("T", "Ctrl"), - ), - "old_hotkeys" = list( - "say_keybind" = list("T"), - "me_keybind" = list("M"), - ) - ) - - typing_indicator_verbs = list("me", "say", "say_keybind", "me_keybind") - typing_indicator_binds = list() - for(var/check_verb in typing_indicator_verbs) - for(var/macro_set in macro_set_reverse_lookups) - var/list/keylist = macro_set_reverse_lookups[macro_set][check_verb] - if(!keylist) - continue - var/key = keylist[1] - typing_indicator_binds[key] = TRUE - // Because i'm lazy and don't want to type all these out twice var/list/old_default = default_macro_sets["old_default"] @@ -151,10 +121,3 @@ SUBSYSTEM_DEF(input) for(var/i in 1 to length(clients)) var/client/C = clients[i] C.keyLoop() - -/datum/controller/subsystem/input/proc/get_key_for_macro_id(macro_id, macroset) - return macro_set_reverse_lookups[macroset][macro_id] || macro_set_reverse_lookups["default"][macro_id] - -/// Returns an associative list of keys without modifiers like ctrl. You have to do another lookup, this is for the first check to be faster. -/datum/controller/subsystem/input/proc/get_typing_indicator_binds(macroset) - return typing_indicator_binds[macroset] diff --git a/code/modules/keybindings/bindings_mob.dm b/code/modules/keybindings/bindings_mob.dm index cacb382d6a..36b4775c34 100644 --- a/code/modules/keybindings/bindings_mob.dm +++ b/code/modules/keybindings/bindings_mob.dm @@ -3,24 +3,7 @@ // Or we can have NPC's send actual keypresses and detect that by seeing no client /mob/key_down(_key, client/user) - if(SSinput.typing_indicator_binds[_key]) - var/macroset = winget(user, "mainwindow", "macro") - var/list/L = SSinput.macro_set_reverse_lookups[macroset] - var/valid = FALSE - for(var/the_verb in L) - if(the_verb in SSinput.typing_indicator_verbs) - var/list/keys = L[the_verb] - valid = TRUE - if(length(keys) > 1) - for(var/i in 2 to length(keys)) - if(!client.keys_held[keys[i]]) - valid = FALSE - break - if(valid) - display_typing_indicator() switch(_key) - if("Escape") //escape breaks out of clientside verb text input without executing at all, meaning we can't hook the verb to do this for us. - clear_typing_indicator() if("Delete", "H") if(!pulling) to_chat(src, "You are not pulling anything.") diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 95e504aece..9679417ed8 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -1,55 +1,43 @@ //Speech verbs. // the _keybind verbs uses "as text" versus "as text|null" to force a popup when pressed by a keybind. -/mob/verb/say_keybind(message as text) - set name = "say_keybind" +/mob/verb/say_typing_indicator() + set name = "SayWithIndicator" set hidden = TRUE set category = "IC" + display_typing_indicator() + var/message = input(usr, "", "Say") as text|null // If they don't type anything just drop the message. clear_typing_indicator() // clear it immediately! if(!length(message)) return - return do_sayverb(message) + return say_verb(message) -/mob/verb/say_verb(message as text|null) +/mob/verb/say_verb(message as text) set name = "Say" set category = "IC" - display_typing_indicator() - if(!length(message)) - // We don't use input because that can't be broken out of with ESC key. - winset(src, null, "command=\"say_keybind\"") - else - return do_sayverb(message) - -/mob/proc/do_sayverb(message) - clear_typing_indicator() // clear it immediately! if(!length(message)) return if(GLOB.say_disabled) //This is here to try to identify lag problems to_chat(usr, "Speech is currently admin-disabled.") return + clear_typing_indicator() // clear it immediately! say(message) -/mob/verb/me_keybind(message as message) - set name = "me_keybind" +/mob/verb/me_typing_indicator() + set name = "MeWithIndicator" set hidden = TRUE set category = "IC" + display_typing_indicator() + var/message = input(usr, "", "Me") as message|null // If they don't type anything just drop the message. clear_typing_indicator() // clear it immediately! if(!length(message)) return - return do_meverb(message) + return me_verb(message) -/mob/verb/me_verb(message as message|null) +/mob/verb/me_verb(message as message) set name = "Me" set category = "IC" - display_typing_indicator() - if(!length(message)) - // Do not use input because it can't be broken out of with ESC key. - winset(src, null, "command=\"me_keybind\"") - else - return do_meverb(message) - -/mob/proc/do_meverb(message) clear_typing_indicator() // clear it immediately! if(!length(message)) return diff --git a/interface/skin.dmf b/interface/skin.dmf index 5f8e1ad125..f27b0bcf48 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,5 +1,6 @@ macro "default" + menu "menu" elem name = "&File" @@ -268,14 +269,13 @@ window "statwindow" is-default = true saved-params = "" - window "preferences_window" +window "preferences_window" elem "preferences_window" type = MAIN pos = 372,0 size = 1280x1000 anchor1 = none anchor2 = none - background-color = none is-visible = false saved-params = "pos;size;is-minimized;is-maximized" statusbar = false @@ -285,7 +285,6 @@ window "statwindow" size = 960x1000 anchor1 = 0,0 anchor2 = 75,100 - background-color = none saved-params = "" elem "character_preview_map" type = MAP @@ -295,3 +294,4 @@ window "statwindow" anchor2 = 100,100 right-click = true saved-params = "zoom;letterbox;zoom-mode" + diff --git a/tgstation.dme b/tgstation.dme index 107a704c4b..0f54c8cb5d 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -3253,6 +3253,7 @@ #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" +#include "interface\skin.dmf" #include "modular_citadel\code\__HELPERS\list2list.dm" #include "modular_citadel\code\__HELPERS\lists.dm" #include "modular_citadel\code\__HELPERS\mobs.dm" From abb7f199dff94f741ec86b62ba19ba3193f077af Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 24 Apr 2020 23:39:08 -0700 Subject: [PATCH 13/14] tweaks --- code/_onclick/click.dm | 5 +---- code/controllers/subsystem/input.dm | 18 +++++++++--------- code/modules/mob/say.dm | 14 +++++++------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 99907af47a..738d72c6bf 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -69,9 +69,6 @@ return next_click = world.time + world.tick_lag - // Hide typing indicator if we click - clear_typing_indicator() - if(check_click_intercept(params,A)) return @@ -80,7 +77,7 @@ if(SEND_SIGNAL(src, COMSIG_MOB_CLICKON, A, params) & COMSIG_MOB_CANCEL_CLICKON) return - + var/list/modifiers = params2list(params) if(modifiers["shift"] && modifiers["middle"]) ShiftMiddleClickOn(A) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index c6c03e2cbd..1f8a03b3e7 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -33,11 +33,11 @@ SUBSYSTEM_DEF(input) "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "O" = "ooc", "Ctrl+O" = "looc", - "T" = "Say", - "Ctrl+T" = "SayWithIndicator", + "T" = "say", + "Ctrl+T" = "say_indicator", "Y" = "whisper", - "M" = "Me", - "Ctrl+M" = "MeWithIndicator", + "M" = "me", + "Ctrl+M" = "me_indicator", "5" = "subtle", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs "Any" = "\"KeyDown \[\[*\]\]\"", @@ -45,17 +45,17 @@ SUBSYSTEM_DEF(input) ), "old_default" = list( "Tab" = "\".winset \\\"mainwindow.macro=old_hotkeys map.focus=true input.background-color=[COLOR_INPUT_DISABLED]\\\"\"", - "Ctrl+T" = "Say", + "Ctrl+T" = "say", "Ctrl+O" = "ooc", ), "old_hotkeys" = list( "Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", "O" = "ooc", "L" = "looc", - "T" = "Say", - "Ctrl+T" = "SayWithIndicator", - "M" = "Me", - "Ctrl+M" = "MeWithIndicator", + "T" = "say", + "Ctrl+T" = "say_indicator", + "M" = "me", + "Ctrl+M" = "me_indicator", "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs "Any" = "\"KeyDown \[\[*\]\]\"", "Any+UP" = "\"KeyUp \[\[*\]\]\"", diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 9679417ed8..ac89fc2445 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -1,11 +1,11 @@ //Speech verbs. // the _keybind verbs uses "as text" versus "as text|null" to force a popup when pressed by a keybind. /mob/verb/say_typing_indicator() - set name = "SayWithIndicator" + set name = "say_indicator" set hidden = TRUE set category = "IC" display_typing_indicator() - var/message = input(usr, "", "Say") as text|null + var/message = input(usr, "", "say") as text|null // If they don't type anything just drop the message. clear_typing_indicator() // clear it immediately! if(!length(message)) @@ -13,7 +13,7 @@ return say_verb(message) /mob/verb/say_verb(message as text) - set name = "Say" + set name = "say" set category = "IC" if(!length(message)) return @@ -24,11 +24,11 @@ say(message) /mob/verb/me_typing_indicator() - set name = "MeWithIndicator" + set name = "me_indicator" set hidden = TRUE set category = "IC" display_typing_indicator() - var/message = input(usr, "", "Me") as message|null + var/message = input(usr, "", "me") as message|null // If they don't type anything just drop the message. clear_typing_indicator() // clear it immediately! if(!length(message)) @@ -36,9 +36,8 @@ return me_verb(message) /mob/verb/me_verb(message as message) - set name = "Me" + set name = "me" set category = "IC" - clear_typing_indicator() // clear it immediately! if(!length(message)) return if(GLOB.say_disabled) //This is here to try to identify lag problems @@ -46,6 +45,7 @@ return message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) + clear_typing_indicator() // clear it immediately! usr.emote("me",1,message,TRUE) From 47b97629db020ae1d85c321265226d12642e5c81 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 1 May 2020 04:30:44 -0700 Subject: [PATCH 14/14] Update mobs.dm --- code/__DEFINES/mobs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 38eb3cc533..bcd00e174c 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -290,7 +290,7 @@ #define PULL_PRONE_SLOWDOWN 0.6 -#define TYPING_INDICATOR_TIMEOUT 10 SECONDS +#define TYPING_INDICATOR_TIMEOUT 5 MINUTES #define FIREMAN_CARRY_SLOWDOWN 0 #define PIGGYBACK_CARRY_SLOWDOWN 1