- Katılım
- 20 Ağu 2018
- Konular
- 6
- Mesajlar
- 73
- Online süresi
- 6d 4h
- Reaksiyon Skoru
- 129
- Altın Konu
- 0
- TM Yaşı
- 7 Yıl 9 Ay 20 Gün
- Başarım Puanı
- 83
- MmoLira
- 949
- DevLira
- 9
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!
Hey turkmmo!
You summon a lot of monsters, they attack your character and then you kill or purge monsters, but the damage still continues to be shown visually. Is this a familiar situation?
In addition, the damage is shown visually even after the death of the character... I love this game.
I haven't seen a fix for this problem, let's try to fix this sh..
I'm not saying that this is an ideal solution. If you have any ideas, please write comments.
Best regards, Masha
You summon a lot of monsters, they attack your character and then you kill or purge monsters, but the damage still continues to be shown visually. Is this a familiar situation?
In addition, the damage is shown visually even after the death of the character... I love this game.

I haven't seen a fix for this problem, let's try to fix this sh..
C++:
// game/src/packet.h -> search this:
typedef struct packet_damage_info
{
BYTE header;
DWORD dwVID;
BYTE flag;
int damage;
} TPacketGCDamageInfo;
// replace with this:
typedef struct packet_damage_info
{
BYTE header;
DWORD dwVictimVID;
DWORD dwAttackerVID;
BYTE flag;
int damage;
} TPacketGCDamageInfo;
// game/src/char_battle.cpp
//In function void CHARACTER::SendDamagePacket search this:
damageInfo.dwVID = (DWORD)GetVID();
// replace with this:
damageInfo.dwVictimVID = (DWORD)GetVID();
damageInfo.dwAttackerVID = (DWORD)pAttacker->GetVID();
//In function void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead) search this:
if (IsRevive() == false && HasReviverInParty() == true)
{
m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(3));
}
else
{
m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(10));
}
// replace with this:
m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(1));
C++:
// UserInterface/Packet.h -> search this:
typedef struct packet_damage_info
{
BYTE header;
DWORD dwVID;
BYTE flag;
int damage;
} TPacketGCDamageInfo;
// replace with this:
typedef struct packet_damage_info
{
BYTE header;
DWORD dwVictimVID;
DWORD dwAttackerVID;
BYTE flag;
int damage;
} TPacketGCDamageInfo;
// UserInterface/InstanceBase.cpp -> search this:
ProcessDamage();
// replace with this:
ProcessRemoveOldDamage();
ProcessDamage();
// UserInterface/InstanceBase.h -> search this:
struct SEffectDamage
{
DWORD damage;
BYTE flag;
BOOL bSelf;
BOOL bTarget;
};
typedef std::list<SEffectDamage> CommandDamageQueue;
CommandDamageQueue m_DamageQueue;
void ProcessDamage();
public:
void AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget);
//replace
struct SEffectDamage
{
DWORD damage;
BYTE flag;
BOOL bSelf;
BOOL bTarget;
DWORD dwVictimVID;
DWORD dwAttackerVID;
};
typedef std::list<SEffectDamage> CommandDamageQueue;
CommandDamageQueue m_DamageQueue;
void ProcessDamage();
void ProcessRemoveOldDamage();
public:
void AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget, DWORD dwVictimVID, DWORD dwAttackerVID);
// UserInterface/InstanceBaseEffect.cpp -> add this to include:
#include "PythonPlayer.h" // this is default added so check it
#include "PythonApplication.h"
#include "PythonCharacterManager.h"
// UserInterface/InstanceBaseEffect.cpp -> search this:
void CInstanceBase::AddDamageEffect(DWORD damage,BYTE flag,BOOL bSelf,BOOL bTarget)
{
if(CPythonSystem::Instance().IsShowDamage())
{
SEffectDamage sDamage;
sDamage.bSelf = bSelf;
sDamage.bTarget = bTarget;
sDamage.damage = damage;
sDamage.flag = flag;
m_DamageQueue.push_back(sDamage);
}
}
// replace with this:
void CInstanceBase::AddDamageEffect(DWORD damage,BYTE flag,BOOL bSelf,BOOL bTarget, DWORD dwVictimVID, DWORD dwAttackerVID)
{
if (CPythonSystem::Instance().IsShowDamage() && !CPythonApplication::Instance().IsMinimizedWnd())
{
SEffectDamage sDamage;
sDamage.bSelf = bSelf;
sDamage.bTarget = bTarget;
sDamage.damage = damage;
sDamage.flag = flag;
sDamage.dwVictimVID = dwVictimVID;
sDamage.dwAttackerVID = dwAttackerVID;
m_DamageQueue.push_back(sDamage);
}
}
// UserInterface/InstanceBaseEffect.cpp
//add this under void CInstanceBase::ProcessDamage() function
void CInstanceBase::ProcessRemoveOldDamage()
{
if (m_DamageQueue.empty())
return;
m_DamageQueue.remove_if([](CInstanceBase::SEffectDamage sed){ return ((CPythonCharacterManager::instance().IsDeadVID(sed.dwAttackerVID) || CPythonPlayer::Instance().NEW_GetMainActorPtr()->IsDead()) && (sed.flag != DAMAGE_POISON || sed.flag != DAMAGE_BLEEDING || sed.flag != DAMAGE_FIRE) && sed.bSelf); });
}
// UserInterface/PythonNetworkStreamPhaseGame.cpp -> search this:
bool CPythonNetworkStream::RecvDamageInfoPacket()
{
TPacketGCDamageInfo DamageInfoPacket;
if (!Recv(sizeof(TPacketGCDamageInfo), &DamageInfoPacket))
{
Tracen("Recv Target Packet Error");
return false;
}
CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(DamageInfoPacket.dwVID);
bool bSelf = (pInstTarget == CPythonCharacterManager::Instance().GetMainInstancePtr());
bool bTarget = (pInstTarget==m_pInstTarget);
if (pInstTarget)
{
if(DamageInfoPacket.damage >= 0)
pInstTarget->AddDamageEffect(DamageInfoPacket.damage,DamageInfoPacket.flag,bSelf,bTarget);
else
TraceError("Damage is equal or below 0.");
}
return true;
}
// replace with this:
bool CPythonNetworkStream::RecvDamageInfoPacket()
{
TPacketGCDamageInfo DamageInfoPacket;
if (!Recv(sizeof(TPacketGCDamageInfo), &DamageInfoPacket))
{
Tracen("Recv Target Packet Error");
return false;
}
CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(DamageInfoPacket.dwVictimVID);
bool bSelf = (pInstTarget == CPythonCharacterManager::Instance().GetMainInstancePtr());
bool bTarget = (pInstTarget==m_pInstTarget);
if (pInstTarget)
{
if(DamageInfoPacket.damage >= 0)
pInstTarget->AddDamageEffect(DamageInfoPacket.damage, DamageInfoPacket.flag, bSelf, bTarget, DamageInfoPacket.dwVictimVID, DamageInfoPacket.dwAttackerVID);
else
TraceError("Damage is equal or below 0.");
}
return true;
}
// UserInterface/PythonApplication.h -> search this:
void RenderGame();
// replace with this:
void RenderGame();
bool IsMinimizedWnd();
// UserInterface/PythonApplication.cpp -> search this:
void CPythonApplication::SkipRenderBuffering(DWORD dwSleepMSec)
{
m_dwBufSleepSkipTime=ELTimer_GetMSec()+dwSleepMSec;
}
// replace with this:
void CPythonApplication::SkipRenderBuffering(DWORD dwSleepMSec)
{
m_dwBufSleepSkipTime=ELTimer_GetMSec()+dwSleepMSec;
}
bool CPythonApplication::IsMinimizedWnd()
{
return m_isMinimizedWnd;
}
I'm not saying that this is an ideal solution. If you have any ideas, please write comments.
Best regards, Masha
Son düzenleme:
- Katılım
- 22 Eki 2010
- Konular
- 336
- Mesajlar
- 3,672
- Çözüm
- 207
- Online süresi
- 7mo 24d
- Reaksiyon Skoru
- 648
- Altın Konu
- 0
- TM Yaşı
- 15 Yıl 7 Ay 19 Gün
- Başarım Puanı
- 279
- MmoLira
- 12,995
- DevLira
- 24
ty bro
- Katılım
- 19 Ara 2020
- Konular
- 1,566
- Mesajlar
- 6,953
- Çözüm
- 12
- Online süresi
- 2mo 25d
- Reaksiyon Skoru
- 2,468
- Altın Konu
- 122
- TM Yaşı
- 5 Yıl 5 Ay 18 Gün
- Başarım Puanı
- 282
- MmoLira
- -119
- DevLira
- 80
Eline Sağlık, Paylaşım için Teşekkürler 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 2
- Görüntüleme
- 114
- 5.00 yıldız(lar) 1 Değerlendirme
- Cevaplar
- 1
- Görüntüleme
- 90
- Cevaplar
- 1
- Görüntüleme
- 302
- Cevaplar
- 2
- Görüntüleme
- 210



