Reworked equip lvlup + Reactor quest item drop + ToT quests fix

Rebalanced the way equipment exp is gained (about 100~200 same-level
range mobs to pass equip level 1 to 2). Fixed reactors dropping quest
items to player if they don't have the quest started. Fixed broken
Temple of Time quests.
This commit is contained in:
ronancpl
2017-08-16 14:06:59 -03:00
parent e0a27e00ab
commit c8e36c10e7
129 changed files with 744 additions and 448 deletions

View File

@@ -1464,14 +1464,31 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
if (id / 1000000 == 2) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (ii.isConsumeOnPickup(id)) {
if (id > 2022430 && id < 2022434) {
for (MapleCharacter mc : c.getPlayer().getMap().getCharacters()) {
if (mc.getParty() == c.getPlayer().getParty()) {
ii.getItemEffect(id).applyTo(mc);
if (ii.isPartyItem(id)) {
List<MapleCharacter> pchr = c.getPlayer().getPartyMembersOnSameMap();
if(!ii.isPartyAllcure(id)) {
if(!pchr.isEmpty()) {
for (MapleCharacter mc : pchr) {
ii.getItemEffect(id).applyTo(mc);
mc.checkBerserk(mc.isHidden());
}
} else {
ii.getItemEffect(id).applyTo(c.getPlayer());
c.getPlayer().checkBerserk(c.getPlayer().isHidden());
}
} else {
if(!pchr.isEmpty()) {
for (MapleCharacter mc : pchr) {
mc.dispelDebuffs();
}
} else {
c.getPlayer().dispelDebuffs();
}
}
} else {
ii.getItemEffect(id).applyTo(c.getPlayer());
c.getPlayer().checkBerserk(c.getPlayer().isHidden());
}
return true;
}
@@ -1940,7 +1957,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
extraRecoveryTask = null;
}
if(extraHpRec > 0 || extraMpRec > 0) {
if(extraHpRec != 0 || extraMpRec != 0) {
startExtraTaskInternal(extraHpRec, extraMpRec, extraRecInterval);
}
}
@@ -3167,6 +3184,19 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
return list;
}
public List<MapleCharacter> getPartyMembersOnSameMap() {
List<MapleCharacter> list = new LinkedList<>();
int thisMapHash = this.getMap().hashCode();
if(party != null) {
for(MaplePartyCharacter partyMembers: party.getMembers()) {
if(partyMembers.getPlayer().getMap().hashCode() == thisMapHash) list.add(partyMembers.getPlayer());
}
}
return list;
}
public boolean isPartyMember(MapleCharacter chr) {
for(MapleCharacter mpcu: getPartyMembers()) {
if(mpcu.getId() == chr.getId()) {
@@ -3188,6 +3218,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
closeMiniGame();
closeHiredMerchant(false);
closePlayerMessenger();
client.closePlayerScriptInteractions();
}
public void closeNpcShop() {
@@ -3595,11 +3627,13 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
private void guildUpdate() {
mgc.setLevel(level);
mgc.setJobId(job.getId());
if (this.guildid < 1) {
return;
}
mgc.setLevel(level);
mgc.setJobId(job.getId());
try {
Server.getInstance().memberLevelJobUpdate(this.mgc);
//Server.getInstance().getGuild(guildid, world, mgc).gainGP(40);
@@ -4955,7 +4989,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
getMap().broadcastMessage(MapleCharacter.this, MaplePacketCreator.showRecovery(id, heal), false);
}
}, healInterval, healInterval);
} else if (effect.isDojoBuff()) {
} else if (effect.isDojoBuff() || effect.getSourceId() == 2022337) {
boolean isRecoveryBuff = false;
if(effect.getHpRRate() > 0) {
extraHpRec = effect.getHpR();
@@ -4968,7 +5002,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
extraRecInterval = effect.getMpRRate();
isRecoveryBuff = true;
}
if(isRecoveryBuff) {
stopExtraTask();
startExtraTask(extraHpRec, extraMpRec, extraRecInterval); // HP & MP sharing the same task holder

View File

@@ -732,8 +732,6 @@ public class MapleClient {
player.cancelAllDebuffs();
player.closePlayerInteractions();
NPCScriptManager.getInstance().dispose(this);
QuestScriptManager.getInstance().dispose(this);
if (player.getEventInstance() != null) {
@@ -764,6 +762,8 @@ public class MapleClient {
final MapleMessengerCharacter chrm = new MapleMessengerCharacter(player, 0);
final MapleGuildCharacter chrg = player.getMGC();
final MapleGuild guild = player.getGuild();
player.cancelMagicDoor();
if (channel == -1 || shutdown) {
if(chrg != null) chrg.setCharacter(null);
@@ -1254,4 +1254,9 @@ public class MapleClient {
public void removeClickedNPC(){
lastNpcClick = 0;
}
public void closePlayerScriptInteractions() {
this.removeClickedNPC();
NPCScriptManager.getInstance().dispose(this);
}
}

View File

@@ -338,9 +338,8 @@ public class Commands {
switch(sub[0]) {
case "help":
case "commands":
case "playercommands":
player.setCS(true);
c.getAbstractPlayerInteraction().openNpc(9201143);
case "playercommands":
c.getAbstractPlayerInteraction().openNpc(9201143, "commands");
break;
case "time":
@@ -1095,7 +1094,14 @@ public class Commands {
if (ItemConstants.isPet(itemId)) {
petid = MaplePet.createPet(itemId);
}
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), petid, -1);
byte flag = 0;
if(player.gmLevel() < 3) {
flag |= ItemConstants.ACCOUNT_SHARING;
flag |= ItemConstants.UNTRADEABLE;
}
MapleInventoryManipulator.addById(c, itemId, quantity, player.getName(), petid, flag, -1);
} else {
Item toDrop;
if (MapleItemInformationProvider.getInstance().getInventoryType(itemId) == MapleInventoryType.EQUIP) {
@@ -1103,6 +1109,16 @@ public class Commands {
} else {
toDrop = new Item(itemId, (short) 0, quantity);
}
toDrop.setOwner(player.getName());
if(player.gmLevel() < 3) {
byte b = toDrop.getFlag();
b |= ItemConstants.ACCOUNT_SHARING;
b |= ItemConstants.UNTRADEABLE;
toDrop.setFlag(b);
}
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true);
}
break;
@@ -1294,6 +1310,19 @@ public class Commands {
player.dropMessage(sub[1] + " not found on this channel! Make sure your target is logged on and on the same channel as yours.");
}
break;
case "job":
if (sub.length == 2) {
player.changeJob(MapleJob.getById(Integer.parseInt(sub[1])));
player.equipChanged();
} else if (sub.length == 3) {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
victim.changeJob(MapleJob.getById(Integer.parseInt(sub[2])));
player.equipChanged();
} else {
player.message("Syntax: !job <job id> <opt: IGN of another person>");
}
break;
case "unbug":
c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.enableActions());
@@ -1407,6 +1436,8 @@ public class Commands {
victim.setMp(statUpdate);
victim.updateSingleStat(MapleStat.HP, statUpdate);
victim.updateSingleStat(MapleStat.MP, statUpdate);
victim.checkBerserk(victim.isHidden());
break;
case "music":
@@ -1823,6 +1854,23 @@ public class Commands {
player.yellowMessage("Done.");
break;
case "npc":
if (sub.length < 2){
player.yellowMessage("Syntax: !npc <npcid>");
break;
}
MapleNPC npc = MapleLifeFactory.getNPC(Integer.parseInt(sub[1]));
if (npc != null) {
npc.setPosition(player.getPosition());
npc.setCy(player.getPosition().y);
npc.setRx0(player.getPosition().x + 50);
npc.setRx1(player.getPosition().x - 50);
npc.setFh(player.getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId());
player.getMap().addMapObject(npc);
player.getMap().broadcastMessage(MaplePacketCreator.spawnNPC(npc));
}
break;
default:
return false;
}
@@ -1854,6 +1902,7 @@ public class Commands {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
Item it = ii.getEquipById(itemid);
it.setOwner(player.getName());
MapleInventoryType type = ii.getInventoryType(itemid);
if (type.equals(MapleInventoryType.EQUIP)) {
hardsetItemStats((Equip) it, multiply);
@@ -1909,31 +1958,35 @@ public class Commands {
if (sub.length < 2){
player.yellowMessage("Syntax: !exprate <newrate>");
break;
}
}
c.getWorldServer().setExpRate(Integer.parseInt(sub[1]));
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Exp Rate has been changed to " + sub[1] + "x."));
break;
case "mesorate":
if (sub.length < 2){
player.yellowMessage("Syntax: !mesorate <newrate>");
break;
}
}
c.getWorldServer().setMesoRate(Integer.parseInt(sub[1]));
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Meso Rate has been changed to " + sub[1] + "x."));
break;
case "droprate":
if (sub.length < 2){
player.yellowMessage("Syntax: !droprate <newrate>");
break;
}
}
c.getWorldServer().setDropRate(Integer.parseInt(sub[1]));
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Drop Rate has been changed to " + sub[1] + "x."));
break;
case "bossdroprate":
if (sub.length < 2){
player.yellowMessage("Syntax: !bossdroprate <newrate>");
break;
}
}
c.getWorldServer().setBossDropRate(Integer.parseInt(sub[1]));
c.getWorldServer().broadcastPacket(MaplePacketCreator.serverNotice(6, "[Rate] Boss Drop Rate has been changed to " + sub[1] + "x."));
break;
case "itemvac":
@@ -2006,18 +2059,21 @@ public class Commands {
break;
}
if (sub.length == 2) {
player.setFace(Integer.parseInt(sub[1]));
player.equipChanged();
} else {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
if(victim == null) {
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
break;
try {
if (sub.length == 2) {
player.setFace(Integer.parseInt(sub[1]));
player.equipChanged();
} else {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
if(victim == null) {
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
break;
}
victim.setFace(Integer.parseInt(sub[2]));
victim.equipChanged();
}
victim.setFace(Integer.parseInt(sub[2]));
victim.equipChanged();
}
} catch(Exception e) {}
break;
case "hair":
@@ -2026,18 +2082,26 @@ public class Commands {
break;
}
if (sub.length == 2) {
player.setHair(Integer.parseInt(sub[1]));
player.equipChanged();
} else {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
if(victim == null) {
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
break;
try {
if (sub.length == 2) {
player.setHair(Integer.parseInt(sub[1]));
player.equipChanged();
player.getMap().removePlayer(player);
player.getMap().addPlayer(player);
} else {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
if(victim == null) {
player.yellowMessage("Player '" + sub[1] + "' has not been found on this channel.");
break;
}
victim.setHair(Integer.parseInt(sub[2]));
victim.equipChanged();
victim.getMap().removePlayer(victim);
victim.getMap().addPlayer(victim);
}
victim.setHair(Integer.parseInt(sub[2]));
victim.equipChanged();
}
} catch(Exception e) {}
break;
default:
@@ -2231,36 +2295,6 @@ public class Commands {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
player.message(victim.getName() + "'s account name is " + victim.getClient().getAccountName() + ".");
break;
case "npc":
if (sub.length < 2){
player.yellowMessage("Syntax: !npc <npcid>");
break;
}
MapleNPC npc = MapleLifeFactory.getNPC(Integer.parseInt(sub[1]));
if (npc != null) {
npc.setPosition(player.getPosition());
npc.setCy(player.getPosition().y);
npc.setRx0(player.getPosition().x + 50);
npc.setRx1(player.getPosition().x - 50);
npc.setFh(player.getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId());
player.getMap().addMapObject(npc);
player.getMap().broadcastMessage(MaplePacketCreator.spawnNPC(npc));
}
break;
case "job":
if (sub.length == 2) {
player.changeJob(MapleJob.getById(Integer.parseInt(sub[1])));
player.equipChanged();
} else if (sub.length == 3) {
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(sub[1]);
victim.changeJob(MapleJob.getById(Integer.parseInt(sub[2])));
player.equipChanged();
} else {
player.message("Syntax: !job <job id> <opt: IGN of another person>");
}
break;
case "shutdown":
case "shutdownnow":

View File

@@ -26,8 +26,6 @@ import constants.ServerConstants;
import constants.ExpTable;
import java.util.LinkedList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import server.MapleItemInformationProvider;
import tools.MaplePacketCreator;
import tools.Pair;
@@ -376,6 +374,7 @@ public class Equip extends Item {
boolean gotVicious = false, gotSlot = false;
String lvupStr = "'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "' is now level " + itemLevel + "! ";
String showStr = "#e'" + MapleItemInformationProvider.getInstance().getName(this.getItemId()) + "'#b is now #elevel #r" + itemLevel + "#k#b!";
Integer statUp, maxStat = ServerConstants.MAX_EQUIPMNT_STAT;
for (Pair<StatUpgrade, Integer> stat : stats) {
@@ -462,9 +461,17 @@ public class Equip extends Item {
}
}
if(gotVicious) {
//c.getPlayer().dropMessage(6, "A new Vicious Hammer opportunity has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
lvupStr += "+VICIOUS ";
}
if(gotSlot) {
//c.getPlayer().dropMessage(6, "A new upgrade slot has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
lvupStr += "+UPGSLOT ";
}
showLevelupMessage(showStr, c); // thx to polaris devs !
c.getPlayer().dropMessage(6, lvupStr);
if(gotVicious) c.getPlayer().dropMessage(6, "A new Vicious Hammer opportunity has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
if(gotSlot) c.getPlayer().dropMessage(6, "A new upgrade slot has been found on the '" + MapleItemInformationProvider.getInstance().getName(getItemId()) + "'!");
c.announce(MaplePacketCreator.showEquipmentLevelUp());
c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.showForeignEffect(c.getPlayer().getId(), 15));
@@ -476,11 +483,16 @@ public class Equip extends Item {
}
private double normalizedMasteryExp(int reqLevel) {
// Trivia: at equips requiring level 200, one gaining MAX INTEGER exp points will have their equip
// exp gain normalized to roughly 5.752 points (1/3 of the needed to pass the equipment to lvl 2)!
// Good thing there is not much lvl 140+ equipments in the game!
// Conversion factor between mob exp and equip exp gain. Through many calculations, the expected for equipment levelup
// from level 1 to 2 is killing about 100~200 mobs of the same level range, on a 1x EXP rate scenario.
return Math.max((2622.71 * Math.exp(reqLevel * 0.0733649)) - 6000.0, 15);
if(reqLevel >= 78) {
return Math.max(ServerConstants.EQUIP_EXPERIENCE_MOD * (10413.648 * Math.exp(reqLevel * 0.03275)), 15);
} else if(reqLevel >= 38) {
return Math.max(ServerConstants.EQUIP_EXPERIENCE_MOD * ( 4985.818 * Math.exp(reqLevel * 0.02007)), 15);
} else {
return Math.max(ServerConstants.EQUIP_EXPERIENCE_MOD * ( 248.219 * Math.exp(reqLevel * 0.11093)), 15);
}
}
public void gainItemExp(MapleClient c, int gain) { // Ronan's Equip Exp gain method
@@ -497,7 +509,7 @@ public class Equip extends Item {
itemExp += baseExpGain;
int expNeeded = ExpTable.getEquipExpNeededForLevel(itemLevel);
if(ServerConstants.USE_DEBUG_SHOW_INFO_EQPEXP) System.out.println("'" + ii.getName(this.getItemId()) + "' -> EXP Gain: " + gain + " Mastery: " + masteryModifier + " Base gain: " + baseExpGain + " exp: " + itemExp + " / " + expNeeded);
if(ServerConstants.USE_DEBUG_SHOW_INFO_EQPEXP) System.out.println("'" + ii.getName(this.getItemId()) + "' -> EXP Gain: " + gain + " Mastery: " + masteryModifier + " Base gain: " + baseExpGain + " exp: " + itemExp + " / " + expNeeded + ", Kills TNL: " + expNeeded / (baseExpGain / c.getPlayer().getExpRate()));
if (itemExp >= expNeeded) {
while(itemExp >= expNeeded) {
@@ -540,6 +552,11 @@ public class Equip extends Item {
c.getPlayer().dropMessage(5, "'" + eqpName + "' -> Level: " + itemLevel + eqpInfo);
}
public final void showLevelupMessage(String msg, MapleClient c) {
c.announce(MaplePacketCreator.sendHint(msg, 500, 10));
c.announce(MaplePacketCreator.enableActions());
}
public void setItemExp(int exp) {
this.itemExp = exp;
}

View File

@@ -36,7 +36,7 @@ public class ServerConstants {
public static final boolean USE_MAXRANGE = true; //Will send and receive packets from all events of a map, rather than those of only view range.
public static final boolean USE_DEBUG = true; //Will enable some text prints on the client, oriented for debugging purposes.
public static final boolean USE_DEBUG_SHOW_RCVD_PACKET = false; //Prints on the cmd all received packet ids.
public static final boolean USE_DEBUG_SHOW_INFO_EQPEXP = false; //Prints on the cmd all equip exp gain info.
public static final boolean USE_DEBUG_SHOW_INFO_EQPEXP = true; //Prints on the cmd all equip exp gain info.
public static final boolean USE_MTS = false;
public static final boolean USE_FAMILY_SYSTEM = false;
public static final boolean USE_DUEY = true;
@@ -49,7 +49,7 @@ public class ServerConstants {
public static final boolean USE_PERFECT_PITCH = true; //For lvl 30 or above, each lvlup player gains 1 perfect pitch.
public static final boolean USE_PERMISSIVE_BUFFS = false; //WARNING: Allows players that does not have increased certain buff-type skills to use it's effect. Used mainly on buff-cast commands, however making this active may generate a source for possible client-edited exploits.
public static final boolean USE_ENFORCE_MDOOR_POSITION = true; //Forces mystic door to be spawned near spawnpoints. (since things bugs out other way, and this helps players locate the door faster)
public static final boolean USE_ERASE_UNTRADEABLE_DROP = true; //Forces flagged untradeable items to disappear when dropped.
public static final int MAX_AP = 20000; //Max AP allotted on the auto-assigner.
public static final int MAX_EVENT_LEVELS = 8; //Event has different levels of rewarding system.
@@ -100,6 +100,7 @@ public class ServerConstants {
public static final int DROP_RATE = 10;
public static final int BOSS_DROP_RATE = 20;
public static final int PARTY_EXPERIENCE_MOD = 1; //Change for event stuff.
public static final double EQUIP_EXPERIENCE_MOD = 10.0; //Rate for equipment exp needed, grows linearly. Set 1.0 for default (about 100~200 same-level range mobs killed to pass equip from level 1 to 2).
public static final double PQ_BONUS_EXP_MOD = 0.5;
//Event End Timestamp

View File

@@ -47,7 +47,7 @@ public final class GeneralChatHandler extends net.AbstractMaplePacketHandler {
return;
}
char heading = s.charAt(0);
if (heading == '!' || heading == '@') { // client seems to not send command with '/' heading to the server, if not a GM account
if (heading == '/' || heading == '!' || heading == '@') { // client seems to not send command with '/' heading to the server, if not a GM account
String[] sp = s.split(" ");
sp[0] = sp[0].toLowerCase().substring(1);

View File

@@ -47,11 +47,11 @@ public final class UseItemHandler extends AbstractMaplePacketHandler {
int itemId = slea.readInt();
Item toUse = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slot);
if (toUse != null && toUse.getQuantity() > 0 && toUse.getItemId() == itemId) {
if (itemId == 2022178 || itemId == 2022433 || itemId == 2050004) {
if (itemId == 2022178 || itemId == 2050004) {
c.getPlayer().dispelDebuffs();
remove(c, slot);
return;
}
}
else if (itemId == 2050001) {
c.getPlayer().dispelDebuff(MapleDisease.DARKNESS);
remove(c, slot);

View File

@@ -414,12 +414,10 @@ public class EventInstanceManager {
}
}
public void changedMap(MapleCharacter chr, int mapId) {
public void changedMap(MapleCharacter chr, int mapId) { // optional
try {
em.getIv().invokeFunction("changedMap", this, chr, mapId);
} catch (ScriptException | NoSuchMethodException ex) {
ex.printStackTrace();
}
} catch (ScriptException | NoSuchMethodException ex) {}
}
public void changedLeader(MapleCharacter ldr) {

View File

@@ -320,7 +320,7 @@ public class EventManager {
}
public boolean startInstance(int lobbyId, MapleCharacter leader) {
return startInstance(lobbyId, null, leader, 1);
return startInstance(lobbyId, leader, leader, 1);
}
public boolean startInstance(int lobbyId, MapleCharacter chr, MapleCharacter leader, int difficulty) {

View File

@@ -119,7 +119,8 @@ public class ReactorActionManager extends AbstractPlayerInteraction {
} else {
drop = ii.randomizeStats((Equip) ii.getEquipById(d.itemId));
}
reactor.getMap().spawnItemDrop(reactor, getPlayer(), drop, reactor.getMap().calcDropPos(dropPos, reactor.getPosition()), (byte)(getPlayer().getParty() != null ? 1 : 0), false);
reactor.getMap().dropFromReactor(getPlayer(), reactor, drop, dropPos, (short)d.questid);
}
dropPos.x += 25;
}

View File

@@ -29,6 +29,7 @@ import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import client.inventory.ModifyInventory;
import constants.ItemConstants;
import constants.ServerConstants;
import java.awt.Point;
import java.util.ArrayList;
@@ -549,12 +550,12 @@ public class MapleInventoryManipulator {
if (weddingRing) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
} else if (c.getPlayer().getMap().getEverlast()) {
if (ii.isDropRestricted(target.getItemId()) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
if (ii.isDropRestricted(target.getItemId()) || ii.isCash(target.getItemId()) || isDroppedItemRestricted(target)) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
}
} else if (ii.isDropRestricted(target.getItemId()) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
} else if (ii.isDropRestricted(target.getItemId()) || ii.isCash(target.getItemId()) || isDroppedItemRestricted(target)) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
@@ -566,12 +567,12 @@ public class MapleInventoryManipulator {
c.getPlayer().equipChanged();
}
if (c.getPlayer().getMap().getEverlast()) {
if (ii.isDropRestricted(itemId) || ii.isCash(itemId)) {
if (ii.isDropRestricted(itemId) || ii.isCash(itemId) || isDroppedItemRestricted(source)) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
}
} else if (ii.isDropRestricted(itemId) || ii.isCash(itemId)) {
} else if (ii.isDropRestricted(itemId) || ii.isCash(itemId) || isDroppedItemRestricted(source)) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
@@ -579,6 +580,10 @@ public class MapleInventoryManipulator {
}
}
private static boolean isDroppedItemRestricted(Item it) {
return ServerConstants.USE_ERASE_UNTRADEABLE_DROP && ((it.getFlag() & ItemConstants.UNTRADEABLE) == ItemConstants.UNTRADEABLE);
}
private static boolean isOverall(int itemId) {
return itemId / 10000 == 105;
}

View File

@@ -1312,6 +1312,14 @@ public class MapleItemInformationProvider {
int itemType = itemId / 1000;
return itemType == 5211 || itemType == 5360;
}
public boolean isPartyItem(int itemId) {
return itemId >= 2022430 && itemId <= 2022433;
}
public boolean isPartyAllcure(int itemId) {
return itemId == 2022433;
}
public Collection<Item> canWearEquipment(MapleCharacter chr, Collection<Item> items) {
MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIPPED);

View File

@@ -228,10 +228,10 @@ public class MapleStatEffect {
addBuffStatPairToListIfNotZero(statups, MapleBuffStat.BOOSTER, Integer.valueOf(ret.booster));
if(!skill) {
if(isDojoBuff(sourceid)) {
if(isDojoBuff(sourceid) || sourceid == 2022337) {
ret.mhpR = (byte) MapleDataTool.getInt("mhpR", source, 0);
ret.mhpRRate = (short) (MapleDataTool.getInt("mhpRRate", source, 0) * 100);
ret.mmpR = (byte) MapleDataTool.getInt("mmpRRate", source, 0);
ret.mmpR = (byte) MapleDataTool.getInt("mmpR", source, 0);
ret.mmpRRate = (short) (MapleDataTool.getInt("mmpRRate", source, 0) * 100);
addBuffStatPairToListIfNotZero(statups, MapleBuffStat.HPREC, Integer.valueOf(ret.mhpR));

View File

@@ -77,7 +77,11 @@ public class MapleDoor {
try {
return town.getAvailableDoorPortals().get(slot);
} catch (IndexOutOfBoundsException e) {
return town.getAvailableDoorPortals().get(0);
try {
return town.getAvailableDoorPortals().get(0);
} catch (IndexOutOfBoundsException ex) {
return null;
}
}
}

View File

@@ -560,6 +560,10 @@ public class MapleMap {
}
}
}
public void dropFromReactor(final MapleCharacter chr, final MapleReactor reactor, Item drop, Point dropPos, short questid) {
spawnDrop(drop, this.calcDropPos(dropPos, reactor.getPosition()), reactor, chr, (byte)(chr.getParty() != null ? 1 : 0), questid);
}
private void stopItemMonitor() {
chrWLock.lock();
@@ -653,14 +657,14 @@ public class MapleMap {
droppedItemCount.decrementAndGet();
}
private void spawnDrop(final Item idrop, final Point dropPos, final MapleMonster mob, final MapleCharacter chr, final byte droptype, final short questid) {
final MapleMapItem mdrop = new MapleMapItem(idrop, dropPos, mob, chr, droptype, false, questid);
private void spawnDrop(final Item idrop, final Point dropPos, final MapleMapObject dropper, final MapleCharacter chr, final byte droptype, final short questid) {
final MapleMapItem mdrop = new MapleMapItem(idrop, dropPos, dropper, chr, droptype, false, questid);
mdrop.setDropTime(System.currentTimeMillis());
spawnAndAddRangedMapObject(mdrop, new DelayedPacketCreation() {
@Override
public void sendPackets(MapleClient c) {
if (questid <= 0 || (c.getPlayer().getQuestStatus(questid) == 1 && c.getPlayer().needQuestItem(questid, idrop.getItemId()))) {
c.announce(MaplePacketCreator.dropItemFromMapObject(mdrop, mob.getPosition(), dropPos, (byte) 1));
c.announce(MaplePacketCreator.dropItemFromMapObject(mdrop, dropper.getPosition(), dropPos, (byte) 1));
}
}
}, null);
@@ -2591,37 +2595,39 @@ public class MapleMap {
public void run() {
reactor.lockReactor();
try {
if (reactor.getShouldCollect() == true && mapitem != null && mapitem == getMapObject(mapitem.getObjectId())) {
mapitem.lockItem();
try {
TimerManager tMan = TimerManager.getInstance();
if (mapitem.isPickedUp()) {
return;
}
if(reactor.getReactorType() == 100) {
if (reactor.getShouldCollect() == true && mapitem != null && mapitem == getMapObject(mapitem.getObjectId())) {
mapitem.lockItem();
try {
TimerManager tMan = TimerManager.getInstance();
if (mapitem.isPickedUp()) {
return;
}
reactor.setShouldCollect(false);
MapleMap.this.broadcastMessage(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem.getPosition());
MapleMap.this.removeMapObject(mapitem);
reactor.hitReactor(c);
reactor.setShouldCollect(false);
MapleMap.this.broadcastMessage(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem.getPosition());
MapleMap.this.removeMapObject(mapitem);
reactor.hitReactor(c);
if (reactor.getDelay() > 0) {
tMan.schedule(new Runnable() {
@Override
public void run() {
reactor.lockReactor();
try {
reactor.setState((byte) 0);
reactor.resetReactorActions();
if (reactor.getDelay() > 0) {
tMan.schedule(new Runnable() {
@Override
public void run() {
reactor.lockReactor();
try {
reactor.setState((byte) 0);
reactor.resetReactorActions();
broadcastMessage(MaplePacketCreator.triggerReactor(reactor, 0));
} finally {
reactor.unlockReactor();
broadcastMessage(MaplePacketCreator.triggerReactor(reactor, 0));
} finally {
reactor.unlockReactor();
}
}
}
}, reactor.getDelay());
}, reactor.getDelay());
}
} finally {
mapitem.unlockItem();
}
} finally {
mapitem.unlockItem();
}
}
} finally {

View File

@@ -271,6 +271,8 @@ public class MapleMapFactory {
private AbstractLoadedMapleLife loadLife(MapleData life, String id, String type) {
AbstractLoadedMapleLife myLife = MapleLifeFactory.getLife(Integer.parseInt(id), type);
if(life == null) System.out.println("lf null");
if(myLife == null) System.out.println("mlf null");
myLife.setCy(MapleDataTool.getInt(life.getChildByPath("cy")));
MapleData dF = life.getChildByPath("f");
if (dF != null) {
@@ -293,11 +295,10 @@ public class MapleMapFactory {
MapleReactor myReactor = new MapleReactor(MapleReactorFactory.getReactor(Integer.parseInt(id)), Integer.parseInt(id));
int x = MapleDataTool.getInt(reactor.getChildByPath("x"));
int y = MapleDataTool.getInt(reactor.getChildByPath("y"));
myReactor.setName(MapleDataTool.getString(reactor.getChildByPath("name"), ""));
myReactor.setPosition(new Point(x, y));
myReactor.setDelay(MapleDataTool.getInt(reactor.getChildByPath("reactorTime")) * 1000);
myReactor.setState((byte) 0);
myReactor.setName(MapleDataTool.getString(reactor.getChildByPath("name"), ""));
myReactor.resetReactorActions();
return myReactor;
}