Dokümantasyon 9.6.24
Event'ler ve trigger'lar
Tosun AntiCheat'in scriptlerinizin dinlemesi için yaydığı event'ler, entegrasyon için tetikleyebileceğiniz event'ler ve kendi event'lerinizi muafiyetlere, anahtar kontrollerine, hız sınırlarına ve tuzaklara bağlayan config listeleri. Dahili anticheat event'leri korumalıdır ve çağrılmamalıdır.
Genel bakış#
FiveM'de yerel event'ler ve ağ (net) event'leri vardır. Yerel event oyunun tek tarafında kalır: TriggerEvent onu tetikler, AddEventHandler onu alır. Net event ağı geçer: sunucu onu TriggerClientEvent ile, istemci TriggerServerEvent ile gönderir ve alan taraf onu RegisterNetEvent ile kaydetmelidir. Tosun AntiCheat iki türü de hem sunucuda hem istemcide kullanır.
Bu sayfa, anticheat'in dinlemeniz için yaydığı event'leri, scriptlerinizi entegre etmek için tetikleyebileceğiniz event'leri ve kendi event adlarınızı muafiyetlere, anahtar kontrollerine, hız sınırlarına veya tuzaklara dönüştüren config listelerini (ts.DetectionExempt, ts.ProtectedEvents, ts.EventLimiter, ts.triggerList) listeler.
Anticheat ayrıca kendi giriş el sıkışması, anahtar değişimi, Shield, yetkili menüsü ve web panel işlemleri için çok sayıda dahili event kaydeder. Bunlar nonce'lar, anahtarlar, imzalar, hız sınırları veya yetkili kontrolleriyle korunur ve bazıları tuzaktır. Entegrasyon yüzeyinin parçası değildirler: onları tetiklemeyin, onlara handler kaydetmeyin ve adlarını yeniden kullanmayın. Bunun yerine export'ları kullanın.
| Tür | Tetikleme | Alma | Kim tetikleyebilir |
|---|---|---|---|
| Sunucu yerel event'i | TriggerEvent | AddEventHandler | Herhangi bir sunucu resource'u. |
| İstemci yerel event'i | TriggerEvent | AddEventHandler | O oyuncunun oyunundaki herhangi bir istemci scripti, enjekte edilmiş hile kodu dahil. |
| Net event, istemciden sunucuya | TriggerServerEvent | RegisterNetEvent + AddEventHandler | Bağlı herhangi bir oyuncu, herhangi bir argümanla. |
| Net event, sunucudan istemciye | TriggerClientEvent | RegisterNetEvent + AddEventHandler | Herhangi bir sunucu resource'u. Bir istemci scripti de aynı adı TriggerEvent ile yerel olarak tetikleyebilir. |
Sık yapılan entegrasyon işleri#
Yapmak istediğinize uyan event'i veya ayarı seçin. Her biri bu sayfanın ilerleyen kısımlarında ayrıntılı anlatılır.
| Amaç | Kullanın |
|---|---|
| Bir tespit ban, kick veya log satırıyla sonuçlandığında tepki vermek | ts_anticheat:playerBanned |
| Yalnızca gerçekten ban verildiğinde tepki vermek | ts_anticheat:banCommitted |
| Ban kaldırmaya tepki vermek | ts_anticheat:playerUnbanned |
| Canlı log akışını yansıtmak | ts_anticheat:newLog |
| Anticheat ayarları yeniden uyguladığında önbelleğinizi yenilemek | tosun-ac:settingsReloaded / ts_anticheat:configUpdated |
| Özel bir framework'te panelden yapılan karakter adı değişikliğini uygulamak | tosun-ac:renameCharacter |
| Özel bir spawn'dan sonra istemci kontrollerini açmak | playerSpawned |
| Özel karakter seçiminden sonra paneli yenilemek | tosun-ac:panel:characterReady |
| İstemcinin yetkili durumunu yeniden kontrol etmesini sağlamak | ts_anticheat:adminStateChanged |
| Sunucu scriptinizden bir oyuncuyu istemcide muaf tutmak | tosun-ac:bridge:clientExempt |
| Menü veya işlem event'iniz tetiklendiğinde oyuncuları otomatik muaf tutmak | ts.DetectionExempt |
| Kendi istemciden sunucuya event'inizde oyuncu başına anahtar zorunlu kılmak | ts.ProtectedEvents + <name>:safe |
Anticheat'in yaydığı sunucu event'leri#
Bunlar sunucu yerel event'leridir. Herhangi bir sunucu scriptinde AddEventHandler ile dinleyin. Bunları kendiniz tetiklemeyin; aşağıdaki güvenlik bölümlerine bakın.
| Event | Ne zaman tetiklenir | Veri |
|---|---|---|
ts_anticheat:playerBanned | Her tespit sonucu: BAN, KICK ve LOG. Kick, ban kaydı ve loglardan önce tetiklenir. Yetkili veya whitelist'te olduğu için atlanan oyuncular için tetiklenmez. | data tablosu: playerId (string), playerName, reason, banID, side ('server'), punishment ('BAN', 'KICK' veya 'LOG') |
ts_anticheat:banCommitted | Yalnızca BAN sonuçları (tespitler ile ban ve punish export'ları); ban satırı ekleme kuyruğa alındıktan hemen sonra, panel webhook'u ve sunucudan atmadan önce. | playerId (number), row tablosu: banID, playerName, reason, license, steam, discord, ip, HWID, HWID2 - HWID5, config (tespit config anahtarı) |
ts_anticheat:playerUnbanned | unban export'u, /ts unban komutu veya oyun içi menü bir banı kaldırdıktan sonra. Web panelden yapılan ban kaldırmalar bunu tetiklemez. | banID (unban export'una verilen değer, değiştirilmeden) |
ts_anticheat:newLog | Her canlı log satırı: tespitler, istemci log satırları, yetkili menüsü işlemleri ve bazı dahili anticheat satırları. | payload tablosu: src (kategori etiketi, oyuncu id'si değil), event (mesaj metni), status (varsayılan 'Info'), playerName, time (os.time()) |
tosun-ac:settingsReloaded | Bir ayar senkronu ayarları yeniden uyguladıktan sonra. Bu yalnızca bir şey değiştiğinde değil, başlangıçta ve neredeyse her senkron döngüsünde olur. | yok |
ts_anticheat:shield:screenshot_saved | İstenen bir Shield ekran görüntüsü geldi ve kontrollerden geçti. | src (number), b64 (base64 görüntü, 64 ile 2.500.000 karakter arası) |
ts_anticheat:shield:ban_video_saved | Kicklenen veya banlanan bir oyuncunun oynanış videosu 120 sn içinde yüklendi. | src (number), videoUrl, reason, config (reason ve config istemciden gelir) |
<name>:safe | ts.ProtectedEvents içinde listelenen bir event çağrısı anahtar ve veri kontrollerinden geçti. | src (number, çevrimiçi oyuncu id'si), ardından anahtardan sonraki orijinal argümanlar |
tosun-ac:renameCharacter | qb, qbcore, qbox, qbx veya esx dışındaki bir framework'te web panelden karakter adı değişikliği. | citizenid (string), firstName (ilk kelime), lastName (adın geri kalanı, '' olabilir) |
Anticheat'in yaydığı istemci event'leri#
Bu event'ler istemci scriptlerine ulaşır. ts_anticheat:configUpdated bir istemci yerel event'idir; AddEventHandler ile dinleyin. ts_anticheat:receiveEventKey sunucudan gelen bir net event'tir; istemci scriptinizde RegisterNetEvent ile kaydedin.
| Event | Tür | Ne zaman tetiklenir | Veri |
|---|---|---|---|
ts_anticheat:configUpdated | İstemci yerel event'i | İstemci sunucudan gelen ayarları uygulayıp DetectionExempt hook'larını yeniden taradıktan sonra. Senkron aralığı başına yaklaşık bir kez bekleyin. | yok |
ts_anticheat:receiveEventKey | Net event, sunucudan istemciye | ts_anticheat:requestEventKey'e yanıt olarak (sizin veya anticheat'in kendi isteği) ve sunucu oyuncuya yeni bir anahtar verdiğinde. Giriş el sıkışmasından sonra gelir. | key (string, oyuncunun SafeEvents anahtarı) |
Dinleyici örneği#
Kick ve banlara tepki veren bir sunucu scripti ve anticheat ayarları yeniden uyguladığında önbelleği boşaltan bir istemci scripti. Her sunucu dinleyicisi önce event'i anticheat'in tetiklediğini kontrol eder.
-- server.lua (sizin resource'unuz)
local AC = 'tosun-ac' -- anticheat resource'unun (klasörünün) adı
AddEventHandler('ts_anticheat:playerBanned', function(d)
if GetInvokingResource() ~= AC then return end -- sahte çağrıları yok say
if d.punishment == 'LOG' then return end
print(('[AC] %s %s: %s'):format(d.punishment, d.playerName, d.reason))
end)
AddEventHandler('ts_anticheat:banCommitted', function(playerId, row)
if GetInvokingResource() ~= AC then return end
print('AC ban', row.banID, row.license, row.reason)
end)
-- client.lua (sizin resource'unuz)
local myCache
AddEventHandler('ts_anticheat:configUpdated', function()
myCache = nil
end)playerBanned ayrıntıları#
Ad tarihsel bir kalıntıdır. ts_anticheat:playerBanned yalnızca banlarda değil, her tespit sonucunda tetiklenir. data.punishment'a göre filtreleyin.
data.playerId bir string'dir. Sunucu id'si olarak kullanmadan önce tonumber ile dönüştürün.
Event işlemden önce tetiklenir. Sohbet duyurusu, loglar, DropPlayer ve ban kaydı handler'ınızdan sonra çalışır.
Hedef çevrimdışıysa, oyuncu yetkili olarak atlanıyorsa (ts.AdminBypassDetections false değilse veya ts.Debug açık değilse yetkililer atlanır) ya da oyuncu geçici whitelist'te veya panel whitelist'indeyse tetiklenmez.
Her sonuç için bir banID üretilir ama yalnızca BAN için saklanır. Bir yetkiliye verilen KICK, event zaten tetiklendikten sonra iptal edilir.
Bir oyuncuya ban ekranı (editable/server/sv_banscreen.lua) gösterilirken o oyuncunun sonraki tespitlerinin çoğu yutulur ve bunlar için event tetiklenmez.
banCommitted ayrıntıları#
'Gerçekten ban verildi' için en iyi hook ts_anticheat:banCommitted'dir. Kick ve log satırları için playerBanned kullanın.
Anticheat'in ceza hattındaki her BAN sonucunda tetiklenir: tespitler ile ban ve punish export'ları. Çevrimdışı banlar (offlineBan ve offlineBanByLicense export'ları) ve web panelden verilen banlar bunu tetiklemez.
Ban satırı ekleme MySQL.Async.execute ile kuyruğa alınır ve beklenmez; bu yüzden handler'ınız çalıştığında satır henüz veritabanında olmayabilir.
Satırdaki kimliklerin öneki kaldırılmıştır (license:, license2:, steam:, discord:, ip:). Eksik bir kimlik veya token İngilizce 'Not found' metnidir; eksik ip 'Hidden' olur. HWID - HWID5 ham oyuncu token'larıdır.
newLog ve settingsReloaded ayrıntıları#
İki event de sık tetiklenir. Handler'larını hafif tutun.
ts_anticheat:newLog: src alanı oyuncu id'si değil, bir kategori etiketidir. Tespitler BAN, KICK veya LOG status'u ile 'DETECTION' kullanır. İstemci log satırları sabit bir etiket ve status kullanır: 'Tespit' (koda gömülü Türkçe) ile 'AntiCheat', 'Info' ile 'AC-Grace' ve 'Warning' ile 'AC-FakeTrigger'. Yetkili menüsü girdileri normalde yetkilinin adını BAN, KICK, INFO veya SUCCESS status'u ile kullanır. Birkaç dahili satır başka kategoriler kullanır.
tosun-ac:settingsReloaded: anticheat eski ve yeni değerleri karşılaştırmaz; bu yüzden event başlangıç senkronundan sonra ve senkron döngülerinin çoğunda, her ts.ServerPerf.configSyncIntervalSec saniyede bir tetiklenir (hazır config'te 120, anahtar yoksa 60, en az 20). Bunu 'ayarlar değişti' değil, 'ayarlar yeniden uygulandı' olarak okuyun.
Bu tür her senkrondan sonra sunucu ayarları tüm istemcilere de gönderir ve her istemci ardından ts_anticheat:configUpdated'i tetikler.
Başka bir sunucu resource'u tosun-ac:settingsReloaded'i tetiklerse anticheat, çevrimiçi her oyuncu için tam bir yetkili izin yenilemesi çalıştırır.
Shield ekran görüntüsü ve video event'leri#
İki event de Shield gerektirir (ts.shield.enabled false olmamalı; hazır config'te açıktır).
ts_anticheat:shield:screenshot_saved: RequestShieldScreenshot(src) sunucu export'uyla bir ekran görüntüsü isteyin. Görüntü istekten sonra 60 sn içinde gelmelidir ve anticheat oyuncu başına 20 sn'de en fazla bir tane kabul eder. Web panel de ekran görüntüsü isteyebilir ve bunlar da event'i tetikler.
ts_anticheat:shield:ban_video_saved: ts.shield.banGameplayVideo'nun false olmamasını gerektirir (hazır config'te açık). Yükleme penceresi bir KICK veya BAN'dan sonra 120 sn açık kalır ve video URL'sinin host'u panelle eşleşmelidir.
ban_video_saved içindeki reason ve config istemciden gelir; tür kontrolü veya kırpma yapılmaz. Bunlara güvenilmeyen metin gibi davranın.
local AC = 'tosun-ac'
-- sunucu: oyuncunun oyunundan bir ekran görüntüsü iste
exports[AC]:RequestShieldScreenshot(src)
AddEventHandler('ts_anticheat:shield:screenshot_saved', function(src, b64)
if GetInvokingResource() ~= AC then return end
-- b64 bir base64 görüntü string'idir
end)Özel framework'te karakter adı değiştirme#
Web panel bir karakterin adını değiştirebilir. qb, qbcore, qbox ve qbx için anticheat players.charinfo'yu, esx için users.firstname ve users.lastname'i günceller. Diğer tüm ts.Framework.framework değerlerinde, adı kendiniz uygulayabilmeniz için tosun-ac:renameCharacter'ı tetikler.
Anticheat, bir dinleyici olsun ya da olmasın panele 'event_emitted_unknown_fw' bildirir.
Yeni addan kontrol karakterleri kaldırılır, en fazla 64 karakterle sınırlanır ve en az 3 karakter uzunluğunda olmalıdır. firstName ilk kelimedir; lastName geri kalanıdır ve boş olabilir.
Örnek, oxmysql'in MySQL.update çağrısını ve uydurma bir characters tablosunu kullanır. Sorguyu kendi şemanıza uyarlayın.
AddEventHandler('tosun-ac:renameCharacter', function(cid, first, last)
if GetInvokingResource() ~= 'tosun-ac' then return end
MySQL.update('UPDATE characters SET first = ?, last = ? WHERE cid = ?', { first, last, cid })
end)Tetikleyebileceğiniz event'ler#
Bunlar, scriptleriniz tarafından tetiklenmek üzere tasarlanmış anticheat event'leridir. Framework ölüm ve revive event'leri ile ts.DetectionExempt event'leriniz kendi bölümlerinde anlatılır.
| Event | Nereden tetiklenir | Etkisi | Sınırlar |
|---|---|---|---|
tosun-ac:panel:characterReady | İstemciden, TriggerServerEvent ile. | Panelin çevrimiçi oyuncu listesindeki oyuncunun karakter verisini yeniler. | Oyuncu başına 20 sn'de bir çağrı. |
ts_anticheat:locale:setSelf | İstemciden, TriggerServerEvent ve bir dil koduyla. | Anticheat sunucu mesajlarının dilini yalnızca o oyuncu için ayarlar. Sunucu konsoluna bir satır yazar. | Hız sınırı yok. Kod 2 veya 3 küçük harften oluşmalı ve mevcut bir locales/<lang>.json dosyası olmalıdır. |
ts_anticheat:requestEventKey | İstemciden, TriggerServerEvent ile. | Oyuncunun SafeEvents anahtarını ts_anticheat:receiveEventKey üzerinden geri gönderir. | Oyuncu başına 3 sn'de bir çağrı. Anahtar yalnızca isteyen oyuncuya gider. |
playerSpawned | İstemciden, TriggerEvent ile (yerel). | İstemci kontrollerinin çoğunu açar ve spawn tolerans penceresini başlatır. | O istemcideki diğer tüm resource'lar da bunu alır. |
ts_anticheat:adminStateChanged | Sunucudan, tek bir oyuncuya TriggerClientEvent ile. | İstemci gerçek yetkili durumunu sunucuya yeniden sorar. | Sunucu oyuncu başına saniyede en fazla bir kez yanıt verir. |
tosun-ac:bridge:clientExempt | Sunucudan, TriggerClientEvent ile; resource'unuzda bridge dosyası gerekir. | O oyuncu için istemci tarafı muafiyet. | 500 ile 300000 ms arası. |
Özel spawn: playerSpawned#
İstemci kontrollerinin çoğu, anticheat yerel playerSpawned event'ini görene kadar kapalı kalır: regen, godmode, teleport, görünmezlik, freecam, silahlar, OCR, native, koordinatlar ve araç godmode'u. Normalde spawnmanager bunu tetikler.
Spawn veya multicharacter sisteminiz spawnmanager kullanmıyorsa, oyuncu dünyaya girdiğinde playerSpawned'ı yerel olarak tetikleyin veya SetSpawned(true) istemci export'unu çağırın.
playerSpawned ayrıca ts.spawnGraceSecondsMs süreli spawn tolerans penceresini başlatır. Hazır değer 500'dür ve kod bunu en az 5000 ms'ye yükseltir; anahtar yoksa kod 25000 kullanır. Pencere içindeki bir tespit iptal edilmez. Yalnızca bir 'AC-Grace' log satırı ekler.
playerSpawned ayrıca anticheat'in ölüm durumunu temizler ve bir istemci ışınlanması olarak işaretler.
Hazır ts.DetectionExempt.clientEvents listesi playerSpawned'ı içerir; bu yüzden her playerSpawned ayrıca defaultDurationMs (60 sn) süreli bir istemci muafiyeti başlatır.
SetSpawned(false) en fazla 5 dakikada bir etkili olur ve kontroller yaklaşık 30 sn görünür hareketten sonra yeniden açılır.
-- istemci, kendi spawn mantığınızdan sonra
TriggerEvent('playerSpawned')
-- veya diğer resource'lara yan etkisi olmadan
exports['tosun-ac']:SetSpawned(true)Özel multicharacter: characterReady#
Sunucuda anticheat QBCore:Server:OnPlayerLoaded, QBCore:Server:PlayerLoaded, esx:playerLoaded ve qbx_core:server:playerLoaded event'lerini dinler. Her biri yüklenen karakteri hemen panelin çevrimiçi oyuncu listesine iletir. Bunların hiçbirini tetiklemeyen özel bir multicharacter scripti, karakter seçiminden sonra istemciden tosun-ac:panel:characterReady'yi tetiklemelidir.
Her çağrı oyuncunun satırını veritabanına yazar ve panel URL'si ile anahtarı ayarlıysa panele bir HTTPS isteği gönderir. Bu yüzden sunucu oyuncu başına 20 sn'de bir çağrı kabul eder ve gerisini yok sayar.
-- istemci, karakter seçimi bittikten sonra
TriggerServerEvent('tosun-ac:panel:characterReady')Oyuncu dili: locale:setSelf#
Bir istemci, anticheat'in sunucu mesajlarının dilini kendisi için seçebilir. Başarılı olursa sunucu, sunucu konsoluna bir satır yazar.
Yalnızca o oyuncuya gönderilen sunucu mesajlarını değiştirir. İstemci tarafı dili değiştirmez.
Anticheat'in kendi istemcisi bu event'i göndermez. Sunucu tarafı alternatifler setPlayerLocale export'u ve ts_setlang komutudur.
-- istemci
TriggerServerEvent('ts_anticheat:locale:setSelf', 'en')Yetkili değişiklikleri: adminStateChanged#
Yetkili scriptiniz yetkili haklarını verdikten veya kaldırdıktan sonra, oyuncunun istemcisine yetkili durumunu yeniden kontrol etmesini söyleyin. Event durumu kendi başına değiştiremez: istemci sunucuya yeni bir nonce gönderir ve kararı yalnızca sunucunun yanıtı verir.
Anticheat'teki hiçbir şey bu event'i göndermez. İstemci her 20 sn'de bir kendi kendine de yeniden kontrol eder; bu çağrı yalnızca o gecikmeyi ortadan kaldırır.
Bunu yerel olarak tetikleyen bir hile hiçbir şey kazanmaz; sunucu kontrole oyuncu başına saniyede en fazla bir kez yanıt verir.
-- sunucu, src için yetkili haklarını değiştirdikten sonra
TriggerClientEvent('ts_anticheat:adminStateChanged', src)Bridge event'i: tosun-ac:bridge:clientExempt#
İstemci bridge dosyası bu net event'i sizin kendi resource'unuzun içinde kaydeder. Sunucu scriptiniz bunu bir oyuncuya gönderir ve bridge, o oyuncu için anticheat'in SetExempt istemci export'unu çağırır.
durationMs, ms cinsinden bir sayı veya büyük/küçük harf fark etmeksizin bir hazır ayar adıdır: SHORT, MEDIUM, LONG veya XL (30, 60, 120 veya 180 sn). Değerler 500 ile 300000 ms arasına sınırlanır. Değer verilmezse convar varsayılanı (60000) geçerli olur.
Muafiyet anahtarı 'bridge:' ve ardından tag'dir; tag nil ise resource adınızdır.
Bu yalnızca istemci tarafı bir muafiyettir. Sunucu kontrolleri çalışmaya devam eder.
Anticheat bu event'i hiçbir zaman göndermez. Birden fazla resource'unuz bridge dosyasını içeriyorsa, tek bir TriggerClientEvent her birinde bir kez çalışır.
- Resource'unuzun fxmanifest.lua dosyasına client_script '@tosun-ac/bridge/tosun_ac_client.lua' ekleyin.
- İsteğe bağlı, server.cfg içinde: anticheat klasörünün adını değiştirdiyseniz yeni adla setr tosun_ac_resource ekleyin (varsayılan tosun-ac). Varsayılan süreyi değiştirmek için ms cinsinden bir değerle setr tosun_ac_bridge_client_ms ekleyin (varsayılan 60000).
- Sunucu scriptinizden TriggerClientEvent('tosun-ac:bridge:clientExempt', src, durationMs, tag) gönderin.
-- sunucu: berber menüsü açıkken oyuncuyu 2 dakika muaf tut
TriggerClientEvent('tosun-ac:bridge:clientExempt', src, 'LONG', 'barber')Framework ölüm ve revive event'leri#
İstemci, bir oyuncunun ne zaman ölü veya yerde olduğunu bilmek için bu event'leri dinler. Bu durum aktifken regen artışı, godmode, teleport, görünmezlik, spectate ve diğer bazı istemci kontrolleri atlanır. Native ölümler de gameEventTriggered hasar event'i üzerinden yakalanır.
9.5.9’dan beri oyuncu yeniden açıkça aktif olduğunda anticheat bu durumu kendiliğinden sonlandırır.
Özel bir ambulans scripti, anticheat'in durumunu eşitlemek için bu adlardan birini yerel olarak tetikleyebilir. Bunlar ortak framework adlarıdır; bu yüzden o istemcide bunları dinleyen diğer tüm resource'lar da çalışır (örneğin ESX ölüm ekranları).
| Event | Tür | Etkisi |
|---|---|---|
hospital:client:isDead | Net | Yerde; 25 sn'lik ölüm sonrası penceresini başlatır. |
hospital:client:SetDeathState | Net, boolean argüman | true: yerde ve 25 sn'lik ölüm sonrası penceresi. false: canlandı ve 10 sn'lik revive sonrası penceresi. |
hospital:client:SetLaststand | Net, boolean argüman | true: yerde ve 25 sn'lik ölüm sonrası penceresi (false yok sayılır). Ayrıca 45 sn'lik otomatik muafiyet. |
qb-medical:client:OnDeath | Net | Yerde; 25 sn'lik ölüm sonrası penceresini başlatır. |
esx:onPlayerDeath | Net | Yerde; 25 sn'lik ölüm sonrası penceresini başlatır. Ayrıca 45 sn'lik otomatik muafiyet. |
baseevents:onPlayerDied | Yerel (autoExempt açıkken net) | 25 sn'lik ölüm sonrası penceresini başlatır. Ayrıca 45 sn'lik otomatik muafiyet. |
baseevents:onPlayerKilled | Yalnızca yerel | 25 sn'lik ölüm sonrası penceresini başlatır. |
hospital:client:Revive | Net | Canlandı; 10 sn'lik revive sonrası penceresini başlatır. |
qb-ambulancejob:client:RevivePlayer | Net | Canlandı; 10 sn'lik revive sonrası penceresini başlatır. |
qb-medical:client:OnRevive | Net | Canlandı; 10 sn'lik revive sonrası penceresini başlatır. |
esx_ambulancejob:revive | Net | Canlandı; 10 sn'lik revive sonrası penceresini başlatır. |
esx_basicneeds:onRevive | Net | Canlandı; 10 sn'lik revive sonrası penceresini başlatır. |
playerSpawned | Yerel | Yerde durumunu temizler ve ölüm sonrası penceresinden yaklaşık 17 sn bırakır. |
-- özel ambulans (istemci), kendi revive mantığınızdan sonra
TriggerEvent('esx_ambulancejob:revive')Otomatik muafiyet event'leri (autoExempt)#
ts.autoExempt.enabled ile (hazır config'te true) istemci yaygın framework event'lerini dinler ve SetExempt export'u üzerinden kısa bir istemci muafiyeti verir. Muafiyet sırasındaki istemci tespitleri cezalandırılmaz; '[exempt]' işaretli LOG satırları olarak raporlanır. Kapatmak için ts.autoExempt.enabled = false yapın.
client/anticheat_auto_exempt.lua dosyasındaki başlık yorumu bu event'lerin uzaktan tetiklenemeyeceğini söyler. Bu yanlıştır: RegisterNetEvent ile kaydedildikleri için sunucu da onları tetikleyebilir. Etkisi yine de yalnızca bir istemci muafiyetidir.
| Durum | Süre | Event'ler |
|---|---|---|
| Görünüm menüleri | 180 sn | illenium-appearance:client:openMenu, appearance:client:openMenu, fivem-appearance:client:openMenu, ox_appearance:openMenu |
| Kıyafet menüleri | 180 sn | qb-clothing:client:openMenu, qb-clothes:client:openMenu, rcore_clothing:openClothingShop, clothing:client:openMenu |
| ESX skin ve berber menüleri | 180 sn | esx_skin:openSaveableMenu, esx_skin:openRestrictedMenu, skinchanger:model:loaded, tgg_barber:open, barbershop:client:open |
| Karakter seçimi | 30 sn | qb-multicharacter:client:chooseChar, qb-multicharacter:client:closeNUIdefault, esx_multicharacter:SetupCharacters, esx:restoreLoadout, ox:playerLoaded, qbx_core:client:playerLoggedOut |
| Ölüm ve laststand (QB, ESX) | 45 sn | esx_ambulancejob:setDeathStatus, esx:onPlayerDeath, hospital:client:SetLaststand, hospital:client:OnPlayerLaststand, qb-ambulancejob:client:playerDead |
| Ölüm (diğer scriptler) | 45 sn | wasabi_ambulance:clientDeath, ars_ambulancejob:client:dead, baseevents:onPlayerDied, baseevents:onPlayerWasted |
| Karakter yüklendi | 15 sn | QBCore:Client:OnPlayerLoaded, qbx_core:client:playerLoaded, esx:playerLoaded, ox:playerLoaded |
| Anticheat'in istemcide başlaması | 60 sn | onClientResourceStart |
Giriş kapısı: framework yüklendi event'leri#
ts.NetworkJoin.waitForFrameworkLoaded (hazır config'te true) ile ve qb, qbox veya esx framework'ünde istemci, anticheat'e girişini tamamlamadan önce bir framework yüklendi event'ini bekler. Bu, o oyuncu için tüm istemci korumasının başlamasını geciktirir. Diğer framework değerlerinde bekleme atlanır.
minReadyDelayMs (hazır config'te 15 sn) dolup yükleme ekranı bittikten sonra istemci, toplamda en fazla 180 sn olmak üzere yüklendi event'lerinden birini veya LocalPlayer.state.isLoggedIn (qb, qbox) ya da ESX.PlayerLoaded (esx) değerini bekler. Ardından hazır olduğunu bildirmeden önce postFrameworkSettleMs (hazır config'te 5 sn) kadar ve çarpışmanın (collision) yüklenmesini bekler.
| Framework | Yüklendi event'leri | Sıfırlama event'leri |
|---|---|---|
qb | QBCore:Client:OnPlayerLoaded | QBCore:Client:OnPlayerUnload |
qbox | QBCore:Client:OnPlayerLoaded, qbx_core:client:playerLoggedIn, qbx_multicharacter:client:chooseChar | QBCore:Client:OnPlayerUnload |
esx | esx:playerLoaded | esx:onPlayerLogout |
Korunan event'ler (SafeEvents)#
ts.ProtectedEvents, anticheat'in kendi istemciden sunucuya event'lerinizde oyuncu başına bir anahtarı kontrol etmesini sağlar. Kontrolden geçen bir çağrı, sunucuda ilk argüman oyuncu id'si olacak şekilde '<name>:safe' yerel event'i olarak yeniden tetiklenir. Hazır listede yalnızca 'test:event' vardır.
TriggerSafeServerEvent yalnızca anticheat'in kendi istemcisinde vardır ve export edilmez; bu yüzden diğer resource'lar yukarıdaki receiveEventKey kalıbını kullanmalıdır. Anticheat'in istemcisi anahtar gelene kadar her 5 sn'de bir ister (en fazla 12 deneme).
Sunucu oyuncu başına 3 sn'de en fazla bir anahtar isteğine yanıt verir ve anticheat'in kendi istekleri de buna dahildir. Anahtar gelmezse birkaç saniye sonra yeniden isteyin. Handler'ınızı kayıtlı tutun ve her zaman aldığınız en son anahtarı gönderin.
- Event adınızı configs/anticheat_config.lua içindeki ts.ProtectedEvents'e ekleyin. Liste başlangıçta bir kez okunur; değişikliklerden sonra anticheat'i yeniden başlatın.
- İstemci scriptinizde anahtarı saklamak için ts_anticheat:receiveEventKey'i kaydedin, ardından ts_anticheat:requestEventKey gönderin.
- Event'inizi anahtar ilk argüman olacak şekilde gönderin: TriggerServerEvent(name, key, ...).
- Sunucu scriptinizde '<name>:safe' event'ini AddEventHandler ile işleyin. İlk argüman oyuncunun sunucu id'sidir, ardından sizin argümanlarınız gelir.
-- configs/anticheat_config.lua
ts.ProtectedEvents = { ['my-shop:buy'] = true }
-- istemci (sizin resource'unuz)
local key
RegisterNetEvent('ts_anticheat:receiveEventKey', function(k) key = k end)
TriggerServerEvent('ts_anticheat:requestEventKey')
-- sonra, key ayarlandığında:
TriggerServerEvent('my-shop:buy', key, 'bread')
-- sunucu (sizin resource'unuz)
AddEventHandler('my-shop:buy:safe', function(src, item)
if GetInvokingResource() ~= 'tosun-ac' then return end
-- para, stok ve yetkileri burada kontrol edin
end)SafeEvents neyi kontrol eder, neyi etmez#
SafeEvents yalnızca iletimi doğrular. Kimseyi asla cezalandırmaz ve kendi handler'ınızdaki kontrollerin yerini tutmaz.
- Her istemci çağrısı, anahtar olmasa bile önce ts.SafeEventRateWindow saniye başına ts.SafeEventRateLimit sınırına sayılır (varsayılan 10 sn'de 30 çağrı).
- Oyuncunun henüz anahtarı yoksa çağrı sessizce düşürülür.
- Yanlış anahtar, hız sınırı, ts.SafeEventMaxArgs'tan fazla argüman (varsayılan 64) veya hatalı veri çağrıyı düşürür ve oyuncu, event ve pencere başına bir veritabanı log satırı yazar.
- Sunucudan gelen çağrılar (source 0) yok sayılır ve ':safe' event'i tetiklenmez.
- Ham net event, kendi resource'unuzun RegisterNetEvent ile kaydettiği her handler'a yine ulaşır. Yalnızca ':safe' yansıması kapıdan geçer.
- ':safe' adını asla RegisterNetEvent ile kaydetmeyin; bu, istemcilerin onu doğrudan çağırmasına izin verir.
- SafeEvents ek bir katmandır. Kendi handler'ınız yine de yetkileri, bakiyeleri ve sahipliği kontrol etmelidir.
- Listeye framework event'leri (esx, qb) eklemeyin. Bunları çağıranlar anahtar göndermez; SafeEvents bu çağrıları reddeder, log satırları yazar ve ':safe' hiçbir zaman tetiklenmez. Framework'ün kendi handler'ları yine çalışır.
- configs/anticheat_config.lua içindeki Türkçe yorum, anahtarsız çağrıların hatalı bana yol açtığını söyler. Bu sürümde yalnızca düşürülürler.
ts.DetectionExempt: event'lerinizi muafiyetlere bağlayın#
ts.DetectionExempt kendi event adlarınızı geçici tespit muafiyetlerine dönüştürür. Bir oyuncunun görünümünü, konumunu veya durumunu meşru şekilde değiştiren menüler ve sunucu işlemleri için kullanın: kıyafet, berber, ev, garaj, karakter seçimi ve revive. Listeler configs/anticheat_config.lua dosyasından okunur; panel ayarları bunları değiştirmez. ts.MenuDetectionExempt eski config'ler için tutulan bir takma addır.
| Anahtar | Tür | Hazır değer | Etkisi |
|---|---|---|---|
enabled | boolean | true | false tüm DetectionExempt hook'larını kapatır. |
defaultDurationMs | number (ms) | 60000 | Kendi durationMs'i olmayan girdiler için muafiyet süresi. Sunucu girdileri 1000 ile 120000 ms, istemci girdileri 1000 ile 300000 ms arasına sınırlanır. |
budgetMsPer10Min | number (ms) | 240000 | Bir oyuncunun 10 dakikada serverEvents'ten toplayabileceği en fazla yumuşak muafiyet süresi. |
clientEvents | string listesi | 153 girdi (142 benzersiz ad) | İstemci net event'leri. Biri tetiklendiğinde oyuncunun istemci kontrolleri muaf olur. |
localEvents | string listesi | 11 girdi | İstemci yerel event'leri (yalnızca istemcide TriggerEvent). Etkisi clientEvents ile aynıdır. |
serverEvents | string veya tablo listesi | 34 girdi | İstemciden sunucuya net event'ler. Bir oyuncu birini tetiklediğinde o oyuncu yumuşak muafiyet alır. |
DetectionExempt.serverEvents#
Anticheat listelenen her adı RegisterNetEvent ile kaydeder. Bir oyuncu onu tetiklediğinde o oyuncu yumuşak muafiyet alır: sunucu hareket kontrolleri ve sunucu tarafı godmode, görünmezlik, noclip ve kamera kontrolleri gevşetilir, oyuncunun istemci kontrolleri de bir state bag üzerinden muaf tutulur. Bu asla cezaya karşı dokunulmazlık değildir.
Bir girdi bir string veya bir tablodur: { event = 'name', durationMs = 60000, resource = 'owner-resource', always = true }. durationMs 1000 ile 120000 ms arasına sınırlanır.
Hook yalnızca sahip resource başlamışken veya başlarken kurulur. Sahip, event'in ilk iki nokta üst üsteden önceki önekidir; qb-clothes qb-clothing'e, hospital qb-ambulancejob'a eşlenir. Önek resource adından farklıysa resource'u ayarlayın. always = true, sahip çalışmıyor olsa bile hook'u kurar.
Hook'lar anticheat başladıktan 2,5 sn sonra ve başka herhangi bir resource başladıktan 1 sn sonra yeniden kurulur.
Oyuncular bu event'leri kendileri tetikleyebilir; bu yüzden her oyuncunun bir bütçesi vardır (budgetMsPer10Min). Bir oyuncu bütçesini tükettiğinde anticheat bir konsol uyarısı ve bir veritabanı log satırı yazar ve 10 dakikanın geri kalanında o oyuncudan gelen diğer istekleri yok sayar.
Kaç sunucu muafiyet event'inin bağlandığını görmek için sunucu konsolunda tosunac_integration çalıştırın. Yalnızca sunucu konsolundan çalışır ve çıktı oraya gider.
DetectionExempt.clientEvents ve localEvents#
clientEvents adları istemcide RegisterNetEvent ile kaydedilir. Biri sunucudan veya yerel bir TriggerEvent ile tetiklendiğinde istemci defaultDurationMs boyunca muaf olur.
clientEvents yalnızca string kabul eder. durationMs içerenler dahil tablo girdileri istemcide sessizce yok sayılır.
Muafiyet sırasında istemci tespitleri cezalandırılmaz. Kontrol başına dakikada en fazla bir kez '[exempt]' işaretli LOG satırları olarak raporlanırlar; böylece kötüye kullanım panelde görünür kalır. Sunucu kontrolleri etkilenmez.
localEvents aynı şekilde çalışır ama yalnızca AddEventHandler kullanır; bu yüzden yalnızca istemcideki TriggerEvent'e tepki verir.
İstemci iki listeyi de yüklendikten 3,5 sn sonra ve her ayar senkronunda yeniden tarar.
Çalıştırmadığınız bir scriptin event'i hiçbir zaman tetiklenmez; bu yüzden listedeki fazladan adlar zarar vermez. Hazır clientEvents listesi 11 adı tekrar eder; tekrarlar zararsızdır.
DetectionExempt örneği#
Adlarınızı configs/anticheat_config.lua içindeki mevcut listelere ekleyin, ardından anticheat'i yeniden başlatın. Tüm tabloyu değiştirmek hazır girdileri kaldırır. Örnek yalnızca yeni girdileri gösterir.
Kod sizin kontrolünüzdeyse export'ları tercih edin: SetExempt(true, ms, reason) istemci export'u, güvenilen bir resource'tan SetExempt(src, ms, reason) sunucu export'u ve bir oyuncuyu ışınlamadan hemen önce MarkTeleport(src, ms) sunucu export'u.
ts.DetectionExempt = {
enabled = true,
defaultDurationMs = 60000,
budgetMsPer10Min = 240000,
-- istemci net event'leri: yalnızca string
clientEvents = {
-- ...hazır gelen girdiler...
'my-clothing:client:openMenu',
},
-- istemci yerel event'leri (istemcide TriggerEvent)
localEvents = {
-- ...hazır gelen girdiler...
'my-menu:opened',
},
-- istemciden sunucuya event'ler: gönderen için yumuşak muafiyet
serverEvents = {
-- ...hazır gelen girdiler...
'my-clothing:server:saveOutfit',
{ event = 'my-housing:server:enter', durationMs = 60000 },
{ event = 'myhouse:server:enter', resource = 'my-housing' },
{ event = 'my-garage:server:takeOut', durationMs = 45000, always = true },
},
}ts.EventLimiter: net event'ler için hız sınırları#
ts.EventLimiter, event adlarını oyuncu başına 5 sn'deki en fazla çağrı sayısına eşler. Anticheat her adı yüklenirken RegisterServerEvent ile kaydeder ve çağrıları oyuncu başına sayar; tüm sayaçlar her 5 sn'de sıfırlanır. Event için sizin kendi handler'ınız yine çalışır.
Bir sayaç sınırına ulaştığında anticheat, ts.EventLimiter config'iyle bir tespit dener (server_event_spam, varsayılan KICK).
Hazır listede 25 girdi vardır: test:event, esx:getSharedObject, banka ve QBCore para event'leri, revive, araç spawn, envanter, hapis ve kelepçe event'leri ve HCheat:TempDisableDetection.
Adlar ve sınırlar yüklenirken okunur. ac_event_limits veritabanı tablosu senkron sırasında ts.EventLimiter'ın yerine geçer ama kayıtlı handler'ları değiştirmez; bu yüzden ikisinden birini düzenledikten sonra anticheat'i yeniden başlatın.
ts.EventLimiter = {
-- ...hazır gelen girdiler...
['my-shop:buy'] = 10,
}Tuzak event'ler: bu adları asla kullanmayın#
Bazı event'ler yalnızca hileleri yakalamak için vardır. Kendi scriptlerinizin bunlardan hiçbirini tetiklememesi için şu kurallara uyun.
- Anticheat, yalnızca hilelerin tetiklediği tuzak event'ler kaydeder. Bunları asla tetiklemeyin ve adlarını asla yeniden kullanmayın.
- Kendi sunucunuzdaki tuzak adlarını görmek için /ts evtlist çalıştırın (liste sunucu konsoluna yazılır). Bir event'i tuzak saymayı bırakmak için /ts evtwhitelist <eventName> kullanın. Ayrıntılar Komutlar konusunda.
- Kendi event'lerinize önek olarak resource adınızı verin (örneğin myresource:doThing); böylece hiçbir tuzakla çakışmazlar.
Ses event'i hız koruması#
Anticheat bu ses event'lerini kendi resource'unda net event olarak kaydeder ve oyuncu başına sayar. ts.premiumGuard.soundPerSec üzerinde (varsayılan saniyede 6) soundAction'ı uygular (varsayılan 'log'). Event'i yalnızca soundCancel = true olduğunda iptal eder (varsayılan false). Ses resource'unuz event'i kendisi kaydettiyse o resource'un handler'ları yine çalışır.
Koruma yalnızca ts.premiumGuard.enabled ve ts.premiumGuard.soundGuard true iken çalışır (hazır config'te ikisi de true). Ses scriptlerinizin sınırın altında kaldığını kontrol edene kadar soundCancel'ı false tutun.
| Event | Resource |
|---|---|
InteractSound_SV:PlayOnAll | InteractSound |
InteractSound_SV:PlayWithinDistance | InteractSound |
InteractSound_SV:PlayOnOne | InteractSound |
xsound:stateSound | xsound |
xsound:server:play | xsound |
xsound:server:playUrl | xsound |
xsound:server:playUrlPos | xsound |
Anticheat'in diğer resource'lara gönderdiği event'ler#
Yetkili, panel veya tespit işlemlerinden sonra anticheat başka resource'lara ait event'leri tetikler. Bu resource'lardan birini çalıştırıyorsanız bu çağrıları bekleyin.
Hava ve saat yalnızca şu sırayla ilk başlatılmış senkron resource'unu kullanır: qb-weather, Renewed-Weathersync (yalnızca export), cd_easytime, wd_weather, weathersync, vSync, qb-weathersync. Hiçbiri başlatılmamışsa anticheat hava ve saati doğrudan her istemcide ayarlar.
hospital:client:Revive ve esx_ambulancejob:revive aynı zamanda anticheat dinleyicileridir (bkz. Framework ölüm ve revive event'leri); bu yüzden bu revive'lar da 10 sn'lik revive sonrası penceresini açar.
| Event | Taraf | Ne zaman gönderilir |
|---|---|---|
qb-weather:server:RequestStateChange | Sunucu yerel | qb-weather'ın setWeather veya setTime export'u yokken hava veya saat değişikliği. Saat için değer bir { hour, minute } tablosudur. |
cd_easytime:setWeather, cd_easytime:setTime | Sunucu yerel | cd_easytime ile hava veya saat değişikliği. |
<res>:setWeather, <res>:setTime | Sunucu yerel | wd_weather, weathersync, vSync veya qb-weathersync ile, o resource'un eşleşen export'u yokken hava veya saat değişikliği. |
wasabi_ambulance:revive | İstemci yerel | wasabi_ambulance başlatılmışken yetkili veya panel revive'ı. |
hospital:client:Revive | İstemci yerel | qb-ambulancejob veya Starter-Hospital ile yetkili veya panel revive'ı. |
esx_ambulancejob:revive | İstemci yerel | esx_ambulancejob ile yetkili veya panel revive'ı. |
<res>:revive, <res>:client:Revive, <res>:client:revive | İstemci yerel | Diğer durumlarda yetkili veya panel revive'ı: ambulance, qb-ambulancejob, cd_ambulance ve ars_ambulancejob arasından ilk başlatılmış olan üç adın hepsini alır. Oyuncu hâlâ ölüyse ardından native bir diriltme yapılır. |
QBCore:Notify | İstemci yerel; sunucudan istemciye | Anticheat'in yaptığı her iyileştirme, qb-core olmasa bile (qb-core kontrolü her zaman true döner). Ayrıca panel para, envanter ve bildirim işlemleri. |
esx:showNotification, QBCore:Player:SetPlayerData, inventory:client:ItemBox | Sunucudan istemciye | Panel para, envanter ve bildirim işlemleri ve eşya olarak silah verme. |
chat:addMessage | Sunucudan istemciye; istemci yerel | Sohbet mesajları ve panel duyuruları. ts.chatMessages = true ile (varsayılan false), LOG dahil her tespit sonucu tüm oyunculara koda gömülü Türkçe ile gider (editable/server/sv_editme.lua). |
chat:addSuggestion | İstemci yerel | Yetkili menüsü dosyası yüklendiğinde /unspectate önerisini ekler. |
qb-phone:client:CustomNotification, qs-smartphone:client:sendNotification, lb-phone:notification, yseries:notification, gks-phone:client:notification, roadphone:notify | Sunucudan istemciye | Kick ve banlarda yetkili uyarıları ile phoneNotify ve phoneNotifyAdmins export'ları. Bunları yalnızca ilk başlatılmış telefon alır (npwd bir export kullanır; hiçbiri yoksa sohbet). ts.AdminMenu.enable = true gerektirir. |
Güvenlik: hangi event'i kim tetikleyebilir#
Anticheat'in yaydığı event'leri yalnızca anticheat tetikleyebilir. Diğer resource'lar bunları tetiklememelidir. Tablo, her event'i kimin tetikleyebileceğini gösterir.
| Event | Kim tetikleyebilir |
|---|---|
ts_anticheat:playerBanned | Yalnızca anticheat. |
ts_anticheat:banCommitted | Yalnızca anticheat. |
ts_anticheat:newLog | Yalnızca anticheat. |
ts_anticheat:shield:ban_video_saved | Yalnızca anticheat. |
tosun-ac:settingsReloaded | Yalnızca anticheat. |
ts_anticheat:configUpdated | Yalnızca anticheat. |
ts_anticheat:adminStateChanged | Herhangi bir sunucu resource'u. |
tosun-ac:panel:characterReady | Herhangi bir istemci. Oyuncu başına 20 sn'de bir çağrıyla sınırlıdır. |
ts_anticheat:locale:setSelf | Herhangi bir istemci. Yalnızca çağıranı etkiler. |
ts_anticheat:requestEventKey | Herhangi bir istemci. Anahtar yalnızca isteyen oyuncuya gider. |
tosun-ac:bridge:clientExempt | Sizin sunucu scriptleriniz. |
Güvenlik: GetInvokingResource'u kontrol edin#
Herhangi bir sunucu resource'u bir sunucu yerel event'ini tetikleyebilir. Dinleyicilerinizde işlem yapmadan önce event'i anticheat'in tetiklediğini kontrol edin. Anticheat'in kendi ban ekranı dinleyicisi de benzer bir kontrol kullanır.
Bu kontrolü playerBanned, banCommitted, playerUnbanned, newLog, settingsReloaded, Shield event'leri, renameCharacter ve '<name>:safe' handler'larınıza uygulayın.
Anticheat'in event'lerini test için bile olsa kendi resource'larınızdan asla tetiklemeyin. Birkaç yerleşik dinleyici çağıranı kontrol etmez.
AddEventHandler('ts_anticheat:banCommitted', function(playerId, row)
if GetInvokingResource() ~= 'tosun-ac' then return end -- adını değiştirdiyseniz klasör adınız
-- burada row üzerinde güvenle işlem yapabilirsiniz
end)Güvenlik: sunucu otoriteli tasarım#
Bir istemcinin tetikleyebildiği her şey otorite olarak değil, ipucu olarak değerlendirilir. Kendi handler'larınızda da aynı kuralı uygulayın.
- İstemci muafiyetleri (clientEvents, localEvents, autoExempt, bridge event'i ve SetExempt istemci export'u) sunucu denetimini asla değiştirmez. Aktifken istemci tespitleri cezalandırılmak yerine '[exempt]' olarak loglanır.
- serverEvents muafiyetleri yumuşaktır: sunucuda yalnızca hareket ve görünürlük kontrollerini gevşetir (silah, para, hasar, event kötüye kullanımı, enjeksiyon ve çökertme cezaları yine uygulanır) ve her oyuncu budgetMsPer10Min ile sınırlanır.
- Yetkili durumuna sunucunun nonce korumalı yanıtı karar verir. Bir istemciye yetkili bayrağı göndermek yetkili yapamaz.
- SafeEvents anahtarı yalnızca iletimi doğrular. ':safe' handler'ınız yetkileri, bakiyeleri ve sahipliği sunucuda kontrol etmelidir.
- Bir hile framework ölüm event'lerini yerel olarak tetikleyebilir. Yerde bayrağı yaklaşık 20 sn açıkça aktif oynanıştan sonra temizlenir.
- Bir oyuncuyu sunucu tarafından muaf tutmak için export'ları kullanın: güvenilen bir resource'tan SetExempt(src, ms, reason) veya ışınlamadan önce MarkTeleport(src, ms).
Dahili event'ler#
Bu sayfadaki event'lerin yanında anticheat, kendi giriş el sıkışması, anahtar değişimi, Shield, yetkili menüsü, web panel işlemleri ve bir yardımcı resource için dahili event'ler kaydeder. Bunlar nonce'lar, anahtarlar, imzalar, hız sınırları veya yetkili kontrolleriyle korunur ve birkaçı çağıranı cezalandıran tuzaklardır. Burada bilerek belgelenmemiştir.
- Dahili event'leri sunucudan veya istemciden tetiklemeyin.
- Onlara handler kaydetmeyin ve adlarını yeniden kullanmayın.
- Bu sayfa tetikleyebileceğiniz bir event olarak listelemedikçe, adı ts_anticheat: veya tosun-ac: ile başlayan hiçbir event'i tetiklemeyin.
- İşlemler için export'ları kullanın: örneğin punish, MarkTeleport, freezePlayer, setPlayerHealth, RequestShieldScreenshot ve quarantine.
9.6.15'teki bilinen sorunlar#
Bu davranışlar hazır gelen koddadır. Planınızı buna göre yapın.
- tosun-ac:settingsReloaded ve ts_anticheat:configUpdated yalnızca ayarlar değiştiğinde değil, neredeyse her senkron döngüsünde tetiklenir.
- ts_anticheat:playerBanned BAN'ın yanı sıra KICK ve LOG için de tetiklenir.
- Canlı loglar için yetkili telefon uyarısı ts_anticheat:newLog içinde 'TESPİT' veya 'Detection' status'unu dinler, ama hiçbir şey bu değerlerden birini üretmez; bu yüzden o uyarı hiçbir zaman tetiklenmez.
- Anticheat'in yaptığı her iyileştirme, qb-core olmayan sunucularda bile istemcide QBCore:Notify tetikler.
- ts.quarantine.autoQuarantine'in hiçbir etkisi yoktur: tek girdisi hiçbir şeyin üretmediği dahili bir event'tir. Bunun yerine quarantine export'unu kullanın.
- configs/anticheat_config.lua içindeki birkaç yorum Türkçedir ve bazıları güncel değildir: ts.ProtectedEvents'te anahtarsız çağrılar banlanmaz, düşürülür; ts.EventLimiter da kick atmaz.
Yeniden başlatmada gereksiz taramayı azaltma#
Her açılışta kaynakların içerik SHA256 özeti kontrol edilir. Dosyası ve tarama politikası değişmeyen kaynaklarda pahalı imza ve olay analizi yeniden yapılmaz; sunucu KVP alanındaki doğrulanmış önbellek kullanılır. Dosya, istisna veya tarama kuralı değişirse ilgili analiz yenilenir. Bu kontrol sıfır disk erişimi veya sabit bir resmon değeri vaat etmez.
- KVP önbelleğini normal güncellemede silmeyin; bozulmuş veya doğrulanamayan kayıt yeniden analiz edilir.
- Başlangıç kataloğu Lua/JS dosyalarındaki açıkça yazılmış olay adlarını toplar; dinamik olaylar, okunamayan/escrow dosyaları ve DLL dosyaları tam taranmış sayılmaz.
- Manuel otomatik kurulum güvenlik analizinin tamamlanmasını bekler. Eksik, şüpheli, değişmiş veya zaman aşımına uğramış kaynak kendiliğinden onaylanmaz.
- Güncellemeden sonra önce test sunucusunda bir oyuncuyla giriş, normal oyun ve yönetici işlemlerini kontrol edin; resmon ölçümünü oyuncu sayısı ve framework yüküyle birlikte değerlendirin.