• Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: Dimitro  
Даётся exp за серых мобов
Stormtrooper
Командир
Привет всем
Обнаружилась проблема
Даётся 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
grasicco
Сержант
Скорее всего ошибка в GetGrayLevel
Сообщение # 2 написано 17.02.2017 в 12:04
Stormtrooper
Командир
сравнивал с Мангосом и Тринити - везде одинаково
GetGrayLevel отвечает за переход моба в серый статус - и это отрабатывает а вот начисление экспы не прекращается
Если помог, ставь плюсик в репу :)

Сообщение # 3 отредактировано Stormtrooper - Пятница, 17.02.2017, 12:07
grasicco
Сержант
Значит ошибка не в этом коде. Врятли компилятор будет работать не по инструкциям
Сообщение # 4 написано 17.02.2017 в 12:18
Stormtrooper
Командир
может и не в этом - собственно поэтому я тут - прошу помощи
Если помог, ставь плюсик в репу :)

Сообщение # 5 написано 17.02.2017 в 12:22
p620
Маршал
Без тел 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;
Сообщение # 6 отредактировано p620 - Пятница, 17.02.2017, 12:29
grasicco
Сержант
Цитата p620 ()
Без тел GetGrayLevel и GetZeroDifference сказать ничего определенного нельзя.
Тут либо кривая 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;
    }
}
Если получишь максимальный лвл, 100% GetGrayLevel
Сообщение # 7 отредактировано grasicco - Пятница, 17.02.2017, 12:42
Stormtrooper
Командир
Вот код всего раздела получения экспы и перевода мобов в разные цвета (вопрос не про достьижение макс левела а как раз наоборот - мне игроки сообщили что на 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
grasicco
Сержант
Цитата Stormtrooper ()
Вот код всего раздела получения экспы и перевода мобов в разные цвета (вопрос не про достьижение макс левела а как раз наоборот - мне игроки сообщили что на 58 левеле даётся экспа за мобов которые серые - тоесть на 9 и более левелов ниже игрока):
я скинул тот кусок для того, чтобы понять, где искать, если ты убьешь моба меньшего лвла, и получишь макс лвл, надо исправлять GetGrayLevel, если не получшь - ошибка не в этой части кода.
Какой лвл у моба, которого ты бил и у тебя?
Сообщение # 9 отредактировано grasicco - Пятница, 17.02.2017, 12:52
Stormtrooper
Командир
я 58 моб 47

проверку можно сделать и тупо при помощи sLog.outError
увидишь при помощи вывода ошибки в консоль, какая часть скрипта отработала
Если помог, ставь плюсик в репу :)

Сообщение # 10 отредактировано Stormtrooper - Пятница, 17.02.2017, 12:53
p620
Маршал
Код
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, а именно - испорченная формула.
Сообщение # 11 отредактировано p620 - Пятница, 17.02.2017, 12:58
grasicco
Сержант
Цитата Stormtrooper ()
я 58 моб 47

Код
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 минут сделать все как душеньке угодно.
Сообщение # 12 отредактировано grasicco - Пятница, 17.02.2017, 13:00
Stormtrooper
Командир
Вот скрины



Добавлено (17.02.2017, 13:04)
---------------------------------------------
Вобщем походу GetGrayLevel кривой блин

надо тупо сделать -9 как положено

Если помог, ставь плюсик в репу :)

Сообщение # 13 написано 17.02.2017 в 13:04
grasicco
Сержант
Так все правильно, простейшая арифметика
58-12,6 = 45,4
if(mob_level > gray_level)
retrun %exp%;
Код отработал свое, к чему ты придрался, непонятно)
Сообщение # 14 отредактировано grasicco - Пятница, 17.02.2017, 13:05
Stormtrooper
Командир
только вот не понятно почему левел моба серый а расчёт ведётся как для зелёного
расчёт мне понятен - мне не понятно почему отображение серое - тоесть что-то же переводит моба в разряд серых а по расчётам не должно
Если помог, ставь плюсик в репу :)

Сообщение # 15 отредактировано Stormtrooper - Пятница, 17.02.2017, 13:06
grasicco
Сержант
Цитата Stormtrooper ()
только вот не понятно почему левел моба серый а расчёт ведётся как для зелёного
я тебе еще больше скажу, хп написаны оранженвым, если успею за обед, то поищу
Сообщение # 16 отредактировано grasicco - Пятница, 17.02.2017, 13:07
Stormtrooper
Командир
каким оранжевым? где?
Если помог, ставь плюсик в репу :)

Сообщение # 17 написано 17.02.2017 в 13:07
p620
Маршал
Цитата Stormtrooper ()
только вот не понятно почему левел моба серый а расчёт ведётся как для зелёного

Вы вообще-то прочитали мой пост последний? Я там на пальцах объяснил, почему вернуло не нуль. По поводу покраски уровней - нужно отслеживать весь путь возвращаемого из GetColorCode значения.
Сообщение # 18 написано 17.02.2017 в 13:08
grasicco
Сержант
Цитата Stormtrooper ()
каким оранжевым? где?
Ой, не хп, а имя
Сообщение # 19 написано 17.02.2017 в 13:08
Stormtrooper
Командир
Цитата p620 ()
Вы вообще-то прочитали мой пост последний? Я там на пальцах объяснил, почему вернуло не нуль. По поводу покраски уровней - нужно отслеживать весь путь возвращаемого из GetColorCode значения.

Нет там никакого пути
он зелёным должен возвращать при if (mob_level > GetGrayLevel(pl_level))
тоесть берёт из того же кривого GetGrayLevel а значит левел должен зелёным светиться

Добавлено (17.02.2017, 13:09)
---------------------------------------------

Цитата grasicco ()
Ой, не хп, а имя
а почему не должно? он живой и это БК там так и было
Если помог, ставь плюсик в репу :)

Сообщение # 20 написано 17.02.2017 в 13:09
p620
Маршал
Цитата grasicco ()
58-12,6 = 45,4

Это, кстати, что еще за дичь? Там неоткуда float'ам взяться.
Цитата Stormtrooper ()
тоесть берёт из того же кривого GetGrayLevel

Да, берет. А дальше что? Куда возвращаемое значение уходит?
Сообщение # 21 написано 17.02.2017 в 13:11
grasicco
Сержант
Цитата Stormtrooper ()
а почему не должно? он живой и это БК там так и был
Метод, который возвращает цвет, меняет только имя
Сообщение # 22 написано 17.02.2017 в 13:12
Stormtrooper
Командир
Цитата grasicco ()
Метод, который возвращает цвет, меняет только имя
Вообще не понял к чему это
где там вообще упоминание имени?
Если помог, ставь плюсик в репу :)

Сообщение # 23 написано 17.02.2017 в 13:13
grasicco
Сержант
Цитата Stormtrooper ()
Вообще не понял к чему этогде там вообще упоминание имени?

Код
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;

Не посмотрел на цвет хп, все тут правильно
Сообщение # 24 отредактировано grasicco - Пятница, 17.02.2017, 13:15
p620
Маршал
Цитата Stormtrooper ()
Вообще не понял к чему это
где там вообще упоминание имени?

Stormtrooper, я Вас прошу ответить на сообщение по делу, в противном случае я не смогу оказать дальнейшую поддержку.
Сообщение # 25 написано 17.02.2017 в 13:15
Stormtrooper
Командир
Цитата p620 ()
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
p620
Маршал
Цитата Stormtrooper ()
а куда оно должно уходить?

Еще раз:
Я вижу, как работает логика внутри функции. Меня интересует контекст ее вызовов и дальнейшая жизнь возвращаемых из нее значений.
Сообщение # 27 написано 17.02.2017 в 13:19
grasicco
Сержант
Метод установки цвета имени и уровня в другом коде, тут его явно нету
Либо XPCOLOR=LVLCOLOR
else if (mob_level >= GetGrayLevel(pl_level))
        return GREEN;
Может поможет выставить в зеленый цвет, ибо разница mob_lvl и GetGrayLevel в единицу
Сообщение # 28 отредактировано grasicco - Пятница, 17.02.2017, 13:24
Stormtrooper
Командир
Цитата grasicco ()
Либо XPCOLOR=LVLCOLOR

ни того ни другого нет во всём коде
Если помог, ставь плюсик в репу :)

Сообщение # 29 написано 17.02.2017 в 13:24
grasicco
Сержант
Цитата Stormtrooper ()
ни того ни другого нет во всём коде
Там есть флаг выставления цвета ЖИЗНИ(серый). По формуле расчета опыта ты можешь получить опыт, но по формуле расчета цвета жизней он серый,надо просто переписать, возможно просто взяли код с 3.3.5 и вставили
Сообщение # 30 отредактировано grasicco - Пятница, 17.02.2017, 13:27
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск: