mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 10:37:03 +00:00
[12662] Basic implementaion of hotfixes
original author of this patch is Shauren
commit is based on 67e61b7e64
This commit is contained in:
parent
ea6eef5a13
commit
b4db2f63dd
15 changed files with 386 additions and 4 deletions
|
|
@ -1425,7 +1425,7 @@ CREATE TABLE `db_version` (
|
||||||
`version` varchar(120) DEFAULT NULL,
|
`version` varchar(120) DEFAULT NULL,
|
||||||
`creature_ai_version` varchar(120) DEFAULT NULL,
|
`creature_ai_version` varchar(120) DEFAULT NULL,
|
||||||
`cache_id` int(10) DEFAULT '0',
|
`cache_id` int(10) DEFAULT '0',
|
||||||
`required_m12652_command` bit(1) default NULL
|
`required_12662_01_mangos_hotfix_data` 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';
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
|
|
@ -1435,7 +1435,7 @@ CREATE TABLE `db_version` (
|
||||||
|
|
||||||
LOCK TABLES `db_version` WRITE;
|
LOCK TABLES `db_version` WRITE;
|
||||||
/*!40000 ALTER TABLE `db_version` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `db_version` DISABLE KEYS */;
|
||||||
INSERT INTO `db_version` (`version`, `creature_ai_version`, `cache_id`, `required_c12602_01_mangos_npc_spellclick_spells`) VALUES
|
INSERT INTO `db_version` (`version`, `creature_ai_version`, `cache_id`, `required_12662_01_mangos_hotfix_data`) VALUES
|
||||||
('Mangos default database.','Creature EventAI not provided.',0,NULL);
|
('Mangos default database.','Creature EventAI not provided.',0,NULL);
|
||||||
/*!40000 ALTER TABLE `db_version` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `db_version` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
@ -2140,7 +2140,62 @@ INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`,
|
||||||
/*!40000 ALTER TABLE `gossip_menu_option` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `gossip_menu_option` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `hotfix_data`
|
||||||
--
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `hotfix_data`;
|
||||||
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
/*!40101 SET character_set_client = utf8 */;
|
||||||
|
CREATE TABLE `hotfix_data` (
|
||||||
|
`entry` int(10) unsigned NOT NULL,
|
||||||
|
`type` int(10) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`hotfixDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||||
|
PRIMARY KEY (`entry`,`type`,`hotfixDate`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Dumping data for table `hotfix_data`
|
||||||
|
--
|
||||||
|
|
||||||
|
LOCK TABLES `hotfix_data` WRITE;
|
||||||
|
/*!40000 ALTER TABLE `hotfix_data` DISABLE KEYS */;
|
||||||
|
INSERT INTO `hotfix_data` (`entry`, `type`, `hotfixDate`) VALUES
|
||||||
|
('6948', '1344507586', '2011-11-23 08:34:13'),
|
||||||
|
('44623', '1344507586', '2011-11-23 08:34:04'),
|
||||||
|
('44625', '1344507586', '2011-11-23 08:34:04'),
|
||||||
|
('44626', '1344507586', '2011-11-23 08:34:04'),
|
||||||
|
('44632', '1344507586', '2011-11-23 08:34:04'),
|
||||||
|
('44812', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44834', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44835', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44836', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44837', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44838', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44839', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44840', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44844', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44853', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44854', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44855', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('44856', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('46784', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('46793', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('46796', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('46797', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('46887', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('46888', '1344507586', '2011-11-23 08:34:00'),
|
||||||
|
('64488', '1344507586', '2011-11-23 08:34:13'),
|
||||||
|
('69847', '1344507586', '2011-11-23 08:34:03'),
|
||||||
|
('69847', '1344507586', '2011-11-23 08:34:06'),
|
||||||
|
('72068', '1344507586', '2011-11-23 08:34:03'),
|
||||||
|
('72068', '1344507586', '2011-11-23 08:34:06');
|
||||||
|
/*!40000 ALTER TABLE `hotfix_data` ENABLE KEYS */;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
--
|
||||||
-- Table structure for table `instance_encounters`
|
-- Table structure for table `instance_encounters`
|
||||||
--
|
--
|
||||||
|
|
||||||
|
|
|
||||||
38
sql/updates/12662_01_mangos_hotfix_data.sql
Normal file
38
sql/updates/12662_01_mangos_hotfix_data.sql
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
ALTER TABLE db_version CHANGE COLUMN required_m12654_command required_12662_01_mangos_hotfix_data bit;
|
||||||
|
|
||||||
|
CREATE TABLE `hotfix_data` (
|
||||||
|
`entry` int(10) unsigned NOT NULL,
|
||||||
|
`type` int(10) unsigned NOT NULL DEFAULT '0',
|
||||||
|
`hotfixDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||||
|
PRIMARY KEY (`entry`,`type`,`hotfixDate`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('6948', '1344507586', '2011-11-23 08:34:13');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44623', '1344507586', '2011-11-23 08:34:04');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44625', '1344507586', '2011-11-23 08:34:04');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44626', '1344507586', '2011-11-23 08:34:04');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44632', '1344507586', '2011-11-23 08:34:04');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44812', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44834', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44835', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44836', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44837', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44838', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44839', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44840', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44844', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44853', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44854', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44855', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('44856', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('46784', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('46793', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('46796', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('46797', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('46887', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('46888', '1344507586', '2011-11-23 08:34:00');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('64488', '1344507586', '2011-11-23 08:34:13');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('69847', '1344507586', '2011-11-23 08:34:03');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('69847', '1344507586', '2011-11-23 08:34:06');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('72068', '1344507586', '2011-11-23 08:34:03');
|
||||||
|
INSERT INTO `hotfix_data` VALUES ('72068', '1344507586', '2011-11-23 08:34:06');
|
||||||
|
|
@ -551,6 +551,7 @@ ChatCommand* ChatHandler::getCommandTable()
|
||||||
{ "gameobject_battleground", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadBattleEventCommand, "", NULL },
|
{ "gameobject_battleground", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadBattleEventCommand, "", NULL },
|
||||||
{ "gossip_menu", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGossipMenuCommand, "", NULL },
|
{ "gossip_menu", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGossipMenuCommand, "", NULL },
|
||||||
{ "gossip_menu_option", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGossipMenuCommand, "", NULL },
|
{ "gossip_menu_option", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGossipMenuCommand, "", NULL },
|
||||||
|
{ "hotfix_data", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadHotfixDataCommand, "", NULL },
|
||||||
{ "item_convert", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemConvertCommand, "", NULL },
|
{ "item_convert", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemConvertCommand, "", NULL },
|
||||||
{ "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
|
{ "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
|
||||||
{ "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
|
{ "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
|
||||||
|
|
|
||||||
|
|
@ -427,6 +427,7 @@ class MANGOS_DLL_SPEC ChatHandler
|
||||||
bool HandleReloadGossipMenuCommand(char* args);
|
bool HandleReloadGossipMenuCommand(char* args);
|
||||||
bool HandleReloadGOQuestRelationsCommand(char* args);
|
bool HandleReloadGOQuestRelationsCommand(char* args);
|
||||||
bool HandleReloadGOQuestInvRelationsCommand(char* args);
|
bool HandleReloadGOQuestInvRelationsCommand(char* args);
|
||||||
|
bool HandleReloadHotfixDataCommand(char* args);
|
||||||
bool HandleReloadItemConvertCommand(char* args);
|
bool HandleReloadItemConvertCommand(char* args);
|
||||||
bool HandleReloadItemEnchantementsCommand(char* args);
|
bool HandleReloadItemEnchantementsCommand(char* args);
|
||||||
bool HandleReloadItemRequiredTragetCommand(char* args);
|
bool HandleReloadItemRequiredTragetCommand(char* args);
|
||||||
|
|
|
||||||
|
|
@ -1315,3 +1315,171 @@ void WorldSession::HandleItemTextQuery(WorldPacket& recv_data)
|
||||||
}
|
}
|
||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void WorldSession::SendItemDb2Reply(uint32 entry)
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_DB_REPLY, 44);
|
||||||
|
ItemPrototype const* proto = sObjectMgr.GetItemPrototype(entry);
|
||||||
|
if (!proto)
|
||||||
|
{
|
||||||
|
data << uint32(-1); // entry
|
||||||
|
data << uint32(DB2_REPLY_ITEM);
|
||||||
|
data << uint32(time(NULL)); // hotfix date
|
||||||
|
data << uint32(0); // size of next block
|
||||||
|
SendPacket(&data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data << uint32(entry);
|
||||||
|
data << uint32(DB2_REPLY_ITEM);
|
||||||
|
data << uint32(sObjectMgr.GetHotfixDate(entry, DB2_REPLY_ITEM));
|
||||||
|
|
||||||
|
ByteBuffer buff;
|
||||||
|
buff << uint32(entry);
|
||||||
|
buff << uint32(proto->Class);
|
||||||
|
buff << uint32(proto->SubClass);
|
||||||
|
buff << int32(proto->Unk0);
|
||||||
|
buff << uint32(proto->Material);
|
||||||
|
buff << uint32(proto->DisplayInfoID);
|
||||||
|
buff << uint32(proto->InventoryType);
|
||||||
|
buff << uint32(proto->Sheath);
|
||||||
|
|
||||||
|
data << uint32(buff.size());
|
||||||
|
data.append(buff);
|
||||||
|
|
||||||
|
SendPacket(&data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldSession::SendItemSparseDb2Reply(uint32 entry)
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_DB_REPLY, 526);
|
||||||
|
ItemPrototype const* proto = sObjectMgr.GetItemPrototype(entry);
|
||||||
|
if (!proto)
|
||||||
|
{
|
||||||
|
data << uint32(-1); // entry
|
||||||
|
data << uint32(DB2_REPLY_SPARSE);
|
||||||
|
data << uint32(time(NULL)); // hotfix date
|
||||||
|
data << uint32(0); // size of next block
|
||||||
|
SendPacket(&data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data << uint32(entry);
|
||||||
|
data << uint32(DB2_REPLY_SPARSE);
|
||||||
|
data << uint32(sObjectMgr.GetHotfixDate(entry, DB2_REPLY_SPARSE));
|
||||||
|
|
||||||
|
ByteBuffer buff;
|
||||||
|
buff << uint32(entry);
|
||||||
|
buff << uint32(proto->Quality);
|
||||||
|
buff << uint32(proto->Flags);
|
||||||
|
buff << uint32(proto->Flags2);
|
||||||
|
buff << float(proto->Unknown);
|
||||||
|
buff << float(proto->Unknown1);
|
||||||
|
buff << uint32(proto->BuyCount);
|
||||||
|
buff << int32(proto->BuyPrice);
|
||||||
|
buff << uint32(proto->SellPrice);
|
||||||
|
buff << uint32(proto->InventoryType);
|
||||||
|
buff << int32(proto->AllowableClass);
|
||||||
|
buff << int32(proto->AllowableRace);
|
||||||
|
buff << uint32(proto->ItemLevel);
|
||||||
|
buff << uint32(proto->RequiredLevel);
|
||||||
|
buff << uint32(proto->RequiredSkill);
|
||||||
|
buff << uint32(proto->RequiredSkillRank);
|
||||||
|
buff << uint32(proto->RequiredSpell);
|
||||||
|
buff << uint32(proto->RequiredHonorRank);
|
||||||
|
buff << uint32(proto->RequiredCityRank);
|
||||||
|
buff << uint32(proto->RequiredReputationFaction);
|
||||||
|
buff << uint32(proto->RequiredReputationRank);
|
||||||
|
buff << int32(proto->MaxCount);
|
||||||
|
buff << int32(proto->Stackable);
|
||||||
|
buff << uint32(proto->ContainerSlots);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_STATS; ++x)
|
||||||
|
buff << uint32(proto->ItemStat[x].ItemStatType);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_STATS; ++x)
|
||||||
|
buff << int32(proto->ItemStat[x].ItemStatValue);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_STATS; ++x)
|
||||||
|
buff << int32(proto->ItemStat[x].ItemStatType2);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_STATS; ++x)
|
||||||
|
buff << int32(proto->ItemStat[x].ItemStatValue2);
|
||||||
|
|
||||||
|
buff << uint32(proto->ScalingStatDistribution);
|
||||||
|
buff << uint32(proto->DamageType);
|
||||||
|
buff << uint32(proto->Delay);
|
||||||
|
buff << float(proto->RangedModRange);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
|
||||||
|
buff << int32(proto->Spells[x].SpellId);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
|
||||||
|
buff << uint32(proto->Spells[x].SpellTrigger);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
|
||||||
|
buff << int32(proto->Spells[x].SpellCharges);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
|
||||||
|
buff << int32(proto->Spells[x].SpellCooldown);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
|
||||||
|
buff << uint32(proto->Spells[x].SpellCategory);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SPELLS; ++x)
|
||||||
|
buff << int32(proto->Spells[x].SpellCategoryCooldown);
|
||||||
|
|
||||||
|
buff << uint32(proto->Bonding);
|
||||||
|
|
||||||
|
// item name
|
||||||
|
std::string name = proto->Name1;
|
||||||
|
buff << uint16(name.length());
|
||||||
|
if (name.length())
|
||||||
|
buff << name;
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < 3; ++i) // other 3 names
|
||||||
|
buff << uint16(0);
|
||||||
|
|
||||||
|
std::string desc = proto->Description;
|
||||||
|
buff << uint16(desc.length());
|
||||||
|
if (desc.length())
|
||||||
|
buff << desc;
|
||||||
|
|
||||||
|
buff << uint32(proto->PageText);
|
||||||
|
buff << uint32(proto->LanguageID);
|
||||||
|
buff << uint32(proto->PageMaterial);
|
||||||
|
buff << uint32(proto->StartQuest);
|
||||||
|
buff << uint32(proto->LockID);
|
||||||
|
buff << int32(proto->Material);
|
||||||
|
buff << uint32(proto->Sheath);
|
||||||
|
buff << int32(proto->RandomProperty);
|
||||||
|
buff << int32(proto->RandomSuffix);
|
||||||
|
buff << uint32(proto->ItemSet);
|
||||||
|
|
||||||
|
buff << uint32(proto->Area);
|
||||||
|
buff << uint32(proto->Map);
|
||||||
|
buff << uint32(proto->BagFamily);
|
||||||
|
buff << uint32(proto->TotemCategory);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SOCKETS; ++x)
|
||||||
|
buff << uint32(proto->Socket[x].Color);
|
||||||
|
|
||||||
|
for (uint32 x = 0; x < MAX_ITEM_PROTO_SOCKETS; ++x)
|
||||||
|
buff << uint32(proto->Socket[x].Content);
|
||||||
|
|
||||||
|
buff << uint32(proto->socketBonus);
|
||||||
|
buff << uint32(proto->GemProperties);
|
||||||
|
buff << float(proto->ArmorDamageModifier);
|
||||||
|
buff << int32(proto->Duration);
|
||||||
|
buff << uint32(proto->ItemLimitCategory);
|
||||||
|
buff << uint32(proto->HolidayId);
|
||||||
|
buff << float(proto->StatScalingFactor);
|
||||||
|
buff << uint32(proto->Unknown400_1);
|
||||||
|
buff << uint32(proto->Unknown400_2);
|
||||||
|
|
||||||
|
data << uint32(buff.size());
|
||||||
|
data.append(buff);
|
||||||
|
|
||||||
|
SendPacket(&data);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -448,6 +448,14 @@ bool ChatHandler::HandleReloadConditionsCommand(char* /*args*/)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ChatHandler::HandleReloadHotfixDataCommand(char* /*args*/)
|
||||||
|
{
|
||||||
|
sLog.outString("Re-Loading hotfix data...");
|
||||||
|
sObjectMgr.LoadHotfixData();
|
||||||
|
SendGlobalSysMessage("DB table `hotfix_data` reloaded.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool ChatHandler::HandleReloadGossipMenuCommand(char* /*args*/)
|
bool ChatHandler::HandleReloadGossipMenuCommand(char* /*args*/)
|
||||||
{
|
{
|
||||||
sObjectMgr.LoadGossipMenus();
|
sObjectMgr.LoadGossipMenus();
|
||||||
|
|
|
||||||
|
|
@ -1525,3 +1525,39 @@ void WorldSession::HandleHearthandResurrect(WorldPacket& /*recv_data*/)
|
||||||
_player->ResurrectPlayer(100);
|
_player->ResurrectPlayer(100);
|
||||||
_player->TeleportToHomebind();
|
_player->TeleportToHomebind();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldSession::HandleRequestHotfix(WorldPacket& recv_data)
|
||||||
|
{
|
||||||
|
uint32 type, count;
|
||||||
|
recv_data >> type;
|
||||||
|
|
||||||
|
count = recv_data.ReadBits(23);
|
||||||
|
|
||||||
|
std::vector<ObjectGuid> guids;
|
||||||
|
guids.reserve(count);
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < count; ++i)
|
||||||
|
recv_data.ReadGuidMask<0, 4, 7, 2, 5, 3, 6, 1>(guids[i]);
|
||||||
|
|
||||||
|
uint32 entry;
|
||||||
|
for (uint32 i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
recv_data.ReadGuidBytes<5, 6, 7, 0, 1, 3, 4>(guids[i]);
|
||||||
|
recv_data >> entry;
|
||||||
|
recv_data.ReadGuidBytes<2>(guids[i]);
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case DB2_REPLY_ITEM:
|
||||||
|
SendItemDb2Reply(entry);
|
||||||
|
break;
|
||||||
|
case DB2_REPLY_SPARSE:
|
||||||
|
SendItemSparseDb2Reply(entry);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sLog.outError("CMSG_REQUEST_HOTFIX: Received unknown hotfix type: %u", type);
|
||||||
|
recv_data.rfinish();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -9961,3 +9961,38 @@ GameObjectDataPair const* FindGOData::GetResult() const
|
||||||
|
|
||||||
return i_anyData;
|
return i_anyData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ObjectMgr::LoadHotfixData()
|
||||||
|
{
|
||||||
|
uint32 count = 0;
|
||||||
|
m_hotfixData.clear();
|
||||||
|
|
||||||
|
QueryResult* result = WorldDatabase.Query("SELECT entry, type, UNIX_TIMESTAMP(hotfixDate) FROM hotfix_data");
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
BarGoLink bar(1);
|
||||||
|
|
||||||
|
bar.step();
|
||||||
|
|
||||||
|
sLog.outString(">> Loaded %u hotfix info entries. DB table `hotfix_data` is empty.", count);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Field* fields = result->Fetch();
|
||||||
|
|
||||||
|
HotfixInfo info;
|
||||||
|
info.Entry = fields[0].GetUInt32();
|
||||||
|
info.Type = fields[1].GetUInt32();
|
||||||
|
info.Timestamp = fields[2].GetUInt32();
|
||||||
|
m_hotfixData.push_back(info);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
while (result->NextRow());
|
||||||
|
|
||||||
|
delete result;
|
||||||
|
|
||||||
|
sLog.outString();
|
||||||
|
sLog.outString(">> Loaded %u hotfix info entries.", count);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -467,6 +467,15 @@ enum SkillRangeType
|
||||||
|
|
||||||
SkillRangeType GetSkillRangeType(SkillLineEntry const* pSkill, bool racial);
|
SkillRangeType GetSkillRangeType(SkillLineEntry const* pSkill, bool racial);
|
||||||
|
|
||||||
|
struct HotfixInfo
|
||||||
|
{
|
||||||
|
uint32 Type;
|
||||||
|
uint32 Timestamp;
|
||||||
|
uint32 Entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector<HotfixInfo> HotfixData;
|
||||||
|
|
||||||
#define MAX_PLAYER_NAME 12 // max allowed by client name length
|
#define MAX_PLAYER_NAME 12 // max allowed by client name length
|
||||||
#define MAX_INTERNAL_PLAYER_NAME 15 // max server internal player name length ( > MAX_PLAYER_NAME for support declined names )
|
#define MAX_INTERNAL_PLAYER_NAME 15 // max server internal player name length ( > MAX_PLAYER_NAME for support declined names )
|
||||||
#define MAX_PET_NAME 12 // max allowed by client name length
|
#define MAX_PET_NAME 12 // max allowed by client name length
|
||||||
|
|
@ -1116,6 +1125,20 @@ class ObjectMgr
|
||||||
QuestRelationsMap& GetCreatureQuestRelationsMap() { return m_CreatureQuestRelations; }
|
QuestRelationsMap& GetCreatureQuestRelationsMap() { return m_CreatureQuestRelations; }
|
||||||
|
|
||||||
uint32 GetModelForRace(uint32 sourceModelId, uint32 racemask);
|
uint32 GetModelForRace(uint32 sourceModelId, uint32 racemask);
|
||||||
|
|
||||||
|
void LoadHotfixData();
|
||||||
|
HotfixData const& GetHotfixData() const { return m_hotfixData; }
|
||||||
|
uint32 GetHotfixDate(uint32 entry, uint32 type) const
|
||||||
|
{
|
||||||
|
uint32 ret = 0;
|
||||||
|
for (HotfixData::const_iterator itr = m_hotfixData.begin(); itr != m_hotfixData.end(); ++itr)
|
||||||
|
if (itr->Entry == entry && itr->Type == type)
|
||||||
|
if (itr->Timestamp > ret)
|
||||||
|
ret = itr->Timestamp;
|
||||||
|
|
||||||
|
return ret ? ret : uint32(time(NULL));
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// first free id for selected id type
|
// first free id for selected id type
|
||||||
|
|
@ -1252,6 +1275,8 @@ class ObjectMgr
|
||||||
CacheVendorItemMap m_mCacheVendorItemMap;
|
CacheVendorItemMap m_mCacheVendorItemMap;
|
||||||
CacheTrainerSpellMap m_mCacheTrainerTemplateSpellMap;
|
CacheTrainerSpellMap m_mCacheTrainerTemplateSpellMap;
|
||||||
CacheTrainerSpellMap m_mCacheTrainerSpellMap;
|
CacheTrainerSpellMap m_mCacheTrainerSpellMap;
|
||||||
|
|
||||||
|
HotfixData m_hotfixData;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define sObjectMgr MaNGOS::Singleton<ObjectMgr>::Instance()
|
#define sObjectMgr MaNGOS::Singleton<ObjectMgr>::Instance()
|
||||||
|
|
|
||||||
|
|
@ -1405,4 +1405,6 @@ void InitializeOpcodes()
|
||||||
OPCODE(SMSG_PVP_REWARDS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
OPCODE(SMSG_PVP_REWARDS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||||
OPCODE(CMSG_REQUEST_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPvPOptionsEnabledOpcode );
|
OPCODE(CMSG_REQUEST_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPvPOptionsEnabledOpcode );
|
||||||
OPCODE(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
OPCODE(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||||
|
OPCODE(CMSG_REQUEST_HOTFIX, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleRequestHotfix );
|
||||||
|
OPCODE(SMSG_DB_REPLY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1423,6 +1423,8 @@ enum Opcodes
|
||||||
SMSG_PVP_REWARDS = 0x5DA4, // 4.3.4 15595
|
SMSG_PVP_REWARDS = 0x5DA4, // 4.3.4 15595
|
||||||
CMSG_REQUEST_PVP_OPTIONS_ENABLED = 0x24A1, // 4.3.4 15595
|
CMSG_REQUEST_PVP_OPTIONS_ENABLED = 0x24A1, // 4.3.4 15595
|
||||||
SMSG_PVP_OPTIONS_ENABLED = 0x50A1, // 4.3.4 15595
|
SMSG_PVP_OPTIONS_ENABLED = 0x50A1, // 4.3.4 15595
|
||||||
|
CMSG_REQUEST_HOTFIX = 0x2401, // 4.3.4 15595
|
||||||
|
SMSG_DB_REPLY = 0x38A4, // 4.3.4 15595
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_OPCODE_TABLE_SIZE 0xFFFF
|
#define MAX_OPCODE_TABLE_SIZE 0xFFFF
|
||||||
|
|
|
||||||
|
|
@ -1331,6 +1331,9 @@ void World::SetInitialWorldSettings()
|
||||||
sLog.outString("Loading GM tickets...");
|
sLog.outString("Loading GM tickets...");
|
||||||
sTicketMgr.LoadGMTickets();
|
sTicketMgr.LoadGMTickets();
|
||||||
|
|
||||||
|
sLog.outString("Loading hotfix data...");
|
||||||
|
sObjectMgr.LoadHotfixData();
|
||||||
|
|
||||||
///- Handle outdated emails (delete/return)
|
///- Handle outdated emails (delete/return)
|
||||||
sLog.outString("Returning old mails...");
|
sLog.outString("Returning old mails...");
|
||||||
sObjectMgr.ReturnOrDeleteOldMails(false);
|
sObjectMgr.ReturnOrDeleteOldMails(false);
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,9 @@ enum AccountDataType
|
||||||
#define GLOBAL_CACHE_MASK 0x15
|
#define GLOBAL_CACHE_MASK 0x15
|
||||||
#define PER_CHARACTER_CACHE_MASK 0xEA
|
#define PER_CHARACTER_CACHE_MASK 0xEA
|
||||||
|
|
||||||
|
#define DB2_REPLY_ITEM 1344507586
|
||||||
|
#define DB2_REPLY_SPARSE 2442913102
|
||||||
|
|
||||||
struct AccountData
|
struct AccountData
|
||||||
{
|
{
|
||||||
AccountData() : Time(0), Data("") {}
|
AccountData() : Time(0), Data("") {}
|
||||||
|
|
@ -863,6 +866,11 @@ class MANGOS_DLL_SPEC WorldSession
|
||||||
void HandleCalendarComplain(WorldPacket& recv_data);
|
void HandleCalendarComplain(WorldPacket& recv_data);
|
||||||
void HandleCalendarGetNumPending(WorldPacket& recv_data);
|
void HandleCalendarGetNumPending(WorldPacket& recv_data);
|
||||||
|
|
||||||
|
// Hotfix handlers
|
||||||
|
void HandleRequestHotfix(WorldPacket& recv_data);
|
||||||
|
void SendItemDb2Reply(uint32 entry);
|
||||||
|
void SendItemSparseDb2Reply(uint32 entry);
|
||||||
|
|
||||||
void HandleSpellClick(WorldPacket& recv_data);
|
void HandleSpellClick(WorldPacket& recv_data);
|
||||||
void HandleGetMirrorimageData(WorldPacket& recv_data);
|
void HandleGetMirrorimageData(WorldPacket& recv_data);
|
||||||
void HandleAlterAppearanceOpcode(WorldPacket& recv_data);
|
void HandleAlterAppearanceOpcode(WorldPacket& recv_data);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "12661"
|
#define REVISION_NR "12662"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef __REVISION_SQL_H__
|
#ifndef __REVISION_SQL_H__
|
||||||
#define __REVISION_SQL_H__
|
#define __REVISION_SQL_H__
|
||||||
#define REVISION_DB_CHARACTERS "required_c12631_01_characters_corpse"
|
#define REVISION_DB_CHARACTERS "required_c12631_01_characters_corpse"
|
||||||
#define REVISION_DB_MANGOS "required_m12654_command"
|
#define REVISION_DB_MANGOS "required_12662_01_mangos_hotfix_data"
|
||||||
#define REVISION_DB_REALMD "required_c12484_02_realmd_account_access"
|
#define REVISION_DB_REALMD "required_c12484_02_realmd_account_access"
|
||||||
#endif // __REVISION_SQL_H__
|
#endif // __REVISION_SQL_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue