Вопрос [HL2RP/DarkRP] Как сделать CID?

  • Автор темы Автор темы 3A141K
  • Дата начала Дата начала
  • 1
  • 0
Хочу сделать систему для нумерации профессий, которую в дальнейшем можно использовать как CID для ситов, либо как идентификационные номера ГО. Основной код для механа вроде бы сообразил, а вот как допустим, связать этот хук со свепом и чтобы хотя бы это имело минимальный функционал, по типу (ПКМ отобразить себе инфу в чат, ЛКМ кому-то) не понимаю как.
Основной скрипт:
Развернуть Свернуть Копировать
hook.Add("onPlayerChangedTeam", "team.identifier", function(ply, t)
    local tname = team.GetName(t)
    local id = math.random(100, 999)
    local identified = tname .. " " .. id
    ply:setDarkRPVar("job", identified)
end)
Был бы крайне благодарен, если бы кто-то подробно это разжевал.
 
  • 24
  • 3
-- cl_init.lua / shared.lua
Professions = {
[1] = { name = "Гражданский", salary = 50 },
[2] = { name = "Полицейский", salary = 75 },
[3] = { name = "Медик", salary = 70 },
[4] = { name = "Военный", salary = 90 }
}

-- Мета-таблица для хранения CID игроков
local meta = FindMetaTable("Player")
function meta:GetCID()
return self:GetNWInt("PlayerCID", 0)
end

-- SWEP для работы с идентификацией
if CLIENT then
SWEP.PrintName = "Идентификатор"
SWEP.Slot = 5
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = true
end

if SERVER then
AddCSLuaFile()
util.AddNetworkString("DisplayCIDInfo")

-- Сетевые переменные для хранения CID
hook.Add("PlayerSpawn", "AssignCID", function(ply)
ply:SetNWInt("PlayerCID", math.random(10000, 99999))
end)
end

-- Конфигурация SWEP
SWEP.Base = "weapon_base"
SWEP.Author = "Ваше Имя"
SWEP.Instructions = "ЛКМ: Проверить игрока | ПКМ: Ваш CID"
SWEP.ViewModel = "models/weapons/v_hands.mdl"
SWEP.WorldModel = "models/props_lab/clipboard.mdl"
SWEP.Spawnable = true
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = 0
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = 0
SWEP.HoldType = "pistol"

-- Основные функции SWEP
function SWEP:Initialize()
self:SetHoldType(self.HoldType)
end

function SWEP:PrimaryAttack()
if CLIENT then return end

local owner = self:GetOwner()
local trace = owner:GetEyeTrace()
local target = trace.Entity

if IsValid(target) and target:IsPlayer() and trace.HitPos:Distance(owner:GetPos()) < 200 then
local cid = target:GetCID()
local jobID = target:Team()
local jobInfo = Professions[jobID] or {name = "Неизвестно", salary = 0}

net.Start("DisplayCIDInfo")
net.WriteEntity(target)
net.WriteInt(cid, 32)
net.WriteString(jobInfo.name)
net.Send(owner)

self:SetNextPrimaryFire(CurTime() + 2)
end
end

function SWEP:SecondaryAttack()
if CLIENT then return end

local owner = self:GetOwner()
local cid = owner:GetCID()
local jobID = owner:Team()
local jobInfo = Professions[jobID] or {name = "Неизвестно", salary = 0}

owner:ChatPrint("Ваш CID: " .. cid .. " | Профессия: " .. jobInfo.name)
self:SetNextSecondaryFire(CurTime() + 2)
end

-- Сетевая обработка информации
if CLIENT then
net.Receive("DisplayCIDInfo", function()
local target = net.ReadEntity()
local cid = net.ReadInt(32)
local job = net.ReadString()

if IsValid(target) then
chat.AddText(
Color(0, 150, 255), "[Идентификатор] ",
Color(255, 255, 0), "Игрок: ",
Color(255, 255, 255), target:Nick(), "\n",
Color(255, 255, 0), "CID: ",
Color(255, 255, 255), cid, "\n",
Color(255, 255, 0), "Профессия: ",
Color(255, 255, 255), job
)
end
end)
end

Как это работает:​

  1. Система профессий:
    • Таблица Professions содержит ID профессий, их названия и параметры
    • Каждому игроку присваивается уникальный CID при спавне
  2. SWEP функции:
    • ЛКМ (PrimaryAttack): Проверка игрока перед вами
    • ПКМ (SecondaryAttack): Просмотр собственного CID
    • Авто-задержка между использованиями (2 секунды)
  3. Сетевое взаимодействие:
    • Информация передается через net-сообщения
    • Красивое форматирование в чате с цветами
    • Проверка дистанции (200 юнитов)
  4. Особенности:
    • Модель предмета: clipboard (можно заменить)
    • Поддержка DarkRP (использует Team ID)
    • Защита от злоупотреблений
    • Авто-генерация CID

Инструкция по установке:​

  1. Создайте файл lua/weapons/weapon_cid.lua
  2. Вставьте туда данный код
  3. Настройте профессии в таблице Professions
  4. Для DarkRP добавьте в darkrp_customthings/jobs.lua:
 
  • 133
  • 17
-- cl_init.lua / shared.lua
Professions = {
[1] = { name = "Гражданский", salary = 50 },
[2] = { name = "Полицейский", salary = 75 },
[3] = { name = "Медик", salary = 70 },
[4] = { name = "Военный", salary = 90 }
}

-- Мета-таблица для хранения CID игроков
local meta = FindMetaTable("Player")
function meta:GetCID()
return self:GetNWInt("PlayerCID", 0)
end

-- SWEP для работы с идентификацией
if CLIENT then
SWEP.PrintName = "Идентификатор"
SWEP.Slot = 5
SWEP.DrawAmmo = false
SWEP.DrawCrosshair = true
end

if SERVER then
AddCSLuaFile()
util.AddNetworkString("DisplayCIDInfo")

-- Сетевые переменные для хранения CID
hook.Add("PlayerSpawn", "AssignCID", function(ply)
ply:SetNWInt("PlayerCID", math.random(10000, 99999))
end)
end

-- Конфигурация SWEP
SWEP.Base = "weapon_base"
SWEP.Author = "Ваше Имя"
SWEP.Instructions = "ЛКМ: Проверить игрока | ПКМ: Ваш CID"
SWEP.ViewModel = "models/weapons/v_hands.mdl"
SWEP.WorldModel = "models/props_lab/clipboard.mdl"
SWEP.Spawnable = true
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = 0
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = 0
SWEP.HoldType = "pistol"

-- Основные функции SWEP
function SWEP:Initialize()
self:SetHoldType(self.HoldType)
end

function SWEP:PrimaryAttack()
if CLIENT then return end

local owner = self:GetOwner()
local trace = owner:GetEyeTrace()
local target = trace.Entity

if IsValid(target) and target:IsPlayer() and trace.HitPos:Distance(owner:GetPos()) < 200 then
local cid = target:GetCID()
local jobID = target:Team()
local jobInfo = Professions[jobID] or {name = "Неизвестно", salary = 0}

net.Start("DisplayCIDInfo")
net.WriteEntity(target)
net.WriteInt(cid, 32)
net.WriteString(jobInfo.name)
net.Send(owner)

self:SetNextPrimaryFire(CurTime() + 2)
end
end

function SWEP:SecondaryAttack()
if CLIENT then return end

local owner = self:GetOwner()
local cid = owner:GetCID()
local jobID = owner:Team()
local jobInfo = Professions[jobID] or {name = "Неизвестно", salary = 0}

owner:ChatPrint("Ваш CID: " .. cid .. " | Профессия: " .. jobInfo.name)
self:SetNextSecondaryFire(CurTime() + 2)
end

-- Сетевая обработка информации
if CLIENT then
net.Receive("DisplayCIDInfo", function()
local target = net.ReadEntity()
local cid = net.ReadInt(32)
local job = net.ReadString()

if IsValid(target) then
chat.AddText(
Color(0, 150, 255), "[Идентификатор] ",
Color(255, 255, 0), "Игрок: ",
Color(255, 255, 255), target:Nick(), "\n",
Color(255, 255, 0), "CID: ",
Color(255, 255, 255), cid, "\n",
Color(255, 255, 0), "Профессия: ",
Color(255, 255, 255), job
)
end
end)
end

Как это работает:​

  1. Система профессий:
    • Таблица Professions содержит ID профессий, их названия и параметры
    • Каждому игроку присваивается уникальный CID при спавне
  2. SWEP функции:
    • ЛКМ (PrimaryAttack): Проверка игрока перед вами
    • ПКМ (SecondaryAttack): Просмотр собственного CID
    • Авто-задержка между использованиями (2 секунды)
  3. Сетевое взаимодействие:
    • Информация передается через net-сообщения
    • Красивое форматирование в чате с цветами
    • Проверка дистанции (200 юнитов)
  4. Особенности:
    • Модель предмета: clipboard (можно заменить)
    • Поддержка DarkRP (использует Team ID)
    • Защита от злоупотреблений
    • Авто-генерация CID

Инструкция по установке:​

  1. Создайте файл lua/weapons/weapon_cid.lua
  2. Вставьте туда данный код
  3. Настройте профессии в таблице Professions
  4. Для DarkRP добавьте в darkrp_customthings/jobs.lua:
ты внатуре что за супермен?
 
Назад
Сверху Снизу