#1) Учимся ставить точки на радар как взрослые ребята (IT-HF+)

default_npc

Вершитель
VIP
Победитель в номинации 2023
Сообщения
1 986
Розыгрыши
0
Решения
45
Репутация
1 994
Реакции
2 150
Баллы
1 985
замечаю, что люди пользуются какими то странными вещами для реализации тех или иных задач
ярким примером недавно было то, когда человек, для установки точек на радар под стать новому клиенту - распарсил огромный ини файл с позициями НПЦ и брал данные с него

предлагаю разобрать как можно сделать это более разумно:
в движке есть несколько итераторов (о итераторах, foreach - гугл)
/* AllActors() - avoid using AllActors() too often as it iterates through the whole actor list and is therefore slow
*/
native(304) final iterator function AllActors ( class<actor> BaseClass, out actor Actor, optional name MatchTag );

/* DynamicActors() only iterates through the non-static actors on the list (still relatively slow, bu
much better than AllActors). This should be used in most cases and replaces AllActors in most of
Epic's game code.
*/
native(313) final iterator function DynamicActors ( class<actor> BaseClass, out actor Actor, optional name MatchTag );

/* ChildActors() returns all actors owned by this actor. Slow like AllActors()
*/
native(305) final iterator function ChildActors ( class<actor> BaseClass, out actor Actor );

/* BasedActors() returns all actors based on the current actor (slow, like AllActors)
*/
native(306) final iterator function BasedActors ( class<actor> BaseClass, out actor Actor );

/* TouchingActors() returns all actors touching the current actor (fast)
*/
native(307) final iterator function TouchingActors( class<actor> BaseClass, out actor Actor );

/* TraceActors() return all actors along a traced line. Reasonably fast (like any trace)
*/
native(309) final iterator function TraceActors ( class<actor> BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent );

/* RadiusActors() returns all actors within a give radius. Slow like AllActors(). Use CollidingActors() or VisibleCollidingActors() instead if desired actor types are visible
(not bHidden) and in the collision hash (bCollideActors is true)
*/
native(310) final iterator function RadiusActors ( class<actor> BaseClass, out actor Actor, float Radius, optional vector Loc );

/* VisibleActors() returns all visible actors within a radius. Slow like AllActors(). Use VisibleCollidingActors() instead if desired actor types are
in the collision hash (bCollideActors is true)
*/
native(311) final iterator function VisibleActors ( class<actor> BaseClass, out actor Actor, optional float Radius, optional vector Loc );

/* VisibleCollidingActors() returns visible (not bHidden) colliding (bCollideActors==true) actors within a certain radius.
Much faster than AllActors() since it uses the collision hash
*/
native(312) final iterator function VisibleCollidingActors ( class<actor> BaseClass, out actor Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden );

/* CollidingActors() returns colliding (bCollideActors==true) actors within a certain radius.
Much faster than AllActors() for reasonably small radii since it uses the collision hash
*/
native(321) final iterator function CollidingActors ( class<actor> BaseClass, out actor Actor, float Radius, optional vector Loc );

все они по сути делают одно и тоже - перебирают креатуры, но с некоторыми исключениями (видимые, пересекаемые и т.д.)
Я всегда использовал CollidingActors, потому что потому, разницы я вообще не увидел, в плане перформанса

Далее мы создадим небольшой кусок кода для примера:
C#:
function HandleActors()
{
    local Actor MyActor, OutActor;
    local userinfo ActorInfo;   
    local RadarMapCtrlHandle    m_hRadarMapCtrl;

    MyActor = GetPlayerActor(); //наш актор
    m_hRadarMapCtrl=GetRadarMapCtrlHandle("RadarMapWnd.RadarMapCtrl"); //ссылка на карту радара
 
    foreach MyActor.CollidingActors(class'Actor', OutActor, 2000f) //итерируем исходя из нашего MyActor и выкидываем полученного актора в OutActor
    {
        if(GetUserInfo(OutActor.CreatureID, ActorInfo)) //получаем UserInfo из OutActor
        {   
            m_hRadarMapCtrl.DeleteObject(OutActor.CreatureID); //предварительно удаляем, что бы не наслаивать\имитировать движение одного актора
            m_hRadarMapCtrl.AddObject( OutActor.CreatureID, "Quest", ActorInfo.Name, ActorInfo.loc.x, ActorInfo.loc.y, ActorInfo.loc.z);//вставляем актора под его ИД в радар, на полученные из UserInfo точки
                                                                                                                                        //установка идёт в тип Quest, если нужно другое - нужно создать новый в xdat
        }
    }
}

Что имеем после выполнения этого куска? Имеем нормальные точки на радаре:
1621496850531.webp
стоит понимать, что это лишь пример и можно обмазать хоть весь радар, рассеивая акторов какнужно лично вам
и да, PC\NPC - акторы, так что живых игроков тоже можно вкинуть в радар подобным способом и оно будут отображаться

Так что тут всё упирается в полёт фантазии, можно полностью переработать радар, вывести игроков, вплоть до их состояния (флаг\ПК) и т.п.

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

А еще можно без получения userinfo сразу выводить- потому что в акторе тоже имеются координаты.
 
человек, для установки точек на радар под стать новому клиенту - распарсил огромный ини файл с позициями НПЦ и брал данные с него
ну зачем же так палить :pandaredlol: , а так да: из инфы акторов можно много интересных штук сделать
 
А еще можно без получения userinfo сразу выводить- потому что в акторе тоже имеются координаты.
ну это если никакая больше инфа не нужна (не помню точно чё там держит актор, вроде из полезного только имя ещё?)

ну зачем же так палить :pandaredlol: , а так да: из инфы акторов можно много интересных штук сделать
да ладно, на самом деле так много кто делает, это в принципе не такой уж и плохой вариант, как кажется
ини грузится в память и это считай полноценный датапак, из минусов только статичные нпц
ну и баги могут быть, из серии "есть того кого нет\нет того, кто быть должен"
 
возможно ли это сделать в интерлюдии?
 
Назад
Сверху Снизу