В продолжение серии «умной» игры был создан ещё один видео урок. Цель простая — расчёт наносимого и получаемого урона в зависимости от характеристик персонажа, его экипировки и и различных временных усилений.

Как видим, диаграмма не такая уж и сложная. Всего лишь надо сложить усиления и рассчитать их воздействие на Humanoid-а.
Так как в видео всё объяснялось, то тут я приведу использованные скрипты.
Начту с основного модуля:
local damage = {}
local function Attack(character) -- расчёт суммарного урона
local ret = 0
local hum = character:FindFirstChildOfClass("Humanoid")
if hum then
local at = hum.Parent:FindFirstChild("Attack")
if at then
local tmp = at:GetChildren()
for a,b in pairs(tmp) do
if b.ClassName == "IntValue" then
ret = ret + b.Value
end
end
end
end
warn("All Attack = ", ret)
return ret
end
local function Shield(character) -- расчёт суммарной защиты
local ret = 0
local hum = character:FindFirstChildOfClass("Humanoid")
if hum then
local at = hum.Parent:FindFirstChild("Shield")
if at then
local tmp = at:GetChildren()
for a,b in pairs(tmp) do
if b.ClassName == "IntValue" then
ret = ret + b.Value
end
end
end
end
warn("All Shield = ", ret)
return ret
end
function damage.Damage(_from, _to, _default) -- от кого, кому, сколько ПЕРСОНАЖИ
local dmg = _default
if dmg == nil then
dmg = Attack(_from)
else
warn("Def Attack: ",dmg)
end
local shl = Shield(_to)
local res = dmg - shl
if res < 1 then
res = 1
end
print("result = ", res)
_to.Humanoid:TakeDamage(res)
end
return damage
Ничего сверхестественного в нём нет. Одна функция считает суммарную атаку, вторая расчитывает суммарную защиту, ну а третья собственно и наносит урон в виде их разницы.
Там же где надо воспользоваться данным модулем, мы его подключаем стандартным образом:
local myDamage = require(game.ReplicatedStorage.myDamage) -- подключение модульного скрипта
После чего меняем стандартную строку нанесения урона на запрос из модуля:
--- humanoid:TakeDamage(ATTACK_DAMAGE) -- !!!!! строка нанесения урона !!!! myDamage.Damage(script.Parent, humanoid.Parent)
Вот и всё использование. Простенько и.. со вкусом. 🙂
Разве что в персонаже (по соседству с Humanoid) должны быть папки Attack и Shield в которые и набрасываются расчётные бонусы. Например от брони, бижы, бафов и т.д. и т.п.

Добавлю кое что ещё в качестве «бонуса». Как вы видели, в модуле используется GetChildren(), а следовательно, для временных усилений можно под переменную добавить простейший скрипт, который будет её уничтожать по истечению времени или менять её значение. Например,
-- уменьшаем значение на 1 каждую секунду -- по достижении нуля - уничтожаем переменную local me = script.Parent local val = me.Value while val>0 do wait(1) me.Value = me.Value - 1 end me.Parent = nil
Пж скажи а как сделать чтобы я стрелял из оружия и если попадал по игроку то менялся цвет прицела и обратно
1. Если оружие (сервер) фиксирует попадание, то делай вызов клиента который стрелял через RemoteEvent
2. При получении вызова меняй GUI прицела на нужный