diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 7c404cdb6..5cb96bdec 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -1052,6 +1052,8 @@ valid examples: Quest const* linkedQuest; SpellEntry const *linkedSpell; AchievementEntry const* linkedAchievement; + ItemRandomPropertiesEntry const* itemProperty; + ItemRandomSuffixEntry const* itemSuffix; while(!reader.eof()) { @@ -1061,6 +1063,8 @@ valid examples: linkedQuest = NULL; linkedSpell = NULL; linkedAchievement = NULL; + itemProperty = NULL; + itemSuffix = NULL; reader.ignore(255, '|'); } @@ -1177,9 +1181,47 @@ valid examples: return false; } - char c = reader.peek(); + // the itementry is followed by several integers which describe an instance of this item - // ignore enchants etc. + // position relative after itemEntry + const uint8 randomPropertyPosition = 6; + + int32 propertyId = 0; + bool negativeNumber = false; + char c; + for(uint8 i=0; i='0' && c<='9') + { + propertyId*=10; + propertyId += c-'0'; + } else if(c == '-') + negativeNumber = true; + else + return false; + } + } + if (negativeNumber) + propertyId *= -1; + + if (propertyId > 0) + { + itemProperty = sItemRandomPropertiesStore.LookupEntry(propertyId); + if (!itemProperty) + return false; + } + else if(propertyId < 0) + { + itemSuffix = sItemRandomSuffixStore.LookupEntry(-propertyId); + if (!itemSuffix) + return false; + } + + // ignore other integers while ((c >= '0' && c <= '9') || c== ':') { reader.ignore(1); @@ -1448,22 +1490,34 @@ valid examples: } else if(linkedItem) { - if (strcmp(linkedItem->Name1, buffer) != 0) + char* const* suffix = itemSuffix?itemSuffix->nameSuffix:(itemProperty?itemProperty->nameSuffix:NULL); + + std::string expectedName = std::string(linkedItem->Name1); + if (suffix) + { + expectedName += " "; + expectedName += suffix[LOCALE_enUS]; + } + + if (expectedName != buffer) { ItemLocale const *il = objmgr.GetItemLocale(linkedItem->ItemId); - if (!il) - { -#ifdef MANGOS_DEBUG - sLog.outBasic("ChatHandler::isValidChatMessage linked item name doesn't is wrong and there is no localization"); -#endif - return false; - } - bool foundName = false; - for(uint8 i=0; iName.size(); ++i) + for(uint8 i=LOCALE_koKR; iName[i] == buffer) + int8 dbIndex = objmgr.GetIndexForLocale(LocaleConstant(i)); + if (dbIndex == -1 || il == NULL || dbIndex >= il->Name.size()) + // using strange database/client combinations can lead to this case + expectedName = linkedItem->Name1; + else + expectedName = il->Name[dbIndex]; + if (suffix) + { + expectedName += " "; + expectedName += suffix[i]; + } + if ( expectedName == buffer) { foundName = true; break; diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index ce364eba9..d017c6b78 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -1027,14 +1027,14 @@ struct ItemRandomPropertiesEntry uint32 ID; // 0 m_ID //char* internalName // 1 m_Name uint32 enchant_id[5]; // 2-6 m_Enchantment - //char* nameSuffix[16] // 7-22 m_name_lang + char* nameSuffix[16]; // 7-22 m_name_lang // 23 name flags }; struct ItemRandomSuffixEntry { uint32 ID; // 0 m_ID - //char* name[16] // 1-16 m_name_lang + char* nameSuffix[16]; // 1-16 m_name_lang // 17, name flags // 18 m_internalName uint32 enchant_id[5]; // 19-21 m_enchantment diff --git a/src/game/DBCfmt.h b/src/game/DBCfmt.h index 32c18ecfa..6073fb663 100644 --- a/src/game/DBCfmt.h +++ b/src/game/DBCfmt.h @@ -67,8 +67,8 @@ const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx"; //const char ItemCondExtCostsEntryfmt[]="xiii"; const char ItemExtendedCostEntryfmt[]="niixiiiiiiiiiiix"; const char ItemLimitCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxix"; -const char ItemRandomPropertiesfmt[]="nxiiiiixxxxxxxxxxxxxxxxx"; -const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiiiiiii"; +const char ItemRandomPropertiesfmt[]="nxiiiiissssssssssssssssx"; +const char ItemRandomSuffixfmt[]="nssssssssssssssssxxiiiiiiiiii"; const char ItemSetEntryfmt[]="dssssssssssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii"; const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 6890630a3..ec8060f5c 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8603" + #define REVISION_NR "8604" #endif // __REVISION_NR_H__