Сообщений: 46
Тем: 7
Зарегистрирован: Oct 2011
Репутация:
-101
Я вас не понимаю =) :med:
Сообщений: 2,102
Тем: 40
Зарегистрирован: Apr 2008
Репутация:
12,296
12-27-2011, 12:38 AM
(Сообщение последний раз редактировалось: 12-27-2011, 10:09 AM KilRoy.)
Код: Index: E:/L2RHighFive/java/l2r/loginserver/L2LoginClient.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/L2LoginClient.java (revision 234)
+++ E:/L2RHighFive/java/l2r/loginserver/L2LoginClient.java (revision 235)
@@ -17,6 +17,8 @@
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.security.interfaces.RSAPrivateKey;
+import java.util.HashMap;
+import java.util.Map;
import java.util.logging.Logger;
public final class L2LoginClient extends MMOClient<MMOConnection<L2LoginClient>>
@@ -60,6 +62,8 @@
private boolean protect_used = false;
private HardwareID HWID = null;
public StatsSet account_fields = null;
+ private Map<Integer, Integer> _charsOnServers;
+ private Map<Integer, long[]> _charsToDelete;
public L2LoginClient(MMOConnection<L2LoginClient> con)
{
@@ -237,6 +241,30 @@
{
getConnection().close(lsp);
}
+
+ public void setCharsOnServ(int servId, int chars)
+ {
+ if (_charsOnServers == null)
+ _charsOnServers = new HashMap<Integer, Integer>();
+ _charsOnServers.put(servId, chars);
+ }
+
+ public Map<Integer, Integer> getCharsOnServ()
+ {
+ return _charsOnServers;
+ }
+
+ public void serCharsWaitingDelOnServ(int servId, long[] charsToDel)
+ {
+ if (_charsToDelete == null)
+ _charsToDelete = new HashMap<Integer, long[]>();
+ _charsToDelete.put(servId, charsToDel);
+ }
+
+ public Map<Integer, long[]> getCharsWaitingDelOnServ()
+ {
+ return _charsToDelete;
+ }
@Override
public void onDisconnection()
Index: E:/L2RHighFive/java/l2r/loginserver/clientpackets/RequestAuthLogin.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/clientpackets/RequestAuthLogin.java (revision 234)
+++ E:/L2RHighFive/java/l2r/loginserver/clientpackets/RequestAuthLogin.java (revision 235)
@@ -113,6 +113,7 @@
client.setAccount(_user);
client.setState(LoginClientState.AUTHED_LOGIN);
client.setSessionKey(lc.assignSessionKeyToClient());
+ lc.getCharactersOnAccount(_user);
lc.addAuthedLoginClient(_user, client);
client.setBonus(status.bonus, status.bonus_expire);
client.setPointL(status.point);
Index: E:/L2RHighFive/java/l2r/loginserver/LoginController.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/LoginController.java (revision 234)
+++ E:/L2RHighFive/java/l2r/loginserver/LoginController.java (revision 235)
@@ -562,6 +562,30 @@
}
return ok;
}
+
+ public void setCharactersOnServer(String account, int charsNum, long[] timeToDel, int serverId)
+ {
+ L2LoginClient client = _loginServerClients.get(account);
+
+ if (client == null)
+ return;
+
+ if (charsNum > 0)
+ client.setCharsOnServ(serverId, charsNum);
+
+ if (timeToDel.length > 0)
+ client.serCharsWaitingDelOnServ(serverId, timeToDel);
+ }
+
+ public void getCharactersOnAccount(String account)
+ {
+ Collection<GameServerInfo> serverList = GameServerTable.getInstance().getRegisteredGameServers().values();
+ for (GameServerInfo gsi : serverList)
+ {
+ if (gsi.isAuthed())
+ gsi.getGameServer().requestCharacters(account);
+ }
+ }
/**
* <p>This method returns one of the cached {@link ScrambledKeyPair ScrambledKeyPairs} for communication with Login Clients.</p>
Index: E:/L2RHighFive/java/l2r/loginserver/gameservercon/AttGS.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/gameservercon/AttGS.java (revision 234)
+++ E:/L2RHighFive/java/l2r/loginserver/gameservercon/AttGS.java (revision 235)
@@ -10,6 +10,7 @@
import l2r.loginserver.crypt.NewCrypt;
import l2r.loginserver.gameservercon.gspackets.ClientBasePacket;
import l2r.loginserver.gameservercon.lspackets.KickPlayer;
+import l2r.loginserver.gameservercon.lspackets.RequestCharacters;
import l2r.loginserver.gameservercon.lspackets.ServerBasePacket;
import l2r.loginserver.gameservercon.lspackets.TestConnection;
import l2r.util.Util;
@@ -360,6 +361,11 @@
removeAccountFromGameServer(account);
LoginController.getInstance().removeAuthedLoginClient(account);
}
+
+ public void requestCharacters(String account)
+ {
+ sendPacket(new RequestCharacters(account));
+ }
public SelectionKey getSelectionKey()
{
Index: E:/L2RHighFive/java/l2r/loginserver/gameservercon/PacketHandler.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/gameservercon/PacketHandler.java (revision 234)
+++ E:/L2RHighFive/java/l2r/loginserver/gameservercon/PacketHandler.java (revision 235)
@@ -12,6 +12,7 @@
import l2r.loginserver.gameservercon.gspackets.PlayerInGame;
import l2r.loginserver.gameservercon.gspackets.PlayerLogout;
import l2r.loginserver.gameservercon.gspackets.PlayersInGame;
+import l2r.loginserver.gameservercon.gspackets.ReplyCharacters;
import l2r.loginserver.gameservercon.gspackets.Restart;
import l2r.loginserver.gameservercon.gspackets.ServerStatus;
import l2r.loginserver.gameservercon.gspackets.TestConnectionResponse;
@@ -94,6 +95,9 @@
case 0x0e:
packet = new PlayersInGame(data, gameserver);
break;
+ case 0x1a:
+ packet = new ReplyCharacters(data, gameserver);
+ break;
case 0x1d:
packet = new PointConnectionL(data, gameserver);
break;
Index: E:/L2RHighFive/java/l2r/gameserver/loginservercon/PacketHandler.java
===================================================================
--- E:/L2RHighFive/java/l2r/gameserver/loginservercon/PacketHandler.java (revision 234)
+++ E:/L2RHighFive/java/l2r/gameserver/loginservercon/PacketHandler.java (revision 235)
@@ -12,6 +12,7 @@
import l2r.gameserver.loginservercon.lspackets.PlayerAuthResponse;
import l2r.gameserver.loginservercon.lspackets.PointConnectionGS;
import l2r.gameserver.loginservercon.lspackets.RSAKey;
+import l2r.gameserver.loginservercon.lspackets.RequestCharacters;
import l2r.gameserver.loginservercon.lspackets.TestConnection;
@@ -78,6 +79,9 @@
case 9:
packet = new TestConnection(data, loginserver);
break;
+ case 0x1c:
+ packet = new RequestCharacters(data, loginserver);
+ break;
case 0x1d:
packet = new PointConnectionGS(data, loginserver);
break;
Index: E:/L2RHighFive/java/l2r/gameserver/loginservercon/LSConnection.java
===================================================================
--- E:/L2RHighFive/java/l2r/gameserver/loginservercon/LSConnection.java (revision 234)
+++ E:/L2RHighFive/java/l2r/gameserver/loginservercon/LSConnection.java (revision 235)
@@ -4,9 +4,14 @@
import l2r.Config;
import l2r.Server;
import l2r.common.ThreadPoolManager;
+import l2r.database.DatabaseUtils;
+import l2r.database.FiltredPreparedStatement;
+import l2r.database.L2DatabaseFactory;
+import l2r.database.ThreadConnection;
import l2r.gameserver.cache.Msg;
import l2r.gameserver.loginservercon.gspackets.GameServerBasePacket;
import l2r.gameserver.loginservercon.gspackets.PlayerAuthRequest;
+import l2r.gameserver.loginservercon.gspackets.ReplyCharacters;
import l2r.gameserver.model.L2Player;
import l2r.gameserver.network.L2GameClient;
import l2r.gameserver.network.serverpackets.LoginFail;
@@ -20,9 +25,14 @@
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
+import java.sql.ResultSet;
+import java.sql.SQLException;
import java.util.ArrayDeque;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
import java.util.logging.Logger;
public class LSConnection extends Thread
@@ -510,4 +520,47 @@
{
this.bannedIpList = bannedIpList;
}
+
+ public void getCharsOnServer(String account)
+ {
+ ThreadConnection con = null;
+ int chars = 0;
+ List<Long> charToDel = new ArrayList<Long>();
+ try
+ {
+ con = L2DatabaseFactory.getInstance().getConnection();
+ FiltredPreparedStatement statement = con.prepareStatement("SELECT deletetime FROM characters WHERE account_name=?");
+ statement.setString(1, account);
+ ResultSet rset = statement.executeQuery();
+ while (rset.next())
+ {
+ chars++;
+ long delTime = rset.getLong("deletetime");
+ if (delTime != 0)
+ charToDel.add(delTime);
+ }
+ rset.close();
+ statement.close();
+ }
+ catch (SQLException e)
+ {
+ log.log(Level.WARNING, "Exception: getCharsOnServer: " + e.getMessage(), e);
+ }
+ finally
+ {
+ DatabaseUtils.closeConnection(con);
+ }
+
+ ReplyCharacters rec = new ReplyCharacters(account, chars, charToDel);
+ try
+ {
+ sendPacket(rec);
+ }
+ catch (Exception e)
+ {
+ if (Config.DEBUG)
+ log.log(Level.WARNING, "", e);
+ }
+
+ }
}
Код: Index: E:/L2RHighFive/java/l2r/loginserver/gameservercon/gspackets/ReplyCharacters.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/gameservercon/gspackets/ReplyCharacters.java (revision 0)
+++ E:/L2RHighFive/java/l2r/loginserver/gameservercon/gspackets/ReplyCharacters.java (revision 233)
@@ -0,0 +1,33 @@
+package l2r.loginserver.gameservercon.gspackets;
+
+import l2r.loginserver.LoginController;
+import l2r.loginserver.gameservercon.AttGS;
+
+/**
+ * @author KilRoy
+ */
+public class ReplyCharacters extends ClientBasePacket
+{
+ /**
+ * @param decrypt
+ * @param gameserver
+ */
+ public ReplyCharacters(byte[] decrypt, AttGS gameserver)
+ {
+ super(decrypt, gameserver);
+ }
+ @Override
+ public void read()
+ {
+ String account = readS();
+ int chars = readC();
+ int charsToDel = readC();
+ long[] charsList = new long[charsToDel];
+ for (int i = 0; i < charsToDel; i++)
+ {
+ charsList[i] = readQ();
+ }
+ LoginController.getInstance().setCharactersOnServer(account,
+ chars, charsList, gameserver.getServerId());
+ }
+}
\ No newline at end of file
Index: E:/L2RHighFive/java/l2r/loginserver/gameservercon/lspackets/RequestCharacters.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/gameservercon/lspackets/RequestCharacters.java (revision 0)
+++ E:/L2RHighFive/java/l2r/loginserver/gameservercon/lspackets/RequestCharacters.java (revision 233)
@@ -0,0 +1,13 @@
+package l2r.loginserver.gameservercon.lspackets;
+
+/**
+ * @author KilRoy
+ */
+public class RequestCharacters extends ServerBasePacket
+{
+ public RequestCharacters(String account)
+ {
+ writeC(0x1c);
+ writeS(account);
+ }
+}
\ No newline at end of file
Index: E:/L2RHighFive/java/l2r/gameserver/loginservercon/gspackets/ReplyCharacters.java
===================================================================
--- E:/L2RHighFive/java/l2r/gameserver/loginservercon/gspackets/ReplyCharacters.java (revision 0)
+++ E:/L2RHighFive/java/l2r/gameserver/loginservercon/gspackets/ReplyCharacters.java (revision 233)
@@ -0,0 +1,23 @@
+package l2r.gameserver.loginservercon.gspackets;
+
+import java.util.List;
+
+/**
+ * @author KilRoy
+ */
+public class ReplyCharacters extends GameServerBasePacket
+{
+
+ public ReplyCharacters(String account, int chars, List<Long> timeToDel)
+ {
+ writeC(0x1a);
+ writeS(account);
+ writeC(chars);
+ writeC(timeToDel.size());
+ for (long time : timeToDel)
+ {
+ writeQ(time);
+ }
+ }
+
+}
\ No newline at end of file
Index: E:/L2RHighFive/java/l2r/gameserver/loginservercon/lspackets/RequestCharacters.java
===================================================================
--- E:/L2RHighFive/java/l2r/gameserver/loginservercon/lspackets/RequestCharacters.java (revision 0)
+++ E:/L2RHighFive/java/l2r/gameserver/loginservercon/lspackets/RequestCharacters.java (revision 233)
@@ -0,0 +1,21 @@
+package l2r.gameserver.loginservercon.lspackets;
+
+import l2r.gameserver.loginservercon.AttLS;
+
+
+/**
+ * @author KilRoy
+ */
+public class RequestCharacters extends LoginServerBasePacket
+{
+
+ public RequestCharacters(byte[] decrypt, AttLS loginServer)
+ {
+ super(decrypt, loginServer);
+ }
+ @Override
+ public void read()
+ {
+ getLoginServer().getCon().getCharsOnServer(readS());
+ }
+}
Код: Index: E:/L2RHighFive/java/l2r/loginserver/serverpackets/ServerList.java
===================================================================
--- E:/L2RHighFive/java/l2r/loginserver/serverpackets/ServerList.java (revision 233)
+++ E:/L2RHighFive/java/l2r/loginserver/serverpackets/ServerList.java (revision 234)
@@ -11,6 +11,7 @@
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
+import java.util.Map;
/**
* ServerList
@@ -41,6 +42,8 @@
{
private List<ServerData> _servers;
private int _lastServer;
+ private Map<Integer, Integer> _charsOnServers;
+ private Map<Integer, long[]> _charsToDelete;
class ServerData
{
@@ -111,6 +114,8 @@
}
}
}
+ _charsOnServers = client.getCharsOnServ();
+ _charsToDelete = client.getCharsWaitingDelOnServ();
}
public void addServer(String ip, int port, boolean pvp, boolean testServer, int currentPlayer, int maxPlayer, boolean brackets, boolean clock, int status, int server_id, boolean fail)
@@ -165,5 +170,27 @@
writeD(bits);
writeC(server.brackets ? 0x01 : 0x00);
}
+ writeH(0x00); // unknown
+ if (_charsOnServers != null)
+ {
+ writeC(_charsOnServers.size());
+ for (int servId : _charsOnServers.keySet())
+ {
+ writeC(servId);
+ writeC(_charsOnServers.get(servId));
+ if (_charsToDelete == null || !_charsToDelete.containsKey(servId))
+ writeC(0x00);
+ else
+ {
+ writeC(_charsToDelete.get(servId).length);
+ for (long deleteTime : _charsToDelete.get(servId))
+ {
+ writeD((int)((deleteTime-System.currentTimeMillis())/1000));
+ }
+ }
+ }
+ }
+ else
+ writeC(0x00);
}
}
Пользуемся
P.S 666 пост!!! :_smile_::_smile_::_smile_:
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
я так понимаю, шара с небольшим нюансом, из-за которой у тех кто просто бездумно скопипастит то что расшарено - ничего в результате не выйдет
а те кто чуток подумает - догадается что еще надо поправить
я о том, что в шаре нет коррекций для одного пакета логинсервера
Сообщений: 2,102
Тем: 40
Зарегистрирован: Apr 2008
Репутация:
12,296
Gaikotsu;155080 Написал:я так понимаю, шара с небольшим нюансом, из-за которой у тех кто просто бездумно скопипастит то что расшарено - ничего в результате не выйдет
а те кто чуток подумает - догадается что еще надо поправить
я о том, что в шаре нет коррекций для одного пакета логинсервера Ну так сказать - да
Дам наводку ServerList, а далее, импровизация )))
В принципе то вся херь с СФ
---
Добавил пакет в пред пост, для заядлых "копипастеров"...:_smile_:
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
это не прокатит: PHP код: <?php
writeD((int)((deleteTime-System.currentTimeMillis())/1000));
правильно будет так:
PHP код: <?php
writeD((int) (deleteTime + Config.DELETE_DAYS * 86400));
З.Ы. ну это если в deleteTime хранится не время когда персонаж удалится, а время когда он был выставлен на удаление. по крайней мере в оригинальном фениксе именнно второй вариант в бд хранится.
З.З.Ы. кстати так же можно и текущий онлайн на сервере выводить, вместо количества персонажей на аккаунте - для этого придется добавить всего несколько строк в LSConnection и в Config (для возможности переключения между показом онлайна или показом количества персонажей на аккаунте)
|