Перейти к содержанию
Авторизация  
BBMAXI

[manual] Эмуляция Офф Ядра

Рекомендуемые сообщения

Делаем Эмуляция Офф ядра:

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

  • Upvote 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в свое время тоже делал его, практически идентично, только попроще и без возможности фейка количества онлайн, и без конфигов:

 


public final class ProtocolVersion extends L2GameClientPacket{
private static final Logger _logAccounting = Logger.getLogger("accounting");
private int _version;

@Override
protected void readImpl(){_version = readD();}

@Override
protected 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{
@Override
public void runImpl() {}
@Override
protected 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);
}
@Override
public String getType() {return "[s] 00 OFF-emulate send status";}
}

 

 


// Online services manager
private 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: Прошу прощения за некропостинг, не обратил внимания.

Изменено пользователем Relvl

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...