PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : E2 von Clarity



Clarity
29.12.2009, 15:28
Hallo liebe Expression Fans!

ich bin selbst noch anfänger auf dem Gebiet. Habe lediglich Java und
ein wenig C/C++ Kentnisse und versuche mich nun in E2 einzuarbeiten.

Für alle interessierten, werde ich meine gut dokumentierten E2s hier rein stellen,
Fragen und Verbesserungsvorschläge sind immer willkommen. Ich hoffe ich bleibe ein
wenig dabei und das hier ist nicht meine letzte E2 die ich hier veröffentliche.

Leider gibt es hier im Forum (noch) kein E2 Syntax Highlighting,
daher ist der Text am einfachsten zu lesen, wenn ihr ihn euch in gmod kopiert.



Mein erstes E2, das ich hier veröffentliche gibt den Namen des dem E2 am nächsten
stehenden Spielers und seinen Ping aus. Also alles noch sehr einfach.

http://666kb.com/i/bfdfp6u7kio30cg48.jpg


@name NearestPlayerPing
# Einfach nur der Name des Entitys, ist beliebig
@inputs
# Wir haben keine Wire Eingaben
@outputs Text:string
# Unser Ausgabewert Text vom Datentyp String
@persist Player:entity Ping Name:string
# Sonstige Variablen, die wir zwar verwenden, aber weder ein noch
# ausgegeben werden. Player ist hier vom Datentyp Entity und
# Ping ist eine normale Zahl (Number). Dieser Datentyp muss in der
# deklaration als Einziger nicht Explizit angegeben werden
@trigger

runOnTick(1)

findByClass("player")
# sorgt dafuer, dass nur nach Spielern gesucht wird
Player = findClosest(entity():pos())
# entity():pos() ist ein Vektor mit den Koordinaten des E2
# findClostest() sucht nun nach dem, dem E2 am naechsten, Entity
# das zustzlich, wie vorhin definiert ein player sein muss
Name = Player:name()
# Gibt einfach den namen als String zurueck
Ping = Player:ping()
# gibt den Ping als normale Zahl zurueck
Text = "Name:\n" + Name + "\nPing:\n" + Ping
# Bei einer String Zuweisung koennen diese wie in Java einfach mit
# einem + aneinander geaengt werden. Aus Zahlen (hier zB Ping)
# wird dabei automatisch ein String generiert
# \n steht fuer einen zeilenumbruch

# by Clarity


Dieses E2 färbt alle Entities im Umkreis von 10m ein. Die Farbe wechselt dabei stetig.

http://666kb.com/i/bfdh7he5uc1a1q8wo.jpg


@name RainbowEntities
# Einfach nur der Name des Entitys, ist beliebig
@inputs
@outputs Anzahl
# Die Anzahl der Entities die sich aktuell im Radius befinden
@persist I X Y Z Color:vector Player:entity
@trigger

runOnTick(1)

if (X < 255) {
X++
}
elseif (Y < 255) {
Y++
}
elseif (Z < 255) {
Z++
}
else {
X = Y = Z = 0
}
# Die Verzweigungen hier bewirken den langsamen Farbwechsel der Entities
# Zuerst wird Rot, dann Gruen, dann Blau langsam erhoeht
# Sind alle Werte bei 255, werden alle wieder auf 0 zurueckgesetzt

Color = vec(X,Y,Z)
# Dieser Vektor ist die aktuelle Farbe

Anzahl = findInSphere(entity():pos(),400)
# Die Anzahl der Entities, die sich in der Sphere (400Inch = 10m)
# um das E2 herum befinden

for (I = 0, Anzahl) {
# Eine einfache for-Schleife von 0 bis zu der Anzahl der Entities
Player = findResult(I)
# Hier wird Player immer das I-te Entity zugewiesen
# Auf diese Weise wird jedes Entity in der Sphere einmal angesprochen
Player:setColor(Color)
# Setzt die Farbe des Entities auf den Aktuellen Farbwert
# Alternativ wre auch Player:setColor(X,Y,Z) moeglich
}

# by Clarity


Dieses E2 wird durch den Besitzer per Chat gesteuert. Bei force zieht das E2 alle Entitys (außer Player und NPCs) im Umkreis von 20m an. Bei explode wird der Ausgang Fire dann auf 1 gesetzt. Verbindet man damit ein Explosive wie ich in meinem Beispiel, dann werden die angezogenen Objekte zerstört.

Ein relativ unspektakuläres Bild:
http://666kb.com/i/bfdtlbhha4txu9sb5.jpg

http://www.wegame.com/watch/forceexplode/


@name ForceExplode
# Einfach nur der Name des Entitys, ist beliebig
@inputs
@outputs Fire
# Muss mit dem Explosive verknpft werden
@persist Anzahl Entity:entity Exploded
@trigger

runOnTick(1)

if (owner():lastSaid() == "force") {
Anzahl = findInSphere(entity():pos(),800)
# Die Anzahl der Entities, die sich in der Sphere (800Inch = 20m)
# um das E2 herum befinden

for (I = 0, Anzahl) {
# Eine einfache for-Schleife von 0 bis zu der Anzahl der Entities
Entity = findResult(I)
Entity:applyForce((entity():pos() - Entity:pos())*Entity:mass())
}
Fire = Exploded = 0
}
elseif (owner():lastSaid() == "explode" & Exploded == 0) {
Fire = Exploded = 1
# Exploded wird auf 1 gesetzt, dass Fire nur einmalig auf 1
# ist und nicht andauernd
}

# by Clarity


Bitte verzeiht mir, falls mal ein Umlaut fehlt, da man in E2 einfach kein ä, ö und ü schreiben kann
muss ich immer ae, oe oder ue schreiben, manchmal vergess ich das.

gamerpaddy
29.12.2009, 18:36
find extensions gleich am anfang Oo ich habe lange gebraucht bis ich es gerfft habe

gute arbeit
und sehr hilfreich das mit dem findClosest habe ich nedmal gewusst was des ist

dominic
30.12.2009, 20:18
Du hast genau das umgesetzt, was du bei mir als Post hinterlassen hast, für einen "Neuling" sind die Chips echt nicht schlecht! Würde mich freuen wenn du weiter machen würdest ;)

Clarity
30.12.2009, 20:27
Ja, ich hoffe, dass die Kommentare ausreichend sind.

Ich habe es so kommentiert, dass es für jemanden der die Grundlagen von Programmiersprachen kennt,
gut verständlich sein sollte. Ich arbeite gerade an meiner vierten E2, aber die ist schwieriger als ich anfangs dachte...
Doppelpost:
Hier mal ein kleiner vorgeschmack auf mein nächstes E2:

http://www.wegame.com/watch/auto-sawblade-v1/

Es wird über den Chat gesteuert:
Mit "sawblade follow" schwebt es immer dem Besitzer überm Kopf.
Mit "sawblade attack" verlässt es zuerst die follow position und greift dann,
falls vorhanden, NPCs an. Gibt es keine NPCs, wartet es einfach auf neue.
Schreibt man irgendwas anderes im Chat, dann wartet es einfach an der aktuellen stelle.

Es sind jetzt allerdings schon fast 100 Zeilen Code (mit Kommentaren),
es kam aber auch noch einiges dazu, weil das Sägeblatt mich oft selbst umgebracht hat, wenn es mir folgen sollte ;)
Ich hoffe, dass es nicht zu komplex ist um den Code zu verstehen.

Was noch kommt:
1. Ich will die Formel für den Angriff noch anpassen.
Es trifft zwar immer, aber es fliegt noch nicht so richtig schön und zudem zerteilt es die Zombies meist nicht :-?
2. Was mir sonst noch so einfällt :gmod: