diff options
-rw-r--r-- | sql/updates/world/2012_07_03_00_world_item_template_addon_434.sql | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 4 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2fmt.h | 4 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCStructure.h | 36 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCfmt.h | 8 | ||||
-rwxr-xr-x | src/server/game/Globals/ObjectMgr.cpp | 104 |
6 files changed, 124 insertions, 33 deletions
diff --git a/sql/updates/world/2012_07_03_00_world_item_template_addon_434.sql b/sql/updates/world/2012_07_03_00_world_item_template_addon_434.sql new file mode 100644 index 00000000000..6cc5b547867 --- /dev/null +++ b/sql/updates/world/2012_07_03_00_world_item_template_addon_434.sql @@ -0,0 +1 @@ +ALTER TABLE `item_template_addon` DROP `BuyCount`; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index e4632e835d8..7f6eee0206c 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -62,6 +62,9 @@ struct ItemSparseEntry uint32 Quality; // 1 uint32 Flags; // 2 uint32 Flags2; // 3 + float Unk430_1; + float Unk430_2; + uint32 BuyCount; uint32 BuyPrice; // 4 uint32 SellPrice; // 5 uint32 InventoryType; // 6 @@ -109,7 +112,6 @@ struct ItemSparseEntry uint32 RandomProperty; // 108 uint32 RandomSuffix; // 109 uint32 ItemSet; // 110 - uint32 MaxDurability; // 111 uint32 Area; // 112 uint32 Map; // 113 uint32 BagFamily; // 114 diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index ed48443d543..3cc3a9b7693 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -20,7 +20,7 @@ const char Itemfmt[]="niiiiiii"; const char ItemCurrencyCostfmt[]="xn"; -const char ItemSparsefmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisssssiiiiiiiiiiiiiiiiiiiiiiifiiifii"; +const char ItemSparsefmt[]="niiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisssssiiiiiiiiiiiiiiiiiiiiiifiiifii"; const char ItemExtendedCostEntryfmt[]="nxxiiiiiiiiiiiixiiiiiiiiiixxxxx"; -#endif
\ No newline at end of file +#endif diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 54e961eaf84..1bf09ea4036 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1269,21 +1269,21 @@ struct LFGDungeonEntry { uint32 ID; // 0 //char* name[16]; // 1-17 Name lang - uint32 minlevel; // 18 - uint32 maxlevel; // 19 - uint32 reclevel; // 20 - uint32 recminlevel; // 21 - uint32 recmaxlevel; // 22 - int32 map; // 23 - uint32 difficulty; // 24 - //uint32 unk; // 25 - uint32 type; // 26 - //uint32 unk2; // 27 - //char* unk3; // 28 - uint32 expansion; // 29 - //uint32 unk4; // 30 - uint32 grouptype; // 31 - //char* desc; // 32 Description + uint32 minlevel; // 2 + uint32 maxlevel; // 3 + uint32 reclevel; // 4 + uint32 recminlevel; // 5 + uint32 recmaxlevel; // 6 + int32 map; // 7 + uint32 difficulty; // 8 + //uint32 unk; // 9 + uint32 type; // 10 + //uint32 unk2; // 11 + //char* unk3; // 12 + uint32 expansion; // 13 + //uint32 unk4; // 14 + uint32 grouptype; // 15 + //char* desc; // 16 Description // Helpers uint32 Entry() const { return ID + (type << 24); } }; @@ -1850,7 +1850,8 @@ struct SpellPowerEntry uint32 ManaCostPercentage; // 3 m_manaCostPct uint32 manaPerSecond; // 4 m_manaPerSecond //uint32 PowerDisplayId; // 5 m_powerDisplayID - id from PowerDisplay.dbc, new in 3.1 - //uint32 unk1; // 6 4.0.0 + //uint32 unk1; // 6 4.0.0 + //float unk2; // 7 4.3.0 }; struct SpellRuneCostEntry @@ -2216,6 +2217,9 @@ struct WorldMapAreaEntry int32 virtual_map_id; // 8 -1 (map_id have correct map) other: virtual map where zone show (map_id - where zone in fact internally) // int32 dungeonMap_id; // 9 pointer to DungeonMap.dbc (owerride x1, x2, y1, y2 coordinates) // uint32 parentMapID; // 10 + + // uint32 minRecommendedLevel; // 12 Minimum recommended level displayed on world map + // uint32 maxRecommendedLevel; // 13 Maximum recommended level displayed on world map }; #define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 50af8928e6b..5ed2568e0d0 100755 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -87,7 +87,7 @@ const char ItemLimitCategoryEntryfmt[]="nxii"; const char ItemRandomPropertiesfmt[]="nxiiixxs"; const char ItemRandomSuffixfmt[]="nsxiiiiiiiiii"; const char ItemSetEntryfmt[]="dsiiiiiiiiiixxxxxxxiiiiiiiiiiiiiiiiii"; -const char LFGDungeonEntryfmt[]="nxiiiiiiixixxixixx"; +const char LFGDungeonEntryfmt[]="nxiiiiiiixixxixixxxxx"; const char LiquidTypefmt[]="nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; const char PhaseEntryfmt[]="nsi"; @@ -109,7 +109,7 @@ const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiixi"; const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; const char SkillLinefmt[]="nisxixi"; const char SkillLineAbilityfmt[]="niiiixxiiiiixx"; -const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SpellCastTimefmt[]="nixx"; const char SpellCategoriesEntryfmt[]="diiiiii"; const char SpellDifficultyfmt[]="niiii"; @@ -129,7 +129,7 @@ const char SpellReagentsEntryfmt[]="diiiiiiiiiiiiiiii"; const char SpellScalingEntryfmt[]="diiiiffffffffffi"; const char SpellTotemsEntryfmt[]="niiii"; const char SpellTargetRestrictionsEntryfmt[]="nxiiii"; -const char SpellPowerEntryfmt[]="diiiixx"; +const char SpellPowerEntryfmt[]="diiiixxx"; const char SpellInterruptsEntryfmt[]="dixixi"; const char SpellEquippedItemsEntryfmt[]="diii"; const char SpellAuraOptionsEntryfmt[]="niiii"; @@ -154,7 +154,7 @@ const char TotemCategoryEntryfmt[]="nxii"; const char VehicleEntryfmt[]="niffffiiiiiiiifffffffffffffffssssfifiixx"; const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiixxxxxxxxxxxxxxxxxxxx"; const char WMOAreaTableEntryfmt[]="niiixxxxxiixxxx"; -const char WorldMapAreaEntryfmt[]="xinxffffixxx"; +const char WorldMapAreaEntryfmt[]="xinxffffixxxxx"; const char WorldMapOverlayEntryfmt[]="nxiiiixxxxxxxxx"; const char WorldSafeLocsEntryfmt[]="nifffx"; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index a14a49d2069..806d7bd5acd 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2191,6 +2191,89 @@ uint32 FillItemArmor(uint32 itemlevel, uint32 itemClass, uint32 itemSubclass, ui return uint32(shield->Value[quality] + 0.5f); } +uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventoryType, uint32 quality, uint32 itemLevel) +{ + if (itemClass != ITEM_CLASS_ARMOR && itemClass != ITEM_CLASS_WEAPON) + return 0; + + static float const qualityMultipliers[MAX_ITEM_QUALITY] = + { + 1.0f, 1.0f, 1.0f, 1.17f, 1.37f, 1.68f, 0.0f, 0.0f + }; + + static float const armorMultipliers[MAX_INVTYPE] = + { + 0.00f, // INVTYPE_NON_EQUIP + 0.59f, // INVTYPE_HEAD + 0.00f, // INVTYPE_NECK + 0.59f, // INVTYPE_SHOULDERS + 0.00f, // INVTYPE_BODY + 1.00f, // INVTYPE_CHEST + 0.35f, // INVTYPE_WAIST + 0.75f, // INVTYPE_LEGS + 0.49f, // INVTYPE_FEET + 0.35f, // INVTYPE_WRISTS + 0.35f, // INVTYPE_HANDS + 0.00f, // INVTYPE_FINGER + 0.00f, // INVTYPE_TRINKET + 0.00f, // INVTYPE_WEAPON + 1.00f, // INVTYPE_SHIELD + 0.00f, // INVTYPE_RANGED + 0.00f, // INVTYPE_CLOAK + 0.00f, // INVTYPE_2HWEAPON + 0.00f, // INVTYPE_BAG + 0.00f, // INVTYPE_TABARD + 1.00f, // INVTYPE_ROBE + 0.00f, // INVTYPE_WEAPONMAINHAND + 0.00f, // INVTYPE_WEAPONOFFHAND + 0.00f, // INVTYPE_HOLDABLE + 0.00f, // INVTYPE_AMMO + 0.00f, // INVTYPE_THROWN + 0.00f, // INVTYPE_RANGEDRIGHT + 0.00f, // INVTYPE_QUIVER + 0.00f, // INVTYPE_RELIC + }; + + static float const weaponMultipliers[MAX_ITEM_SUBCLASS_WEAPON] = + { + 0.89f, // ITEM_SUBCLASS_WEAPON_AXE + 1.03f, // ITEM_SUBCLASS_WEAPON_AXE2 + 0.77f, // ITEM_SUBCLASS_WEAPON_BOW + 0.77f, // ITEM_SUBCLASS_WEAPON_GUN + 0.89f, // ITEM_SUBCLASS_WEAPON_MACE + 1.03f, // ITEM_SUBCLASS_WEAPON_MACE2 + 1.03f, // ITEM_SUBCLASS_WEAPON_POLEARM + 0.89f, // ITEM_SUBCLASS_WEAPON_SWORD + 1.03f, // ITEM_SUBCLASS_WEAPON_SWORD2 + 0.00f, // ITEM_SUBCLASS_WEAPON_Obsolete + 1.03f, // ITEM_SUBCLASS_WEAPON_STAFF + 0.00f, // ITEM_SUBCLASS_WEAPON_EXOTIC + 0.00f, // ITEM_SUBCLASS_WEAPON_EXOTIC2 + 0.64f, // ITEM_SUBCLASS_WEAPON_FIST_WEAPON + 0.00f, // ITEM_SUBCLASS_WEAPON_MISCELLANEOUS + 0.64f, // ITEM_SUBCLASS_WEAPON_DAGGER + 0.64f, // ITEM_SUBCLASS_WEAPON_THROWN + 0.00f, // ITEM_SUBCLASS_WEAPON_SPEAR + 0.77f, // ITEM_SUBCLASS_WEAPON_CROSSBOW + 0.64f, // ITEM_SUBCLASS_WEAPON_WAND + 0.64f, // ITEM_SUBCLASS_WEAPON_FISHING_POLE + }; + + float levelPenalty = 1.0f; + if (itemLevel <= 28) + levelPenalty = 0.966f - float(28u - itemLevel) * 1.0f / 54.0f; + + if (itemClass == ITEM_CLASS_ARMOR) + { + if (inventoryType > INVTYPE_ROBE) + return 0; + + return 5 * uint32(23.0f * qualityMultipliers[quality] * armorMultipliers[inventoryType] * levelPenalty + 0.5f); + } + + return 5 * uint32(17.0f * qualityMultipliers[quality] * weaponMultipliers[itemSubClass] * levelPenalty + 0.5f); +}; + void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, ItemTemplate const& itemTemplate) { *disenchantID = 0; @@ -2255,7 +2338,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.Quality = sparse->Quality; itemTemplate.Flags = sparse->Flags; itemTemplate.Flags2 = sparse->Flags2; - itemTemplate.BuyCount = 1; + itemTemplate.BuyCount = std::max(sparse->BuyCount, 1u); itemTemplate.BuyPrice = sparse->BuyPrice; itemTemplate.SellPrice = sparse->SellPrice; itemTemplate.InventoryType = db2Data->InventoryType; @@ -2315,7 +2398,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.RandomProperty = sparse->RandomProperty; itemTemplate.RandomSuffix = sparse->RandomSuffix; itemTemplate.ItemSet = sparse->ItemSet; - itemTemplate.MaxDurability = sparse->MaxDurability; + itemTemplate.MaxDurability = FillMaxDurability(db2Data->Class, db2Data->SubClass, sparse->Quality, sparse->InventoryType, sparse->ItemLevel); itemTemplate.Area = sparse->Area; itemTemplate.Map = sparse->Map; itemTemplate.BagFamily = sparse->BagFamily; @@ -2463,7 +2546,9 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.RandomProperty = fields[109].GetInt32(); itemTemplate.RandomSuffix = fields[110].GetInt32(); itemTemplate.ItemSet = fields[111].GetUInt32(); - itemTemplate.MaxDurability = fields[112].GetUInt32(); + itemTemplate.MaxDurability = FillMaxDurability(itemTemplate.Class, itemTemplate.SubClass, + itemTemplate.Quality, itemTemplate.InventoryType, itemTemplate.ItemLevel); + itemTemplate.Area = fields[113].GetUInt32(); itemTemplate.Map = fields[114].GetUInt32(); itemTemplate.BagFamily = fields[115].GetUInt32(); @@ -2525,7 +2610,7 @@ void ObjectMgr::LoadItemTemplateAddon() uint32 oldMSTime = getMSTime(); uint32 count = 0; - QueryResult result = WorldDatabase.Query("SELECT Id, BuyCount, FoodType, MinMoneyLoot, MaxMoneyLoot, SpellPPMChance FROM item_template_addon"); + QueryResult result = WorldDatabase.Query("SELECT Id, FoodType, MinMoneyLoot, MaxMoneyLoot, SpellPPMChance FROM item_template_addon"); if (result) { do @@ -2545,9 +2630,9 @@ void ObjectMgr::LoadItemTemplateAddon() buyCount = 1; } - uint8 foodType = fields[2].GetUInt8(); - uint32 minMoneyLoot = fields[3].GetUInt32(); - uint32 maxMoneyLoot = fields[4].GetUInt32(); + uint8 foodType = fields[1].GetUInt8(); + uint32 minMoneyLoot = fields[2].GetUInt32(); + uint32 maxMoneyLoot = fields[3].GetUInt32(); if (minMoneyLoot > maxMoneyLoot) { sLog->outErrorDb("Minimum money loot specified in `item_template_addon` for item %u was greater than maximum amount, swapping.", itemId); @@ -2555,11 +2640,10 @@ void ObjectMgr::LoadItemTemplateAddon() } ItemTemplate& itemTemplate = _itemTemplateStore[itemId]; - itemTemplate.BuyCount = buyCount; itemTemplate.FoodType = foodType; itemTemplate.MinMoneyLoot = minMoneyLoot; itemTemplate.MaxMoneyLoot = maxMoneyLoot; - itemTemplate.SpellPPMRate = fields[5].GetFloat(); + itemTemplate.SpellPPMRate = fields[4].GetFloat(); ++count; } while (result->NextRow()); } @@ -2650,7 +2734,7 @@ void ObjectMgr::LoadItemSetNames() if (setEntry->itemId[i]) itemSetItems.insert(setEntry->itemId[i]); } - + // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT `entry`, `name`, `InventoryType` FROM `item_set_names`"); |