Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Killing rewarding script help?

So, whenever a player kills another player with the sword, it gives the player 20 clashbux. I thought this would work but it didn't. ( I'm still confused with :GetPlayerFromCharacter() )

plr = game.Players:GetPlayerFromCharacter(script.Parent.Parent)
script.Parent.Handle.Touched:connect(function(hit)
	while true do
		wait()
		if hit.Parent.Humanoid ~= nil then
			if hit.Parent.Name ~= plr.Name then
				if hit.Parent.Humanoid.Health == 0 then
					plr.Clashbux.Value = plr.Clashbux.Value + 20
				end
			end
		end
	end
end)

2 answers

✓ Accepted answer

ImageLabel answered the script, Mine actually works:


This is a regular script in WORKSPACE

game:GetService("Players").PlayerAdded:connect(function(plyr)
	local leaderstat = Instance.new("Model", plyr)
	leaderstat.Name = "leaderstats"
	local ClashBux = Instance.new("IntValue", leaderstat)
	ClashBux.Name = "Clashbux"
	plyr.CharacterAdded:connect(function(char)
		local h = char:FindFirstChild("Humanoid")
		if h then
			h.Died:connect(function()
				local tag = h:FindFirstChild("creator")
				if tag then
					tag.Value.leaderstats.Clashbux.Value = tag.Value.leaderstats.Clashbux.Value + 20
				end
			end)
		end
	end)
end)

This one is local script in tool

local Tool = script.Parent;

enabled = true
function onButton1Down(mouse)
	if not enabled then
		return
	end

	enabled = false
	mouse.Icon = "rbxasset://textures\\GunWaitCursor.png"

	wait(.5)
	mouse.Icon = "rbxasset://textures\\GunCursor.png"
	enabled = true

end

function onEquippedLocal(mouse)

	if mouse == nil then
		print("Mouse not found")
		return 
	end

	mouse.Icon = "rbxasset://textures\\GunCursor.png"
	mouse.Button1Down:connect(function() onButton1Down(mouse) end)
end


Tool.Equipped:connect(onEquippedLocal)

SwordScript

r = game:service("RunService")


local damage = 1.5


local slash_damage = 1.6
local lunge_damage = 3

sword = script.Parent.Handle
Tool = script.Parent


local SlashSound = Instance.new("Sound")
SlashSound.SoundId = "rbxasset://sounds\\swordslash.wav"
SlashSound.Parent = sword
SlashSound.Volume = .7

local LungeSound = Instance.new("Sound")
LungeSound.SoundId = "rbxasset://sounds\\swordlunge.wav"
LungeSound.Parent = sword
LungeSound.Volume = .6

local UnsheathSound = Instance.new("Sound")
UnsheathSound.SoundId = "rbxasset://sounds\\unsheath.wav"
UnsheathSound.Parent = sword
UnsheathSound.Volume = 1


function blow(hit)
	if (hit.Parent == nil) then return end -- happens when bullet hits sword

	local humanoid = hit.Parent:findFirstChild("Humanoid")
	local vCharacter = Tool.Parent
	local vPlayer = game.Players:playerFromCharacter(vCharacter)
	local hum = vCharacter:findFirstChild("Humanoid") -- non-nil if tool held by a character
	if humanoid~=nil and humanoid ~= hum and hum ~= nil then
		-- final check, make sure sword is in-hand

		local right_arm = vCharacter:FindFirstChild("Right Arm")
		if (right_arm ~= nil) then
			local joint = right_arm:FindFirstChild("RightGrip")
			if (joint ~= nil and (joint.Part0 == sword or joint.Part1 == sword)) then
				tagHumanoid(humanoid, vPlayer)
				humanoid:TakeDamage(damage)
				wait(1)
				untagHumanoid(humanoid)
			end
		end


	end
end


function tagHumanoid(humanoid, player)
	if not humanoid:FindFirstChild("creator") then
		local creator_tag = Instance.new("ObjectValue")
		creator_tag.Value = player
		creator_tag.Name = "creator"
		creator_tag.Parent = humanoid
		print(player)
	end
end

function untagHumanoid(humanoid)
	if humanoid ~= nil then
		local tag = humanoid:findFirstChild("creator")
		if tag ~= nil then
			tag.Parent = nil
		end
	end
end


function attack()
	damage = slash_damage
	SlashSound:play()
	local anim = Instance.new("StringValue")
	anim.Name = "toolanim"
	anim.Value = "Slash"
	anim.Parent = Tool
end

function lunge()
	damage = lunge_damage

	LungeSound:play()

	local anim = Instance.new("StringValue")
	anim.Name = "toolanim"
	anim.Value = "Lunge"
	anim.Parent = Tool
	
	
	force = Instance.new("BodyVelocity")
	force.velocity = Vector3.new(0,10,0) --Tool.Parent.Torso.CFrame.lookVector * 80
	force.Parent = Tool.Parent.Torso
	wait(.25)
	swordOut()
	wait(.25)
	force.Parent = nil
	wait(.5)
	swordUp()

	damage = slash_damage
end

function swordUp()
	Tool.GripForward = Vector3.new(-1,0,0)
	Tool.GripRight = Vector3.new(0,1,0)
	Tool.GripUp = Vector3.new(0,0,1)
end

function swordOut()
	Tool.GripForward = Vector3.new(0,0,1)
	Tool.GripRight = Vector3.new(0,-1,0)
	Tool.GripUp = Vector3.new(-1,0,0)
end

function swordAcross()
	-- parry
end


Tool.Enabled = true
local last_attack = 0
function onActivated()

	if not Tool.Enabled then
		return
	end

	Tool.Enabled = false

	local character = Tool.Parent;
	local humanoid = character.Humanoid
	if humanoid == nil then
		print("Humanoid not found")
		return 
	end

	t = r.Stepped:wait()

	if (t - last_attack < .2) then
		lunge()
	else
		attack()
	end

	last_attack = t

	--wait(.5)

	Tool.Enabled = true
end


function onEquipped()
	UnsheathSound:play()
end


script.Parent.Activated:connect(onActivated)
script.Parent.Equipped:connect(onEquipped)


connection = sword.Touched:connect(blow)

Then the handle, mesh, etc. You're done!



Hope it helps!

You would have to create a tag of some sort, that will be temporarily parented to the possible victim's Humanoid whenever they are struck by your sword. ROBLOX's gear already have a built-in system that does pretty much what was this -- (CreatorValue). The assassin's player object would be linked as that tag's Value property.

In your leaderboard statistics handler, you would have to refer to the tag's Value to get the murderer, and award them points.


You can refer to this question for help creating the CreatorValue.

Here below is how you would go about getting that value, and using it for rewards and leaderstat manipulation.

local players = game:GetService('Players')
print(players)
players.PlayerAdded:connect(function (player)
	player.CharacterAdded:connect(function (character)
	local humanoid = character:WaitForChild('Humanoid')
	-- waits for humanoid after character and player are
	-- added
		print(player, character)
		humanoid.Died:connect(function ()
			--Humanoid dies
			print(died)
			local list = humanoid:GetChildren()
			-- list of all children of humanoid
			
			for i = 1, #list do
			--iterate
				if list[i].Name == 'CreatorValue' then
				-- if value at iterator is CreatorValue
					local suspect = list[i].Value
					print(suspect:GetFullName())
					-- suspect is murderer
					-- award suspect

					-- player is dead
					-- do something with player
				end
			end
		end)
	end)
end)

5 comments

0

do i just do game.Players[suspect].Clashbux.Value = game.Players[suspect].Clashbux.Value + 20 to award?

0

No, suspect already is the Player, so just do "suspect.Clashbux.Value...."

0

kk

0

You tried man..

0

Lol your answer was unnecessary and inefficient --all you had to do was simply handle point awarding using the creator value :/

This discussion is preserved as it was. New answers, comments, and votes are closed.