Skip to content
Open
19 changes: 10 additions & 9 deletions resources/assets/edenmod/lang/en_us.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
{
"key.edenmod.open_config": "Open Config",
"key.edenmod.open_emote_picker": "Open Emote Picker",
"key.edenmod.open_emote_wheel": "Open Emote Wheel",
"key.edenmod.open_menu": "Open Menu",
"key.edenmod.open_territory_menu": "Open Territory Menu",
"key.edenmod.toggle_territory_outlines": "Toggle Territory Wall",
"key.category.minecraft.edenmod": "EdenMod"
}
{
"key.edenmod.open_config": "Open Config",
"key.edenmod.open_emote_picker": "Open Emote Picker",
"key.edenmod.open_emote_wheel": "Open Emote Wheel",
"key.edenmod.open_menu": "Open Menu",
"key.edenmod.open_territory_menu": "Open Territory Menu",
"key.edenmod.toggle_territory_outlines": "Toggle Territory Wall",
"key.edenmod.tcc_report_exit": "Report TCC Exit",
"key.category.minecraft.edenmod": "EdenMod"
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
45 changes: 43 additions & 2 deletions src/tel/eden/mod/EdenModClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,7 @@ public boolean isChiefOwnerOrStrategist() {
public void onWorldRespawn() {
enteredWynnGameWorld = true;
guildLogSync.onWorldJoin();
tel.eden.mod.raid.tcc.TccLabyrinthTracker.reset();
}

/** Packet hooks for the invisible guild-log query (mirrors Wynntils' query path). */
Expand Down Expand Up @@ -633,12 +634,14 @@ public void release() {
TerritoryMenuKeybind.register(edenCategory);
TerritoryOutlineRenderer.register(edenCategory);
tel.eden.mod.emote.EmoteWheel.register(edenCategory);
tel.eden.mod.raid.tcc.TccLabyrinthTracker.registerKeybind(edenCategory);
WarTracker.setReporter(this::relayWarAttended);

// War-suite 2D HUD overlays, drawn only while on Wynncraft.
HudRenderCallback.EVENT.register((graphics, tickCounter) -> {
if (onWynncraft) {
WarHud.render(config, graphics);
tel.eden.mod.raid.tcc.TccLabyrinthMapHud.render(config, graphics);
}
});
// War-suite territory outlines, added to the per-frame gizmo collector during
Expand All @@ -663,6 +666,7 @@ public void release() {
AllianceMenuScraper.reset();
GuildMenuScraper.reset();
AttackTimerMenu.onWorldJoin();
tel.eden.mod.raid.tcc.TccLabyrinthTracker.reset();
tel.eden.mod.war.radiance.RadianceTracker.onJoin();
guildAllyManager.requestCancel();
// Connect if applicable; the backend reports link/membership standing via
Expand Down Expand Up @@ -710,7 +714,12 @@ public void release() {
}))).then(ClientCommandManager.literal("congratulate").then(ClientCommandManager.argument("name", StringArgumentType.word()).executes(ctx -> {
congratulate(ctx.getSource(), StringArgumentType.getString(ctx, "name"));
return 1;
}))).then(ClientCommandManager.literal("debug").executes(ctx -> {
}))).then(ClientCommandManager.literal("tcctest").executes(ctx -> {
boolean next = !tel.eden.mod.raid.tcc.TccLabyrinthTracker.isDebugForceShow();
tel.eden.mod.raid.tcc.TccLabyrinthTracker.setDebugForceShow(next);
ctx.getSource().sendFeedback(Component.literal("TCC Labyrinth minimap test force-show: " + (next ? "ON" : "OFF")).withStyle(ChatFormatting.AQUA));
return 1;
})).then(ClientCommandManager.literal("debug").executes(ctx -> {
for (String line : AttackTimerMenu.debugSidebarLines()) {
ctx.getSource().sendFeedback(Component.literal("[debug] " + line).withStyle(ChatFormatting.AQUA));
}
Expand Down Expand Up @@ -761,6 +770,7 @@ private void onClientTick(Minecraft client) {
tel.eden.mod.war.radiance.RadianceTracker.onClientTick(config, client);
RaidPartyTracker.onTick();
RaidReadyTracker.onClientTick();
tel.eden.mod.raid.tcc.TccLabyrinthTracker.tick(config, socket);
PartyHealthTracker.tick();
AttackMenuScraper.onTick(client);
AllianceMenuScraper.onTick(client);
Expand Down Expand Up @@ -1086,6 +1096,36 @@ public void onRadianceCast(String sender, String senderUuid, String groupKey, in
}

@Override
public void onTccMapPos(String sender, String senderUuid, double x, double y, double z, float yaw, boolean isWings) {
Minecraft mc = Minecraft.getInstance();
mc.execute(() -> {
if (mc.player != null) {
String myUuid = mc.player.getUUID().toString().replace("-", "");
String cleanSenderUuid = senderUuid != null ? senderUuid.replace("-", "").trim() : "";
if (!cleanSenderUuid.isEmpty() && cleanSenderUuid.equalsIgnoreCase(myUuid)) {
return;
}
}
tel.eden.mod.raid.tcc.TccLabyrinthTracker.onPeerPosition(sender, senderUuid, x, y, z, yaw, isWings);
});
}

@Override
public void onTccGolemDefeated(String sender, String golemId) {
Minecraft mc = Minecraft.getInstance();
mc.execute(() -> tel.eden.mod.raid.tcc.TccLabyrinthTracker.onPeerGolemDefeated(golemId));
}

@Override
public void onTccExitReached(String sender, String path, double x, double z) {
Minecraft mc = Minecraft.getInstance();
mc.execute(() -> {
if (mc.player != null && sender != null && sender.equalsIgnoreCase(mc.player.getScoreboardName())) {
return;
}
tel.eden.mod.raid.tcc.TccLabyrinthTracker.onPeerExitReached(sender, path, x, z, config);
});
}
public void onConnectionRejected(String code) {
pendingConnectionCode = code;
Minecraft.getInstance().execute(() -> socket = null);
Expand Down Expand Up @@ -2370,7 +2410,8 @@ private synchronized void disconnect() {
RaidPartyTracker.reset();
RaidReadyTracker.reset();
PartyHealthTracker.reset();
ChatReplyManager.reset();
tel.eden.mod.raid.tcc.TccLabyrinthTracker.reset();
tel.eden.mod.util.PlayerSkinResolver.reset();
tel.eden.mod.war.radiance.RadianceTracker.onDisconnect();
guildAllyManager.requestCancel();
territoryDefendedTracker.clear();
Expand Down
11 changes: 11 additions & 0 deletions src/tel/eden/mod/chat/RaidPartyTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,17 @@ public static List<String> debugState() {
return out;
}

/**
* The current raid's party as last read from Wynntils or the hidden {@code /party list}
* reply (real IGNs where they could be resolved). Empty outside a raid or before the
* reply arrives.
*/
public static List<String> partyMembers() {
synchronized (LOCK) {
return new ArrayList<>(partyMembers);
}
}

public static Set<String> partyMembersForTesting() {
synchronized (LOCK) {
return new LinkedHashSet<>(partyMembers);
Expand Down
6 changes: 6 additions & 0 deletions src/tel/eden/mod/config/BridgeConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,12 @@ public void sanitize() {
/** Minimum number of gambits required to ready up normally (range 0-3, default 1). */
public int raidGambitMinimum = 1;

/** Live minimap HUD for The Canyon Colossus Room 2 Labyrinth. */
public boolean tccLabyrinthMap = true;

/** Audio ping when an exit in TCC Room 2 Labyrinth is discovered/confirmed. */
public boolean tccExitPing = true;

/** Disallow readying up in the raid menu if the raid is not a guild raid. */
public boolean requireGuildRaid = false;

Expand Down
2 changes: 2 additions & 0 deletions src/tel/eden/mod/gui/BridgeConfigScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ protected void init() {
addToggleRow(Category.PARTY_RAIDS, "Raid gambit ready safety", () -> config.raidGambitSafety, v -> config.raidGambitSafety = v, "On", "Off", true);
IntConfigSlider gambitSlider = new IntConfigSlider(CONTROL_W, 20, 0, 3, 1, () -> config.raidGambitMinimum, v -> config.raidGambitMinimum = v, v -> Component.literal(v == 0 ? "Off (0)" : String.valueOf(v)));
addSliderRow(Category.PARTY_RAIDS, "Minimum raid gambits", gambitSlider, gambitSlider::syncFromConfig, () -> config.raidGambitMinimum = 1);
addToggleRow(Category.PARTY_RAIDS, "TCC Labyrinth minimap (Map credits: kimchaewon)", () -> config.tccLabyrinthMap, v -> config.tccLabyrinthMap = v, "On", "Off", true);
addToggleRow(Category.PARTY_RAIDS, "TCC exit discovery ping", () -> config.tccExitPing, v -> config.tccExitPing = v, "On", "Off", true);
addToggleRow(Category.PARTY_RAIDS, "Require guild raid to ready", () -> config.requireGuildRaid, v -> config.requireGuildRaid = v, "On", "Off", false);

// War & Territory
Expand Down
2 changes: 1 addition & 1 deletion src/tel/eden/mod/hud/HudPanels.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@
*/
public record HudPanels(String name, String label, float defaultX, float defaultY, int previewWidth, int previewHeight) {

public static final List<HudPanels> ALL = List.of(new HudPanels("attackTimers", "Attack timers", 0.40f, 0.14f, 130, 44), new HudPanels("warInfo", "War info overlay", 0.015f, 0.30f, 150, 74), new HudPanels("weeklyWars", "Weekly war count", 0.83f, 0.04f, 60, 12), new HudPanels("radianceTracker", "Radiance tracker", 0.50f, 0.35f, 110, 24));
public static final List<HudPanels> ALL = List.of(new HudPanels("attackTimers", "Attack timers", 0.40f, 0.14f, 130, 44), new HudPanels("warInfo", "War info overlay", 0.015f, 0.30f, 150, 74), new HudPanels("weeklyWars", "Weekly war count", 0.83f, 0.04f, 60, 12), new HudPanels("radianceTracker", "Radiance tracker", 0.50f, 0.35f, 110, 24), new HudPanels("tccLabyrinthMap", "TCC Labyrinth minimap", 0.02f, 0.05f, 130, 180));
}
20 changes: 20 additions & 0 deletions src/tel/eden/mod/mixin/ClientPacketListenerMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
import net.minecraft.network.protocol.game.ClientboundSoundPacket;
import net.minecraft.network.protocol.game.ClientboundSetActionBarTextPacket;
import net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket;
import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket;
import net.minecraft.network.protocol.game.ClientboundRespawnPacket;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
Expand All @@ -33,6 +35,24 @@ public class ClientPacketListenerMixin {
}
}

@Inject(method = "setTitleText", at = @At("HEAD"))
private void edenBridge$observeTitleText(ClientboundSetTitleTextPacket packet, CallbackInfo ci) {
Minecraft minecraft = Minecraft.getInstance();
if (minecraft.isSameThread()) {
EdenModClient mod = EdenModClient.instance();
tel.eden.mod.raid.tcc.TccLabyrinthTracker.onTitle(packet.text(), mod != null ? mod.config() : null, mod != null ? mod.socket() : null);
}
}

@Inject(method = "setSubtitleText", at = @At("HEAD"))
private void edenBridge$observeSubtitleText(ClientboundSetSubtitleTextPacket packet, CallbackInfo ci) {
Minecraft minecraft = Minecraft.getInstance();
if (minecraft.isSameThread()) {
EdenModClient mod = EdenModClient.instance();
tel.eden.mod.raid.tcc.TccLabyrinthTracker.onTitle(packet.text(), mod != null ? mod.config() : null, mod != null ? mod.socket() : null);
}
}

@Inject(method = "handleSoundEvent", at = @At("HEAD"), cancellable = true)
private void edenBridge$muteBackgroundContainerClick(ClientboundSoundPacket packet, CallbackInfo ci) {
Minecraft minecraft = Minecraft.getInstance();
Expand Down
Loading
Loading