Ru-MaNGOS

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

NeatElves 24.03.2013 00:58

[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];


schmoozerd 24.03.2013 20:11

Did you test both command and condition?
And wasn't there an issue about saving these extra flags?

NeatElves 24.03.2013 20:15

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);

Я не уверен, что подход правильный, а так вроде работает.))

schmoozerd 25.03.2013 23:26

In [12420] - Thank you :)


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

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