Menu
CoddyTech
flag Ar iconالعربيةdown icon

مرة واحدة لكل تلويحة

الدرس 4 من 20 في دورة لعبة Roblox: ساحات القتال على Coddy.

ألحقت ضربة واحدة 30 نقطة ضرر بالدمية. جذرها وساقاها ورأسها أجزاء ثلاثة، وكلها داخل الصندوق، وقد أصاب كل جزء منها كائن Humanoid نفسه.

يحلّ جدول هذه المشكلة: تذكّر كل كائن Humanoid أصابته هذه الضربة، وتجاوز أيًّا منها سبق أن رأيته. يمكن أن تكون مفاتيح الجدول كائنات:

local hit = {}
if humanoid and not hit[humanoid] then
	hit[humanoid] = true
	-- ألحق به الضرر مرة واحدة
end

يُنشأ الجدول داخل swing، لذا تبدأ كل ضربة بجدول فارغ، ويُصاب كلٌّ من العدوين الموجودين في الصندوق مرة واحدة.

challenge icon

التحدي

سهل

داخل swing، أنشئ local hit = {} قبل الحلقة، وألحق الضرر بـ Humanoid فقط إذا لم يكن موجودًا في hit بعد، مع تسجيله عند إلحاق الضرر به.

اضغط على Play، ثم Check.

جرّب بنفسك

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local lastSwing = {} -- player -> وقت آخر ضربة سيف نفّذها

-- حركات السيف الخاصة بـRoblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

print("Swords deal " .. Settings.SwordDamage .. " damage")

-- ضربة بالسيف: تُشغَّل الحركة، ثم يُصاب كل من يقع داخل الصندوق أمامك
local function swing(player)
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if not root or character.Humanoid.Health <= 0 then
		return
	end
	local now = time()
	if lastSwing[player] and now - lastSwing[player] < Settings.SwingCooldown then
		return
	end
	lastSwing[player] = now
	character.Humanoid.Animator:LoadAnimation(slash):Play()
	-- الصندوق أمامك، وليس جسمك أبدًا
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
		local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
		if humanoid then
			humanoid:TakeDamage(Settings.SwordDamage)
		end
	end
end

-- يحصل كل لاعب على Kills في لوحة المتصدرين، وعلى سيف في كل مرة يعود فيها إلى الحياة
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local kills = Instance.new("IntValue")
	kills.Name = "Kills"
	kills.Parent = leaderstats

	player.CharacterAdded:Connect(function()
		local sword = ServerStorage.Sword:Clone()
		sword.Parent = player.Backpack
		sword.Activated:Connect(function()
			swing(player)
		end)
	end)
end)
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Roblox: ساحات القتال