Bukkit Plugin Spieler zurückbewegen mit Vector

Status
Für weitere Antworten geschlossen.

Mika119

Mitglied
8 Okt. 2015
37
28
123
Hallo,
ich habe für ein Plugin geschrieben, dass Spieler die in einen Bereich eintreten der für sie verboten ist sie herausgeschleudert werden. Hier der Code:

Code:
Location to = pme.getTo();
Location from = pme.getFrom(); //pme ist das PlayerMoveEvent
double ax = to.getX();
double ay = to.getY();
double az = to.getZ();
double bx = from.getX();
double by = from.getY();
double bz = from.getZ();
double vx = ax - bx;
double vy = ay - by;
double vz = az - bz;
if (away.contains(p.getName()) == false) { //away ist eine ArrayList inder der Spielername gespeichert
Vector vec = new Vector(vx, vy, vz); //wird
vec.normalize();
vec.multiply(-2);
p.sendMessage(Double.toString( vec.getX())); //debug
p.setVelocity(vec);
away.add(p.getName());
}
Bukkit.getScheduler().scheduleSyncDelayedTask(main, new Runnable() {

@Override
public void run() {
away.remove(p.getName());

}
}, 5); //5 = 5 Ticks bis ein Spieler wieder zurückgeworfen werden kann


Das Problem besteht darin, dass man sich in den Bereich hereinbuggen kann indem man hinter sich Blöcke platziert und dann mehrmals versucht hereinzukommen. Einmal drin passiert folgendes: Der Spieler wird vom Plugin in Richtung auserhalb des Gebietes geschleudert aber bevor er rauskommt wird er dadurch, dass er im Gebiet ist und sich dann wieder in die andere Richtung bewegt wieder in das Gebiet geschleudert. Da kommt man dann nie wieder raus. Wie kann ich das fixen?
PS: Das gebiet ist ein Rechteck mitten in irgendeiner Fläche.

Vielen Dank für alle Antworten!
Mika
 
Zuletzt bearbeitet:
Mach doch vielleicht einfach das der Spieler auch ein bisschen nach oben geschleudert wird, dann fliegt er über den Block. Ich habe leider noch nicht so viel mit Vektoren gearbeitet aber du könntest es vielleicht wie folgt machen. Ich vermute du fragst im PlayerMoveEvent ab wo sich der Spieler befindet. Wenn er in dem Gebiet ist tust du ihn in eine HashMap zusammen mit dem Vektor und nach x sec nimmst du ihn wieder raus. Wenn jetzt ein Spieler in einer HashMap ist, dann wird kein neuer Vektor berechnet sonder der aus der HashMap benutzt. Wenn ich morgen wieder am PC bin kann ich dir auch noch einen Code senden falls du das nicht verstanden habe solltest, bin nämlich leider gerade am Handy...

//Nachtrag
Mach doch vielleicht einfach das der Spieler auch ein bisschen nach oben geschleudert wird, dann fliegt er über den Block. Ich habe leider noch nicht so viel mit Vektoren gearbeitet aber du könntest es vielleicht wie folgt machen. Ich vermute du fragst im PlayerMoveEvent ab wo sich der Spieler befindet. Wenn er in dem Gebiet ist tust du ihn in eine HashMap zusammen mit dem Vektor und nach x sec nimmst du ihn wieder raus. Wenn jetzt ein Spieler in einer HashMap ist, dann wird kein neuer Vektor berechnet sonder der aus der HashMap benutzt. Wenn ich morgen wieder am PC bin kann ich dir auch noch einen Code senden falls du das nicht verstanden habe solltest, bin nämlich leider gerade am Handy...
Es geht noch viel leichter! Du berechnest erstmal den Mittelpunkt deiner Zone zum Beispiel:
Die Zone geht von x: 100-200 und y: 10-110. Um den Mittelpunkt zu berechnen rechnest du die Koordinaten zusammen und teilst sie dann durch 2: 100+200=300 und 300/2 = 150, 10 + 110 = 120 und 120/2 = 60
also ist der Mittelpunkt bei x = 150 und y = 60 (Du musst das dann auch noch für z machen) und den Rest mache ich jetzt einfach in Code:
Code:
Location mittelpunkt =  new Location(world, 150, 60, z//Deine Z-Koordinate);
Location playerLoc = e.getPlayer().getLocation();

                double ax = mittelpunkt.getX();
                double ay = mittelpunkt.getY();
                double az = mittelpunkt.getZ();
                double bx = playerLoc.getX();
                double by = playerLoc.getY();
                double bz = playerLoc.getZ();
                double vx = ax - bx;
                double vy = ay - by;
                double vz = az - bz;
                if (away.contains(p.getName()) == false) { //away ist eine ArrayList inder der Spielername gespeichert
                Vector vec = new Vector(vx, vy, vz); //wird
                vec.normalize();
                vec.multiply(-2);
                p.sendMessage(Double.toString( vec.getX())); //debug
                p.setVelocity(vec);
                away.add(p.getName());
                }
                Bukkit.getScheduler().scheduleSyncDelayedTask(main, new Runnable() {

                @Override
                public void run() {
                away.remove(p.getName());

                }
                }, 5); //5 = 5 Ticks bis ein Spieler wieder zurückgeworfen werden kann
Dadurch, dass nun der Mittelpunkt als Location genommen wird, ist es egal ob der Spieler bereits in der Zone ist und dann hin und her geschleudert wird. Denn wiegesagt die eine Location ist nun der Mittelpunkt.

Glaube habe das ein bisschen blöd erklärt, wenn du fragen hast dann frag einfach :D
 
Zuletzt bearbeitet:
  • Like
Reaktionen: adagi
Es funktioiert perfekt :like::like::like:!
Ich bin mit einen Hackclient (den ich eigentlich nur dafür verwende Cracked Accounts zu erstellen um Plugins zu mit mehreren testen) in das Gebiet geflogen wobei man nicht weggeschleudert wird, habe Flightdeaktiviert und habe mich bewegt. Wie erwartet bin ich prefekt herausgeschleudert worden:). Wozu Hacks alles gut sein können :D.
Auf jeden Fall danke für deine Hilfe, war echt eine super Idee :like:. Hier ist jetzt noch der fertige Code:
Code:
List<String> away = new ArrayList<String>();
    @EventHandler
    public void onwalk(PlayerMoveEvent pme){
        Player p = pme.getPlayer();
        double x = p.getLocation().getX();
        double z = p.getLocation().getZ();
        String ib = inBase(x, z, p.getName());
        if(p.isOp() == false){
           
            if(!ib.equals("false") ){

                 p.sendMessage("§4STOOOOOOOOOOP! ");
                 p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_DESTROY, 10, 0);
                 p.playEffect(p.getLocation(), Effect.EXPLOSION_HUGE, null);
                   
                 
                Location to = null;
                if (ib.equals("red")) {
                    to = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Red.1.world")), (main.getConfig().getDouble("MPlac.Walls.Red.1.x") + main.getConfig().getDouble("MPlac.Walls.Red.2.x")) /2 , 0, (main.getConfig().getDouble("MPlac.Walls.Red.1.z") + main.getConfig().getDouble("MPlac.Walls.Red.2.z")) / 2);
                }else if (ib.equals("blue")) {
                    to = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Blue.1.world")), (main.getConfig().getDouble("MPlac.Walls.Blue.1.x") + main.getConfig().getDouble("MPlac.Walls.Blue.2.x")) /2 , 0, (main.getConfig().getDouble("MPlac.Walls.Blue.1.z") + main.getConfig().getDouble("MPlac.Walls.Blue.2.z")) / 2);
                }else if (ib.equals("green")) {
                    to = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Green.1.world")), (main.getConfig().getDouble("MPlac.Walls.Green.1.x") + main.getConfig().getDouble("MPlac.Walls.Green.2.x")) /2 , 0, (main.getConfig().getDouble("MPlac.Walls.Green.1.z") + main.getConfig().getDouble("MPlac.Walls.Green.2.z")) / 2);
                }else if (ib.equals("yellow")) {
                    to = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Yellow.1.world")), (main.getConfig().getDouble("MPlac.Walls.Yellow.1.x") + main.getConfig().getDouble("MPlac.Walls.Yellow.2.x")) /2 , 0, (main.getConfig().getDouble("MPlac.Walls.Yellow.1.z") + main.getConfig().getDouble("MPlac.Walls.Yellow.2.z")) / 2);
                }
                Location from = pme.getFrom(); //könnte man jetzt auf einfach p.getlocation verwenden
                double ax = to.getX();
                double ay = to.getY();
                double az = to.getZ();
                double bx = from.getX();
                double by = from.getY();
                double bz = from.getZ();
                double vx = ax - bx;
                double vy = ay - by;
                double vz = az - bz;
                if (away.contains(p.getName()) == false) {
                    Vector vec = new Vector(vx, -2, vz);
                    vec.normalize();
                    vec.multiply(-2);
                    p.setVelocity(vec);
                    away.add(p.getName());
                   
                }
                Bukkit.getScheduler().scheduleSyncDelayedTask(main, new Runnable() {
                    @Override public void run() {away.remove(p.getName());}
                    }, 5);
               
            }
        }
    }
   
    private String inBase(double x, double z, String name){
        Scoreboard board = Bukkit.getScoreboardManager().getMainScoreboard();
       
        try {
            String teamname = board.getEntryTeam(name).getName();
            Location R1 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Red.1.world")), main.getConfig().getDouble("MPlac.Walls.Red.1.x"), 0, main.getConfig().getDouble("MPlac.Walls.Red.1.z"));
            Location R2 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Red.2.world")), main.getConfig().getDouble("MPlac.Walls.Red.2.x"), 0, main.getConfig().getDouble("MPlac.Walls.Red.2.z"));
            Location B1 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Blue.1.world")), main.getConfig().getDouble("MPlac.Walls.Blue.1.x"), 0, main.getConfig().getDouble("MPlac.Walls.Blue.1.z"));
            Location B2 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Blue.2.world")), main.getConfig().getDouble("MPlac.Walls.Blue.2.x"), 0, main.getConfig().getDouble("MPlac.Walls.Blue.2.z"));
            Location G1 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Green.1.world")), main.getConfig().getDouble("MPlac.Walls.Green.1.x"), 0, main.getConfig().getDouble("MPlac.Walls.Green.1.z"));
            Location G2 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Green.2.world")), main.getConfig().getDouble("MPlac.Walls.Green.2.x"), 0, main.getConfig().getDouble("MPlac.Walls.Green.2.z"));
            Location Y1 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Yellow.1.world")), main.getConfig().getDouble("MPlac.Walls.Yellow.1.x"), 0, main.getConfig().getDouble("MPlac.Walls.Yellow.1.z"));
            Location Y2 = new Location(main.getServer().getWorld(main.getConfig().getString("MPlac.Walls.Yellow.2.world")), main.getConfig().getDouble("MPlac.Walls.Yellow.2.x"), 0, main.getConfig().getDouble("MPlac.Walls.Yellow.2.z"));
            if (x > R1.getX() & x < R2.getX() & z > R1.getZ() & z < R2.getZ()) {           
                if (teamname.equalsIgnoreCase("red") & x > R1.getX() & x < R2.getX() & z > R1.getZ() & z < R2.getZ()) {               
                    return "false";   
                }else{
                return "red";
                }
            }
            if (x > B1.getX() & x < B2.getX() & z > B1.getZ() & z < B2.getZ()) {
               
                if (teamname.equalsIgnoreCase("blue") & x > B1.getX() & x < B2.getX() & z > B1.getZ() & z < B2.getZ()) {
               
                    return "false";   
                }else{
                return "blue";
                }
            }
            if (x > G1.getX() & x < G2.getX() & z > G1.getZ() & z < G2.getZ()) {
               
                if (teamname.equalsIgnoreCase("green") & x > G1.getX() & x < G2.getX() & z > G1.getZ() & z < G2.getZ()) {
               
                    return "false";   
                }else{
                return "green";
                }
            }
            if (x > Y1.getX() & x < Y2.getX() & z > Y1.getZ() & z < Y2.getZ()) {
               
                if (teamname.equalsIgnoreCase("yellow") & x > Y1.getX() & x < Y2.getX() & z > Y1.getZ() & z < Y2.getZ()) {
               
                    return "false";   
                }else{
                return "yellow";
                }
            }
        } catch (Exception e) {
           
        }
       
       
        return "false";
       
    }
 
Freut mich, dass ich helfen konnte. Kleiner Tipp: Anstatt "if(p.isOp() == false)" kann man auch if(!p.isOp()) schreiben. Wenn du ein großes Plugin schreibst, kannst du dir so ein bisschen Arbeit sparen, allerding ist das egal man kann es auch machen wie du. Es kommt das selbe bei raus :D
 
Status
Für weitere Antworten geschlossen.

Soziale Medien

  • X
  • TikTok

Über uns

  • GommeHD.net ist einer der größten Minecraft-Server der Welt. Dir gefällt unser Server? Dann unterstütze uns durch einen Kauf im Shop!
  • Shop