Sie sind nicht angemeldet.

Chrisber

Administrator

  • »Chrisber« ist der Autor dieses Themas

Beiträge: 1 030

Wohnort: localhost

Rootserver vorhanden: Ja

  • Nachricht senden

1

Montag, 11. Februar 2008, 14:17

EventScripts Coding Tutorial #1

EventScripts Coding Tutorial #1
---------------------------------------
Themenbereiche:
  • Download & Installation
  • Was ist möglich? Wie funktioniert es?
  • Wo fange ich an?
  • Aufbau einer Datei
  • Variablen & If
  • Aufbau von Funktionen
  • Aufbau von Kommandos
  • Aufbau von Events
  • Mein erstes Script:
    • Grundaufbau
    • Hallo Welt!
    • Willkommensnachricht

  • Programmieraufgabe

---------------------------------------
Download & Installation
Du kannst dir auf der Seite von Mattie die neueste Version von EventScripts herunterladen.
Dieses Tutorial basiert auf EventScripts 2.0, d.H. du brauchst dieses Link: http://mattie.net/downloads/mattie_event…200beta247a.zip (Version 2.0.247a).
Nun entpackst du die Dateien in einen beliebigen Ordner und lädst ihn dann mit einem FTP Programm auf deinen Server in das Verzeichnis cstrike/.
Ab sofort ist EventScripts nach einem Server neustart verfügbar und kann für alle Scripte genutzt werden.



Was ist möglich? Wie funktioniert es?
Vieles, aber längst nicht alles. Man darf EventScripts auf keinem Fall mit einer Source Modifikation verwechseln! Eine eigene Source Modifikation hat eigene Standards und kann komplett in das Spielverhalten eingreifen. Bei EventScripts läuft das anders. EventScripts greift nicht in das Spiel ein, sondern in den Server, und das ist der Punkt. Es ist z.B. nicht möglich, einen Spieler mittels EventScripts dazu zu zwingen, seine Grafikeinstellungen oder ähnliches zu ändern. Das einzige, was noch möglich ist, auf Clientseite, zeigt folgende Liste:
  • Namen ändern
  • Einen Text in der Console ausgeben
  • Die Waffe zu wechseln, sie wegzuwerfen, sie zu entfernen
  • Einen Sound abspielen
  • Ihn zu einem anderen Server, nach Abfrage eines Fensters, zu verbinden
  • andere, unwichtige Sachen, die man für den normalen Gebrauch nicht benötigt
Jedoch liegt dies nicht an EventScripts, sondern an VALVe!
EventScripts 2.0 arbeitet mit 2 Sprachen:
  • Python 2.5
  • EventScrips Shell

Dieses Tutorial beschreibt die neuer, bessere & schnellere Variante, Python 2.5.
Da EventScripts vollen Python Support unterstützt, ist es möglich, die ganz normale Python Dokumentation zu benutzen.



Wo fange ich an?
Um ein neues Script zu erstellen, sind mindestens 2 Sachen von Nöten:
  • Ein Ordner im addons/eventscripts/ Ordner, der wie das Script heißt
  • Eine .py (Python) Datei, die in diesem genanntem Ordner vohanden sein muss

Das war es auch schon. Damit ist es aber noch lange nicht getan, denn dir fehlt ja schließlich noch der Inhalt und das Laden des Scriptes.
Das Laden und Entladen eines Scriptes kann automatisch sowie aus der Console erfolgen:
  • automatisch:
    • füge zu deiner cfg/autoexec.cfg (falls diese noch nicht besteht, solltest du diese erstellen, da das laden aus der cfg/server.cfg absolut nicht empfohlen ist!) folgendes hinzu
    • Quellcode

      1
      
      es_load <Scriptname>

  • Console
    • Im Spiel einfach folgendes als Console (HLSW, RCON) ausführen
    • Quellcode

      1
      
      es_load <Scriptname>




Aufbau einer Datei
Eine Datei muss mindestens folgende Informationen enthalten, um lauffähig sein:

Quellcode

1
import es

Die import Funktion erlaubt es uns, alle Befehle von importierten Modulen zu benutzen. Damit das Script schließlich auf Events reagiert und EventScripts Funktionen benutzen kann, ist dieser Code absolut notwendig.
Python ist keine normale Codingsprache, jedenfalls nicht eine, die man als normal bezeichnen würde.
Die allermeisten Codesprachen arbeiten mit {, } und ; - Python allerdings arbeitet lediglich mit Einrückungen. Dazu zählen Leerzeichen und Tabs
  • C++
    • Quellcode

      1
      2
      3
      
      if ($test == 1) {
      print("test");
      }

  • Python
    • Quellcode

      1
      2
      
      if test == 1:
      	print "test"

Auf dauer ist Python also kürzer als jede andere Codesprache, da vieles einfach weggelassen werden kann.
Wie man sieht, ist es beim C++ Code völlig egal, wieviele Leerzeichen vor print stehen - bei Python werden diese aber benötigt. Ich benutze schon immer Tabs, und empfehle dies auch, da es einfacher ist, mit diesen zu arbeiten!
Für jede Ebene wird bei Python eine neue Einrückung benötigt.

Quellcode

1
2
3
4
5
6
7
8
9
if test == 1:
	print "test"
	if test2 == 5:
		print "test2"
		if test3 == 10:
			# Wird nur geschrieben, wenn test3 == 19, es in Ebene 3 eingerückt ist
			print "test3"
		# Hat keine Einrückung in Ebene 3, das heißt, es ist davon nicht betroffen
		print "test2"

Das ist ein deutliches Beispiel. Wie man sieht, kann man mit eine # ein Kommentar machen - alles was hinter einem # steht, wird nicht beachtet!
Wichtig ist, dass wenn du einmal in einer Datei z.B. ein Tab zur Einrückung benutzt hast, musst du dies auch beibehalten - ansonsten gibt es Fehler. Das heißt, du kannst beliebig viele Leerzeichen hintereinander machen, wenn du dies auch ein hältst, wenn du jedoch nur eines weglässt, funktioniert das ganze Script nicht mehr!



Variablen & If
Mit Variablen in Python zu arbeiten funktioniert genau wie in jeder anderen Codesprache.
Es wird grundsätzlich zwischen 3 Arten von Variablearten unterschieden:
  • als Integer int (Ganzzahl), z.B. 3 oder 5
  • als Float float (Fließkommazahl), z.B. 3.2241 oder 0.1
  • als String str (Text), z.B. "Hallo" oder "3"
    • Es wird bei "3" (String) und 3 (Ganzzahl) unterschieden. Somit wäre folgende If Abfrage nicht gültig
    • Quellcode

      1
      2
      3
      4
      5
      
      test = 3
      if test == "3":
      	# Wird nicht ausgeführt
      if test == 3:
      	# Wird ausgeführt

Variablen kann man einfach mitten in den Code schreiben. Sofern sie noch nicht vorhanden sind, werden sie automatisch erstellen, andernfalls überschrieben.

Mit If Abfragen kann man alles mögliche vergleichen. Dies ist die einfachste If Abfrage, die möglich ist:

Quellcode

1
2
if 0 == 0:
	# Wird ausgeführt

Natürlich kann man alles durch Variablen ersetzen, folgendes ist das gleiche wie hier drüber:

Quellcode

1
2
3
4
test = 0
test2 = 0
if test == test2:
	# Wird ausgeführt

Natürlich gibt es in Python auch ein ElseIf und ein Else. Ein ElseIf wird ausgeführt, wenn die darüberliegende If Abfrage scheiterte:

Quellcode

1
2
3
4
5
6
7
8
9
test = 0
if test == 1:
	# Falsch, springe zur nächsten ElseIf
elif test == 2:
	# Ebenfalls falsch, also wieder die nächste
elif test == 0:
	# Diesmal ist es richtig
elif test == 3:
	# Zu dieser Abfrage kommt es gar nicht mehr, da die darüberliegende schon erfolgreich war

Der Code von oben würde sich von diesem Unterscheiden:

Quellcode

1
2
3
4
5
6
7
8
9
test = 0
if test == 1:
	# Falsch, breche ab
if test == 2:
	# Ebenfalls falsch, breche ab
if test == 0:
	# Diesmal ist es richtig
if test == 3:
	# Diese Abfrage wird trotzdem geprüft, da es kein ElseIf ist

Doch was ist, wenn der Fall eintrifft, das keine If Abfrage erfolgreich ist? Dann wird Else gebraucht. Benutzt man kein Else, wird die Abfrage abgebrochen, der weitere Code wird einfach ausgeführt. Hier ein Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
test = 0
if test == 1:
	# Falsch, breche ab
else:
	# Dies würde bei dieser Abfrage immer zutreffen

if test == 1:
	# Falsch, springe zum nächsten ElseIf
elif test == 2:
	# Falsch, springe zum Else
else:
	# Wird ausgeführt




Aufbau von Funktionen
Ohne Funktionen würde ein Script unübersichtlich, langsam und zudem wahrscheinlich nicht funktionstüchtig sein.
Eine Funktion beginnt immer mit einem def <Funktionsname>():. Eine Funktion kann verschiedene Parameter haben. Ein Beispiel:

Quellcode

1
2
def test():
	print "Dies ist ein kleiner Test. Parameter: keine"

Hier hingegen kann man einen eigenen Parameter angeben, der geschrieben wird:

Quellcode

1
2
def test(param):
	print "Dies ist ein kleiner Test. Parameter: %s" % param

Gleichzeitig wirst du dich Fragen, was dieses %s" % param bedeutet. Ganz einfach: das %s steht übersetzt für Platzhalter:String. Damit der Platzhalter vom Typ String nun weiß, was er einfügen muss, wird hinter die entsprechende Funktion ein % mit der entsprechenden Variable eingefügt werden. %i steht für ein Integer und %f für einen Float.
Hier noch ein Beispiel, wie man mehre Parameter übergibt:

Quellcode

1
2
def test(param1, param2, param3):
	print "Parameter 1 (String): %s. Parameter 2 (Integer): %i. Parameter 3 (Float): %f" % (param1, param2, param3)

Um eine Funktion aufzurufen, muss einfach folgendes eingefügt werden:

Quellcode

1
test("Test", 38, 782.22)
Mehr ist nicht nötig!
Würde man anstelle von 38 z.B. 29.1 hinschreiben, würde ein Fehler entstehen und das Script wird abgebrochen, da der 2. Parameter nun mal kein Float ist!



Aufbau von Kommandos
Funktionen sind grundsätzlich wie folgt aufgebaut:

Quellcode

1
<Module>.<Funktion>([Parameter1], [...])

Da wir wissen, dass wir jedesmal

Quellcode

1
import es
in eine Datei schreiben müssen, müsste dir klar sein, dass so eine Funktion von EventScripts aufgebaut ist:

Quellcode

1
es.<Funktion>([Parameter1], [...])

Nun gibt es verschiedene Funktionen vom EventScripts Modul, wozu unter vielen anderen auch es.msg, es.tell, es.set, es.getplayername, es.getplayersteamid und es.getuserid gehören. Diese Funktionen sind praktisch selbsterklärend, denn ohne ein bisschen Englisch kommt man hier nicht weit.



Aufbau von Events
Ja, nach langer Einführung kommen wir endlich zum Namensgebenden Punkt: den Events.
Man kann sich Events wie beim Fussballspiel vorstellen:

Quellcode

1
2
3
4
Spieler scheißt Tor
  > Techniker drückt Knopf, dass ein Event abschickt
    > Event wird abgefangen
      > Code in Event wird ausgeführt (z.B. Punktezähler auf der Anzeigetafel geändert)

Im Grunde sind Events nichts anderes als Funktionen, die einen bestimmten Namen haben und nur 1 Parameter unterstützen. Hier ein Beispiel:

Quellcode

1
2
def player_spawn(event_var):
	es.msg("Spieler %s wurde gespawnt!" % event_var["es_username"])
Wer diesen Code vom Grundsatz nicht versteht, sollte sich die Sektion Aufbau von Funktionen noch einmal anschauen!
Auch diese Funktion sollte selbsterklärend sein. Sobald ein Spieler gespawnt wird, wird das Event abgefeuert und in dieser Funktion abgefangen. In der event_var Variable, welche eigentlich ein Dictionary dict (Liste von gespeicherten Daten) ist, kann man alle Event Variablen abrufen, die es zu einem jeweiligem Event gibt. Hier ist z.B. eine Liste von Event Variablen, welche im Event player_spawn verfügbar sind:

Quellcode

1
2
3
4
5
6
7
8
userid
es_username
es_steamid
es_userteam
es_userhealth
es_userarmor
es_userdeaths
es_userkills

So kann man einfach, wie mit Variablen, darauf zugreifen, in dem man event_var["<VarName>"] abruft. Auch in Dictionarys wird zwischen int, float und str unterschieden!
Zu den wichtigsten Events gehören load, unload, player_connect, player_activate, player_spawn, player_say, player_death, round_start, round_end, es_map_start und es_player_validated.
Wichtig: Die Events load und unload habe keine Event Variablen, also auch keine Parameter!



Mein erstes Script
Grundaufbau
  • Wir benutzen einfach den minimalen Muss
  • Quellcode

    1
    
    import es

Hallo Welt!
  • Nun wollen wir Hallo Welt! beim laden des Scriptes ausgeben. Also benutzen wir das Event load
  • Quellcode

    1
    2
    3
    4
    
    import es
    
    def load():
    	es.msg("Hallo Welt!")

Willkommensnachricht
  • Nun wollen wir für jeden Spieler der auf den Server kommt eine Willkommensnachricht ausgeben. Welches Event könnte man benutzen? player_connect? Man könnte es denken, doch es ist für diesen Zweck ungeeignet, da dieses Event keine Informationen zum Spieler hat, d.H. man kann den Namen, die SteamID usw. nicht per Event Vars abfragen. Zudem wird dieses Event sofort nach dem Connect ausgeführt, d.H. es ist nicht sicher, dass der Spieler auch wirklich auf den Server kommt (z.B. durch Abbrechen, oder Fehler). Für diesen Fall ist player_activate geeignet. Dieses Event beinhaltet alle benötigten Informationen zum Spieler. Es wird ausgeführt, kurz bevor die Message of the Day (Willkommensfenster) angezeigt wird.
  • Quellcode

    1
    2
    3
    4
    5
    6
    7
    
    import es
    
    def load():
    	es.msg("Hallo Welt!")
    
    def player_activate(event_var):
    	es.msg("#multi", "#lightgreen%s#green ist nun Online" % event_var["es_username"])

  • Huch? Was sind das für komische Optionen in der Funktion es.msg? Ganz einfach
  • Man kann einer Nachricht (es.msg und es.tell) Farben hinzufügen. Diese 3 Farben sind verfügbar:
    • #default
    • #green
    • #lightgreen

  • Die Farben werden solange beibehalten, bis ein anderes Farbkommando kommt
  • Solange man nur 1mal eine Farbe in der Funktion definiert, ist der 1. Parameter "#multi", nicht nötig.
  • Sobald man mehrere Farbkommandos nutzt, ist dieser Befehl nötig, ansonsten wird der Text falsch ausgegeben!




Programmieraufgabe
Code ein kleines Script, welches bei jedem Disconnect eines Spielers eine Nachricht und Nachricht in der Mitte ausgibt. Woher man die benötigten Informationen bekommt? Aus der Wiki! Die Wiki ist noch für ESShell, also denkt nach und versucht, das Kommando in Python zu "konvertieren". Die Wiki findet sich unter http://www.eventscripts.com/pages/Category:Commands">http://www.eventscripts.com/pages/Category:Commands</a>
Die benötigten Kommandos lauten: es.msg und es.centermsg

Lösung

Spoiler Spoiler

Quellcode

1
2
3
4
5
import es

def player_disconnect(event_var):
	es.msg("#multi", "#lightgreen%s#green hat den Server verlassen" % event_var["es_username"])
	es.centermsg("%s hat den Server verlassen" % event_var["es_username"])




Bitte gebt mir Feedback hier im Forum!
Dieses Tutorial ist ausschließlich für SourceServer.info und Mapping-Tutorials.de geschrieben. Verlinkung auf dieses Thema ist erlaubt, jedoch nicht das kopieren dieses Textes.

So long, Chris
Und das letzte, was gesagt wird, wenn die Welt untergeht, ist: das ist technisch unmöglich.

hEiNz

Profi

Beiträge: 705

Wohnort: Deutschland

Beruf: Freischaffender Künstler

Rootserver vorhanden: Nein

  • Nachricht senden

2

Montag, 11. Februar 2008, 20:00

Re: EventScripts Coding Tutorial #1

hehe dickes fettes Naaaaaaaaaaaaaaaaaaaiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisssssssssssssssssss

schönes ding danke dir bestteam kiss4

3

Freitag, 30. Oktober 2009, 15:08

Re: EventScripts Coding Tutorial #1

Hey,
echt ein super Tutorial, gut aufgebaut und sehr verständlich geschrieben!
Werde das ganze gleich mal ausprobieren.
Vielen Dank : )

Gruß TheE