MinecraftMin

Minecraft => Redstone => Bloques de comandos => Mensaje iniciado por: axe005 en Agosto 15, 2017, 12:13:02 am

Título: Como detectar donde pone un bloque el jugador
Publicado por: axe005 en Agosto 15, 2017, 12:13:02 am
hola necesito ayuda ya que estoy trabajando en algo pero me quedo trabado ya que no se si se puede hacer un testforblock con radio o si hay una forma no la conozco, por ejemplo quiero detectar si hay un mineral de esmeralda en un radio de 12 bloques. La unica forma que se me ocurre seria usar un:
Citar
/execute @a ~ ~ ~ /testforblock
por cada bloque, gracias
Título: Re:Como detectar donde pone un bloque el jugador
Publicado por: DzMine8457 en Agosto 15, 2017, 01:42:39 am
No El Testforblock no tiene Radio,pero puedes usar Como tu dices el /execute ,Pero Mi Unica Pregunta es La Suiguiente: Tu quieres detectar cuando El Mineral de Esmeralda Este Ya Colocado, Y lo quieres Detectar en Un Radio de 12 Bloques,

-O Quieres Detectar Cuando Coloques El Mineral de Esmeralda En un Radio de 12  bloques Detecte que pusiste El Minerl¿?
Título: Re:Como detectar donde pone un bloque el jugador
Publicado por: KaliNuska en Agosto 15, 2017, 01:58:55 am
Para hacer lo que tienes pensado hacer, lo más recomendable es montar un sistema mediante el comando stats que cuente los bloques de mineral de esmeralda que hay en un radio determinado del jugador. Ese radio vendrá determinado por las coordenadas relativas con origen en el jugador que incluyas en un fill.
Sé que suena complicado, y de hecho lo es de entender, pero sigue los pasos que te indico a continuación y lo tendrás listo antes de lo que te hubieras imaginado.


En primer lugar crea un nuevo objetivo scoreboard:
Código: [Seleccionar]
scoreboard objectives add esmeralda dummy EsmeraldaPara hacer debug y comprobar su correcto funcionamiento muestra el objetivo que has creado en el lateral de la pantalla:
Código: [Seleccionar]
scoreboard objectives setdisplay sidebar esmeralda
Carga en el scoreboard a todos los jugadores que van a detectar el bloque de esmeralda:
Código: [Seleccionar]
scoreboard players add @a esmeralda 0
El siguiente comando stats pondrá en marcha un detector de los bloques que resultan afectados de ejecutar comandos desde la ubicación del jugador. Es decir, cualquiera de los comandos que modifiquen bloques (blockdata, clone, fill, setblock, testforblock, testforblocks) ejecutados, o bien directamente por el jugador, o mediante un execute al mismo, activarán el detector*:
Código: [Seleccionar]
stats entity @a set AffectedBlocks @p[r=0] esmeraldaUtiliza en el primer selector de objetivo del comando anterior los mismos criterios que en el que le precede. Si no usaste ninguno, no modifiques nada.

*NOTA: Si deseas utilizar más de un detector de bloques simultáneamente, deberás gestionarlos utilizando diferentes valores en otro scoreboard, con el fin de que no se superpongan las detecciones de uno en los otros. Por otro lado, ya deberías estar haciéndolo, pero evita ejecutar comandos execute en el jugador que no tengan que ver con los mecanismos con stats. El motivo de esto es que al ejecutar cualquiera de los comandos que modifican bloques desde el jugador, probablemente resulte en falsos positivos para tu detector.

Dicho esto, los siguientes comandos deberán ser ejecutados en bucle, pues son los que harán actualizarse al detector cada tick (o con la frecuencia que desees si gestionas los intervalos mediante scoreboard). El último de los comandos será el criterio que ha de cumplir el jugador que tenga mineral de esmeralda en un radio de 6 bloques:
Código: [Seleccionar]
execute @a ~ ~ ~ fill ~-6 ~-6 ~-6 ~6 ~6 ~6 minecraft:bed facing=east,occupied=true,part=head replace minecraft:emerald_ore 0
Código: [Seleccionar]
execute @a ~ ~ ~ fill ~-7 ~-7 ~-7 ~7 ~7 ~7 minecraft:emerald_ore 0 replace minecraft:bed facing=east,occupied=true,part=head
Código: [Seleccionar]
@a[score_esmeralda_min=1]

Con esto ya tienes un detector de bloques de mineral de esmeralda que no necesita de un testforblock por cada bloque a una distancia máxima X del jugador.
Espero que haya servido de ayuda, tanto a ti, como a todos lo que estuvieran interesados en saber algo más del comando stats o, por lo menos, a montar un detector en un mapa. Si tienen alguna duda no duden en responder o crear un nuevo tema detallando la situación problemática.
Título: Re:Como detectar donde pone un bloque el jugador
Publicado por: axe005 en Agosto 15, 2017, 03:58:00 am
Para hacer lo que tienes pensado hacer, lo más recomendable es montar un sistema mediante el comando stats que cuente los bloques de mineral de esmeralda que hay en un radio determinado del jugador. Ese radio vendrá determinado por las coordenadas relativas con origen en el jugador que incluyas en un fill.
Sé que suena complicado, y de hecho lo es de entender, pero sigue los pasos que te indico a continuación y lo tendrás listo antes de lo que te hubieras imaginado.


En primer lugar crea un nuevo objetivo scoreboard:
Código: [Seleccionar]
scoreboard objectives add esmeralda dummy EsmeraldaPara hacer debug y comprobar su correcto funcionamiento muestra el objetivo que has creado en el lateral de la pantalla:
Código: [Seleccionar]
scoreboard objectives setdisplay sidebar esmeralda
Carga en el scoreboard a todos los jugadores que van a detectar el bloque de esmeralda:
Código: [Seleccionar]
scoreboard players add @a esmeralda 0
El siguiente comando stats pondrá en marcha un detector de los bloques que resultan afectados de ejecutar comandos desde la ubicación del jugador. Es decir, cualquiera de los comandos que modifiquen bloques (blockdata, clone, fill, setblock, testforblock, testforblocks) ejecutados, o bien directamente por el jugador, o mediante un execute al mismo, activarán el detector*:
Código: [Seleccionar]
stats entity @a set AffectedBlocks @p[r=0] esmeraldaUtiliza en el primer selector de objetivo del comando anterior los mismos criterios que en el que le precede. Si no usaste ninguno, no modifiques nada.

*NOTA: Si deseas utilizar más de un detector de bloques simultáneamente, deberás gestionarlos utilizando diferentes valores en otro scoreboard, con el fin de que no se superpongan las detecciones de uno en los otros. Por otro lado, ya deberías estar haciéndolo, pero evita ejecutar comandos execute en el jugador que no tengan que ver con los mecanismos con stats. El motivo de esto es que al ejecutar cualquiera de los comandos que modifican bloques desde el jugador, probablemente resulte en falsos positivos para tu detector.

Dicho esto, los siguientes comandos deberán ser ejecutados en bucle, pues son los que harán actualizarse al detector cada tick (o con la frecuencia que desees si gestionas los intervalos mediante scoreboard). El último de los comandos será el criterio que ha de cumplir el jugador que tenga mineral de esmeralda en un radio de 6 bloques:
Código: [Seleccionar]
execute @a ~ ~ ~ fill ~-6 ~-6 ~-6 ~6 ~6 ~6 minecraft:bed facing=east,occupied=true,part=head replace minecraft:emerald_ore 0
Código: [Seleccionar]
execute @a ~ ~ ~ fill ~-7 ~-7 ~-7 ~7 ~7 ~7 minecraft:emerald_ore 0 replace minecraft:bed facing=east,occupied=true,part=head
Código: [Seleccionar]
@a[score_esmeralda_min=1]

Con esto ya tienes un detector de bloques de mineral de esmeralda que no necesita de un testforblock por cada bloque a una distancia máxima X del jugador.
Espero que haya servido de ayuda, tanto a ti, como a todos lo que estuvieran interesados en saber algo más del comando stats o, por lo menos, a montar un detector en un mapa. Si tienen alguna duda no duden en responder o crear un nuevo tema detallando la situación problemática.
[/spoiler]

Hola antes que nada gracias por la molesteia de responderme lo unico es que sigo sin entender como poner los ultimos 3 comandos que pusistes:

Citar
execute @a ~ ~ ~ fill ~-6 ~-6 ~-6 ~6 ~6 ~6 minecraft:bed facing=east,occupied=true,part=head replace minecraft:emerald_ore 0
Citar
execute @a ~ ~ ~ fill ~-7 ~-7 ~-7 ~7 ~7 ~7 minecraft:emerald_ore 0 replace minecraft:bed facing=east,occupied=true,part=head
Citar
@a[score_esmeralda_min=1]
si tienes imagenes mucho mejor para saber exactamente como debe de quedar, gracias ;)
Título: Re:Como detectar donde pone un bloque el jugador
Publicado por: KaliNuska en Agosto 16, 2017, 02:17:27 am
Hola antes que nada gracias por la molesteia de responderme lo unico es que sigo sin entender como poner los ultimos 3 comandos que pusistes:

Citar
execute @a ~ ~ ~ fill ~-6 ~-6 ~-6 ~6 ~6 ~6 minecraft:bed facing=east,occupied=true,part=head replace minecraft:emerald_ore 0
Citar
execute @a ~ ~ ~ fill ~-7 ~-7 ~-7 ~7 ~7 ~7 minecraft:emerald_ore 0 replace minecraft:bed facing=east,occupied=true,part=head
Citar
@a[score_esmeralda_min=1]
si tienes imagenes mucho mejor para saber exactamente como debe de quedar, gracias ;)
He de decir que la explicación la enfocaba, más bien, a montar el sistema utilizando las funciones de la última versión, mediante el comando function, pero no supone ningún problema si prefieres hacerlo mediante bloques de comandos.

En la siguiente imagen te dejo el orden que tienes que seguir para activar el mecanismo y el tipo de bloque de comandos que debes usar (haz click en la imagen para verla en grande):
(http://i.imgur.com/88p1afP.png) (http://i.imgur.com/88p1afP.png)

Además te explicaré con un poco más de detalle el selector de objetivo que incluí como comando final:

Cuando se ha detectado, al menos, un mineral de esmeralda alrededor de un jugador, el objetivo scoreboard "esmeralda" de dicho jugador será igual o superior a 1. Esto significa que si en cualquier comando utilizas el selector que te indico, afectará aquellos jugadores sobre los que se ha detectado esmeralda. Del mismo modo, aquellos jugadores sobre los que no se ha detectado esmeralda, no se verán afectados por el selector. Con todo esto, utilizar el selector en el comando que hayas decidido usar como output, es la forma óptima de hacer que sólo resulten afectados por tu output los jugadores que hayan activado el detector de esmeralda.