Archiv verlassen und diese Seite im Standarddesign anzeigen : Gemeinsame Datei
Hi, weiss jemand wie ich es realisieren kann, das ich eine einzige Datei für mehrere Projekte verwenden kann? Ich habe z.B. eine Datei <test.lua> am Pfad "addons/ForAll/test.lua", weiss aber nicht wie ich diese einbinden muss.
Nehmen wir an ich habe zwei Scripted Entitys die beide auf diese Datei zugreifen können sollen.
Was trage ich dann in der <init.lua> der beiden SEnt's bei AddCSLuaFile( "PFAD" ) bzw. include('PFAD') ein damit es funktioniert?
Danke für eure Hilfe :-)
Wenn die Datei im selbem Ordner wie die <init.lua> liegen würde, dann wäre es ja einfach AddCSLuaFile("test.lua") was schreibe ich aber wenn die Datei z.B. einen Ordner zurück liegt? AddCSLuaFile("..test.lua")
Und wie wenn die Datei zwei Ordern zurückliegt oder ganz wo anderst liegt??
Das steht im alten Wiki beschrieben
http://maurits.tv/data/garrysmod/wiki/wiki.garrysmod.com/indexe9af-2.html
[...]
The file name must not include ".." - this is the special folder name to go up a folder.
The path is relative to the addon's lua folder.
[...]
Du kannst also nur Dateien einbinden die sich innerhalb [...]/garrysmod/addons/[addon]/lua/ (im gleichen Addons Ordner) befinden. Wenn du die Datei öfter brauchen solltest musst du sie auch doppelt (in den jeweiligen Addons) erstellen.
Aber ganz versteh ich dein vorhaben sowieso nicht. Aus welchem Grund musst du ein und die selbe Datei öfter includen? Wenn in der Datei z.B. eine Funktion definiert ist braucht man sie ja nur einmal includen, die Funktion ist dann (wenn nicht als local definiert) auch von wo anders aufrufbar.
Wenn in der Datei Code steht der einfach durchlaufen werden soll, dann ist das ganze eine Funktion und sollte auch als solche definiert werden. Dann kannst du diese Funktion aufrufen und es passiert das gleiche wie wenn du die Datei includest.
Hi, ich habe z.B. ein SEnt genauer gesagt eine Melone als Nahrungsmittel die der Spieler essen kann und dann HP's dazu addiert bekommt. Ich möchte aber das der Spieler nachdem er eine Einheit gegessen hat, erstmal eine Zeitspanne warten muss bis er wieder essen kann. Das habe ich schon realisiert.
Mein nächstes Ziel ist es nun ein weiteres Nahrungsmittel zu erstellen, das sich an die selbe Regel hält. Soll also ebenfalls nur dann gegessen werden dürfen wenn die Variable Status auf "hungry" gesetzt ist.
Nun bräuchte ich ja eine Datei wo der Nahrungsmittel Bedürfniszustand gespeichert ist, hier würde es nicht funktionieren die Datei einfach zu duplizieren, da ich ja dann für jedes verschiedene Nahrungsmittel ein "eigenes Bedürfnis" hätte.
Wenn in der Datei z.B. eine Funktion definiert ist braucht man sie ja nur einmal includen, die Funktion ist dann (wenn nicht als local definiert) auch von wo anders aufrufbar.
Wie kann man Funktionen includen, hast du ein Beispiel für mich? Etwa so : include("essen()") ??
gamerpaddy
20.04.2013, 13:56
Du brauchst garnichts includen.. Schaff es einfach, dass die datei, in der die funktion die die SENT's aufrufen sollen drinn ist, als erstes zu laden (pack es in den autorun ordner..)
Wenn da nun
function EatSomething( food )
if self:IsPlayer() and self:IsAlive() then
if food == "banana" then self:AddHealth(100) return true elseif food == "nougatbisquitbreadcrumps" then self:AddHealth(1337) return true else return false end
end
end(als beispiel)
drinn steht, kannst du in jedem SENT, SWEP, Addon oder anderen Datei die funktion
ateIT = ply:EatSomething("banana)
aufrufen
nice, das wusste ich nicht, heisst das also konkret das alle Funktionen aller Lua Dateien die irgendwo im Autorun Ordner liegen von überall erreichbar sind?
gamerpaddy
21.04.2013, 00:11
Nicht nur autorun.. in jeder datei.. Hauptsache diese wird vor der datei geladen, die die funktion aufrufen willl
Achja, und es sollte kein "local" vor der funktion stehen.
Nicht nur autorun.. in jeder datei.. Hauptsache diese wird vor der datei geladen, die die funktion aufrufen willl
Achja, und es sollte kein "local" vor der funktion stehen.
Heisst das also das ich auf alle globalen Funktionen jederzeit zugreifen kann, wenn diese geladen sind?
Heisst das das ich von meinem SEnt auf alle anderen globalen Funktionen aller SEnts zugreifen kann?
Hauptsache diese wird vor der datei geladen, die die funktion aufrufen willl
Und wie erreicht man das?
Edit: Habe es gerade probiert..
Beide SEnts liegen im Addon Ordner.
addons\test1\lua\entities\test1
addons\test2\lua\entities\test2
Habe versucht die Funktion eat von test1 bei test2 aufzurufen und habe folgenden Fehler bekommen:
attempt to call method 'eat' (a nil value)
gamerpaddy
21.04.2013, 14:07
Um funktionen in SENTs von aussen abzurufen, musst du das Entity angeben..
zb.
Entitiy(139).eat()
(139 ist in dem moment die ENT ID, des SENT's)
Um funktionen anderer Dateien die als erstes geladen werden abzurufen, kann man einfach die funktion im SENT aufrufen.
Wie zb.
(im SENT)
ENT:Use( ply )
ply:giveHealth(453)
end
wobei in der datei, die als erstes geladen wird steht:
function giveHealth( h )
if not self:IsPlayer() or not self:IsAlive() then return end
self:SetHealth(self:GetHealth() + h)
end
ok, aber wie erreiche ich das eine Datei früher geladen wird? Du meintest vorhin es muss nicht unbedingt bei Autorun liegen
gamerpaddy
21.04.2013, 18:22
zb. Wenn du die irgentwo im Lua ordner platzierst, und über irgenteine autorun per include("dateiname.lua") einbaust.
Der Ordnerpfad muss dann natürlich auch angegeben werden. Beispiel: Du legst eine Datei a.lua in dem Ordner lolbob in ../garrysmod/garrysmod/lua an. Um a.txt nun zu laden, musst du irgendwo include( "lolbob/a.lua" ) aufrufen.
Wenn du nirgendwo ein "/" in dem Pfad-String angibst, sucht er entweder im Ordner der Datei von welcher die Funktion aus aufgerufen wird, oder, sofern ersteres nicht der Fall ist, in ../garrysmod/garrysmod/lua nach der angegebenen Datei.
Weiteres Beispiel: Du rufst in der init.lua des Entites im Ordner sent_lolwut, include( "b.lua" ) auf. Die Datei kann nun entweder im Ordner von ../entites/sent_lolwut liegen, oder in ../garrysmod/garrysmod/lua direkt, da er beide Fälle -gegebenfalls- überprüft.
Auf das Beispiel von oben mit a.lua angewandt: Solange sich die Datei innerhalb von ../lolbob befindet, kannst du a.lua mit include("a.lua") aufrufen. Sobald dies nicht mehr der Fall ist, muss der restliche Pfad mitangegeben werden.
Und noch ein Beispiel: Datei x.lua liegt in ../garrysmod/garrysmod/lua/one/two. In einer Datei direkt in ../one willst du nun x.lua includen. Dazu reicht es dann, wenn du include("two/x.lua") aufrufst, da es auf dem selben Prinzip wie der oben beschriebene Rest basiert.
Thx, sehr informativ, werde es heute mal testen :)
Edit: Hat funktioniert !! Thx! :up: :) :up:
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.