PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche liste aller Klassennamen



MagicStyle
07.04.2013, 19:38
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:

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)

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!

RP-01
07.04.2013, 21:59
There (http://wiki.garrysmod.de/Entity_Liste#npc_.2A) 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:
lua_run for k, v in pairs( scripted_ents.GetList() ) do print( v.ClassName ) end

MagicStyle
07.04.2013, 22:16
: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.


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

isch
08.04.2013, 00:02
Dein Code ist leider schlecht/falsch eingerückt. Dadurch ist er schwer verständlich und man erkennt nicht schnell was er eigentlich tun soll.

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 (https://gist.github.com/) 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.

MagicStyle
08.04.2013, 09:23
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).



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.

isch
08.04.2013, 10:56
Weil es mir gerade zufällig aufgefallen ist:


local btn = vgui.Create("DLabel",window)
Wieso ist der Button eigentlich ein "DLabel (http://wiki.garrysmod.com/page/VGUI/Elements/DLabel)" und kein "DButton (http://wiki.garrysmod.com/page/VGUI/Elements/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


function spawnMyZombie(ply, cmd, args, fullstring)
--[[ hier das ents.Cretate ]]--
end


shared.lua


concommand.Add (http://wiki.garrysmod.com/page/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


// dein Code wie bisher, btn:DoClick dann jedoch folgendermaßen:
btn:DoClick = function(btn)
RunConsoleCommand (http://wiki.garrysmod.com/page/Global/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".

MagicStyle
08.04.2013, 12:58
Weil es mir gerade zufällig aufgefallen ist:

Wieso ist der Button eigentlich ein "DLabel (http://wiki.garrysmod.com/page/VGUI/Elements/DLabel)" und kein "DButton (http://wiki.garrysmod.com/page/VGUI/Elements/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:

MagicStyle
08.04.2013, 13:35
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


function spawnMyZombie()
--[[ hier das ents.Cretate ]]--
end
shared.lua

concommand.Add('spawn_zombie_command', function()
if SERVER then
spawnMyZombie()
end
end)

Oder hat es einen wichtigen Grund das du das so gemacht hast :?:

isch
08.04.2013, 14:07
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() (http://wiki.garrysmod.com/page/Global/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.

Eddman
08.04.2013, 14:28
Sehr verständlich, Ich seh schon von euch kann man so einiges Lernen! :)

MagicStyle
08.04.2013, 15:04
Dem kann ich mich nur anschließen, danke :)