Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions configuration/skyblock/items/vanillaItems.yml
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ items:
material: FISHING_ROD
rarity: COMMON
components:
- id: FISHING_ROD
- id: DEFAULT_CRAFTABLE
recipes:
- type: SHAPED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ public enum ToggleType {
HAS_SPOKEN_TO_LIFT_OPERATOR(false),
HAS_SPOKEN_TO_LAZY_MINER(false),
HAS_SPOKEN_TO_BAKER(false),
HAS_SPOKEN_TO_GAVIN(false),
HAS_SPOKEN_TO_FISHERMAN_GERALD(false),
HAS_SPOKEN_TO_RUSTY(false),
HAS_SPOKEN_TO_RUSTY_ABOUT_PICKAXE(false),
HAS_SPOKEN_TO_RUSTY_ABOUT_ABIPHONE(false),
Expand Down
133 changes: 133 additions & 0 deletions type.hub/src/main/java/net/swofty/type/hub/gui/GUIGFishingShip.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package net.swofty.type.hub.gui;

import net.minestom.server.event.inventory.InventoryPreClickEvent;
import net.minestom.server.inventory.InventoryType;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI;
import net.swofty.type.generic.gui.inventory.ItemStackCreator;
import net.swofty.type.generic.gui.inventory.item.GUIClickableItem;
import net.swofty.type.generic.gui.inventory.item.GUIItem;
import net.swofty.type.generic.user.HypixelPlayer;

// TOOD: Fishing ship name can be changed. And the parts can be changed
public class GUIGFishingShip extends HypixelInventoryGUI {

public GUIGFishingShip() {
super("{Fishing Ship}", InventoryType.CHEST_5_ROW);
}

@Override
public void onOpen(InventoryGUIOpenEvent e) {
fill(FILLER_ITEM);
set(new GUIItem(4) {
@Override
public ItemStack.Builder getItem(HypixelPlayer player) {
return ItemStackCreator.getStack(
"§6{Fishing Ship}",
Material.OAK_BOAT,
1,
"§7Your §6Ship §7will help you travel to",
"§7different §9fishing islands §7in SkyBlock.",
"",
"§7For now, it can only get you to the",
"§2Backwater Bayou§7.",
"",
"§7Helm: §fCracked Ship Helm",
"§7Engine: §fRusty Ship Engine",
"§7Hull: §fRusty Ship Hull"
);
}
});
set(new GUIItem(21) {
@Override
public ItemStack.Builder getItem(HypixelPlayer player) {
return ItemStackCreator.getStackHead(
"§fCracked Ship Helm",
"d8d4a54d1fcf47b2efc99ba4cc772250aee5c2f26ed1a19052213e0f3323ca1d",
1,
"§7A cracked ship helm, incapable of",
"§7changing its heading which appears",
"§7due east.",
"",
"§6§lUPGRADE TO §8➜ §9Bronze Ship Helm",
"§7Crafted from §aBronze Bowls§7, which",
"§7are rarely dropped by §cDumpster",
"§cDivers §7in the §2Backwater Bayou§7.",
"",
"§eClick a Ship Part in your inventory to",
"§eupgrade this part!"
);
}
});
// TODO: this is "missing" by default, need to implement that state
set(new GUIItem(22) {
@Override
public ItemStack.Builder getItem(HypixelPlayer player) {
return ItemStackCreator.getStackHead(
"§fRusty Ship Engine",
"53e84793917c890f7f8a2c4078a29e8ba939790498727af9342c2b6f6ac43c9c",
1,
"§7Rusted by the waters, but it seems to",
"§7be able to run...for now.",
"",
"§6§lUPGRADE TO §8➜ §9Bronze Ship Engine",
"§7Purchased from §2Junker Joel §7in the",
"§2Backwater Bayou§7.",
"",
"§eClick a Ship Part in your inventory to",
"§eupgrade this part!"
);
}
});
set(new GUIItem(23) {
@Override
public ItemStack.Builder getItem(HypixelPlayer player) {
return ItemStackCreator.getStackHead(
"§fRusty Ship Hull",
"f42d53ca6e7d80a99a699c2036dcf6e233394feb9f46fb2ff9d9a819690894a9",
1,
"§7A hull rusted and dilapidated beyond",
"§7repair. It's a miracle the ship",
"§7remains afloat.",
"",
"§6§lUPGRADE TO §8➜ §9Bronze Ship Hull",
"§7Crafted from §aTorn Cloth§7, which is",
"§7rarely dropped by §cBanshees §7in the",
"§2Backwater Bayou§7.",
"",
"§eClick a Ship Part in your inventory to",
"§eupgrade this part!"
);
}
});
set(new GUIItem(44) {
@Override
public ItemStack.Builder getItem(HypixelPlayer player) {
return ItemStackCreator.getStack(
"§aRename Ship",
Material.NAME_TAG,
1,
"§7You may be going on long voyages",
"§7with your §6Ship§7, best to give it a name!",
"",
"§7Current Name: §6Zephyr",
"",
"§eClick to rename!"
);
}
});
set(GUIClickableItem.getCloseItem(40));
updateItemStacks(getInventory(), getPlayer());
}

@Override
public boolean allowHotkeying() {
return false;
}

@Override
public void onBottomClick(InventoryPreClickEvent e) {
e.setCancelled(true);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package net.swofty.type.hub.npcs;

import net.minestom.server.coordinate.Pos;
import net.swofty.type.generic.data.datapoints.DatapointToggles;
import net.swofty.type.generic.entity.npc.HypixelNPC;
import net.swofty.type.generic.entity.npc.configuration.HumanConfiguration;
import net.swofty.type.generic.event.custom.NPCInteractEvent;
import net.swofty.type.generic.user.HypixelPlayer;

import java.util.stream.Stream;

public class NPCCaptainBaha extends HypixelNPC {

public NPCCaptainBaha() {
super(new HumanConfiguration() {
@Override
public String[] holograms(HypixelPlayer player) {
return new String[]{"§6Captain Baha", "§e§lCLICK"};
}

@Override
public String signature(HypixelPlayer player) {
return "A9Wh529RWV2HEMvVnPzQEPfvT7p8m2GU8IB5FowBVYRash8GUSC6OvO88v5eBXAsCJvAauOnCFkp0DrxNTHUTS6E8rcGpo5ieHTr+QYglXIlA8S+rgA5eGODgI3LEtOZucHJ6H64a23Bu41lNMpN2c+LzQbisqC9WBnfVBxYo6qrzgh5JBGsRDIg2h3UKmTnNgJPuhN2cwRDDlHG8/k+xES5ZqyEFvdjGn6O5HHL6xyMkCukjZN0E8s03NkpkKxZXEm1M/Eg8EWtwGqZIa3DHNmxchYok4mDPMst8iRy4pGRlJN+VBCmGLIV7pq4QZlGzuXWplrX/PAOb+B36Rg67SHvmIk23tpnu+7uvB3rw9NedWY1+xLp8W4gPKpynOobSCbKiJ6bX0mCQfURVh2svFT5nG/VnKCL0TE8CUiTxOuxJR8QWwWRI4BMRMJQfQxy0mofvPnR5g1XUnHzvGWr4m44dmooqyCgB4W9iysADAEgc9CVtizjroopAJLXCtfsxwIuioHaZsBKQU1NpvpH55bPqf//RI9FyJJwOXTgX7fbF49z0eAgjnRAyF9VE9VYI2hFZwa3BIFnvdGxlZhE63QPB+nmKQMT0WzTz15lm77lxvvpQsurkm2gKr6FlL9+SokbTUuQmisyzS84s2EocpRscgc9JF1Dv/NjK7T+3GU=";
}

@Override
public String texture(HypixelPlayer player) {
return "ewogICJ0aW1lc3RhbXAiIDogMTc0MDQxOTU1NzI0NiwKICAicHJvZmlsZUlkIiA6ICIzY2I3YTA3YWY3ZjM0ZWZiYTlkNGI4ODQ3NDM4Mzc0ZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJBUkJVWklLMTIwMTMiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzcxYzQ0YWQ0MDdjMDIxNzM3YWQ3ODkwN2I1MDY4ZDdiY2MwYzY1OGIyYTJmYmFiZjAxNzA2NTYzYmQ5NDQ3ZCIKICAgIH0KICB9Cn0=";
}

@Override
public Pos position(HypixelPlayer player) {
return new Pos(179.5, 69, 55.5, 105, 0);
}

@Override
public boolean looking(HypixelPlayer player) {
return true;
}
});
}

@Override
public void onClick(NPCInteractEvent event) {
HypixelPlayer player = event.player();
if (isInDialogue(player)) return;

if(!player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_GAVIN)) {
setDialogue(player, "first-interaction").thenRun(() -> {
player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_GAVIN, true);
});
return;
}

setDialogue(player, "idle-" + (int)(Math.random() * 2 + 1));
// TODO: new GUIFishingShip().open(player);
}

@Override
protected DialogueSet[] dialogues(HypixelPlayer player) {
return Stream.of(
DialogueSet.builder()
.key("first-interaction").lines(new String[]{
"I was about to set sail, but this §6Ship §fis missing its §cengine§f!",
"Maybe §3Fisherman §fGerald knows where it is?",
}).build(),
DialogueSet.builder()
.key("rust-ship-engine").lines(new String[]{
"Ahoy, is that the §cRusty Ship Engine§f?"
}).build(),
DialogueSet.builder()
.key("dialogue-yes").lines(new String[]{
"Excellent! I'm the captain of this §6Ship§f, which means I oversee everything from repairs to navigation.",
"Apply that §cRusty Ship Engine §fin the §6Engine §fslot by clicking the engine in your inventory!"
}).build()
).toArray(DialogueSet[]::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package net.swofty.type.hub.npcs;

import net.minestom.server.coordinate.Pos;
import net.swofty.type.generic.data.datapoints.DatapointToggles;
import net.swofty.type.generic.entity.npc.HypixelNPC;
import net.swofty.type.generic.entity.npc.configuration.HumanConfiguration;
import net.swofty.type.generic.event.custom.NPCInteractEvent;
import net.swofty.type.generic.user.HypixelPlayer;
import net.swofty.type.skyblockgeneric.skill.SkillCategories;
import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer;

import java.util.stream.Stream;

public class NPCFishermanGerald extends HypixelNPC {

public NPCFishermanGerald() {
super(new HumanConfiguration() {
@Override
public String[] holograms(HypixelPlayer player) {
return new String[]{"§3Fisherman Gerald", "§e§lCLICK"};
}

@Override
public String signature(HypixelPlayer player) {
return "oJ24ajDV0/I3NFdHBh7D71v+jboQFJlaFxxu47bWeSmUXhLl6z1Vk9aksUE8qqTNs9EVUWFpSjAe7i/w57nkh4AAH+GvplyzZANEhHf9SJhBdwjCpIDVJZ453hs9xMYbyvp4KiZkia+jbLKrQfQOFOa9aWt1mmhhOneNgzx4it5Bo1qzDoPvbgFu5uL7rbyzdOl9ZW5wEobb2Ns4TbqPdT+NjZurw7rkpRpdLhAbHZoD2NEw0BX3VHTvtlY8zh14//YV7Vo5+xUUWGTrt0UjudIxDdJI8R9ZiWgCgl9N1ElzokFh/h0aHg0vL0QSG1Y5bHY5ea+E2+3tLDiEvQO7Soh/VV1/yySjmkt/JbUiEFmCv6vkjm4bgbAZAm42GxlvkAyFpZoFZijmCaw8ObJivZlwJNUjY4D0PBEm4rnVSVFjjWBGaGXyFG2/KtUL8nYZE81ABqrL3xSHFeEUIBePNsBq84eI88aNGYCjU9Ct4bfAhbdZMWM84PzBqAa5jH6NNqb/5aV2jmEp0OcoF80W+pcaR/uNPOo9Gjy5HkUYMpLJ775SqC//m/Rrh7RypdNcVUIanmUqP+hP7oz1SI3L6glv4+CGlGprr67QHP9d9PcZzVgF1YHOfOKW4muqJNjgpKYFZRiz4yWmOdURKomqUuz4tyKDxu0drx5eHfQ+3mw=";
}

@Override
public String texture(HypixelPlayer player) {
return "eyJ0aW1lc3RhbXAiOjE1NTk1NzQ0MjU3OTEsInByb2ZpbGVJZCI6ImZkNjBmMzZmNTg2MTRmMTJiM2NkNDdjMmQ4NTUyOTlhIiwicHJvZmlsZU5hbWUiOiJSZWFkIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hNjc1ZjA3MWVmYjBjZjI3YmYxNjA4MWUzZjgyZjliNWY4YWU4OGVjYTllZTk1MjNiNjIxNmU2MTdmNmY0NWM5In19fQ==";
}

@Override
public Pos position(HypixelPlayer player) {
return new Pos(153.5, 68.5, 55.5, -60, 0);
}

@Override
public boolean looking(HypixelPlayer player) {
return true;
}
});
}

@Override
public void onClick(NPCInteractEvent event) {
SkyBlockPlayer player = (SkyBlockPlayer) event.player();
if (isInDialogue(player)) return;

boolean belowFive = player.getSkills().getCurrentLevel(SkillCategories.FISHING) < 5;
if (belowFive) {
setDialogue(player, "below-fishing-5");
return;
}

if(!player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_FISHERMAN_GERALD)) {
setDialogue(player, "first-interaction").thenRun(() -> {
player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_FISHERMAN_GERALD, true);
});
return;
}

// TODO: finish this quest
}

@Override
protected DialogueSet[] dialogues(HypixelPlayer player) {
return Stream.of(
DialogueSet.builder()
.key("below-fishing-5").lines(new String[]{
"Hmm, you're not quite ready yet.",
"Go talk to the §eFish Merchant §fin the §bFishing Outpost§f, get geared up, and get fishin'!",
"Come back once you've reached §aFishing Skill V §fand I'll tell you how you can get to a §anew island§f!",
}).build(),
DialogueSet.builder()
.key("first-interaction").lines(new String[]{
"Keep the noise down, kid!",
"If you want to learn about §aFishing§f, go talk to my wife, Fisherwoman Enid.",
"She's fishing a bit §bupstream§f. Once she's shown you the ropes, come back and talk to me!",
}).build()
).toArray(DialogueSet[]::new);
}
}
78 changes: 78 additions & 0 deletions type.hub/src/main/java/net/swofty/type/hub/npcs/NPCGavin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package net.swofty.type.hub.npcs;

import net.minestom.server.coordinate.Pos;
import net.swofty.type.generic.data.datapoints.DatapointToggles;
import net.swofty.type.generic.entity.npc.HypixelNPC;
import net.swofty.type.generic.entity.npc.configuration.HumanConfiguration;
import net.swofty.type.generic.event.custom.NPCInteractEvent;
import net.swofty.type.generic.user.HypixelPlayer;

import java.util.stream.Stream;

public class NPCGavin extends HypixelNPC {

public NPCGavin() {
super(new HumanConfiguration() {
@Override
public String[] holograms(HypixelPlayer player) {
return new String[]{"§bGavin", "§e§lCLICK"};
}

@Override
public String signature(HypixelPlayer player) {
return "qwNSHj1b7UwXoeP6/Vs/1EGb0pyfO+DGOVUQ9DJ7DY0ZPn6VwQv1Ej1W39wANDGJI1p8eQKRqMLKH0Xj4WkSwnMnj0e7DZU2VROO9xi3th5IhJg/7SzpMt2vMvYUN3u6HI1EzhYHuLL1oHF1eGK/5lZZp6xvb2X4ZuOvX8oASvrgQFPcxR2WMn4nwS4bKRp5CDFGg+fCHCMuHHQAjZpJAHqbfxD2DWXq7CbuyOQJlIybhGDY30syWVKH1aZsp5Nmm8fOeSysqyZL+F49zBbxPUBaX/gmxsBR8cRyU37gBzT39aTeybFsZrQSOz3raFX7H4pRC8xf9dKQzTYxCvi14ljjp8q+IH1AWYSZJSZkxA6k03gxVH6Oxbs8XjHWxYQIu4uPhTV3LRShkSRz1WTLYHqu+I/fhmAsAN7YJQHYNFJGkLSBVYRCkSPCQ3efj7TDX455KlojZ23waaqEvH0d9gUMEScRc3Qpq1Tf3X63CNvd5BBO6apiN9Vfq3TZ3YKdhGLQLXBsu3QewCH2qcf6jbU37in6FltyncRsrd84pFsl2ryquOYhwj2slnVNIyhG7zAguRM9p7zvZOPYlgSplcMgW8sQ3Isv25PBGZ+B6Qhwdl4yYpUnc/n7EyxMuthGyID/nhwTBq4f51L3+RNDYnFz9ED26E3IcW/dQdgxPNA=";
}

@Override
public String texture(HypixelPlayer player) {
return "ewogICJ0aW1lc3RhbXAiIDogMTc0MDA3MTUzNTE3NCwKICAicHJvZmlsZUlkIiA6ICI1ODc5MjNlNDkxMzM0ZDMzYWE4ZjQ3ZWJkZTljOTc3MiIsCiAgInByb2ZpbGVOYW1lIiA6ICJFbGV2ZW5mb3VyMTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDZlMzc1NmQ4Y2ZhYzU0MDU1YmNkNTUyNWQyYTNhYmVmZTZjZWY3NzkyNGY4YTk5ODQ2YmVhMmZlZmY3NjExNCIKICAgIH0KICB9Cn0=";
}

@Override
public Pos position(HypixelPlayer player) {
return new Pos(161.5, 69.900, 43.5, 203, 17);
}

@Override
public boolean looking(HypixelPlayer player) {
return true;
}
});
}

@Override
public void onClick(NPCInteractEvent event) {
HypixelPlayer player = event.player();
if (isInDialogue(player)) return;

if(!player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_GAVIN)) {
setDialogue(player, "first-interaction").thenRun(() -> {
player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_GAVIN, true);
});
return;
}

setDialogue(player, "idle-" + (int)(Math.random() * 2 + 1));
}

@Override
protected DialogueSet[] dialogues(HypixelPlayer player) {
return Stream.of(
DialogueSet.builder()
.key("first-interaction").lines(new String[]{
"At the end of each year I bake cakes for everyone in town to celebrate the year.",
"I made one especially for you, here you go.",
"I've recently added a §dNew Year Cake Bag §fto my inventory. Sadly, it's not free! Click me again to open my shop!",
}).build(),
DialogueSet.builder()
.key("idle-1").lines(new String[]{
"You can open your §aSea Creature Guide §fthrough your §aFishing Skill §fmenu, or with §d/scg§f!"
}).build(),
DialogueSet.builder()
.key("idle-2").lines(new String[]{
"I'd rather be out there fishing for §6Treasure§f.",
"But mum insists I finish my studies first."
}).build()
).toArray(DialogueSet[]::new);
}
}
Loading