PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Player: Methoden hinzufügen



makkurona
30.10.2007, 13:25
Hallo, und herzlichst Willkommen zu meinem ersten Post.

Derzeit schreibe ich bevorzugt in LUA und stieß dabei auf LUA in Verbindung mit Garrys Mod, habe mich eingearbeitet, die Wikis gewälzt und Google bemüht. Bei einem Freund teste ich meine Scripts. Mein PC ist leider Gottes zu schlecht. Nunja, nervig aber es geht.^^

Nun denn, momentan frage ich mich, wie ich dem Objekt Player eigene Methoden und Eigenschaften hinzufügen kann.
Beispielsweise die Eigenschaft 'ply:blubb' und die Methode 'ply:GetBlubb()'.

Wahrscheinlich ist die Lösung relativ sehr einfach, aber ich komme momentan einfach nicht drauf, und meine alt bewehrten suchmaschienen wollten mir dieses mal auch nicht auf die Sprünge helfen. (Gott hasst mich...:()

Grüße,
makku

Pac_187
30.10.2007, 13:27
Erst einmal Herzlich Willkommen im Forum!


Was möchtest du denn machen?
Stelle uns dein "Konzept" in groben Zügen vor,
denn das würde das ganze vereinfachen ;)

makkurona
30.10.2007, 13:31
Wow. Du bist schnell. *zwinker*

Nunja, mein Ziel ist es im groben, das Objekt Player zu erweitern. Das ganze dient dem Zweck, ein kleines System zu entwickeln, das menschliche Bedürfnisse wie Hunger, Durst, zuneigung, Blasendruck und ähnliches umfasst. ^^

Das ganz wollte ich dann eben dadurch realisieren das Playerobjekt um ein paar Methoden und Eigenschaften zu erweitern..sofern das geht, ohne das Objekt an sich umzuschreiben. *hust*

Pac_187
30.10.2007, 13:34
Du willst also so etwas, wie ein Roleplayscript schreiben?
Bitte nicht... davon gibt es schon soooooo viele!

makkurona
30.10.2007, 13:37
*schmunzel*
Zum Bitte nicht sei angemerkt: Ich kenne mich da nicht aus.^^

Zum Rollplayscript:
Ich schreibes momentan für besagten Freund, der es ganz lustig Fände, wenn seine Besucher immer mal aufs klo rennen müssen, wenn sie auf seinem Server sitzen.^^

Außerdem Interessiert es mich im allgemeinen, wie man anderen Objekten neue Methoden usw geben kann. Hätte Interessante Möglichkeiten.^^

Pac_187
30.10.2007, 13:55
Hm... das wird schwierig.

Du könntest das ganze mit Tables regeln.
Hatte mal irgendwo einen Thread ausm FP davon, aber kann ihn leider
nicht wiederfinden :-?

makkurona
30.10.2007, 14:04
Meinst du...
Ahh. Ich glaube ich verstehe.

In Richtung Datenbankmanagement.

Jeder Table kriegt Beispielsweise die Steamid eines Players und dadrinne werden dann die Werte und funktionen gespeichert?

Hätte ich auch selbst drauf kommen können... aber mir fallen standartmäßig nur die komplizierten Lösungen ein. *seufz* Schade eigentlich, dass es keine elegantere Lösung gibt.^^

Pac_187
30.10.2007, 14:07
Naja hier sind so zwei wichtige Sachen die du brauchst, um dich durch
V10 Lua durch zuschlagen:

Liste aller Befehle (http://www.garrysmod.com/wiki/?title=Category:Lua_functions&until=Player.IsPlayer) ( Sind nicht alle, sonder nur die, die auch schon beschrieben wurden [Beispiele und so])

Lua-Wiki (http://www.garrysmod.com/wiki/?title=Lua)

Natürlich alles auf Englisch!

makkurona
30.10.2007, 14:13
Jabb, das ist eines der Wikis, durch die ich mich gewälzt habe.
Dann werde ich es halt per Tables lösen. *Seufz*

Vielen Dank^^

Grüße, makku

Scarecrow
30.10.2007, 18:44
also das Objekt "ply" zu erweitern ist demnach nicht möglich, weil es ein festgelegtes Objekt mit festgelegten Methoden ist. Ich bin mir nicht sicher, aber es soll möglich sein, eigene Methoden für eigene Variablen in Lua zu machen. Solltest du dich damit aber nicht abfinden, dann könntest du, wenn du es schaffst, deine eigene .dll-Library erstellen, die dann in Gmod geladen werden kann und so Funktionen erweitert.

Wie man diese erstellt weiß ich leider auch nicht, weil ich sonst auch alles mit Tables und Textdateien machen würde ;)

aVoN
30.10.2007, 18:48
Sorry wenn ich es jetzt mal so auszudrücke, aber anscheinend hat kaum einer meiner vorherigen Poster einen Ahnung bezüglich OOP und Lua.
Es ist sehr einfach mit der GMod internen Funktinon FindMetaTable() einer Class (Metatable) eine weitere Methode hinzuzufügen:


local meta = GetMetaTable("Player")
if(meta) then -- Existiert die MT? Normalerweise ja.
function meta:SayCrap()
self:ConCommand("say Crap!\n");
end
end
Wenn du Methods überschreiben willst (kommt eher selten vor), musst du dir klar machen, das diverse Classen ihre Methoden auch von Entity erben (Player,NPC,Weapon). Z.b. ist SetPos nur in Entity registriert, existiert allerdings nur vererbt in Player und ist somit nicht in der obigen metatable vorhanden.

Viel Glück.

Scarecrow
30.10.2007, 18:54
Sorry wenn ich es jetzt mal so auszudrücke, aber anscheinend hat kaum einer meiner vorherigen Poster einen Ahnung bezüglich OOP und Lua.


Hmmm, dann habe ich da was falsch gelesen in der englischen Wiki oder das war nur ein übler Scherz, den mir jemand aufgebunden hat (ich habe mich deswegen nochmal ausgibig erkundet, aber ohne Erfolg). Naja, wie auch immer, objektorientiertes Programmieren mache ich sowiso nur in AS2.0 und PHP :)

makkurona
30.10.2007, 19:10
@Avon:

Demnach kann ich einfach daudrch, dass ich die Funktion für das Objekt definiere besagte Funktion hinzufügen?

Könnte also einfach:


local meta = GetMetaTable("Player")
if(meta) then -- Existiert die MT? Normalerweise ja.
function meta:EatYourShoes()
msg('You've Eaten your shoes, dude. o.O\n');
end
end

Und jetzt könnte ich (Client und Server?) per ply:EatYourShoes() den String in die Konsole schreiben?

Pac_187
30.10.2007, 20:00
Sorry wenn ich es jetzt mal so auszudrücke, aber anscheinend hat kaum einer meiner vorherigen Poster einen Ahnung bezüglich OOP und Lua.
Es ist sehr einfach mit der GMod internen Funktinon FindMetaTable() einer Class (Metatable) eine weitere Methode hinzuzufügen:


Es ist nun einmal nicht jeder so erfahren wie du.

Ich kenne mich in dem Bereich nicht so gut aus, deswegen bin auch nicht zu 100% sicher, was das Thema angeht.

Wenn du möchtest kannst du dein Wissen auch in der Wiki (http://garrysmod.de/wiki/index.php/LUA) verbreiten ;)


-----

Das Tutorial zu den Metatables habe ich jetzt auch wieder gefunden:

Klick! (http://archive.facepunchstudios.com/showthread/?id=403748)

Leider hat man keine schöne Übersicht mehr vom ganzen Thread,
da durch die Archivierung alle Formatierungen deaktiviert wurden. :-?

aVoN
30.10.2007, 20:28
@Avon:

Demnach kann ich einfach daudrch, dass ich die Funktion für das Objekt definiere besagte Funktion hinzufügen?

Könnte also einfach:


local meta = GetMetaTable("Player")
if(meta) then -- Existiert die MT? Normalerweise ja.
function meta:EatYourShoes()
msg('You've Eaten your shoes, dude. o.O\n');
end
end

Und jetzt könnte ich (Client und Server?) per ply:EatYourShoes() den String in die Konsole schreiben?
Die Method funktioniert nur dort, wo du sie definiert hast (Clientside oder Serverside). Und ja, ply:EatYourShoes() ist die richtige Art und Weise die Methode zu callen. self in der Methode wird dann dementsprechend das player object sein.

makkurona
31.10.2007, 18:07
Ahh... ich bedanke mich sehr herzlich!

das bringt mich doch ein ganzes Stück weiter. =)