I’ve made a skill framework , but for some reason firing remote events to the server causes it to replicate each time you use it. For example, the first time you use it the server recieves it once, then the second time it recieves it twice, then 3 times, 4, 5, etc. It’s weird and i dont know what the fix is.
Client:
local Player = game.Players.LocalPlayer
local Character = script.Parent
local UserInputService = game:GetService("UserInputService")
local RS = game:GetService("ReplicatedStorage")
local Server = RS.Remotes.Server
local InputRemote = RS.Remotes.Inputs
local EffectEvent = RS.Remotes.VFX
local Skillsets = require(RS.Modules.Skillsets)
local BaseEffects = {}
local Required = {}
local Availablesets = {
"TestSkillSet",
}
local InputBegan = coroutine.create(function()
UserInputService.InputBegan:Connect(function(UserInput,GPE)
if GPE then return end
local Skill, Set, Info, Input = nil, nil, nil, nil
if UserInput.UserInputType == Enum.UserInputType.MouseButton1 then
Input = "M1"
Info = {Data = "Test"}
else
Input = UserInput.KeyCode.Name
Info = {Data = "Test"}
end
for i, v in pairs(Availablesets) do
if Skillsets[v] then
if Skillsets[v][Input] then
Skill = Skillsets[v][Input]
Set = v
end
end
end
if Skill then
InputRemote:FireServer("InputBegan", UserInput.KeyCode.Name)
local Fire = Server:FireServer(Skill["Name"], Set, Info)
end
end)
end)
local InputEnded = coroutine.create(function()
UserInputService.InputEnded:Connect(function(Input, GPE)
if Character:GetAttribute("Attacking") == true then
print("InputEnded")
InputRemote:FireServer("InputEnded", Input.KeyCode.Name)
end
end)
end)
coroutine.resume(InputBegan)
coroutine.resume(InputEnded)
EffectEvent.OnClientEvent:Connect(function(...)
local SkillSetName, Params = unpack(...)
print(SkillSetName, Params)
local Module
for i, v in pairs(script:GetDescendants()) do
if v:IsA("ModuleScript") then
if v.Name == SkillSetName then
Module = v
end
end
end
local Remote = game.ReplicatedStorage.Remotes.Test
Module = require(Module)
Module[Params["FXName"]](Player, Params)
end)
Server:
local RS = game:GetService("ReplicatedStorage")
local ServerRemote = RS.Remotes.Server
local Inputs = require(RS.Modules.Inputs)
local Functions = require(RS.Modules.Functions)
local CV = require(game.ServerStorage.Modules.CombatValues)
local AVS = require(game.ServerStorage.Modules.AvailableSets)
local Cooldowns = require(game.ServerStorage.Modules.Cooldown)
ServerRemote.OnServerEvent:Connect(function(Player, SkillName, SkillSet, Data)
local C = CV[Player.Character]
local AvailableSets = AVS[Player.Character]
if not AvailableSets[SkillSet] or Cooldowns:CheckCooldown(SkillName, Player) then return end
print("SetAvailable!")
if not C.Stunned or not C.Attacking then
local module
module = require(script.Skills[SkillSet])
module[SkillName](Player, Data)
end
end)
Server module that recieves the remote event:
local Functions = require(game.ReplicatedStorage.Modules.Functions)
local Cooldowns = require(game.ServerStorage.Modules.Cooldown)
local CV = require(game.ServerStorage.Modules.CombatValues)
local Remote = game.ReplicatedStorage.Remotes.Test
local Test = {
["Test"] = function(Player, ...)
local Character = Player.Character
local C = CV[Character]
C.Attacking = true
task.delay(1, function()
C.Attacking = false
end)
Functions.FireClientWithDistance(
{Origin = Character.HumanoidRootPart.Position,
Distance = 125,
Remote = game.ReplicatedStorage.Remotes.VFX},
{"TestSkillSet", {FXName = "Test" , Data = {Character = Character},} })
Cooldowns:AddCooldown("Test", 3, Player)
Remote.OnServerEvent:Connect(function(player)
print("serverrecievedfromclient")
end)
end,
["Test2"] = function(Player, ...)
local Character = Player.Character
local C = CV[Character]
C.Attacking = true
task.delay(1, function()
C.Attacking = false
end)
Cooldowns:AddCooldown("Test2", 3, Player)
end,
}
return Test
Client Module that fires the event:
local Remote = game.ReplicatedStorage.Remotes.Test
local TestSkillSet = {
["Test"] = function(Player, Params)
Remote:FireServer()
end,
}
return TestSkillSet