Ru-MaNGOS

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

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

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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.03.2013, 00:58   #1
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию [patch] PLAYER_FLAGS_XP_USER_DISABLED

Теория. Для оживления.))
Можно и скриптом, но не интересно...
Ввел кондицию и скрипткоманду.
Код:
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index c14e791..75617d4 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -267,12 +267,18 @@ Where "A  ->  B" means that the command is executed from A with B as target.
 29 SCRIPT_COMMAND_MODIFY_NPC_FLAGS          resultingSource = Creature
                                             * datalong=NPCFlags
                                             * datalong2= 0x00=toggle, 0x01=add, 0x02=remove
+
 30 SCRIPT_COMMAND_SEND_TAXI_PATH            resultingTarget or Source must be Player
                                             * datalong = taxi path id
+
 31 SCRIPT_COMMAND_TERMINATE_SCRIPT          * datalong = search for npc entry if provided
                                             * datalong2= search distance
                                             * !(data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL): if npc not alive found, terminate script
                                                 data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL:  if npc alive found, terminate script
                                             * dataint  = change of waittime (MILLIESECONDS) of a current waypoint movement type (negative values will decrease time)
+
 32 SCRIPT_COMMAND_PAUSE_WAYPOINTS           resultingSource must be Creature
                                             * datalong: 0/1 unpause/pause waypoint movement
+
+33 SCRIPT_COMMAND_XP_USER                   source or target with Player
+                                            * datalong=bool 0=off, 1=on
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 4e6b2c9..0584beb 100755
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -7900,6 +7900,15 @@ bool PlayerCondition::Meets(Player const* player, Map const* map, WorldObject co
             }
             return false;
         }
+        case CONDITION_XP_USER:
+        {
+            switch (m_value1)
+            {
+                case 0: return player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED);
+                case 1: return !player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED);
+            }
+            return false;
+        }
         default:
             return false;
     }
@@ -8299,6 +8308,19 @@ bool PlayerCondition::IsValid(uint16 entry, ConditionType condition, uint32 valu
             }
             break;
         }
+        case CONDITION_XP_USER:
+        {
+            if (value1 > 1)
+            {
+                sLog.outErrorDb("XP user condition (entry %u, type %u) has invalid argument %u (must be 0..1), skipped", entry, condition, value1);
+                return false;
+            }
+
+            if (value2)
+                sLog.outErrorDb("XP user condition (entry %u, type %u) has useless data in value2 (%u)!", entry, condition, value2);
+
+            break;
+        }
         case CONDITION_NONE:
             break;
         default:
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 8ebf3ae..bb2783f 100755
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -391,6 +391,8 @@ enum ConditionType
     CONDITION_COMPLETED_ENCOUNTER   = 31,                   // encounter_id encounter_id2       encounter_id[2] = DungeonEncounter(dbc).id (if value2 provided it will return value1 OR value2)
     CONDITION_SOURCE_AURA           = 32,                   // spell_id     effindex (returns true if the source of the condition check has aura of spell_id, effIndex)
     CONDITION_LAST_WAYPOINT         = 33,                   // waypointId   0 = exact, 1: wp <= waypointId, 2: wp > waypointId  Use to check what waypoint was last reached
+    CONDITION_XP_USER               = 34,                   // 0, 1 (0: XP off, 1: XP on) for player    0
+
 };
 
 enum ConditionSource                                        // From where was the condition called?
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 381539d..5b17792 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -2441,6 +2441,9 @@ void Player::GiveXP(uint32 xp, Unit* victim)
     if (!isAlive())
         return;
 
+    if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED))
+        return;
+
     uint32 level = getLevel();
 
     // XP to money conversion processed in Player::RewardQuest
diff --git a/src/game/ScriptMgr.cpp b/src/game/ScriptMgr.cpp
index 95c5cf5..2e1de9e 100644
--- a/src/game/ScriptMgr.cpp
+++ b/src/game/ScriptMgr.cpp
@@ -634,6 +634,8 @@ void ScriptMgr::LoadScripts(ScriptMapMapName& scripts, const char* tablename)
             }
             case SCRIPT_COMMAND_PAUSE_WAYPOINTS:            // 32
                 break;
+            case SCRIPT_COMMAND_XP_USER:                    // 33
+                break;
             default:
             {
                 sLog.outErrorDb("Table `%s` unknown command %u, skipping.", tablename, tmp.command);
@@ -1681,6 +1683,18 @@ bool ScriptAction::HandleScriptStep()
                 ((Creature*)pSource)->clearUnitState(UNIT_STAT_WAYPOINT_PAUSED);
             break;
         }
+        case SCRIPT_COMMAND_XP_USER:                        // 33
+        {
+            Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget);
+            if (!pPlayer)
+                break;
+
+            if (m_script->xpDisabled.flags)
+                pPlayer->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED);
+            else
+                pPlayer->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED);
+            break;
+        }
         default:
             sLog.outError(" DB-SCRIPTS: Process table `%s` id %u, command %u unknown command used.", m_table, m_script->id, m_script->command);
             break;
diff --git a/src/game/ScriptMgr.h b/src/game/ScriptMgr.h
index f50d80c..7ce2d6f 100644
--- a/src/game/ScriptMgr.h
+++ b/src/game/ScriptMgr.h
@@ -98,6 +98,8 @@ enum ScriptCommand                                          // resSource, resTar
                                                             // dataint=diff to change a waittime of current Waypoint Movement
     SCRIPT_COMMAND_PAUSE_WAYPOINTS          = 32,           // resSource = Creature
                                                             // datalong = 0: unpause waypoint 1: pause waypoint
+    SCRIPT_COMMAND_XP_USER                  = 33,           // source or target with Player, datalong = bool (0=off, 1=on)
+
 };
 
 #define MAX_TEXT_ID 4                                       // used for SCRIPT_COMMAND_TALK
@@ -313,6 +315,12 @@ struct ScriptInfo
             uint32 empty;
         } pauseWaypoint;
 
+        struct                                              // SCRIPT_COMMAND_XP_USER (33)
+        {
+            uint32 flags;                                   // datalong
+            uint32 empty;                                   // datalong2
+        } xpDisabled;
+
         struct
         {
             uint32 data[2];
NeatElves вне форума  
Старый 24.03.2013, 20:11   #2
schmoozerd
MaNGOS Dev
 
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
schmoozerd Скоро придёт к известности
По умолчанию

Did you test both command and condition?
And wasn't there an issue about saving these extra flags?
schmoozerd вне форума  
Старый 24.03.2013, 20:15   #3
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Checked and compiled in the game is running, the output from the world of player status preserves (do not know how they work and whether all checks for data monitoring)

for database(YTDB)
Код:
INSERT INTO `conditions` (`condition_entry`, `type`, `value1`, `value2`) VALUES ('2073', '34', '1', '0'), ('2074', '34', '0', '0');
REPLACE INTO `locales_gossip_menu_option` (`menu_id`, `id`, `option_text_loc1`, `option_text_loc2`, `option_text_loc3`, `option_text_loc4`, `option_text_loc5`, `option_text_loc6`, `option_text_loc7`, `option_text_loc8`, `box_text_loc1`, `box_text_loc2`, `box_text_loc3`, `box_text_loc4`, `box_text_loc5`, `box_text_loc6`, `box_text_loc7`, `box_text_loc8`) VALUES
(10638, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Я больше не хочу получать опыт.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Вы уверены, что хотите отказаться от получения опыта?'),
(10638, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Я хочу снова начать получать опыт.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'Вы уверены, что хотите снова получать опыт?');
DELETE FROM `dbscripts_on_gossip` WHERE `id` in (101,10638);
INSERT INTO `dbscripts_on_gossip` (`id`, `delay`, `command`, `datalong`, `datalong2`, `buddy_entry`, `search_radius`, `data_flags`, `dataint`, `dataint2`, `dataint3`, `dataint4`, `x`, `y`, `z`, `o`, `comments`) VALUES
('10638', '0', '33', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'stop XP USER'),
('101', '0', '33', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 'start XP USER');
REPLACE INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `action_script_id`, `box_coded`, `box_money`, `box_text`, `condition_id`) VALUES
(10638, 0, 16, 'I no longer wish to gain experience.', 1, 1, -1, 0, 10638, 0, 100000, 'Are you certain you wish to stop gaining experience?', 2073),
(10638, 1, 16, 'I wish to start gaining experience again.', 1, 1, -1, 0, 101, 0, 100000, 'Are you certain you wish to see again experience?', 2074);
Я не уверен, что подход правильный, а так вроде работает.))

Последний раз редактировалось NeatElves; 24.03.2013 в 20:24.
NeatElves вне форума  
Старый 25.03.2013, 23:26   #4
schmoozerd
MaNGOS Dev
 
Регистрация: 17.11.2011
Сообщений: 99
Сказал(а) спасибо: 35
Поблагодарили 80 раз(а) в 26 сообщениях
schmoozerd Скоро придёт к известности
По умолчанию

In [12420] - Thank you
schmoozerd вне форума  
 


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

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



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


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