Перейти к содержанию

MATK больше чем 65к


INSTIGATOR

Рекомендуемые сообщения

Всем доброго времени суток! 

Столкнулся я тут с проблемой касательно 1к лвлов (само собой я понимаю что 1000 уровни это бред ещё тот , но всё же) , а именно с тем что при статах больше 1к (интеллекта) либо при прописанной в итем дб кастом шмотке которая увеличивает МАТК в процентах происходит следующее - в статах доходя до отметки в 65к , матк начинает как бы сбрасываться до меньших значений. Решил я полазить по форуму rathena , увидел пару топиков на этот счёт , но решения практически нету. Далее я стал лезть в сорцы и заметил что в status.c  в строке которая как я понимаю отвечает за прирост min_matk и max_matk в статусе -> 

unsigned short status_base_matk_min(const struct status_data* status) { return status->int_ + (status->int_ / 7) * (status->int_ / 7); }     

unsigned short status_base_matk_max(const struct status_data* status) { return status->int_ + (status->int_ / 5) * (status->int_ / 5); }

присутствует unsigned short и на сколько я понимаю максимальное значение этого типа возможно только от 0 до 65535.  Как решить эту проблему? Потому что как я вижу помимо status.c ещё и в battle.c надо копать?

 

К слову на сколько я помню в eathena была такая проблема с переполнением урона азуры при огромных статах , так вот на rathena такого я не вижу например азура не миссает и проходит весь урон даже при наличии огромного кол-ва кастом шмоток с бешеными статами. А вот с MATK выше 65к никак не получается решить проблему.

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, botka4aet сказал:

short замени на лонг

Проверь еще .h файлы  statusbattle

Заменил unsigned short на unsigned long в status.c и в status.h , но в battle.c и battle.h вообще не вижу где он есть хоть убей. 

static unsigned short status_calc_ematk(struct block_list *bl, struct status_change *sc, int matk)
{
    if (!sc || !sc->count)
        return cap_value(matk,0,USHRT_MAX);

 Вот это заменил на:

 

static unsigned long status_calc_ematk(struct block_list *bl, struct status_change *sc, int matk)
{
    if (!sc || !sc->count)
        return cap_value(matk,0,ULONG_MAX); везде где было связано с магией. 

Начал компилить и компилятор выдаёт мне вот такую ересь. 

Серьезность    Код    Описание    Проект    Файл    Строка    Состояние подавления
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    2596    
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    2597    
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    5037    
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    5038    
Ошибка    C2556    unsigned long status_calc_matk(block_list *,status_change *,int): перегруженная функция отличается от "unsigned short status_calc_matk(block_list *,status_change *,int)" только возвращаемым типом    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    6066    
Ошибка    C2371    status_calc_matk: переопределение; различные базовые типы    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    6065    
 

Ссылка на комментарий
Поделиться на другие сайты

40 минуты назад, 4144 сказал:

если уж уродовать исходники, то зачем unsigned long? Тагда уж int или unsigned int

А в чём разница между ними?

 

При unsigned int всё работает, спасибо за ответ!

Изменено пользователем INSTIGATOR
работает
Ссылка на комментарий
Поделиться на другие сайты

18 минуту назад, 4144 сказал:

long это обычно 64 бита, т.е. 8 байт
int это обычно 32 бита, т.е. 4 байта
unsigned задает что данные беззнаковые

Благодарю за пояснение!

Ссылка на комментарий
Поделиться на другие сайты

В 2/25/2019в3:11 PM, INSTIGATOR сказал:

Заменил unsigned short на unsigned long в status.c и в status.h , но в battle.c и battle.h вообще не вижу где он есть хоть убей. 

static unsigned short status_calc_ematk(struct block_list *bl, struct status_change *sc, int matk)
{
    if (!sc || !sc->count)
        return cap_value(matk,0,USHRT_MAX);

 Вот это заменил на:

 

static unsigned long status_calc_ematk(struct block_list *bl, struct status_change *sc, int matk)
{
    if (!sc || !sc->count)
        return cap_value(matk,0,ULONG_MAX); везде где было связано с магией. 

Начал компилить и компилятор выдаёт мне вот такую ересь. 

Серьезность    Код    Описание    Проект    Файл    Строка    Состояние подавления
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    2596    
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    2597    
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    5037    
Предупреждение    C4244    =: преобразование "unsigned long" в "unsigned short", возможна потеря данных    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    5038    
Ошибка    C2556    unsigned long status_calc_matk(block_list *,status_change *,int): перегруженная функция отличается от "unsigned short status_calc_matk(block_list *,status_change *,int)" только возвращаемым типом    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    6066    
Ошибка    C2371    status_calc_matk: переопределение; различные базовые типы    map-server    c:\rathenacustom\rathena\rathena\src\map\status.cpp    6065    
 

Если поменял то нужно поменть везде эту переменную

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Black сказал:

Если поменял то нужно поменть везде эту переменную

Да я так и сделал только с unsignet int , видимо я когда проделывал это с unsigned long скорее всего недоглядел мож где и забыл кое-где изменить unsigned short на unsigned long. После всего этого матк в статах крутиться выше 65535. Спасибо всем за помощь.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика