package scripting; import clientside.MapleCharacter; import clientside.MapleClient; import clientside.PlayerStats; import client.inventory.Equip; import client.inventory.Item; import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import constants.GameConstants; import handling.channel.ChannelServer; import java.awt.Point; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import server.MapleCarnivalFactory; import server.MapleCarnivalFactory.MCSkill; import server.MapleItemInformationProvider; import server.Randomizer; import server.life.MapleLifeFactory; import server.life.MapleMonster; import server.maps.MapleMap; import server.maps.MapleReactor; import server.maps.ReactorDropEntry; import tools.packet.CField; public class ReactorActionManager extends AbstractPlayerInteraction { private MapleReactor reactor; public ReactorActionManager(MapleClient c, MapleReactor reactor) { super(c, reactor.getReactorId(), c.getPlayer().getMapId()); this.reactor = reactor; } public void dropItems() { dropItems(false, 0, 0, 0, 0); } public void dropItems(boolean meso, int mesoChance, int minMeso, int maxMeso) { dropItems(meso, mesoChance, minMeso, maxMeso, 0); } public void dropItems(boolean meso, int mesoChance, int minMeso, int maxMeso, int minItems) { List<ReactorDropEntry> chances = ReactorScriptManager.getInstance().getDrops(this.reactor.getReactorId()); List<ReactorDropEntry> items = new LinkedList(); if ((meso) && (Math.random() < 1.0D / mesoChance)) { items.add(new ReactorDropEntry(0, mesoChance, -1)); } int numItems = 0; 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))) { numItems++; items.add(d); } } while (items.size() < minItems) { items.add(new ReactorDropEntry(0, mesoChance, -1)); numItems++; } Point dropPos = this.reactor.getPosition(); dropPos.x -= 12 * numItems; MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); for (ReactorDropEntry d : items) { if (d.itemId == 0) { int range = maxMeso - minMeso; int mesoDrop = Randomizer.nextInt(range) + minMeso * ChannelServer.getInstance(getClient().getChannel()).getMesoRate(); this.reactor.getMap().spawnMesoDrop(mesoDrop, dropPos, this.reactor, getPlayer(), false, (byte) 0); } else { Item drop; if (GameConstants.getInventoryType(d.itemId) != MapleInventoryType.EQUIP) { drop = new Item(d.itemId, (short) 0, (short) 1, (short) 0); } else { drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId)); } drop.setGMLog("Dropped from reactor " + this.reactor.getReactorId() + " on map " + getPlayer().getMapId()); this.reactor.getMap().spawnItemDrop(this.reactor, getPlayer(), drop, dropPos, false, false); } dropPos.x += 25; } } public void dropSingleItem(int itemId) { Item drop; if (GameConstants.getInventoryType(itemId) != MapleInventoryType.EQUIP) { drop = new Item(itemId, (short) 0, (short) 1, (short) 0); } else { drop = MapleItemInformationProvider.getInstance().randomizeStats((Equip) MapleItemInformationProvider.getInstance().getEquipById(itemId)); } drop.setGMLog("Dropped from reactor " + this.reactor.getReactorId() + " on map " + getPlayer().getMapId()); this.reactor.getMap().spawnItemDrop(this.reactor, getPlayer(), drop, this.reactor.getPosition(), false, false); } 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); } public void spawnMonster(int id) { spawnMonster(id, 1, getPosition()); } 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()); } } } public void cancelHarvest(boolean succ) { getPlayer().setFatigue((byte) (getPlayer().getFatigue() + 1)); getPlayer().getMap().broadcastMessage(getPlayer(), CField.showHarvesting(getPlayer().getId(), 0), false); getPlayer().getMap().broadcastMessage(CField.harvestResult(getPlayer().getId(), succ)); } public void doHarvest() { if (getPlayer().getFatigue() < (GameConstants.GMS ? 200 : 100)) { if ((getPlayer().getStat().harvestingTool > 0) && (getReactor().getTruePosition().distanceSq(getPlayer().getTruePosition()) <= 10000.0D)); } else { return; } int pID = getReactor().getReactorId() < 200000 ? 92000000 : 92010000; String pName = getReactor().getReactorId() < 200000 ? "Herbalism" : "Mining"; int he = getPlayer().getProfessionLevel(pID); if (he <= 0) { return; } Item item = getInventory(1).getItem((short) getPlayer().getStat().harvestingTool); if (item != null) { if ((item.getItemId() / 10000 | 0x0) == (getReactor().getReactorId() < 200000 ? 150 : 151)); } else { return; } int hm = getReactor().getReactorId() % 100; int successChance = 90 + (he - hm) * 10; if (getReactor().getReactorId() % 100 == 10) { hm = 1; successChance = 100; } else if (getReactor().getReactorId() % 100 == 11) { hm = 10; successChance -= 40; } getPlayer().getStat().checkEquipDurabilitys(getPlayer(), -1, true); int masteryIncrease = (hm - he) * 2 + 20; boolean succ = randInt(100) < successChance; if (!succ) { masteryIncrease /= 10; dropSingleItem(getReactor().getReactorId() < 200000 ? 4022023 : 4010010); } else { dropItems(); if (getReactor().getReactorId() < 200000) { addTrait("sense", 5); if (Randomizer.nextInt(10) == 0) { dropSingleItem(2440000); } if (Randomizer.nextInt(100) == 0) { dropSingleItem(4032933); } } else { addTrait("insight", 5); if (Randomizer.nextInt(10) == 0) { dropSingleItem(2440001); } } } cancelHarvest(succ); playerMessage(-5, pName + "'s Mastery increased. (+" + masteryIncrease + ")"); if (getPlayer().addProfessionExp(pID, masteryIncrease)) { playerMessage(-5, pName + " has gained a level."); } } }