INSTIGATOR Опубликовано 22 февраля, 2019 Жалоба Поделиться Опубликовано 22 февраля, 2019 Всем доброго времени суток! Столкнулся я тут с проблемой касательно 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к никак не получается решить проблему. Ссылка на комментарий Поделиться на другие сайты Поделиться
botka4aet Опубликовано 25 февраля, 2019 Жалоба Поделиться Опубликовано 25 февраля, 2019 short замени на лонг Проверь еще .h файлы status \ battle 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
INSTIGATOR Опубликовано 25 февраля, 2019 Автор Жалоба Поделиться Опубликовано 25 февраля, 2019 5 часов назад, botka4aet сказал: short замени на лонг Проверь еще .h файлы status \ battle Заменил 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
4144 Опубликовано 25 февраля, 2019 Жалоба Поделиться Опубликовано 25 февраля, 2019 если уж уродовать исходники, то зачем unsigned long? Тагда уж int или unsigned int 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
INSTIGATOR Опубликовано 25 февраля, 2019 Автор Жалоба Поделиться Опубликовано 25 февраля, 2019 (изменено) 40 минуты назад, 4144 сказал: если уж уродовать исходники, то зачем unsigned long? Тагда уж int или unsigned int А в чём разница между ними? При unsigned int всё работает, спасибо за ответ! Изменено 25 февраля, 2019 пользователем INSTIGATOR работает Ссылка на комментарий Поделиться на другие сайты Поделиться
4144 Опубликовано 25 февраля, 2019 Жалоба Поделиться Опубликовано 25 февраля, 2019 long это обычно 64 бита, т.е. 8 байт int это обычно 32 бита, т.е. 4 байта unsigned задает что данные беззнаковые 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
INSTIGATOR Опубликовано 25 февраля, 2019 Автор Жалоба Поделиться Опубликовано 25 февраля, 2019 18 минуту назад, 4144 сказал: long это обычно 64 бита, т.е. 8 байт int это обычно 32 бита, т.е. 4 байта unsigned задает что данные беззнаковые Благодарю за пояснение! Ссылка на комментарий Поделиться на другие сайты Поделиться
Black Опубликовано 3 марта, 2019 Жалоба Поделиться Опубликовано 3 марта, 2019 В 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
INSTIGATOR Опубликовано 3 марта, 2019 Автор Жалоба Поделиться Опубликовано 3 марта, 2019 1 час назад, Black сказал: Если поменял то нужно поменть везде эту переменную Да я так и сделал только с unsignet int , видимо я когда проделывал это с unsigned long скорее всего недоглядел мож где и забыл кое-где изменить unsigned short на unsigned long. После всего этого матк в статах крутиться выше 65535. Спасибо всем за помощь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения