Вопросы по оптимизации кода KORD

Сообщения
78
Реакции
7
Всем привет, продолжаю копаться и потихоньку переписывать код Корда. У меня накопилось несколько вопросов, буду рад если кто-нибудь ответит на какой-либо из них:

1) Я планирую использовать Кордовский код оружия приблизительно для полсотни стволов. Его код считается эталоном оптимизации (хоть и архаичным) , но то что скрипт переписывает оружие чуть ли не с нуля делает его мегагромоздким. Я хоть и обновил под реапи почти все до чего дотянулись пальцы и хватило знаний, но опасаюсь в будущем лагов. Поэтому интересно, как с точки зрения оптимизации лучше было бы оформлять такие плагины? У меня на уме два варианта:

А) Оставить все по-старинке, уповая что нагрузки не будет.
Б)Придумать альтернативу, к примеру, регистрировать и расписывать в одном плагине сразу несколько стволов, использующих в качестве референса один и тот же оригинальный ствол, или сделать что-то типа API с главным плагином , где все расписано, и с плагинами поменьше, которые расписывают нюансы конкретного ствола и передают массив данных о нем в главный плагин.

2)Копаясь в коде нашел вот такую проверку:


Код:
register_forward(FM_UpdateClientData,    "FakeMeta_UpdateClientData_Post",    true);//НЕРЕАЛЬНЫЙ КАЛЛ, НЕОБХОДИМО ИЗБАВИТЬСЯ

//**********************************************
//* Block client weapon.                       *
//**********************************************

public FakeMeta_UpdateClientData_Post(const iPlayer, const iSendWeapons, const CD_Handle)
{
/*    static iActiveItem;
    
    if (!is_entity(iPlayer))
    {
        return FMRES_IGNORED;
    }
    
    iActiveItem = get_member(iPlayer, m_pActiveItem);
    
    if (!is_entity(iActiveItem) || !IsCustomItem(iActiveItem))
    {
        return FMRES_IGNORED;
    }
    
    set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001);
    return FMRES_IGNORED;*/
}
Как я понимаю, так Корд избегает предиктов со стороны клиента. Но в плане оптимизации от этого форварда однозначно надо избавляться, т.к. он вызывается 50-100 раз в секунду. В современных плагинах я такого не видел, можно ли с чистой совестью снести этот отрывок кода? Или есть аналог лучше?

3) Хотелось бы узнать, где в коде вылета гильз прописано положение вылетающей гильзы? Я имею в виду не место спавна или вектор вылета, а именно то куда сама гильза в мире повернута. А то в игре замечаю, что гильзы спавнятся все время смотря в одну сторону относительно мира, а не игрока, из-за этого, если смотреть в определенную сторону при выстреле они могут вылетать "смотря" перпендикулярно стволу. Была мысль что это vecAngle[1] в поле rotation указанный в мессаге, но вроде не то.

Код гильз:


Код:
EjectBrass(const iPlayer, const iModelIndex, const iBounce, const Float:flUpScale = -5.0, const Float: flForwardScale = 17.0, const Float: flRightScale = -7.0)
{
    static i, msgBrass;
    
    static Float: vecUp[3];
    static Float: vecRight[3];
    static Float: vecForward[3];
    
    static Float: vecAngle[3];
    static Float: vecOrigin[3];
    static Float: vecViewOfs[3];
    static Float: vecVelocity[3];
    
    get_entvar(iPlayer, var_v_angle, vecAngle);
    get_entvar(iPlayer, var_punchangle, vecOrigin);
    
    xs_vec_add(vecAngle, vecOrigin, vecOrigin);
    engfunc(EngFunc_MakeVectors, vecOrigin);
    
    get_entvar(iPlayer, var_origin, vecOrigin);
    get_entvar(iPlayer, var_view_ofs, vecViewOfs);
    get_entvar(iPlayer, var_velocity, vecVelocity);
    
    global_get(glb_v_up, vecUp);
    global_get(glb_v_right, vecRight);
    global_get(glb_v_forward, vecForward);
    
    for (i = 0; i < 3; i++)
    {
        vecOrigin[i] = vecOrigin[i] + vecViewOfs[i] + vecForward[i] * flForwardScale + vecUp[i] * flUpScale + vecRight[i] * flRightScale;
        vecVelocity[i] = vecVelocity[i] + vecForward[i] * 1.5 + vecUp[i] * random_float(80.0, 100.0) + vecRight[i] * random_float(170.0, 190.0);
    }
    
    if (msgBrass || (msgBrass = get_user_msgid("Brass")))
    {
        MESSAGE_BEGIN(MSG_PVS, msgBrass, vecOrigin, 0);
        WRITE_BYTE(0 /* dummy */);
        WRITE_COORD(vecOrigin[0]);
        WRITE_COORD(vecOrigin[1]);
        WRITE_COORD(vecOrigin[2]);
        WRITE_COORD(0.0 /* dummy */);
        WRITE_COORD(0.0 /* dummy */);
        WRITE_COORD(0.0 /* dummy */);
        WRITE_COORD(vecVelocity[0]);
        WRITE_COORD(vecVelocity[1]);
        WRITE_COORD(vecVelocity[2]);
        WRITE_ANGLE(vecAngle[1]);
        WRITE_SHORT(iModelIndex);
        WRITE_BYTE(iBounce);
        WRITE_BYTE(0 /* dummy */);
        WRITE_BYTE(iPlayer);
        MESSAGE_END();
    }
}
Буду рад ответу хоть на что-либо из вышеперечисленного.
 
  • Нравится
Реакции: ssx
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Как я понимаю, так Корд избегает предиктов со стороны клиента. Но в плане оптимизации от этого форварда однозначно надо избавляться, т.к. он вызывается 50-100 раз в секунду. В современных плагинах я такого не видел, можно ли с чистой совестью снести этот отрывок кода? Или есть аналог лучше?
Это хороший способ заблокировать выстрел в предикшене.
 
Сообщения
78
Реакции
7
Nordic Warrior, но ведь форвард вызывается очень часто, да и в нынешних плагинах обходятся без подобного. А учитывая сколько стволов я хочу переписать с этим кодом, это может крепко аукнутся. Почему этот способ хороший? И, кстати, подобные предикты тоже можно устранить выставив cl_lw 0?
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Его код считается эталоном оптимизации
Во первых, кто так считает? Кто проводил замеры? Кто сказал, что нельзя сделать лучше?
У него код бывает разный, как и у всех скриптеров. Где-то хорошо, где-то можно лучше, где-то плохо. Все мы люди.
Во вторых, преждевременная оптимизация - это очень плохо. Сначала напиши хороший понятный код, а потом, выясни нужна ли вообще оптимизация. И если она действительно нужна - оптимизируй в "узких" местах.
Не нужно писать сразу преждевременно оптимизированный код. Потому что как правило, оптимизированный код плохой. Его трудно читать, понимать, сопровождать, масштабировать, модифицировать, легко допустить ошибку.

Придумать альтернативу, к примеру, регистрировать и расписывать в одном плагине сразу несколько стволов
Это приведет к тем же проблемам описанные выше, и даже более того, скорее всего наоборот замедлит код, из-за кучи дополнительных условий и вызовов нужных коллбеков.
Есть другой вариант: распихай общий код в один или несколько инклудов (общие стоковые функции) и используй их в своих плагинах оружий. Это решить проблему с дублированием кода, но минус в том, что если внесешь какие-то исправления в инклудах, то придется перекомпилировать все плагины.

Как я понимаю, так Корд избегает предиктов со стороны клиента.
Этот код блокирует выстрел на стороне клиента.
Так как звуки выстрела, декали и другие эффекты - это все делает сам клиент, это блокируется на клиенте и восстанавливается все эти эффекты уже на стороне сервера, с нужными звуками выстрела, декалями и остальными эффектами.
Что касается оптимизации, от этого хука можно легко избавиться использовав m_bCanShoot из ReAPI вместо него.

Хотелось бы узнать, где в коде вылета гильз прописано положение вылетающей гильзы? Я имею в виду не место спавна или вектор вылета, а именно то куда сама гильза в мире повернута.
vecOrigin задает координаты, vecAngle[1] задает углы (rotation), vecVelocity в какую сторону полетит гильза.
 
Сообщения
78
Реакции
7
fl0wer, хммм, глянул, возможно я неправ, эти современные плагины, которые я видел, по факту являются либо лайтовыми вариациями для паблика, к примеру AUW, где меняется только модель и множитель урона, либо это плагины на гранаты, где, как я понял, можно обойтись без подобных проверок. А современных плагинов для zp я уже не видел 100 лет.

the_hunter,
Во первых, кто так считает? Кто проводил замеры? Кто сказал, что нельзя сделать лучше?
У него код бывает разный, как и у всех скриптеров. Где-то хорошо, где-то можно лучше, где-то плохо. Все мы люди.
На моей памяти, все люди в течении целого десятилетия, кто как-либо отзывался об этом коде, начиная с простых челов как я, заканчивая полноценными скриптерами, его нахваливали, причем я за все это время ни разу не видел подобной реакции относительно кода других авторов в теме zp оружия. А кодинг вещь менее субъективная чем вкус в музыке или политические взгляды. Никто не сказал что нельзя сделать еще лучше, но лучше этого в те времена ничего из уже существовавшего на моей памяти не было. Я же писал выше, что этот "эталон" архаичный, старый, поэтому я и загорелся желанием его "отшлифовать" по мере моих сил.


Не нужно писать сразу преждевременно оптимизированный код. Потому что как правило, оптимизированный код плохой. Его трудно читать, понимать, сопровождать, масштабировать, модифицировать, легко допустить ошибку.
Поэтому я и здесь, мне не хочется заранее добавлять или убирать влияющие на оптимизацию моменты, не зная заранее как буду оформлять и в каких рамках использовать код, это может привести к повторному переписыванию измененных мест, в лучшем случае это будет потеря времени. Но при этом не хочется оставлять очевидно необходимые для замены моменты, чтобы после завершения работы не пришлось, если я все же наклепаю отдельный плагин под каждый ствол, полсотни раз менять одно и то же, а потом и компилировать, поэтому я и спрашиваю здесь что можно без угрызений совести заменить или убрать.

Это приведет к тем же проблемам описанные выше, и даже более того, скорее всего наоборот замедлит код, из-за кучи дополнительных условий и вызовов нужных коллбеков.
Есть другой вариант: распихай общий код в один или несколько инклудов (общие стоковые функции) и используй их в своих плагинах оружий. Это решить проблему с дублированием кода, но минус в том, что если внесешь какие-то исправления в инклудах, то придется перекомпилировать все плагины.
Я как раз об этом и думал, сделать структуру наподобие Advanced Ultimate Weapons, только там работа нативов своего инклуда расписана в мастер-плагине. А вообще, с точки зрения оптимизации что хуже: дубли функций или использование одной функции, но с проверками?
Просто к примеру есть два ствола, у них имеется одинаковая функция, но с таким описанным различием, что без проверки и дальнейшего расписывания кода для каждого ствола не получится. И тут непонятно, можно расписать одну функцию со switch по var_impulse для стволов с особенным поведением, а можно им прописать свою отдельную функцию, в рамках которой все стволы с этим отличием будут работать. Как лучше с точки зрения оптимизации?


Этот код блокирует выстрел на стороне клиента.
Так как звуки выстрела, декали и другие эффекты - это все делает сам клиент, это блокируется на клиенте и восстанавливается все эти эффекты уже на стороне сервера, с нужными звуками выстрела, декалями и остальными эффектами.
Что касается оптимизации, от этого хука можно легко избавиться использовав m_bCanShoot из ReAPI вместо него.


vecOrigin задает координаты, vecAngle[1] задает углы (rotation), vecVelocity в какую сторону полетит гильза.
Ооооо, большое спасибо! Вот это я и хотел узнать, сегодня буду тестить!

С гильзами я когда-то сам настрадался, знаю про velocity и origin, но кроме angle я не вижу других мест где можно было бы указать координаты модели гильзы в мире.
 
Сообщения
657
Реакции
562
Предупреждения
8
Помог
9 раз(а)
Код:
// return item index

native CreateItem
(
    const BaseClass[],
    const CustomClass[],
    const ViewModel[],
    const WeaponModel[] = "",
    const WorldModel[] = "",
    const Body = 0,
    const Skin = 0,
    const FireSound[] = "",
    const iszBrassModel = 0,
    bool:isPredicted = true,
    bool:CustomSprite = false,
    Float:vecBrassOrigin[3] = { 0.0, 0.0, 0.0 } // up, forward, right
)

native SetItemParams
(
    const ItemIndex,
    bool:HasSecAttack = false,
    const MaxClip = 0,
    const MaxBPAmmo = 0,
    const Damage = 0,
    const Damage2 = 0, // alternate damage (for: usp, m4a1, famas)
    Float:MaxSpeed = 0.0,
    Float:MaxSpeed2 = 0.0 // zoomed
)
Это из моего плагина weaponmaker который делает всю грязную работу. Под эту систему уже написал cz75, tec9, mp5sd, r8 из кс го. Код аддонов стало меньше и легче для понимания.
 
Сообщения
78
Реакции
7
the_hunter,
Что касается оптимизации, от этого хука можно легко избавиться использовав m_bCanShoot из ReAPI вместо него.
Я тут глянул, как понимаю, set_member(iPlayer, m_bCanShoot, false) в Деплой, а set_member(iPlayer, m_bCanShoot, true)
в холстер и можно убирать тот форвард?
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Ash Fever, холстер не нужен. true/false можно в деплое.
 
Сообщения
78
Реакции
7
the_hunter, а если я уберу этот ствол и возьму оригинальный ствол в руки m_bCanShoot разве не останется прежним?
7 Июн 2024
Vaqtincha, хм, возьму на заметку эту структуру, получается все эти нативы расписаны в мастер-плагине, а в плагинах оружия указаны параметры для нативов и расписано особенное поведение для общих функций главного плагина?
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Ash Fever, используй хук RG_CBasePlayerWeapon_DefaultDeploy из реапи, вместо хука виртуальной функции из хамсендвича.
 
Сообщения
78
Реакции
7
the_hunter, хм, при вызове общего хука на деплой проверить кастомный ли ствол и указать нужное значение m_bCanShoot? Просто дело в том что хамовский деплой и холстер у корда в плагине уже расписаны и в них выполняются действия, а вот этого хука в плагине нет. Но в будущем для мастер-плагина так и надо будет сделать. Регистрировать каждую функцию под каждый оригинальный ствол с которого переписывалось оружие все равно не с руки.
 
Сообщения
78
Реакции
7
the_hunter, эх, похоже не сработало, при выстреле вылетают две гильзы, с моим и с клиентским вектором полета, а при быстрой стрельбе между выстрелами проскакивает кадр анимации idle.
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Сообщения
78
Реакции
7
the_hunter, Увы, это только для изменения возможности стрельбы во время freezetime
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
но ведь форвард вызывается очень часто
Да какая разница? Это всё в предыдущее-то время работало нормально на серверах, а сейчас, на современных процессорах и с программными оптимизациями (рехлдс и пр.) вообще не важно.

А современных плагинов для zp я уже не видел 100 лет.
Добро пожаловать к t3rkecorejz на гитхаб.
 
Сообщения
78
Реакции
7
Nordic Warrior, если нет альтернатив, то я конечно это приму,а так лучше заранее все подправить, иначе из подобных мелочей соберется дорожка к лагам и фризам, учитывая громоздкость самого зм и вдобавок к этому громоздкость моей будущей сборки.
О, терке все еще в строю. Приятно видеть.

Кстати, я правильно понимаю, что вектор punchangle в kickback отвечает за отдачу оружия после определенного количеста выстрелов с зажима? А m_flAccuracy за разброс пуль и как все это влияет на движение прицела? Хотелось бы сделать возможность регулировать точность и отдачу стволов, однако многое непонятно. К примеру в weapon.ccp kickback и accuracy срабатывают только для автоматических стволов, но в самой игре у пистолетов тоже есть отдача и разброс при частой стрельбе.
7 Июн 2024
Teodor,
Код:
register_forward(FM_UpdateClientData, "FM_Hook_UpdateClientData_Post", true);
Вопросов не имею, был неправ.
 

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

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