[Risolto] Execute, verifica una sola volta

  • Pagine (2):
  • 1
  • 2
  • »
Per aprire una porta solo quando il player ha raggiunto 10 punti nella scoreboard, io utilizzo questo strano metodo che è l'unico che soddisfi quello che voglio, seppur sia abbastanza scomodo da fare e ingombrante:

Loop collegato ad un

Command block con un Execute del tipo:
execute @p[score_Kill_min=10] ~ ~ ~ fill x y z minecraft:redstone_torch
che mi piazza una torcia sotto la porta facendomela aprire, se il player ha raggiunto 10 kill
Per evitare che, una volta arrivati a 10 punti, la torcia continui ad essere messa e rimessa, (creando un fastidioso rumore di porta che si chiude-apre alla quasi velocità della luce) ho collegato tra il commandblock ed il loop un

COMPARATORE (down spento)

ovviamente di conseguenza ho dovuto inserire un secondo commandblock successivo all'altro, con un comando del tipo:
/execute @p[score_Kill_min=10] ~ ~ ~ fill x y z minecraft:redstone_torch
questa volta che mi piazza una torcia di redstone nel secondo ingresso del comparatore, se il player ha raggiunto 10 kill

tutto questo per far in modo che una volta raggiunte le 10 kill, la porta si apra e il ciclo che si domanda ogni volta se l'utente ha raggiunto più di 10 kill termina...

Sarà normale? Ci sono metodi più semplici per arrivare a fare una cosa del genere? Per fare un clock che verifichi una cosa, e una volta verificata vengano eseguite delle azioni che poi non vengono più rieseguite?

AGGIORNAMENTO: ok mi sono accorto che se al posto di min=10 mettessi solo =10 e togliessi il comparatore ed il secondo commandblock effettivamente si risolverebbe in parte ma rimangono due problemi:
1. che il loop continuerebbe ad eseguire i comandi finchè il player non faccia un'altra kill e quindi superi le 10
2. che se il player ha 9 kill e ne fa 2 contemporaneamente (o quasi contemporaneamente) la porta non si apre (Modificato 15/09/2016, 19:27 da polinomio.)
@polinomio Basta fare così (command uno dopo l'altro)

/execute @p[score_Kill_min=10] ~ ~ ~ /setblock x y z redstone_torch
/scoreboard players reset @a[score_Kill_min=10] Kill

Questo fa in modo che ogni 10 kills viene messa la torcia. Se invece vuoi che venga fatto solo una volta, basta fare:

/execute @p[score_Kill_min=10,score_Kill=10] ~ ~ ~ /setblock x y z redstone_torch
/scoreboard players set @a[score_Kill_min=10] Kill 11

Spero di esserti stato utile. (Modificato 15/09/2016, 19:38 da Kharu.)
Un rep per l'impegno?     [Immagine: Custom%20Map%201.10.png]   >> Guarda Intuition!
-
[Immagine: Creazioni%2C%20tutorial%20e%20altro.png]    [Immagine: Clicca%20per%20informarti!.png]
@Kharu ha ragione. Lasciatelo dire ma hai fatto su un casino pazzesco quando bastava poco Big Grin
Se ti sono stato d'aiuto clicca su +1!
NON rispondo a richieste di aiuto in privato, se vuoi farmi notare qualcosa taggami con @EndBug!

[Immagine: Clicca%20qui!.png]
 
15/09/2016, 19:35Kharu ha scritto: @polinomio Basta fare così (command uno dopo l'altro)

/execute @p[score_Kill_min=10] ~ ~ ~ /setblock x y z redstone_torch
/scoreboard players reset @a[score_Kill_min=10] Kill

Questo fa in modo che ogni 10 kills viene messa la torcia. Se invece vuoi che venga fatto solo una volta, basta fare:

/execute @p[score_Kill_min=10,score_Kill=10] ~ ~ ~ /setblock x y z redstone_torch
/scoreboard players set @a[score_Kill_min=10] Kill 11

Spero di esserti stato utile.

Ti ringrazio per la risposta

La seconda opzione che hai postato è quella che mi interessa
intanto grazie perchè non sapevo di poter impilare più condizioni and, con la virgola (il min e l'=)
però non mi piace il fatto che il player arrivato a 10 kill scivoli a 11 kill automaticamente (perchè ho la stessa condizione con un numero più alto di kill, ergo è come saltare una uccisione quando raggiungerà questaGhratt).
a parte questo difetto personale mi pare una alternativa efficace già e soltanto perchè mi risparmio la bega del comparatore

Se conoscete altri modi ditemeli Hail
Mai usare comparatori, redstone, o altro che non siano blocchi di comando, con i blocchi di comando. Inoltre, ti consiglio di non usare @p, a meno che sia necessario. Èla causa di molti problemi quando c'è più di un giocatore nel mondo.

Secondo me, il metodo più semplice è usare 2 scoreboard.
Una è quella che usi per contare le uccisioni ovviamente, l'altra è per "bloccare" il sistema. Per comodità la chiameremo Banana.
Quando la scoreboard Kill arriva a 10, fai il tuo execute, ma con una differenza: Indichi oltre a score_Kill_min, anche score_Banana=0 (separi con una virgola all'interno delle parentesi).
Quindi bersagli il giocatore che non solo abbia Kill almeno a 10, ma anche Banana a 0.
Ora, in un secondo blocco di comando, bersaglia tutti i giocatori con Kill almemo a 10 e Banana a 0, e imposta Banana a 1.
Il primo comando non funzionerà più perché il giocatore non ha più Banana a 0.

Per una migliore qualità per aprire la porta, non usare la torcia. Puoi usare un blocco di redstone ad esempio.

Se non vuoi far vedere blocchi o torce sotto la porta, puoi anche posizionare la porta aperta al posto di quella chiusa. In più puoi eseguire contemporaneamente un playsound del rumore della porta nello stesso punto (con l'accortezza ancora una volta che la tag sia @a e non @p).

Nota anche che il comando che hai scritto dovrebbe usare setblock e non fill, in quanto posizioni una sola torcia in un solo punto.

15/09/2016, 19:23polinomio ha scritto: 2. che se il player ha 9 kill e ne fa 2 contemporaneamente (o quasi contemporaneamente) la porta non si apre
Mentre il problema (solo con il tuo nuovo sistema) avverrebbe se le due uccisioni fossero contemporanee, è impossibile che il problema accada se sono "quasi" contemporanee.
Stai usando i blocchi di comando a ripetizione, vero? I tuoi comandi hanno una sensibilità di 1/20 di secondo. (Modificato 16/09/2016, 01:29 da CapoFantasma97.)
C'è un altro metodo che fa aprire la porta una volta sola finché un /setblock non rimuove il blocco di redstone piazzato (tra l'altro molto semplice da fare Asd )

Intanto per evitare un comando troppo lungo/macchinoso e di usare execute @p e i problemi che ti può dare puoi dividere il tutto in due command block:

Ripetizione non condizionale sempre attivo
Codice:
scoreboard players test @a[r=<raggio>] Kill 10 *
scoreboard players test <selettore+criteri> <obiettivo> <minimo> [massimo]

Questo comando passa spesso inosservato, eppure è utilissimo: esso controlla se il punteggio del player indicato nell'obiettivo scelto è compreso tra <minimo> e [massimo]. Dso

Il valore minimo va sempre inserito o sostituito da '*' (Che corrisponde a un valore negativo incredibilmente grande: -2,147,483,647)

Il valore massimo può essere inserito o omesso, nel qual caso esso è '*' (2.147.483.647)


Questo command block deve essere collegato (la sua freccia deve puntare verso) un command block...

Catena CONDIZIONALE sempre attivo
Codice:
setblock x y z minecraft:redstone_block 0 keep

Il "keep" è molto importante, esso è un OldBlockHandler, ti permette di saltare tutta la parte di settare altre scoreboard eccetera, dato che un /setblock con OldBlockHandler in keep sostituisce solamente l'aria. Ewq

Questo vuol dire che la prima volta che la porta viene aperta, il blocco x y z diventerà un redstone block, e tutte le attivazioni seguenti falliranno finché il blocco non tornerà ad essere aria.


~Regards

-Maca Soso
16/09/2016, 01:22CapoFantasma97 ha scritto: Mai usare comparatori, redstone, o altro che non siano blocchi di comando, con i blocchi di comando. Inoltre, ti consiglio di non usare @p, a meno che sia necessario. È la causa di molti problemi quando c'è più di un giocatore nel mondo.

Secondo me, il metodo più semplice è usare 2 scoreboard.
Una è quella che usi per contare le uccisioni ovviamente, l'altra è per "bloccare" il sistema. Per comodità la chiameremo Banana.
Quando la scoreboard Kill arriva a 10, fai il tuo execute, ma con una differenza: Indichi oltre a score_Kill_min, anche score_Banana=0 (separi con una virgola all'interno delle parentesi).
Quindi bersagli il giocatore che non solo abbia Kill almeno a 10, ma anche Banana a 0.
Ora, in un secondo blocco di comando, bersaglia tutti i giocatori con Kill almeno a 10 e Banana a 0, e imposta Banana a 1.
Il primo comando non funzionerà più perché il giocatore non ha più Banana a 0.

Per una migliore qualità per aprire la porta, non usare la torcia. Puoi usare un blocco di redstone ad esempio.

Se non vuoi far vedere blocchi o torce sotto la porta, puoi anche posizionare la porta aperta al posto di quella chiusa. In più puoi eseguire contemporaneamente un playsound del rumore della porta nello stesso punto (con l'accortezza ancora una volta che la tag sia @a e non @p).

Nota anche che il comando che hai scritto dovrebbe usare setblock e non fill, in quanto posizioni una sola torcia in un solo punto.

15/09/2016, 19:23polinomio ha scritto: 2. che se il player ha 9 kill e ne fa 2 contemporaneamente (o quasi contemporaneamente) la porta non si apre
Mentre il problema (solo con il tuo nuovo sistema) avverrebbe se le due uccisioni fossero contemporanee, è impossibile che il problema accada se sono "quasi" contemporanee.
Stai usando i blocchi di comando a ripetizione, vero? I tuoi comandi hanno una sensibilità di 1/20 di secondo.

@CapoFantasma97 Grazie per la risposta

Riguardo la parte "graficoestetico-sonora" sono già a posto per conto mio
Terrò a conto i tuoi consigli riguardo la tua premessa iniziale ed il setblock (difatti, non conoscendo il comando, effettivamente utilizzavo fill anche quando si trattava di un sol blocco, specificando due volte le stesse coordinate per ottenere lo stesso risultato di setblock Alkz ).

Per quanto riguarda invece i blocchi di comando a ripetizione, cosa intendi? Ho dato uno'occhiata su internet ed effettivamente ho visti vari tipi diversi di loop per ottenere un buon clock ottimizzato e soprattutto veloce.


Il metodo che mi hai spiegato te, senza utilizzare quei peccaminosi circuiti di redstone con i comparatori, bensì una scoreboard di supporto mi sembra interessante e più tuttocodice, grazie!
L'unico problema che persiste è che io debba utilizzare la scoreboard di supporto Banana anche per altre verifiche execute; quindi mi piacerebbe trovare un modo per riazzerare la scoreboard in questione a 0

A occhio e croce a me verrebbe in mente di fare un altro execute che si chiede se kill=11, riporti Banana a 0. Ma in questo modo il secondo blocco di comando che "bersaglia tutti i giocatori con Kill almeno a 10 e Banana a 0, e imposta Banana a 1" non riporterebbe Banana a 1, creando una collisione tra command block che porta Banana a 1 e command block che porta Banana a 0?


16/09/2016, 12:54Macapple96 ha scritto: C'è un altro metodo che fa aprire la porta una volta sola finché un /setblock non rimuove il blocco di redstone piazzato (tra l'altro molto semplice da fare Asd Wink

Intanto per evitare un comando troppo lungo/macchinoso e di usare execute @p e i problemi che ti può darepuoi dividere il tutto in due command block:

Ripetizione non condizionale sempre attivo
Codice:
scoreboard players test @a[r=<raggio>] Kill 10 *
scoreboard players test <selettore+criteri> <obiettivo> <minimo> [massimo]

Questo comando passa spesso inosservato, eppure è utilissimo: esso controlla se il punteggio del player indicato nell'obiettivo scelto è compreso tra <minimo> e [massimo]. Dso

Il valore minimo va sempre inserito o sostituito da '*' (Che corrisponde a un valore negativo incredibilmente grande: -2,147,483,647)

Il valore massimo può essere inserito o omesso, nel qual caso esso è '*' (2.147.483.647)


Questo command block deve essere collegato (la sua freccia deve puntare verso) un command block...

Catena CONDIZIONALE sempre attivo
Codice:
setblock x y z minecraft:redstone_block 0 keep

Il "keep" è molto importante, esso è un OldBlockHandler, ti permette di saltare tutta la parte di settare altre scoreboard eccetera, dato che un /setblock con OldBlockHandler in keep sostituisce solamente l'aria. Ewq

Questo vuol dire che la prima volta che la porta viene aperta, il blocco x y z diventerà un redstone block, e tutte le attivazioni seguenti falliranno finché il blocco non tornerà ad essere aria.


~Regards

-Maca Soso

@Macapple96 oddio, grazie mille!

Mi hai veramente incuriosito con scoreboard players test (poi il tag del raggio mi è probabilmente d'aiuto in situazioni di multiplaying). Inoltre non conoscevo la possibilità di poter concatenare i commandblock per mezzo di una direzione.
Ma, perdona l'ignoranza in materia, mi spiegheresti cosa definiscono del mio command block le tre opzioni delle quali te mi hai precisamente detto come impostare? (Catena, condizionale/non e sempre attivo lo presuppongo: faccio a meno del clock).
Grazie anche per il keep. (Modificato 16/09/2016, 15:08 da polinomio.)
@polinomio , se hai bisogno di altre scoreboard, ti basta crearle! Puoi farne quante ne vuoi. Se specifichi meglio posso anche dirti cosa può servirti.

I blocchi di comando, a partire dalla 1.9, hanno 3 modalità:
•a impulso
•a catena
•a ripetizione
Il tipo si cambia all'interno del blocco di comando, premendo l'apposito tasto.
Con la 1.8, dovevi usare un fill clock (era l'unico tipo di clock utile con i blocchi di comando, per cambiare velocità, sia allora che adesso basta creare una scoreboard. Inoltre è molto difficile che serva un clock di velocità diversa). Dalla 1.9 in poi, basta impostare il blocco in modalità ripetizione. Non serve neanche un impulso di redstone in questo caso: Sempre all'interno del blocco puoi scegliere tra "serve redstone" e "sempre attivo".
Citazione:Mi hai veramente incuriosito con scoreboard players test (poi il tag del raggio mi è probabilmente d'aiuto in situazioni di multiplaying). Inoltre non conoscevo la possibilità di poter concatenare i commandblock per mezzo di una direzione.
Ma, perdona l'ignoranza in materia, mi spiegheresti cosa definiscono del mio command block le tre opzioni delle quali te mi hai precisamente detto come impostare? (Catena, condizionale/non e sempre attivo lo presuppongo: faccio a meno del clock).
Grazie anche per il keep.

@polinomio Ewq

Allora.

A partire dalla 1.9, i command block hanno 3 modalità: Impulso, Catena e Ripetizione

Inoltre hanno un "verso" indicato dalla freccia, un davanti, e un dietro (Il dietro ha un quadrato smussato, il davanti un cerchio)

Impulso: Quando il command block riceve un segnale di redstone (O viene impostato sempre attivo tramite comandi o attraverso la GUI) esso esegue il comando al suo interno UNA SOLA VOLTA.

Catena: Quando il command block riceve un segnale di redstone E il command block la cui freccia punta verso di esso (Esempio:[I>][C>][C]) si attiva, allora si attiva anche lui, a PRESCINDERE dalla riuscita o no del comando.

Ripetizione: Finché il command block riceve un segnale di redstone (o sempre, se sempre attivo) esso esegue il comando al suo interno 20 volte al secondo (ogni tick) ciò rende inutili i fill clock o i repeater clock.

Il selettore Condizionale/Non Condizionale permette al command block impostato in questo modo di "ascoltare" il command block dietro di lui ([R>][}C>])
Esso si attiverà seguendo le condizioni sopra, ma SE e SOLO SE il command block dietro di lui ha restituito vero, quindi il comando è andato a buon fine. Soso



La tabella di verità di un command block condizionale è

a = Riceve corrente
b = Il command block dietro è vero (il comando è riuscito)

a ^ b
0 0 0
0 0 1
1 0 0
1 1 1

Quella di un command block a catena condizionale è:
a = riceve corrente
b = il command block dietro è vero
c = il command block dietro è stato eseguito
a ^ ( b ^ c )
0 0 0 0
0 0 0 1
0 1 0 0
0 0 1 1 1
1 0 0 0
1 0 0 1
1 1 0 0
1 1 1 1 1

Di solito il condizionale si usa coi Chain Command Block, appunto per verificare se una fase del comando è riuscita. Dso

Nel tuo caso infatti il comando /setblock si attiva se e solo se c'è almeno un giocatore nell'area fissata che ha come score dell'obiettivo Kill un numero da 10 a "infinito"

Se non avessimo messo il condizionale, il setblock si sarebbe attivato ogni 1/20 di secondo a prescindere dall'output di scoreboard players test Asd (Modificato 16/09/2016, 17:54 da Maca.)
Allora. Macapple86 sta facendo tutto così complicato! Il tutto è molto più semplice... e poi ho trovato la soluzione!

@pollinomio metti due command di fila che fanno:

/execute @p[score_Kills_min=10] <coordinate torcia> setblock <coordinate torcia> redstone_torch
/execute @p[score_Kills_min=10] <coordinate primo cb> blockdata <coordinate primo cb> {Auto:0}

Questo farà in modo che il meccanismo, una volta eseguito il comando, si disattiverà per sempre.



(Modificato 16/09/2016, 18:44 da Kharu.)
Un rep per l'impegno?     [Immagine: Custom%20Map%201.10.png]   >> Guarda Intuition!
-
[Immagine: Creazioni%2C%20tutorial%20e%20altro.png]    [Immagine: Clicca%20per%20informarti!.png]
  • Pagine (2):
  • 1
  • 2
  • »
Discussioni simili
Ultima risposta: futuristico705
14/12/2017, 19:03
Ultima risposta: iHeroN
12/12/2017, 19:44
Ultima risposta: DarckFlix_
30/11/2017, 21:45
 
[Risolto] Mi serve una tag.
Ultima risposta: herobrine99dan
25/11/2017, 10:07
Ultima risposta: iHeroN
05/10/2017, 07:12

Utente(i) che stanno guardando questa discussione: 1 Ospite(i)