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.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<ReactorDropEntry> 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;
}
}
}

View File

@@ -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() {