- Mesaj
- 6
- Beğeni
- 3
- Puan
- 28
- Ticaret Puanı
- 0
// Senkronizasyon sahibi ile mesafe 250 birimden fazla ise, senkronizasyon yapılmaz
if (DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY()) > 2000)
{
sys_log(1, "SetSyncOwner distance over than 250 %s %s", GetName(), ch->GetName());
if (m_pkChrSyncOwner == ch)
return true;
return false;
}
2000 sizde 250 yazar
şöyleki
a karakter birine saldırınca b kıpırdamadan duruyorsa b karakteri ileri atar doğru.
a kakrateri b karakteri 500 600 mesafeyi iter ama damage işlemesi halen devam eder doğru.
ama a karakter b karater 500 600 mesafe ileri atsada öldürsede 500 600 mesafe ilerde.
b karater oyunu baslat dirilme dediğinde baslangıc pozisyonunda doğuyor.
hata bu
bu durum b karaterin sync girmediği içindir görünürde hareketsiz kaldığı içindir
buna karakter kayması diyip düzeltelim çabasına giren çok oldu aslında mesafeyi aşınca sync kaaptma işlevi varmış
if (DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY()) > 2000)
{
sys_log(1, "SetSyncOwner distance over than 250 %s %s", GetName(), ch->GetName());
if (m_pkChrSyncOwner == ch)
return true;
return false;
}
2000 sizde 250 yazar
şöyleki
a karakter birine saldırınca b kıpırdamadan duruyorsa b karakteri ileri atar doğru.
a kakrateri b karakteri 500 600 mesafeyi iter ama damage işlemesi halen devam eder doğru.
ama a karakter b karater 500 600 mesafe ileri atsada öldürsede 500 600 mesafe ilerde.
b karater oyunu baslat dirilme dediğinde baslangıc pozisyonunda doğuyor.
hata bu
bu durum b karaterin sync girmediği içindir görünürde hareketsiz kaldığı içindir
buna karakter kayması diyip düzeltelim çabasına giren çok oldu aslında mesafeyi aşınca sync kaaptma işlevi varmış
Kod:
bool CHARACTER::SetSyncOwner(LPCHARACTER ch, bool bRemoveFromList)
{
// TRENT_MONSTER: Özel bir kısıtlama (hareket etmeyen karakterler)
if (IS_SET(m_pointsInstant.dwAIFlag, AIFLAG_NOMOVE))
return false;
// END_OF_TRENT_MONSTER
// Senkronizasyon yapılacak karakter var mı?
if (ch)
{
// Eğer hedef karakterle savaş yapılabilir değilse, senkronizasyon yapılmaz
if (!battle_is_attackable(ch, this))
{
SendDamagePacket(ch, 0, DAMAGE_BLOCK);
return false;
}
}
// Eğer kendisiyle senkronize olmaya çalışıyorsa, işlem yapılmaz
if (ch == this)
{
sys_err("SetSyncOwner owner == this (%p)", this);
return false;
}
// Eğer senkronizasyon yapılacak karakter yoksa
if (!ch)
{
// Senkronizasyon sahibini kaldırma işlemi
if (bRemoveFromList && m_pkChrSyncOwner)
{
m_pkChrSyncOwner->m_kLst_pkChrSyncOwned.remove(this);
}
// Senkronizasyon sahibi varsa loglama yaparak sıfırlama işlemi
if (m_pkChrSyncOwner)
sys_log(1, "SyncRelease %s %p from %s", GetName(), this, m_pkChrSyncOwner->GetName());
m_pkChrSyncOwner = NULL;
}
else
{
// Eğer hedef karakter senkronizasyon sahibi olamazsa, işlem yapılmaz
if (!IsSyncOwner(ch))
return false;
// Senkronizasyon sahibi ile mesafe 250 birimden fazla ise, senkronizasyon yapılmaz
if (DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY()) > 2000)
{
sys_log(1, "SetSyncOwner distance over than 250 %s %s", GetName(), ch->GetName());
if (m_pkChrSyncOwner == ch)
return true;
return false;
}
// Eğer mevcut senkronizasyon sahibi farklıysa
if (m_pkChrSyncOwner != ch)
{
// Önceki senkronizasyon sahibinden çıkarma
if (m_pkChrSyncOwner)
{
sys_log(1, "SyncRelease %s %p from %s", GetName(), this, m_pkChrSyncOwner->GetName());
m_pkChrSyncOwner->m_kLst_pkChrSyncOwned.remove(this);
}
// Yeni senkronizasyon sahibini ayarlama
m_pkChrSyncOwner = ch;
m_pkChrSyncOwner->m_kLst_pkChrSyncOwned.emplace_back(this);
// Senkronizasyon zamanını sıfırlama
static const timeval zero_tv = {0, 0};
SetLastSyncTime(zero_tv);
sys_log(1, "SetSyncOwner set %s %p to %s", GetName(), this, ch->GetName());
}
// Senkronizasyon zamanını güncelleme
m_fSyncTime = get_float_time();
}
// Senkronizasyon paketini oluşturma
TPacketGCOwnership pack;
pack.bHeader = HEADER_GC_OWNERSHIP;
pack.dwOwnerVID = ch ? ch->GetVID() : 0;
pack.dwVictimVID = GetVID();
// Paket çevredeki karakterlere gönderilir
PacketAround(pack);
return true;
}