Suche liste aller Klassennamen
Hi, hoffe jemand kann mir helfen. Ich habe mir vor einigen Tagen mit dem Skelleton Grundgerüsts ein eigenen Gamemode erstellt um diverse wichtige Dinge zu üben. Dazu gehört natürlich auch das Spawnen von NPC's. Jedoch komme ich nicht weiter, da ich den Klassennamen für NPC's nicht weiss.
Mit folgendem Code spawnt man ja ein Fass:
Code:
barrel=ents.Create("prop_physics")
barrel:SetModel("models/props_c17/oildrum001.mdl")
barrel:SetPos(Vector(0,0,0))
barrel:Spawn()
Also dachte ich mir ich kann genauso auch NPC's spawnen, nur leider weiss ich nicht was ich anstatt prop_physics nehmen muss? Gibt es da eine Liste mit allen verfügbaren Klassennamen? Ich finde keine :(
So sieht mein Code bisher aus, der Auslöser ist ein Button in einem Fenster (bereits fertiggestellt):
(cl_init.lua)
Code:
x = 0
y = 0
z = 0
ent = ents.Create("prop_physics")
local spawnpos = Vector(x,y,z)
function spawnnpc(ent)
ent:SetPos(spawnpos)
ent:Spawn()
end
Wo finde ich eine Liste mit allen Namen die ich anstelle von prop_physics eintragen könnte, in der Hoffnung den richtigen zu finden. Danke für eure Hilfe!
AW: Suche liste aller Klassennamen
There you go.
Das ist neh Liste, mit allen Entity-Namen aus HL²:Ep2. Wenn du allerdings auch alle anderen Classnames haben willst, unter anderem von den Entities aus Sandbox und denen der AddOns, hau das in die Konsole:
AW: Suche liste aller Klassennamen
:bow Ich Danke dir vielmals ! :bow Es funktioniert! :up:
Edit: Mir ist gerade noch etwas zusätzliches eingefallen, funktioniert aber noch nicht. Ich habe jetzt bei cl_init.lua (Client) ein Fenster mit einem Button als Auslöser für den Spawn erstellt. Vielleicht kann mir da jemand helfen.
Code:
function spawnmenu()
local ply = LocalPlayer()
local window = vgui.Create("DFrame")
local btn = vgui.Create("DLabel",window)
window:SetPos(50,50)
window:Set.....
--gekürzt
btn:SetFont("default")
btn:SetText("Spawn")
btn:DoClick = function(btn)
local spawnpos = Vector(0,0,0)
ent = ents.Create("npc_fastzombie")
ent:SetModel("models/player/zombiefast.mdl")
ent:SetPos(spawnpos)
ent:Spawn()
end
end
Das GUI Funzt, aber wenn ich auf den Button drücke sagt die Konsole folgendes:
[ERROR] gamemodes/testing/gamemode/cl_init.lua:101: attempt to call field 'Create' (a nil value)
1. DoClick - gamemodes/testing/gamemode/cl_init.lua:101
2. unknown - lua/vgui/dlabel.lua:206
AW: Suche liste aller Klassennamen
Dein Code ist leider schlecht/falsch eingerückt. Dadurch ist er schwer verständlich und man erkennt nicht schnell was er eigentlich tun soll.
Code:
function spawnmenu()
local ply = LocalPlayer()
local window = vgui.Create("DFrame")
local btn = vgui.Create("DLabel",window)
window:SetPos(50,50)
--[[ gekürzt ]]--
btn:SetFont("default")
btn:SetText("Spawn")
btn:DoClick = function(btn)
local spawnpos = Vector(0,0,0)
ent = ents.Create("npc_fastzombie")
ent:SetModel("models/player/zombiefast.mdl")
ent:SetPos(spawnpos)
ent:Spawn()
end
end
Ich gehe davon aus, dass die rot markierte Zeile die Zeile 101 ist?
Vielleicht hast du weiter oben schon die Variable "ents" überschrieben?
Am einfachsten postest du einfach den Inhalt der gesamten Datei und nicht nur einen Ausschnitt.
(Längere Codeauszüge bitte nicht direkt ins Forum. Bitte den Code auf beispielsweise Gist einzufügen und bei "Language" noch "Lua" auswählen. Dann noch auf "Create Public Gist" und dann den Link hier im Forum posten)
Da du das Entity Client-seitig erstellst - Dir ist bewusst das es dann auch nur dieser eine Spieler sieht und die anderen nicht? Wenn du willst das es alle Spieler sehen musst du es Server-seitig erstellen.
AW: Suche liste aller Klassennamen
Hi, Danke erstmal für deine Antwort. Ja, stimmt, beim nächsten mal mach ich es besser :/ Habe momentan keinen Zugriff auf meine Dateien da ich am Schul Pc bin, ich werde später den Code hier nach deiner Anleitung reinkopieren (so gegen 14 Uhr).
Zitat:
Zitat von
isch
Da du das Entity Client-seitig erstellst - Dir ist bewusst das es dann auch nur dieser eine Spieler sieht und die anderen nicht? Wenn du willst das es alle Spieler sehen musst du es Server-seitig erstellen.
Ups, das wusste ich nicht :D, danke für die Aufklärung, ich modde noch nicht sehr lange mit GMOD :/
Aber kann ich das dann eigentlich so lösen (über den Client) das ein NPC per Buttonklick spawnt? Ist es möglich das komplette Derma Fenster in die Server datei (init.lua) zu schreiben? Um 14 Uhr poste ich mal den Code.
AW: Suche liste aller Klassennamen
Weil es mir gerade zufällig aufgefallen ist:
Zitat:
Zitat von
MagicStyle
Code:
local btn = vgui.Create("DLabel",window)
Wieso ist der Button eigentlich ein "DLabel" und kein "DButton"?
Das "btn:DoClick" wird (laut Wiki) vom Label nicht unterstützt sondern nur vom Button. (Siehe im Wiki unter "Methods")
Zu deiner zweiten Frage - Lua ist zwar schon länger her und ich bin mir nicht sicher ob das die beste Lösung ist - grundsätzlich kannst du das jedoch über Console Commands lösen.
Bei Klick auf den Button wird nicht direkt das Prop ausgeführt, der Button führt lediglich ein Console Command aus. Dieser Befehl wird dann am Server empfangen und ausgeführt.
init.lua
Code:
function spawnMyZombie(ply, cmd, args, fullstring)
--[[ hier das ents.Cretate ]]--
end
shared.lua
Code:
concommand.Add('spawn_zombie_command', function(ply, cmd, args, fullstring)
// Wir müssen das Console Command sowohl am Server als auch am Client hinzufügen - sonst kennt der Client den Befehl nicht und kann ihn auch nicht richtig an den Server weitergeben.
// Den Code zum Spawnen des Zombies wollen wir jedoch nur am Server ausführen. Hier wird überprüft ob wir gerade am Client oder am Server sind.
// Am Server wird "spawnMyZombie" ausgeführt, am Client passiert einfach nichts
if SERVER then
spawnMyZombie(ply, cmd, args, fullstring)
end
end, null, 'Erstellt einen Zombie', FCVAR_NONE)
cl_init.lua
Code:
// dein Code wie bisher, btn:DoClick dann jedoch folgendermaßen:
btn:DoClick = function(btn)
RunConsoleCommand('spawn_zombie_command')
end
Wenn du nun auf den Button Klickst wird der Befehl "spawn_zombie_command" ausgeführt. (cl_init.lua - Client)
Der Befehl wird dann vom concommand.Add (shared.lua - Shared) abgefangen. Dies passiert am Server und Client gleichzeitig, daher wird geprüft ob es gerade am Server oder Client ausgeführt wird. Da wir das Entity ja am Server und nicht am Client erstellen wollen, wenn Client machen wir einfach nichts, wenn Server führen wir die Funktion "spawnMyZombie" aus.
In "spawnMyZombie" (init.lua - Server) kommt dann der ganze Code mit dem "ents.Create".
AW: Suche liste aller Klassennamen
Zitat:
Zitat von
isch
Weil es mir gerade zufällig aufgefallen ist:
Wieso ist der Button eigentlich ein "
DLabel" und kein "
DButton"?
Das "btn:DoClick" wird (laut Wiki) vom Label nicht unterstützt sondern nur vom Button. (Siehe im Wiki unter "Methods")
Hi isch, das stimmt allerdings, ist mir wohl dummerweise beim rüberkopieren passiert , hab vergessen den Wert umzuschreiben :/ sorry :oops:.
Vielen Dank für deine Ausführliche Hilfestellung, ich weiss deine Mühe wirklich zu schätzen :up::up::up:. Ich werde gleich mal deine Variante versuchen und anschließend Bericht erstatten :) vom prinzip her habe ich es jetzt dank dir voll verstanden. Danke
Edit: Es funktioniert ! :) Entlich!! Viele vielen Dank für eure Hilfsbereitschaft!!! :up:
AW: Suche liste aller Klassennamen
PS: Man könnte den Code auch etwas einfacher schreiben, ich versuche immer alles so unkompliziert wie möglich zu gestalten, also habe ich testweise einfach mal die Argumente komplett weggelassen und es funktioniert trotzdem tadellos, also:
init.lua
Code:
function spawnMyZombie()
--[[ hier das ents.Cretate ]]--
end
shared.lua
Code:
concommand.Add('spawn_zombie_command', function()
if SERVER then
spawnMyZombie()
end
end)
Oder hat es einen wichtigen Grund das du das so gemacht hast :?:
AW: Suche liste aller Klassennamen
Ja man kann die Argumente kann man weglassen, habe ich lediglich der Vollständigkeit halber hier eingefügt.
Ob du sie brauchst oder nicht kommt dann auf den spezielle Anwendungsfall drauf an. In deinem Fall werden sie nicht benötigt. Willst du aber beispielsweise im Chat schreiben "[Spielername] hat einen Zombie gespawnt." benötigst du das ply Argument. Dort wird das Player-Objekt des Spielers übergeben, der den Befehl ausführt. Eine weitere Möglichkeit wäre, dass du dadurch überprüfst ob der Benutzer die ausreichenden Berechtigungen besitzt. (Admin-Befehle z.B.)
Die Parameter die übergeben werden sind wie folgt:
Parameter 1 - ply - Der Spieler der den Befehl ausgeführt hat
Parameter 2 - cmd - Der Befehl selbst. Du könntest mehrere Befehle benutzen um die gleiche Funktion in Lua auszuführen. Dadurch kannst du dann innerhalb der Funktion sehen welcher Befehl eingegeben wurde
Parameter 3 - args - Eine Liste/Tabelle mit den Parametern (durch Leerzeichen getrennt). z.B. könntest du noch die Koordinaten des Players übergeben und den Zombie unmittelbar vor dem Spieler spawnen
Parameter 4 - fullstring - Einfach der komplette Befehl inklusive Parameter der eingegeben wurde als String
Ich würde dir empfehlen den ersten Parameter zu übergeben und mithilfe vom ServerLog() zu loggen wenn ein Spieler einen Zombie spawnt. Ansonsten kann ein Spieler einfach spammen, für dich ist es aber nur schwer nachvollziehbar welcher Spieler das nun war.
AW: Suche liste aller Klassennamen
Sehr verständlich, Ich seh schon von euch kann man so einiges Lernen! :)