runelite-client: add synchronous job scheduler

Convert existing plugins to use it, so that the code all runs on the same
main game thread. Fixes various thread related issues caused from
accessing game state from executor threads.
This commit is contained in:
Adam
2017-07-11 10:16:15 -04:00
parent 8f4134f4bf
commit 63192e5249
15 changed files with 401 additions and 142 deletions

View File

@@ -32,6 +32,7 @@ import net.runelite.api.Skill;
import net.runelite.client.RuneLite;
import net.runelite.client.events.*;
import net.runelite.client.game.DeathChecker;
import net.runelite.client.task.Scheduler;
import net.runelite.client.ui.overlay.OverlayRenderer;
import net.runelite.rs.api.MainBufferProvider;
import org.slf4j.Logger;
@@ -41,16 +42,23 @@ public class Hooks
{
private static final Logger logger = LoggerFactory.getLogger(Hooks.class);
private static final long CHECK = 600; // ms - how often to run checks
private static final RuneLite runelite = RuneLite.getRunelite();
private static final DeathChecker death = new DeathChecker(runelite);
public static void draw(Object provider, Graphics graphics, int x, int y)
{
// XXX fix injector to use interface in signature
MainBufferProvider mpb = (MainBufferProvider) provider;
BufferedImage image = (BufferedImage) mpb.getImage();
private static long lastCheck;
OverlayRenderer renderer = runelite.getRenderer();
public static void clientMainLoop(Object client, boolean arg1)
{
long now = System.currentTimeMillis();
if (now - lastCheck < CHECK)
{
return;
}
lastCheck = now;
try
{
@@ -61,6 +69,18 @@ public class Hooks
logger.warn("error during death check", ex);
}
Scheduler scheduler = runelite.getScheduler();
scheduler.tick();
}
public static void draw(Object provider, Graphics graphics, int x, int y)
{
// XXX fix injector to use interface in signature
MainBufferProvider mpb = (MainBufferProvider) provider;
BufferedImage image = (BufferedImage) mpb.getImage();
OverlayRenderer renderer = runelite.getRenderer();
try
{
renderer.render(image);