Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Принятые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=5)
-   -   [9715][patch] gossip для двойного спека (http://mangos.ytdb.ru/showthread.php?t=565)

Insider42 03.04.2010 10:13

[9715][patch] gossip для двойного спека
 
ревизия:
9661 и новее

исправление:
позволяет изучать двойную специализацию у классовых тренеров

автор:
я, хоть и взял идею у оригинального патча :pardon:

зы: вынес в функцию дабы соблюдать code style :)
Код:

diff --git a/src/game/GossipDef.h b/src/game/GossipDef.h
index 68744db..8659f3d 100644
--- a/src/game/GossipDef.h
+++ b/src/game/GossipDef.h
@@ -48,6 +48,7 @@ enum Gossip_Option
    GOSSIP_OPTION_ARMORER          = 15,                  //UNIT_NPC_FLAG_ARMORER            (4096)
    GOSSIP_OPTION_UNLEARNTALENTS    = 16,                  //UNIT_NPC_FLAG_TRAINER            (16) (bonus option for GOSSIP_OPTION_TRAINER)
    GOSSIP_OPTION_UNLEARNPETSKILLS  = 17,                  //UNIT_NPC_FLAG_TRAINER            (16) (bonus option for GOSSIP_OPTION_TRAINER)
+    GOSSIP_OPTION_LEARNDUALSPEC    = 18,                  //UNIT_NPC_FLAG_TRAINER            (16) (bonus option for GOSSIP_OPTION_TRAINER)
    GOSSIP_OPTION_MAX
 };
 
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 48e091c..9c447b5 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -8318,6 +8318,14 @@ void Player::SendPetSkillWipeConfirm()
    GetSession()->SendPacket( &data );
 }
 
+void Player::LearnDualSpec(uint64 guid)
+{
+    ModifyMoney(-1000*GOLD);
+
+    CastSpell(this, 63680, true, NULL, NULL, guid);
+    CastSpell(this, 63624, true, NULL, NULL, guid);
+}
+
 /*********************************************************/
 /***                    STORAGE SYSTEM                ***/
 /*********************************************************/
@@ -12520,6 +12528,10 @@ void Player::PrepareGossipMenu(WorldObject *pSource, uint32 menuId)
                    if (!pCreature->isCanTrainingOf(this, false))
                        bCanTalk = false;
                    break;
+                case GOSSIP_OPTION_LEARNDUALSPEC:
+                    if(!(GetSpecsCount() == 1 && pCreature->isCanTrainingAndResetTalentsOf(this) && !(getLevel() < 40)))
+                        bCanTalk = false;
+                    break;
                case GOSSIP_OPTION_UNLEARNTALENTS:
                    if (!pCreature->isCanTrainingAndResetTalentsOf(this))
                        bCanTalk = false;
@@ -12719,6 +12731,10 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me
        case GOSSIP_OPTION_TRAINER:
            GetSession()->SendTrainerList(guid);
            break;
+        case GOSSIP_OPTION_LEARNDUALSPEC:
+            PlayerTalkClass->CloseGossip();
+            LearnDualSpec(guid);
+            break;
        case GOSSIP_OPTION_UNLEARNTALENTS:
            PlayerTalkClass->CloseGossip();
            SendTalentWipeConfirm(guid);
diff --git a/src/game/Player.h b/src/game/Player.h
index a53339b..9d4cce5 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -1444,6 +1444,7 @@ class MANGOS_DLL_SPEC Player : public Unit
 
        void SetBindPoint(uint64 guid);
        void SendTalentWipeConfirm(uint64 guid);
+        void LearnDualSpec(uint64 guid);
        void RewardRage( uint32 damage, uint32 weaponSpeedHitFactor, bool attacker );
        void SendPetSkillWipeConfirm();
        void CalcRage( uint32 damage,bool attacker );

в базу:
Код:

INSERT INTO `gossip_menu_option` VALUES
(0, 16, 0, 'Purchase a Dual Talent Specialization.', 18, 16, 0, 0, 0, 0, 10000000, 'Are you sure you wish to purchase a Dual Talent Specialization?', 0, 0, 0, 0, 0, 0, 0, 0, 0);


Laise 03.04.2010 10:57

может проверку тоже отдельно типа isCanLearnDualSpec ?

ghostpast 04.04.2010 13:24

лучше заменить
Код:

&& !(getLevel() < 40)
на
Код:

&& (getLevel() >= 40)
В патче учитывается случай, когда у игрока не хватает голдов?

zhenya 04.04.2010 14:42

Не учитывается.

Insider42 04.04.2010 15:14

Цитата:

Сообщение от zhenya (Сообщение 3768)
Не учитывается.

_если_ зальете запрос в базу то будет учитываться =)))

NeatElves 04.04.2010 15:57

Тогда в запрос и кондицию вставить на 40 левел можно(15,40,1)..)

Insider42 04.04.2010 16:42

Цитата:

Сообщение от NeatElves (Сообщение 3773)
Тогда в запрос и кондицию вставить на 40 левел можно(15,40,1)..)

Тогда он будет отображаться, но при попытке нажать будет выдавать сообщение, что персонажу нехватает уровня (если перс до 40 уровня). А тут же нужно чтобы сам пункт меню не был отображен до 40 уровня.

timmit 04.04.2010 16:48

С кондицией не будет даже появлятся :)

NeatElves 04.04.2010 16:55

Цитата:

Сообщение от timmit (Сообщение 3777)
С кондицией не будет даже появлятся :)

Все верно, с такой кондицией, пункт меню будет виден только игрокам 40+...

ghostpast 04.04.2010 16:59

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

NeatElves 04.04.2010 17:36

Это проще простого, делается через стандартный госсип меню тренера... Запрос в первом посте - это уже финальная строчка, тогда там точно не надо проверки на 40+, она должна быть в первой части меню))
Текст меню тренера - Learn about Dual Talent Specialization.(15,40,1) - текст меню дуала(+строчка из первого поста)

rsa 04.04.2010 17:42

Кстати в патче ошибка. id 16 забронирован за банком, поэтому sql не зальется. я давно пользуюсь id 51, вроде проблем не было

timmit 04.04.2010 17:44

Код:

+    GOSSIP_OPTION_LEARNDUALSPEC    = 18,
вы точно читали текст?

rsa 04.04.2010 18:14

Цитата:

Сообщение от timmit (Сообщение 3783)
Код:

+    GOSSIP_OPTION_LEARNDUALSPEC    = 18,
вы точно читали текст?

А немножко внимательнее? 18 это option_id, а я про id
2е поле таблицы короче. к коду отношения не имеет.

Insider42 04.04.2010 18:27

Цитата:

Сообщение от NeatElves (Сообщение 3781)
Текст меню тренера - Learn about Dual Talent Specialization.(15,40,1) - текст меню дуала(+строчка из первого поста)

Как их связать?

Цитата:

Сообщение от rsa (Сообщение 3784)
А немножко внимательнее? 18 это option_id, а я про id
2е поле таблицы короче. к коду отношения не имеет.

у меня в YTDB 541 этот (16) ID не занят, следовательно запрос проходит.

Vladimir 04.04.2010 18:29

Цитата:

+ CastSpell(this, 63680, true, NULL, NULL, guid);
+ CastSpell(this, 63624, true, NULL, NULL, guid);
Достаточно кастовать спелл 63624 - остальное давно уже сделано в коде

NeatElves 04.04.2010 18:30

Цитата:

Сообщение от rsa (Сообщение 3784)
А немножко внимательнее? 18 это option_id, а я про id
2е поле таблицы короче. к коду отношения не имеет.

Из фула mangos.sql
Цитата:

/*!40000 ALTER TABLE `gossip_menu_option` DISABLE KEYS */;
INSERT INTO gossip_menu_option VALUES
(0, 0,0,'GOSSIP_OPTION_QUESTGIVER', 2,0x000002,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 1,1,'GOSSIP_OPTION_VENDOR', 3,0x000080,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 2,2,'GOSSIP_OPTION_TAXIVENDOR', 4,0x002000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 3,3,'GOSSIP_OPTION_TRAINER', 5,0x000010,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 4,4,'GOSSIP_OPTION_SPIRITHEALER', 6,0x004000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 5,4,'GOSSIP_OPTION_SPIRITGUIDE', 7,0x008000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 6,5,'GOSSIP_OPTION_INNKEEPER', 8,0x010000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 7,6,'GOSSIP_OPTION_BANKER', 9,0x020000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 8,7,'GOSSIP_OPTION_PETITIONER', 10,0x040000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0, 9,8,'GOSSIP_OPTION_TABARDDESIGNER', 11,0x080000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0,10,9,'GOSSIP_OPTION_BATTLEFIELD', 12,0x100000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0,11,6,'GOSSIP_OPTION_AUCTIONEER', 13,0x200000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0,12,0,'GOSSIP_OPTION_STABLEPET', 14,0x400000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0,13,1,'GOSSIP_OPTION_ARMORER', 15,0x001000,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0,14,2,'GOSSIP_OPTION_UNLEARNTALENTS', 16,0x000010,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0),
(0,15,2,'GOSSIP_OPTION_UNLEARNPETSKILLS',17,0x0000 10,0,0,0,0,0,NULL,0,0,0,0,0,0,0,0,0);
/*!40000 ALTER TABLE `gossip_menu_option` ENABLE KEYS */;
Всего 15..)))

Insider42 - ПМ...

Vladimir 04.04.2010 20:30

снятия золота вроде и проверок нет пока... - но есть соотвевующеи поле...

NeatElves 04.04.2010 22:13

Лучше добавить в кондиции что-то наподобие(состряпал навскидку, просто чтобы показать идею, не проверял):
Код:

diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index d96c32f..d4b3b44 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -7435,6 +7435,10 @@ bool PlayerCondition::Meets(Player const * player) const
            return !player->HasItemCount(value1, value2);
        default:
            return false;
+        case CONDITION_SPELL:
+            return player->HasSpell(value1);
+        case CONDITION_NO_SPELL:
+            return !player->HasSpell(value1);
    }
 }
 
@@ -7630,6 +7634,16 @@ bool PlayerCondition::IsValid(ConditionType condition, uint32 value1, uint32 val
 
            break;
        }
+        case CONDITION_SPELL:
+        case CONDITION_NO_SPELL:
+        {
+            if(!sSpellStore.LookupEntry(value1))
+            {
+                sLog.outErrorDb("Spell condition requires to have non existing spell (Id: %d), skipped", value1);
+                return false;
+            }
+            break;
+        }
        case CONDITION_NONE:
            break;
    }
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index e3b22c5..a0b4293 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -314,9 +314,11 @@ enum ConditionType
    CONDITION_RACE_CLASS            = 14,                  // race_mask    class_mask
    CONDITION_LEVEL                = 15,                  // player_level 0, 1 or 2 (0: equal to, 1: equal or higher than, 2: equal or less than)
    CONDITION_NOITEM                = 16,                  // item_id      count
+    CONDITION_SPELL                  = 17,                    // spell_id    0
+    CONDITION_NO_SPELL                  = 18,                    // spell_id    0
 };
 
-#define MAX_CONDITION                17                    // maximum value in ConditionType enum
+#define MAX_CONDITION                19                    // maximum value in ConditionType enum
 
 struct PlayerCondition
 {

И будет тогда проверка первая на уровень перса, вторая - не знает ли он спелл дуалспека, если совпало - меню есть..))
Пригодится и дя других меню, наподобие инженер гном и т.п..))

ghostpast 04.04.2010 22:41

Цитата:

Сообщение от NeatElves (Сообщение 3803)
Лучше добавить в кондиции что-то наподобие(состряпал навскидку, просто чтобы показать идею, не проверял):
Код:

diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index d96c32f..d4b3b44 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -7435,6 +7435,10 @@ bool PlayerCondition::Meets(Player const * player) const
            return !player->HasItemCount(value1, value2);
        default:
            return false;
+        case CONDITION_SPELL:
+            return player->HasSpell(value1);
+        case CONDITION_NO_SPELL:
+            return !player->HasSpell(value1);
    }
 }
 
@@ -7630,6 +7634,16 @@ bool PlayerCondition::IsValid(ConditionType condition, uint32 value1, uint32 val
 
            break;
        }
+        case CONDITION_SPELL:
+        case CONDITION_NO_SPELL:
+        {
+            if(!sSpellStore.LookupEntry(value1))
+            {
+                sLog.outErrorDb("Spell condition requires to have non existing spell (Id: %d), skipped", value1);
+                return false;
+            }
+            break;
+        }
        case CONDITION_NONE:
            break;
    }
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index e3b22c5..a0b4293 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -314,9 +314,11 @@ enum ConditionType
    CONDITION_RACE_CLASS            = 14,                  // race_mask    class_mask
    CONDITION_LEVEL                = 15,                  // player_level 0, 1 or 2 (0: equal to, 1: equal or higher than, 2: equal or less than)
    CONDITION_NOITEM                = 16,                  // item_id      count
+    CONDITION_SPELL                  = 17,                    // spell_id    0
+    CONDITION_NO_SPELL                  = 18,                    // spell_id    0
 };
 
-#define MAX_CONDITION                17                    // maximum value in ConditionType enum
+#define MAX_CONDITION                19                    // maximum value in ConditionType enum
 
 struct PlayerCondition
 {

И будет тогда проверка первая на уровень перса, вторая - не знает ли он спелл дуалспека, если совпало - меню есть..))
Пригодится и дя других меню, наподобие инженер гном и т.п..))

можно оставить CONDITION_SPELL, а отрицательное значение будет означать отсутствие спелла.
и
Код:

        default:
            return false;

должен быть в конце оператора switch

Insider42 04.04.2010 23:26

Как снять деньги с игрока при изучении ДС, дубль №2:
Код:

diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 493d28f..e54d68f 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -12625,6 +12625,9 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me
 
    uint32 gossipOptionId = gossipmenu.GetItem(gossipListId).m_gOptionId;
    uint64 guid = pSource->GetGUID();
+    int32 MoneyTake = gossipmenu.GetItem(gossipListId).m_gBoxMoney;
+    if (MoneyTake > 0)
+        ModifyMoney(-MoneyTake);
 
    if (pSource->GetTypeId() == TYPEID_GAMEOBJECT)
    {

весь вышенаписанный мною код можно отправлять на помойку :D
Проверено, снимает деньги как положено.

само обучение
Код:

insert into gossip_scripts values (99999,0,15,63624,2,0,0,0,0,0);
REPLACE INTO `gossip_menu_option` VALUES (10371, 0, 0, 'Purchase a Dual Talent Specialization.', 1, 16, 0, 0, 99999, 0, 10000000, 'Are you sure you wish to purchase a Dual Talent Specialization?', 0, 0, 0, 0, 0, 0, 0, 0, 0);

затем применить подправленный патч от NeatElves, также тут много чего ещё нехватает в базе...

Vladimir 04.04.2010 23:58

Никто не видел что выдается при отсутствии денег на оффе?

LordJZ 05.04.2010 06:54

Цитата:

Сообщение от Vladimir (Сообщение 3811)
Никто не видел что выдается при отсутствии денег на оффе?

Красная ошибка в центре экрана, "У вас недостаточно денег." Причем от клиента, серверу вообще данные не отправляются.

GriffonHeart 05.04.2010 07:01

Цитата:

Сообщение от LordJZ (Сообщение 3825)
Красная ошибка в центре экрана, "У вас недостаточно денег." Причем от клиента, серверу вообще данные не отправляются.

Это потому что box_money = 10000000. Клиент сам проверяет, есть ли у него стока денег. Но и у сервера должна быть доп. проверка, чтобы нельзя было отослать пакет через WPE и получить дуал-спек нахаляву.

Insider42 05.04.2010 10:18

Тогда должно быть так...
Код:

diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 493d28f..658f3ef 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -12625,6 +12625,18 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me
 
    uint32 gossipOptionId = gossipmenu.GetItem(gossipListId).m_gOptionId;
    uint64 guid = pSource->GetGUID();
+    int32 MoneyTake = gossipmenu.GetItem(gossipListId).m_gBoxMoney;
+
+    if (MoneyTake > 0)
+    {
+        if (GetMoney() < MoneyTake)
+        {
+            SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);
+            return;
+        }
+        else
+            ModifyMoney(-MoneyTake);
+    }
 
    if (pSource->GetTypeId() == TYPEID_GAMEOBJECT)
    {

А не будет ли тогда ошибку о том, что нехватает денег выдавать дважды? Я просто не в курсе, что проверяется первым:
1) box_money из таблицы
2) из ядра
3) сразу оба, т.к. клиент не отвечает серверу что уже получил вопрос от box_money в таблице

Во втором и третьем случае нужно так
Код:

diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 493d28f..3ecc42f 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -12625,6 +12625,15 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me
 
    uint32 gossipOptionId = gossipmenu.GetItem(gossipListId).m_gOptionId;
    uint64 guid = pSource->GetGUID();
+    int32 MoneyTake = gossipmenu.GetItem(gossipListId).m_gBoxMoney;
+
+    if (MoneyTake > 0)
+    {
+        if (GetMoney() >= MoneyTake)
+            ModifyMoney(-MoneyTake);
+        else
+            return;
+    }
 
    if (pSource->GetTypeId() == TYPEID_GAMEOBJECT)
    {

Обычному игроку выдаст ошибку раз, читеру ничего не выдаст, но и читернуть не даст

GriffonHeart 05.04.2010 12:39

Ёпрст. Обновил ревизию называется, теперь куча крашей в ActiveSpec, аналогичных как пишут на getmangos.com :(

Ещё вопрос. AT_LOGIN_RESET_TALENTS действует на текущий спец или на оба? Ато не порядок получается :(

Insider42 05.04.2010 14:59

Судя по всему - окончательная версия (но без нормальных данных для базы - не годится для игровых серверов)
Код:

diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index d96c32f..71a2f2c 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -7433,6 +7433,15 @@ bool PlayerCondition::Meets(Player const * player) const
        }
        case CONDITION_NOITEM:
            return !player->HasItemCount(value1, value2);
+        case CONDITION_SPELL:
+        {
+            switch(value2)
+            {
+                case 0: return player->HasSpell(value1);
+                case 1: return !player->HasSpell(value1);
+            }
+            return false;
+        }
        default:
            return false;
    }
@@ -7630,6 +7639,22 @@ bool PlayerCondition::IsValid(ConditionType condition, uint32 value1, uint32 val
 
            break;
        }
+        case CONDITION_SPELL:
+        {
+            if(!sSpellStore.LookupEntry(value1))
+            {
+                sLog.outErrorDb("Spell condition requires to have non existing spell (Id: %d), skipped", value1);
+                return false;
+            }
+
+            if (value2 > 1)
+            {
+                sLog.outErrorDb("Spell condition has invalid argument %u (must be 0..1), skipped", value2);
+                return false;
+            }
+
+            break;
+        }
        case CONDITION_NONE:
            break;
    }
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index e3b22c5..f3d805d 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -314,9 +314,10 @@ enum ConditionType
    CONDITION_RACE_CLASS            = 14,                  // race_mask    class_mask
    CONDITION_LEVEL                = 15,                  // player_level 0, 1 or 2 (0: equal to, 1: equal or higher than, 2: equal or less than)
    CONDITION_NOITEM                = 16,                  // item_id      count
+    CONDITION_SPELL                = 17,                  // spell_id    0, 1 (0: has spell, 1: hasn't spell)
 };
 
-#define MAX_CONDITION                17                    // maximum value in ConditionType enum
+#define MAX_CONDITION                18                    // maximum value in ConditionType enum
 
 struct PlayerCondition
 {
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 493d28f..bc8b7a6 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -12625,6 +12625,15 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me
 
    uint32 gossipOptionId = gossipmenu.GetItem(gossipListId).m_gOptionId;
    uint64 guid = pSource->GetGUID();
+    uint32 MoneyTake = gossipmenu.GetItem(gossipListId).m_gBoxMoney;
+
+    if (MoneyTake > 0)
+    {
+        if (GetMoney() >= MoneyTake)
+            ModifyMoney(-int32(MoneyTake));
+        else
+            return;
+    }
 
    if (pSource->GetTypeId() == TYPEID_GAMEOBJECT)
    {

Одна проблема - данные для базы, не могу никак добавить тренерам госсипы, запросы, которые дал мне NeatElves, после небольшой поправки полей condition, перекрывают тренерские меню и выходит, что у тренера нельзя делать ничего, кроме обучения дуал спеку, а после его выучки, вообще ничего нельзя нажать, т.к. нет кнопок...

В общем кидаю какие есть, заранее бэкапьте таблицу gossip_menu_option, если уж собрались тестить http://paste2.org/p/757587

ghostpast 05.04.2010 15:22

может имеет смысл заменить два условия
Код:

+    if (MoneyTake > 0)
+    {
+        if (GetMoney() >= MoneyTake)
+            ModifyMoney(-int32(MoneyTake));
+        else
+            return;
+    }

одним условием?
Код:

+    if ((MoneyTake > 0) && (GetMoney() >= MoneyTake))
+        ModifyMoney(-int32(MoneyTake));


NeatElves 05.04.2010 15:52

Тренеров в базе поправим.. Давно пора все данные перенести в gossip_menu и отказаться вообще от npc_gossip и npc_option ) Также напоминаю, что в gossip_menu_option номера меню в разных базах разные...
Опечатка
Цитата:

// spell_id 0, 1 (0: has spell, 1: hasn't spell)

Insider42 05.04.2010 16:32

Цитата:

Сообщение от ghostpast (Сообщение 3853)
может имеет смысл заменить два условия
Код:

+    if (MoneyTake > 0)
+    {
+        if (GetMoney() >= MoneyTake)
+            ModifyMoney(-int32(MoneyTake));
+        else
+            return;
+    }

одним условием?
Код:

+    if ((MoneyTake > 0) && (GetMoney() >= MoneyTake))
+        ModifyMoney(-int32(MoneyTake));


так нельзя, в этом случае мы не сможем добавить "return;" и будем давать бесплатно учиться WPE хакерам, если же добавим то это поломает все кнопки нафиг, т.к. это условие не будет проходить на большинстве gossip, где поле box_money = 0

ghostpast 05.04.2010 16:53

Цитата:

Сообщение от Insider42 (Сообщение 3858)
так нельзя, в этом случае если у игрока нехватит денег, и он окажется WPE хакером - он сможет бесплатно обучиться дуал спеку. Т.к. (MoneyTake > 0) пройдёт, но (GetMoney() >= MoneyTake) нет, собственно до ModifyMoney(-int32(MoneyTake)); мы попросту не дойдём.

В вашем коде при тех же условиях ModifyMoney(-int32(MoneyTake)) тоже не выполнится (будет ответвление в сторону return)

Vladimir 05.04.2010 16:56

Как раз у Insider42 все правильно с проверкой

Vladimir 05.04.2010 17:11

Патч корректный но не полный, а данные совершенно не правильные, как я понимаю должен выглядеть пункт меню...

Цитата:

В общем кидаю какие есть, заранее бэкапьте таблицу gossip_menu_option, если уж собрались тестить http://paste2.org/p/757587
помоему первое окно должно быть с проверкой уровня но без цены и только внем доджен быть пункт меню с ценой b возможно дополнительной перепроверой уровня против читинга

NeatElves 05.04.2010 17:13

Так сейчас и есть - деньги только во втором меню проверяются.
А к ним еще и уровень дописать можно..))

`win 05.04.2010 17:14

до 40го левела меню о дюалспеке вообще не отображается.
После 40го - появляется пункт, что то вроде "узнать подробнее о 2й специализации", после клика на которую появляется много текста с описанием и внизу пункт меню, что то вроде "да, я хочу потратить 1000г"
Если не ошибаюсь - после покупки меню больше не отображается.

NeatElves 05.04.2010 17:26

Сейчас так и реализовано..)) Но это в основе база... В ядро надо сам патч и строчку для примера, приблизительно так:
Цитата:

INSERT INTO `gossip_menu_option` VALUES (0, 16, 0, 'Purchase a Dual Talent Specialization.', 1, 16, 0, 0, 0, 0, 10000000, 'Are you sure you wish to purchase a Dual Talent Specialization?', 15, 40, 1, 0, 0, 0, 0, 0, 0);
а скрипт, раскидовку тренерам, проверки в первом меню - это думаю оставить разработчикам базы..))

LordJZ 05.04.2010 17:46

Цитата:

Сообщение от `win (Сообщение 3865)
до 40го левела меню о дюалспеке вообще не отображается.
После 40го - появляется пункт, что то вроде "узнать подробнее о 2й специализации", после клика на которую появляется много текста с описанием и внизу пункт меню, что то вроде "да, я хочу потратить 1000г"
Если не ошибаюсь - после покупки меню больше не отображается.

После покупки gossip с текстом, на англ. это звучит как "Congratulations, your mind has been expanded." Еще со скринов помню.

Vladimir 05.04.2010 17:51

Цитата:

Сообщение от NeatElves (Сообщение 3866)
Сейчас так и реализовано..)) Но это в основе база... В ядро надо сам патч и строчку для примера, приблизительно так:

а скрипт, раскидовку тренерам, проверки в первом меню - это думаю оставить разработчикам базы..))

Так как проверку уровня не прикурутить к gossip_option_type (всмысле через скрипт или опцию) то наверное

Vladimir 10.04.2010 03:56

Патч в [9715]. Спасибо! Этот же код позволит и некоторые другие покупные варианты реализовать чистой базой. Может некоторые condition_* будут еще нужны.


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

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