Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
sfc

Отправить сообщение с нагрузкой Сервер-Клиент

Пытаюсь разобраться с RPC - onRPC.

Вроде как нашел много примеров кода, отправляю обычное сообщение в чат клиенту - приходит, но помимо сообщения отправляю еще инфу, по типу int кода и ctx. 
Клиент получает сообщение и отображает его в чате, но код из onRPC не выполняется. Там всё банально -

Сервер:

GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, v_Param, true, v_PlayerIdentity);

Клиент
Файл в папке 4_World, Аддон билдером обработан, залит и с ключом и без ключа. И PBO пробовал - но с ним мод не видит. Только билдер пропускает.

ну и config.cpp стандартный в аддоне


Главный файл в 4_World:

modded class PlayerBase
{

override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx){

super.OnRPC(sender, rpc_type, ctx);
PPEffects.SetBlurFlashbang(0.8);
}
}

Есть какой то пример годный? Пересмотрел кучу примеров, все отличаются то запросом, то инициализацией. И как собрать всё в кучу я не пойму пока.

Edited by 123new
вставка кода в обязательный тег для его вставки (see edit history)

Share this post


Link to post
Share on other sites

9 answers to this question

Recommended Posts

  • 0

Мод неверно собрали или неверно подключили

Share this post


Link to post
Share on other sites



  • 0
3 часа назад, Malinin сказал:

Если двигаться по инструкции...
Нашел ZIP, распаковал, подключил как локалку к клиенту и серверу.
В папке есть Example, упаковал его опять же через Addon Builder со своим ключем. Подключил.
Захожу на сервер, с сервера каждые 20 секунд отправляется RPC через скрипт в Init.c, который находит меня и посылает мне сообщение.

GetRPCManager().SendRPC( "RPCTestMod", "TestRPCFunction", new Param1< string >( "Hello, World!" ) );  .

Как по инструкции короче...
Вот что я вижу в логах клиента

Stack trace:
scripts/1_Core/proto\endebug.c:44
JM/CF/Scripts/3_Game/communityframework\rpc\rpcmanager.c:261
scripts/3_Game/dayzgame.c:2460
JM/CF/Scripts/3_Game/communityframework\game\dayzgame.c:29
SCRIPT    (E): 
server tried sending <RPCTestMod>::TestRPCFunction which does not seem to exist!
Class:      'RPCManager'
Function: 'Error'

На сервере из логов ничего.

Как его правильно подключить? Концепцию не понимаю.

Edited by 123new
вставка кода в обязательный тег для его вставки (see edit history)

Share this post


Link to post
Share on other sites
  • 0

CF тут при чем

 

чистый рпц работает четко что на сервере что на клиенте

CF - просто чел написал прокладку что бы народ не мучался с пересечением rpctype (целое число на самом деле)

не более

 

а примеров рпц - в нативных файлах игры как говна за баней

Share this post


Link to post
Share on other sites
  • 0
49 минут назад, BorizzK сказал:

CF тут при чем

 

чистый рпц работает четко что на сервере что на клиенте

CF - просто чел написал прокладку что бы народ не мучался с пересечением rpctype (целое число на самом деле)

не более

 

а примеров рпц - в нативных файлах игры как говна за баней

 

Окей, я искал там варианты реализовать простую отправку RPC на клиент. 
Мне нужно просто отправить цирфу на клиент, дальше не важно.

Я отправляю ее таким способом 

скрипт.с   подключенный к init.c в onUpdate. Таймер срабатывает - ищет игрока на карте, кидает ему RPC 
 

GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, v_Param, true, v_PlayerIdentity);

 

где цифра заключена в v_Param

Она приходит и отображается в чате красным цветом, но только при условии, что INT = ERPCs.RPC_USER_ACTION_MESSAGE.

если я хоть что то другое поставлю - вообще нет реакции

и есть мод, оч простой

modded class PlayerBase

{

override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx){

super.OnRPC(sender, rpc_type, ctx);
PPEffects.SetBlurFlashbang(0.8);
}
}

банально мне эффект должно показать на камере, если приходит RPC, но ничего, кроме сообщения в чат, нет, и я не понимаю почему

Edited by 123new
вставка кода в обязательный тег для его вставки (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Тупо инструкция по работе с RPC на примере передачи 1 текстового параметра:

 

1. создаем в 3_Game идентификатор своего RPC, например так. Указывать или нет id смотрите сами, работает и без указания. Если указываете - надо смотреть чтобы не пересекалось с чем-то еще. Разумеется на клиенте и сервере быть должно.

enum MyScript_ERPCs: ERPCs
{
	MyScript_ERPCs_1,
	MyScript_ERPCs_2 = 554823,
}

2. В 4_World создаем экшен отправки, например, при коннекте к серверу игроку значения:

override void OnConnect()
{
	super.OnConnect();	
	private Param1< string > v_Param = new Param1< string >("MyServer");			
	GetGame().RPCSingleParam(this, MyScript_ERPCs.MyScript_ERPCs_1, v_Param, true, this.GetIdentity());
}	

где передаем лишь 1 параметр - текстовую переменную с текстом 'MyServer' соответственно.

Обращаю внимание на наш id, заданный в виде переменной в комманде. А также на то, что делается это в классе персонажа, т.е. базовом классе игрового персонажа, управляемого игроком.

Этот код достаточно иметь чисто на сервере.

3. В 4_World создаем анализ и чтение принятого значения от сервера в функции, которая исполняется каждый раз, когда RPC-сигналы от сервера приходят в данный класс:

override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
{
	super.OnRPC(sender, rpc_type, ctx);
	if (rpc_type == MyScript_ERPCs.MyScript_ERPCs_1)
	{
		Param1< string > v_ctx;
		ctx.Read(v_ctx);
		private string MyValue = v_ctx.param1;
		/// Тут делаем например что-то своем или вызываем свою функцию на клиенте игры
	}
}

где соответственно сверяем id пакета сообщения, что оно принадлежит нашему отправленному, потом читаем (формат же отправленных данных знаем сами), ну и заносим в переменную, например, MyValue. А далее уже делаем что вам надо, хоть свой код, хоть вызываем функцию. Это исполняется лишь на клиенте игры уже, и, соответственно, достаточно только там (но хуже не будет если это в клиентском моде будет, серверу этот код будет не нужен и он его просто не вызовет сам).

Обращаю внимание на наш id тоже. А также на то, что делается это также в классе персонажа, т.е. базовом классе игрового персонажа, управляемого игроком.
 

Как видим, никакой велосипед в виде CF модов не надо изобретать. Все пишется легко своими ручками.

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0
10 часов назад, 123new сказал:

 

override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx) { super.OnRPC(sender, rpc_type, ctx); if (rpc_type == MyScript_ERPCs.MyScript_ERPCs_1) { Param1< string > v_ctx; ctx.Read(v_ctx); private string MyValue = v_ctx.param1; /// Тут делаем например что-то своем или вызываем свою функцию на клиенте игры } }


override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
{
	super.OnRPC(sender, rpc_type, ctx);
	if (rpc_type == MyScript_ERPCs.MyScript_ERPCs_1)
	{
		Param1< string > v_ctx;
		ctx.Read(v_ctx);
		private string MyValue = v_ctx.param1;
		/// Тут делаем например что-то своем или вызываем свою функцию на клиенте игры
	}
}

где соответственно сверяем id пакета сообщения, что оно принадлежит нашему отправленному, потом читаем (формат же отправленных данных знаем сами), ну и заносим в переменную, например, MyValue. А далее уже делаем что вам надо, хоть свой код, хоть вызываем функцию. Это исполняется лишь на клиенте игры уже, и, соответственно, достаточно только там (но хуже не будет если это в клиентском моде будет, серверу этот код будет не нужен и он его просто не вызовет сам).

Обращаю внимание на наш id тоже. А также на то, что делается это также в классе персонажа, т.е. базовом классе игрового персонажа, управляемого игроком.
 

Как видим, никакой велосипед в виде CF модов не надо изобретать. Все пишется легко своими ручками.

Если я правильно понял, файл .с  в 4_World должен выглядеть так:

modded class PlayerBase
{
    override void OnConnect()
    {
        super.OnConnect();  
        private Param1< string > v_Param = new Param1< string >("MyServer");    
        Print("SEND MESSAGE SELF")      
        GetGame().RPCSingleParam(this, MyScript_ERPCs.MyScript_ERPCs_1, v_Param, true, this.GetIdentity());
    }
    override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
    {
        super.OnRPC(sender, rpc_type, ctx);
        if (rpc_type == MyScript_ERPCs.MyScript_ERPCs_1)
        {
            Param1< string > v_ctx;
            ctx.Read(v_ctx);
            private string MyValue = v_ctx.param1;
            Print(MyValue);
        }
    }
}

А с сервера я могу отправить:

GetGame().RPCSingleParam(player, 554823, v_Param, true, v_PlayerIdentity); 

Если так, то ниче не работает, ни с клиента (на себя при коннекте) ни с сервера на клиент.

Реакции вообще никакой. Принтов наставил в моде, ни один в клиентских логах не нашел.

Edited by 123new
вставка кода в обязательный тег для его вставки (see edit history)

Share this post


Link to post
Share on other sites
  • 0
1 час назад, sfc сказал:

Реакции вообще никакой. Принтов наставил в моде, ни один в клиентских логах не нашел.

 

Есть предположение, что я не то модифицирую, типо, нет такого класса, или файла, на который я пытаюсь сослаться.

Распаковал dta, нашел Entities/ManBase/PlayerBase.c

Его и пытаюсь закинуть в 4_World под такой же иерархией, только уже с кодом выше, но ничего из этого не работает. Да и отладки никакой нет. Непонятно.

Share this post


Link to post
Share on other sites
  • 0
9 часов назад, sfc сказал:

 

 

Если я правильно понял, файл .с  в 4_World должен выглядеть так:
 

 

 

modded class PlayerBase

{

 

    override void OnConnect()

    {

        super.OnConnect();  

        private Param1< string > v_Param = new Param1< string >("MyServer");    

        Print("SEND MESSAGE SELF")      

        GetGame().RPCSingleParam(this, MyScript_ERPCs.MyScript_ERPCs_1, v_Param, true, this.GetIdentity());

    }

    

    override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)

    {

        super.OnRPC(sender, rpc_type, ctx);

        if (rpc_type == MyScript_ERPCs.MyScript_ERPCs_1)

        {

            Param1< string > v_ctx;

            ctx.Read(v_ctx);

            private string MyValue = v_ctx.param1;

            Print(MyValue);

 

        }

    }

}

 

 

А с сервера я могу отправить:

 

GetGame().RPCSingleParam(player, 554823, v_Param, true, v_PlayerIdentity); 

 

 

Если так, то ниче не работает, ни с клиента (на себя при коннекте) ни с сервера на клиент.

 

Реакции вообще никакой. Принтов наставил в моде, ни один в клиентских логах не нашел.

1. научитесь уже код вставлять в соответствующий блок для вставки кода, вынес наказание соответствующее повторно в той же теме.
2. в теории да, так, но без последнего

GetGame().RPCSingleParam(player, 554823, v_Param, true, v_PlayerIdentity); 

так как оно уже есть у вас в

override void OnConnect()

функции, и оттуда отправляется клиенту игры при коннекте к серверу игры от сервера.

Соответственно если мод стоит и на клиенте и на сервере, а логи клиента игры вы смотрите актуальные в %localappdata%\dayz то могу предположить только одно - у вас собран криво серверный мод и сервер его просто не может подгрузить, либо мод не включен.

7 часов назад, sfc сказал:

 

Есть предположение, что я не то модифицирую, типо, нет такого класса, или файла, на который я пытаюсь сослаться.

Распаковал dta, нашел Entities/ManBase/PlayerBase.c

Его и пытаюсь закинуть в 4_World под такой же иерархией, только уже с кодом выше, но ничего из этого не работает. Да и отладки никакой нет. Непонятно.

если файл лежит в нужной категории, его дальнейшее подкатегорирование не столь значимо (сервер сам найдет класс и вставит в него модифицированный код ваш).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.