Configurazione
ShadowBlocker
Riconosce chi bara e mette in mano allo staff le prove per decidere.
Dove sono i file
plugins/ShadowBlocker/ Il plugin li crea al primo avvio e li aggiorna da solo alle nuove versioni, senza toccare le tue modifiche.
Applicare le modifiche
/shadowblocker reload Rilegge i file senza riavviare il server.
Nessuna impostazione trovata
Prova con un’altra parola, oppure cerca in tutti i plugin.
Impostazioni
I file che decidono come si comporta il plugin. Si parte da qui.
config.yml
Impostazioni generali 94 impostazioni
config.ymlplugins/ShadowBlocker/config.yml Note del file
Questo file decide COME si comporta il plugin. Le soglie dei singoli controlli stanno invece in checks.yml, una per una, con scritto accanto cosa rilevano e cosa può produrre un falso positivo.
Ogni valore qui ha già il numero giusto per un server normale: puoi copiare il jar e non aprire mai questo file. Quando ti serve cambiare qualcosa, il commento sopra ogni chiave dice COSA fa e, soprattutto, PERCHÉ è così.
Un valore sbagliato non ferma mai il plugin: viene sostituito con quello predefinito e la console riporta il percorso e cosa ci si aspettava lì.
All'aggiornamento i tuoi file vengono portati alla nuova versione in automatico: ogni valore che hai cambiato (e ogni soglia che hai regolato in checks.yml) viene riportato, le nuove opzioni arrivano con i loro commenti, i vecchi file vengono conservati in backup/<date>/, e se qualcosa richiede la tua attenzione troverai PORTING-<version>.txt nella cartella del plugin.
Le durate si scrivono in chiaro: 500ms, 20t (tick), 30s, 5m, 2h30m, 7d. Un numero senza unità vale secondi.
config-version1Come decide ShadowBlocker
Ogni controllo segue la stessa scala, e ogni gradino è più difficile da raggiungere di quello sotto:
Continua a leggere
1. SFORAMENTO. Un controllo misura qualcosa (una velocità, una distanza,
un tempo) e lo confronta con quello che Minecraft permette in quella esatta situazione, più dei margini per la latenza. Sforare NON è ancora una violazione. Nessuno lo vede, tranne un membro dello staff che sta osservando quel giocatore con /shadowblocker debug <player>.
2. VIOLAZIONE. Gli sforamenti si sono ripetuti più del 'buffer' del
controllo (checks.yml). La violazione viene scritta nel registro delle prove con tutto il contesto, e aggiunge 'weight' punti a quel controllo. I punti scendono di 'decay' ogni minuto.
3. AVVISO. Solo quando i punti di quel controllo raggiungono la sua
'alert-threshold' lo staff riceve un messaggio in chat. Un momento strano - un picco di lag, un blocco buggato - non arriva mai qui.
4. SETBACK. Per i controlli di movimento con 'setback: true', nello
stesso momento il giocatore viene riportato all'ultimo punto pulito in cui si trovava. Annulla il movimento impossibile e non è una punizione (vedi setbacks qui sotto).
5. PUNIZIONE. Solo con punishments.enabled: true (spento di default),
e solo con i punti dei controlli che hanno raggiunto la loro 'punish-threshold'. I controlli che servono solo a confermare (clic, mira, muri, ordine dei pacchetti...) hanno punish-threshold 0: da soli non puniscono mai nessuno.
Prima ancora del passo 1, un controllo non gira affatto finché è aperta una finestra di esenzione: teletrasporti (qualsiasi plugin), respawn, cambi di mondo, knockback e velocity dai plugin, esplosioni, pistoni, veicoli, elytra, riptide, lag del server, singhiozzi della connessione, blocchi rifiutati da un plugin di protezione, chunk che il client non ha ricevuto. Ogni finestra si allunga col ping del giocatore. Vedi exemptions.
Un falso positivo? fai così
1. Guarda cosa è stato misurato:
/shadowblocker violations <player> le prove più recenti
/shadowblocker evidence <number> una di queste per intero:
valore e limite, blocchi
intorno, effetti, ping
/shadowblocker player <player> i punti di ogni controllo
e le soglie di avviso2. Guardalo succedere di nuovo, dal vivo:
/shadowblocker debug <player> ogni sforamento, con
valore, limite e buffer
(stesso comando per
fermarlo; dalla console
finisce nel log)3. Fermalo mentre indaghi:
/shadowblocker exempt <player> 10m movement
sospende una famiglia (o 'all') per un
po', e si chiude da sola
/shadowblocker check <id> off un controllo, fino al riavvio
exemptions.disabled-worlds tutti i controlli, un mondo
disabled-worlds in checks.yml un controllo, un mondo
integrations.shadowregions.suspend una regione
integrations.shadowgames.suspend un'arena
/shadowblocker clear <player> azzera i suoi punti (le
prove restano)4. Risolvilo per sempre: alza 'buffer' o 'alert-threshold' di quel
controllo in checks.yml (non il limite), oppure imposta engine.sensitivity a relaxed.
5. Segnalacelo con il file delle prove: /shadowblocker export
<player> scrive tutte le prove in un solo file, che è esattamente quello che ci serve per riprodurlo.
La cosa più importante di tutto il file
Appena installato, ShadowBlocker NON PUNISCE NESSUNO. Rileva tutto, avvisa lo staff, scrive le prove, e si ferma lì.
Continua a leggere
Non è timidezza: è l'unica cosa onesta da fare. Un anticheat appena acceso non conosce ancora il tuo server - non sa che hai un plugin con il rampino, che la tua arena ha il doppio salto, che metà dei tuoi giocatori si collega da 250 ms di distanza. Un plugin che inizia a bannare prima di sapere queste cose banna le persone sbagliate, e un solo video di un falso positivo costa più di dieci vendite.
IL MODO GIUSTO:
1. installalo e lascialo stare per una settimana; 2. ogni tanto guarda /shadowblocker violations e chiediti se quello che vedi ha senso; 3. dove non ce l'ha, alza il buffer di quel controllo in checks.yml (il buffer conta molto più della soglia); 4. SOLO ALLORA imposta punishments.enabled a true.
Nel frattempo lo staff punisce a mano dai pulsanti negli avvisi, che funzionano dal primo minuto.
punishments3 chiavienabledfalsefalse = modalità osservazione. Vedi il paragrafo sopra.
jail-cell""La cella di ShadowEssentials usata dall'azione JAIL. Vuoto = la prima disponibile. Se non hai ShadowEssentials, l'azione JAIL non fa nulla e la console dice perché.
punishments.ladder4 chiaviLa scala: quando il punteggio arriva a tanto, fai questo.
Continua a leggere
Ogni gradino scatta UNA volta per sessione di gioco. L'ordine in cui li scrivi non conta: vengono ordinati per punteggio da soli.
Azioni disponibili:
alert solo un avviso allo staff log una riga in console, più visibile ticket apre un caso nel pannello di ShadowControl con le prove kick espelle dal server mute silenzia (richiede ShadowEssentials) jail manda in prigione (richiede ShadowEssentials) ban banna (richiede ShadowEssentials) command esegue un comando dalla console, con %player% e %reason%
I punteggi qui sotto sono PUNTI CHE CONTANO PER LE PUNIZIONI: solo i punti dei controlli che hanno raggiunto la loro punish-threshold in checks.yml. Con i valori predefiniti, 60 punti sono circa otto violazioni ravvicinate di un controllo di movimento; i controlli che confermano soltanto (clic, mira, muri, ordine dei pacchetti) non contano mai. Ogni minuto i punti scendono del 'decay' di ciascun controllo.
ATTENZIONE al ban permanente: qui non c'è, ed è voluto. Un ban dato in automatico deve poter essere annullato da un membro dello staff che si accorge dell'errore, e uno permanente dato di notte senza nessuno a guardare è il modo più rapido per perdere per sempre un giocatore onesto.
punishments.ladder.first2 chiaviscore60actionlogpunishments.ladder.second2 chiaviscore120actionticketpunishments.ladder.third3 chiaviscore200actionkickreason"Disallowed behaviour"punishments.ladder.fourth4 chiaviscore350actionbanduration"7d"reason"Disallowed behaviour detected"Il motore
engine5 chiavisensitivity"balanced"Quanto è severo l'intero plugin, in una parola:
Continua a leggere
relaxed ogni buffer e ogni soglia di avviso/punizione x1.5.
Più lento ad avvisare, ancora meno falsi positivi. Per
server con molti giocatori ad alto ping o Bedrock, o
con plugin che muovono i giocatori in modi insoliti.
balanced checks.yml esattamente come è scritto. Il predefinito.
strict x0.75: avvisa prima. Solo dopo una settimana di avvisi
che hai guardato e trovato corretti.Moltiplica i valori di checks.yml al caricamento, quindi puoi tenere lì le tue regolazioni e cambiare comunque preset.
decay-per-minute10.0Di quanti punti scende ogni minuto il punteggio di un giocatore, per i controlli che non impostano un loro 'decay' in checks.yml (tutti quelli inclusi lo fanno) e per le segnalazioni mandate da altri plugin.
Continua a leggere
Il punteggio deve scendere, altrimenti non descrive un giocatore: descrive la sua carriera. Chi gioca da due anni e ha raccolto quattro violazioni per altrettanti singhiozzi della rete finirebbe, in un giorno qualunque, sopra una soglia di ban - per colpa di quattro momenti sparsi in due anni. Il punteggio risponde a una domanda, e a quella giusta: QUESTA PERSONA STA BARANDO ADESSO?
Il calo è lineare e non esponenziale, apposta: "scende di dieci al minuto" si calcola a mente, e un parametro che nessuno sa prevedere è un parametro che nessuno regola.
Con 10 al minuto e i punteggi predefiniti, chi arriva a 120 punti torna pulito in dodici minuti. 0 = il punteggio non scende mai. Non farlo.
buffer-decay0.25Di quanto scende il buffer di un controllo quando un campione è a posto.
Continua a leggere
Il buffer è quante volte di fila un controllo deve sforare prima che conti davvero. Sale di 1 a ogni sforamento e scende di questo valore a ogni campione pulito.
DEVE essere minore di 1, e non deve essere 0. Se un solo tick pulito azzerasse il buffer, barare a intermittenza - mezzo secondo sì, mezzo secondo no - basterebbe per non superare mai nessuna soglia. È letteralmente così che sono costruiti i cheat "a impulsi".
snapshot-period-ticks1Ogni quanti tick viene fotografato il mondo attorno a un giocatore.
Continua a leggere
1 = ogni tick, ed è quello che serve per misurare bene. La fotografia viene scattata SOLO per i giocatori che si sono mossi dall'ultima volta: chi sta fermo in una base costa un confronto e niente di più.
Alzarlo a 2 dimezza il costo e rende le misure meno precise: le esenzioni per teletrasporti e knockback arrivano un tick dopo, quindi qualche falso positivo in più. Toccalo solo se hai misurato un problema, non "per sicurezza".
engine.packets1 chiaveenabledtrueLeggi i pacchetti dove arrivano, invece che dove il server li usa.
Continua a leggere
È la differenza tra un anticheat che misura il tempo del giocatore e uno che misura quanto stava faticando il server. Serve per:
- i controlli sui pacchetti (ordine, frequenza, campi); - la misura precisa di quanto è durato uno scavo; - non costare al server nessun tick.
Se lo spegni, il movimento viene letto dagli eventi del gioco: costa di più, misura peggio, e i controlli sui pacchetti restano spenti. Il plugin te lo dice in console.
Si spegne da solo, dicendolo, su un server dove non riesce ad agganciarsi: non è un errore da segnalare, è un server diverso.
Avvisi allo staff
alerts3 chiavicooldown"3s"Quanto aspettare prima di ripetere l'avviso dello stesso controllo per lo stesso giocatore.
Un cheat produce violazioni a raffica: senza un freno, un avviso per ognuna riempie la chat di ogni membro dello staff e gli fa spegnere gli avvisi per sempre - il che rende il plugin inutile proprio quando sta funzionando. Nel frattempo il punteggio continua a salire in silenzio.
to-consoletrueScrivi gli avvisi anche in console.
La console è l'unico membro dello staff che c'è sempre, ed è quello che legge chi apre i log il giorno dopo. Se hai centinaia di violazioni al giorno e i log stanno diventando pesanti, spegnilo: le prove restano comunque nel registro.
log-quiet-violationstrueScrivi in console anche una riga "[flag]" per le violazioni che NON hanno ancora raggiunto l'alert-threshold del loro controllo (in chat non le vede nessuno). È il modo per vedere cosa pensa il plugin senza disturbare lo staff, ed è quello da leggere quando fai le regolazioni. Spegnilo se la tua console è già affollata.
Setback
Per i controlli di movimento con 'setback: true' in checks.yml (fly, speed, jump, climb, phase): quando una violazione raggiunge l'alert-threshold del controllo, il giocatore viene riportato all'ultimo punto in cui stava su terreno vero, fuori dai blocchi, senza violazioni di movimento nell'ultimo secondo.
Continua a leggere
È la risposta più economica quando sbagliamo: un giocatore onesto si ritrova qualche blocco indietro e continua a giocare. Chi bara perde quello che il cheat gli aveva dato. NON è una punizione e funziona anche in modalità osservazione.
setbacks4 chiavienabledtruefalse = non spostare mai nessuno; gli avvisi arrivano comunque.
max-distance48.0Un punto più lontano di così (in blocchi) non è più una correzione, sarebbe un teletrasporto: non si fa niente.
max-age"30s"Un punto più vecchio di così non è più valido: non si fa niente.
cooldown"1s"Al massimo un setback per giocatore in questo intervallo. Il teletrasporto apre comunque una sua finestra di esenzione.
Il registro delle prove
Ogni violazione viene salvata con attorno tutto ciò che serviva per giudicarla: posizione, velocità, blocchi intorno, cosa aveva in mano, effetti, ping, esenzioni aperte. È questo che permette a un membro dello staff di DECIDERE invece di fidarsi.
evidence3 chiavimemory-cap500Quante prove tenere in memoria, pronte per /shadowblocker violations.
Nella versione gratuita il limite reale è 50 e questo valore non conta. Con una licenza le prove vanno anche nel database, e questo numero è solo la finestra veloce.
keep-for"30d"Per quanto tempo tenere le prove nel database.
Un mese basta per rispondere a "gliel'avevamo già detto?", che è la domanda che rende utile uno storico. Oltre è solo peso. Zero = per sempre.
write-filestrueScrivi anche un file di testo per ogni violazione grave, dentro evidence/, organizzato per giorno.
Serve da allegare a un ricorso, e per farlo leggere al pannello senza che il pannello debba sapere nulla del nostro database.
I casi
Questa è la funzione per cui esiste questo plugin: una violazione grave diventa, da sola, qualcosa che qualcuno deve guardare, con le prove allegate e un riassunto in parole leggibili.
requests3 chiaviscore120Da quale punteggio in su viene aperto un caso.
0 = mai. Alzalo se il tuo staff riceve troppi casi: tre veri al giorno sono meglio di trenta di cui nessuno ne guarda nemmeno uno.
cooldown"5m"Al massimo un caso per giocatore ogni quanto tempo.
Serve a tenere leggibile la lista dello staff: venti casi per la stessa persona annullano il valore della funzione.
ai-summarytrueChiedi all'assistente di ShadowControl un riassunto di due righe.
Doppiamente facoltativo: serve ShadowControl con l'assistente configurato, e serve la nostra licenza. Il riassunto che scriviamo noi arriva SEMPRE, e arriva subito; questo viene aggiunto dopo, quando torna. Il caso non aspetta mai una chiamata verso internet.
Le esenzioni
Il paragrafo più importante dopo quello sulle punizioni.
Continua a leggere
Latenza e teletrasporti sono la causa numero uno di falsi positivi in ogni anticheat mai scritto. Ognuna di queste finestre sospende i controlli per un momento dopo un evento che rende impossibile misurare qualcosa di sensato.
I valori predefiniti sono GENEROSI apposta. Abbassarli non ti fa beccare più cheater - chi bara lo fa tutta la sera, non per i due secondi dopo un teletrasporto - ti fa solo beccare più innocenti.
Per scoprire se una finestra resta aperta troppo a lungo su qualcuno:
/shadowblocker exempt <player>
exemptions7 chiavilag-tps18.0Sotto quanti tick al secondo (media di un minuto) il server viene considerato in difficoltà: i controlli di movimento, combattimento e pacchetti vengono sospesi per tutti finché dura.
Quando i tick durano il doppio, ogni misura basata sul tempo raddoppia. 18 vuol dire "più lento del 10%". Abbassalo (15-16) solo se il tuo server vive stabilmente intorno a 18-19 TPS e vuoi comunque il rilevamento anche lì.
lag-spike"200ms"Un singolo tick del server più lungo di questo apre la finestra di lag per tutti insieme. La media di un minuto qui sopra non si accorge di un freeze di un secondo (un salvataggio del mondo, una garbage collection, un chunk in generazione); questo sì. Un tick normale dura 50ms. 0 = spento.
connection-gap"300ms"Un silenzio della connessione di un giocatore più lungo di questo, seguito da una raffica di tutto ciò che era in coda, apre la finestra "connection" per quel giocatore (controlli di movimento, combattimento e pacchetti). Un client in gioco manda un pacchetto ogni 50ms, sempre. 0 = spento.
ping-extension1.0Ogni finestra qui sotto viene allungata del ping del giocatore (il più alto degli ultimi secondi) moltiplicato per questo valore. Una finestra di due secondi è generosa a 50ms e stretta a 900ms: è questo che la rende giusta per tutti. 0 = spento.
max-ping-extension"2s"Il massimo di cui il ping può allungare una finestra.
disabled-worlds[ ]Mondi in cui NON gira proprio nessun controllo (mondi in creative per costruire, lobby con plugin di parkour...). Per spegnere un controllo in un mondo usa disabled-worlds dentro quel controllo in checks.yml.
exemptions.windows20 chiavijoin"6s"Appena entrato: il client sta caricando i chunk e manda posizioni incoerenti.
teleport"3s"LA CAUSA NUMERO UNO. Tra il momento in cui il server sposta qualcuno e il momento in cui il client lo conferma, arrivano movimenti che partono dal punto vecchio: da fermi sembrano volo, di corsa sembrano duecento blocchi al secondo.
world-change"6s"Come un teletrasporto, più il caricamento dei chunk.
portal"6s"respawn"4s"velocity"2s"Il server ha inviato una velocità al client: knockback, una freccia, una carica di vento, la pedana a molla di un plugin. Per qualche tick il giocatore si muove più veloce di qualsiasi formula, e non c'entra niente con quello che ha premuto.
explosion"3s"piston"2s"vehicle"2500ms"Salito o sceso da un veicolo: la fisica cambia a metà movimento.
gliding"2500ms"riptide"4s"bounce"2s"gamemode"3s"flight"3s"effect"1500ms"Un effetto che cambia il movimento è appena arrivato o appena finito.
lag"4s"Il server ha faticato. Questa vale per tutti contemporaneamente.
chunk"3s"Un chunk non ancora caricato sotto i piedi.
plugin"2s"Un altro plugin ha spostato o modificato il giocatore. È anche la finestra usata dall'API pubblica quando un minigioco chiede di sospendere i controlli.
connection"3s"La connessione del giocatore si è fermata e poi ha consegnato tutto insieme (vedi connection-gap qui sopra). Il silenzio stesso viene aggiunto a questa finestra.
ghost-block"1500ms"Un altro plugin (una protezione, un'arena) ha annullato il piazzamento o la rottura di un blocco: per un momento il client vede un blocco che il server non ha, o il contrario.
Giocatori bedrock (Geyser / Floodgate)
Un giocatore Bedrock non usa il client Java: il bridge traduce i suoi movimenti, colpi e scavi in pacchetti Java, e la traduzione non segue la fisica e i tempi del client Java. I controlli scritti per Java lo segnalerebbero solo perché gioca da un telefono.
bedrock4 chiavidetecttrueRiconosci i giocatori Bedrock: con l'API di Floodgate o di Geyser se sono installati, altrimenti dal nome del client. false = tratta tutti come Java.
detect-by-uuidtrueRiconoscili anche dall'UUID di Floodgate (prima metà tutta a zeri). Lascialo acceso, a meno che tu non usi uno schema di UUID tuo.
exempt-families[movement, combat, packet]Le famiglie di controlli che NON girano sui giocatori Bedrock. Famiglie: movement, combat, interaction, packet
exempt-checks[fastbreak, visibility]Singoli controlli che non girano neanche su di loro (delle altre famiglie). Tempi di scavo e linea di vista vengono tradotti dai bridge in modo troppo approssimativo per poterli giudicare.
Le integrazioni
Tutte facoltative. Il plugin parte e protegge un server dove non è installato nient'altro della suite; quando un pezzo si spegne perché manca un altro plugin, la console dice quale e cosa si è spento con lui.
integrations4 chiaviintegrations.shadowcontrol2 chiavireportstrueScrivi requests.yml, che il pannello legge.
report-every"1m"integrations.shadowgames1 chiavesuspend[ ]Sospendi certi controlli dentro le arene.
Un minigioco con doppio salto, rampini o pedane di lancio non ha niente a che fare con la fisica di Minecraft, e insistere lì dentro segnala proprio le persone che si stanno divertendo.
Si scrive: "game:arena = family,family"
oppure: "game:* = family" per ogni arena di un gioco
Famiglie: movement, combat, interaction, packet
Esempi (commentati: attivali se hai quei giochi):
suspend: - "bedwars:* = movement" - "parkour:* = movement,packet" - "skywars:arena3 = movement"
integrations.shadowregions1 chiavesuspend[ ]Come sopra, ma per regione. Serve per gli eventi costruiti, dove un membro dello staff spara la gente in aria per divertimento.
Si scrive: "regionname = family,family"
suspend: - "event_arena = movement,combat"
integrations.other-anticheat2 chiaviraise-buffersfalseCosa fare se il server ha già un altro anticheat.
Continua a leggere
Due anticheat insieme non proteggono di più: si intralciano a vicenda. Ognuno corregge il movimento a modo suo e l'altro legge quelle correzioni come se fossero del giocatore, e il risultato sono falsi positivi da entrambe le parti - con la colpa che sembra sempre ricadere sul più nuovo.
La cosa giusta è tenerne uno solo. Se stai migrando e ne hai due per una settimana, imposta questo a true: alza i buffer di ogni controllo, il rilevamento diventa più lento e i falsi positivi molti di meno.
extra-buffer6Dove finiscono le prove
Di serie: un file H2 dentro la cartella del plugin. Niente da installare, nessun utente da creare, nessuna password.
Il database serve SOLO per l'archivio: il rilevamento, il punteggio, gli avvisi e le ultime prove in memoria funzionano tutti senza. Se non si riesce ad aprirlo, il plugin parte comunque - un anticheat che non parte è un server non protetto.
storage5 chiavitable-prefix"sb_"Il prefisso delle tabelle. Cambialo se più plugin condividono lo stesso database.
storage.mysql7 chiavienabledfalseIl MySQL condiviso fa parte della versione Premium.
Serve su un network: senza, il punteggio e le prove ripartono da zero a ogni cambio di server, che è anche il primo trucco che impara chi bara su un network.
host"127.0.0.1"port3306database"shadowblocker"username"root"password""parameters"useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8"storagefallback-to-localtrueSe MySQL non risponde, ripiega sul file locale invece di non partire. Lascialo a true: le prove contano, ma non quanto avere un server protetto.
storage.h21 chiaveauto-serverfalsePermette a un altro processo di aprire lo stesso file H2. Serve solo se vuoi guardare il database mentre il server è acceso.
storage.pool5 chiavimaximum-pool-size4Piccolo apposta: qui non vengono fatte query dentro il gioco. Le prove vengono scritte in modo asincrono e lette quando un membro dello staff apre una lista.
minimum-idle1connection-timeout-ms10000idle-timeout-ms600000max-lifetime-ms1800000Licenza
ShadowBlocker è un unico jar con dentro due versioni.
Continua a leggere
Senza chiave gira la versione GRATUITA, e quella gratuita ha TUTTO IL RILEVAMENTO: ogni controllo su movimento, combattimento, interazione e pacchetti, il punteggio, le soglie regolabili, la spiegazione di ogni violazione, la modalità osservazione, gli avvisi, le esenzioni, entrambe le lingue. Nessun controllo sta dietro un pagamento, e non è generosità: un anticheat che protegge metà dei giocatori ha un buco, e il buco lo trova per primo chi bara.
Quello che paghi è tutto ciò che sta ATTORNO al rilevamento:
- le punizioni automatiche (la gratuita avvisa, lo staff decide); - il registro delle prove nel database, consultabile e senza scadenza; - i casi su ShadowControl con il riassunto dell'assistente; - la sospensione per arena e per regione; - il MySQL condiviso su un network; - l'esportazione delle prove per un ricorso.
Il plugin non si spegne MAI per un problema di licenza. Il caso peggiore è tornare alla gratuita, scrivendo in console il perché. In un anticheat questo conta doppio: spegnersi vorrebbe dire lasciare il server senza protezione proprio quando nessuno se ne accorge.
Di solito qui non c'è niente da toccare: la chiave si attiva in gioco con
/shadowblocker license claim <purchase-code> /shadowblocker license activate <key>
e viene scritta in license.yml, che sta fuori da questo file apposta: una config si manda al supporto, una licenza no.
license4 chiaviLA CHIAVE VIVE IN license.yml (stessa cartella di questo file), oppure nel file centrale plugins/ShadowControl/licenses.yml per tutta la suite. La 'key' qui sotto è solo un ripiego per i sistemi di deploy che generano config.yml: lasciala vuota.
La chiave NON sta qui: sta in license.yml, in questa cartella, scritta al primo avvio (o in plugins/ShadowControl/licenses.yml per tutta la suite). Solo se preferisci tenerla qui invece che in license.yml. Funzionano anche la variabile d'ambiente SHADOWBLOCKER_LICENSE e la proprietà di sistema -Dshadowblocker.license=...
grace-days7Giorni di tolleranza prima di tornare alla gratuita quando un abbonamento scade o quando l'indirizzo del server non corrisponde alla licenza. Un rinnovo è quasi sempre già partito, e un indirizzo che non corrisponde è molto più spesso un NAT che un ladro.
server-ip""L'indirizzo con cui è conosciuto questo server, se lo sai. Dietro un proxy una macchina non vede mai il proprio dominio.
resolve-public-iptrueUna sola chiamata, all'avvio, al servizio licenze (activation-url + /ip) per scoprire quale indirizzo pubblico ha questo server: dietro NAT è l'unico modo per riconoscerlo. Il servizio risponde con l'indirizzo che vede, e del server non viene inviato niente. Solo con una licenza installata: un server senza chiave non chiede niente a nessuno. false = non chiedere mai.
activation-url'https://shadow-licences.riccardobotins.workers.dev'Servizio di attivazione. Questo è l'indirizzo BASE: il plugin aggiunge /claim e /check da solo. Vuoto = verifica completamente offline.
Messaggi e interfaccia
messages3 chiavidefault-locale"en_US"La lingua usata quando quella del giocatore non c'è. Il plugin include en_US e it_IT; viene caricato anche un file che aggiungi in lang/.
Tutto quello che legge una persona passa da lang/*.yml. Tutto il resto - nomi dei comandi, le chiavi di questo file, le unità scritte nel database, la console - è in inglese ovunque e non cambia con questa impostazione.
follow-client-localetrueSegui la lingua impostata nel client di ogni giocatore.
auto-updatetruePorta lang/*.yml alla nuova versione quando il plugin viene aggiornato: arrivano i nuovi testi, i testi che hai cambiato restano tuoi, e il file precedente viene conservato in backup/<date>/. Con false i file in lang/ non vengono mai riscritti, e un testo che manca viene letto dalla copia dentro il jar.
Continua a leggere
Vale SOLO per le lingue. config.yml, checks.yml e menus/ vengono sempre portati alla nuova versione allo stesso modo: quello che hai cambiato viene riportato, e quello che non si può riportare viene elencato in PORTING-<version>.txt.
gui1 chiaveclick-delay"150ms"Quanto aspettare tra due clic nella stessa finestra. Serve contro i doppi clic accidentali, non contro i cheat.
compatibility1 chiavesection-color-codestrueAccetta nei colori il carattere di sezione oltre alla e commerciale. Utile se incolli testi che arrivano da un plugin più vecchio.
Diagnostica
logging1 chiavelog-sqlfalseScrivi in console ogni istruzione SQL. Utile per un pomeriggio, poi rispegnilo.
metrics1 chiaveenabledtruebStats: quanti server usano questo plugin e su quale versione sono.
Continua a leggere
Non esce nessun dato di nessun giocatore: nessun nome, nessun UUID, nessun indirizzo, nessuna coordinata, nessuna violazione. Cosa viene inviato, ogni 30 minuti: un id casuale del server (serverUuid, non derivato da nulla), la versione del plugin, le versioni di Minecraft/Paper e di Java, il sistema operativo e il numero di core, la modalità online, quanti giocatori sono online (solo un numero) e un grafico, il livello di licenza (free/premium/creator). Non viene inviato niente mentre il plugin aspetta una licenza.
Serve a una sola domanda: quale versione di Minecraft può smettere di essere supportata. Senza quel numero la risposta è un'opinione.
false spegne solo questo plugin. enabled: false in plugins/bStats/config.yml spegne in un colpo solo tutti i plugin con bStats su questo server.
checks.yml
I controlli anti-cheat 211 impostazioni
checks.ymlplugins/ShadowBlocker/checks.yml Note del file
Un controllo per sezione. Ognuno si accende, si spegne e si regola per conto suo, e ognuno ha scritto sopra COSA RILEVA e COSA PUÒ PRODURRE UN FALSO POSITIVO. Sono le stesse due frasi che vedi in gioco con /shadowblocker check <name> e nella schermata dei controlli: una sola fonte, scritta accanto al codice che descrive.
Le chiavi che hanno tutti
enabled se il controllo gira.
Continua a leggere
weight quanti punti aggiunge UNA violazione a questo
controllo (e al punteggio del giocatore).buffer QUANTE VOLTE DI FILA il controllo deve superare
il suo limite prima che conti come violazione.alert-threshold quanti punti di QUESTO controllo servono perché
lo staff riceva un avviso. Sotto, la violazione
viene solo scritta nel registro delle prove (e, se
alerts.log-quiet-violations è acceso, una riga in
console): nessuno viene disturbato per un momento
strano. Con weight 8 e alert-threshold 16 servono
due violazioni ravvicinate.punish-threshold da quanti punti di QUESTO controllo in su i suoi
punti contano per le punizioni AUTOMATICHE (la
scala in config.yml, spenta di default).
0 = MAI. I controlli che servono solo a confermare
(ritmo dei clic, ordine dei pacchetti, muri, mira...)
sono a 0: da soli non puniscono mai nessuno.decay quanti punti perde questo controllo al minuto.
Una violazione di fly (8 punti) viene dimenticata
in un minuto a 8 al minuto.setback (solo controlli di movimento) quando si raggiunge
la soglia di avviso, riporta il giocatore
all'ultimo punto pulito in cui si trovava. Non è
una punizione: il movimento impossibile viene
semplicemente annullato. Vedi setbacks in config.yml.La "sensitivity" globale in config.yml (relaxed / balanced / strict) moltiplica ogni buffer e ogni soglia in una volta, quindi raramente ti serve toccare questi numeri uno per uno.
Il buffer è il parametro che conta, e quasi nessuno lo guarda
Se hai un falso positivo, nove volte su dieci la risposta è ALZA IL BUFFER (o l'alert-threshold), non alzare il limite.
Continua a leggere
Il limite dice "cosa è impossibile". Il buffer dice "quante volte deve succedere l'impossibile prima che ci crediamo". Alzare il limite rende il controllo cieco anche ai cheat veri; alzare il buffer lo rende solo più lento, e chi bara continua a farlo per molti tick di fila.
Il buffer scende di engine.buffer-decay (0.25) a ogni campione pulito e sale di 1 a ogni sforamento: chi bara a intermittenza accumula comunque.
Per vedere cosa vede un controllo, dal vivo, mentre un giocatore fa qualcosa:
/shadowblocker debug <player>
Ogni sforamento viene stampato con il valore misurato, il limite e il buffer - prima che diventi una violazione.
disabled-worlds
La lista dei mondi in cui quel controllo non gira. Serve per il mondo di build, per il mondo dei minigiochi, per quello in cui un plugin muove le persone a modo suo. Meglio che spegnere un controllo ovunque per colpa di un solo mondo. (Per spegnere OGNI controllo in un mondo, usa exemptions.disabled-worlds in config.yml.)
config-version1All'aggiornamento questo file viene portato alla nuova versione in automatico: ogni soglia che hai regolato viene riportata, i nuovi controlli arrivano con i loro commenti, il vecchio file viene conservato in backup/<date>/, e tutto ciò che richiede la tua attenzione viene elencato in PORTING-<version>.txt.
checks19 chiaviMovimento
Ogni controllo di movimento misura i tick del CLIENT stesso (il client chiude ogni tick con un pacchetto dalla 1.21.2), ignora i movimenti che arrivano tra un teletrasporto e la conferma del client (qualsiasi teletrasporto: /tp, /rtp, ascensori, portali, plugin), apre una finestra quando il server spinge il giocatore (knockback, esplosioni, cariche di vento, pedane di lancio, velocity impostata dai plugin) e legge gli attributi REALI del giocatore (gravità, forza del salto, velocità di movimento, altezza del passo, distanza di caduta sicura, scala) invece delle costanti vanilla. I controlli verticali giudicano un movimento solo quando la fotografia del mondo descrive esattamente il punto da cui parte.
checks.fly14 chiaviRILEVA: il movimento verso l'alto di ogni tick confrontato con quello che permette la gravità del gioco, e i giocatori che restano sospesi a mezz'aria senza salire né scendere. La formula è quella vera del gioco, con gli attributi di gravità e di resistenza dell'aria del giocatore: next_dy = (current_dy - gravity) * drag
Continua a leggere
FALSI POSITIVI: tutto ciò che cambia la fisica - acqua, scale a
pioli, ragnatele, slime, miele (anche sui lati), neve polverosa, colonne di bolle, impalcature, elytra, riptide, levitazione, caduta lenta, veicoli, pistoni, cariche di vento, knockback, teletrasporti, chunk che il client non ha ancora ricevuto. Sono TUTTI già esclusi. Restano i plugin che muovono i giocatori a modo loro senza un teletrasporto o una velocity (rampini, ascensori): se ne hai uno, alza 'tolerance' oppure spegni il controllo nei mondi dove gira.
enabledtrueweight8buffer4disabled-worlds[ ]alert-threshold16punish-threshold4040 = cinque violazioni ravvicinate prima che possa contare per una punizione automatica: volare non è mai una cosa da un tick.
decay8setbacktruetolerance0.03Quanto è permesso oltre la previsione, in blocchi per tick. 0.03 è un decimo della differenza tra un salto e un volo lento.
ping-allowance-per-100ms0.01Di quanto allargare la tolleranza ogni 100 ms di latenza, e il tetto massimo.
max-ping-allowance0.06jump-grace-ticks2Per quanti tick dopo aver lasciato il terreno la spinta di un salto (0.42 blocchi, o la forza di salto del giocatore) è comunque permessa.
Continua a leggere
Serve perché la fotografia del mondo è indietro di un tick: c'è un istante in cui vediamo "non più a terra" mentre il movimento precedente era ancora zero, e senza questo margine OGNI SALTO di OGNI GIOCATORE sarebbe una violazione.
NON alzarlo. Ogni tick in più è un tick in cui un volo che sale di 0.42 è indistinguibile da un salto: a 20 diventerebbe invisibile.
hover-tolerance0.005Sotto quanto movimento verticale conta come "fermo in aria".
hover-ticks14Per quanti tick di fila. A mezz'aria è impossibile per costruzione: anche alla velocità terminale scendi di 3.92 per tick.
checks.speed17 chiaviRILEVA: la velocità orizzontale MEDIA su una finestra breve, e a parte gli spostamenti istantanei che non hanno spiegazione. Si guarda la media perché un singolo tick veloce è normale (il tick di uno sprint-jump sposta di 0.6 blocchi), mentre un cheat di velocità resta acceso. Il limite viene moltiplicato per l'attributo movement_speed REALE del giocatore (che contiene già Velocità, Velocità delle anime e tutto ciò che ha aggiunto un plugin), per 'ice-multiplier' su ghiaccio, slime o terreno scivoloso (e per 2 secondi dopo averli lasciati), e per Passo delle profondità in acqua.
Continua a leggere
FALSI POSITIVI: i plugin che spingono i giocatori senza una velocity o
un teletrasporto (rampini, scatti fatti muovendo direttamente il giocatore) e le cavalcature custom. Effetti e attributi di Velocità, ghiaccio, slime, delfini, knockback, teletrasporti, elytra, riptide, cavalli e barche sono già considerati. Se un plugin dà velocità in qualche altro modo, alza 'base' invece di spegnere il controllo: spento non vede nemmeno chi si muove a dieci blocchi per tick.
enabledtrueweight6buffer5disabled-worlds[ ]alert-threshold18punish-threshold36decay8setbacktruebase0.45La MEDIA massima onesta su terreno normale, in blocchi per tick. Camminata 0.215 - scatto 0.28 - lo sprint-jump su terreno piano fa in media 0.365, e il caso onesto peggiore è lo sprint-jump sotto un soffitto alto 2.5 blocchi (il salto viene accorciato e la spinta dello scatto arriva ogni sei tick): 0.42. Simulato con il codice di movimento del gioco stesso, quello della 26.2. 0.45 resta sopra apposta. Valori sotto 0.43 segnalano i giocatori onesti che fanno sprint-jump nei tunnel bassi.
speed-effect-per-level0.20Quanto aggiunge ogni livello di Velocità, come frazione. Si usa solo quando l'attributo movement_speed non si può leggere: l'attributo include già l'effetto.
ice-multiplier2.6Ghiaccio, slime e terreno scivoloso (attributo di attrito) sono il caso peggiore di tutti: sul ghiaccio blu lo sprint-jump arriva vicino a 0.48 per tick. 2.6 è generoso apposta; copre anche lo slancio che resta per due secondi dopo aver lasciato il ghiaccio.
depth-strider-per-level0.15soul-speed-multiplier1.30ping-allowance-per-100ms0.02max-ping-allowance0.10instant-multiplier5.0Quante volte oltre la soglia deve essere un singolo tick per essere segnalato subito, senza aspettare la media. Serve per i salti nello spazio, non per la velocità.
min-samples10Quanti campioni servono prima che una media significhi qualcosa.
checks.jump11 chiaviRILEVA: quanto è salito qualcuno dall'ultima ripartenza della fisica normale (il terreno, o il momento in cui ha lasciato l'acqua, una scala a pioli, una colonna di bolle, un volo in elytra...). Vede i cheat che rispettano la gravità tick per tick ma la fanno ripartire: doppio salto, salto alto, rimbalzo a mezz'aria. Un salto senza effetti sale di 1.2522 blocchi; l'altezza consentita usa forza di salto e gravità del giocatore, e la velocità verso l'alto che aveva alla ripartenza.
Continua a leggere
FALSI POSITIVI: slime, letti, colonne di bolle, cariche di vento,
pistoni, cavalli, knockback e teletrasporti sono già esclusi. Un plugin che applica una spinta verso l'alto SENZA passare dall'API di velocità di Bukkit no: in quel caso spegni il controllo in quel mondo, oppure alza 'tolerance' finché non copre la spinta più alta che dà quel plugin.
enabledtrueweight8buffer3disabled-worlds[ ]alert-threshold16punish-threshold40decay8setbacktruebase-height1.35L'altezza massima di un salto senza effetti, con un piccolo margine. Lo stesso margine (base-height meno 1.2522) viene aggiunto sopra l'altezza calcolata dalla forza di salto e dalla gravità reali del giocatore.
per-jump-level0.80Quanto aggiunge ogni livello di Jump Boost.
tolerance0.10checks.climb10 chiaviRILEVA: chi continua a salire contro un muro molto dopo la fine della salita di un salto, senza scale a pioli o rampicanti da nessuna parte. È il cheat conosciuto in giro come "spider".
Continua a leggere
FALSI POSITIVI: un blocco scalabile inventato da un plugin, che
Minecraft non considera scalabile. Le vere scale a pioli, i rampicanti, le impalcature e la neve polverosa sono già esclusi, e un salto sotto l'effetto Salto potenziato (o con un attributo di salto più forte) riceve i tick di salita in più che ha davvero. Se hai blocchi del genere, spegni il controllo in quel mondo.
enabledtrueweight7buffer6disabled-worlds[ ]alert-threshold21punish-threshold42decay8setbacktrueair-ticks8Da quanti tick in aria in su comincia a guardare, come minimo. La salita di un salto dura sei tick; con Salto potenziato o un salto più forte si usa il numero vero di tick di salita più due, quando è più alto.
min-rise0.02Sotto quanta salita non guarda.
checks.phase10 chiaviRILEVA: i giocatori la cui hitbox si sovrappone alla vera forma di collisione di un blocco solido per molti tick di fila MENTRE SI STANNO ANCORA MUOVENDO, che è il modo in cui si attraversa un muro.
Continua a leggere
FALSI POSITIVI: il controllo più delicato del plugin. Porte e botole
che si chiudono addosso a qualcuno, pistoni, blocchi piazzati sulla testa, chunk che il client non ha ancora ricevuto, blocchi rifiutati da un plugin di protezione, veicoli dentro i muri. Per questo servono MOLTI tick di fila E un movimento in corso: chi finisce lì dentro per caso sta fermo e viene spinto fuori subito. Camminare su sabbia delle anime, fango o terra coltivata NON è più un problema: il controllo confronta con la forma vera del blocco. Alzalo ancora e non vedrai nessuno; abbassalo e vedrai tutti.
enabledtrueweight5buffer8disabled-worlds[ ]alert-threshold15punish-threshold00 = mai da solo: serve a confermare gli altri controlli.
decay10setbacktrueQui la risposta giusta è riportare il giocatore fuori dal muro.
ticks12Quanti tick dentro il blocco prima di dire qualcosa.
min-movement0.02Sotto quanto movimento conta come "incastrato" invece che "sta attraversando". Da un incastro vieni tirato fuori, non lo attraversi camminando.
checks.nofall10 chiaviRILEVA: il flag "sono a terra" mandato dal client, confrontato con quello che il server vede in quel punto esatto (blocchi, o entità su cui si può stare in piedi come barche e shulker) dopo una caduta che misuriamo noi. In Minecraft il danno da caduta lo calcola il CLIENT: un client modificato che tiene quel flag sempre a true non prende mai danno.
Continua a leggere
FALSI POSITIVI: un blocco che il client vede ma che il server ha
rifiutato (un piazzamento annullato da un plugin di protezione apre una breve finestra), chunk che il client non ha ancora ricevuto, e i plugin che azzerano la caduta a modo loro (ascensori, piume, paracadute). La dichiarazione viene verificata con la fotografia del mondo scattata DOPO l'atterraggio, mai con quella del tick prima.
NOTA: questo controllo funziona solo con il livello dei pacchetti acceso. Senza, il flag del client non ci arriva mai e il controllo non ha niente da confrontare.
enabledtrueweight10buffer4disabled-worlds[ ]alert-threshold20punish-threshold50decay6setbackfalseQui un setback non annullerebbe niente di utile: la caduta è finita.
min-fall-distance3.0Da quanti blocchi di caduta in su. Sotto i tre il danno è comunque zero, quindi non c'è niente da guadagnare a mentire. Si usa l'attributo safe_fall_distance del giocatore quando è più alto.
margin1.0Blocchi in più oltre a quel valore, per gli arrotondamenti della caduta che misuriamo noi.
Combattimento
Rileva: la distanza tra l'occhio di chi attacca e la
HITBOX. La portata è l'attributo entity_interaction_range del
giocatore (3.0), o la portata propria dell'arma (le lance arrivano a 4.5). La latenza viene compensata guardando dove si trovava DAVVERO un bersaglio giocatore dentro la finestra del ping di chi attacca, più l'interpolazione del client, prendendo la posizione più favorevole all'accusato; per i mob, in base a quanto velocemente si muovevano.
Continua a leggere
FALSI POSITIVI: la latenza, già compensata (il ping usato è il più
alto degli ultimi secondi, non la media). Se uno dei due è in sella c'è un margine in più; l'ender dragon non viene misurato. Restano i plugin che teletrasportano durante un combattimento. Se devi proprio cambiare qualcosa, alza 'tolerance' di un decimo alla volta e guarda cosa smette di essere segnalato: se smette tutto, era troppo alta.
checks.reach15 chiavienabledtrueweight7buffer5disabled-worlds[ ]alert-threshold21punish-threshold42decay8max-distance3.0La portata del gioco in survival. Se l'attributo del giocatore o la portata dell'arma sono più lunghi, si usano quelli.
tolerance0.40Il margine fisso: copre l'allargamento delle hitbox e l'arrotondamento in virgola mobile.
ping-allowance-per-100ms0.15max-ping-allowance0.60compensation-window-ms1000Quanto indietro guardare, al massimo, nello storico delle posizioni del bersaglio. La finestra vera è il ping di chi attacca + interpolation-ms + un tick; questo è solo il tetto, così chi ha cinque secondi di latenza non riceve cinque secondi di posizioni tra cui scegliere la più comoda.
interpolation-ms150Quanto ci mette il client a mostrare un'entità nella sua nuova posizione (la fa scivolare nell'arco di qualche tick). Fa parte della finestra di compensazione.
max-velocity-compensation1.5Per i mob (che non hanno uno storico delle posizioni): al massimo quanti blocchi del loro movimento durante il ritardo vengono dati come margine.
mounted-tolerance1.0Margine in più quando chi attacca o il bersaglio sta cavalcando qualcosa.
Rileva: tre cose. i clic al secondo (la meno utile), quanto
REGOLARI sono gli intervalli (la più utile), e quanti intervalli
sono esattamente identici. Contano solo i clic veri: i movimenti del braccio quando scavi e nelle azioni col tasto destro (piazzare blocchi, lanciare, usare attrezzi, nutrire animali) vengono riconosciuti ed esclusi.
Continua a leggere
FALSI POSITIVI: il drag click e il butterfly click superano i venti
clic al secondo SENZA nessun programma - per questo 'max-cps' è alto e conta poco. Un mouse con il doppio clic difettoso può generare coppie identiche: se un giocatore viene segnalato solo qui e mai da nessun'altra parte, guarda il suo mouse prima delle sue intenzioni. Questo controllo avvisa lo staff e da solo non punisce mai.
checks.clicks12 chiavienabledtrueweight5buffer4disabled-worlds[ ]alert-threshold15punish-threshold00 = mai da solo: il ritmo dei clic è l'indizio più debole che ci sia.
decay10max-cps30Il numero assurdo. Alto apposta: una soglia bassa qui becca i giocatori bravi (il drag click supera i 25), non i cheat.
window-seconds8Si analizzano solo i clic degli ultimi tot secondi (questo valore): un giudizio dato su un colpo guarda come clicca il giocatore ADESSO.
min-samples40Sotto quanti campioni non si dice mai niente. Su cinque clic sembra tutto regolare.
min-deviation-ms8.0La deviazione standard minima degli intervalli, in millisecondi. Una persona resta nelle decine di millisecondi anche alla massima velocità.
checks.angle9 chiaviRILEVA: l'angolo tra dove stava guardando e il punto PIÙ VICINO della hitbox del bersaglio al momento del colpo. Il client di Minecraft non ti lascia nemmeno provare a colpire qualcuno che non stai guardando: non è "improbabile", è qualcosa che un client normale non può mandare.
Continua a leggere
FALSI POSITIVI: la mischia stretta, dove un tick di ritardo vale
decine di gradi - sotto 'min-distance' non si guarda niente. I mob grandi colpiti su un angolo vanno bene (si usa il punto più vicino della hitbox), i bersagli non viventi e l'ender dragon vengono saltati. Restano i plugin che fanno danno per conto di un giocatore senza che abbia colpito nulla (trappole, abilità ad area, evocazioni).
enabledtrueweight9buffer3disabled-worlds[ ]alert-threshold18punish-threshold45decay8max-angle85.0Oltre quanti gradi. 85 è quasi di lato: un client onesto resta sempre sotto i venti.
min-distance1.2Sotto quanta distanza l'angolo non significa niente.
checks.wallhit8 chiaviRILEVA: un colpo andato a segno su qualcuno che aveva un blocco in mezzo da ogni punto di vista che proviamo.
Continua a leggere
FALSI POSITIVI: angoli, pilastri sottili e porte socchiuse, perché il raggio
viene tracciato adesso mentre il colpo è stato deciso un ping fa. I raggi vanno a più punti della hitbox del bersaglio (e, per i giocatori, a dove erano dentro la finestra del ping) sia con la forma di collisione sia con quella di contorno dei blocchi, così una mucca colpita oltre uno steccato o un mob visto attraverso una fessura vanno bene. Servono comunque più colpi di fila. Attenzione ai blocchi trasparenti che il gioco tratta come pieni.
enabledtrueweight6buffer6disabled-worlds[ ]alert-threshold18punish-threshold00 = mai da solo.
decay10min-distance1.0Rileva: due cose molto diverse
'snap' la testa che si gira di scatto nell'istante del colpo,
partendo da una testa che era ferma il tick prima. Una
mano mira nell'arco di diversi tick, accelerando e
frenando; un programma ci arriva in uno.
'pattern' il passo delle rotazioni. Un mouse vero produce SEMPRE
multipli dello stesso numero, perché conta passi interi.
Si misura che FRAZIONE delle rotazioni cade su quella
griglia: un mouse sta vicino a 1, un programma molto
sotto. È il segnale più forte che ci sia.Continua a leggere
FALSI POSITIVI:
snap: giocatori con sensibilità altissima che mirano con un colpo
di polso (per questo serve una testa ferma prima dello
scatto). Le rotazioni imposte dal server (teletrasporti,
plugin) vengono ignorate.
pattern: CHIUNQUE GIOCHI DA BEDROCK ATTRAVERSO UN BRIDGE, CON UN
CONTROLLER, O CON UNA MOD CHE AMMORBIDISCE LA TELECAMERA.
Stanno tutti fuori dalla griglia e verrebbero segnalati TUTTI.Per questo 'pattern' è SPENTO di default. Accendilo solo se sai che sul tuo server si entra da Java con un mouse e nient'altro.
checks.aim14 chiavienabledtrueweight6buffer5disabled-worlds[ ]alert-threshold18punish-threshold00 = mai da solo.
decay10snaptruesnap-window-ms120max-snap-degrees45.0snap-still-before-degrees5.0Nel tick PRIMA dello scatto la testa deve essersi girata al massimo di questo valore. Un colpo di polso umano si sta già muovendo il tick prima.
patternfalseLeggi il paragrafo sopra prima di toccare questo.
pattern-min-samples20Interazione
checks.fastbreak9 chiaviRILEVA: quanto è durato uno scavo rispetto al minimo che quel blocco richiede, tenendo conto di attrezzo, Efficienza, Rapidità, Affaticamento, acqua e del fatto che il giocatore fosse a mezz'aria (che divide la velocità per cinque, e quasi nessuno se lo ricorda). Lo scavo si misura due volte: in millisecondi E nei tick del client stesso, che la rete non può accorciare; devono essere troppo corti entrambi.
Continua a leggere
FALSI POSITIVI: un plugin che rompe blocchi per conto del giocatore
e i blocchi distrutti da un'esplosione (nessuno scavo visto: non si dice niente). Salti, acqua, Rapidità e Affaticamento che cambiano durante lo scavo vengono presi nel modo più favorevole al giocatore. Se hai attrezzi custom più veloci di quelli veri, abbassa 'max-speed-ratio'.
enabledtrueweight9buffer3disabled-worlds[ ]alert-threshold18punish-threshold45decay8max-speed-ratio0.65Sotto quale frazione del tempo minimo segnala. 0.65 = "ci ha messo meno di due terzi del minimo possibile". Nessuna connessione regala un terzo del tempo; un cheat lo azzera.
min-expected-ms150Sotto quale tempo previsto non guarda: i blocchi che si rompono quasi all'istante non hanno niente da misurare.
Rileva: quante rotture di blocchi arrivano dentro lo stesso tick del server
Il gioco ne permette UNO: per rompere il blocco successivo devi ricominciare.
Con il livello dei pacchetti acceso, gli scavi devono anche essere stati mandati dentro un unico tick del CLIENT, quindi il lag del server non conta mai.
Continua a leggere
FALSI POSITIVI: altri plugin (esplosioni, abilità ad area, tree
feller, WorldEdit usato per conto di un giocatore) non mandano pacchetti di scavo e quindi non vengono segnalati quando il livello dei pacchetti è acceso. Senza, alza 'max-per-tick' se hai plugin del genere.
checks.nuker8 chiavienabledtrueweight12buffer1disabled-worlds[ ]alert-threshold24punish-threshold48decay8max-per-tick3checks.interactreach12 chiaviRILEVA: la distanza tra l'occhio e il punto PIÙ VICINO del blocco su cui si è agito. La portata è l'attributo block_interaction_range del giocatore (4.5 in survival, 5 in creative) o il valore qui sotto, se è più lungo.
FALSI POSITIVI: il movimento di chi sta cliccando durante il ritardo
della connessione, già coperto dal margine. E i plugin che fanno rompere o piazzare blocchi a un giocatore da lontano.
enabledtrueweight6buffer4disabled-worlds[ ]alert-threshold18punish-threshold36decay8survival-distance4.5creative-distance6.0tolerance0.60Il margine fisso, in blocchi, oltre alla portata. La distanza si misura fino al punto più vicino del blocco (prima era il centro, con 0.9 di margine per compensare).
ping-allowance-per-100ms0.08max-ping-allowance0.35checks.visibility12 chiaviRILEVA: un blocco rotto o toccato dietro un muro, e un blocco su cui si è agito guardando dall'altra parte. Il gioco non permette a un client normale né l'una né l'altra cosa.
Continua a leggere
FALSI POSITIVI: angoli, porte, blocchi piazzati da altri nello stesso
istante e chunk che il client vede diversamente. I raggi vengono tracciati verso quindici punti del blocco sia con la forma di collisione sia con quella di contorno, e i blocchi senza collisione (erba, fiori, coltivazioni, pulsanti, leve) non vengono mai giudicati nel test del muro. Servono comunque più casi di fila. Attenzione ai blocchi trasparenti che il gioco tratta come pieni, e ai plugin che fanno agire un giocatore su blocchi che non sta guardando.
enabledtrueweight5buffer6disabled-worlds[ ]alert-threshold15punish-threshold00 = mai da solo.
decay10check-line-of-sighttruemin-distance1.5check-angletruemax-angle90.0angle-min-distance2.0checks.place11 chiaviRILEVA: un blocco piazzato contro il NIENTE, o piazzato senza guardarlo. Sono le due firme dello "scaffold" (il ponte costruito sotto i piedi mentre si cammina sul vuoto) e della "tower".
Continua a leggere
FALSI POSITIVI: i plugin che piazzano blocchi per conto di un
giocatore (rollback, rigenerazioni, strumenti di build): in quei casi non c'è una faccia cliccata e il controllo tace da solo. Restano i blocchi appoggiati a cose che non sono blocchi pieni: se li vedi segnalati, imposta 'require-support' a false e tieni solo il test dell'angolo.
enabledtrueweight7buffer4disabled-worlds[ ]alert-threshold21punish-threshold00 = mai da solo.
decay10require-supporttruecheck-angletruemax-angle100.0angle-min-distance1.5Pacchetti
ATTENZIONE: questi tre controlli hanno un peso BASSO e un buffer ALTO, e non è una svista. Un ritmo strano dei pacchetti, da solo, non è una prova.
Continua a leggere
Servono a CONFERMARE - a spiegare perché un giocatore che veniva segnalato altrove veniva segnalato altrove - non a decidere da soli. Alzare il loro peso è il modo più rapido per bannare qualcuno per colpa del suo wifi.
Funzionano solo con il livello dei pacchetti acceso (config.yml, engine.packets.enabled).
checks.rate10 chiaviRILEVA: un orologio del client accelerato ("timer"). Il client chiude
ogni tick con un pacchetto: ognuno aggiunge 50 ms a un saldo, ogni
millisecondo reale ne toglie uno. Un client onesto resta intorno a
zero; un timer a 25 tick al secondo guadagna 250 ms ogni secondo.
Una connessione che si ferma e poi consegna tutto insieme viene
perdonata dal saldo stesso: il silenzio diventa credito che la
raffica spende. Conta anche i flood di pacchetti di qualsiasi tipo.Continua a leggere
FALSI POSITIVI: pochissimi. /tick rate viene seguito in automatico.
I flood non vengono contati subito dopo un silenzio della connessione.
enabledtrueweight3buffer10disabled-worlds[ ]alert-threshold9punish-threshold00 = mai da solo: serve a confermare speed e fastbreak.
decay10max-ahead-ms500.0Di quanto l'orologio del client può andare avanti rispetto al tempo reale, in millisecondi, prima che conti. 500 = dieci tick: il normale jitter della rete sposta il saldo di uno o due.
max-lag-credit-ms2000.0Quanto credito può accumulare un silenzio della connessione, in millisecondi. È quello che perdona la raffica che segue un picco di lag. I silenzi più lunghi sono comunque coperti dalla finestra "connection" in config.yml; questo tetto impedisce solo a qualcuno di mettere da parte minuti di tick da spendere dopo.
max-total-per-second500.0checks.order9 chiaviRILEVA: sequenze di pacchetti che il client non produce. TCP non riordina niente, quindi due pacchetti arrivati in un certo ordine sono stati MANDATI in quell'ordine: non è un indizio, è un fatto. Cosa si guarda: azioni senza che giri il ciclo di gioco del client, interazioni molto dopo la morte, scavi che finiscono senza essere iniziati.
Continua a leggere
FALSI POSITIVI: pochi. Un attacco mandato un attimo prima di morire
arriva dopo la morte con il ping in mezzo: contano solo le interazioni ben dopo la morte. Restano i client alternativi che raggruppano le azioni in modo diverso (Bedrock tramite un bridge, escluso di default) e i plugin che mandano azioni per conto di un giocatore.
enabledtrueweight4buffer8disabled-worlds[ ]alert-threshold12punish-threshold00 = mai da solo.
decay10min-actions8Sotto quante azioni nella finestra non guarda: un giocatore appena entrato ha finestre mezze vuote per definizione.
dead-grace-ms1500Per quanto tempo dopo la morte un'interazione conta ancora come "mandata da vivo", in millisecondi; si aggiunge il doppio del ping del giocatore.
Rileva: valori dentro i pacchetti che il gioco non produce mai
Coordinate NaN o infinite, pitch fuori dall'intervallo -90/+90,
salti di posizione impossibili, posizioni fuori dal mondo. È il controllo con meno falsi positivi di tutto il plugin: qui non si stima niente e non si regola niente.
Continua a leggere
FALSI POSITIVI: nessuno noto. Se li vedi su un giocatore, prima di
pensare a un cheat considera un bridge tra versioni diverse o un proxy che riscrive i pacchetti: il risultato è lo stesso, ma la persona non c'entra niente.
checks.field9 chiavienabledtrueweight15buffer1disabled-worlds[ ]alert-threshold15punish-threshold30decay5max-jump-blocks100.0world-border-blocks30000000.0Lingue
I testi che il plugin mostra ai giocatori, un file per lingua.
lang/
Testi e messaggi 2 file
lang/plugins/ShadowBlocker/lang/ Note del file
Questo file contiene OGNI parola che legge una persona: messaggi in chat, titoli delle schermate, nomi degli item e le loro descrizioni. Nient'altro. I nomi dei comandi, le chiavi di configurazione, le unità scritte nel database e le righe della console sono in inglese ovunque e NON stanno qui - sono dati, e un dato che cambia nome con la lingua non è un dato.
I colori si scrivono con &: &a &c &l &r, e &#FF8800 per un colore esatto. L'unica eccezione sono i gradienti, che & non riesce a esprimere:
<gradient:#7E57C2:#4FC3F7>text</gradient>
I placeholder si scrivono <like-this>. Quello che incontrerai più spesso è <label>: viene riempito con il comando che il server ci ha DAVVERO concesso. Non scrivere mai "/sbl" a mano: se quel comando apparteneva già a un altro plugin, il nostro si chiama "/shadowblocker:shadowblocker", e un messaggio scritto fisso manderebbe un membro dello staff dritto nel comando di qualcun altro.
Un messaggio può essere una semplice stringa o una mappa:
key: text: "&cText" channel: ACTION_BAR # CHAT | ACTION_BAR | TITLE | SUBTITLE | NONE sound: block.note_block.bass cooldown: "2s" # per-player anti-spam
channel: NONE zittisce un messaggio senza cancellare la chiave. Una chiave che manca qui viene letta dalla copia di questa lingua dentro il jar del plugin, poi dall'inglese, una chiave alla volta.
Tutti i messaggi che il plugin mostra ai giocatori, un file per lingua. Le chiavi non sono elencate una per una: qui ci sono i file, quanti testi contengono e i segnaposto che usano.
| File | Lingua | Testi |
|---|---|---|
lang/en_US.yml riferimento | English | 419 |
lang/it_IT.yml | Italiano | 419 |
Segnaposto più usati
Il plugin li sostituisce con il valore giusto: vanno lasciati scritti così.
<prefix><label><player><id><reason><action><check><family><text><name><count><value><state><measured>
Gruppi di messaggi
prefix1common10command4unit25exempt20check76alert23punish2narrator28evidence32admin115gui36license43locked4