Fix mob using attack with no diseaseSkill causing errors
This commit is contained in:
@@ -492,7 +492,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
if (monster.isBuffed(MonsterStatus.WEAPON_REFLECT) && !attack.magic) {
|
||||
for (MobSkillId msId : monster.getSkills()) {
|
||||
if (msId.type() == MobSkillType.PHYSICAL_AND_MAGIC_COUNTER) {
|
||||
MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level());
|
||||
MobSkill toUse = MobSkillFactory.getMobSkillOrThrow(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level());
|
||||
player.addHP(-toUse.getX());
|
||||
map.broadcastMessage(player, PacketCreator.damagePlayer(0, monster.getId(), player.getId(), toUse.getX(), 0, 0, false, 0, true, monster.getObjectId(), 0, 0), true);
|
||||
}
|
||||
@@ -501,7 +501,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
if (monster.isBuffed(MonsterStatus.MAGIC_REFLECT) && attack.magic) {
|
||||
for (MobSkillId msId : monster.getSkills()) {
|
||||
if (msId.type() == MobSkillType.PHYSICAL_AND_MAGIC_COUNTER) {
|
||||
MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level());
|
||||
MobSkill toUse = MobSkillFactory.getMobSkillOrThrow(MobSkillType.PHYSICAL_AND_MAGIC_COUNTER, msId.level());
|
||||
player.addHP(-toUse.getY());
|
||||
map.broadcastMessage(player, PacketCreator.damagePlayer(0, monster.getId(), player.getId(), toUse.getY(), 0, 0, false, 0, true, monster.getObjectId(), 0, 0), true);
|
||||
}
|
||||
|
||||
@@ -79,19 +79,16 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
|
||||
boolean isAttack = inRangeInclusive(rawActivity, 24, 41);
|
||||
boolean isSkill = inRangeInclusive(rawActivity, 42, 59);
|
||||
|
||||
int useSkillId = 0, useSkillLevel = 0;
|
||||
|
||||
MobSkill nextUse = null;
|
||||
int nextSkillId = 0, nextSkillLevel = 0;
|
||||
|
||||
boolean nextMovementCouldBeSkill = !(isSkill || (pNibbles != 0));
|
||||
int useSkillId = 0;
|
||||
int useSkillLevel = 0;
|
||||
|
||||
if (isSkill) {
|
||||
useSkillId = skillId;
|
||||
useSkillLevel = skillLv;
|
||||
|
||||
if (monster.hasSkill(useSkillId, useSkillLevel)) {
|
||||
MobSkill toUse = MobSkillFactory.getMobSkill(MobSkillType.from(useSkillId), useSkillLevel);
|
||||
MobSkillType mobSkillType = MobSkillType.from(useSkillId).orElseThrow();
|
||||
MobSkill toUse = MobSkillFactory.getMobSkillOrThrow(mobSkillType, useSkillLevel);
|
||||
|
||||
if (monster.canUseSkill(toUse, true)) {
|
||||
int animationTime = MonsterInformationProvider.getInstance().getMobSkillAnimationTime(toUse);
|
||||
@@ -112,12 +109,16 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
boolean nextMovementCouldBeSkill = !(isSkill || (pNibbles != 0));
|
||||
MobSkill nextUse = null;
|
||||
int nextSkillId = 0;
|
||||
int nextSkillLevel = 0;
|
||||
int mobMp = monster.getMp();
|
||||
if (nextMovementCouldBeSkill && monster.hasAnySkill()) {
|
||||
MobSkillId skillToUse = monster.getRandomSkill();
|
||||
nextSkillId = skillToUse.type().getId();
|
||||
nextSkillLevel = skillToUse.level();
|
||||
nextUse = MobSkillFactory.getMobSkill(skillToUse.type(), skillToUse.level());
|
||||
nextUse = MobSkillFactory.getMobSkillOrThrow(skillToUse.type(), skillToUse.level());
|
||||
|
||||
if (!(nextUse != null && monster.canUseSkill(nextUse, false) && nextUse.getHP() >= (int) (((float) monster.getHp() / monster.getMaxHp()) * 100) && mobMp >= nextUse.getMpCon())) {
|
||||
// thanks OishiiKawaiiDesu for noticing mobs trying to cast skills they are not supposed to be able
|
||||
|
||||
@@ -49,6 +49,7 @@ import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public final class TakeDamageHandler extends AbstractPacketHandler {
|
||||
private static final Logger log = LoggerFactory.getLogger(TakeDamageHandler.class);
|
||||
@@ -151,9 +152,11 @@ public final class TakeDamageHandler extends AbstractPacketHandler {
|
||||
is_deadly = true;
|
||||
}
|
||||
mpattack += attackInfo.getMpBurn();
|
||||
MobSkill mobSkill = MobSkillFactory.getMobSkill(MobSkillType.from(attackInfo.getDiseaseSkill()), attackInfo.getDiseaseLevel());
|
||||
if (mobSkill != null && damage > 0) {
|
||||
mobSkill.applyEffect(chr, attacker, false, banishPlayers);
|
||||
|
||||
Optional<MobSkillType> possibleType = MobSkillType.from(attackInfo.getDiseaseSkill());
|
||||
Optional<MobSkill> possibleMobSkill = possibleType.map(type -> MobSkillFactory.getMobSkillOrThrow(type, attackInfo.getDiseaseLevel()));
|
||||
if (possibleMobSkill.isPresent() && damage > 0) {
|
||||
possibleMobSkill.get().applyEffect(chr, attacker, false, banishPlayers);
|
||||
}
|
||||
|
||||
attacker.setMp(attacker.getMp() - attackInfo.getMpCon());
|
||||
|
||||
Reference in New Issue
Block a user