Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
43 changes: 43 additions & 0 deletions src/main/java/com/duckblade/osrs/sailing/SailingConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ public interface SailingConfig extends Config
)
String SECTION_CARGO_HOLD_TRACKING = "cargoHoldTracking";

@ConfigSection(
name = "Boat Hider",
description = "Settings for hiding parts of the boat.",
position = 900,
closedByDefault = true
)
String SECTION_BOAT_HIDER = "boatHider";

@ConfigItem(
keyName = "highlightRapids",
name = "Highlight Rapids",
Expand All @@ -102,6 +110,30 @@ default boolean highlightTrimmableSails()
return true;
}

@ConfigItem(
keyName = "highlightSail",
name = "Highlight Sail",
description = "Highlight outline of the sail.",
section = SECTION_FACILITIES,
position = 2
)
default boolean highlightSail()
{
return false;
}

@ConfigItem(
keyName = "colorSailOutline",
name = "Sail",
description = "Outline color of the sail.",
section = SECTION_FACILITIES,
position = 3
)
default Color colorSailOutline()
{
return Color.BLACK;
}

enum CrewmateMuteMode
{
NONE,
Expand Down Expand Up @@ -267,4 +299,15 @@ default boolean cargoHoldShowCounts()
return true;
}

@ConfigItem(
keyName = "hideBoatSail",
name = "Hide Boat Sail",
description = "Hides the sail of the boat.",
section = SECTION_BOAT_HIDER,
position = 1
)
default boolean hideBoatSail()
{
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.duckblade.osrs.sailing.features.boat;

import com.duckblade.osrs.sailing.SailingConfig;
import com.duckblade.osrs.sailing.features.util.BoatTracker;
import com.duckblade.osrs.sailing.features.util.SailingUtil;
import com.duckblade.osrs.sailing.model.Boat;
import com.duckblade.osrs.sailing.module.PluginLifecycleComponent;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
import net.runelite.api.Client;
import net.runelite.api.Scene;
import net.runelite.api.TileObject;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.WorldEntityDespawned;
import net.runelite.client.callback.RenderCallback;
import net.runelite.client.callback.RenderCallbackManager;
import net.runelite.client.eventbus.Subscribe;

@Singleton
@RequiredArgsConstructor(onConstructor_ = @Inject)
public class BoatHider implements PluginLifecycleComponent, RenderCallback
{
@Inject
private Client client;
@Inject
private SailingConfig config;
@Inject
private BoatTracker boatTracker;
@Inject
private RenderCallbackManager renderCallbackManager;

@Nullable
private Boat boat;

@Override
public boolean isEnabled(final SailingConfig config)
{
return config.hideBoatSail();
}

@Override
public void startUp()
{
renderCallbackManager.register(this);
}

@Override
public void shutDown()
{
renderCallbackManager.unregister(this);
boat = null;
}

@Subscribe
public void onWorldEntityDespawned(final WorldEntityDespawned e)
{
if (boat != null && e.getWorldEntity() == boat.getWorldEntity())
{
boat = null;
}
}

@Subscribe
public void onGameTick(final GameTick e)
{
if (boat == null && SailingUtil.isSailing(client))
{
// must be called on client thread
boat = boatTracker.getBoat();
}
}

@Override
public boolean drawObject(final Scene scene, final TileObject object)
{
if (boat != null)
{
final var wv = object.getWorldView();
if (boat.getWorldViewId() == wv.getId())
{
return !(object == boat.getSail() && config.hideBoatSail());
}
}
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.duckblade.osrs.sailing.features;
package com.duckblade.osrs.sailing.features.boat;

import com.duckblade.osrs.sailing.SailingConfig;
import com.duckblade.osrs.sailing.features.util.SailingUtil;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.duckblade.osrs.sailing.features.boat;

import com.duckblade.osrs.sailing.SailingConfig;
import com.duckblade.osrs.sailing.features.util.BoatTracker;
import com.duckblade.osrs.sailing.features.util.SailingUtil;
import com.duckblade.osrs.sailing.module.PluginLifecycleComponent;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Stroke;
import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayUtil;

@Slf4j
@Singleton
public class SailOverlay
extends Overlay
implements PluginLifecycleComponent
{
private final Client client;
private final SailingConfig config;
private final BoatTracker boatTracker;

@Inject
public SailOverlay(
final Client client,
final SailingConfig config,
final BoatTracker boatTracker)
{
this.client = client;
this.config = config;
this.boatTracker = boatTracker;

setLayer(OverlayLayer.ABOVE_SCENE);
setPosition(OverlayPosition.DYNAMIC);
}

@Override
public boolean isEnabled(final SailingConfig config)
{
return config.highlightSail();
}

@Override
public Dimension render(final Graphics2D g)
{
if (!SailingUtil.isSailing(client))
{
return null;
}

final var boat = boatTracker.getBoat();
if (boat == null)
{
return null;
}

final var sail = boat.getSail();
if (sail != null)
{
final var convextHull = sail.getConvexHull();
if (convextHull != null)
{
g.setColor(config.colorSailOutline());
final var originalStroke = g.getStroke();
g.setStroke(new BasicStroke(1));
g.draw(convextHull);
g.setColor(new Color(0, 0, 0, 32));
g.fill(convextHull);
g.setStroke(originalStroke);
}
}

return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.duckblade.osrs.sailing.features.util;

import com.duckblade.osrs.sailing.features.boat.SailOverlay;
import com.duckblade.osrs.sailing.model.Boat;
import com.duckblade.osrs.sailing.model.CargoHoldTier;
import com.duckblade.osrs.sailing.model.HelmTier;
Expand All @@ -15,11 +16,14 @@
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client;
import net.runelite.api.GameObject;
import net.runelite.api.GameState;
import net.runelite.api.WorldEntity;
import net.runelite.api.WorldView;
import net.runelite.api.events.GameObjectDespawned;
import net.runelite.api.events.GameObjectSpawned;
import net.runelite.api.events.WorldEntityDespawned;
import net.runelite.api.events.WorldEntitySpawned;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.eventbus.Subscribe;

@Slf4j
Expand All @@ -31,6 +35,23 @@ public class BoatTracker

private final Map<Integer, Boat> trackedBoats = new HashMap<>();
private final Client client;
private final ClientThread clientThread;

@Override
public void startUp()
{
clientThread.invokeLater(() -> {
if (client.getGameState() == GameState.LOGGED_IN)
{
// check if plugin was turned on after WorldEntitySpawned event
if (SailingUtil.isSailing(client) &&
trackedBoats.get(client.getLocalPlayer().getWorldView().getId()) == null)
{
simulateWorldEntitySpawned(client.getTopLevelWorldView());
}
}
});
}

public void shutDown()
{
Expand Down Expand Up @@ -132,6 +153,19 @@ public void onGameObjectDespawned(GameObjectDespawned e)
}
}

private void simulateWorldEntitySpawned(final WorldView worldView)
{
for (final var we : worldView.worldEntities())
{
onWorldEntitySpawned(new WorldEntitySpawned(we));
}

for (final var wv : worldView.worldViews())
{
simulateWorldEntitySpawned(wv);
}
}

public Boat getBoat()
{
return getBoat(client.getLocalPlayer().getWorldView().getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import com.duckblade.osrs.sailing.SailingConfig;
import com.duckblade.osrs.sailing.features.CargoHoldTracker;
import com.duckblade.osrs.sailing.features.LuffOverlay;
import com.duckblade.osrs.sailing.features.boat.BoatHider;
import com.duckblade.osrs.sailing.features.boat.LuffOverlay;
import com.duckblade.osrs.sailing.features.RapidsOverlay;
import com.duckblade.osrs.sailing.features.barracudatrials.BarracudaTrialHelper;
import com.duckblade.osrs.sailing.features.boat.SailOverlay;
import com.duckblade.osrs.sailing.features.charting.CurrentDuckTaskTracker;
import com.duckblade.osrs.sailing.features.charting.SeaChartOverlay;
import com.duckblade.osrs.sailing.features.charting.SeaChartPanelOverlay;
Expand Down Expand Up @@ -46,12 +48,14 @@ Set<PluginLifecycleComponent> lifecycleComponents(
CurrentDuckTaskTracker currentDuckTaskTracker,
DeprioSailsOffHelm deprioSailsOffHelm,
LuffOverlay luffOverlay,
SailOverlay sailOverlay,
PrioritizeCargoHold prioritizeCargoHold,
RapidsOverlay rapidsOverlay,
SeaChartOverlay seaChartOverlay,
SeaChartPanelOverlay seaChartPanelOverlay,
SeaChartTaskIndex seaChartTaskIndex,
WeatherTaskTracker weatherTaskTracker
WeatherTaskTracker weatherTaskTracker,
BoatHider boatHider
)
{
var builder = ImmutableSet.<PluginLifecycleComponent>builder()
Expand All @@ -62,12 +66,14 @@ Set<PluginLifecycleComponent> lifecycleComponents(
.add(currentDuckTaskTracker)
.add(deprioSailsOffHelm)
.add(luffOverlay)
.add(sailOverlay)
.add(prioritizeCargoHold)
.add(rapidsOverlay)
.add(seaChartOverlay)
.add(seaChartPanelOverlay)
.add(seaChartTaskIndex)
.add(weatherTaskTracker);
.add(weatherTaskTracker)
.add(boatHider);

// features still in development
if (developerMode)
Expand Down