• Draw 3d2d when something happens serverside
    10 replies, posted
Im trying to draw a 3d2d text, made on the client, when an entity touches the current entity im trying to draw it on. This is the code. the error it gives is: Tried to use a NULL entity! also I did add the network string but its not shown in the code. [CODE]function ENT:Think() if self.isCooking == true then self:SetColor(Color(255,0,0)) else self:SetColor(Color(0,255,0)) end if self.isCooking == true then if self.finishCooking <= CurTime() then self.isCooking = false net.Start("statusclosed") net.Send(ply) local morphine = ents.Create("morphine") morphine:SetPos(self:GetPos() + Vector(0,0,50)) morphine:Spawn() end end end[/CODE] [CODE]net.Receive("statusclosed",function (ply) local posss = self:GetPos() local angsss = self:GetAngles() local offsetss = angsss:Up() + angsss:Forward() * 15 + angsss:Right() * 0 ; angsss:RotateAroundAxis(self:GetAngles():Up(),90) angsss:RotateAroundAxis(self:GetAngles():Right(),-90) angsss:RotateAroundAxis(self:GetAngles():Forward(),360) local distss = self:GetPos():Distance(EyePos()) local clamss = math.Clamp(distss, 0, 255 ) local mainss = (255 - clamss) if (mainss <= 0) then return end cam.Start3D2D(posss+offsetss,angsss,0.13) draw.WordBox(0,-55,-40,"Empty","NewFontsz",Color(0,0,0,main),Color(180,10,0,main)) cam.End3D2D() end)[/CODE]
Which line causes the error?
[CODE]net.Start("statusclosed") net.Send(ply)[/CODE] That one
ply is nil. It needs to be a player object.
So how do you call the player on the serverside then?
would net.send(player) work? and yeah im drawing it in ent:draw
[CODE]function ENT:Draw() self:DrawModel() net.Receive("statusclosed",function (ply) local posss = self:GetPos() local angsss = self:GetAngles() local offsetss = angsss:Up() + angsss:Forward() * 15 + angsss:Right() * 0 ; angsss:RotateAroundAxis(self:GetAngles():Up(),90) angsss:RotateAroundAxis(self:GetAngles():Right(),-90) angsss:RotateAroundAxis(self:GetAngles():Forward(),360) local distss = self:GetPos():Distance(EyePos()) local clamss = math.Clamp(distss, 0, 255 ) local mainss = (255 - clamss) if (mainss <= 0) then return end cam.Start3D2D(posss+offsetss,angsss,0.13) draw.WordBox(0,-55,-40,"Empty","NewFontsz",Color(0,0,0,mainss),Color(0,180,0,mainss)) cam.End3D2D() end) end[/CODE] It is, just didnt include it in my thread
[QUOTE=Zer0nix;52593028]would net.send(player) work? and yeah im drawing it in ent:draw[/QUOTE] To start scripting. you need to know how the computer reads and handle the file. All files only get read once and placed in memory. This means if you place [code]print("Hello world")[/code] in the file, it only shows up once. However Garrysmod calls some functions that things run in. the ones you would need is "ENT:Think" and "ENT:Draw". "ENT:Think" gets called ever game-tick. This is where all the logic and things happen. "ENT:Draw" gets called every frame (Your FPS .. so that can be many times more than Think), this is where you need to place the 3d2d and draw functions, as you need to draw them every frame. You need something like: [code] -- SERVER util.AddNetworkString("My_first_networkstring") -- To use the net, you would need to add this to the server function ENT:Init() self.switch = false end local easy_timer = 0 function ENT:Think() -- This gets called every server tick if easy_timer > SysTime() then return end -- This will stop the script and only run it every second. Don't spam the network. easy_timer = SysTime() + 1 self.switch = not self.switch -- Flip the switch net.Start("My_first_networkstring") net.WriteBool(self.switch) -- Write the switch into the message net.WriteEntity(self) -- Be sure the client knows what entity the switch is for net.Broadcast() -- Send it to all players. end -- CLIENT function ENT:Init() self.switch = false end net.Receive("My_first_networkstring",function(len) -- This gets called every time you recive a "message" from the server local switch = net.ReadBool() -- Read first message local entity = net.ReadEntity() -- Read the second message entity.switch = switch -- Set the switch for the entity net function ENT:Draw() -- This gets called every time a new frame is drawn self:DrawModel() -- Draw itself first if not entity.switch then return end -- Be sure that switch is true before drawing stuff cam.Start3D2D(posss+offsetss,angsss,0.13) -- Draw the thing draw.WordBox(0,-55,-40,"Empty","NewFontsz",Color(0,0,0,main),Color(180,10,0,main)) cam.End3D2D() end[/code] Tips: - Placing ply anywhere won't work - NEVER place functions inside other functions (before being more skilled. This includes net.Recive)
well turns out, this isn't so simple as I thought, anyways that helped me a lot, thank you so much!
Sorry, you need to Log In to post a reply to this thread.