Skip to content

Commit d01a566

Browse files
committed
feat: AbiphoneBuilder and HypixelPaginatedGUI
1 parent 1e37a21 commit d01a566

10 files changed

Lines changed: 198 additions & 64 deletions

File tree

type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public enum ToggleType {
8282
HAS_SPOKEN_TO_RUSTY_ABOUT_PICKAXE(false),
8383
HAS_SPOKEN_TO_RUSTY_ABOUT_ABIPHONE(false),
8484
HAS_GIVEN_WALTER_CUBE(false),
85+
HAS_GIVEN_BUILDER_BUILDERS_WAND(false),
8586
HAS_SPOKEN_TO_CURATOR(false),
8687
HAS_SPOKEN_TO_MADAME_ELEANOR(false),
8788
HAS_DONE_COAL_TRADE_WITH_BLACKSMITH(false),

type.hub/src/main/java/net/swofty/type/hub/npcs/NPCBuilder.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
import net.minestom.server.coordinate.Pos;
44
import net.swofty.type.generic.data.datapoints.DatapointToggles;
55
import net.swofty.type.generic.entity.npc.HypixelNPC;
6+
import net.swofty.type.generic.entity.npc.NPCAbiphoneTrait;
67
import net.swofty.type.generic.entity.npc.configuration.HumanConfiguration;
78
import net.swofty.type.generic.user.HypixelPlayer;
8-
import net.swofty.type.hub.gui.builder.GUIBuilder;
9+
import net.swofty.type.skyblockgeneric.gui.inventories.builder.GUIBuilder;
910
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
1011

1112
import net.swofty.type.generic.event.custom.NPCInteractEvent;
1213

13-
public class NPCBuilder extends HypixelNPC {
14+
public class NPCBuilder extends HypixelNPC implements NPCAbiphoneTrait {
1415

1516
public NPCBuilder() {
1617
super(new HumanConfiguration() {
@@ -68,4 +69,8 @@ public DialogueSet[] dialogues(HypixelPlayer player) {
6869
};
6970
}
7071

72+
@Override
73+
public String getAbiphoneKey() {
74+
return "builder";
75+
}
7176
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package net.swofty.type.skyblockgeneric.abiphone.impl;
2+
3+
import net.kyori.adventure.text.format.NamedTextColor;
4+
import net.minestom.server.item.ItemStack;
5+
import net.minestom.server.item.Material;
6+
import net.swofty.commons.skyblock.item.ItemType;
7+
import net.swofty.type.generic.data.datapoints.DatapointToggles;
8+
import net.swofty.type.generic.entity.npc.NPCOption;
9+
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
10+
import net.swofty.type.generic.user.HypixelPlayer;
11+
import net.swofty.type.skyblockgeneric.abiphone.AbiphoneNPC;
12+
import net.swofty.type.skyblockgeneric.gui.inventories.builder.GUIBuilder;
13+
import net.swofty.type.skyblockgeneric.item.SkyBlockItem;
14+
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
15+
16+
import java.util.Collections;
17+
18+
public class AbiphoneBuilder extends AbiphoneNPC {
19+
20+
public AbiphoneBuilder() {
21+
super("builder", "Builder", "Need to build? Call him.");
22+
}
23+
24+
@Override
25+
public void onCall(HypixelPlayer player) {
26+
new GUIBuilder().open(player);
27+
}
28+
29+
@Override
30+
public void onAdd(SkyBlockPlayer player, int slot) {
31+
if (!player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_GIVEN_BUILDER_BUILDERS_WAND)) {
32+
if (dialogue().isInDialogue(player)) return;
33+
dialogue().setDialogue(player, "abiphone").thenRun(() -> {
34+
NPCOption.sendOption(player, "builder", Collections.singletonList(new NPCOption.Option(
35+
"pay",
36+
NamedTextColor.GREEN,
37+
"GIVE ITEM",
38+
(p) -> {
39+
SkyBlockPlayer sp = (SkyBlockPlayer) p;
40+
for (int i = 0; i < sp.getInventory().getSize(); i++) {
41+
ItemStack item = sp.getInventory().getItemStack(i);
42+
if (new SkyBlockItem(item).getItemType() == ItemType.BUILDERS_WAND) {
43+
sp.getInventory().setItemStack(i, ItemStack.of(Material.AIR));
44+
dialogue().setDialogue(player, "donate").thenRun(() -> {
45+
player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_GIVEN_BUILDER_BUILDERS_WAND, true);
46+
super.onAdd(player, slot);
47+
});
48+
return;
49+
}
50+
}
51+
dialogue().setDialogue(player, "donate_no_requirements");
52+
53+
}
54+
)));
55+
});
56+
return;
57+
}
58+
super.onAdd(player, slot);
59+
}
60+
61+
@Override
62+
public DialogueSet[] dialogues(HypixelPlayer player) {
63+
return new DialogueSet[]{
64+
DialogueSet.builder()
65+
.key("abiphone").lines(new String[]{
66+
"Oh?",
67+
"Yes... I could give you my contact... However, may I ask a favor in return?",
68+
"For a builder to not have a §6Builder's Wand §fis quite uncommon.",
69+
" If you give me one I'll gladly give you my contact!"
70+
}).build(),
71+
DialogueSet.builder()
72+
.key("donate").lines(new String[]{
73+
"A §6Builder's Wand§f! This is a dream come true!"
74+
}).build(),
75+
DialogueSet.builder()
76+
.key("donate_no_requirements").lines(new String[]{
77+
"You don't have what I need! Nice try!",
78+
}).build()
79+
};
80+
}
81+
82+
@Override
83+
public ItemStack.Builder getIcon() {
84+
return ItemStackCreator.getStackHead("c8ccd4fdf58b30aa83017cfa5fed977196c024c8d1a276004e9068e8ecbb0b79");
85+
}
86+
}

type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/abiphone/impl/AbiphoneWalter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import net.kyori.adventure.text.format.NamedTextColor;
44
import net.minestom.server.item.ItemStack;
55
import net.swofty.type.generic.data.datapoints.DatapointToggles;
6-
import net.swofty.type.generic.entity.npc.HypixelNPC;
76
import net.swofty.type.generic.entity.npc.NPCOption;
7+
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
88
import net.swofty.type.generic.user.HypixelPlayer;
99
import net.swofty.type.skyblockgeneric.abiphone.AbiphoneNPC;
1010
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;
@@ -13,8 +13,8 @@
1313

1414
public class AbiphoneWalter extends AbiphoneNPC {
1515

16-
public AbiphoneWalter(String id, String name, String description) {
17-
super(id, name, description);
16+
public AbiphoneWalter() {
17+
super("walter", "Walter", "Sells Superboom TNT.");
1818
}
1919

2020
@Override
@@ -68,6 +68,6 @@ public DialogueSet[] dialogues(HypixelPlayer player) {
6868

6969
@Override
7070
public ItemStack.Builder getIcon() {
71-
return null;
71+
return ItemStackCreator.getStackHead("43ac21b653a27632dbc8373c6e6fba5b8c97b7ecbfef2d793630d149b116ba81");
7272
}
7373
}
Lines changed: 87 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.swofty.type.skyblockgeneric.gui.inventories.abiphone;
22

3+
import lombok.Setter;
34
import net.kyori.adventure.text.Component;
45
import net.minestom.server.MinecraftServer;
56
import net.minestom.server.component.DataComponents;
@@ -9,70 +10,53 @@
910
import net.minestom.server.item.ItemStack;
1011
import net.minestom.server.item.Material;
1112
import net.minestom.server.timer.TaskSchedule;
12-
import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI;
13+
import net.swofty.type.generic.gui.inventory.HypixelPaginatedGUI;
1314
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
1415
import net.swofty.type.generic.gui.inventory.item.GUIClickableItem;
1516
import net.swofty.type.generic.gui.inventory.item.GUIItem;
1617
import net.swofty.type.generic.user.HypixelPlayer;
18+
import net.swofty.type.generic.utility.PaginationList;
1719
import net.swofty.type.skyblockgeneric.abiphone.AbiphoneNPC;
1820
import net.swofty.type.skyblockgeneric.abiphone.AbiphoneRegistry;
1921
import net.swofty.type.skyblockgeneric.item.SkyBlockItem;
2022

2123
import java.util.List;
2224

23-
public class GUIAbiphone extends HypixelInventoryGUI {
24-
25+
public class GUIAbiphone extends HypixelPaginatedGUI<AbiphoneNPC> {
26+
@Setter
27+
private SortType sortType = SortType.ALPHABETICAL;
2528
private final SkyBlockItem abiphone;
2629

2730
public GUIAbiphone(SkyBlockItem abiphone) {
28-
super(abiphone.getCleanName(), InventoryType.CHEST_6_ROW);
31+
super(InventoryType.CHEST_6_ROW);
2932
this.abiphone = abiphone;
3033
}
3134

3235
@Override
33-
public void onOpen(InventoryGUIOpenEvent e) {
34-
border(FILLER_ITEM);
35-
List<AbiphoneNPC> contacts = abiphone.getAttributeHandler().getAbiphoneNPCs();
36+
protected int[] getPaginatedSlots() {
37+
return new int[]{
38+
10, 11, 12, 13, 14, 15, 16,
39+
19, 20, 21, 22, 23, 24, 25,
40+
28, 29, 30, 31, 32, 33, 34,
41+
37, 38, 39, 40, 41, 42, 43
42+
};
43+
}
3644

37-
int[] slots = new int[]{10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 34};
38-
for (int i = 0; i < contacts.size() && i < slots.length; i++) {
39-
AbiphoneNPC npc = contacts.get(i);
40-
set(new GUIClickableItem(slots[i]) {
41-
@Override
42-
public void run(InventoryPreClickEvent e, HypixelPlayer player) {
43-
Click click = e.getClick();
44-
if (click instanceof Click.Left) {
45-
player.closeInventory();
46-
player.sendMessage(Component.text("§e✆ RING..."));
47-
MinecraftServer.getSchedulerManager().buildTask(() -> {
48-
player.sendMessage(Component.text("§e✆ RING... RING..."));
49-
MinecraftServer.getSchedulerManager().buildTask(() -> {
50-
player.sendMessage(Component.text("§e✆ RING... RING... RING..."));
51-
MinecraftServer.getSchedulerManager().buildTask(() -> {
52-
npc.onCall(player);
53-
}).delay(TaskSchedule.seconds(1)).schedule();
54-
}).delay(TaskSchedule.seconds(1)).schedule();
55-
}).delay(TaskSchedule.seconds(1)).schedule();
56-
} else if (click instanceof Click.Right) {
57-
new GUIContactManagement(abiphone, npc).open(player);
58-
}
59-
}
45+
@Override
46+
protected PaginationList<AbiphoneNPC> fillPaged(HypixelPlayer player, PaginationList<AbiphoneNPC> paged) {
47+
paged.addAll(abiphone.getAttributeHandler().getAbiphoneNPCs());
48+
return paged;
49+
}
6050

61-
@Override
62-
public ItemStack.Builder getItem(HypixelPlayer player) {
63-
return ItemStackCreator.updateLore(
64-
npc.getIcon().set(DataComponents.CUSTOM_NAME, Component.text("§f" + npc.getName())),
65-
List.of(
66-
"§7" + npc.getDescription(),
67-
"",
68-
"§8Right-click to manage!",
69-
"§eLeft-click to call!"
70-
)
71-
);
72-
}
51+
@Override
52+
protected boolean shouldFilterFromSearch(String query, AbiphoneNPC item) {
53+
return false;
54+
}
7355

74-
});
75-
}
56+
@Override
57+
protected void performSearch(HypixelPlayer player, String query, int page, int maxPage) {
58+
border(FILLER_ITEM);
59+
List<AbiphoneNPC> contacts = abiphone.getAttributeHandler().getAbiphoneNPCs();
7660

7761
set(GUIClickableItem.getCloseItem(49));
7862
set(new GUIItem(50) {
@@ -111,7 +95,57 @@ public ItemStack.Builder getItem(HypixelPlayer player) {
11195
);
11296
}
11397
});
114-
updateItemStacks(getInventory(), getPlayer());
98+
99+
if (page > 1) {
100+
set(createNavigationButton(this, 45, query, page, false));
101+
}
102+
if (page < maxPage) {
103+
set(createNavigationButton(this, 53, query, page, true));
104+
}
105+
}
106+
107+
@Override
108+
protected String getTitle(HypixelPlayer player, String query, int page, PaginationList<AbiphoneNPC> paged) {
109+
return abiphone.getCleanName();
110+
}
111+
112+
@Override
113+
protected GUIClickableItem createItemFor(AbiphoneNPC npc, int slot, HypixelPlayer player) {
114+
return new GUIClickableItem(slot) {
115+
@Override
116+
public void run(InventoryPreClickEvent e, HypixelPlayer player) {
117+
Click click = e.getClick();
118+
if (click instanceof Click.Left) {
119+
player.closeInventory();
120+
player.sendMessage(Component.text("§e✆ RING..."));
121+
MinecraftServer.getSchedulerManager().buildTask(() -> {
122+
player.sendMessage(Component.text("§e✆ RING... RING..."));
123+
MinecraftServer.getSchedulerManager().buildTask(() -> {
124+
player.sendMessage(Component.text("§e✆ RING... RING... RING..."));
125+
MinecraftServer.getSchedulerManager().buildTask(() -> {
126+
npc.onCall(player);
127+
}).delay(TaskSchedule.seconds(1)).schedule();
128+
}).delay(TaskSchedule.seconds(1)).schedule();
129+
}).delay(TaskSchedule.seconds(1)).schedule();
130+
} else if (click instanceof Click.Right) {
131+
new GUIContactManagement(abiphone, npc).open(player);
132+
}
133+
}
134+
135+
@Override
136+
public ItemStack.Builder getItem(HypixelPlayer player) {
137+
return ItemStackCreator.updateLore(
138+
npc.getIcon().set(DataComponents.CUSTOM_NAME, Component.text("§f" + npc.getName())),
139+
List.of(
140+
"§7" + npc.getDescription(),
141+
"",
142+
"§8Right-click to manage!",
143+
"§eLeft-click to call!"
144+
)
145+
);
146+
}
147+
148+
};
115149
}
116150

117151
@Override
@@ -123,5 +157,13 @@ public boolean allowHotkeying() {
123157
public void onBottomClick(InventoryPreClickEvent e) {
124158
e.setCancelled(true);
125159
}
160+
161+
public enum SortType {
162+
FIRST_ADDED,
163+
ALPHABETICAL,
164+
LAST_CALLED,
165+
MOST_CALLED,
166+
DO_NOT_DISTURB_FIRST
167+
}
126168
}
127169

type.hub/src/main/java/net/swofty/type/hub/gui/builder/GUIBuilder.java renamed to type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/gui/inventories/builder/GUIBuilder.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.swofty.type.hub.gui.builder;
1+
package net.swofty.type.skyblockgeneric.gui.inventories.builder;
22

33
import net.minestom.server.event.inventory.InventoryCloseEvent;
44
import net.minestom.server.event.inventory.InventoryPreClickEvent;
@@ -22,26 +22,26 @@ public void onOpen(InventoryGUIOpenEvent e) {
2222
set(new GUIClickableItem(10) {
2323
@Override
2424
public void run(InventoryPreClickEvent e, HypixelPlayer p) {
25-
SkyBlockPlayer player = (SkyBlockPlayer) p;
25+
SkyBlockPlayer player = (SkyBlockPlayer) p;
2626
new GUIShopBuilderWoodworking().open(player);
2727
}
2828

2929
@Override
3030
public ItemStack.Builder getItem(HypixelPlayer p) {
31-
SkyBlockPlayer player = (SkyBlockPlayer) p;
31+
SkyBlockPlayer player = (SkyBlockPlayer) p;
3232
return ItemStackCreator.getStack("§aWoodworking", Material.OAK_PLANKS, 1, "§7Wood-related blocks!");
3333
}
3434
});
3535
set(new GUIClickableItem(12) {
3636
@Override
3737
public void run(InventoryPreClickEvent e, HypixelPlayer p) {
38-
SkyBlockPlayer player = (SkyBlockPlayer) p;
38+
SkyBlockPlayer player = (SkyBlockPlayer) p;
3939
new GUIShopBuilderRocksBricks().open(player);
4040
}
4141

4242
@Override
4343
public ItemStack.Builder getItem(HypixelPlayer p) {
44-
SkyBlockPlayer player = (SkyBlockPlayer) p;
44+
SkyBlockPlayer player = (SkyBlockPlayer) p;
4545
return ItemStackCreator.getStack("§aRocks & Bricks", Material.STONE, 1,
4646
"§7Rocks, stones, sands and brick",
4747
"§7blocks.");
@@ -50,13 +50,13 @@ public ItemStack.Builder getItem(HypixelPlayer p) {
5050
set(new GUIClickableItem(14) {
5151
@Override
5252
public void run(InventoryPreClickEvent e, HypixelPlayer p) {
53-
SkyBlockPlayer player = (SkyBlockPlayer) p;
53+
SkyBlockPlayer player = (SkyBlockPlayer) p;
5454
new GUIShopBuilderGreenThumb().open(player);
5555
}
5656

5757
@Override
5858
public ItemStack.Builder getItem(HypixelPlayer p) {
59-
SkyBlockPlayer player = (SkyBlockPlayer) p;
59+
SkyBlockPlayer player = (SkyBlockPlayer) p;
6060
return ItemStackCreator.getStack("§aGreen Thumb", Material.ROSE_BUSH, 1,
6161
"§7Everything you need to grow a",
6262
"§7nice garden.");
@@ -65,13 +65,13 @@ public ItemStack.Builder getItem(HypixelPlayer p) {
6565
set(new GUIClickableItem(16) {
6666
@Override
6767
public void run(InventoryPreClickEvent e, HypixelPlayer p) {
68-
SkyBlockPlayer player = (SkyBlockPlayer) p;
68+
SkyBlockPlayer player = (SkyBlockPlayer) p;
6969
new GUIShopBuilderVariety().open(player);
7070
}
7171

7272
@Override
7373
public ItemStack.Builder getItem(HypixelPlayer p) {
74-
SkyBlockPlayer player = (SkyBlockPlayer) p;
74+
SkyBlockPlayer player = (SkyBlockPlayer) p;
7575
return ItemStackCreator.getStackHead("§aVariety", "3c2d8e8ec2737b599a48fc07ea58b806969e6021802019992dda32a653794df6", 1,
7676
"§7Weird blocks and an assortment",
7777
"§7of decorative fruits.");

0 commit comments

Comments
 (0)