Bvural41 1
Bvural41
kralhakan2009 1
kralhakan2009
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Vahsi Uzman 1
Vahsi Uzman
Cannn6161 1
Cannn6161
B 1
berione65
sen272 1
sen272
Mt2Hizmet 1
Mt2Hizmet
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Cevaplanmadı Saldırı değerinin serverda işlememesi

aurovex

Level 1
Telefon Numarası Onaylanmış Üye
TM Üye
Katılım
17 Nis 2019
Konular
9
Mesajlar
39
Çözüm
2
Online süresi
10d 2h
Reaksiyon Skoru
5
Altın Konu
0
Başarım Puanı
73
MmoLira
1,917
DevLira
9
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

Herkese hayırlı forumlar. İyi günler.

Karakter penceresinde C tuşu saldırı değeri sadece görünüm sorunu var.Hava kılıcı, büyülü keskinlik gibi skilleri kullandığım zaman, simyalar aktifken, mavi şebnem kullanıdığında karakter penceresindeki saldırı değerinde bir artış olmuyor. Verdiği saldırı değeri karaktere etki ediyor sadece C tuşundaki STR değerinde problem var. HP SP DEX sorunsuz çalışıyor.
 
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

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]
gündüz gözüyle bi bakarız..
 
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]


Selamlar tekrar. Pes etmediğin için tebrikler, bu tür inatçı sorunların üzerine gitmek en doğru yaklaşımdır. Aslında, "hasarın ikiye katlanması" detayı, sorunun kaynağını tam olarak tespit etmemizi sağlayan kilit bilgi oldu.

Sorunun analizini yapalım: "Hasar neden ikiye katlandı?"

"Hasar 2 katına çıktı" demen, aradığımız en büyük ipucuydu. Bu, fonksiyonun yanlış yerde çağrıldığının klasik bir belirtisidir.

Bunu şöyle düşün kardeşim: Bir kek yapmak istiyorsun. Normalde ne yaparsın? Önce un, şeker, yumurta gibi tüm malzemeleri karıştırırsın, en son fırına atarsın, değil mi?

İşte sendeki ComputePoints fonksiyonu şu an bunu yapıyor:

1- Önce fırına boş bir kap atıyor (ComputeBattlePoints(); çağrılıyor).
2- Sonra fırındaki kabın içine malzemeleri eklemeye çalışıyor (RefreshAffect(); çağrılıyor).

Bu yüzden ortaya garip bir şey çıkıyor. Sistem önce temel hasarı hesaplıyor, sonra üstüne bir de buff'ların hasarını ekliyor ve ortaya böyle "ikiye katlanmış" gibi görünen ama aslında hatalı olan bir sonuç çıkıyor. Karakter ekranındaki değerlerin değişmemesi de bu yüzden, çünkü değerler en başta, daha bonuslar eklenmeden hesaplanıp ekrana yazdırılıyor.

Sorunun çözümü o kadar basit ki şaşıracaksın. Yeni kod eklemeye veya çıkarmaya gerek yok. Sadece tek bir satırın yerini değiştireceksin.

Verdiğin ComputePoints fonksiyonu içindeki şu satırı bul:

RefreshAffect();

Bu satır, fonksiyonun en sonlarına doğru, ComputeSkillPoints(); satırından sonra yer alıyor.

Şimdi yapman gereken tek şey, bu RefreshAffect(); satırını oradan kesip, ComputeBattlePoints(); satırının hemen üzerine yapıştırmak.

Yani fonksiyonun doğru sıralaması şöyle olmalı:


YANLIŞ SIRALAMA (Şu anki hali):
[CODE title="C++"]// ...
ComputeBattlePoints();
// ...
// ...
ComputeSkillPoints();
RefreshAffect(); // << YANLIŞ YER
// ...
}[/CODE]

DOĞRU SIRALAMA (Olması gereken):

[CODE title="C++"]// ...
if (GetMountVnum())
{
// ...
}

RefreshAffect(); // << DOĞRU YER BURASI
ComputeBattlePoints();
// ...
}[/CODE]

Mantık çok basit: RefreshAffect() fonksiyonu, Hava Kılıcı gibi tüm bonusları karakterin üzerine işler. ComputeBattlePoints() ise tüm bu bonuslar işlendikten sonra, ortaya çıkan son değerlerle nihai saldırı gücünü, defansı vb. hesaplar.

Yani önce tüm malzemeleri kaseye koymalı (RefreshAffect), en son fırına atmalısın (ComputeBattlePoints).

Bu tek satırlık yer değişikliğini yap, kodu derle ve sunucuyu yeniden başlat. Sorunun tamamen, kesin olarak ve mantığa uygun bir şekilde çözüldüğünü göreceksin.

Bu tek satırlık yer değişikliğinin sorunu tamamen çözeceğine inanıyoruz. Eğer yine de beklenmedik bir durum olursa, gelişmeleri buradan tekrar paylaşmaktan çekinme. Yardımcı olmak için buradayız. Türkmmo farkıyla, iyi forumlar.
 
Selamlar tekrar. Pes etmediğin için tebrikler, bu tür inatçı sorunların üzerine gitmek en doğru yaklaşımdır. Aslında, "hasarın ikiye katlanması" detayı, sorunun kaynağını tam olarak tespit etmemizi sağlayan kilit bilgi oldu.

Sorunun analizini yapalım: "Hasar neden ikiye katlandı?"

"Hasar 2 katına çıktı" demen, aradığımız en büyük ipucuydu. Bu, fonksiyonun yanlış yerde çağrıldığının klasik bir belirtisidir.

Bunu şöyle düşün kardeşim: Bir kek yapmak istiyorsun. Normalde ne yaparsın? Önce un, şeker, yumurta gibi tüm malzemeleri karıştırırsın, en son fırına atarsın, değil mi?


İşte sendeki ComputePoints fonksiyonu şu an bunu yapıyor:

1- Önce fırına boş bir kap atıyor (ComputeBattlePoints(); çağrılıyor).
2- Sonra fırındaki kabın içine malzemeleri eklemeye çalışıyor (RefreshAffect(); çağrılıyor).

Bu yüzden ortaya garip bir şey çıkıyor. Sistem önce temel hasarı hesaplıyor, sonra üstüne bir de buff'ların hasarını ekliyor ve ortaya böyle "ikiye katlanmış" gibi görünen ama aslında hatalı olan bir sonuç çıkıyor. Karakter ekranındaki değerlerin değişmemesi de bu yüzden, çünkü değerler en başta, daha bonuslar eklenmeden hesaplanıp ekrana yazdırılıyor.

Sorunun çözümü o kadar basit ki şaşıracaksın. Yeni kod eklemeye veya çıkarmaya gerek yok. Sadece tek bir satırın yerini değiştireceksin.


Verdiğin ComputePoints fonksiyonu içindeki şu satırı bul:

RefreshAffect();

Bu satır, fonksiyonun en sonlarına doğru, ComputeSkillPoints(); satırından sonra yer alıyor.

Şimdi yapman gereken tek şey, bu RefreshAffect(); satırını oradan kesip, ComputeBattlePoints(); satırının hemen üzerine yapıştırmak.

Yani fonksiyonun doğru sıralaması şöyle olmalı:


YANLIŞ SIRALAMA (Şu anki hali):
[CODE title="C++"]// ...
ComputeBattlePoints();
// ...
// ...
ComputeSkillPoints();
RefreshAffect(); // << YANLIŞ YER
// ...
}[/CODE]

DOĞRU SIRALAMA (Olması gereken):

[CODE title="C++"]// ...
if (GetMountVnum())
{
// ...
}

RefreshAffect(); // << DOĞRU YER BURASI
ComputeBattlePoints();
// ...
}[/CODE]

Mantık çok basit: RefreshAffect() fonksiyonu, Hava Kılıcı gibi tüm bonusları karakterin üzerine işler. ComputeBattlePoints() ise tüm bu bonuslar işlendikten sonra, ortaya çıkan son değerlerle nihai saldırı gücünü, defansı vb. hesaplar.

Yani önce tüm malzemeleri kaseye koymalı (RefreshAffect), en son fırına atmalısın (ComputeBattlePoints).

Bu tek satırlık yer değişikliğini yap, kodu derle ve sunucuyu yeniden başlat. Sorunun tamamen, kesin olarak ve mantığa uygun bir şekilde çözüldüğünü göreceksin.

Bu tek satırlık yer değişikliğinin sorunu tamamen çözeceğine inanıyoruz. Eğer yine de beklenmedik bir durum olursa, gelişmeleri buradan tekrar paylaşmaktan çekinme. Yardımcı olmak için buradayız. Türkmmo farkıyla, iyi forumlar.
Maalesef kodlar bu yazdıklarınız gibi yazılmıyor sunucumda verdiğiniz ekstra kodlar ise tam yazılan gibi çalışmıyor. Dosya ekte mevcut yardım ederseniz sevinirim.
 

Ekli dosyalar

Maalesef kodlar bu yazdıklarınız gibi yazılmıyor sunucumda verdiğiniz ekstra kodlar ise tam yazılan gibi çalışmıyor. Dosya ekte mevcut yardım ederseniz sevinirim.


kodunu inceledim, sorunun tam olarak düşündüğümüz yerde ama senin dosya yapın dediğin gibi farklı olduğu için çözüm de farklı olacak

Bence problem şu: ComputePoints fonksiyonunda, karakterin son saldırı gücünü hesaplayan ComputeBattlePoints() fonksiyonu, Hava Kılıcı gibi bonusları yükleyen RefreshAffect() fonksiyonundan önce çağrılıyor. Yani sistem, bonusları hiç hesaba katmadan saldırı gücünü hesaplayıp işi bitiriyor, bu yüzden de bonusların bir etkisi olmuyor

Çözümü çok basit, tek bir satırın yerini değiştireceksin

char.cpp dosyasında CHARACTER::ComputePoints fonksiyonunu aç

Fonksiyonun başlarındaki ComputeBattlePoints(); satırını bul ve oradan kes

Aşağıya inip RefreshAffect(); satırını bul ve kestiğin satırı onun hemen altına yapıştır

Yani şöyle olacak:

Önceki hali:

[CODE title="C++"]void CHARACTER::ComputePoints()
{
// ...
ComputeBattlePoints(); // << SORUNLU YER
// ...
// ...
RefreshAffect();
// ...
}[/CODE]

Olması gereken hali:

[CODE title="C++"]void CHARACTER::ComputePoints()
{
// ...
// ComputeBattlePoints(); // << BURADAN SİL
// ...
// ...
RefreshAffect();
ComputeBattlePoints(); // << BURAYA EKLE
// ...
}[/CODE]

Bu değişikliği yapıp derle, sorunun kesin olarak çözülecektir.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst