Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 19 из 19
  1. #11
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Надёжно, но тогда если где-нибудь сверить хп в переменной и только что узнанное хп, то они не будут совпадать даже будучи реально равными. Если такая проверка где-то будет, то вот пример, как сделать чтобы она работала корректно:
    Код:
    //Где-нибудь
    SetPlayerHealth(playerid, 10000);
    pInfo[playerid][pHealth] = 10000;
    Код:
    new Float:hp;
    GetPlayerHealth(playerid, hp);
    while(pInfo[playerid][pHealth] > hp + 255) hp += 256;
    //нужные нам проверки
    //(теперь переменная с новым хп "hp" будет с правильным значением)
    
    //Ну и если это какой-нибудь таймер и нам нужно обновить старое хп, просто делаем следующее
    pInfo[playerid][pHealth] = floatround(hp, floatround_tozero);
    Таким образом если хп в статистике будет больше 255, то новое хп будет "подгонять" под правильное значение.
    Возможно есть побочные эффекты, вроде если резко игрок умрёт и новое хп изменится на реальный 0, тогда возможно система будет всё также думать, что хп у игрока за 255, тем самым будет выдавать неправильное значение. Наверное всё-же своя система урона или что-то вроде этого - это лучший вариант.
    Спасибо. Но почему-то не всегда точно выдает. В базе я ставлю одно значение. А выводит на сотню с чем то больше, иногда меньше ста.
    PHP код:
    БД6463
    Лог сервера
    66566656 
    И правильно ли это сделал?
    PHP код:
    stock nh_GetPlayerHealth(playerid, &Float:health)
    {
        while(
    pInfo[playerid][pHealth] > health 255health += 256;
        return 
    1;
    }
    #if    defined    _ALS_GetPlayerHealth
        #undef    GetPlayerHealth
    #else
        #define    _ALS_GetPlayerHealth
    #endif
    #define GetPlayerHealth nh_GetPlayerHealth 
    Система урона есть
    Последний раз редактировалось m1n1vv; 03.07.2016 в 16:26.

  2. #12
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    PHP код:
    stock nh_GetPlayerHealth(playerid, &Float:health)
    {
        while(
    pInfo[playerid][pHealth] > health 255health += 256;
        return 
    1;
    }
    #if    defined    _ALS_GetPlayerHealth
        #undef    GetPlayerHealth
    #else
        #define    _ALS_GetPlayerHealth
    #endif
    #define GetPlayerHealth nh_GetPlayerHealth 
    Система урона есть
    Наверное ошибка

    PHP код:
    stock nh_GetPlayerHealth(playerid, &Float:health)
    {
        if(!
    IsPlayerConnected(playerid)) return 0;
        
    GetPlayerHealth(playeridhealth); //<-
        
    while(pInfo[playerid][pHealth] > health 255health += 256;
        return 
    1;
    }
    #if    defined    _ALS_GetPlayerHealth
        #undef    GetPlayerHealth
    #else
        #define    _ALS_GetPlayerHealth
    #endif
    #define GetPlayerHealth nh_GetPlayerHealth 
    Хотя если задумано именно подменять хп на серверное, то тогда можно просто возвращать pHealth, оно ведь и так имеет "правильное" значение с хп

    P.s. Проверил, число 6656 вместо 6463 из-за того, что к нулю (&health скорее всего будет с таким значением) прибавляется несколько раз 256 (6656 это 256 * 26)
    Последний раз редактировалось Nexius_Tailer; 03.07.2016 в 17:20.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  3. #13
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    С хп меньше 500 все время выдает 256

  4. #14
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Вы совсем не то делаете.

    В общем, вот скрипт:
    PHP код:
    /*
        About: custom health system
        Author: ziggi
    */

    /*
        Defines
    */

    #define MAX_PLAYER_HEALTH 1000.0

    /*
        Vars
    */

    static
        
    Float:gPlayerHealth[MAX_PLAYERS];

    /*
        SetPlayerHealth(playerid, Float:health)
    */

    stock CustomHealth_SetPlayerHealth(playeridFloat:health)
    {
        if (!
    IsPlayerConnected(playerid)) {
            return 
    0;
        }

        if (
    health MAX_PLAYER_HEALTH) {
            
    health MAX_PLAYER_HEALTH;
        } else if (
    health 0.0) {
            
    health 0.0;
        }

        
    gPlayerHealth[playerid] = health;
        return 
    SetPlayerHealth(playeridhealth MAX_PLAYER_HEALTH 100.0);
    }
    #if defined _ALS_SetPlayerHealth
        #undef SetPlayerHealth
    #else
        #define _ALS_SetPlayerHealth
    #endif

    #define SetPlayerHealth CustomHealth_SetPlayerHealth


    /*
        GetPlayerHealth(playerid, &Float:health)
    */

    stock CustomHealth_GetPlayerHealth(playerid, &Float:health)
    {
        if (!
    IsPlayerConnected(playerid)) {
            return 
    0;
        }

        
    health gPlayerHealth[playerid];
        return 
    1;
    }
    #if defined _ALS_GetPlayerHealth
        #undef GetPlayerHealth
    #else
        #define _ALS_GetPlayerHealth
    #endif

    #define GetPlayerHealth CustomHealth_GetPlayerHealth

    /*
        OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
    */

    public OnPlayerTakeDamage(playeridissueridFloat:amountweaponidbodypart)
    {
        if (
    issuerid == INVALID_PLAYER_ID) {
            
    SetPlayerHealth(damagedidgPlayerHealth[playerid] - amount);
        }

        
    #if defined CustomHealth_OnPlayerTakeDamage
            
    return CustomHealth_OnPlayerTakeDamage(playeridissueridamountweaponidbodypart);
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnPlayerTakeDamage
        #undef OnPlayerTakeDamage
    #else
        #define _ALS_OnPlayerTakeDamage
    #endif

    #define OnPlayerTakeDamage CustomHealth_OnPlayerTakeDamage
    #if defined CustomHealth_OnPlayerTakeDamage
        
    forward CustomHealth_OnPlayerTakeDamage(playeridissueridFloat:amountweaponidbodypart);
    #endif

    /*
        OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
    */

    public OnPlayerGiveDamage(playeriddamagedidFloat:amountweaponidbodypart)
    {
        if (
    damagedid != INVALID_PLAYER_ID) {
            new
                
    Float:armour,
                
    Float:difference;

            
    GetPlayerArmour(damagedidarmour);

            
    difference armour amount;

            if (
    difference 0.0) {
                
    SetPlayerArmour(damagediddifference);
            } else {
                
    SetPlayerArmour(damagedid0.0);
                
    SetPlayerHealth(damagedidgPlayerHealth[playerid] + difference);
            }
        }

        
    #if defined CustomHealth_OnPlayerGiveDamage
            
    return CustomHealth_OnPlayerGiveDamage(playeriddamagedidamountweaponidbodypart);
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnPlayerGiveDamage
        #undef OnPlayerGiveDamage
    #else
        #define _ALS_OnPlayerGiveDamage
    #endif

    #define OnPlayerGiveDamage CustomHealth_OnPlayerGiveDamage
    #if defined CustomHealth_OnPlayerGiveDamage
        
    forward CustomHealth_OnPlayerGiveDamage(playeriddamagedidFloat:amountweaponidbodypart);
    #endif

    /*
        OnPlayerSpawn(playerid)
    */

    public OnPlayerSpawn(playerid)
    {
        
    SetPlayerTeam(playerid0);

        
    #if defined CustomHealth_OnPlayerSpawn
            
    return CustomHealth_OnPlayerSpawn(playerid);
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnPlayerSpawn
        #undef OnPlayerSpawn
    #else
        #define _ALS_OnPlayerSpawn
    #endif

    #define OnPlayerSpawn CustomHealth_OnPlayerSpawn
    #if defined CustomHealth_OnPlayerSpawn
        
    forward CustomHealth_OnPlayerSpawn(playerid);
    #endif 
    Но в идеале нужно ещё реализовать собственную team систему.

    P.S. Код не тестировал и не компилировал.

  5. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (03.07.2016) DeimoS (03.07.2016)
  6. #15
    Аватар для m1n1vv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Сообщений
    541
    Репутация:
    78 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Вы совсем не то делаете.

    В общем, вот скрипт:
    PHP код:
    /*
        About: custom health system
        Author: ziggi
    */

    /*
        Defines
    */

    #define MAX_PLAYER_HEALTH 1000.0

    /*
        Vars
    */

    static
        
    Float:gPlayerHealth[MAX_PLAYERS];

    /*
        SetPlayerHealth(playerid, Float:health)
    */

    stock CustomHealth_SetPlayerHealth(playeridFloat:health)
    {
        if (!
    IsPlayerConnected(playerid)) {
            return 
    0;
        }

        if (
    health MAX_PLAYER_HEALTH) {
            
    health MAX_PLAYER_HEALTH;
        } else if (
    health 0.0) {
            
    health 0.0;
        }

        
    gPlayerHealth[playerid] = health;
        return 
    SetPlayerHealth(playeridhealth MAX_PLAYER_HEALTH 100.0);
    }
    #if defined _ALS_SetPlayerHealth
        #undef SetPlayerHealth
    #else
        #define _ALS_SetPlayerHealth
    #endif

    #define SetPlayerHealth CustomHealth_SetPlayerHealth


    /*
        GetPlayerHealth(playerid, &Float:health)
    */

    stock CustomHealth_GetPlayerHealth(playerid, &Float:health)
    {
        if (!
    IsPlayerConnected(playerid)) {
            return 
    0;
        }

        
    health gPlayerHealth[playerid];
        return 
    1;
    }
    #if defined _ALS_GetPlayerHealth
        #undef GetPlayerHealth
    #else
        #define _ALS_GetPlayerHealth
    #endif

    #define GetPlayerHealth CustomHealth_GetPlayerHealth

    /*
        OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid, bodypart)
    */

    public OnPlayerTakeDamage(playeridissueridFloat:amountweaponidbodypart)
    {
        if (
    issuerid == INVALID_PLAYER_ID) {
            
    SetPlayerHealth(damagedidgPlayerHealth[playerid] - amount);
        }

        
    #if defined CustomHealth_OnPlayerTakeDamage
            
    return CustomHealth_OnPlayerTakeDamage(playeridissueridamountweaponidbodypart);
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnPlayerTakeDamage
        #undef OnPlayerTakeDamage
    #else
        #define _ALS_OnPlayerTakeDamage
    #endif

    #define OnPlayerTakeDamage CustomHealth_OnPlayerTakeDamage
    #if defined CustomHealth_OnPlayerTakeDamage
        
    forward CustomHealth_OnPlayerTakeDamage(playeridissueridFloat:amountweaponidbodypart);
    #endif

    /*
        OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
    */

    public OnPlayerGiveDamage(playeriddamagedidFloat:amountweaponidbodypart)
    {
        if (
    damagedid != INVALID_PLAYER_ID) {
            new
                
    Float:armour,
                
    Float:difference;

            
    GetPlayerArmour(damagedidarmour);

            
    difference armour amount;

            if (
    difference 0.0) {
                
    SetPlayerArmour(damagediddifference);
            } else {
                
    SetPlayerArmour(damagedid0.0);
                
    SetPlayerHealth(damagedidgPlayerHealth[playerid] + difference);
            }
        }

        
    #if defined CustomHealth_OnPlayerGiveDamage
            
    return CustomHealth_OnPlayerGiveDamage(playeriddamagedidamountweaponidbodypart);
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnPlayerGiveDamage
        #undef OnPlayerGiveDamage
    #else
        #define _ALS_OnPlayerGiveDamage
    #endif

    #define OnPlayerGiveDamage CustomHealth_OnPlayerGiveDamage
    #if defined CustomHealth_OnPlayerGiveDamage
        
    forward CustomHealth_OnPlayerGiveDamage(playeriddamagedidFloat:amountweaponidbodypart);
    #endif

    /*
        OnPlayerSpawn(playerid)
    */

    public OnPlayerSpawn(playerid)
    {
        
    SetPlayerTeam(playerid0);

        
    #if defined CustomHealth_OnPlayerSpawn
            
    return CustomHealth_OnPlayerSpawn(playerid);
        
    #else
            
    return 1;
        
    #endif
    }
    #if defined _ALS_OnPlayerSpawn
        #undef OnPlayerSpawn
    #else
        #define _ALS_OnPlayerSpawn
    #endif

    #define OnPlayerSpawn CustomHealth_OnPlayerSpawn
    #if defined CustomHealth_OnPlayerSpawn
        
    forward CustomHealth_OnPlayerSpawn(playerid);
    #endif 
    Но в идеале нужно ещё реализовать собственную team систему.

    P.S. Код не тестировал и не компилировал.
    Если что. Я это делаю для DM

  7. #16
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от m1n1vv Посмотреть сообщение
    Если что. Я это делаю для DM
    И что? Это для всего подходит.

  8. #17
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    В общем, вот скрипт:
    Такая система дамага ненадёжная и лучше её не ставить. Ещё пару лет назад везде писали, что реализовав систему урона в OnPlayerGiveDamage читеры могут массово убивать игроков (фейково вызывая OnPlayerGiveDamage). Также даже без читов это имеет такой недостаток из-за пинга, как незасчитывание убийства одного игрока другим (killerid в OnPlayerDeath в итоге может быть невалидным).

    Если уж и делать наподобие такого, то через OnPlayerWeaponShot.
    Последний раз редактировалось Nexius_Tailer; 03.07.2016 в 20:34.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  9. #18
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Такая система дамага ненадёжная и лучше её не ставить. Ещё пару лет назад везде писали, что реализовав систему урона в OnPlayerGiveDamage читеры могут массово убивать игроков (фейково вызывая OnPlayerGiveDamage). Также даже без читов это имеет такой недостаток из-за пинга, как незасчитывание убийства одного игрока другим (killerid в OnPlayerDeath в итоге может быть невалидным).

    Если уж и делать наподобие такого, то через OnPlayerWeaponShot.
    Да, такое возможно. Но фейково можно и OnPlayerWeaponShot вызывать, от этого никуда не деться. В идеале, конечно, нужно связать данные из OnPlayerGiveDamage и OnPlayerTakeDamage. Но если делать всё совсем идеально, то нужно полностью менять систему здоровья, урона и смерти игроков, к счастью, это уже реализовано в weapon-config.inc.

  10. #19
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Да, такое возможно. Но фейково можно и OnPlayerWeaponShot вызывать, от этого никуда не деться. В идеале, конечно, нужно связать данные из OnPlayerGiveDamage и OnPlayerTakeDamage. Но если делать всё совсем идеально, то нужно полностью менять систему здоровья, урона и смерти игроков, к счастью, это уже реализовано в weapon-config.inc.
    Кстати, как раз хотел ссылку на него кинуть. Если это то что нужно автору темы - это лучший вариант.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

 

 
Страница 2 из 2 ПерваяПервая 1 2

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •