Unit срезает часть пути path_corner

Blezigen

Пользователь
7 Апр 2016
17
1
Проблема заключается в том что любой юнит отправленный по пути path_corner начинает его срезать. Пробовал заменить path_corner на path_track, но все осталось по прежнему.

Sass:
local spawner = Entities:FindByName(nil, "prison_spawner");
local way = Entities:FindByName(nil, DOTA_WAY_NAME.."5");
local hUnit = CreateUnitByName( "npc_dota_creep_badguys_ranged", spawner:GetAbsOrigin(), true, nil, nil, DOTA_TEAM_NOTEAM)
hUnit:SetInitialGoalEntity(way);
hUnit.startWay = way;

Вопрос: как это исправить?
Решение: ТЫК
 
Последнее редактирование:

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
Помоему это встроено в AI существа, попробуй использовать другой крип
 
20 Дек 2016
892
170
Очень сомневаюсь, что это можно настроить. Если не устраивает система от валв, придется свое поведение крипов писать на lua
 

Blezigen

Пользователь
7 Апр 2016
17
1
Очень сомневаюсь, что это можно настроить. Если не устраивает система от валв, придется свое поведение крипов писать на lua
Тогда очень интересно, как в ручную заставлять мобов идти по пути, а также вытаскивать из path_corner next way
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Тогда очень интересно, как в ручную заставлять мобов идти по пути, а также вытаскивать из path_corner next way
Легче просто таблицу с точками создать или сделать что то типо 1 поинт - point1, 2 поинт - point2 и пускай идут к следующему по счету. Заставить идти через MoveToPosition
 
  • Нравится
Реакции: Blezigen

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Если хочешь, можешь скачать звд, это мой мод, там торговец ходит по корнерам, весь скрипт в аи луа
 

Blezigen

Пользователь
7 Апр 2016
17
1
Если хочешь, можешь скачать звд, это мой мод, там торговец ходит по корнерам, весь скрипт в аи луа
Решил проблему с помощью кода твоего продавца, но использовал данные из path_corner.

database.lua - код отвечает за начальную инициализацию путей
SQL:
Database.Ways = {};
Database.WayCount = 0;

function Database:InitWay( name )
    Database.WayCount = Database.WayCount + 1;
    local startPoint = Entities:FindByName(nil, name);
    local wayPoints = {};

    local points = {}
    points[startPoint:entindex()] = startPoint

    local temp     = {};
    temp.id     = startPoint:entindex()
    temp.point     = startPoint:GetAbsOrigin()
    temp.name     = startPoint:GetName()
    table.insert(wayPoints, temp);

    local seen = {}
    local k,v = next(points)
    local toDo = {v}

    repeat
        local corner = table.remove(toDo)
        points[corner:entindex()] = nil
        local edges = corner.edges
        seen[corner:entindex()] = corner

        for index,edge in pairs(edges) do
            if seen[index] == nil then
                local temp     = {};
                temp.id     = edge:entindex()
                temp.point     = edge:GetAbsOrigin()
                temp.name     = edge:GetName()

                table.insert(wayPoints, temp);
                table.insert(toDo, edge)
            end
        end
    until (#toDo == 0)

    Database.Ways[Database.WayCount] = wayPoints;
    DebugPrintTable(wayPoints);
end

Основной файл с инициализацией игры что то типа game.lua
SQL:
function Game:Init()
    info( "Custom game \""..Setting:GetGameName().."\" is loaded." );
    Database:InitWay("source_way_5"); --  Номер пути 1, название первого path_corner "source_way_5"
    Database:InitWay("mine_cart_way_start"); -- Номер пути выдаётся по порядку инициализации
end

Далее unit который будет бегать по этому пути
SQL:
"npc_prison_security_guard"
    {
        "BaseClass"             "npc_dota_creature"
      
        // General
        //-------------------------------------------------------------------------------------------------------------
        "Model"                     "models/mine_cart.vmdl"

        "Level"                     "1"
        "UnitLabel"                 "Mine cart"

        "StatusHealth"              "1"
        "BoundsHullName"            "DOTA_HULL_SIZE_HERO"
        "RingRadius"                "70"
        "vscripts"                  "ai/npc_prison_security_guard.lua"

        // Abilities
        //-------------------------------------------------------------------------------------------------------------
        //"Ability1"                  "ability_no_death"

        // Movement
        //----------------------------------------------------------------
        "MovementCapabilities"      "DOTA_UNIT_CAP_MOVE_GROUND"
        "MovementSpeed"             "512"     // Speed. 
        "FollowRange"               "1"
      
        "IsAncient"                 "1"
    }

Ну и сам скрипт для цикличного следования (npc_prison_security_guard.lua)
SQL:
function Spawn(keys)
    thisEntity.seen = {};
    thisEntity.wentToPoint = false;
    thisEntity.points = Database.Ways[1]; -- 1 НОМЕР ПУТИ
    thisEntity.nextPointIndex = 1;
    thisEntity.maxPointIndex = #Database.Ways[1]; -- 1 НОМЕР ПУТИ

    think()
end

function think()

    local timer = 210
  

    Timers:CreateTimer(function()
        local currentPoint = thisEntity:GetAbsOrigin();
        local nextPoint = thisEntity.points[thisEntity.nextPointIndex].point;
        local maxPointIndex = thisEntity.maxPointIndex;
        local distance = (currentPoint - nextPoint):Length2D()
      

        if distance > 100 then
            thisEntity:MoveToPosition(nextPoint)
        else
            if thisEntity.nextPointIndex < maxPointIndex then
                thisEntity.nextPointIndex = thisEntity.nextPointIndex + 1;
            else
                thisEntity.nextPointIndex = 1;
            end
        end
        return 0.1
    end)
end

Ну и если совсем лень:
SQL:
local way = Entities:FindByName(nil, "source_way_5");

local hUnit = CreateUnitByName( "npc_prison_security_guard", way:GetAbsOrigin(), true, nil, nil, DOTA_TEAM_NOTEAM)
hUnit:SetMustReachEachGoalEntity(true);
hUnit:SetNeverMoveToClearSpace(true);
 
Последнее редактирование:

LAPKI

Продвинутый
26 Окт 2018
271
61
Слишком громоздкое решение, проблема в том, что при движении к точке он учитывает радиус, который надо достичь для результата, по аналогии с триггером - вам не нужно достичь центральной точки volume'а триггера, чтобы его запустить, так же и тут, чтобы начать движение к следующей точке нипу надо лишь приблизиться к текущей на какое-то n-ое расстояние, где-то в любом случае есть этот параметр, можете посмотреть и мб это облегчит ваше решение.
 

Blezigen

Пользователь
7 Апр 2016
17
1
Слишком громоздкое решение, проблема в том, что при движении к точке он учитывает радиус, который надо достичь для результата, по аналогии с триггером - вам не нужно достичь центральной точки volume'а триггера, чтобы его запустить, так же и тут, чтобы начать движение к следующей точке нипу надо лишь приблизиться к текущей на какое-то n-ое расстояние, где-то в любом случае есть этот параметр, можете посмотреть и мб это облегчит ваше решение.
Я рад, что вы помогаете докопаться до истины. Однако в данный момент для меня решение приемлемо (я на него убил достаточно времени).
Так-же на голосовом сервере moddota(Discord) тоже ничего внятного предложить не смогли.
Я перепробовал много функций, но мне действительно понравилась идея с инициализацией путей, для дальнейшего многоразового использования.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Я рад, что вы помогаете докопаться до истины. Однако в данный момент для меня решение приемлемо (я на него убил достаточно времени).
Так-же на голосовом сервере moddota(Discord) тоже ничего внятного предложить не смогли.
Я перепробовал много функций, но мне действительно понравилась идея с инициализацией путей, для дальнейшего многоразового использования.
Я вообще не понял для чего эта инициализация и что она делает, код грязный
 

Blezigen

Пользователь
7 Апр 2016
17
1
Я вообще не понял для чего эта инициализация и что она делает, код грязный
Позволяет опять не искать путь, когда крип снова заспавнится.

В памяти сервера выглядит следующим образом:
id - entityIndex
point - положение точки в пространстве
name - название точки в пространстве
id | point | name (можно удалить)
382 | Vector3D(0,0,0) | prison_point_1
383 | Vector3D(0,100,0) | prison_point_2
384 | Vector3D(0,200,0) | prison_point_3
385 | Vector3D(0,300,0) | prison_point_4

Не согласен, что он грязный. Объясните (с чего такое решение)?
 

Blezigen

Пользователь
7 Апр 2016
17
1
У игры есть 4 этапа которых она должна пройти:
1) Инициализация (загрузка зависимостей)
2) Захват пользовательских данных (нажатие на кнопку, нажатие на скилл, движение мышки)
3) Обработка или игровая логика
4) Отрисовка или рендер

Шаг со 2 по 4 зациклен.

Действительно инициализация не нужна.

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Позволяет опять не искать путь, когда крип снова заспавнится.

В памяти сервера выглядит следующим образом:
id - entityIndex
point - положение точки в пространстве
name - название точки в пространстве
id | point | name (можно удалить)
382 | Vector3D(0,0,0) | prison_point_1
383 | Vector3D(0,100,0) | prison_point_2
384 | Vector3D(0,200,0) | prison_point_3
385 | Vector3D(0,300,0) | prison_point_4


Не согласен, что он грязный. Объясните (с чего такое решение)?
Если только для этого, то сама либа странная. Код грязный, например, тем, что мы заносим в таблицу points поинт, потом достаем этот поинт через next, потом вообще делаем nil, там в принципе странная реализация
 

Blezigen

Пользователь
7 Апр 2016
17
1
Если только для этого, то сама либа странная. Код грязный, например, тем, что мы заносим в таблицу points поинт, потом достаем этот поинт через next, потом вообще делаем nil, там в принципе странная реализация
Есть проблема что lua не хочет доставать первый элемент из массива если его ключ отличен от единицы.
Это так скажем вынужденный костыль.
Встречный вопрос: видел ли ты как хоронятся данные в path_corner? А именно edges?
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Есть проблема что lua не хочет доставать первый элемент из массива если его ключ отличен от единицы.
Это так скажем вынужденный костыль.
Встречный вопрос: видел ли ты как хоронятся данные в path_corner? А именно edges?
Я уже не помню что там, когда то давно смотрел
 
Реклама: