Bir hileci kendine bir milyon nakit verdiğinde ya da nadir eşyalar spawn ettiğinde, bunun sebebi nadiren zekice bir şeyi kırmış olmasıdır. Çok daha sık görülen durum şudur: bir resource tam olarak bunu yapan bir sunucu event'i kaydetmiştir ve istemcinin gönderdiği her şeye güvenmektedir. Hile menüleri bu event'leri adıyla listeler ve kendi argümanlarıyla tetikler (trigger). Bir anti-cheat bunun çoğunu yakalayabilir; ama en ucuz çözüm, kapıyı baştan açık bırakmamaktır.
1. İstemciden gelen tutarlara asla güvenmeyin
İstemci bir işlem istemeli; sonucu sunucu belirlemeli.
-- Riskli: ödemeyi istemci seçiyor
RegisterNetEvent('jobs:finishDelivery', function(amount)
local src = source
AddMoney(src, amount)
end)
-- Daha iyi: fiyatı sunucu biliyor
local DELIVERY_PAY = 450
RegisterNetEvent('jobs:finishDelivery', function()
local src = source
if not IsOnDelivery(src) then return end
EndDelivery(src)
AddMoney(src, DELIVERY_PAY)
end)
2. İşlemin şu anda mümkün olup olmadığını kontrol edin
Bir ödül vermeden önce o ödülün dayandığı durumu doğrulayın: oyuncu teslim noktasının yakınında mı, gerçekten o meslekte mi, görevi başlatmış mı, yeterli zaman geçti mi? Bu durumu sunucuda tutun. Bir görevin başladığını yalnızca istemci biliyorsa, bir hile görevin bittiğini iddia edebilir.
local DROP = vector3(215.8, -810.1, 30.7)
local ped = GetPlayerPed(src)
if #(GetEntityCoords(ped) - DROP) > 10.0 then return end
3. Argümanlardan gelen oyuncu ID'sini değil, source'u kullanın
Argüman olarak hedef oyuncu ID'si alan bir event, hilenin herkes üzerinde işlem yapmasına izin verir. İşlem çağıranın kendisiyle ilgiliyse source kullanın. Gerçekten başka bir oyuncuyla ilgiliyse (eşya vermek, fatura kesmek), ikisinin birbirine yakın olduğunu ve çağıranın buna yetkisi olduğunu kontrol edin.
4. Ödeme yapan veya spawn eden event'lere hız sınırı koyun
Meşru bir oyuncu birkaç dakikada bir teslimat bitirir, saniyede on kez değil. Ödül veren event'lere oyuncu başına küçük bir bekleme süresi koymak döngüleri anında durdurur ve size loglayabileceğiniz net bir sinyal verir.
local last = {}
local function cooldown(src, seconds)
local now = os.time()
if last[src] and now - last[src] < seconds then return false end
last[src] = now
return true
end
AddEventHandler('playerDropped', function() last[source] = nil end)
5. Kimsenin kullanmadığı event'leri kaldırın
Eski test komutları, geliştirme sırasında bırakılmış admin kısayolları, değiştirdiğiniz bir script'ten kalan "eşya ver" event'leri: her biri hile menüsüne bedava bir hediyedir. Resource'larınızda RegisterNetEvent araması yapın ve her sonuç için, onu gerçekte hangi istemci kodunun çağırdığını sorun.
TruffAC nerede devreye girer?
TruffAC, sunucuda olmayan resource'ların tetiklediği event'leri, bir insanın yapabileceğinden çok daha sık çağrılan event'leri ve hile menülerinin kullandığı kalıpları izler ve ban verirken kanıt kaydeder. Bu, denemeyi yakalar. Sağlam sunucu kodu ise ban gelmeden önce bile denemenin işe yaramamasını sağlar. Hile menülerinin genel olarak nasıl çalıştığını bu yazıda anlattık.