public void reloadGuildCharacters(int world) { World worlda = getWorld(world); for (MapleCharacter mc : worlda.getPlayerStorage().getAllCharacters()) { if (mc.getGuildId() > 0) { setGuildMemberOnline(mc.getMGC(), true, worlda.getId()); memberLevelJobUpdate(mc.getMGC()); } } worlda.reloadGuildSummary(); }
@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); }
/** * 角色快照数据 * * @param chr */ public CharacterTransfer(MapleCharacter chr) { this.characterid = chr.getId(); this.accountid = chr.getAccountID(); this.accountname = chr.getClient().getAccountName(); this.channel = (byte) chr.getClient().getChannel(); this.ACash = chr.getCSPoints(1); this.MaplePoints = chr.getCSPoints(2); this.vpoints = chr.getVPoints(); this.name = chr.getName(); this.fame = chr.getFame(); this.love = chr.getLove(); this.gender = chr.getClient().getGender(); this.level = chr.getLevel(); this.str = chr.getStat().getStr(); this.dex = chr.getStat().getDex(); this.int_ = chr.getStat().getInt(); this.luk = chr.getStat().getLuk(); this.hp = chr.getStat().getHp(); this.mp = chr.getStat().getMp(); this.maxhp = chr.getStat().getMaxHp(); this.maxmp = chr.getStat().getMaxMp(); this.exp = chr.getExp(); this.hpApUsed = chr.getHpApUsed(); this.remainingAp = chr.getRemainingAp(); this.remainingSp = chr.getRemainingSp(); this.meso = chr.getMeso(); this.pvpExp = chr.getTotalBattleExp(); this.pvpPoints = chr.getBattlePoints(); this.skinColor = chr.getSkinColor(); this.job = chr.getJob(); this.hair = chr.getHair(); this.face = chr.getFace(); this.mapid = chr.getMapId(); this.initialSpawnPoint = chr.getInitialSpawnpoint(); this.marriageId = chr.getMarriageId(); this.world = chr.getWorld(); this.guildid = chr.getGuildId(); this.guildrank = chr.getGuildRank(); this.guildContribution = chr.getGuildContribution(); this.alliancerank = chr.getAllianceRank(); this.gmLevel = (byte) chr.getGMLevel(); this.points = chr.getPoints(); this.fairyExp = chr.getFairyExp(); this.petStore = chr.getPetStores(); this.subcategory = chr.getSubcategory(); this.imps = chr.getImps(); this.fatigue = chr.getFatigue(); this.currentrep = chr.getCurrentRep(); this.totalrep = chr.getTotalRep(); this.totalWins = chr.getTotalWins(); this.totalLosses = chr.getTotalLosses(); this.gachexp = chr.getGachExp(); this.boxed = chr.getBoxed(); this.familiars = chr.getFamiliars(); this.tempIP = chr.getClient().getTempIP(); this.decorate = chr.getDecorate(); this.dollars = chr.getDollars(); this.shareLots = chr.getShareLots(); this.apstorage = chr.getAPS(); this.cardStack = chr.getCardStack(); this.morphCount = chr.getMorphCount(); this.powerCount = chr.getPowerCount(); this.playerPoints = chr.getPlayerPoints(); this.playerEnergy = chr.getPlayerEnergy(); this.runningDark = chr.getDarkType(); this.runningDarkSlot = chr.getDarkTotal(); this.runningLight = chr.getLightType(); this.runningLightSlot = chr.getLightTotal(); boolean uneq = false; MaplePet pet = chr.getSpawnPet(); if (this.petStore == 0) { this.petStore = -1; } if (pet != null) { uneq = true; this.petStore = (byte) Math.max(this.petStore, pet.getInventoryPosition()); } if (uneq) { chr.unequipAllSpawnPets(); } if (chr.getSidekick() != null) { this.sidekick = chr.getSidekick().getId(); } else { this.sidekick = 0; } for (BuddylistEntry qs : chr.getBuddylist().getBuddies()) { this.buddies.put( new CharacterNameAndId(qs.getCharacterId(), qs.getName(), qs.getGroup()), qs.isVisible()); } this.buddysize = chr.getBuddyCapacity(); this.partyid = (chr.getParty() == null ? -1 : chr.getParty().getId()); if (chr.getMessenger() != null) { this.messengerid = chr.getMessenger().getId(); } else { this.messengerid = 0; } this.finishedAchievements = chr.getFinishedAchievements(); this.KeyValue = chr.getKeyValue_Map(); this.InfoQuest = chr.getInfoQuest_Map(); for (Map.Entry qs : chr.getQuest_Map().entrySet()) { this.Quest.put(((MapleQuest) qs.getKey()).getId(), qs.getValue()); } this.inventorys = chr.getInventorys(); for (Entry<Skill, SkillEntry> qs : chr.getSkills().entrySet()) { this.Skills.put(((Skill) qs.getKey()).getId(), qs.getValue()); } this.BlessOfFairy = chr.getBlessOfFairyOrigin(); this.BlessOfEmpress = chr.getBlessOfEmpressOrigin(); this.chalkboard = chr.getChalkboard(); this.keymap = chr.getKeyLayout().Layout(); this.quickslot = chr.getQuickSlot().Layout(); this.savedlocation = chr.getSavedLocations(); this.wishlist = chr.getWishlist(); this.regrocks = chr.getRegRocks(); this.famedcharacters = chr.getFamedCharacters(); this.lastfametime = chr.getLastFameTime(); this.storage = chr.getStorage(); this.cs = chr.getCashInventory(); MapleMount mount = chr.getMount(); this.mount_itemid = mount.getItemId(); this.mount_Fatigue = mount.getFatigue(); this.mount_level = mount.getLevel(); this.mount_exp = mount.getExp(); this.battlers = chr.getBattlers(); this.lastLoveTime = chr.getLastLoveTime(); this.loveCharacters = chr.getLoveCharacters(); this.TranferTime = System.currentTimeMillis(); }
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()); }