Вопрос Помогите пофиксить

  • 26
  • 0
Контакты для связи отсутствуют.
Вообщем есть система. Вроде всё правильно, но при вводе команды delol ничего не происходит.
Помогите исправить
Серверная часть:
-- Серверная часть скрипта
util.AddNetworkString("GetPlayerInfo")
util.AddNetworkString("OpenPlayerInfo")

-- Функция для получения информации об игроке из файла
local function GetPlayerInfo(target, ply)
    local path = "player_info/" .. target .. ".txt"
    if not file.Exists(path, "DATA") then return end

    local info = {}
    info.steamid = target
    info.job = file.Read("player_info/" .. target .. ".txt", "DATA")
    info.notes = ""

    net.Start("OpenPlayerInfo")
    net.WriteTable(info)
    net.Send(ply)
end

-- Функция для сохранения информации об игроке в файл
function SavePlayerInfoPD(target, job, notes)
    local path = "player_info/" .. target .. ".txt"
    file.Write(path, job)
end

-- Серверная функция для проверки профессии игрока
function CanEditPlayerInfoPD(ply)
    local team = ply:Team()
    return team == TEAM_GENERAL or team == TEAM_CHIEF
end

-- Серверная функция для обработки изменения личного дела игрока
net.Receive("SavePlayerInfo", function(len, ply)
    if not CanEditPlayerInfoPD(ply) then return end
    local target = net.ReadString()
    local job = net.ReadString()
    local notes = net.ReadString()
    SavePlayerInfoPD(target, job, notes)
end)

-- Сетевое сообщение для получения информации об игроке
net.Receive("GetPlayerInfo", function(len, ply)
    if not CanEditPlayerInfoPD(ply) then return end
    local target = net.ReadString()
    GetPlayerInfo(target, ply)
end)
Клиенсткая часть:
-- Клиентская часть скрипта
surface.CreateFont("PlayerInfoTitle", {
    font = "Arial",
    size = 24,
    weight = 500
})

surface.CreateFont("PlayerInfoText", {
    font = "Arial",
    size = 18,
    weight = 400
})

-- Функция для создания Derma меню с информацией об игроке
local function CreatePlayerInfoMenu(info)
    local frame = vgui.Create("DFrame")
    frame:SetSize(400, 300)
    frame:Center()
    frame:SetTitle("Личное дело")
    frame:SetVisible(true)
    frame:SetDraggable(false)
    frame:ShowCloseButton(true)
    frame:MakePopup()

    local title = vgui.Create("DLabel", frame)
    title:SetPos(10, 30)
    title:SetFont("PlayerInfoTitle")
    title:SetText(info.name)
    title:SizeToContents()

    local jobLabel = vgui.Create("DLabel", frame)
    jobLabel:SetPos(10, 70)
    jobLabel:SetFont("PlayerInfoText")
    jobLabel:SetText("Работа: " .. info.job)
    jobLabel:SizeToContents()

    local steamidLabel = vgui.Create("DLabel", frame)
    steamidLabel:SetPos(10, 100)
    steamidLabel:SetFont("PlayerInfoText")
    steamidLabel:SetText("Steam ID: " .. info.steamid)
    steamidLabel:SizeToContents()

    local notesLabel = vgui.Create("DLabel", frame)
    notesLabel:SetPos(10, 130)
    notesLabel:SetFont("PlayerInfoText")
    notesLabel:SetText("Примечания: " .. info.notes)
    notesLabel:SizeToContents()

    if CanEditPlayerInfo(LocalPlayer()) then
        local editButton = vgui.Create("DButton", frame)
        editButton:SetPos(10, 200)
        editButton:SetSize(100, 30)
        editButton:SetText("Изменить")
        editButton.DoClick = function()
            local editFrame = vgui.Create("DFrame")
            editFrame:SetSize(300, 200)
            editFrame:Center()
            editFrame:SetTitle("Изменить личное дело")
            editFrame:SetVisible(true)
            editFrame:SetDraggable(false)
            editFrame:ShowCloseButton(true)
            editFrame:MakePopup()

            local jobLabel = vgui.Create("DLabel", editFrame)
            jobLabel:SetPos(10, 30)
            jobLabel:SetFont("PlayerInfoText")
            jobLabel:SetText("Должность:")
            jobLabel:SizeToContents()

            local jobEntry = vgui.Create("DTextEntry", editFrame)
            jobEntry:SetPos(10, 50)
            jobEntry:SetSize(280, 20)
            jobEntry:SetText(info.job)

            local notesLabel = vgui.Create("DLabel", editFrame)
            notesLabel:SetPos(10, 80)
            notesLabel:SetFont("PlayerInfoText")
            notesLabel:SetText("Примечания:")
            notesLabel:SizeToContents()

            local notesEntry = vgui.Create("DTextEntry", editFrame)
            notesEntry:SetPos(10, 100)
            notesEntry:SetSize(280, 20)
            notesEntry:SetText(info.notes)

            local saveButton = vgui.Create("DButton", editFrame)
            saveButton:SetPos(10, 150)
            saveButton:SetSize(100, 30)
            saveButton:SetText("Сохранить")
            saveButton.DoClick = function()
                net.Start("SavePlayerInfo")
                net.WriteString(info.steamid)
                net.WriteString(jobEntry:GetValue())
                net.WriteString(notesEntry:GetValue())
                net.SendToServer()
                editFrame:Close()
            end
        end
    end
end

-- Сетевое сообщение для получения информации об игроке
net.Receive("OpenPlayerInfo", function()
    local info = net.ReadTable()
    CreatePlayerInfoMenu(info)
end)

concommand.Add("delol", function(ply, cmd, args)
    if not args[1] then return end
    net.Start("GetPlayerInfo")
        net.WriteString(args[1])
    net.SendToServer()
end)
 
  • 97
  • 1
  • 12
Контакты для связи отсутствуют.
if not args[1] then return end
она и не должна ничего делать, если ты ее вызываешь без первого аргумента

алсо, сделай вот это shared-кодом и добавь эту проверку на клиенте перед отправкой net.Start("GetPlayerInfo"), сэкономишь немного трафика, заодно у тебя появится рычаг для проверки context-based access у пользователей
Lua:
-- Серверная функция для проверки профессии игрока
function CanEditPlayerInfoPD(ply)
    local team = ply:Team()
    return team == TEAM_GENERAL or team == TEAM_CHIEF
end
 
  • 26
  • 0
Контакты для связи отсутствуют.
if not args[1] then return end
я вызываю её с аргументом в виде стимайдишник, но всё равно ничего не происходит. Ошибок нет в консоли ни сервера ни клиента
команду ввожу вот так: delol "STEAM_ID"
алсо, сделай вот это shared-кодом и добавь эту проверку на клиенте перед отправкой net.Start("GetPlayerInfo"), сэкономишь немного трафика, заодно у тебя появится рычаг для проверки context-based access у пользователей
Сделаю, спасибо
 
  • 97
  • 1
  • 12
Контакты для связи отсутствуют.
я вызываю её с аргументом в виде стимайдишник, но всё равно ничего не происходит. Ошибок нет в консоли ни сервера ни клиента
команду ввожу вот так: delol "STEAM_ID"

Сделаю, спасибо
тогда в начале каждой функции и после каждого блока if втыкай print("test") и смотри, где у тебя не проходит проверка

визуально все выглядит ок, если никаких ошибок нигде нет, значит, что не срабатывает какой-то if, они у тебя все просто return-ят функцию, соответственно, ты о каком-то блоке не прошедшем проверку, не узнаешь даже пока тестишь
 
  • 97
  • 1
  • 12
Контакты для связи отсутствуют.
алсо, использовать net.WriteTable - оч плохая практика, потому что пересылка таблиц жрет очень много трафика

если есть возможность - всегда пересылай только значения, если таблица неструктурированная или еще какие-то причины для пересылки именно таблицы есть, лучше сделать
Lua:
sv
local table_to_send = util.Compress(util.TableToJSON(data))
local table_len = #table_to_send
net.Start("network.string")
net.WriteUInt(table_len, 32)
net.WriteData(table_to_send)
net.WriteSomethingElse(data)
net.Send(ply)

cl
net.Receive("network.string", function(len, ply)
local table_len = net.ReadUInt(32)
local table_to_recieve = util.JSONToTable(util.Decompress(net.ReadData(table_len)))
local something_else = net.ReadSomethingElse()
end)

ps - если таким способом надо отправить только таблицу, то можно не подсчитывать ее размер во время отправки и не отправлять его, а на принимающей стороне посчитать длину данных из аргумента len в net.Receive и обязательно при отправке имей ввиду длину сообщения, нужно чтобы она была не больше 64кб, иначе клиент крашнется


если структура таблицы известна заранее, то можно отправлять ее таким способом:

Lua:
sv

local table_len = #some_table
net.Start("net.message")
net.WriteUInt(table_len, 32)
for _, data in pairs(some_table) do
net.WriteString(data.name)
net.WriteUInt(data.money, 32)
end
net.Send(ply)

net.Receive("net.message", function(len, ply)
local new_table = {}
local table_len = net.ReadUInt(32)
for i = 1, table_len do
table.insert(new_table, {
name = net.ReadString(),
money = net.ReadUInt(32)
})
end
end)
 
Последнее редактирование:
  • 26
  • 0
Контакты для связи отсутствуют.
алсо, использовать net.WriteTable - оч плохая практика, потому что пересылка таблиц жрет очень много трафика

если есть возможность - всегда пересылай только значения, если таблица неструктурированная или еще какие-то причины для пересылки именно таблицы есть, лучше сделать
Lua:
sv
local table_to_send = util.Compress(util.TableToJSON(data))
local table_len = #table_to_send
net.Start("network.string")
net.WriteUInt(table_len, 32)
net.WriteData(table_to_send)
net.WriteSomethingElse(data)
net.Send(ply)

cl
net.Receive("network.string", function(len, ply)
local table_len = net.ReadUInt(32)
local table_to_recieve = util.JSONToTable(util.Decompress(net.ReadData(table_len)))
local something_else = net.ReadSomethingElse()
end)

ps - если таким способом надо отправить только таблицу, то можно не подсчитывать ее размер во время отправки и не отправлять его, а на принимающей стороне посчитать длину данных из аргумента len в net.Receive и обязательно при отправке имей ввиду длину сообщения, нужно чтобы она была не больше 64кб, иначе клиент крашнется


если структура таблицы известна заранее, то можно отправлять ее таким способом:

Lua:
sv

local table_len = #some_table
net.Start("net.message")
net.WriteUInt(table_len, 32)
for _, data in pairs(some_table) do
net.WriteString(data.name)
net.WriteUInt(data.money, 32)
end
net.Send(ply)

net.Receive("net.message", function(len, ply)
local new_table = {}
local table_len = net.ReadUInt(32)
for i = 1, table_len do
table.insert(new_table, {
name = net.ReadString(),
money = net.ReadUInt(32)
})
end
end)
Сделал как ты посоветовал. Смог исправить. Спасибо большое)
 
Сверху Снизу