Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 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);
}
}

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

Изменено пользователем 123new
вставка кода в обязательный тег для его вставки (история изменений)

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


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

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

  • 0

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

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


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



  • 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'

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

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

Изменено пользователем 123new
вставка кода в обязательный тег для его вставки (история изменений)

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


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

CF тут при чем

 

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

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

не более

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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, но ничего, кроме сообщения в чат, нет, и я не понимаю почему

Изменено пользователем 123new
вставка кода в обязательный тег для его вставки (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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 модов не надо изобретать. Все пишется легко своими ручками.

Изменено пользователем 123new (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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); 

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

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

Изменено пользователем 123new
вставка кода в обязательный тег для его вставки (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, sfc сказал:

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

 

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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 под такой же иерархией, только уже с кодом выше, но ничего из этого не работает. Да и отладки никакой нет. Непонятно.

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

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


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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

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

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.