Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- _def_func("say_chat", function(message, ...) {
- local UTF8_BYTE_1BYTE = 0
- local UTF8_BYTE_2BYTE_HEAD = 1
- local UTF8_BYTE_3BYTE_HEAD = 2
- local UTF8_BYTE_4BYTE_HEAD = 3
- local UTF8_BYTE_TAIL = 4
- local get_utf8_byte_type = function(int_char) {
- if (!(int_char & (1 << 7))) return UTF8_BYTE_1BYTE
- if (!(int_char & (1 << 6))) return UTF8_BYTE_TAIL
- if (!(int_char & (1 << 5))) return UTF8_BYTE_2BYTE_HEAD
- if (!(int_char & (1 << 4))) return UTF8_BYTE_3BYTE_HEAD
- if (!(int_char & (1 << 3))) return UTF8_BYTE_4BYTE_HEAD
- }
- local messages = []
- local send_str_to_chat = function(str) {
- //removing whitespaces in the beginning - important!
- local last_whitespace_index = 0
- while(
- str[last_whitespace_index].tochar() == " "
- || str[last_whitespace_index].tochar() == "\n"
- || str[last_whitespace_index].tochar() == "\t"
- ) last_whitespace_index += 1
- str = str.slice(last_whitespace_index, str.len())
- //adding char with code 1 - UTF8 characters fix
- local first_byte_type = get_utf8_byte_type(str[0])
- if (
- first_byte_type == UTF8_BYTE_2BYTE_HEAD
- || first_byte_type == UTF8_BYTE_3BYTE_HEAD
- || first_byte_type == UTF8_BYTE_4BYTE_HEAD
- ) {
- str = (1).tochar() + str
- }
- messages.append(str)
- }
- local str_to_utf8_chars = function(str) {
- local arr = []
- foreach(int_char in str) {
- if (get_utf8_byte_type(int_char) == UTF8_BYTE_TAIL) {
- if (arr.len() > 0) {
- arr[arr.len() - 1] += int_char.tochar()
- }
- } else {
- arr.push(int_char.tochar())
- }
- }
- return arr
- }
- local MAX_MESSAGE_LENGTH_BYTES = 240
- local MAX_WORD_LENGTH_CHARS = 30
- //-------------------------------------
- if (typeof message != "string") {
- message = message.tostring()
- }
- if (vargv.len() > 0) {
- local args = [this, message]
- args.extend(vargv)
- message = format.acall(args)
- }
- local chars = str_to_utf8_chars(message)
- local start_index = 0
- local word_first_symbol = 0
- local current_len = 0
- while(true) {
- if (word_first_symbol >= chars.len()) {
- //log("word_first_symbol >= chars.len()")
- //printing
- local str = ""
- for (local i = start_index; i < chars.len(); i++) {
- str += chars[i]
- }
- send_str_to_chat(str)
- //log("[str len] " + str.len())
- //log(str)
- break
- }
- //seaching for end of word
- local next_space_symbol
- local word_len = chars[word_first_symbol].len()
- for(next_space_symbol = word_first_symbol + 1; next_space_symbol <= chars.len(); next_space_symbol++) {
- if (next_space_symbol == chars.len()) break
- if (next_space_symbol - word_first_symbol >= MAX_WORD_LENGTH_CHARS) break
- local char = chars[next_space_symbol]
- if (char == " ") break
- if (char == "\n") break
- if (char == "\t") break
- word_len += char.len()
- }
- local currentWordToStr = function() {
- local str = ""
- for (local i = word_first_symbol; i < next_space_symbol ;i++) {
- str += chars[i]
- }
- return str
- }
- //log("[word len] " + word_len + " [" + currentWordToStr() + "] [total len] " + (current_len + word_len))
- // start_index - first symbol that was not printed yet
- // word_first_symbol - first symbol of last word
- // next_space_symbol - first symbol after the end of last word
- // current_len - length from start_index to start of word (exclusive) in bytes
- if (current_len + word_len > MAX_MESSAGE_LENGTH_BYTES) {
- //log("current_len + word_len > MAX_MESSAGE_LENGTH_BYTES" + ": " + current_len + " + " + word_len)
- //printing without last word
- local str = ""
- for (local i = start_index; i < word_first_symbol; i++) {
- str += chars[i]
- }
- send_str_to_chat(str)
- //log("[str len] " + str.len())
- //log(str)
- start_index = word_first_symbol
- word_first_symbol = next_space_symbol
- current_len = word_len
- } else {
- word_first_symbol = next_space_symbol
- current_len += word_len
- }
- }
- local send_all_to_chat = function() {
- foreach(message in messages) {
- Say(null, message, false)
- }
- }
- if (
- !is_dedicated()
- && !server_host()
- && ("register_callback" in root)
- ) {
- local sent = false
- local unique_key = "__say_" + UniqueString()
- local try_send_later = function() {
- if (!("DirectorScript" in root)) return
- register_callback(unique_key, "player_team", function(params) {
- if (params.oldteam != 0) return
- if (params.isbot) return
- send_all_to_chat()
- sent = true
- return false
- })
- }
- try_send_later()
- EntFire("worldspawn", "callscriptfunction", unique_key, 0.5)
- root[unique_key] <- function() {
- if (sent) return
- if (server_host()) {
- send_all_to_chat()
- } else {
- try_send_later()
- }
- delete root[unique_key]
- }
- } else {
- send_all_to_chat()
- }
- })
- _def_func("is_dedicated", function() {
- local terror_gamerules = Entities.FindByClassname(null, "terror_gamerules")
- if (terror_gamerules) return NetProps.GetPropInt(terror_gamerules, "m_bIsDedicatedServer")
- return (Convars.GetStr("ip") != "localhost")
- })
- _def_func("server_host", function() {
- if (__server_host) return __server_host;
- local terror_player_manager = Entities.FindByClassname(null, "terror_player_manager")
- for (local i = 0; i <= 32; i++)
- if (NetProps.GetPropIntArray(terror_player_manager, "m_listenServerHost", i)) {
- local player = EntIndexToHScript(i)
- __server_host = player
- return player
- }
- })
- _def_var_nullable("__server_host", null, "instance")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement