Quest Item Restore + Packets w/ Timezone + Item/Exp-dec Field Limits
Fixed leaders being able to create expeditions even though the already passed the day limit. Fixed overflow case in calculated max value of skills. Implemented item expiration from DB after the due date. Refactored item flags using byte-length instead of short. Added FieldLimit checks for disappearing item drops and no EXP deduction in limited areas. Added "Quest Item Restore" functionality. Implemented item flag auto-instantiation when generating items. Added gate state update in Papulatus lobby area. Fixed a recent issue regarding bounding box calculation of AoE player skills. Implemented minidungeon close, to occur as soon as the party leader leaves the area. Refactored HenesysPQ attributed out of the MapleMap object, now they should be available from the respective event script. Fixed friendly mobs not dropping item periodically, a recent issue after tweaking the loot system. Fixed Papulatus expedition closing after the exped leader leaves or a minimum of player required to start is no longer there. Fixed several expeditions closing after performing party operations, such as "change party leader". Reviewed expected max damage calculation for summons, which would not work properly in several occasions. Normalized timezone from packets sent to client, now using the same timezone defined from the server flags. Fixed certain scenarios in CPQ that would happen within the stage between the "challenge accepted" and ingress in the battlefield. Revised credits script. Added GM checks in the autoban method.
This commit is contained in:
@@ -61,13 +61,14 @@ import net.server.worker.BossLogWorker;
|
||||
import net.server.worker.CharacterDiseaseWorker;
|
||||
import net.server.worker.CouponWorker;
|
||||
import net.server.worker.EventRecallCoordinatorWorker;
|
||||
import net.server.worker.FredrickWorker;
|
||||
import net.server.worker.DueyFredrickWorker;
|
||||
import net.server.worker.InvitationWorker;
|
||||
import net.server.worker.LoginCoordinatorWorker;
|
||||
import net.server.worker.LoginStorageWorker;
|
||||
import net.server.worker.RankingCommandWorker;
|
||||
import net.server.worker.RankingLoginWorker;
|
||||
import net.server.worker.ReleaseLockWorker;
|
||||
import net.server.worker.RespawnWorker;
|
||||
import net.server.world.World;
|
||||
|
||||
import org.apache.mina.core.buffer.IoBuffer;
|
||||
@@ -904,8 +905,9 @@ public class Server {
|
||||
tMan.register(new LoginCoordinatorWorker(), 60 * 60 * 1000, timeLeft);
|
||||
tMan.register(new EventRecallCoordinatorWorker(), 60 * 60 * 1000, timeLeft);
|
||||
tMan.register(new LoginStorageWorker(), 2 * 60 * 1000, 2 * 60 * 1000);
|
||||
tMan.register(new FredrickWorker(), 60 * 60 * 1000, 60 * 60 * 1000);
|
||||
tMan.register(new DueyFredrickWorker(), 60 * 60 * 1000, timeLeft);
|
||||
tMan.register(new InvitationWorker(), 30 * 1000, 30 * 1000);
|
||||
tMan.register(new RespawnWorker(), ServerConstants.RESPAWN_INTERVAL, ServerConstants.RESPAWN_INTERVAL);
|
||||
|
||||
timeLeft = getTimeLeftForNextDay();
|
||||
MapleExpeditionBossLog.resetBossLogTable();
|
||||
|
||||
@@ -49,7 +49,6 @@ import tools.data.input.LittleEndianAccessor;
|
||||
import client.MapleBuffStat;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleJob;
|
||||
import client.MapleStat;
|
||||
import client.Skill;
|
||||
import client.SkillFactory;
|
||||
import client.autoban.AutobanFactory;
|
||||
@@ -650,7 +649,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
|
||||
|
||||
// Find the base damage to base futher calculations on.
|
||||
// Several skills have their own formula in this section.
|
||||
int calcDmgMax = 0;
|
||||
long calcDmgMax = 0;
|
||||
|
||||
if(magic && ret.skill != 0) {
|
||||
calcDmgMax = (chr.getTotalMagic() * chr.getTotalMagic() / 1000 + chr.getTotalMagic()) / 30 + chr.getTotalInt() / 200;
|
||||
@@ -714,7 +713,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
|
||||
if(comboBuff > 6) {
|
||||
// Advanced Combo
|
||||
MapleStatEffect ceffect = SkillFactory.getSkill(advcomboid).getEffect(chr.getSkillLevel(advcomboid));
|
||||
calcDmgMax = (int) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + 0.20 + (comboBuff - 5) * 0.04);
|
||||
calcDmgMax = (long) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + 0.20 + (comboBuff - 5) * 0.04);
|
||||
} else {
|
||||
// Normal Combo
|
||||
int skillLv = chr.getSkillLevel(oid);
|
||||
@@ -722,7 +721,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
|
||||
|
||||
if(skillLv > 0) {
|
||||
MapleStatEffect ceffect = SkillFactory.getSkill(oid).getEffect(skillLv);
|
||||
calcDmgMax = (int) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (skillLv / 6)) / 100);
|
||||
calcDmgMax = (long) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (skillLv / 6)) / 100);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -850,7 +849,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
|
||||
|
||||
for (int j = 0; j < ret.numDamage; j++) {
|
||||
int damage = lea.readInt();
|
||||
int hitDmgMax = calcDmgMax;
|
||||
long hitDmgMax = calcDmgMax;
|
||||
if(ret.skill == Buccaneer.BARRAGE || ret.skill == ThunderBreaker.BARRAGE) {
|
||||
if(j > 3)
|
||||
hitDmgMax *= Math.pow(2, (j - 3));
|
||||
@@ -870,7 +869,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
|
||||
hitDmgMax = 82569000; // 30% of Max HP of strongest Dojo boss
|
||||
}
|
||||
|
||||
int maxWithCrit = hitDmgMax;
|
||||
long maxWithCrit = hitDmgMax;
|
||||
if(canCrit) // They can crit, so up the max.
|
||||
maxWithCrit *= 2;
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ public final class DueyHandler extends AbstractMaplePacketHandler {
|
||||
String recipient = slea.readMapleAsciiString();
|
||||
boolean quick = slea.readByte() != 0;
|
||||
String message = quick ? slea.readMapleAsciiString() : "";
|
||||
|
||||
DueyProcessor.dueySendItem(c, inventId, itemPos, amount, mesos, message, recipient, quick);
|
||||
} else if (operation == DueyProcessor.Actions.TOSERVER_REMOVE_PACKAGE.getCode()) {
|
||||
int packageid = slea.readInt();
|
||||
|
||||
@@ -141,7 +141,7 @@ public final class EnterMTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setInt((short) rs.getInt("int"));
|
||||
equip.setJump((short) rs.getInt("jump"));
|
||||
equip.setVicious((short) rs.getInt("vicious"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
equip.setLuk((short) rs.getInt("luk"));
|
||||
equip.setMatk((short) rs.getInt("matk"));
|
||||
equip.setMdef((short) rs.getInt("mdef"));
|
||||
@@ -209,7 +209,7 @@ public final class EnterMTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setWdef((short) rs.getInt("wdef"));
|
||||
equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rs.getInt("level"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
items.add(new MTSItemInfo((Item) equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
|
||||
}
|
||||
}
|
||||
@@ -256,7 +256,7 @@ public final class EnterMTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setWdef((short) rs.getInt("wdef"));
|
||||
equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rs.getInt("level"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
items.add(new MTSItemInfo((Item) equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -321,7 +321,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rs.getInt("level"));
|
||||
equip.setVicious((byte) rs.getInt("vicious"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
equip.setPosition(c.getPlayer().getInventory(ItemConstants.getInventoryType(rs.getInt("itemid"))).getNextFreeSlot());
|
||||
i = equip.copy();
|
||||
}
|
||||
@@ -568,7 +568,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setWdef((short) rs.getInt("wdef"));
|
||||
equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rs.getInt("level"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
items.add(new MTSItemInfo((Item) equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
|
||||
}
|
||||
}
|
||||
@@ -623,7 +623,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setWdef((short) rse.getInt("wdef"));
|
||||
equip.setUpgradeSlots((byte) rse.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rse.getInt("level"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
items.add(new MTSItemInfo((Item) equip, rse.getInt("price"), rse.getInt("id"), rse.getInt("seller"), rse.getString("sellername"), rse.getString("sell_ends")));
|
||||
}
|
||||
}
|
||||
@@ -686,7 +686,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setWdef((short) rs.getInt("wdef"));
|
||||
equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rs.getInt("level"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
items.add(new MTSItemInfo((Item) equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
|
||||
}
|
||||
}
|
||||
@@ -747,7 +747,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setWdef((short) rs.getInt("wdef"));
|
||||
equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rs.getInt("level"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
items.add(new MTSItemInfo((Item) equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
|
||||
}
|
||||
}
|
||||
@@ -841,7 +841,7 @@ public final class MTSHandler extends AbstractMaplePacketHandler {
|
||||
equip.setWdef((short) rs.getInt("wdef"));
|
||||
equip.setUpgradeSlots((byte) rs.getInt("upgradeslots"));
|
||||
equip.setLevel((byte) rs.getInt("level"));
|
||||
equip.setFlag((byte) rs.getInt("flag"));
|
||||
equip.setFlag((short) rs.getInt("flag"));
|
||||
items.add(new MTSItemInfo((Item) equip, rs.getInt("price"), rs.getInt("id"), rs.getInt("seller"), rs.getString("sellername"), rs.getString("sell_ends")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
package net.server.channel.handlers;
|
||||
|
||||
import net.AbstractMaplePacketHandler;
|
||||
import scripting.event.EventInstanceManager;
|
||||
import server.life.MapleMonster;
|
||||
import server.maps.MapleMap;
|
||||
import tools.MaplePacketCreator;
|
||||
@@ -40,9 +41,11 @@ public final class MobDamageMobFriendlyHandler extends AbstractMaplePacketHandle
|
||||
int attacker = slea.readInt();
|
||||
slea.readInt();
|
||||
int damaged = slea.readInt();
|
||||
MapleMonster monster = c.getPlayer().getMap().getMonsterByOid(damaged);
|
||||
|
||||
MapleMap map = c.getPlayer().getMap();
|
||||
MapleMonster monster = map.getMonsterByOid(damaged);
|
||||
|
||||
if (monster == null || c.getPlayer().getMap().getMonsterByOid(attacker) == null) {
|
||||
if (monster == null || map.getMonsterByOid(attacker) == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -50,26 +53,26 @@ public final class MobDamageMobFriendlyHandler extends AbstractMaplePacketHandle
|
||||
|
||||
if (monster.getHp() - damage < 1) { // friendly dies
|
||||
if(monster.getId() == 9300102) {
|
||||
monster.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, "The Watch Hog has been injured by the aliens. Better luck next time..."));
|
||||
map.broadcastMessage(MaplePacketCreator.serverNotice(6, "The Watch Hog has been injured by the aliens. Better luck next time..."));
|
||||
} else if (monster.getId() == 9300061) { //moon bunny
|
||||
monster.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, "The Moon Bunny went home because he was sick."));
|
||||
map.broadcastMessage(MaplePacketCreator.serverNotice(6, "The Moon Bunny went home because he was sick."));
|
||||
} else if(monster.getId() == 9300093) { //tylus
|
||||
monster.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, "Tylus has fallen by the overwhelming forces of the ambush."));
|
||||
map.broadcastMessage(MaplePacketCreator.serverNotice(6, "Tylus has fallen by the overwhelming forces of the ambush."));
|
||||
} else if(monster.getId() == 9300137) { //juliet
|
||||
monster.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, "Juliet has fainted in the middle of the combat."));
|
||||
map.broadcastMessage(MaplePacketCreator.serverNotice(6, "Juliet has fainted in the middle of the combat."));
|
||||
} else if(monster.getId() == 9300138) { //romeo
|
||||
monster.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, "Romeo has fainted in the middle of the combat."));
|
||||
map.broadcastMessage(MaplePacketCreator.serverNotice(6, "Romeo has fainted in the middle of the combat."));
|
||||
} else if(monster.getId() == 9400322 || monster.getId() == 9400327 || monster.getId() == 9400332) { //snowman
|
||||
monster.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, "The Snowman has melted on the heat of the battle."));
|
||||
map.broadcastMessage(MaplePacketCreator.serverNotice(6, "The Snowman has melted on the heat of the battle."));
|
||||
} else if(monster.getId() == 9300162) { //delli
|
||||
monster.getMap().broadcastMessage(MaplePacketCreator.serverNotice(6, "Delli vanished after the ambush, sheets still laying on the ground..."));
|
||||
map.broadcastMessage(MaplePacketCreator.serverNotice(6, "Delli vanished after the ambush, sheets still laying on the ground..."));
|
||||
}
|
||||
|
||||
c.getPlayer().getMap().killFriendlies(monster);
|
||||
map.killFriendlies(monster);
|
||||
} else {
|
||||
if (monster.getId() == 9300061) {
|
||||
MapleMap map = c.getPlayer().getEventInstance().getMapInstance(monster.getMap().getId());
|
||||
map.addBunnyHit();
|
||||
EventInstanceManager eim = map.getEventInstance();
|
||||
if (eim != null) {
|
||||
eim.friendlyDamaged(monster);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,10 +80,10 @@ public final class MobDamageMobFriendlyHandler extends AbstractMaplePacketHandle
|
||||
int remainingHp = monster.getHp();
|
||||
if(remainingHp <= 0) {
|
||||
remainingHp = 0;
|
||||
monster.getMap().removeMapObject(monster);
|
||||
map.removeMapObject(monster);
|
||||
}
|
||||
|
||||
c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.MobDamageMobFriendly(monster, damage, remainingHp), monster.getPosition());
|
||||
map.broadcastMessage(MaplePacketCreator.MobDamageMobFriendly(monster, damage, remainingHp), monster.getPosition());
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,12 @@ public final class QuestActionHandler extends AbstractMaplePacketHandler {
|
||||
short questid = slea.readShort();
|
||||
MapleCharacter player = c.getPlayer();
|
||||
MapleQuest quest = MapleQuest.getInstance(questid);
|
||||
if (action == 1) { //Start Quest
|
||||
|
||||
if (action == 0) { // Restore lost item, Credits Darter ( Rajan )
|
||||
slea.readInt();
|
||||
int itemid = slea.readInt();
|
||||
quest.restoreLostItem(player, itemid);
|
||||
} else if (action == 1) { //Start Quest
|
||||
int npc = slea.readInt();
|
||||
if(!isNpcNearby(slea, player, quest, npc)) {
|
||||
return;
|
||||
|
||||
@@ -28,9 +28,7 @@ import client.SkillFactory;
|
||||
import client.autoban.AutobanFactory;
|
||||
import client.status.MonsterStatusEffect;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import server.MapleStatEffect;
|
||||
import server.life.MapleMonster;
|
||||
import server.life.MapleMonsterInformationProvider;
|
||||
@@ -45,12 +43,10 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler {
|
||||
|
||||
private int monsterOid;
|
||||
private int damage;
|
||||
private boolean magic;
|
||||
|
||||
public SummonAttackEntry(int monsterOid, int damage, boolean magic) {
|
||||
|
||||
public SummonAttackEntry(int monsterOid, int damage) {
|
||||
this.monsterOid = monsterOid;
|
||||
this.damage = damage;
|
||||
this.magic = magic;
|
||||
}
|
||||
|
||||
public int getMonsterOid() {
|
||||
@@ -61,9 +57,6 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler {
|
||||
return damage;
|
||||
}
|
||||
|
||||
public boolean isMagic() {
|
||||
return magic;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -91,27 +84,22 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler {
|
||||
slea.skip(8); //Thanks Gerald :D, I failed lol (mob x,y and summon x,y)
|
||||
for (int x = 0; x < numAttacked; x++) {
|
||||
int monsterOid = slea.readInt(); // attacked oid
|
||||
slea.skip(17);
|
||||
boolean magic = slea.readByte() != 0;
|
||||
slea.skip(18);
|
||||
int damage = slea.readInt();
|
||||
allDamage.add(new SummonAttackEntry(monsterOid, damage, magic));
|
||||
allDamage.add(new SummonAttackEntry(monsterOid, damage));
|
||||
}
|
||||
player.getMap().broadcastMessage(player, MaplePacketCreator.summonAttack(player.getId(), summon.getObjectId(), direction, allDamage), summon.getPosition());
|
||||
|
||||
if (player.getMap().isOwnershipRestricted(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Map<Integer, Integer> maxDmgEntries = new HashMap<>();
|
||||
boolean magic = summonEffect.getWatk() == 0;
|
||||
int maxDmg = calcMaxDamage(summonEffect, player, magic); // thanks Darter (YungMoozi) for reporting unchecked max dmg
|
||||
for (SummonAttackEntry attackEntry : allDamage) {
|
||||
int damage = attackEntry.getDamage();
|
||||
MapleMonster target = player.getMap().getMonsterByOid(attackEntry.getMonsterOid());
|
||||
if (target != null) {
|
||||
Integer maxDmg = maxDmgEntries.get(attackEntry.getMonsterOid());
|
||||
if (maxDmg == null) {
|
||||
maxDmg = calcMaxDamage(summonEffect, player, attackEntry.isMagic()); // thanks Darter (YungMoozi) for reporting unchecked max dmg
|
||||
maxDmgEntries.put(attackEntry.getMonsterOid(), maxDmg);
|
||||
}
|
||||
|
||||
if (damage > maxDmg) {
|
||||
AutobanFactory.DAMAGE_HACK.alert(c.getPlayer(), "Possible packet editing summon damage exploit.");
|
||||
|
||||
@@ -135,7 +123,9 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler {
|
||||
if (magic) {
|
||||
maxDamage = player.calculateMaxBaseMagicDamage() * (0.05 * summonEffect.getMatk());
|
||||
} else {
|
||||
maxDamage = player.calculateMaxBaseDamage(player.getTotalWatk()) * (0.021 * summonEffect.getWatk());
|
||||
int maxBaseDmg = player.calculateMaxBaseDamage(player.getTotalWatk()); // thanks Conrad for detecting some summons legitimately hitting over the calculated limit
|
||||
float summonDmgMod = (maxBaseDmg >= 438) ? 0.054f : 0.077f;
|
||||
maxDamage = maxBaseDmg * (summonDmgMod * summonEffect.getWatk());
|
||||
}
|
||||
|
||||
return (int) maxDamage;
|
||||
|
||||
@@ -189,7 +189,7 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler {
|
||||
if (eq == null) { //Check if the type is EQUIPMENT?
|
||||
return;
|
||||
}
|
||||
byte flag = eq.getFlag();
|
||||
short flag = eq.getFlag();
|
||||
flag |= ItemConstants.LOCK;
|
||||
if (eq.getExpiration() > -1) {
|
||||
return; //No perma items pls
|
||||
|
||||
@@ -19,15 +19,17 @@
|
||||
*/
|
||||
package net.server.worker;
|
||||
|
||||
import client.processor.DueyProcessor;
|
||||
import client.processor.FredrickProcessor;
|
||||
|
||||
/**
|
||||
* @author Ronan
|
||||
*/
|
||||
public class FredrickWorker implements Runnable {
|
||||
public class DueyFredrickWorker implements Runnable {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
FredrickProcessor.runFredrickSchedule();
|
||||
DueyProcessor.runDueyExpireSchedule();
|
||||
}
|
||||
}
|
||||
19
src/net/server/worker/RespawnWorker.java
Normal file
19
src/net/server/worker/RespawnWorker.java
Normal file
@@ -0,0 +1,19 @@
|
||||
package net.server.worker;
|
||||
|
||||
import net.server.Server;
|
||||
import net.server.channel.Channel;
|
||||
|
||||
/**
|
||||
* @author Resinate
|
||||
*/
|
||||
public class RespawnWorker implements Runnable {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
for (Channel ch : Server.getInstance().getAllChannels()) {
|
||||
if (!ch.getPlayerStorage().getAllCharacters().isEmpty()) {
|
||||
ch.getMapFactory().updateMaps();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -96,6 +96,8 @@ import net.server.coordinator.MapleInviteCoordinator.InviteResult;
|
||||
import net.server.coordinator.MapleInviteCoordinator.InviteType;
|
||||
import net.server.coordinator.MapleMatchCheckerCoordinator;
|
||||
import net.server.coordinator.MaplePartySearchCoordinator;
|
||||
import server.maps.MapleMiniDungeon;
|
||||
import server.maps.MapleMiniDungeonInfo;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -927,10 +929,23 @@ public class World {
|
||||
break;
|
||||
case CHANGE_LEADER:
|
||||
MapleCharacter mc = party.getLeader().getPlayer();
|
||||
MapleCharacter newLeader = target.getPlayer();
|
||||
|
||||
EventInstanceManager eim = mc.getEventInstance();
|
||||
|
||||
if(eim != null && eim.isEventLeader(mc)) {
|
||||
eim.changedLeader(target.getPlayer());
|
||||
eim.changedLeader(newLeader);
|
||||
} else {
|
||||
int oldLeaderMapid = mc.getMapId();
|
||||
|
||||
if (MapleMiniDungeonInfo.isDungeonMap(oldLeaderMapid)) {
|
||||
if (oldLeaderMapid != newLeader.getMapId()) {
|
||||
MapleMiniDungeon mmd = newLeader.getClient().getChannelServer().getMiniDungeon(oldLeaderMapid);
|
||||
if(mmd != null) {
|
||||
mmd.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
party.setLeader(target);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user