- Mesaj
- 250
- Beğeni
- 109
- Puan
- 466
- Ticaret Puanı
- 0
aslında oyunda bunun syseri veriyordu fakat oyundan çıkar gibi bi kod yoktu yapay zeka yardımıyla güncellendi.
neden syser olarak düzenlemişler çünkü durduk yere oyundan atıyor hilesiz oyuncuları.
örneğin a oyuncusu b oyuncusuna saldırınca b oyuncusu kordinat değişiyor.
hile algılıyor.
konuyu geliştirlmesi açısından açık bırakıyorum belki birileri stabil sürümünü bulur
char.cpp
ymirin
beceremediğniide yapay zeka becerdi
update şimdilik stabil
hareket hızını hile yapmıyım saldırı hızını hile yapayım onuda tespit edip disconnect veriyor
@hasanmacit
Biz seni çok sevdik
neden syser olarak düzenlemişler çünkü durduk yere oyundan atıyor hilesiz oyuncuları.
örneğin a oyuncusu b oyuncusuna saldırınca b oyuncusu kordinat değişiyor.
hile algılıyor.
konuyu geliştirlmesi açısından açık bırakıyorum belki birileri stabil sürümünü bulur
char.cpp
Kod:
bool CHARACTER::Sync(long x, long y)
{
if (!GetSectree())
return false;
LPSECTREE new_tree = SECTREE_MANAGER::instance().Get(GetMapIndex(), x, y);
if (!new_tree)
{
if (GetDesc())
{
sys_err("cannot find tree at %d %d (name: %s)", x, y, GetName());
// @fixme313 BEGIN
new_tree = GetSectree();
x = GetX();
y = GetY();
if (!new_tree)
{
GetDesc()->SetPhase(PHASE_CLOSE);
sys_err("cannot find old tree at %d %d (name: %s)", x, y, GetName());
}
// @fixme313 END
}
else
{
sys_err("no tree: %s %d %d %d", GetName(), x, y, GetMapIndex());
Dead();
}
return false;
}
SetRotationToXY(x, y);
SetXYZ(x, y, 0);
if (GetDungeon())
{
int iLastEventAttr = m_iEventAttr;
m_iEventAttr = new_tree->GetEventAttribute(x, y);
if (m_iEventAttr != iLastEventAttr)
{
if (GetParty())
{
quest::CQuestManager::instance().AttrOut(GetParty()->GetLeaderPID(), this, iLastEventAttr);
quest::CQuestManager::instance().AttrIn(GetParty()->GetLeaderPID(), this, m_iEventAttr);
}
else
{
quest::CQuestManager::instance().AttrOut(GetPlayerID(), this, iLastEventAttr);
quest::CQuestManager::instance().AttrIn(GetPlayerID(), this, m_iEventAttr);
}
}
}
//duzenlenen yer
if (GetSectree() != new_tree)
{
if (!IsNPC())
{
SECTREEID id = new_tree->GetID();
SECTREEID old_id = GetSectree()->GetID();
// Mevcut ve onceki pozisyon arasİndaki mesafeyi hesapla
const float fDist = DISTANCE_SQRT(id.coord.x - old_id.coord.x, id.coord.y - old_id.coord.y);
// Zaman farkİnİ kontrol et
static DWORD lastMoveTime = get_global_time();
DWORD currentMoveTime = get_global_time();
DWORD timeDiff = currentMoveTime - lastMoveTime;
// Hİz hesaplama
float speed = (timeDiff > 0) ? (fDist / (timeDiff / 1000.0f)) : 0.0f; // m/s cinsinden
// Oyuncu hİzİnİ al ve kar?İla?tİr
const float playerSpeed = GetLimitPoint(POINT_MOV_SPEED);
const float maxAllowableSpeed = playerSpeed * 1.5f; // Bir tolerans ekliyoruz
if (speed > maxAllowableSpeed)
{
// Loglama: Detaylı bilgi verir
sys_log(0,
"POTANSİYEL HİLE ALGILANDI: %s | SECTREE FARKI: %dx%d -> %dx%d | MESAFE: %.1fm | HIZ: %.2fm/s (İZİN VERİLEN: %.2fm/s)",
GetName(),
id.coord.x, id.coord.y,
old_id.coord.x, old_id.coord.y,
fDist, speed, maxAllowableSpeed);
// Hız sınırı ihlali yapan karakter için ceza
LPCHARACTER ch = static_cast<LPCHARACTER>(this);
if (ch)
{
// Oyuncuya bilgilendirme mesajı
ch->ChatPacket(CHAT_TYPE_INFO,
"Hız sınırını aştığınız tespit edildi! Lütfen oyun istemcisi dışında müdahale yapmayın.");
// Eğer oyuncunun bağlantısı varsa
if (GetDesc())
{
// 2-7 saniye arasında rastgele bir gecikmeyle bağlantıyı kes
int delay = number(2, 7);
GetDesc()->DelayedDisconnect(delay);
sys_log(0,
"HİLEYE BAĞLANTI KESİLDİ: %s (İsim: %s, Saniye: %d)",
GetName(), ch->GetName(), delay);
// Hile log kaydı ekleniyor
LogManager::instance().HackLog("SpeedHack", this);
}
}
}
// Zaman ve konumu guncelle
lastMoveTime = currentMoveTime;
}
//duzenlenen yer
new_tree->InsertEntity(this);
}
ymirin
beceremediğniide yapay zeka becerdi
update şimdilik stabil
Kod:
bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)
{
if (test_server)
sys_log(0, "[TEST_SERVER] Attack : %s type %d, MobBattleType %d", GetName(), bType, !GetMobBattleType() ? 0 : GetMobAttackRange());
if (!CanMove())
return false;
// CASTLE
if (IS_CASTLE_MAP(GetMapIndex()) && false == castle_can_attack(this, pkVictim))
return false;
// CASTLE
// Savaşta saldırılabilirlik kontrolü
if (!battle_is_attackable(this, pkVictim))
return false;
// Duel veya GM kontrolü
if (CPVPManager::instance().IsFighting(this) == false && CPVPManager::instance().IsFighting(pkVictim) == true)
return false;
if (IsPC() && pkVictim->IsGM())
return false;
DWORD dwCurrentTime = get_dword_time();
if (IsPC())
{
// Hız hilesi kontrolü
if (IS_SPEED_HACK(this, pkVictim, dwCurrentTime))
return false;
// Yetenek kullanımı arasındaki süre kontrolü
if (bType == 0 && dwCurrentTime < GetSkipComboAttackByTime())
return false;
// Yumrukla saldırı engelleme
if (!GetWear(WEAR_WEAPON))
return false;
}
else
{
MonsterChat(MONSTER_CHAT_ATTACK);
}
pkVictim->SetSyncOwner(this);
if (pkVictim->CanBeginFight())
pkVictim->BeginFight(this);
int iRet;
// Saldırı türüne göre işlem yapılır
if (bType == 0)
{
switch (GetMobBattleType())
{
case BATTLE_TYPE_MELEE:
case BATTLE_TYPE_POWER:
case BATTLE_TYPE_TANKER:
case BATTLE_TYPE_SUPER_POWER:
case BATTLE_TYPE_SUPER_TANKER:
iRet = battle_melee_attack(this, pkVictim);
break;
case BATTLE_TYPE_RANGE:
FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);
iRet = Shoot(0) ? BATTLE_DAMAGE : BATTLE_NONE;
break;
case BATTLE_TYPE_MAGIC:
FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);
iRet = Shoot(1) ? BATTLE_DAMAGE : BATTLE_NONE;
break;
default:
sys_err("Unhandled battle type %d", GetMobBattleType());
iRet = BATTLE_NONE;
break;
}
}
else
{
if (IsPC() == true)
{
if (dwCurrentTime - m_dwLastSkillTime > 1500)
{
sys_log(1, "HACK: Too long skill using term. Name(%s) PID(%u) delta(%u)",
GetName(), GetPlayerID(), (dwCurrentTime - m_dwLastSkillTime));
return false;
}
}
sys_log(1, "Attack call ComputeSkill %d %s", bType, pkVictim?pkVictim->GetName():"");
iRet = ComputeSkill(bType, pkVictim);
}
if (iRet == BATTLE_DAMAGE || iRet == BATTLE_DEAD)
{
OnMove(true);
pkVictim->OnMove();
// Yalnızca PC, düşmanı null yapar. NPC için, durum makinesi bunu sıfırlar.
if (BATTLE_DEAD == iRet && IsPC())
SetVictim(NULL);
// **Sectree Güncellemesi**
if (GetX() != pkVictim->GetX() || GetY() != pkVictim->GetY()) // Koordinatlar değiştiyse
{
// Oyuncu veya hedef, sektördeki yeni yerini alacak.
LPSECTREE newSectree = pkVictim->GetSectree();
if (newSectree)
{
newSectree->InsertEntity(pkVictim);
sys_log(0, "Sektör güncellendi: (%f, %f) -> (%f, %f)", pkVictim->GetX(), pkVictim->GetY(), GetX(), GetY());
}
}
return true;
}
return false;
}
@hasanmacit
Biz seni çok sevdik
En son bir moderatör tarafından düzenlenmiş: