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
Troy1

HELP - Перезапись защещённой константы на клиентской стороне.

Всем привет. Помогите пожалуйста со скриптом.
Суть. Я пытаюсь сделать синхранизацию сервера с клиентом передавая c конфига время разделки животного.
В родных скриптах есть class UATimeSpent с константами и там есть константа SKIN.
Мне нужно её перезаписать на своё значение и мне выдаёт ошибку: Trying to modify write protected variable 'SKIN' в переводе на Русский Попытка изменить защищенную от записи переменную «SKIN».
Функция скрипта: Когда игрок запускает клиент, идёт запрос на серверную часть и получает в ответ время разделки.
Задача: Нужно перезаписать константу SKIN на новое значение и всё.
Сам скрипт.

class timeToComplete extends UATimeSpent
{
    protected ref UATimeSpent m_UATimeSpent;
    void timeToComplete()
    {
        GetDayZGame().Event_OnRPC.Insert(OnRPC);
        CheckUATimeSpent();
    }
    
    void ~timeToComplete()
    {
        GetDayZGame().Event_OnRPC.Remove(OnRPC);
    }
    
    void CheckUATimeSpent()
    {
        GetGame().RPCSingleParam(NULL, SOC_TIME_RPCs.SOC_GT, NULL, true);
    }
    
    void OnRPC(PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx) {
        if (rpc_type == SOC_TIME_RPCs.SOC_RT) {
            Param1<float> soc_srt;
            if (ctx.Read(soc_srt)) {
                if (soc_srt.param1!= 0) {
                    m_UATimeSpent.SKIN = soc_srt.param1;
                    Print("Пришёл ответ от сервера в m_UATimeSpent.SKIN - " + m_UATimeSpent.SKIN)
                }
            }
        }
    }
};

 

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0
modded class UATimeSpent
{
	const float SKIN = 30;
}

только так с константами. на то они и константы

Share this post


Link to post
Share on other sites
MagicByte MagicByte MagicByte
  • 0

@123new А если за модить родной клиентский Экшен по разделки, передавая время разделки когда подключается игрок к серверу?
Ти-по такого кода на клиентской стороне.
Вопрос, как реализовать отправку OnRPC когда подключается игрок к серверу?

modded class ActionSkinningCB : ActionContinuousBaseCB
{
	float time_config;
	void ActionSkinningCB()
	{
		GetDayZGame().Event_OnRPC.Insert(OnRPC);
	}
	
    void ~ActionSkinningCB()
    {
        GetDayZGame().Event_OnRPC.Remove(OnRPC);
    }
	
	void OnRPC(PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx) {
        if (rpc_type == SOC_TIME_RPCs.SOC_RTA) {
            Param1<float> soc_srt;
            if (ctx.Read(soc_srt)) {
                if (soc_srt.param1!= 0) {
                    time_config = soc_srt.param1;
                    Print("Пришёл ответ от сервера в time_config - " + time_config)
                }
				else
				{	
                    time_config = UATimeSpent.SKIN;
					Print("Не пришёл ответ от сервера в time_config - Записываем дефолтное время с UATimeSpent.SKIN - " + UATimeSpent.SKIN)
				}
            }
        }
    }
	
	override void CreateActionComponent()
	{
		m_ActionData.m_ActionComponent = new CAContinuousTime(time_config);
	}
}

 

Share this post


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

@123new А если за модить родной клиентский Экшен по разделки, передавая время разделки когда подключается игрок к серверу?
Ти-по такого кода на клиентской стороне.
Вопрос, как реализовать отправку OnRPC когда подключается игрок к серверу?

modded class ActionSkinningCB : ActionContinuousBaseCB { float time_config; void ActionSkinningCB() { GetDayZGame().Event_OnRPC.Insert(OnRPC); } void ~ActionSkinningCB() { GetDayZGame().Event_OnRPC.Remove(OnRPC); } void OnRPC(PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx) { if (rpc_type == SOC_TIME_RPCs.SOC_RTA) { Param1<float> soc_srt; if (ctx.Read(soc_srt)) { if (soc_srt.param1!= 0) { time_config = soc_srt.param1; Print("Пришёл ответ от сервера в time_config - " + time_config) } else { time_config = UATimeSpent.SKIN; Print("Не пришёл ответ от сервера в time_config - Записываем дефолтное время с UATimeSpent.SKIN - " + UATimeSpent.SKIN) } } } } override void CreateActionComponent() { m_ActionData.m_ActionComponent = new CAContinuousTime(time_config); } }


modded class ActionSkinningCB : ActionContinuousBaseCB
{
	float time_config;
	void ActionSkinningCB()
	{
		GetDayZGame().Event_OnRPC.Insert(OnRPC);
	}
	
    void ~ActionSkinningCB()
    {
        GetDayZGame().Event_OnRPC.Remove(OnRPC);
    }
	
	void OnRPC(PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx) {
        if (rpc_type == SOC_TIME_RPCs.SOC_RTA) {
            Param1<float> soc_srt;
            if (ctx.Read(soc_srt)) {
                if (soc_srt.param1!= 0) {
                    time_config = soc_srt.param1;
                    Print("Пришёл ответ от сервера в time_config - " + time_config)
                }
				else
				{	
                    time_config = UATimeSpent.SKIN;
					Print("Не пришёл ответ от сервера в time_config - Записываем дефолтное время с UATimeSpent.SKIN - " + UATimeSpent.SKIN)
				}
            }
        }
    }
	
	override void CreateActionComponent()
	{
		m_ActionData.m_ActionComponent = new CAContinuousTime(time_config);
	}
}

 

1. делать кастомный класс

2. делать передачу RPC и сохранение значения нужной переменной-переменных в нем

3. в экшене заюзать переменную из своего класса

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0

@123new Напиши пожалуйста. Какой метод срабатывает в игре, когда игрок подключается к серверу и где это происходит в MissionGameplay или MissionServer?

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

Я пытался использывать void OnConnect() и void OnPlayerConnect(Man player), не сработало. 

 

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

  • Similar Content

    • By Troy1
      Всем привет. пишу мод и столкнулся с проблемой в реализации.
      Суть: Пытаюсь сделать проверку, если игрок стоит прям у окна или у дверного проёма он должен получать урон.
      Делал вот так.
      int wallHits = 0; float d = 2.2; // Дистанция до стены. Если стена дальше — считаем, что там окно или проем. // 8 направлений "снежинкой" для проверки стен вокруг игрока // Используем Vector(x, y, z) для точности ref array<vector> checkDirs = { Vector(d,0,0), Vector(-d,0,0), Vector(0,0,d), Vector(0,0,-d), Vector(d,0,d), Vector(-d,0,-d), Vector(d,0,-d), Vector(-d,0,d) }; foreach (vector dir : checkDirs) { // Пускаем горизонтальные лучи от позиции игрока (from) if (DayZPhysics.RayCastBullet(from, from + dir, collisionLayerMask, this, hitObject, hitPosition, hitNormal, hitFraction)) { // ПРОВЕРКА: Это должна быть вертикальная стена (Y нормали < 0.5) // Чтобы не засчитать низкий потолок за стену if (Math.AbsFloat(hitNormal[1]) < 0.5) { wallHits++; } } } // УСЛОВИЕ БЕЗОПАСНОСТИ: // В комнате wallHits будет 6-8. У окна или в проеме — 1-4. if (wallHits < 5) { hasSafeCeiling = false; // Слишком открытое пространство (окно/дверь) } Пытался менять дистанции, но всё ровно не как не хочет работать.
      Что я делаю не так, или я вообще делаю не то?
      Мне нужно проверять игрока, в укрытии он или нет.
      С высотой я разобрался, а вот с боковыми лучами у меня траблы и не во всех помещениях работает как нужно.
      В некоторых помещениях вообще не работает, удаляешь строки проверки, начинает работать и то по высоте.
      Просто забегаешь по навес и игрок под защитой, так не должно быть.
      Помогите пожалуйста  решить задачу.
    • By Troy1
      Всем привет. Суть в чём, пишу мод на событие и когда происходит событие, параллельно должна меняться скорость ветра, не могу понять как заставить скрипт управлять силой ветра. Понижать силу ветра получилось сделать, а вот повышать не как. Только после перезагрузки сервера сила ветра задаётся в нужном значение.
      Как сделать, что бы по вызову функции менялась сила ветра в большую или в меньшую сторону?
      protected void SetWind(float wind, float time) { if (!g_Game) return; Weather m_Weather = g_Game.GetWeather(); if (!m_Weather) return; m_Weather.SetWindMaximumSpeed(wind); m_Weather.SetWind(Vector(1/Math.Sqrt(3), 1/Math.Sqrt(3), 1/Math.Sqrt(3)) * wind); m_Weather.SetWindSpeed(wind); m_Weather.SetWindFunctionParams(1.0, 1.0, -1); } Это скрипт на понижение силы ветра.
      Работает понижение силы ветра в том случае, если до этого сила ветра была выше.
      Пример:
      Изначально на сервере сила ветра = 20 m/s А нужно понизить до 10 m/s
      Только в этом случае сработает скрипт который я приложил выше.
      Помогите пожалуйста решить этот вопрос.
      За ранние благодарю.
    • By KaLiBR
      Всех приветствую!
      Господа, подскажите пожалуйста, хочу исправить некоторые ошибки
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • By Troy1
      Пока ждал помощи, решил вопрос!
      Тема закрыта!!!
  • Our picks

×
×
  • 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.

Поддержка