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

Дебафф, создающийся lua-скриптом, запущенным предметом item_datadriven

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

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
У меня есть lua-модификаторы(дебаффы), которые берут значения из абилитисспешала:
Код
function modifier_item_sasha_gray_corruption:OnCreated( kv )
   self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
   self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
   self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
function modifier_item_sasha_gray_corruption:OnRefresh( kv )
   self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
   self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
   self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
Если этот модификатор будет накладываться не через датадрайвен, а через lua-скрипт, который запускается этим предметом, будет ли он всё также получать значения из датадрайвена?
Если нет, то как их получить? Использовать глобальные переменные, которые будут записывать значения этого предмета в его lua-скрипте и затем использовать их в нужном?
« Последнее редактирование: 14-09-2016, 06:22:11 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
У меня есть lua-модификаторы(дебаффы), которые берут значения из абилитисспешала:
Код
function modifier_item_sasha_gray_corruption:OnCreated( kv )
   self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
   self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
   self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
function modifier_item_sasha_gray_corruption:OnRefresh( kv )
   self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
   self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
   self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
Если этот модификатор будет накладываться не через датадрайвен, а через lua-скрипт, который запускается этим предметом, будет ли он всё также получать значения из датадрайвена?
Если нет, то как их получить? Использовать глобальные переменные, которые будут записывать значения этого предмета в его lua-скрипте и затем использовать их в нужном?
Будет получать. Он получает не из варианта создания абилки, а прямо из kv файла который загружен в память автоматически доткой.

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Будет получать. Он получает не из варианта создания абилки, а прямо из kv файла который загружен в память автоматически доткой.
А если мне нужно взять абилитисспешал из другого предмета?
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн Faith

  • 18
  • Мощь: 0
А если мне нужно взять абилитисспешал из другого предмета?

Занеси нужный предмет в переменную, и получай спешил из него.

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Занеси нужный предмет в переменную, и получай спешил из него.
Как раз-таки таким образом?
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн Faith

  • 18
  • Мощь: 0
Ну можно и так, а можно и по-другому, чтобы не дублировать строчки в AbilitySpecial.

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Но проблема теперь в этом и появилась:
Код
if modifier_item_skadi_corruption == nil then
   modifier_item_skadi_corruption = class({})
end
function modifier_item_skadi_corruption:IsHidden()
   return true
end
function modifier_item_skadi_corruption:IsDebuff()
   return true
end
function modifier_item_skadi_corruption:IsPurgable()
   return true
end
function modifier_item_skadi_corruption:GetTexture()
   return "desolator_skadi_corruption"
end
function modifier_item_skadi_corruption:GetEffectName()
return "particles/status_fx/status_effect_frost.vpcf"
end
function modifier_item_skadi_corruption:OnCreated( kv )
local nFXIndex = ParticleManager:CreateParticle( "particles/status_fx/status_effect_frost.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() )
ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self:GetStackCount(), 0, 0 ) )  -- Жалуется здесь
self.GetCaster():AddNewModifier(self.GetCaster(), nil, "modifier_item_desolator_corruption_for_desolator_skadi", {duration = 15}) -- И здесь
end
function modifier_item_skadi_corruption:OnCreated(keys)

end
function modifier_item_skadi_corruption:OnRefresh( kv )
local nFXIndex = ParticleManager:CreateParticle( "particles/status_fx/status_effect_frost.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() )
ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_staff_base", self:GetCaster():GetOrigin(), true )
self.GetCaster():AddNewModifier(self.GetCaster(), nil, "modifier_item_desolator_corruption_for_desolator_skadi", {duration = 15})
end
function modifier_item_skadi_corruption:GetAttributes()
    return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE
end
function modifier_item_skadi_corruption:DeclareFunctions()
   local funcs = {
      MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
      MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE
   }
   return funcs
end

function modifier_item_skadi_corruption:GetModifierMoveSpeedBonus_Percentage()
   return _G.item_skadi_cold_movement_speed
end
function modifier_item_skadi_corruption:GetModifierAttackSpeedBonus_Constant()
   return _G.item_skadi_cold_attack_speed
end
« Последнее редактирование: 15-09-2016, 02:40:20 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
Не знаю сколько раз я писал о проблемах такого рода, но напишу еше раз.
Код луа модификаторов вызывается на сервере и на клиенте. Вся игровая логика должна осуществляться на сервере, нельзя же ведь чтобы клиент сам решал что происходит в игре. На клиенте этот код вызывается только для нужд интерфейса. Именно поэтому API на клиенте обрезано и ты видишь ошибки в консоли.
Вот та часть кода где ты создаешь объекты, изменяешь их свойства должна выполняться только на сервере. Для этого есть функции IsServer() и IsClient()

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
ZLOY,  И ещё вот такая проблема:
Код
LinkLuaModifier( "modifier_item_desolator_corruption", "orb_effects/modifier_item_desolator_corruption", LUA_MODIFIER_MOTION_NONE )
function modifier_item_desolator_orb(keys)
   keys.ability:AddNewModifier(keys.caster, nil, "modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
end
Код
[ W VScript              ]: Script Runtime Error: ...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: attempt to call method 'AddNewModifier' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]: ...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: in function <...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:71>
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
ZLOY,  И ещё вот такая проблема:
Код
LinkLuaModifier( "modifier_item_desolator_corruption", "orb_effects/modifier_item_desolator_corruption", LUA_MODIFIER_MOTION_NONE )
function modifier_item_desolator_orb(keys)
   keys.ability:AddNewModifier(keys.caster, nil, "modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
end
Код
[ W VScript              ]: Script Runtime Error: ...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: attempt to call method 'AddNewModifier' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]: ...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: in function <...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:71>
Ты не правильно используешь AddNewModifier как минимум. Вот тебе пример использования
Код
hero:AddNewModifier(hero, ability, STUN_MODIFIER, {duration = 4})

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
CryDeS, Вот пример, который я нашёл с "hero", а мне как его назначать?:
Код
function OnHeroRespawn(spawned_hero)
   local hero = spawned_hero
   local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
   
   if not steam_id then return end
   if steam_id == 94742628 then
      hero:AddNewModifier(hero, nil, "modifier_yarik", { duration = - 1 })
   end
   if steam_id == 123106753 then
      hero:AddNewModifier(hero, nil, "modifier_grin", { duration = - 1 })
   end
   if steam_id == 73911256 then
      hero:AddNewModifier(hero, nil, "modifier_crydes", { duration = - 1 })
   end
end
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
CryDeS, Вот пример, который я нашёл с "hero", а мне как его назначать?:
Код
function OnHeroRespawn(spawned_hero)
   local hero = spawned_hero
   local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
   
   if not steam_id then return end
   if steam_id == 94742628 then
      hero:AddNewModifier(hero, nil, "modifier_yarik", { duration = - 1 })
   end
   if steam_id == 123106753 then
      hero:AddNewModifier(hero, nil, "modifier_grin", { duration = - 1 })
   end
   if steam_id == 73911256 then
      hero:AddNewModifier(hero, nil, "modifier_crydes", { duration = - 1 })
   end
end
У тебя это keys.caster
Спойлер
И что за жопа кидает мне модификатор?!
[свернуть]

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Теперь у меня из одного lua-файла запускается нормально,:
Код
function modifier_item_desolator_orb(keys)
   if IsServer() then
      keys.target:AddNewModifier(keys.caster, nil --[[Тут ставил и self, и keys.caster, и keys.target]],"modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
   end
end
Код
if modifier_item_desolator_corruption == nil then
   modifier_item_desolator_corruption = class({})
end
function modifier_item_desolator_corruption:IsHidden()
   return false
end
function modifier_item_desolator_corruption:IsDebuff()
   return true
end
function modifier_item_desolator_corruption:IsPurgable()
   return true
end
function modifier_item_desolator_corruption:GetTexture()
   return "desolator_corruption"
end
function modifier_item_desolator_corruption:OnCreated( kv )
   self.corruption_armor = _G.item_desolator_corruption_armor
end
function modifier_item_desolator_corruption:OnRefresh( kv )
   self.corruption_armor = _G.item_desolator_corruption_armor
end
function modifier_item_desolator_corruption:DeclareFunctions()
   local funcs = {
      MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
   }
   return funcs
end
function modifier_item_desolator_corruption:GetModifierPhysicalArmorBonus()
   return self.corruption_armor
end
Но модификатор не снимает броню:


« Последнее редактирование: 15-09-2016, 12:05:01 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн ZLOY

  • Супермодератор
  • 452
  • Мощь: 6
Он снимает, просто клиент не знает об этом
Код
_G.item_desolator_corruption_armor
Что это за говно? Почему нельзя использовать AbilitySpecial?
« Последнее редактирование: 15-09-2016, 12:57:48 от ZLOY »

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
ZLOY, Да не получится через абилитис спешл, потому что мне нужно брать от нескольких предметов параметры в один файл, который будет запускать на _G.время модификатор. А в самом модификаторе (дебаффе) нужно как-то присвоить значения, но сами эти дебаффы даются lua-скриптом, а не KVшкой.
Цитата: ZLOY
Он снимает, просто клиент не знает об этом
И что делать? if not IsServer() ?
Код
function modifier_item_desolator_corruption:OnCreated()
self.corruption_armor = _G.item_desolator_corruption_armor
print (self.corruption_armor)
end
« Последнее редактирование: 15-09-2016, 13:03:59 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]