Идеи и наблюдения

Тема в разделе "Кодинг", создана пользователем Flame, 22 фев 2020.

Метки:
  1. Flame

    Flame -Заслуженый кодер форума-

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

    Как тема будет оформляться пока не знаю - там видно будет
    Чую, что сам и буду эту тему заполнять, но если у кого похожая фигня - пишите)

    Вот сегодня, например, заметил, что мой любимый способ для передачи данных через SetPropertyText имеет свои недостатки. А именно
    репликация при таком изменении переменной не происходит.
    То есть допустим у нас есть туррелька Turret и мы хотим по букве E (а это вызов функции ServerUse в PlayerController классе) переключать режимы туррели.
    Как я обычно делал - в функции ServerUse в классе KFPCServ находил в цикле по всем Pawn туррельку (проверка класса по Name), а далее изменял режим туррели через SetPropertyText:
    Код:
    foreach RadiusActors(class'Pawn',Turret,65.0)
    {
        if(Turret.Class.Name=='RocketTurret')
            break;
    }
    Turret.SetPropertyText("Regime","Value");
    
    В этой реализации хорошо то, что ServerPerks (в котором находится класс KFPCServ) ничего не знает про RocketTurret (которая лежит в пакете Weapons)
    А плохо тут то, что если переменная Regime в туррельке реплицировалась на клиент (чтобы, например, в HUD'е над туррелью был текущий режим), то при использовании SetPropertyText переменная на сервере изменится, а репликации на клиент не произойдёт
    Возник вопрос - как вызвать принудительную репликацию после SetPropertyText
    Наверняка есть какой-то нормальный "официальный" способ, типа,
    Код:
    Turret.NetUpdateTime = Level.TimeSeconds-1;
    У меня не получилось.
    Я решил просто найти любую переменную желательно класса Actor (чтобы я мог применять это во всевозможных ситуациях), которая реплицируется на клиент и которая не имеет особого значения.
    Выбрал я переменную SoundRadius (тип float) и решил менять её на 0.01 каждый раз, когда мне нужен вызов репликации.
    В итоге если дописать после SetPropertyText строчку
    Код:
    Turret.SoundRadius+=0.01;
    
    То Regime отлично реплицируется на клиент.
    Решение временное, но вполне лаконичное и безобидное (радиус звука обычно порядка 100-200 и изменение на 0.01 вообще ни на что не влияет)

    И как следствие - я много на этом форуме писал кода с SetPropertyText
    Надо теперь будет глянуть нужна ли мне была репликация для тех переменных, что я менял
     
    Arckon., Essence и WipeMaster нравится это.
  2. Flame

    Flame -Заслуженый кодер форума-

    Люди! Старайтесь не создавать чисто серверные элементы Inventory и не добавлять их игрокам!)
    Мы вот 2 дня с Essence тупили пока возникшая перед нами проблема не свелась к тому, что оказывается, если чисто серверный Inventory стоит на самом первом месте в цепочке (Pawn.Inventory), то (что в общем то логично) на клиенте в HUD нет оружия. И в магазине нет.
    Клиент же вообще не знает про такой класс, объект которого стоит во главе списка на сервере и не может его реплицировать. А раз нет головного элемента связного списка - нет и остальных. Значит и нет никакого инвентаря на клиенте

    Казалось бы 1 элемент в Pawn.Inventory почти всегда оружие, поэтому возникшая выше ситуация редка.
    Но представим ситуацию, что вы создали чисто серверный item (например, добавили в инвентарь item, который даёт постоянную небольшую регенерацию здоровья). И после того как добавили этот баф игроку - вы покупаете оружие. Оно добавится в цепочке после этого элемента и как следствие на клиенте в HUD вы не увидите этого оружия, не будет его и в магазине

    В общем не создавайте пожалуйста чисто серверные Item'ы. Закачивайте их на клиент

    Сейчас (чуть попозже)) ) я выложу мутатор, который накидал на коленке и который сортирует цепочку Inventory так, чтобы все Item'ы хотя бы стояли после Weapon и Ammunition объектов в Inventory
    Насколько корректно он работает - фиг знает) Может я чего и не учёл
     
    Последнее редактирование: 15 мар 2020
    Essence нравится это.