Skip to content

Commit

Permalink
add mineshaft announcements (#202)
Browse files Browse the repository at this point in the history
* feat: add mineshaft announcements

* update part of the widget parsing code
  • Loading branch information
Morazzer authored Nov 17, 2024
1 parent 5ed9612 commit d37eb46
Show file tree
Hide file tree
Showing 27 changed files with 569 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,8 @@ private void addMiningConfig(CookiesTranslationBuilder translationBuilder) {
"Shows the cost for the next 10 levels");
translationBuilder.addConfig(CONFIG_MINING_SHOW_TOTAL_COST, "Total cost", "Shows the total cost.");

translationBuilder.addConfig(CONFIG_MINING_SHAFT, "Mineshaft Helper", "Configs related to the corpse location helper");
translationBuilder.addConfig(CONFIG_MINING_SHAFT, "Mineshaft", "Configs related to mineshafts.");
translationBuilder.addConfig(CONFIG_MINING_SHAFT_ANNOUNCE, "Announce Shaft", "Announces the shaft and it's contents to either you or all of your party!\n\nExample: Mineshaft Entered | AMBE1 | 3L 1U");
translationBuilder.addConfig(CONFIG_MINING_SHAFT_ENABLE, "Enable Helper", "Enables the corpse location helper!");
translationBuilder.addConfig(CONFIG_MINING_SHAFT_TEXT, "Enable text", "Renders a text at every possible corpse's location!");
translationBuilder.addConfig(CONFIG_MINING_SHAFT_BOX, "Enable box", "Renders a box under the corpse's location!");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// 1.21.3 2024-11-17T04:44:52.8413631 cookies-mod/Language (en_us)
797bce4c50d9925c668cd130d03a622e7ac4e1c2 assets\cookies-mod\lang\en_us.json
// 1.21.3 2024-11-17T21:52:35.48846 cookies-mod/Language (en_us)
6e320280d0f984d7ebd402794f17c02815987871 assets/cookies-mod/lang/en_us.json
6 changes: 4 additions & 2 deletions src/main/generated/assets/cookies-mod/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,8 @@
"cookies.config.mining.power_tracker.tooltip": "Settings related to powder tracker hud",
"cookies.config.mining.puzzler_solver.name": "Puzzler solver",
"cookies.config.mining.puzzler_solver.tooltip": "Highlight the correct block for the puzzler.",
"cookies.config.mining.shaft.announce.name": "Announce Shaft",
"cookies.config.mining.shaft.announce.tooltip": "Announces the shaft and it's contents to either you or all of your party!\n\nExample: Mineshaft Entered | AMBE1 | 3L 1U",
"cookies.config.mining.shaft.beam.name": "Enable beacon beam",
"cookies.config.mining.shaft.beam.tooltip": "Renders a beacon beam at the corpse's location!",
"cookies.config.mining.shaft.box.name": "Enable box",
Expand All @@ -277,10 +279,10 @@
"cookies.config.mining.shaft.color.tooltip": "Allows you to change the highlight color that is used for the helper.\n\n§eOnly works for new shafts!",
"cookies.config.mining.shaft.enable.name": "Enable Helper",
"cookies.config.mining.shaft.enable.tooltip": "Enables the corpse location helper!",
"cookies.config.mining.shaft.name": "Mineshaft Helper",
"cookies.config.mining.shaft.name": "Mineshaft",
"cookies.config.mining.shaft.text.name": "Enable text",
"cookies.config.mining.shaft.text.tooltip": "Renders a text at every possible corpse's location!",
"cookies.config.mining.shaft.tooltip": "Configs related to the corpse location helper",
"cookies.config.mining.shaft.tooltip": "Configs related to mineshafts.",
"cookies.config.mining.show_hotm_perk_level_as_stack_size.name": "Show perk as size",
"cookies.config.mining.show_hotm_perk_level_as_stack_size.tooltip": "Shows the hotm perk level as item stack size.",
"cookies.config.mining.show_next_10_cost.name": "Cost for next 10",
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/codes/cookies/mod/CookiesMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.concurrent.ScheduledExecutorService;

import codes.cookies.mod.utils.skyblock.MayorUtils;
import codes.cookies.mod.utils.skyblock.tab.PlayerListUtils;
import lombok.Getter;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
Expand Down Expand Up @@ -76,6 +77,7 @@ public void onInitializeClient() {
CommandManager.addCommands(new OpenConfigCommand(), new DevCommand(), new CookieCommand(), new ViewForgeRecipeCommand());
CommandManager.addCommands(RepositoryConstants.warps.getWarps().entrySet().stream().map(WarpCommand::new).toArray(WarpCommand[]::new));
UpdateChecker.init();
PlayerListUtils.init();
HudManager.load();
this.registerKeyBindings();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import codes.cookies.mod.config.ConfigManager;
import codes.cookies.mod.config.categories.mining.powder.PowderTrackerHudFoldable;
import codes.cookies.mod.config.categories.mining.shaft.ShaftConfig;
import codes.cookies.mod.config.system.Category;
import codes.cookies.mod.config.system.Parent;
import codes.cookies.mod.config.system.Row;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package codes.cookies.mod.config.categories.mining.shaft;

public enum ShaftAnnouncementType {

OFF, CHAT, PARTY

}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package codes.cookies.mod.config.categories.mining;
package codes.cookies.mod.config.categories.mining.shaft;

import java.awt.*;

import codes.cookies.mod.config.ConfigManager;
import codes.cookies.mod.config.system.Foldable;
import codes.cookies.mod.config.system.options.BooleanOption;
import codes.cookies.mod.config.system.options.ColorOption;
import codes.cookies.mod.config.system.options.EnumCycleOption;
import codes.cookies.mod.translations.TranslationKeys;
import codes.cookies.mod.utils.cookies.Constants;

import java.awt.*;

public class ShaftConfig extends Foldable {

public EnumCycleOption<ShaftAnnouncementType> announcementType = new EnumCycleOption<>(
CONFIG_MINING_SHAFT_ANNOUNCE,
ShaftAnnouncementType.CHAT);
public BooleanOption enable = new BooleanOption(TranslationKeys.CONFIG_MINING_SHAFT_ENABLE, true);
public BooleanOption text = new BooleanOption(TranslationKeys.CONFIG_MINING_SHAFT_TEXT, true).onlyIf(enable);
public BooleanOption box = new BooleanOption(TranslationKeys.CONFIG_MINING_SHAFT_BOX, true).onlyIf(enable);
Expand All @@ -19,6 +24,10 @@ public class ShaftConfig extends Foldable {
new Color(Constants.MAIN_COLOR))
.withAlpha().onlyIf(enable);

public static ShaftConfig getConfig() {
return ConfigManager.getConfig().miningConfig.shaftConfig;
}

@Override
public String getName() {
return TranslationKeys.CONFIG_MINING_SHAFT;
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/codes/cookies/mod/events/PlayerListEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package codes.cookies.mod.events;

import codes.cookies.mod.utils.cookies.CookiesEventUtils;

import net.fabricmc.fabric.api.event.Event;

import net.minecraft.client.network.PlayerListEntry;

import java.util.function.Consumer;

/**
* Event related to the player list, will be called on every update.
*/
public interface PlayerListEvent {

Event<Consumer<PlayerListEntry>> EVENT = CookiesEventUtils.consumer();

}
28 changes: 28 additions & 0 deletions src/main/java/codes/cookies/mod/events/PlayerListWidgetEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package codes.cookies.mod.events;

import codes.cookies.mod.utils.cookies.CookiesEventUtils;

import codes.cookies.mod.utils.skyblock.tab.widgets.PlayerListWidget;

import codes.cookies.mod.utils.skyblock.tab.widgets.PlayerListWidgets;

import net.fabricmc.fabric.api.event.Event;

import java.util.function.Consumer;

/**
* Called for all player list widgets that are found in the list.
*/
public interface PlayerListWidgetEvent {

Event<Consumer<PlayerListWidget>> EVENT = CookiesEventUtils.consumer();

static <T extends PlayerListWidget> void register(PlayerListWidgets.Entry<T> entry, Consumer<T> consumer) {
EVENT.register(widget -> {
if (entry.clazz().isInstance(widget)) {
consumer.accept((T) widget);
}
});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ public interface MineshaftEvents {
Event<Consumer<ShaftCorpseLocations.ShaftLocations>> JOIN_SHAFT = CookiesEventUtils.consumer();
Event<Runnable> JOIN = CookiesEventUtils.runnable();
Event<Runnable> LEAVE = CookiesEventUtils.runnable();
Event<Runnable> FIND = CookiesEventUtils.runnable();

}
31 changes: 31 additions & 0 deletions src/main/java/codes/cookies/mod/events/mixins/PlayerListMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package codes.cookies.mod.events.mixins;

import codes.cookies.mod.events.PlayerListEvent;

import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.PlayerListEntry;

import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

/**
* Calls events based on player list entries.
*/
@Mixin(ClientPlayNetworkHandler.class)
public class PlayerListMixin {

@Inject(method = "handlePlayerListAction", at = @At("RETURN"))
public void playerListEvents(
PlayerListS2CPacket.Action action,
PlayerListS2CPacket.Entry receivedEntry,
PlayerListEntry currentEntry,
CallbackInfo ci
) {
PlayerListEvent.EVENT.invoker().accept(currentEntry);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import codes.cookies.mod.features.dungeons.solver.puzzle.PuzzleSolverInstance;
import codes.cookies.mod.features.dungeons.solver.puzzle.WaterBoardPuzzleSolver;
import codes.cookies.mod.utils.skyblock.PartyUtils;
import codes.cookies.mod.utils.skyblock.TabUtils;
import codes.cookies.mod.utils.skyblock.tab.PlayerListUtils;

import java.util.ArrayList;
import java.util.Collection;
Expand Down Expand Up @@ -264,9 +264,9 @@ public void updatePuzzles() {
}
final Collection<PlayerListEntry> listedPlayerListEntries = player.networkHandler.getListedPlayerListEntries();
final List<PlayerListEntry> list = listedPlayerListEntries.stream()
.filter(TabUtils.isInColumn(2))
.sorted(Comparator.comparingInt(TabUtils::getRow))
.filter(entry -> TabUtils.getRow(entry) >= 7 && TabUtils.getRow(entry) <= 12)
.filter(PlayerListUtils.isInColumn(2))
.sorted(Comparator.comparingInt(PlayerListUtils::getRow))
.filter(entry -> PlayerListUtils.getRow(entry) >= 7 && PlayerListUtils.getRow(entry) <= 12)
.toList();

list.forEach(this::handlePuzzleEntry);
Expand Down Expand Up @@ -304,7 +304,7 @@ private void handlePuzzleEntry(PlayerListEntry playerListEntry) {
return;
}

this.handlePuzzleEntry(displayName, TabUtils.getRow(playerListEntry));
this.handlePuzzleEntry(displayName, PlayerListUtils.getRow(playerListEntry));
}

private void handlePuzzleEntry(Text text, int row) {
Expand Down Expand Up @@ -418,8 +418,8 @@ public void updatePlayers() {
}
final Collection<PlayerListEntry> listedPlayerListEntries = player.networkHandler.getListedPlayerListEntries();
final List<PlayerListEntry> list = listedPlayerListEntries.stream()
.filter(TabUtils.isInColumn(0))
.sorted(Comparator.comparingInt(TabUtils::getRow))
.filter(PlayerListUtils.isInColumn(0))
.sorted(Comparator.comparingInt(PlayerListUtils::getRow))
.toList();

if (list.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import codes.cookies.mod.features.mining.commissions.CommissionCompletionHighlighter;
import codes.cookies.mod.features.mining.hollows.MinesOfDivanHelper;
import codes.cookies.mod.features.mining.shafts.CorpseWaypoints;
import codes.cookies.mod.features.mining.shafts.MineshaftAnnouncements;
import codes.cookies.mod.features.mining.shafts.ShaftFeatures;
import codes.cookies.mod.features.mining.utils.HotmUtils;

Expand All @@ -23,6 +24,7 @@ static void load() {
Loader.load("PowderTracker", PowderTracker::load);
Loader.load("PowderHud", PowderHud::new);
Loader.load("ShaftFeatures", ShaftFeatures::load);
Loader.load("MineshaftCorpseMessages", MineshaftAnnouncements::register);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package codes.cookies.mod.features.mining.shafts;

import codes.cookies.mod.config.categories.mining.shaft.ShaftConfig;
import codes.cookies.mod.events.PlayerListWidgetEvent;
import codes.cookies.mod.events.mining.MineshaftEvents;
import codes.cookies.mod.repository.constants.mining.ShaftCorpseLocations;
import codes.cookies.mod.utils.cookies.CookiesUtils;
import codes.cookies.mod.utils.skyblock.PartyUtils;
import codes.cookies.mod.utils.skyblock.tab.widgets.PlayerListWidgets;
import codes.cookies.mod.utils.skyblock.tab.widgets.corpse.CorpseEntry;
import codes.cookies.mod.utils.skyblock.tab.widgets.corpse.CorpseType;
import codes.cookies.mod.utils.skyblock.tab.widgets.corpse.FrozenCorpseWidget;

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
* Sends a message upon joining a mineshaft, that informs about type and corpses in the shaft.
*/
public class MineshaftAnnouncements {

private static boolean hasSendMessage = false;
private static ShaftCorpseLocations.ShaftLocations shaftType;
private static long lastShaftFoundAt = -1;

public static void register() {
MineshaftEvents.JOIN_SHAFT.register(MineshaftAnnouncements::join);
MineshaftEvents.LEAVE.register(MineshaftAnnouncements::leave);
MineshaftEvents.FIND.register(MineshaftAnnouncements::find);
PlayerListWidgetEvent.register(PlayerListWidgets.CORPSE, MineshaftAnnouncements::corpseWidgetUpdate);
}

private static void find() {
lastShaftFoundAt = System.currentTimeMillis();
PartyUtils.request();
}

private static void join(ShaftCorpseLocations.ShaftLocations shaftLocations) {
if (lastShaftFoundAt + 60 * 1000 < System.currentTimeMillis()) {
return;
}
shaftType = shaftLocations;
hasSendMessage = false;
}

private static void corpseWidgetUpdate(FrozenCorpseWidget widget) {
if (hasSendMessage || shaftType == null) {
return;
}

final Map<CorpseType, List<CorpseEntry>> collect = widget.getCorpses()
.stream()
.sorted(Comparator.comparingInt(entry -> entry.corpseType().ordinal()))
.collect(Collectors.groupingBy(CorpseEntry::corpseType));

final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Mineshaft entered | ");
stringBuilder.append(shaftType.id()).append(" | ");

final List<CorpseEntry> unknown = collect.remove(CorpseType.UNKNOWN);

if (collect.containsKey(CorpseType.VANGUARD)) {
stringBuilder.append("vang ");
} else {
collect.forEach((type, list) -> stringBuilder.append(list.size())
.append(type.name().charAt(0))
.append(" "));
}

if (unknown != null) {
stringBuilder.append("| ").append(unknown.size()).append(" Unknown");
}

switch (ShaftConfig.getConfig().announcementType.getValue()) {
case CHAT -> CookiesUtils.sendWhiteMessage(stringBuilder.toString());
case PARTY -> {
if (PartyUtils.isInParty()) {
CookiesUtils.sendInformation("Sending message into party chat!");
CookiesUtils.sendCommand("pc " + stringBuilder);
} else {
CookiesUtils.sendFailedMessage("Not in a party!");
CookiesUtils.sendWhiteMessage(stringBuilder.toString());
}
}
}
hasSendMessage = true;
}

private static void leave() {
hasSendMessage = true;
shaftType = null;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@
import codes.cookies.mod.repository.constants.mining.ShaftCorpseLocations;
import codes.cookies.mod.utils.cookies.CookiesUtils;
import codes.cookies.mod.utils.skyblock.LocationUtils;
import lombok.Getter;

import java.util.Optional;

public class ShaftFeatures {
private static boolean isInShaft = false;
@Getter
public static long lastShaftFoundAt = -1;
private static ShaftCorpseLocations.ShaftLocations locations;

public static Optional<ShaftCorpseLocations.ShaftLocations> getCurrentMineshaftLocations() {
Expand All @@ -21,7 +24,6 @@ public static Optional<ShaftCorpseLocations.ShaftLocations> getCurrentMineshaftL
public static void load() {
IslandChangeEvent.EVENT.register(ShaftFeatures::swapIsland);
ScoreboardUpdateEvent.EVENT.register(ShaftFeatures::updateLine);
MineshaftEvents.JOIN_SHAFT.register(shaft -> MineshaftEvents.JOIN.invoker().run());
}

private static void swapIsland(LocationUtils.Island previous, LocationUtils.Island current) {
Expand All @@ -34,6 +36,7 @@ private static void swapIsland(LocationUtils.Island previous, LocationUtils.Isla

if (current == LocationUtils.Island.MINESHAFT) {
isInShaft = true;
MineshaftEvents.JOIN.invoker().run();
}
}

Expand Down
Loading

0 comments on commit d37eb46

Please sign in to comment.