Missing Pirate questlines + Find & MoveLife update + Party-Map patch

Implemented missing scripts for Aerial Strike, Hypnotize and Time Leap skill questlines.
Fixed an deadlock issue within player's inventory and status.
Fixed skill spam detection disconnecting players when legitimatelly spamming Flash Jump or Heal.
Fixed party members map location not being properly updated after changing maps.
Rehauled MoveLife handler. Improved packet read of attack and skill elements, properly reflecting incoming actions to other player on the map.
Reviewed an issue with equipments MaxHP/MaxMP getting unsynced with player's MaxHP/MaxMP, resulting in differences within server-client view of a player's pool.
Fixed mobs not being spawned by dojo bosses after enough spawn actions were instanced.
Implemented proper Mob.wz linked mob data support.
Fixed /find not identifying a player's channel properly.
Fixed Echo of Hero not affecting other player in the map.
Fixed commands warp and goto not taking player off events/expeditions properly.
Fixed storage expansion not being registered on DB when buying the cash item.
Fixed party leadership being reassigned after changing channels.
Implemented suggested level range limit between party members on the EXP share system. Players whose level range from the attacker exceeds the estipulated threshold will not receive any EXP from the action.

Happy Thanksgiving Day everyone!!!
This commit is contained in:
ronancpl
2018-11-22 16:16:21 -02:00
parent 5ee0cd1c98
commit 0910dc2428
163 changed files with 4618 additions and 3186 deletions
+1 -1
View File
@@ -51,7 +51,7 @@ import net.server.audit.locks.MonitoredLockType;
/**
*
* @author XoticStory
* @author Ronan (concurrency protection)
* @author Ronan - concurrency protection
*/
public class MapleHiredMerchant extends AbstractMapleMapObject {
private int ownerId, itemId, mesos = 0;
+50 -21
View File
@@ -1539,7 +1539,40 @@ public class MapleMap {
mr.setPosition(points.remove(points.size() - 1));
}
}
private MapleCharacter getNextControllerCandidate() {
int mincontrolled = Integer.MAX_VALUE;
MapleCharacter newController = null;
int mincontrolleddead = Integer.MAX_VALUE;
MapleCharacter newControllerDead = null;
chrRLock.lock();
try {
for (MapleCharacter chr : characters) {
if (!chr.isHidden()) {
int ctrlMonsSize = chr.getControlledMonsters().size();
if (chr.isAlive()) {
if (ctrlMonsSize < mincontrolled) {
mincontrolled = ctrlMonsSize;
newController = chr;
}
} else {
if (ctrlMonsSize < mincontrolleddead) {
mincontrolleddead = ctrlMonsSize;
newControllerDead = chr;
}
}
}
}
} finally {
chrRLock.unlock();
}
return newController != null ? newController : newControllerDead;
}
/**
* Automagically finds a new controller for the given monster from the chars
* on the map...
@@ -1553,29 +1586,28 @@ public class MapleMap {
return;
}
MapleCharacter newController;
MapleCharacter chrController = monster.getController();
if (chrController != null) {
if (chrController.getMap() != this) {
chrController.stopControllingMonster(monster);
newController = getNextControllerCandidate();
} else {
return;
}
}
int mincontrolled = -1;
MapleCharacter newController = null;
chrRLock.lock();
try {
for (MapleCharacter chr : characters) {
int ctrlMonsSize = chr.getControlledMonsters().size();
if (!chr.isHidden() && (ctrlMonsSize < mincontrolled || mincontrolled == -1)) {
mincontrolled = ctrlMonsSize;
newController = chr;
if (chrController.isAlive()) {
return;
}
newController = getNextControllerCandidate();
if (newController == null || !newController.isAlive()) {
return;
}
chrController.stopControllingMonster(monster);
}
} finally {
chrRLock.unlock();
} else {
newController = getNextControllerCandidate();
}
if (newController != null) { // was a new controller found? (if not no one is on the map)
if (monster.isFirstAttack()) {
newController.controlMonster(monster, true);
@@ -2364,11 +2396,8 @@ public class MapleMap {
chr.cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING);
chr.cancelBuffStats(MapleBuffStat.MONSTER_RIDING);
}
if (mapid == 923010000) { // Kenta's Mount Quest
if(getMonsterById(9300102) == null) {
spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(9300102), new Point(77, 426));
}
} else if (mapid == 200090060) { // To Rien
if (mapid == 200090060) { // To Rien
int travelTime = getWorldServer().getTransportationTime(1 * 60 * 1000);
chr.announce(MaplePacketCreator.getClock(travelTime / 1000));
TimerManager.getInstance().schedule(new Runnable() {
+1 -1
View File
@@ -46,7 +46,7 @@ import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
/**
*
* @author Matze
* @author Ronan (concurrency protection)
* @author Ronan - concurrency protection
*/
public class MaplePlayerShop extends AbstractMapleMapObject {
private AtomicBoolean open = new AtomicBoolean(false);
+1 -1
View File
@@ -30,7 +30,7 @@ import tools.MaplePacketCreator;
/*
* MapleTVEffect
* @author MrXotic
* @author Ronan (made MapleTV mechanics synchronous)
* @author Ronan - made MapleTV mechanics synchronous
*/
public class MapleTVEffect {