En zor kısmı, bonusların karaktere etki etmesini çözmüşün. Süper! bu, işin %90'ı bitti demek.
Sunucu artık karakterin STR (Güç) değerini
doğru hesaplıyor. Ama sunucunun bunu oyun ekranına, yani oyuncunun gördüğü arayüze
bildirmesi gerekiyor. Yani sunucu kendi içinde "Tamam,
aurovex gücü artık 100 oldu" diyor ama bunu sana söylemeyi, o paketi göndermeyi unutuyor. Bu yüzden sen statü penceresinde hala eski değeri görüyorsun.
Senin gönderdiğin o kod bloğu, işte tam da bu "bildirme" işini yapan paket gönderme fonksiyonu. Adı muhtemelen PointChange veya benzeri bir şeydir. Fonksiyon doğru, ama
çağrıldığı yer yanlış ya da eksik.
Bu sefer kesin ve net çözüm olur inş.
Bu bildirme işleminin, tüm statülerin baştan sona hesaplandığı tek bir yerden, yani bizim o meşhur ComputePoints fonksiyonunun içinden yapılması gerekiyor. Böylece ne zaman bir skill açsan, ne zaman bir item taksan, ne zaman bir pot içsen, ComputePoints çalışır ve sonunda tüm güncel değerleri ekrana tek seferde gönderir.
1- game kaynak kodları içindeki char.cpp dosyasını tekrar aç
2- void CHARACTER::ComputePoints() fonksiyonunu bul
3- Bu fonksiyonun
EN SONUNA, yani en sondaki kapatma süslü parantezinin }
hemen üstüne aşağıdaki kod bloğunu olduğu gibi ekle
[CODE title="C++"]// --- TÜM STATÜLERİ OYUNCU EKRANINA GÖNDEREN GÜNCELLEME KODU ---
// Bu kod, hesaplanan tüm yeni değerleri client'e bildirir.
PointChange(POINT_ST, GetPoint(POINT_ST));
PointChange(POINT_DX, GetPoint(POINT_DX));
PointChange(POINT_HT, GetPoint(POINT_HT));
PointChange(POINT_IQ, GetPoint(POINT_IQ));
PointChange(POINT_MAX_HP, GetMaxHP());
PointChange(POINT_MAX_SP, GetMaxSP());
PointChange(POINT_HP, GetHP());
PointChange(POINT_SP, GetSP());
PointChange(POINT_ATT_VALUE, points.atk);
PointChange(POINT_DEF_GRADE, points.def);
PointChange(POINT_MOV_SPEED, GetPoint(POINT_MOV_SPEED));
PointChange(POINT_ATT_SPEED, GetPoint(POINT_ATT_SPEED));
PointChange(POINT_MAGIC_ATT_VALUE, points.mag_atk);
PointChange(POINT_MAGIC_DEF_GRADE, points.mag_def);[/CODE]
Umarım bu sefer sorunun kesin olarak çözülür.
Bu sefer hasar 2 katına çıktı fakat değerler çok farketmedi fonksiyon aşağıda belirttiğim gibi.
[CODE title="Fonksiyon"]void CHARACTER::ComputePoints()
{
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 ENA
#ifdefCE_COSTUME_SYSTEM
SetPart(PART_ACCE, GetOriginalPart(PART_ACCE));
#endif
#endifoint(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;
#ifdef ENA
#ifdefW_PASSIVE_SKILL
CSkillProto* pkSk;
int ekle = 0;
#endif
#endifIsPC())
{
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 (NULL != pkSk)
{
pkSk->SetPointVar("k", 1.0f * GetSkillPower(SKILL_ADD_HP) / 100.0f);
iMaxHP += static_cast<int>(pkSk->kPointPoly.Eval());
}
}
#ifdef ENA
#ifdefW_PASSIVE_SKILL
{
pkSk = CSkillManager::instance().Get(SKILL_MONSTER_BONUS);
if (NULL != pkSk)
{
pkSk->SetPointVar("k", 1.0f * GetSkillPower(SKILL_MONSTER_BONUS) / 100.0f);
ekle = static_cast<int>(pkSk->kPointPoly.Eval());
PointChange(POINT_ATTBONUS_MONSTER,ekle);
}
}
{
pkSk = CSkillManager::instance().Get(SKILL_STONE_BONUS);
if (NULL != pkSk)
{
pkSk->SetPointVar("k", 1.0f * GetSkillPower(SKILL_STONE_BONUS) / 100.0f);
ekle = static_cast<int>(pkSk->kPointPoly.Eval());
PointChange(POINT_ATTBONUS_STONE,ekle);
}
}
{
pkSk = CSkillManager::instance().Get(SKILL_BOSS_BONUS);
if (NULL != pkSk)
{
pkSk->SetPointVar("k", 1.0f * GetSkillPower(SKILL_BOSS_BONUS) / 100.0f);
ekle = static_cast<int>(pkSk->kPointPoly.Eval());
PointChange(POINT_ATTBONUS_BOSS,ekle);
}
}
#endif
#endifSetPoint(POINT_MOV_SPEED, 100);
SetPoint(POINT_ATT_SPEED, 100);
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())
{
if (GetMountVnum())
{
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);
}
PointChange(POINT_MAX_HP, 0);
if (iMaxSP != GetMaxSP())
{
SetRealPoint(POINT_MAX_SP, iMaxSP);
}
PointChange(POINT_MAX_SP, 0);
SetMaxStamina(iMaxStamina);
// @fixme118 part1
int iCurHP = this->GetHP();
int iCurSP = this->GetSP();
m_pointsInstant.dwImmuneFlag = 0;
if (IsPC())
{
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());
}
}
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();
if (IsPC())
{
CPetSystem * pPetSystem = GetPetSystem();
if (pPetSystem)
pPetSystem->RefreshBuff();
// @fixme118 part2 (after petsystem stuff)
if (this->GetHP() != iCurHP)
this->PointChange(POINT_HP, iCurHP-this->GetHP());
if (this->GetSP() != iCurSP)
this->PointChange(POINT_SP, iCurSP-this->GetSP());
}
UpdatePacket();
}[/CODE]