package handling.channel.handler; import client.MapleBuffStat; import client.MapleCharacter; import client.MapleClient; import client.Skill; import client.SkillFactory; import handling.cashshop.CashShopServer; import handling.cashshop.handler.CashShopOperation; import handling.channel.ChannelServer; import handling.login.LoginServer; import handling.world.CharacterIdChannelPair; import handling.world.CharacterTransfer; import handling.world.PartyOperation; import handling.world.PlayerBuffStorage; import handling.world.World; import handling.world.WorldBuddyService; import handling.world.WorldFindService; import handling.world.WorldGuildService; import handling.world.WorldMessengerService; import handling.world.WorldSidekickService; import handling.world.WrodlPartyService; import handling.world.guild.MapleGuild; import handling.world.messenger.MapleMessenger; import handling.world.messenger.MapleMessengerCharacter; import handling.world.party.MapleExpedition; import handling.world.party.MapleParty; import handling.world.party.MaplePartyCharacter; import java.util.List; import javax.swing.table.DefaultTableModel; import org.apache.log4j.Logger; import server.ManagerSin; import server.maps.FieldLimitType; import tools.FileoutputUtil; import tools.MaplePacketCreator; import tools.Triple; import tools.data.input.SeekableLittleEndianAccessor; import tools.packet.GuildPacket; import tools.packet.PartyPacket; public class InterServerHandler { /** * 进入商城 * @param c * @param chr */ public static void EnterCS(MapleClient c, MapleCharacter chr) { if ((chr == null) || (chr.hasBlockedInventory()) || (chr.getMap() == null) || (chr.getEventInstance() != null) || (c.getChannelServer() == null)) { c.getSession().write(MaplePacketCreator.serverBlocked(2)); c.getSession().write(MaplePacketCreator.enableActions()); return; } if ((!chr.isAlive())) { String msg = "无法进入商城,请稍后再试。"; if (!chr.isAlive()) { msg = "现在不能进入商城."; } c.getPlayer().dropMessage(1, msg); c.getSession().write(MaplePacketCreator.enableActions()); return; } if (World.getPendingCharacterSize() >= 10) { chr.dropMessage(1, "服务器忙,请稍后在试。"); c.getSession().write(MaplePacketCreator.enableActions()); return; } ChannelServer ch = ChannelServer.getInstance(c.getChannel()); chr.changeRemoval(); if (chr.getBuffedValue(MapleBuffStat.召唤兽) != null) { chr.cancelEffectFromBuffStat(MapleBuffStat.召唤兽, -1); } PlayerBuffStorage.addBuffsToStorage(chr.getId(), chr.getAllBuffs()); PlayerBuffStorage.addCooldownsToStorage(chr.getId(), chr.getCooldowns()); // PlayerBuffStorage.addDiseaseToStorage(chr.getId(), chr.getAllDiseases()); //chr.cancelAllBuffs(); World.ChannelChange_Data(new CharacterTransfer(chr), chr.getId(), -10); ch.removePlayer(chr); c.updateLoginState(MapleClient.CHANGE_CHANNEL, c.getSessionIPAddress()); chr.saveToDB(false, false); if (chr.getMessenger() != null) { MapleMessengerCharacter messengerplayer = new MapleMessengerCharacter(chr); WorldMessengerService.getInstance().leaveMessenger(chr.getMessenger().getId(), messengerplayer); } chr.getMap().removePlayer(chr); c.getSession().write(MaplePacketCreator.getChannelChange(c, Integer.parseInt(CashShopServer.getIP().split(":")[1]))); // CharacterTransfer transfer = CashShopServer.getPlayerStorage().getPendingCharacter(chr.getId()); // CashShopOperation.EnterCS(transfer, c); c.setPlayer(null); c.setReceiving(false); try { int countRows = ManagerSin.jTable1.getRowCount();//获取当前表格总行数 for (int i = 0; i < countRows; i++) { String sname = ManagerSin.jTable1.getValueAt(i, 1).toString(); if (sname.equals(chr.getName())) { ((DefaultTableModel) ManagerSin.jTable1.getModel()).setValueAt("现金商城", i, 4); break; } } } catch (Exception e) { FileoutputUtil.outputFileError(FileoutputUtil.GUI_Ex_Log, e); } } /** * 登录游戏 * * @param playerid 角色ID * @param c 客户端连接 */ public static void Loggedin(final int playerid, final MapleClient c) { try { CharacterTransfer transfer = CashShopServer.getPlayerStorage().getPendingCharacter(playerid); if (transfer != null) { CashShopOperation.EnterCS(transfer, c); return; } for (ChannelServer cserv : ChannelServer.getAllInstances()) { transfer = cserv.getPlayerStorage().getPendingCharacter(playerid); if (transfer != null) { c.setChannel(cserv.getChannel()); break; } } MapleCharacter player; if (transfer == null) { Triple ip = LoginServer.getLoginAuth(playerid); String s = c.getSessionIPAddress(); if ((ip == null) || (!s.substring(s.indexOf(47) + 1, s.length()).equals(ip.left))) { if (ip != null) { LoginServer.putLoginAuth(playerid, (String) ip.left, (String) ip.mid, (Integer) ip.right); } c.getSession().close(true); return; } c.setTempIP((String) ip.mid); c.setChannel((Integer) ip.right); player = MapleCharacter.loadCharFromDB(playerid, c, true); } else { player = MapleCharacter.ReconstructChr(transfer, c, true); } ChannelServer channelServer = c.getChannelServer(); c.setPlayer(player); c.setAccID(player.getAccountID()); if (!c.CheckIPAddress()) { c.getSession().close(true); FileoutputUtil.log(new StringBuilder().append("检测连接地址 - 2 ").append(!c.CheckIPAddress()).toString()); return; } int state = c.getLoginState(); boolean allowLogin = false; if ((state == 1) || (state == 3) || (state == 0)) { allowLogin = !World.isCharacterListConnected(c.loadCharacterNames(c.getWorld())); } if (!allowLogin) { c.setPlayer(null); c.getSession().close(true); FileoutputUtil.log(new StringBuilder().append("检测连接地址 - 3 ").append(!allowLogin).toString()); return; } c.updateLoginState(MapleClient.LOGIN_LOGGEDIN, c.getSessionIPAddress()); channelServer.addPlayer(player); player.setlogintime(System.currentTimeMillis()); player.giveCoolDowns(PlayerBuffStorage.getCooldownsFromStorage(player.getId())); player.silentGiveBuffs(PlayerBuffStorage.getBuffsFromStorage(player.getId())); player.giveSilentDebuff(PlayerBuffStorage.getDiseaseFromStorage(player.getId())); // c.getSession().write(MaplePacketCreator.cancelTitleEffect(new int[]{-1, -1, -1, -1, -1})); c.getSession().write(MaplePacketCreator.getCharInfo(player)); // c.getSession().write(MTSCSPacket.enableCSUse(0)); // c.getSession().write(MaplePacketCreator.sendloginSuccess()); player.getMap().addPlayer(player); if (player.getMount() != null) { //c.getSession().write(MaplePacketCreator.updateMount(player, false)); } //c.getSession().write(MaplePacketCreator.getKeymap(player)); //c.getSession().write(MaplePacketCreator.getQuickSlot(player.getQuickSlot())); // player.updatePetAuto(); // player.sendMacros(); //c.getSession().write(MaplePacketCreator.showCharCash(player)); //c.getSession().write(MaplePacketCreator.reportResponse(0, 0)); //c.getSession().write(MaplePacketCreator.enableReport()); //c.getSession().write(MaplePacketCreator.temporaryStats_Reset()); // c.getSession().write(MaplePacketCreator.enableActions()); int[] buddyIds = player.getBuddylist().getBuddyIds(); WorldBuddyService.getInstance().loggedOn(player.getName(), player.getId(), c.getChannel(), buddyIds); //c.getSession().write(MaplePacketCreator.pendantSlot((stat != null) && (stat.getCustomData() != null) && (Long.parseLong(stat.getCustomData()) > System.currentTimeMillis()))); //c.getSession().write(InventoryPacket.updateInventory()); MapleParty party = player.getParty(); if (party != null) { WrodlPartyService.getInstance().updateParty(party.getId(), PartyOperation.LOG_ONOFF, new MaplePartyCharacter(player)); } if (player.getSidekick() == null) { player.setSidekick(WorldSidekickService.getInstance().getSidekickByChr(player.getId())); } if (player.getSidekick() != null) { c.getSession().write(PartyPacket.updateSidekick(player, player.getSidekick(), false)); } CharacterIdChannelPair[] onlineBuddies = WorldFindService.getInstance().multiBuddyFind(player.getId(), buddyIds); for (CharacterIdChannelPair onlineBuddy : onlineBuddies) { player.getBuddylist().get(onlineBuddy.getCharacterId()).setChannel(onlineBuddy.getChannel()); } //c.getSession().write(BuddyListPacket.updateBuddylist(player.getBuddylist().getBuddies(), player.getId())); //c.getSession().write(BuddyListPacket.updateBuddylist(0x1F)); MapleMessenger messenger = player.getMessenger(); if (messenger != null) { WorldMessengerService.getInstance().silentJoinMessenger(messenger.getId(), new MapleMessengerCharacter(player)); WorldMessengerService.getInstance().updateMessenger(messenger.getId(), player.getName(), c.getChannel()); } if (player.getGuildId() > 0) { WorldGuildService.getInstance().setGuildMemberOnline(player.getMGC(), true, c.getChannel()); c.getSession().write(GuildPacket.showGuildInfo(player)); MapleGuild gs = WorldGuildService.getInstance().getGuild(player.getGuildId()); if (gs != null) { /// List<byte[]> packetList = World.Alliance.getAllianceInfo(gs.getAllianceId(), true); } else { player.setGuildId(0); player.setGuildRank((byte) 5); player.setAllianceRank((byte) 5); player.saveGuildStatus(); } } player.getClient().getSession().write(MaplePacketCreator.serverMessageTop("欢迎来到怀旧冒×岛,希望你能找到儿时的感觉,查看可用命令@help 如有bug可以加QQ群:479357604!dev by:icelemon1314")); // player.showNote(); // player.sendImp(); // player.updatePartyMemberHP(); // player.startFairySchedule(false); // player.baseSkills(); // player.expirationTask(); // player.spawnSavedPets(); // if (player.getStat().equippedSummon > 0) { // 装备召唤? // Skill skill = SkillFactory.getSkill(player.getStat().equippedSummon); // if (skill != null) { // skill.getEffect(1).applyTo(player); // } // } // if (player.isIntern()) { // SkillFactory.getSkill(9001004).getEffect(1).applyTo(player); // SkillFactory.getSkill(1010).getEffect(1).applyTo(player); // } } catch (NumberFormatException e) { FileoutputUtil.outputFileError(FileoutputUtil.Login_Error, e); } } /** * 更换频道 * @param slea * @param c * @param chr */ public static void ChangeChannel(SeekableLittleEndianAccessor slea, MapleClient c, MapleCharacter chr) { // if ((chr == null) || (chr.hasBlockedInventory()) || (chr.getEventInstance() != null) || (chr.getMap() == null) || (chr.isInBlockedMap()) || (FieldLimitType.ChannelSwitch.check(chr.getMap().getFieldLimit()))) { // chr.dropMessage(5, "FieldLimitType!"); // c.getSession().write(MaplePacketCreator.enableActions()); // return; // } if (World.getPendingCharacterSize() >= 10) { chr.dropMessage(1, "服务器忙,请稍后在试。"); c.getSession().write(MaplePacketCreator.enableActions()); return; } int chc = slea.readByte() + 1; if (!World.isChannelAvailable(chc)) { chr.dropMessage(1, "该频道玩家已满,请切换到其它频道进行游戏。"); c.getSession().write(MaplePacketCreator.enableActions()); return; } chr.changeChannel(chc); } }