my bad, the new link is WCS - Combat System Framework | WCS
how could i add things like custom music for character or just simply modifying Guis, or how i could access the client on a skill?, like
should i use OnConstructClient or OnConstructServer?
I have a folder called “Misc” on replicatedstorage
- Misc
— SprintModule
— CustomMusic
And also, another question, should i just do RegisterDirectory(directory)
On a folder that contains another folder that contains modules ?, or i need to register the directory of that specific subfolder?
Sorry If I’m Asking too much , I am much kinda new to these things, Anyways, Awesome module
how could i add things like custom music for character or just simply modifying Guis
As usual. WCS has nothing to do with GUI’s or Music. It covers structure of your combat system, not your game. Information for GUIs can be retrieved using exposed apis.
And also, another question, should i just do
RegisterDirectory(directory)
On a folder that contains another folder that contains modules ?, or i need to register the directory of that specific subfolder?
You can do RegisterDirectory(directory)
on a folder that has another folder.
Internally all it does is just requires all modulescripts descendants for WCS to add skills into internal tables
alright thank u so much!, a suggestion, you should add a method to get the time left on a cooldown to be used again
and a custom inventory hotbar showing it would be killer 2.0!
Sorry for bothering you again, but I was wondering how you would do a damage buff status effect. I vaguely understand the :HandleDamage() function, just I don’t really get how you would handle outgoing damage rather than incoming.
you can’t edit outgoing damage, handle this inside a status effect of your enemy to increase incoming damage
Just sharing a bit of my progress with the framework:
This uses both WCS and refx btw.
Are you using another framework to organize your scripts and localscripts?, if so, can you tell me which one?, and how did you make the cooldown time left visual thingy? would help me a lot
Also, that looks sick as hell, keep it up
Firstly, no I’m not using any framework for organization, I just have a lot of folders in replicated storage properly labeled:
And since the framework lets you handle most things within the constructors, I don’t have that many local scripts in the first place.
And the cooldown timer on the buttons is pretty simple, just a while loop that does task.wait(1) every second and changes the text label to fit the current time.
Okay, thank you, one last question, are you using your own hitbox? or using the damageContainer function from the api?
The damageContainer function has nothing to do with actual hitboxes, its just a way to handle damage with the framework. So no, I’m using my own hitboxes
This looks fire Keep up the work!
Hey, i use the On Moveset changed, is it a function?, because when i do Character.MovesetChanged
:Connect(function(newmoveset, oldmoveset) on the client, it doesn’t works
possibly doesn’t fire first time, running the callback for :GetMovesetName(), nil
error
Players.SanJoseYTXD.PlayerScripts.ClientInitializer:72: attempt to index nil with ‘Connect’ - Client - ClientInitializer:72
18:29:44.072 Stack Begin - Studio
18:29:44.072 Script ‘Players.SanJoseYTXD.PlayerScripts.ClientInitializer’, Line 72 - Studio - ClientInitializer:72
18:29:44.072 Stack End - Studio
Can’t tell whats wrong without seeing your code
Nevermind, i got it fixced, anyways, i found another error, there’s no message printed on the console
here’s my modules
clientHandler Module
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local modules = ReplicatedStorage:WaitForChild("modules")
local WCS = require(modules:WaitForChild("wcs"))
local Skills = ReplicatedStorage:WaitForChild("skills")
local skillsFolder = ReplicatedStorage:WaitForChild("skills")
local HakariFolder = Skills:WaitForChild("hakari")
local localfolder = HakariFolder:WaitForChild("local")
local uisFolder = HakariFolder:WaitForChild("uis")
local hakari_clientUI = uisFolder:WaitForChild("hakari_client")
local handle_client = WCS.RegisterSkill("ClientHandler")
local players = game:GetService("Players")
local localPlayer = players.LocalPlayer
local Character = WCS.Character
local UserInputService = game:GetService("UserInputService")
function handle_client:getCurrentWCS_Character()
local characterModel = localPlayer.Character
if not characterModel then return end
return Character.GetCharacterFromInstance(characterModel)
end
function handle_client:OnConstructClient()
print("Hi, client handler constructed on client ")
-- get some skills hakari // --
self.getlightcombat = self.Character:GetSkillFromString("lightcombat")
-- ///// common variables
local player = self.Player
local character = player.Character
-- /////
--self.Destroyed:Connect(function()
-- self.Theme:Stop()
--self.cloneHakariUI:Destroy()
--end)
-- // self. variables
self.cloneHakariUI = hakari_clientUI:Clone()
self.cloneHakariUI.Parent = player.PlayerGui
self.Theme = self.cloneHakariUI:WaitForChild("jackpot")
self.Theme.Looped = true
self.Theme:Play()
-- ///////
-- charactersSkillsModules.lua --
-- ///////////
-- moveset table --
local movesetNames = {
[1] = {
movesetName = "hakari",
skillsNames = {
"lightcombat",
}
},
}
local WCS_Char = self.getCurrentWCS_Character()
-- // hakari // --
-- dw
local hakariMoveSetTable = movesetNames[1]
local hakariMoveSetName = hakariMoveSetTable.movesetName
local hakariMoveSetSkills = hakariMoveSetTable.skillsNames
local lightcombatName = hakariMoveSetSkills[1]
UserInputService.InputBegan:Connect(function(Input, GameProcessed)
if GameProcessed then return end
if Input.UserInputState ~= Enum.UserInputState.Begin then return end
if Input.UserInputType == Enum.UserInputType.MouseButton1 then
local character = self.getCurrentWCS_Character()
if not character then return end
if character:GetMoveset(hakariMoveSetName) then
for _, skillsnames in pairs(hakariMoveSetSkills) do
if skillsnames then
if character:GetSkillFromConstructor(lightcombatName) then
self.getlightcombat:Start()
else
warn("no lightcombat for ".. localPlayer:GetFullName())
end
end
end
else
warn("no moveset named ".. tostring(hakariMoveSetName) .. " for ".. localPlayer:GetFullName())
end
end
end)
--print(self.getlightcombat:GetCooldownTimeLeft())
--print(self.getlightcombat:getstate())
end
function handle_client:HandleServerMessage(message)
if message == "disableTheme" then
warn("DISABLED THEME WOWOWWWWW")
end
end
return handle_client
ServerHandler Module :
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local modules = ReplicatedStorage:WaitForChild("modules")
local WCS = require(modules:WaitForChild("wcs"))
local Skills = ReplicatedStorage:WaitForChild("skills")
local skillsFolder = ReplicatedStorage:WaitForChild("skills")
local HakariFolder = Skills:WaitForChild("hakari")
local localfolder = HakariFolder:WaitForChild("local")
local uisFolder = HakariFolder:WaitForChild("uis")
local hakari_clientUI = uisFolder:WaitForChild("hakari_client")
local handle_server = WCS.RegisterSkill("ServerHandler")
local players = game:GetService("Players")
local Character = WCS.Character
function handle_server:OnConstructServer()
print("Hi, server handler constructed on server ")
local player = self.Player
local charactermodel = player.Character
local Humanoid = charactermodel:WaitForChild("Humanoid") or charactermodel:FindFirstChildWhichIsA("Humanoid")
task.wait(.1)
if Humanoid then
warn("got hum")
Humanoid.Died:Once(function()
warn("send")
self:SendMessageToClient("disableTheme")
end)
end
end
function handle_server:HandleClientMessage(type_)
if type_ == "nil" then
warn("wowwwwwwwwwww")
end
end
return handle_server
The bug here is that it doesn’t fires when i send the “disableTheme” message to the client, why?
specifics parts :
if Humanoid then
warn("got hum")
Humanoid.Died:Once(function()
warn("send")
self:SendMessageToClient("disableTheme")
end)
end
function handle_client:HandleServerMessage(message)
if message == "disableTheme" then
warn("DISABLED THEME WOWOWWWWW")
end
end
this is how i organized my things :
those shouldn’t be skills at all