package tools.packet;
import client.MapleCharacter;
import handling.SendPacketOpcode;
import java.awt.Point;
import java.util.List;
import org.apache.log4j.Logger;
import server.ServerProperties;
import server.maps.MapleSummon;
import server.movement.LifeMovementFragment;
import tools.AttackPair;
import tools.Pair;
import tools.data.output.MaplePacketLittleEndianWriter;
public class SummonPacket {
private static final Logger log = Logger.getLogger(SummonPacket.class);
/**
* 召唤召唤兽
* @param summon
* @param animated
* @return
*/
public static byte[] spawnSummon(MapleSummon summon, boolean animated) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SPAWN_SUMMON.getValue());
mplew.writeInt(summon.getOwnerId());
mplew.writeInt(summon.getSkillId());
mplew.write(summon.getSkillLevel());
mplew.writePos(summon.getPosition());
mplew.write(0); // ?
mplew.writeShort(0);
mplew.write(summon.getMovementType().getValue());
mplew.write(animated ? 1 : 0);
return mplew.getPacket();
}
/**
* 移除召唤兽
* @param summon
* @param animated
* @return
*/
public static byte[] removeSummon(MapleSummon summon, boolean animated) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.REMOVE_SUMMON.getValue());
mplew.writeInt(summon.getOwnerId());
mplew.writeInt(summon.getSkillId());
mplew.write(animated ? 4 : summon.getRemoveStatus());
return mplew.getPacket();
}
/**
* 移除召唤兽
* @param chrId
* @param skillID
* @param startPos
* @param moves
* @return
*/
public static byte[] moveSummon(int chrId, int skillID, Point startPos, List<LifeMovementFragment> moves) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MOVE_SUMMON.getValue());
mplew.writeInt(chrId);
mplew.writeInt(skillID);
PacketHelper.serializeMovementList(mplew, moves);
mplew.writeInt(0);
mplew.writeInt(0);
return mplew.getPacket();
}
/**
* 召唤兽攻击
* @param chrId
* @param summonSkillId
* @param animation
* @param numAttackedAndDamage
* @param allDamage
* @param level
* @param darkFlare
* @return
*/
public static byte[] summonAttack(int chrId, int summonSkillId, byte animation, byte numAttackedAndDamage, List<AttackPair> allDamage, int level, boolean darkFlare) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SUMMON_ATTACK.getValue());
mplew.writeInt(chrId);
mplew.writeInt(summonSkillId);
mplew.write(animation);
mplew.write(numAttackedAndDamage);
for (AttackPair attackEntry : allDamage) {
if (attackEntry.attack != null) {
mplew.writeInt(attackEntry.objectid);
mplew.write(6);
for (Pair eachd : attackEntry.attack) {
if (((Boolean) eachd.right)) {
mplew.writeInt(((Integer) eachd.left) + -2147483648);
} else {
mplew.writeInt(((Integer) eachd.left));
}
}
}
}
mplew.writeLong(0);
return mplew.getPacket();
}
public static byte[] summonSkill(int chrId, int summonSkillId, int newStance) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SUMMON_SKILL.getValue());
mplew.writeInt(chrId);
mplew.writeInt(summonSkillId);
mplew.write(newStance);
return mplew.getPacket();
}
/**
* 召唤兽受到伤害
* @param chrId
* @param summonSkillId
* @param damage
* @param unkByte
* @param monsterIdFrom
* @return
*/
public static byte[] damageSummon(int chrId, int summonSkillId, int damage, int unkByte, int monsterIdFrom) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.DAMAGE_SUMMON.getValue());
mplew.writeInt(chrId);
mplew.writeInt(summonSkillId);
mplew.write(unkByte);
mplew.writeInt(monsterIdFrom);
mplew.writeInt(damage);
mplew.write(0);
return mplew.getPacket();
}
}