ROBLOX — Создание умный урон

Автор: | 6 февраля, 2022
Поделиться...

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

Как видим, диаграмма не такая уж и сложная. Всего лишь надо сложить усиления и рассчитать их воздействие на 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

Поделиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *