BBMAXI 14 Опубликовано 21 ноября, 2010 Делаем Эмуляция Офф ядра: 1. создаем файл SendStatus.java с данным содержимым package Ваш импорт где будет файл.gameserver.network.serverpackets; import java.util.Random; import Ваш Импорт к.Config; import Ваш импорт к.model.L2World; public final class SendStatus extends L2GameServerPacket { private static final String _S__00_STATUS = "[S] 00 rWho"; private int online_players = 0; private int max_online = 0; private int online_priv_store = 0; private float priv_store_factor = 0; @Override public void runImpl() {} @Override protected final void writeImpl() { Random ppc = new Random(); online_players = L2World.getInstance().getAllPlayersCount() + Config.RWHO_ONLINE_INCREMENT; if(online_players > Config.RWHO_MAX_ONLINE) { Config.RWHO_MAX_ONLINE = online_players; } max_online = Config.RWHO_MAX_ONLINE; priv_store_factor = Config.RWHO_PRIV_STORE_FACTOR; online_players = L2World.getInstance().getAllPlayersCount() + L2World.getInstance().getAllPlayersCount() * Config.RWHO_ONLINE_INCREMENT / 100 + Config.RWHO_FORCE_INC; online_priv_store = (int) (online_players * priv_store_factor / 100); writeC(0x00); // Packet ID writeD(0x01); // World ID writeD(max_online); // Max Online writeD(online_players); // Current Online writeD(online_players); // Current Online writeD(online_priv_store); // Priv.Sotre Chars // SEND TRASH if(Config.RWHO_SEND_TRASH) { writeH(0x30); writeH(0x2C); writeH(0x36); writeH(0x2C); if(Config.RWHO_ARRAY[12] == Config.RWHO_KEEP_STAT) { int z; z = ppc.nextInt(6); if(z == 0) { z += 2; } for(int x = 0; x < 8; x++) { if(x == 4) { Config.RWHO_ARRAY[x] = 44; } else { Config.RWHO_ARRAY[x] = 51 + ppc.nextInt(z); } } Config.RWHO_ARRAY[11] = 37265 + ppc.nextInt(z * 2 + 3); Config.RWHO_ARRAY[8] = 51 + ppc.nextInt(z); z = 36224 + ppc.nextInt(z * 2); Config.RWHO_ARRAY[9] = z; Config.RWHO_ARRAY[10] = z; Config.RWHO_ARRAY[12] = 1; } for(int z = 0; z < 8; z++) { if(z == 3) { Config.RWHO_ARRAY[z] -= 1; } writeH(Config.RWHO_ARRAY[z]); } writeD(Config.RWHO_ARRAY[8]); writeD(Config.RWHO_ARRAY[9]); writeD(Config.RWHO_ARRAY[10]); writeD(Config.RWHO_ARRAY[11]); Config.RWHO_ARRAY[12]++; writeD(0x00); writeD(0x02); } } /* (non-Javadoc) * @see Ваш импорт к.gameserver.serverpackets.ServerBasePacket#getType() */ @Override public String getType() { return _S__00_STATUS; } } 2.0 Дальше идем в gameserver/network/clientpackets/ProtocolVersion.java 2.1 Добавляем импорт к SendStatus.java: import Ваш импорт к.gameserver.network.serverpackets.SendStatus; 2.2 в ProtocolVersion ищем: if (_version == -2) 2.3 Заменяем на: Код: if (_version == 65534 || _version == -2) 2.4 Снова ищем: // this is just a ping attempt from the new C2 client getClient().closeNow(); 2.5 Ниже добавляем: } else if(_version == 65533 || _version == -3) //RWHO { if(Config.RWHO_LOG) { _log.info(getClient().toString() + " RWHO received"); } getClient().getConnection().close(new SendStatus()); 3.0 Идем в Config.java 3.1 Добавляем импорт: import java.util.Random; 3.2 Теперь добавляем сам конфиг: public static boolean RWHO_LOG; public static int RWHO_FORCE_INC; public static int RWHO_KEEP_STAT; public static int RWHO_MAX_ONLINE; public static boolean RWHO_SEND_TRASH; public static int RWHO_ONLINE_INCREMENT; public static float RWHO_PRIV_STORE_FACTOR; public static int RWHO_ARRAY[] = new int[13]; 3.3 продолжения конфига: //Emulation OFF Core (packet SendStatus) Random ppc = new Random(); int z = ppc.nextInt(6); if(z == 0) { z += 2; } for(int x = 0; x < 8; x++) { if(x == 4) { RWHO_ARRAY[x] = 44; } else { RWHO_ARRAY[x] = 51 + ppc.nextInt(z); } } RWHO_ARRAY[11] = 37265 + ppc.nextInt(z * 2 + 3); RWHO_ARRAY[8] = 51 + ppc.nextInt(z); z = 36224 + ppc.nextInt(z * 2); RWHO_ARRAY[9] = z; RWHO_ARRAY[10] = z; RWHO_ARRAY[12] = 1; RWHO_LOG = Boolean.parseBoolean(serverSettings.getProperty("RemoteWhoLog", "False")); RWHO_SEND_TRASH = Boolean.parseBoolean(serverSettings.getProperty("RemoteWhoSendTrash", "False")); RWHO_MAX_ONLINE = Integer.parseInt(serverSettings.getProperty("RemoteWhoMaxOnline", "0")); RWHO_KEEP_STAT = Integer.parseInt(serverSettings.getProperty("RemoteOnlineKeepStat", "5")); RWHO_ONLINE_INCREMENT = Integer.parseInt(serverSettings.getProperty("RemoteOnlineIncrement", "0")); RWHO_PRIV_STORE_FACTOR = Float.parseFloat(serverSettings.getProperty("RemotePrivStoreFactor", "0")); RWHO_FORCE_INC = Integer.parseInt(serverSettings.getProperty("RemoteWhoForceInc", "0")); 4.0 И самое последние добавляем конфиги: # --------------------------------------------------------------------------- # Эмуляция Офф Ядра # --------------------------------------------------------------------------- RemoteWhoLog = True RemoteWhoSendTrash = True RemoteWhoMaxOnline = 329 RemoteOnlineIncrement = 50 RemoteWhoForceInc = 50 RemotePrivStoreFactor = 12 Автор Мануала: TheFosT 4 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Relvl 26 Опубликовано 15 сентября, 2012 (изменено) Я в свое время тоже делал его, практически идентично, только попроще и без возможности фейка количества онлайн, и без конфигов: public final class ProtocolVersion extends L2GameClientPacket{private static final Logger _logAccounting = Logger.getLogger("accounting");private int _version;@Overrideprotected void readImpl(){_version = readD();}@Overrideprotected void runImpl(){if (_version == 65534 || _version == -2){getClient().close((L2GameServerPacket)null);}else if(_version == 65533 || _version == -3){ getClient().getConnection().close(new SendStatus());} else if (!Config.PROTOCOL_LIST.contains(_version)){LogRecord record = new LogRecord(Level.WARNING, "Wrong protocol");record.setParameters(new Object[]{_version, getClient()});_logAccounting.log(record);KeyPacket pk = new KeyPacket(getClient().enableCrypt(),0);getClient().setProtocolOk(false);getClient().close(pk);}else{KeyPacket pk = new KeyPacket(getClient().enableCrypt(),1);getClient().sendPacket(pk);getClient().setProtocolOk(true);}} package com.l2jserver.gameserver.network.gameserverpackets;import com.l2jserver.gameserver.model.L2World;import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;import com.l2jserver.util.Rnd;public final class SendStatus extends L2GameServerPacket{@Overridepublic void runImpl() {}@Overrideprotected void writeImpl() { writeC(0x00); // Packet ID writeD(0x01); // World ID writeD(L2World.getInstance().OnlineAllPlayers()); // Max Online writeD(L2World.getInstance().OnlineActivePlayers()); // Current Online writeD(L2World.getInstance().OnlineActivePlayers()); // Current Online writeD(L2World.getInstance().OnlineTraderPlayers()); // Priv.Store Chars // SEND TRASH writeD(0x002C0030); for(int x = 0; x < 10; x++) writeH(41 + Rnd.get(10)); writeD(43 + Rnd.get(17)); int z = 36219 + Rnd.get(1500); writeD(z); writeD(z); writeD(37211 + Rnd.get(2000)); writeD(0x00); writeD(0x02);}@Overridepublic String getType() {return "[s] 00 OFF-emulate send status";}} // Online services managerprivate static int _OnlineActivePlayers = 0;private static int _OnlineTraderPlayers = 0;private static int _OnlineAllPlayers = 0;private static long _OnlineLastUpdate = 0;private static final long MIN_UPDATE_PERIOD = 10000;public static void OnlineRecalculate(){if(System.currentTimeMillis() - _OnlineLastUpdate >= MIN_UPDATE_PERIOD){_OnlineAllPlayers = L2World.getInstance().getAllPlayersCount();_OnlineTraderPlayers = 0;for(L2PcInstance ppl : L2World.getInstance().getAllPlayersArray())if ((ppl.getClient().isDetached()) && (ppl.getPrivateStoreType() != L2PcInstance.STORE_PRIVATE_NONE) ) _OnlineTraderPlayers++;_OnlineActivePlayers = _OnlineAllPlayers - _OnlineTraderPlayers;_OnlineLastUpdate = System.currentTimeMillis();}}public int OnlineActivePlayers(){OnlineRecalculate();return _OnlineActivePlayers;}public int OnlineTraderPlayers(){OnlineRecalculate();return _OnlineTraderPlayers;}public int OnlineAllPlayers(){OnlineRecalculate();return _OnlineAllPlayers;} Эти методы пересчитывают народонаселение с задержкой повтороного пересчета 100сек (во избежание спама и переполнения стэка). Так же эти методы использую для отображения онлайна в комьюнити, и в любых других случаях, когда не требуется точное сиюминутное количество народа, и достаточно данных за последние 10 сек. === UPD: Работает с последним релизом L2JServer HF (более ранние требуют перезаписи метода getType() у наследников L2GameServerPacket UPD: Прошу прощения за некропостинг, не обратил внимания. Изменено 15 сентября, 2012 пользователем Relvl Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты