mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
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:
parent
cf3bbb5920
commit
e92cc728c3
7 changed files with 71 additions and 19 deletions
|
|
@ -136,14 +136,17 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||||
CompletedCriteria(achievementCriteria);
|
CompletedCriteria(achievementCriteria);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria)
|
bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria)
|
||||||
{
|
{
|
||||||
AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
|
AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
|
||||||
if(!achievement)
|
if(!achievement)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// counter can never complete
|
// 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;
|
return false;
|
||||||
|
|
||||||
switch(achievementCriteria->requiredType)
|
switch(achievementCriteria->requiredType)
|
||||||
|
|
@ -152,7 +155,6 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
||||||
return m_criteriaProgress[achievementCriteria->ID] >= achievementCriteria->reach_level.level;
|
return m_criteriaProgress[achievementCriteria->ID] >= achievementCriteria->reach_level.level;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
|
case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
|
||||||
return m_criteriaProgress[achievementCriteria->ID] >= achievementCriteria->buy_bank_slot.numberOfSlots;
|
return m_criteriaProgress[achievementCriteria->ID] >= achievementCriteria->buy_bank_slot.numberOfSlots;
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -163,32 +165,38 @@ void AchievementMgr::CompletedCriteria(AchievementCriteriaEntry const* criteria)
|
||||||
if(!achievement)
|
if(!achievement)
|
||||||
return;
|
return;
|
||||||
// counter can never complete
|
// counter can never complete
|
||||||
if(achievement->points ==0)
|
if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
|
||||||
return;
|
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);
|
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;
|
bool foundOutstanding = false;
|
||||||
for (uint32 entryId = 0; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++)
|
for (uint32 entryId = 0; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++)
|
||||||
{
|
{
|
||||||
AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
|
AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
|
||||||
if(!criteria || criteria->referredAchievement!= achievement->ID)
|
if(!criteria || criteria->referredAchievement!= entry->ID)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(IsCompletedCriteria(criteria) && criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL)
|
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
|
// found an umcompleted criteria, but DONT return false - there might be a completed criteria with ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL
|
||||||
if(!IsCompletedCriteria(criteria))
|
if(!IsCompletedCriteria(criteria))
|
||||||
foundOutstanding = true;
|
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)
|
void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue)
|
||||||
|
|
@ -201,7 +209,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
|
||||||
void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
|
void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
|
||||||
{
|
{
|
||||||
sLog.outString("AchievementMgr::CompletedAchievement(%u)", achievement->ID);
|
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;
|
return;
|
||||||
|
|
||||||
SendAchievementEarned(achievement->ID);
|
SendAchievementEarned(achievement->ID);
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,13 @@ typedef HM_NAMESPACE::hash_map<uint32, time_t> CompletedAchievementMap;
|
||||||
class Player;
|
class Player;
|
||||||
class WorldPacket;
|
class WorldPacket;
|
||||||
|
|
||||||
|
enum AchievementCompletionState
|
||||||
|
{
|
||||||
|
ACHIEVEMENT_COMPLETED_NONE,
|
||||||
|
ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED,
|
||||||
|
ACHIEVEMENT_COMPLETED_COMPLETED_STORED,
|
||||||
|
};
|
||||||
|
|
||||||
class AchievementMgr
|
class AchievementMgr
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -49,7 +56,7 @@ class AchievementMgr
|
||||||
void CompletedCriteria(AchievementCriteriaEntry const* entry);
|
void CompletedCriteria(AchievementCriteriaEntry const* entry);
|
||||||
void CompletedAchievement(AchievementEntry const* entry);
|
void CompletedAchievement(AchievementEntry const* entry);
|
||||||
bool IsCompletedCriteria(AchievementCriteriaEntry const* entry);
|
bool IsCompletedCriteria(AchievementCriteriaEntry const* entry);
|
||||||
bool IsCompletedAchievement(AchievementEntry const* entry);
|
AchievementCompletionState GetAchievementCompletionState(AchievementEntry const* entry);
|
||||||
void BuildAllDataPacket(WorldPacket *data);
|
void BuildAllDataPacket(WorldPacket *data);
|
||||||
|
|
||||||
Player* m_player;
|
Player* m_player;
|
||||||
|
|
|
||||||
|
|
@ -899,6 +899,42 @@ void ObjectMgr::LoadEquipmentTemplates()
|
||||||
{
|
{
|
||||||
sEquipmentStorage.Load();
|
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( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount );
|
||||||
sLog.outString();
|
sLog.outString();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1290,7 +1290,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
|
||||||
*p_data << uint8(getLevel()); // player level
|
*p_data << uint8(getLevel()); // player level
|
||||||
// do not use GetMap! it will spawn a new instance since the bound instances are not loaded
|
// 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());
|
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 << zoneId;
|
||||||
*p_data << GetMapId();
|
*p_data << GetMapId();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ enum AchievementFactionFlags
|
||||||
|
|
||||||
enum AchievementFlags
|
enum AchievementFlags
|
||||||
{
|
{
|
||||||
|
ACHIEVEMENT_FLAG_COUNTER = 0x00000001,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum AchievementCriteriaCondition
|
enum AchievementCriteriaCondition
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,8 @@ struct AchievementEntry
|
||||||
uint32 categoryId; // 38
|
uint32 categoryId; // 38
|
||||||
uint32 points; // 39 reward points
|
uint32 points; // 39 reward points
|
||||||
//uint32 OrderInCategory; // 40
|
//uint32 OrderInCategory; // 40
|
||||||
//uint32 Flags; // 41
|
uint32 flags; // 41
|
||||||
uint32 flags; // 42 not flags, some unknown value...
|
//uint32 flags; // 42 not flags, some unknown value...
|
||||||
//char *unk1[16]; // 43-58
|
//char *unk1[16]; // 43-58
|
||||||
//uint32 unk_flags; // 59
|
//uint32 unk_flags; // 59
|
||||||
//uint32 count; // 60
|
//uint32 count; // 60
|
||||||
|
|
@ -447,10 +447,10 @@ struct AchievementCriteriaEntry
|
||||||
{
|
{
|
||||||
uint32 field3; // 3 main requirement
|
uint32 field3; // 3 main requirement
|
||||||
uint32 field4; // 4 main requirement count
|
uint32 field4; // 4 main requirement count
|
||||||
uint32 field5; // 5 additional requirement 1 type
|
uint32 additionalRequirement1_type; // 5 additional requirement 1 type
|
||||||
uint32 field6; // 6 additional requirement 1 value
|
uint32 additionalRequirement1_value; // 6 additional requirement 1 value
|
||||||
uint32 field7; // 7 additional requirement 2 type
|
uint32 additionalRequirement2_type; // 7 additional requirement 2 type
|
||||||
uint32 field8; // 8 additional requirement 1 value
|
uint32 additionalRequirement2_value; // 8 additional requirement 1 value
|
||||||
} raw;
|
} raw;
|
||||||
};
|
};
|
||||||
//char* name[16]; // 9-24
|
//char* name[16]; // 9-24
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* 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 AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixix";
|
||||||
const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx";
|
const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx";
|
||||||
const char AreaTriggerEntryfmt[]="niffffffff";
|
const char AreaTriggerEntryfmt[]="niffffffff";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue