Death Gift

Death Gift 2.1.1

Нет прав для скачивания

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
ArKaNeMaN добавил(а) новый ресурс:

DeathGift - Выпадение подарка при смерти

Первый мой плагин на публику... :))

Данный плагин после смерти игрока с определённым шансом создаёт подарочную коробку при соприкосновении с которой игрок получает денежный бонус.

Я посчитал что неподвижно стоящая коробка это слишком просто и не красиво... В общем она летает верх и вниз и крутится. :)

Посмотреть вложение 10642
Узнать больше об этом ресурсе...
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
Есть предложение для ArKaNeMaN

1) за вместо этого:
Код:
static Float:a[3]; pev(ent, pev_angles, a); a[1] += 5.0;
set_pev(ent, pev_angles, a);
set_pev(ent, pev_fixangle, 1);
юзать pev_avelocity . Примеры смотри тут: https://dev-cs.ru/resources/300/
2) Имеется ли необходимость использовать не нативный stock printColorChat ?
3) LANG-файл прибудет с последующей версией?
4) Всё таки наверное const.
Код:
    static Float:fMaxs[3] = { 10.0, 10.0, 30.0 };
    static Float:fMins[3] = { -1.0, -10.0, -30.0 };
5) Для pev_iuser1 лучше сделать макрос с своим и удобным наименованием. Оставлять после себя читабельный код это, ведь хороший тон?
6) Имеется ли смысл делать пути до моделей CVar'ом? Если да, то почему? Я про это:
Код:
pCvars[cModelPath] = register_cvar("awDgModelPath", "models/awDeathGift/gift.mdl");
7) Мне с кастомным расположением amxmodx не получится плагин заюзать?
Код:
static cfgFile[64]; formatex(cfgFile, charsmax(cfgFile), "addons/amxmodx/configs/awDeathGift.cfg");
1534709966164.png
8) Я не понял, а зачем вам в плагине pointer'ы на CVar'ы вообще?
1534710081551.png
9) Кто научил подсовывать файл-конфиг на exec, в котором заранее не валидный синтаксис?
1534711039939.png
1534711255192.png
10) лазить на синке в pev_iuser1 & pev_fuser1 через pev() от fakemeta за такой чепухой - дорогого стоит.

Если увижу желание автора исправлять плагин - подскажу ещё несколько... а пока и этого хватит. :pardon:
 
Последнее редактирование:

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
10) лазить на синке в pev_iuser1 & pev_fuser1 через pev() от fakemeta за такой чепухой - дорогого стоит.
В том плане что есть способ лучше? Или оно того просто не стоит?

6) Имеется ли смысл делать пути до моделей CVar'ом? Если да, то почему?
Вдруг кому-то не понравится та модель которую юзаю я... И вот

Для pev_iuser1 лучше сделать макрос с своим и удобным наименованием
#define pev_giftStartPos pev_fuser1 и #define pev_giftFlyDir pev_iuser1
Ты об этом?

1) за вместо этого:
C++:
static Float:a[3]; pev(ent, pev_angles, a); a[1] += 5.0;
set_pev(ent, pev_angles, a);
set_pev(ent, pev_fixangle, 1);
юзать pev_avelocity . Примеры смотри тут: https://dev-cs.ru/resources/300/
Это критично? Прост вроде не сильно получилось...

А так остальное вроде поправил или ещё поправляю
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
Обновлен ресурс DeathGift новой записью:

Обновлено до 1.1

Спасибо wopox1337 за указание на ошибки
  • Сообщение в чат теперь выводится при помощи родной функции client_print_color
  • Добавлен LANG-файл с поддержкой русского, украинского и английского языков
  • Убраны 'pointer'ы на CVar'ы'
  • Поправлен кфг файл
  • Ну и ещё по мелочи...
Узнать больше об этом обновлении...
 
Последнее редактирование модератором:

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
1534867197311.png
ArKaNeMaN, Конечно можно, лишь бы в пользу. :yes3:
есть способ лучше?
1. Твой способ относительно правильный. Но, хранить в pev entity нужно не всякую чушь, а важную информацию, которая будет доставаться реже, чем в твоём синке. Допустим, если бы ты разрабатывал целое API то, мог бы действительно хранить какие-то важные данные в pev. А тут - инфа и не нужна никакому другому плагину (компоненту).
Пример, когда действительно стоило хранить что-то в pev storage для удобства я видел в Haloween Mod от Hedgehog Fog. Рекомендую к ознакомлению, это один из модов, где я видел использование pev с пользой. Наработок несколько и всех сразу не припомнишь.
Но, главное, по пустякам не дёргать цепочку amxmodx -> fakemeta -> metamod.
Ибо путь не самый лучший учитывая универсальную нативу: https://github.com/alliedmodders/am...a862fa8a97/modules/fakemeta/pev.cpp#L160-L343
Некоторые данные, можно не стесняясь хранить в массиве, однако подходит такой метод не везде. По обстановке так сказать.

2. #include <file> - какой практический толк от этого? Учитывая это: https://github.com/alliedmodders/amxmodx/blob/master/plugins/include/amxmodx.inc#L19

3. Какой замысел использования static типа переменной в локальной функции здесь?
Код:
static cfgPath[128]; get_localinfo("amxx_configsdir", cfgPath, charsmax(cfgPath));
static cfgFile[128]; formatex(cfgFile, charsmax(cfgFile), "%s/awDeathGift.cfg", cfgPath);
4. Ты немного не верно понял мой посыл с кварами и их поинтерами.
Я не понял, а зачем вам в плагине pointer'ы на CVar'ы вообще?
ArKaNeMaN написал(а):
Убраны 'pointer'ы на CVar'ы'
Имелось ввиду: зачем тебе поинтеры, если ты их не используешь? Пользуйся ими без опаски - это полезно.
Ты создал CVar'ы и снял их значения на старте карты. Без возможности изменения. Получается главное преимущество CVar'а загубил.

CVar - Console Variable. Консольная переменная. То есть, мы можем её менять и она будет учитываться в дальнейшем использовании. Во всём движке и игре есть множество кваров, которые именно для этого и задуманы. 90% CVar'ов ты можешь спокойно менять "на лету".

В твоей же реализации: ты сделал константы, которые юзеры зачем то указывают в конфиге, а должны указывать в исходном файле перед компиляцией. (Да, не нужно производить плагины для глупого контингента, к хорошему не приведёт.).
К конкретике: Сделай CVar'ы только для необходимых настроек, которые нужно будет менять на протяжении игры, или же от карты к карте с помощью AMXX. К примеру, захочет человек на время повысить шанс выпадения подарка.

Квары, достойные "горячей" смены:
  • awDgDropRarity
  • awDgTimeout (наверное, AwDgLifeTime ?!)
  • awDgMoneyMin
  • awDgMoneyMax
Не понятно, зачем вообще являются кварами:
  • awDgModelPath (есть вероятность, конечно, что пригодится от карты к карте менять модель подарка... но... вряд ли)
  • awDgChatPrefix - в каком случае понадобится его менять вообще после компиляции?
и там где это необходимо - не бойся использовать get_pcvar_* (получать значение квара по поинтеру. Оно ничего не стоит для вирт.машины.
А, ещё лучше - откажись от поддержки старого AMXX 1.8.2 в пользу нового AMXX 1.8.3 и его новых функций, которые позволят тебе всегда держать в переменных актуальные данные из CVar'a. Ибо там появились нормальные хуки кваров.
create_cvar, bind_pcvar_*, в этой реализации можно заранее указать clamp (ограничение диапазона), описание квара, а так же автоматическое развёртывание в конфиг значений средствами AMXX. (AutoExecConfig(true)). Пример реализации смотри тут: https://dev-cs.ru/resources/296/

Сам Arkshine говорил, что несколько расстроен тем, что AMXX 1.8.3 не используют активно (и не дают репортов и предложений), хотя те, кто разрабатывают его стараются обновлять не ломая совместимостей. Так помогайте же развивать AMXX 1.8.3 пересаживая пользователей с их глупыми догадками на стабильный AMXX 1.8.3. Это отдельная тема для разговора, заслуживающая времени.

5. Используй константы, делай читабельнее код, чтобы другим не было противно копаться в нём.
https://github.com/alliedmodders/amxmodx/blob/master/plugins/include/file.inc#L27-L30

Код:
#include <amxmodx>

public plugin_init()
{
    // 128 ?! почему именно 128? Почему static ?
    static cfgPath[128]; get_localinfo("amxx_configsdir", cfgPath, charsmax(cfgPath));
    static cfgFile[128]; formatex(cfgFile, charsmax(cfgFile), "%s/awDeathGift.cfg", cfgPath);


    // Могло бы быть так
    new cfgFilePath[PLATFORM_MAX_PATH]; // Общепринятая константа.
    new const fileName[64] = "/awDeathGift.cfg";
    get_localinfo("amxx_configsdir", cfgFilePath, charsmax(cfgFilePath));
    // Так тоже удобно, хоть и не самый удачный пример конкатенации.
    add(cfgFilePath, charsmax(cfgFilePath), fileName);

    server_print("cfgFile =^t '%s'", cfgFile);
    server_print("cfgFilePath =^t '%s'", cfgFilePath);

    // Результат одинаков.
/*
    cfgFile =        'addons/amxmodx/configs/awDeathGift.cfg'
    cfgFilePath =    'addons/amxmodx/configs/awDeathGift.cfg'
*/
}
Если увижу желание автора исправлять плагин - подскажу ещё несколько... а пока и этого хватит. :pardon:
 
Последнее редактирование:
Сообщения
90
Реакции
126
Помог
3 раз(а)
wopox1337, В первом пункте написан полный бред, pev нужно использовать тогда, когда требуется хранить что-то привязанное к конкретной ентити и как раз в think очень часто требуется получать доступ к pev и это нормально, а написанное - это какае-то мания оптимизаций и так нормально работающего и не как не нагружающего процессор кода
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
wopox1337, сколько там ещё таких пачек недочётов? :DD

Завтра как будет время постараюсь все это поправить...
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
Кстати... На счёт хранения инфы в ентити... Если это все переводить на массивы... То только если Trie... Так ведь?
21 Авг 2018
А, сам как думаешь? если код внимательнее смотреть, а если ещё и поиграть...
Я конечно знал что в моем коде много косяков... Но не думал что столько много xD
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
Если это все переводить на массивы..
Не, нет тут нужды в массивах.

Я предполагал, чтобы ты уменьшил количество вызовов Think.

Посмотри внимательно реализацию в плагине, что я кидал выше с оружием. Как там часто вызывается синк.
21 Авг 2018
Я конечно знал что в моем коде много косяков... Но не думал что столько много xD
Идеального кода не существует :dntknw:
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
Посмотри внимательно реализацию в плагине, что я кидал выше с оружием. Как там часто вызывается синк.
Чекнул... Но что тогда с анимацией подарка будет? Даже если юзать способ вращения из того же плагина (Хотя у меня чёт не получилось)... Все ровно остаётся полет подарка вверх и вниз
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
wopox1337, на этот раз попытался просто точь в точь всё перенести с этого плагина... Но всё ровно не крутиться...
C++:
public giftCreate(id){
    server_print("[%s v%s] [Debug] [giftCreate] [%n]", PLUG_NAME, PLUG_VER, id);
    static ret; ExecuteForward(pFwds[fCreatePre], ret);
    if(ret == AW_DG_CONT){
        server_print("[%s v%s] [Debug] [giftCreate] [%n] [Fwd]", PLUG_NAME, PLUG_VER, id);
        static a;
        if(!a) a = engfunc(EngFunc_AllocString, "info_target");
        static ent; ent = engfunc(EngFunc_CreateNamedEntity, a);
        if(pev_valid(ent)){
            server_print("[%s v%s] [Debug] [giftCreate] [%n] [Fwd] [Create] [%d]", PLUG_NAME, PLUG_VER, id, ent);
            set_pev(ent, pev_classname, "gift");
            
            static Float:f[3]; pev(id, pev_origin, f); f[2] -= 30.0;
            set_pev(ent, pev_origin, f);
            
            engfunc(EngFunc_SetModel, ent, MODEL_PATH);
            
            set_pev(ent, pev_giftStartPos, f[2]);
            set_pev(ent, pev_giftFlyDir, 1);
            
            set_pev(ent, pev_scale, 50);
            
            static Float:vecAngles[coord_e], Float:vecAvelocity[coord_e];
            
            vecAngles[Y] += random_float(-180.0, 180.0);
            set_pev(ent, pev_angles, vecAngles);
            
            vecAvelocity[Z] = 10.0 * 10.0;
            set_pev(ent, pev_avelocity, vecAvelocity);

            set_pev(ent, pev_maxspeed, FLY_AMP);
            
            //set_pev(ent, pev_nextthink, get_gametime()+0.1);
            set_pev(ent, pev_nextthink, get_gametime()+2.0);
            
            dllfunc(DLLFunc_Spawn,ent);
            
            set_pev(ent, pev_solid, SOLID_TRIGGER);
            engfunc(EngFunc_SetSize, ent, fMins, fMaxs);
            
            if(giftLifeTime) set_task(float(giftLifeTime), "giftDelete", ent);
            
            ExecuteForward(pFwds[fCreatePost], ret, ent);
            server_print("[%s v%s] [Debug] [giftCreate] [%n] [Fwd] [Created] [%d]", PLUG_NAME, PLUG_VER, id, ent);
        }
    }
}

public giftThink(ent){
    if(!pev_valid(ent)) return FMRES_IGNORED;
    
    /* static Float:o[3]; pev(ent, pev_origin, o);
    static Float:entStartY; pev(ent, pev_giftStartPos, entStartY);
    static dir; pev(ent, pev_giftFlyDir, dir);
    static Float:a[3]; pev(ent, pev_angles, a); a[1] += 5.0;
    
    if(dir) o[2] += 1.0;
    else o[2] -= 1.0;
    
    set_pev(ent, pev_origin, o);
    
    if(o[2] > entStartY + FLY_AMP) set_pev(ent, pev_iuser1, 0);
    else if(o[2] < entStartY - FLY_AMP) set_pev(ent, pev_iuser1, 1);
    
    set_pev(ent, pev_angles, a);
    set_pev(ent, pev_fixangle, 1); */
    
    static Float:vecVelocity[coord_e], Float:fFlyUp;
    
    pev(ent, pev_maxspeed, fFlyUp);
    
    vecVelocity[Z] = fFlyUp;

    set_pev(ent, pev_velocity, vecVelocity);
    set_pev(ent, pev_maxspeed, -fFlyUp);
    
    //set_pev(ent, pev_nextthink, get_gametime()+0.1);
    set_pev(ent, pev_nextthink, get_gametime()+2.0);
    
    dllfunc(DLLFunc_Spawn,ent);
    set_pev(ent, pev_solid, SOLID_TRIGGER);
    engfunc(EngFunc_SetSize,ent,fMins,fMaxs);
    
    return FMRES_IGNORED;
}
22 Авг 2018
А.. Всё... Надо было поставить set_pev(ent, pev_movetype, MOVETYPE_NOCLIP);
22 Авг 2018
Отлично... Полёт вверх и вниз тоже получилось сделать
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
Обновлен ресурс DeathGift новой записью:

Обновлено до 1.2

И снова спасибо wopox1337 за указания на ошибки...

Изменения:
  • Квары теперь изменяются 'на ходу'
  • Частота вызова think для ентити уменьшена в 10 раз
  • Анимация вращения и левитации стала более плавной
  • Некоторые настройки перенесены в исходник
  • Плагин больше не совместим с AmxModX 1.8.2
  • Добавлен натив awDgSendGiftMsg. Подробнее в инклюде или разделе API
Узнать больше об этом обновлении...
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
В первом пункте написан полный бред
  • Частота вызова think для ентити уменьшена в 10 раз.
А может и не бред, особенно, если сделать большую амплитуду движения entity по flyUp то и в 20 раз
23 Авг 2018
Не думаешь разнообразить подарки? Могу подсказать реализацию, но это получится "система".

ArKaNeMaN
 

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
wopox1337, В плане моделек? Или содержания подарка?

НА счёт содержания я хотел написать отдельный плагин в котором будет больше всего... В основной плагин я добавил деньги что бы было хоть что-то...
24 Авг 2018
Кстати... Раз уж речь зашла об этом...
Что можно добавить в подарок?
Все что придумал:
  • Деньги
  • Хп
  • Броня
  • Гранаты

Иии ещё... Как попасть в раздел "Релизы"? :))
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
Как попасть в раздел "Релизы"? :))
Код дотягивает до релиза - переносят в релизы. Просто писать нужно с пониманием того, что пишешь и как пишешь. Проще говоря, как поправишь грубые ошибки.

1. Посмотри что ты возвращаешь в функциях.
Зарегистрировал значит хук на тач с помощью модуля Engine:
Код:
register_touch("gift", "player", "giftTouch");
в функции выполнил возврат ответа для Fakemeta...
Код:
 giftThink(ent){
    if(!pev_valid(ent)) return FMRES_IGNORED
Почему возврат код от fakemeta? Они немножко отличаются. Тем более, зачем там вообще указывать какой-то конкретный reutrn тип?

2. Если уж и решил делать проверку на валидность entity и подходит ли она тебе то, делай это правильно. (Да, с info_target тебе конечно не прилетит entity без pev, но так проверка выглядит корректней.)

3. Если и делаешь в прекеше остановку - то регай плагин там же. Иначе:
1535081732428.png
а, должно быть хотя бы так:
1535081814747.png

а ещё лучше, если ты будешь работать своим плагином в системе AMXX не мешая ей выполнять свои задачи:
1535082165936.png
Как?! set_fail_state . Используй AMXX API по назначению правильно.
 
Последнее редактирование:

ArKaNeMaN

Квалифицированный специалист по VipModular
Сообщения
392
Реакции
283
Помог
3 раз(а)
2. Если уж и решил делать проверку на валидность entity и подходит ли она тебе то, делай это правильно. (Да, с info_target тебе конечно не прилетит entity без pev, но так проверка выглядит корректней.)
НЕ совсем дошло... Тип так? if(pev_valid(ent) == 1)

а ещё лучше, если ты будешь работать своим плагином в системе AMXX не мешая ей выполнять свои задачи
Как?! set_fail_state . Используй AMXX API по назначению правильно.
О... Спасибо... А то я не мог найти эту функцию XD...
 
Сообщения
2,720
Реакции
2,997
Помог
60 раз(а)
НЕ совсем дошло...
делать проверку на валидность entity и подходит ли она тебе то, делай это правильно.
ты проверяешь объект на валидность, но не совсем корректно.
Перед тем как лазить в pev_* у ентити (Private Entity Variable) нужно проверить существует ли вообще pev область для неё.

делается это таким макаром:
Код:
func(ent)
{
// Prevent server crash if entity's private data not initalized
    const PDATA_SAFE = 2;
    if(pev_valid(ent) != PDATA_SAFE)
        return;
    
    ...
}
 

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

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