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

Создание своего типа урона

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

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Когда реализовывал свою идею, столкнулся с проблемой типов урона, в моей кастомке их должно быть много и из классической доты - ничего :D
Наткнулся на эту статью: moddota.com/forum...esistance-library собственно не нашёл гайда тут и переведу этот, может понадобится кому нибудь(без лишней информации):
1. Качаем архив: github.com/Numbers11/damagesystem, из архива кинуть всё в папку со своим аддоном, можно не кидать npc_items_custom.txt, если у вас есть свои кастомные предметы, можно просто скопировать и вставить в свой файл (там немного).
2. Подключаем скрипт, добавляем это в addon_game_mode.lua (главный файл, у вас может называться по другому):
Код
require('damage_system')
3. Добавляем в функцию InitGameMode()(у меня это файл gamemode.lua):
Код
GameRules:GetGameModeEntity():SetDamageFilter(Dynamic_Wrap( DamageSystem, "DamageFilter" ), self)
4. Добавляем В функцию  "OnNPCSpawned", у меня это файл events.lua (вроде с barebones идёт):
Код
local npc = EntIndexToHScript(keys.entindex)
  DamageSystem:CreateResistances(npc)

Готово. Примеры:

Если у Вас есть npc_fireguy и вы хотите, чтобы у него было сопротивление к огню, при этом он должен наносить огненный урон с автоатак и был слаб против воды, Вы должны добавить его в npc_custom_damage_units.txt
Код
"npc_fireguy"
    {
        "resistances"
        {
            "fire"   "100"
            "water"  "-50"
            "earth"  "0"
            "air"    "0"
        }
        //auto attack damage type
        "damagetype" "fire"
        "amplifier" "1"
    }

Если вы хотите, чтобы урон способности, был стихи X и наносил двойной урон, то добавьте его в npc_custom_damag_abilities.txt
Код
 "abaddon_death_coil"
    {
        "damagetype" "X"
        "amplifier" "2"
    }

И предмет, который даст Вам сопротивление огню +100 на некоторое время:
Код
 "item_fire_shield"
  {
    //"ID"              "1836"
    "AbilityBehavior"       "DOTA_ABILITY_BEHAVIOR_NO_TARGET | DOTA_ABILITY_BEHAVIOR_IMMEDIATE"
    "BaseClass"           "item_datadriven"
    "AbilityTextureName"      "item_example_item"

    //"AbilityCastPoint"        "0.2"
    "AbilityCooldown"       "13.0"

    "AbilityManaCost"       "100"
    "ItemCost"            "750"
    "ItemInitialCharges"      "0"
    "ItemDroppable"         "1"
    "ItemSellable"          "1"
    "ItemRequiresCharges"     "0"
    "ItemShareability"        "ITEM_NOT_SHAREABLE"
    "ItemDeclarations"        "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_TO_SPECTATORS"

    "MaxUpgradeLevel"       "1"
    "ItemBaseLevel"         "1"

    "precache"
    {
      "particle"              "particles/frostivus_herofx/queen_shadow_strike_linear_parent.vpcf"
      "particle_folder"       "particles/units/heroes/ember_spirit"
      "soundfile"             "soundevents/game_sounds_heroes/game_sounds_abaddon.vsndevts"
    }
    "OnSpellStart"
    {

      "ApplyModifier"
      {
        "Target"      "CASTER"
        "ModifierName"  "modifier_item_fire_shield"
      }
    }

    "Modifiers"
    {
      "modifier_item_fire_shield"
      {
        "EffectName"    "particles/test_particle/damage_immunity.vpcf"
        "EffectAttachType"  "follow_origin"
        "Target"      "CASTER"

        "Duration" "%duration"
        "TextureName" "abaddon_aphotic_shield"
        "OnCreated"
        {
          "RunScript"
          {
            "ScriptFile"  "damage_system.lua"
            "Function"    "AddResistance"
            "value"       "%resistance_value"
            "resistance"  "fire"
          }
        }
        "OnDestroy"
        {
          "RunScript"
          {
            "ScriptFile"  "damage_system.lua"
            "Function"    "AddResistance"
            "value"       "%resistance_value * -1"
            "resistance"  "fire"
          }
        }
      }
    }

    "AbilitySpecial"
    {
      "01"
      {
        "var_type"        "FIELD_FLOAT"
        "duration"        "4.0"
      }

      "02"
      {
        "var_type"        "FIELD_INTEGER"
        "resistance_value"    "100"
      }
    }
  }

Чтобы дать урон определенным уроном с помощью Lua:
Код
ApplyCustomDamage(target, caster, 100, DAMAGE_TYPE_PURE, "fire")

Проверил, всё работает
« Последнее редактирование: 19-11-2016, 07:21:56 от mrlikelot »

Оффлайн CryDeS

  • Друзья CG
  • 1194
  • Мощь: 11
Re: Создание своего типа урона
« Ответ #1 : 18-11-2016, 14:16:03 »
Несабж
Йееееее, гайды
[свернуть]

Сабж и критика

Зачем в функции
Код
ApplyCustomDamage(target, caster, 100, DAMAGE_TYPE_PURE, "fire")
Прописывать вручную урон DAMAGE_TYPE_PURE, и так очевидно что он должен быть чистым при кастомных резистах и без учета дотовских, соответственно, можно упростить до:
Код
ApplyCustomDamage(target, caster, 100, "fire")


Так же, вижу мало смысла в части кода типа:
Код
  DamageSystem:CreateResistances(npc)
так как, сам резист ты можешь посчитать уже отталкиваясь от ApplyCustomDamage и kv-файла с юнитами(предварительно при загрузке мода его можно считать и забить таблицу вида вроде
Код
units = { 
["unit_name"] = {
["fire"] = 50,
}
}
И после в функции ApplyCustomDamage можно самому заглянуть в эту таблицу, сверить резист в таблице, и сократить урон на этот резист.

Если хранить все резисты в этой таблице, естественно можно легко сделать методы get/set по имени юнита, или по самому хэндлу юнита, посмотрев имя юнита под этим хэндлом, что уберет необходимость в DamageSystem:CreateResistances(npc) совсем, и загрузка будет производится только при создании мода, а далее все юниты будут записываться в таблицу(благо общий вес файла очень маловероятно превысит даже 1мб, а доступ в хэш-таблицах луа производится очень и очень быстро).

Короче говоря, систему можно легко улучшить, но и в текущем виде это отличная штука, спасибо за гайдик!
[свернуть]

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Re: Создание своего типа урона
« Ответ #2 : 18-11-2016, 14:28:12 »
Несабж
Йееееее, гайды
[свернуть]

Сабж и критика

Зачем в функции
Код
ApplyCustomDamage(target, caster, 100, DAMAGE_TYPE_PURE, "fire")
Прописывать вручную урон DAMAGE_TYPE_PURE, и так очевидно что он должен быть чистым при кастомных резистах и без учета дотовских, соответственно, можно упростить до:
Код
ApplyCustomDamage(target, caster, 100, "fire")


Так же, вижу мало смысла в части кода типа:
Код
  DamageSystem:CreateResistances(npc)
так как, сам резист ты можешь посчитать уже отталкиваясь от ApplyCustomDamage и kv-файла с юнитами(предварительно при загрузке мода его можно считать и забить таблицу вида вроде
Код
units = { 
["unit_name"] = {
["fire"] = 50,
}
}
И после в функции ApplyCustomDamage можно самому заглянуть в эту таблицу, сверить резист в таблице, и сократить урон на этот резист.

Если хранить все резисты в этой таблице, естественно можно легко сделать методы get/set по имени юнита, или по самому хэндлу юнита, посмотрев имя юнита под этим хэндлом, что уберет необходимость в DamageSystem:CreateResistances(npc) совсем, и загрузка будет производится только при создании мода, а далее все юниты будут записываться в таблицу(благо общий вес файла очень маловероятно превысит даже 1мб, а доступ в хэш-таблицах луа производится очень и очень быстро).

Короче говоря, систему можно легко улучшить, но и в текущем виде это отличная штука, спасибо за гайдик!
[свернуть]
Как перейду к оптимизации мода, обязательно обновлю статью и оптимизирую код, спасибо)

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Re: Создание своего типа урона
« Ответ #3 : 18-11-2016, 21:17:53 »
Ты сам придумал и написал библиотеку или ты просто перевел чей-то гайд, как ты вроде бы и говоришь в предисловии?

А то ссылка на "оригинал" выкидывает в тему с инвизом при деревьях.

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Re: Создание своего типа урона
« Ответ #4 : 19-11-2016, 07:22:34 »
Ты сам придумал и написал библиотеку или ты просто перевел чей-то гайд, как ты вроде бы и говоришь в предисловии?

А то ссылка на "оригинал" выкидывает в тему с инвизом при деревьях.
Извиняюсь, видимо не нажал ctrl+c  :-[ исправил moddota.com/forum...esistance-library