По какому принципу расставляются нпс на pts сервере

sergebaz

Прославленный
Местный
Сообщения
509
Розыгрыши
0
Решения
1
Репутация
230
Реакции
99
Баллы
1 443
к примеру нпс id 1 Гремлин запись в нпс пос: domain_begin [gludio_1621_001] domain_id=1 {{-121528;98344;-5036;964};{-98372;98344;-5036;964};{-98340;131032;-5036;964};{-122216;131420;-5036;964}} domain_end
вопрос как понять куда "встанет" нпс с вышеуказанными координатами? На примере мы видим четыре записи с координатами вида { {*}; {*}; {*}; {*} } но есть записи и с семью, хотелось бы разобраться подробно ({-первое число что значит;второе число что значит;-третье число что значит;четвертое число что значит}) причем третье и четвертое число постоянны во всех примерах, растолкуйте что к чему...
 

Это набор точек, из которых строится полигональная сетка. Внутри нее берется рандомная точка и там спавнится моб.
{{X1;Y1;Z1;Heading1};{X2;Y2;Z2;Heading2};...{XN;YN;ZN;HeadingN}}
 
набор координат,это просто выделенная ареа для нпц,в которой он существует,респится,ходит и т.п., она же может выполнять задачи общей зоны для кланов монстров и т.п.

pos=anywhere - спавнить нпц в пределах заданного квадрата (или не квадрата),рандомно,подходит для заселения локаций мобами
C#:
npc_begin    [partisan_soldier1]    pos=anywhere    total=15    respawn=1min    npc_end

pos=X;Y;Z;FACE - установить точную точку спавна,в заданном квадрате (можно и не в заданном,но нпц сервер будет срать),подходит для точечного спавна,например в городах
C#:
npc_begin    [ragna_orc_mage_a]    pos={71694;-129209;-3367;49923}    total=1    respawn=60sec    npc_end
 
Последнее редактирование:
С1, все точки генерируются при старте сервера. Потом рандомно только индексы выбираются:

C++:
    FVector minPoint;
    minPoint.x = firstTerritory->GetMinX();
    minPoint.y = firstTerritory->GetMinY();
    minPoint.z = firstTerritory->GetMinZ();

    FVector maxPoint;
    maxPoint.x = firstTerritory->GetMaxX();
    maxPoint.y = firstTerritory->GetMaxY();
    maxPoint.z = firstTerritory->GetMaxZ();

    for (int i = 0; i < territorySize; ++i)
    {
        CTerritory* territory = GetTerritory(i);
        minPoint.x = min(minPoint.x, territory->GetMinX());
        maxPoint.x = max(maxPoint.x, territory->GetMaxX());

        minPoint.y = min(minPoint.y, territory->GetMinY());
        maxPoint.y = max(maxPoint.y, territory->GetMaxY());

        minPoint.z = min(minPoint.z, territory->GetMinZ());
        maxPoint.z = max(maxPoint.z, territory->GetMaxZ());
    }

    // There is always 20x20 points distributed per territory
    // Then each point checks for correct and reachable coordinate
    // If it's OK, then this point added to the list
    int stepsX = int(maxPoint.x - minPoint.x) / 20;
    int stepsY = int(maxPoint.y - minPoint.y) / 20;

    if (stepsX <= 0)
    {
        stepsX = 1;
    }

    if (stepsY <= 0)
    {
        stepsY = 1;
    }

    m_lock.Enter(__FILEW__, __LINE__);

    const CGeoData* geodata = g_readonlyWorld.GetGeoData();
    for (int x = int(minPoint.x); x < int(maxPoint.x); x += stepsX)
    {
        for (int y = int(minPoint.y); y < int(maxPoint.y); y += stepsY)
        {
            FVector spawnPoint;
            spawnPoint.x = x;
            spawnPoint.y = y;
            spawnPoint.z = geodata->GetFloorZ((int)spawnPoint.x, (int)spawnPoint.y, (int)maxPoint.z);
            if (IsGoodRandomSpawn(spawnPoint))
            {
                m_positions.push_back(spawnPoint);
            }
        }
    }

IsGoodRandomSpawn уже довольно интересный внутри, считается определенная площадь, чтобы в стены не попасть и тд, чтобы место было открытым (не дырка из которой не выйти)

PS: sergebaz, у меня 250к с++ кода разобранного (и рабочего на лайв сервере), интересно, сколько постов понадобиться, чтобы я слил то, что еще не в шаре? :D

+ есть 4 стратегии спавна (все, по одному, по очереди, рандомно), и кучи триггеров для спавна
 

    kick

    Баллов: 50
    Даешь шару всему добру ;)

    ArtToKill

    Баллов: 25
    Мне бы очень пригодилось, как раз эмуль с нуля пишу.Если заделишься буду признателен)
Назад
Сверху Снизу