Lua printer local var for self ent

  • Initiateur de la discussion
Z

zoukilama

Geek
Messages
15
Score réaction
8
Points
75
Salut à tous
je cherche par tout les moyens mais aucun topic qui aborde réellement le sujet
pour me faire la patte j'ai réaliser un simple printer à l'aide d'un tuto lua sur youtube

mais une fois en jeu quand je spawn deux printer les deux on exactement la même variable money qui s'affiche
si je ramasse les sous sur 1 sa me les ramasse aussi sur le deuxième printer
j'ai bien utiliser NetworkVar & self

init.lua
Code:
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
include('shared.lua')
local interval = 3
function ENT:Initialize() self:SetModel("models/props/cs_office/computer_monitor.mdl") self:PhysicsInit(SOLID_VPHYSICS) self:SetMoveType(MOVETYPE_VPHYSICS) self:SetSolid(SOLID_VPHYSICS) self.timer = CurTime() local phys = self:GetPhysicsObject() if phys:IsValid() then phys:Wake() end
end
function ENT:Think() if CurTime() > self.timer + interval then self.timer = CurTime() self:SetMoneyAmount(self:GetMoneyAmount() + 100) end
end
function ENT:Use( act, call) local money = self:GetMoneyAmount() self:SetMoneyAmount(0) call:addMoney(money)
end
function ENT:OnTakeDamage() return false
end
cl_init.lua
Code:
include('shared.lua')
local ME
surface.CreateFont( "Arial_Style_01", { font = "Arial", extended = false, size = 30, weight = 800, 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() ME=self
end
hook.Add("HUDPaint", "DrawMoney", function() local eye = LocalPlayer():GetEyeTrace() if eye.Entity:GetClass() == "zprinter" then draw.SimpleText(ME:GetMoneyAmount(), "Arial_Style_01", ScrW()/2, ScrH()/2, Color(0, 0, 0), 1, 1) end
end)
shared.lua
Code:
ENT.Type = "anim"
ENT.Base = "base_gmodentity"
ENT.PrintName = "ZPrinter"
ENT.Author = "ZoukiDev"
ENT.Category = "TrashStock"
ENT.Contact = "zouki.dev@gmail.com"
ENT.Instructions = "Approchez vous de l'ordinateur et actionnez votre touche [USE]"
ENT.Spawnable = true
ENT.AdminSpawnable = true
ENT.Editable = true
function ENT:SetupDataTables() self:NetworkVar( "Int", 1, "MoneyAmount" )
end

si quelqu'un à une indication de comment faire s'il vous plait.
mais ce que je comprend pas, NetworkVar et définie par le biais de self
ce qui devrais correspondre à l'entité en question or la on dirais que self représente pas l'instance mais le parent de l'instance (l'héritage) ?.
Merci d'avance

@ToTheHospital
 
Dernière édition:
Venatuss

Venatuss

Geek suprême
Messages
76
Score réaction
64
Points
130
Salut, je vais essayer de t'aider un peu :)

Code:
function ENT:Think()
if CurTime() > self.timer + interval then
self.timer = CurTime()
self:SetMoneyAmount(self:GetMoneyAmount() + 100)
end
end
Pourquoi ne pas tout simplement créer un timer à l'aide de http://wiki.garrysmod.com/page/timer/Create ? Attention cependant, il faut que le nom du timer soit unique à chaque printer, tu peux par exemple utiliser http://wiki.garrysmod.com/page/Entity/EntIndex dans le nom qui sera un identifiant unique, il ne faudra pas oublier de supprimer le timer lorsqu'on supprime l'entité.

Code:
hook.Add("HUDPaint", "DrawMoney", function()
local eye = LocalPlayer():GetEyeTrace()
if eye.Entity:GetClass() == "zprinter" then
draw.SimpleText(ME:GetMoneyAmount(), "Arial_Style_01", ScrW()/2, ScrH()/2, Color(0, 0, 0), 1, 1)
end
end)
Oulah, déjà tu veux créer un HUDPaint qui s'appellera toujours "DrawMoney" mais qui aura la variable "ME" différente pour chaque printer, c'est absurde. ( Je ne sais pas si mon explication a été claire ) Crée plutôt un seul HUDPaint dans un fichier autorun, mets lui un nom plus unique pour éviter les conflits avec d'autres HUDPaint. Remplace ME par l'entité que le joueur regarde, à quoi ça te sert d'utiliser cette variable? Regarde ça :

Code:
hook.Add("HUDPaint", "DrawMoney.ZoukiPrinters", function()
local eye = LocalPlayer():GetEyeTrace()
local ent = eye.Entity or NULL
-- si ton entité n'existe pas ou n'est pas valide alors on ne fait rien
if not IsValid( ent ) then return end
if ent:GetClass() == "zprinter" then
draw.SimpleText(ent:GetMoneyAmount(), "Arial_Style_01", ScrW()/2, ScrH()/2, Color(0, 0, 0), 1, 1)
end
end)
Enfin :

Code:
function ENT:SetupDataTables()
self:NetworkVar( "Int", 1, "MoneyAmount" )
end
Le slot des networkvar commencent à 0, tu dois remplacer ton 1 par un 0.

Voilà, j'espère que ça t'aura aidé. :)
 
  • J'aime
Réactions: zoukilama
  • Initiateur de la discussion
Z

zoukilama

Geek
Messages
15
Score réaction
8
Points
75
Venatuss à dit:
Salut, je vais essayer de t'aider un peu :)

Code:
function ENT:Think()
if CurTime() > self.timer + interval then
self.timer = CurTime()
self:SetMoneyAmount(self:GetMoneyAmount() + 100)
end
end
Pourquoi ne pas tout simplement créer un timer à l'aide de http://wiki.garrysmod.com/page/timer/Create ? Attention cependant, il faut que le nom du timer soit unique à chaque printer, tu peux par exemple utiliser http://wiki.garrysmod.com/page/Entity/EntIndex dans le nom qui sera un identifiant unique, il ne faudra pas oublier de supprimer le timer lorsqu'on supprime l'entité.

Code:
hook.Add("HUDPaint", "DrawMoney", function()
local eye = LocalPlayer():GetEyeTrace()
if eye.Entity:GetClass() == "zprinter" then
draw.SimpleText(ME:GetMoneyAmount(), "Arial_Style_01", ScrW()/2, ScrH()/2, Color(0, 0, 0), 1, 1)
end
end)
Oulah, déjà tu veux créer un HUDPaint qui s'appellera toujours "DrawMoney" mais qui aura la variable "ME" différente pour chaque printer, c'est absurde. ( Je ne sais pas si mon explication a été claire ) Crée plutôt un seul HUDPaint dans un fichier autorun, mets lui un nom plus unique pour éviter les conflits avec d'autres HUDPaint. Remplace ME par l'entité que le joueur regarde, à quoi ça te sert d'utiliser cette variable? Regarde ça :

Code:
hook.Add("HUDPaint", "DrawMoney.ZoukiPrinters", function()
local eye = LocalPlayer():GetEyeTrace()
local ent = eye.Entity or NULL
-- si ton entité n'existe pas ou n'est pas valide alors on ne fait rien
if not IsValid( ent ) then return end
if ent:GetClass() == "zprinter" then
draw.SimpleText(ent:GetMoneyAmount(), "Arial_Style_01", ScrW()/2, ScrH()/2, Color(0, 0, 0), 1, 1)
end
end)
Enfin :

Code:
function ENT:SetupDataTables()
self:NetworkVar( "Int", 1, "MoneyAmount" )
end
Le slot des networkvar commencent à 0, tu dois remplacer ton 1 par un 0.

Voilà, j'espère que ça t'aura aidé. :)
j'utiliser ME plutot que ent parce-que ddans ma fonction réseaux (bnet) le self n'est plus celui de l'entité, puis dans le
draw.SimpleText(ME) plutot que draw.SimpleText(ent) c'était une grosse erreur de ma part avec un peut de logique j'aurais presque pu m'en rendre compte, merci à toi cava beaucoup mieux fonctionner :)
 
Discord d'entraide
Rejoignz-nous sur Discord