From 8fa7b2e6557a7dbe750c6c749b0388bfc1e7fdbb Mon Sep 17 00:00:00 2001 From: Kavin Charles <87717754+Kavin-Charles@users.noreply.github.com> Date: Mon, 11 Aug 2025 13:44:45 +0530 Subject: [PATCH] Added the shephard mission --- .../missions/shepherd/MissionShearSheep.java | 68 +++++++++++++++++++ .../shepherd/MissionTalkToShepherd.java | 58 ++++++++++++++++ .../thefarmingislands/npcs/NPCShepherd.java | 30 +++++++- 3 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionShearSheep.java create mode 100644 type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionTalkToShepherd.java diff --git a/type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionShearSheep.java b/type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionShearSheep.java new file mode 100644 index 000000000..092ab9dc0 --- /dev/null +++ b/type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionShearSheep.java @@ -0,0 +1,68 @@ +package net.swofty.types.generic.mission.missions.shepherd; + +import net.minestom.server.entity.EntityType; +import net.swofty.types.generic.event.EventNodes; +import net.swofty.types.generic.event.SkyBlockEvent; +import net.swofty.types.generic.event.custom.PlayerKilledSkyBlockMobEvent; +import net.swofty.types.generic.levels.SkyBlockLevelCause; +import net.swofty.types.generic.mission.MissionData; +import net.swofty.types.generic.mission.SkyBlockProgressMission; +import net.swofty.types.generic.region.RegionType; +import net.swofty.types.generic.skill.SkillCategories; +import net.swofty.types.generic.user.SkyBlockPlayer; + +import java.util.*; + +public class MissionShearSheep extends SkyBlockProgressMission { + + @SkyBlockEvent(node = EventNodes.CUSTOM, requireDataLoaded = false) + public void onKilledSheep(PlayerKilledSkyBlockMobEvent event) { + if (event.getKilledMob().getEntityType() != EntityType.SHEEP) return; + + MissionData data = event.getPlayer().getMissionData(); + if (!data.isCurrentlyActive(this.getClass()) || data.hasCompleted(this.getClass())) return; + + MissionData.ActiveMission mission = data.getMission(this.getClass()).getKey(); + mission.setMissionProgress(mission.getMissionProgress() + 1); + mission.checkIfMissionEnded(event.getPlayer()); + } + + @Override + public String getID() { + return "mission_shear_sheep"; + } + + @Override + public String getName() { + return "Shear Sheep"; + } + + @Override + public Map onStart(SkyBlockPlayer player, MissionData.ActiveMission mission) { + mission.getNewObjectiveText().forEach(player::sendMessage); + return new HashMap<>(); + } + + @Override + public void onEnd(SkyBlockPlayer player, Map customData, MissionData.ActiveMission mission) { + mission.getObjectiveCompleteText(new ArrayList<>(List.of("§b20 Farming XP", "§6100 §7Coins"))).forEach(player::sendMessage); + player.getSkills().increase(player, SkillCategories.FARMING, 20D); + player.addCoins(100); + player.getSkyBlockExperience().addExperience(SkyBlockLevelCause.getMissionCause(getID())); + } + + @Override + public Set getValidRegions() { + return Collections.singleton(RegionType.SHEPHERD_KEEP); + } + + @Override + public Double getAttachedSkyBlockXP() { + return 5D; + } + + @Override + public int getMaxProgress() { + return 5; + } +} diff --git a/type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionTalkToShepherd.java b/type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionTalkToShepherd.java new file mode 100644 index 000000000..011fb7bcd --- /dev/null +++ b/type.generic/src/main/java/net/swofty/types/generic/mission/missions/shepherd/MissionTalkToShepherd.java @@ -0,0 +1,58 @@ +package net.swofty.types.generic.mission.missions.shepherd; + +import net.swofty.types.generic.event.EventNodes; +import net.swofty.types.generic.event.SkyBlockEvent; +import net.swofty.types.generic.event.custom.VillagerSpokenToEvent; +import net.swofty.types.generic.mission.MissionData; +import net.swofty.types.generic.mission.SkyBlockMission; +import net.swofty.types.generic.region.RegionType; +import net.swofty.types.generic.user.SkyBlockPlayer; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class MissionTalkToShepherd extends SkyBlockMission { + @SkyBlockEvent(node = EventNodes.CUSTOM, requireDataLoaded = false) + public void onVillagerSpokenTo(VillagerSpokenToEvent event) { + MissionData data = event.getPlayer().getMissionData(); + + // Check if this is the Shepherd NPC + if (!event.getVillager().getID().contains("Shepherd")) { + return; + } + + if (data.isCurrentlyActive(this.getClass()) || data.hasCompleted(this.getClass())) { + return; + } + + data.setSkyBlockPlayer(event.getPlayer()); + data.startMission(this.getClass()); + } + + @Override + public String getID() { + return "talk_to_shepherd"; + } + + @Override + public String getName() { + return "Talk to the Shepherd"; + } + + @Override + public Map onStart(SkyBlockPlayer player, MissionData.ActiveMission mission) { + return new HashMap<>(); + } + + @Override + public void onEnd(SkyBlockPlayer player, Map customData, MissionData.ActiveMission mission) { + // Start the next mission in the chain + player.getMissionData().startMission(MissionShearSheep.class); + } + + @Override + public Set getValidRegions() { + return Set.of(RegionType.SHEPHERD_KEEP); + } +} diff --git a/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/npcs/NPCShepherd.java b/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/npcs/NPCShepherd.java index d87d5d1b7..c6b42c659 100644 --- a/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/npcs/NPCShepherd.java +++ b/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/npcs/NPCShepherd.java @@ -5,6 +5,9 @@ import net.minestom.server.coordinate.Pos; import net.swofty.types.generic.entity.npc.NPCParameters; import net.swofty.types.generic.entity.npc.SkyBlockNPC; +import net.swofty.types.generic.mission.MissionData; +import net.swofty.types.generic.mission.missions.shepherd.MissionShearSheep; +import net.swofty.types.generic.mission.missions.shepherd.MissionTalkToShepherd; import net.swofty.types.generic.user.SkyBlockPlayer; public class NPCShepherd extends SkyBlockNPC { @@ -12,7 +15,7 @@ public NPCShepherd() { super(new NPCParameters() { @Override public String[] holograms(SkyBlockPlayer player) { - return new String[]{"Shepherd", "§e§lCLICK"}; + return new String[]{"§fShepherd", "§e§lCLICK"}; } @Override @@ -39,7 +42,28 @@ public boolean looking() { @Override public void onClick(PlayerClickNPCEvent e) { - e.player().sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, "https://github.com/Swofty-Developments/HypixelSkyBlock"))); + MissionData data = e.player().getMissionData(); + + if (!data.hasCompleted(MissionTalkToShepherd.class) && !data.isCurrentlyActive(MissionTalkToShepherd.class)) { + sendNPCMessage(e.player(), "Howdy! Mind helping shear some sheep around §bShepherd's Keep§f?"); + data.setSkyBlockPlayer(e.player()); + data.startMission(MissionTalkToShepherd.class); + return; + } + + if (!data.hasCompleted(MissionShearSheep.class) && data.isCurrentlyActive(MissionShearSheep.class)) { + sendNPCMessage(e.player(), "You're doing great! Keep shearing those sheep."); + return; + } + + if (!data.hasCompleted(MissionShearSheep.class) && !data.isCurrentlyActive(MissionShearSheep.class)) { + // If they talked already but didn't get the shearing mission for some reason, start it + data.setSkyBlockPlayer(e.player()); + data.startMission(MissionShearSheep.class); + sendNPCMessage(e.player(), "Shear a few sheep and come back to me."); + return; + } + + sendNPCMessage(e.player(), "Thanks for helping out with the flock!"); } }