Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.36 KB | None | 0 0
  1. _def_func("say_chat", function(message, ...) {
  2. local UTF8_BYTE_1BYTE = 0
  3. local UTF8_BYTE_2BYTE_HEAD = 1
  4. local UTF8_BYTE_3BYTE_HEAD = 2
  5. local UTF8_BYTE_4BYTE_HEAD = 3
  6. local UTF8_BYTE_TAIL = 4
  7. local get_utf8_byte_type = function(int_char) {
  8. if (!(int_char & (1 << 7))) return UTF8_BYTE_1BYTE
  9. if (!(int_char & (1 << 6))) return UTF8_BYTE_TAIL
  10. if (!(int_char & (1 << 5))) return UTF8_BYTE_2BYTE_HEAD
  11. if (!(int_char & (1 << 4))) return UTF8_BYTE_3BYTE_HEAD
  12. if (!(int_char & (1 << 3))) return UTF8_BYTE_4BYTE_HEAD
  13. }
  14. local messages = []
  15. local send_str_to_chat = function(str) {
  16. //removing whitespaces in the beginning - important!
  17. local last_whitespace_index = 0
  18. while(
  19. str[last_whitespace_index].tochar() == " "
  20. || str[last_whitespace_index].tochar() == "\n"
  21. || str[last_whitespace_index].tochar() == "\t"
  22. ) last_whitespace_index += 1
  23. str = str.slice(last_whitespace_index, str.len())
  24. //adding char with code 1 - UTF8 characters fix
  25. local first_byte_type = get_utf8_byte_type(str[0])
  26. if (
  27. first_byte_type == UTF8_BYTE_2BYTE_HEAD
  28. || first_byte_type == UTF8_BYTE_3BYTE_HEAD
  29. || first_byte_type == UTF8_BYTE_4BYTE_HEAD
  30. ) {
  31. str = (1).tochar() + str
  32. }
  33. messages.append(str)
  34. }
  35. local str_to_utf8_chars = function(str) {
  36. local arr = []
  37. foreach(int_char in str) {
  38. if (get_utf8_byte_type(int_char) == UTF8_BYTE_TAIL) {
  39. if (arr.len() > 0) {
  40. arr[arr.len() - 1] += int_char.tochar()
  41. }
  42. } else {
  43. arr.push(int_char.tochar())
  44. }
  45. }
  46. return arr
  47. }
  48. local MAX_MESSAGE_LENGTH_BYTES = 240
  49. local MAX_WORD_LENGTH_CHARS = 30
  50. //-------------------------------------
  51. if (typeof message != "string") {
  52. message = message.tostring()
  53. }
  54. if (vargv.len() > 0) {
  55. local args = [this, message]
  56. args.extend(vargv)
  57. message = format.acall(args)
  58. }
  59. local chars = str_to_utf8_chars(message)
  60. local start_index = 0
  61. local word_first_symbol = 0
  62. local current_len = 0
  63. while(true) {
  64. if (word_first_symbol >= chars.len()) {
  65. //log("word_first_symbol >= chars.len()")
  66. //printing
  67. local str = ""
  68. for (local i = start_index; i < chars.len(); i++) {
  69. str += chars[i]
  70. }
  71. send_str_to_chat(str)
  72. //log("[str len] " + str.len())
  73. //log(str)
  74. break
  75. }
  76. //seaching for end of word
  77. local next_space_symbol
  78. local word_len = chars[word_first_symbol].len()
  79. for(next_space_symbol = word_first_symbol + 1; next_space_symbol <= chars.len(); next_space_symbol++) {
  80. if (next_space_symbol == chars.len()) break
  81. if (next_space_symbol - word_first_symbol >= MAX_WORD_LENGTH_CHARS) break
  82. local char = chars[next_space_symbol]
  83. if (char == " ") break
  84. if (char == "\n") break
  85. if (char == "\t") break
  86. word_len += char.len()
  87. }
  88. local currentWordToStr = function() {
  89. local str = ""
  90. for (local i = word_first_symbol; i < next_space_symbol ;i++) {
  91. str += chars[i]
  92. }
  93. return str
  94. }
  95. //log("[word len] " + word_len + " [" + currentWordToStr() + "] [total len] " + (current_len + word_len))
  96. // start_index - first symbol that was not printed yet
  97. // word_first_symbol - first symbol of last word
  98. // next_space_symbol - first symbol after the end of last word
  99. // current_len - length from start_index to start of word (exclusive) in bytes
  100. if (current_len + word_len > MAX_MESSAGE_LENGTH_BYTES) {
  101. //log("current_len + word_len > MAX_MESSAGE_LENGTH_BYTES" + ": " + current_len + " + " + word_len)
  102. //printing without last word
  103. local str = ""
  104. for (local i = start_index; i < word_first_symbol; i++) {
  105. str += chars[i]
  106. }
  107. send_str_to_chat(str)
  108. //log("[str len] " + str.len())
  109. //log(str)
  110. start_index = word_first_symbol
  111. word_first_symbol = next_space_symbol
  112. current_len = word_len
  113. } else {
  114. word_first_symbol = next_space_symbol
  115. current_len += word_len
  116. }
  117. }
  118. local send_all_to_chat = function() {
  119. foreach(message in messages) {
  120. Say(null, message, false)
  121. }
  122. }
  123. if (
  124. !is_dedicated()
  125. && !server_host()
  126. && ("register_callback" in root)
  127. ) {
  128. local sent = false
  129. local unique_key = "__say_" + UniqueString()
  130. local try_send_later = function() {
  131. if (!("DirectorScript" in root)) return
  132. register_callback(unique_key, "player_team", function(params) {
  133. if (params.oldteam != 0) return
  134. if (params.isbot) return
  135. send_all_to_chat()
  136. sent = true
  137. return false
  138. })
  139. }
  140. try_send_later()
  141. EntFire("worldspawn", "callscriptfunction", unique_key, 0.5)
  142. root[unique_key] <- function() {
  143. if (sent) return
  144. if (server_host()) {
  145. send_all_to_chat()
  146. } else {
  147. try_send_later()
  148. }
  149. delete root[unique_key]
  150. }
  151. } else {
  152. send_all_to_chat()
  153. }
  154. })
  155.  
  156. _def_func("is_dedicated", function() {
  157. local terror_gamerules = Entities.FindByClassname(null, "terror_gamerules")
  158. if (terror_gamerules) return NetProps.GetPropInt(terror_gamerules, "m_bIsDedicatedServer")
  159. return (Convars.GetStr("ip") != "localhost")
  160. })
  161.  
  162. _def_func("server_host", function() {
  163. if (__server_host) return __server_host;
  164. local terror_player_manager = Entities.FindByClassname(null, "terror_player_manager")
  165. for (local i = 0; i <= 32; i++)
  166. if (NetProps.GetPropIntArray(terror_player_manager, "m_listenServerHost", i)) {
  167. local player = EntIndexToHScript(i)
  168. __server_host = player
  169. return player
  170. }
  171. })
  172.  
  173. _def_var_nullable("__server_host", null, "instance")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement