package handling.channel.handler;
import client.MapleCharacter;
import client.MapleCharacterUtil;
import client.MapleClient;
import handling.world.MaplePartyCharacter;
import handling.world.World;
import handling.world.family.MapleFamily;
import handling.world.family.MapleFamilyBuff;
import handling.world.family.MapleFamilyCharacter;
import java.util.List;
import server.maps.FieldLimitType;
import tools.data.LittleEndianAccessor;
import tools.packet.CWvsContext;
public class FamilyHandler {
public static final void RequestFamily(LittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(slea.readMapleAsciiString());
if (chr != null) {
c.getSession().write(CWvsContext.FamilyPacket.getFamilyPedigree(chr));
}
}
public static final void OpenFamily(LittleEndianAccessor slea, MapleClient c) {
c.getSession().write(CWvsContext.FamilyPacket.getFamilyInfo(c.getPlayer()));
}
public static final void UseFamily(LittleEndianAccessor slea, MapleClient c) {
int type = slea.readInt();
if (MapleFamilyBuff.values().length <= type) {
return;
}
MapleFamilyBuff entry = MapleFamilyBuff.values()[type];
boolean success = (c.getPlayer().getFamilyId() > 0) && (c.getPlayer().canUseFamilyBuff(entry)) && (c.getPlayer().getCurrentRep() > entry.rep);
if (!success) {
return;
}
MapleCharacter victim = null;
switch (entry) {
case Teleport:
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(slea.readMapleAsciiString());
if ((FieldLimitType.VipRock.check(c.getPlayer().getMap().getFieldLimit())) || (c.getPlayer().isInBlockedMap())) {
c.getPlayer().dropMessage(5, "Summons failed. Your current location or state does not allow a summons.");
success = false;
} else if ((victim == null) || ((victim.isGM()) && (!c.getPlayer().isGM()))) {
c.getPlayer().dropMessage(1, "Invalid name or you are not on the same channel.");
success = false;
} else if ((victim.getFamilyId() == c.getPlayer().getFamilyId()) && (!FieldLimitType.VipRock.check(victim.getMap().getFieldLimit())) && (victim.getId() != c.getPlayer().getId()) && (!victim.isInBlockedMap())) {
c.getPlayer().changeMap(victim.getMap(), victim.getMap().getPortal(0));
} else {
c.getPlayer().dropMessage(5, "Summons failed. Your current location or state does not allow a summons.");
success = false;
}
break;
case Summon:
victim = c.getChannelServer().getPlayerStorage().getCharacterByName(slea.readMapleAsciiString());
if ((FieldLimitType.VipRock.check(c.getPlayer().getMap().getFieldLimit())) || (c.getPlayer().isInBlockedMap())) {
c.getPlayer().dropMessage(5, "Summons failed. Your current location or state does not allow a summons.");
} else if ((victim == null) || ((victim.isGM()) && (!c.getPlayer().isGM()))) {
c.getPlayer().dropMessage(1, "Invalid name or you are not on the same channel.");
} else if (victim.getTeleportName().length() > 0) {
c.getPlayer().dropMessage(1, "Another character has requested to summon this character. Please try again later.");
} else if ((victim.getFamilyId() == c.getPlayer().getFamilyId()) && (!FieldLimitType.VipRock.check(victim.getMap().getFieldLimit())) && (victim.getId() != c.getPlayer().getId()) && (!victim.isInBlockedMap())) {
victim.getClient().getSession().write(CWvsContext.FamilyPacket.familySummonRequest(c.getPlayer().getName(), c.getPlayer().getMap().getMapName()));
victim.setTeleportName(c.getPlayer().getName());
} else {
c.getPlayer().dropMessage(5, "Summons failed. Your current location or state does not allow a summons.");
}
return;
case Drop_12_15: // drop rate + 50% 15 min
case EXP_12_15: // exp rate + 50% 15 min
case Drop_12_30: // drop rate + 100% 15 min
case EXP_12_30: // exp rate + 100% 15 min
case Drop_15_15:
case Drop_15_30:
entry.applyTo(c.getPlayer());
break;
case Bonding:
MapleFamily fam = World.Family.getFamily(c.getPlayer().getFamilyId());
List<MapleFamilyCharacter> chrs = fam.getMFC(c.getPlayer().getId()).getOnlineJuniors(fam);
if (chrs.size() < 7) {
success = false;
} else {
for (MapleFamilyCharacter chrz : chrs) {
int chr = World.Find.findChannel(chrz.getId());
if (chr != -1) {
MapleCharacter chrr = World.getStorage(chr).getCharacterById(chrz.getId());
entry.applyTo(chrr);
}
}
}
break;
case EXP_Party:
case Drop_Party_12:
case Drop_Party_15:
entry.applyTo(c.getPlayer());
if (c.getPlayer().getParty() != null) {
for (MaplePartyCharacter mpc : c.getPlayer().getParty().getMembers()) {
if (mpc.getId() != c.getPlayer().getId()) {
MapleCharacter chr = c.getPlayer().getMap().getCharacterById(mpc.getId());
if (chr != null) {
entry.applyTo(chr);
}
}
}
}
break;
}
if (success) {
c.getPlayer().setCurrentRep(c.getPlayer().getCurrentRep() - entry.rep);
c.getSession().write(CWvsContext.FamilyPacket.changeRep(-entry.rep, c.getPlayer().getName()));
c.getPlayer().useFamilyBuff(entry);
} else {
c.getPlayer().dropMessage(5, "An error occured.");
}
}
public static final void FamilyOperation(LittleEndianAccessor slea, MapleClient c) {
if (c.getPlayer() == null) {
return;
}
MapleCharacter addChr = c.getChannelServer().getPlayerStorage().getCharacterByName(slea.readMapleAsciiString());
if (addChr == null) {
c.getPlayer().dropMessage(1, "The name you requested is incorrect or he/she is currently not logged in.");
} else if ((addChr.getFamilyId() == c.getPlayer().getFamilyId()) && (addChr.getFamilyId() > 0)) {
c.getPlayer().dropMessage(1, "You belong to the same family.");
} else if (addChr.getMapId() != c.getPlayer().getMapId()) {
c.getPlayer().dropMessage(1, "The one you wish to add as a junior must be in the same map.");
} else if (addChr.getSeniorId() != 0) {
c.getPlayer().dropMessage(1, "The character is already a junior of another character.");
} else if (addChr.getLevel() >= c.getPlayer().getLevel()) {
c.getPlayer().dropMessage(1, "The junior you wish to add must be at a lower rank.");
} else if (addChr.getLevel() < c.getPlayer().getLevel() - 20) {
c.getPlayer().dropMessage(1, "The gap between you and your junior must be within 20 levels.");
} else if (addChr.getLevel() < 10) {
c.getPlayer().dropMessage(1, "The junior you wish to add must be over Level 10.");
} else if ((c.getPlayer().getJunior1() > 0) && (c.getPlayer().getJunior2() > 0)) {
c.getPlayer().dropMessage(1, "You have 2 juniors already.");
} else {
addChr.getClient().getSession().write(CWvsContext.FamilyPacket.sendFamilyInvite(c.getPlayer().getId(), c.getPlayer().getLevel(), c.getPlayer().getJob(), c.getPlayer().getName()));
}
c.getSession().write(CWvsContext.enableActions());
}
public static final void FamilyPrecept(LittleEndianAccessor slea, MapleClient c) {
MapleFamily fam = World.Family.getFamily(c.getPlayer().getFamilyId());
if ((fam == null) || (fam.getLeaderId() != c.getPlayer().getId())) {
return;
}
fam.setNotice(slea.readMapleAsciiString());
}
public static final void FamilySummon(LittleEndianAccessor slea, MapleClient c) {
MapleFamilyBuff cost = MapleFamilyBuff.Summon;
MapleCharacter tt = c.getChannelServer().getPlayerStorage().getCharacterByName(slea.readMapleAsciiString());
if ((c.getPlayer().getFamilyId() > 0) && (tt != null) && (tt.getFamilyId() == c.getPlayer().getFamilyId()) && (!FieldLimitType.VipRock.check(tt.getMap().getFieldLimit())) && (!FieldLimitType.VipRock.check(c.getPlayer().getMap().getFieldLimit())) && (tt.canUseFamilyBuff(cost)) && (c.getPlayer().getTeleportName().equals(tt.getName())) && (tt.getCurrentRep() > cost.rep) && (!c.getPlayer().isInBlockedMap()) && (!tt.isInBlockedMap())) {
boolean accepted = slea.readByte() > 0;
if (accepted) {
c.getPlayer().changeMap(tt.getMap(), tt.getMap().getPortal(0));
tt.setCurrentRep(tt.getCurrentRep() - cost.rep);
tt.getClient().getSession().write(CWvsContext.FamilyPacket.changeRep(-cost.rep, tt.getName()));
tt.useFamilyBuff(cost);
} else {
tt.dropMessage(5, "Summons failed. Your current location or state does not allow a summons.");
}
} else {
c.getPlayer().dropMessage(5, "Summons failed. Your current location or state does not allow a summons.");
}
c.getPlayer().setTeleportName("");
}
public static final void DeleteJunior(LittleEndianAccessor slea, MapleClient c) {
int juniorid = slea.readInt();
if ((c.getPlayer().getFamilyId() <= 0) || (juniorid <= 0) || ((c.getPlayer().getJunior1() != juniorid) && (c.getPlayer().getJunior2() != juniorid))) {
return;
}
MapleFamily fam = World.Family.getFamily(c.getPlayer().getFamilyId());
MapleFamilyCharacter other = fam.getMFC(juniorid);
if (other == null) {
return;
}
MapleFamilyCharacter oth = c.getPlayer().getMFC();
boolean junior2 = oth.getJunior2() == juniorid;
if (junior2) {
oth.setJunior2(0);
} else {
oth.setJunior1(0);
}
c.getPlayer().saveFamilyStatus();
other.setSeniorId(0);
MapleFamily.setOfflineFamilyStatus(other.getFamilyId(), other.getSeniorId(), other.getJunior1(), other.getJunior2(), other.getCurrentRep(), other.getTotalRep(), other.getId());
MapleCharacterUtil.sendNote(other.getName(), c.getPlayer().getName(), c.getPlayer().getName() + " has requested to sever ties with you, so the family relationship has ended.", 0);
if (!fam.splitFamily(juniorid, other)) {
if (!junior2) {
fam.resetDescendants();
}
fam.resetPedigree();
}
c.getPlayer().dropMessage(1, "Broke up with (" + other.getName() + ").\r\nFamily relationship has ended.");
c.getSession().write(CWvsContext.enableActions());
}
public static final void DeleteSenior(LittleEndianAccessor slea, MapleClient c) {
if ((c.getPlayer().getFamilyId() <= 0) || (c.getPlayer().getSeniorId() <= 0)) {
return;
}
MapleFamily fam = World.Family.getFamily(c.getPlayer().getFamilyId());
MapleFamilyCharacter mgc = fam.getMFC(c.getPlayer().getSeniorId());
MapleFamilyCharacter mgc_ = c.getPlayer().getMFC();
mgc_.setSeniorId(0);
boolean junior2 = mgc.getJunior2() == c.getPlayer().getId();
if (junior2) {
mgc.setJunior2(0);
} else {
mgc.setJunior1(0);
}
MapleFamily.setOfflineFamilyStatus(mgc.getFamilyId(), mgc.getSeniorId(), mgc.getJunior1(), mgc.getJunior2(), mgc.getCurrentRep(), mgc.getTotalRep(), mgc.getId());
c.getPlayer().saveFamilyStatus();
MapleCharacterUtil.sendNote(mgc.getName(), c.getPlayer().getName(), c.getPlayer().getName() + " has requested to sever ties with you, so the family relationship has ended.", 0);
if (!fam.splitFamily(c.getPlayer().getId(), mgc_)) {
if (!junior2) {
fam.resetDescendants();
}
fam.resetPedigree();
}
c.getPlayer().dropMessage(1, "Broke up with (" + mgc.getName() + ").\r\nFamily relationship has ended.");
c.getSession().write(CWvsContext.enableActions());
}
public static final void AcceptFamily(LittleEndianAccessor slea, MapleClient c) {
MapleCharacter inviter = c.getPlayer().getMap().getCharacterById(slea.readInt());
if ((inviter != null) && (c.getPlayer().getSeniorId() == 0) && (inviter.getLevel() - 20 <= c.getPlayer().getLevel()) && (inviter.getLevel() >= 10) && (inviter.getName().equals(slea.readMapleAsciiString())) && (inviter.getNoJuniors() < 2) && (c.getPlayer().getLevel() >= 10)) {
boolean accepted = slea.readByte() > 0;
inviter.getClient().getSession().write(CWvsContext.FamilyPacket.sendFamilyJoinResponse(accepted, c.getPlayer().getName()));
if (accepted) {
c.getSession().write(CWvsContext.FamilyPacket.getSeniorMessage(inviter.getName()));
int old = c.getPlayer().getMFC() == null ? 0 : c.getPlayer().getMFC().getFamilyId();
int oldj1 = c.getPlayer().getMFC() == null ? 0 : c.getPlayer().getMFC().getJunior1();
int oldj2 = c.getPlayer().getMFC() == null ? 0 : c.getPlayer().getMFC().getJunior2();
if ((inviter.getFamilyId() > 0) && (World.Family.getFamily(inviter.getFamilyId()) != null)) {
MapleFamily fam = World.Family.getFamily(inviter.getFamilyId());
c.getPlayer().setFamily(old <= 0 ? inviter.getFamilyId() : old, inviter.getId(), oldj1 <= 0 ? 0 : oldj1, oldj2 <= 0 ? 0 : oldj2);
MapleFamilyCharacter mf = inviter.getMFC();
if (mf.getJunior1() > 0) {
mf.setJunior2(c.getPlayer().getId());
} else {
mf.setJunior1(c.getPlayer().getId());
}
inviter.saveFamilyStatus();
if ((old > 0) && (World.Family.getFamily(old) != null)) {
MapleFamily.mergeFamily(fam, World.Family.getFamily(old));
} else {
c.getPlayer().setFamily(inviter.getFamilyId(), inviter.getId(), oldj1 <= 0 ? 0 : oldj1, oldj2 <= 0 ? 0 : oldj2);
fam.setOnline(c.getPlayer().getId(), true, c.getChannel());
c.getPlayer().saveFamilyStatus();
}
if (fam != null) {
if ((inviter.getNoJuniors() == 1) || (old > 0)) {
fam.resetDescendants();
}
fam.resetPedigree();
}
} else {
int id = MapleFamily.createFamily(inviter.getId());
if (id > 0) {
MapleFamily.setOfflineFamilyStatus(id, 0, c.getPlayer().getId(), 0, inviter.getCurrentRep(), inviter.getTotalRep(), inviter.getId());
MapleFamily.setOfflineFamilyStatus(id, inviter.getId(), oldj1 <= 0 ? 0 : oldj1, oldj2 <= 0 ? 0 : oldj2, c.getPlayer().getCurrentRep(), c.getPlayer().getTotalRep(), c.getPlayer().getId());
inviter.setFamily(id, 0, c.getPlayer().getId(), 0);
c.getPlayer().setFamily(id, inviter.getId(), oldj1 <= 0 ? 0 : oldj1, oldj2 <= 0 ? 0 : oldj2);
MapleFamily fam = World.Family.getFamily(id);
fam.setOnline(inviter.getId(), true, inviter.getClient().getChannel());
if ((old > 0) && (World.Family.getFamily(old) != null)) {
MapleFamily.mergeFamily(fam, World.Family.getFamily(old));
} else {
fam.setOnline(c.getPlayer().getId(), true, c.getChannel());
}
fam.resetDescendants();
fam.resetPedigree();
}
}
c.getSession().write(CWvsContext.FamilyPacket.getFamilyInfo(c.getPlayer()));
}
}
}
}