Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Показ количества перосонажей при выборе сервера.
#11
Я вас не понимаю =) :med:
Ответ
#12
Код:
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);
    }
}

Пользуемся Wink
P.S 666 пост!!! :_smile_::_smile_::_smile_:
Ответ
#13
я так понимаю, шара с небольшим нюансом, из-за которой у тех кто просто бездумно скопипастит то что расшарено - ничего в результате не выйдет Smile
а те кто чуток подумает - догадается что еще надо поправить Smile

я о том, что в шаре нет коррекций для одного пакета логинсервера Smile
Ответ
#14
Gaikotsu;155080 Написал:я так понимаю, шара с небольшим нюансом, из-за которой у тех кто просто бездумно скопипастит то что расшарено - ничего в результате не выйдет
а те кто чуток подумает - догадается что еще надо поправить

я о том, что в шаре нет коррекций для одного пакета логинсервера
Ну так сказать - да Wink
Дам наводку ServerList, а далее, импровизация Smile)))
В принципе то вся херь с СФ Smile
---
Добавил пакет в пред пост, для заядлых "копипастеров"...:_smile_:
Ответ
#15
это не прокатит:
PHP код:
<?php 
writeD
((int)((deleteTime-System.currentTimeMillis())/1000));
правильно будет так:
PHP код:
<?php 
writeD
((int) (deleteTime + Config.DELETE_DAYS * 86400));
З.Ы. ну это если в deleteTime хранится не время когда персонаж удалится, а время когда он был выставлен на удаление. по крайней мере в оригинальном фениксе именнно второй вариант в бд хранится.

З.З.Ы. кстати так же можно и текущий онлайн на сервере выводить, вместо количества персонажей на аккаунте - для этого придется добавить всего несколько строк в LSConnection и в Config (для возможности переключения между показом онлайна или показом количества персонажей на аккаунте)
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Ошибка запуска гейм сервера Kensiro 1 1,754 01-23-2018, 04:41 PM
Последний пост: PROGRAMMATOR
  Время сервера "/time" не совпадает с картой ntking 4 2,179 05-04-2017, 02:52 PM
Последний пост: ntking
  Анонс количества убитых Tiat KateKate7912 0 1,210 01-28-2016, 07:38 AM
Последний пост: KateKate7912
  Настройка сервера AndSrt 3 1,601 11-03-2015, 12:00 AM
Последний пост: Deeez
  Ошибка в логах игрового сервера KateKate7912 6 1,785 10-13-2015, 07:52 AM
Последний пост: KateKate7912
  Синхронизация координат клиента и сервера awers 5 2,805 11-03-2014, 12:05 AM
Последний пост: linliss
  Скрипт установки сервера не работает. Linux /. SunWar 2 1,332 08-24-2014, 06:48 PM
Последний пост: SunWar
  Вывод минимального количества игроков в конфиг для прохода к Antharas texport 13 3,941 01-31-2014, 11:23 AM
Последний пост: texport
  ядро сервера frozen pyworld 5 1,570 11-13-2013, 07:24 PM
Последний пост: [STIGMATED]
  Проблема с запуском Регистрации Гейм Сервера RandomSkill 6 2,049 07-23-2013, 03:46 PM
Последний пост: RandomSkill

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)