Abstract channel schedulers + Mob animation track + More portal SFX

Implemented an improved scheduler system for channels, on where Runnables objects are "registered in" to run on a scheduled future time (effective run time will depend on the proc time of the worker acting under-the-hood).
Implemented a channel scheduler for detecting "mobs currently on animation state". This allows the server to send info to the client about whether a mob should cast a skill or not at that moment.
Improved concurrent protection on MapleMonster listeners registry.
Improved resource deallocation when destroying a monster object.
Added a server flag to allow clean slates to be used on equipments even on the "only successfully used scroll slots" case.
Fixed a critical deadlock case with MapleServerHandler.
Added the portal SFX for many scripted portals that still lacked the sound effect.
This commit is contained in:
ronancpl
2018-07-08 18:25:48 -03:00
parent 94425ba616
commit 5dc16d0cab
42 changed files with 1226 additions and 161 deletions

View File

@@ -43,6 +43,7 @@ import tools.data.input.SeekableLittleEndianAccessor;
/**
* @author Danny (Leifde)
* @author ExtremeDevilz
* @author Ronan (HeavenMS)
*/
public final class MoveLifeHandler extends AbstractMovementPacketHandler {
@Override
@@ -76,49 +77,62 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
int nextCastSkill = useSkillId;
int nextCastSkillLevel = useSkillLevel;
MobSkill toUse = null;
int percHpLeft = (int) (((float) monster.getHp() / monster.getMaxHp()) * 100);
if (nextMovementCouldBeSkill && monster.getNoSkills() > 0) {
int Random = Randomizer.nextInt(monster.getNoSkills());
Pair<Integer, Integer> skillToUse = monster.getSkills().get(Random);
nextCastSkill = skillToUse.getLeft();
nextCastSkillLevel = skillToUse.getRight();
toUse = MobSkillFactory.getMobSkill(nextCastSkill, nextCastSkillLevel);
MobSkill toUse = null;
int rndSkill = -1;
if(monster.getNoSkills() > 0) {
if(nextMovementCouldBeSkill) {
rndSkill = Randomizer.nextInt(monster.getNoSkills());
}
} else {
nextMovementCouldBeSkill = false;
}
if(monster.applyAnimationIfRoaming((attackId - 13) / 2, rndSkill)) {
if (rndSkill > -1) {
Pair<Integer, Integer> skillToUse = monster.getSkills().get(rndSkill);
nextCastSkill = skillToUse.getLeft();
nextCastSkillLevel = skillToUse.getRight();
toUse = MobSkillFactory.getMobSkill(nextCastSkill, nextCastSkillLevel);
if (isSkill || isAttack) {
if (nextCastSkill != toUse.getSkillId() || nextCastSkillLevel != toUse.getSkillLevel()) {
//toUse.resetAnticipatedSkill();
return;
} else if (toUse.getHP() < percHpLeft) {
toUse = null;
} else if (monster.canUseSkill(toUse)) {
int animationTime = MapleMonsterInformationProvider.getInstance().getMobSkillAnimationTime(monster.getId(), Random);
if(animationTime > 0) {
toUse.applyDelayedEffect(c.getPlayer(), monster, true, banishPlayers, animationTime);
if (isSkill || isAttack) {
int percHpLeft = (int) (((float) monster.getHp() / monster.getMaxHp()) * 100);
if (nextCastSkill != toUse.getSkillId() || nextCastSkillLevel != toUse.getSkillLevel()) {
//toUse.resetAnticipatedSkill();
return;
} else if (toUse.getHP() < percHpLeft) {
toUse = null;
} else if (monster.canUseSkill(toUse)) {
int animationTime = MapleMonsterInformationProvider.getInstance().getMobSkillAnimationTime(monster.getId(), rndSkill);
if(animationTime > 0) {
toUse.applyDelayedEffect(c.getPlayer(), monster, true, banishPlayers, animationTime);
} else {
toUse.applyEffect(c.getPlayer(), monster, true, banishPlayers);
}
} else {
toUse.applyEffect(c.getPlayer(), monster, true, banishPlayers);
toUse = null;
}
} else {
toUse = null;
}
} else {
toUse = null; // paliative measure for suspicious mob movement
/*
long curtime = System.currentTimeMillis();
if(curtime >= monster.getNextBasicSkillTime()) { // dont use the special attack too often, chase the player f3
MobAttackInfo mobAttack = MobAttackInfoFactory.getMobAttackInfo(monster, attackId);
monster.setNextBasicSkillTime(curtime);
} else {
toUse = null;
}
*/
}
}
toUse = null; // paliative measure for suspicious mob movement
/*
long curtime = System.currentTimeMillis();
if(curtime >= monster.getNextBasicSkillTime()) { // dont use the special attack too often, chase the player f3
MobAttackInfo mobAttack = MobAttackInfoFactory.getMobAttackInfo(monster, attackId);
monster.setNextBasicSkillTime(curtime);
} else {
toUse = null;
}
*/
}
}
} else {
if(rndSkill > -1) {
nextMovementCouldBeSkill = false;
}
}
slea.readByte();
slea.readInt(); // whatever
short start_x = slea.readShort(); // hmm.. startpos?