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

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

предлагаю разобрать как можно сделать это более разумно:
в движке есть несколько итераторов (о итераторах, 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.png
стоит понимать, что это лишь пример и можно обмазать хоть весь радар, рассеивая акторов какнужно лично вам
и да, PC\NPC - акторы, так что живых игроков тоже можно вкинуть в радар подобным способом и оно будут отображаться

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

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

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

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