30.04.2010, 04:05
|
#5
|
Пользователь
Регистрация: 11.03.2010
Адрес: Спб
Сообщений: 35
Сказал(а) спасибо: 5
Поблагодарили 10 раз(а) в 8 сообщениях
|
если отталкиваться от того, что PlayersSlain не просто так:
PHP код:
struct QuestStatusData
{
QuestStatusData()
: m_status(QUEST_STATUS_NONE),m_rewarded(false),
m_explored(false), m_timer(0), uState(QUEST_NEW)
{
memset(m_itemcount, 0, QUEST_ITEM_OBJECTIVES_COUNT * sizeof(uint32));
memset(m_creatureOrGOcount, 0, QUEST_OBJECTIVES_COUNT * sizeof(uint32));
}
QuestStatus m_status;
bool m_rewarded;
bool m_explored;
uint32 m_timer;
+ uint32 m_PlayersSlain;
QuestUpdateState uState;
uint32 m_itemcount***91; QUEST_ITEM_OBJECTIVES_COUNT ***93;;
uint32 m_creatureOrGOcount***91; QUEST_OBJECTIVES_COUNT ***93;;
};
добавить в uint32 Unit::DealDamage
PHP код:
if (pVictim->GetTypeId() == TYPEID_PLAYER)
{
((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health);
if (player)
+ {
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL,1,0,pVictim);
+ player->PlayersSlain();
+ }
}
реализация PlayersSlain:
PHP код:
void Player::PlayersSlain()
{
uint32 addkillcount = 1;
for( int i = 0; i < MAX_QUEST_LOG_SIZE; ++i )
{
uint32 questid = GetQuestSlotQuestId(i);
if(!questid)
continue;
Quest const* qInfo = sObjectMgr.GetQuestTemplate(questid);
if( !qInfo )
continue;
// just if !ingroup || !noraidgroup || raidgroup
QuestStatusData& q_status = mQuestStatus***91;questid***93;;
if( q_status.m_status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->GetType() == QUEST_TYPE_RAID))
{
if( qInfo->HasFlag( QUEST_MANGOS_FLAGS_KILL_OR_CAST) )
{
// skip Cast at creature objective
if(qInfo->PlayersSlain <=0)
continue;
uint32 reqkillcount = qInfo->PlayersSlain;
uint32 curkillcount = q_status.m_PlayersSlain;
if ( curkillcount < reqkillcount )
{
q_status.m_PlayersSlain = curkillcount + addkillcount;
if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
//для отображения в квестлоге больше мороки с реализацией SendQuestUpdatePlayersSlain: Get(Set)QuestSlotCounter, оправка данных
}
if ( CanCompleteQuest( questid ) )
CompleteQuest( questid );
}
}
}
}
PHP код:
void Player::SendQuestUpdatePlayersSlain( Quest const* pQuest, uint32 old_count, uint32 add_count );
{
ASSERT(old_count + add_count < 256 && "PlayersSlain count store in tinyint(3) unsigned");
WorldPacket data( SMSG_QUESTUPDATE_*);
sLog.outDebug( "WORLD: Sent SMSG_QUESTUPDATE_" );
.....
GetSession()->SendPacket(&data);
uint16 log_slot = FindQuestSlot( pQuest->GetQuestId() );
if( log_slot < MAX_QUEST_LOG_SIZE)
SetQuestSlotCounter(log_slot,PlayersSlain,GetQuestSlotCounter(log_slot,PlayersSlain)+add_count);
}
более простой способ - создать в базе нпц PVPKillCredit
добавить в uint32 Unit::DealDamage
PHP код:
if (pVictim->GetTypeId() == TYPEID_PLAYER)
{
((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health);
if (player)
+ {
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL,1,0,pVictim);
+ player->KilledMonsterCredit(PVPKillCredit, 0);
+ }
}
|
|
|