Scheduler free timing for reactor drops

This commit is contained in:
P0nk
2024-08-20 20:32:33 +02:00
parent cdd1c8cb61
commit acac203e42
2 changed files with 15 additions and 23 deletions

View File

@@ -33,6 +33,7 @@ import server.TimerManager;
import server.life.LifeFactory; import server.life.LifeFactory;
import server.life.Monster; import server.life.Monster;
import server.maps.MapMonitor; import server.maps.MapMonitor;
import server.maps.MapleMap;
import server.maps.Reactor; import server.maps.Reactor;
import server.maps.ReactorDropEntry; import server.maps.ReactorDropEntry;
import server.partyquest.CarnivalFactory; import server.partyquest.CarnivalFactory;
@@ -43,7 +44,6 @@ import java.awt.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture;
/** /**
* @author Lerk * @author Lerk
@@ -52,7 +52,6 @@ import java.util.concurrent.ScheduledFuture;
public class ReactorActionManager extends AbstractPlayerInteraction { public class ReactorActionManager extends AbstractPlayerInteraction {
private final Reactor reactor; private final Reactor reactor;
private final Invocable iv; private final Invocable iv;
private ScheduledFuture<?> sprayTask = null;
public ReactorActionManager(Client c, Reactor reactor, Invocable iv) { public ReactorActionManager(Client c, Reactor reactor, Invocable iv) {
super(c); super(c);
@@ -183,33 +182,24 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId)); 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 { } else {
final Reactor r = reactor;
final List<ReactorDropEntry> dropItems = items;
final int worldMesoRate = c.getWorldServer().getMesoRate(); final int worldMesoRate = c.getWorldServer().getMesoRate();
dropPos.x -= (12 * items.size()); dropPos.x -= (12 * items.size());
short delay = 0;
// TODO: simply use "delay" drop packet instead of this scheduled task for (ReactorDropEntry d : items) {
sprayTask = TimerManager.getInstance().register(() -> {
if (dropItems.isEmpty()) {
sprayTask.cancel(false);
return;
}
ReactorDropEntry d = dropItems.remove(0);
if (d.itemId == 0) { if (d.itemId == 0) {
int range = maxMeso - minMeso; int range = maxMeso - minMeso;
int displayDrop = (int) (Math.random() * range) + minMeso; int displayDrop = (int) (Math.random() * range) + minMeso;
int mesoDrop = (displayDrop * worldMesoRate); int mesoDrop = displayDrop * worldMesoRate;
r.getMap().spawnMesoDrop(mesoDrop, r.getMap().calcDropPos(dropPos, r.getPosition()), r, chr, MapleMap map = reactor.getMap();
false, (byte) 2, (short) 0); map.spawnMesoDrop(mesoDrop, map.calcDropPos(dropPos, reactor.getPosition()), reactor, chr,
false, (byte) 2, delay);
} else { } else {
Item drop; final Item drop;
if (ItemConstants.getInventoryType(d.itemId) != InventoryType.EQUIP) { if (ItemConstants.getInventoryType(d.itemId) != InventoryType.EQUIP) {
drop = new Item(d.itemId, (short) 0, (short) 1); drop = new Item(d.itemId, (short) 0, (short) 1);
} else { } else {
@@ -217,11 +207,12 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId)); 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; dropPos.x += 25;
}, 200); delay += 200;
}
} }
} }

View File

@@ -795,9 +795,10 @@ public class MapleMap {
dropFromMonster(chr, mob, true, (short) 0); 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, 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() { private void stopItemMonitor() {