Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How do I fix the player not morphing?

Asked by 2 years ago
Edited 2 years ago

I'm trying to make a system where you spawn as a rat in a game I'm making, but the system isn't working despite me having looked up multiple tutorials on the subject. So how do I fix this? Here is the code in "PlayerHandler":

local ss = game:GetService("ServerStorage")
local bs = game:GetService("BadgeService")

local rmodule = require(ss.RatModule)
local umodule = require(ss.UserModule)
repeat wait() until rmodule and umodule

game.Players.PlayerAdded:Connect(function(player)
    umodule.AwardBadge(player, *WELCOMEBADGEID*) -- badge hidden for obvious reasons

    player.CharacterAdded:Wait()
    local rat = umodule.GetRatFromName("Test Rat")

    -- RAT PROCESS:
    -- morphing
    local model = ss.RatModels:FindFirstChild(rat.Model):Clone()
    model.Name = player.Name
    model:SetPrimaryPartCFrame(player.Character:GetPrimaryPartCFrame())

    for _, v in pairs(model:GetDescendants()) do
        if v:IsA("BasePart") or v:IsA("MeshPart") then
            v.Anchored = false
        end
    end

    -- adding scripts
    local scripts = ss.RatScripts:FindFirstChild(rat.ScriptsName)
    if scripts then
        for _, _script in pairs(scripts:GetChildren()) do
            _script:Clone().Parent = model
        end
    end

    -- finishing morph
    player.Character:Destroy()
    player.Character = model
    model.Parent = workspace
end)

Here is the code for the "UserModule":

local dservice = game:GetService("DataStoreService")
local ds = dservice:GetDataStore(*DATASTORENAME*) -- name not shown for privacy purposes

local module = {}

module.Defaults = {
    Defaults = {"Rats", "SelectedRat", "Money"}, -- In Order
    RatDefaults = {
        {
            ["Name"] = "Rat",
            ["Model"] = "Rat"
        }
    },
    RatDefault = "Rat",
    MoneyDefault = 0
}

function module.GetRatFromName(name)
    local ss = script.Parent
    local rmodule = require(ss.RatModule)
    repeat wait() until rmodule
    for _, rat in pairs(rmodule.Rats) do
        if rat.Name == name then
            return rat
        end
    end
    return nil
end

function module.GetUserData(player)
    local user = {}

    local rats = ds:GetAsync("RatData_Rats_" .. player.UserId)
    if rats then
        user.Rats = rats
        -- print("Player rat data exists!")
    end

    local selected = ds:GetAsync("RatData_SelectedRat_" .. player.UserId)
    if selected then
        user.SelectedRat = selected
        -- print("Player selected data exists!")
    end

    local money = ds:GetAsync("RatData_Money_" .. player.UserId)
    if money then
        user.Money = money
        -- print("Player money data exists!")
    end

    return user
end

function module.SetDefaults(player)
    local user = module.GetUserData(player)
    for i = 1, #module.Defaults.Defaults do
        user[module.Defaults.Defaults[i]] = module.Defaults[i + 1]
        ds:SetAsync("RatData_" .. module.Defaults.Defaults[i] .. "_" .. player.UserId, module.Defaults[i + 1])
    end
    return user
end

function module.AwardRat(data, player)
    local user = module.GetUserData(player)
    for _, rat in pairs(user.Rats) do
        if rat.Name == data.Name then
            return false, player.Name .. " already has rat: " .. data.Name
        end
    end
    table.insert(user.Rats, data)
    ds:SetAsync("RatData_Rats_" .. player.UserId, user.Rats)
    return true, player.Name .. "got rat: " .. data.Name
end

function module.AwardBadge(player, id)
    local bs = game:GetService("BadgeService")
    if not bs:UserHasBadgeAsync(player.UserId, id) then
        local success, message = pcall(function()
            bs:AwardBadge(player.UserId, id)
        end)
        return success, message
    end
    return false, "User already has badge"
end

function module.CheckRat(data, player)
    local user = module.GetUserData(player)
    for _, rat in pairs(user.Rats) do
        if rat.Name == data.Name then
            return true
        end
    end
    return false
end

return module

And lastly, here's the "RatModule":

local module = {
    ["Rats"] = {
        {
            ["Name"] = "Rat",
            ["Model"] = "Rat",
            ["ScriptsName"] = "Rat",
            ["Description"] = "the default rat",
            ["UnlockType"] = "Default"
        },
        {
            ["Name"] = "Floppa",
            ["Model"] = "Floppa",
            ["ScriptsName"] = "Floppa",
            ["Description"] = "play raf(2)",
            ["UnlockType"] = "Purchasable"
        },
        {
            ["Name"] = "Test Rat",
            ["Model"] = "TestRat",
            ["ScriptsName"] = "Rat",
            ["Description"] = *DESCRIPTION*, -- description not shown for surprise reasons
            ["UnlockType"] = "Staff"
        }
    },
    ["RatType"] = {
        ["Default"] = 0,
        ["Unlockable"] = 1,
        ["Purchasable"] = 2,
        ["Staff"] = 3,
    }
}

return module

Answer this question