*Update to Mangos 7092.
--HG-- branch : trunk
This commit is contained in:
@@ -218,11 +218,19 @@ CREATE TABLE `spell_proc_event` (
|
|||||||
PRIMARY KEY (`entry`)
|
PRIMARY KEY (`entry`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `player_xp_for_level`;
|
||||||
|
CREATE TABLE `player_xp_for_level` (
|
||||||
|
`lvl` int(3) unsigned NOT NULL,
|
||||||
|
`xp_for_next_level` int(10) unsigned NOT NULL,
|
||||||
|
PRIMARY KEY (`lvl`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
INSERT INTO world.player_classlevelstats SELECT * FROM mangos.player_classlevelstats;
|
INSERT INTO world.player_classlevelstats SELECT * FROM mangos.player_classlevelstats;
|
||||||
INSERT INTO world.player_levelstats SELECT * FROM mangos.player_levelstats;
|
INSERT INTO world.player_levelstats SELECT * FROM mangos.player_levelstats;
|
||||||
INSERT INTO world.playercreateinfo_spell SELECT * FROM mangos.playercreateinfo_spell;
|
INSERT INTO world.playercreateinfo_spell SELECT * FROM mangos.playercreateinfo_spell;
|
||||||
INSERT INTO world.playercreateinfo_action SELECT * FROM mangos.playercreateinfo_action;
|
INSERT INTO world.playercreateinfo_action SELECT * FROM mangos.playercreateinfo_action;
|
||||||
INSERT INTO world.spell_learn_spell SELECT * FROM mangos.spell_learn_spell;
|
INSERT INTO world.spell_learn_spell SELECT * FROM mangos.spell_learn_spell;
|
||||||
|
INSERT INTO world.player_xp_for_level SELECT * FROM mangos.player_xp_for_level;
|
||||||
|
|
||||||
|
|
||||||
DELETE FROM item_template WHERE entry IN (34648,34649,34650,34651,34652,34653,34655,34656,34657,34658,34659,38145,38147,41751);
|
DELETE FROM item_template WHERE entry IN (34648,34649,34650,34651,34652,34653,34655,34656,34657,34658,34659,38145,38147,41751);
|
||||||
|
|||||||
+100
-1
@@ -22,7 +22,7 @@
|
|||||||
DROP TABLE IF EXISTS `db_version`;
|
DROP TABLE IF EXISTS `db_version`;
|
||||||
CREATE TABLE `db_version` (
|
CREATE TABLE `db_version` (
|
||||||
`version` varchar(120) default NULL,
|
`version` varchar(120) default NULL,
|
||||||
`required_7078_01_mangos_spell_proc_event` bit(1) default NULL
|
`required_7092_01_mangos_player_xp_for_level` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
|
||||||
|
|
||||||
--
|
--
|
||||||
@@ -9291,6 +9291,105 @@ INSERT INTO `player_levelstats` VALUES
|
|||||||
/*!40000 ALTER TABLE `player_levelstats` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `player_levelstats` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for player_xp_for_level
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `player_xp_for_level`;
|
||||||
|
CREATE TABLE `player_xp_for_level` (
|
||||||
|
`lvl` int(3) unsigned NOT NULL,
|
||||||
|
`xp_for_next_level` int(10) unsigned NOT NULL,
|
||||||
|
PRIMARY KEY (`lvl`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Dumping data for table `player_xp_for_level`
|
||||||
|
--
|
||||||
|
|
||||||
|
LOCK TABLES `player_xp_for_level` WRITE;
|
||||||
|
/*!40000 ALTER TABLE `player_xp_for_level` DISABLE KEYS */;
|
||||||
|
INSERT INTO `player_xp_for_level` VALUES
|
||||||
|
('1', '400'),
|
||||||
|
('2', '900'),
|
||||||
|
('3', '1400'),
|
||||||
|
('4', '2100'),
|
||||||
|
('5', '2800'),
|
||||||
|
('6', '3600'),
|
||||||
|
('7', '4500'),
|
||||||
|
('8', '5400'),
|
||||||
|
('9', '6500'),
|
||||||
|
('10', '7600'),
|
||||||
|
('11', '8700'),
|
||||||
|
('12', '9800'),
|
||||||
|
('13', '11000'),
|
||||||
|
('14', '12300'),
|
||||||
|
('15', '13600'),
|
||||||
|
('16', '15000'),
|
||||||
|
('17', '16400'),
|
||||||
|
('18', '17800'),
|
||||||
|
('19', '19300'),
|
||||||
|
('20', '20800'),
|
||||||
|
('21', '22400'),
|
||||||
|
('22', '24000'),
|
||||||
|
('23', '25500'),
|
||||||
|
('24', '27200'),
|
||||||
|
('25', '28900'),
|
||||||
|
('26', '30500'),
|
||||||
|
('27', '32200'),
|
||||||
|
('28', '33900'),
|
||||||
|
('29', '36300'),
|
||||||
|
('30', '38800'),
|
||||||
|
('31', '41600'),
|
||||||
|
('32', '44600'),
|
||||||
|
('33', '48000'),
|
||||||
|
('34', '51400'),
|
||||||
|
('35', '55000'),
|
||||||
|
('36', '58700'),
|
||||||
|
('37', '62400'),
|
||||||
|
('38', '66200'),
|
||||||
|
('39', '70200'),
|
||||||
|
('40', '74300'),
|
||||||
|
('41', '78500'),
|
||||||
|
('42', '82800'),
|
||||||
|
('43', '87100'),
|
||||||
|
('44', '91600'),
|
||||||
|
('45', '96300'),
|
||||||
|
('46', '101000'),
|
||||||
|
('47', '105800'),
|
||||||
|
('48', '110700'),
|
||||||
|
('49', '115700'),
|
||||||
|
('50', '120900'),
|
||||||
|
('51', '126100'),
|
||||||
|
('52', '131500'),
|
||||||
|
('53', '137000'),
|
||||||
|
('54', '142500'),
|
||||||
|
('55', '148200'),
|
||||||
|
('56', '154000'),
|
||||||
|
('57', '159900'),
|
||||||
|
('58', '165800'),
|
||||||
|
('59', '172000'),
|
||||||
|
('60', '290000'),
|
||||||
|
('61', '317000'),
|
||||||
|
('62', '349000'),
|
||||||
|
('63', '386000'),
|
||||||
|
('64', '428000'),
|
||||||
|
('65', '475000'),
|
||||||
|
('66', '527000'),
|
||||||
|
('67', '585000'),
|
||||||
|
('68', '648000'),
|
||||||
|
('69', '717000'),
|
||||||
|
('70', '1523800'),
|
||||||
|
('71', '1539600'),
|
||||||
|
('72', '1555700'),
|
||||||
|
('73', '1571800'),
|
||||||
|
('74', '1587900'),
|
||||||
|
('75', '1604200'),
|
||||||
|
('76', '1620700'),
|
||||||
|
('77', '1637400'),
|
||||||
|
('78', '1653900'),
|
||||||
|
('79', '1670800');
|
||||||
|
/*!40000 ALTER TABLE `player_xp_for_level` ENABLE KEYS */;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `playercreateinfo`
|
-- Table structure for table `playercreateinfo`
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
ALTER TABLE db_version CHANGE COLUMN required_7078_01_mangos_spell_proc_event required_7092_01_mangos_player_xp_for_level bit;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `player_xp_for_level`;
|
||||||
|
CREATE TABLE `player_xp_for_level` (
|
||||||
|
`lvl` int(3) unsigned NOT NULL,
|
||||||
|
`xp_for_next_level` int(10) unsigned NOT NULL,
|
||||||
|
PRIMARY KEY (`lvl`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Dumping data for table `player_xp_for_level`
|
||||||
|
--
|
||||||
|
|
||||||
|
INSERT INTO `player_xp_for_level` VALUES
|
||||||
|
('1', '400'),
|
||||||
|
('2', '900'),
|
||||||
|
('3', '1400'),
|
||||||
|
('4', '2100'),
|
||||||
|
('5', '2800'),
|
||||||
|
('6', '3600'),
|
||||||
|
('7', '4500'),
|
||||||
|
('8', '5400'),
|
||||||
|
('9', '6500'),
|
||||||
|
('10', '7600'),
|
||||||
|
('11', '8700'),
|
||||||
|
('12', '9800'),
|
||||||
|
('13', '11000'),
|
||||||
|
('14', '12300'),
|
||||||
|
('15', '13600'),
|
||||||
|
('16', '15000'),
|
||||||
|
('17', '16400'),
|
||||||
|
('18', '17800'),
|
||||||
|
('19', '19300'),
|
||||||
|
('20', '20800'),
|
||||||
|
('21', '22400'),
|
||||||
|
('22', '24000'),
|
||||||
|
('23', '25500'),
|
||||||
|
('24', '27200'),
|
||||||
|
('25', '28900'),
|
||||||
|
('26', '30500'),
|
||||||
|
('27', '32200'),
|
||||||
|
('28', '33900'),
|
||||||
|
('29', '36300'),
|
||||||
|
('30', '38800'),
|
||||||
|
('31', '41600'),
|
||||||
|
('32', '44600'),
|
||||||
|
('33', '48000'),
|
||||||
|
('34', '51400'),
|
||||||
|
('35', '55000'),
|
||||||
|
('36', '58700'),
|
||||||
|
('37', '62400'),
|
||||||
|
('38', '66200'),
|
||||||
|
('39', '70200'),
|
||||||
|
('40', '74300'),
|
||||||
|
('41', '78500'),
|
||||||
|
('42', '82800'),
|
||||||
|
('43', '87100'),
|
||||||
|
('44', '91600'),
|
||||||
|
('45', '96300'),
|
||||||
|
('46', '101000'),
|
||||||
|
('47', '105800'),
|
||||||
|
('48', '110700'),
|
||||||
|
('49', '115700'),
|
||||||
|
('50', '120900'),
|
||||||
|
('51', '126100'),
|
||||||
|
('52', '131500'),
|
||||||
|
('53', '137000'),
|
||||||
|
('54', '142500'),
|
||||||
|
('55', '148200'),
|
||||||
|
('56', '154000'),
|
||||||
|
('57', '159900'),
|
||||||
|
('58', '165800'),
|
||||||
|
('59', '172000'),
|
||||||
|
('60', '290000'),
|
||||||
|
('61', '317000'),
|
||||||
|
('62', '349000'),
|
||||||
|
('63', '386000'),
|
||||||
|
('64', '428000'),
|
||||||
|
('65', '475000'),
|
||||||
|
('66', '527000'),
|
||||||
|
('67', '585000'),
|
||||||
|
('68', '648000'),
|
||||||
|
('69', '717000'),
|
||||||
|
('70', '1523800'),
|
||||||
|
('71', '1539600'),
|
||||||
|
('72', '1555700'),
|
||||||
|
('73', '1571800'),
|
||||||
|
('74', '1587900'),
|
||||||
|
('75', '1604200'),
|
||||||
|
('76', '1620700'),
|
||||||
|
('77', '1637400'),
|
||||||
|
('78', '1653900'),
|
||||||
|
('79', '1670800');
|
||||||
@@ -118,66 +118,6 @@ namespace Trinity
|
|||||||
return (uint32)(xp_gain*sWorld.getRate(RATE_XP_KILL));
|
return (uint32)(xp_gain*sWorld.getRate(RATE_XP_KILL));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint32 xp_Diff(uint32 lvl)
|
|
||||||
{
|
|
||||||
if( lvl < 29 )
|
|
||||||
return 0;
|
|
||||||
if( lvl == 29 )
|
|
||||||
return 1;
|
|
||||||
if( lvl == 30 )
|
|
||||||
return 3;
|
|
||||||
if( lvl == 31 )
|
|
||||||
return 6;
|
|
||||||
else
|
|
||||||
return (5*(lvl-30));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint32 mxp(uint32 lvl)
|
|
||||||
{
|
|
||||||
if (lvl < 60)
|
|
||||||
{
|
|
||||||
return (45 + (5*lvl));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return (235 + (5*lvl));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline uint32 xp_to_level(uint32 lvl)
|
|
||||||
{
|
|
||||||
uint32 xp = 0;
|
|
||||||
if (lvl < 60)
|
|
||||||
{
|
|
||||||
xp = (8*lvl + xp_Diff(lvl)) * mxp(lvl);
|
|
||||||
}
|
|
||||||
else if (lvl == 60)
|
|
||||||
{
|
|
||||||
xp = (155 + mxp(lvl) * (1344 - 70 - ((69 - lvl) * (7 + (69 - lvl) * 8 - 1)/2)));
|
|
||||||
}
|
|
||||||
else if (lvl < 70)
|
|
||||||
{
|
|
||||||
xp = (155 + mxp(lvl) * (1344 - ((69-lvl) * (7 + (69 - lvl) * 8 - 1)/2)));
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
// level higher than 70 is not supported
|
|
||||||
xp = (uint32)(779700 * (pow(sWorld.getRate(RATE_XP_PAST_70), (int32)lvl - 69)));
|
|
||||||
return ((xp < 0x7fffffff) ? xp : 0x7fffffff);
|
|
||||||
}
|
|
||||||
|
|
||||||
// The XP to Level is always rounded to the nearest 100 points (50 rounded to high).
|
|
||||||
xp = ((xp + 50) / 100) * 100; // use additional () for prevent free association operations in C++
|
|
||||||
|
|
||||||
if ((lvl > 10) && (lvl < 60)) // compute discount added in 2.3.x
|
|
||||||
{
|
|
||||||
uint32 discount = (lvl < 28) ? (lvl - 10) : 18;
|
|
||||||
xp = (xp * (100 - discount)) / 100; // apply discount
|
|
||||||
xp = (xp / 100) * 100; // floor to hundreds
|
|
||||||
}
|
|
||||||
|
|
||||||
return xp;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float xp_in_group_rate(uint32 count, bool isRaid)
|
inline float xp_in_group_rate(uint32 count, bool isRaid)
|
||||||
{
|
{
|
||||||
if(isRaid)
|
if(isRaid)
|
||||||
|
|||||||
@@ -1114,10 +1114,6 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recv_data)
|
|||||||
CHECK_PACKET_SIZE(recv_data,8*4);
|
CHECK_PACKET_SIZE(recv_data,8*4);
|
||||||
|
|
||||||
uint64 guids[4];
|
uint64 guids[4];
|
||||||
uint32 GemEnchants[3], OldEnchants[3];
|
|
||||||
Item *Gems[3];
|
|
||||||
bool SocketBonusActivated, SocketBonusToBeActivated;
|
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++)
|
for(int i = 0; i < 4; i++)
|
||||||
recv_data >> guids[i];
|
recv_data >> guids[i];
|
||||||
|
|
||||||
@@ -1135,6 +1131,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recv_data)
|
|||||||
//this slot is excepted when applying / removing meta gem bonus
|
//this slot is excepted when applying / removing meta gem bonus
|
||||||
uint8 slot = itemTarget->IsEquipped() ? itemTarget->GetSlot() : NULL_SLOT;
|
uint8 slot = itemTarget->IsEquipped() ? itemTarget->GetSlot() : NULL_SLOT;
|
||||||
|
|
||||||
|
Item *Gems[3];
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < 3; i++)
|
||||||
Gems[i] = guids[i + 1] ? _player->GetItemByGuid(guids[i + 1]) : NULL;
|
Gems[i] = guids[i + 1] ? _player->GetItemByGuid(guids[i + 1]) : NULL;
|
||||||
|
|
||||||
@@ -1154,6 +1151,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recv_data)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 GemEnchants[3], OldEnchants[3];
|
||||||
for(int i = 0; i < 3; ++i) //get new and old enchantments
|
for(int i = 0; i < 3; ++i) //get new and old enchantments
|
||||||
{
|
{
|
||||||
GemEnchants[i] = (GemProps[i]) ? GemProps[i]->spellitemenchantement : 0;
|
GemEnchants[i] = (GemProps[i]) ? GemProps[i]->spellitemenchantement : 0;
|
||||||
@@ -1202,7 +1200,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recv_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SocketBonusActivated = itemTarget->GemsFitSockets(); //save state of socketbonus
|
bool SocketBonusActivated = itemTarget->GemsFitSockets(); //save state of socketbonus
|
||||||
_player->ToggleMetaGemsActive(slot, false); //turn off all metagems (except for the target item)
|
_player->ToggleMetaGemsActive(slot, false); //turn off all metagems (except for the target item)
|
||||||
|
|
||||||
//if a meta gem is being equipped, all information has to be written to the item before testing if the conditions for the gem are met
|
//if a meta gem is being equipped, all information has to be written to the item before testing if the conditions for the gem are met
|
||||||
@@ -1224,7 +1222,7 @@ void WorldSession::HandleSocketOpcode(WorldPacket& recv_data)
|
|||||||
for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
|
for(uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+3; ++enchant_slot)
|
||||||
_player->ApplyEnchantment(itemTarget,EnchantmentSlot(enchant_slot),true);
|
_player->ApplyEnchantment(itemTarget,EnchantmentSlot(enchant_slot),true);
|
||||||
|
|
||||||
SocketBonusToBeActivated = itemTarget->GemsFitSockets();//current socketbonus state
|
bool SocketBonusToBeActivated = itemTarget->GemsFitSockets();//current socketbonus state
|
||||||
if(SocketBonusActivated ^ SocketBonusToBeActivated) //if there was a change...
|
if(SocketBonusActivated ^ SocketBonusToBeActivated) //if there was a change...
|
||||||
{
|
{
|
||||||
_player->ApplyEnchantment(itemTarget,BONUS_ENCHANTMENT_SLOT,false);
|
_player->ApplyEnchantment(itemTarget,BONUS_ENCHANTMENT_SLOT,false);
|
||||||
|
|||||||
+8
-10
@@ -2043,14 +2043,14 @@ bool ChatHandler::HandleModifyMoneyCommand(const char* args)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Edit Player field
|
//Edit Unit field
|
||||||
bool ChatHandler::HandleModifyBitCommand(const char* args)
|
bool ChatHandler::HandleModifyBitCommand(const char* args)
|
||||||
{
|
{
|
||||||
if( !*args )
|
if( !*args )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Player *chr = getSelectedPlayer();
|
Unit *unit = this->getSelectedUnit();
|
||||||
if (chr == NULL)
|
if (!unit)
|
||||||
{
|
{
|
||||||
SendSysMessage(LANG_NO_CHAR_SELECTED);
|
SendSysMessage(LANG_NO_CHAR_SELECTED);
|
||||||
SetSentErrorMessage(true);
|
SetSentErrorMessage(true);
|
||||||
@@ -2058,7 +2058,7 @@ bool ChatHandler::HandleModifyBitCommand(const char* args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check online security
|
// check online security
|
||||||
if (HasLowerSecurity(chr, 0))
|
if (unit->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player *)unit, 0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char* pField = strtok((char*)args, " ");
|
char* pField = strtok((char*)args, " ");
|
||||||
@@ -2072,13 +2072,12 @@ bool ChatHandler::HandleModifyBitCommand(const char* args)
|
|||||||
uint16 field = atoi(pField);
|
uint16 field = atoi(pField);
|
||||||
uint32 bit = atoi(pBit);
|
uint32 bit = atoi(pBit);
|
||||||
|
|
||||||
if (field < 1 || field >= PLAYER_END)
|
if (field < OBJECT_END || field >= unit->GetValuesCount())
|
||||||
{
|
{
|
||||||
SendSysMessage(LANG_BAD_VALUE);
|
SendSysMessage(LANG_BAD_VALUE);
|
||||||
SetSentErrorMessage(true);
|
SetSentErrorMessage(true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bit < 1 || bit > 32)
|
if (bit < 1 || bit > 32)
|
||||||
{
|
{
|
||||||
SendSysMessage(LANG_BAD_VALUE);
|
SendSysMessage(LANG_BAD_VALUE);
|
||||||
@@ -2086,17 +2085,16 @@ bool ChatHandler::HandleModifyBitCommand(const char* args)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( chr->HasFlag( field, (1<<(bit-1)) ) )
|
if ( unit->HasFlag( field, (1<<(bit-1)) ) )
|
||||||
{
|
{
|
||||||
chr->RemoveFlag( field, (1<<(bit-1)) );
|
unit->RemoveFlag( field, (1<<(bit-1)) );
|
||||||
PSendSysMessage(LANG_REMOVE_BIT, bit, field);
|
PSendSysMessage(LANG_REMOVE_BIT, bit, field);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
chr->SetFlag( field, (1<<(bit-1)) );
|
unit->SetFlag( field, (1<<(bit-1)) );
|
||||||
PSendSysMessage(LANG_SET_BIT, bit, field);
|
PSendSysMessage(LANG_SET_BIT, bit, field);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+69
-1
@@ -1695,7 +1695,7 @@ void ObjectMgr::LoadItemPrototypes()
|
|||||||
{
|
{
|
||||||
if(proto->Class != dbcitem->Class)
|
if(proto->Class != dbcitem->Class)
|
||||||
{
|
{
|
||||||
sLog.outErrorDb("Item (Entry: %u) not correct ñlass %u, must be %u (still using DB value).",i,proto->Class,dbcitem->Class);
|
sLog.outErrorDb("Item (Entry: %u) not correct class %u, must be %u (still using DB value).",i,proto->Class,dbcitem->Class);
|
||||||
// It safe let use Class from DB
|
// It safe let use Class from DB
|
||||||
}
|
}
|
||||||
/* disabled: have some strange wrong cases for Subclass values.
|
/* disabled: have some strange wrong cases for Subclass values.
|
||||||
@@ -2658,6 +2658,67 @@ void ObjectMgr::LoadPlayerInfo()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Loading xp per level data
|
||||||
|
{
|
||||||
|
mPlayerXPperLevel.resize(sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
|
||||||
|
for (uint32 level = 0; level < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
|
||||||
|
mPlayerXPperLevel[level] = 0;
|
||||||
|
|
||||||
|
// 0 1
|
||||||
|
QueryResult *result = WorldDatabase.Query("SELECT lvl, xp_for_next_level FROM player_xp_for_level");
|
||||||
|
|
||||||
|
uint32 count = 0;
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
barGoLink bar( 1 );
|
||||||
|
|
||||||
|
sLog.outString();
|
||||||
|
sLog.outString( ">> Loaded %u xp for level definitions", count );
|
||||||
|
sLog.outErrorDb( "Error loading `player_xp_for_level` table or empty table.");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
barGoLink bar( result->GetRowCount() );
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Field* fields = result->Fetch();
|
||||||
|
|
||||||
|
uint32 current_level = fields[0].GetUInt32();
|
||||||
|
uint32 current_xp = fields[1].GetUInt32();
|
||||||
|
|
||||||
|
if(current_level >= sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
|
||||||
|
{
|
||||||
|
if(current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
|
||||||
|
sLog.outErrorDb("Wrong (> %u) level %u in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL,current_level);
|
||||||
|
else
|
||||||
|
sLog.outDetail("Unused (> MaxPlayerLevel in mangosd.conf) level %u in `player_xp_for_levels` table, ignoring.",current_level);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//PlayerXPperLevel
|
||||||
|
mPlayerXPperLevel[current_level] = current_xp;
|
||||||
|
bar.step();
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
while (result->NextRow());
|
||||||
|
|
||||||
|
delete result;
|
||||||
|
|
||||||
|
sLog.outString();
|
||||||
|
sLog.outString( ">> Loaded %u xp for level definitions", count );
|
||||||
|
}
|
||||||
|
|
||||||
|
// fill level gaps
|
||||||
|
for (uint32 level = 1; level < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
|
||||||
|
{
|
||||||
|
if( mPlayerXPperLevel[level] == 0)
|
||||||
|
{
|
||||||
|
sLog.outErrorDb("Level %i does not have XP for level data. Using data of level [%i] + 100.",level+1, level);
|
||||||
|
mPlayerXPperLevel[level] = mPlayerXPperLevel[level-1]+100;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint32 level, PlayerClassLevelInfo* info) const
|
void ObjectMgr::GetPlayerClassLevelInfo(uint32 class_, uint32 level, PlayerClassLevelInfo* info) const
|
||||||
@@ -5885,6 +5946,13 @@ uint32 ObjectMgr::GetBaseXP(uint32 level)
|
|||||||
return mBaseXPTable[level] ? mBaseXPTable[level] : 0;
|
return mBaseXPTable[level] ? mBaseXPTable[level] : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 ObjectMgr::GetXPForLevel(uint32 level)
|
||||||
|
{
|
||||||
|
if (level < mPlayerXPperLevel.size())
|
||||||
|
return mPlayerXPperLevel[level];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void ObjectMgr::LoadPetNames()
|
void ObjectMgr::LoadPetNames()
|
||||||
{
|
{
|
||||||
uint32 count = 0;
|
uint32 count = 0;
|
||||||
|
|||||||
@@ -598,6 +598,7 @@ class ObjectMgr
|
|||||||
|
|
||||||
std::string GeneratePetName(uint32 entry);
|
std::string GeneratePetName(uint32 entry);
|
||||||
uint32 GetBaseXP(uint32 level);
|
uint32 GetBaseXP(uint32 level);
|
||||||
|
uint32 GetXPForLevel(uint32 level);
|
||||||
|
|
||||||
int32 GetFishingBaseSkillLevel(uint32 entry) const
|
int32 GetFishingBaseSkillLevel(uint32 entry) const
|
||||||
{
|
{
|
||||||
@@ -903,6 +904,9 @@ class ObjectMgr
|
|||||||
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo* plinfo) const;
|
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo* plinfo) const;
|
||||||
PlayerInfo playerInfo[MAX_RACES][MAX_CLASSES];
|
PlayerInfo playerInfo[MAX_RACES][MAX_CLASSES];
|
||||||
|
|
||||||
|
typedef std::vector<uint32> PlayerXPperLevel; // [level]
|
||||||
|
PlayerXPperLevel mPlayerXPperLevel;
|
||||||
|
|
||||||
typedef std::map<uint32,uint32> BaseXPMap; // [area level][base xp]
|
typedef std::map<uint32,uint32> BaseXPMap; // [area level][base xp]
|
||||||
BaseXPMap mBaseXPTable;
|
BaseXPMap mBaseXPTable;
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -709,7 +709,7 @@ void Pet::GivePetXP(uint32 xp)
|
|||||||
newXP -= nextLvlXP;
|
newXP -= nextLvlXP;
|
||||||
|
|
||||||
SetLevel( level + 1 );
|
SetLevel( level + 1 );
|
||||||
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(level+1))/4));
|
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(level+1)/4);
|
||||||
|
|
||||||
level = getLevel();
|
level = getLevel();
|
||||||
nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP);
|
nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP);
|
||||||
@@ -772,7 +772,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
|
|||||||
setPowerType(POWER_FOCUS);
|
setPowerType(POWER_FOCUS);
|
||||||
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, 0);
|
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, 0);
|
||||||
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
|
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
|
||||||
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(creature->getLevel()))/4));
|
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(creature->getLevel())/4);
|
||||||
SetUInt32Value(UNIT_NPC_FLAGS, 0);
|
SetUInt32Value(UNIT_NPC_FLAGS, 0);
|
||||||
|
|
||||||
CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(creature->GetCreatureInfo()->family);
|
CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(creature->GetCreatureInfo()->family);
|
||||||
@@ -915,7 +915,7 @@ bool Pet::InitStatsForLevel(uint32 petlevel)
|
|||||||
}
|
}
|
||||||
case HUNTER_PET:
|
case HUNTER_PET:
|
||||||
{
|
{
|
||||||
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(petlevel))/4));
|
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(petlevel)/4);
|
||||||
learnLevelupSpells();
|
learnLevelupSpells();
|
||||||
//these formula may not be correct; however, it is designed to be close to what it should be
|
//these formula may not be correct; however, it is designed to be close to what it should be
|
||||||
//this makes dps 0.5 of pets level
|
//this makes dps 0.5 of pets level
|
||||||
|
|||||||
+4
-4
@@ -2287,7 +2287,7 @@ void Player::GiveLevel(uint32 level)
|
|||||||
|
|
||||||
GetSession()->SendPacket(&data);
|
GetSession()->SendPacket(&data);
|
||||||
|
|
||||||
SetUInt32Value(PLAYER_NEXT_LEVEL_XP, Trinity::XP::xp_to_level(level));
|
SetUInt32Value(PLAYER_NEXT_LEVEL_XP, objmgr.GetXPForLevel(level));
|
||||||
|
|
||||||
//update level, max level of skills
|
//update level, max level of skills
|
||||||
if(getLevel()!= level)
|
if(getLevel()!= level)
|
||||||
@@ -2369,7 +2369,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
|
|||||||
objmgr.GetPlayerLevelInfo(getRace(),getClass(),getLevel(),&info);
|
objmgr.GetPlayerLevelInfo(getRace(),getClass(),getLevel(),&info);
|
||||||
|
|
||||||
SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) );
|
SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) );
|
||||||
SetUInt32Value(PLAYER_NEXT_LEVEL_XP, Trinity::XP::xp_to_level(getLevel()));
|
SetUInt32Value(PLAYER_NEXT_LEVEL_XP, objmgr.GetXPForLevel(getLevel()));
|
||||||
|
|
||||||
UpdateSkillsForLevel ();
|
UpdateSkillsForLevel ();
|
||||||
|
|
||||||
@@ -19790,7 +19790,7 @@ void Player::EnterVehicle(Vehicle *vehicle)
|
|||||||
|
|
||||||
vehicle->SetCharmerGUID(GetGUID());
|
vehicle->SetCharmerGUID(GetGUID());
|
||||||
vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||||
vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
|
vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
|
||||||
vehicle->setFaction(getFaction());
|
vehicle->setFaction(getFaction());
|
||||||
|
|
||||||
SetCharm(vehicle); // charm
|
SetCharm(vehicle); // charm
|
||||||
@@ -19842,7 +19842,7 @@ void Player::ExitVehicle(Vehicle *vehicle)
|
|||||||
{
|
{
|
||||||
vehicle->SetCharmerGUID(0);
|
vehicle->SetCharmerGUID(0);
|
||||||
vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
|
||||||
vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
|
vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
|
||||||
vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H);
|
vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H);
|
||||||
|
|
||||||
SetCharm(NULL);
|
SetCharm(NULL);
|
||||||
|
|||||||
@@ -442,6 +442,13 @@ enum PlayerFlags
|
|||||||
PLAYER_FLAGS_UNK17 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
|
PLAYER_FLAGS_UNK17 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
|
||||||
PLAYER_FLAGS_UNK18 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
|
PLAYER_FLAGS_UNK18 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
|
||||||
PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
|
PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
|
||||||
|
PLAYER_FLAGS_UNK20 = 0x00080000,
|
||||||
|
PLAYER_FLAGS_UNK21 = 0x00100000,
|
||||||
|
PLAYER_FLAGS_UNK22 = 0x00200000,
|
||||||
|
PLAYER_FLAGS_UNK23 = 0x00400000,
|
||||||
|
PLAYER_FLAGS_UNK24 = 0x00800000, // disabled all abilitys on tab except autoattack
|
||||||
|
PLAYER_FLAGS_UNK25 = 0x01000000, // disabled all melee ability on tab include autoattack
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
|
// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ enum SpellCategory
|
|||||||
#define SPELL_ATTR_EX_NEGATIVE 0x00000080 // 7
|
#define SPELL_ATTR_EX_NEGATIVE 0x00000080 // 7
|
||||||
#define SPELL_ATTR_EX_NOT_IN_COMBAT_TARGET 0x00000100 // 8 Spell req target not to be in combat state
|
#define SPELL_ATTR_EX_NOT_IN_COMBAT_TARGET 0x00000100 // 8 Spell req target not to be in combat state
|
||||||
#define SPELL_ATTR_EX_UNK9 0x00000200 // 9
|
#define SPELL_ATTR_EX_UNK9 0x00000200 // 9
|
||||||
#define SPELL_ATTR_EX_UNK10 0x00000400 // 10
|
#define SPELL_ATTR_EX_NO_INITIAL_AGGRO 0x00000400 // 10 no generates threat on cast 100%
|
||||||
#define SPELL_ATTR_EX_UNK11 0x00000800 // 11
|
#define SPELL_ATTR_EX_UNK11 0x00000800 // 11
|
||||||
#define SPELL_ATTR_EX_UNK12 0x00001000 // 12
|
#define SPELL_ATTR_EX_UNK12 0x00001000 // 12
|
||||||
#define SPELL_ATTR_EX_UNK13 0x00002000 // 13
|
#define SPELL_ATTR_EX_UNK13 0x00002000 // 13
|
||||||
@@ -311,7 +311,7 @@ enum SpellCategory
|
|||||||
#define SPELL_ATTR_EX2_UNK25 0x02000000 // 25
|
#define SPELL_ATTR_EX2_UNK25 0x02000000 // 25
|
||||||
#define SPELL_ATTR_EX2_UNK26 0x04000000 // 26 unaffected by school immunity
|
#define SPELL_ATTR_EX2_UNK26 0x04000000 // 26 unaffected by school immunity
|
||||||
#define SPELL_ATTR_EX2_UNK27 0x08000000 // 27
|
#define SPELL_ATTR_EX2_UNK27 0x08000000 // 27
|
||||||
#define SPELL_ATTR_EX2_UNK28 0x10000000 // 28
|
#define SPELL_ATTR_EX2_UNK28 0x10000000 // 28 no breaks stealth if it fails??
|
||||||
#define SPELL_ATTR_EX2_CANT_CRIT 0x20000000 // 29 Spell can't crit
|
#define SPELL_ATTR_EX2_CANT_CRIT 0x20000000 // 29 Spell can't crit
|
||||||
#define SPELL_ATTR_EX2_UNK30 0x40000000 // 30
|
#define SPELL_ATTR_EX2_UNK30 0x40000000 // 30
|
||||||
#define SPELL_ATTR_EX2_FOOD 0x80000000 // 31 food, well-fed, and a few others
|
#define SPELL_ATTR_EX2_FOOD 0x80000000 // 31 food, well-fed, and a few others
|
||||||
@@ -332,8 +332,8 @@ enum SpellCategory
|
|||||||
#define SPELL_ATTR_EX3_UNK13 0x00002000 // 13
|
#define SPELL_ATTR_EX3_UNK13 0x00002000 // 13
|
||||||
#define SPELL_ATTR_EX3_UNK14 0x00004000 // 14 "Honorless Target" only this spells have this flag
|
#define SPELL_ATTR_EX3_UNK14 0x00004000 // 14 "Honorless Target" only this spells have this flag
|
||||||
#define SPELL_ATTR_EX3_UNK15 0x00008000 // 15 Auto Shoot, Shoot, Throw, - this is autoshot flag
|
#define SPELL_ATTR_EX3_UNK15 0x00008000 // 15 Auto Shoot, Shoot, Throw, - this is autoshot flag
|
||||||
#define SPELL_ATTR_EX3_UNK16 0x00010000 // 16
|
#define SPELL_ATTR_EX3_UNK16 0x00010000 // 16 no triggers effects that trigger on casting a spell??
|
||||||
#define SPELL_ATTR_EX3_NO_INITIAL_AGGRO 0x00020000 // 17 no initial aggro
|
#define SPELL_ATTR_EX3_UNK17 0x00020000 // 17 no triggers effects that trigger on casting a spell??
|
||||||
#define SPELL_ATTR_EX3_UNK18 0x00040000 // 18
|
#define SPELL_ATTR_EX3_UNK18 0x00040000 // 18
|
||||||
#define SPELL_ATTR_EX3_UNK19 0x00080000 // 19
|
#define SPELL_ATTR_EX3_UNK19 0x00080000 // 19
|
||||||
#define SPELL_ATTR_EX3_DEATH_PERSISTENT 0x00100000 // 20 Death persistent spells
|
#define SPELL_ATTR_EX3_DEATH_PERSISTENT 0x00100000 // 20 Death persistent spells
|
||||||
@@ -341,7 +341,7 @@ enum SpellCategory
|
|||||||
#define SPELL_ATTR_EX3_REQ_WAND 0x00400000 // 22 Req wand
|
#define SPELL_ATTR_EX3_REQ_WAND 0x00400000 // 22 Req wand
|
||||||
#define SPELL_ATTR_EX3_UNK23 0x00800000 // 23
|
#define SPELL_ATTR_EX3_UNK23 0x00800000 // 23
|
||||||
#define SPELL_ATTR_EX3_REQ_OFFHAND 0x01000000 // 24 Req offhand weapon
|
#define SPELL_ATTR_EX3_REQ_OFFHAND 0x01000000 // 24 Req offhand weapon
|
||||||
#define SPELL_ATTR_EX3_UNK25 0x02000000 // 25
|
#define SPELL_ATTR_EX3_UNK25 0x02000000 // 25 no cause spell pushback ?
|
||||||
#define SPELL_ATTR_EX3_UNK26 0x04000000 // 26
|
#define SPELL_ATTR_EX3_UNK26 0x04000000 // 26
|
||||||
#define SPELL_ATTR_EX3_UNK27 0x08000000 // 27
|
#define SPELL_ATTR_EX3_UNK27 0x08000000 // 27
|
||||||
#define SPELL_ATTR_EX3_UNK28 0x10000000 // 28
|
#define SPELL_ATTR_EX3_UNK28 0x10000000 // 28
|
||||||
@@ -353,7 +353,7 @@ enum SpellCategory
|
|||||||
#define SPELL_ATTR_EX4_UNK1 0x00000002 // 1 proc on finishing move?
|
#define SPELL_ATTR_EX4_UNK1 0x00000002 // 1 proc on finishing move?
|
||||||
#define SPELL_ATTR_EX4_UNK2 0x00000004 // 2
|
#define SPELL_ATTR_EX4_UNK2 0x00000004 // 2
|
||||||
#define SPELL_ATTR_EX4_UNK3 0x00000008 // 3
|
#define SPELL_ATTR_EX4_UNK3 0x00000008 // 3
|
||||||
#define SPELL_ATTR_EX4_UNK4 0x00000010 // 4
|
#define SPELL_ATTR_EX4_UNK4 0x00000010 // 4 This will no longer cause guards to attack on use??
|
||||||
#define SPELL_ATTR_EX4_UNK5 0x00000020 // 5
|
#define SPELL_ATTR_EX4_UNK5 0x00000020 // 5
|
||||||
#define SPELL_ATTR_EX4_UNK6 0x00000040 // 6
|
#define SPELL_ATTR_EX4_UNK6 0x00000040 // 6
|
||||||
#define SPELL_ATTR_EX4_UNK7 0x00000080 // 7
|
#define SPELL_ATTR_EX4_UNK7 0x00000080 // 7
|
||||||
|
|||||||
+2
-2
@@ -1014,7 +1014,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target)
|
|||||||
|
|
||||||
if( !m_caster->IsFriendlyTo(unit) && !IsPositiveSpell(m_spellInfo->Id))
|
if( !m_caster->IsFriendlyTo(unit) && !IsPositiveSpell(m_spellInfo->Id))
|
||||||
{
|
{
|
||||||
if( !(m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_NO_INITIAL_AGGRO) )
|
if( !(m_spellInfo->AttributesEx & SPELL_ATTR_EX_NO_INITIAL_AGGRO) )
|
||||||
{
|
{
|
||||||
m_caster->CombatStart(unit);
|
m_caster->CombatStart(unit);
|
||||||
}
|
}
|
||||||
@@ -1089,7 +1089,7 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
|||||||
// assisting case, healing and resurrection
|
// assisting case, healing and resurrection
|
||||||
if(unit->hasUnitState(UNIT_STAT_ATTACK_PLAYER))
|
if(unit->hasUnitState(UNIT_STAT_ATTACK_PLAYER))
|
||||||
m_caster->SetContestedPvP();
|
m_caster->SetContestedPvP();
|
||||||
if( unit->isInCombat() && !(m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_NO_INITIAL_AGGRO) )
|
if( unit->isInCombat() && !(m_spellInfo->AttributesEx & SPELL_ATTR_EX_NO_INITIAL_AGGRO) )
|
||||||
{
|
{
|
||||||
m_caster->SetInCombatState(unit->GetCombatTimer() > 0);
|
m_caster->SetInCombatState(unit->GetCombatTimer() > 0);
|
||||||
unit->getHostilRefManager().threatAssist(m_caster, 0.0f);
|
unit->getHostilRefManager().threatAssist(m_caster, 0.0f);
|
||||||
|
|||||||
@@ -3045,9 +3045,9 @@ void Aura::HandleModPossessPet(bool apply, bool Real)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if(apply)
|
if(apply)
|
||||||
pet->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
|
pet->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
|
||||||
else
|
else
|
||||||
pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
|
pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_24);
|
||||||
|
|
||||||
((Player*)caster)->SetFarSight(apply ? pet->GetGUID() : NULL);
|
((Player*)caster)->SetFarSight(apply ? pet->GetGUID() : NULL);
|
||||||
((Player*)caster)->SetCharm(apply ? pet : NULL);
|
((Player*)caster)->SetCharm(apply ? pet : NULL);
|
||||||
@@ -3229,7 +3229,7 @@ void Aura::HandleFeignDeath(bool apply, bool Real)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// blizz like 2.0.x
|
// blizz like 2.0.x
|
||||||
m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN6);
|
m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||||
// blizz like 2.0.x
|
// blizz like 2.0.x
|
||||||
m_target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
m_target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||||
// blizz like 2.0.x
|
// blizz like 2.0.x
|
||||||
@@ -3254,7 +3254,7 @@ void Aura::HandleFeignDeath(bool apply, bool Real)
|
|||||||
m_target->SendMessageToSet(&data,true);
|
m_target->SendMessageToSet(&data,true);
|
||||||
*/
|
*/
|
||||||
// blizz like 2.0.x
|
// blizz like 2.0.x
|
||||||
m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN6);
|
m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||||
// blizz like 2.0.x
|
// blizz like 2.0.x
|
||||||
m_target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
m_target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||||
// blizz like 2.0.x
|
// blizz like 2.0.x
|
||||||
|
|||||||
+26
-27
@@ -3889,35 +3889,34 @@ void Spell::EffectEnchantItemPerm(uint32 i)
|
|||||||
|
|
||||||
p_caster->UpdateCraftSkill(m_spellInfo->Id);
|
p_caster->UpdateCraftSkill(m_spellInfo->Id);
|
||||||
|
|
||||||
if (m_spellInfo->EffectMiscValue[i])
|
uint32 enchant_id = m_spellInfo->EffectMiscValue[i];
|
||||||
|
if (!enchant_id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SpellItemEnchantmentEntry const *pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
|
||||||
|
if(!pEnchant)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// item can be in trade slot and have owner diff. from caster
|
||||||
|
Player* item_owner = itemTarget->GetOwner();
|
||||||
|
if(!item_owner)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
|
||||||
{
|
{
|
||||||
uint32 enchant_id = m_spellInfo->EffectMiscValue[i];
|
sLog.outCommand(p_caster->GetSession()->GetAccountId(),"GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)",
|
||||||
|
p_caster->GetName(),p_caster->GetSession()->GetAccountId(),
|
||||||
SpellItemEnchantmentEntry const *pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
|
itemTarget->GetProto()->Name1,itemTarget->GetEntry(),
|
||||||
if(!pEnchant)
|
item_owner->GetName(),item_owner->GetSession()->GetAccountId());
|
||||||
return;
|
|
||||||
|
|
||||||
// item can be in trade slot and have owner diff. from caster
|
|
||||||
Player* item_owner = itemTarget->GetOwner();
|
|
||||||
if(!item_owner)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
|
|
||||||
{
|
|
||||||
sLog.outCommand(p_caster->GetSession()->GetAccountId(),"GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)",
|
|
||||||
p_caster->GetName(),p_caster->GetSession()->GetAccountId(),
|
|
||||||
itemTarget->GetProto()->Name1,itemTarget->GetEntry(),
|
|
||||||
item_owner->GetName(),item_owner->GetSession()->GetAccountId());
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove old enchanting before applying new if equipped
|
|
||||||
item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,false);
|
|
||||||
|
|
||||||
itemTarget->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchant_id, 0, 0);
|
|
||||||
|
|
||||||
// add new enchanting if equipped
|
|
||||||
item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove old enchanting before applying new if equipped
|
||||||
|
item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,false);
|
||||||
|
|
||||||
|
itemTarget->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchant_id, 0, 0);
|
||||||
|
|
||||||
|
// add new enchanting if equipped
|
||||||
|
item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::EffectEnchantItemTmp(uint32 i)
|
void Spell::EffectEnchantItemTmp(uint32 i)
|
||||||
|
|||||||
+12
-10
@@ -468,23 +468,23 @@ enum UnitVisibility
|
|||||||
// Value masks for UNIT_FIELD_FLAGS
|
// Value masks for UNIT_FIELD_FLAGS
|
||||||
enum UnitFlags
|
enum UnitFlags
|
||||||
{
|
{
|
||||||
UNIT_FLAG_UNKNOWN7 = 0x00000001,
|
UNIT_FLAG_UNK_0 = 0x00000001,
|
||||||
UNIT_FLAG_NON_ATTACKABLE = 0x00000002, // not attackable
|
UNIT_FLAG_NON_ATTACKABLE = 0x00000002, // not attackable
|
||||||
UNIT_FLAG_DISABLE_MOVE = 0x00000004,
|
UNIT_FLAG_DISABLE_MOVE = 0x00000004,
|
||||||
UNIT_FLAG_PVP_ATTACKABLE = 0x00000008, // allow apply pvp rules to attackable state in addition to faction dependent state
|
UNIT_FLAG_PVP_ATTACKABLE = 0x00000008, // allow apply pvp rules to attackable state in addition to faction dependent state
|
||||||
UNIT_FLAG_RENAME = 0x00000010,
|
UNIT_FLAG_RENAME = 0x00000010,
|
||||||
UNIT_FLAG_PREPARATION = 0x00000020, // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
|
UNIT_FLAG_PREPARATION = 0x00000020, // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
|
||||||
UNIT_FLAG_UNKNOWN9 = 0x00000040,
|
UNIT_FLAG_UNK_6 = 0x00000040,
|
||||||
UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
|
UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
|
||||||
UNIT_FLAG_NOT_ATTACKABLE_2 = 0x00000100, // 2.0.8
|
UNIT_FLAG_NOT_ATTACKABLE_2 = 0x00000100, // 2.0.8
|
||||||
UNIT_FLAG_UNKNOWN11 = 0x00000200, // 3.0.3 - makes you unable to attack everything
|
UNIT_FLAG_UNK_9 = 0x00000200, // 3.0.3 - makes you unable to attack everything
|
||||||
UNIT_FLAG_LOOTING = 0x00000400, // loot animation
|
UNIT_FLAG_LOOTING = 0x00000400, // loot animation
|
||||||
UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
|
UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
|
||||||
UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
|
UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
|
||||||
UNIT_FLAG_SILENCED = 0x00002000, // silenced, 2.1.1
|
UNIT_FLAG_SILENCED = 0x00002000, // silenced, 2.1.1
|
||||||
UNIT_FLAG_UNKNOWN4 = 0x00004000, // 2.0.8
|
UNIT_FLAG_UNK_14 = 0x00004000, // 2.0.8
|
||||||
UNIT_FLAG_UNKNOWN13 = 0x00008000,
|
UNIT_FLAG_UNK_15 = 0x00008000,
|
||||||
UNIT_FLAG_UNKNOWN14 = 0x00010000,
|
UNIT_FLAG_UNK_16 = 0x00010000,
|
||||||
UNIT_FLAG_PACIFIED = 0x00020000, // 3.0.3 ok
|
UNIT_FLAG_PACIFIED = 0x00020000, // 3.0.3 ok
|
||||||
UNIT_FLAG_STUNNED = 0x00040000, // 3.0.3 ok
|
UNIT_FLAG_STUNNED = 0x00040000, // 3.0.3 ok
|
||||||
UNIT_FLAG_IN_COMBAT = 0x00080000,
|
UNIT_FLAG_IN_COMBAT = 0x00080000,
|
||||||
@@ -492,19 +492,21 @@ enum UnitFlags
|
|||||||
UNIT_FLAG_DISARMED = 0x00200000, // 3.0.3, disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
|
UNIT_FLAG_DISARMED = 0x00200000, // 3.0.3, disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
|
||||||
UNIT_FLAG_CONFUSED = 0x00400000,
|
UNIT_FLAG_CONFUSED = 0x00400000,
|
||||||
UNIT_FLAG_FLEEING = 0x00800000,
|
UNIT_FLAG_FLEEING = 0x00800000,
|
||||||
UNIT_FLAG_UNKNOWN5 = 0x01000000, // used in spell Eyes of the Beast for pet...
|
UNIT_FLAG_UNK_24 = 0x01000000, // used in spell Eyes of the Beast for pet...
|
||||||
UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
|
UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
|
||||||
UNIT_FLAG_SKINNABLE = 0x04000000,
|
UNIT_FLAG_SKINNABLE = 0x04000000,
|
||||||
UNIT_FLAG_MOUNT = 0x08000000,
|
UNIT_FLAG_MOUNT = 0x08000000,
|
||||||
UNIT_FLAG_UNKNOWN17 = 0x10000000,
|
UNIT_FLAG_UNK_28 = 0x10000000,
|
||||||
UNIT_FLAG_UNKNOWN6 = 0x20000000, // used in Feing Death spell
|
UNIT_FLAG_UNK_29 = 0x20000000, // used in Feing Death spell
|
||||||
UNIT_FLAG_SHEATHE = 0x40000000
|
UNIT_FLAG_SHEATHE = 0x40000000,
|
||||||
|
UNIT_FLAG_UNK_31 = 0x80000000
|
||||||
};
|
};
|
||||||
|
|
||||||
// Value masks for UNIT_FIELD_FLAGS_2
|
// Value masks for UNIT_FIELD_FLAGS_2
|
||||||
enum UnitFlags2
|
enum UnitFlags2
|
||||||
{
|
{
|
||||||
UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
|
UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
|
||||||
|
UNIT_FLAG2_UNK1 = 0x00000002, // Hide unit model (show only player equip)
|
||||||
UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
|
UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
|
||||||
UNIT_FLAG2_FORCE_MOVE = 0x00000040,
|
UNIT_FLAG2_FORCE_MOVE = 0x00000040,
|
||||||
UNIT_FLAG2_REGENERATE_POWER = 0x00000800
|
UNIT_FLAG2_REGENERATE_POWER = 0x00000800
|
||||||
|
|||||||
@@ -456,7 +456,6 @@ void World::LoadConfigSettings(bool reload)
|
|||||||
rate_values[RATE_XP_KILL] = sConfig.GetFloatDefault("Rate.XP.Kill", 1.0f);
|
rate_values[RATE_XP_KILL] = sConfig.GetFloatDefault("Rate.XP.Kill", 1.0f);
|
||||||
rate_values[RATE_XP_QUEST] = sConfig.GetFloatDefault("Rate.XP.Quest", 1.0f);
|
rate_values[RATE_XP_QUEST] = sConfig.GetFloatDefault("Rate.XP.Quest", 1.0f);
|
||||||
rate_values[RATE_XP_EXPLORE] = sConfig.GetFloatDefault("Rate.XP.Explore", 1.0f);
|
rate_values[RATE_XP_EXPLORE] = sConfig.GetFloatDefault("Rate.XP.Explore", 1.0f);
|
||||||
rate_values[RATE_XP_PAST_70] = sConfig.GetFloatDefault("Rate.XP.PastLevel70", 1.0f);
|
|
||||||
rate_values[RATE_REPUTATION_GAIN] = sConfig.GetFloatDefault("Rate.Reputation.Gain", 1.0f);
|
rate_values[RATE_REPUTATION_GAIN] = sConfig.GetFloatDefault("Rate.Reputation.Gain", 1.0f);
|
||||||
rate_values[RATE_CREATURE_NORMAL_DAMAGE] = sConfig.GetFloatDefault("Rate.Creature.Normal.Damage", 1.0f);
|
rate_values[RATE_CREATURE_NORMAL_DAMAGE] = sConfig.GetFloatDefault("Rate.Creature.Normal.Damage", 1.0f);
|
||||||
rate_values[RATE_CREATURE_ELITE_ELITE_DAMAGE] = sConfig.GetFloatDefault("Rate.Creature.Elite.Elite.Damage", 1.0f);
|
rate_values[RATE_CREATURE_ELITE_ELITE_DAMAGE] = sConfig.GetFloatDefault("Rate.Creature.Elite.Elite.Damage", 1.0f);
|
||||||
|
|||||||
@@ -236,7 +236,6 @@ enum Rates
|
|||||||
RATE_XP_KILL,
|
RATE_XP_KILL,
|
||||||
RATE_XP_QUEST,
|
RATE_XP_QUEST,
|
||||||
RATE_XP_EXPLORE,
|
RATE_XP_EXPLORE,
|
||||||
RATE_XP_PAST_70,
|
|
||||||
RATE_REPUTATION_GAIN,
|
RATE_REPUTATION_GAIN,
|
||||||
RATE_CREATURE_NORMAL_HP,
|
RATE_CREATURE_NORMAL_HP,
|
||||||
RATE_CREATURE_ELITE_ELITE_HP,
|
RATE_CREATURE_ELITE_ELITE_HP,
|
||||||
|
|||||||
@@ -994,10 +994,6 @@ Visibility.Distance.Grey.Object = 10
|
|||||||
# XP rates
|
# XP rates
|
||||||
# Default: 1
|
# Default: 1
|
||||||
#
|
#
|
||||||
# Rate.XP.PastLevel70
|
|
||||||
# XP needed per level past 70 (Rates below 1 not recommended)
|
|
||||||
# Default: 1
|
|
||||||
#
|
|
||||||
# Rate.Rest.InGame
|
# Rate.Rest.InGame
|
||||||
# Rate.Rest.Offline.InTavernOrCity
|
# Rate.Rest.Offline.InTavernOrCity
|
||||||
# Rate.Rest.Offline.InWilderness
|
# Rate.Rest.Offline.InWilderness
|
||||||
@@ -1107,7 +1103,6 @@ Rate.Drop.Money = 1
|
|||||||
Rate.XP.Kill = 1
|
Rate.XP.Kill = 1
|
||||||
Rate.XP.Quest = 1
|
Rate.XP.Quest = 1
|
||||||
Rate.XP.Explore = 1
|
Rate.XP.Explore = 1
|
||||||
Rate.XP.PastLevel70 = 1
|
|
||||||
Rate.Rest.InGame = 1
|
Rate.Rest.InGame = 1
|
||||||
Rate.Rest.Offline.InTavernOrCity = 1
|
Rate.Rest.Offline.InTavernOrCity = 1
|
||||||
Rate.Rest.Offline.InWilderness = 1
|
Rate.Rest.Offline.InWilderness = 1
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7090"
|
#define REVISION_NR "7092"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|||||||
Reference in New Issue
Block a user