@Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { int cid = slea.readInt(); MapleCharacter player = null; try { player = MapleCharacter.loadCharFromDB(cid, c, true); c.setPlayer(player); } catch (SQLException e) { } c.setAccID(player.getAccountID()); int state = c.getLoginState(); boolean allowLogin = true; ChannelServer cserv = c.getChannelServer(); synchronized (this) { try { WorldChannelInterface worldInterface = cserv.getWorldInterface(); if (state == MapleClient.LOGIN_SERVER_TRANSITION) { for (String charName : c.loadCharacterNames(c.getWorld())) { if (worldInterface.isConnected(charName)) { int chanNum = c.getChannelServer().getWorldInterface().getLocation(charName).channel; System.err.print( charName + " on channel " + chanNum + " has been unstuck, for bug-testing purposes."); MapleCharacter player_to_dc = ChannelServer.getInstance(chanNum) .getPlayerStorage() .getCharacterByName(charName); if (player_to_dc.getEventInstance() != null) player_to_dc.getEventInstance().removePlayer(player_to_dc); player_to_dc.getMap().removePlayer(player_to_dc); ChannelServer.getInstance(chanNum).removePlayer(player_to_dc); player_to_dc.getClient().disconnect(); player_to_dc.getClient().getSession().close(); c.disconnect(); allowLogin = false; break; } } } } catch (RemoteException e) { cserv.reconnectWorld(); allowLogin = false; } catch (Exception e) { System.out.println("Error unsticking char:"); e.printStackTrace(); } if (state != MapleClient.LOGIN_SERVER_TRANSITION || !allowLogin) { c.setPlayer(null); c.getSession().close(true); return; } c.updateLoginState(MapleClient.LOGIN_LOGGEDIN); } cserv.addPlayer(player); try { List<PlayerBuffValueHolder> buffs = cserv.getWorldInterface().getBuffsFromStorage(cid); if (buffs != null) { c.getPlayer().silentGiveBuffs(buffs); } } catch (RemoteException e) { cserv.reconnectWorld(); } Connection con = DatabaseConnection.getConnection(); try { PreparedStatement ps = con.prepareStatement("SELECT SkillID,StartTime,length FROM cooldowns WHERE charid = ?"); ps.setInt(1, c.getPlayer().getId()); ResultSet rs = ps.executeQuery(); while (rs.next()) { final long length = rs.getLong("length"), startTime = rs.getLong("StartTime"); if (length + startTime > System.currentTimeMillis()) { c.getPlayer().giveCoolDowns(rs.getInt("SkillID"), startTime, length); } } rs.close(); ps.close(); ps = con.prepareStatement("DELETE FROM cooldowns WHERE charid = ?"); ps.setInt(1, c.getPlayer().getId()); ps.executeUpdate(); ps.close(); ps = con.prepareStatement( "SELECT Mesos FROM dueypackages WHERE RecieverId = ? and Checked = 1"); ps.setInt(1, c.getPlayer().getId()); rs = ps.executeQuery(); if (rs.next()) { try { PreparedStatement pss = DatabaseConnection.getConnection() .prepareStatement("UPDATE dueypackages SET Checked = 0 where RecieverId = ?"); pss.setInt(1, c.getPlayer().getId()); pss.executeUpdate(); pss.close(); } catch (SQLException e) { } c.getSession().write(MaplePacketCreator.sendDueyMSG((byte) 0x1B)); } rs.close(); ps.close(); rs = null; ps = null; } catch (SQLException e) { e.printStackTrace(); } c.getSession().write(MaplePacketCreator.getCharInfo(player)); c.getPlayer().InitiateSaveEvent(); if (player.isGM()) { SkillFactory.getSkill(GM.HIDE).getEffect(1).applyTo(player); } player.sendKeymap(); player.sendMacros(); player.getMap().addPlayer(player); try { int buddyIds[] = player.getBuddylist().getBuddyIds(); cserv .getWorldInterface() .loggedOn(player.getName(), player.getId(), c.getChannel(), buddyIds); for (CharacterIdChannelPair onlineBuddy : cserv.getWorldInterface().multiBuddyFind(player.getId(), buddyIds)) { BuddylistEntry ble = player.getBuddylist().get(onlineBuddy.getCharacterId()); ble.setChannel(onlineBuddy.getChannel()); player.getBuddylist().put(ble); } c.getSession().write(MaplePacketCreator.updateBuddylist(player.getBuddylist().getBuddies())); } catch (RemoteException e) { cserv.reconnectWorld(); } /* c.getSession().write(MaplePacketCreator.loadFamily(player)); if (player.getFamilyId() > 0) { c.getSession().write(MaplePacketCreator.getFamilyInfo(player)); }*/ if (player.getGuildId() > 0) { try { MapleGuild playerGuild = cserv.getWorldInterface().getGuild(player.getGuildId(), player.getMGC()); if (playerGuild == null) { player.deleteGuild(player.getGuildId()); player.resetMGC(); player.setGuildId(0); } else { cserv.getWorldInterface().setGuildMemberOnline(player.getMGC(), true, c.getChannel()); c.getSession().write(MaplePacketCreator.showGuildInfo(player)); int allianceId = player.getGuild().getAllianceId(); if (allianceId > 0) { MapleAlliance newAlliance = cserv.getWorldInterface().getAlliance(allianceId); if (newAlliance == null) { newAlliance = MapleAlliance.loadAlliance(allianceId); if (newAlliance != null) { cserv.getWorldInterface().addAlliance(allianceId, newAlliance); } else { player.getGuild().setAllianceId(0); } } if (newAlliance != null) { c.getSession().write(MaplePacketCreator.getAllianceInfo(newAlliance)); c.getSession().write(MaplePacketCreator.getGuildAlliances(newAlliance, c)); cserv .getWorldInterface() .allianceMessage( allianceId, MaplePacketCreator.allianceMemberOnline(player, true), player.getId(), -1); } } } } catch (RemoteException e) { cserv.reconnectWorld(); } } try { // c.getPlayer().showNote(); if (player.getParty() != null) { cserv .getWorldInterface() .updateParty( player.getParty().getId(), PartyOperation.LOG_ONOFF, new MaplePartyCharacter(player)); } player.updatePartyMemberHP(); } catch (RemoteException e) { cserv.reconnectWorld(); } for (MapleQuestStatus status : player.getStartedQuests()) { if (status.hasMobKills()) { c.getSession().write(MaplePacketCreator.updateQuestMobKills(status)); } } CharacterNameAndId pendingBuddyRequest = player.getBuddylist().pollPendingRequest(); if (pendingBuddyRequest != null) { player .getBuddylist() .put( new BuddylistEntry( pendingBuddyRequest.getName(), "그룹 미지정", pendingBuddyRequest.getId(), -1, false)); c.getSession() .write( MaplePacketCreator.requestBuddylistAdd( pendingBuddyRequest.getId(), c.getPlayer().getId(), pendingBuddyRequest.getName(), 0, 0)); // todo: make actual levels / jobids appear } c.getSession().write(MaplePacketCreator.updateBuddylist(player.getBuddylist().getBuddies())); // c.getSession().write(MaplePacketCreator.updateGender(player)); player.checkMessenger(); // c.getSession().write(MaplePacketCreator.enableReport()); /* if (!player.isGM() && !player.hasWatchedCygnusIntro() && player.getLevel() > 19 && !player.isCygnus() && player.getCygnusLinkId() == 0) { player.startCygnusIntro(); player.setWatchedCygnusIntro(true); }*/ // unneeded in 83+ as cygnus is created at char select ISkill bof = SkillFactory.getSkill( 10000000 * player.getJobType() + 12); // todo: find opcode and re-enable player.changeSkillLevel(bof, player.getLinkedLevel() / 10, bof.getMaxLevel()); player.checkBerserk(); player.expirationTask(); player.setRates(false); }
public static void EnterFarm(final CharacterTransfer transfer, final MapleClient c) { if (transfer == null) { c.getSession().close(true); return; } MapleCharacter chr = MapleCharacter.ReconstructChr(transfer, c, false); c.setPlayer(chr); c.setAccID(chr.getAccountID()); if (!c.CheckIPAddress()) { // Remote hack c.getSession().close(true); return; } final int state = c.getLoginState(); boolean allowLogin = false; if (state == MapleClient.LOGIN_SERVER_TRANSITION || state == MapleClient.CHANGE_CHANNEL) { if (!World.isCharacterListConnected(c.loadCharacterNames(c.getWorld()))) { allowLogin = true; } } if (!allowLogin) { c.setPlayer(null); c.getSession().close(true); return; } c.updateLoginState(MapleClient.LOGIN_LOGGEDIN, c.getSessionIPAddress()); FarmServer.getPlayerStorage().registerPlayer(chr); c.getSession().write(FarmPacket.updateMonster(new LinkedList())); c.getSession().write(FarmPacket.enterFarm(c)); c.getSession().write(FarmPacket.farmQuestData(new LinkedList(), new LinkedList())); c.getSession().write(FarmPacket.updateMonsterInfo(new LinkedList())); c.getSession().write(FarmPacket.updateAesthetic(c.getFarm().getAestheticPoints())); c.getSession().write(FarmPacket.spawnFarmMonster1()); c.getSession().write(FarmPacket.farmPacket1()); c.getSession().write(FarmPacket.updateFarmFriends(new LinkedList())); c.getSession().write(FarmPacket.updateFarmInfo(c)); // c.getSession().write(CField.getPacketFromHexString("19 72 1E 02 00 00 00 00 00 00 00 00 00 00 // 00 00 0B 00 43 72 65 61 74 69 6E 67 2E 2E 2E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // 00 00 00 00 02 00 00 00 00 00 00 00 00 01 00 00 00 00 0B 00 43 72 65 61 74 69 6E 67 2E 2E 2E // 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 01 00 // 00 00 00 00 00 00 00 FF FF FF FF 00")); c.getSession().write(FarmPacket.updateQuestInfo(21002, (byte) 1, "")); SimpleDateFormat sdfGMT = new SimpleDateFormat("yyyy-MM-dd-HH-mm"); sdfGMT.setTimeZone(TimeZone.getTimeZone("Canada/Pacific")); String timeStr = sdfGMT.format(Calendar.getInstance().getTime()).replaceAll("-", ""); c.getSession().write(FarmPacket.updateQuestInfo(21001, (byte) 1, timeStr)); c.getSession().write(FarmPacket.updateQuestInfo(21003, (byte) 1, "30")); c.getSession().write(FarmPacket.updateUserFarmInfo(chr, false)); List<Pair<MapleFarm, Integer>> ranking = new LinkedList(); ranking.add(new Pair<>(MapleFarm.getDefault(1, c, "Pyrous"), 999999)); ranking.add(new Pair<>(MapleFarm.getDefault(1, c, "Sango"), 1)); ranking.add(new Pair<>(MapleFarm.getDefault(1, c, "Hemmi"), -1)); c.getSession().write(FarmPacket.sendFarmRanking(chr, ranking)); c.getSession() .write( FarmPacket.updateAvatar(new Pair<>(WorldConstants.getMainWorld(), chr), null, false)); if (c.getFarm().getName().equals("Creating...")) { c.getSession().write(FarmPacket.updateQuestInfo(1111, (byte) 0, "A1/")); c.getSession().write(FarmPacket.updateQuestInfo(2001, (byte) 0, "A1/")); } }