[0114] Updated "item_template" Thanks Fabi Fix some DBC problems, some clean.

Signed-off-by: Salja <salja2012@hotmail.de>
This commit is contained in:
Salja 2012-08-17 02:22:22 +02:00 committed by Antz
parent a6b1264405
commit 73ec9c2ce4
14 changed files with 170 additions and 348 deletions

View file

@ -2456,6 +2456,9 @@ CREATE TABLE `item_template` (
`Quality` tinyint(3) unsigned NOT NULL default '0', `Quality` tinyint(3) unsigned NOT NULL default '0',
`Flags` int(10) unsigned NOT NULL default '0', `Flags` int(10) unsigned NOT NULL default '0',
`Flags2` int(10) unsigned NOT NULL default '0', `Flags2` int(10) unsigned NOT NULL default '0',
`Unknown` float NOT NULL,
`Unknown1` float NOT NULL,
`Unknown2` int(10) NOT NULL,
`BuyCount` tinyint(3) unsigned NOT NULL default '1', `BuyCount` tinyint(3) unsigned NOT NULL default '1',
`BuyPrice` int(10) unsigned NOT NULL default '0', `BuyPrice` int(10) unsigned NOT NULL default '0',
`SellPrice` int(10) unsigned NOT NULL default '0', `SellPrice` int(10) unsigned NOT NULL default '0',
@ -2474,44 +2477,49 @@ CREATE TABLE `item_template` (
`maxcount` smallint(5) NOT NULL default '-1', `maxcount` smallint(5) NOT NULL default '-1',
`stackable` smallint(5) NOT NULL default '1', `stackable` smallint(5) NOT NULL default '1',
`ContainerSlots` tinyint(3) unsigned NOT NULL default '0', `ContainerSlots` tinyint(3) unsigned NOT NULL default '0',
`StatsCount` tinyint(3) unsigned NOT NULL default '0',
`stat_type1` tinyint(3) unsigned NOT NULL default '0', `stat_type1` tinyint(3) unsigned NOT NULL default '0',
`stat_value1` smallint(6) NOT NULL default '0', `stat_value1` smallint(6) NOT NULL default '0',
`stat_unk1_1` int(10) NOT NULL default '0',
`stat_unk2_1` int(10) NOT NULL default '0',
`stat_type2` tinyint(3) unsigned NOT NULL default '0', `stat_type2` tinyint(3) unsigned NOT NULL default '0',
`stat_value2` smallint(6) NOT NULL default '0', `stat_value2` smallint(6) NOT NULL default '0',
`stat_unk1_2` int(10) NOT NULL default '0',
`stat_unk2_2` int(10) NOT NULL default '0',
`stat_type3` tinyint(3) unsigned NOT NULL default '0', `stat_type3` tinyint(3) unsigned NOT NULL default '0',
`stat_value3` smallint(6) NOT NULL default '0', `stat_value3` smallint(6) NOT NULL default '0',
`stat_unk1_3` int(10) NOT NULL default '0',
`stat_unk2_3` int(10) NOT NULL default '0',
`stat_type4` tinyint(3) unsigned NOT NULL default '0', `stat_type4` tinyint(3) unsigned NOT NULL default '0',
`stat_value4` smallint(6) NOT NULL default '0', `stat_value4` smallint(6) NOT NULL default '0',
`stat_unk1_4` int(10) NOT NULL default '0',
`stat_unk2_4` int(10) NOT NULL default '0',
`stat_type5` tinyint(3) unsigned NOT NULL default '0', `stat_type5` tinyint(3) unsigned NOT NULL default '0',
`stat_value5` smallint(6) NOT NULL default '0', `stat_value5` smallint(6) NOT NULL default '0',
`stat_unk1_5` int(10) NOT NULL default '0',
`stat_unk2_5` int(10) NOT NULL default '0',
`stat_type6` tinyint(3) unsigned NOT NULL default '0', `stat_type6` tinyint(3) unsigned NOT NULL default '0',
`stat_value6` smallint(6) NOT NULL default '0', `stat_value6` smallint(6) NOT NULL default '0',
`stat_unk1_6` int(10) NOT NULL default '0',
`stat_unk2_6` int(10) NOT NULL default '0',
`stat_type7` tinyint(3) unsigned NOT NULL default '0', `stat_type7` tinyint(3) unsigned NOT NULL default '0',
`stat_value7` smallint(6) NOT NULL default '0', `stat_value7` smallint(6) NOT NULL default '0',
`stat_unk1_7` int(10) NOT NULL default '0',
`stat_unk2_7` int(10) NOT NULL default '0',
`stat_type8` tinyint(3) unsigned NOT NULL default '0', `stat_type8` tinyint(3) unsigned NOT NULL default '0',
`stat_value8` smallint(6) NOT NULL default '0', `stat_value8` smallint(6) NOT NULL default '0',
`stat_unk1_8` int(10) NOT NULL default '0',
`stat_unk2_8` int(10) NOT NULL default '0',
`stat_type9` tinyint(3) unsigned NOT NULL default '0', `stat_type9` tinyint(3) unsigned NOT NULL default '0',
`stat_value9` smallint(6) NOT NULL default '0', `stat_value9` smallint(6) NOT NULL default '0',
`stat_unk1_9` int(10) NOT NULL default '0',
`stat_unk2_9` int(10) NOT NULL default '0',
`stat_type10` tinyint(3) unsigned NOT NULL default '0', `stat_type10` tinyint(3) unsigned NOT NULL default '0',
`stat_value10` smallint(6) NOT NULL default '0', `stat_value10` smallint(6) NOT NULL default '0',
`stat_unk1_10` int(10) NOT NULL default '0',
`stat_unk2_10` int(10) NOT NULL default '0',
`ScalingStatDistribution` smallint(6) NOT NULL default '0', `ScalingStatDistribution` smallint(6) NOT NULL default '0',
`ScalingStatValue` int(6) unsigned NOT NULL default '0', `delay` int(10) NOT NULL,
`dmg_min1` float NOT NULL default '0', `DamageType` tinyint(3) unsigned NOT NULL default '0',
`dmg_max1` float NOT NULL default '0',
`dmg_type1` tinyint(3) unsigned NOT NULL default '0',
`dmg_min2` float NOT NULL default '0',
`dmg_max2` float NOT NULL default '0',
`dmg_type2` tinyint(3) unsigned NOT NULL default '0',
`armor` smallint(5) unsigned NOT NULL default '0',
`holy_res` tinyint(3) unsigned NOT NULL default '0',
`fire_res` tinyint(3) unsigned NOT NULL default '0',
`nature_res` tinyint(3) unsigned NOT NULL default '0',
`frost_res` tinyint(3) unsigned NOT NULL default '0',
`shadow_res` tinyint(3) unsigned NOT NULL default '0',
`arcane_res` tinyint(3) unsigned NOT NULL default '0',
`delay` smallint(5) unsigned NOT NULL default '1000',
`ammo_type` tinyint(3) unsigned NOT NULL default '0',
`RangedModRange` float NOT NULL default '0', `RangedModRange` float NOT NULL default '0',
`spellid_1` mediumint(8) unsigned NOT NULL default '0', `spellid_1` mediumint(8) unsigned NOT NULL default '0',
`spelltrigger_1` tinyint(3) unsigned NOT NULL default '0', `spelltrigger_1` tinyint(3) unsigned NOT NULL default '0',
@ -2559,7 +2567,6 @@ CREATE TABLE `item_template` (
`sheath` tinyint(3) unsigned NOT NULL default '0', `sheath` tinyint(3) unsigned NOT NULL default '0',
`RandomProperty` mediumint(8) unsigned NOT NULL default '0', `RandomProperty` mediumint(8) unsigned NOT NULL default '0',
`RandomSuffix` mediumint(8) unsigned NOT NULL default '0', `RandomSuffix` mediumint(8) unsigned NOT NULL default '0',
`block` mediumint(8) unsigned NOT NULL default '0',
`itemset` mediumint(8) unsigned NOT NULL default '0', `itemset` mediumint(8) unsigned NOT NULL default '0',
`MaxDurability` smallint(5) unsigned NOT NULL default '0', `MaxDurability` smallint(5) unsigned NOT NULL default '0',
`area` mediumint(8) unsigned NOT NULL default '0', `area` mediumint(8) unsigned NOT NULL default '0',
@ -2576,15 +2583,18 @@ CREATE TABLE `item_template` (
`GemProperties` mediumint(9) NOT NULL default '0', `GemProperties` mediumint(9) NOT NULL default '0',
`RequiredDisenchantSkill` smallint(6) NOT NULL default '-1', `RequiredDisenchantSkill` smallint(6) NOT NULL default '-1',
`ArmorDamageModifier` float NOT NULL default '0', `ArmorDamageModifier` float NOT NULL default '0',
`Duration` int(11) UNSIGNED DEFAULT '0' NOT NULL COMMENT 'Duration in seconds.', `Duration` int(11) unsigned NOT NULL default '0',
`ItemLimitCategory` smallint(6) NOT NULL default '0', `ItemLimitCategory` smallint(6) NOT NULL default '0',
`HolidayId` int(11) UNSIGNED DEFAULT '0' NOT NULL, `HolidayId` int(11) unsigned NOT NULL default '0',
`ScriptName` varchar(64) NOT NULL default '', `ScriptName` varchar(64) NOT NULL default '',
`DisenchantID` mediumint(8) unsigned NOT NULL default '0', `DisenchantID` mediumint(8) unsigned NOT NULL default '0',
`FoodType` tinyint(3) unsigned NOT NULL default '0', `FoodType` tinyint(3) unsigned NOT NULL default '0',
`StatScalingFactor` float NOT NULL,
`Unknown400_1` int(10) unsigned NOT NULL default '0',
`Unknown400_2` int(10) unsigned NOT NULL default '0',
`minMoneyLoot` int(10) unsigned NOT NULL default '0', `minMoneyLoot` int(10) unsigned NOT NULL default '0',
`maxMoneyLoot` int(10) unsigned NOT NULL default '0', `maxMoneyLoot` int(10) unsigned NOT NULL default '0',
`ExtraFlags` tinyint(1) UNSIGNED NOT NULL default '0', `ExtraFlags` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`), PRIMARY KEY (`entry`),
KEY `items_index` (`class`) KEY `items_index` (`class`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';

View file

@ -0,0 +1,49 @@
ALTER TABLE db_version CHANGE COLUMN required_0083_12090_01_mangos_spell_template required_0114_xxxxx_01_mangos_item_template bit;
ALTER TABLE `item_template` ADD COLUMN `Unknown` float NOT NULL AFTER `Flags2`;
ALTER TABLE `item_template` ADD COLUMN `Unknown1` float NOT NULL AFTER `Unknown`;
ALTER TABLE `item_template` ADD COLUMN `Unknown2` int(10) NOT NULL AFTER `Unknown1`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_1` int(10) NOT NULL DEFAULT '0' AFTER `stat_value1`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_1` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_1`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_2` int(10) NOT NULL DEFAULT '0' AFTER `stat_value2`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_2` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_2`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_3` int(10) NOT NULL DEFAULT '0' AFTER `stat_value3`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_3` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_3`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_4` int(10) NOT NULL DEFAULT '0' AFTER `stat_value4`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_4` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_4`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_5` int(10) NOT NULL DEFAULT '0' AFTER `stat_value5`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_5` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_5`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_6` int(10) NOT NULL DEFAULT '0' AFTER `stat_value6`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_6` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_6`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_7` int(10) NOT NULL DEFAULT '0' AFTER `stat_value7`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_7` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_7`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_8` int(10) NOT NULL DEFAULT '0' AFTER `stat_value8`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_8` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_8`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_9` int(10) NOT NULL DEFAULT '0' AFTER `stat_value9`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_9` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_9`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk1_10` int(10) NOT NULL DEFAULT '0' AFTER `stat_value10`;
ALTER TABLE `item_template` ADD COLUMN `stat_unk2_10` int(10) NOT NULL DEFAULT '0' AFTER `stat_unk1_10`;
ALTER TABLE `item_template` ADD COLUMN `DamageType` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ammo_type`;
ALTER TABLE `item_template` ADD COLUMN `StatScalingFactor` float NOT NULL AFTER `FoodType`;
ALTER TABLE `item_template` ADD COLUMN `Unknown400_1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `StatScalingFactor`;
ALTER TABLE `item_template` ADD COLUMN `Unknown400_2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Unknown400_1`;
ALTER TABLE `item_template` CHANGE COLUMN `delay` `delay` int(10) NOT NULL;
ALTER TABLE `item_template` DROP `StatsCount`;
ALTER TABLE `item_template` DROP `ScalingStatValue`;
ALTER TABLE `item_template` DROP `dmg_min1`;
ALTER TABLE `item_template` DROP `dmg_max1`;
ALTER TABLE `item_template` DROP `dmg_type1`;
ALTER TABLE `item_template` DROP `dmg_min2`;
ALTER TABLE `item_template` DROP `dmg_max2`;
ALTER TABLE `item_template` DROP `dmg_type2`;
ALTER TABLE `item_template` DROP `armor`;
ALTER TABLE `item_template` DROP `holy_res`;
ALTER TABLE `item_template` DROP `fire_res`;
ALTER TABLE `item_template` DROP `nature_res`;
ALTER TABLE `item_template` DROP `frost_res`;
ALTER TABLE `item_template` DROP `shadow_res`;
ALTER TABLE `item_template` DROP `arcane_res`;
ALTER TABLE `item_template` DROP `ammo_type`;
ALTER TABLE `item_template` DROP `block`;

View file

@ -277,166 +277,6 @@ void WorldSession::HandleDestroyItemOpcode(WorldPacket& recv_data)
_player->DestroyItem(bag, slot, true); _player->DestroyItem(bag, slot, true);
} }
// Only _static_ data send in this packet !!!
void WorldSession::HandleItemQuerySingleOpcode(WorldPacket& recv_data)
{
// DEBUG_LOG("WORLD: CMSG_ITEM_QUERY_SINGLE");
uint32 item;
recv_data >> item;
DETAIL_LOG("STORAGE: Item Query = %u", item);
ItemPrototype const* pProto = ObjectMgr::GetItemPrototype(item);
if (pProto)
{
int loc_idx = GetSessionDbLocaleIndex();
std::string name = pProto->Name1;
std::string description = pProto->Description;
sObjectMgr.GetItemLocaleStrings(pProto->ItemId, loc_idx, &name, &description);
// guess size
WorldPacket data(SMSG_ITEM_QUERY_SINGLE_RESPONSE, 600);
data << pProto->ItemId;
data << pProto->Class;
data << pProto->SubClass;
data << int32(pProto->Unk0); // new 2.0.3, not exist in wdb cache?
data << name;
data << uint8(0x00); // pProto->Name2; // blizz not send name there, just uint8(0x00); <-- \0 = empty string = empty name...
data << uint8(0x00); // pProto->Name3; // blizz not send name there, just uint8(0x00);
data << uint8(0x00); // pProto->Name4; // blizz not send name there, just uint8(0x00);
data << pProto->DisplayInfoID;
data << pProto->Quality;
data << pProto->Flags;
data << pProto->Flags2; // new in 3.2
data << pProto->BuyPrice;
data << pProto->SellPrice;
data << pProto->InventoryType;
data << pProto->AllowableClass;
data << pProto->AllowableRace;
data << pProto->ItemLevel;
data << pProto->RequiredLevel;
data << pProto->RequiredSkill;
data << pProto->RequiredSkillRank;
data << pProto->RequiredSpell;
data << pProto->RequiredHonorRank;
data << pProto->RequiredCityRank;
data << pProto->RequiredReputationFaction;
data << pProto->RequiredReputationRank;
data << int32(pProto->MaxCount);
data << int32(pProto->Stackable);
data << pProto->ContainerSlots;
data << pProto->StatsCount; // item stats count
for (uint32 i = 0; i < pProto->StatsCount; ++i)
{
data << pProto->ItemStat[i].ItemStatType;
data << pProto->ItemStat[i].ItemStatValue;
data << uint32(0); // 4.0.0
data << uint32(0); // 4.0.0
}
data << pProto->ScalingStatDistribution; // scaling stats distribution
data << pProto->ScalingStatValue; // some kind of flags used to determine stat values column
//for(int i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
//{
// data << pProto->Damage[i].DamageMin;
// data << pProto->Damage[i].DamageMax;
// data << pProto->Damage[i].DamageType;
//}
// resistances (7)
//data << pProto->Armor;
//data << pProto->HolyRes;
//data << pProto->FireRes;
//data << pProto->NatureRes;
//data << pProto->FrostRes;
//data << pProto->ShadowRes;
//data << pProto->ArcaneRes;
data << uint32(0); // DamageType
//data << pProto->AmmoType;
data << pProto->Delay;
data << pProto->RangedModRange;
for (int s = 0; s < MAX_ITEM_PROTO_SPELLS; ++s)
{
// send DBC data for cooldowns in same way as it used in Spell::SendSpellCooldown
// use `item_template` or if not set then only use spell cooldowns
SpellEntry const* spell = sSpellStore.LookupEntry(pProto->Spells[s].SpellId);
if (spell)
{
bool db_data = pProto->Spells[s].SpellCooldown >= 0 || pProto->Spells[s].SpellCategoryCooldown >= 0;
data << pProto->Spells[s].SpellId;
data << pProto->Spells[s].SpellTrigger;
data << uint32(-abs(pProto->Spells[s].SpellCharges));
if (db_data)
{
data << uint32(pProto->Spells[s].SpellCooldown);
data << uint32(pProto->Spells[s].SpellCategory);
data << uint32(pProto->Spells[s].SpellCategoryCooldown);
}
else
{
data << uint32(spell->GetRecoveryTime());
data << uint32(spell->GetCategory());
data << uint32(spell->GetCategoryRecoveryTime());
}
}
else
{
data << uint32(0);
data << uint32(0);
data << uint32(0);
data << uint32(-1);
data << uint32(0);
data << uint32(-1);
}
}
data << pProto->Bonding;
data << description;
data << pProto->PageText;
data << pProto->LanguageID;
data << pProto->PageMaterial;
data << pProto->StartQuest;
data << pProto->LockID;
data << int32(pProto->Material);
data << pProto->Sheath;
data << pProto->RandomProperty;
data << pProto->RandomSuffix;
data << pProto->Block;
data << pProto->ItemSet;
data << pProto->MaxDurability;
data << pProto->Area;
data << pProto->Map; // Added in 1.12.x & 2.0.1 client branch
data << pProto->BagFamily;
data << pProto->TotemCategory;
for (int s = 0; s < MAX_ITEM_PROTO_SOCKETS; ++s)
{
data << pProto->Socket[s].Color;
data << pProto->Socket[s].Content;
}
data << uint32(pProto->socketBonus);
data << uint32(pProto->GemProperties);
data << int32(pProto->RequiredDisenchantSkill);
data << float(pProto->ArmorDamageModifier);
data << uint32(pProto->Duration); // added in 2.4.2.8209, duration (seconds)
data << uint32(pProto->ItemLimitCategory); // WotLK, ItemLimitCategory
data << uint32(pProto->HolidayId); // Holiday.dbc?
data << float(0); // damage/armor scaling factor
data << uint32(0); // 4.0.0
data << uint32(0); // 4.0.0
SendPacket( &data );
}
else
{
DEBUG_LOG("WORLD: CMSG_ITEM_QUERY_SINGLE - NO item INFO! (ENTRY: %u)", item);
WorldPacket data(SMSG_ITEM_QUERY_SINGLE_RESPONSE, 4);
data << uint32(item | 0x80000000);
SendPacket(&data);
}
}
void WorldSession::HandleReadItemOpcode(WorldPacket& recv_data) void WorldSession::HandleReadItemOpcode(WorldPacket& recv_data)
{ {
// DEBUG_LOG( "WORLD: CMSG_READ_ITEM"); // DEBUG_LOG( "WORLD: CMSG_READ_ITEM");
@ -1072,37 +912,6 @@ void WorldSession::SendItemEnchantTimeUpdate(ObjectGuid playerGuid, ObjectGuid i
SendPacket(&data); SendPacket(&data);
} }
void WorldSession::HandleItemNameQueryOpcode(WorldPacket& recv_data)
{
uint32 itemid;
recv_data >> itemid;
recv_data.read_skip<uint64>(); // guid
DEBUG_LOG("WORLD: CMSG_ITEM_NAME_QUERY %u", itemid);
if (ItemPrototype const* pProto = ObjectMgr::GetItemPrototype(itemid))
{
int loc_idx = GetSessionDbLocaleIndex();
std::string name = pProto->Name1;
sObjectMgr.GetItemLocaleStrings(pProto->ItemId, loc_idx, &name);
// guess size
WorldPacket data(SMSG_ITEM_NAME_QUERY_RESPONSE, (4 + 10));
data << uint32(pProto->ItemId);
data << name;
data << uint32(pProto->InventoryType);
SendPacket(&data);
return;
}
else
{
// listed in dbc or not expected to exist unknown item
if(true/*sItemStore.LookupEntry(itemid)*/)
sLog.outErrorDb("WORLD: CMSG_ITEM_NAME_QUERY for item %u failed (item listed in Item.dbc but not exist in DB)", itemid);
else
sLog.outError("WORLD: CMSG_ITEM_NAME_QUERY for item %u failed (unknown item, not listed in Item.dbc)", itemid);
}
}
void WorldSession::HandleWrapItemOpcode(WorldPacket& recv_data) void WorldSession::HandleWrapItemOpcode(WorldPacket& recv_data)
{ {
DEBUG_LOG("Received opcode CMSG_WRAP_ITEM"); DEBUG_LOG("Received opcode CMSG_WRAP_ITEM");

View file

@ -519,17 +519,12 @@ enum ItemExtraFlags
#pragma pack(push,1) #pragma pack(push,1)
#endif #endif
struct _Damage
{
float DamageMin;
float DamageMax;
uint32 DamageType; // id from Resistances.dbc
};
struct _ItemStat struct _ItemStat
{ {
uint32 ItemStatType; uint32 ItemStatType;
int32 ItemStatValue; int32 ItemStatValue;
uint32 ItemStatType2;
int32 ItemStatValue2;
}; };
struct _Spell struct _Spell
{ {
@ -548,7 +543,6 @@ struct _Socket
uint32 Content; uint32 Content;
}; };
#define MAX_ITEM_PROTO_DAMAGES 2 // changed in 3.1.0
#define MAX_ITEM_PROTO_SOCKETS 3 #define MAX_ITEM_PROTO_SOCKETS 3
#define MAX_ITEM_PROTO_SPELLS 5 #define MAX_ITEM_PROTO_SPELLS 5
#define MAX_ITEM_PROTO_STATS 10 #define MAX_ITEM_PROTO_STATS 10
@ -564,6 +558,9 @@ struct ItemPrototype
uint32 Quality; uint32 Quality;
uint32 Flags; uint32 Flags;
uint32 Flags2; uint32 Flags2;
float Unknown;
float Unknown1;
uint32 Unknown2;
uint32 BuyCount; uint32 BuyCount;
uint32 BuyPrice; uint32 BuyPrice;
uint32 SellPrice; uint32 SellPrice;
@ -582,20 +579,10 @@ struct ItemPrototype
int32 MaxCount; // <=0: no limit int32 MaxCount; // <=0: no limit
int32 Stackable; // 0: not allowed, -1: put in player coin info tab and don't limit stacking (so 1 slot) int32 Stackable; // 0: not allowed, -1: put in player coin info tab and don't limit stacking (so 1 slot)
uint32 ContainerSlots; uint32 ContainerSlots;
uint32 StatsCount;
_ItemStat ItemStat[MAX_ITEM_PROTO_STATS]; _ItemStat ItemStat[MAX_ITEM_PROTO_STATS];
uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc
uint32 ScalingStatValue; // mask for selecting column in ScalingStatValues.dbc uint32 DamageType;
_Damage Damage[MAX_ITEM_PROTO_DAMAGES]; // TODO: remove it
uint32 Armor; // TODO: remove it
uint32 HolyRes; // TODO: remove it
uint32 FireRes; // TODO: remove it
uint32 NatureRes; // TODO: remove it
uint32 FrostRes; // TODO: remove it
uint32 ShadowRes; // TODO: remove it
uint32 ArcaneRes; // TODO: remove it
uint32 Delay; uint32 Delay;
uint32 AmmoType; // TODO: remove it
float RangedModRange; float RangedModRange;
_Spell Spells[MAX_ITEM_PROTO_SPELLS]; _Spell Spells[MAX_ITEM_PROTO_SPELLS];
uint32 Bonding; uint32 Bonding;
@ -609,7 +596,6 @@ struct ItemPrototype
uint32 Sheath; uint32 Sheath;
uint32 RandomProperty; // id from ItemRandomProperties.dbc uint32 RandomProperty; // id from ItemRandomProperties.dbc
uint32 RandomSuffix; // id from ItemRandomSuffix.dbc uint32 RandomSuffix; // id from ItemRandomSuffix.dbc
uint32 Block;
uint32 ItemSet; // id from ItemSet.dbc uint32 ItemSet; // id from ItemSet.dbc
uint32 MaxDurability; uint32 MaxDurability;
uint32 Area; // id from AreaTable.dbc uint32 Area; // id from AreaTable.dbc
@ -627,6 +613,9 @@ struct ItemPrototype
uint32 ScriptId; uint32 ScriptId;
uint32 DisenchantID; uint32 DisenchantID;
uint32 FoodType; uint32 FoodType;
float StatScalingFactor;
uint32 Unknown400_1;
uint32 Unknown400_2;
uint32 MinMoneyLoot; uint32 MinMoneyLoot;
uint32 MaxMoneyLoot; uint32 MaxMoneyLoot;
uint32 ExtraFlags; // see ItemExtraFlags uint32 ExtraFlags; // see ItemExtraFlags

View file

@ -844,29 +844,29 @@ void ObjectMgr::LoadEquipmentTemplates()
if (!eqInfo->equipentry[j]) if (!eqInfo->equipentry[j])
continue; continue;
//ItemEntry const *dbcitem = sItemStore.LookupEntry(eqInfo->equipentry[j]); ItemEntry const *dbcitem = sItemStore.LookupEntry(eqInfo->equipentry[j]);
//if (!dbcitem) if (!dbcitem)
//{ {
// sLog.outErrorDb("Unknown item (entry=%u) in creature_equip_template.equipentry%u for entry = %u, forced to 0.", eqInfo->equipentry[j], j+1, i); sLog.outErrorDb("Unknown item (entry=%u) in creature_equip_template.equipentry%u for entry = %u, forced to 0.", eqInfo->equipentry[j], j+1, i);
// const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0; const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0;
// continue; continue;
//} }
//if (dbcitem->InventoryType != INVTYPE_WEAPON && if (dbcitem->InventoryType != INVTYPE_WEAPON &&
// dbcitem->InventoryType != INVTYPE_SHIELD && dbcitem->InventoryType != INVTYPE_SHIELD &&
// dbcitem->InventoryType != INVTYPE_RANGED && dbcitem->InventoryType != INVTYPE_RANGED &&
// dbcitem->InventoryType != INVTYPE_2HWEAPON && dbcitem->InventoryType != INVTYPE_2HWEAPON &&
// dbcitem->InventoryType != INVTYPE_WEAPONMAINHAND && dbcitem->InventoryType != INVTYPE_WEAPONMAINHAND &&
// dbcitem->InventoryType != INVTYPE_WEAPONOFFHAND && dbcitem->InventoryType != INVTYPE_WEAPONOFFHAND &&
// dbcitem->InventoryType != INVTYPE_HOLDABLE && dbcitem->InventoryType != INVTYPE_HOLDABLE &&
// dbcitem->InventoryType != INVTYPE_THROWN && dbcitem->InventoryType != INVTYPE_THROWN &&
// dbcitem->InventoryType != INVTYPE_RANGEDRIGHT && dbcitem->InventoryType != INVTYPE_RANGEDRIGHT &&
// dbcitem->InventoryType != INVTYPE_RELIC) dbcitem->InventoryType != INVTYPE_RELIC)
//{ {
// sLog.outErrorDb("Item (entry=%u) in creature_equip_template.equipentry%u for entry = %u is not equipable in a hand, forced to 0.", eqInfo->equipentry[j], j+1, i); sLog.outErrorDb("Item (entry=%u) in creature_equip_template.equipentry%u for entry = %u is not equipable in a hand, forced to 0.", eqInfo->equipentry[j], j+1, i);
// const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0; const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0;
//} }
} }
} }
@ -1795,7 +1795,7 @@ void ObjectMgr::LoadItemPrototypes()
for (uint32 i = 1; i < sItemStorage.MaxEntry; ++i) for (uint32 i = 1; i < sItemStorage.MaxEntry; ++i)
{ {
ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype >(i); ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype >(i);
//ItemEntry const *dbcitem = sItemStore.LookupEntry(i); ItemEntry const *dbcitem = sItemStore.LookupEntry(i);
if(!proto) if(!proto)
{ {
/* to many errors, and possible not all items really used in game /* to many errors, and possible not all items really used in game
@ -1805,13 +1805,13 @@ void ObjectMgr::LoadItemPrototypes()
continue; continue;
} }
if(true/*dbcitem*/) if (dbcitem)
{ {
//if(proto->Class != dbcitem->Class) if(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); 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.
for enable also uncomment Subclass field in ItemEntry structure and in Itemfmt[] for enable also uncomment Subclass field in ItemEntry structure and in Itemfmt[]
if(proto->SubClass != dbcitem->SubClass) if(proto->SubClass != dbcitem->SubClass)
@ -1821,34 +1821,34 @@ void ObjectMgr::LoadItemPrototypes()
} }
*/ */
//if(proto->Unk0 != dbcitem->Unk0) if(proto->Unk0 != dbcitem->Unk0)
//{ {
// sLog.outErrorDb("Item (Entry: %u) not correct %i Unk0, must be %i (still using DB value).",i,proto->Unk0,dbcitem->Unk0); sLog.outErrorDb("Item (Entry: %u) not correct %i Unk0, must be %i (still using DB value).",i,proto->Unk0,dbcitem->Unk0);
// // It safe let use Unk0 from DB // It safe let use Unk0 from DB
//} }
//if(proto->Material != dbcitem->Material) if(proto->Material != dbcitem->Material)
//{ {
// sLog.outErrorDb("Item (Entry: %u) not correct %i material, must be %i (still using DB value).",i,proto->Material,dbcitem->Material); sLog.outErrorDb("Item (Entry: %u) not correct %i material, must be %i (still using DB value).",i,proto->Material,dbcitem->Material);
// // It safe let use Material from DB // It safe let use Material from DB
//} }
//if(proto->InventoryType != dbcitem->InventoryType) if(proto->InventoryType != dbcitem->InventoryType)
//{ {
// sLog.outErrorDb("Item (Entry: %u) not correct %u inventory type, must be %u (still using DB value).",i,proto->InventoryType,dbcitem->InventoryType); sLog.outErrorDb("Item (Entry: %u) not correct %u inventory type, must be %u (still using DB value).",i,proto->InventoryType,dbcitem->InventoryType);
// // It safe let use InventoryType from DB // It safe let use InventoryType from DB
//} }
//if(proto->DisplayInfoID != dbcitem->DisplayId) if(proto->DisplayInfoID != dbcitem->DisplayId)
//{ {
// sLog.outErrorDb("Item (Entry: %u) not correct %u display id, must be %u (using it).",i,proto->DisplayInfoID,dbcitem->DisplayId); sLog.outErrorDb("Item (Entry: %u) not correct %u display id, must be %u (using it).",i,proto->DisplayInfoID,dbcitem->DisplayId);
// const_cast<ItemPrototype*>(proto)->DisplayInfoID = dbcitem->DisplayId; const_cast<ItemPrototype*>(proto)->DisplayInfoID = dbcitem->DisplayId;
//} }
//if(proto->Sheath != dbcitem->Sheath) if(proto->Sheath != dbcitem->Sheath)
//{ {
// sLog.outErrorDb("Item (Entry: %u) not correct %u sheath, must be %u (using it).",i,proto->Sheath,dbcitem->Sheath); sLog.outErrorDb("Item (Entry: %u) not correct %u sheath, must be %u (using it).",i,proto->Sheath,dbcitem->Sheath);
// const_cast<ItemPrototype*>(proto)->Sheath = dbcitem->Sheath; const_cast<ItemPrototype*>(proto)->Sheath = dbcitem->Sheath;
//} }
} }
else else
{ {
@ -2018,12 +2018,6 @@ void ObjectMgr::LoadItemPrototypes()
} }
} }
if (proto->StatsCount > MAX_ITEM_PROTO_STATS)
{
sLog.outErrorDb("Item (Entry: %u) has too large value in statscount (%u), replace by hardcoded limit (%u).", i, proto->StatsCount, MAX_ITEM_PROTO_STATS);
const_cast<ItemPrototype*>(proto)->StatsCount = MAX_ITEM_PROTO_STATS;
}
for (int j = 0; j < MAX_ITEM_PROTO_STATS; ++j) for (int j = 0; j < MAX_ITEM_PROTO_STATS; ++j)
{ {
// for ItemStatValue != 0 // for ItemStatValue != 0
@ -2044,13 +2038,10 @@ void ObjectMgr::LoadItemPrototypes()
} }
} }
for (int j = 0; j < MAX_ITEM_PROTO_DAMAGES; ++j) if (proto->DamageType >= MAX_SPELL_SCHOOL)
{ {
if (proto->Damage[j].DamageType >= MAX_SPELL_SCHOOL) sLog.outErrorDb("Item (Entry: %u) has wrong damagetype (%u)", i, proto->DamageType);
{ const_cast<ItemPrototype*>(proto)->DamageType = 0;
sLog.outErrorDb("Item (Entry: %u) has wrong dmg_type%d (%u)", i, j + 1, proto->Damage[j].DamageType);
const_cast<ItemPrototype*>(proto)->Damage[j].DamageType = 0;
}
} }
// special format // special format
@ -2219,15 +2210,15 @@ void ObjectMgr::LoadItemPrototypes()
continue; continue;
} }
//if(BAG_FAMILY_MASK_CURRENCY_TOKENS & mask) /*if(BAG_FAMILY_MASK_CURRENCY_TOKENS & mask)
//{ {
// CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(proto->ItemId); CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(proto->ItemId);
// if(!ctEntry) if(!ctEntry)
// { {
// sLog.outErrorDb("Item (Entry: %u) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit",i); sLog.outErrorDb("Item (Entry: %u) has currency bag family bit set in BagFamily but not listed in CurrencyTypes.dbc, remove bit",i);
// const_cast<ItemPrototype*>(proto)->BagFamily &= ~mask; const_cast<ItemPrototype*>(proto)->BagFamily &= ~mask;
// } }
//} }*/
} }
} }

View file

@ -451,8 +451,8 @@ void InitializeOpcodes()
//OPCODE(SMSG_PET_NAME_INVALID, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(SMSG_PET_NAME_INVALID, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_PET_SPELLS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_PET_SPELLS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_PET_MODE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //OPCODE(SMSG_PET_MODE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipHelloOpcode ); OPCODE(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipHelloOpcode );
//OPCODE(CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipSelectOptionOpcode ); OPCODE(CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipSelectOptionOpcode );
OPCODE(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_GOSSIP_COMPLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); OPCODE(SMSG_GOSSIP_COMPLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(CMSG_NPC_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNpcTextQueryOpcode ); OPCODE(CMSG_NPC_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNpcTextQueryOpcode );

View file

@ -436,8 +436,8 @@ enum Opcodes
SMSG_PET_NAME_INVALID = 0x1179, SMSG_PET_NAME_INVALID = 0x1179,
SMSG_PET_SPELLS = 0x4114, // 4.3.4 15595 SMSG_PET_SPELLS = 0x4114, // 4.3.4 15595
SMSG_PET_MODE = 0x117B, SMSG_PET_MODE = 0x117B,
CMSG_GOSSIP_HELLO = 0x117C, CMSG_GOSSIP_HELLO = 0x4525, // 4.3.4 15595
CMSG_GOSSIP_SELECT_OPTION = 0x117D, CMSG_GOSSIP_SELECT_OPTION = 0x0216, // 4.3.4 15595
SMSG_GOSSIP_MESSAGE = 0x2035, // 4.3.4 15595 SMSG_GOSSIP_MESSAGE = 0x2035, // 4.3.4 15595
SMSG_GOSSIP_COMPLETE = 0x0806, // 4.3.4 15595 SMSG_GOSSIP_COMPLETE = 0x0806, // 4.3.4 15595
CMSG_NPC_TEXT_QUERY = 0x4E24, // 4.3.4 15595 CMSG_NPC_TEXT_QUERY = 0x4E24, // 4.3.4 15595

View file

@ -7122,7 +7122,7 @@ void Player::_ApplyItemBonuses(ItemPrototype const* proto, uint8 slot, bool appl
if (ssd && ssd_level > ssd->MaxLevel) if (ssd && ssd_level > ssd->MaxLevel)
ssd_level = ssd->MaxLevel; ssd_level = ssd->MaxLevel;
ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : NULL; ScalingStatValuesEntry const* ssv = proto->StatScalingFactor ? sScalingStatValuesStore.LookupEntry(ssd_level) : NULL;
if (only_level_scale && !ssv) if (only_level_scale && !ssv)
return; return;
@ -7136,12 +7136,10 @@ void Player::_ApplyItemBonuses(ItemPrototype const* proto, uint8 slot, bool appl
if (ssd->StatMod[i] < 0) if (ssd->StatMod[i] < 0)
continue; continue;
statType = ssd->StatMod[i]; statType = ssd->StatMod[i];
val = (ssv->getssdMultiplier(proto->ScalingStatValue) * ssd->Modifier[i]) / 10000; val = (ssv->getssdMultiplier(proto->StatScalingFactor) * ssd->Modifier[i]) / 10000;
} }
else else
{ {
if (i >= proto->StatsCount)
continue;
statType = proto->ItemStat[i].ItemStatType; statType = proto->ItemStat[i].ItemStatType;
val = proto->ItemStat[i].ItemStatValue; val = proto->ItemStat[i].ItemStatValue;
} }
@ -7301,7 +7299,7 @@ void Player::_ApplyItemBonuses(ItemPrototype const* proto, uint8 slot, bool appl
// Apply Spell Power from ScalingStatValue if set // Apply Spell Power from ScalingStatValue if set
if (ssv) if (ssv)
{ {
if (int32 spellbonus = ssv->getSpellBonus(proto->ScalingStatValue)) if (int32 spellbonus = ssv->getSpellBonus(proto->StatScalingFactor))
ApplySpellPowerBonus(spellbonus, apply); ApplySpellPowerBonus(spellbonus, apply);
} }
@ -7309,7 +7307,7 @@ void Player::_ApplyItemBonuses(ItemPrototype const* proto, uint8 slot, bool appl
uint32 armor = proto->GetArmor(); uint32 armor = proto->GetArmor();
if (ssv) if (ssv)
{ {
if (uint32 ssvarmor = ssv->getArmorMod(proto->ScalingStatValue)) if (uint32 ssvarmor = ssv->getArmorMod(proto->StatScalingFactor))
armor = ssvarmor; armor = ssvarmor;
} }
// Add armor bonus from ArmorDamageModifier if > 0 // Add armor bonus from ArmorDamageModifier if > 0
@ -7332,27 +7330,6 @@ void Player::_ApplyItemBonuses(ItemPrototype const* proto, uint8 slot, bool appl
} }
} }
if (proto->Block)
HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(proto->Block), apply);
if (proto->HolyRes)
HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(proto->HolyRes), apply);
if (proto->FireRes)
HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(proto->FireRes), apply);
if (proto->NatureRes)
HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(proto->NatureRes), apply);
if (proto->FrostRes)
HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, float(proto->FrostRes), apply);
if (proto->ShadowRes)
HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, float(proto->ShadowRes), apply);
if (proto->ArcaneRes)
HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply);
WeaponAttackType attType = BASE_ATTACK; WeaponAttackType attType = BASE_ATTACK;
float damage = 0.0f; float damage = 0.0f;
@ -7373,7 +7350,7 @@ void Player::_ApplyItemBonuses(ItemPrototype const* proto, uint8 slot, bool appl
// If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
if (ssv) if (ssv)
{ {
if ((extraDPS = ssv->getDPSMod(proto->ScalingStatValue))) if ((extraDPS = ssv->getDPSMod(proto->StatScalingFactor)))
{ {
float average = extraDPS * proto->Delay / 1000.0f; float average = extraDPS * proto->Delay / 1000.0f;
minDamage = 0.7f * average; minDamage = 0.7f * average;
@ -7396,7 +7373,7 @@ void Player::_ApplyItemBonuses(ItemPrototype const* proto, uint8 slot, bool appl
// Apply feral bonus from ScalingStatValue if set // Apply feral bonus from ScalingStatValue if set
if (ssv) if (ssv)
{ {
if (int32 feral_bonus = ssv->getFeralBonus(proto->ScalingStatValue)) if (int32 feral_bonus = ssv->getFeralBonus(proto->StatScalingFactor))
ApplyFeralAPBonus(feral_bonus, apply); ApplyFeralAPBonus(feral_bonus, apply);
} }
// Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue) // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
@ -19738,7 +19715,6 @@ void Player::AddSpellAndCategoryCooldowns(SpellEntry const* spellInfo, uint32 it
// some special item spells without correct cooldown in SpellInfo // some special item spells without correct cooldown in SpellInfo
// cooldown information stored in item prototype // cooldown information stored in item prototype
// This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
if (itemId) if (itemId)
{ {

View file

@ -27,8 +27,8 @@ const char GameObjectInfoAddonInfofmt[] = "iffff";
const char EquipmentInfofmt[] = "iiii"; const char EquipmentInfofmt[] = "iiii";
const char GameObjectInfosrcfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis"; const char GameObjectInfosrcfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis";
const char GameObjectInfodstfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; const char GameObjectInfodstfmt[] = "iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii";
const char ItemPrototypesrcfmt[] = "iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiiii"; const char ItemPrototypesrcfmt[]= "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiisiifiiiii";
const char ItemPrototypedstfmt[] = "iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiii"; const char ItemPrototypedstfmt[]= "iiiisiiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiifiiiiiifiiiii";
const char PageTextfmt[] = "isi"; const char PageTextfmt[] = "isi";
const char InstanceTemplatesrcfmt[] = "iiiis"; const char InstanceTemplatesrcfmt[] = "iiiis";
const char InstanceTemplatedstfmt[] = "iiiii"; const char InstanceTemplatedstfmt[] = "iiiii";

View file

@ -394,7 +394,7 @@ Spell::Spell(Unit* caster, SpellEntry const* info, bool triggered, ObjectGuid or
if ((m_caster->getClassMask() & CLASSMASK_WAND_USERS) != 0 && m_caster->GetTypeId() == TYPEID_PLAYER) if ((m_caster->getClassMask() & CLASSMASK_WAND_USERS) != 0 && m_caster->GetTypeId() == TYPEID_PLAYER)
{ {
if (Item* pItem = ((Player*)m_caster)->GetWeaponForAttack(RANGED_ATTACK)) if (Item* pItem = ((Player*)m_caster)->GetWeaponForAttack(RANGED_ATTACK))
m_spellSchoolMask = SpellSchoolMask(1 << pItem->GetProto()->Damage[0].DamageType); m_spellSchoolMask = SpellSchoolMask(1 << pItem->GetProto()->DamageType);
} }
} }
// Set health leech amount to zero // Set health leech amount to zero

View file

@ -3661,7 +3661,7 @@ float Unit::GetUnitBlockChance() const
if (player->CanBlock() && player->CanUseEquippedWeapon(OFF_ATTACK)) if (player->CanBlock() && player->CanUseEquippedWeapon(OFF_ATTACK))
{ {
Item* tmpitem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); Item* tmpitem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetProto()->Block) if (tmpitem && !tmpitem->IsBroken())
return GetFloatValue(PLAYER_BLOCK_PERCENTAGE); return GetFloatValue(PLAYER_BLOCK_PERCENTAGE);
} }
// is player but has no block ability or no not broken shield equipped // is player but has no block ability or no not broken shield equipped

View file

@ -485,7 +485,6 @@ class MANGOS_DLL_SPEC WorldSession
void HandleSetContactNotesOpcode(WorldPacket& recvPacket); void HandleSetContactNotesOpcode(WorldPacket& recvPacket);
void HandleBugOpcode(WorldPacket& recvPacket); void HandleBugOpcode(WorldPacket& recvPacket);
void HandleSetAmmoOpcode(WorldPacket& recvPacket); void HandleSetAmmoOpcode(WorldPacket& recvPacket);
void HandleItemNameQueryOpcode(WorldPacket& recvPacket);
void HandleAreaTriggerOpcode(WorldPacket& recvPacket); void HandleAreaTriggerOpcode(WorldPacket& recvPacket);
@ -638,7 +637,6 @@ class MANGOS_DLL_SPEC WorldSession
void HandleSwapInvItemOpcode(WorldPacket& recvPacket); void HandleSwapInvItemOpcode(WorldPacket& recvPacket);
void HandleDestroyItemOpcode(WorldPacket& recvPacket); void HandleDestroyItemOpcode(WorldPacket& recvPacket);
void HandleAutoEquipItemOpcode(WorldPacket& recvPacket); void HandleAutoEquipItemOpcode(WorldPacket& recvPacket);
void HandleItemQuerySingleOpcode(WorldPacket& recvPacket);
void HandleSellItemOpcode(WorldPacket& recvPacket); void HandleSellItemOpcode(WorldPacket& recvPacket);
void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket); void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket);
void HandleBuyItemOpcode(WorldPacket& recvPacket); void HandleBuyItemOpcode(WorldPacket& recvPacket);

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "0113" #define REVISION_NR "0114"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__

View file

@ -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_0099_xxxxx_01_characters_character_phase_data" #define REVISION_DB_CHARACTERS "required_0099_xxxxx_01_characters_character_phase_data"
#define REVISION_DB_MANGOS "required_0083_12090_01_mangos_spell_template" #define REVISION_DB_MANGOS "required_0114_xxxxx_01_mangos_item_template"
#define REVISION_DB_REALMD "required_0014_xxxxx_01_realmd_account_access" #define REVISION_DB_REALMD "required_0014_xxxxx_01_realmd_account_access"
#endif // __REVISION_SQL_H__ #endif // __REVISION_SQL_H__