package tools.packet;
import handling.SendPacketOpcode;
import java.awt.Point;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import server.life.MapleMonster;
import server.life.MobSkill;
import server.maps.MapleMap;
import server.maps.MapleNodes;
import server.movement.LifeMovementFragment;
import tools.Pair;
import tools.data.MaplePacketLittleEndianWriter;
import client.status.MonsterStatus;
import client.status.MonsterStatusEffect;
public class MobPacket {
public static byte[] damageMonster(int oid, long damage) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.DAMAGE_MONSTER.getValue());
mplew.writeInt(oid);
mplew.write(0);
mplew.writeLong(damage);
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static byte[] damageFriendlyMob(MapleMonster mob, long damage, boolean display) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.DAMAGE_MONSTER.getValue());
mplew.writeInt(mob.getObjectId());
mplew.write(display ? 1 : 2);
if (damage > 2147483647L) {
mplew.writeInt(2147483647);
} else {
mplew.writeInt((int) damage);
}
if (mob.getHp() > 2147483647L) {
mplew.writeInt((int) (mob.getHp() / mob.getMobMaxHp() * 2147483647.0D));
} else {
mplew.writeInt((int) mob.getHp());
}
if (mob.getMobMaxHp() > 2147483647L) {
mplew.writeInt(2147483647);
} else {
mplew.writeInt((int) mob.getMobMaxHp());
}
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static byte[] killMonster(int oid, int animation) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.KILL_MONSTER.getValue());
mplew.writeInt(oid);
mplew.write(animation);
if (animation == 4) {
mplew.writeInt(-1);
}
return mplew.getPacket();
}
public static byte[] suckMonster(int oid, int chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.KILL_MONSTER.getValue());
mplew.writeInt(oid);
mplew.write(4);
mplew.writeInt(chr);
return mplew.getPacket();
}
public static byte[] healMonster(int oid, int heal) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.DAMAGE_MONSTER.getValue());
mplew.writeInt(oid);
mplew.write(0);
mplew.writeInt(-heal);
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static byte[] MobToMobDamage(int oid, int dmg, int mobid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MOB_TO_MOB_DAMAGE.getValue());
mplew.writeInt(oid);
mplew.write(0);
mplew.writeInt(dmg);
mplew.writeInt(mobid);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] getMobSkillEffect(int oid, int skillid, int cid, int skilllevel) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SKILL_EFFECT_MOB.getValue());
mplew.writeInt(oid);
mplew.writeInt(skillid);
mplew.writeInt(cid);
mplew.writeShort(skilllevel);
return mplew.getPacket();
}
public static byte[] getMobCoolEffect(int oid, int itemid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.ITEM_EFFECT_MOB.getValue());
mplew.writeInt(oid);
mplew.writeInt(itemid);
return mplew.getPacket();
}
public static byte[] showMonsterHP(int oid, int remhppercentage) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_MONSTER_HP.getValue());
mplew.writeInt(oid);
mplew.write(remhppercentage);
return mplew.getPacket();
}
public static byte[] showCygnusAttack(int oid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CYGNUS_ATTACK.getValue());
mplew.writeInt(oid);
return mplew.getPacket();
}
public static byte[] showMonsterResist(int oid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MONSTER_RESIST.getValue());
mplew.writeInt(oid);
mplew.writeInt(0);
mplew.writeShort(1);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] showBossHP(final MapleMonster mob) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.BOSS_ENV.getValue());
mplew.write(6);
mplew.writeInt(mob.getId());
if (mob.getHp() > 2147483647)
mplew.writeInt((int)(mob.getHp() / mob.getMobMaxHp()* 2147483647.0D));
else {
mplew.writeInt((int)(mob.getHp() <= 0L ? -1L : mob.getHp()));
}
if (mob.getMobMaxHp() > 2147483647L)
mplew.writeInt(2147483647);
else {
mplew.writeInt((int)mob.getMobMaxHp());
}
mplew.write(6);
mplew.write(5);
return mplew.getPacket();
}
public static byte[] moveMonster(boolean useskill, int skill, int unk, int oid, Point startPos, List<LifeMovementFragment> moves) {
return moveMonster(useskill, skill, unk, oid, startPos, moves, null, null);
}
public static byte[] moveMonster(boolean useskill, int skill, int unk, int oid, Point startPos, List<LifeMovementFragment> moves, List<Integer> unk2, List<Pair<Integer, Integer>> unk3) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MOVE_MONSTER.getValue());
mplew.writeInt(oid);
mplew.write(useskill ? 1 : 0);
mplew.write(skill);
mplew.writeInt(unk);
mplew.write(unk3 == null ? 0 : unk3.size());
if (unk3 != null) {
for (Pair i : unk3) {
mplew.writeShort(((Integer) i.left).intValue());
mplew.writeShort(((Integer) i.right).intValue());
}
}
mplew.write(unk2 == null ? 0 : unk2.size());
if (unk2 != null) {
for (Integer i : unk2) {
mplew.writeShort(i.intValue());
}
}
mplew.writeInt(0);
mplew.writePos(startPos);
mplew.writeInt(0);
PacketHelper.serializeMovementList(mplew, moves);
return mplew.getPacket();
}
// public static byte[] spawnMonster(MapleMonster life, int spawnType, int link) {
// MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
//
// mplew.writeShort(SendPacketOpcode.SPAWN_MONSTER.getValue());
// mplew.writeInt(life.getObjectId());
// mplew.write(1);
// mplew.writeInt(life.getId());
// addMonsterStatus(mplew, life);
// mplew.writePos(life.getTruePosition());
// mplew.write(life.getStance());
// mplew.writeShort(life.getFh());
//
// mplew.writeShort(life.getFh());
// mplew.write(spawnType);
// if ((spawnType == -3) || (spawnType >= 0)) {
// mplew.writeInt(link);
// }
// mplew.write(life.getCarnivalTeam());
// mplew.write(50);
// mplew.writeZeroBytes(20);
// mplew.writeInt(-1);
// mplew.write(life.getCarnivalTeam());
// mplew.writeZeroBytes(12);
// mplew.write(-1);
//mplew.writeZeroBytes(100);
//
// return mplew.getPacket();
// }
//
//
public static byte[] spawnMonster(MapleMonster life, int spawnType, int link) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_MONSTER.getValue());
mplew.write(1); //v143
mplew.writeInt(life.getObjectId());
mplew.write(1); //1 = Control normal, 5 = Control none
mplew.writeInt(life.getId());
mplew.write(0);
mplew.writeZeroBytes(40);
mplew.writeShort(5088);
mplew.writeShort(72);
mplew.writeZeroBytes(3);
mplew.write(136);
mplew.writeLong(0);
short monstergen = (short) (life.getId() / 2); // who knows
mplew.writeShort(monstergen);
mplew.writeLong(0);
mplew.writeShort(monstergen);
mplew.writeLong(0);
mplew.writeShort(monstergen);
mplew.writeLong(0);
mplew.writeShort(monstergen);
mplew.writeZeroBytes(19);
mplew.writePos(life.getTruePosition());
mplew.write(life.getStance());
mplew.writeShort(life.getFh()); // FH
mplew.writeShort(life.getFh()); // Origin FH
mplew.write(-1);
mplew.write(spawnType);
if (spawnType == -3 || spawnType >= 0) {
mplew.writeInt(link);
}
mplew.writeInt(50); // 1.2.183 new
mplew.writeZeroBytes(21);
// mplew.write(life.getCarnivalTeam());
mplew.writeInt(-1);
mplew.writeInt(0); // v140
mplew.writeInt(0);
mplew.writeInt(0);
mplew.write(0);
mplew.write(-1);
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static void addMonsterStatus(MaplePacketLittleEndianWriter mplew, MapleMonster life) {
if (life.getStati().size() <= 1) {
life.addEmpty(); //not done yet lulz ok so we add it now for the lulz
}
mplew.write(0);
// if (life.getChangedStats() != null) {
// mplew.writeInt(life.getChangedStats().hp > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) life.getChangedStats().hp);
// mplew.writeInt(life.getChangedStats().mp);
// mplew.writeInt(life.getChangedStats().exp);
// mplew.writeInt(life.getChangedStats().watk);
// mplew.writeInt(life.getChangedStats().matk);
// mplew.writeInt(life.getChangedStats().PDRate);
// mplew.writeInt(life.getChangedStats().MDRate);
// mplew.writeInt(life.getChangedStats().acc);
// mplew.writeInt(life.getChangedStats().eva);
// mplew.writeInt(life.getChangedStats().pushed);
// mplew.writeInt(life.getChangedStats().level);
// }
// mplew.writeZeroBytes(40);
// mplew.writeShort(5088);
// mplew.writeShort(72);
// mplew.writeZeroBytes(3);
// mplew.write(136);
// for (int i = 0; i < 4; ++i) {
// mplew.writeLong(0);
// mplew.write(HexTool.getByteArrayFromHexString("EF E8"));
// }
// mplew.writeZeroBytes(19);
if (life.getStati().size() <= 1) {
life.addEmpty();
}
mplew.write(0);
mplew.writeZeroBytes(8);
boolean ignore_imm = (life.getStati().containsKey(MonsterStatus.WEAPON_DAMAGE_REFLECT)) || (life.getStati().containsKey(MonsterStatus.MAGIC_DAMAGE_REFLECT));
Collection<MonsterStatusEffect> buffs = life.getStati().values();
getLongMask_NoRef(mplew, buffs, ignore_imm);
for (MonsterStatusEffect buff : buffs) {
if ((buff != null) && (buff.getStati() != MonsterStatus.WEAPON_DAMAGE_REFLECT) && (buff.getStati() != MonsterStatus.MAGIC_DAMAGE_REFLECT) && ((!ignore_imm) || ((buff.getStati() != MonsterStatus.WEAPON_IMMUNITY) && (buff.getStati() != MonsterStatus.MAGIC_IMMUNITY) && (buff.getStati() != MonsterStatus.DAMAGE_IMMUNITY)))) {
if ((buff.getStati() != MonsterStatus.SUMMON) && (buff.getStati() != MonsterStatus.EMPTY_3) && (buff.getStati() != MonsterStatus.EMPTY_6)) {
if ((buff.getStati() == MonsterStatus.EMPTY_1) || (buff.getStati() == MonsterStatus.EMPTY_2) || (buff.getStati() == MonsterStatus.EMPTY_3) || (buff.getStati() == MonsterStatus.EMPTY_4) || (buff.getStati() == MonsterStatus.EMPTY_5)) {
mplew.writeShort(Integer.valueOf((int) System.currentTimeMillis()).shortValue());
mplew.writeShort(0);
} else if (buff.getStati() == MonsterStatus.EMPTY_7) {
mplew.write(0);
} else {
mplew.writeInt(buff.getX().intValue());
}
if (buff.getMobSkill() != null) {
mplew.writeShort(buff.getMobSkill().getSkillId());
mplew.writeShort(buff.getMobSkill().getSkillLevel());
} else if (buff.getSkill() > 0) {
mplew.writeInt(buff.getSkill());
}
}
if (buff.getStati() != MonsterStatus.EMPTY_7) {
mplew.writeShort(buff.getStati() == MonsterStatus.HYPNOTIZE ? 40 : buff.getStati().isEmpty() ? 0 : 1);
if (buff.getStati() == MonsterStatus.EMPTY_3) {
mplew.writeShort(0);
} else if ((buff.getStati() == MonsterStatus.EMPTY_1) || (buff.getStati() == MonsterStatus.EMPTY_4)) {
mplew.writeInt(0);
}
}
}
}
}
public static byte[] controlMonster(MapleMonster life, boolean newSpawn, boolean aggro) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_MONSTER_CONTROL.getValue());
// mplew.write(HexTool.hex("01 FD CF 34 00 01 7F 96 98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 13 48 00 00 00 00 88 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 59 FE 1F 01 04 09 00 09 00 FF FF 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF 30 00 00 00 00 00 00 00 00 FF"));
mplew.write(aggro ? 2 : 1);
mplew.writeInt(life.getObjectId());
mplew.write(1);
mplew.writeInt(life.getId());
mplew.write(0);
mplew.writeZeroBytes(40);
mplew.writeShort(5088);
mplew.writeShort(72);
mplew.writeZeroBytes(3);
mplew.write(136);
mplew.writeLong(0);
short monstergen = (short) (life.getId() / 2); // who knows
mplew.writeShort(monstergen);
mplew.writeLong(0);
mplew.writeShort(monstergen);
mplew.writeLong(0);
mplew.writeShort(monstergen);
mplew.writeLong(0);
mplew.writeShort(monstergen);
mplew.writeZeroBytes(19);
mplew.writePos(life.getTruePosition());
mplew.write(life.getStance());
mplew.writeShort(life.getFh());
mplew.writeShort(life.getFh());
mplew.write(life.isFake() ? -4 : newSpawn ? -2 : -1);
mplew.write(life.getCarnivalTeam());
mplew.writeInt(50); // 1.2.183 new
mplew.writeZeroBytes(21);
// mplew.write(life.getCarnivalTeam());
mplew.writeInt(-1);
mplew.writeInt(0); // v140
mplew.writeInt(0);
mplew.writeInt(0);
mplew.write(0);
mplew.write(-1);
return mplew.getPacket();
}
// public static byte[] controlMonster(MapleMonster life, boolean newSpawn, boolean aggro)
// {
// MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
//
// mplew.writeShort(SendPacketOpcode.SPAWN_MONSTER_CONTROL.getValue());
// // mplew.write(HexTool.hex("01 FD CF 34 00 01 7F 96 98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 13 48 00 00 00 00 88 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 71 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 59 FE 1F 01 04 09 00 09 00 FF FF 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF 30 00 00 00 00 00 00 00 00 FF"));
// mplew.write(aggro ? 2 : 1);
// mplew.writeInt(life.getObjectId());
// mplew.write(1);
// mplew.writeInt(life.getId());
// addMonsterStatus(mplew, life);
//
// mplew.writePos(life.getTruePosition());
// mplew.write(life.getStance());
// mplew.writeShort(life.getFh());
// mplew.writeShort(life.getFh());
// mplew.write(life.isFake() ? -4 : newSpawn ? -2 : -1);
// mplew.write(life.getCarnivalTeam());
// mplew.write(50);
// mplew.writeZeroBytes(20);
// mplew.writeInt(-1);
// mplew.write(life.getCarnivalTeam());
// mplew.writeZeroBytes(12);
// mplew.write(-1);
//
// return mplew.getPacket();
// }
public static byte[] stopControllingMonster(int oid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_MONSTER_CONTROL.getValue());
mplew.write(0);
mplew.writeInt(oid);
return mplew.getPacket();
}
public static byte[] makeMonsterReal(MapleMonster life) {
return spawnMonster(life, -1, 0);
}
public static byte[] makeMonsterFake(MapleMonster life) {
return spawnMonster(life, -4, 0);
}
public static byte[] makeMonsterEffect(MapleMonster life, int effect) {
return spawnMonster(life, effect, 0);
}
public static byte[] moveMonsterResponse(int objectid, short moveid, int currentMp, boolean useSkills, int skillId, int skillLevel) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MOVE_MONSTER_RESPONSE.getValue());
mplew.writeInt(objectid);
mplew.writeShort(moveid);
mplew.write(useSkills ? 1 : 0);
mplew.writeShort(currentMp);
mplew.write(skillId);
mplew.write(skillLevel);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] getMonsterSkill(int objectid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MONSTER_SKILL.getValue());
mplew.writeInt(objectid);
mplew.writeLong(0);
return mplew.getPacket();
}
public static byte[] getMonsterTeleport(int objectid, int x, int y) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.TELE_MONSTER.getValue());
mplew.writeInt(objectid);
mplew.writeInt(x);
mplew.writeInt(y);
return mplew.getPacket();
}
private static void getLongMask_NoRef(MaplePacketLittleEndianWriter mplew, Collection<MonsterStatusEffect> ss, boolean ignore_imm) {
int[] mask = new int[10];
for (MonsterStatusEffect statup : ss) {
if ((statup != null) && (statup.getStati() != MonsterStatus.WEAPON_DAMAGE_REFLECT) && (statup.getStati() != MonsterStatus.MAGIC_DAMAGE_REFLECT) && ((!ignore_imm) || ((statup.getStati() != MonsterStatus.WEAPON_IMMUNITY) && (statup.getStati() != MonsterStatus.MAGIC_IMMUNITY) && (statup.getStati() != MonsterStatus.DAMAGE_IMMUNITY)))) {
mask[(statup.getStati().getPosition() - 1)] |= statup.getStati().getValue();
}
}
for (int i = mask.length; i >= 1; i--) {
mplew.writeInt(mask[(i - 1)]);
}
}
public static byte[] applyMonsterStatus(int oid, MonsterStatus mse, int x, MobSkill skil) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.APPLY_MONSTER_STATUS.getValue());
mplew.writeInt(oid);
PacketHelper.writeSingleMask(mplew, mse);
mplew.writeInt(x);
mplew.writeShort(skil.getSkillId());
mplew.writeShort(skil.getSkillLevel());
mplew.writeShort(mse.isEmpty() ? 1 : 0);
mplew.writeShort(0);
mplew.write(1);
mplew.write(1);
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static byte[] applyMonsterStatus(MapleMonster mons, MonsterStatusEffect ms) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.APPLY_MONSTER_STATUS.getValue());
mplew.writeInt(mons.getObjectId());
PacketHelper.writeSingleMask(mplew, ms.getStati());
mplew.writeInt(ms.getX().intValue());
if (ms.isMonsterSkill()) {
mplew.writeShort(ms.getMobSkill().getSkillId());
mplew.writeShort(ms.getMobSkill().getSkillLevel());
} else if (ms.getSkill() > 0) {
mplew.writeInt(ms.getSkill());
}
mplew.writeShort(ms.getStati().isEmpty() ? 1 : 0);
mplew.writeShort(0);
mplew.write(1);
mplew.write(1);
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static byte[] applyMonsterStatus(MapleMonster mons, List<MonsterStatusEffect> mse) {
if ((mse.size() <= 0) || (mse.get(0) == null)) {
return CWvsContext.enableActions();
}
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.APPLY_MONSTER_STATUS.getValue());
mplew.writeInt(mons.getObjectId());
MonsterStatusEffect ms = (MonsterStatusEffect) mse.get(0);
if (ms.getStati() == MonsterStatus.POISON) {
PacketHelper.writeSingleMask(mplew, MonsterStatus.EMPTY);
mplew.write(mse.size());
for (MonsterStatusEffect m : mse) {
mplew.writeInt(m.getFromID());
if (m.isMonsterSkill()) {
mplew.writeShort(m.getMobSkill().getSkillId());
mplew.writeShort(m.getMobSkill().getSkillLevel());
} else if (m.getSkill() > 0) {
mplew.writeInt(m.getSkill());
}
mplew.writeInt(m.getX().intValue());
mplew.writeInt(1000);
mplew.writeInt(0); //v143 god knows where this goes actually
mplew.writeInt(0);
mplew.writeInt(5);
mplew.writeInt(0);
}
mplew.writeInt(0); //v143 god knows where this goes actually
mplew.writeShort(300);
mplew.write(1);
mplew.write(1);
mplew.writeZeroBytes(100);
} else {
PacketHelper.writeSingleMask(mplew, ms.getStati());
mplew.writeInt(ms.getX().intValue());
if (ms.isMonsterSkill()) {
mplew.writeShort(ms.getMobSkill().getSkillId());
mplew.writeShort(ms.getMobSkill().getSkillLevel());
} else if (ms.getSkill() > 0) {
mplew.writeInt(ms.getSkill());
}
mplew.writeShort(0);
mplew.writeShort(0);
mplew.write(1);
mplew.write(1);
}
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static byte[] applyMonsterStatus(int oid, Map<MonsterStatus, Integer> stati, List<Integer> reflection, MobSkill skil) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.APPLY_MONSTER_STATUS.getValue());
mplew.writeInt(oid);
PacketHelper.writeMask(mplew, stati.keySet());
for (Map.Entry mse : stati.entrySet()) {
mplew.writeInt(((Integer) mse.getValue()).intValue());
mplew.writeShort(skil.getSkillId());
mplew.writeShort(skil.getSkillLevel());
mplew.writeShort(0);
}
for (Integer ref : reflection) {
mplew.writeInt(ref.intValue());
}
mplew.writeLong(0L);
mplew.writeShort(0);
int size = stati.size();
if (reflection.size() > 0) {
size /= 2;
}
mplew.write(size);
mplew.write(1);
mplew.writeZeroBytes(100);
return mplew.getPacket();
}
public static byte[] cancelMonsterStatus(int oid, MonsterStatus stat) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_MONSTER_STATUS.getValue());
mplew.writeInt(oid);
PacketHelper.writeSingleMask(mplew, stat);
mplew.write(1);
mplew.write(2);
return mplew.getPacket();
}
public static byte[] cancelPoison(int oid, MonsterStatusEffect m) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CANCEL_MONSTER_STATUS.getValue());
mplew.writeInt(oid);
PacketHelper.writeSingleMask(mplew, MonsterStatus.EMPTY);
mplew.writeInt(0);
mplew.writeInt(1);
mplew.writeInt(m.getFromID());
if (m.isMonsterSkill()) {
mplew.writeShort(m.getMobSkill().getSkillId());
mplew.writeShort(m.getMobSkill().getSkillLevel());
} else if (m.getSkill() > 0) {
mplew.writeInt(m.getSkill());
}
mplew.write(3);
return mplew.getPacket();
}
public static byte[] talkMonster(int oid, int itemId, String msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.TALK_MONSTER.getValue());
mplew.writeInt(oid);
mplew.writeInt(500);
mplew.writeInt(itemId);
mplew.write(itemId <= 0 ? 0 : 1);
mplew.write((msg == null) || (msg.length() <= 0) ? 0 : 1);
if ((msg != null) && (msg.length() > 0)) {
mplew.writeMapleAsciiString(msg);
}
mplew.writeInt(1);
return mplew.getPacket();
}
public static byte[] removeTalkMonster(int oid) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.REMOVE_TALK_MONSTER.getValue());
mplew.writeInt(oid);
return mplew.getPacket();
}
public static final byte[] getNodeProperties(MapleMonster objectid, MapleMap map) {
if (objectid.getNodePacket() != null) {
return objectid.getNodePacket();
}
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.MONSTER_PROPERTIES.getValue());
mplew.writeInt(objectid.getObjectId());
mplew.writeInt(map.getNodes().size());
mplew.writeInt(objectid.getPosition().x);
mplew.writeInt(objectid.getPosition().y);
for (MapleNodes.MapleNodeInfo mni : map.getNodes()) {
mplew.writeInt(mni.x);
mplew.writeInt(mni.y);
mplew.writeInt(mni.attr);
if (mni.attr == 2) {
mplew.writeInt(500);
}
}
mplew.writeInt(0);
mplew.write(0);
mplew.write(0);
objectid.setNodePacket(mplew.getPacket());
return objectid.getNodePacket();
}
public static byte[] showMagnet(int mobid, boolean success) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SHOW_MAGNET.getValue());
mplew.writeInt(mobid);
mplew.write(success ? 1 : 0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] catchMonster(int mobid, int itemid, byte success) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.CATCH_MONSTER.getValue());
mplew.writeInt(mobid);
mplew.writeInt(itemid);
mplew.write(success);
return mplew.getPacket();
}
}