Теория. Для оживления.))
Можно и скриптом, но не интересно...
Код:
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];