Roblox çok oyunculu oyunlarında istemci taraflı (LocalScript) hile koruma sistemleri, modern bellek enjektörleri karşısında tamamen etkisizdir.
Adil bir rekabet sağlamak için sunucu yetkili bir güvenlik modeli şarttır. Delta-time ile hareket kontrolü, raycast ile duvar geçişi engelleme ve şüpheli durumlarda konumu geri sararak hileler engellenir.
1. İstemci Taraflı Korumalar Neden Başarısız Olur
Roblox istemci hilelerinin çalışma prensiplerini anlamak:
- Yerel Ortam Müdahalesi: hookmetamethod gibi yöntemlerle istemci ağ çağrılarını değiştirebilir.
- Skriptlerin Devre Dışı Bırakılması: İstemcideki yerel kodlar istenildiği an silinebilir.
- Fizik Sahipliği: İstemci, HumanoidRootPart parçası üzerinde doğrudan ağ sahipliğine sahiptir.
- Sıfır Güven İlkesi: İstemciden gelen konum verilerine asla doğrudan güvenmeyin.
2. Sunucu Yetkili Hız ve Işınlanma Doğrulaması
Ping dalgalanmalarında yanlış uyarı vermeden hız anomalilerini tespit etme:
- Delta Zamanlı Mesafe: İki kare arasındaki mesafe değişimini hesaplama.
- Dinamik Hız Limiti: WalkSpeed ve gecikme payına göre dinamik sınır belirleme.
- Anomali Puan Tamponu: Geçici bağlantı kopmalarında oyuncuyu hemen cezalandırmama.
- Rubberbanding: İhlal durumunda karakteri son geçerli konuma anında geri çekme.
--!strict
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local AntiCheatService = {}
type PlayerRecord = {
lastPosition: Vector3,
lastTick: number,
anomalyBuffer: number,
isFalling: boolean
}
local trackedPlayers: { [Player]: PlayerRecord } = {}
local RAY_PARAMS = RaycastParams.new()
RAY_PARAMS.FilterType = RaycastFilterType.Exclude
function AntiCheatService.InitPlayer(player: Player)
local char = player.Character or player.CharacterAdded:Wait()
local hrp = char:WaitForChild("HumanoidRootPart") :: BasePart
trackedPlayers[player] = {
lastPosition = hrp.Position,
lastTick = os.clock(),
anomalyBuffer = 0,
isFalling = false
}
end
function AntiCheatService.OnHeartbeat(dt: number)
local now = os.clock()
for player, record in pairs(trackedPlayers) do
local char = player.Character
if not char then continue end
local hrp = char:FindFirstChild("HumanoidRootPart") :: BasePart?
local humanoid = char:FindFirstChildOfClass("Humanoid")
if not hrp or not humanoid or humanoid.Health <= 0 then continue end
local currentPos = hrp.Position
local displacement = (currentPos - record.lastPosition).Magnitude
local maxAllowed = (humanoid.WalkSpeed * dt * 1.35) + 0.5
if displacement > maxAllowed and not record.isFalling then
record.anomalyBuffer += (displacement - maxAllowed)
if record.anomalyBuffer > 15 then
hrp.CFrame = CFrame.new(record.lastPosition)
hrp.AssemblyLinearVelocity = Vector3.zero
record.anomalyBuffer = 0
continue
end
else
record.anomalyBuffer = math.max(0, record.anomalyBuffer - (dt * 5))
end
RAY_PARAMS.FilterDescendantsInstances = { char }
local dir = currentPos - record.lastPosition
if dir.Magnitude > 0.1 then
local hit = Workspace:Raycast(record.lastPosition, dir, RAY_PARAMS)
if hit and hit.Instance and hit.Instance.CanCollide then
hrp.CFrame = CFrame.new(record.lastPosition)
hrp.AssemblyLinearVelocity = Vector3.zero
continue
end
end
record.lastPosition = currentPos
record.lastTick = now
end
end
RunService.Heartbeat:Connect(AntiCheatService.OnHeartbeat)
Players.PlayerAdded:Connect(AntiCheatService.InitPlayer)
return AntiCheatService
3. Raycast ile Noclip ve Duvar Geçişlerini Engelleme
Oyuncuların katı nesnelerin içinden geçmesini durdurma:
- Yörünge Raycast Kontrolü: İki konum arasındaki çizgi üzerinde katı parça tespiti.
- Çoklu Işın Kapsülü: Ayak, göğüs ve baş seviyesinde eşzamanlı ışın kontrolü.
- Dinamik Filtreleme: Çarpışması olmayan dekoratif nesneleri filtre dışı bırakma.
- Meşru Işınlanmalar: Oyun içi portallarda sunucu kaydını önceden güncelleme.
4. Ağ Gecikmesi Telafisi ve Paket Dalgalanmaları
Yüksek pingli oyuncuları mağdur etmeden koruma sağlama:
- Anlık RTT Takibi: Ping yükseldiğinde hız toleransını dinamik olarak genişletme.
- Paket Patlaması Yönetimi: Mobil ağlarda gecikmeli gelen toplu paketleri dengeleme.
- Sunucu Geri Alma Sistemi: Vuruş doğrulaması için geçmiş koordinat tamponu.
- Bağlantı Uyarıları: Oyuncuyu oyundan atmak yerine arayüzde uyarı gösterme.
5. Büyük Ölçekli Mimari ve Performans
Sunucu hızını düşürmeden 50+ oyunculu sunucuları koruma:
- Karelere Bölme: Oyuncuları tek ve çift karelerde dönüşümlü denetleme.
- Sessiz Günlükleme: Hile yapana belli etmeden anomalileri harici günlüklere yazma.
- Tekrar Kayıtları: Şüpheli anlarda önceki birkaç saniyenin konumlarını saklama.
- Motor Parametreleri: RejectCharacterDeletions ve özel CollisionGroups yapılandırması.
Frequently Asked Questions
LocalScript üzerinden hız kontrolü neden çalışmaz?
İstemci yerel belleğini kontrol edebilir ve bu kontrolleri rahatlıkla etkisizleştirebilir.
Patlama veya savrulma etkileri nasıl idare edilir?
Sunucu tarafından uygulanan itme güçlerinde oyuncunun hız limiti geçici olarak yükseltilir.
Sunucuda raycast yapmak kasmaya yol açar mı?
Doğru optimize edilmiş raycastler 50 oyuncu için kare başına 0.2 ms'den az sürer.