• 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!

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

Payno4

Schafhirte
Registriert
12 Februar 2015
Beiträge
127
Diamanten
300
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:
public class inv2{

   

    Player p;

    Inventory inv2 =Bukkit.createInventory(null,54);

   

    static{

        ItemStack i = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);

        ItemMeta m = i.getItemMeta();

       

        for(Player players :Bukkit.getOnlinePlayers()){

            m.setDisplayName(players.getDisplayName());

            if(Bukkit.getOnlinePlayers().size()<=53){
          // Ab hier weis ich nicht mehr weiter 
            }

        }

    }

}
 

Alphy

Miner
Registriert
20 Dezember 2013
Beiträge
167
Diamanten
0
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:
ArrayList<Player> 
list1 = new ArrayList<>();
       
int i = 0;
for(Player player : Bukkit.getOnlinePlayers())
{
    if(i > 53)
        list1.add(player);
    else
        //Was auch immer!
    i++;
}

Hoffe ich konnte helfen
LG
Kronos197
 
V

Victini151

Guest
Du brauchst eine Seitenzahl, sprich
Code:
int page = x;
Wie du die bestimmst, sei dir überlassen.
Daraus bestimmst du
Code:
int skip = page * PAGE_SIZE;
Weiterhin brauchst du die Anzahl angezeigter Elemente
Code:
int left = PAGE_SIZE;
Und iterierst über eine Menge mit fester Iterationsordnung:
Code:
for (Element e : elements) {
     if (skip-- > 0) continue;
     if (left-- > 0) display();
}

Auf etwaige Fehler bitte hinweisen, alles ausm Kopf^^
 
V

Victini151

Guest
(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:
for (Player p : Bukkit.getOnlinePlayers()) {
    if (skip-- > 0) continue;
    if (left-- > 0) {
        //Code den du zum Anzeigen des Spielers, zB Schädel im Inv verwendest.
    }
}
Eben zur folgenden Bedingung in Klammern ganz oben :)
 

Payno4

Schafhirte
Registriert
12 Februar 2015
Beiträge
127
Diamanten
300
@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:
package Inventorys;



import java.util.ArrayList;



import org.bukkit.Bukkit;

import org.bukkit.Material;

import org.bukkit.entity.Player;

import org.bukkit.inventory.Inventory;

import org.bukkit.inventory.ItemStack;

import org.bukkit.inventory.meta.ItemMeta;



publicclassinv2{

   

    //This Inventory is for Onlineplayers (go on)

    static ArrayList<String> list =newArrayList<String>();

    public static Inventory inv2 =Bukkit.createInventory(null,54,"§3Onlineplayers");

   

   

    static{

       

        ItemStack i = new ItemStack(Material.ANVIL);

        ItemMeta m = i.getItemMeta();

       

        list.add("§3Klick for the next site");

       

        m.setLore(list);

        m.setDisplayName("Next Site");

       

        i.setItemMeta(m);

       

        inv2.setItem(53, i);

    }

   

    static{

        ItemStack i1 = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);

        ItemMeta m1 = i1.getItemMeta();

       

            int page = 0;

            int skip = page * 53;

            int left = 53;

           

            for(Player players :Bukkit.getOnlinePlayers()){

                if (skip-- > 0) continue;

                if (left-- > 0) {

                    m1.setDisplayName(players.getName());

                    i1.setItemMeta(m1);

                    inv2.addItem(i1);

            }

        }

    }

}

InventoryClickevent ( Falls das vielleicht noch eine Rolle spielt)
Code:
package Events;



import org.bukkit.Material;

import org.bukkit.entity.Player;

import org.bukkit.event.EventHandler;

import org.bukkit.event.Listener;

import org.bukkit.event.inventory.InventoryClickEvent;



import Inventorys.inv1;

import Inventorys.inv2;



public class OnIClick implements Listener{

   

    @EventHandler

    public void onIClick(InventoryClickEvente){

        Player p =(Player)e.getWhoClicked();

       

        if(e.getInventory().getTitle()==inv2.inv2.getTitle()){

            if(e.getCurrentItem().getType() == Material.SKULL_ITEM){

                p.chat("/friend add "+e.getCurrentItem().getItemMeta().getDisplayName());

                e.setCancelled(true);

            }

            if(e.getCurrentItem().getType()== Material.ANVIL){

               

                e.setCancelled(true);

                p.closeInventory();

                p.openInventory(Inventorys.inv2.inv2);

            }

        }

        if(e.getInventory().getTitle()==inv1.inv1.getTitle()){

                e.setCancelled(true);

            }

        }

    }
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
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.
 
Oben