Combine type and skillLevel in MobSkill

This commit is contained in:
P0nk
2022-09-03 14:07:24 +02:00
parent 7cdaabf6f8
commit a6ec6adbb5
5 changed files with 38 additions and 41 deletions
+3 -2
View File
@@ -8108,8 +8108,9 @@ public class Character extends AbstractCharacterObject {
ps.setInt(2, e.getKey().ordinal()); ps.setInt(2, e.getKey().ordinal());
MobSkill ms = e.getValue().getRight(); MobSkill ms = e.getValue().getRight();
ps.setInt(3, ms.getSkillId()); MobSkillId msId = ms.getId();
ps.setInt(4, ms.getSkillLevel()); ps.setInt(3, msId.type().getId());
ps.setInt(4, msId.level());
ps.setInt(5, e.getValue().getLeft().intValue()); ps.setInt(5, e.getValue().getLeft().intValue());
ps.addBatch(); ps.addBatch();
} }
+10 -16
View File
@@ -47,8 +47,7 @@ import java.util.*;
public class MobSkill { public class MobSkill {
private static final Logger log = LoggerFactory.getLogger(MobSkill.class); private static final Logger log = LoggerFactory.getLogger(MobSkill.class);
private final MobSkillType type; private final MobSkillId id;
private final int skillLevel;
private final int mpCon; private final int mpCon;
private final int spawnEffect; private final int spawnEffect;
private final int hp; private final int hp;
@@ -65,8 +64,7 @@ public class MobSkill {
private MobSkill(MobSkillType type, int level, int mpCon, int spawnEffect, int hp, int x, int y, int count, private MobSkill(MobSkillType type, int level, int mpCon, int spawnEffect, int hp, int x, int y, int count,
long duration, long cooltime, float prop, Point lt, Point rb, int limit, List<Integer> toSummon) { long duration, long cooltime, float prop, Point lt, Point rb, int limit, List<Integer> toSummon) {
this.type = type; this.id = new MobSkillId(type, level);
this.skillLevel = level;
this.mpCon = mpCon; this.mpCon = mpCon;
this.spawnEffect = spawnEffect; this.spawnEffect = spawnEffect;
this.hp = hp; this.hp = hp;
@@ -195,7 +193,7 @@ public class MobSkill {
Disease disease = null; Disease disease = null;
Map<MonsterStatus, Integer> stats = new EnumMap<>(MonsterStatus.class); Map<MonsterStatus, Integer> stats = new EnumMap<>(MonsterStatus.class);
List<Integer> reflection = new ArrayList<>(); List<Integer> reflection = new ArrayList<>();
switch (type) { switch (id.type()) {
case ATTACK_UP, ATTACK_UP_M, PAD -> stats.put(MonsterStatus.WEAPON_ATTACK_UP, x); case ATTACK_UP, ATTACK_UP_M, PAD -> stats.put(MonsterStatus.WEAPON_ATTACK_UP, x);
case MAGIC_ATTACK_UP, MAGIC_ATTACK_UP_M, MAD -> stats.put(MonsterStatus.MAGIC_ATTACK_UP, x); case MAGIC_ATTACK_UP, MAGIC_ATTACK_UP_M, MAD -> stats.put(MonsterStatus.MAGIC_ATTACK_UP, x);
case DEFENSE_UP, DEFENSE_UP_M, PDR -> stats.put(MonsterStatus.WEAPON_DEFENSE_UP, x); case DEFENSE_UP, DEFENSE_UP_M, PDR -> stats.put(MonsterStatus.WEAPON_DEFENSE_UP, x);
@@ -368,10 +366,10 @@ public class MobSkill {
private void applyMonsterBuffs(Map<MonsterStatus, Integer> stats, boolean skill, Monster monster, List<Integer> reflection) { private void applyMonsterBuffs(Map<MonsterStatus, Integer> stats, boolean skill, Monster monster, List<Integer> reflection) {
if (lt != null && rb != null && skill) { if (lt != null && rb != null && skill) {
for (MapObject mons : getObjectsInRange(monster, MapObjectType.MONSTER)) { for (MapObject mons : getObjectsInRange(monster, MapObjectType.MONSTER)) {
((Monster) mons).applyMonsterBuff(stats, getX(), type.getId(), getDuration(), this, reflection); ((Monster) mons).applyMonsterBuff(stats, getX(), getDuration(), this, reflection);
} }
} else { } else {
monster.applyMonsterBuff(stats, getX(), type.getId(), getDuration(), this, reflection); monster.applyMonsterBuff(stats, getX(), getDuration(), this, reflection);
} }
} }
@@ -399,16 +397,12 @@ public class MobSkill {
return monster.getMap().getPlayersInRange(calculateBoundingBox(monster.getPosition())); return monster.getMap().getPlayersInRange(calculateBoundingBox(monster.getPosition()));
} }
public MobSkillId getId() {
return id;
}
public MobSkillType getType() { public MobSkillType getType() {
return type; return id.type();
}
public int getSkillId() {
return type.getId();
}
public int getSkillLevel() {
return skillLevel;
} }
public int getMpCon() { public int getMpCon() {
+6 -5
View File
@@ -82,7 +82,7 @@ public class Monster extends AbstractLoadedLife {
private int VenomMultiplier = 0; private int VenomMultiplier = 0;
private boolean fake = false; private boolean fake = false;
private boolean dropsDisabled = false; private boolean dropsDisabled = false;
private final List<Pair<Integer, Integer>> usedSkills = new ArrayList<>(); private final List<Pair<Integer, Integer>> usedSkills = new ArrayList<>(); // TODO: change to Set<MobSkillId>
private final Map<Pair<Integer, Integer>, Integer> skillsUsed = new HashMap<>(); private final Map<Pair<Integer, Integer>, Integer> skillsUsed = new HashMap<>();
private final Set<Integer> usedAttacks = new HashSet<>(); private final Set<Integer> usedAttacks = new HashSet<>();
private Set<Integer> calledMobOids = null; private Set<Integer> calledMobOids = null;
@@ -1289,7 +1289,7 @@ public class Monster extends AbstractLoadedLife {
} }
} }
public void applyMonsterBuff(final Map<MonsterStatus, Integer> stats, final int x, int skillId, long duration, MobSkill skill, final List<Integer> reflection) { public void applyMonsterBuff(final Map<MonsterStatus, Integer> stats, final int x, long duration, MobSkill skill, final List<Integer> reflection) {
final Runnable cancelTask = () -> { final Runnable cancelTask = () -> {
if (isAlive()) { if (isAlive()) {
Packet packet = PacketCreator.cancelMonsterStatus(getObjectId(), stats); Packet packet = PacketCreator.cancelMonsterStatus(getObjectId(), stats);
@@ -1448,7 +1448,8 @@ public class Monster extends AbstractLoadedLife {
monsterLock.lock(); monsterLock.lock();
try { try {
for (Pair<Integer, Integer> skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown for (Pair<Integer, Integer> skill : usedSkills) { // thanks OishiiKawaiiDesu for noticing an issue with mobskill cooldown
if (skill.getLeft() == toUse.getSkillId() && skill.getRight() == toUse.getSkillLevel()) { MobSkillId msId = toUse.getId();
if (skill.getLeft() == msId.type().getId() && skill.getRight() == msId.level()) {
return false; return false;
} }
} }
@@ -1482,8 +1483,8 @@ public class Monster extends AbstractLoadedLife {
} }
private void usedSkill(MobSkill skill) { private void usedSkill(MobSkill skill) {
final int skillId = skill.getSkillId(); final int skillId = skill.getId().type().getId();
final int level = skill.getSkillLevel(); final int level = skill.getId().level();
long cooltime = skill.getCoolTime(); long cooltime = skill.getCoolTime();
monsterLock.lock(); monsterLock.lock();
+2 -2
View File
@@ -138,14 +138,14 @@ public class Mist extends AbstractMapObject {
if (owner != null) { if (owner != null) {
return PacketCreator.spawnMist(getObjectId(), owner.getId(), getSourceSkill().getId(), owner.getSkillLevel(SkillFactory.getSkill(source.getSourceId())), this); return PacketCreator.spawnMist(getObjectId(), owner.getId(), getSourceSkill().getId(), owner.getSkillLevel(SkillFactory.getSkill(source.getSourceId())), this);
} }
return PacketCreator.spawnMist(getObjectId(), mob.getId(), skill.getSkillId(), skill.getSkillLevel(), this); return PacketCreator.spawnMobMist(getObjectId(), mob.getId(), skill.getId(), this);
} }
public final Packet makeFakeSpawnData(int level) { public final Packet makeFakeSpawnData(int level) {
if (owner != null) { if (owner != null) {
return PacketCreator.spawnMist(getObjectId(), owner.getId(), getSourceSkill().getId(), level, this); return PacketCreator.spawnMist(getObjectId(), owner.getId(), getSourceSkill().getId(), level, this);
} }
return PacketCreator.spawnMist(getObjectId(), mob.getId(), skill.getSkillId(), skill.getSkillLevel(), this); return PacketCreator.spawnMobMist(getObjectId(), mob.getId(), skill.getId(), this);
} }
@Override @Override
+17 -16
View File
@@ -64,10 +64,7 @@ import server.CashShop.CashItemFactory;
import server.CashShop.SpecialCashItem; import server.CashShop.SpecialCashItem;
import server.*; import server.*;
import server.events.gm.Snowball; import server.events.gm.Snowball;
import server.life.MobSkill; import server.life.*;
import server.life.Monster;
import server.life.NPC;
import server.life.PlayerNPC;
import server.maps.*; import server.maps.*;
import server.maps.MiniGame.MiniGameResult; import server.maps.MiniGame.MiniGameResult;
import server.movement.LifeMovementFragment; import server.movement.LifeMovementFragment;
@@ -106,6 +103,11 @@ public class PacketCreator {
return utcTimestamp * 10000 + FT_UT_OFFSET; return utcTimestamp * 10000 + FT_UT_OFFSET;
} }
private static void writeMobSkillId(OutPacket packet, MobSkillId msId) {
packet.writeShort(msId.type().getId());
packet.writeShort(msId.level());
}
public static Packet showHpHealed(int cid, int amount) { public static Packet showHpHealed(int cid, int amount) {
OutPacket p = OutPacket.create(SendOpcode.SHOW_FOREIGN_EFFECT); OutPacket p = OutPacket.create(SendOpcode.SHOW_FOREIGN_EFFECT);
p.writeInt(cid); p.writeInt(cid);
@@ -1410,8 +1412,7 @@ public class PacketCreator {
MobSkill mobSkill = mse.getMobSkill(); MobSkill mobSkill = mse.getMobSkill();
if (mobSkill != null) { if (mobSkill != null) {
p.writeShort(mobSkill.getSkillId()); writeMobSkillId(p, mobSkill.getId());
p.writeShort(mobSkill.getSkillLevel());
switch (s.getKey()) { switch (s.getKey()) {
case WEAPON_REFLECT -> pCounter = mobSkill.getX(); case WEAPON_REFLECT -> pCounter = mobSkill.getX();
@@ -2917,8 +2918,7 @@ public class PacketCreator {
writeLongMaskD(p, statups); writeLongMaskD(p, statups);
for (Pair<Disease, Integer> statup : statups) { for (Pair<Disease, Integer> statup : statups) {
p.writeShort(statup.getRight().shortValue()); p.writeShort(statup.getRight().shortValue());
p.writeShort(skill.getSkillId()); writeMobSkillId(p, skill.getId());
p.writeShort(skill.getSkillLevel());
p.writeInt((int) skill.getDuration()); p.writeInt((int) skill.getDuration());
} }
p.writeShort(0); // ??? wk charges have 600 here o.o p.writeShort(0); // ??? wk charges have 600 here o.o
@@ -2936,8 +2936,7 @@ public class PacketCreator {
if (statup.getLeft() == Disease.POISON) { if (statup.getLeft() == Disease.POISON) {
p.writeShort(statup.getRight().shortValue()); p.writeShort(statup.getRight().shortValue());
} }
p.writeShort(skill.getSkillId()); writeMobSkillId(p, skill.getId());
p.writeShort(skill.getSkillLevel());
} }
p.writeShort(0); // same as give_buff p.writeShort(0); // same as give_buff
p.writeShort(900);//Delay p.writeShort(900);//Delay
@@ -3051,8 +3050,7 @@ public class PacketCreator {
if (statup.getLeft() == Disease.POISON) { if (statup.getLeft() == Disease.POISON) {
p.writeShort(statup.getRight().shortValue()); p.writeShort(statup.getRight().shortValue());
} }
p.writeShort(skill.getSkillId()); writeMobSkillId(p, skill.getId());
p.writeShort(skill.getSkillLevel());
} }
p.writeShort(0); // same as give_buff p.writeShort(0); // same as give_buff
p.writeShort(900);//Delay p.writeShort(900);//Delay
@@ -3932,8 +3930,7 @@ public class PacketCreator {
for (Map.Entry<MonsterStatus, Integer> stat : stati.entrySet()) { for (Map.Entry<MonsterStatus, Integer> stat : stati.entrySet()) {
p.writeShort(stat.getValue()); p.writeShort(stat.getValue());
if (mse.isMonsterSkill()) { if (mse.isMonsterSkill()) {
p.writeShort(mse.getMobSkill().getSkillId()); writeMobSkillId(p, mse.getMobSkill().getId());
p.writeShort(mse.getMobSkill().getSkillLevel());
} else { } else {
p.writeInt(mse.getSkill().getId()); p.writeInt(mse.getSkill().getId());
} }
@@ -3984,11 +3981,15 @@ public class PacketCreator {
return p; return p;
} }
public static Packet spawnMist(int objId, int ownerChrId, int skill, int level, Mist mist) { public static Packet spawnMobMist(int objId, int ownerMobId, MobSkillId msId, Mist mist) {
return spawnMist(objId, ownerMobId, msId.type().getId(), msId.level(), mist);
}
public static Packet spawnMist(int objId, int ownerId, int skill, int level, Mist mist) {
OutPacket p = OutPacket.create(SendOpcode.SPAWN_MIST); OutPacket p = OutPacket.create(SendOpcode.SPAWN_MIST);
p.writeInt(objId); p.writeInt(objId);
p.writeInt(mist.isMobMist() ? 0 : mist.isPoisonMist() ? 1 : mist.isRecoveryMist() ? 4 : 2); // mob mist = 0, player poison = 1, smokescreen = 2, unknown = 3, recovery = 4 p.writeInt(mist.isMobMist() ? 0 : mist.isPoisonMist() ? 1 : mist.isRecoveryMist() ? 4 : 2); // mob mist = 0, player poison = 1, smokescreen = 2, unknown = 3, recovery = 4
p.writeInt(ownerChrId); p.writeInt(ownerId);
p.writeInt(skill); p.writeInt(skill);
p.writeByte(level); p.writeByte(level);
p.writeShort(mist.getSkillDelay()); // Skill delay p.writeShort(mist.getSkillDelay()); // Skill delay