/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package tools.packet;
import client.MapleCharacter;
import client.status.MonsterStatus;
import handling.SendPacketOpcode;
import java.awt.Point;
import java.util.List;
import handling.channel.handler.AttackInfo;
import server.Randomizer;
import server.ServerProperties;
import server.maps.MapleArrowsTurret;
import server.maps.MapleMapItem;
import server.maps.MapleMapObject;
import server.maps.MechDoor;
import tools.AttackPair;
import tools.DateUtil;
import tools.HexTool;
import tools.Pair;
import tools.data.output.MaplePacketLittleEndianWriter;
/**
* 技能相关的封包都写在这里面
*
* @author 7
*/
public class SkillPacket {
public static byte[] sendEngagementRequest(String name, int chrId) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ENGAGE_REQUEST.getValue());
mplew.write(0);
mplew.writeMapleAsciiString(name);
mplew.writeInt(chrId);
return mplew.getPacket();
}
public static byte[] sendEngagement(byte msg, int item, MapleCharacter male, MapleCharacter female) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ENGAGE_RESULT.getValue());
mplew.write(msg);
switch (msg) {
case 13:
case 14:
case 17:
mplew.writeInt(0);
mplew.writeInt(male.getId());
mplew.writeInt(female.getId());
mplew.writeShort(msg == 14 ? 3 : 1);
mplew.writeInt(item);
mplew.writeInt(item);
mplew.writeAsciiString(male.getName(), 13);
mplew.writeAsciiString(female.getName(), 13);
case 15:
case 16:
}
return mplew.getPacket();
}
public static byte[] teslaTriangle(int chrId, int sum1, int sum2, int sum3) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.TESLA_TRIANGLE.getValue());
mplew.writeInt(chrId);
mplew.writeInt(sum1);
mplew.writeInt(sum2);
mplew.writeInt(sum3);
return mplew.getPacket();
}
public static byte[] mechPortal(Point pos) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MECH_PORTAL.getValue());
mplew.writePos(pos);
return mplew.getPacket();
}
public static byte[] spawnMechDoor(MechDoor md, boolean animated) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MECH_DOOR_SPAWN.getValue());
mplew.write(animated ? 0 : 1);
mplew.writeInt(md.getOwnerId());
mplew.writePos(md.getTruePosition());
mplew.write(md.getId());
mplew.writeInt(md.getPartyId());
return mplew.getPacket();
}
public static byte[] removeMechDoor(MechDoor md, boolean animated) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.MECH_DOOR_REMOVE.getValue());
mplew.write(animated ? 0 : 1);
mplew.writeInt(md.getOwnerId());
mplew.write(md.getId());
return mplew.getPacket();
}
public static byte[] showForce(MapleCharacter chr, int oid, int forceCount, int forceColor) {//恶魔获得精气
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GAIN_FORCE.getValue());
mplew.write(1);
mplew.writeInt(chr.getId());
mplew.writeInt(oid);
mplew.writeInt(0);
mplew.write(1);
mplew.writeInt(forceCount);
mplew.writeInt(forceColor);
mplew.writeInt(Randomizer.rand(36, 39));
mplew.writeInt(Randomizer.rand(5, 6));
mplew.writeInt(Randomizer.rand(33, 64));
mplew.writeZero(12);
mplew.writeInt(DateUtil.getTime(System.currentTimeMillis()));
mplew.writeInt(0);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] updateCardStack(int total) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SHOW_CARTE.getValue());
mplew.write(total);
return mplew.getPacket();
}
public static byte[] gainCardStack(MapleCharacter chr, int oid, int skillId, int forceCount, int color) { //幻影卡片的效果
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GAIN_FORCE.getValue());
mplew.write(0);
mplew.writeInt(chr.getId());
mplew.writeInt(1);//mode
mplew.write(1);
mplew.writeInt(oid);
mplew.writeInt(skillId);
mplew.write(1);
mplew.writeInt(forceCount);
mplew.writeInt(color);
mplew.writeInt(28);
mplew.writeInt(7);
mplew.writeInt(9);
mplew.writeZero(12);
mplew.writeInt(DateUtil.getTime(System.currentTimeMillis()));
mplew.writeInt(0);
mplew.write(0);
return mplew.getPacket();
}
//金钱炸弹封包
public static byte[] MesosBomb(MapleCharacter chr,AttackInfo attack) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CLOSE_RANGE_ATTACK.getValue());
mplew.writeInt(chr.getId());
mplew.write(attack.numAttackedAndDamage);
mplew.write(0x1E);//mode
mplew.writeInt(attack.skillId);
mplew.write(attack.stance);
mplew.write(attack.direction);
mplew.write(0);
mplew.writeInt(0);
for (AttackPair p : attack.allDamage) {
if (p.attack != null) {
mplew.writeInt(p.objectid);
mplew.write(0xFF);
mplew.write(p.attack.size());
for (Pair eachd : p.attack) {
mplew.writeInt((int)eachd.left);
}
}
}
return mplew.getPacket();
}
public static byte[] gainCardStack(MapleCharacter chr, int oid, int skillId, int forceCount, int color, int times) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GAIN_FORCE.getValue());
mplew.write(0);
mplew.writeInt(chr.getId());
mplew.writeInt(color);
mplew.write(1);
mplew.writeInt(0);
//mplew.writeInt(oid);
mplew.writeInt(skillId);
for (int i = 0; i < times; i++) {
mplew.write(1);
mplew.writeInt(forceCount + i);
mplew.writeInt((skillId == 36001005) ? 0 : 2);
mplew.writeInt(Randomizer.rand(15, 20));
mplew.writeInt(Randomizer.rand(20, 30));
mplew.writeInt(skillId == 36001005 || skillId == 24120002 ? Randomizer.rand(120, 150) : 0);
mplew.writeInt(skillId == 24120002 ? 0 : Randomizer.rand(300, 900));
mplew.writeZero(8);
mplew.writeInt(DateUtil.getTime(System.currentTimeMillis()));
mplew.writeInt(0);
}
mplew.write(0);
return mplew.getPacket();
}
public static byte[] gainAssassinStack(int chrId, int oid, int forceCount, boolean isAssassin, List<Integer> moboids, int visProjectile, Point posFrom) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GAIN_FORCE.getValue());
mplew.write(1);
mplew.writeInt(chrId);
mplew.writeInt(oid);
mplew.writeInt(11);
mplew.write(1);
mplew.writeInt(moboids.size());
for (Integer moboid : moboids) {
mplew.writeInt(moboid);
}
mplew.writeInt(isAssassin ? 4100012 : 4120019);
for (int i = 0; i < moboids.size(); i++) {
mplew.write(1);
mplew.writeInt(forceCount + i);
mplew.writeInt(isAssassin ? 1 : 2);
mplew.writeInt(Randomizer.rand(32, 48));
mplew.writeInt(Randomizer.rand(3, 4));
mplew.writeInt(Randomizer.rand(100, 200));
mplew.writeInt(200);
mplew.writeZero(8);
mplew.writeLong(8);
}
mplew.write(0);
mplew.writeInt(posFrom.x - 120);
mplew.writeInt(posFrom.y - 100);
mplew.writeInt(posFrom.x + 120);
mplew.writeInt(posFrom.y + 100);
mplew.writeInt(visProjectile);
return mplew.getPacket();
}
public static byte[] spawnArrowsTurret(MapleArrowsTurret summon) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.SPAWN_ARROWS_TURRET.getValue());
mplew.writeInt(summon.getObjectId());//Object_id 第几个
mplew.writeInt(1);
mplew.writeInt(summon.getOwnerId());
mplew.writeInt(0);
mplew.writeInt(summon.getPosition().x);
mplew.writeInt(summon.getPosition().y);
mplew.write(summon.getSide()); //方向: 01 向右 00 向左
return mplew.getPacket();
}
public static byte[] cancelArrowsTurret(MapleArrowsTurret summon) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_ARROWS_TURRET.getValue());
mplew.writeInt(1);
mplew.writeInt(summon.getObjectId());
return mplew.getPacket();//Object_id 第几个
}
public static byte[] ArrowsTurretAction(MapleArrowsTurret summon) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ARROWS_TURRET_ACTION.getValue());
mplew.writeInt(summon.getObjectId());//Object_id 第几个
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] ArrowsTurretAttack(int id, int mapid, int level, Point cpoint, int side, Point spoint, boolean sp) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.ARROWS_TURRET_ATTACK.getValue());
mplew.writeShort(4);
mplew.writeInt(id);//Object_id 第几个
mplew.writeInt(mapid);
mplew.write(1);
mplew.writeShort(0);
mplew.writeShort(cpoint.x + 25);
mplew.writeShort(cpoint.y - 27);
mplew.writeInt(900);
mplew.writeShort(level);
mplew.writeInt(sp ? 0 : 655370);
mplew.writeInt(sp ? 95001000 : 3121013);
mplew.write(side);//方向
mplew.writeInt(side == 0 ? spoint.x : 0 - spoint.x);
mplew.writeInt(spoint.y);
return mplew.getPacket();
}
public static byte[] ShowQuiverKartrigeEffect(int chrid, int mode, int totle, boolean other) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
if (other) {
mplew.write(SendPacketOpcode.SHOW_FOREIGN_EFFECT.getValue());
mplew.writeInt(chrid);
} else {
mplew.write(SendPacketOpcode.SHOW_SPECIAL_EFFECT.getValue());
}
mplew.write(57);
mplew.writeInt(3101009);
mplew.writeInt(mode - 1);
mplew.writeInt(totle);
return mplew.getPacket();
}
public static byte[] DrainSoul(MapleCharacter chr, int oid, List<Integer> mon, int forceCount, int count, int skillid, int dell, boolean frommon) {//灵魂吸取
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GAIN_FORCE.getValue());
mplew.writeBool(frommon);
mplew.writeInt(chr.getId());
if (frommon) {
mplew.writeInt(oid);
}
mplew.writeInt(frommon ? 4 : 3);//type
mplew.write(1);
if (frommon) {
mplew.writeInt(oid);
} else {
mplew.writeInt(mon.size());
for (int i : mon) {
mplew.writeInt(i);
}
}
mplew.writeInt(skillid);
mplew.write(1);
for (int i = 0; i < (frommon ? 1 : count); i++) {
mplew.writeInt(forceCount + i);
mplew.writeInt(skillid == 31221014 ? 3 : 1);
mplew.writeInt(frommon ? Randomizer.rand(0x20, 0x30) : Randomizer.rand(0x0F, 0x20));
mplew.writeInt(frommon ? Randomizer.rand(3, 4) : Randomizer.rand(0x15, 0x30));
mplew.writeInt(frommon ? Randomizer.rand(0x0, 0xFF) : Randomizer.rand(0x30, 0x50));
mplew.writeInt(dell);
mplew.writeZero(8);
mplew.writeInt(DateUtil.getTime(System.currentTimeMillis()));
mplew.writeInt(0);
mplew.write(frommon ? 0 : (i == count - 1 ? 0 : 1));
}
return mplew.getPacket();
}
public static byte[] FireStep() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.FIRE_STEP.getValue());
mplew.writeInt(6850036);
return mplew.getPacket();
}
public static byte[] ConveyTo() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CONVEY_TO.getValue());
mplew.write(1);
return mplew.getPacket();
}
}