BLOG [WEB-BLOG] Просто о Ethernet`е

Сообщения
65
Реакции
12
Приветствую всех пользователей форума, Я Георгий, Мне 22 года, не так давно забросил дело с игровыми серверами CS и перешел в разработку сайтов.
Такое действие показалось более целесообразным, чем ковыряться в серверной части, а именно в AmxModX, т.к полазив на просторах интернета и сравнив несколько плагинов (ResetScore, KillSound и т.д) в основном изобретают велосипеды "С добавлением дополнительных звездочек, колес и цепей" добиваясь "Оптимизации" в пару байт на все плагины. Не буду говорить обо всех скриптерах, кто-то действительно делает годные плагины.
В общем ближе к делу, блог буду вести исключительно по Веб-Части, выкладывать готовые Landing page, визитки и всякое такое, код на обсуждение или какие-то пометки для Себя и для Вас.
Если кто-то хочет, что-нибудь простенькое для себя, готов практические за спасибо сделать.

SCSS:
.block{
    width: 100%;
    height: 100vh;
    .content{
        width:500px;
        height: 500px;
        background-color: green;
        margin: 0 auto;
    }
}
HTML:
<div class="block">
    <div class="content">
        Блок по центру
    </div>
</div>
Prefer-StringПреобразование объекта в строку, если такое преобразование возможно
Prefer-NumberПреобразование объекта в число, если такое преобразование возможно
No-PreferenceКлассы определяют собственные преобразования, Все встроенные типы в JS, кроме Date преобразуются в числа, Date определяется как Prefer-String
BoleanВсе объекты преобразуются в тип Bool, применяется также к объектам-оболочкам "Boolean(False)"
StringИнтерпретатор JS преобразовывает объект в элементарное значение используя алгоритм Prefer-String, после происходит преобразование результата в строку.
 
Последнее редактирование:
Сообщения
65
Реакции
12
NumberИнтерпретатор JS преобразовывает объект в элементарное значение используя алгоритм Prefer-Number, после происходит преобразование результата в число.
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
Казалось бы причём тут IEEE 802.3
 
Сообщения
65
Реакции
12
@irrumabo_me_nomen,Моя фантазия была на грани:ok:
 
Сообщения
65
Реакции
12
Вопрос касающийся ReApi, сработает ли данная блокировка конца раунда

C++:
public DB_RoundEnd(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay){
    if(event != ROUND_GAME_COMMENCE && event != ROUND_GAME_RESTART){
        SetHookChainReturn(ATYPE_BOOL, false);
        return HC_SUPERCEDE;
    }
    return HC_CONTINUE;
}
Я так понял, что нужно отлавливать событие начала игры (Когда игроки только подключаются) и событие рестарта раунда (Перезапуск игры так сказать) объединив через условие и логический оператор И/AND/&&

И обязательно ли запускать TASK задачу через секунду для изменения серверных Cvar, не уж то сервер их всегда обновляет?

И прошу конкретный ответ :ok: т.к хочу разобраться конкретно с работой ReApi
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Georg,
1. Все верно. Сработает.
2. В АМХХ (вроде с версии 1.9.0) завезли форварды для таких действий. Костыли с тасками можно оставить в прошлом.
Код:
/**
* Called when the map has loaded, and all configs are done executing.
* This includes servercfgfile (server.cfg), amxx.cfg, plugin's config, and
* per-map config.
*
* @note This is best place to initialize plugin functions which are based on cvar data.
* @note This will always be called once and only once per map.  It will be
*       called few seconds after plugin_cfg().
*
* @noreturn
*/
forward OnConfigsExecuted();

/**
* Called when the map has loaded, right after plugin_cfg() but any time
* before OnConfigsExecuted.  It's called after amxx.cfg and  all
* AutoExecConfig() exec commands have been added to the server command buffer.
*
* @note This will always be called once and only once per map.
*
* @noreturn
*/
forward OnAutoConfigsBuffered();
 
Сообщения
65
Реакции
12
@bizon,С этим разобрался, благодарю.
Вот такой еще момент, обязательно ли блокировать трупы при больших кол-вах убийств на сервере, ведь при возрождении игрока труп пропадает, или же все такие message о трупе отправляется и лучше блокировать?
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Georg, мессага отправляется на клиент. Думаю, что блокировка сообщения здесь будет лишней.
В принципе если режим DM, и игроки после убийства сразу респавнятся, то можно и блокировать. Но стоит учитывать, что возможно некоторые плагины завязаны на работе с этой мессагой ClCorpse.
 
Сообщения
65
Реакции
12
@bizon,А если учесть тот факт, что если даже и DM, но возрождение идет через секунд 7
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Georg, не страшно, можно не блокировать тогда уж, если нужна визуальная составляющая трупа.
 
Сообщения
65
Реакции
12
bizon, Такой ещё момент.
Есть одна идея, но для полной красоты нужно заблокировать стандартную игровую валюту.
Использовал блок сообщения Money валюта стала значением 0 и сделал полный блок в
RG_CBasePlayer_AddAccount.
Но как убрать полностью иконку?
Отлавливать момент спавна и блокировать 94 и 110 сообщение ?
Но что еще попадёт в блок?
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Georg, да, блокировать мессаги "HideWeapon" и "Crosshair" (индексы 94 и 110 соответственно).
Только непосредственно в момент спавна заблокировать не выйдет, нужно с небольшой задержкой.
Не замечал, чтобы такой вариант влиял на что-то еще.

Код:
#include <amxmodx>

const g_iBitsHudMoney = (1<<5);

new
    g_iMsgIdHideWeapon,
    g_iMsgIdCrosshair;

public plugin_init()
{
    register_event("ResetHUD", "@event_ResetHUD", "be");

    g_iMsgIdHideWeapon = get_user_msgid("HideWeapon");
    g_iMsgIdCrosshair = get_user_msgid("Crosshair");
}

@event_ResetHUD(pPlayer)
{
    set_task(0.1, "@func_HideMoney", pPlayer);
}

@func_HideMoney(pPlayer)
{
    message_begin(MSG_ONE, g_iMsgIdHideWeapon, .player = pPlayer);
    write_byte(g_iBitsHudMoney);
    message_end();

    message_begin(MSG_ONE, g_iMsgIdCrosshair, .player = pPlayer);
    write_byte(0);
    message_end();
}
Я когда-то пользовался таким.
Если вникнуть в эту тему, возможно, есть вариант покруче.
 
Сообщения
65
Реакции
12
@d3m37r4,bizon,
C++:
public DB_CBasePlayer_Spawn(const this){
    set_member(this, m_iHideHUD, get_member(this, m_iHideHUD) | HIDEHUD_MONEY);
    return HC_CONTINUE;
}
Протестировал, работает, но правильно ли я сделал используя get_member и HC_CONTINUE.
Еще такой вопрос, эффективно ли использовать биты и побитовые операции, дает ли это какой прирост "Оптимизации" или в Amxx это как легенда?
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
правильно ли я сделал используя get_member и HC_CONTINUE.
правильно, return здесь не обязателен.

Еще такой вопрос, эффективно ли использовать биты и побитовые операции, дает ли это какой прирост "Оптимизации" или в Amxx это как легенда?
Смотря в каких ситуациях. Везде их не надо пихать, только в очень часто вызываемых функциях.
 
  • Нравится
Реакции: DEVV
Сообщения
65
Реакции
12
Nordic Warrior,Понял, буду пробовать.
Идей много, но кажется в CS 1.6 такое никогда не реализуется, но буду пробовать.
  • Проблема с заменой звука стрельбы так и осталась? Вроде на мою память это вечная проблема была т.к в client.dll звук был прописан. Если использовать UpdateClientData вроде как появится возможность замены? Но тогда пропадают другие элементы игры, то тогда использовать UpdateClientData и написать полноценный плагин с API для прорисовки остальных элементов (Декали, спрайты выстрелов, анимации и т.д) с минимальной нагрузкой реально? Т.к есть идея немного изменить принцип стрельбы.
  • Сразу же появляется вопрос, отладка кода и слежка за выполнением функции, если даже такое начнет попадать в реализацию, как можно в AMXX отследить выполнение функции и сколько памяти расходуется на это? Это вообще возможно делать с выводом в консоль сервера?
  • Возможно ли огранить функцию Precache, например карта de_dust2 запускается, имеются определенные плагины (Ну например турель или custom weapon) можно ли ограничить чтобы не попасть в лимит 512?, т.к например для одной карты используются одни модели с текстурами (Даже тот же dust2 взять, карта как бы песчаная), а для другой карты например cs_assault (Карта к примеру городская) использовать другие модели.
6 Сен 2022
Отправка сообщение на почту:
PHP:
/*
    $recipient - Получатель сообщения
    Пример: [email protected]
    $topic - Тема сообщения
    $message - Сообщение. Оформляется полноценно HTML кодом и CSS стилями.
*/
mail($recipient, $topic, $message);
Но при использовании этой функции появляются несколько проблем:
  • Сообщение попадает в спам сразу же. Решение такой проблемы - настройка почтового сервера и соответствующие записи в DNS (SPF, DKIM, DMARC)
  • Либо же через SMTP настроится к YANDEX`у
  • Использовать библиотеку PHPMailer с настройкой SMTP к YANDEX`у
 
Сообщения
65
Реакции
12
d3m37r4, Nordic Warrior, bizon,
Работа со строковыми Cvar
C++:
ENUM CVARS{
    CVAR_LIGHTING_NORMAL_ROUND,
    Что-то еще...
}

new CvarEffLighting[CVARS]

// Создаю Cvar
bind_pcvar_string(create_cvar("lighting_normal_round",
    "c",
    FCVAR_NONE,
    "Map lighting [a-darkest // z-brightest // ''-default // 0-disabled]"),
    CvarEffLighting[CVAR_LIGHTING_NORMAL_ROUND], charsmax(CvarEffLighting[CVAR_LIGHTING_NORMAL_ROUND]));

// Получение и запись в lighting
get_pcvar_string(get_cvar_pointer(CvarEffLighting[CVAR_LIGHTING_NORMAL_ROUND]), lighting, charsmax(lighting))
Что я имею по итогу, ловлю ошибку Run time error 10: native error (native "get_pcvar_string")
Так и не понимаю почему ловлю эту ошибку.
Также ловил Tag Mismatch по Float данным, но решил убрать get_pcvar_float Warning пропал.
Объясните как и когда использовать get_pcvar_*
 
Сообщения
65
Реакции
12
Ошибка выявляется с get_pcvar_pointer и без нее
 

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

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