From acac203e42cc0e8315bd5c9d237fcee036dbf539 Mon Sep 17 00:00:00 2001 From: P0nk Date: Tue, 20 Aug 2024 20:32:33 +0200 Subject: [PATCH] Scheduler free timing for reactor drops --- .../reactor/ReactorActionManager.java | 33 +++++++------------ src/main/java/server/maps/MapleMap.java | 5 +-- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/main/java/scripting/reactor/ReactorActionManager.java b/src/main/java/scripting/reactor/ReactorActionManager.java index b5a9a50cd0..dd82320832 100644 --- a/src/main/java/scripting/reactor/ReactorActionManager.java +++ b/src/main/java/scripting/reactor/ReactorActionManager.java @@ -33,6 +33,7 @@ import server.TimerManager; import server.life.LifeFactory; import server.life.Monster; import server.maps.MapMonitor; +import server.maps.MapleMap; import server.maps.Reactor; import server.maps.ReactorDropEntry; import server.partyquest.CarnivalFactory; @@ -43,7 +44,6 @@ import java.awt.*; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.ScheduledFuture; /** * @author Lerk @@ -52,7 +52,6 @@ import java.util.concurrent.ScheduledFuture; public class ReactorActionManager extends AbstractPlayerInteraction { private final Reactor reactor; private final Invocable iv; - private ScheduledFuture sprayTask = null; public ReactorActionManager(Client c, Reactor reactor, Invocable iv) { super(c); @@ -183,33 +182,24 @@ public class ReactorActionManager extends AbstractPlayerInteraction { drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId)); } - reactor.getMap().dropFromReactor(getPlayer(), reactor, drop, dropPos, (short) d.questid); + reactor.getMap().dropFromReactor(getPlayer(), reactor, drop, dropPos, (short) d.questid, (short) 0); } } } else { - final Reactor r = reactor; - final List dropItems = items; final int worldMesoRate = c.getWorldServer().getMesoRate(); dropPos.x -= (12 * items.size()); - - // TODO: simply use "delay" drop packet instead of this scheduled task - sprayTask = TimerManager.getInstance().register(() -> { - if (dropItems.isEmpty()) { - sprayTask.cancel(false); - return; - } - - ReactorDropEntry d = dropItems.remove(0); + short delay = 0; + for (ReactorDropEntry d : items) { if (d.itemId == 0) { int range = maxMeso - minMeso; int displayDrop = (int) (Math.random() * range) + minMeso; - int mesoDrop = (displayDrop * worldMesoRate); - r.getMap().spawnMesoDrop(mesoDrop, r.getMap().calcDropPos(dropPos, r.getPosition()), r, chr, - false, (byte) 2, (short) 0); + int mesoDrop = displayDrop * worldMesoRate; + MapleMap map = reactor.getMap(); + map.spawnMesoDrop(mesoDrop, map.calcDropPos(dropPos, reactor.getPosition()), reactor, chr, + false, (byte) 2, delay); } else { - Item drop; - + final Item drop; if (ItemConstants.getInventoryType(d.itemId) != InventoryType.EQUIP) { drop = new Item(d.itemId, (short) 0, (short) 1); } else { @@ -217,11 +207,12 @@ public class ReactorActionManager extends AbstractPlayerInteraction { drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId)); } - r.getMap().dropFromReactor(getPlayer(), r, drop, dropPos, (short) d.questid); + reactor.getMap().dropFromReactor(getPlayer(), reactor, drop, dropPos, (short) d.questid, delay); } dropPos.x += 25; - }, 200); + delay += 200; + } } } diff --git a/src/main/java/server/maps/MapleMap.java b/src/main/java/server/maps/MapleMap.java index fc421c1a49..d07fbddd66 100644 --- a/src/main/java/server/maps/MapleMap.java +++ b/src/main/java/server/maps/MapleMap.java @@ -795,9 +795,10 @@ public class MapleMap { dropFromMonster(chr, mob, true, (short) 0); } - public void dropFromReactor(final Character chr, final Reactor reactor, Item drop, Point dropPos, short questid) { + public void dropFromReactor(final Character chr, final Reactor reactor, Item drop, Point dropPos, short questid, + short delay) { spawnDrop(drop, this.calcDropPos(dropPos, reactor.getPosition()), reactor, chr, - (byte) (chr.getParty() != null ? 1 : 0), questid, (short) 0); + (byte) (chr.getParty() != null ? 1 : 0), questid, delay); } private void stopItemMonitor() {