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

Не работает манта-ульта пла

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

Оффлайн Веджитто

  • 12
  • Мощь: 0
Вот код датадрайвена и луа файла
Спойлер
"item_ultamanta_datadriven"
{
   "BaseClass"            "item_datadriven"
   "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"
   "ID"                     "1147"                                          // unique ID number for this item.  Do not change this once established or it will invalidate collected stats.
   "AbilityTextureName"         "item_manta"
   "ItemCost"                  "8850"
   "ItemShopTags"               "agi;str;int;attack_speed;move_speed;hard_to_tag"
   "ItemQuality"               "epic"
   "ItemAliases"               "manta style"
   "ItemDisassembleRule"         "DOTA_ITEM_DISASSEMBLE_ALWAYS"
   "ItemDeclarations"            "DECLARE_PURCHASES_TO_TEAMMATES | DECLARE_PURCHASES_IN_SPEECH | DECLARE_PURCHASES_TO_SPECTATORS"
   
   // Special
   //-------------------------------------------------------------------------------------------------------------
   "AbilitySpecial"
   {
      "01"
      {
         "var_type"            "FIELD_INTEGER"
         "hero_proc_chance"      "50"
      }
      "02"
      {
         "var_type"            "FIELD_INTEGER"
         "illusion_proc_chance"   "15"
      }
      "03"
      {
         "var_type"            "FIELD_INTEGER"
         "max_illusions"         "25"
      }
      "04"
      {
         "var_type"            "FIELD_FLOAT"
         "illusion_incoming_damage"   "500.0"
      }
      "04"
      {
         "var_type"            "FIELD_FLOAT"
         "illusion_outgoing_damage"   "-84.0"
      }
      "05"
      {
         "var_type"            "FIELD_INTEGER"
         "illusion_duration"      "6"
      }
      "06"
      {
            "var_type"            "FIELD_INTEGER"
            "bonus_strength"      "26"
      }
      "07"
      {
            "var_type"            "FIELD_INTEGER"
            "bonus_agility"         "42"
      }
      "08"
      {
            "var_type"            "FIELD_INTEGER"
            "bonus_intellect"      "10"
      }
      "09"
      {
            "var_type"            "FIELD_INTEGER"
            "bonus_attack_speed"   "31"
      }
      "10"
      {
            "var_type"            "FIELD_INTEGER"
            "bonus_damage"         "30"
      }
   }

   "Modifiers"
   {
   "modifier_statsmanta"
      {
      "Passive"         "1"
         "IsHidden"         "1"
         "Attributes"       "MODIFIER_ATTRIBUTE_MULTIPLE"
         
         "Properties"
         {
            "MODIFIER_PROPERTY_STATS_STRENGTH_BONUS"      "%bonus_strength"
            "MODIFIER_PROPERTY_STATS_INTELLECT_BONUS"      "%bonus_intellect"
            "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT"   "%bonus_attack_speed"
            "MODIFIER_PROPERTY_STATS_AGILITY_BONUS"         "%bonus_agility"
            "MODIFIER_PROPERTY_BASEATTACK_BONUSDAMAGE"      "%bonus_damage"

         }
      }
      "modifier_juxtapose_datadriven"
      {
         "Passive"   "1"
         "IsHidden"   "1"
      
         "OnAttackLanded"
         {
            "RunScript"
            {
               "ScriptFile"   "items/ultamanta.lua"
               "Function"      "ConjureImage"
            }
         }
      }

      "modifier_illusion_count"
      {
         "IsHidden"   "1"
         
         "OnDeath"
         {
            "RunScript"
            {
               "ScriptFile"   "items/ultamanta.lua"
               "Function"      "DecrementCount"
            }
         }
         
         "OnDestroy"
         {
            "RunScript"
            {
               "ScriptFile"   "items/ultamanta.lua"
               "Function"      "DecrementCount"
            }
         }
      }
   }
}
[свернуть]
Спойлер
function ConjureImage( event )
   local caster = event.caster
   local ability = event.ability
   local player = caster:GetPlayerID()
   
   local proc_chance = 0
   local rand = math.random(1,100)
   local max_illusions =  ability:GetLevelSpecialValueFor( "max_illusions", ability:GetLevel() - 1 )
   local current_illusions = 0
   
   -- Gets the ability owned by the original caster, so we can keep track of the number of illusions
   local original_hero = PlayerResource:GetSelectedHeroEntity(player)
   local ability_name = ability:GetAbilityName()
   local original_ability = original_hero:FindAbilityByName(ability_name)
   
   -- Sets the proc chance based on the caster type
   if caster:IsIllusion() then
      proc_chance = ability:GetLevelSpecialValueFor( "illusion_proc_chance", ability:GetLevel() - 1 )
   else
      proc_chance = ability:GetLevelSpecialValueFor( "hero_proc_chance", ability:GetLevel() - 1 )
   end   
   
   if original_ability.illusions == nil then
      original_ability.illusions = 0
   else
      current_illusions = original_ability.illusions
   end
   
   -- If there is a proc and there are not too many illusions, creates a new one
   if rand <= proc_chance and current_illusions <= max_illusions then
   
      original_ability.illusions = original_ability.illusions + 1
   
      local target = event.target
      local unit_name = caster:GetUnitName()
      local origin = target:GetAbsOrigin() + RandomVector(100)
      local duration = ability:GetLevelSpecialValueFor( "illusion_duration", ability:GetLevel() - 1 )
      local outgoingDamage = ability:GetLevelSpecialValueFor( "illusion_outgoing_damage", ability:GetLevel() - 1 )
      local incomingDamage = ability:GetLevelSpecialValueFor( "illusion_incoming_damage", ability:GetLevel() - 1 )

      -- handle_UnitOwner needs to be nil, else it will crash the game.
      local illusion = CreateUnitByName(unit_name, origin, true, caster, nil, caster:GetTeamNumber())
      illusion:SetPlayerID(caster:GetPlayerID())
      illusion:SetControllableByPlayer(player, true)
   
      -- Level Up the unit to the casters level
      local casterLevel = caster:GetLevel()
      for i=1,casterLevel-1 do
         illusion:HeroLevelUp(false)
      end

      -- Set the skill points to 0 and learn the skills of the caster
      illusion:SetAbilityPoints(0)
      for abilitySlot=0,15 do
         local ability = caster:GetAbilityByIndex(abilitySlot)
         if ability ~= nil then
            local abilityLevel = ability:GetLevel()
            local abilityName = ability:GetAbilityName()
            local illusionAbility = illusion:FindAbilityByName(abilityName)
            illusionAbility:SetLevel(abilityLevel)
         end
      end

      -- Recreate the items of the caster
      for itemSlot=0,5 do
         local item = caster:GetItemInSlot(itemSlot)
         if item ~= nil then
            local itemName = item:GetName()
            local newItem = CreateItem(itemName, illusion, illusion)
            illusion:AddItem(newItem)
         end
      end

      -- Set the unit as an illusion
      -- modifier_illusion controls many illusion properties like +Green damage not adding to the unit damage, not being able to cast spells and the team-only blue particle
      illusion:AddNewModifier(caster, ability, "modifier_illusion", { duration = duration, outgoing_damage = outgoingDamage, incoming_damage = incomingDamage })
   
      -- Without MakeIllusion the unit counts as a hero, e.g. if it dies to neutrals it says killed by neutrals, it respawns, etc.
      illusion:MakeIllusion()
   
      -- This modifier is applied to every illusion to check if they die or expire
      ability:ApplyDataDrivenModifier(illusion, illusion, "modifier_illusion_count", {Duration = duration})
   end
end

--[[Author: YOLOSPAGHETTI
   Date: February 16, 2016
   Decrements the illusion count when one dies or expires]]
function DecrementCount(keys)
   local caster = keys.caster
   local ability = keys.ability
   local player = caster:GetPlayerID()
   
   local original_hero = PlayerResource:GetSelectedHeroEntity(player)
   local ability_name = ability:GetAbilityName()
   local original_ability = original_hero:FindAbilityByName(ability_name)
   
   original_ability.illusions = original_ability.illusions - 1
end
[свернуть]

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: Не работает манта-ульта пла
« Ответ #1 : 14-06-2017, 18:49:08 »
Так и что не работает? Может консоль скинешь или предлагаешь волонтерам досконально читать код?

Оффлайн Веджитто

  • 12
  • Мощь: 0
Re: Не работает манта-ульта пла
« Ответ #2 : 14-06-2017, 18:52:54 »
Так и что не работает? Может консоль скинешь или предлагаешь волонтерам досконально читать код?
Не появляются иллюзии. Консоль доты пишет это Script Runtime Error: ...ame\dota_addons\mhw\scripts\vscripts\items\ultamanta.lua:23: attempt to index local 'original_ability' (a nil value)
stack traceback:
   ...ame\dota_addons\mhw\scripts\vscripts\items\ultamanta.lua:23: in function <...ame\dota_addons\mhw\scripts\vscripts\items\ultamanta.lua:1>
[VScript] Script Runtime Error: ...ame\dota_addons\mhw\scripts\vscripts\items\ultamanta.lua:23: attempt to index local 'original_ability' (a nil value)

Оффлайн Веджитто

  • 12
  • Мощь: 0
Re: Не работает манта-ульта пла
« Ответ #3 : 14-06-2017, 19:28:00 »
Так и что не работает? Может консоль скинешь или предлагаешь волонтерам досконально читать код?
Мне кажется проблема в том, что луа код от абилки, а я выполняю его итемом и там надо что-то подтереть, но я не понимаю, что так как не разбираюсь в луа

Оффлайн MahouShoujo

  • Продвинутый
  • 188
  • Мощь: 3
Re: Не работает манта-ульта пла
« Ответ #4 : 14-06-2017, 19:35:52 »
Так разберись. www.lua.org/pil/contents.html

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: Не работает манта-ульта пла
« Ответ #5 : 14-06-2017, 19:39:15 »
Ну вот, ошибка найдена:

\dota_addons\mhw\scripts\vscripts\items\ultamanta.lua:23: attempt to index local 'original_ability' (a nil value)

Здесь у тебя обращение к пустоте происходит
Код
  if original_ability.illusions == nil then

Видать, здесь
Код
local original_ability = original_hero:FindAbilityByName(ability_name)
не находится абилка у объекта "original_hero".

Дальше, думаю, разберешься (проверишь самого original_hero и всю верхнюю часть скрипта ConjureImage).

Оффлайн MahouShoujo

  • Продвинутый
  • 188
  • Мощь: 3
Re: Не работает манта-ульта пла
« Ответ #6 : 14-06-2017, 19:41:52 »
Проблема очевидно в том что данные по количеству иллюзий хранятся в оригинальной абилке, которая не находится потому что каст идет из предмета. Нужно либо поменять её на поиск предмета, либо написать хранение данных по-другому.

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: Не работает манта-ульта пла
« Ответ #7 : 14-06-2017, 19:44:21 »
Мне кажется проблема в том, что луа код от абилки, а я выполняю его итемом и там надо что-то подтереть, но я не понимаю, что так как не разбираюсь в луа

Мммм, ну собственно тебе уже вон ответили.

Оффлайн Веджитто

  • 12
  • Мощь: 0
Re: Не работает манта-ульта пла
« Ответ #8 : 14-06-2017, 19:51:07 »
Проблема очевидно в том что данные по количеству иллюзий хранятся в оригинальной абилке, которая не находится потому что каст идет из предмета. Нужно либо поменять её на поиск предмета, либо написать хранение данных по-другому.
То есть написать не original_ability, а original_item? Или имя итема написать?

Оффлайн MahouShoujo

  • Продвинутый
  • 188
  • Мощь: 3
Re: Не работает манта-ульта пла
« Ответ #9 : 14-06-2017, 19:56:04 »
Таким образом ты можешь и головой об клавиатуру побиться, вдруг что годное выйдет. Предлагаю почитать мануалы по луа и попытаться проанализировать код, написать на бумажку что делает каждая строчка, если останутся непонятные - запостить сюда, объясним. Глядишь и прояснится.