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

Dieses Thema im Forum "Programmierung" wurde erstellt von Joans96, 27. Dezember 2014.

  1. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    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 (Text):
    1.  
    2. package de.PixelCrafter.Listener;
    3.  
    4. import org.bukkit.Bukkit;
    5. import org.bukkit.entity.Player;
    6. import org.bukkit.event.EventHandler;
    7. import org.bukkit.event.Listener;
    8. import org.bukkit.event.player.PlayerMoveEvent;
    9.  
    10. import de.PixelCrafter.Main.MainPlugin;
    11. import de.PixelCrafter.Manager.StatusManager;
    12.  
    13. public class MoveListener implements Listener
    14. {
    15.     @EventHandler
    16.     public void onMove(PlayerMoveEvent e)
    17.     {
    18.         Player p = e.getPlayer();
    19.      
    20.         if(MainPlugin.limitedJumps.contains(p))
    21.         {
    22.             if(e.getTo().getY() >= e.getPlayer().getLocation().getY())
    23.             {
    24.                 if(MainPlugin.cooldown_jump.contains(p))
    25.                 {
    26.                     System.out.println("Piep"); //dient als Debugg
    27.                     e.getTo().setY(p.getLocation().getY());
    28.                 }
    29.                 else
    30.                 {
    31.                     MainPlugin.cooldown_jump.add(p);
    32.                     cooldown(p);
    33.                 }
    34.             }
    35.         }
    36.     }
    37.  
    38.     protected static void cooldown(final Player p)
    39.     {
    40.         Bukkit.getScheduler().scheduleSyncDelayedTask(MainPlugin.getInstance(), new Runnable()
    41.         {
    42.             public void run()
    43.             {
    44.                 MainPlugin.cooldown_jump.remove(p);
    45.             }
    46.         }, 40L);
    47.     }
    48. }
    49.  

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

    minecraftboy

    Registriert seit:
    28. September 2012
    Beiträge:
    336
    Ort:
    NRW
    Minecraft:
    gamemaster1511
    Fehler in der Konsole?
     
    #2
  3. JTK222
    Offline

    JTK222

    Registriert seit:
    5. September 2013
    Beiträge:
    665
    Ort:
    Planet Erde
    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.
     
    #3
  4. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    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.
     
    #4
    Spamversender gefällt das.
  5. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    @minecraftboy :
    Zeile 5, am Anfang:
    Schlüsselqualifikation lesen sollte genutzt werden!


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

    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!

    Ups, sowas passiert mir ab und an mal....

    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.

    Danke dafür, ich werde das ganze direkt mal ausprobieren...

    @JTK222 :
    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!
     
    #5
  6. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    @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?
     
    #6
  7. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Upsala ich hab das tatsächlich falsch übersetzt oO ^^ Tut mir leid:)

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


    Hab meins mal geändert

    Code (Text):
    1. private ArrayList<UUID> limitedJumps = new ArrayList< UUID >(  );
    2.     private ArrayList<UUID> cooldown = new ArrayList< UUID >(  );
    3.  
    4.     @EventHandler
    5.     public void onJump(final PlayerMoveEvent e){
    6.         if(e.getFrom().getY() < e.getTo().getY()){
    7.             if(limitedJumps.contains( e.getPlayer().getUniqueId() )){
    8.                 if(cooldown.contains( e.getPlayer().getUniqueId() )){
    9.                     e.setCancelled( true );
    10.                 }else{
    11.                     cooldown.add( e.getPlayer().getUniqueId() );
    12.  
    13.                     Bukkit.getScheduler().runTaskLater( Server.getPlugin(), new Runnable() {
    14.                         @Override
    15.                         public void run( ){
    16.                             if(cooldown.contains( e.getPlayer().getUniqueId() ))
    17.                                 cooldown.remove( e.getPlayer().getUniqueId() );
    18.                         }
    19.                     }, 40L );
    20.                 }
    21.             }
    22.         }
    23.     }
     
    #7
  8. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    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 (Text):
    1.  
    2. package de.PixelCrafter.Listener;
    3.  
    4. import org.bukkit.Bukkit;
    5. import org.bukkit.entity.Player;
    6. import org.bukkit.event.EventHandler;
    7. import org.bukkit.event.Listener;
    8. import org.bukkit.event.player.PlayerMoveEvent;
    9.  
    10. import de.PixelCrafter.Main.MainPlugin;
    11.  
    12. public class NoJumpListener implements Listener
    13. {
    14.     @EventHandler
    15.     public void onJump(PlayerMoveEvent e)
    16.     {
    17.         Player p = e.getPlayer();
    18.      
    19.         double fromY = e.getFrom().getY();
    20.         double toY = e.getTo().getY();
    21.      
    22.         if(fromY <= toY)
    23.         {
    24.             double step = fromY + 0.5;
    25.          
    26.             if(step == toY)
    27.             {
    28.                 return;
    29.             }
    30.             // Der Spieler soll Stufen hoch laufen können!!!
    31.          
    32.             else
    33.             {
    34.                 if(MainPlugin.cooldown_jump.contains(p))
    35.                 {
    36.                     e.getTo().setY(e.getFrom().getY());
    37.                    // Hier ist dir Frage, ob, bzw wie mal die Y-Koordinate gleich lässt...
    38.                     p.sendMessage("§cKein Sprung!");
    39.                  
    40.                     return;
    41.                 }
    42.                 else
    43.                 {
    44.                     p.sendMessage("§eSprung!");
    45.                  
    46.                     cooldown(p);
    47.                  
    48.                     return;
    49.                 }
    50.             }
    51.         }
    52.     }
    53.  
    54.     protected void cooldown(final Player p)
    55.     {
    56.         Bukkit.getScheduler().scheduleSyncDelayedTask(MainPlugin.getInstance(), new Runnable()
    57.         {
    58.             public void run()
    59.             {
    60.                 MainPlugin.cooldown_jump.remove(p);
    61.             }
    62.         }, 40L);
    63.     }
    64. }
    65.  
    66.  
    Und nein, ich habe noch keine Lösung für diesen Fehler gefunden...
    Code (Text):
    1.  
    2. e.getTo().setY(e.getFrom().getY());
    3.  
     
    #8
  9. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Dir ist aber klar, dass man damit ganz schön durch die Gegend buggen/laggen wird (im sinne von "stolpern" ?

    Code (Text):
    1. private ArrayList<UUID> limitedJumps = new ArrayList< UUID >(  );
    2.     private ArrayList<UUID> cooldown = new ArrayList< UUID >(  );
    3.  
    4.     @EventHandler
    5.     public void onJump(final PlayerMoveEvent e){
    6.         if(e.getFrom().getY() < e.getTo().getY()){
    7.             if(limitedJumps.contains( e.getPlayer().getUniqueId() )){
    8.                 if(cooldown.contains( e.getPlayer().getUniqueId() )){
    9.  
    10.                     Location newLocTo = e.getTo();
    11.                     newLocTo.setY( e.getFrom().getY() );
    12.                    
    13.                     e.setTo( newLocTo );
    14.                 }else{
    15.                     cooldown.add( e.getPlayer().getUniqueId() );
    16.  
    17.                     Bukkit.getScheduler().runTaskLater( Server.getPlugin(), new Runnable() {
    18.                         @Override
    19.                         public void run( ){
    20.                             if(cooldown.contains( e.getPlayer().getUniqueId() ))
    21.                                 cooldown.remove( e.getPlayer().getUniqueId() );
    22.                         }
    23.                     }, 40L );
    24.                 }
    25.             }
    26.         }
    27.     }
     
    #9
  10. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    Das werde ich jetzt erstmal testen, ich melde mich, wenn ich mehr weis...
     
    #10
  11. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    #11
  12. Premx™
    Offline

    Premx™

    Registriert seit:
    25. Oktober 2014
    Beiträge:
    12
    Ort:
    Germany
    Minecraft:
    Dr_Premx
    wieso nicht einfach PotionEffect?
    nach einem Sprung gibst du einfach für 2 Sek. Jump im negativ Bereich.
     
    #12
  13. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    Negative PotionEffects? Noch nie gehört!

    Nein, ich würde das ganze gerne ohne PotionEffects machen!
     
    #13
  14. LordKaktus
    Offline

    LordKaktus

    Registriert seit:
    31. Dezember 2014
    Beiträge:
    66
    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 (Text):
    1.  
    2.   @EventHandler
    3.    public void onJump(PlayerMoveEvent e)
    4.    {
    5.      Player p = e.getPlayer();
    6.      
    7.      Block underPlayer = e.getPlayer().getLocation().add(new Vector(0, -1, 0)).getBlock();
    8.      Block inPlayer = e.getPlayer().getLocation().add(new Vector(0, 0, 0)).getBlock();
    9.          
    10.      if(!(underPlayer.isLiquid()) && !(inPlayer.isLiquid()));
    11.      {
    12.        double fromY = e.getFrom().getY();
    13.        double toY = e.getTo().getY();
    14.        
    15.        if(fromY < toY){
    16.          double step = fromY + 0.5;
    17.          if((step > toY)){
    18.            p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 40,-2));  
    19.          }
    20.        }
    21.      }
    22.    }
    23.  
    funktioniert wunderbar ;)
    lG
     
    #14
  15. Joans96
    Offline

    Joans96

    Registriert seit:
    9. März 2014
    Beiträge:
    37
    Minecraft:
    Joans96
    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 (Text):
    1.  
    2. Bukkit.getScheduler().runTaskTimer(m, new Runnable()
    3.     {
    4.       public void run()
    5.       {
    6.         for (String p_ : DeadEnd.m.players)
    7.         {
    8.           Player p = Bukkit.getPlayer(p_);
    9.           if ((p.isOnline()) &&
    10.             (!DeadEnd.this.lost.contains(p)))
    11.           {
    12.             Location l_ = p.getLocation();
    13.             l_.setPitch(0.0F);
    14.             Vector dir = l_.getDirection().normalize().multiply(0.5D);
    15.             Vector dir_ = new Vector(dir.getX(), 0.0001D, dir.getZ());
    16.             p.setVelocity(dir_);
    17.          
    18.             Vector v = p.getLocation().getDirection().normalize();
    19.             Location localLocation1 = p.getLocation().subtract(new Vector(v.getX(), 0.0001D, v.getZ()).multiply(-1.0D));
    20.           }
    21.         }
    22.       }
    23.     }, 3L, 3L);
    24.  

    Das ganze sieht jetzt bei mir so aus:
    Code (Text):
    1.  
    2. @EventHandler
    3.     public void onJump(PlayerMoveEvent e)
    4.     {
    5.         Player p = e.getPlayer();
    6.      
    7.         Block underPlayer = e.getPlayer().getLocation().add(new Vector(0, -1, 0)).getBlock();
    8.         Block inPlayer = e.getPlayer().getLocation().add(new Vector(0, 0, 0)).getBlock();
    9.              
    10.         if(!(underPlayer.isLiquid()) && !(inPlayer.isLiquid()))
    11.         {
    12.             double fromY = e.getFrom().getY();
    13.             double toY = e.getTo().getY();
    14.          
    15.             if(fromY < toY)
    16.             {
    17.                 double step = fromY + 0.5;
    18.              
    19.                 if(!(step == toY))
    20.                 {
    21.                     p.sendMessage("Jump!");
    22.                  
    23.                     Location l_ = p.getLocation();
    24.                     l_.setPitch(0.0F);
    25.                     Vector dir = l_.getDirection().normalize().multiply(0.4D);
    26.                     Vector dir_ = new Vector(dir.getX(), 0.0D, dir.getZ());
    27.                     p.setVelocity(dir_);
    28.                    
    29.                     Vector v = p.getLocation().getDirection().normalize();
    30.                     Location localLocation1 = p.getLocation().subtract(new Vector(v.getX(), 0.0D, v.getZ()));
    31.                     e.setTo(localLocation1);
    32.                     return;
    33.                 }
    34.                 else
    35.                 {
    36.                     return;
    37.                 }
    38.             }
    39.             else
    40.             {
    41.                 return;
    42.             }
    43.         }
    44.         else
    45.         {
    46.             return;
    47.         }
    48.     }
    49.  

    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?
     
    #15