Reverted wrong commit d2785283e - the real source for not matching the flags was a mixed up index in DBCfmt.cpp

Added database integrity check for creature_equip_template
Differ between stored and pending completed achievements
This commit is contained in:
arrai 2008-10-29 17:58:56 +01:00
parent cf3bbb5920
commit e92cc728c3
7 changed files with 71 additions and 19 deletions

View file

@ -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; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++)
{
AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
if(!criteria || criteria->referredAchievement!= 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);

View file

@ -28,6 +28,13 @@ typedef HM_NAMESPACE::hash_map<uint32, time_t> 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;

View file

@ -899,6 +899,42 @@ void ObjectMgr::LoadEquipmentTemplates()
{
sEquipmentStorage.Load();
for(uint32 i=0; i< sEquipmentStorage.MaxEntry; ++i)
{
EquipmentInfo const* eqInfo = sEquipmentStorage.LookupEntry<EquipmentInfo>(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<EquipmentInfo*>(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<EquipmentInfo*>(eqInfo)->equipentry[j] = 0;
}
}
}
sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount );
sLog.outString();
}

View file

@ -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();

View file

@ -34,6 +34,7 @@ enum AchievementFactionFlags
enum AchievementFlags
{
ACHIEVEMENT_FLAG_COUNTER = 0x00000001,
};
enum AchievementCriteriaCondition

View file

@ -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

View file

@ -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";