Модератор форума: Dimitro |
Форум TrinityCore [TrinityCore] Help Даётся exp за серых мобов (С++) |
Даётся exp за серых мобов |
Привет всем
Обнаружилась проблема Даётся exp за серых мобов вплоть до разницы в 12 левелов (может и больше не проверял дальше) Не могу нкиак найти где это исправляется Есть код (походу это тут - но хз что именно надо поправить): Код inline uint32 BaseGain(uint32 pl_level, uint32 mob_level, ContentLevels content) { const uint32 nBaseExp = content == CONTENT_1_60 ? 45 : 235; if (mob_level >= pl_level) { uint32 nLevelDiff = mob_level - pl_level; if (nLevelDiff > 4) nLevelDiff = 4; return ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2; } else { uint32 gray_level = GetGrayLevel(pl_level); if (mob_level > gray_level) { uint32 ZD = GetZeroDifference(pl_level); return (pl_level * 5 + nBaseExp) * (ZD + mob_level - pl_level) / ZD; } return 0; } }
Если помог, ставь плюсик в репу :)
Сообщение # 1 написано 17.02.2017 в 11:33
|
сравнивал с Мангосом и Тринити - везде одинаково
GetGrayLevel отвечает за переход моба в серый статус - и это отрабатывает а вот начисление экспы не прекращается
Если помог, ставь плюсик в репу :)
|
Без тел GetGrayLevel и GetZeroDifference сказать ничего определенного нельзя.
Бтв, это Код uint32 nLevelDiff = mob_level - pl_level; if (nLevelDiff > 4) nLevelDiff = 4; return ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2; можно ужать до этого: Код return ((pl_level * 5 + nBaseExp) * (20 + ::std::min(mob_level - pl_level, 4)) / 10 + 1) / 2; |
Тут либо кривая GetGrayLevel, либо не в этом коде ошибка. И еще почему-то уверен, что метод для выставление цвета иконки не тот, который здесь используется, поэтому ты видишь, что моб серый, а эксп капает.
Код inline uint32 BaseGain(uint32 pl_level, uint32 mob_level, ContentLevels content) { const uint32 nBaseExp = content == CONTENT_1_60 ? 45 : 235; if (mob_level >= pl_level) { uint32 nLevelDiff = mob_level - pl_level; if (nLevelDiff > 4) nLevelDiff = 4; return ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2; } else { uint32 gray_level = GetGrayLevel(pl_level); if (mob_level > gray_level) { uint32 ZD = GetZeroDifference(pl_level); return 2000000000000000; } return 0; } } |
Вот код всего раздела получения экспы и перевода мобов в разные цвета (вопрос не про достьижение макс левела а как раз наоборот - мне игроки сообщили что на 58 левеле даётся экспа за мобов которые серые - тоесть на 9 и более левелов ниже игрока):
Код inline uint32 GetGrayLevel(uint32 pl_level) { if (pl_level <= 5) return 0; else if (pl_level <= 39) return pl_level - 5 - pl_level / 10; else if (pl_level <= 59) return pl_level - 1 - pl_level / 5; else return pl_level - 9; } inline XPColorChar GetColorCode(uint32 pl_level, uint32 mob_level) { if (mob_level >= pl_level + 5) return RED; else if (mob_level >= pl_level + 3) return ORANGE; else if (mob_level >= pl_level - 2) return YELLOW; else if (mob_level > GetGrayLevel(pl_level)) return GREEN; else return GRAY; } inline uint32 GetZeroDifference(uint32 pl_level) { if (pl_level < 8) return 5; if (pl_level < 10) return 6; if (pl_level < 12) return 7; if (pl_level < 16) return 8; if (pl_level < 20) return 9; if (pl_level < 30) return 11; if (pl_level < 40) return 12; if (pl_level < 45) return 13; if (pl_level < 50) return 14; if (pl_level < 55) return 15; if (pl_level < 60) return 16; return 17; } inline uint32 BaseGain(uint32 pl_level, uint32 mob_level, ContentLevels content) { const uint32 nBaseExp = content == CONTENT_1_60 ? 45 : 235; if (mob_level >= pl_level) { uint32 nLevelDiff = mob_level - pl_level; if (nLevelDiff > 4) nLevelDiff = 4; return ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2; } else { uint32 gray_level = GetGrayLevel(pl_level); if (mob_level > gray_level) { uint32 ZD = GetZeroDifference(pl_level); return (pl_level * 5 + nBaseExp) * (ZD + mob_level - pl_level) / ZD; } return 0; } } inline uint32 Gain(Player* pl, Unit* u) { if (u->GetTypeId() == TYPEID_UNIT && ( ((Creature*)u)->IsTotem() || ((Creature*)u)->IsPet() || (((Creature*)u)->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) || ((Creature*)u)->GetCreatureTemplate()->type == CREATURE_TYPE_CRITTER)) return 0; uint32 xp_gain = BaseGain(pl->getLevel(), u->getLevel(), GetContentLevelsForMapAndZone(u->GetMapId(), u->GetZoneId())); if (xp_gain == 0) return 0; if (u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->isElite()) xp_gain *= 2; return (uint32)(xp_gain * sWorld.getRate(RATE_XP_KILL)); }
Если помог, ставь плюсик в репу :)
Сообщение # 8 написано 17.02.2017 в 12:44
|
Вот код всего раздела получения экспы и перевода мобов в разные цвета (вопрос не про достьижение макс левела а как раз наоборот - мне игроки сообщили что на 58 левеле даётся экспа за мобов которые серые - тоесть на 9 и более левелов ниже игрока): Какой лвл у моба, которого ты бил и у тебя? |
Код inline uint32 GetGrayLevel(uint32 pl_level) { if (pl_level <= 5) return 0; else if (pl_level <= 39) return pl_level - 5 - pl_level / 10; else if (pl_level <= 59) return pl_level - 1 - pl_level / 5; else return pl_level - 9; } Предположим, что параметру было передано значение 58. Первые два условия будут вычислены как false, и их тела не выполнятся, однако третье вернет true (58 <= 59). Заменяем в выражении return переменную на ее значение и получаем: return 58 - 1 - 58 / 5; Целочисленное деление выполнится первым. Его результатом станет 11. Затем выполнятся остальные действия, слева направо. 58 - 1 - 11 = 57 - 11 = 46. Именно этот уровень будет возвращен в качестве серого. Подставляем его в Код uint32 gray_level = GetGrayLevel(pl_level); if (mob_level > gray_level) { uint32 ZD = GetZeroDifference(pl_level); return (pl_level * 5 + nBaseExp) * (ZD + mob_level - pl_level) / ZD; } и понимаем, что условие выполнится, если НИП будет 47 уровня или выше (при условии, что игрок 58). Вывод: если это ненормальное поведение - проблема в соответствующей ветке GetGrayLevel, а именно - испорченная формула. |
Код inline XPColorChar GetColorCode(uint32 pl_level, uint32 mob_level) { if (mob_level >= pl_level + 5) return RED; else if (mob_level >= pl_level + 3) return ORANGE; else if (mob_level >= pl_level - 2) return YELLOW; else if (mob_level > GetGrayLevel(pl_level)) return GREEN; else if (mob_level > GetGrayLevel(pl_level)) return GREEN; Если есть желание, можно за 5 минут сделать все как душеньке угодно. |
только вот не понятно почему левел моба серый а расчёт ведётся как для зелёного
расчёт мне понятен - мне не понятно почему отображение серое - тоесть что-то же переводит моба в разряд серых а по расчётам не должно
Если помог, ставь плюсик в репу :)
|
Сообщение # 18 написано 17.02.2017 в 13:08
|
Вы вообще-то прочитали мой пост последний? Я там на пальцах объяснил, почему вернуло не нуль. По поводу покраски уровней - нужно отслеживать весь путь возвращаемого из GetColorCode значения. Нет там никакого пути он зелёным должен возвращать при if (mob_level > GetGrayLevel(pl_level)) тоесть берёт из того же кривого GetGrayLevel а значит левел должен зелёным светиться Добавлено (17.02.2017, 13:09)
Если помог, ставь плюсик в репу :)
Сообщение # 20 написано 17.02.2017 в 13:09
|
Код inline XPColorChar GetColorCode(uint32 pl_level, uint32 mob_level) { if (mob_level >= pl_level + 5) return RED; else if (mob_level >= pl_level + 3) return ORANGE; else if (mob_level >= pl_level - 2) return YELLOW; else if (mob_level > GetGrayLevel(pl_level)) return GREEN; Не посмотрел на цвет хп, все тут правильно |
58-12,6 = 45,4 Это, кстати, что еще за дичь? Там неоткуда float'ам взяться. - каким float'ам ? и почему их не может там быть? Stormtrooper () тоесть берёт из того же кривого GetGrayLevel Да, берет. А дальше что? Куда возвращаемое значение уходит? а куда оно должно уходить? там ясно вывод даётся if (mob_level > GetGrayLevel(pl_level)) return GREEN; else return GRAY;
Если помог, ставь плюсик в репу :)
Сообщение # 26 написано 17.02.2017 в 13:17
|
Метод установки цвета имени и уровня в другом коде, тут его явно нету
Либо XPCOLOR=LVLCOLOR else if (mob_level >= GetGrayLevel(pl_level)) return GREEN; Может поможет выставить в зеленый цвет, ибо разница mob_lvl и GetGrayLevel в единицу |
| |||