package handling.channel.handler;
import clientside.MapleCharacter;
import clientside.MapleClient;
import clientside.MapleStat;
import clientside.PlayerStats;
import clientside.Skill;
import clientside.SkillFactory;
import constants.GameConstants;
import java.util.EnumMap;
import java.util.Map;
import server.Randomizer;
import tools.Pair;
import tools.data.LittleEndianAccessor;
import tools.packet.CWvsContext;
public class StatsHandling {
public static void DistributeAP(final LittleEndianAccessor slea, final MapleClient c, final MapleCharacter chr) {
Map<MapleStat, Long> statupdate = new EnumMap<>(MapleStat.class);
c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr));
// chr.updateTick(slea.readInt());
final int statmask = slea.readInt();
final PlayerStats stat = chr.getStat();
final int job = chr.getJob();
if (chr.getRemainingAp() > 0) {
switch (statmask) {
case 0x40: // Str
if (stat.getStr() >= 1500) {
return;
}
stat.setStr((short) (stat.getStr() + 1), chr);
statupdate.put(MapleStat.STR, (long) stat.getStr());
break;
case 0x80: // Dex
if (stat.getDex() >= 1500) {
return;
}
stat.setDex((short) (stat.getDex() + 1), chr);
statupdate.put(MapleStat.DEX, (long) stat.getDex());
break;
case 0x100: // Int
if (stat.getInt() >= 1500) {
return;
}
stat.setInt((short) (stat.getInt() + 1), chr);
statupdate.put(MapleStat.INT, (long) stat.getInt());
break;
case 0x200: // Luk
if (stat.getLuk() >= 1500) {
return;
}
stat.setLuk((short) (stat.getLuk() + 1), chr);
statupdate.put(MapleStat.LUK, (long) stat.getLuk());
break;
case 0x400: // HP
int maxhp = stat.getMaxHp();
if (chr.getHpApUsed() >= 10000 || maxhp >= 500000) {
return;
}
if (GameConstants.isBeginnerJob(job)) { // Beginner
maxhp += Randomizer.rand(8, 12);
} else if ((job >= 100 && job <= 132) || (job >= 3200 && job <= 3212) || (job >= 1100 && job <= 1112) || (job >= 3100 && job <= 3112)) { // Warrior
maxhp += Randomizer.rand(36, 42);
} else if ((job >= 200 && job <= 232) || (GameConstants.isEvan(job))) { // Magician
maxhp += Randomizer.rand(10, 20);
} else if ((job >= 300 && job <= 322) || (job >= 400 && job <= 434) || (job >= 1300 && job <= 1312) || (job >= 1400 && job <= 1412) || (job >= 3300 && job <= 3312) || (job >= 2300 && job <= 2312)) { // Bowman
maxhp += Randomizer.rand(16, 20);
} else if ((job >= 510 && job <= 512) || (job >= 1510 && job <= 1512)) {
maxhp += Randomizer.rand(28, 32);
} else if ((job >= 500 && job <= 532) || (job >= 3500 && job <= 3512) || job == 1500) { // Pirate
maxhp += Randomizer.rand(18, 22);
} else if (job >= 1200 && job <= 1212) { // Flame Wizard
maxhp += Randomizer.rand(15, 21);
} else if (job >= 2000 && job <= 2112) { // Aran
maxhp += Randomizer.rand(38, 42);
} else { // GameMaster
maxhp += Randomizer.rand(50, 100);
}
maxhp = Math.min(500000, Math.abs(maxhp));
chr.setHpApUsed((short) (chr.getHpApUsed() + 1));
stat.setMaxHp(maxhp, chr);
statupdate.put(MapleStat.MAXHP, (long) maxhp);
break;
case 0x800: // MP
int maxmp = stat.getMaxMp();
if (chr.getHpApUsed() >= 10000 || stat.getMaxMp() >= 500000) {
return;
}
if (GameConstants.isBeginnerJob(job)) { // Beginner
maxmp += Randomizer.rand(6, 8);
} else if (GameConstants.isDemon(job) || GameConstants.angelic(job) || GameConstants.demonAvenger(job)) { // Demon, Angelic Buster
return;
} else if ((job >= 200 && job <= 232) || (GameConstants.isEvan(job)) || (job >= 3200 && job <= 3212) || (job >= 1200 && job <= 1212)) { // Magician
maxmp += Randomizer.rand(38, 40);
} else if ((job >= 300 && job <= 322) || (job >= 400 && job <= 434) || (job >= 500 && job <= 532) || (job >= 3200 && job <= 3212) || (job >= 3500 && job <= 3512) || (job >= 1300 && job <= 1312) || (job >= 1400 && job <= 1412) || (job >= 1500 && job <= 1512) || (job >= 2300 && job <= 2312)) { // Bowman
maxmp += Randomizer.rand(10, 12);
} else if ((job >= 100 && job <= 132) || (job >= 1100 && job <= 1112) || (job >= 2000 && job <= 2112)) { // Soul Master
maxmp += Randomizer.rand(6, 9);
} else { // GameMaster
maxmp += Randomizer.rand(50, 100);
}
maxmp = Math.min(500000, Math.abs(maxmp));
chr.setHpApUsed((short) (chr.getHpApUsed() + 1));
stat.setMaxMp(maxmp, chr);
statupdate.put(MapleStat.MAXMP, (long) maxmp);
break;
default:
c.getSession().write(CWvsContext.enableActions());
return;
}
chr.setRemainingAp((short) (chr.getRemainingAp() - 1));
statupdate.put(MapleStat.AVAILABLEAP, (long) chr.getRemainingAp());
c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr));
}
}
public static void DistributeSP(int skillid, byte quantity, MapleClient c, MapleCharacter chr) {
c.getPlayer().maxSkillsByJob();
c.getPlayer().maxRiding();
c.getPlayer().maxDA();
c.getPlayer().dropMessage(1, "Skills maxed!");
c.getSession().write(CWvsContext.enableActions());
}
/* public static void DistributeSP(int skillid, byte quantity, MapleClient c, MapleCharacter chr) {
boolean isBeginnerSkill = false;
if ((quantity <= 0) || (quantity > 30))
return;
int remainingSp;
if ((GameConstants.isBeginnerJob(skillid / 10000)) && ((skillid % 10000 == 1000) || (skillid % 10000 == 1001) || (skillid % 10000 == 1002) || (skillid % 10000 == 2))) {
boolean resistance = (skillid / 10000 == 3000) || (skillid / 10000 == 3001);
int snailsLevel = chr.getSkillLevel(SkillFactory.getSkill(skillid / 10000 * 10000 + 1000));
int recoveryLevel = chr.getSkillLevel(SkillFactory.getSkill(skillid / 10000 * 10000 + 1001));
int nimbleFeetLevel = chr.getSkillLevel(SkillFactory.getSkill(skillid / 10000 * 10000 + (resistance ? 2 : 1002)));
remainingSp = Math.min(chr.getLevel() - 1, resistance ? 9 : 6) - snailsLevel - recoveryLevel - nimbleFeetLevel;
isBeginnerSkill = true; } else {
if (GameConstants.isBeginnerJob(skillid / 10000)) {
return;
}
remainingSp = chr.getRemainingSp(GameConstants.getSkillBookForSkill(skillid));
}
Skill skill = SkillFactory.getSkill(skillid);
for (Pair ski : skill.getRequiredSkills()) {
if (chr.getSkillLevel(SkillFactory.getSkill(((Integer)ski.left).intValue())) < ((Byte)ski.right).byteValue())
{
return;
}
}
int maxlevel = skill.isFourthJob() ? chr.getMasterLevel(skill) : skill.getMaxLevel();
int curLevel = chr.getSkillLevel(skill);
if ((skill.isInvisible()) && (chr.getSkillLevel(skill) == 0) && (
((skill.isFourthJob()) && (chr.getMasterLevel(skill) == 0)) || ((!skill.isFourthJob()) && (maxlevel < 10) && (!isBeginnerSkill) && (chr.getMasterLevel(skill) <= 0)))) {
c.getSession().write(CWvsContext.enableActions());
return;
}
for (int i : GameConstants.blockedSkills) {
if (skill.getId() == i) {
c.getSession().write(CWvsContext.enableActions());
chr.dropMessage(1, "This skill has been blocked and may not be added.");
return;
}
}
if ((remainingSp >= quantity) && (curLevel + quantity <= maxlevel) && (skill.canBeLearnedBy(chr.getJob()))) {
if (!isBeginnerSkill) {
int skillbook = GameConstants.getSkillBookForSkill(skillid);
chr.setRemainingSp(chr.getRemainingSp(skillbook) - quantity, skillbook);
}
chr.updateSingleStat(MapleStat.AVAILABLESP, 0L);
chr.changeSingleSkillLevel(skill, (byte)(curLevel + quantity), chr.getMasterLevel(skill));
}
else
{
c.getSession().write(CWvsContext.enableActions());
}
}*/
public static final void AutoAssignAP(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) {
// chr.updateTick(slea.readInt());
slea.skip(4);
if (slea.available() < 16L) {
return;
}
int PrimaryStat = GameConstants.GMS ? (int) slea.readLong() : slea.readInt();
int amount = slea.readInt();
int SecondaryStat = GameConstants.GMS ? (int) slea.readLong() : slea.readInt();
int amount2 = slea.readInt();
if ((amount < 0) || (amount2 < 0)) {
return;
}
PlayerStats playerst = chr.getStat();
Map statupdate = new EnumMap(MapleStat.class);
c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr));
if (chr.getRemainingAp() == amount + amount2) {
switch (PrimaryStat) {
case 64:
if (playerst.getStr() + amount > 1500) {
return;
}
playerst.setStr((short) (playerst.getStr() + amount), chr);
statupdate.put(MapleStat.STR, Long.valueOf(playerst.getStr()));
break;
case 128:
if (playerst.getDex() + amount > 1500) {
return;
}
playerst.setDex((short) (playerst.getDex() + amount), chr);
statupdate.put(MapleStat.DEX, Long.valueOf(playerst.getDex()));
break;
case 256:
if (playerst.getInt() + amount > 1500) {
return;
}
playerst.setInt((short) (playerst.getInt() + amount), chr);
statupdate.put(MapleStat.INT, Long.valueOf(playerst.getInt()));
break;
case 512:
if (playerst.getLuk() + amount > 1500) {
return;
}
playerst.setLuk((short) (playerst.getLuk() + amount), chr);
statupdate.put(MapleStat.LUK, Long.valueOf(playerst.getLuk()));
break;
default:
c.getSession().write(CWvsContext.enableActions());
return;
}
switch (SecondaryStat) {
case 64:
if (playerst.getStr() + amount2 > 1500) {
return;
}
playerst.setStr((short) (playerst.getStr() + amount2), chr);
statupdate.put(MapleStat.STR, Long.valueOf(playerst.getStr()));
break;
case 128:
if (playerst.getDex() + amount2 > 1500) {
return;
}
playerst.setDex((short) (playerst.getDex() + amount2), chr);
statupdate.put(MapleStat.DEX, Long.valueOf(playerst.getDex()));
break;
case 256:
if (playerst.getInt() + amount2 > 1500) {
return;
}
playerst.setInt((short) (playerst.getInt() + amount2), chr);
statupdate.put(MapleStat.INT, Long.valueOf(playerst.getInt()));
break;
case 512:
if (playerst.getLuk() + amount2 > 1500) {
return;
}
playerst.setLuk((short) (playerst.getLuk() + amount2), chr);
statupdate.put(MapleStat.LUK, Long.valueOf(playerst.getLuk()));
break;
default:
c.getSession().write(CWvsContext.enableActions());
return;
}
chr.setRemainingAp((short) (chr.getRemainingAp() - (amount + amount2)));
statupdate.put(MapleStat.AVAILABLEAP, Long.valueOf(chr.getRemainingAp()));
c.getSession().write(CWvsContext.updatePlayerStats(statupdate, true, chr));
}
}
}