poh: fix burner overlay timers

The object spawn event happens after the lighting animation, which was
causing it to create a new burner with the default timers applied
instead of the one applied via the fm level.

Also fix computing upper limit on the random timer which is not
inclusive of the fm level
This commit is contained in:
Adam
2021-05-23 14:42:23 -04:00
parent f85d5dff43
commit 44134dc668
3 changed files with 19 additions and 17 deletions

View File

@@ -64,12 +64,7 @@ class BurnerOverlay extends Overlay
plugin.getIncenseBurners().forEach((tile, burner) ->
{
if (tile.getPlane() != client.getPlane())
{
return;
}
if (!PohPlugin.BURNER_LIT.contains(burner.getId()))
if (tile.getPlane() != client.getPlane() || !burner.isLit())
{
return;
}

View File

@@ -25,20 +25,22 @@
package net.runelite.client.plugins.poh;
import java.time.Instant;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@RequiredArgsConstructor
@AllArgsConstructor
class IncenseBurner
{
private final Instant start = Instant.now();
private final int id;
private Instant start;
private boolean lit;
private double countdownTimer;
private double randomTimer;
private Instant end;
void reset()
{
countdownTimer = 0;
randomTimer = 0;
}
}

View File

@@ -27,6 +27,7 @@ package net.runelite.client.plugins.poh;
import com.google.common.collect.Sets;
import com.google.inject.Provides;
import java.io.IOException;
import java.time.Instant;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
@@ -49,7 +50,6 @@ import net.runelite.api.Tile;
import net.runelite.api.TileObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.events.AnimationChanged;
import net.runelite.client.events.ConfigChanged;
import net.runelite.api.events.DecorativeObjectDespawned;
import net.runelite.api.events.DecorativeObjectSpawned;
import net.runelite.api.events.GameObjectDespawned;
@@ -57,6 +57,7 @@ import net.runelite.api.events.GameObjectSpawned;
import net.runelite.api.events.GameStateChanged;
import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ConfigChanged;
import net.runelite.client.game.HiscoreManager;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
@@ -144,9 +145,11 @@ public class PohPlugin extends Plugin
return;
}
final double countdownTimer = 130.0; // Minimum amount of seconds a burner will light
final double randomTimer = 30.0; // Minimum amount of seconds a burner will light
incenseBurners.put(event.getTile(), new IncenseBurner(gameObject.getId(), countdownTimer, randomTimer, null));
IncenseBurner incenseBurner = incenseBurners.computeIfAbsent(event.getTile(), k -> new IncenseBurner());
incenseBurner.setStart(Instant.now());
incenseBurner.setLit(BURNER_LIT.contains(gameObject.getId()));
incenseBurner.setEnd(null);
// The burner timers are set when observing a player light the burner
}
@Subscribe
@@ -203,6 +206,7 @@ public class PohPlugin extends Plugin
.ifPresent(tile ->
{
final IncenseBurner incenseBurner = incenseBurners.get(tile);
incenseBurner.reset();
if (actor == client.getLocalPlayer())
{
@@ -245,6 +249,7 @@ public class PohPlugin extends Plugin
{
final double tickLengthSeconds = Constants.GAME_TICK_LENGTH / 1000.0;
incenseBurner.setCountdownTimer((200 + fmLevel) * tickLengthSeconds);
incenseBurner.setRandomTimer(fmLevel * tickLengthSeconds);
incenseBurner.setRandomTimer((fmLevel - 1) * tickLengthSeconds);
log.debug("Set burner timer for firemaking level {}", fmLevel);
}
}