Archiv verlassen und diese Seite im Standarddesign anzeigen : Entity Spawnen aber wie? :D
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
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.
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
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.
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
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)
SantoRP\gamemode\init.lua:1: attempt to index global 'self' (a nil value)
Du müsstest hier schon deinen jetzigen Code reinstellen.
Wir haben keine Glaskugel oder jeglichen Zugriff auf deinen PC ;)
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?
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.
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
Also irgendwie hast meine Lösung noch nicht zu Herzen genommen oder?
Guckst du! (http://garrysmod.de/forum/showpost.php?p=259761&postcount=6)
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)
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...
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:
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
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()
Gut THANKS... aber nun ist es weder ein physisches prop noch hat es ein collisions model :gmod:
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
@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 ;)
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
Sorry war mein Fehler!
Ich hab geglaubt die Funktion heist spawnTable nicht SpawnFirstTable das ist das Problem.
Ich habs jetzt ausgebessert sollte nun funktionieren.
Wo hast du denn die Datei drin abgelegt?
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
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
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.
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?
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?
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
Vielleicht funktioniert das: http://wiki.garrysmod.com/wiki/?title=Util.TraceLine
Das Code Stück dort unten mein ich.
Vielleicht funktioniert das: http://wiki.garrysmod.com/wiki/?title=Util.TraceLine
Das Code Stück dort unten mein ich.
Zitat plz xD
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);
das wäre dann server?
wenn ja dann:
SantoRP/gamemode/init.lua:2: attempt to index global 'self' (a nil value)
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!
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);
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.
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.