1+ #define TYPING_INDICATOR_RANGE 7
2+
13/ mob / proc / get_say()
4+ create_typing_indicator ()
5+ window_typing = TRUE
26 var /msg = input (src , null , " say \" text \" " ) as text| null
3- say_verb (msg)
7+ window_typing = FALSE
8+ remove_typing_indicator ()
9+ say_verb (msg)
10+
11+ / mob
12+ var /image /typing_overlay
13+ var /list /speech_bubble_recipients
14+ var /last_typed
15+ var /last_typed_time
16+ var /window_typing = FALSE
17+ var /bar_typing = FALSE
18+
19+ / mob / proc / handle_typing_indicator()
20+ INVOKE_ASYNC (src ,. proc / typing_indicator_process)
21+
22+ / mob / proc / typing_indicator_process()
23+ if (! GLOB . typing_indicators)
24+ return
25+ if (client)
26+ var /temp = winget(client, " input" , " text" )
27+ if (temp != last_typed)
28+ last_typed = temp
29+ last_typed_time = world . time
30+ if (world . time > last_typed_time + 10 SECONDS )
31+ bar_typing = FALSE
32+ remove_typing_indicator ()
33+ return
34+ if (length(temp) > 5 && findtext(temp, " Say \" " , 1 , 7 ))
35+ create_typing_indicator ()
36+ bar_typing = TRUE
37+ else if (length(temp) > 3 && findtext(temp, " Me " , 1 , 5 ))
38+ // set_typing_indicator(1)
39+ else
40+ bar_typing = FALSE
41+ remove_typing_indicator ()
42+
43+
44+ / mob / proc / create_typing_indicator()
45+ if (typing_overlay)
46+ return
47+ if (stat)
48+ return
49+ var /list /listening = get_hearers_in_view(TYPING_INDICATOR_RANGE , src )
50+ speech_bubble_recipients = list ()
51+ for (var /mob /M in listening)
52+ if (M. client && M. client. prefs. chat_toggles & CHAT_TYPING_INDICATOR )
53+ speech_bubble_recipients. Add(M. client)
54+ var /bubble = " default"
55+ if (isliving(src ))
56+ var /mob /living/L = src
57+ bubble = L. bubble_icon
58+ typing_overlay = image(' yogstation/icons/mob/talk.dmi' , src , " [ bubble] _talking" , FLY_LAYER )
59+ typing_overlay. appearance_flags = APPEARANCE_UI
60+ typing_overlay. invisibility = invisibility
61+ typing_overlay. alpha = alpha
62+ for (var /client /C in speech_bubble_recipients)
63+ C. images += typing_overlay
64+
65+
66+ / mob / proc / remove_typing_indicator()
67+ if (! typing_overlay)
68+ return
69+ if (window_typing || bar_typing)
70+ return
71+ for (var /client /C in speech_bubble_recipients)
72+ C. images -= typing_overlay
73+ typing_overlay = null
74+ speech_bubble_recipients = list ()
75+
76+ #undef TYPING_INDICATOR_RANGE
0 commit comments