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
Juze

Эффекты на камере игрока. PPEffects

Posted (edited)

Добрый вечер, я в моддинге недавно, всего несколько месяцев и решил изучить такую вещь как PPEffects. Я создал кастомный эффект, который должен менять цветовой фильтр на экране.

Также у меня есть серверный скрипт на основе радиационной зоны, который здесь выкладывали. В общем я хочу, чтобы в момент получения игроком урона от радиации к нему на экран применялся цветовой фильтр.

Например зеленый. 

				if (RadZone_isGasMask == false)
				{
			
					PPEffects.ModdedlColor();
					RadZone_damage_player	=	RadZone_player.GetHealth("GlobalHealth", "Health");
					RadZone_player.SetHealth("GlobalHealth", "Health", RadZone_damage_player - RadZone_damage_value);
				}

Подскажите пожалуйста, в чем моя ошибка. Может есть готовые примеры, как это сделать?

Edited by Juze (see edit history)

Share this post


Link to post
Share on other sites

21 answers to this question

Recommended Posts

  • 1
10 часов назад, Juze сказал:

Я про то и говорю, что не знаю, как его вызвать. Я совсем еще зеленый в этом всем. Не подскажешь? Весь интернет обыскал, не нашел. 

В scripts дофига примеров

ну и курить  class PPEffects

 

Share this post


Link to post
Share on other sites





  • 1

Принцип

На сервере игрок вошел в зону

Код это отработал

И послал RPCSingleParam игроку

На стороне игрока принимаем в override OnRpc и вызываем функцию

Share this post


Link to post
Share on other sites
  • 1
Posted (edited)

Чисто как пример, для тех кто 'шарит немного'

1. 3_Game\Enums - создаем свой класс, например ERPCs.c с следующим содержимым:

enum My_Custom_RPC: ERPCs
{
	My_Custom_RPC_1,
	My_Custom_RPC_2,
	My_Custom_RPC_3,
}

Где My_Custom_RPC нашек кастомное имя своего класса для комманд вызова клиент-сервер и сервер-клиент, а My_Custom_RPC_1, My_Custom_RPC_2,My_Custom_RPC_3 соответственно id самих вызовов, которые игра сама заполнит как посчитает корректным

2. Моддим класс игрока 4_World\Entities\ManBase\PlayerBase.c на тему обработки вызова:

modded class PlayerBase
{
	// Выполняется после PRC процедуры на клиенте
	override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
	{
		super.OnRPC(sender, rpc_type, ctx); // выполняем родной код, чтобы не сломать ничего
		if (rpc_type == My_Custom_RPC.My_Custom_RPC_1) // сверка id пакета сообщения
		{
			Param1<string> v_ctx_PlayerConnected; // создаем переменную для проверки
			ctx.Read(v_ctx_PlayerConnected); //считывание значения, пересланного от сервера
			private string ReadedParam1_PlayerConnected = v_ctx_PlayerConnected.param1;  //запись в переменную значения, пересланного от сервера
			if(ReadedParam1_PlayerConnected == "true") // проверка записанного значения
			{
				// выполняем свой код
			}
		}
		
	}
	
	void MyCommand() // создаем свою функцию, например, для отправки комманды на клиент
	{
		private PlayerIdentity	v_PlayerIdentity	=	this.GetIdentity();	// получаем идентификатор игрока
		if (v_PlayerIdentity) // проверяем, еть ли идентификатор у игрока (вдруг труп уже или отключен)
		{
			private string control_value = "true";		// формируем переменную для отправки игроку
			private Param1< string  > v_Param = new Param1< string >(control_value );	// записываем переменную для отправки игроку		
			GetGame().RPCSingleParam(this, My_Custom_RPC.My_Custom_RPC_1, v_Param, true, v_PlayerIdentity); // отправляем переменную игроку
		}
	}
	override void OnConnect() // чисто серверная функция
	{
		super.OnConnect();	
		MyCommand(); // вызываем свою комманду на сервере
	}
}

пометки написал. OnConnect выполняется чисто на стороне сервера, на клиенте оно естественно будет чисто просто, чтоб было. Вместо этого можете делать свой вызов из своего скрипта, например, газ зоны

MyCommand - созданная для примера функция, отправляющая от сервера игроку комманду и пересылающая 1 текстовый параметр для примера на клиент игры

OnRPC - функция, обрабатывающая передаваемые значения от сервера на стороне клиента игры, как пример с получаем комманды и проверкой значения.

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 1

My_Custom_RPC_1 - 1

2

3

 

Такие РПЦ уже есть в игре (в смысле с номерами 1 2 и тп)

 

My_Custom_RPC_1 = 890211,

My_Custom_RPC_2 = 890212,

итп

 

Важно что бы не пересеклось с чужими или игровыми

Share this post


Link to post
Share on other sites
  • 0
PPEffects.ModdedlColor();

Многообещающий вызов, явно никому и ничего не говорящий вообще))

Share this post


Link to post
Share on other sites
  • 0
2 минуты назад, 123new сказал:

PPEffects.ModdedlColor();


PPEffects.ModdedlColor();

Многообещающий вызов, явно никому и ничего не говорящий вообще))

Я про то и говорю, что не знаю, как его вызвать. Я совсем еще зеленый в этом всем. Не подскажешь? Весь интернет обыскал, не нашел. 

Share this post


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

Я про то и говорю, что не знаю, как его вызвать. Я совсем еще зеленый в этом всем. Не подскажешь? Весь интернет обыскал, не нашел. 

кого его то? Не совсем понимаю. Для начала что это вообще за вызов такой? Чисто придуманный с потолка или взятый откуда-то? Или может есть какие-то составляющие этого мода в других его файлах не озвученных, о которых не сказано ничего в теме. Исходя из выложенного в теме, я лишь вижу что в классе PPEffects создана какая-то функция с именем ModdedlColor и она вызывается, а что это..... гадалку разве что вызывать...

Более того, если ты хочешь воспользоваться PPEffects - то он скорее всего только на клиентской стороне работать будет, т.е. клиент-серверным модом, поскольку это взаимодействие с интерфейсом и прочими данными игрока.

Share this post


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

кого его то? Не совсем понимаю. Для начала что это вообще за вызов такой? Чисто придуманный с потолка или взятый откуда-то? Или может есть какие-то составляющие этого мода в других его файлах не озвученных, о которых не сказано ничего в теме. Исходя из выложенного в теме, я лишь вижу что в классе PPEffects создана какая-то функция с именем ModdedlColor и она вызывается, а что это..... гадалку разве что вызывать...

Более того, если ты хочешь воспользоваться PPEffects - то он скорее всего только на клиентской стороне работать будет, т.е. клиент-серверным модом, поскольку это взаимодействие с интерфейсом и прочими данными игрока.

Разве человек не просит просто помочь ему с вызовом функции? Какая разница что у него в ModdedlColor ?

Share this post


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

Разве человек не просит просто помочь ему с вызовом функции? Какая разница что у него в ModdedlColor ?

понятия не имею что просит, я это и спрашиваю чтобы понять

Share this post


Link to post
Share on other sites
  • 0

Ааааа

Отмоддил ppeffects и создал там функцию ModdedColors?, так?

Share this post


Link to post
Share on other sites
  • 0

Кст по поводу этой темы сразу. Есть идеи как можно нормально наложить эффект на экран (на подобие насыщенности от функции SetBloodSaturation) только с цветным фильтром? Наложение через свет гранату очень кривое и конфликтует с другими модификациями с подобными функциями и классами (например тот же самый выброс и пси-излучение). Если есть идеи пишите, как раз сейчас в ppref копаюсь. Пробывал еще через материал делать наложение, то же работает не очень как свет граната короч.

Share this post


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

Ааааа

Отмоддил ppeffects и создал там функцию ModdedColors?, так?

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

Думал может тут мне помогут. В результате должно получится, что когда игрок в зоне действия, у него эффекты на экране.

Share this post


Link to post
Share on other sites
  • 0
Posted (edited)

Вызывается оно НАКЛИЕНТЕ

А ТАМ ИГРОК ОДИН И ДРУГИХ НЕТ

И нужен rpc с сервера на клиента

Edited by BorizzK (see edit history)

Share this post


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

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

Думал может тут мне помогут. В результате должно получится, что когда игрок в зоне действия, у него эффекты на экране.

При просьбе о помощи нужно предоставлять максимально понятную и открытую тех задачу. С рабочими материалами (например то что ты написал, этого не достаточно). Как говорил 123 ты не раскрыл для нас функцию ModdedColors (что она означает, что ты туда запихнул, как именно ты это запихнул?). Так же 

if (RadZone_isGasMask == false)
				{
			
					PPEffects.ModdedlColor();
					RadZone_damage_player	=	RadZone_player.GetHealth("GlobalHealth", "Health");
					RadZone_player.SetHealth("GlobalHealth", "Health", RadZone_damage_player - RadZone_damage_value);
				}

Это вообще выдернутый фрагмент, который мало о чем говорит для того что бы делать выводы как лучше тебе сделать наложение. Да и наложение которое ты попробывал сделать, даже если и будет накладываться, то после выхода из зоны действия отменяться эффект не будет. Наиболее правильно будет сделать через SymptomBase.

Share this post


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

Вызывается оно НАКЛИЕНТЕ

А ТАМ ИГРОК ОДИН И ДРУГИХ НЕТ

И нужен rpc с сервера на клиента

Я правильно понял, что мне на клиентской стороне, то есть в моде, нужно написать скрип с условием. Что-то на подобие: Если игрок = RadZone_player, то применить фильтр. 

А вот, как работать с RPC? Я много раз видел, что оно применяется, но как с этим работать так и не понял. Есть ли какие-то примеры?

Наверное я спрашиваю банальщину, но я совсем зеленый в вашей теме)

Share this post


Link to post
Share on other sites
  • 0

Примеров гора в скриптах

Прям вот готовых

Share this post


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

Принцип

На сервере игрок вошел в зону

Код это отработал

И послал RPCSingleParam игроку

На стороне игрока принимаем в override OnRpc и вызываем функцию

Кажется я понял. Спасибо, попробую. 

Share this post


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

Кажется я понял. Спасибо, попробую. 

понятно что там в рпц извлекаетс параметр и рпц должна иметь уникальный номер

 

Share this post


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

My_Custom_RPC_1 - 1

2

3

 

Такие РПЦ уже есть в игре (в смысле с номерами 1 2 и тп)

 

My_Custom_RPC_1 = 890211,

My_Custom_RPC_2 = 890212,

итп

 

Важно что бы не пересеклось с чужими или игровыми

им можно номер не задавать вообще, как выше дал, глоотает нормально вроде уже не один патч как

Share this post


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

им можно номер не задавать вообще, как выше дал, глоотает нормально вроде уже не один патч как

Я же правильно понял, что 

	void MyCommand() // создаем свою функцию, например, для отправки комманды на клиент
	{
		private PlayerIdentity	v_PlayerIdentity	=	this.GetIdentity();	// получаем идентификатор игрока
		if (v_PlayerIdentity) // проверяем, еть ли идентификатор у игрока (вдруг труп уже или отключен)
		{
			private string control_value = "true";		// формируем переменную для отправки игроку
			private Param1< string  > v_Param = new Param1< string >(control_value );	// записываем переменную для отправки игроку		
			GetGame().RPCSingleParam(this, My_Custom_RPC.My_Custom_RPC_1, v_Param, true, v_PlayerIdentity); // отправляем переменную игроку
		}
	}

является серверной частью и это нужно было вписать в серверный скрипт с РАД/ГАЗ зоной? Просто я ее добавил и запустив сервер, во время компиляции задания вылетает ошибка, что 'this' or 'super' outside of class is not valid. Я даже наивно попробовал внести его в modded class PlayerBase прям на серверной части, но разумеется у меня ничего не вышло. Подскажи пожалуйста, как быть.

Я также попробовал писать в серверный скрипт лишь 

	override void OnConnect() // чисто серверная функция
	{
		super.OnConnect();	
		MyCommand(); // вызываем свою комманду на сервере
	}

Но вылетает ошибка, что OnConnect помечен, как override, но здесь нет функции с таким именем в базовых классах. 

Share this post


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

Я же правильно понял, что 

void MyCommand() // создаем свою функцию, например, для отправки комманды на клиент { private PlayerIdentity v_PlayerIdentity = this.GetIdentity(); // получаем идентификатор игрока if (v_PlayerIdentity) // проверяем, еть ли идентификатор у игрока (вдруг труп уже или отключен) { private string control_value = "true"; // формируем переменную для отправки игроку private Param1< string > v_Param = new Param1< string >(control_value ); // записываем переменную для отправки игроку GetGame().RPCSingleParam(this, My_Custom_RPC.My_Custom_RPC_1, v_Param, true, v_PlayerIdentity); // отправляем переменную игроку } }


	void MyCommand() // создаем свою функцию, например, для отправки комманды на клиент
	{
		private PlayerIdentity	v_PlayerIdentity	=	this.GetIdentity();	// получаем идентификатор игрока
		if (v_PlayerIdentity) // проверяем, еть ли идентификатор у игрока (вдруг труп уже или отключен)
		{
			private string control_value = "true";		// формируем переменную для отправки игроку
			private Param1< string  > v_Param = new Param1< string >(control_value );	// записываем переменную для отправки игроку		
			GetGame().RPCSingleParam(this, My_Custom_RPC.My_Custom_RPC_1, v_Param, true, v_PlayerIdentity); // отправляем переменную игроку
		}
	}

является серверной частью и это нужно было вписать в серверный скрипт с РАД/ГАЗ зоной? Просто я ее добавил и запустив сервер, во время компиляции задания вылетает ошибка, что 'this' or 'super' outside of class is not valid. Я даже наивно попробовал внести его в modded class PlayerBase прям на серверной части, но разумеется у меня ничего не вышло. Подскажи пожалуйста, как быть.

 

верно понял все. А насчет ошибки - это надо смотреть в том контексте, куда ты это запихнул. Например, this в классе PlayerBase означает персонажа игрока класса PlayerBase, т.е. объект того класса. куда ты функцию впихнул. В другом своем классе этого может вовсе не существовать, т.е. будет корректнее вместо

	void MyCommand() // создаем свою функцию, например, для отправки комманды на клиент
	{
		private PlayerIdentity	v_PlayerIdentity	=	this.GetIdentity();	// получаем идентификатор игрока
		if (v_PlayerIdentity) // проверяем, еть ли идентификатор у игрока (вдруг труп уже или отключен)
		{
			private string control_value = "true";		// формируем переменную для отправки игроку
			private Param1< string  > v_Param = new Param1< string >(control_value );	// записываем переменную для отправки игроку		
			GetGame().RPCSingleParam(this, My_Custom_RPC.My_Custom_RPC_1, v_Param, true, v_PlayerIdentity); // отправляем переменную игроку
		}
	}

использовать такую функцию например

	void MyCommand(PlayerBase player) // создаем свою функцию, например, для отправки комманды на клиент
	{
		private PlayerIdentity	v_PlayerIdentity	=	player.GetIdentity();	// получаем идентификатор игрока
		if (v_PlayerIdentity) // проверяем, еть ли идентификатор у игрока (вдруг труп уже или отключен)
		{
			private string control_value = "true";		// формируем переменную для отправки игроку
			private Param1< string  > v_Param = new Param1< string >(control_value );	// записываем переменную для отправки игроку		
			GetGame().RPCSingleParam(player, My_Custom_RPC.My_Custom_RPC_1, v_Param, true, v_PlayerIdentity); // отправляем переменную игроку
		}
	}

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

4 часа назад, Juze сказал:

Я также попробовал писать в серверный скрипт лишь 

override void OnConnect() // чисто серверная функция { super.OnConnect(); MyCommand(); // вызываем свою комманду на сервере }


	override void OnConnect() // чисто серверная функция
	{
		super.OnConnect();	
		MyCommand(); // вызываем свою комманду на сервере
	}

Но вылетает ошибка, что OnConnect помечен, как override, но здесь нет функции с таким именем в базовых классах. 

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

 

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.