Ergebnis 1 bis 6 von 6

Thema: FindInSphere Player und Entitys

  1. #1

    Standard FindInSphere Player und Entitys

    Guten Abend!

    Ich habe da ein kleines großes Problem mit dem ausfindig machen von Spielern. Folgender Code:

    Code:
    function ENT:Think()
    	local selfpos = self:GetPos()
    	
    	print(selfpos)
    	
    	for k,v in pairs(ents.FindInSphere(Vector(selfpos), 32)) do
    		if(IsValid(v)) then
    			self:EmitSound("obeliskoflightBIG/obelpower_big.mp3",500,100,1,CHAN_AUTO)
    		end
    	end
    	
    end
    Wenn ein Spieler in den Bereich meiner tollen Verteidigungsanlage kommt, soll dieser von einem fetten Laser gegrillt werden. Spawnen und die ersten Sounds laufen, aber der Teil dort oben gar nicht. Ich weiss nicht wie ich prüfen kann, ob der "Objekt" darin ein Spieler ist. Bei v:IsPlayer() passiert gar nichts. Bei v:GetClass() passiert genauso wenig. Ich bekomme das mit dem Entity und Player nicht hin. Für das Renderproblem mach ich dann ein neues Thema, oder soll das hier mit rein? Ich bekomme - sobland irgendwo render auftaucht - den Fehler "attempt to index global".

    Ich bin noch nicht besonders gut darin, aber bemühe mich. Hat jemand eine Idee?

    Grüße
    dev

  2. #2

    Standard AW: FindInSphere Player und Entitys

    Haue mal dort wo EmitSound drin steht etwas zum debuggen rein. Printe irgendwas. Weil eigentlich sollte das klappen.
    Ich denke allerdings der Fehler liegt darin, dass du den Sound nicht zuerst ge-precached (in den cache geladen) hast. Deshalb wird die Engine ihn wohl nicht laden und abspielen können.

  3. #3

    Standard AW: FindInSphere Player und Entitys

    Folgendermaßen habe ich das gelöst:
    Code:
    function ENT:Think()
    	local selfpos = self:GetLocalPos()
    	
    	for k,v in pairs(ents.FindInSphere(Vector(selfpos), 1000)) do
    		if(string.sub(v:GetClass(),1,3) == "pla") then
    			
    			self:EmitSound("obeliskoflightBIG/OBELLOOP_BIG.mp3",500,100,1,CHAN_AUTO)
    			v:Ignite(10,10)
    			v:SetHealth(v:Health() - 500)
    			self.Entity:doObelLoad(self)
    
    			
    			local laser = render.DrawBeam(selfpos,100,v:GetPos(),Vector(255,0,0,255))
    			
    		end
    	end
    Ich schrieb ja folgendes:
    Spawnen und die ersten Sounds laufen, aber der Teil dort oben gar nicht. Ich weiss nicht wie ich prüfen kann, ob der "Objekt" darin ein Spieler ist. Bei v:IsPlayer() passiert gar nichts. Bei v:GetClass() passiert genauso wenig.
    Ich muss eingestehen, das war blöd formuliert. Trotzdem danke! Aber irgendwie scheint das jetzt so zu funktionieren. Was wiederum nicht geht ist der render-Befehl. Ich habe leider keine Ahnung wie ich den korrekt ausführe. Und noch was: laut dem Wiki geht der Befehl "StartLoopingSound" ja nicht mehr. Gibt es eine Alternative? Der bereits eingetragene Sound soll solange laufen, wie sich Spieler im Bereich befinden. Später soll aber der Laser mit einem extra Sound in bestimmten zeitlichen Abständen getriggert werden. Die Waffe muss quasi erst aufgeladen werden, bevor sie ein weiteres mal feuern kann.

  4. #4

    Standard AW: FindInSphere Player und Entitys

    Achso, nahja.. Ich dachte ehrlich gesagt, dass es so wie du es tatest an sich funktionieren müsste, und es tatsächlich nur am Precachen läge. Aber wenn das so ist;
    Eigentlich müsste v:IsPlayer() auf jeden Fall funktionieren, sofern Garry das nicht im letzten Patch abgefucked haben sollte.
    Und ich würde an deiner Stelle anstatt von
    Lua Code:
    1. if (string.sub(v:GetClass(),1,3) == "pla") then
    eher
    Lua Code:
    1. if v:GetClass() == "player" then
    verwenden. Ist weniger rechenaufwändig und vor allem sicherer. Weil wenn ansonsten irgend ein Entity in der Range ist, welches auch mit "pla" beginnt (z.B. plasma...), behandelt dein Entitiy dieses genau, wie du das eigentlich nur von einem Player erwartet hast.

    Und bei dem DrawBeam nutzt du anscheinend die falsche Syntax:
    http://wiki.garrysmod.com/page/render/DrawBeam

  5. #5

    Standard AW: FindInSphere Player und Entitys

    Guten Abend,

    das mit IsPlayer() klappt irgendwie nicht. Ich lass das bei deinem Verbesserungsvorschlag.

    Jedoch verursacht mir der Laser mit DrawBeam noch Probleme. Ich habe absolut keine Ahnung wie ich den anwenden soll. Er verursacht erstmal einen Fehler, der vermutlich daran liegt, dass dieser Befehl nur Client-Side ist. Allerdings passiert gar nichts, wenn ich ihn Client-Side ausführe. Wenn ich folgendes in die Konsole eingebe:
    Code:
    lua_run_cl render.DrawBeam( Vector(0,0,0), Vector(1000,1000,1000), 100, 1, 1, Color( 255, 0, 0, 255 ) )
    sollte ja irgendwas auftauchen. Leider ist dem nicht so. Auch im Script selbst wird dieser Strahl von meinem Entity aus nicht gezeichnet.

    Vom Script:
    Code:
    local laser = ("cable/redlaser")
    if(CLIENT) then
        render.SetMaterial(laser)
        render.DrawBeam(self:LocalToWorld(),v:GetPos(),20,10,10,Color(255,0,0,255))
    end
    Das ist sowieso irgendwie alles blöd. Momentan läuft alles im Think-Hook. Ich hätte es aber gerne so, dass alles nur einmal ausgeführt wird, wenn jemand den Bereich betritt und nicht zig mal wiederholt wird, solange jemand im Bereich ist. Der Vollständigkeit zur Liebe der gesamte Code (mit viel experimentellen Zeilen darin, das ist der bisher letzte Stand. Ich habe schon viel mehr rumprobiert, mit dem gleichen Ergebnis.):
    Code:
    AddCSLuaFile("cl_init.lua")
    AddCSLuaFile("shared.lua")
    include("shared.lua")
    
    function ENT:SpawnFunction( ply, tr, ClassName )
        if ( !tr.Hit ) then return end
    	
    	 SpawnPos = tr.HitPos + tr.HitNormal * 16
    	
        local ent = ents.Create( "obeliskoflightBIG" )
        ent:SetPos( SpawnPos ) 
        ent:Spawn()
        ent:Activate()
     
        return ent
    end
    
    function ENT:Initialize()
        self:SetModel("models/obeliskoflight/obeliskoflightbig.mdl")
    	self:PhysicsInit(SOLID_VPHYSICS)
    	self:SetMoveType(MOVETYPE_VPHYSICS)
    	self:SetSolid(SOLID_VPHYSICS)
    	--self.Entity:SetUseType(SIMPLE_USE)
    	-- self.Entity:DrawShadow(false)
    	-- self.Entity:DropToFloor()
    	
    	local phys = self:GetPhysicsObject()
    
    	if IsValid(phys) then
    		phys:Wake() 
    		self:EnableMotion(false)
    	end
    	
    	self:EmitSound("obeliskoflightBIG/obelpower_big.mp3",500,100,1,CHAN_AUTO)
    end
    
    
    function ENT:Think()
    	local selfpos = self:GetPos()
    	local laser = ("cable/redlaser")
    	
    	for k,v in pairs(ents.FindInSphere(Vector(selfpos), 1000)) do
    		if(v:GetClass() == "player") then
    			--self:EmitSound("obeliskoflightBIG/OBELLOOP_BIG.mp3",500,100,1,CHAN_WEAPON)
    			self:EmitSound("obeliskoflightBIG/obelpower_big.mp3",500,100,1,CHAN_AUTO)
    			--v:Ignite(10,10)
    			--v:SetHealth(v:Health() - 500)
    			--self.Entity:doObelLoad(self)
    	
    			--if(CLIENT) then
    			--		render.SetMaterial(laser)
    			--		render.DrawBeam(self:LocalToWorld(),v:GetPos(),20,10,10,Color(255,0,0,255))
    			--end
    			
    		end
    	end
    	
    end
    
    --function ENT:Draw()
    --	local Laser = Material("cable/redlaser")
    -- 
    --	local Vector1 = self:LocalToWorld( Vector( 0, 0, -200 ) )
    --	local Vector2 = self:LocalToWorld( Vector( 0, 0, 200 ) )
    --	
    --	render.SetMaterial( Laser )
    --	render.DrawBeam( Vector1, Vector2, 100, 1, 1, Color( 255, 255, 255, 255 ) ) 
    --end

  6. #6

    Standard AW: FindInSphere Player und Entitys

    Alle Render Funktionen, musst du in entsprechenden Hooks oder Funktionen (wie z.B. ENT:Draw()) aufrufen. Einfach so in der Konsole geht nicht.
    Versuche es mal hiermit: http://wiki.garrysmod.com/page/GM/HUDPaint

    Alles andere was du umsetzen willst, ist eigentlich relativ simpel; Musst nur checken, ob der Player schon in der Range war, ob er noch drin ist, und wann der letzte Schuss auf ihn gefeuert wurde. Bin momentan aber leider zu wenig motiviert ein ausführliches Beispiel zu schreiben.

    [Die neue Wiki nervt mich im übrigen auch. Da ist so gut wie nichts mehr beschrieben. Die Funktionen einzeln stehen alle drin, schön und gut. Aber wie und wo sie anzuwenden sind, ist für Laien nur mit ganz ganz viel Mühe ersichtlich.]

Ähnliche Themen

  1. Prop bei den Entitys anzeigen lassen
    Von spike im Forum Lua
    Antworten: 6
    Letzter Beitrag: 25.10.2012, 21:09
  2. Wie schaltet man player to player damage ein?
    Von LinkPlay9 im Forum Server
    Antworten: 4
    Letzter Beitrag: 20.07.2010, 17:18
  3. Entitys sind schräg :/
    Von mondsucht im Forum Mapping
    Antworten: 10
    Letzter Beitrag: 22.04.2009, 23:59
  4. Antworten: 6
    Letzter Beitrag: 28.09.2008, 09:18
  5. Keine Entitys nach compiling
    Von XiCe im Forum Mapping
    Antworten: 2
    Letzter Beitrag: 20.01.2007, 00:46

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •