Показ количества перосонажей при выборе сервера. - Страница 2 - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Работа со скриптами

Работа со скриптами Помощь в редактировании и написании квестов к Java серверам, а так же эвентов.

Ответ
Опции темы
Непрочитано 13.11.2011, 12:43   #11
Аватар для Z3oM
Пользователь

По умолчанию Re: Показ количества перосонажей при выборе сервера.

Я вас не понимаю =)
Z3oM вне форума Ответить с цитированием
Непрочитано 27.12.2011, 00:38   #12
Забанен за кидаловo/обман/развод

По умолчанию Re: Показ количества перосонажей при выборе сервера.

Код:
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 пост!!!

Последний раз редактировалось KilRoy; 27.12.2011 в 10:09.
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 27.12.2011, 03:04   #13
Аватар для Gaikotsu
Герой

По умолчанию Re: Показ количества перосонажей при выборе сервера.

я так понимаю, шара с небольшим нюансом, из-за которой у тех кто просто бездумно скопипастит то что расшарено - ничего в результате не выйдет
а те кто чуток подумает - догадается что еще надо поправить

я о том, что в шаре нет коррекций для одного пакета логинсервера
Gaikotsu вне форума Ответить с цитированием
Непрочитано 27.12.2011, 10:04   #14
Забанен за кидаловo/обман/развод

По умолчанию Re: Показ количества перосонажей при выборе сервера.

Цитата:
Сообщение от Gaikotsu Посмотреть сообщение
я так понимаю, шара с небольшим нюансом, из-за которой у тех кто просто бездумно скопипастит то что расшарено - ничего в результате не выйдет
а те кто чуток подумает - догадается что еще надо поправить

я о том, что в шаре нет коррекций для одного пакета логинсервера
Ну так сказать - да
Дам наводку ServerList, а далее, импровизация )))
В принципе то вся херь с СФ
---
Добавил пакет в пред пост, для заядлых "копипастеров"...
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Сказали спасибо:
Непрочитано 27.12.2011, 19:41   #15
Аватар для Gaikotsu
Герой

По умолчанию Re: Показ количества перосонажей при выборе сервера.

это не прокатит:
PHP код:
writeD((int)((deleteTime-System.currentTimeMillis())/1000)); 
правильно будет так:
PHP код:
writeD((int) (deleteTime Config.DELETE_DAYS 86400)); 
З.Ы. ну это если в deleteTime хранится не время когда персонаж удалится, а время когда он был выставлен на удаление. по крайней мере в оригинальном фениксе именнно второй вариант в бд хранится.

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


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При выборе сервера их ДВА О_О stopsay Lineage II 1 13.02.2011 02:44
Виснет при выборе сервера Mangos Lineage II 3 13.07.2010 22:05
Зависает при выборе сервера. agentrol Серверная часть 14 07.06.2010 11:36
Проблема при выборе сервера DarkSkeleton Серверная часть 5 28.01.2010 16:48
Останавливается на выборе сервера не входит в игру RikkiTikkyTa Lineage II 2 11.01.2010 15:38


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 05:49. Часовой пояс GMT +3.

Вверх