INSTIGATOR

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

9 сообщений в этой теме

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

Столкнулся я тут с проблемой касательно 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к никак не получается решить проблему.

0

Поделиться сообщением


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

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

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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    
 

0

Поделиться сообщением


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

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
40 минуты назад, 4144 сказал:

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

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

 

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

Изменено пользователем INSTIGATOR
работает
0

Поделиться сообщением


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

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
18 минуту назад, 4144 сказал:

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 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    
 

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Black сказал:

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

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

0

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас