PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Entity Spawnen aber wie? :D



Santo
22.06.2008, 16:19
Hallo,
Ich möchte mit Derma ein kleines Menü erstellen und dort soll man Tische und Stühle spawnen können!
Da hätten wir eine Furniture_Spawn.lua

local DermaPanel = vgui.Create( "DFrame" )
DermaPanel:SetPos( 50,150 )
DermaPanel:SetSize( 700, 500 )
DermaPanel:SetTitle( "Spawn Furnitures" )
DermaPanel:SetVisible( true )
DermaPanel:SetDraggable( true )
DermaPanel:ShowCloseButton( true )
DermaPanel:MakePopup()

local DermaButton = vgui.Create( "DButton" )
DermaButton:SetParent( DermaPanel )
DermaButton:SetText( "Table" )
DermaButton:SetPos( 25, 50 )
DermaButton:SetSize( 150, 50 )
DermaButton.DoClick = function ()
SpawnTable()
end
und die cl_init.lua


include ("cl_hud.lua")
include ("Furniture_spawn.lua")

function SpawnTable()
local table = ents.Create("prop_physics")
table:SetModel("models/props_c17/FurnitureTable002a.mdl")
table:SetPos(tr.HitPos)
table:Spawn()
end


InGame geht direkt das Menü auf (ändere ich noch) und es kommt ein Panel mit einem Button namens "Table", bis dorthin keine errors!
Wenn ich auf den Button klicke spawnt bei den cooridnaten ~(0 0 64) ein Tisch durch den man durchlaufen kann und nicht zerstören.
Folgendes steht in der Console:

SantoRP/gamemode/cl_init.lua:8: attempt to index global 'tr' (a nil value)
Was habe ich übersehn, bzw. vergessen oder geht es auch leichter?
Thanks schonmal...
mfG Santo

Andrey
22.06.2008, 16:30
table:SetPos(tr.HitPos)




Er weiß nicht was "tr" ist.

Ich kenn mich leider nicht besonders mit Lua aus, aber du musst tr schon Definieren.

LoC
22.06.2008, 16:33
Genau. Guckst du am besten hier:
http://wiki.garrysmod.com/wiki/?title=Util.TraceLine

monky2k6
22.06.2008, 16:46
include ("cl_hud.lua")
include ("Furniture_spawn.lua")

local tr = self.Owner:GetEyeTrace()

function SpawnTable()
local table = ents.Create("prop_physics")
table:SetModel("models/props_c17/FurnitureTable002a.mdl")
table:SetPos(tr.HitPos)
table:Spawn()
end


Füg mal die Zeile ein.

WeltEnSTurm
22.06.2008, 17:07
Das ist der Spawncode eines normalen Entity.

function ENT:SpawnFunction( ply, tr )
if ( !tr.Hit ) then return end
local SpawnPos = tr.HitPos + tr.HitNormal * 16
local ent = ents.Create( "gravtogglecontroller" )
ent:SetPos( SpawnPos )
ent:Spawn()
ent:Activate()
return ent
end

Pac_187
22.06.2008, 17:17
Aber nur wenn du ein SENT erstellst!

-----

Desweiteren solltest du das Prop auf der Server Seite erstellen.

Mach einfach folgendes bei der DoClick Funktion:


DermaButton.DoClick = function ()
local tr = LocalPlayer():GetEyeTrace()

local myprop = ents.Create( "prop_physics" )
myprop:SetModel( "models/props_c17/FurnitureTable002a.mdl" )
myprop:SetPos( tr.HitPos )
myprop:Spawn()
end



Das sollte funktionieren.

Santo
23.06.2008, 13:56
Also muss ich das derma in cl_init und die function in init stecken oder wie? :gmod:

WeltEnSTurm
23.06.2008, 14:14
Wahrscheinlich.
cl_init ist darstellung/grafik, init das script

SMILIE
23.06.2008, 14:34
Wahrscheinlich.
cl_init ist darstellung/grafik, init das script

Das stimmt nur bedingt.
In der cl_init.lua sind die Sachen für den Client (Derma, HUD usw) und in der init.lua sind Sachen für den Server (Entities Spawnen usw)

Santo
23.06.2008, 16:07
SantoRP\gamemode\init.lua:1: attempt to index global 'self' (a nil value)

Pac_187
23.06.2008, 18:12
Du müsstest hier schon deinen jetzigen Code reinstellen.

Wir haben keine Glaskugel oder jeglichen Zugriff auf deinen PC ;)

Andrey
23.06.2008, 19:09
Du müsstest hier schon deinen jetzigen Code reinstellen.

Wir haben keine Glaskugel oder jeglichen Zugriff auf deinen PC ;)

Ich hab diesen Fehler auch ständig. Ist self etwa falsch?

Muss man das auch Definieren?

SMILIE
23.06.2008, 19:20
Ohne Code können wir nicht wissen was Falsch ist...

Edit: Ups sorry ich hab mir die vorige Seite angeschaut und vergessen die Posts auf der nächsten Seite zu lesen.

Santo
24.06.2008, 14:18
Du müsstest hier schon deinen jetzigen Code reinstellen.

Wir haben keine Glaskugel oder jeglichen Zugriff auf deinen PC ;)
LOL nicht? :roll:
cl_furniture_spawn.lua

include ("init.lua")

local DermaPanel = vgui.Create( "DFrame" )
DermaPanel:SetPos( 50,150 )
DermaPanel:SetSize( 700, 500 )
DermaPanel:SetTitle( "Spawn Furnitures" )
DermaPanel:SetVisible( true )
DermaPanel:SetDraggable( true )
DermaPanel:ShowCloseButton( true )
DermaPanel:MakePopup()

local DermaButton = vgui.Create( "DButton" )
DermaButton:SetParent( DermaPanel )
DermaButton:SetText( "Table" )
DermaButton:SetPos( 25, 50 )
DermaButton:SetSize( 150, 50 )
DermaButton.DoClick = function ()
SpawnTable()
end
init.lua

local tr = self.Owner:GetEyeTrace()

function SpawnTable()
local table = ents.Create("prop_physics")
table:SetModel("models/props_c17/FurnitureTable002a.mdl")
table:SetPos(tr.HitPos)
table:Spawn()
end

Pac_187
24.06.2008, 15:47
Also irgendwie hast meine Lösung noch nicht zu Herzen genommen oder?

Guckst du! (http://garrysmod.de/forum/showpost.php?p=259761&postcount=6)

Santo
24.06.2008, 16:13
Also irgendwie hast meine Lösung noch nicht zu Herzen genommen oder?

Guckst du! (http://garrysmod.de/forum/showpost.php?p=259761&postcount=6)
Dann sagt er mir


SantoRP\gamemode\cl_furniture_spawn.lua:16: attempt to call global 'LocaPlayer' (a nil value)

Pac_187
24.06.2008, 16:19
Ich habe doch gesagt du sollst das ganze aufn Server ausführen!

Scarecrow
24.06.2008, 17:40
SantoRP\gamemode\cl_furniture_spawn.lua:16: attempt to call global 'LocaPlayer' (a nil value)

Hah! Typischer Anfängerfehler, da weiß wohl jemand nicht wirklich was ein Client und was ein Server ist, gel?

Wird Zeit ein Client vs. Server Tutorial zu schreiben...

Und immer schön auf Pac hören...

A.I.
24.06.2008, 18:15
Also irgendwie hast meine Lösung noch nicht zu Herzen genommen oder?

Guckst du! (http://garrysmod.de/forum/showpost.php?p=259761&postcount=6)

Heißt es nicht "LocalPlayer" ?

Scarecrow
24.06.2008, 18:16
Heißt es nicht "LocalPlayer" ?

Das auch noch :gmod:

Santo
24.06.2008, 18:21
Also nochmal ganz von vorne in die init.lua soll jetzt

function SpawnFirstTable()
local tr = LocalPlayer:GetEyeTrace()
local Table = ents.Create( "prop_physics" )
Table:SetModel ("models/props_c17/FurnitureTable002a.mdl" )
Table:SetPos( tr.HitPos )
Table:Spawn()
end
und in die client seitige lua:

include ("init.lua")

local DermaPanel = vgui.Create( "DFrame" )
DermaPanel:SetPos( 50,150 )
DermaPanel:SetSize( 700, 500 )
DermaPanel:SetTitle( "Spawn Furnitures" )
DermaPanel:SetVisible( true )
DermaPanel:SetDraggable( true )
DermaPanel:ShowCloseButton( true )
DermaPanel:MakePopup()

local DermaButton = vgui.Create( "DButton" )
DermaButton:SetParent( DermaPanel )
DermaButton:SetText( "Table" )
DermaButton:SetPos( 25, 50 )
DermaButton:SetSize( 150, 50 )
DermaButton.DoClick = function ()
SpawnFirstTable()
end

Dann kommt nämlich


SantoRP\gamemode\init.lua:2: attempt to index global 'LocalPlayer' (a function value)D

Pac_187
24.06.2008, 18:39
Heißt es nicht "LocalPlayer" ?

Ok das war jetzt mein Fehler... Sorry.

----

@ Santo:

Pack alles in die init.lua

Und es heißt LocalPlayer()
MIT den Klammern!

Also auch:

LocalPlayer():GetEyeTrace()

Santo
24.06.2008, 18:53
Gut THANKS... aber nun ist es weder ein physisches prop noch hat es ein collisions model :gmod:

SMILIE
24.06.2008, 19:00
Wenn er das in die init.lua packt kann das nicht funktionieren, weil
1. LocalPlayer() Clientside ist
2. Derma auch Clientside ist

Das Derma gehört in eine Datei die Clientside ist und die Spawn Funktion in eine Datei die Serverside ist.

Dann musst du bei der Spawnfunktion noch ein concommand hinzufügen, und dann das vom Client aus aufrufen.

Serverside

function SpawnFirstTable(ply, cmd, args)
local tr = ply:GetEyeTrace()
local Table = ents.Create( "prop_physics" )
Table:SetModel ("models/props_c17/FurnitureTable002a.mdl" )
Table:SetPos( tr.HitPos )
Table:Spawn()
end
concommand.Add("spawnTable", spawnFirstTable);


Clientside


local DermaPanel = vgui.Create( "DFrame" )
DermaPanel:SetPos( 50,150 )
DermaPanel:SetSize( 700, 500 )
DermaPanel:SetTitle( "Spawn Furnitures" )
DermaPanel:SetVisible( true )
DermaPanel:SetDraggable( true )
DermaPanel:ShowCloseButton( true )
DermaPanel:MakePopup()

local DermaButton = vgui.Create( "DButton" )
DermaButton:SetParent( DermaPanel )
DermaButton:SetText( "Table" )
DermaButton:SetPos( 25, 50 )
DermaButton:SetSize( 150, 50 )
DermaButton.DoClick = function ()
RunConsoleCommand("spawnTable");
end

Pac_187
24.06.2008, 19:04
@SMILIE: Ich weis, aber erstmal soll es funktionieren ;)

Dann mach noch bei der Funktion folgendes:


DermaButton.DoClick = function ()
local tr = LocalPlayer():GetEyeTrace()

local myprop = ents.Create( "prop_physics" )
myprop:SetModel( "models/props_c17/FurnitureTable002a.mdl" )
myprop:SetPos( tr.HitPos )
myprop:Spawn()

// Folgendes noch dazu schreiben!
local phys = myprop:GetPhysicsObject()
if phys:IsValid() then
phys:Wake()
end
end



Dann sollte es funktionieren ;)

Santo
24.06.2008, 19:29
Bei der Version von Smilie kommt bei mir irgendwie
unknowncommand "spawnTable"
und bei der von Pac
Spawnt der Tisch irgendwo und hat wieder keine physic und nichts :S
sorry wenn ich es verbock :S

SMILIE
24.06.2008, 19:31
Sorry war mein Fehler!

Ich hab geglaubt die Funktion heist spawnTable nicht SpawnFirstTable das ist das Problem.

Ich habs jetzt ausgebessert sollte nun funktionieren.

Pac_187
24.06.2008, 19:33
Wo hast du denn die Datei drin abgelegt?

Santo
24.06.2008, 19:39
Sorry war mein Fehler!

Ich hab geglaubt die Funktion heist spawnTable nicht SpawnFirstTable das ist das Problem.

Ich habs jetzt ausgebessert sollte nun funktionieren.

Also damit ich was lerne:
Hast du nicht eine funktion gemacht die SpawnFirstTable heißt um dann einen consolenbefehl zu machen der spawnTable heißt UM DANN diese mit der client seitigen lua abzurufen? :S

SMILIE
24.06.2008, 19:41
Also damit ich was lerne:
Hast du nicht eine funktion gemacht die SpawnFirstTable heißt um dann einen consolenbefehl zu machen der spawnTable heißt UM DANN diese mit der client seitigen lua abzurufen? :S

Ja genau das hab ich gemacht.
So weit ich weis geht das nicht anders durch das Client/Server

Pac_187
24.06.2008, 19:43
So ist es ;)

Hier (http://garrysmod.de/wiki/index.php/VGUI_Tutorial) kannst du noch ein sehr gutes Tutorial von Scarecrow/Comodofox finden!

Dort ist es in etwa genau so gemacht,
nur das halt kein Entity gespawnt wird,
sondern dem Spieler 10 Lebenspunkte hinzugefügt werden.

Santo
24.06.2008, 19:49
Ja genau das hab ich gemacht.
So weit ich weis geht das nicht anders durch das Client/Server

Ja aber dann seh ich kein fehler?

SMILIE
24.06.2008, 20:17
Der Fehler ist beim concommand.Add("spawnTable", spawnTable); und nicht concommand.Add("spawnTable", spawnFirstTable);

Die Funktion heist nämlcih SpawnFirstTable deshalb hat es nicht funktioniert.

Gehts jetzt?

Santo
24.06.2008, 20:20
Der Fehler ist beim concommand.Add("spawnTable", spawnTable); und nicht concommand.Add("spawnTable", spawnFirstTable);

Die Funktion heist nämlcih SpawnFirstTable deshalb hat es nicht funktioniert.

Gehts jetzt?

Ähm ... nein aber... es ist doch:
concommand.Add("CONSOLENBEFEHL", FUNKTIONSNAME) oder? weil dann wäre
concommand.Add("spawnTable", spawnFirstTable) doch richtig? :D
zitiere:

function SpawnFirstTable(ply, cmd, args)
Funktion heißt somit "SpawnFirstTable"

JAWOLL und mit SpawnFirstTable gehts nun auch...keine Ahnung warum es vorher nicht ging!
Zu guter letzt:
wie ignoriere ich bei "wohin der tisch gespawnt wird" die maus im derma und verwende das crosshair? =D
Weil nun spawne ich mit klicken auf die schaltfläche und dort wo die schlatfläche war spawnt dann der tisch :D

SMILIE
24.06.2008, 20:33
Vielleicht funktioniert das: http://wiki.garrysmod.com/wiki/?title=Util.TraceLine
Das Code Stück dort unten mein ich.

Santo
24.06.2008, 20:40
Vielleicht funktioniert das: http://wiki.garrysmod.com/wiki/?title=Util.TraceLine
Das Code Stück dort unten mein ich.

Zitat plz xD

SMILIE
24.06.2008, 21:18
function spawnFirstTable(ply, cmd, args)
local pos = ply:GetShootPos()
local ang = ply:GetAimVector()
local tracedata = {}
tracedata.start = pos
tracedata.endpos = pos+(ang*80)
tracedata.filter = ply
local trace = util.TraceLine(tracedata)

local Table = ents.Create( "prop_physics" )
Table:SetModel ("models/props_c17/FurnitureTable002a.mdl" )
Table:SetPos( trace.HitPos )
Table:Spawn()
end
concommand.Add("spawnTable", spawnFirstTable);

Santo
24.06.2008, 21:38
das wäre dann server?
wenn ja dann:

SantoRP/gamemode/init.lua:2: attempt to index global 'self' (a nil value)

Pac_187
24.06.2008, 21:50
function spawnFirstTable(ply, cmd, args)
local pos = ply:GetShootPos()
local ang = ply:GetAimVector()
local tracedata = {}
tracedata.start = pos
tracedata.endpos = pos+(ang*80)
tracedata.filter = ply
local trace = util.TraceLine(tracedata)

local Table = ents.Create( "prop_physics" )
Table:SetModel ("models/props_c17/FurnitureTable002a.mdl" )
Table:SetPos( trace.HitPos )
Table:Spawn()
end
concommand.Add("spawnTable", spawnFirstTable);


Fixed!


self.Owner wird nur in einer SWEP/SENT genutzt!

Santo
24.06.2008, 22:16
Holy **** es geht!
Für alle die wissen wollen wie:
Client:
function DermaFurniture()
local DermaPanel = vgui.Create( "DFrame" )
DermaPanel:SetPos( 50,150 )
DermaPanel:SetSize( 700, 500 )
DermaPanel:SetTitle( "Spawn Furnitures" )
DermaPanel:SetVisible( true )
DermaPanel:SetDraggable( true )
DermaPanel:ShowCloseButton( true )
DermaPanel:MakePopup()

local DermaButton1 = vgui.Create( "DImageButton", DermaPanel )
DermaButton1:SetImage( "derma/FurnitureTable002a.vtf" )
DermaButton1:SetParent( DermaPanel )
DermaButton1:SetText( "Table" )
DermaButton1:SetPos( 25, 50 )
DermaButton1:SetSize( 64, 64 )
DermaButton1.DoClick = function ()
RunConsoleCommand("spawnTable");
end
end

concommand.Add("da_furniture_derma", DermaFurniture);
Server:
function spawnFirstTable(ply, cmd, args)
local pos = ply:GetShootPos()
local ang = ply:GetAimVector()
local tracedata = {}
tracedata.start = pos
tracedata.endpos = pos+(ang*80)
tracedata.filter = ply.Owner
local trace = util.TraceLine(tracedata)

local Table = ents.Create( "prop_physics" )
Table:SetModel ("models/props_c17/FurnitureTable002a.mdl" )
Table:SetPos( trace.HitPos )
Table:Spawn()
end
concommand.Add("spawnTable", spawnFirstTable);

SMILIE
25.06.2008, 15:09
Ja sorry ich hab vergessen das zu ändern ich hab das nämlich von der Seite einfach nur kopiert und den Namen vom Trace geändert aber nicht vom Player.

Gut das es jetzt funktioniert.