1. 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!

PlugIn 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
    Geschlecht:
    männlich
    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.  
     
  2. Kronos197
    Offline

    Kronos197

    Registriert seit:
    20. Dezember 2013
    Beiträge:
    155
    Geschlecht:
    männlich
    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
     
    • Gefällt mir Gefällt mir x 1
  3. Victini151
    Online

    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^^
     
    • Gefällt mir Gefällt mir x 1
  4. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    Geschlecht:
    männlich
    @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 :)
     
  5. Victini151
    Online

    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 :)
     
  6. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    Geschlecht:
    männlich
    @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.  
     
  7. Victini151
    Online

    Victini151

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

    EDIT: Wo erhöhst du denn die Seitenzahl?
     
    Zuletzt von einem Moderator bearbeitet: 26. August 2015
  8. 可愛い
    Offline

    可愛い

    Registriert seit:
    19. Mai 2014
    Beiträge:
    770
    Geschlecht:
    weiblich
    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.
     
    • Gefällt mir Gefällt mir x 1
  9. Payno4
    Offline

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    Geschlecht:
    männlich
    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
     
  10. Victini151
    Online

    Victini151

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

    Payno4

    Registriert seit:
    12. Februar 2015
    Beiträge:
    117
    Geschlecht:
    männlich