Skip to content

Instantly share code, notes, and snippets.

@eltrueno
Last active February 23, 2024 15:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eltrueno/7a139b0cc5d19e2ecff6a2265a819610 to your computer and use it in GitHub Desktop.
Save eltrueno/7a139b0cc5d19e2ecff6a2265a819610 to your computer and use it in GitHub Desktop.
Scrollable Menu by el_trueno
private static ScrollableMenuModel getModel(){
ItemStack air = new ItemStack(Material.AIR);
ItemStack nextpage = nolore(Material.ARROW, 1, 0, "§ePágina siguiente");
ItemStack previouspage = nolore(Material.ARROW, 1, 0, "§ePágina anterior");
ItemStack shop = nolore(Material.EMERALD, 1, 0, "§aVolver a la tienda");
ScrollableMenuModel menumodel = new ScrollableMenuModel(54, air,
new ScrollableMenuSlot(ScrollableMenuSlot.SlotType.DECORATION, null, 0)
, new ScrollableMenuSlot(ScrollableMenuSlot.SlotType.NEXT_PAGE, nextpage, 41)
, new ScrollableMenuSlot(ScrollableMenuSlot.SlotType.PREVIOUS_PAGE, previouspage, 39)
, new ScrollableMenuSlot(ScrollableMenuSlot.SlotType.ITEM, null, 10,11,12,13,14,15,16,19,20,21,22,23,24,25,28,29,30,31,32,33,34)
, new ScrollableMenuSlot(ScrollableMenuSlot.SlotType.CUSTOM, shop, 49)
);
return menumodel;
}
ScrollableMenu menu = new ScrollableMenu("Cajas", getModel(), items);
p.openInventory(menu.getPage(0).getInventory());
public class ScrollableMenu {
private String title;
private ArrayList<ItemStack> items;
private ScrollableMenuModel menumodel;
private int pagescount;
private ArrayList<ScrollableMenuPage> pages = new ArrayList<ScrollableMenuPage>();
public ScrollableMenu(String title, ScrollableMenuModel menumodel, ArrayList<ItemStack> items){
this.title = title;
this.menumodel = menumodel;
this.items = items;
this.pagescount = (items.size()/this.menumodel.getSlotsByType(ScrollableMenuSlot.SlotType.ITEM).getSlots().length);
if((items.size()%this.menumodel.getSlotsByType(ScrollableMenuSlot.SlotType.ITEM).getSlots().length) > 1 ){
this.pagescount=this.pagescount+1;
}
if(this.pagescount==0){
this.pagescount=1;
}
ArrayList<ItemStack> unuseditems = (ArrayList<ItemStack>) items.clone();
int unusedindex = 0;
for(int ipage=0; ipage<pagescount; ipage++){
Inventory pageinv = Bukkit.createInventory(null, this.menumodel.getSize() ,this.title);
ITEMS: for(int slot : menumodel.getSlotsByType(ScrollableMenuSlot.SlotType.ITEM).getSlots()){
if(unusedindex<unuseditems.size()){
pageinv.setItem(slot, unuseditems.get(unusedindex));
unusedindex++;
}else{
break ITEMS;
}
}
if(this.items.isEmpty()){
pageinv.setItem(this.getMenuModel().getNoItemReplace().getSlots()[0], this.getMenuModel().getNoItemReplace().getItem());
}
for(ScrollableMenuSlot scrslot : menumodel.getSlots()){
if(scrslot.getSlotType()!= ScrollableMenuSlot.SlotType.ITEM){
if(ipage==0 && scrslot.getSlotType() == ScrollableMenuSlot.SlotType.PREVIOUS_PAGE){
for(int slot : scrslot.getSlots()){
pageinv.setItem(slot, this.menumodel.getPageReplace());
}
}else if( (ipage==(this.pagescount-(1))) && scrslot.getSlotType() == ScrollableMenuSlot.SlotType.NEXT_PAGE){
for(int slot : scrslot.getSlots()){
pageinv.setItem(slot, this.menumodel.getPageReplace());
}
}else{
for(int slot : scrslot.getSlots()){
pageinv.setItem(slot, scrslot.getItem());
}
}
}
}
ScrollableMenuPage page = new ScrollableMenuPage(ipage, pageinv);
this.pages.add(page);
}
}
public void updateItems(ArrayList<ItemStack> items){
boolean clear = false;
if(this.items.size()>items.size() || this.items.isEmpty() && !items.isEmpty()){
clear = true;
}
this.items = items;
this.pagescount = (items.size()/this.menumodel.getSlotsByType(ScrollableMenuSlot.SlotType.ITEM).getSlots().length);
if((items.size()%this.menumodel.getSlotsByType(ScrollableMenuSlot.SlotType.ITEM).getSlots().length) > 1 ){
this.pagescount=this.pagescount+1;
}
if(this.pagescount==0){
this.pagescount=1;
}
ArrayList<ItemStack> unuseditems = (ArrayList<ItemStack>) items.clone();
int unusedindex = 0;
for(ScrollableMenuPage page : this.pages){
Inventory pageinv = page.getInventory();
if(clear) {
for (int slot : menumodel.getSlotsByType(ScrollableMenuSlot.SlotType.ITEM).getSlots()) {
pageinv.setItem(slot, new ItemStack(Material.AIR));
}
}
ITEMS:
for (int slot : menumodel.getSlotsByType(ScrollableMenuSlot.SlotType.ITEM).getSlots()) {
if (unusedindex < unuseditems.size()) {
pageinv.setItem(slot, unuseditems.get(unusedindex));
unusedindex++;
} else {
break ITEMS;
}
}
if(this.items.isEmpty()){
pageinv.setItem(this.getMenuModel().getNoItemReplace().getSlots()[0], this.getMenuModel().getNoItemReplace().getItem());
}
for (ScrollableMenuSlot scrslot : menumodel.getSlots()) {
if (scrslot.getSlotType() != ScrollableMenuSlot.SlotType.ITEM) {
if (page.getPageId() == 0 && scrslot.getSlotType() == ScrollableMenuSlot.SlotType.PREVIOUS_PAGE) {
for (int slot : scrslot.getSlots()) {
pageinv.setItem(slot, this.menumodel.getPageReplace());
}
} else if( (page.getPageId()==(this.pagescount-(1))) && scrslot.getSlotType() == ScrollableMenuSlot.SlotType.NEXT_PAGE){
for (int slot : scrslot.getSlots()) {
pageinv.setItem(slot, this.menumodel.getPageReplace());
}
} else {
for (int slot : scrslot.getSlots()) {
pageinv.setItem(slot, scrslot.getItem());
}
}
}
}
}
}
public ScrollableMenuPage getPage(int page){
return this.pages.get(page);
}
public ArrayList<ScrollableMenuPage> getPages(){
return this.pages;
}
public int getPagesCount(){
return this.pagescount;
}
public String getTitle(){
return this.title;
}
public ScrollableMenuSlot.SlotType getSlotType(int slot, int page){
ScrollableMenuSlot.SlotType type = null;
A: for(ScrollableMenuSlot scrslot : this.getMenuModel().getSlots()){
B: for(int slotn : scrslot.getSlots()){
if(slotn==slot){
if( (scrslot.getSlotType()== ScrollableMenuSlot.SlotType.NEXT_PAGE
|| scrslot.getSlotType()== ScrollableMenuSlot.SlotType.PREVIOUS_PAGE)
&& getPage(page).getInventory().getItem(slotn).equals(this.getMenuModel().getPageReplace())){
type = ScrollableMenuSlot.SlotType.DECORATION;
}else if(scrslot.getSlotType()== ScrollableMenuSlot.SlotType.ITEM && this.items.isEmpty()){
type = ScrollableMenuSlot.SlotType.DECORATION;
}else{
type = scrslot.getSlotType();
}
break A;
}else continue;
}
}
return type;
}
public ScrollableMenuModel getMenuModel(){
return menumodel;
}
}
public class ScrollableMenuModel {
private int size;
private ScrollableMenuSlot[] slots;
private ItemStack pagereplace;
private ScrollableMenuSlot noitemreplace;
public ScrollableMenuModel(int size, ItemStack pagereplace, ScrollableMenuSlot noitemreplace, ScrollableMenuSlot... items){
this.slots = items;
this.size = size;
this.pagereplace = pagereplace;
this.noitemreplace = noitemreplace;
}
public ScrollableMenuSlot[] getSlots() {
return slots;
}
public int getSize(){
return size;
}
public ScrollableMenuSlot getSlotsByType(ScrollableMenuSlot.SlotType type){
ScrollableMenuSlot retslot = null;
for(ScrollableMenuSlot slot : slots){
if(slot.getSlotType()== ScrollableMenuSlot.SlotType.ITEM){
retslot = slot;
break;
}
}
return retslot;
}
public ItemStack getPageReplace(){
return this.pagereplace;
}
public ScrollableMenuSlot getNoItemReplace() {
return noitemreplace;
}
}
public class ScrollableMenuPage {
private int pageid;
private Inventory formatedinv;
public ScrollableMenuPage(int pageid, Inventory inventory){
this.pageid = pageid;
this.formatedinv = inventory;
}
public int getPageId(){
return pageid;
}
public Inventory getInventory() {
return formatedinv;
}
}
public class ScrollableMenuSlot {
public enum SlotType{
DECORATION,
NEXT_PAGE,
PREVIOUS_PAGE,
ITEM,
CUSTOM
}
private SlotType type;
private int[] slots;
private ItemStack item;
public ScrollableMenuSlot(SlotType type, ItemStack item, int... slots){
this.type = type;
this.slots = slots;
this.item = item;
}
public int[] getSlots(){
return this.slots;
}
public ItemStack getItem(){
return this.item;
}
public SlotType getSlotType(){
return this.type;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment