From 12364f0cd2e7f589b569c370d40a4908638ae59f Mon Sep 17 00:00:00 2001 From: Chinsky Date: Fri, 29 Aug 2014 04:10:37 +0400 Subject: [PATCH] Adds typing indicator. It's toggleable as client preference. Displays dots(codersprite) near the mob when he starts typing a message. Detects chatline me and say via checking contents. Detects shortcut input me an say via hacky wrapper that's called now instead of direct say/me verbs. --- baystation12.dme | 1 + code/modules/mob/mob.dm | 1 + code/modules/mob/mob_defines.dm | 1 + code/modules/mob/say.dm | 3 ++ code/modules/mob/typing_indicator.dm | 57 +++++++++++++++++++++++++++ code/setup.dm | 1 + icons/mob/talk.dmi | Bin 5948 -> 1771 bytes interface/skin.dmf | 8 ++-- 8 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 code/modules/mob/typing_indicator.dm diff --git a/baystation12.dme b/baystation12.dme index ff370aa446..f1505dde54 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -911,6 +911,7 @@ #include "code\modules\mob\mob_transformation_simple.dm" #include "code\modules\mob\say.dm" #include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" #include "code\modules\mob\update_icons.dm" #include "code\modules\mob\dead\death.dm" #include "code\modules\mob\dead\observer\logout.dm" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 71aa42a05a..ba2c3e5437 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -73,6 +73,7 @@ /mob/proc/Life() // if(organStructure) // organStructure.ProcessOrgans() + handle_typing_indicator() return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 777f684dcb..086cbe9fa9 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -220,3 +220,4 @@ var/turf/listed_turf = null //the current turf being examined in the stat panel var/list/active_genes=list() + var/hud_typing = 0 //set when typing in an input window instead of chatline \ No newline at end of file diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index a9648bc95d..6d5e308c7a 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -12,6 +12,8 @@ if(say_disabled) //This is here to try to identify lag problems usr << "\red Speech is currently admin-disabled." return + + set_typing_indicator(0) usr.say(message) /mob/verb/me_verb(message as text) @@ -24,6 +26,7 @@ message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) + set_typing_indicator(0) if(use_me) usr.emote("me",usr.emote_type,message) else diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm new file mode 100644 index 0000000000..2e6f62943f --- /dev/null +++ b/code/modules/mob/typing_indicator.dm @@ -0,0 +1,57 @@ +var/global/image/typing_indicator + +/mob/proc/set_typing_indicator(var/state) + if(client) + if(!(client.prefs.toggles & SHOW_TYPING)) + if(!typing_indicator) + typing_indicator = image('icons/mob/talk.dmi',null,"typing") + if(state) + if(!(typing_indicator in overlays)) + overlays += typing_indicator + else + overlays -= typing_indicator + return state + +/mob/verb/say_wrapper() + set name = ".Say" + set hidden = 1 + + set_typing_indicator(1) + hud_typing = 1 + var/message = input("","say (text)") as text + hud_typing = 0 + set_typing_indicator(0) + if(message) + say_verb(message) + +/mob/verb/me_wrapper() + set name = ".Me" + set hidden = 1 + + set_typing_indicator(1) + hud_typing = 1 + var/message = input("","me (text)") as text + hud_typing = 0 + set_typing_indicator(0) + if(message) + me_verb(message) + +/mob/proc/handle_typing_indicator() + if(client) + if(!(client.prefs.toggles & SHOW_TYPING) && !hud_typing) + var/temp = winget(client, "input", "text") + if(length(temp) > 5 && findtext(temp, "Say \"", 1, 7)) + set_typing_indicator(1) + else if(length(temp) > 3 && findtext(temp, "Me ", 1, 5)) + set_typing_indicator(1) + else + set_typing_indicator(0) + +/client/verb/typing_indicator() + set name = "Show/Hide Typing Indicator" + set category = "Preferences" + set desc = "Toggles showing an indicator when you are typing emote or say message." + prefs.toggles ^= SHOW_TYPING + prefs.save_preferences() + src << "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] display typing indicator." + feedback_add_details("admin_verb","TID") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/setup.dm b/code/setup.dm index 361cfaa66c..9d695d565c 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -649,6 +649,7 @@ var/list/liftable_structures = list(\ #define CHAT_DEBUGLOGS 2048 #define CHAT_LOOC 4096 #define CHAT_GHOSTRADIO 8192 +#define SHOW_TYPING 16384 #define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC) diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi index 9e451181e2e0ad938b23b11ce77d96e66e68de31..0a1d63335906b48e36866d28b09d19adba33fe33 100644 GIT binary patch literal 1771 zcmb7FdpOhkAOFtQ7-u;~=QtirXdTC;RjOglXmZ=EgDz;Oh=p8Q?%Nqt(T}8zLQT2l z$Z)7+wW(Zwzo;3V5s%|im@}7!kulCX=XuWg{r7u*e|+BW&-1)5pZELyyk755))6mP zxTb+7003}zH-fiHGrt@Ss7k)Vo$694ezNZg8X@$;nK)_;jT(I(01``T^BOc+=&vtN zeY9ZE;O&HdD;JBc_Mf3?<*1(hH!{8%;UChnDZtQpta-uwHOtsJ8)as^WV$ayvJOVP zslNYlg7(Yx2U~WCo8MQGb#Hn=5iU+y@!Or#ed6H1pXWc4TiD>7oPD#kI-X?LGAj0G zgypSgPcy?5tnalT6?cUHO7DF;m9W*rVb?;H5xx?8Q`~-VlK!xgP+aW4T~vR0UrNv} zQI7TCy{hQD-enQXN3C}Nz!r%+!O1tVWcJQ;FEe+&OXT9)qVP*TwuE9Uga|6Wsu#9* zdI1um8%e~FTXnA|1u;o5hk;CX@(xpT$5#0pRCHO}>X_wPk)jo=&2CSETQ$gtxYEh+5451!pAvb z0;FlwF%HapkA80F+m0b~Yj~-l7sTQU^vG7#%>Zv#`y|aAdw&^x-8OST8{hj%3B1;6 zKr+iKgbbjr>qW?#tig~7)-YR*Lucg^z#9?%M!s zqo^skS!?e|+c+knk!rC%FXEltaNl8D4hEd%Vz4WdC;I2-J%dU>%qDhplQegK*-&E~ z#-7dyEMenFqu#6hrS>hEZlwMN>T?+=7-L`C5bZ*8!u#)OFgTEH6&M^7S3?qjgR!%xC0$n=I!An#5n z(1X#iMJ1-lVA{MC{ouvd2bv*OXq2p?j^T)>qv~_sx9b3-wbV2%C@fmt+}hZcDO!754eTqqNU)0@yEhF{eHv_Y;nGbL-T@?!p zaqylr$|}VyYLQRY9bhA!InbDpW5j~~;mxa#mh-o#$RmPN$B2(TIMDDHO&e>|a9}jn zf0U8TN>E2yPXA_<+NNBB=Ju%pF^j{w zHFHB$j!V0*!Y-HjbYK0C$I8rw9}n<4AyoSI@?-$}z;dVt#5 zF_GC!CO|T;mkN4nuw*LU#49`F?d?{afP_rXS4{qf{kRXauS9dsRiN@ zw7GVFin(!F%mZ{A(%GBIW7EMCZnxD_wjN58h*{-wSYe L@gi`YgVX;2wzol; literal 5948 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 diff --git a/interface/skin.dmf b/interface/skin.dmf index 0795bdd0bf..51d51e96cb 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -149,11 +149,11 @@ macro "macro" is-disabled = false elem name = "F3" - command = "say" + command = ".say" is-disabled = false elem name = "F4" - command = "me" + command = ".me" is-disabled = false elem name = "F5" @@ -403,11 +403,11 @@ macro "hotkeymode" is-disabled = false elem name = "F3" - command = "say" + command = "say_wrapper" is-disabled = false elem name = "F4" - command = "me" + command = "me_wrapper" is-disabled = false elem name = "F5"