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

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

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

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

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

 

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


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

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

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

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

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


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

 

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


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

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

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

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


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

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

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

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

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас

  • Похожие публикации

    • Автор: 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; // Слишком открытое пространство (окно/дверь) } Пытался менять дистанции, но всё ровно не как не хочет работать.
      Что я делаю не так, или я вообще делаю не то?
      Мне нужно проверять игрока, в укрытии он или нет.
      С высотой я разобрался, а вот с боковыми лучами у меня траблы и не во всех помещениях работает как нужно.
      В некоторых помещениях вообще не работает, удаляешь строки проверки, начинает работать и то по высоте.
      Просто забегаешь по навес и игрок под защитой, так не должно быть.
      Помогите пожалуйста  решить задачу.
    • Автор: 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
      Только в этом случае сработает скрипт который я приложил выше.
      Помогите пожалуйста решить этот вопрос.
      За ранние благодарю.
    • Автор: KaLiBR
      Всех приветствую!
      Господа, подскажите пожалуйста, хочу исправить некоторые ошибки
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
    • Автор: Troy1
      Пока ждал помощи, решил вопрос!
      Тема закрыта!!!
  • Наш выбор

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

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

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