Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Принятые патчи

Важная информация

Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.

Повод для гордости.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.04.2010, 10:13   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
Хорошо [9715][patch] gossip для двойного спека

ревизия:
9661 и новее

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

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

зы: вынес в функцию дабы соблюдать 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);

Последний раз редактировалось Insider42; 03.04.2010 в 10:16.
Insider42 вне форума  
14 пользователя(ей) сказали cпасибо:
fedr (05.04.2010), Feel the Power (04.04.2010), ghostpast (04.04.2010), KiriX (03.04.2010), Lightunit (03.04.2010), Mayss (04.04.2010), Nordway (04.04.2010), Omg (05.04.2010), Sergey (03.04.2010), Shadez (03.04.2010), sven (03.04.2010), Vladimir (10.04.2010), YuruY (03.04.2010)
Старый 03.04.2010, 10:57   #2
Laise
MaNGOS Dev
 
Аватар для Laise
 
Регистрация: 09.03.2010
Сообщений: 33
Сказал(а) спасибо: 27
Поблагодарили 26 раз(а) в 11 сообщениях
Laise На верном пути
По умолчанию

может проверку тоже отдельно типа isCanLearnDualSpec ?
Laise вне форума  
Старый 04.04.2010, 13:24   #3
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

лучше заменить
Код:
&& !(getLevel() < 40)
на
Код:
&& (getLevel() >= 40)
В патче учитывается случай, когда у игрока не хватает голдов?
ghostpast вне форума  
Старый 04.04.2010, 14:42   #4
zhenya
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 85
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 17 сообщениях
zhenya Скоро придёт к известности
По умолчанию

Не учитывается.
zhenya вне форума  
Старый 04.04.2010, 15:14   #5
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zhenya Посмотреть сообщение
Не учитывается.
_если_ зальете запрос в базу то будет учитываться

Последний раз редактировалось Insider42; 04.04.2010 в 15:17.
Insider42 вне форума  
Старый 04.04.2010, 15:57   #6
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Тогда в запрос и кондицию вставить на 40 левел можно(15,40,1)..)
NeatElves вне форума  
Старый 04.04.2010, 16:42   #7
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от NeatElves Посмотреть сообщение
Тогда в запрос и кондицию вставить на 40 левел можно(15,40,1)..)
Тогда он будет отображаться, но при попытке нажать будет выдавать сообщение, что персонажу нехватает уровня (если перс до 40 уровня). А тут же нужно чтобы сам пункт меню не был отображен до 40 уровня.
Insider42 вне форума  
Старый 04.04.2010, 16:48   #8
timmit
YTDB Dev
 
Регистрация: 01.02.2010
Сообщений: 115
Сказал(а) спасибо: 0
Поблагодарили 36 раз(а) в 25 сообщениях
timmit На верном пути
По умолчанию

С кондицией не будет даже появлятся
timmit вне форума  
Пользователь сказал cпасибо:
Insider42 (04.04.2010)
Старый 04.04.2010, 16:55   #9
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от timmit Посмотреть сообщение
С кондицией не будет даже появлятся
Все верно, с такой кондицией, пункт меню будет виден только игрокам 40+...
NeatElves вне форума  
Старый 04.04.2010, 16:59   #10
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

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

Последний раз редактировалось ghostpast; 04.04.2010 в 17:03.
ghostpast вне форума  
3 пользователя(ей) сказали cпасибо:
ANTOMA (05.04.2010), Insider42 (04.04.2010), NeatElves (04.04.2010)
Старый 04.04.2010, 17:36   #11
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

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

Последний раз редактировалось NeatElves; 04.04.2010 в 17:40.
NeatElves вне форума  
Старый 04.04.2010, 17:42   #12
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Кстати в патче ошибка. id 16 забронирован за банком, поэтому sql не зальется. я давно пользуюсь id 51, вроде проблем не было
rsa вне форума  
Старый 04.04.2010, 17:44   #13
timmit
YTDB Dev
 
Регистрация: 01.02.2010
Сообщений: 115
Сказал(а) спасибо: 0
Поблагодарили 36 раз(а) в 25 сообщениях
timmit На верном пути
По умолчанию

Код:
+    GOSSIP_OPTION_LEARNDUALSPEC     = 18,
вы точно читали текст?
timmit вне форума  
Старый 04.04.2010, 18:14   #14
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от timmit Посмотреть сообщение
Код:
+    GOSSIP_OPTION_LEARNDUALSPEC     = 18,
вы точно читали текст?
А немножко внимательнее? 18 это option_id, а я про id
2е поле таблицы короче. к коду отношения не имеет.
rsa вне форума  
Старый 04.04.2010, 18:27   #15
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

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

Цитата:
Сообщение от rsa Посмотреть сообщение
А немножко внимательнее? 18 это option_id, а я про id
2е поле таблицы короче. к коду отношения не имеет.
у меня в YTDB 541 этот (16) ID не занят, следовательно запрос проходит.

Последний раз редактировалось Insider42; 04.04.2010 в 18:29.
Insider42 вне форума  
Старый 04.04.2010, 18:29   #16
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Цитата:
+ CastSpell(this, 63680, true, NULL, NULL, guid);
+ CastSpell(this, 63624, true, NULL, NULL, guid);
Достаточно кастовать спелл 63624 - остальное давно уже сделано в коде
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
2 пользователя(ей) сказали cпасибо:
ghostpast (04.04.2010), Insider42 (04.04.2010)
Старый 04.04.2010, 18:30   #17
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
А немножко внимательнее? 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 - ПМ...
NeatElves вне форума  
Старый 04.04.2010, 20:30   #18
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

снятия золота вроде и проверок нет пока... - но есть соотвевующеи поле...
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 04.04.2010, 22:13   #19
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Лучше добавить в кондиции что-то наподобие(состряпал навскидку, просто чтобы показать идею, не проверял):
Код:
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
 {
И будет тогда проверка первая на уровень перса, вторая - не знает ли он спелл дуалспека, если совпало - меню есть..))
Пригодится и дя других меню, наподобие инженер гном и т.п..))
NeatElves вне форума  
Пользователь сказал cпасибо:
Insider42 (04.04.2010)
Старый 04.04.2010, 22:41   #20
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

Цитата:
Сообщение от NeatElves Посмотреть сообщение
Лучше добавить в кондиции что-то наподобие(состряпал навскидку, просто чтобы показать идею, не проверял):
Код:
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

Последний раз редактировалось ghostpast; 04.04.2010 в 22:52.
ghostpast вне форума  
Старый 04.04.2010, 23:26   #21
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Как снять деньги с игрока при изучении ДС, дубль №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)
     {
весь вышенаписанный мною код можно отправлять на помойку
Проверено, снимает деньги как положено.

само обучение
Код:
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, также тут много чего ещё нехватает в базе...

Последний раз редактировалось Insider42; 04.04.2010 в 23:56.
Insider42 вне форума  
Пользователь сказал cпасибо:
Vladimir (04.04.2010)
Старый 04.04.2010, 23:58   #22
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Никто не видел что выдается при отсутствии денег на оффе?
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 05.04.2010, 06:54   #23
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Vladimir Посмотреть сообщение
Никто не видел что выдается при отсутствии денег на оффе?
Красная ошибка в центре экрана, "У вас недостаточно денег." Причем от клиента, серверу вообще данные не отправляются.
LordJZ вне форума  
Пользователь сказал cпасибо:
Vladimir (05.04.2010)
Старый 05.04.2010, 07:01   #24
GriffonHeart
Гость
 
Сообщений: n/a
По умолчанию

Цитата:
Сообщение от LordJZ Посмотреть сообщение
Красная ошибка в центре экрана, "У вас недостаточно денег." Причем от клиента, серверу вообще данные не отправляются.
Это потому что box_money = 10000000. Клиент сам проверяет, есть ли у него стока денег. Но и у сервера должна быть доп. проверка, чтобы нельзя было отослать пакет через WPE и получить дуал-спек нахаляву.
 
Старый 05.04.2010, 10:18   #25
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Тогда должно быть так...
Код:
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)
     {
Обычному игроку выдаст ошибку раз, читеру ничего не выдаст, но и читернуть не даст

Последний раз редактировалось Insider42; 05.04.2010 в 10:22.
Insider42 вне форума  
Старый 05.04.2010, 12:39   #26
GriffonHeart
Гость
 
Сообщений: n/a
По умолчанию

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

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

Последний раз редактировалось GriffonHeart; 05.04.2010 в 12:42.
 
Старый 05.04.2010, 14:59   #27
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

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

Последний раз редактировалось Insider42; 05.04.2010 в 16:34.
Insider42 вне форума  
Пользователь сказал cпасибо:
Vladimir (05.04.2010)
Старый 05.04.2010, 15:22   #28
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

может имеет смысл заменить два условия
Код:
+    if (MoneyTake > 0)
+    {
+        if (GetMoney() >= MoneyTake)
+            ModifyMoney(-int32(MoneyTake));
+        else
+            return;
+    }
одним условием?
Код:
+    if ((MoneyTake > 0) && (GetMoney() >= MoneyTake))
+        ModifyMoney(-int32(MoneyTake));
ghostpast вне форума  
Старый 05.04.2010, 15:52   #29
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Тренеров в базе поправим.. Давно пора все данные перенести в gossip_menu и отказаться вообще от npc_gossip и npc_option ) Также напоминаю, что в gossip_menu_option номера меню в разных базах разные...
Опечатка
Цитата:
// spell_id 0, 1 (0: has spell, 1: hasn't spell)

Последний раз редактировалось NeatElves; 05.04.2010 в 16:06.
NeatElves вне форума  
Пользователь сказал cпасибо:
Insider42 (05.04.2010)
Старый 05.04.2010, 16:32   #30
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от ghostpast Посмотреть сообщение
может имеет смысл заменить два условия
Код:
+    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

Последний раз редактировалось Insider42; 05.04.2010 в 16:52.
Insider42 вне форума  
Старый 05.04.2010, 16:53   #31
ghostpast
Пользователь
 
Регистрация: 07.03.2010
Сообщений: 46
Сказал(а) спасибо: 11
Поблагодарили 17 раз(а) в 11 сообщениях
ghostpast На верном пути
По умолчанию

Цитата:
Сообщение от Insider42 Посмотреть сообщение
так нельзя, в этом случае если у игрока нехватит денег, и он окажется WPE хакером - он сможет бесплатно обучиться дуал спеку. Т.к. (MoneyTake > 0) пройдёт, но (GetMoney() >= MoneyTake) нет, собственно до ModifyMoney(-int32(MoneyTake)); мы попросту не дойдём.
В вашем коде при тех же условиях ModifyMoney(-int32(MoneyTake)) тоже не выполнится (будет ответвление в сторону return)
ghostpast вне форума  
Старый 05.04.2010, 16:56   #32
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Как раз у Insider42 все правильно с проверкой
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 05.04.2010, 17:11   #33
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

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

Цитата:
В общем кидаю какие есть, заранее бэкапьте таблицу gossip_menu_option, если уж собрались тестить http://paste2.org/p/757587
помоему первое окно должно быть с проверкой уровня но без цены и только внем доджен быть пункт меню с ценой b возможно дополнительной перепроверой уровня против читинга
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 05.04.2010, 17:13   #34
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

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

Последний раз редактировалось NeatElves; 05.04.2010 в 17:17.
NeatElves вне форума  
Пользователь сказал cпасибо:
Insider42 (05.04.2010)
Старый 05.04.2010, 17:14   #35
`win
Новичок
 
Регистрация: 07.03.2010
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 5 раз(а) в 3 сообщениях
`win На верном пути
По умолчанию

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

Последний раз редактировалось `win; 05.04.2010 в 17:17.
`win вне форума  
Пользователь сказал cпасибо:
Laise (05.04.2010)
Старый 05.04.2010, 17:26   #36
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Сейчас так и реализовано..)) Но это в основе база... В ядро надо сам патч и строчку для примера, приблизительно так:
Цитата:
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);
а скрипт, раскидовку тренерам, проверки в первом меню - это думаю оставить разработчикам базы..))
NeatElves вне форума  
2 пользователя(ей) сказали cпасибо:
Vladimir (05.04.2010), YuruY (05.04.2010)
Старый 05.04.2010, 17:46   #37
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от `win Посмотреть сообщение
до 40го левела меню о дюалспеке вообще не отображается.
После 40го - появляется пункт, что то вроде "узнать подробнее о 2й специализации", после клика на которую появляется много текста с описанием и внизу пункт меню, что то вроде "да, я хочу потратить 1000г"
Если не ошибаюсь - после покупки меню больше не отображается.
После покупки gossip с текстом, на англ. это звучит как "Congratulations, your mind has been expanded." Еще со скринов помню.
LordJZ вне форума  
Пользователь сказал cпасибо:
NeatElves (05.04.2010)
Старый 05.04.2010, 17:51   #38
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

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

а скрипт, раскидовку тренерам, проверки в первом меню - это думаю оставить разработчикам базы..))
Так как проверку уровня не прикурутить к gossip_option_type (всмысле через скрипт или опцию) то наверное
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 10.04.2010, 03:56   #39
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

Патч в [9715]. Спасибо! Этот же код позволит и некоторые другие покупные варианты реализовать чистой базой. Может некоторые condition_* будут еще нужны.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
3 пользователя(ей) сказали cпасибо:
Insider42 (10.04.2010), lordinpvp (11.04.2010), Mayss (11.04.2010)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10704] Add the option to close gossip window in gossip system newsbot CMaNGOS Commits 0 09.11.2010 00:22
Локализация Gossip. xmolex Запросы 9 14.05.2010 06:39
[9715] Implement required basic elements for dual spec learn gossips. newsbot CMaNGOS Commits 0 10.04.2010 02:11


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot