Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Как его изменить? Скорость юнитов не опускается ниже, чем 100. Искал в API по тегу move, ничего годного не нашел.
MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE_MIN работает только если задавать значения выше 100
Единственный способ снизить ниже 100, который я нашел:
MODIFIER_PROPERTY_MOVESPEED_LIMIT, но он устанавливает не нижний, а верхний предел. Если его установить меньше 100, то скорость станет неизменяемо равна установленному значению.
Есть ли какая-то функция, или комбинация функций, чтобы убрать нижний предел? Или даже в такой простой задаче нужно извращаться?
Смотря, для чего тебе это надо. Можешь, например, на 100 давать корни (root) и у тебя перс не будет дввигаться. А у юнита отдельный флаг для этого дела есть (ну героям тоже можно поставить).
Смотря, для чего тебе это надо. Можешь, например, на 100 давать корни (root) и у тебя перс не будет дввигаться. А у юнита отдельный флаг для этого дела есть (ну героям тоже можно поставить).
Мне нужно, чтобы при сильном или многократном замедлении, скорость юнита могла принимать принимать значения мньше 100
Например у чувака 300 мс, ему кидают замедление на 80%. По математике его скорость должна стать 60, но из-за этого ограничения она станет равной 100. Хочу чтобы замедления всегда работали по математике.
Все просто, всегда перед расчетами процентов вычитывай сотню. Если у объекта скорость 300, и тебе нужно замедлить на 80%, вычитай 100, получай 200 и замедляй до 40. В конечном итоге объект будет со скоростью 140 - все по математике.
Ну а можно ли понижать эти базовые 100 лично я не знаю.
Все просто, всегда перед расчетами процентов вычитывай сотню. Если у объекта скорость 300, и тебе нужно замедлить на 80%, вычитай 100, получай 200 и замедляй до 40. В конечном итоге объект будет со скоростью 140 - все по математике.
Это конечно тоже полезно, но мне не это нужно. 20% от 300 по прежнему составляют 60, а не 140. Нужно, чтобы замедления работали так как работают, просто скорость могла бы опускаться и ниже, чем 100.
Сделал все-таки модификатор с MODIFIER_PROPERTY_MOVESPEED_LIMIT
Внутри него вычисляется скорость. Берется базовая, к ней добавляются константные модификаторы, и полученный результат умножается на процентные.
Я пока нашел способ получать значение модификатора только с помощью modifier:GetAbility():GetSpecialValueFor( ... ), если знаете способ проще, то расскажите пожалуйста. Ведь у многих способностей/предметов разные ключи, соответствующие значениям изменения скорости. Например у Battle Hunger за замедление отвечает slow а у Rot - rot_slow. Все эти теги придется перебирать вручную, при этом отличать константные модификаторы от процентных. А если у них еще и ключи будут пересекаться, то вообще лучше сдохнуть. В коде, который я привел ниже, только по одному ключу на константные и процентные модификаторы, потом допишу все остальные.
Код:
speed_controller = class( {} )
function speed_controller:GetAttributes()
return MODIFIER_ATTRIBUTE_PERMANENT
end
function speed_controller:OnCreated( kv )
self.base_speed = self:GetParent():GetBaseMoveSpeed()
self:StartIntervalThink( 0.1 )
self:OnIntervalThink()
end
function speed_controller:OnIntervalThink()
self.added_speed = self.base_speed
local modifier_value
modifiers = self:GetParent():FindAllModifiers()
for _, modifier in pairs( modifiers ) do
if modifier then
local ability = modifier:GetAbility()
if ability then
modifier_value = ability:GetSpecialValueFor( "bonus_movement_speed" )
if modifier_value then
self.added_speed = self.added_speed + modifier_value
end
end
end
end
self.real_speed = self.added_speed
for _, modifier in pairs( modifiers ) do
if modifier then
local ability = modifier:GetAbility()
if ability then
modifier_value = ability:GetSpecialValueFor( "movespeed_slow" )
if modifier_value then
self.real_speed = self.real_speed + self.added_speed * modifier_value / 100
end
end
end
end
print( self.real_speed )
end
function speed_controller:DeclareFunctions()
local funcs = {
MODIFIER_PROPERTY_MOVESPEED_LIMIT
}
return funcs
end
function speed_controller:GetModifierMoveSpeed_Limit( kv )
return self.real_speed
end
Но результат меня очень порадовал. Скорость опускается не только ниже 100, но и ниже 0. При этом герой двигается в сторону, противоположную той, в которую ему надо идти. Это конечно очень весело и забавно, и хоть для моего мода такая наркомания будет более чем уместна, отрицательная скорость не имеет смысла, так как обездвиживание явно более полезно. Поэтому надо бы еще и проверку на отрицательность добавить в OnIntervalThink и, если меньше нуля устанавливать, real_speed в 1.