"> Foro - [Ayuda] Ejecutar acciones sin ser comandos. en Ayuda y soporte - Page 1 of 1
Junio 17, 2024, 02:55:47 pm
Visitante

Autor Tema: [Ayuda] Ejecutar acciones sin ser comandos.  (Leído 3561 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Febrero 13, 2015, 01:42:33 am

gaelito




  • Desconectado

  • *

    • *
    • *
    • *
  • Mensaje personal
    MinecraftMin, el mejor foro Español!
  • Actividad

  • 0%
  • Logros

Más información

Hola a todos :D
Estuve viendo bastantes cosas de java y de bukkit y estoy creando un plugin bastante molón sobre Smash Bros.
El problema es que quiero que la cuenta atrás para que empiece el juego cuando haya suficientes personas, colocadas en un HashMap. Creo que esta duda también me surgirá cuando vaya a hacer otras cosas que no sean eventos. (Se crear eventos.)
He intentado con este código:
Código: [Seleccionar]
static Map<String, Player> mapa = new HashMap<>();
static int mapan = mapa.size();
public void Inicio(){
        if(mapan >= 1){
            for (String s : mapa.keySet()) {
                Player p = Bukkit.getPlayer(s);
                int a = 30;
                new BukkitRunnable(){
                public void run(){
                 if(a==30) {p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 30 segundos!");
                 Main.log.log(Level.INFO,"Configuracion cargada");;
                 }
                 if(a==10) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 10 segundos!");
                 if(a==5) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 5 segundos!");
                 if(a==4) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 4 segundos!");
                 if(a==3) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 3 segundos!");
                 if(a==2) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 2 segundos!");
                 if(a==1) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 1 segundos!");
                 if(a==0){
                     p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea ha comenzado!");
                    
                    
                 }
            
            
        }}.runTaskTimer(EventosGeneral.plugin, 0L, 20L);
    
    
    
    }
}
    }

Gracias de antemano :)

P.D: También probé con un runnable, Aquí el código:
Código: [Seleccionar]
package com.gmail.gaelitoelquesito.SmashBros;

import static com.gmail.gaelitoelquesito.SmashBros.Main.mapan;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;

public class CuentaAtras implements Runnable{
    public void run(){
        while(true){
        if(mapan >= 1){
            for (String s : Main.mapa.keySet()) {
                Player p = Bukkit.getPlayer(s);
                int a = 30;
                 if(a==30) {p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 30 segundos!");
                 Main.log.log(Level.INFO,"Configuracion cargada");;
                 }
                 if(a==10) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 10 segundos!");
                 if(a==5) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 5 segundos!");
                 if(a==4) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 4 segundos!");
                 if(a==3) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 3 segundos!");
                 if(a==2) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 2 segundos!");
                 if(a==1) p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en 1 segundos!");
                 if(a==0){
                     p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea ha comenzado!");
                     
                     
                 }
                 try{Thread.sleep(1000);}
                 catch(InterruptedException e){
                     e.printStackTrace();
                     Bukkit.shutdown();
                 }
           
           
   
   
   
            }
            try{Thread.sleep(1000);}
                 catch(InterruptedException e){
                     e.printStackTrace();
                     Bukkit.shutdown();
                 }
}
    }
   
}}



Linkback: https://minecraftmin.net/index.php?topic=8383.0
« Última modificación: Febrero 13, 2015, 12:40:27 pm por gaelito »
MinVip en MinPlay.


Respuesta #1 Febrero 15, 2015, 10:55:12 pm

khmdev




  • Desconectado

  • *

    • *
    • *
    • *
  • Actividad

  • 0%
  • Logros

Más información

El uso de hilos en Bukkit se hace a través de BukkitRunable. Aquí te dejo un link con info
Una posible complementación sería:
Código: [Seleccionar]
public void func(final JavaPlugin plugin,final Player p){
final BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
scheduler.scheduleSyncDelayedTask(plugin, new Runnable() {
int i=10;
public void run() {
if(i>0){
p.sendMessage(ChatColor.BOLD+""+ChatColor.GOLD+"¡La pelea comienza en "+i+" segundos!");
i--;
scheduler.scheduleSyncDelayedTask(plugin,this,20L);
} else {
p.sendMessage(ChatColor.BOLD+"¡La pelea empieza!");
}
}
   }, 20L);
}
AVISO, esta programado a ojo, así que puede que este algo mal. Pero lo importante es el planteamiento, mientras no hayan pasado los 10 segundos se lanza así mismo con un retardo de 20 ticks(un segundo) .
Código: [Seleccionar]
scheduler.scheduleSyncDelayedTask(plugin,this,20L);
Espero que te sirva.
Un saludo!



Respuesta #2 Febrero 16, 2015, 05:50:55 pm

gaelito




  • Desconectado

  • *

    • *
    • *
    • *
  • Mensaje personal
    MinecraftMin, el mejor foro Español!
  • Actividad

  • 0%
  • Logros

Más información

He intentado con varias maneras, incluida la tuya.
Lo de hacer relojes ya sabía, pero... como hago para ejecutarlo de la nada? Ya que lo que quiero es que no se ejecute con un comando...
Pegué tu código en varios sitios para ver si funciona y nada...


Respuesta #3 Febrero 17, 2015, 03:31:11 pm

gaelito




  • Desconectado

  • *

    • *
    • *
    • *
  • Mensaje personal
    MinecraftMin, el mejor foro Español!
  • Actividad

  • 0%
  • Logros

Más información

Ya lo arreglé, poniendo el reloj en el void onEnable :P



Respuesta #4 Febrero 17, 2015, 08:47:48 pm

gaelito




  • Desconectado

  • *

    • *
    • *
    • *
  • Mensaje personal
    MinecraftMin, el mejor foro Español!
  • Actividad

  • 0%
  • Logros

Más información

Tengo otro problema relacionado con esto...
Cuando pongo que lo inicie si hay 1 persona en el lobby, va perfecto, pero si hago que se inicie cuando hay 2 personas va el doble de rápido. Si pongo 2 personas va el triple... etc...
Cuando hice eventos lo solucioné con un boolean, pero ahora como solo se activa cuando se inicia el server no se como hacerlo. La solución  sería poner un Runnable dentro de otro, pero me salta error :P alguna idea?


Respuesta #5 Febrero 17, 2015, 09:10:02 pm

Sargock




  • Desconectado

  • *

    • *
    • *
    • *
  • Actividad

  • 0%
  • Logros

Más información

Vale, y si en vez de poner el reloj en el onEnable(), lo pones en un;
Código: [Seleccionar]
public void onPlayerJoin(PlayerJoinEvent e)
{
// Pon aquí el reloj y lo demás
}
Y de paso aprovechas para poner el detector de jugadores, etc... 
Es decir, cuando un jugador se conecte que active el reloj, y puedan suceder dos cosas:
1ª -> Ya hay los jugadores necesarios y este, el reloj, continua.
2º -> Detecta que no hay los jugadores necesarios y cancela el reloj, a la espera de que se conecte otro jugador.



Respuesta #6 Febrero 17, 2015, 09:35:30 pm

gaelito




  • Desconectado

  • *

    • *
    • *
    • *
  • Mensaje personal
    MinecraftMin, el mejor foro Español!
  • Actividad

  • 0%
  • Logros

Más información

Vale, y si en vez de poner el reloj en el onEnable(), lo pones en un;
Código: [Seleccionar]
public void onPlayerJoin(PlayerJoinEvent e)
{
// Pon aquí el reloj y lo demás
}
Y de paso aprovechas para poner el detector de jugadores, etc...
Es decir, cuando un jugador se conecte que active el reloj, y puedan suceder dos cosas:
1ª -> Ya hay los jugadores necesarios y este, el reloj, continua.
2º -> Detecta que no hay los jugadores necesarios y cancela el reloj, a la espera de que se conecte otro jugador.

Vaya... no había pensado en eso :P Sencillo, fácil e ingenioso.... Un gran wendingo ara ti ^^ 


Respuesta #7 Febrero 18, 2015, 12:41:06 pm

Alfomega




  • Desconectado

  • *

    • *
    • *
    • *
  • Mensaje personal
    Ingeniero informático
  • Actividad

  • 0%
  • Logros

Más información

Mejor que activarlo y luego cancelarlo, que primero revise si hay los necesarios y lo lance si es así o no haga nada si no hay el número requerido. Más eficiente. ;)
https://i.imgur.com/cFX0ssZ.png




Respuesta #8 Febrero 18, 2015, 02:26:40 pm

gaelito




  • Desconectado

  • *

    • *
    • *
    • *
  • Mensaje personal
    MinecraftMin, el mejor foro Español!
  • Actividad

  • 0%
  • Logros

Más información

Mejor que activarlo y luego cancelarlo, que primero revise si hay los necesarios y lo lance si es así o no haga nada si no hay el número requerido. Más eficiente. ;)
Eso es lo que hice xD




Share via delicious Share via digg Share via facebook Share via furl Share via linkedin Share via myspace Share via reddit Share via stumble Share via technorati Share via twitter

xx
Chat Color en un comando

Iniciado por BILLIlike

6 Respuestas
4938 Vistas
Último mensaje Febrero 17, 2015, 07:18:27 pm
por Sargock
xx
Sugerencias de comandos para mi plugin y cosas..

Iniciado por McGokuGamer - Lost

6 Respuestas
2420 Vistas
Último mensaje Octubre 29, 2014, 04:04:04 pm
por McGokuGamer - Lost
xx
AYUDA PLUGINS

Iniciado por Mashingo

7 Respuestas
3183 Vistas
Último mensaje Julio 09, 2016, 02:16:29 pm
por Mashingo
xx
Ayuda Con BungeeCore

Iniciado por NiroanTV

0 Respuestas
1327 Vistas
Último mensaje Febrero 07, 2015, 12:27:57 am
por NiroanTV