diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 6b98d633c..998a10cb6 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -136,14 +136,17 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui CompletedCriteria(achievementCriteria); } } - bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria) { AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement); if(!achievement) return false; + // counter can never complete - if(achievement->points == 0) + if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER) + return false; + + if(m_criteriaProgress.find(achievementCriteria->ID) == m_criteriaProgress.end()) return false; switch(achievementCriteria->requiredType) @@ -152,7 +155,6 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve return m_criteriaProgress[achievementCriteria->ID] >= achievementCriteria->reach_level.level; case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: return m_criteriaProgress[achievementCriteria->ID] >= achievementCriteria->buy_bank_slot.numberOfSlots; - } return false; } @@ -163,32 +165,38 @@ void AchievementMgr::CompletedCriteria(AchievementCriteriaEntry const* criteria) if(!achievement) return; // counter can never complete - if(achievement->points ==0) + if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER) return; - if(criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL || IsCompletedAchievement(achievement)) + if(criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL || GetAchievementCompletionState(achievement)==ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED) { CompletedAchievement(achievement); } } -bool AchievementMgr::IsCompletedAchievement(AchievementEntry const* achievement) +AchievementCompletionState AchievementMgr::GetAchievementCompletionState(AchievementEntry const* entry) { + if(m_completedAchievements.find(entry->ID)!=m_completedAchievements.end()) + return ACHIEVEMENT_COMPLETED_COMPLETED_STORED; + bool foundOutstanding = false; for (uint32 entryId = 0; entryIdreferredAchievement!= achievement->ID) + if(!criteria || criteria->referredAchievement!= entry->ID) continue; if(IsCompletedCriteria(criteria) && criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL) - return true; + return ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED; // found an umcompleted criteria, but DONT return false - there might be a completed criteria with ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL if(!IsCompletedCriteria(criteria)) foundOutstanding = true; } - return !foundOutstanding; + if(foundOutstanding) + return ACHIEVEMENT_COMPLETED_NONE; + else + return ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED; } void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue) @@ -201,7 +209,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement) { sLog.outString("AchievementMgr::CompletedAchievement(%u)", achievement->ID); - if(achievement->points==0 || m_completedAchievements.find(achievement->ID)!=m_completedAchievements.end()) + if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER || m_completedAchievements.find(achievement->ID)!=m_completedAchievements.end()) return; SendAchievementEarned(achievement->ID); diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h index 9dfb03bcc..b03ba4dbf 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -28,6 +28,13 @@ typedef HM_NAMESPACE::hash_map CompletedAchievementMap; class Player; class WorldPacket; +enum AchievementCompletionState +{ + ACHIEVEMENT_COMPLETED_NONE, + ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED, + ACHIEVEMENT_COMPLETED_COMPLETED_STORED, +}; + class AchievementMgr { public: @@ -49,7 +56,7 @@ class AchievementMgr void CompletedCriteria(AchievementCriteriaEntry const* entry); void CompletedAchievement(AchievementEntry const* entry); bool IsCompletedCriteria(AchievementCriteriaEntry const* entry); - bool IsCompletedAchievement(AchievementEntry const* entry); + AchievementCompletionState GetAchievementCompletionState(AchievementEntry const* entry); void BuildAllDataPacket(WorldPacket *data); Player* m_player; diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index c2efab314..ffcaeaebf 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -899,6 +899,42 @@ void ObjectMgr::LoadEquipmentTemplates() { sEquipmentStorage.Load(); + for(uint32 i=0; i< sEquipmentStorage.MaxEntry; ++i) + { + EquipmentInfo const* eqInfo = sEquipmentStorage.LookupEntry(i); + + if(!eqInfo) + continue; + + for(uint8 j=0; j<3; j++) + { + if(!eqInfo->equipentry[j]) + continue; + + ItemPrototype const* proto = objmgr.GetItemPrototype(eqInfo->equipentry[j]); + + if(!proto) + { + 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(eqInfo)->equipentry[j] = 0; + continue; + } + + if(proto->InventoryType != INVTYPE_WEAPON && + proto->InventoryType != INVTYPE_SHIELD && + proto->InventoryType != INVTYPE_RANGED && + proto->InventoryType != INVTYPE_2HWEAPON && + proto->InventoryType != INVTYPE_WEAPONMAINHAND && + proto->InventoryType != INVTYPE_WEAPONOFFHAND && + proto->InventoryType != INVTYPE_HOLDABLE && + proto->InventoryType != INVTYPE_THROWN && + proto->InventoryType != INVTYPE_RANGEDRIGHT) + { + 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(eqInfo)->equipentry[j] = 0; + } + } + } sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount ); sLog.outString(); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index a4804d914..f54c3eddb 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1290,7 +1290,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data ) *p_data << uint8(getLevel()); // player level // do not use GetMap! it will spawn a new instance since the bound instances are not loaded uint32 zoneId = MapManager::Instance().GetZoneId(GetMapId(), GetPositionX(),GetPositionY()); - + sLog.outDebug("Player::BuildEnumData: m:%u, x:%f, y:%f, z:%f zone:%u", GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), zoneId); *p_data << zoneId; *p_data << GetMapId(); diff --git a/src/shared/Database/DBCEnums.h b/src/shared/Database/DBCEnums.h index 107fb26b0..5b67af8aa 100644 --- a/src/shared/Database/DBCEnums.h +++ b/src/shared/Database/DBCEnums.h @@ -34,6 +34,7 @@ enum AchievementFactionFlags enum AchievementFlags { + ACHIEVEMENT_FLAG_COUNTER = 0x00000001, }; enum AchievementCriteriaCondition diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h index 789d2deeb..de3f80dfe 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -47,8 +47,8 @@ struct AchievementEntry uint32 categoryId; // 38 uint32 points; // 39 reward points //uint32 OrderInCategory; // 40 - //uint32 Flags; // 41 - uint32 flags; // 42 not flags, some unknown value... + uint32 flags; // 41 + //uint32 flags; // 42 not flags, some unknown value... //char *unk1[16]; // 43-58 //uint32 unk_flags; // 59 //uint32 count; // 60 @@ -447,10 +447,10 @@ struct AchievementCriteriaEntry { uint32 field3; // 3 main requirement uint32 field4; // 4 main requirement count - uint32 field5; // 5 additional requirement 1 type - uint32 field6; // 6 additional requirement 1 value - uint32 field7; // 7 additional requirement 2 type - uint32 field8; // 8 additional requirement 1 value + uint32 additionalRequirement1_type; // 5 additional requirement 1 type + uint32 additionalRequirement1_value; // 6 additional requirement 1 value + uint32 additionalRequirement2_type; // 7 additional requirement 2 type + uint32 additionalRequirement2_value; // 8 additional requirement 1 value } raw; }; //char* name[16]; // 9-24 diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp index a4738330c..46afd6b3c 100644 --- a/src/shared/Database/DBCfmt.cpp +++ b/src/shared/Database/DBCfmt.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -const char Achievementfmt[]="niixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiixxixxxxxxxxxxxxxxxxxxx"; +const char Achievementfmt[]="niixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxxxxxxxxxx"; const char AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixix"; const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx"; const char AreaTriggerEntryfmt[]="niffffffff";