• Este sitio usa cookies. Para continuar usando este sitio, se debe aceptar nuestro uso de cookies. Más información.

Comando freeze

Brouse_13

Ex-Mod
BlueSaiyan
Usuario
Registrado
5 Ago 2019
Mensajes
56
'Me Gusta'
80
Puntos
18
Ubicación
Mallorca
#1
Hola usuarios de dbc antes de nada me gustaria que si no sabeis mucho de código no comenteis ya que entorpecería a la gente que sí me puede ayudar.
Estoy aquí para proponer un código java bukkit para staff; este comando serviría para poder congelar a un jugador mientras un staff haga SS así este no perdería el punto en el que está.
 

Brouse_13

Ex-Mod
BlueSaiyan
Usuario
Registrado
5 Ago 2019
Mensajes
56
'Me Gusta'
80
Puntos
18
Ubicación
Mallorca
#2
Java:
import java.util.ArrayList;
 
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.plugin.java.JavaPlugin;
 
public class Congelar extends JavaPlugin implements Listener {
 
    ArrayList<String> FrozedPlayers = new ArrayList<String>();
 
    @EventHandler
    public void onPlayerMove(PlayerMoveEvent e) {
        Player p = e.getPlayer();
        if (FrozedPlayers.contains(p.getName())) {
            e.setTo(e.getFrom());
            p.sendMessage("No puedes moverte");
        }
    }
 
    public void onEnable() {
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
    }
 
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        if (cmd.getName().equalsIgnoreCase("congelar")) {
            if (args.length == 0) {
                sender.sendMessage("Uso correcto /congelar <jugador>");
                return true;
            }
            @SuppressWarnings("deprecation")
            Player target = Bukkit.getServer().getPlayer(args[0]);
            if (target == null) {
                sender.sendMessage( "Jugador " + args[0] + "no encontrado");
                return true;
            }
            if (FrozedPlayers.contains(target.getName())) {
                FrozedPlayers.remove(target.getName());
                sender.sendMessage("El jugador " + args[0] + " ha sido descongelado");
                return true;
            }
           FrozedPlayers.add(target.getName());
            sender.sendMessage(+ "El jugador " + target.getName() + " ha sido congelado");
        }
        return true;
    }
}
 

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#6
Primero que nada muy bien! me da gusto ver el codigo ese!
bueno ahora unos consejos

1 Cambia el ArrayList<String> por un HashSet<String> por que el arraylist permite valores duplicados y en este caso eso es malo
2 las funciones onEnable y onCommand ocupan la anotacion @Override encima para sobre escribir la super class
3 registra el comando dentro de la funcion onEnable poniendo de argumento el nombre del comando
y tambien incluyelo en plugin.yml
4 cambia este metodo Bukkit.getServer().getPlayer(args[0]); por Bukkit.getServer().getPlayerExact(args[0]);
por que el primero puede confundir un jugador con otro jugador si se llama parecido
5 el mensaje "no puedes moverte" en el evento se spameara mucho, pero no importa por que te recomiendo quitar ese evento
y usar esto para congelar y descongelar dentro de la funcion onCommand, al hacer esto tambien puedes quitar el ArrayList o HashSet
y cambiarlo por

if(p.getWalkSpeed()==0.0F) {
p.setFlySpeed(0.1F);
p.setWalkSpeed(0.2F);
p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 1, 128,false,false,false), true);
}else {
p.setFlySpeed(0.0F);
p.setWalkSpeed(0.0F);
p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 128,false,false,false), true);
}
 


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#7
quedaria algo asi mira:


Java:
public class Congelar extends JavaPlugin {
  
    @Override
    public void onEnable() {
        getCommand("congelar").setExecutor(this);
    }
  
    @Override
    public boolean onCommand(CommandSender s, Command c, String l, String[] a) {
        if (a.length==0) s.sendMessage("Uso correcto /congelar <jugador>");
        else {
            Player p = Bukkit.getServer().getPlayerExact(a[0]);
            if (p == null)s.sendMessage( "Jugador " + a[0] + "no encontrado");
            else if(p.getWalkSpeed()==0.0F) {
                p.setFlySpeed(0.1F);
                p.setWalkSpeed(0.2F);
                p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 1, 128,false,false,false), true);
                s.sendMessage("El jugador " + a[0] + " ha sido descongelado"); 
            }else {
                p.setFlySpeed(0.0F);
                p.setWalkSpeed(0.0F);
                p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 128,false,false,false), true);
                s.sendMessage("El jugador " + p.getName() + " ha sido congelado"); 
            }
        }
        return true;
    }
}
 


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#11
getCommand("congelar").setExecutor(this);
el metodo getCommand... ocupa conocer el comando y tambien conocer el class donde esta el comando, en este caso tu lo pusiste en la misma
class y eso es el this
 


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#13


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#14
mira por ejemplo tienes en una class esto
public class mob{
private boolean burning;

public mob(boolean burning)
{
this.burning=burning;
}

public boolean isBurning()
{
return this.burning;
}
public void setBurning(boolean burning)
{
this.burning=burning;
}
}


ahora en otra class creas un objeto de esa class
mob zombie = new mob(true);

y puedes usar los metodos
zombie.isBurning();
zombie.setBurning(false);
 


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#16
mira si quieres puedes poner todo el codigo en una sola class y no usar metodos y podria hacer muchas cosas
pero los metodos ayudan mucho.. o pregunta mas especifico que es lo que no entiendes?
 


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!

Brouse_13

Ex-Mod
BlueSaiyan
Usuario
Registrado
5 Ago 2019
Mensajes
56
'Me Gusta'
80
Puntos
18
Ubicación
Mallorca
#17
Lo que no entiendo es usar los constructores ya que cuando a un comando le pongo un constructor he de usar this para declararlo en el onEnable() en cambio si no lo pongo los argumentos quedan vacíos.
PD: Un método ha de estar siempre declarado como void?
 

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#18
el constructor se ejecuta al iniciar la class, la primera vez y sirve para dar los valores como el ejemplo que puse
arriba esto es un construcor
public mob(boolean burning)
{
this.burning=burning;
}
y dara el valor que le mandes de argumento cuando crees el objeto de esa class... ejemplo
mob zombie = new mob(true);
ahora el valor de ese boolean cuando pongas zombie.algo() sera true hasta que lo cambies y asi con todos los valores
que tengas en esa class.. el constructor no se vuelve a ejecutar ese como lo que se ejecuta al inicar esa class
mira alla en la class donde se registra el evento o el comando hay una variable y conocer la main class la principal del plugin
y ocupa conocer el lugar donde esta el evento o el comando por eso lo envias... this significa la class en la que estas
si estas en la class Main y mandas this como argumento a otra class lo que estas enviando es la class Main
cuando declaras un metodo como void es solo por que lo quieres ejecutar y no quieres que te regrese nada
ejemplo
public void destroy()
{
this.isAlive=false;
}
no regresa nada es para cuando solo quieres ejecutar codigo o meter valores la cosa es que no quieres sacar nada de regreso
ejemplo si pones

public String getName()
{
return "ZombieMalvado";
}

ahora digamos que tienes un objeto con esa class que se llama zombie
entonces si pones
zombie.destroy();
solo se ejecuta pero no te da nada
ahora si pones
String nombre=zombie.getName();
ahora en nombre dira ZombieMalvado
 


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!

Lehend

✪ DEV ッツシ
Miembro del equipo
Desarrollador
BlueSaiyan
Registrado
4 Ago 2019
Mensajes
54
'Me Gusta'
247
Puntos
33
Ubicación
/home/lehend/.minecraft/saves/world
#20
mira un constructor se ejecuta cuando inicias esa class sirve para dar los valores por defecto y despues puedes cambiarlos si quieres
es como si tuvieras

mob zombie = new mob(world, x,y,z);
ahi se pusieron los valores... si los quieres cambiar luego podrias ahora si no tienes constructor y pones un metodo que haga lo mismo
seria lo mismo pero seria mas trabajo
mob zombie = new mob();
zombie.iniciar(world, x,y,z);

en la primera la class mob seria asi

public class mob{
private World world;
private int x,y,z;
public mob(World world, int x, int y, int z){
this.world=world;
this.x=x;
this.y=y;
this.z=z;
}

}

en la segunda seria


public class mob{
private World world;
private int x,y,z;
public void iniciar(World world, int x, int y, int z){
this.world=world;
this.x=x;
this.y=y;
this.z=z;
}

}


lo mejor es usar un constructor ya que evita errores que no des los valores ademas resume y pide lo que ocupa esencialmente
y lo mas importante es que puedes declarar variables como final que son mas rapidas pero no se pueden modificar
por ejemplo el tipo de mob si es zombie o zombiedelmar etc
 


no me estas siguiendo? xD Sigueme!
dale like a este post! Like!
Arriba Pie