Vai al contenuto
ShadowMC

Configurazione

ShadowBlocker

Riconosce chi bara e mette in mano allo staff le prove per decidere.

Premium v1.0.1

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.

Cosa c’è dentro

7 file · 314 impostazioni

Da dove partire: config.yml

Impostazioni

I file che decidono come si comporta il plugin. Si parte da qui.

config.yml

Impostazioni generali
94 impostazioni
plugins/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-version1

Come 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 avviso

2. 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 chiavi
enabledfalse

false = 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 chiavi

La 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 chiavi
score60
actionlog
punishments.ladder.second2 chiavi
score120
actionticket
punishments.ladder.third3 chiavi
score200
actionkick
reason"Disallowed behaviour"
punishments.ladder.fourth4 chiavi
score350
actionban
duration"7d"
reason"Disallowed behaviour detected"

Il motore

engine5 chiavi
sensitivity"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.0

Di 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.25

Di 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-ticks1

Ogni 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 chiave
enabledtrue

Leggi 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 chiavi
cooldown"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-consoletrue

Scrivi 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-violationstrue

Scrivi 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 chiavi
enabledtrue

false = non spostare mai nessuno; gli avvisi arrivano comunque.

max-distance48.0

Un 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 chiavi
memory-cap500

Quante 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-filestrue

Scrivi 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 chiavi
score120

Da 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-summarytrue

Chiedi 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 chiavi
lag-tps18.0

Sotto 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.0

Ogni 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 chiavi
join"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 chiavi
detecttrue

Riconosci 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-uuidtrue

Riconoscili 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 chiavi
integrations.shadowcontrol2 chiavi
reportstrue

Scrivi requests.yml, che il pannello legge.

report-every"1m"
integrations.shadowgames1 chiave
suspend[ ]

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 chiave
suspend[ ]

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 chiavi
raise-buffersfalse

Cosa 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-buffer6

Dove 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 chiavi
table-prefix"sb_"

Il prefisso delle tabelle. Cambialo se più plugin condividono lo stesso database.

storage.mysql7 chiavi
enabledfalse

Il 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"
port3306
database"shadowblocker"
username"root"
password""
parameters"useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8"
storage
fallback-to-localtrue

Se 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 chiave
auto-serverfalse

Permette a un altro processo di aprire lo stesso file H2. Serve solo se vuoi guardare il database mentre il server è acceso.

storage.pool5 chiavi
maximum-pool-size4

Piccolo 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-idle1
connection-timeout-ms10000
idle-timeout-ms600000
max-lifetime-ms1800000

Licenza

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 chiavi

LA 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-days7

Giorni 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-iptrue

Una 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 chiavi
default-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-localetrue

Segui la lingua impostata nel client di ogni giocatore.

auto-updatetrue

Porta 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 chiave
click-delay"150ms"

Quanto aspettare tra due clic nella stessa finestra. Serve contro i doppi clic accidentali, non contro i cheat.

compatibility1 chiave
section-color-codestrue

Accetta nei colori il carattere di sezione oltre alla e commerciale. Utile se incolli testi che arrivano da un plugin più vecchio.

Diagnostica

logging1 chiave
log-sqlfalse

Scrivi in console ogni istruzione SQL. Utile per un pomeriggio, poi rispegnilo.

metrics1 chiave
enabledtrue

bStats: 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
plugins/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-version1

All'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 chiavi

Movimento

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 chiavi
RILEVA: 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.
enabledtrue
weight8
buffer4
disabled-worlds[ ]
alert-threshold16
punish-threshold40

40 = cinque violazioni ravvicinate prima che possa contare per una punizione automatica: volare non è mai una cosa da un tick.

decay8
setbacktrue
tolerance0.03

Quanto è 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.01

Di quanto allargare la tolleranza ogni 100 ms di latenza, e il tetto massimo.

max-ping-allowance0.06
jump-grace-ticks2

Per 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.005

Sotto quanto movimento verticale conta come "fermo in aria".

hover-ticks14

Per quanti tick di fila. A mezz'aria è impossibile per costruzione: anche alla velocità terminale scendi di 3.92 per tick.

checks.speed17 chiavi
RILEVA: 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.
enabledtrue
weight6
buffer5
disabled-worlds[ ]
alert-threshold18
punish-threshold36
decay8
setbacktrue
base0.45

La 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.20

Quanto 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.6

Ghiaccio, 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.15
soul-speed-multiplier1.30
ping-allowance-per-100ms0.02
max-ping-allowance0.10
instant-multiplier5.0

Quante 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-samples10

Quanti campioni servono prima che una media significhi qualcosa.

checks.jump11 chiavi
RILEVA: 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.
enabledtrue
weight8
buffer3
disabled-worlds[ ]
alert-threshold16
punish-threshold40
decay8
setbacktrue
base-height1.35

L'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.80

Quanto aggiunge ogni livello di Jump Boost.

tolerance0.10
checks.climb10 chiavi
RILEVA: 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.
enabledtrue
weight7
buffer6
disabled-worlds[ ]
alert-threshold21
punish-threshold42
decay8
setbacktrue
air-ticks8

Da 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.02

Sotto quanta salita non guarda.

checks.phase10 chiavi
RILEVA: 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.
enabledtrue
weight5
buffer8
disabled-worlds[ ]
alert-threshold15
punish-threshold0

0 = mai da solo: serve a confermare gli altri controlli.

decay10
setbacktrue

Qui la risposta giusta è riportare il giocatore fuori dal muro.

ticks12

Quanti tick dentro il blocco prima di dire qualcosa.

min-movement0.02

Sotto quanto movimento conta come "incastrato" invece che "sta attraversando". Da un incastro vieni tirato fuori, non lo attraversi camminando.

checks.nofall10 chiavi
RILEVA: 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.
enabledtrue
weight10
buffer4
disabled-worlds[ ]
alert-threshold20
punish-threshold50
decay6
setbackfalse

Qui un setback non annullerebbe niente di utile: la caduta è finita.

min-fall-distance3.0

Da 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.0

Blocchi 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 chiavi
enabledtrue
weight7
buffer5
disabled-worlds[ ]
alert-threshold21
punish-threshold42
decay8
max-distance3.0

La portata del gioco in survival. Se l'attributo del giocatore o la portata dell'arma sono più lunghi, si usano quelli.

tolerance0.40

Il margine fisso: copre l'allargamento delle hitbox e l'arrotondamento in virgola mobile.

ping-allowance-per-100ms0.15
max-ping-allowance0.60
compensation-window-ms1000

Quanto 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-ms150

Quanto 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.5

Per 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.0

Margine 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 chiavi
enabledtrue
weight5
buffer4
disabled-worlds[ ]
alert-threshold15
punish-threshold0

0 = mai da solo: il ritmo dei clic è l'indizio più debole che ci sia.

decay10
max-cps30

Il numero assurdo. Alto apposta: una soglia bassa qui becca i giocatori bravi (il drag click supera i 25), non i cheat.

window-seconds8

Si analizzano solo i clic degli ultimi tot secondi (questo valore): un giudizio dato su un colpo guarda come clicca il giocatore ADESSO.

min-samples40

Sotto quanti campioni non si dice mai niente. Su cinque clic sembra tutto regolare.

min-deviation-ms8.0

La deviazione standard minima degli intervalli, in millisecondi. Una persona resta nelle decine di millisecondi anche alla massima velocità.

max-identical-share0.55

Che frazione degli intervalli può essere identica a quello più frequente. Il client 26.x elabora i clic una volta per tick, quindi gli intervalli onesti si raccolgono sui multipli di 50 ms: questo valore è alto apposta.

checks.angle9 chiavi
RILEVA: 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).
enabledtrue
weight9
buffer3
disabled-worlds[ ]
alert-threshold18
punish-threshold45
decay8
max-angle85.0

Oltre quanti gradi. 85 è quasi di lato: un client onesto resta sempre sotto i venti.

min-distance1.2

Sotto quanta distanza l'angolo non significa niente.

checks.wallhit8 chiavi
RILEVA: 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.
enabledtrue
weight6
buffer6
disabled-worlds[ ]
alert-threshold18
punish-threshold0

0 = mai da solo.

decay10
min-distance1.0

Rileva: 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 chiavi
enabledtrue
weight6
buffer5
disabled-worlds[ ]
alert-threshold18
punish-threshold0

0 = mai da solo.

decay10
snaptrue
snap-window-ms120
max-snap-degrees45.0
snap-still-before-degrees5.0

Nel 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.

patternfalse

Leggi il paragrafo sopra prima di toccare questo.

pattern-min-samples20
min-quantised-share0.75

Sotto quale frazione di rotazioni sulla griglia segnala. Un mouse sta a 1.0; 0.75 lascia fuori posto un quarto delle rotazioni prima di dire qualcosa.

Interazione

checks.fastbreak9 chiavi
RILEVA: 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'.
enabledtrue
weight9
buffer3
disabled-worlds[ ]
alert-threshold18
punish-threshold45
decay8
max-speed-ratio0.65

Sotto 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-ms150

Sotto 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 chiavi
enabledtrue
weight12
buffer1
disabled-worlds[ ]
alert-threshold24
punish-threshold48
decay8
max-per-tick3
checks.interactreach12 chiavi
RILEVA: 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.
enabledtrue
weight6
buffer4
disabled-worlds[ ]
alert-threshold18
punish-threshold36
decay8
survival-distance4.5
creative-distance6.0
tolerance0.60

Il 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.08
max-ping-allowance0.35
checks.visibility12 chiavi
RILEVA: 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.
enabledtrue
weight5
buffer6
disabled-worlds[ ]
alert-threshold15
punish-threshold0

0 = mai da solo.

decay10
check-line-of-sighttrue
min-distance1.5
check-angletrue
max-angle90.0
angle-min-distance2.0
checks.place11 chiavi
RILEVA: 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.
enabledtrue
weight7
buffer4
disabled-worlds[ ]
alert-threshold21
punish-threshold0

0 = mai da solo.

decay10
require-supporttrue
check-angletrue
max-angle100.0
angle-min-distance1.5

Pacchetti

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 chiavi
RILEVA: 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.
enabledtrue
weight3
buffer10
disabled-worlds[ ]
alert-threshold9
punish-threshold0

0 = mai da solo: serve a confermare speed e fastbreak.

decay10
max-ahead-ms500.0

Di 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.0

Quanto 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.0
checks.order9 chiavi
RILEVA: 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.
enabledtrue
weight4
buffer8
disabled-worlds[ ]
alert-threshold12
punish-threshold0

0 = mai da solo.

decay10
min-actions8

Sotto quante azioni nella finestra non guarda: un giocatore appena entrato ha finestre mezze vuote per definizione.

dead-grace-ms1500

Per 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 chiavi
enabledtrue
weight15
buffer1
disabled-worlds[ ]
alert-threshold15
punish-threshold30
decay5
max-jump-blocks100.0
world-border-blocks30000000.0

Lingue

I testi che il plugin mostra ai giocatori, un file per lingua.

lang/

Testi e messaggi
2 file
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.

FileLinguaTesti
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

  • prefix 1
  • common 10
  • command 4
  • unit 25
  • exempt 20
  • check 76
  • alert 23
  • punish 2
  • narrator 28
  • evidence 32
  • admin 115
  • gui 36
  • license 43
  • locked 4

Tutta la documentazione