Heal-Script funktioniert nicht/Hilfe und Erklärungen
Hallo Leute,
ich möchte einmal vorweg sagen: Ich kann VB, PHP, MySQL, HTML, CSS und für Gmod ein bisschen E2. Jetzt würde ich noch gerne Lua lernen und mit einem kleinem Script anfangen. Folgendes habe ich zusammengeschrieben:
Code:
function healPlyer(ply, txt, args)
if string.find(txt, "!giveHP") == 1 then
ply:ChatPrint("Du hast jetzt 10000 HP")
ply:SetHealth(10000)
end
end
hook.Add("PlayerSay", "healPlayerHook", healPlayer)
Ich habe zu dem Script jetzt ein paar Fragen, wäre schön wenn ihr mir die beantworten könntet:
1. Bei der function stehen in den Klammern Variablen, sind die festgelegt oder ist das immer so, 1. der Playername, 2. das was er schreibt und 3. alles was sonst noch irgendwie folgt?
2. Gibt es eine Seite wo ich alle Klassen (z.B. SetHealth) finden kann? Die hier im Forum bei den angepinnten Themen geht nicht. Zwar habe ich was im deutschen Wiki gefunden, aber so eine Liste noch nicht.
3. Muss der hook immer am Ende stehen? Wieso?
4. Wo muss ich so ein Script jetzt reinlegen um es im Multiplayer (also über meinen PC als Server mit freunden) benutzen zu können? Den Addon-Ordner oder lua?
Achja und 5. kann mir jemand sagen warum das ganze nicht funktioniert?
Ich wäre euch super dankbar wenn ihr mir helfen könntet :)
Grüße
Spike
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
Ja es ist ein Callback von dem PlayerSay hook (liest den chat aus)
man kann die variablen ply txt und args austauschen, nur die reihenfolge bleibt gleich
in dem fall wird die funktion aufgerufen sobalt einer was in den chat schreibt
ply - ply ist ein entity, und zwar der Spieler der das geschrieben hat
txt - txt ist der Komplette text! args sind nur die wörter (getrennt durch leerzeichen)
-dafuq args irritierte mich, public ist true wenn hauptchat, false wenn teamchat
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
zu 1: Die kannst du nennen wie du willst. Aber es stimmt, dass die erste Variable immer für den betreffenden Player und die zweite für den betroffenen Chattext steht. Die dritte Variable allerdings gibt, in Form eines Booleans, aus, ob der Text ein öffentlicher, oder Teaminterner Chattext ist. Siehe Gamemode.PlayerSay http://wiki.garrysmod.com/favicon.ico
Übrigens: Wenn du z.B. nur die 1. oder 1. und 2. Variable benötigst, kannst du die 2. und 3. bzw. die 3. auch weglassen.
zu 2: Da die offiziele Wiki im Moment "überarbeitet" wird, nutze folgende Ersatzlinks in der Zeit: GMod Wiki Overview, Lua Functions, Lua Hooks
zu 3: Nein, muss er nicht. Es kann auch wie folgt aussehen:(Habe in dem Code string.find, durch das entsprechende Equivalent der string.sub-Funktion ausgetauscht. Selbes Ergebnis, bloß mehr toll.)
zu 4: Du kannst den Script entweder in den "lua/autorun/server" Ordner legen, oder in entsprechendem AddOn-Format, im AddOn-Ordner platzieren.
Zu deinem Problem: Die Funktion, die im Hook aufgerufen werden soll, hat einen anderen Namen als die Funktion die oben tatsächlich steht. (healPlayer != healPlyer)
@[FX]CJ[CSR]:
In dem Hook gibt es aber keine Arguments-Table.
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
Okay, danke für die Antworten. Folgendermaßen habe ich das jetzt umfunktioniert:
Code:
function healPlayer(ply, txt)
commands = string.Explode(" ")
if string.lower(commands[1,string]) == "!givehp" then
if ply:isAdmin then
playerTarget = commands[2,string]
if playerTarget:isConnected then
playerTarget:ChatPrint("Du hast jetzt 10.000 HP!")
playerTarget:SetHealth(10000)
else
ply.ChatPrint("Spieler nicht gefunden!")
end
else
ply:ChatPrint("Du bist kein Admin")
end
end
end
hook.Add("PlayerSay", "healPlayerHook", healPlayer)
Ich werde jetzt testen ob er so funktioniert, habe aber noch eine Frage zum Debuggen: Kann ich das Script im Server reloaden? Sonst muss ich immer eine Map starten, wenn es nicht geht wieder dicht machen, dann wieder starten und das laden dauert immer so lange. Gibt es da eine Möglichkeit?
Achso, nochwas: Wie kann ich verhindern das der Command im Chat für alle zum Lesen steht? Mit return ""?
Vielen dank für die Links! Also gibt mir die 3. Variable nur boolisch zurück welcher Chat benutzt wurde?
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
Zitat:
Zitat von
spike
Okay, danke für die Antworten. Folgendermaßen habe ich das jetzt umfunktioniert:
<code>
Der Code wird nicht funktionieren, sag ich dir jetzt schon.
Ich werde jetzt testen ob er so funktioniert, habe aber noch eine Frage zum Debuggen: Kann ich das Script im Server reloaden? Sonst muss ich immer eine Map starten, wenn es nicht geht wieder dicht machen, dann wieder starten und das laden dauert immer so lange. Gibt es da eine Möglichkeit?
Ja, man kann den script reloaden: lua_openscript <pfad zum script>/datei.lua
Achso, nochwas: Wie kann ich verhindern das der Command im Chat für alle zum Lesen steht? Mit return ""?
Indeed, einfach "return" oder "return nil" an's Ende.
Vielen dank für die Links! Also gibt mir die 3. Variable nur boolisch zurück welcher Chat benutzt wurde?
Genau. Der Bool gibt nur an, welcher Chat benutzt wurde.
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
Okay, du hast recht, er funktioniert nicht. Ich habe nochmal am Code ein bisschen gebastelt, funktionieren tut er aber trozdem nicht. Vielleicht sieht ja jemand meinen Fehler und kann mich berichtigen.
Code:
function healPlayer(ply, txt) // Erstellt eine Funktion mit Spielernamen und Eingabe
split = string.Explode(" ", txt) // Legt für jedes getrennte Wort ein neues Feld an
command = split[1] // Der Inhalt vom 1. Feld
name = split[2] // Der Inhalt vom 2. Feld
if string.upper(command) == "!GIVEHP" then // Wenn der String !GIVEHP lautet
if ply:isAdmin then // Und der Spieler admin ist
if name:isConnected then // Teste ob der andere Spieler online ist
ply:ChatPrint("Du hast einem Spieler 10.000 HP gegeben!") // Dann geb dem Admin eine Nachricht aus
name:ChatPrint("Dir wurden 10.000 HP gegeben!") // Und dem betroffenen Spieler
name:SetHealth(10000) // Setze die HP des Zielspielers auf 10.000
else // Ist das Ziel nicht online
ply:ChatPrint("Spieler nicht gefunden!") // Sage das er nicht online ist
end
else // Ist der Benutzer kein Admin
ply:ChatPrint("Du bist kein Admin!") // Sage das er keiner ist
end
end
end
hook.Add("PlayerSay", "healPlayerHook", healPlayer) // Lege einen Auslöser für die Funktion fest
Kannst du mir sonst nochmal sagen welchen Pfad ich angeben muss? Relativ zu? Oder den kompletten? Ich habe versucht:
Code:
lua_openscript lua/server/autorun/adminhp.lua
lua_openscript garrysmod/lua/server/autorun/adminhp.lua
Ich werde mich dann morgen durch die Basics arbeiten, die anscheind komplizierter sind als ich dachte. Ah, dazu noch eine Frage:
Warum wird "string.find" klein- und "string.Explode" großgeschrieben?
Grüße und gute Nacht
Spike
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
name ist ein string, wie willst du nem string leben geben?
probier folgendes
der abschnitt if isConnnected weglassen
alles darunter (bis chatprint...end)
mit dem austauschen
Code:
for k,v in pairs(player.GetAll()) do
if string.find(string.lower(v:Nick()), name) then
v:ChatPrint("Dir wurden 10.000 HP gegeben!") // Und dem betroffenen Spieler
v:SetHealth(10000) // Setze die HP des Zielspielers auf 10.000
end
end
wenn jemand gamer532 und ein anderer gamer949 heisst, kannst du mit !givehp gamer beiden 10k geben
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
Okay, werde ich probieren - sofern das Script funktioniert. Ich habe mir den Code mal angesehen auf der englischen Wiki, mich stört es da sehr das es immer heisst "Du musst nicht wissen wie das funktioniert, nur wie man es benutzt". Ich habe wohl verstanden das es Key und Value gibt, aber womit werden die beladen? Key der Player und Value die einzelnen Informationen?
Ich habe jetzt das Problem, dass mein Gmod das Script nicht mehr startet. Wenn ich es mit "lua_run" versuche kommt das:
Code:
] lua_run adminheal.lua
> adminheal.lua...
[lua_run:1] '=' expected near '<eof>'
Und bei der richtigen Ausführung mit "lua_openscript" das:
Code:
] lua_openscript adminheal.lua
Running script adminheal.lua...
Couldn't include file 'adminheal.lua' (File not found) (<nowhere>)
Auch wenn ich statt "adminheal.lua" "autorun" lädt das Script nicht - jedenfalls gibt es keine Reaktionen auf meine Eingaben im Chat.
Code:
] lua_openscript autorun
Running script autorun...
LuaGetfile: Not Loading autorun
Couldn't include file 'autorun' (File not found) (<nowhere>)
Jetzt habe ich gerade am Anfang der Funktion folgendes hinzugefügt:
Code:
Msg("Das Script läuft.")
[...CODE...]
hook.Add("PlayerSay", "healPlayerHook", healPlayer)
Eigentlich sollte - sofern das Script läuft - in der Konsole die Nachricht "Das Script läuft." auftauchen wenn jemand was schreibt. Tut es aber nicht - sehe aber gerade das es ja keine Sonderzeichen geben darf, probiere es gleich nochmal. Was hab ich da jetzt verbockt?
Achso, danke das ihr mir helft. Ich hab mir den Einstieg in Lua so einfach wie in E2 vorgestellt. Damit lag ich wohl daneben.
Grüße
Spike
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
wo liegt das script denn?
im autorun dann:
lua_openscript autorun/adminheal.lua
immer vollen pfad ab lua ordner angeben, du kannst keine ordner ausführen nur dateien
Lua ist eine klasse für sich. E2 ist so einfach, weil viele funktionen bekannt sind die in lua etwas verstecker sind
wie zb. sin(x) heisst in Lua math.sin(x) - es macht den Script übersichtlicher mit funktionen aus librarys zu arbeiten
aber nicht einfacher
Andererseits kann man in E2 nicht soviel machen, wie in lua (da der Lua code, der E2 es ermöglicht sachen zu tun eigene begrenzungen hat (wie zb. kein setPos auf fremde sachen)
Zumindest (finde ich) sind Lua und E2 die "übersichtlichsten" & einfachsten Scriptsprachen die ich kenne.. bin an vielen weiteren gescheitert
(lag aber meisten daran, dass man die Funktionsnamen nicht kannte aber die Syntax beherrschte)
E2 ist auch deswegen so einfach, weil die motivation da ist - mit anderen zu Scripten (was in np++ oder VC studio nicht geht :)
AW: Heal-Script funktioniert nicht/Hilfe und Erklärungen
Ich fand bisher PHP am einfachsten, bin aber trozdem daran Lua zu lernen. Es gibt ja so viele Möglichkeiten, bei denen man Lua anwenden kann.
Ich habe was rausgefunden: Ich habe immer als Pfad den Dateinamen angegeben und dann rumexperimentiert. Als ich dann auf einer Seite auf den Hinweis gestoßen bin, dass "lua" der Ausgangsordner ist, konnte ich das Script starten. Warum es aber nicht von selbst laufen will weiss ich nicht. Folgendes kommt beim manuellen Start:
Zitat:
Running script autorun/server/adminheal.lua...
Hook 'healPlayerHook' Failed: [lua\autorun\server\adminheal.lua:8] attempt to call method 'isAdmin' (a nil value)
Spike: !givehp Spike
So sieht die Ecke des Codes aus:
Code:
if ply:isAdmin() then // Und der Spieler admin ist
for k,v in pairs(player.GetAll()) do
if string.find(string.lower(v:Nick()), name) then
v:ChatPrint("Dir wurden 10.000 HP gegeben!") // Und dem betroffenen Spieler
v:SetHealth(10000) // Setze die HP des Zielspielers auf 10.000
else
ply:ChatPrint("Kein Spieler gefunden!")
end
end
else // Ist der Benutzer kein Admin
ply:ChatPrint("Du bist kein Admin!") // Sage das er keiner ist
end
Warum gibt mir "isAdmin" nichts zurück? Hab ich die Funktion falsch eingesetzt? Ahja, das Script liegt in "Pfad zum Steamaccount\garrysmod\garrysmod\lua\autorun\serve r\adminheal.lua"
Ich find die Syntax von Lua bisher komisch, kann mich aber daran gewöhnen ;)
Grüße
Spike