В продолжение серии «умной» игры был создан ещё один видео урок. Цель простая — расчёт наносимого и получаемого урона в зависимости от характеристик персонажа, его экипировки и и различных временных усилений.
Как видим, диаграмма не такая уж и сложная. Всего лишь надо сложить усиления и рассчитать их воздействие на 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 прицела на нужный