package tools.packet;
import client.MapleBuffStat;
import client.MapleCharacter;
import client.MapleDisease;
import client.SpecialBuffInfo;
import constants.GameConstants;
import handling.SendPacketOpcode;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import server.MapleStatEffect;
import server.ServerProperties;
import tools.DateUtil;
import tools.HexTool;
import tools.Pair;
import tools.data.output.MaplePacketLittleEndianWriter;
public class BuffPacket {
private static final Logger log = Logger.getLogger(BuffPacket.class);
public static byte[] giveDice(int buffid, int skillid, int duration, List<Pair<MapleBuffStat, Integer>> statups, MapleCharacter chr) {
int value = 0;
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeBuffMask(mplew, statups);
int dice = buffid >= 100 ? buffid / 100 : buffid;
mplew.writeShort(dice);
mplew.writeInt(skillid);
mplew.writeInt(duration);
mplew.writeZero(5);
mplew.writeInt(GameConstants.getDiceStat(dice, 3));
mplew.writeInt(GameConstants.getDiceStat(dice, 3));
mplew.writeInt(GameConstants.getDiceStat(dice, 4));
mplew.writeZero(20);
mplew.writeInt(GameConstants.getDiceStat(dice, 2));
mplew.writeZero(12);
mplew.writeInt(GameConstants.getDiceStat(dice, 5));
mplew.writeZero(16);
mplew.writeInt(GameConstants.getDiceStat(dice, 6));
mplew.writeZero(16);
mplew.writeInt(value);
mplew.writeInt(1000);
mplew.write(1);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] showMonsterRiding(int chrId, List<Pair<MapleBuffStat, Integer>> statups, int itemId, int skillId) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
PacketHelper.writeBuffMask(mplew, statups);
mplew.writeZero(16);
mplew.writeZero(7);
mplew.writeInt(itemId);
mplew.writeInt(skillId);
mplew.writeZero(7);
return mplew.getPacket();
}
public static byte[] givePirateBuff(List<Pair<MapleBuffStat, Integer>> statups, int duration, int skillid, MapleCharacter chr) {
boolean infusion = (skillid == 5121009) || (skillid == 15121005) || (skillid % 10000 == 8006);
int value = 0;
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeBuffMask(mplew, statups);
mplew.writeZero(5);
mplew.writeInt(value);
for (Pair stat : statups) {
mplew.writeInt(((Integer) stat.getRight()));
mplew.writeLong(skillid);
mplew.writeZero(infusion ? 6 : 1);
mplew.writeShort(duration);
}
mplew.writeInt(infusion ? 600 : 0);
mplew.write(1);
if (!infusion) {
mplew.write(4);
}
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] giveForeignDash(List<Pair<MapleBuffStat, Integer>> statups, int duration, int chrId, int skillid) {
boolean infusion = (skillid == 5121009) || (skillid == 15121005) || (skillid % 10000 == 8006);
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
PacketHelper.writeBuffMask(mplew, statups);
if (!infusion) {
mplew.writeZero(16);
}
mplew.writeZero(7);
for (Pair stat : statups) {
mplew.writeInt(((Integer) stat.getRight()));
mplew.writeLong(skillid);
mplew.writeZero(infusion ? 6 : 1);
mplew.writeShort(duration);
}
mplew.writeShort(0);
return mplew.getPacket();
}
public static byte[] give无敌(int skillId, int duration) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
mplew.writeShort(1);
mplew.writeInt(skillId);
mplew.writeInt(duration);
mplew.writeZero(18);
return mplew.getPacket();
}
public static byte[] give神秘瞄准术(int x, int skillId, int duration) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
mplew.writeShort(x);
mplew.writeInt(skillId);
mplew.writeInt(duration);
mplew.writeZero(18);
return mplew.getPacket();
}
public static byte[] giveEnergyCharge(int bar, int buffId, boolean fullbar, boolean consume) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
mplew.writeZero(5);
mplew.writeInt((fullbar) || ((consume) && (bar > 0)) ? buffId : 0);
mplew.writeInt(Math.min(bar, 10000));
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeZero(6);
mplew.write(1);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] showEnergyCharge(int chrId, int bar, int buffId, boolean fullbar, boolean consume) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
mplew.writeZero(19);
mplew.writeInt((fullbar) || ((consume) && (bar > 0)) ? buffId : 0);
mplew.writeInt(Math.min(bar, 10000));
mplew.writeZero(11);
return mplew.getPacket();
}
public static byte[] updateLuminousGauge(MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.LUMINOUS_COMBO.getValue());
mplew.writeInt(chr.getDarkTotal());
mplew.writeInt(chr.getLightTotal());
mplew.writeInt(chr.getDarkType());
mplew.writeInt(chr.getLightType());
mplew.write(new byte[]{79, 23, -106, -113});
return mplew.getPacket();
}
public static byte[] startPower(boolean start, int time) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
mplew.writeInt(start ? 1 : 0);
mplew.writeInt(7200);
mplew.writeInt(6);
mplew.writeInt(time);
mplew.writeZero(18);
return mplew.getPacket();
}
public static byte[] showstartPower(int chrId, boolean start) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(start ? 1 : 0);
mplew.writeInt(7200);
mplew.writeInt(6);
mplew.writeInt(0);
mplew.writeZero(18);
return mplew.getPacket();
}
public static byte[] updatePowerCount(int skillId, int count) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
mplew.writeShort(count);
mplew.writeInt(skillId);
mplew.writeInt(2100000000);
mplew.writeZero(18);
return mplew.getPacket();
}
public static byte[] 取消守护模式变更() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_BUFF.getValue());
Map<MapleBuffStat, Integer> statups = new EnumMap<>(MapleBuffStat.class);
PacketHelper.writeBuffMask(mplew, statups);
return mplew.getPacket();
}
public static byte[] 灵魂助力特殊(int time, boolean isScream, boolean isControl) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, MapleBuffStat.灵魂助力);
mplew.writeShort(1);
mplew.writeInt(1301013);
mplew.writeInt(time);
mplew.writeInt(0);
mplew.write(9);//???
mplew.writeInt(isControl ? 1311013 : 1301013);
mplew.writeInt(isScream ? 1311014 : 0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.write(1);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] giveBuff(int buffid, int duration, List<Pair<MapleBuffStat, Integer>> statups) {
//TODO giveBuff 需要整理
// 1A
// 02 00 00 00
// 00 00
// 2B 46 0F 00
// E0 93
// 00 00
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeBuffMask(mplew, statups);
for (Pair<MapleBuffStat, Integer> statup : statups) {
mplew.writeShort(statup.getRight().shortValue());
mplew.writeInt(buffid); // 技能ID
mplew.writeShort(duration); // 持续时间
}
mplew.writeShort(0);
//int mask = 0x40020180;
//if (( mask & 0x40020180) == 1){
mplew.write(0);
//}
return mplew.getPacket();
}
public static byte[] giveDebuff(MapleDisease statups, int x, int skillid, int level, int duration) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, statups);
mplew.writeShort(x);
mplew.writeShort(skillid);
mplew.writeShort(level);
mplew.writeInt(duration);
mplew.writeZero(5);
mplew.writeZero(30);
return mplew.getPacket();
}
public static byte[] giveForeignDebuff(int chrId, MapleDisease statups, int skillid, int level, int x) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
PacketHelper.writeSingleMask(mplew, statups);
if (skillid == 125) {
mplew.writeShort(0);
mplew.write(0);
}
mplew.writeShort(x);
mplew.writeShort(skillid);
mplew.writeShort(level);
mplew.writeZero(3);
mplew.writeZero(16);
mplew.writeZero(4);
mplew.writeShort(900);
return mplew.getPacket();
}
public static byte[] cancelForeignDebuff(int chrId, MapleDisease mask) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
PacketHelper.writeSingleMask(mplew, mask);
//mplew.write(3);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] cancelForeignBuff(int chrId, List<MapleBuffStat> statups) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
PacketHelper.writeMask(mplew, statups);
//mplew.write(3);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] cancelForeignBuff(int chrId, MapleBuffStat buffstat) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
PacketHelper.writeSingleMask(mplew, buffstat);
//mplew.write(3);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] giveForeignBuff(int chrId, List<Pair<MapleBuffStat, Integer>> statups, MapleStatEffect effect) {//TODO 给其他玩家BUFF 效果
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.GIVE_FOREIGN_BUFF.getValue());
mplew.writeInt(chrId);
PacketHelper.writeBuffMask(mplew, statups);
for (Pair statup : statups) {
if (isNeedValue(statup)) {
mplew.writeShort(((Integer) statup.getRight()).shortValue());
mplew.writeInt(effect.isSkill() ? effect.getSourceId() : -effect.getSourceId());
} else {
mplew.writeShort(((Integer) statup.getRight()).shortValue());
}
}
mplew.writeZero(23);
mplew.writeShort(0);
//mplew.write(1);
return mplew.getPacket();
}
public static boolean isNeedValue(Pair<MapleBuffStat, Integer> statup) {
return statup.getLeft() == MapleBuffStat.影分身
|| statup.getLeft() == MapleBuffStat.GIANT_POTION
|| statup.getLeft() == MapleBuffStat.属性攻击
;
}
public static byte[] cancelBuff(List<MapleBuffStat> statups, MapleCharacter chr) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_BUFF.getValue());
PacketHelper.writeMask(mplew, statups);
for (MapleBuffStat mask : statups) {
if (mask == MapleBuffStat.骑兽技能) {
continue;
}
List<SpecialBuffInfo> buffs = chr.getSpecialBuffInfo(mask);
mplew.writeInt(buffs.size());
for (SpecialBuffInfo info : buffs) {
mplew.writeInt(info.buffid);
mplew.writeLong(info.value);
mplew.writeInt(0);
mplew.writeInt(info.bufflength);
}
}
if (statups.contains(MapleBuffStat.骑兽技能)) {
mplew.write(3);
mplew.write(1);
} else if ((statups.contains(MapleBuffStat.移动速度)) || (statups.contains(MapleBuffStat.跳跃力))) {
mplew.write(3);
}else if (statups.contains(MapleBuffStat.暴击概率增加)) {
mplew.writeInt(0);
}
return mplew.getPacket();
}
public static byte[] cancelBuff(MapleBuffStat buffstat) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, buffstat);
mplew.writeInt(0);
return mplew.getPacket();
}
public static byte[] cancelDebuff(MapleDisease mask) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.write(SendPacketOpcode.CANCEL_BUFF.getValue());
PacketHelper.writeSingleMask(mplew, mask);
mplew.write(3);
mplew.write(0);
mplew.write(1);
return mplew.getPacket();
}
}