ChannelWorldInterfaceImpl.java
Upload User: gwt600
Upload Date: 2021-06-03
Package Size: 704k
Code Size: 22k
Category:

Games

Development Platform:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3. Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
  4. Matthias Butz <matze@odinms.de>
  5. Jan Christian Meyer <vimes@odinms.de>
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Affero General Public License version 3
  8. as published by the Free Software Foundation. You may not use, modify
  9. or distribute this program under any other version of the
  10. GNU Affero General Public License.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU Affero General Public License for more details.
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. package net.sf.odinms.net.channel;
  19. import java.rmi.RemoteException;
  20. import java.rmi.server.UnicastRemoteObject;
  21. import java.sql.SQLException;
  22. import java.util.ArrayList;
  23. import java.util.Collections;
  24. import java.util.List;
  25. import javax.rmi.ssl.SslRMIClientSocketFactory;
  26. import javax.rmi.ssl.SslRMIServerSocketFactory;
  27. import org.slf4j.Logger;
  28. import org.slf4j.LoggerFactory;
  29. import net.sf.odinms.client.BuddyList;
  30. import net.sf.odinms.client.BuddylistEntry;
  31. import net.sf.odinms.client.MapleCharacter;
  32. import net.sf.odinms.client.MapleCharacterUtil;
  33. import net.sf.odinms.client.BuddyList.BuddyAddResult;
  34. import net.sf.odinms.client.BuddyList.BuddyOperation;
  35. import net.sf.odinms.client.MaplePet;
  36. import net.sf.odinms.database.DatabaseConnection;
  37. import net.sf.odinms.net.ByteArrayMaplePacket;
  38. import net.sf.odinms.net.MaplePacket;
  39. import net.sf.odinms.net.channel.remote.ChannelWorldInterface;
  40. import net.sf.odinms.net.world.MapleMessenger;
  41. import net.sf.odinms.net.world.MapleMessengerCharacter;
  42. import net.sf.odinms.net.world.MapleParty;
  43. import net.sf.odinms.net.world.MaplePartyCharacter;
  44. import net.sf.odinms.net.world.PartyOperation;
  45. import net.sf.odinms.net.world.guild.MapleGuildSummary;
  46. import net.sf.odinms.net.world.remote.CheaterData;
  47. import net.sf.odinms.server.ShutdownServer;
  48. import net.sf.odinms.server.TimerManager;
  49. import net.sf.odinms.tools.CollectionUtil;
  50. import net.sf.odinms.tools.MaplePacketCreator;
  51. /**
  52.  *
  53.  * @author Matze
  54.  */
  55. public class ChannelWorldInterfaceImpl extends UnicastRemoteObject implements ChannelWorldInterface {
  56.     private static final long serialVersionUID = 7815256899088644192L;
  57.     private ChannelServer server;
  58.     public ChannelWorldInterfaceImpl() throws RemoteException {
  59.         super(0, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory());
  60.     }
  61.     public ChannelWorldInterfaceImpl(ChannelServer server) throws RemoteException {
  62.         super(0, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory());
  63.         this.server = server;
  64.     }
  65.     public void setChannelId(int id) throws RemoteException {
  66.         server.setChannel(id);
  67.     }
  68.     public int getChannelId() throws RemoteException {
  69.         return server.getChannel();
  70.     }
  71.     public String getIP() throws RemoteException {
  72.         return server.getIP();
  73.     }
  74.     public void broadcastMessage(String sender, byte[] message) throws RemoteException {
  75.         MaplePacket packet = new ByteArrayMaplePacket(message);
  76.         server.broadcastPacket(packet);
  77.     }
  78.     public void whisper(String sender, String target, int channel, String message) throws RemoteException {
  79.         if (isConnected(target)) {
  80.             server.getPlayerStorage().getCharacterByName(target).getClient().getSession().write(
  81.                     MaplePacketCreator.getWhisper(sender, channel, message));
  82.         }
  83.     }
  84.     public boolean isConnected(String charName) throws RemoteException {
  85.         return server.getPlayerStorage().getCharacterByName(charName) != null;
  86.     }
  87.     public MapleCharacter getPlayer(String charName) throws RemoteException {
  88.         return server.getPlayerStorage().getCharacterByName(charName);
  89.     }
  90.     public void shutdown(int time) throws RemoteException {
  91.         server.broadcastPacket(
  92.                 MaplePacketCreator.serverNotice(0, "The world will be shut down in " + (time / 60000) + " minutes, please log off safely"));
  93.         TimerManager.getInstance().schedule(new ShutdownServer(server.getChannel()), time);
  94.     }
  95.     public int getConnected() throws RemoteException {
  96.         return server.getConnectedClients();
  97.     }
  98.     @Override
  99.     public void loggedOff(String name, int characterId, int channel, int[] buddies) throws RemoteException {
  100.         updateBuddies(characterId, channel, buddies, true);
  101.     }
  102.     @Override
  103.     public void loggedOn(String name, int characterId, int channel, int buddies[]) throws RemoteException {
  104.         updateBuddies(characterId, channel, buddies, false);
  105.     }
  106.     private void updateBuddies(int characterId, int channel, int[] buddies, boolean offline) {
  107.         IPlayerStorage playerStorage = server.getPlayerStorage();
  108.         for (int buddy : buddies) {
  109.             MapleCharacter chr = playerStorage.getCharacterById(buddy);
  110.             if (chr != null) {
  111.                 BuddylistEntry ble = chr.getBuddylist().get(characterId);
  112.                 if (ble != null && ble.isVisible()) {
  113.                     int mcChannel;
  114.                     if (offline) {
  115.                         ble.setChannel(-1);
  116.                         mcChannel = -1;
  117.                     } else {
  118.                         ble.setChannel(channel);
  119.                         mcChannel = channel - 1;
  120.                     }
  121.                     chr.getBuddylist().put(ble);
  122.                     chr.getClient().getSession().write(MaplePacketCreator.updateBuddyChannel(ble.getCharacterId(), mcChannel));
  123.                 }
  124.             }
  125.         }
  126.     }
  127.     @Override
  128.     public void updateParty(MapleParty party, PartyOperation operation, MaplePartyCharacter target) throws RemoteException {
  129.         for (MaplePartyCharacter partychar : party.getMembers()) {
  130.             if (partychar.getChannel() == server.getChannel()) {
  131.                 MapleCharacter chr = server.getPlayerStorage().getCharacterByName(partychar.getName());
  132.                 if (chr != null) {
  133.                     if (operation == PartyOperation.DISBAND) {
  134.                         chr.setParty(null);
  135.                     } else {
  136.                         chr.setParty(party);
  137.                     }
  138.                     chr.getClient().getSession().write(MaplePacketCreator.updateParty(chr.getClient().getChannel(), party, operation, target));
  139.                 }
  140.             }
  141.         }
  142.         switch (operation) {
  143.             case LEAVE:
  144.             case EXPEL:
  145.                 if (target.getChannel() == server.getChannel()) {
  146.                     MapleCharacter chr = server.getPlayerStorage().getCharacterByName(target.getName());
  147.                     if (chr != null) {
  148.                         chr.getClient().getSession().write(MaplePacketCreator.updateParty(chr.getClient().getChannel(), party, operation, target));
  149.                         chr.setParty(null);
  150.                     }
  151.                 }
  152.         }
  153.     }
  154.     @Override
  155.     public void partyChat(MapleParty party, String chattext, String namefrom) throws RemoteException {
  156.         for (MaplePartyCharacter partychar : party.getMembers()) {
  157.             if (partychar.getChannel() == server.getChannel() && !(partychar.getName().equals(namefrom))) {
  158.                 MapleCharacter chr = server.getPlayerStorage().getCharacterByName(partychar.getName());
  159.                 if (chr != null) {
  160.                     chr.getClient().getSession().write(MaplePacketCreator.multiChat(namefrom, chattext, 1));
  161.                 }
  162.             }
  163.         }
  164.     }
  165.     public boolean isAvailable() throws RemoteException {
  166.         return true;
  167.     }
  168.     public int getLocation(String name) throws RemoteException {
  169.         MapleCharacter chr = server.getPlayerStorage().getCharacterByName(name);
  170.         if (chr != null) {
  171.             return server.getPlayerStorage().getCharacterByName(name).getMapId();
  172.         }
  173.         return -1;
  174.     }
  175.     public List<CheaterData> getCheaters() throws RemoteException {
  176.         List<CheaterData> cheaters = new ArrayList<CheaterData>();
  177.         List<MapleCharacter> allplayers = new ArrayList<MapleCharacter>(server.getPlayerStorage().getAllCharacters());
  178.         /*Collections.sort(allplayers, new Comparator<MapleCharacter>() {
  179.         @Override
  180.         public int compare(MapleCharacter o1, MapleCharacter o2) {
  181.         int thisVal = o1.getCheatTracker().getPoints();
  182.         int anotherVal = o2.getCheatTracker().getPoints();
  183.         return (thisVal<anotherVal ? 1 : (thisVal==anotherVal ? 0 : -1));
  184.         }
  185.         });*/
  186.         for (int x = allplayers.size() - 1; x >= 0; x--) {
  187.             MapleCharacter cheater = allplayers.get(x);
  188.             if (cheater.getCheatTracker().getPoints() > 0) {
  189.                 cheaters.add(new CheaterData(cheater.getCheatTracker().getPoints(), MapleCharacterUtil.makeMapleReadable(cheater.getName()) + " [ID:" + cheater.getId() + "] " + " (地图:" + cheater.getMapId() + ") " + cheater.getCheatTracker().getSummary()));
  190.                 //cheaters.add(new CheaterData(cheater.getCheatTracker().getPoints(), MapleCharacterUtil.makeMapleReadable(cheater.getName()) + " (" + cheater.getCheatTracker().getPoints() + ") " + cheater.getCheatTracker().getSummary()));
  191.             }
  192.         }
  193.         Collections.sort(cheaters);
  194.         return CollectionUtil.copyFirst(cheaters, 10);
  195.     }
  196.     @Override
  197.     public BuddyAddResult requestBuddyAdd(String addName, int channelFrom, int cidFrom, String nameFrom) {
  198.         MapleCharacter addChar = server.getPlayerStorage().getCharacterByName(addName);
  199.         if (addChar != null) {
  200.             BuddyList buddylist = addChar.getBuddylist();
  201.             if (buddylist.isFull()) {
  202.                 return BuddyAddResult.BUDDYLIST_FULL;
  203.             }
  204.             if (!buddylist.contains(cidFrom)) {
  205.                 buddylist.addBuddyRequest(addChar.getClient(), cidFrom, nameFrom, channelFrom);
  206.             } else {
  207.                 if (buddylist.containsVisible(cidFrom)) {
  208.                     return BuddyAddResult.ALREADY_ON_LIST;
  209.                 }
  210.             }
  211.         }
  212.         return BuddyAddResult.OK;
  213.     }
  214.     @Override
  215.     public boolean isConnected(int characterId) throws RemoteException {
  216.         return server.getPlayerStorage().getCharacterById(characterId) != null;
  217.     }
  218.     @Override
  219.     public void buddyChanged(int cid, int cidFrom, String name, int channel, BuddyOperation operation) {
  220.         MapleCharacter addChar = server.getPlayerStorage().getCharacterById(cid);
  221.         if (addChar != null) {
  222.             BuddyList buddylist = addChar.getBuddylist();
  223.             switch (operation) {
  224.                 case ADDED:
  225.                     if (buddylist.contains(cidFrom)) {
  226.                         buddylist.put(new BuddylistEntry(name, cidFrom, channel, true));
  227.                         addChar.getClient().getSession().write(MaplePacketCreator.updateBuddyChannel(cidFrom, channel - 1));
  228.                     }
  229.                     break;
  230.                 case DELETED:
  231.                     if (buddylist.contains(cidFrom)) {
  232.                         buddylist.put(new BuddylistEntry(name, cidFrom, -1, buddylist.get(cidFrom).isVisible()));
  233.                         addChar.getClient().getSession().write(MaplePacketCreator.updateBuddyChannel(cidFrom, -1));
  234.                     }
  235.                     break;
  236.             }
  237.         }
  238.     }
  239.     @Override
  240.     public void buddyChat(int[] recipientCharacterIds, int cidFrom, String nameFrom, String chattext) throws RemoteException {
  241.         IPlayerStorage playerStorage = server.getPlayerStorage();
  242.         for (int characterId : recipientCharacterIds) {
  243.             MapleCharacter chr = playerStorage.getCharacterById(characterId);
  244.             if (chr != null) {
  245.                 if (chr.getBuddylist().containsVisible(cidFrom)) {
  246.                     chr.getClient().getSession().write(MaplePacketCreator.multiChat(nameFrom, chattext, 0));
  247.                 }
  248.             }
  249.         }
  250.     }
  251.     @Override
  252.     public int[] multiBuddyFind(int charIdFrom, int[] characterIds) throws RemoteException {
  253.         List<Integer> ret = new ArrayList<Integer>(characterIds.length);
  254.         IPlayerStorage playerStorage = server.getPlayerStorage();
  255.         for (int characterId : characterIds) {
  256.             MapleCharacter chr = playerStorage.getCharacterById(characterId);
  257.             if (chr != null) {
  258.                 if (chr.getBuddylist().containsVisible(charIdFrom)) {
  259.                     ret.add(characterId);
  260.                 }
  261.             }
  262.         }
  263.         int[] retArr = new int[ret.size()];
  264.         int pos = 0;
  265.         for (Integer i : ret) {
  266.             retArr[pos++] = i.intValue();
  267.         }
  268.         return retArr;
  269.     }
  270.     @Override
  271.     public void sendPacket(List<Integer> targetIds, MaplePacket packet, int exception) throws RemoteException {
  272.         MapleCharacter c;
  273.         for (int i : targetIds) {
  274.             if (i == exception) {
  275.                 continue;
  276.             }
  277.             c = server.getPlayerStorage().getCharacterById(i);
  278.             if (c != null) {
  279.                 c.getClient().getSession().write(packet);
  280.             }
  281.         }
  282.     }
  283.     @Override
  284.     public void setGuildAndRank(List<Integer> cids, int guildid, int rank,
  285.             int exception) throws RemoteException {
  286.         for (int cid : cids) {
  287.             if (cid != exception) {
  288.                 setGuildAndRank(cid, guildid, rank);
  289.             }
  290.         }
  291.     }
  292.     @Override
  293.     public void setGuildAndRank(int cid, int guildid, int rank) throws RemoteException {
  294.         MapleCharacter mc = server.getPlayerStorage().getCharacterById(cid);
  295.         if (mc == null) {
  296.             // System.out.println("ERROR: cannot find player in given channel");
  297.             return;
  298.         }
  299.         boolean bDifferentGuild;
  300.         if (guildid == -1 && rank == -1) { //just need a respawn
  301.             bDifferentGuild = true;
  302.         } else {
  303.             bDifferentGuild = guildid != mc.getGuildId();
  304.             mc.setGuildId(guildid);
  305.             mc.setGuildRank(rank);
  306.             mc.saveGuildStatus();
  307.         }
  308.         if (bDifferentGuild) {
  309.             mc.getMap().broadcastMessage(mc, MaplePacketCreator.removePlayerFromMap(cid), false);
  310.             mc.getMap().broadcastMessage(mc, MaplePacketCreator.spawnPlayerMapobject(mc), false);
  311.             MaplePet[] pets = mc.getPets();
  312.             for (int i = 0; i < 3; i++) { // stupid spot to shove this..
  313.                 if (pets[i] != null) {
  314.                     mc.getMap().broadcastMessage(mc, MaplePacketCreator.showPet(mc, pets[i], false, false), false);
  315.                 } else {
  316.                     break;
  317.                 }
  318.             }
  319.         }
  320.     }
  321.     @Override
  322.     public void setOfflineGuildStatus(int guildid, byte guildrank, int cid) throws RemoteException {
  323.         Logger log = LoggerFactory.getLogger(this.getClass());
  324.         try {
  325.             java.sql.Connection con = DatabaseConnection.getConnection();
  326.             java.sql.PreparedStatement ps = con.prepareStatement("UPDATE characters SET guildid = ?, guildrank = ? WHERE id = ?");
  327.             ps.setInt(1, guildid);
  328.             ps.setInt(2, guildrank);
  329.             ps.setInt(3, cid);
  330.             ps.execute();
  331.             ps.close();
  332.         } catch (SQLException se) {
  333.             log.error("SQLException: " + se.getLocalizedMessage(), se);
  334.         }
  335.     }
  336.     @Override
  337.     public void reloadGuildCharacters() throws RemoteException {
  338.         for (MapleCharacter mc : server.getPlayerStorage().getAllCharacters()) {
  339.             if (mc.getGuildId() > 0) {
  340.                 //multiple world ops, but this method is ONLY used
  341.                 //in !clearguilds gm command, so it shouldn't be a problem
  342.                 server.getWorldInterface().setGuildMemberOnline(mc.getMGC(), true, server.getChannel());
  343.                 server.getWorldInterface().memberLevelJobUpdate(mc.getMGC());
  344.             }
  345.         }
  346.         ChannelServer.getInstance(this.getChannelId()).reloadGuildSummary();
  347.     }
  348.     @Override
  349.     public void changeEmblem(int gid, List<Integer> affectedPlayers, MapleGuildSummary mgs) throws RemoteException {
  350.         ChannelServer.getInstance(this.getChannelId()).updateGuildSummary(gid, mgs);
  351.         this.sendPacket(affectedPlayers, MaplePacketCreator.guildEmblemChange(gid, mgs.getLogoBG(), mgs.getLogoBGColor(), mgs.getLogo(), mgs.getLogoColor()), -1);
  352.         this.setGuildAndRank(affectedPlayers, -1, -1, -1); //respawn player
  353.     }
  354.     public void messengerInvite(String sender, int messengerid, String target, int fromchannel) throws RemoteException {
  355.         if (isConnected(target)) {
  356.             MapleMessenger messenger = server.getPlayerStorage().getCharacterByName(target).getMessenger();
  357.             if (messenger == null) {
  358.                 server.getPlayerStorage().getCharacterByName(target).getClient().getSession().write(MaplePacketCreator.messengerInvite(sender, messengerid));
  359.                 MapleCharacter from = ChannelServer.getInstance(fromchannel).getPlayerStorage().getCharacterByName(sender);
  360.                 from.getClient().getSession().write(MaplePacketCreator.messengerNote(target, 4, 1));
  361.             } else {
  362.                 MapleCharacter from = ChannelServer.getInstance(fromchannel).getPlayerStorage().getCharacterByName(sender);
  363.                 from.getClient().getSession().write(MaplePacketCreator.messengerChat(sender + " : " + target + " is already using Maple Messenger"));
  364.             }
  365.         }
  366.     }
  367.     public void addMessengerPlayer(MapleMessenger messenger, String namefrom, int fromchannel, int position) throws RemoteException {
  368.         for (MapleMessengerCharacter messengerchar : messenger.getMembers()) {
  369.             if (messengerchar.getChannel() == server.getChannel() && !(messengerchar.getName().equals(namefrom))) {
  370.                 MapleCharacter chr = server.getPlayerStorage().getCharacterByName(messengerchar.getName());
  371.                 if (chr != null) {
  372.                     MapleCharacter from = ChannelServer.getInstance(fromchannel).getPlayerStorage().getCharacterByName(namefrom);
  373.                     chr.getClient().getSession().write(MaplePacketCreator.addMessengerPlayer(namefrom, from, position, fromchannel - 1));
  374.                     from.getClient().getSession().write(MaplePacketCreator.addMessengerPlayer(chr.getName(), chr, messengerchar.getPosition(), messengerchar.getChannel() - 1));
  375.                 }
  376.             } else if (messengerchar.getChannel() == server.getChannel() && (messengerchar.getName().equals(namefrom))) {
  377.                 MapleCharacter chr = server.getPlayerStorage().getCharacterByName(messengerchar.getName());
  378.                 if (chr != null) {
  379.                     chr.getClient().getSession().write(MaplePacketCreator.joinMessenger(messengerchar.getPosition()));
  380.                 }
  381.             }
  382.         }
  383.     }
  384.     public void removeMessengerPlayer(MapleMessenger messenger, int position) throws RemoteException {
  385.         for (MapleMessengerCharacter messengerchar : messenger.getMembers()) {
  386.             if (messengerchar.getChannel() == server.getChannel()) {
  387.                 MapleCharacter chr = server.getPlayerStorage().getCharacterByName(messengerchar.getName());
  388.                 if (chr != null) {
  389.                     chr.getClient().getSession().write(MaplePacketCreator.removeMessengerPlayer(position));
  390.                 }
  391.             }
  392.         }
  393.     }
  394.     public void messengerChat(MapleMessenger messenger, String chattext, String namefrom) throws RemoteException {
  395.         for (MapleMessengerCharacter messengerchar : messenger.getMembers()) {
  396.             if (messengerchar.getChannel() == server.getChannel() && !(messengerchar.getName().equals(namefrom))) {
  397.                 MapleCharacter chr = server.getPlayerStorage().getCharacterByName(messengerchar.getName());
  398.                 if (chr != null) {
  399.                     chr.getClient().getSession().write(MaplePacketCreator.messengerChat(chattext));
  400.                 }
  401.             }
  402.         }
  403.     }
  404.     public void declineChat(String target, String namefrom) throws RemoteException {
  405.         if (isConnected(target)) {
  406.             MapleMessenger messenger = server.getPlayerStorage().getCharacterByName(target).getMessenger();
  407.             if (messenger != null) {
  408.                 server.getPlayerStorage().getCharacterByName(target).getClient().getSession().write(
  409.                         MaplePacketCreator.messengerNote(namefrom, 5, 0));
  410.             }
  411.         }
  412.     }
  413.     public void updateMessenger(MapleMessenger messenger, String namefrom, int position, int fromchannel) throws RemoteException {
  414.         for (MapleMessengerCharacter messengerchar : messenger.getMembers()) {
  415.             if (messengerchar.getChannel() == server.getChannel() && !(messengerchar.getName().equals(namefrom))) {
  416.                 MapleCharacter chr = server.getPlayerStorage().getCharacterByName(messengerchar.getName());
  417.                 if (chr != null) {
  418.                     MapleCharacter from = ChannelServer.getInstance(fromchannel).getPlayerStorage().getCharacterByName(namefrom);
  419.                     chr.getClient().getSession().write(MaplePacketCreator.updateMessengerPlayer(namefrom, from, position, fromchannel - 1));
  420.                 }
  421.             }
  422.         }
  423.     }
  424.     public void broadcastGMMessage(String sender, byte[] message) throws RemoteException {
  425.         MaplePacket packet = new ByteArrayMaplePacket(message);
  426.         server.broadcastGMPacket(packet);
  427.     }
  428.     public void broadcastSMega(String sender, byte[] message) throws RemoteException {
  429.         MaplePacket packet = new ByteArrayMaplePacket(message);
  430.         server.broadcastSMega(packet);
  431.     }
  432.     public void broadcastToClan(byte[] message, int clan) throws RemoteException {
  433.         MaplePacket packet = new ByteArrayMaplePacket(message);
  434.         server.broadcastToClan(packet, clan);
  435.     }
  436.     public int onlineClanMembers(int clan) {
  437.         return server.onlineClanMembers(clan);
  438.     }
  439. }