ServerPlugin SignJoinPlayer

Dieses Thema im Forum "Programmierung" wurde erstellt von xxProgramerx, 26. März 2014.

  1. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    Heyy Leute

    Ich bin gerade dabei ein ffa plugin zu programmieren! Alles hat gut geklappt bis das signjoin kam! Alles klappt auch das teleportieren wenn man rechtsklick macht, nur nicht die anzhal der spieler, die gejoint sind!
    Also: x/25
    Somit hätte ich gerne ein paar tipps oder wenn möglich auch den code wie man das macht, dass wenn jemand joint x + 1 ist und wenn jemand leavt x - 1. zudem sollen natürlich auch nicht mehr als 25 spieler joinen!

    Bitte hilfe!
    Mfg
     
    #1
  2. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Du musst einfach veim Interactevent ueberpruefen, ob die Zahl aller inGamespieler 25 bzw kleiner ist. Danach zaehlst du x+1 und holst dir das Schild. Dann setz du die entsprechende Zeile auf "["+x+"/"+"25]" und updatest das Schild. Umgekehrt zaehlst du sie runter.:Wenn jemand die arena leavt setzt du die Variable zurueck und updatest das Schild. Aber ich wuerd mir aich ne boolean "Joinable" machen. So kannst du noch einfacher sagen ob jemabd joinen darf, weil sonst kann es passieren, dass jemand in ein laufendes Spiel stolpert
     
    #2
  3. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    Danke als erstes mal für die antwort!

    So habe ich es aber leider schon probiert und wenn die arena voll war, dann ging die spielerzahlt nicht mehr runter!
    Wie kann ich zudem machen, dass ich auch außerhalb des signevents das schild updaten kann?

    Mfg
     
    #3
  4. [Dev] iTzSasukeHDxLP
    Offline

    [Dev] iTzSasukeHDxLP Ehem. Teammitglied

    Registriert seit:
    5. Januar 2014
    Beiträge:
    938
    Du hast das Schild beim Interactevent doch in ner Variable gespeichert, hols dir einfach bzw. Uebergib es an die jeweilige Methode.
     
    #4
  5. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    Oke.. Sollte klappen (bin gerade nich am pc) aber wieso zählt x nicht mehr einen runter, wenn die spieleranzahl voll ist! Also 25/25 oder 20/20?
    könnte dir der script da vlt. Weiterhelfen? Wenn ja kann ich ihn dir heute abend schicken :)

    MFG
     
    #5
  6. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Den Code hier zu posten, wäre wirklich sinnvoll, um dir weiter zu helfen.
     
    #6
  7. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Leg dir eine HashMap an in deiner Main class , diese lässt du per Methode ausgeben.
    zB so in etwa :

    Code (Text):
    1.  
    2.  
    3. private HashMap<String, Integer> _playerHash = new HashMap<>();
    4.  
    5. public HashMap<String, Integer> getOnlineHash() {
    6. return _playerHash;
    7. }
    8.  
    Nun kannst du diese im PlayerInteract Event abrufen , fragen wieviele drin sind und ggf einen beifügen oder es eben lassen.

    Nun musst du in deinem Verlassen des Events natürlich den spieler immer wieder daraus streichen.
    So hast du Public zugriff dadrauf,
     
    #7
  8. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Warum sollte man die Spieler als String speichern? Man kann auch gleich den Spieler Speichern.
    Code (Text):
    1. HashMap<Player, Integer>
    -
    Wozu braucht man überhaupt ein Integer für jeden Spieler? Am einfachsten ist es, wenn man die Spieler in einer List<Player> abspeichert. Und dann bekommt man von der Methode "size()" die Spieleranzahl zurück.
     
    #8
  9. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni

    Da es bei Events meist um mehrere Areas geht, war das HashMap<String, Integer> _playerHash = new HashMap<>(); dazu gedacht um dort die aktuelle Spieleranzahl in der Arena zu definieren.

    _playerHash.put("ArenaName", SpielerInArena);
     
    #9
  10. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Dann wäre es aber einfacher, die Spieler sofort in dieser Map zu speichern und nicht die Anzahl der Spieler, weil diese sowieso noch irgendwo gespeichert werden muss.

    Code (Text):
    1. HashMap<String, List<Player>> ingamePlayers;
    -
    Dann kann man einfach wie folgt die Spieler in einer Arena herausfinden:
    Code (Text):
    1. String arena = "Arena1";
    2. ingamePlayers.get(arena).size();
     
    #10
  11. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Joa das ist wahr. Wobei wenn dann bitte richtig :-D

    Code (Text):
    1. HashMap<String, List<Player>[B][COLOR="#FF0000"]>[/COLOR][/B] _ingamePlayers[B][COLOR="#FF0000"] = new HashMap<>()[/COLOR][/B];
     
    #11
  12. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    HashMaps

    Heyy

    erstmal danke dafür das ihr hier alle so helft :)
    Aber meine Frage wäre jetzt, da ich

    noch nicht so lange mit java zu gange bin, was eine hashmap ist und wie ich sie in dem Zusammenhang gebrauche :) :$:$

    MFG

    ps: immer noch am Handy :)
     
    #12
  13. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    #13
  14. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    Denke das ich so gegen 18 uhr den code schicken werde (muss noch was erledigen)! Könntet ihr/könntest du dann das mit der hashmap mal da in den code einbringen?
    Wäre nett!
    MFG
     
    #14
  15. Player Objekte sollten NICHT gespeichert werden! Diese werden bei jeder neuen Verbindung auch neu initialisiert! Daher speichert man den NAMEN!
     
    #15
  16. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    Code (Text):
    1. package Listener;
    2.  
    3. import java.io.File;
    4. import java.util.ArrayList;
    5.  
    6. import me.xxPluginerx.MAPvp.Main;
    7.  
    8. import org.apache.logging.log4j.core.jmx.Server;
    9. import org.bukkit.Bukkit;
    10. import org.bukkit.Location;
    11. import org.bukkit.Material;
    12. import org.bukkit.World;
    13. import org.bukkit.block.Block;
    14. import org.bukkit.block.BlockState;
    15. import org.bukkit.block.Sign;
    16. import org.bukkit.command.Command;
    17. import org.bukkit.command.CommandExecutor;
    18. import org.bukkit.command.CommandSender;
    19. import org.bukkit.command.ConsoleCommandSender;
    20. import org.bukkit.configuration.file.FileConfiguration;
    21. import org.bukkit.configuration.file.YamlConfiguration;
    22. import org.bukkit.entity.Player;
    23. import org.bukkit.event.EventHandler;
    24. import org.bukkit.event.Listener;
    25. import org.bukkit.event.block.Action;
    26. import org.bukkit.event.player.PlayerInteractEvent;
    27. import org.bukkit.event.player.PlayerQuitEvent;
    28. import org.bukkit.plugin.Plugin;
    29.  
    30. import Commands.Arena1;
    31.  
    32. public class SignJoin1 implements Listener, CommandExecutor{
    33.  
    34.  
    35.     int SpielerArena1 = Main.Spieler1;
    36.  
    37.     public static ArrayList<String> PlayerInGame = new ArrayList<>();
    38.    
    39.     public static File arena1 = new File("plugins/MAPvp/Arenas/Greenland1.yml");
    40.     public static FileConfiguration cfg = YamlConfiguration.loadConfiguration(arena1);
    41.  
    42.     @EventHandler
    43.     public void onInteract(PlayerInteractEvent e){
    44.         Player p = e.getPlayer();
    45.         if(e.getAction() == Action.RIGHT_CLICK_BLOCK){
    46.             if(e.getClickedBlock().getState() instanceof Sign){
    47.                 final Sign s = (Sign) e.getClickedBlock().getState();
    48.                 if(s.getLine(0).equalsIgnoreCase("[Greenland]")){
    49.                     if(s.getLine(1).equalsIgnoreCase("Arena 1")){
    50.                     if(p.getLevel() < 5 || p.getLevel() == 5){
    51.  
    52.        
    53.        
    54.  
    55.                         Location loc1 = p.getLocation();
    56.                         double x = (double) cfg.get("PosX", loc1.getX());
    57.                         double y = (double)cfg.get("PosY", loc1.getY());
    58.                         double z = (double)cfg.get("PosZ", loc1.getZ());
    59.                         double yaw = (double) cfg.get("Yaw", loc1.getYaw());
    60.                         double pitch = (double) cfg.get("Pitch", loc1.getPitch());
    61.                         String worldName = cfg.getString("World");
    62.                        
    63.                         World world = Bukkit.getWorld(worldName);
    64.                        
    65.                         loc1.setWorld(world);
    66.                         loc1.setX(x);
    67.                         loc1.setY(y);
    68.                         loc1.setZ(z);
    69.                         loc1.setYaw((float) yaw);
    70.                         loc1.setPitch((float) pitch);
    71.                        
    72.                         p.teleport(loc1);
    73.                        
    74.                        
    75.                         p.sendMessage("§aDu bist der Arena erfolgreich beigetreten");
    76.                         s.update(true);
    77.    
    78.  
    79.                
    80.                         SpielerArena1 = Main.add++ + 1;
    81.                        
    82.                         Integer meinInteger = new Integer(SpielerArena1);
    83.                         String Spieler1s = meinInteger.toString();
    84.                        
    85.                         s.setLine(2, Spieler1s + "/" + Main.MaxSpieler);
    86.                        
    87.                         s.setLine(3, "");
    88.                             s.update();
    89.                            
    90.                        
    91.                     }else{
    92.                         p.sendMessage("§6[MAPvp]Du hast nicht das erforderliche Prestige!");
    93.                         s.update(true);
    94.                     }
    95.  
    96.                 }
    97.                    
    98.                 }
    99.  
    100.             }
    101.         }
    102.  
    103.     }
    104.  
    105.  
    106.    
    107.  
    108.     @Override
    109.     public boolean onCommand(CommandSender sender, Command cmd, String label,
    110.             String[] args) {
    111.  
    112.  
    113.        
    114.         if(cmd.getName().equalsIgnoreCase("Spawn")){
    115.            
    116.             if(sender instanceof ConsoleCommandSender){
    117.                
    118.             System.out.println("Dieses Command können nur Spieler verwenden!");   
    119.             return true;
    120.             }
    121.             Player p = (Player) sender;
    122.            
    123.             if(args.length == 0){
    124.            
    125.                 p.sendMessage("§4[MAPvp]Du hast erfolgreich die Arena verlassen!");
    126.                 SpielerArena1 = Main.add-- - 1;
    127.                 PlayerInGame.remove(p.getName());
    128.            
    129.            
    130.                
    131.                 return true;
    132.            
    133.             }
    134.            
    135.         }
    136.    
    137.         if(cmd.getName().equalsIgnoreCase("hub")){
    138.            
    139.             if(sender instanceof ConsoleCommandSender){
    140.                
    141.             System.out.println("Dieses Command können nur Spieler verwenden!");   
    142.             return true;
    143.             }
    144.             Player p = (Player) sender;
    145.            
    146.             if(args.length == 0){
    147.            
    148.                
    149.                 p.sendMessage("§4[MAPvp]Du hast erfolgreich die Arena verlassen!");
    150.                 SpielerArena1 = Main.add-- -1;
    151.                 PlayerInGame.remove(p.getName());
    152.    
    153.                
    154.                 return true;
    155.            
    156.             }
    157.            
    158.         }
    159.         return false;
    160.     }
    161.  
    162.  
    163.  
    164.  
    165.  
    166.  
    167. @EventHandler
    168. public void onLeave(PlayerQuitEvent e){
    169.     Player p = e.getPlayer();
    170.    
    171.         SpielerArena1 = Main.add-- -1;
    172.         PlayerInGame.remove(p.getName());
    173.  
    174. }
    175. }
    176.  
    Hier ist der Code!
    Könnte vlt. jemand das mal einfügen, also mit der Hashmap, weil ich verstehe das noch nicht ganz!
    Zudem wäre es nett wenn mir jemand erklärt wie ich in den Commands auf das Schild zugreife!

    MFG
     
    #16
  17. Pappi
    Offline

    Pappi Gesperrt

    Registriert seit:
    28. Oktober 2012
    Beiträge:
    141
    Ort:
    H.a.S/NRW/Germany
    Minecraft:
    Pappi / PapaHarni
    Mach das mal anhand der JavaDoc und mit google selbst ;-)
     
    #17
  18. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    oker das mit der HashMap gerne aber wie kann ich das schild übergeben?

    MFG
     
    #18
  19. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Was genau meinst du mit "Schild übergeben"? Also was genau möchtest du jetzt wissen?
     
    #19
  20. xxProgramerx
    Offline

    xxProgramerx

    Registriert seit:
    16. März 2014
    Beiträge:
    26
    Also du siehst ja in dem Code bei dem erstes Event dieses Zeile:

    Code (Text):
    1. final Sign s = (Sign) e.getClickedBlock().getState();
    Und genau dieses Schild möchte ich zu dem Command Spawn und hub übergeben und es dann da mit s.update(); updaten!

    Leider weis ich nicht wie das gehen soll!

    MFG
     
    #20