package scripting.reactor;
import client.MapleClient;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.MapleInventoryType;
import constants.ItemConstants;
import handling.channel.ChannelServer;
import java.awt.Point;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import scripting.AbstractPlayerInteraction;
import server.MapleCarnivalFactory;
import server.MapleItemInformationProvider;
import server.Randomizer;
import server.life.MapleLifeFactory;
import server.life.MapleMonster;
import server.maps.MapleReactor;
import server.maps.ReactorDropEntry;
import tools.MaplePacketCreator;
public class ReactorActionManager extends AbstractPlayerInteraction {
private final MapleReactor reactor;
private static final int[] 碎片 = {4001513, 4001515, 4001521};
public ReactorActionManager(MapleClient c, MapleReactor reactor) {
super(c, reactor.getReactorId(), String.valueOf( c.getPlayer().getMapId()));
this.reactor = reactor;
}
public void dropItems() {
dropItems(false, 0, 0, 0, 0, 0, false);
}
public void dropItems(int minDrops, int maxDrops) {
dropItems(false, 0, 0, 0, minDrops, maxDrops, true);
}
public void dropItems(boolean meso, int mesoChance, int minMeso, int maxMeso) {
dropItems(meso, mesoChance, minMeso, maxMeso, 0, 0, false);
}
public void dropItems(boolean meso, int mesoChance, int minMeso, int maxMeso, int minDrops, int maxDrops, boolean profession) {
List chances = ReactorScriptManager.getInstance().getDrops(this.reactor.getReactorId());
List<ReactorDropEntry> toDrop = new LinkedList();
if ((meso) && (Math.random() < 1.0D / mesoChance)) {
toDrop.add(new ReactorDropEntry(0, mesoChance, -1));
}
Iterator iter = chances.iterator();
while (iter.hasNext()) {
ReactorDropEntry d = (ReactorDropEntry) iter.next();
if ((Math.random() < 1.0D / d.chance) && ((d.questid <= 0) || (getPlayer().getQuestStatus(d.questid) == 1))) {
toDrop.add(d);
}
}
while (toDrop.size() < minDrops) {
if ((profession) && (!toDrop.isEmpty())) {
for (int i = 0; i < toDrop.size(); i++) {
ReactorDropEntry fix = (ReactorDropEntry) toDrop.get(i);
if ((fix != null) && (toDrop.size() < minDrops)) {
toDrop.add(fix);
}
}
continue;
}
toDrop.add(new ReactorDropEntry(0, mesoChance, -1));
}
if ((profession) && (toDrop.size() > maxDrops)) {
toDrop = toDrop.subList(0, maxDrops);
}
Collections.shuffle(toDrop);
Point dropPos = this.reactor.getPosition();
dropPos.x -= 12 * toDrop.size();
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (ReactorDropEntry de : toDrop) {
if (de.itemId == 0) {
int range = maxMeso - minMeso;
int mesoDrop = Randomizer.nextInt(range) + minMeso * ChannelServer.getInstance(getClient().getChannel()).getMesoRate(getPlayer().getWorld());
if (mesoDrop > 0) {
this.reactor.getMap().spawnMesoDrop(mesoDrop, dropPos, this.reactor, getPlayer(), false, (byte) 0);
}
} else {
Item drop;
if (ItemConstants.getInventoryType(de.itemId) != MapleInventoryType.EQUIP) {
drop = new Item(de.itemId, (byte) 0, (byte) 1, (byte) 0);
} else {
drop = ii.randomizeStats((Equip) ii.getEquipById(de.itemId));
}
drop.setGMLog("从箱子爆出 " + this.reactor.getReactorId() + " 在地图 " + getPlayer().getMapId());
this.reactor.getMap().spawnItemDrop(this.reactor, getPlayer(), drop, dropPos, false, false);
}
dropPos.x += 25;
}
}
@Override
public void spawnNpc(int npcId) {
spawnNpc(npcId, getPosition());
}
public Point getPosition() {
Point pos = this.reactor.getPosition();
pos.y -= 10;
return pos;
}
public MapleReactor getReactor() {
return this.reactor;
}
public void spawnZakum() {
this.reactor.getMap().spawnZakum(getPosition().x, getPosition().y);
}
public void spawnFakeMonster(int id) {
spawnFakeMonster(id, 1, getPosition());
}
public void spawnFakeMonster(int id, int x, int y) {
spawnFakeMonster(id, 1, new Point(x, y));
}
public void spawnFakeMonster(int id, int qty) {
spawnFakeMonster(id, qty, getPosition());
}
public void spawnFakeMonster(int id, int qty, int x, int y) {
spawnFakeMonster(id, qty, new Point(x, y));
}
private void spawnFakeMonster(int id, int qty, Point pos) {
for (int i = 0; i < qty; i++) {
this.reactor.getMap().spawnFakeMonsterOnGroundBelow(MapleLifeFactory.getMonster(id), pos);
}
}
public void killAll() {
this.reactor.getMap().killAllMonsters(true);
}
public void killMonster(int monsId) {
this.reactor.getMap().killMonster(monsId);
}
@Override
public void spawnMonster(int id) {
spawnMonster(id, 1, getPosition());
}
@Override
public void spawnMonster(int id, int qty) {
spawnMonster(id, qty, getPosition());
}
public void dispelAllMonsters(int num) {
MapleCarnivalFactory.MCSkill skil = MapleCarnivalFactory.getInstance().getGuardian(num);
if (skil != null) {
for (MapleMonster mons : getMap().getAllMonstersThreadsafe()) {
mons.dispelSkill(skil.getSkill());
}
}
}
}