What I’m trying to achieve here is the usage of spells through module scripts. What my problem is I don’t know how to make it so if you say the spell “Incendia” it does what’s in the module script (Second Code) I’ve just started to learn about module scripts so I'm stuck on this. If you need more clarification I will provide
local Code = {} local Players = game.Players local ReplicatedStorage = game.ReplicatedStorage local Modules = ReplicatedStorage.RModules local TweenModule = require(Modules.Tweening) local Assets = ReplicatedStorage.ReplicatedAssets local WitchFolder = Assets.WitchesAssets local AnimationsFolder = Assets.Animations local EffectsFolder = Assets.Effects local SoundsFolder = Assets.Sounds local RemoteEvents = ReplicatedStorage.RemoteEvents local PlayAnimationEvent = RemoteEvents.AnimationClientEvent local t = 1 function Code.Execute(Character,ContentTable) local Player = Players:GetPlayerFromCharacter(Character) local Target = ContentTable.Target local TargetPlayer = ContentTable.TargetPlayer local Damage Damage = 2 local fire = ReplicatedStorage.FireParticle.Fire:Clone() fire.Parent = Target.UpperTorso local result = 15 * t for t = 1,result,1 do Target.Humanoid.Health -= Damage wait(0.2) end fire:Destroy() end return Code
Here's the second code:
local ReplicatedStorage = game.ReplicatedStorage local Storage = ReplicatedStorage.SpellsModules local Spells = { ["Incendia"] = { Launch = Storage.Incendia, Input = Enum.UserInputType.MouseButton1, Cooldown = 8, Spell= "Incendia", Magnitude = 30, Magic = 60, }, } return Spells
To find the spells name when you say it in chat:
local ClickEvent local WitchSpellEvent = RemoteEventFolder.WitchSpell local function WitchTyped(msg) local SpellsModule = require(ReplicatedStorage.r.SpellsConfiguration) local FilteredMessage = msg:lower():gsub("\r","") print("Client said ''"..msg.."''") local function IdentifyTarget() local Target = Mouse.Target if Target.Parent == nil then return end if Target.Parent:FindFirstChildOfClass("Humanoid") ~= nil then return Target.Parent elseif Target.Parent:IsA("Accessory") and Target.Parent.Parent:FindFirstChildOfClass("Humanoid") ~= nil then return Target.Parent.Parent end end for SpellName,Table in pairs(SpellsModule) do local incantation = Table.Key:lower() local inputType = Table.Input if FilteredMessage == incantation then if inputType == Enum.UserInputType.TextInput then WitchSpellEvent:FireServer({IncantationText = incantation}) elseif inputType == Enum.UserInputType.MouseButton2 then if ClickEvent ~= nil then ClickEvent:Disconnect() print("disconnected last event spell!") end ClickEvent = UserInputService.InputBegan:Connect(function(Input,Processed) if Processed then return end if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then local target = IdentifyTarget() print("Clicked!") if target ~= nil then WitchSpellEvent:FireServer({IncantationText = incantation,Target = target}) ClickEvent:Disconnect() print("sent signal!") end end end) end elseif string.find(FilteredMessage,incantation) ~= nil and Table.Input == Enum.UserInputType.InputMethod then if string.split(FilteredMessage,incantation.." ") ~= "" then --print(incantation) --print(string.split(msg:gsub("\r",""),incantation.." ")[2]) local char = string.split(msg:gsub("\r",""),incantation.." ")[2] WitchSpellEvent:FireServer({IncantationText = incantation,TextTarget = char}) end end end end Player.Chatted:Connect(WitchTyped)
What you have so far is a very nice approach by not having to repeat your code. The only thing I would do if I were to make this myself is to define the spell's configuration in the same module script you use to contain the spell's function. It's more convenient that way because you don't have to hop from two scripts, one being a probably massive master module for your spell's configurations.
I will take the current setup you have into consideration as I am unaware of your usage of this. In the master spell config module, I would just run the module script and get the execute function from there. Considering that you mentioned that you desire to make the spell get activated when they say the spell's name, then I would consider the following. Whether or not you literally want to do this, you should still consider it just in case: I would probably have an Activator
index that specifies the type which is a string, whether that is input (the type could be "input") or through a chat message (the type could be "chat_message"):
local ReplicatedStorage = game.ReplicatedStorage local Storage = ReplicatedStorage.SpellsModules local Spells = { ["Incendia"] = { Launch = require(Storage.Incendia), Activator = { ["type"] = "chat_message", ["content"] = "incendia" }, Cooldown = 8, Spell= "Incendia", Magnitude = 30, Magic = 60 } } return Spells
And for how you call them, for example:
for _, spell_config in pairs(MasterSpellConfig) do local activatorConfig = spell_config.Activator local activatorType = activatorConfig.type if (activatorType == "input") then -- use InputBegan connection and call whenever it is appropriate UserInputService.InputBegan:Connect(function(input) if (input.UserInputType == activatorConfig.input) then spell_config.Launch.Execute() end end) elseif (activatorType == "chat_message") then -- use player.Chatted event Player.Chatted:Connect(function(msg) if (msg == "content") then spell_config.Launch.Execute() end end) end end