Вопрос по LUA GMod

Tomiks

Участник
Сообщения
419
Реакции
288
Привет всем, разбираюсь в написании плагинов на lua в Garry's Mod. Застопорился на одном моменте, не могу засунуть владельца Entity в NetworkVar, может неправильно объясняю, но вот ниже прикрепил код shared.lua. Знает ли кто-нибудь как это правильно делать?

C++:
ENT.Type = "anim"
ENT.Base = "base_gmodentity"

ENT.PrintName = "Money Printer"

ENT.Spawnable = true

function ENT:SetupDataTables()
    self:NetworkVar("Int", 0, "MoneyAmount")
    self:NetworkVar("Entity", 0, "owner_printer") -- <-- вот сюда хочу засунуть entity игрока, чтобы получать потом его ник(нужен именно того, кто создал ентити)
    self:NetworkVar("Int", 1, "PrinterLVL")
    self:NetworkVar("Int", 2, "IsPaper")
end

C++:
AddCSLuaFile("shared.lua")
AddCSLuaFile("cl_init.lua")

include("shared.lua")

function ENT:Initialize()
    self:SetModel("models/steel_printer/steel_printer.mdl")
    self:PhysicsInit(SOLID_VPHYSICS)
    self:SetMoveType(MOVETYPE_VPHYSICS)
    self:SetSolid(SOLID_VPHYSICS)
    self:SetUseType(SIMPLE_USE)

    self:SetPrinterLVL(1)

    self.sound = CreateSound(self, Sound("ambient/levels/labs/equipment_printer_loop1.wav"))
    self.sound:SetSoundLevel(52)
    self.sound:PlayEx(1, 100)

    local phys = self:GetPhysicsObject()

    if phys:IsValid() then
        phys:Wake()
    end
end

function ENT:OnRemove()
    if self.sound then
        self.sound:Stop()
    end
end

function ENT:Touch(ent)
    local printerLevel = self:GetPrinterLVL()
    if ent:IsValid() and ent:GetClass() == "printer_upgrader" and printerLevel < 5 then
        ent:Remove()
        self:SetPrinterLVL(printerLevel+1)
    end
end

function ENT:Use(Activator, Caller)
    Activator:addMoney(100000)
end

C++:
include("shared.lua")

surface.CreateFont( "TheDefaultSettings", {
    font = "Arial", --  Use the font-name which is shown to you by your operating system Font Viewer, not the file name
    extended = false,
    size = 25,
    weight = 500,
    blursize = 0,
    scanlines = 0,
    antialias = true,
    underline = false,
    italic = false,
    strikeout = false,
    symbol = false,
    rotary = false,
    shadow = false,
    additive = false,
    outline = false,
})

function ENT:Draw()
    self:DrawModel()

    local Ang = self:GetAngles()
    local Pos = self:GetPos()

    local owner = "self:Getowner_printer():Nick()"
    local printerlvl = "Printer Level: " .. self:GetPrinterLVL()
    local text = "Money Printer"

    local TextWidth = surface.GetTextSize(text)
    local TextWidth2 = surface.GetTextSize(owner)
    local TextWidth3 = surface.GetTextSize(printerlvl)

    Ang:RotateAroundAxis(Ang:Up(), 90)

    cam.Start3D2D(Pos + Ang:Up() * 11.5, Ang, 0.11)
        draw.WordBox(2, -TextWidth * 0.7, -140, text, "TheDefaultSettings", Color(140, 0, 0, 100), Color(255, 255, 255, 255))
        draw.WordBox(2, -TextWidth2 * 0.7, -40, owner, "TheDefaultSettings", Color(140, 0, 0, 100), Color(255, 255, 255, 255))
        draw.WordBox(2, -TextWidth3 * 0.7, 18, printerlvl, "TheDefaultSettings", Color(140, 0, 0, 100), Color(255, 255, 255, 255))
    cam.End3D2D()
end

function ENT:Think()
end
 
Решение
А чем self.Owner не устроил? Там и есть ентити которая создала эту энтити.
В таком случае выводит NULL Entity
1587892305986.png
1587892833765.png

Проблему решил, сделал таким образом

C++:
function ENT:Initialize()
    self:SetModel("models/steel_printer/steel_printer.mdl")
    self:PhysicsInit(SOLID_VPHYSICS)
    self:SetMoveType(MOVETYPE_VPHYSICS)
    self:SetSolid(SOLID_VPHYSICS)
    self:SetUseType(SIMPLE_USE)

    self:Setowner_printer(self:GetCreator()) -- <-- получил через self:GetCreator и занёс в NetworkVar(раньше не находил эту функцию)

    local phys = self:GetPhysicsObject()

    if phys:IsValid() then
        phys:Wake()
    end
end

И получил на клиентской части вот такой строчкой
C++:
local owner =...

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #2
Привет всем, разбираюсь в написании плагинов на lua в Garry's Mod. Застопорился на одном моменте, не могу засунуть владельца Entity в NetworkVar, может неправильно объясняю, но вот ниже прикрепил код shared.lua. Знает ли кто-нибудь как это правильно делать?

C++:
ENT.Type = "anim"
ENT.Base = "base_gmodentity"

ENT.PrintName = "Money Printer"

ENT.Spawnable = true

function ENT:SetupDataTables()
    self:NetworkVar("Int", 0, "MoneyAmount")
    self:NetworkVar("Entity", 0, "owner_printer") -- <-- вот сюда хочу засунуть entity игрока, чтобы получать потом его ник(нужен именно того, кто создал ентити)
    self:NetworkVar("Int", 1, "PrinterLVL")
    self:NetworkVar("Int", 2, "IsPaper")
end

C++:
AddCSLuaFile("shared.lua")
AddCSLuaFile("cl_init.lua")

include("shared.lua")

function ENT:Initialize()
    self:SetModel("models/steel_printer/steel_printer.mdl")
    self:PhysicsInit(SOLID_VPHYSICS)
    self:SetMoveType(MOVETYPE_VPHYSICS)
    self:SetSolid(SOLID_VPHYSICS)
    self:SetUseType(SIMPLE_USE)

    self:SetPrinterLVL(1)

    self.sound = CreateSound(self, Sound("ambient/levels/labs/equipment_printer_loop1.wav"))
    self.sound:SetSoundLevel(52)
    self.sound:PlayEx(1, 100)

    local phys = self:GetPhysicsObject()

    if phys:IsValid() then
        phys:Wake()
    end
end

function ENT:OnRemove()
    if self.sound then
        self.sound:Stop()
    end
end

function ENT:Touch(ent)
    local printerLevel = self:GetPrinterLVL()
    if ent:IsValid() and ent:GetClass() == "printer_upgrader" and printerLevel < 5 then
        ent:Remove()
        self:SetPrinterLVL(printerLevel+1)
    end
end

function ENT:Use(Activator, Caller)
    Activator:addMoney(100000)
end

C++:
include("shared.lua")

surface.CreateFont( "TheDefaultSettings", {
    font = "Arial", --  Use the font-name which is shown to you by your operating system Font Viewer, not the file name
    extended = false,
    size = 25,
    weight = 500,
    blursize = 0,
    scanlines = 0,
    antialias = true,
    underline = false,
    italic = false,
    strikeout = false,
    symbol = false,
    rotary = false,
    shadow = false,
    additive = false,
    outline = false,
})

function ENT:Draw()
    self:DrawModel()

    local Ang = self:GetAngles()
    local Pos = self:GetPos()

    local owner = "self:Getowner_printer():Nick()"
    local printerlvl = "Printer Level: " .. self:GetPrinterLVL()
    local text = "Money Printer"

    local TextWidth = surface.GetTextSize(text)
    local TextWidth2 = surface.GetTextSize(owner)
    local TextWidth3 = surface.GetTextSize(printerlvl)

    Ang:RotateAroundAxis(Ang:Up(), 90)

    cam.Start3D2D(Pos + Ang:Up() * 11.5, Ang, 0.11)
        draw.WordBox(2, -TextWidth * 0.7, -140, text, "TheDefaultSettings", Color(140, 0, 0, 100), Color(255, 255, 255, 255))
        draw.WordBox(2, -TextWidth2 * 0.7, -40, owner, "TheDefaultSettings", Color(140, 0, 0, 100), Color(255, 255, 255, 255))
        draw.WordBox(2, -TextWidth3 * 0.7, 18, printerlvl, "TheDefaultSettings", Color(140, 0, 0, 100), Color(255, 255, 255, 255))
    cam.End3D2D()
end

function ENT:Think()
end
А чем self.Owner не устроил? Там и есть ентити которая создала эту энтити.
 

Tomiks

Участник
Сообщения
419
Реакции
288
А чем self.Owner не устроил? Там и есть ентити которая создала эту энтити.
В таком случае выводит NULL Entity
1587892305986.png
1587892833765.png

Проблему решил, сделал таким образом

C++:
function ENT:Initialize()
    self:SetModel("models/steel_printer/steel_printer.mdl")
    self:PhysicsInit(SOLID_VPHYSICS)
    self:SetMoveType(MOVETYPE_VPHYSICS)
    self:SetSolid(SOLID_VPHYSICS)
    self:SetUseType(SIMPLE_USE)

    self:Setowner_printer(self:GetCreator()) -- <-- получил через self:GetCreator и занёс в NetworkVar(раньше не находил эту функцию)

    local phys = self:GetPhysicsObject()

    if phys:IsValid() then
        phys:Wake()
    end
end

И получил на клиентской части вот такой строчкой
C++:
local owner = self:Getowner_printer():Nick() -- need fix bug

Но всё-таки @White Wolf мне интересен твой способ, если не сложно, то не подскажешь, почему через self.Owner может выводить NULL Entity?
 
Последнее редактирование:
Решение

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #4
В таком случае выводит NULL Entity
Посмотреть вложение 56545
Посмотреть вложение 56547

Проблему решил, сделал таким образом

C++:
function ENT:Initialize()
    self:SetModel("models/steel_printer/steel_printer.mdl")
    self:PhysicsInit(SOLID_VPHYSICS)
    self:SetMoveType(MOVETYPE_VPHYSICS)
    self:SetSolid(SOLID_VPHYSICS)
    self:SetUseType(SIMPLE_USE)

    self:Setowner_printer(self:GetCreator()) -- <-- получил через self:GetCreator и занёс в NetworkVar(раньше не находил эту функцию)

    local phys = self:GetPhysicsObject()

    if phys:IsValid() then
        phys:Wake()
    end
end

И получил на клиентской части вот такой строчкой
C++:
local owner = self:Getowner_printer():Nick() -- need fix bug

Но всё-таки @White Wolf мне интересен твой способ, если не сложно, то не подскажешь, почему через self.Owner может выводить NULL Entity?
А что выводит self:GetOwner() и каким способом спавнишь ентити?
 

Tomiks

Участник
Сообщения
419
Реакции
288
Последнее редактирование:
Сверху Снизу