ServerPlugin Collections(Player) splitten & im Inventar als Köpfe wiedergeben

Dieses Thema im Forum "Programmierung" wurde erstellt von Payno4, 21. August 2015.

  1. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    Hei Community ,
    ich versuche schon die ganze Zeit eine List/Collection zu splitten , da pro Inventarfenster ja nur 54 Items reinpassen , also muss man die List bei 53 splitten (ein Slot muss freibleiben um auf "weiter" klicken zu können) und das dann so lange bis alle Spieler in einem Slot drin sind . Wie die Spieler dann als Köpfe wiedergegeben werden weis ich . :)

    Also nochmal in Kurzfassung :
    X(Anzahl der Spieler) sollen in einem aufgerufenem Inventarfenster untergebracht werden ;
    Wenn X mehr als 53 { Anzahl der Spieler bei 53 splitten; } // solang bis alle Spieler in einem Slot untergebracht worden sind

    Mein Ansatz für das Inventar :
    Code (Text):
    1.  
    2. public class inv2{
    3.  
    4.    
    5.  
    6.     Player p;
    7.  
    8.     Inventory inv2 =Bukkit.createInventory(null,54);
    9.  
    10.    
    11.  
    12.     static{
    13.  
    14.         ItemStack i = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
    15.  
    16.         ItemMeta m = i.getItemMeta();
    17.  
    18.        
    19.  
    20.         for(Player players :Bukkit.getOnlinePlayers()){
    21.  
    22.             m.setDisplayName(players.getDisplayName());
    23.  
    24.             if(Bukkit.getOnlinePlayers().size()<=53){
    25.           // Ab hier weis ich nicht mehr weiter
    26.             }
    27.  
    28.         }
    29.  
    30.     }
    31.  
    32. }
    33.  
    34.  
    35.  
     
    #1
  2. Kronos197
    Offline

    Kronos197

    Registriert seit:
    20. Dezember 2013
    Beiträge:
    153
    Ort:
    Frankfurt
    Minecraft:
    Kronos197
    Ich hab hier mal so eine möglichkeit die mir auf die schnelle eingefallen ist. Wenn ich was besseres hab werd ich mich melden wen es kein anderere hat!
    Probiert ob es funktioniert hab ich auh net!

    Aber wenn es dann mehrer Seiten sind würde ich danach noch abfragen Ob in der neu erstellten liste mehr als 53 sind und wenn ja kannst du es gut mit ein bisschen rechnerrei und dem 'goto' umsetzten.

    Code (Text):
    1. ArrayList<Player>
    2. list1 = new ArrayList<>();
    3.        
    4. int i = 0;
    5. for(Player player : Bukkit.getOnlinePlayers())
    6. {
    7.     if(i > 53)
    8.         list1.add(player);
    9.     else
    10.         //Was auch immer!
    11.     i++;
    12. }
    13.  
    Hoffe ich konnte helfen
    LG
    Kronos197
     
    #2
    Payno4 gefällt das.
  3. Victini151
    Offline

    Victini151

    Du brauchst eine Seitenzahl, sprich
    Code (Text):
    1. int page = x;
    Wie du die bestimmst, sei dir überlassen.
    Daraus bestimmst du
    Code (Text):
    1. int skip = page * PAGE_SIZE;
    Weiterhin brauchst du die Anzahl angezeigter Elemente
    Code (Text):
    1. int left = PAGE_SIZE;
    Und iterierst über eine Menge mit fester Iterationsordnung:
    Code (Text):
    1. for (Element e : elements) {
    2.      if (skip-- > 0) continue;
    3.      if (left-- > 0) display();
    4. }
    Auf etwaige Fehler bitte hinweisen, alles ausm Kopf^^
     
    #3
    Payno4 gefällt das.
  4. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    @Victini151 danke für deine Antwort :) doch leider raff ich das nicht ganz wie du das meinst :(
    kannst du den Code , wie du ihn meinst , in meinen Code einfügen ?

    Schon mal danke im voraus :)
     
    #4
  5. Victini151
    Offline

    Victini151

    (Der folgende Code gilt, sofern die Iterationsordnung der Collection Bukkit#getOnlinePlayers() persistent ist, ansonsten einfach eine z.B. alphabetisch geordnete Menge nehmen.)

    Der erste Teil mit den Deklarationen ist der gleiche, nur musst du einen Wert für PAGE_SIZE finden, in deinem Beispiel AFAIK 53. Also einfach die Zahl der Einträge pro Seite.
    Der Start-Wert für page ist 0, und zwar immer dann, wenn du auf die erste Seite kommen möchtest.

    Zur Schleife, die sollte so klappen:
    Code (Text):
    1. for (Player p : Bukkit.getOnlinePlayers()) {
    2.     if (skip-- > 0) continue;
    3.     if (left-- > 0) {
    4.         //Code den du zum Anzeigen des Spielers, zB Schädel im Inv verwendest.
    5.     }
    6. }
    Eben zur folgenden Bedingung in Klammern ganz oben :)
     
    #5
  6. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    @Victini151 :)
    Es hat etwas gedauert aber jetzt hab ich deinen Code mal eingebaut , aber leider kommen immer wieder die gleichen spieler wenn ich auf die nächste Seite gehe .

    Mein Code :
    Code (Text):
    1.  
    2. package Inventorys;
    3.  
    4.  
    5.  
    6. import java.util.ArrayList;
    7.  
    8.  
    9.  
    10. import org.bukkit.Bukkit;
    11.  
    12. import org.bukkit.Material;
    13.  
    14. import org.bukkit.entity.Player;
    15.  
    16. import org.bukkit.inventory.Inventory;
    17.  
    18. import org.bukkit.inventory.ItemStack;
    19.  
    20. import org.bukkit.inventory.meta.ItemMeta;
    21.  
    22.  
    23.  
    24. publicclassinv2{
    25.  
    26.    
    27.  
    28.     //This Inventory is for Onlineplayers (go on)
    29.  
    30.     static ArrayList<String> list =newArrayList<String>();
    31.  
    32.     public static Inventory inv2 =Bukkit.createInventory(null,54,"§3Onlineplayers");
    33.  
    34.    
    35.  
    36.    
    37.  
    38.     static{
    39.  
    40.        
    41.  
    42.         ItemStack i = new ItemStack(Material.ANVIL);
    43.  
    44.         ItemMeta m = i.getItemMeta();
    45.  
    46.        
    47.  
    48.         list.add("§3Klick for the next site");
    49.  
    50.        
    51.  
    52.         m.setLore(list);
    53.  
    54.         m.setDisplayName("Next Site");
    55.  
    56.        
    57.  
    58.         i.setItemMeta(m);
    59.  
    60.        
    61.  
    62.         inv2.setItem(53, i);
    63.  
    64.     }
    65.  
    66.    
    67.  
    68.     static{
    69.  
    70.         ItemStack i1 = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
    71.  
    72.         ItemMeta m1 = i1.getItemMeta();
    73.  
    74.        
    75.  
    76.             int page = 0;
    77.  
    78.             int skip = page * 53;
    79.  
    80.             int left = 53;
    81.  
    82.            
    83.  
    84.             for(Player players :Bukkit.getOnlinePlayers()){
    85.  
    86.                 if (skip-- > 0) continue;
    87.  
    88.                 if (left-- > 0) {
    89.  
    90.                     m1.setDisplayName(players.getName());
    91.  
    92.                     i1.setItemMeta(m1);
    93.  
    94.                     inv2.addItem(i1);
    95.  
    96.             }
    97.  
    98.         }
    99.  
    100.     }
    101.  
    102. }
    103.  
    104.  
    105.  

    InventoryClickevent ( Falls das vielleicht noch eine Rolle spielt)
    Code (Text):
    1.  
    2. package Events;
    3.  
    4.  
    5.  
    6. import org.bukkit.Material;
    7.  
    8. import org.bukkit.entity.Player;
    9.  
    10. import org.bukkit.event.EventHandler;
    11.  
    12. import org.bukkit.event.Listener;
    13.  
    14. import org.bukkit.event.inventory.InventoryClickEvent;
    15.  
    16.  
    17.  
    18. import Inventorys.inv1;
    19.  
    20. import Inventorys.inv2;
    21.  
    22.  
    23.  
    24. public class OnIClick implements Listener{
    25.  
    26.    
    27.  
    28.     @EventHandler
    29.  
    30.     public void onIClick(InventoryClickEvente){
    31.  
    32.         Player p =(Player)e.getWhoClicked();
    33.  
    34.        
    35.  
    36.         if(e.getInventory().getTitle()==inv2.inv2.getTitle()){
    37.  
    38.             if(e.getCurrentItem().getType() == Material.SKULL_ITEM){
    39.  
    40.                 p.chat("/friend add "+e.getCurrentItem().getItemMeta().getDisplayName());
    41.  
    42.                 e.setCancelled(true);
    43.  
    44.             }
    45.  
    46.             if(e.getCurrentItem().getType()== Material.ANVIL){
    47.  
    48.                
    49.  
    50.                 e.setCancelled(true);
    51.  
    52.                 p.closeInventory();
    53.  
    54.                 p.openInventory(Inventorys.inv2.inv2);
    55.  
    56.             }
    57.  
    58.         }
    59.  
    60.         if(e.getInventory().getTitle()==inv1.inv1.getTitle()){
    61.  
    62.                 e.setCancelled(true);
    63.  
    64.             }
    65.  
    66.         }
    67.  
    68.     }
    69.  
    70.  
     
    #6
  7. Victini151
    Offline

    Victini151

    Genau die selben, oder gibt es Dopplungen? Mit wie vielen Spielern testest du es?

    EDIT: Wo erhöhst du denn die Seitenzahl?
     
    #7
  8. 可愛い
    Offline

    可愛い

    Registriert seit:
    19. Mai 2014
    Beiträge:
    657
    Was du suchst ist ein einfaches Seiten System. Dazu brauchst du übrigens 2 Buttons, ich nehme mal an, du willst auch zurückblättern. Eigentlich ist das ganz einfach, daher hier nur abstrakt beschrieben. Du hast 2 Blätter Buttons und eine Seite. Jede Seite hat x Elemente. Du multiplizierst die aktuelle Seitenzahl mit x und das ist dein Startindex im Array, von dort packst du dann die nächsten x Elemente in dein Inventar. Wenn jemand Blättert überprüfst du kurz ob er damit aus dem Array Blättern würde und wenn das nicht der Fall ist multiplizierst du die neue Seitenzahl einfach wieder mit x und gibst die Elemente aus. Da du die Buttons vermutlich an bestimmten Stellen im Inventar haben willst musst du halt ggf. ne kleine Sonderbehandlung in deine Schleife machen, die die Elemente im Inventar darstellt, jedenfall nichts aufwändiges.
     
    #8
    Payno4 gefällt das.
  9. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    I don't get it :confused:
    Also ich versteh schon das Prinzip dahinter aber ich blick immer noch nicht wie man das programmieren soll (habs schon versucht hat nicht geklappt ) :O
    Könntest du (nur wenn du Lust hast) mir den Abschnitt mal Coden ? :) @SpiritWalker
     
    #9
  10. Victini151
    Offline

    Victini151

    Du hattest ja schon Code, aber da erhöhst du nirgends die Seitenanzahl page, oder?
     
    #10
  11. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    #11