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

mrlikelot

Продвинутый
24 Июл 2015
168
1
Когда реализовывал свою идею, столкнулся с проблемой типов урона, в моей кастомке их должно быть много и из классической доты - ничего :D
Наткнулся на эту статью: https://moddota.com/forums/discussion/573/custom-damage-resistance-library собственно не нашёл гайда тут и переведу этот, может понадобится кому нибудь(без лишней информации):
1. Качаем архив: https://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")

Проверил, всё работает
 
Последнее редактирование модератором:
  • Нравится
Реакции: Sannin
Йееееее, гайды
14164271458429.jpg

Зачем в функции
Код:
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мб, а доступ в хэш-таблицах луа производится очень и очень быстро).

Короче говоря, систему можно легко улучшить, но и в текущем виде это отличная штука, спасибо за гайдик!
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=1165.msg6970#msg6970 date=1479478563]
Йееееее, гайды
14164271458429.jpg

Зачем в функции
Код:
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мб, а доступ в хэш-таблицах луа производится очень и очень быстро).

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

А то ссылка на "оригинал" выкидывает в тему с инвизом при деревьях.
 
Последнее редактирование модератором:
Ты сам придумал и написал библиотеку или ты просто перевел чей-то гайд, как ты вроде бы и говоришь в предисловии?

А то ссылка на "оригинал" выкидывает в тему с инвизом при деревьях.
Извиняюсь, видимо не нажал ctrl+c :-[ исправил https://moddota.com/forums/discussion/573/custom-damage-resistance-library
 
Последнее редактирование модератором:
Реклама: