Иконка ресурса

Console MOTD 1.0

Нет прав для скачивания
Сообщения
1,367
Реакции
2,396
Помог
58 раз(а)
Сообщения
1,618
Реакции
1,651
BlackSignature Я так понял engclient_print быстрее выполняется,чем client_print ?
 
Сообщения
1,367
Реакции
2,396
Помог
58 раз(а)
MayroN, в каком контексте "быстрее" ? он тут для того, чтобы не было проблем отображения при открытом vgui / motd
 
Сообщения
411
Реакции
89
Предупреждения
24
Помог
1 раз(а)
1. После захода на сервер инфа в консоле отображается 2 секунды, после чего вся информация с консоли пропадает. Конфликт у меня с чем-то или у всех так?
2. Есть возможность сделать отображение в цветном варианте?

Первый пункт исправил задержкой в 10 секунд.
 
Сообщения
1,086
Реакции
233
Предупреждения
8
Помог
6 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Код:
#include amxmodx
#include amxmisc

new const PLUGIN_NAME[] = "Console MOTD"
new const PLUGIN_VERSION[] = "1.0"

// Config filename in 'amxmodx/configs'.
new const CFG_FILENAME[] = "console_motd.ini"

// Maximum of console message rows. Can be changed if needed.
const MAX_STRINGS = 10

// Delay between logging into the server and displaying the message. Can be changed if needed.
const Float:MSG_DELAY = 1.0

const MSG_LEN = 256

new g_szMotdRow[MAX_STRINGS][MSG_LEN], g_iMsgCount

public plugin_init() {
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, "mx?!")
    
    new szBuffer[MSG_LEN]
    new iLen = get_configsdir(szBuffer, charsmax(szBuffer))
    formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "/%s", CFG_FILENAME)
    new hFile = fopen(szBuffer, "r")
    
    if(!hFile) {
        set_fail_state("Can't %s '%s'", file_exists(szBuffer) ? "read" : "find", szBuffer)
        return
    }
    
    while(fgets(hFile, szBuffer, charsmax(szBuffer))) {
        trim(szBuffer)
        
        if(!szBuffer[0] || szBuffer[0] == ';' || szBuffer[0] == '/') {
            continue
        }
        
+      if(strlen(szBuffer) >= MSG_LEN) {
+            continue
+      }

        replace_string(szBuffer, charsmax(szBuffer), "<br>", "^n")
        
        copy(g_szMotdRow[g_iMsgCount], charsmax(g_szMotdRow[]), szBuffer)
        
        if(++g_iMsgCount == MAX_STRINGS) {
            break
        }
    }
    
    fclose(hFile)
    
    server_print("[%s] Loaded %i message rows", PLUGIN_NAME, g_iMsgCount)
    
    if(!g_iMsgCount) {
        pause("ad")
    }
}

public client_putinserver(pPlayer) {
    if(!is_user_bot(pPlayer) && !is_user_hltv(pPlayer)) {
        set_task(MSG_DELAY, "task_PrintMOTD", pPlayer)
    }
}

public client_disconnected(pPlayer) {
    remove_task(pPlayer)
}

public task_PrintMOTD(pPlayer) {
+  if(!is_user_connected (player)) {
+     return
+  }

    for(new i; i < g_iMsgCount; i++) {
        engclient_print(pPlayer, engprint_console, g_szMotdRow[i])
    }
}
Ещё бы добавить в set_fail_state более информативное сообщение

И по replace_string, а если попадут управляющие символы...
 
Сообщения
1,367
Реакции
2,396
Помог
58 раз(а)
BiZaJe, ?
Код:
new szBuffer[MSG_LEN]

+      if(strlen(szBuffer) >= MSG_LEN) {
+            continue
+      }
Куда уж информативнее?
Код:
   if(!hFile) {
        set_fail_state("Can't %s '%s'", file_exists(szBuffer) ? "read" : "find", szBuffer)
        return
    }
Я понимаю, что бывает кейс, когда disconnected в плагине может сработать раньше, чем putinserver в нём же, но это уже "синдром больной головы", не следует учитывать все возможные ошибки других авторов плагинов
Код:
public client_disconnected(pPlayer) {
    remove_task(pPlayer)
}

+  if(!is_user_connected (player)) {
+     return
+  }
Конкретнее бы. Не понял, что имеется ввиду
И по replace_string, а если попадут управляющие символы...
 
Сообщения
1,711
Реакции
1,519
Помог
26 раз(а)
Я понимаю, что бывает кейс, когда disconnected в плагине может сработать раньше, чем putinserver в нём же, но это уже "синдром больной головы", не следует учитывать все возможные ошибки других авторов плагинов
Если зайти на сервер и выйти, до окончания таска (delay), будет ошибка. То есть это базовый кейс, который лучше обработать.
 
Сообщения
1,367
Реакции
2,396
Помог
58 раз(а)
fl0wer, падажжи, у меня же таск сетается в putinserver, а удаление таска в disconnected.
 
Сообщения
1,086
Реакции
233
Предупреждения
8
Помог
6 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
BlackSignature, Да никто никого не троллит

В первом случае проверка длины массива чтобы после копирования не вылазить за пределы массива, думаю лишним не будет

Во втором случае проверка на подключённого игрока тоже не лишняя, но это уже выше расписали

Повторюсь, что всю мессагу отправленную в консоль лучше отфильтровать и экранировать символы \ " ; и т.д

Код:
#include amxmodx
#include amxmisc

new const PLUGIN_NAME[] = "Console MOTD"
new const PLUGIN_VERSION[] = "1.0"

// Config filename in 'amxmodx/configs'.
new const CFG_FILENAME[] = "console_motd.ini"

// Maximum of console message rows. Can be changed if needed.
const MAX_STRINGS = 10

// Delay between logging into the server and displaying the message. Can be changed if needed.
const Float:MSG_DELAY = 1.0

const MSG_LEN = 256

new g_szMotdRow[MAX_STRINGS][MSG_LEN], g_iMsgCount

public plugin_init() {
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, "mx?!")
    
    new szBuffer[MSG_LEN]
    new iLen = get_configsdir(szBuffer, charsmax(szBuffer))
-    formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "/%s", CFG_FILENAME)
+    formatex(szBuffer[iLen], charsmax(szBuffer) - iLen, "%s%s", (szBuffer[iLen-1] == '/') ? "" : "/", CFG_FILENAME)
    new hFile = fopen(szBuffer, "r")
    
    if(!hFile) {
        set_fail_state("Can't %s '%s'", file_exists(szBuffer) ? "read" : "find", szBuffer)
        return
    }
    
    while(fgets(hFile, szBuffer, charsmax(szBuffer))) {
        trim(szBuffer)
        
        if(!szBuffer[0] || szBuffer[0] == ';' || szBuffer[0] == '/') {
            continue
        }
        
+      if(strlen(szBuffer) >= MSG_LEN) {
+            continue
+      }

-        replace_string(szBuffer, charsmax(szBuffer), "<br>", "^n")
        
+       replace_string(szBuffer, charsmax(szBuffer), "<br>", "\n");

        copy(g_szMotdRow[g_iMsgCount], charsmax(g_szMotdRow[]), szBuffer)
        
        if(++g_iMsgCount == MAX_STRINGS) {
            break
        }
    }
    
    fclose(hFile)
    
    server_print("[%s] Loaded %i message rows", PLUGIN_NAME, g_iMsgCount)
    
    if(!g_iMsgCount) {
        pause("ad")
    }
}

public client_putinserver(pPlayer) {
    if(!is_user_bot(pPlayer) && !is_user_hltv(pPlayer)) {
        set_task(MSG_DELAY, "task_PrintMOTD", pPlayer)
    }
}

public client_disconnected(pPlayer) {
    remove_task(pPlayer)
}

public task_PrintMOTD(pPlayer) {
+  if(!is_user_connected (player)) {
+     return
+  }

    for(new i; i < g_iMsgCount; i++) {
        engclient_print(pPlayer, engprint_console, g_szMotdRow[i])
    }
}
 
Сообщения
423
Реакции
118
Помог
3 раз(а)
BiZaJe,
Код:
+      if(strlen(szBuffer) >= MSG_LEN) {
+            continue
+      }
Это не требуется. Переменная инициализирована нулями, при указании размера буфера используется charsmax, поэтому в конце массива будет всегда 0 и это условие никогда не выполнится, никогда. Второго предполагаемого сценария тоже никогда не случится, потому что он обнуляет task при дисконнекте.

А для того чтобы сработал ваш вариант кода replace_string(szBuffer, charsmax(szBuffer), "<br>", "\n"); нужно в компиляторе изменить управляющий символ, например, так #pragma ctrlchar \. По-умолчанию, очевидно, будет работать вариант автора.

В core.ini задаются пути до папок amxx статически и без "/" на конце, поэтому конструкция (szBuffer[iLen-1] == '/') ? "" : "/" всегда выдаст "".

А вот после set_fail_state() больше ничего не выполняется... так что return не понадобится. Но это все чепуха и "лизания яйцев", когда заняться нечем...
 
Последнее редактирование:
Сообщения
1,086
Реакции
233
Предупреждения
8
Помог
6 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Refresh, зайдет какой-нибудь "топовый" тех.админ добавить /\ в конце пути и что будем делать?

Если массив инцилизирован нулями и использует charsmax это вообще не говорит о возможности вылезти за пределы

На счет ^n и \n , на каких-то источниках говорят, что ^n для худа , \n для консоли

Я не буду спорить и разводить срач в теме, автор с "огромным" опытом разберётся
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу