- Mesaj
- 810
- Çözümler
- 28
- Beğeni
- 746
- Puan
- 839
- Ticaret Puanı
- 0
Herkese merhabalar, geçen bir arkadaş konu açmıştı ve konu altında aynı sıkıntıyı çeken birçok arkadaş yazmıştı. Bununla ilgili çözümü TurkMMO adlı forumdan "Tunga" adlı yöneticinin filesinden alınmıştır.
ComputePoints değerinden farkı nedir ?
- ComputePoints değerinin sonunda Update() fonksiyonu çalıştırılır. Update fonksiyonu yeniden hesaplanılan değerleri eskisiyle karşılaştırıp yenilerini güncelleme paketidir. Bu yapılanda ise update fonksiyonu yoktur.
service.h
char.h
char.cpp
Peki bu kod nerelerde kullanılmalı ?
char_skill.cpp
Her compute gördüğünüz yere kullanmayın ve bilmeyen arkadaşların kullanmasını tavsiye etmiyorum.
ComputePoints değerinden farkı nedir ?
- ComputePoints değerinin sonunda Update() fonksiyonu çalıştırılır. Update fonksiyonu yeniden hesaplanılan değerleri eskisiyle karşılaştırıp yenilerini güncelleme paketidir. Bu yapılanda ise update fonksiyonu yoktur.
service.h
C:
#define ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET
char.h
C:
//Ara
ComputePoints
// Altına ekle
#ifdef ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET
void ComputePointsWithoutUpdatePacket();
#endif
char.cpp
C:
#ifdef ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET
void CHARACTER::ComputePointsWithoutUpdatePacket()
{
long lStat = GetPoint(POINT_STAT);
long lStatResetCount = GetPoint(POINT_STAT_RESET_COUNT);
long lSkillActive = GetPoint(POINT_SKILL);
long lSkillSub = GetPoint(POINT_SUB_SKILL);
long lSkillHorse = GetPoint(POINT_HORSE_SKILL);
long lLevelStep = GetPoint(POINT_LEVEL_STEP);
long lAttackerBonus = GetPoint(POINT_PARTY_ATTACKER_BONUS);
long lTankerBonus = GetPoint(POINT_PARTY_TANKER_BONUS);
long lBufferBonus = GetPoint(POINT_PARTY_BUFFER_BONUS);
long lSkillMasterBonus = GetPoint(POINT_PARTY_SKILL_MASTER_BONUS);
long lHasteBonus = GetPoint(POINT_PARTY_HASTE_BONUS);
long lDefenderBonus = GetPoint(POINT_PARTY_DEFENDER_BONUS);
long lHPRecovery = GetPoint(POINT_HP_RECOVERY);
long lSPRecovery = GetPoint(POINT_SP_RECOVERY);
memset(m_pointsInstant.points, 0, sizeof(m_pointsInstant.points));
BuffOnAttr_ClearAll();
m_SkillDamageBonus.clear();
SetPoint(POINT_STAT, lStat);
SetPoint(POINT_SKILL, lSkillActive);
SetPoint(POINT_SUB_SKILL, lSkillSub);
SetPoint(POINT_HORSE_SKILL, lSkillHorse);
SetPoint(POINT_LEVEL_STEP, lLevelStep);
SetPoint(POINT_STAT_RESET_COUNT, lStatResetCount);
SetPoint(POINT_ST, GetRealPoint(POINT_ST));
SetPoint(POINT_HT, GetRealPoint(POINT_HT));
SetPoint(POINT_DX, GetRealPoint(POINT_DX));
SetPoint(POINT_IQ, GetRealPoint(POINT_IQ));
SetPart(PART_MAIN, GetOriginalPart(PART_MAIN));
SetPart(PART_WEAPON, GetOriginalPart(PART_WEAPON));
SetPart(PART_HEAD, GetOriginalPart(PART_HEAD));
SetPart(PART_HAIR, GetOriginalPart(PART_HAIR));
#ifdef ENABLE_ACCE_SYSTEM
SetPart(PART_SASH, GetOriginalPart(PART_SASH));
#endif
#ifdef ENABLE_AURA_SYSTEM
SetPart(PART_AURA, GetOriginalPart(PART_AURA));
#endif
SetPoint(POINT_PARTY_ATTACKER_BONUS, lAttackerBonus);
SetPoint(POINT_PARTY_TANKER_BONUS, lTankerBonus);
SetPoint(POINT_PARTY_BUFFER_BONUS, lBufferBonus);
SetPoint(POINT_PARTY_SKILL_MASTER_BONUS, lSkillMasterBonus);
SetPoint(POINT_PARTY_HASTE_BONUS, lHasteBonus);
SetPoint(POINT_PARTY_DEFENDER_BONUS, lDefenderBonus);
SetPoint(POINT_HP_RECOVERY, lHPRecovery);
SetPoint(POINT_SP_RECOVERY, lSPRecovery);
int iMaxHP, iMaxSP;
int iMaxStamina;
if (IsPC())
{
// 최대 생명력/정신력
iMaxHP = JobInitialPoints[GetJob()].max_hp + m_points.iRandomHP + GetPoint(POINT_HT) * JobInitialPoints[GetJob()].hp_per_ht;
iMaxSP = JobInitialPoints[GetJob()].max_sp + m_points.iRandomSP + GetPoint(POINT_IQ) * JobInitialPoints[GetJob()].sp_per_iq;
iMaxStamina = JobInitialPoints[GetJob()].max_stamina + GetPoint(POINT_HT) * JobInitialPoints[GetJob()].stamina_per_con;
{
CSkillProto* pkSk = CSkillManager::instance().Get(SKILL_ADD_HP);
if (nullptr != pkSk)
{
pkSk->SetPointVar("k", 1.0f * GetSkillPower(SKILL_ADD_HP) / 100.0f);
iMaxHP += static_cast<int>(pkSk->kPointPoly.Eval());
}
}
SetPoint(POINT_MOV_SPEED, 111);
SetPoint(POINT_ATT_SPEED, 112);
PointChange(POINT_ATT_SPEED, GetPoint(POINT_PARTY_HASTE_BONUS));
SetPoint(POINT_CASTING_SPEED, 100);
}
else
{
iMaxHP = m_pkMobData->m_table.dwMaxHP;
iMaxSP = 0;
iMaxStamina = 0;
SetPoint(POINT_ATT_SPEED, m_pkMobData->m_table.sAttackSpeed);
SetPoint(POINT_MOV_SPEED, m_pkMobData->m_table.sMovingSpeed);
SetPoint(POINT_CASTING_SPEED, m_pkMobData->m_table.sAttackSpeed);
}
if (IsPC())
{
// 말 타고 있을 때는 기본 스탯이 말의 기준 스탯보다 낮으면 높게 만든다.
// 따라서 말의 기준 스탯이 무사 기준이므로, 수라/무당은 전체 스탯 합이
// 대채적으로 더 올라가게 될 것이다.
#ifdef ENABLE_MOUNT_COSTUME_SYSTEM
if (GetMountVnum() && !GetWear(WEAR_COSTUME_MOUNT))
#else
if (GetMountVnum())
#endif
{
if (GetHorseST() > GetPoint(POINT_ST))
PointChange(POINT_ST, GetHorseST() - GetPoint(POINT_ST));
if (GetHorseDX() > GetPoint(POINT_DX))
PointChange(POINT_DX, GetHorseDX() - GetPoint(POINT_DX));
if (GetHorseHT() > GetPoint(POINT_HT))
PointChange(POINT_HT, GetHorseHT() - GetPoint(POINT_HT));
if (GetHorseIQ() > GetPoint(POINT_IQ))
PointChange(POINT_IQ, GetHorseIQ() - GetPoint(POINT_IQ));
}
}
ComputeBattlePoints();
if (iMaxHP != GetMaxHP())
{
SetRealPoint(POINT_MAX_HP, iMaxHP); // 기본HP를 RealPoint에 저장해 놓는다.
}
PointChange(POINT_MAX_HP, 0);
if (iMaxSP != GetMaxSP())
{
SetRealPoint(POINT_MAX_SP, iMaxSP); // 기본SP를 RealPoint에 저장해 놓는다.
}
PointChange(POINT_MAX_SP, 0);
SetMaxStamina(iMaxStamina);
// @fixme118 part1
int iCurHP = this->GetHP();
int iCurSP = this->GetSP();
m_pointsInstant.dwImmuneFlag = 0;
for (int i = 0; i < WEAR_MAX_NUM; i++)
{
LPITEM pItem = GetWear(i);
if (pItem)
{
pItem->ModifyPoints(true);
SET_BIT(m_pointsInstant.dwImmuneFlag, GetWear(i)->GetImmuneFlag());
}
}
// 용혼석 시스템
// ComputePoints에서는 케릭터의 모든 속성값을 초기화하고,
// 아이템, 버프 등에 관련된 모든 속성값을 재계산하기 때문에,
// 용혼석 시스템도 ActiveDeck에 있는 모든 용혼석의 속성값을 다시 적용시켜야 한다.
if (DragonSoul_IsDeckActivated())
{
for (int i = WEAR_MAX_NUM + DS_SLOT_MAX * DragonSoul_GetActiveDeck();
i < WEAR_MAX_NUM + DS_SLOT_MAX * (DragonSoul_GetActiveDeck() + 1); i++)
{
LPITEM pItem = GetWear(i);
if (pItem)
{
if (DSManager::instance().IsTimeLeftDragonSoul(pItem))
pItem->ModifyPoints(true);
}
}
}
if (GetHP() > GetMaxHP())
PointChange(POINT_HP, GetMaxHP() - GetHP());
if (GetSP() > GetMaxSP())
PointChange(POINT_SP, GetMaxSP() - GetSP());
ComputeSkillPoints();
RefreshAffect();
// @fixme118 part2 (before petsystem stuff)
if (IsPC())
{
if (this->GetHP() != iCurHP)
this->PointChange(POINT_HP, iCurHP - this->GetHP());
if (this->GetSP() != iCurSP)
this->PointChange(POINT_SP, iCurSP - this->GetSP());
}
CPetSystem * pPetSystem = GetPetSystem();
if (nullptr != pPetSystem)
{
pPetSystem->RefreshBuff();
}
for (TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.begin(); it != m_map_buff_on_attrs.end(); it++)
{
it->second->GiveAllAttributes();
}
}
#endif
Peki bu kod nerelerde kullanılmalı ?
char_skill.cpp
C:
// Aratın
void CHARACTER::SkillLevelUp
// Fonkisyonun sonundaki ComputePoints(); bulun
// Değiştirin
#ifdef ENABLE_COMPUTE_POINTS_WITHOUT_UPDATE_PACKET
ComputePointsWithoutUpdatePacket();
#else
ComputePoints();
#endif
Her compute gördüğünüz yere kullanmayın ve bilmeyen arkadaşların kullanmasını tavsiye etmiyorum.