public static final void CharlistRequest(LittleEndianAccessor slea, MapleClient c) { if (!c.isLoggedIn()) { c.getSession().close(true); return; } if (GameConstants.GMS) { slea.readByte(); } int server = slea.readByte(); int channel = slea.readByte() + 1; if ((!World.isChannelAvailable(channel)) || (server != 0)) { c.getSession().write(LoginPacket.getLoginFailed(10)); return; } List chars = c.loadCharacters(server); if ((chars != null) && (ChannelServer.getInstance(channel) != null)) { c.setWorld(server); c.setChannel(channel); c.getSession() .write(LoginPacket.getCharList(c.getSecondPassword(), chars, c.getCharacterSlots())); } else { c.getSession().close(true); } }
public static final void UsePot(final LittleEndianAccessor slea, final MapleClient c) { final int itemid = slea.readInt(); final Item slot = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slea.readShort()); if (slot == null || slot.getQuantity() <= 0 || slot.getItemId() != itemid || itemid / 10000 != 244 || MapleItemInformationProvider.getInstance().getPot(itemid) == null) { c.getSession().write(CWvsContext.enableActions()); return; } c.getSession().write(CWvsContext.enableActions()); for (int i = 0; i < c.getPlayer().getImps().length; i++) { if (c.getPlayer().getImps()[i] == null) { c.getPlayer().getImps()[i] = new MapleImp(itemid); c.getSession() .write( CWvsContext.updateImp( c.getPlayer().getImps()[i], ImpFlag.SUMMONED.getValue(), i, false)); MapleInventoryManipulator.removeFromSlot( c, MapleInventoryType.USE, slot.getPosition(), (short) 1, false, false); return; } } }
public static final void CharlistRequest(final LittleEndianAccessor slea, final MapleClient c) { if (!c.isLoggedIn()) { c.getSession().close(); return; } if (GameConstants.GMS) { slea.readByte(); // 2? } final int server = slea.readByte(); final int channel = slea.readByte() + 1; if (!World.isChannelAvailable(channel) || server != 0) { // TODOO: MULTI WORLDS c.getSession().write(LoginPacket.getLoginFailed(10)); // cannot process so many return; } // System.out.println("Client " + c.getSession().getRemoteAddress().toString().split(":")[0] + " // is connecting to server " + server + " channel " + channel + ""); final List<MapleCharacter> chars = c.loadCharacters(server); if (chars != null && ChannelServer.getInstance(channel) != null) { c.setWorld(server); c.setChannel(channel); c.getSession().write(LoginPacket.getSecondAuthSuccess(c)); c.getSession() .write(LoginPacket.getCharList(c.getSecondPassword(), chars, c.getCharacterSlots())); } else { c.getSession().close(); } }
public static final void DeleteChar(final LittleEndianAccessor slea, final MapleClient c) { String Secondpw_Client = GameConstants.GMS ? slea.readMapleAsciiString() : null; if (Secondpw_Client == null) { if (slea.readByte() > 0) { // Specific if user have second password or not Secondpw_Client = slea.readMapleAsciiString(); } slea.readMapleAsciiString(); } final int Character_ID = slea.readInt(); if (!c.login_Auth(Character_ID) || !c.isLoggedIn() || loginFailCount(c)) { c.getSession().close(); return; // Attempting to delete other character } byte state = 0; if (c.getSecondPassword() != null) { // On the server, there's a second password if (Secondpw_Client == null) { // Client's hacking c.getSession().close(); return; } else { if (!c.CheckSecondPassword(Secondpw_Client)) { // Wrong Password state = 20; } } } if (state == 0) { state = (byte) c.deleteCharacter(Character_ID); } c.getSession().write(LoginPacket.deleteCharResponse(Character_ID, state)); }
public static final void DeleteChar(LittleEndianAccessor slea, MapleClient c) { String Secondpw_Client = GameConstants.GMS ? slea.readMapleAsciiString() : null; if (Secondpw_Client == null) { if (slea.readByte() > 0) { Secondpw_Client = slea.readMapleAsciiString(); } slea.readMapleAsciiString(); } int Character_ID = slea.readInt(); if ((!c.login_Auth(Character_ID)) || (!c.isLoggedIn()) || (loginFailCount(c))) { c.getSession().close(true); return; } byte state = 0; if (c.getSecondPassword() != null) { if (Secondpw_Client == null) { c.getSession().close(true); return; } if (!c.CheckSecondPassword(Secondpw_Client)) { state = 20; } } if (state == 0) { state = (byte) c.deleteCharacter(Character_ID); } c.getSession().write(LoginPacket.deleteCharResponse(Character_ID, state)); }
public static final void DamageSummon(final LittleEndianAccessor slea, final MapleCharacter chr) { final int unkByte = slea.readByte(); final int damage = slea.readInt(); final int monsterIdFrom = slea.readInt(); // slea.readByte(); // stance final Iterator<MapleSummon> iter = chr.getSummonsReadLock().iterator(); MapleSummon summon; boolean remove = false; try { while (iter.hasNext()) { summon = iter.next(); if (summon.isPuppet() && summon.getOwnerId() == chr.getId() && damage > 0) { // We can only have one puppet(AFAIK O.O) so this check is safe. summon.addHP((short) -damage); if (summon.getHP() <= 0) { remove = true; } chr.getMap() .broadcastMessage( chr, SummonPacket.damageSummon( chr.getId(), summon.getSkill(), damage, unkByte, monsterIdFrom), summon.getTruePosition()); break; } } } finally { chr.unlockSummonsReadLock(); } if (remove) { chr.cancelEffectFromBuffStat(MapleBuffStat.PUPPET); } }
public static final void MoveSummon(final LittleEndianAccessor slea, final MapleCharacter chr) { if (chr == null || chr.getMap() == null) { return; } final MapleMapObject obj = chr.getMap().getMapObject(slea.readInt(), MapleMapObjectType.SUMMON); if (obj == null) { return; } if (obj instanceof MapleDragon) { MoveDragon(slea, chr); return; } final MapleSummon sum = (MapleSummon) obj; if (sum.getOwnerId() != chr.getId() || sum.getSkillLevel() <= 0 || sum.getMovementType() == SummonMovementType.STATIONARY) { return; } slea.skip(8); // startPOS final List<LifeMovementFragment> res = MovementParse.parseMovement(slea, 4); final Point pos = sum.getPosition(); MovementParse.updatePosition(res, sum, 0); if (res.size() > 0) { chr.getMap() .broadcastMessage( chr, SummonPacket.moveSummon(chr.getId(), sum.getObjectId(), pos, res), sum.getTruePosition()); } }
public static final void CurePot(final LittleEndianAccessor slea, final MapleClient c) { final int itemid = slea.readInt(); final Item slot = c.getPlayer().getInventory(MapleInventoryType.ETC).getItem((short) slea.readInt()); if (slot == null || slot.getQuantity() <= 0 || slot.getItemId() != itemid || itemid / 10000 != 434) { c.getSession().write(CWvsContext.enableActions()); return; } final int index = slea.readInt() - 1; if (index < 0 || index >= c.getPlayer().getImps().length || c.getPlayer().getImps()[index] == null || c.getPlayer().getImps()[index].getState() != 4) { c.getSession().write(CWvsContext.enableActions()); return; } c.getPlayer().getImps()[index].setState(1); c.getSession() .write( CWvsContext.updateImp( c.getPlayer().getImps()[index], ImpFlag.STATE.getValue(), index, false)); MapleInventoryManipulator.removeFromSlot( c, MapleInventoryType.ETC, slot.getPosition(), (short) 1, false, false); }
public static final void login(final LittleEndianAccessor slea, final MapleClient c) { String login = c.isLocalhost() ? "admin" : slea.readMapleAsciiString(); String pwd = c.isLocalhost() ? "admin" : slea.readMapleAsciiString(); int loginok = 0; final boolean ipBan = c.hasBannedIP(); final boolean macBan = c.hasBannedMac(); if (AutoRegister.getAccountExists(login) != false) { loginok = c.login(login, pwd, ipBan || macBan); } else if (AutoRegister.autoRegister != false && (!c.hasBannedIP() || !c.hasBannedMac())) { AutoRegister.createAccount(login, pwd, c.getSession().getRemoteAddress().toString()); if (AutoRegister.success != false) { loginok = c.login(login, pwd, ipBan || macBan); } } final Calendar tempbannedTill = c.getTempBanCalendar(); if (loginok == 0 && (ipBan || macBan) && !c.isGm()) { loginok = 3; if (macBan) { // this is only an ipban o.O" - maybe we should refactor this a bit so it's more readable MapleCharacter.ban( c.getSession().getRemoteAddress().toString().split(":")[0], "Enforcing account ban, account " + login, false, 4, false); } } if (loginok != 0) { if (!loginFailCount(c)) { c.clearInformation(); c.getSession().write(LoginPacket.getLoginFailed(loginok)); } else { c.getSession().close(); } } else if (tempbannedTill.getTimeInMillis() != 0) { if (!loginFailCount(c)) { c.clearInformation(); c.getSession() .write( LoginPacket.getTempBan( PacketHelper.getTime(tempbannedTill.getTimeInMillis()), c.getBanReason())); } else { c.getSession().close(); } } else { c.loginAttempt = 0; LoginWorker.registerClient(c); } }
public static final void updateCCards(LittleEndianAccessor slea, MapleClient c) { if ((slea.available() != 36) || (!c.isLoggedIn())) { c.getSession().close(true); return; } Map<Integer, Integer> cids = new LinkedHashMap(); for (int i = 1; i <= 9; i++) { int charId = slea.readInt(); if (((!c.login_Auth(charId)) && (charId != 0)) || (ChannelServer.getInstance(c.getChannel()) == null) || (c.getWorld() != 0)) { c.getSession().close(true); return; } cids.put(Integer.valueOf(i), Integer.valueOf(charId)); } c.updateCharacterCards(cids); }
public static final void updateCCards(final LittleEndianAccessor slea, final MapleClient c) { if (slea.available() != 24 || !c.isLoggedIn()) { c.getSession().close(); return; } final Map<Integer, Integer> cids = new LinkedHashMap<>(); for (int i = 1; i <= 6; i++) { // 6 chars final int charId = slea.readInt(); if ((!c.login_Auth(charId) && charId != 0) || ChannelServer.getInstance(c.getChannel()) == null || c.getWorld() != 0) { c.getSession().close(); return; } cids.put(i, charId); } c.updateCharacterCards(cids); }
public static final void MerchantItemStore(LittleEndianAccessor slea, MapleClient c) { if (c.getPlayer() == null) { return; } byte operation = slea.readByte(); if ((operation == 27) || (operation == 28)) { requestItems(c, operation == 27); } else if (operation == 30) { c.getPlayer().setConversation(0); } }
public static final void Character_WithSecondPassword( LittleEndianAccessor slea, MapleClient c, boolean view) { String password = slea.readMapleAsciiString(); int charId = slea.readInt(); if (view) { c.setChannel(1); c.setWorld(slea.readInt()); } if ((!c.isLoggedIn()) || (loginFailCount(c)) || (c.getSecondPassword() == null) || (!c.login_Auth(charId)) || (ChannelServer.getInstance(c.getChannel()) == null) || (c.getWorld() != 0)) { c.getSession().close(true); return; } if (GameConstants.GMS) { c.updateMacs(slea.readMapleAsciiString()); } if ((c.CheckSecondPassword(password)) && (password.length() >= 6) && (password.length() <= 16)) { if (c.getIdleTask() != null) { c.getIdleTask().cancel(true); } String s = c.getSessionIPAddress(); LoginServer.putLoginAuth(charId, s.substring(s.indexOf('/') + 1, s.length()), c.getTempIP()); c.updateLoginState(MapleClient.LOGIN_SERVER_TRANSITION, s); c.getSession() .write( CField.getServerIP( c, Integer.parseInt(ChannelServer.getInstance(c.getChannel()).getIP().split(":")[1]), charId)); System.out.println("Sent serverIp"); } else { c.getSession().write(LoginPacket.secondPwError((byte) 0x14)); } }
public static final void ClearPot(final LittleEndianAccessor slea, final MapleClient c) { final int index = slea.readInt() - 1; if (index < 0 || index >= c.getPlayer().getImps().length || c.getPlayer().getImps()[index] == null) { c.getSession().write(CWvsContext.enableActions()); return; } c.getSession() .write( CWvsContext.updateImp( c.getPlayer().getImps()[index], ImpFlag.REMOVED.getValue(), index, false)); c.getPlayer().getImps()[index] = null; }
public static final void Character_WithoutSecondPassword( final LittleEndianAccessor slea, final MapleClient c, final boolean haspic, final boolean view) { slea.readByte(); // 1? slea.readByte(); // 1? final int charId = slea.readInt(); if (view) { c.setChannel(1); c.setWorld(slea.readInt()); } final String currentpw = c.getSecondPassword(); if (!c.isLoggedIn() || loginFailCount(c) || (currentpw != null && (!currentpw.equals("") || haspic)) || !c.login_Auth(charId) || ChannelServer.getInstance(c.getChannel()) == null || c.getWorld() != 0) { // TODOO: MULTI WORLDS c.getSession().close(); return; } c.updateMacs(slea.readMapleAsciiString()); slea.readMapleAsciiString(); if (slea.available() != 0) { final String setpassword = slea.readMapleAsciiString(); if (setpassword.length() >= 6 && setpassword.length() <= 16) { c.setSecondPassword(setpassword); c.updateSecondPassword(); } else { c.getSession().write(LoginPacket.secondPwError((byte) 0x14)); return; } } else if (GameConstants.GMS && haspic) { return; } if (c.getIdleTask() != null) { c.getIdleTask().cancel(true); } final String s = c.getSessionIPAddress(); LoginServer.putLoginAuth( charId, s.substring(s.indexOf('/') + 1, s.length()), c.getTempIP(), c.getChannel()); c.updateLoginState(MapleClient.LOGIN_SERVER_TRANSITION, s); c.getSession() .write( CField.getServerIP( c, Integer.parseInt(ChannelServer.getInstance(c.getChannel()).getIP().split(":")[1]), charId)); }
public static final void MoveDragon(final LittleEndianAccessor slea, final MapleCharacter chr) { slea.skip(8); // POS final List<LifeMovementFragment> res = MovementParse.parseMovement(slea, 5); if (chr != null && chr.getDragon() != null && res.size() > 0) { final Point pos = chr.getDragon().getPosition(); MovementParse.updatePosition(res, chr.getDragon(), 0); if (!chr.isHidden()) { chr.getMap() .broadcastMessage( chr, CField.moveDragon(chr.getDragon(), pos, res), chr.getTruePosition()); } WeakReference<MapleCharacter>[] clones = chr.getClones(); for (int i = 0; i < clones.length; i++) { if (clones[i].get() != null) { final MapleMap map = chr.getMap(); final MapleCharacter clone = clones[i].get(); CloneTimer.getInstance() .schedule( new Runnable() { public void run() { try { if (clone.getMap() == map && clone.getDragon() != null) { final Point startPos = clone.getDragon().getPosition(); MovementParse.updatePosition(res, clone.getDragon(), 0); if (!clone.isHidden()) { map.broadcastMessage( clone, CField.moveDragon(clone.getDragon(), startPos, res), clone.getTruePosition()); } } } catch (Exception e) { // very rarely swallowed } } }, 500 * i + 500); } } } }
public static final void RemoveSummon(final LittleEndianAccessor slea, final MapleClient c) { final MapleMapObject obj = c.getPlayer().getMap().getMapObject(slea.readInt(), MapleMapObjectType.SUMMON); if (obj == null || !(obj instanceof MapleSummon)) { return; } final MapleSummon summon = (MapleSummon) obj; if (summon.getOwnerId() != c.getPlayer().getId() || summon.getSkillLevel() <= 0) { c.getPlayer().dropMessage(5, "Error."); return; } if (summon.getSkill() == 35111002 || summon.getSkill() == 35121010) { // rock n shock, amp return; } c.getPlayer().getMap().broadcastMessage(SummonPacket.removeSummon(summon, true)); c.getPlayer().getMap().removeMapObject(summon); c.getPlayer().removeVisibleMapObject(summon); c.getPlayer().removeSummon(summon); if (summon.getSkill() != 35121011) { c.getPlayer().cancelEffectFromBuffStat(MapleBuffStat.SUMMON); // TODO: Multi Summoning, must do something about hack buffstat } }
public static final void RewardPot(final LittleEndianAccessor slea, final MapleClient c) { final int index = slea.readInt() - 1; if (index < 0 || index >= c.getPlayer().getImps().length || c.getPlayer().getImps()[index] == null || c.getPlayer().getImps()[index].getLevel() < (MapleItemInformationProvider.getInstance() .getPot(c.getPlayer().getImps()[index].getItemId()) .right - 1)) { c.getSession().write(CWvsContext.enableActions()); return; } final int itemid = GameConstants.getRewardPot( c.getPlayer().getImps()[index].getItemId(), c.getPlayer().getImps()[index].getCloseness()); if (itemid <= 0 || !MapleInventoryManipulator.checkSpace(c, itemid, (short) 1, "")) { c.getPlayer().dropMessage(1, "Please make some space."); c.getSession().write(CWvsContext.enableActions()); return; } MapleInventoryManipulator.addById( c, itemid, (short) 1, "Item Pot from " + c.getPlayer().getImps()[index].getItemId() + " on " + FileoutputUtil.CurrentReadable_Date()); c.getSession() .write( CWvsContext.updateImp( c.getPlayer().getImps()[index], ImpFlag.REMOVED.getValue(), index, false)); c.getPlayer().getImps()[index] = null; }
/* * Ex. * 0A 00 31 30 32 30 33 30 34 30 35 30 to mapleasciistring */ public static void main(String[] args) { String packet = "0A 00 31 30 40 30 32 30 33 30 34 30 35 30"; byte[] bytes = getByteArrayFromHexString(packet); final LittleEndianAccessor slea = new LittleEndianAccessor(new ByteArrayByteStream((byte[]) bytes)); byte next; short next_short; int next_int; long next_long; for (int length = 0; length < bytes.length; length++) { if (slea.readInt() % 100 < 10 && slea.available() >= 4) { System.out.println(slea.readLastInt()); } else { slea.unReadInt(); System.out.println(slea.readByte()); } } // System.out.println(slea.readMapleAsciiString()); }
public static final void HandleAlliance( final LittleEndianAccessor slea, final MapleClient c, boolean denied) { if (c.getPlayer().getGuildId() <= 0) { c.getSession().write(CWvsContext.enableActions()); return; } final MapleGuild gs = World.Guild.getGuild(c.getPlayer().getGuildId()); if (gs == null) { c.getSession().write(CWvsContext.enableActions()); return; } // System.out.println("Unhandled GuildAlliance \n" + slea.toString()); byte op = slea.readByte(); if (c.getPlayer().getGuildRank() != 1 && op != 1) { // only updating doesn't need guild leader return; } if (op == 22) { denied = true; } int leaderid = 0; if (gs.getAllianceId() > 0) { leaderid = World.Alliance.getAllianceLeader(gs.getAllianceId()); } // accept invite, and deny invite don't need allianceid. if (op != 4 && !denied) { if (gs.getAllianceId() <= 0 || leaderid <= 0) { return; } } else if (leaderid > 0 || gs.getAllianceId() > 0) { // infact, if they have allianceid it's suspicious return; } if (denied) { DenyInvite(c, gs); return; } MapleCharacter chr; int inviteid; switch (op) { case 1: // load... must be in world op for (byte[] pack : World.Alliance.getAllianceInfo(gs.getAllianceId(), false)) { if (pack != null) { c.getSession().write(pack); } } break; case 3: // invite final int newGuild = World.Guild.getGuildLeader(slea.readMapleAsciiString()); if (newGuild > 0 && c.getPlayer().getAllianceRank() == 1 && leaderid == c.getPlayer().getId()) { chr = c.getChannelServer().getPlayerStorage().getCharacterById(newGuild); if (chr != null && chr.getGuildId() > 0 && World.Alliance.canInvite(gs.getAllianceId())) { chr.getClient() .getSession() .write( AlliancePacket.sendAllianceInvite( World.Alliance.getAlliance(gs.getAllianceId()).getName(), c.getPlayer())); World.Guild.setInvitedId(chr.getGuildId(), gs.getAllianceId()); } else { c.getPlayer() .dropMessage(1, "Make sure the leader of the guild is online and in your channel."); } } else { c.getPlayer() .dropMessage( 1, "That Guild was not found. Please enter the correct Guild Name. (Not the player name)"); } break; case 4: // accept invite... guildid that invited(int, a/b check) -> guildname that was // invited? but we dont care about that inviteid = World.Guild.getInvitedId(c.getPlayer().getGuildId()); if (inviteid > 0) { if (!World.Alliance.addGuildToAlliance(inviteid, c.getPlayer().getGuildId())) { c.getPlayer().dropMessage(5, "An error occured when adding guild."); } World.Guild.setInvitedId(c.getPlayer().getGuildId(), 0); } break; case 2: // leave; nothing case 6: // expel, guildid(int) -> allianceid(don't care, a/b check) final int gid; if (op == 6 && slea.available() >= 4) { gid = slea.readInt(); if (slea.available() >= 4 && gs.getAllianceId() != slea.readInt()) { break; } } else { gid = c.getPlayer().getGuildId(); } if (c.getPlayer().getAllianceRank() <= 2 && (c.getPlayer().getAllianceRank() == 1 || c.getPlayer().getGuildId() == gid)) { if (!World.Alliance.removeGuildFromAlliance( gs.getAllianceId(), gid, c.getPlayer().getGuildId() != gid)) { c.getPlayer().dropMessage(5, "An error occured when removing guild."); } } break; case 7: // change leader if (c.getPlayer().getAllianceRank() == 1 && leaderid == c.getPlayer().getId()) { if (!World.Alliance.changeAllianceLeader(gs.getAllianceId(), slea.readInt())) { c.getPlayer().dropMessage(5, "An error occured when changing leader."); } } break; case 8: // title update if (c.getPlayer().getAllianceRank() == 1 && leaderid == c.getPlayer().getId()) { String[] ranks = new String[5]; for (int i = 0; i < 5; i++) { ranks[i] = slea.readMapleAsciiString(); } World.Alliance.updateAllianceRanks(gs.getAllianceId(), ranks); } break; case 9: if (c.getPlayer().getAllianceRank() <= 2) { if (!World.Alliance.changeAllianceRank( gs.getAllianceId(), slea.readInt(), slea.readByte())) { c.getPlayer().dropMessage(5, "An error occured when changing rank."); } } break; case 10: // notice update if (c.getPlayer().getAllianceRank() <= 2) { final String notice = slea.readMapleAsciiString(); if (notice.length() > 100) { break; } World.Alliance.updateAllianceNotice(gs.getAllianceId(), notice); } break; default: System.out.println("Unhandled GuildAlliance op: " + op + ", \n" + slea.toString()); break; } // c.getSession().write(CWvsContext.enableActions()); }
public static void SummonAttack( final LittleEndianAccessor slea, final MapleClient c, final MapleCharacter chr) { if (chr == null || !chr.isAlive() || chr.getMap() == null) { return; } final MapleMap map = chr.getMap(); final MapleMapObject obj = map.getMapObject(slea.readInt(), MapleMapObjectType.SUMMON); if (obj == null || !(obj instanceof MapleSummon)) { chr.dropMessage(5, "The summon has disappeared."); return; } final MapleSummon summon = (MapleSummon) obj; if (summon.getOwnerId() != chr.getId() || summon.getSkillLevel() <= 0) { chr.dropMessage(5, "Error."); return; } final SummonSkillEntry sse = SkillFactory.getSummonData(summon.getSkill()); if (summon.getSkill() / 1000000 != 35 && summon.getSkill() != 33101008 && sse == null) { chr.dropMessage(5, "Error in processing attack."); return; } if (!GameConstants.GMS) { slea.skip(8); } int tick = slea.readInt(); if (sse != null && sse.delay > 0) { chr.updateTick(tick); // summon.CheckSummonAttackFrequency(chr, tick); // chr.getCheatTracker().checkSummonAttack(); } if (!GameConstants.GMS) { slea.skip(8); } final byte animation = slea.readByte(); if (!GameConstants.GMS) { slea.skip(8); } final byte numAttacked = slea.readByte(); if (sse != null && numAttacked > sse.mobCount) { chr.dropMessage(5, "Warning: Attacking more monster than summon can do"); chr.getCheatTracker().registerOffense(CheatingOffense.SUMMON_HACK_MOBS); // AutobanManager.getInstance().autoban(c, "Attacking more monster that summon can do (Skillid // : "+summon.getSkill()+" Count : " + numAttacked + ", allowed : " + sse.mobCount + ")"); return; } slea.skip(summon.getSkill() == 35111002 ? 24 : 12); // some pos stuff final List<Pair<Integer, Integer>> allDamage = new ArrayList<Pair<Integer, Integer>>(); for (int i = 0; i < numAttacked; i++) { final MapleMonster mob = map.getMonsterByOid(slea.readInt()); if (mob == null) { continue; } slea.skip(22); // who knows final int damge = slea.readInt(); allDamage.add(new Pair<Integer, Integer>(mob.getObjectId(), damge)); } // if (!summon.isChangedMap()) { map.broadcastMessage( chr, SummonPacket.summonAttack( summon.getOwnerId(), summon.getObjectId(), animation, allDamage, chr.getLevel(), false), summon.getTruePosition()); // } final Skill summonSkill = SkillFactory.getSkill(summon.getSkill()); final MapleStatEffect summonEffect = summonSkill.getEffect(summon.getSkillLevel()); if (summonEffect == null) { chr.dropMessage(5, "Error in attack."); return; } for (Pair<Integer, Integer> attackEntry : allDamage) { final int toDamage = attackEntry.right; final MapleMonster mob = map.getMonsterByOid(attackEntry.left); if (mob == null) { continue; } if (sse != null && sse.delay > 0 && summon.getMovementType() != SummonMovementType.STATIONARY && summon.getMovementType() != SummonMovementType.CIRCLE_STATIONARY && summon.getMovementType() != SummonMovementType.WALK_STATIONARY && chr.getTruePosition().distanceSq(mob.getTruePosition()) > 400000.0) { // chr.getCheatTracker().registerOffense(CheatingOffense.ATTACK_FARAWAY_MONSTER_SUMMON); } if (toDamage > 0 && summonEffect.getMonsterStati().size() > 0) { if (summonEffect.makeChanceResult()) { for (Map.Entry<MonsterStatus, Integer> z : summonEffect.getMonsterStati().entrySet()) { mob.applyStatus( chr, new MonsterStatusEffect(z.getKey(), z.getValue(), summonSkill.getId(), null, false), summonEffect.isPoison(), 4000, true, summonEffect); } } } if (chr.isGM() || toDamage < (chr.getStat().getCurrentMaxBaseDamage() * 5.0 * (summonEffect.getSelfDestruction() + summonEffect.getDamage() + chr.getStat().getDamageIncrease(summonEffect.getSourceId())) / 100.0)) { // 10 x dmg.. eh mob.damage(chr, toDamage, true); chr.checkMonsterAggro(mob); if (!mob.isAlive()) { chr.getClient().getSession().write(MobPacket.killMonster(mob.getObjectId(), 1)); } } else { chr.dropMessage(5, "Warning - high damage."); // AutobanManager.getInstance().autoban(c, "High Summon Damage (" + toDamage + " to " + // attackEntry.right + ")"); // TODO : Check player's stat for damage checking. break; } } if (!summon.isMultiAttack()) { chr.getMap().broadcastMessage(SummonPacket.removeSummon(summon, true)); chr.getMap().removeMapObject(summon); chr.removeVisibleMapObject(summon); chr.removeSummon(summon); if (summon.getSkill() != 35121011) { chr.cancelEffectFromBuffStat(MapleBuffStat.SUMMON); } } }
public static void CreateChar(LittleEndianAccessor slea, MapleClient c) { String name = slea.readMapleAsciiString(); slea.skip(4); final JobType jobType = JobType.getByType( slea .readInt()); // BIGBANG: 0 = Resistance, 1 = Adventurer, 2 = Cygnus, 3 = Aran, 4 = // Evan, 5 = Mercedes final short subCategory = slea.readShort(); // whether dual blade = 1 or adventurer = 0 final byte gender = slea.readByte(); byte skinColor = slea.readByte(); // 01 int hairColor = 0; slea.skip(1); boolean mercedes = (jobType == JobType.Mercedes); boolean demon = (jobType == JobType.Demon); boolean adventurer = (jobType == JobType.Adventurer); int face = slea.readInt(); int hair = slea.readInt(); final int demonMark = demon ? slea.readInt() : 0; int top = slea.readInt(); int bottom = (mercedes || demon || adventurer) ? 0 : slea.readInt(); int shoes = slea.readInt(); int weapon = slea.readInt(); int shield = demon ? slea.readInt() : (mercedes ? 1352000 : 0); MapleCharacter newchar = MapleCharacter.getDefault(c); newchar.setWorld((byte) c.getWorld()); newchar.setFace(face); newchar.setHair(hair + hairColor); newchar.setGender(gender); newchar.setName(name); newchar.setSkinColor(skinColor); newchar.setDemonMarking(demonMark); newchar.setSubcategory(subCategory); MapleInventory equip = newchar.getInventory(MapleInventoryType.EQUIPPED); Item eq_top = MapleItemInformationProvider.getInstance().getEquipById(top); eq_top.setPosition((byte) -5); equip.addFromDB(eq_top); Item eq_bottom = MapleItemInformationProvider.getInstance().getEquipById(bottom); eq_bottom.setPosition((byte) -6); Item eq_shoes = MapleItemInformationProvider.getInstance().getEquipById(shoes); eq_shoes.setPosition((byte) -7); equip.addFromDB(eq_shoes); Item eq_weapon = MapleItemInformationProvider.getInstance().getEquipById(weapon); eq_weapon.setPosition((byte) -11); equip.addFromDB(eq_weapon); if (MapleCharacterUtil.canCreateChar(name, false) && !LoginInformationProvider.getInstance().isForbiddenName(name)) { MapleCharacter.saveNewCharToDB(newchar, (short) 0); c.getSession().write(LoginPacket.addNewCharEntry(newchar, true)); c.createdChar(newchar.getId()); } else { c.getSession().write(LoginPacket.addNewCharEntry(newchar, false)); } newchar = null; }
public static final void SubSummon(final LittleEndianAccessor slea, final MapleCharacter chr) { final MapleMapObject obj = chr.getMap().getMapObject(slea.readInt(), MapleMapObjectType.SUMMON); if (obj == null || !(obj instanceof MapleSummon)) { return; } final MapleSummon sum = (MapleSummon) obj; if (sum == null || sum.getOwnerId() != chr.getId() || sum.getSkillLevel() <= 0 || !chr.isAlive()) { return; } switch (sum.getSkill()) { case 35121009: if (!chr.canSummon(2000)) { return; } final int skillId = slea.readInt(); // 35121009? if (sum.getSkill() != skillId) { return; } slea.skip(1); // 0E? chr.updateTick(slea.readInt()); for (int i = 0; i < 3; i++) { final MapleSummon tosummon = new MapleSummon( chr, SkillFactory.getSkill(35121011).getEffect(sum.getSkillLevel()), new Point(sum.getTruePosition().x, sum.getTruePosition().y - 5), SummonMovementType.WALK_STATIONARY); chr.getMap().spawnSummon(tosummon); chr.addSummon(tosummon); } break; case 35111011: // healing if (!chr.canSummon(1000)) { return; } chr.addHP( (int) (chr.getStat().getCurrentMaxHp() * SkillFactory.getSkill(sum.getSkill()).getEffect(sum.getSkillLevel()).getHp() / 100.0)); chr.getClient() .getSession() .write( EffectPacket.showOwnBuffEffect( sum.getSkill(), 2, chr.getLevel(), sum.getSkillLevel())); chr.getMap() .broadcastMessage( chr, EffectPacket.showBuffeffect( chr.getId(), sum.getSkill(), 2, chr.getLevel(), sum.getSkillLevel()), false); break; case 1321007: // beholder Skill bHealing = SkillFactory.getSkill(slea.readInt()); final int bHealingLvl = chr.getTotalSkillLevel(bHealing); if (bHealingLvl <= 0 || bHealing == null) { return; } final MapleStatEffect healEffect = bHealing.getEffect(bHealingLvl); if (bHealing.getId() == 1320009) { healEffect.applyTo(chr); } else if (bHealing.getId() == 1320008) { if (!chr.canSummon(healEffect.getX() * 1000)) { return; } chr.addHP(healEffect.getHp()); } chr.getClient() .getSession() .write(EffectPacket.showOwnBuffEffect(sum.getSkill(), 2, chr.getLevel(), bHealingLvl)); chr.getMap() .broadcastMessage( SummonPacket.summonSkill( chr.getId(), sum.getSkill(), bHealing.getId() == 1320008 ? 5 : (Randomizer.nextInt(3) + 6))); chr.getMap() .broadcastMessage( chr, EffectPacket.showBuffeffect( chr.getId(), sum.getSkill(), 2, chr.getLevel(), bHealingLvl), false); break; } if (GameConstants.isAngel(sum.getSkill())) { if (sum.getSkill() % 10000 == 1087) { MapleItemInformationProvider.getInstance().getItemEffect(2022747).applyTo(chr); } else if (sum.getSkill() % 10000 == 1179) { MapleItemInformationProvider.getInstance().getItemEffect(2022823).applyTo(chr); } else if (sum.getSkill() % 10000 == 1085) { MapleItemInformationProvider.getInstance().getItemEffect(2022746).applyTo(chr); } chr.getClient().getSession().write(EffectPacket.showOwnBuffEffect(sum.getSkill(), 2, 2, 1)); chr.getMap() .broadcastMessage( chr, EffectPacket.showBuffeffect(chr.getId(), sum.getSkill(), 2, 2, 1), false); } }
public static final void SummonPVP(final LittleEndianAccessor slea, final MapleClient c) { final MapleCharacter chr = c.getPlayer(); if (chr == null || chr.isHidden() || !chr.isAlive() || chr.hasBlockedInventory() || chr.getMap() == null || !chr.inPVP() || !chr.getEventInstance().getProperty("started").equals("1")) { return; } final MapleMap map = chr.getMap(); final MapleMapObject obj = map.getMapObject(slea.readInt(), MapleMapObjectType.SUMMON); if (obj == null || !(obj instanceof MapleSummon)) { chr.dropMessage(5, "The summon has disappeared."); return; } int tick = -1; if (slea.available() == 27) { slea.skip(23); tick = slea.readInt(); } final MapleSummon summon = (MapleSummon) obj; if (summon.getOwnerId() != chr.getId() || summon.getSkillLevel() <= 0) { chr.dropMessage(5, "Error."); return; } final Skill skil = SkillFactory.getSkill(summon.getSkill()); final MapleStatEffect effect = skil.getEffect(summon.getSkillLevel()); final int lvl = Integer.parseInt(chr.getEventInstance().getProperty("lvl")); final int type = Integer.parseInt(chr.getEventInstance().getProperty("type")); final int ourScore = Integer.parseInt(chr.getEventInstance().getProperty(String.valueOf(chr.getId()))); int addedScore = 0; final boolean magic = skil.isMagic(); boolean killed = false, didAttack = false; double maxdamage = lvl == 3 ? chr.getStat().getCurrentMaxBasePVPDamageL() : chr.getStat().getCurrentMaxBasePVPDamage(); maxdamage *= (effect.getDamage() + chr.getStat().getDamageIncrease(summon.getSkill())) / 100.0; int mobCount = 1, attackCount = 1, ignoreDEF = chr.getStat().ignoreTargetDEF; final SummonSkillEntry sse = SkillFactory.getSummonData(summon.getSkill()); if (summon.getSkill() / 1000000 != 35 && summon.getSkill() != 33101008 && sse == null) { chr.dropMessage(5, "Error in processing attack."); return; } Point lt, rb; if (sse != null) { if (sse.delay > 0) { if (tick != -1) { summon.CheckSummonAttackFrequency(chr, tick); chr.updateTick(tick); } else { summon.CheckPVPSummonAttackFrequency(chr); } chr.getCheatTracker().checkSummonAttack(); } mobCount = sse.mobCount; attackCount = sse.attackCount; lt = sse.lt; rb = sse.rb; } else { lt = new Point(-100, -100); rb = new Point(100, 100); } final Rectangle box = MapleStatEffect.calculateBoundingBox(chr.getTruePosition(), chr.isFacingLeft(), lt, rb, 0); List<AttackPair> ourAttacks = new ArrayList<AttackPair>(); List<Pair<Integer, Boolean>> attacks; maxdamage *= chr.getStat().dam_r / 100.0; for (MapleMapObject mo : chr.getMap().getCharactersIntersect(box)) { final MapleCharacter attacked = (MapleCharacter) mo; if (attacked.getId() != chr.getId() && attacked.isAlive() && !attacked.isHidden() && (type == 0 || attacked.getTeam() != chr.getTeam())) { double rawDamage = maxdamage / Math.max( 0, ((magic ? attacked.getStat().mdef : attacked.getStat().wdef) * Math.max(1.0, 100.0 - ignoreDEF) / 100.0) * (type == 3 ? 0.1 : 0.25)); if (attacked.getBuffedValue(MapleBuffStat.INVINCIBILITY) != null || PlayersHandler.inArea(attacked)) { rawDamage = 0; } rawDamage += (rawDamage * chr.getDamageIncrease(attacked.getId()) / 100.0); rawDamage *= attacked.getStat().mesoGuard / 100.0; rawDamage = attacked.modifyDamageTaken(rawDamage, attacked).left; final double min = (rawDamage * chr.getStat().trueMastery / 100); attacks = new ArrayList<Pair<Integer, Boolean>>(attackCount); int totalMPLoss = 0, totalHPLoss = 0; for (int i = 0; i < attackCount; i++) { int mploss = 0; double ourDamage = Randomizer.nextInt((int) Math.abs(Math.round(rawDamage - min)) + 1) + min; if (attacked.getStat().dodgeChance > 0 && Randomizer.nextInt(100) < attacked.getStat().dodgeChance) { ourDamage = 0; // i dont think level actually matters or it'd be too op // } else if (attacked.getLevel() > chr.getLevel() && Randomizer.nextInt(100) < // (attacked.getLevel() - chr.getLevel())) { // ourDamage = 0; } if (attacked.getBuffedValue(MapleBuffStat.MAGIC_GUARD) != null) { mploss = (int) Math.min( attacked.getStat().getMp(), (ourDamage * attacked.getBuffedValue(MapleBuffStat.MAGIC_GUARD).doubleValue() / 100.0)); } ourDamage -= mploss; if (attacked.getBuffedValue(MapleBuffStat.INFINITY) != null) { mploss = 0; } attacks.add(new Pair<Integer, Boolean>((int) Math.floor(ourDamage), false)); totalHPLoss += Math.floor(ourDamage); totalMPLoss += mploss; } attacked.addMPHP(-totalHPLoss, -totalMPLoss); ourAttacks.add(new AttackPair(attacked.getId(), attacked.getPosition(), attacks)); attacked.getCheatTracker().setAttacksWithoutHit(false); if (totalHPLoss > 0) { didAttack = true; } if (attacked.getStat().getHPPercent() <= 20) { SkillFactory.getSkill(attacked.getStat().getSkillByJob(93, attacked.getJob())) .getEffect(1) .applyTo(attacked); } if (effect != null) { if (effect.getMonsterStati().size() > 0 && effect.makeChanceResult()) { for (Map.Entry<MonsterStatus, Integer> z : effect.getMonsterStati().entrySet()) { MapleDisease d = MonsterStatus.getLinkedDisease(z.getKey()); if (d != null) { attacked.giveDebuff(d, z.getValue(), effect.getDuration(), d.getDisease(), 1); } } } effect.handleExtraPVP(chr, attacked); } chr.getClient() .getSession() .write( CField.getPVPHPBar( attacked.getId(), attacked.getStat().getHp(), attacked.getStat().getCurrentMaxHp())); addedScore += (totalHPLoss / 100) + (totalMPLoss / 100); // ive NO idea if (!attacked.isAlive()) { killed = true; } if (ourAttacks.size() >= mobCount) { break; } } } if (killed || addedScore > 0) { chr.getEventInstance().addPVPScore(chr, addedScore); chr.getClient().getSession().write(CField.getPVPScore(ourScore + addedScore, killed)); } if (didAttack) { chr.getMap() .broadcastMessage( SummonPacket.pvpSummonAttack( chr.getId(), chr.getLevel(), summon.getObjectId(), summon.isFacingLeft() ? 4 : 0x84, summon.getTruePosition(), ourAttacks)); if (!summon.isMultiAttack()) { chr.getMap().broadcastMessage(SummonPacket.removeSummon(summon, true)); chr.getMap().removeMapObject(summon); chr.removeVisibleMapObject(summon); chr.removeSummon(summon); if (summon.getSkill() != 35121011) { chr.cancelEffectFromBuffStat(MapleBuffStat.SUMMON); } } } }
public static final void FeedPot(final LittleEndianAccessor slea, final MapleClient c) { final int itemid = slea.readInt(); final Item slot = c.getPlayer() .getInventory(GameConstants.getInventoryType(itemid)) .getItem((short) slea.readInt()); if (slot == null || slot.getQuantity() <= 0 || slot.getItemId() != itemid) { c.getSession().write(CWvsContext.enableActions()); return; } final int level = GameConstants.getInventoryType(itemid) == MapleInventoryType.ETC ? MapleItemInformationProvider.getInstance().getItemMakeLevel(itemid) : MapleItemInformationProvider.getInstance().getReqLevel(itemid); if (level <= 0 || level < (Math.min(120, c.getPlayer().getLevel()) - 50) || (GameConstants.getInventoryType(itemid) != MapleInventoryType.ETC && GameConstants.getInventoryType(itemid) != MapleInventoryType.EQUIP)) { c.getPlayer().dropMessage(1, "The item must be within 50 levels of you."); c.getSession().write(CWvsContext.enableActions()); return; } final int index = slea.readInt() - 1; if (index < 0 || index >= c.getPlayer().getImps().length || c.getPlayer().getImps()[index] == null || c.getPlayer().getImps()[index].getLevel() >= (MapleItemInformationProvider.getInstance() .getPot(c.getPlayer().getImps()[index].getItemId()) .right - 1) || c.getPlayer().getImps()[index].getState() != 1) { c.getSession().write(CWvsContext.enableActions()); return; } int mask = ImpFlag.FULLNESS.getValue(); mask |= ImpFlag.FULLNESS_2.getValue(); mask |= ImpFlag.UPDATE_TIME.getValue(); mask |= ImpFlag.AWAKE_TIME.getValue(); // this is where the magic happens c.getPlayer() .getImps()[index] .setFullness( c.getPlayer().getImps()[index].getFullness() + (100 * (GameConstants.getInventoryType(itemid) == MapleInventoryType.EQUIP ? 2 : 1))); if (Randomizer.nextBoolean()) { mask |= ImpFlag.CLOSENESS.getValue(); c.getPlayer() .getImps()[index] .setCloseness( c.getPlayer().getImps()[index].getCloseness() + 1 + (Randomizer.nextInt( 5 * (GameConstants.getInventoryType(itemid) == MapleInventoryType.EQUIP ? 2 : 1)))); } else if (Randomizer.nextInt(5) == 0) { // 1/10 chance of sickness c.getPlayer().getImps()[index].setState(4); // sick mask |= ImpFlag.STATE.getValue(); } if (c.getPlayer().getImps()[index].getFullness() >= 1000) { c.getPlayer().getImps()[index].setState(1); c.getPlayer().getImps()[index].setFullness(0); c.getPlayer().getImps()[index].setLevel(c.getPlayer().getImps()[index].getLevel() + 1); mask |= ImpFlag.SUMMONED.getValue(); if (c.getPlayer().getImps()[index].getLevel() >= (MapleItemInformationProvider.getInstance() .getPot(c.getPlayer().getImps()[index].getItemId()) .right - 1)) { c.getPlayer().getImps()[index].setState(5); } } MapleInventoryManipulator.removeFromSlot( c, GameConstants.getInventoryType(itemid), slot.getPosition(), (short) 1, false, false); c.getSession().write(CWvsContext.updateImp(c.getPlayer().getImps()[index], mask, index, false)); }
public static final void ItemMaker(final LittleEndianAccessor slea, final MapleClient c) { // System.out.println(slea.toString()); //change? final int makerType = slea.readInt(); switch (makerType) { case 1: { // Gem final int toCreate = slea.readInt(); if (GameConstants.isGem(toCreate)) { final GemCreateEntry gem = ItemMakerFactory.getInstance().getGemInfo(toCreate); if (gem == null) { return; } if (!hasSkill(c, gem.getReqSkillLevel())) { return; // H4x } if (c.getPlayer().getMeso() < gem.getCost()) { return; // H4x } final int randGemGiven = getRandomGem(gem.getRandomReward()); if (c.getPlayer().getInventory(GameConstants.getInventoryType(randGemGiven)).isFull()) { return; // We'll do handling for this later } final int taken = checkRequiredNRemove(c, gem.getReqRecipes()); if (taken == 0) { return; // We'll do handling for this later } c.getPlayer().gainMeso(-gem.getCost(), false); MapleInventoryManipulator.addById( c, randGemGiven, (byte) (taken == randGemGiven ? 9 : 1), "Made by Gem " + toCreate + " on " + FileoutputUtil.CurrentReadable_Date()); // Gem is always 1 c.getSession().write(EffectPacket.ItemMaker_Success()); c.getPlayer() .getMap() .broadcastMessage( c.getPlayer(), EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } else if (GameConstants.isOtherGem(toCreate)) { // non-gems that are gems // stim and numEnchanter always 0 final GemCreateEntry gem = ItemMakerFactory.getInstance().getGemInfo(toCreate); if (gem == null) { return; } if (!hasSkill(c, gem.getReqSkillLevel())) { return; // H4x } if (c.getPlayer().getMeso() < gem.getCost()) { return; // H4x } if (c.getPlayer().getInventory(GameConstants.getInventoryType(toCreate)).isFull()) { return; // We'll do handling for this later } if (checkRequiredNRemove(c, gem.getReqRecipes()) == 0) { return; // We'll do handling for this later } c.getPlayer().gainMeso(-gem.getCost(), false); if (GameConstants.getInventoryType(toCreate) == MapleInventoryType.EQUIP) { MapleInventoryManipulator.addbyItem( c, MapleItemInformationProvider.getInstance().getEquipById(toCreate)); } else { MapleInventoryManipulator.addById( c, toCreate, (byte) 1, "Made by Gem " + toCreate + " on " + FileoutputUtil.CurrentReadable_Date()); // Gem is always 1 } c.getSession().write(EffectPacket.ItemMaker_Success()); c.getPlayer() .getMap() .broadcastMessage( c.getPlayer(), EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } else { final boolean stimulator = slea.readByte() > 0; final int numEnchanter = slea.readInt(); final ItemMakerCreateEntry create = ItemMakerFactory.getInstance().getCreateInfo(toCreate); if (create == null) { return; } if (numEnchanter > create.getTUC()) { return; // h4x } if (!hasSkill(c, create.getReqSkillLevel())) { return; // H4x } if (c.getPlayer().getMeso() < create.getCost()) { return; // H4x } if (c.getPlayer().getInventory(GameConstants.getInventoryType(toCreate)).isFull()) { return; // We'll do handling for this later } if (checkRequiredNRemove(c, create.getReqItems()) == 0) { return; // We'll do handling for this later } c.getPlayer().gainMeso(-create.getCost(), false); final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); final Equip toGive = (Equip) ii.getEquipById(toCreate); if (stimulator || numEnchanter > 0) { if (c.getPlayer().haveItem(create.getStimulator(), 1, false, true)) { ii.randomizeStats_Above(toGive); MapleInventoryManipulator.removeById( c, MapleInventoryType.ETC, create.getStimulator(), 1, false, false); } for (int i = 0; i < numEnchanter; i++) { final int enchant = slea.readInt(); if (c.getPlayer().haveItem(enchant, 1, false, true)) { final Map<String, Integer> stats = ii.getEquipStats(enchant); if (stats != null) { addEnchantStats(stats, toGive); MapleInventoryManipulator.removeById( c, MapleInventoryType.ETC, enchant, 1, false, false); } } } } if (!stimulator || Randomizer.nextInt(10) != 0) { MapleInventoryManipulator.addbyItem(c, toGive); c.getPlayer() .getMap() .broadcastMessage( c.getPlayer(), EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } else { c.getPlayer().dropMessage(5, "The item was overwhelmed by the stimulator."); } c.getSession().write(EffectPacket.ItemMaker_Success()); } break; } case 3: { // Making Crystals final int etc = slea.readInt(); if (c.getPlayer().haveItem(etc, 100, false, true)) { MapleInventoryManipulator.addById( c, getCreateCrystal(etc), (short) 1, "Made by Maker " + etc + " on " + FileoutputUtil.CurrentReadable_Date()); MapleInventoryManipulator.removeById(c, MapleInventoryType.ETC, etc, 100, false, false); c.getSession().write(EffectPacket.ItemMaker_Success()); c.getPlayer() .getMap() .broadcastMessage( c.getPlayer(), EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); } break; } case 4: { // Disassembling EQ. final int itemId = slea.readInt(); c.getPlayer().updateTick(slea.readInt()); final byte slot = (byte) slea.readInt(); final Item toUse = c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(slot); if (toUse == null || toUse.getItemId() != itemId || toUse.getQuantity() < 1) { return; } final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (!ii.isDropRestricted(itemId) && !ii.isAccountShared(itemId)) { final int[] toGive = getCrystal(itemId, ii.getReqLevel(itemId)); MapleInventoryManipulator.addById( c, toGive[0], (byte) toGive[1], "Made by disassemble " + itemId + " on " + FileoutputUtil.CurrentReadable_Date()); MapleInventoryManipulator.removeFromSlot( c, MapleInventoryType.EQUIP, slot, (byte) 1, false); } c.getSession().write(EffectPacket.ItemMaker_Success()); c.getPlayer() .getMap() .broadcastMessage( c.getPlayer(), EffectPacket.ItemMaker_Success_3rdParty(c.getPlayer().getId()), false); break; } } }
public static final void CreateUltimate(final LittleEndianAccessor slea, final MapleClient c) { if (!c.isLoggedIn() || c.getPlayer() == null || c.getPlayer().getLevel() < 120 || c.getPlayer().getMapId() != 130000000 || c.getPlayer().getQuestStatus(20734) != 0 || c.getPlayer().getQuestStatus(20616) != 2 || !GameConstants.isKOC(c.getPlayer().getJob()) || !c.canMakeCharacter(c.getPlayer().getWorld())) { c.getPlayer().dropMessage(1, "You have no character slots."); c.getSession().write(CField.createUltimate(0)); return; } System.out.println(slea.toString()); final String name = slea.readMapleAsciiString(); final int job = slea.readInt(); // job ID final int face = slea.readInt(); final int hair = slea.readInt(); final int hat = slea.readInt(); final int top = slea.readInt(); final int glove = slea.readInt(); final int shoes = slea.readInt(); final int weapon = slea.readInt(); final byte gender = c.getPlayer().getGender(); JobType jobType = JobType.Adventurer; // if (!LoginInformationProvider.getInstance().isEligibleItem(gender, 0, jobType.type, face) || // !LoginInformationProvider.getInstance().isEligibleItem(gender, 1, jobType.type, hair)) { // c.getPlayer().dropMessage(1, "An error occurred."); // c.getSession().write(CField.createUltimate(0)); // return; // } jobType = JobType.UltimateAdventurer; MapleCharacter newchar = MapleCharacter.getDefault(c, jobType); newchar.setJob(job); newchar.setWorld((byte) c.getPlayer().getWorld()); newchar.setFace(face); newchar.setHair(hair); newchar.setGender(gender); newchar.setName(name); newchar.setSkinColor((byte) 3); // troll newchar.setLevel((short) 50); newchar.getStat().str = (short) 4; newchar.getStat().dex = (short) 4; newchar.getStat().int_ = (short) 4; newchar.getStat().luk = (short) 4; newchar.setRemainingAp((short) 254); // 49*5 + 25 - 16 newchar.setRemainingSp( job / 100 == 2 ? 128 : 122); // 2 from job advancements. 120 from leveling. (mages get +6) newchar.getStat().maxhp += 150; // Beginner 10 levels newchar.getStat().maxmp += 125; newchar.getStat().hp += 150; // Beginner 10 levels newchar.getStat().mp += 125; switch (job) { case 110: case 120: case 130: newchar.getStat().maxhp += 600; // Job Advancement newchar.getStat().maxhp += 2000; // Levelup 40 times newchar.getStat().maxmp += 200; newchar.getStat().hp += 600; // Job Advancement newchar.getStat().hp += 2000; // Levelup 40 times newchar.getStat().mp += 200; break; case 210: case 220: case 230: newchar.getStat().maxmp += 600; newchar.getStat().maxhp += 500; // Levelup 40 times newchar.getStat().maxmp += 2000; newchar.getStat().mp += 600; newchar.getStat().hp += 500; // Levelup 40 times newchar.getStat().mp += 2000; break; case 310: case 320: case 410: case 420: case 520: newchar.getStat().maxhp += 500; newchar.getStat().maxmp += 250; newchar.getStat().maxhp += 900; // Levelup 40 times newchar.getStat().maxmp += 600; newchar.getStat().maxhp += 500; newchar.getStat().mp += 250; newchar.getStat().hp += 900; // Levelup 40 times newchar.getStat().mp += 600; break; case 510: newchar.getStat().maxhp += 500; newchar.getStat().maxmp += 250; newchar.getStat().maxhp += 450; // Levelup 20 times newchar.getStat().maxmp += 300; newchar.getStat().maxhp += 800; // Levelup 20 times newchar.getStat().maxmp += 400; newchar.getStat().hp += 500; newchar.getStat().mp += 250; newchar.getStat().hp += 450; // Levelup 20 times newchar.getStat().mp += 300; newchar.getStat().hp += 800; // Levelup 20 times newchar.getStat().mp += 400; break; default: return; } for (int i = 2490; i < 2507; i++) { newchar.setQuestAdd(MapleQuest.getInstance(i), (byte) 2, null); } newchar.setQuestAdd(MapleQuest.getInstance(29947), (byte) 2, null); newchar.setQuestAdd( MapleQuest.getInstance(GameConstants.ULT_EXPLORER), (byte) 0, c.getPlayer().getName()); final Map<Skill, SkillEntry> ss = new HashMap<>(); ss.put(SkillFactory.getSkill(1074 + (job / 100)), new SkillEntry((byte) 5, (byte) 5, -1)); ss.put(SkillFactory.getSkill(1195 + (job / 100)), new SkillEntry((byte) 5, (byte) 5, -1)); ss.put(SkillFactory.getSkill(80), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss, false); final MapleItemInformationProvider li = MapleItemInformationProvider.getInstance(); int[] items = new int[] { 1142257, hat, top, shoes, glove, weapon, hat + 1, top + 1, shoes + 1, glove + 1, weapon + 1 }; // brilliant = fine+1 for (byte i = 0; i < items.length; i++) { Item item = li.getEquipById(items[i]); item.setPosition((byte) (i + 1)); newchar.getInventory(MapleInventoryType.EQUIP).addFromDB(item); } newchar .getInventory(MapleInventoryType.USE) .addItem(new Item(2000004, (byte) 0, (short) 100, (byte) 0)); newchar .getInventory(MapleInventoryType.USE) .addItem(new Item(2000004, (byte) 0, (short) 100, (byte) 0)); c.getPlayer().fakeRelog(); if (MapleCharacterUtil.canCreateChar(name, c.isGm()) && (!LoginInformationProvider.getInstance().isForbiddenName(name) || c.isGm())) { MapleCharacter.saveNewCharToDB(newchar, jobType, (short) 0); MapleQuest.getInstance(20734).forceComplete(c.getPlayer(), 1101000); c.getSession().write(CField.createUltimate(1)); } else { c.getSession().write(CField.createUltimate(0)); } }
public static void CreateChar(final LittleEndianAccessor slea, final MapleClient c) { if (!c.isLoggedIn()) { c.getSession().close(); return; } final String name = slea.readMapleAsciiString(); final JobType jobType = JobType.getByType( slea.readInt()); // BIGBANG: 0 = Resistance, 1 = Adventurer, 2 = Cygnus, 3 = Aran, 4 = // Evan, 5 = mercedes final short db = slea.readShort(); // whether dual blade = 1 or adventurer = 0 final byte gender = slea.readByte(); // ??idk corresponds with the thing in addCharStats byte skinColor = slea.readByte(); // 01 int hairColor = 0; final byte unk2 = slea.readByte(); // 08 final boolean mercedes = (jobType == JobType.Mercedes); final boolean demon = (jobType == JobType.Demon); final boolean mihile = (jobType == JobType.Mihile); boolean jettPhantom = (jobType == LoginInformationProvider.JobType.Jett) || (jobType == LoginInformationProvider.JobType.Phantom) || (jobType == LoginInformationProvider.JobType.DualBlade); final int face = slea.readInt(); final int hair = slea.readInt(); if (!mercedes && !mihile && !demon && !jettPhantom) { // mercedes/demon dont need hair color since its already in the hair hairColor = slea.readInt(); skinColor = (byte) slea.readInt(); } final int demonMark = demon ? slea.readInt() : 0; final int top = (mihile) ? 0 : slea.readInt(); final int bottom = (mihile) ? 0 : slea.readInt(); final int shoes = (mihile) ? 0 : slea.readInt(); final int weapon = jobType == LoginInformationProvider.JobType.Phantom ? 1362046 : mercedes ? 1522038 : (mihile || demon) ? 0 : slea.readInt(); int shield = jobType == LoginInformationProvider.JobType.Phantom ? 1352100 : jobType == LoginInformationProvider.JobType.Mihile ? 1098000 : mercedes ? 1352000 : demon ? slea.readInt() : 0; MapleCharacter newchar = MapleCharacter.getDefault(c, jobType); newchar.setWorld((byte) c.getWorld()); newchar.setFace(face); newchar.setHair(hair + hairColor); newchar.setGender(gender); newchar.setName(name); newchar.setSkinColor(skinColor); newchar.setDemonMarking(demonMark); final MapleItemInformationProvider li = MapleItemInformationProvider.getInstance(); final MapleInventory equip = newchar.getInventory(MapleInventoryType.EQUIPPED); Item item = li.getEquipById(top); item.setPosition((byte) -5); equip.addFromDB(item); if (bottom > 0) { // resistance have overall item = li.getEquipById(bottom); item.setPosition((short) (byte) (jettPhantom ? -9 : -6)); equip.addFromDB(item); } item = li.getEquipById(shoes); item.setPosition((byte) -7); equip.addFromDB(item); item = li.getEquipById(weapon); item.setPosition((byte) -11); equip.addFromDB(item); if (shield > 0) { item = li.getEquipById(shield); item.setPosition((byte) -10); equip.addFromDB(item); } newchar .getInventory(MapleInventoryType.USE) .addItem(new Item(2000013, (byte) 0, (short) 100, (byte) 0)); newchar .getInventory(MapleInventoryType.USE) .addItem(new Item(2000014, (byte) 0, (short) 100, (byte) 0)); // blue/red pots switch (jobType) { case Resistance: // Resistance newchar .getInventory(MapleInventoryType.ETC) .addItem(new Item(4161001, (byte) 0, (short) 1, (byte) 0)); final Map<Skill, SkillEntry> ss = new HashMap<>(); ss.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss, false); break; case Adventurer: // Adventurer newchar .getInventory(MapleInventoryType.ETC) .addItem(new Item(4161001, (byte) 0, (short) 1, (byte) 0)); final Map<Skill, SkillEntry> ss1 = new HashMap<>(); ss1.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss1, false); break; case Cygnus: // Cygnus newchar .getInventory(MapleInventoryType.ETC) .addItem(new Item(4161047, (byte) 0, (short) 1, (byte) 0)); newchar.setQuestAdd(MapleQuest.getInstance(20022), (byte) 1, "1"); newchar.setQuestAdd(MapleQuest.getInstance(20010), (byte) 1, null); // >_>_>_> ugh final Map<Skill, SkillEntry> ss2 = new HashMap<>(); ss2.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss2, false); break; case Aran: // Aran newchar .getInventory(MapleInventoryType.ETC) .addItem(new Item(4161048, (byte) 0, (short) 1, (byte) 0)); final Map<Skill, SkillEntry> ss3 = new HashMap<>(); ss3.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss3, false); break; case Evan: // Evan newchar .getInventory(MapleInventoryType.ETC) .addItem(new Item(4161052, (byte) 0, (short) 1, (byte) 0)); final Map<Skill, SkillEntry> ss4 = new HashMap<>(); ss4.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss4, false); break; case Mercedes: // Mercedes newchar .getInventory(MapleInventoryType.ETC) .addItem(new Item(4161079, (byte) 0, (short) 1, (byte) 0)); final Map<Skill, SkillEntry> ss5 = new HashMap<>(); ss5.put(SkillFactory.getSkill(20021000), new SkillEntry((byte) 0, (byte) 0, -1)); ss5.put(SkillFactory.getSkill(20021001), new SkillEntry((byte) 0, (byte) 0, -1)); ss5.put(SkillFactory.getSkill(20020002), new SkillEntry((byte) 0, (byte) 0, -1)); ss5.put(SkillFactory.getSkill(20020022), new SkillEntry((byte) 1, (byte) 1, -1)); ss5.put(SkillFactory.getSkill(20020109), new SkillEntry((byte) 1, (byte) 1, -1)); ss5.put(SkillFactory.getSkill(20021110), new SkillEntry((byte) 1, (byte) 1, -1)); ss5.put(SkillFactory.getSkill(20020111), new SkillEntry((byte) 1, (byte) 1, -1)); ss5.put(SkillFactory.getSkill(20020112), new SkillEntry((byte) 1, (byte) 1, -1)); ss5.put(SkillFactory.getSkill(20021181), new SkillEntry((byte) -1, (byte) 0, -1)); ss5.put(SkillFactory.getSkill(20021166), new SkillEntry((byte) -1, (byte) 0, -1)); ss5.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss5, false); break; case Demon: // Demon newchar .getInventory(MapleInventoryType.ETC) .addItem(new Item(4161054, (byte) 0, (short) 1, (byte) 0)); final Map<Skill, SkillEntry> ss6 = new HashMap<>(); ss6.put(SkillFactory.getSkill(30011000), new SkillEntry((byte) 0, (byte) 0, -1)); ss6.put(SkillFactory.getSkill(30011001), new SkillEntry((byte) 0, (byte) 0, -1)); ss6.put(SkillFactory.getSkill(30010002), new SkillEntry((byte) 0, (byte) 0, -1)); ss6.put(SkillFactory.getSkill(30010185), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30010112), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30010111), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30010110), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30010022), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30011109), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30011170), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30011169), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30011168), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30011167), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(30010166), new SkillEntry((byte) 1, (byte) 1, -1)); ss6.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss6, false); break; case Phantom: newchar.setLevel((short) 10); newchar.setJob(2400); newchar.getStat().maxhp += 294; // Beginner 10 levels newchar.getStat().maxmp += 113; newchar.getStat().hp += 294; // Beginner 10 levels newchar.getStat().mp += 113; newchar.getStat().str -= 8; newchar.getStat().dex -= 1; newchar.getStat().luk += 31; newchar.setRemainingAp((short) 23); newchar.setRemainingSp(5); final Map<Skill, SkillEntry> ss7 = new HashMap<>(); ss7.put(SkillFactory.getSkill(20031203), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(20030204), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(20031205), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(20030206), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(20031207), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(20031208), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(20031209), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(20031210), new SkillEntry((byte) 1, (byte) 1, -1)); ss7.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss7, false); break; case Jett: newchar.setLevel((short) 10); newchar.setJob(508); newchar.getStat().maxhp += 294; // Beginner 10 newchar.getStat().maxmp += 113; newchar.getStat().hp += 294; // Beginner 10 newchar.getStat().mp += 113; newchar.getStat().str -= 8; newchar.getStat().dex += 15; newchar.setRemainingAp((short) 38); newchar.setRemainingSp(1); final Map<Skill, SkillEntry> ss8 = new HashMap<>(); ss8.put(SkillFactory.getSkill(228), new SkillEntry((byte) 1, (byte) 1, -1)); ss8.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); // ss8.put(SkillFactory.getSkill(80001151), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss8, false); break; case Mihile: final Map<Skill, SkillEntry> ss9 = new HashMap<>(); ss9.put(SkillFactory.getSkill(80001152), new SkillEntry((byte) 1, (byte) 1, -1)); newchar.changeSkillLevel_Skip(ss9, false); break; } if (MapleCharacterUtil.canCreateChar(name, c.isGm()) && (!LoginInformationProvider.getInstance().isForbiddenName(name) || c.isGm()) && (c.isGm() || c.canMakeCharacter(c.getWorld()))) { MapleCharacter.saveNewCharToDB(newchar, jobType, db); c.getSession().write(LoginPacket.addNewCharEntry(newchar, true)); c.createdChar(newchar.getId()); } else { c.getSession().write(LoginPacket.addNewCharEntry(newchar, false)); } }
public static void MTSOperation(final LittleEndianAccessor slea, final MapleClient c) { final MTSCart cart = MTSStorage.getInstance().getCart(c.getPlayer().getId()); // System.out.println(slea.toString()); if (slea.available() <= 0) { doMTSPackets(cart, c); return; } final byte op = slea.readByte(); if (op == 2) { // put up for sale final byte invType = slea.readByte(); // 1 = equip 2 = everything else if (invType != 1 && invType != 2) { // pet? c.getSession().write(MTSCSPacket.getMTSFailSell()); doMTSPackets(cart, c); return; } final int itemid = slea.readInt(); // itemid if (slea.readByte() != 0) { c.getSession().write(MTSCSPacket.getMTSFailSell()); doMTSPackets(cart, c); return; // we don't like uniqueIDs } slea.skip(12); // expiration, -1, don't matter short stars = 1, quantity = 1; byte slot = 0; if (invType == 1) { slea.skip(32); } else { stars = slea.readShort(); // the entire quantity of the item } slea.readMapleAsciiString(); // owner // again? =/ if (invType == 1) { slea.skip(50); slot = (byte) slea.readInt(); slea.skip(4); // skip the quantity int, equips are always 1 } else { slea.readShort(); // flag if (GameConstants.isThrowingStar(itemid) || GameConstants.isBullet(itemid)) { slea.skip(8); // recharge ID thing } slot = (byte) slea.readInt(); if (GameConstants.isThrowingStar(itemid) || GameConstants.isBullet(itemid)) { quantity = stars; // this is due to stars you need to use the entire quantity, not specified slea.skip(4); // so just skip the quantity int } else { quantity = (short) slea.readInt(); // specified quantity } } final int price = slea.readInt(); final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); final MapleInventoryType type = GameConstants.getInventoryType(itemid); final Item item = c.getPlayer().getInventory(type).getItem(slot).copy(); if (ii.isCash(itemid) || quantity <= 0 || item == null || item.getQuantity() <= 0 || item.getItemId() != itemid || item.getUniqueId() > 0 || item.getQuantity() < quantity || price < ServerConstants.MIN_MTS || c.getPlayer().getMeso() < ServerConstants.MTS_MESO || cart.getNotYetSold().size() >= 10 || ii.isDropRestricted(itemid) || ii.isAccountShared(itemid) || item.getExpiration() > -1 || item.getFlag() > 0) { c.getSession().write(MTSCSPacket.getMTSFailSell()); doMTSPackets(cart, c); return; } if (type == MapleInventoryType.EQUIP) { final Equip eq = (Equip) item; if (eq.getState() > 0 || eq.getEnhance() > 0 || eq.getDurability() > -1) { c.getSession().write(MTSCSPacket.getMTSFailSell()); doMTSPackets(cart, c); return; } } if (quantity >= 50 && item.getItemId() == 2340000) { c.setMonitored(true); // hack check } final long expiration = (System.currentTimeMillis() + (7L * 24 * 60 * 60 * 1000)); item.setQuantity(quantity); MTSStorage.getInstance() .addToBuyNow( cart, item, price, c.getPlayer().getId(), c.getPlayer().getName(), expiration); MapleInventoryManipulator.removeFromSlot(c, type, slot, quantity, false); c.getPlayer().gainMeso(-ServerConstants.MTS_MESO, false); c.getSession().write(MTSCSPacket.getMTSConfirmSell()); } else if (op == 5) { // change page/tab cart.changeInfo(slea.readInt(), slea.readInt(), slea.readInt()); } else if (op == 6) { // search cart.changeInfo(slea.readInt(), slea.readInt(), 0); slea.readInt(); // always 0? cart.changeCurrentView( MTSStorage.getInstance() .getSearch( slea.readInt() > 0, slea.readMapleAsciiString(), cart.getType(), cart.getTab())); } else if (op == 7) { // cancel sale if (!MTSStorage.getInstance().removeFromBuyNow(slea.readInt(), c.getPlayer().getId(), true)) { c.getSession().write(MTSCSPacket.getMTSFailCancel()); } else { c.getSession().write(MTSCSPacket.getMTSConfirmCancel()); sendMTSPackets(cart, c, true); return; } } else if (op == 8) { // transfer item final int id = Integer.MAX_VALUE - slea.readInt(); // fake id if (id >= cart.getInventory().size()) { c.getPlayer().dropMessage(1, "Please try it again later."); sendMTSPackets(cart, c, true); return; } final Item item = cart.getInventory().get(id); // by index // System.out.println("NumItems: " + cart.getInventory().size() + ", ID: " + id + ", // ItemExists?: " + (item != null)); if (item != null && item.getQuantity() > 0 && MapleInventoryManipulator.checkSpace( c, item.getItemId(), item.getQuantity(), item.getOwner())) { Item item_ = item.copy(); short pos = MapleInventoryManipulator.addbyItem(c, item_, true); if (pos >= 0) { if (item_.getPet() != null) { item_.getPet().setInventoryPosition(pos); c.getPlayer().addPet(item_.getPet()); } cart.removeFromInventory(item); c.getSession() .write( MTSCSPacket.getMTSConfirmTransfer( GameConstants.getInventoryType(item_.getItemId()).getType(), pos)); // IF this is actually pos and pos sendMTSPackets(cart, c, true); return; } else { // System.out.println("addByItem is less than 0"); c.getSession().write(MTSCSPacket.getMTSFailBuy()); } } else { // System.out.println("CheckSpace return false"); c.getSession().write(MTSCSPacket.getMTSFailBuy()); } } else if (op == 9) { // add to cart final int id = slea.readInt(); if (MTSStorage.getInstance().checkCart(id, c.getPlayer().getId()) && cart.addToCart(id)) { c.getSession().write(MTSCSPacket.addToCartMessage(false, false)); } else { c.getSession().write(MTSCSPacket.addToCartMessage(true, false)); } } else if (op == 10) { // delete from cart final int id = slea.readInt(); if (cart.getCart().contains(id)) { cart.removeFromCart(id); c.getSession().write(MTSCSPacket.addToCartMessage(false, true)); } else { c.getSession().write(MTSCSPacket.addToCartMessage(true, true)); } } else if (op == 16 || op == 17) { // buyNow, buy from cart final MTSItemInfo mts = MTSStorage.getInstance().getSingleItem(slea.readInt()); if (mts != null && mts.getCharacterId() != c.getPlayer().getId()) { if (c.getPlayer().getCSPoints(1) > mts.getRealPrice()) { if (MTSStorage.getInstance() .removeFromBuyNow(mts.getId(), c.getPlayer().getId(), false)) { c.getPlayer().modifyCSPoints(1, -mts.getRealPrice(), false); MTSStorage.getInstance().getCart(mts.getCharacterId()).increaseOwedNX(mts.getPrice()); c.getSession().write(MTSCSPacket.getMTSConfirmBuy()); sendMTSPackets(cart, c, true); return; } else { c.getSession().write(MTSCSPacket.getMTSFailBuy()); } } else { c.getSession().write(MTSCSPacket.getMTSFailBuy()); } } else { c.getSession().write(MTSCSPacket.getMTSFailBuy()); } } else if (c.getPlayer().isAdmin()) { // System.out.println("New MTS Op " + op + ", \n" + slea.toString()); } doMTSPackets(cart, c); }