• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Einem Spieler soll das Springen nur alle 2 sec möglich sein

JoKer96

Redstoneengineer
Registriert
9 März 2014
Beiträge
40
Diamanten
302
Minecraft
JoKer96
Hallo liebe Community,

ich hänge nun schon seit längeren an einem Problem in meinen Plugin fest; ein Spieler, der in einer ArrayList eingetragen ist, soll nur alle 2 sec springen können!
Fehlermeldungen sind nicht bekannt. Dennoch scheint der Code fehlerhaft zu sein, bzw ich habe einen Fehler, den ich nicht finden kann, obwohl der Debugg ausgegeben wird!

Vielleicht kann mir einer von euch helfen?


Hier der Code:

Code:
package de.PixelCrafter.Listener;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;

import de.PixelCrafter.Main.MainPlugin;
import de.PixelCrafter.Manager.StatusManager;

public class MoveListener implements Listener
{
    @EventHandler
    public void onMove(PlayerMoveEvent e)
    {
        Player p = e.getPlayer();
     
        if(MainPlugin.limitedJumps.contains(p))
        {
            if(e.getTo().getY() >= e.getPlayer().getLocation().getY())
            {
                if(MainPlugin.cooldown_jump.contains(p))
                {
                    System.out.println("Piep"); //dient als Debugg
                    e.getTo().setY(p.getLocation().getY());
                }
                else
                {
                    MainPlugin.cooldown_jump.add(p);
                    cooldown(p);
                }
            }
        }
    }
 
    protected static void cooldown(final Player p)
    {
        Bukkit.getScheduler().scheduleSyncDelayedTask(MainPlugin.getInstance(), new Runnable()
        {
            public void run()
            {
                MainPlugin.cooldown_jump.remove(p);
            }
        }, 40L);
    }
}

Natürlich habe ich das Event in der Hauptklasse im 'onEnable'-Teil registriert und die ArrayLists definiert.
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Ein Weiterer Vorschlag von mir wäre,
der wahrscheinlich um einiges Einfacher ist,
das der Spieler nach jedem Sprung den Jump Boost Effekt für 2 sek auf stufe 255 bekommt,
da kann man in der Regel auch nicht mehr springen.
 

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
Ein Weiterer Vorschlag von mir wäre,
der wahrscheinlich um einiges Einfacher ist,
das der Spieler nach jedem Sprung den Jump Boost Effekt für 2 sek auf stufe 255 bekommt,
da kann man in der Regel auch nicht mehr springen.

Was ist das denn für ein Plan ? Damit klatscht du den Spieler nur gegen ein eventuelles Anticheatplugin und lässt ihn am Ende noch bannen. Außerdem ist das aus programmiertechnischer Sicht absoluter Schwachsinn.
 

JoKer96

Redstoneengineer
Registriert
9 März 2014
Beiträge
40
Diamanten
302
Minecraft
JoKer96
@minecraftboy :
minecraftboy schrieb:
Fehler in der Konsole?
Zeile 5, am Anfang:
Joans96 schrieb:
Fehlermeldungen sind nicht bekannt
Schlüsselqualifikation lesen sollte genutzt werden!


@Sasuke :
Erstmal vielen dank, dass du dich meinem Problem annimmst.

Sasuke schrieb:
Und wenn er schwimmt ?
Wenn ein Spieler Schwimmt, wird das ganze auf jeden Fall außer kraft gesetzt,
nur habe ich die dementsprechende abfrage erst nach dem Post dieses Threads eingefügt!

Sasuke schrieb:
Das return eine Location, die du nicht einmal benutzt.
Ups, sowas passiert mir ab und an mal....

Sasuke schrieb:
Was passiert wenn der Spieler zwischendurch den Server verlässt ?
Da der Code für ein Minispiel genutzt wird, ist es klar, dass dann der Spieler nicht mehr den Server betreten kann,
ehe das Spiel neu gestartet hat, somit ist dies nicht relevant.

Sasuke schrieb:
Ich bin etwas müde aber hier ist ne Idee:
Danke dafür, ich werde das ganze direkt mal ausprobieren...

@JTK222 :
JTK222 schrieb:
Ein Weiterer Vorschlag von mir wäre,
der wahrscheinlich um einiges Einfacher ist,
das der Spieler nach jedem Sprung den Jump Boost Effekt für 2 sek auf stufe 255 bekommt,
da kann man in der Regel auch nicht mehr springen.
Ist in der Tat einfacher, aber da ich NoCheatPlus ebenfalls auf dem Server laufen lasse, auf dem das Plugin läuft,
würde der Spieler direkt getickt werden, sobald er die Sprung-taste drückt!
Trotzdem danke für deinen Vorschlag!
 
Zuletzt bearbeitet von einem Moderator:

JoKer96

Redstoneengineer
Registriert
9 März 2014
Beiträge
40
Diamanten
302
Minecraft
JoKer96
@Sasuke :
Der Code funktioniert nicht!
Ich habe das ganze umfangreich getestet und muss feststellen, das das 'PlayerVelocityEvent' nicht beim springen eines Spielers gefeuert wird, von daher kann ich das ganze nicht benutzen!

Gäbe es alternativen?
 

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
Upsala ich hab das tatsächlich falsch übersetzt oO ^^ Tut mir leid:)

Code:
e.getTo().setY(p.getLocation().getY());
Hast du das geändert ? Das war ja der eigentliche Fehler.


Hab meins mal geändert

Code:
private ArrayList<UUID> limitedJumps = new ArrayList< UUID >(  );
    private ArrayList<UUID> cooldown = new ArrayList< UUID >(  );

    @EventHandler
    public void onJump(final PlayerMoveEvent e){
        if(e.getFrom().getY() < e.getTo().getY()){
            if(limitedJumps.contains( e.getPlayer().getUniqueId() )){
                if(cooldown.contains( e.getPlayer().getUniqueId() )){
                    e.setCancelled( true );
                }else{
                    cooldown.add( e.getPlayer().getUniqueId() );

                    Bukkit.getScheduler().runTaskLater( Server.getPlugin(), new Runnable() {
                        @Override
                        public void run( ){
                            if(cooldown.contains( e.getPlayer().getUniqueId() ))
                                cooldown.remove( e.getPlayer().getUniqueId() );
                        }
                    }, 40L );
                }
            }
        }
    }
 
Zuletzt bearbeitet:

JoKer96

Redstoneengineer
Registriert
9 März 2014
Beiträge
40
Diamanten
302
Minecraft
JoKer96
Das wird auch nicht funktionieren, da du das komplette PlayerMoveEvent cancelst!

Ich habe es mir ja so vorgestellt, dass wen ein Spieler z.B. läuft und währenddessen springt, um einen SlownessEffekt zu umgehen,zwar weiter läuft aber nicht springen kann...

Hier mal das, was ich bis jetzt zusammengeschrieben habe:

Code:
package de.PixelCrafter.Listener;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;

import de.PixelCrafter.Main.MainPlugin;

public class NoJumpListener implements Listener
{
    @EventHandler
    public void onJump(PlayerMoveEvent e)
    {
        Player p = e.getPlayer();
      
        double fromY = e.getFrom().getY();
        double toY = e.getTo().getY();
      
        if(fromY <= toY)
        {
            double step = fromY + 0.5;
          
            if(step == toY)
            {
                return;
            }
            // Der Spieler soll Stufen hoch laufen können!!!
          
            else
            {
                if(MainPlugin.cooldown_jump.contains(p))
                {
                    e.getTo().setY(e.getFrom().getY());
                   // Hier ist dir Frage, ob, bzw wie mal die Y-Koordinate gleich lässt...
                    p.sendMessage("§cKein Sprung!");
                  
                    return;
                }
                else
                {
                    p.sendMessage("§eSprung!");
                  
                    cooldown(p);
                  
                    return;
                }
            }
        }
    }
  
    protected void cooldown(final Player p)
    {
        Bukkit.getScheduler().scheduleSyncDelayedTask(MainPlugin.getInstance(), new Runnable()
        {
            public void run()
            {
                MainPlugin.cooldown_jump.remove(p);
            }
        }, 40L);
    }
}

Und nein, ich habe noch keine Lösung für diesen Fehler gefunden...
Code:
e.getTo().setY(e.getFrom().getY());
 

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
Dir ist aber klar, dass man damit ganz schön durch die Gegend buggen/laggen wird (im sinne von "stolpern" ?

Code:
private ArrayList<UUID> limitedJumps = new ArrayList< UUID >(  );
    private ArrayList<UUID> cooldown = new ArrayList< UUID >(  );

    @EventHandler
    public void onJump(final PlayerMoveEvent e){
        if(e.getFrom().getY() < e.getTo().getY()){
            if(limitedJumps.contains( e.getPlayer().getUniqueId() )){
                if(cooldown.contains( e.getPlayer().getUniqueId() )){

                    Location newLocTo = e.getTo();
                    newLocTo.setY( e.getFrom().getY() );
                   
                    e.setTo( newLocTo );
                }else{
                    cooldown.add( e.getPlayer().getUniqueId() );

                    Bukkit.getScheduler().runTaskLater( Server.getPlugin(), new Runnable() {
                        @Override
                        public void run( ){
                            if(cooldown.contains( e.getPlayer().getUniqueId() ))
                                cooldown.remove( e.getPlayer().getUniqueId() );
                        }
                    }, 40L );
                }
            }
        }
    }
 

LordKaktus

Kuhfänger
Registriert
31 Dezember 2014
Beiträge
66
Diamanten
0
Negative PotionEffects? Noch nie gehört!

Nein, ich würde das ganze gerne ohne PotionEffects machen!

Warum willst du es nicht mit einem Potion-effekt lösen? wenn das möglich ist, brauchst du keinen Scheduler. Zudem hast du nicht diesen nervigen zurück-setz-effekt beim spielen, weil er es normal über den clienten schon garnicht zulassen würde.

BTW: wenn du mit "Block" anstatt "Material" arbeiten würdest könntest du statt:
"if(!(underPlayer.equals(Material.WATER) || underPlayer.equals(Material.STATIONARY_WATER)) && !(inPlayer.equals(Material.WATER) || inPlayer.equals(Material.STATIONARY_WATER)))"
einfach: "if(!(underPlayer.isLiquid) && !(inPlayer.isLiquid)" nutzen, dass würde auch lava einschließen, bei der man ansonsten auch event. probleme hätte

//Edit
Code:
  @EventHandler
   public void onJump(PlayerMoveEvent e)
   {
     Player p = e.getPlayer();
     
     Block underPlayer = e.getPlayer().getLocation().add(new Vector(0, -1, 0)).getBlock();
     Block inPlayer = e.getPlayer().getLocation().add(new Vector(0, 0, 0)).getBlock();
         
     if(!(underPlayer.isLiquid()) && !(inPlayer.isLiquid()));
     {
       double fromY = e.getFrom().getY();
       double toY = e.getTo().getY();
       
       if(fromY < toY){
         double step = fromY + 0.5;
         if((step > toY)){
           p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 40,-2));   
         }
       }
     }
   }
funktioniert wunderbar ;)
lG
 
Zuletzt bearbeitet:

JoKer96

Redstoneengineer
Registriert
9 März 2014
Beiträge
40
Diamanten
302
Minecraft
JoKer96
LordKaktus schrieb:
BTW: wenn du mit "Block" anstatt "Material" arbeiten würdest könntest du statt:
"if(!(underPlayer.equals(Material.WATER) || underPlayer.equals(Material.STATIONARY_WATER)) && !(inPlayer.equals(Material.WATER) || inPlayer.equals(Material.STATIONARY_WATER)))"
einfach: "if(!(underPlayer.isLiquid) && !(inPlayer.isLiquid)" nutzen, dass würde auch lava einschließen, bei der man ansonsten auch event. probleme hätte

Man hört nie auf zu lernen ;), danke für den Tipp!

Okey, wenn man es nur aus sicht des springen sieht, geht es. Aber (und das ist das, was ich damit unterbinden will(!!!!)) mann kann immer noch dem "Boost" vom Sprung nutzen! Mit dem effekt ist es ähnlich, als würde man direkt unter Blöcken laufen und dann die Sprungtaste spamen.
Das ist nicht das was ich suche!
Trotzdem danke an dich @LordKaktus !

Was ich suche, ist wie es z.B. auf dem Server "play.hivemc.com" im Minispiel "BlockParty" gemacht wird (Dort gibt es ein "PowerUp", welches exakt das bewirkt, was ich gerne umsetzen möchte!)
Ein anderes Beispiel wäre das Plugin "MinigamesParty", in dem es bei dem Minispiel "DeadEnd" ebenfalls das umgesetzt wurde, was ich mir vorstelle...

Ich habe letzteres mit dem jd-gui geöffnet und mal nach dem dementsprechenden Code geschaut...
Das kahm dabei heraus:
Code:
Bukkit.getScheduler().runTaskTimer(m, new Runnable()
    {
      public void run()
      {
        for (String p_ : DeadEnd.m.players)
        {
          Player p = Bukkit.getPlayer(p_);
          if ((p.isOnline()) &&
            (!DeadEnd.this.lost.contains(p)))
          {
            Location l_ = p.getLocation();
            l_.setPitch(0.0F);
            Vector dir = l_.getDirection().normalize().multiply(0.5D);
            Vector dir_ = new Vector(dir.getX(), 0.0001D, dir.getZ());
            p.setVelocity(dir_);
          
            Vector v = p.getLocation().getDirection().normalize();
            Location localLocation1 = p.getLocation().subtract(new Vector(v.getX(), 0.0001D, v.getZ()).multiply(-1.0D));
          }
        }
      }
    }, 3L, 3L);

Das ganze sieht jetzt bei mir so aus:
Code:
@EventHandler
    public void onJump(PlayerMoveEvent e)
    {
        Player p = e.getPlayer();
      
        Block underPlayer = e.getPlayer().getLocation().add(new Vector(0, -1, 0)).getBlock();
        Block inPlayer = e.getPlayer().getLocation().add(new Vector(0, 0, 0)).getBlock();
              
        if(!(underPlayer.isLiquid()) && !(inPlayer.isLiquid()))
        {
            double fromY = e.getFrom().getY();
            double toY = e.getTo().getY();
          
            if(fromY < toY)
            {
                double step = fromY + 0.5;
              
                if(!(step == toY))
                {
                    p.sendMessage("Jump!");
                  
                    Location l_ = p.getLocation();
                    l_.setPitch(0.0F);
                    Vector dir = l_.getDirection().normalize().multiply(0.4D);
                    Vector dir_ = new Vector(dir.getX(), 0.0D, dir.getZ());
                    p.setVelocity(dir_);
                    
                    Vector v = p.getLocation().getDirection().normalize();
                    Location localLocation1 = p.getLocation().subtract(new Vector(v.getX(), 0.0D, v.getZ()));
                    e.setTo(localLocation1);
                    return;
                }
                else
                {
                    return;
                }
            }
            else
            {
                return;
            }
        }
        else
        {
            return;
        }
    }

Nur ruckelt das so stark, wenn man springt, dass es nicht mehr schön ist!


Ist es nicht möglich die Pakete vom Client abzufangen und dort dann das ganze so zu verändern, dass das Springen der Sprungtaste einfach rausgelöscht wird?
Ich kenne mich leider nicht mit den Paketen aus, aber vielleicht einer von euch?
 
Zuletzt bearbeitet:
Oben