Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Принятые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=5)
-   -   [12007] Add CONDITION_REPUTATION_RANK_MAX (http://mangos.ytdb.ru/showthread.php?t=5441)

NeatElves 15.05.2012 18:29

[12007] Add CONDITION_REPUTATION_RANK_MAX
 
1. Rename CONDITION_REPUTATION_RANK->CONDITION_REPUTATION_RANK_MIN
2. Add CONDITION_REPUTATION_RANK_MAX

Зачем: Есть нпц с госсипами, у которых текст для каждого ранга репутации, пример - охрана Черного ворона, властитель Крыльев пустоты, по старой системе мы получаем так(type,value1,value2):
Цитата:

5 349 3
5 349 4
Если имеем 4 ранг - для ядра условия текста и 3 и 4 ранга подходят.))
С новой системой поточнее:
Цитата:

5 349 3 и 30 349 4
5 349 4
Патч:
Код:

diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 180142b..47e46fe 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -7507,7 +7507,7 @@ bool PlayerCondition::Meets(Player const * player) const
            player->GetZoneAndAreaId(zone,area);
            return (zone == m_value1 || area == m_value1) == (m_value2 == 0);
        }
-        case CONDITION_REPUTATION_RANK:
+        case CONDITION_REPUTATION_RANK_MIN:
        {
            FactionEntry const* faction = sFactionStore.LookupEntry(m_value1);
            return faction && player->GetReputationMgr().GetRank(faction) >= ReputationRank(m_value2);
@@ -7676,6 +7676,11 @@ bool PlayerCondition::Meets(Player const * player) const
                return !player->HasSkill(m_value1);
            else
                return player->HasSkill(m_value1) && player->GetBaseSkillValue(m_value1) < m_value2;
+        case CONDITION_REPUTATION_RANK_MAX:
+        {
+            FactionEntry const* faction = sFactionStore.LookupEntry(m_value1);
+            return faction && player->GetReputationMgr().GetRank(faction) < ReputationRank(m_value2);
+        }
        default:
            return false;
    }
@@ -7772,7 +7777,8 @@ bool PlayerCondition::IsValid(uint16 entry, ConditionType condition, uint32 valu
            }
            break;
        }
-        case CONDITION_REPUTATION_RANK:
+        case CONDITION_REPUTATION_RANK_MIN:
+        case CONDITION_REPUTATION_RANK_MAX:
        {
            FactionEntry const* factionEntry = sFactionStore.LookupEntry(value1);
            if (!factionEntry)
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 229d9b2..81a7c26 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -345,7 +345,7 @@ enum ConditionType
    CONDITION_ITEM                  = 2,                    // item_id      count  check present req. amount items in inventory
    CONDITION_ITEM_EQUIPPED        = 3,                    // item_id      0
    CONDITION_AREAID                = 4,                    // area_id      0, 1 (0: in (sub)area, 1: not in (sub)area)
-    CONDITION_REPUTATION_RANK      = 5,                    // faction_id  min_rank
+    CONDITION_REPUTATION_RANK_MIN  = 5,                    // faction_id  min_rank
    CONDITION_TEAM                  = 6,                    // player_team  0,      (469 - Alliance 67 - Horde)
    CONDITION_SKILL                = 7,                    // skill_id    skill_value
    CONDITION_QUESTREWARDED        = 8,                    // quest_id    0
@@ -375,6 +375,7 @@ enum ConditionType
    CONDITION_SKILL_BELOW          = 29,                  // skill_id    skill_value
                                                            // True if player has skill skill_id and skill less than (and not equal) skill_value (for skill_value > 1)
                                                            // If skill_value == 1, then true if player has not skill skill_id
+    CONDITION_REPUTATION_RANK_MAX  = 30,                  // faction_id  max_rank
 };
 
 class PlayerCondition


virusav 15.05.2012 19:15

Если для MIN стоит условие
Код:

return faction && player->GetReputationMgr().GetRank(faction) >= ReputationRank(m_value2);
то для MAX по аналогии должно быть
Код:

return faction && player->GetReputationMgr().GetRank(faction) <= ReputationRank(m_value2);

NeatElves 15.05.2012 19:20

Цитата:

Сообщение от virusav (Сообщение 27318)
Если для MIN стоит условие
Код:

return faction && player->GetReputationMgr().GetRank(faction) >= ReputationRank(m_value2);
то для MAX по аналогии должно быть
Код:

return faction && player->GetReputationMgr().GetRank(faction) <= ReputationRank(m_value2);

Игорк получил 4 ранг.
И что тогда выйдет ? Какой текст отработает ?
Цитата:

5 349 3 и 30 349 4
5 349 4

virusav 15.05.2012 19:23

Достаточно будет 5 349 3 и 30 349 4, т.к. будут выбираться ранги >=3 и <=4.

NeatElves 15.05.2012 19:27

Все равно не то, у нпц тексты для рангов
Цитата:

3
4
5
6
7

virusav 15.05.2012 19:43

В твоем варианте для первого ранга будет так: 5 349 3 и 30 349 4.
С моей поправкой для первого ранга будет так: 5 349 3 и 30 349 3.

Вот и вся разница.
Просто, используя MIN и MAX в кондициях, надо давать им похожую обработку: если для минимума включается равенство при сравнении, то то же самое надо делать и для максимума.

NeatElves 15.05.2012 19:47

У меня будет больше или равен 3 и меньше 4
У тебя будет больше или равен 3 и меньше или равен 3
Где логика ?))

Мой вариант
Цитата:

меньше 4
больше или равен 4 и меньше 5
больше или равен 5 и меньше 6
больше или равен 6 и меньше 7
больше или равен 7
Твой вариант(дубли, как раз из-за равенства)
Цитата:

меньше или равен 3
больше или равен 3 и меньше или равен 4
больше или равен 4 и меньше или равен 5
больше или равен 5 и меньше или равен 6
больше или равен 7

virusav 15.05.2012 20:01

Работать будет в обоих вариантах, просто в твоем цифра будет на 1 больше.:)
Я привел правку, т.к. так будет логичнее, на мой взгляд.
Код:

CONDITION_REPUTATION_RANK_MIN  = 5,                    // faction_id  min_rank
CONDITION_REPUTATION_RANK_MAX  = 30,                  // faction_id  max_rank

Разница только в названии, но вопреки логике сравниваемое значение включается в выборку почему-то только в первом случае.
Глядя на названия переменных и их описание, этого не скажешь.

NeatElves 15.05.2012 20:33

Странно, допустим у игрока ранг 4, подходят оба варианта
Код:

больше или равен 3 и меньше или равен 4
больше или равен 4 и меньше или равен 5


virusav 15.05.2012 20:39

Если нужен только ранг Х, то для кондиций 5 и 30 `value2`=X.

NeatElves 15.05.2012 20:54

Распиши свое видение условий для
Цитата:

3
4
5
6
7

virusav 15.05.2012 23:30

Я уже писал для первого, для всех будет так:
Код:

5 349 3 и 30 349 3
5 349 4 и 30 349 4
5 349 5 и 30 349 5
5 349 6 и 30 349 6
5 349 7 и 30 349 7


schmoozerd 13.06.2012 16:54

I agree with virusav.
MAX value2 return true IF_AND_ONLY_IF rank <= value2

this is more natural way. for something named max (and dual to min).

NeatElves 13.06.2012 17:20

Не спорю) У вирусава логично математически, у меня логично по близзардовски.))

schmoozerd 13.06.2012 23:36

With <= in [12007]
Thank you for the patch and you both for discussion :)


Текущее время: 04:55. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS