CustomGames.ru - Dota 2 пользовательские игры

[Гайд] Строящиеся башни

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн -ErøtiC-

  • Администратор
  • 335
  • Мощь: 3
  • Забанен
[Гайд] Строящиеся башни
« : 15-08-2014, 15:54:03 »
Строящиеся башни, отображение области строения и блокирование постройки друг на дружке

Автор предполагает, что перед чтением вы знаете о *.txt файлах, используемых для создания кастомных юнитов и способностей.

Итак, для создания башни нам нужно несколько вещей:

  • Измененный герой для создания у него способности "Постройка"
  • Измененная способность, которая будет у нашего героя
  • .lua скрипт, в которым мы опишем логику способности
  • Кастомное здание для постройки
Я буду детально разбирать код что для чего нужно, и на каждый строчке буду писать комментарий.


Кастомный герой
В npc_heroes_custom.txt:

Код
"npc_dota_hero_storm_bro"
{
    "override_hero"     "npc_dota_hero_storm_spirit"
    "Ability1"      "place_tower"
}


Кастомная способность
В npc_abilities_custom.txt:

Код
"place_tower"
    {
         // Все способности контроля требуют базовый класс, и так как это класс не просто изменяет старую абилку, он должен быть "data_driven"
        "BaseClass" "ability_datadriven"
        // Мы запрашиваем blah_POINT, для получение параметра "Target" для Lua функции, и blah_AOE для отображения AOE, когда размещаем башню
        "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE"
        // Этот кусок не сильно важен, но делает тесты немного легче
        "AbilityTextureName" "axe_battle_hunger"
        "Ability Cast Range" "0"
        "Ability Cast Point" "0"

        // А вот этот важен. С его помощью задаем радиус AOE. Этот радиус будет отображаться в игре. Вы должны назвать так же, как PLACED_BUILDING_RADIUS в сценарии Lua для соответствия.
        "AOERadius" "45"

        // Когда мы начинаем заклинание (т.е. после того как мы нажали расположение где хотим построить)
        "OnSpellStart"
        {
            // Мы хотим запустить Lua скрипт
            "RunScript"
            {
                // Файл скрипта, который мы вызваем
                "ScriptFile"        "scripts/vscripts/custom_abilities.lua"
                // Специфичная функция, которая нам нужна
                "Function"          "placeBuilding"
                // Дополнительная информацию которую мы отправляем в файл Lua
                "Target" "POINT"
            }       
        }
    }

На этом способность сделана!


Скрипт Lua

Код
    -- Константу пишем тут, чтобы была на виду
PLACED_BUILDING_RADIUS = 45.0;
function placeBuilding(keys)
    -- Нам потребуется несколько переменных, они должны быть понятны
    blocking_counter = 0
    attempt_place_location = keys.target_points[1]
    -- Как же сложно! В основном, эта строка находит все объекты внутри PLACED_BUILDING_RADIUS от того, где мы хотим поставить башню
    -- Цикл для подсчета
    for _,thing in pairs(Entities:FindAllInSphere(GetGroundPosition(attempt_place_location, nil), PLACED_BUILDING_RADIUS) )  do
        blocking_counter = blocking_counter + 1
    end
    print(blocking_counter .. " blockers")

    -- Если есть объекты, которые мешают размещению башни, тогда не строим здесь, иначе - размещаем
    if( blocking_counter < 1) then
        tower = CreateUnitByName("npc_dota_building_homebase", keys.target_points[1], false, nil, nil,keys.caster:GetPlayerOwner():GetTeam() )
    end
end


Кастомная башня
В npc_units_custom.txt

Код
"npc_dota_building_homebase"
{
    // Что мы ходим видеть - моделька
    "Model" "models/buildings/building_plain_reference.vmdl"
    "BaseClass" "npc_dota_creature"
    // Насколько большой масштаб. Относится к PLACED_BUILDING_RADIUS
    "BoundsHullName" "DOTA_HULL_SIZE_HUGE"
}


Теперь вы разместили кастомную башню в абилке, и радиус способности покажет вам где разместить здание, будет ли мешать что-то, когда вы поместите его.
Печально то, что невозможно сделать больше, чем просто размещение башни, насколько я знаю. Мы не получаем доступ к курсору мыши в любой точке и когда мы изучаем абилку, поэтому мы не можем указать разрешенные позиции, или сетку, или все в таком духе.

Перевод: customgames.ru/
Источник: www.reddit.com/r/...aying_build_area/
« Последнее редактирование: 25-08-2014, 17:03:29 от -ExotiC- »

Оффлайн Nagibator230

  • 2
  • Мощь: 0
Re: [Гайд] Строящиеся башни
« Ответ #1 : 25-08-2014, 16:50:42 »
А использовать библиотеку? Мог бы хоть ссылку дать

Оффлайн -ErøtiC-

  • Администратор
  • 335
  • Мощь: 3
  • Забанен
Re: [Гайд] Строящиеся башни
« Ответ #2 : 25-08-2014, 17:04:11 »
Nagibator230,
Какую тебе ссылку дать?

Оффлайн Owletass

  • Продвинутый
  • 57
  • Мощь: 0
Re: [Гайд] Строящиеся башни
« Ответ #3 : 05-09-2014, 16:51:29 »
Я заменил npc_dota_creature на ent_dota_shop, чтобы сделать магазин, но тайник вместе с ним не создается. Как это можно осуществить?

Оффлайн Owletass

  • Продвинутый
  • 57
  • Мощь: 0
Re: [Гайд] Строящиеся башни
« Ответ #4 : 04-07-2015, 11:38:50 »
Как сделать так, чтобы башней могли управлять все подобно курьеру? Сейчас ей вообще управлять никто не может.

Оффлайн doter.ua

  • Друзья CG
  • 272
  • Мощь: 1
Re: [Гайд] Строящиеся башни
« Ответ #5 : 04-07-2015, 12:09:04 »
Как сделать так, чтобы башней могли управлять все подобно курьеру? Сейчас ей вообще управлять никто не может.
контроль разшарить ,ищи в апи.
гайды
сурпрайз mthfckr :D

[свернуть]

Оффлайн -ErøtiC-

  • Администратор
  • 335
  • Мощь: 3
  • Забанен

Оффлайн Owletass

  • Продвинутый
  • 57
  • Мощь: 0
Re: [Гайд] Строящиеся башни
« Ответ #7 : 04-07-2015, 12:47:09 »
Owletass,
developer.valvesoftware.com/...ByPlayer
спасибо
tower:SetControllableByPlayer(keys.caster:GetPlayerID(), true) - так работает