Простые вопросы #2

Статус
В этой теме нельзя размещать новые ответы.

shesmu

Продвинутый
22 Фев 2018
158
22
Скинь ка код свой, мб у тебя не от этого провисает. У меня даже при создании 40 юнитов мгновенно не лагает
Lua:
local func = function( projectile )
            projectile:SetAbsOrigin( keys.spawn_origin )
          
            LinkLuaModifier( "modifier_projectile", "modifiers/projectile", LUA_MODIFIER_MOTION_NONE )
            local projectile_modifier = projectile:AddNewModifier( caster, ability, "modifier_projectile", {} )

            for k, v in pairs( keys ) do
                projectile_modifier[k] = v
            end
        end

        CreateUnitByNameAsync( "projectile_unit", keys.spawn_origin, false, nil, nil, caster:GetTeam(), func )

Lua:
modifier_projectile = modifier_projectile or class({})

function modifier_projectile:OnCreated()
    if IsServer() then

        if not self.radius then self.radius = 110 else self.radius = self.radius + 55 end

        self.projectile = self:GetParent()
        self:StartIntervalThink( 0.01 )
        self.caster_pos = self.projectile:GetAbsOrigin()

        self.effect = self.effect or "particles/ranged_badguy_changed.vpcf"

        Timers:CreateTimer( 0.01, function()
            self.particle = ParticleManager:CreateParticle("particles/units/heroes/hero_tiny/tiny_tree_linear_proj.vpcf", PATTACH_CUSTOMORIGIN, nil)
            ParticleManager:SetParticleAlwaysSimulate(self.particle)

            ParticleManager:SetParticleControl( self.particle, 0, self.projectile:GetAbsOrigin() )
            ParticleManager:SetParticleControlForward( self.particle, 0, self.direction )

            ParticleManager:SetParticleControl( self.particle, 1, self.direction )
        end )
    end
end

function modifier_projectile:OnIntervalThink()
    if IsServer() then
        self.caster_pos = 0.01 * self.direction + self.caster_pos
        self.projectile:SetAbsOrigin( self.caster_pos )
    end
end
Это код для проджектайла с возможностью его сломать дать ему абилку, перепрыгнуть его и изменить направление в полете, а 30+ потому что 30+ мобов кастуют этот скилл
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Lua:
local func = function( projectile )
            projectile:SetAbsOrigin( keys.spawn_origin )
        
            LinkLuaModifier( "modifier_projectile", "modifiers/projectile", LUA_MODIFIER_MOTION_NONE )
            local projectile_modifier = projectile:AddNewModifier( caster, ability, "modifier_projectile", {} )

            for k, v in pairs( keys ) do
                projectile_modifier[k] = v
            end
        end

        CreateUnitByNameAsync( "projectile_unit", keys.spawn_origin, false, nil, nil, caster:GetTeam(), func )

Lua:
modifier_projectile = modifier_projectile or class({})

function modifier_projectile:OnCreated()
    if IsServer() then

        if not self.radius then self.radius = 110 else self.radius = self.radius + 55 end

        self.projectile = self:GetParent()
        self:StartIntervalThink( 0.01 )
        self.caster_pos = self.projectile:GetAbsOrigin()

        self.effect = self.effect or "particles/ranged_badguy_changed.vpcf"

        Timers:CreateTimer( 0.01, function()
            self.particle = ParticleManager:CreateParticle("particles/units/heroes/hero_tiny/tiny_tree_linear_proj.vpcf", PATTACH_CUSTOMORIGIN, nil)
            ParticleManager:SetParticleAlwaysSimulate(self.particle)

            ParticleManager:SetParticleControl( self.particle, 0, self.projectile:GetAbsOrigin() )
            ParticleManager:SetParticleControlForward( self.particle, 0, self.direction )

            ParticleManager:SetParticleControl( self.particle, 1, self.direction )
        end )
    end
end

function modifier_projectile:OnIntervalThink()
    if IsServer() then
        self.caster_pos = 0.01 * self.direction + self.caster_pos
        self.projectile:SetAbsOrigin( self.caster_pos )
    end
end
Это код для проджектайла с возможностью его сломать дать ему абилку, перепрыгнуть его и изменить направление в полете, а 30+ потому что 30+ мобов кастуют этот скилл
А ты не пробовал пользоваться мошионконтроллерами? Конечно все лагает, ты на каждом юните запускаешь таймер с выполнением в 0.01 сек. Хотя тик на сервере и то 0.033, нахера тебе меньше таймер, если он все равно отсылаться на клиент не будет.
И зачем кучу раз линковать модификатор? Можно один раз и все.
 

shesmu

Продвинутый
22 Фев 2018
158
22
А ты не пробовал пользоваться мошионконтроллерами? Конечно все лагает, ты на каждом юните запускаешь таймер с выполнением в 0.01 сек. Хотя тик на сервере и то 0.033, нахера тебе меньше таймер, если он все равно отсылаться на клиент не будет.
И зачем кучу раз линковать модификатор? Можно один раз и все.
линк модифиера ошибка, я не разобрался как с мотион контроллером сделать, видел пример в dota imba лип потмы, но там так же мотионконтроллер раз в FrameTime() вызывается, и я подумал что легче 1 функцию вызывать
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Какая разница синхронно или асинхронно? Только проблемы ему добавляешь.

Хоть 0.0001 сек напиши, но таймер будет выполнятся не чаще чем раз в кадр.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Какая разница синхронно или асинхронно? Только проблемы ему добавляешь.

Хоть 0.0001 сек напиши, но таймер будет выполнятся не чаще чем раз в кадр.
Синхронно если, вся логика аддона виснуть будет, пока юнит не появится, ну, а таймер будет не раз в фрейм, а раз в 0.05с это де дефолтный тик таймера, мошионконтроллеры скорее всего оптимизированы под перемещения
 

shesmu

Продвинутый
22 Фев 2018
158
22
Синхронно если, вся логика аддона виснуть будет, пока юнит не появится, ну, а таймер будет не раз в фрейм, а раз в 0.05с это де дефолтный тик таймера, мошионконтроллеры скорее всего оптимизированы под перемещения
Lua:
function modifier_imba_leap_movement:IgnoreTenacity() return true end
function modifier_imba_leap_movement:IsMotionController() return true end
function modifier_imba_leap_movement:GetMotionControllerPriority() return DOTA_MOTION_CONTROLLER_PRIORITY_MEDIUM end
Вот что есть у модифиера перемещения чего нет у меня, я кстати так подумал, можно даже не в фрейм тайм перемещать, а в 0.1-0.2, партикль и так плавно лететь будет, а для самого юнита этого более чем достаточно
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Синхронно если, вся логика аддона виснуть будет, пока юнит не появится, ну, а таймер будет не раз в фрейм, а раз в 0.05с это де дефолтный тик таймера, мошионконтроллеры скорее всего оптимизированы под перемещения
Чего она виснуть будет?
И откуда ты взял 0.05 хуй знает.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Чего она виснуть будет?
И откуда ты взял 0.05 хуй знает.
Из файла таймеров, лул, там константой в самом начале тик назначается. Того и будет, что синхронно. Код то дальше не пойдет, пока юниты не появятся.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Lua:
function modifier_imba_leap_movement:IgnoreTenacity() return true end
function modifier_imba_leap_movement:IsMotionController() return true end
function modifier_imba_leap_movement:GetMotionControllerPriority() return DOTA_MOTION_CONTROLLER_PRIORITY_MEDIUM end
Вот что есть у модифиера перемещения чего нет у меня, я кстати так подумал, можно даже не в фрейм тайм перемещать, а в 0.1-0.2, партикль и так плавно лететь будет, а для самого юнита этого более чем достаточно
Наверное, потому что ты при подключении модификатора не указываешь, что там motion_horizontal, vertical или both
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Из файла таймеров, лул, там константой в самом начале тик назначается. Того и будет, что синхронно. Код то дальше не пойдет, пока юниты не появятся.
У тебя видимо своя отдельная библиотека.

Не пойдет, но юниты спаунится быстрее не начнут и при спауне большого кол-ва крипов будет так же лагать
 

shesmu

Продвинутый
22 Фев 2018
158
22
Наверное, потому что ты при подключении модификатора не указываешь, что там motion_horizontal, vertical или both
https://developer.valvesoftware.com.../Scripting/API#CDOTA_Modifier_Lua_Motion_Both ? Я не нашел никаких примеров применения, мб плохо искал, но если не трудно объясни плз как этим пользоватся
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
У тебя видимо своя отдельная библиотека.

Не пойдет, но юниты спаунится быстрее не начнут и при спауне большого кол-ва крипов будет так же лагать

TIMERS_THINK = 0.05
Юниты будут друг за дружкой спавниться и только тогда, когда для них выделится память, без ожидания, пока появится каждый юнит
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
https://developer.valvesoftware.com.../Scripting/API#CDOTA_Modifier_Lua_Motion_Both ? Я не нашел никаких примеров применения, мб плохо искал, но если не трудно объясни плз как этим пользоватся
Lua:
modifier_nature_wisp = class({})
function modifier_nature_wisp:IsHidden()
  return true
end
function modifier_nature_wisp:GetEffectName()
  return "particles/nature_wisp.vpcf"
end
function modifier_nature_wisp:GetEffectAttachType()
  return PATTACH_CENTER_FOLLOW
end
function modifier_nature_wisp:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_DISABLE_AUTOATTACK,
        MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_MAGICAL,
        MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PHYSICAL,
        MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PURE,
        MODIFIER_PROPERTY_MIN_HEALTH,
    }
end

function modifier_nature_wisp:CheckState()
    return {
    [MODIFIER_STATE_INVULNERABLE] = true,
    [MODIFIER_STATE_MAGIC_IMMUNE] = true,
    [MODIFIER_STATE_ATTACK_IMMUNE] = true,
    [MODIFIER_STATE_NOT_ON_MINIMAP] = true,
    [MODIFIER_STATE_NO_HEALTH_BAR] = true,
    [MODIFIER_STATE_LOW_ATTACK_PRIORITY] = true,
    [MODIFIER_STATE_NO_UNIT_COLLISION] = true,
    [MODIFIER_STATE_UNSELECTABLE] = true,
    [MODIFIER_STATE_NO_UNIT_COLLISION] = true
  }
end
function modifier_nature_wisp:GetAbsoluteNoDamageMagical()
    return 1
end
function modifier_nature_wisp:GetAbsoluteNoDamagePhysical()
    return 1
end
function modifier_nature_wisp:GetAbsoluteNoDamagePure()
    return 1
end
function modifier_nature_wisp:GetMinHealth()
    return 1
end
function modifier_nature_wisp:UpdateHorizontalMotion( me, dt )
  if IsServer() then
    if self.traveled < self.distance then
      local vectormove = self.direction * self.speed
      self.par:SetAbsOrigin(self.par:GetAbsOrigin() + vectormove)
      self.traveled = self.traveled + (vectormove):Length2D()
    else
      self.par:InterruptMotionControllers(true)
      UTIL_Remove(self.par)
    end
  end
end
function modifier_nature_wisp:OnHorizontalMotionInterrupted()
  if IsServer() then
    self.par:RemoveHorizontalMotionController(self)
  end
end
function modifier_nature_wisp:OnCreated(t)
  if IsServer() then
    self.caster = self:GetCaster()
    self.par = self:GetParent()
    self.direction = self.caster:GetForwardVector()
    self.distance = t.dis
    self.speed = t.speed /30
    self.traveled = 0
    -- self.attacked = {}
    self:StartIntervalThink(0.1)
    self:ApplyHorizontalMotionController()
  end
end
function modifier_nature_wisp:OnIntervalThink()
  local units = FindUnitsInRadius(self.caster:GetTeamNumber(),self.par:GetAbsOrigin(),nil,50,self:GetAbility():GetAbilityTargetTeam(),self:GetAbility():GetAbilityTargetType(),DOTA_DAMAGE_FLAG_NONE,FIND_ANY_ORDER,false)
  if units then
    for i,v in ipairs(units) do
      if v ~= self.caster then
        local damage = self:GetAbility():GetSpecialValueFor('damage') + (self.caster:GetIntellect() * self:GetAbility():GetSpecialValueFor('intdamage'))
        if RollPercentage(self:GetAbility():GetSpecialValueFor('chance')) then
          v:AddNewModifier(self:GetCaster(),self:GetAbility(),'modifier_nature_wisp_rooted',{duration=self:GetAbility():GetSpecialValueFor('duration')})
          damage = damage + self:GetAbility():GetSpecialValueFor('damageroot') + (self.caster:GetIntellect() * self:GetAbility():GetSpecialValueFor('intdamageroot'))
          EmitSoundOn('Hero_Treant.Overgrowth.Target',v)
        end
        v:Damage(damage,self:GetAbility():GetAbilityDamageType(),self.caster)
        -- self.attacked[v] = true
        self.par:InterruptMotionControllers(true)
        EmitSoundOn('Hero_Puck.ProjectileImpact',v)
        UTIL_Remove(self.par)
        return
      end
    end
  end
  return 0.1
end
function modifier_nature_wisp:GetAttributes()
    return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE
end

Вот так нужно линкать этот модификатор:
Lua:
LinkLuaModifier('modifier_nature_wisp', "modifiers/modifier_nature_wisp",LUA_MODIFIER_MOTION_HORIZONTAL)
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
https://github.com/bmddota/barebone...nes/scripts/vscripts/libraries/timers.lua#L72

И они будут таки спаунится друг за другом, так что займет это примерно одно и тоже время
Но заметных лагов при появлении не будет, как обычно в кастомках при старте спавна сначала пролаг.
Раньше было 0.05, и у меня 0.05, хотя я никогда не менял это значение
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Будет одно и тоже
Всегда 0.01 было.
 

shesmu

Продвинутый
22 Фев 2018
158
22
Пытаюсь добавить хитбокс модели, но мне пишет Model needs to have a skeleton in order to add hitboxes, что за скелет и как его сделать используя только воркшоп доты?
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Пытаюсь добавить хитбокс модели, но мне пишет Model needs to have a skeleton in order to add hitboxes, что за скелет и как его сделать используя только воркшоп доты?
Поищи по moddota cube.fbx, если не поймешь, что там делают, напиши
 
Статус
В этой теме нельзя размещать новые ответы.
Реклама: