Скинь ка код свой, мб у тебя не от этого провисает. У меня даже при создании 40 юнитов мгновенно не лагаетпрекеша партикля и юнита кстати не хватает, фпс до 12 падает так же
Скинь ка код свой, мб у тебя не от этого провисает. У меня даже при создании 40 юнитов мгновенно не лагаетпрекеша партикля и юнита кстати не хватает, фпс до 12 падает так же
Скинь ка код свой, мб у тебя не от этого провисает. У меня даже при создании 40 юнитов мгновенно не лагает
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 )
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
А ты не пробовал пользоваться мошионконтроллерами? Конечно все лагает, ты на каждом юните запускаешь таймер с выполнением в 0.01 сек. Хотя тик на сервере и то 0.033, нахера тебе меньше таймер, если он все равно отсылаться на клиент не будет.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 )
Это код для проджектайла с возможностью его сломать дать ему абилку, перепрыгнуть его и изменить направление в полете, а 30+ потому что 30+ мобов кастуют этот скилл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
линк модифиера ошибка, я не разобрался как с мотион контроллером сделать, видел пример в dota imba лип потмы, но там так же мотионконтроллер раз в FrameTime() вызывается, и я подумал что легче 1 функцию вызыватьА ты не пробовал пользоваться мошионконтроллерами? Конечно все лагает, ты на каждом юните запускаешь таймер с выполнением в 0.01 сек. Хотя тик на сервере и то 0.033, нахера тебе меньше таймер, если он все равно отсылаться на клиент не будет.
И зачем кучу раз линковать модификатор? Можно один раз и все.
Синхронно если, вся логика аддона виснуть будет, пока юнит не появится, ну, а таймер будет не раз в фрейм, а раз в 0.05с это де дефолтный тик таймера, мошионконтроллеры скорее всего оптимизированы под перемещенияКакая разница синхронно или асинхронно? Только проблемы ему добавляешь.
Хоть 0.0001 сек напиши, но таймер будет выполнятся не чаще чем раз в кадр.
Синхронно если, вся логика аддона виснуть будет, пока юнит не появится, ну, а таймер будет не раз в фрейм, а раз в 0.05с это де дефолтный тик таймера, мошионконтроллеры скорее всего оптимизированы под перемещения
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.05с это де дефолтный тик таймера, мошионконтроллеры скорее всего оптимизированы под перемещения
Из файла таймеров, лул, там константой в самом начале тик назначается. Того и будет, что синхронно. Код то дальше не пойдет, пока юниты не появятся.Чего она виснуть будет?
И откуда ты взял 0.05 хуй знает.
Наверное, потому что ты при подключении модификатора не указываешь, что там motion_horizontal, vertical или bothВот что есть у модифиера перемещения чего нет у меня, я кстати так подумал, можно даже не в фрейм тайм перемещать, а в 0.1-0.2, партикль и так плавно лететь будет, а для самого юнита этого более чем достаточно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
У тебя видимо своя отдельная библиотека.Из файла таймеров, лул, там константой в самом начале тик назначается. Того и будет, что синхронно. Код то дальше не пойдет, пока юниты не появятся.
https://developer.valvesoftware.com.../Scripting/API#CDOTA_Modifier_Lua_Motion_Both ? Я не нашел никаких примеров применения, мб плохо искал, но если не трудно объясни плз как этим пользоватсяНаверное, потому что ты при подключении модификатора не указываешь, что там motion_horizontal, vertical или both
У тебя видимо своя отдельная библиотека.
Не пойдет, но юниты спаунится быстрее не начнут и при спауне большого кол-ва крипов будет так же лагать
https://developer.valvesoftware.com.../Scripting/API#CDOTA_Modifier_Lua_Motion_Both ? Я не нашел никаких примеров применения, мб плохо искал, но если не трудно объясни плз как этим пользоватся
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
LinkLuaModifier('modifier_nature_wisp', "modifiers/modifier_nature_wisp",LUA_MODIFIER_MOTION_HORIZONTAL)
Но заметных лагов при появлении не будет, как обычно в кастомках при старте спавна сначала пролаг.https://github.com/bmddota/barebone...nes/scripts/vscripts/libraries/timers.lua#L72
И они будут таки спаунится друг за другом, так что займет это примерно одно и тоже время
Поищи по moddota cube.fbx, если не поймешь, что там делают, напишиПытаюсь добавить хитбокс модели, но мне пишет Model needs to have a skeleton in order to add hitboxes, что за скелет и как его сделать используя только воркшоп доты?
Спасибо, нашелПоищи по moddota cube.fbx, если не поймешь, что там делают, напиши