Shop System Lua Problem

Hello, so it seems I have been having troubles with two function I wrote myself (SetDoorStatus(num, enabled), GetDoorStatus(num)) for the past four hours, trying to figure out what’s wrong, but found nothing. When I buy a door it does not set the door status of “Opened” to true. On the SetDoorStatus function it’s supposed to say “Test 2”, but it didn’t print, but when I ran it from the console manually it printed “Test 2”. It also doesn’t print an error to the console.

Door Name Layout: shop door doorNum num doorCost

When I run these in the console (lua_run SetDoorStatus(1, true)) they work perfectly fine!


function SetDoorStatus(num, enable)
    for _, d in pairs(ents.FindByClass("prop_door_rotating")) do
        sep = string.Explode(" ", d:GetName())
        if tonumber(sep[2]) == num then
            print("Test 2")
            d:SetNWBool("Opened", enable)
        end
    end
end

function GetDoorStatus(num)
    for _, d in pairs(ents.FindByClass("prop_door_rotating")) do
        sep = string.Explode(" ", d:GetName())
        if tonumber(sep[2]) == num then
            return d:GetNWBool("Opened", false)
        end
    end
    return false
end

function DoorShopInfo(ent, shop, ply)
    local doorNum = shop[3]
    local num = shop[4]
    local shopDoorPrice = tonumber(shop[5])
    if GetDoorStatus(doorNum) == false then
        ply:SetNWString("Info", "Press F To Buy Door For $" .. tostring(shopDoorPrice))
        ply:SetNWBool("ShowInfo", true)
    end
end

function DoorShop(ent, shop, ply)
    local doorNum = shop[3]
    local num = shop[4]
    local shopDoorPrice = tonumber(shop[5])
    if GetDoorStatus(doorNum) == false and ply:GetNWInt("Cash") >= shopDoorPrice then
        SetDoorStatus(doorNum, true)
        SetZombieSpawnsEnabled(num, true)
        ply:SetNWInt("Cash", ply:GetNWInt("Cash") - shopDoorPrice)
        for _, d in pairs(ents.FindByName("door " .. doorNum)) do
            d:Fire("unlock", "", 0)
            d:Fire("open", "", 0)
            d:Fire("lock", "", 0)
        end
        ply:ChatPrint("You have baught a door!")
    end
end

hook.Add("PlayerButtonDown", "GunShop", function (ply, key)
    if key == KEY_F then
        for _, s in pairs(shops) do
            plys = ents.FindInBox(s:LocalToWorld(s:OBBMins()), s:LocalToWorld(s:OBBMaxs()))
            if table.HasValue(plys, ply) then
                local shopName = string.Explode(" ", s:GetName())
                local shopType = shopName[2]
                if shopType == "weapon" then
                    WeaponShop(shopName, ply)
                end
                if shopType == "door" then
                    DoorShop(s, shopName, ply)
                end
            end
        end
    end
end)

Anyone?

Make sure you’re running them server-side; using PlayerButtonDown/Up / KeyDown/Up aren’t reliable. But, I’m pretty sure they are clientside; if they are then make sure you network the purchase to the server.

All of this is server-side. I stopped using Networked Variables because I found out it’s stupid to do that. So I just called variables onto the objects.

Well, the “PlayerButtonDown” hook is shared, so i think you’ll need to run a part of it on the client(not sure about this)

Nope, Shared just means it can run on either or.