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

Реклама:

I_GRIN_I

Друзья CG
15 Мар 2016
986
42
28
19
Реакции
38 0 1
прекеша партикля и юнита кстати не хватает, фпс до 12 падает так же
Скинь ка код свой, мб у тебя не от этого провисает. У меня даже при создании 40 юнитов мгновенно не лагает
 

shesmu

Активный
22 Фев 2018
105
9
18
22
Реакции
16 0 0
Скинь ка код свой, мб у тебя не от этого провисает. У меня даже при создании 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
986
42
28
19
Реакции
38 0 1
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
105
9
18
22
Реакции
16 0 0
А ты не пробовал пользоваться мошионконтроллерами? Конечно все лагает, ты на каждом юните запускаешь таймер с выполнением в 0.01 сек. Хотя тик на сервере и то 0.033, нахера тебе меньше таймер, если он все равно отсылаться на клиент не будет.
И зачем кучу раз линковать модификатор? Можно один раз и все.
линк модифиера ошибка, я не разобрался как с мотион контроллером сделать, видел пример в dota imba лип потмы, но там так же мотионконтроллер раз в FrameTime() вызывается, и я подумал что легче 1 функцию вызывать
 

ZLOY

Администратор
27 Июн 2016
655
57
28
17
Реакции
51 0 1
Какая разница синхронно или асинхронно? Только проблемы ему добавляешь.

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

I_GRIN_I

Друзья CG
15 Мар 2016
986
42
28
19
Реакции
38 0 1
Какая разница синхронно или асинхронно? Только проблемы ему добавляешь.

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

shesmu

Активный
22 Фев 2018
105
9
18
22
Реакции
16 0 0
Синхронно если, вся логика аддона виснуть будет, пока юнит не появится, ну, а таймер будет не раз в фрейм, а раз в 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
655
57
28
17
Реакции
51 0 1
Синхронно если, вся логика аддона виснуть будет, пока юнит не появится, ну, а таймер будет не раз в фрейм, а раз в 0.05с это де дефолтный тик таймера, мошионконтроллеры скорее всего оптимизированы под перемещения
Чего она виснуть будет?
И откуда ты взял 0.05 хуй знает.
 

I_GRIN_I

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

I_GRIN_I

Друзья CG
15 Мар 2016
986
42
28
19
Реакции
38 0 1
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
655
57
28
17
Реакции
51 0 1
Из файла таймеров, лул, там константой в самом начале тик назначается. Того и будет, что синхронно. Код то дальше не пойдет, пока юниты не появятся.
У тебя видимо своя отдельная библиотека.

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

shesmu

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

I_GRIN_I

Друзья CG
15 Мар 2016
986
42
28
19
Реакции
38 0 1
У тебя видимо своя отдельная библиотека.

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

I_GRIN_I

Друзья CG
15 Мар 2016
986
42
28
19
Реакции
38 0 1
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
986
42
28
19
Реакции
38 0 1
https://github.com/bmddota/barebone...nes/scripts/vscripts/libraries/timers.lua#L72

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

ZLOY

Администратор
27 Июн 2016
655
57
28
17
Реакции
51 0 1
Будет одно и тоже
Всегда 0.01 было.
 

shesmu

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

I_GRIN_I

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