замечаю, что люди пользуются какими то странными вещами для реализации тех или иных задач
ярким примером недавно было то, когда человек, для установки точек на радар под стать новому клиенту - распарсил огромный ини файл с позициями НПЦ и брал данные с него
предлагаю разобрать как можно сделать это более разумно:
в движке есть несколько итераторов (о итераторах, foreach - гугл)
все они по сути делают одно и тоже - перебирают креатуры, но с некоторыми исключениями (видимые, пересекаемые и т.д.)
Я всегда использовал CollidingActors, потому что потому, разницы я вообще не увидел, в плане перформанса
Далее мы создадим небольшой кусок кода для примера:
Что имеем после выполнения этого куска? Имеем нормальные точки на радаре:
стоит понимать, что это лишь пример и можно обмазать хоть весь радар, рассеивая акторов какнужно лично вам
и да, PC\NPC - акторы, так что живых игроков тоже можно вкинуть в радар подобным способом и оно будут отображаться
Так что тут всё упирается в полёт фантазии, можно полностью переработать радар, вывести игроков, вплоть до их состояния (флаг\ПК) и т.п.
Кстати говоря на этом же и реализуется "почти нормальный" автофарм, но это уже для особенных
актуально с интерлюдов
ярким примером недавно было то, когда человек, для установки точек на радар под стать новому клиенту - распарсил огромный ини файл с позициями НПЦ и брал данные с него
предлагаю разобрать как можно сделать это более разумно:
в движке есть несколько итераторов (о итераторах, 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 );
*/
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
}
}
}
Что имеем после выполнения этого куска? Имеем нормальные точки на радаре:
стоит понимать, что это лишь пример и можно обмазать хоть весь радар, рассеивая акторов какнужно лично вам
и да, PC\NPC - акторы, так что живых игроков тоже можно вкинуть в радар подобным способом и оно будут отображаться
Так что тут всё упирается в полёт фантазии, можно полностью переработать радар, вывести игроков, вплоть до их состояния (флаг\ПК) и т.п.
Кстати говоря на этом же и реализуется "почти нормальный" автофарм, но это уже для особенных
актуально с интерлюдов