|
 |
[TUT] ALICE Scripts mit LUA |
Erdgnome
Auftraggeber
  

Dabei seit: 18.11.2008
Old nickname here: DMA TAKE 2
 |
|
| [TUT] ALICE Scripts mit LUA |
 |
Tutorial für GTAIV Scripting (ALICE)
Dies ist ein Tutorial für das Scripten für GTAIV mit Lua.
Als erstes benötigt ihr Alice welches ihr hier (http://www.gtaforums.com/index.php?showtopic=386816) bekommt.
Downloaded es euch und installiert es nach der ReadMe in euren GTAIV Ordner.
grundlagen für ein Script
Vorher aber erzähl ich euch die Grundlagen.
Mit -- erstellt ihr einen Kommentar, alles hinter dem Kommentar wird nicht mehr gewertet und fällt weg.
Beispiel:
| code: |
1:
|
irgendwas hier bla -- Das hier wird ignoriert! |
|
Desweiteren gibt es Variablen.
Man kann ihnen einen festen Bereich zuordnen mit local und global für Tables. (Später mehr dazu)
Normalerweise erstellt man sie aber einfach so im Script
| code: |
1:
|
myvar = 2 -- myvar ist nun 2 |
|
Tables sind eine Art Farm welche unendlich groß ist.
Man erstellt sie durch local mytable = {}
Man kann ihnen schon bei dem erstellen Werte geben, z.b.:
| code: |
1:
|
local mytable = { geld = 1000, leben = 99 } |
|
Nun hat mytable 2 table's mit je einem Name und einem Wert.
Aufrufen könnt ihr dies so:
Bedingungen und Schleifen:
If
Mit einer If schleife könnt ihr überprüfen ob ein Wert stimmt.
Hier ein kleines Beispiel:
| code: |
1:
2:
3:
4:
|
myvar = 3 -- myvar hat den wert 3
if myvar == 3 then -- wenn myvar gleich 3 ist dann
tu_etwas
end |
|
Als vergleichs Operatoren gibt es:
| code: |
1:
2:
3:
4:
5:
6:
|
== gleich
~= ungleich
< kleiner als
> größer als
<= kleiner als oder gleich
>= größer als oder gleich |
|
Außerdem gibt es noch logische Verknüpfungen:
| code: |
1:
2:
3:
|
and und
or oder
not nicht |
|
Beispiel:
| code: |
1:
2:
3:
|
local mytable = { geld = 30, leben = 99 }
if mytable.geld == 30 and mytable.leben == 99 then -- Wenn mytable.geld gleich 30 ist und mytable.leben gleich 99
end |
|
Also können wir uns If immer so vorstellen:
| code: |
1:
2:
3:
|
if anweisung then
etwas tun
end |
|
For
For zählt von einem bestimmten wert rauf oder herab und führt ihn so oft aus.
For können wir uns so vorstellen:
| code: |
1:
2:
|
for variable = start_wert, end_wert, zählschritt do
end |
|
Ein beispiel:
| code: |
1:
2:
3:
|
for i = 1, 10, 1 do
print i
end |
|
Das würde nun
1
2
3
4
5
..
Ausgeben.
So verarbeitet das der Computer:
| code: |
1:
2:
3:
4:
5:
6:
|
startwert ist 1
beenden bei 10
i + 0 = 1
i + 1 = 2
i + 1 = 3
i + 1 = 4 |
|
Erzählt also immer 1 hinzu, zu dem vorherigen Wert.
While
While funktioniert so ähnlich wie if, wenn der Wert wahr ist (z.b. i = 0 while(i ~= 0) do i = i + 1 end)
wird der Quellcode ausgeführt.
Dabei verändert sich evt. der Wert und die Bedingung wird unwahr.
Wir stellen uns while also so vor:
| code: |
1:
2:
3:
|
while bedingung do
etwas tun
end |
|
While wird ins deutsche als "während" übersetzt, vllt. wird dadurch die Funktion deutlicher.
Funktionen
Eine Funktion beinhaltet einen Code welcher aber erst ausgeführt wird wenn die Funktion aufgerufen wird.
Ein Beispiel:
| code: |
1:
2:
3:
4:
|
function testfunction()
print("Hallo Welt") -- Dies wird nicht ausgeführt.
end
testfunction() -- nun wird erst Hallo Welt ausgegeben |
|
Funktionen können aber auch Parameter enthalten wie hier:
| code: |
1:
2:
3:
4:
5:
|
function hallo(der_rest)
print("Hallo ")
print(der_rest) -- der_rest ist ein parameter
end
hallo("Welt") -- der_rest = "Welt" , also unser Parameter |
|
Unser erstes Script
So da ihr nun wisst wie Lua funktioniert können wir ja unser erstes GTAIV Script schreiben.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
|
-- Example Alexander Blade (some elements)
PLAYER_ID, PLAYER_INDEX, PLAYER_CHAR -- Globale Variablen
local playerPosition = { X = 0, Y = 0, Z = 0} -- Unser Table
function InitScript()
Wait(10000)
end
function WaitForPlayerPoolCreation()
while (IsPlayerPoolCreated() == 0) do
Wait(2000)
end
end
function WaitForValidPlayer()
PLAYER_CHAR = 0
repeat
CallNative("GET_PLAYER_ID")
PLAYER_ID = GetIntResult()
if (PLAYER_ID >= 0) then
PushInt(PLAYER_ID)
CallNative("CONVERT_INT_TO_PLAYERINDEX")
PLAYER_INDEX = GetIntResult()
PushInt(PLAYER_INDEX)
PushVarPtr()
CallNative("GET_PLAYER_CHAR")
PLAYER_CHAR = GetIntParam(1)
if (PLAYER_CHAR <= 0) then
Wait(1000)
end
end
until (PLAYER_CHAR > 0)
end
function GetPlayerCoords()
PushInt(PLAYER_CHAR)
PushVarPtr()
PushVarPtr()
PushVarPtr()
CallNative("GET_CHAR_COORDINATES")
playerPosition.X = GetFloatParam(1)
playerPosition.Y = GetFloatParam(2)
playerPosition.Z = GetFloatParam(3)
end
function SaveCoordsToLog()
PrintFloatToLog(playerPosition.X)
PrintFloatToLog(playerPosition.Y)
PrintFloatToLog(playerPosition.Z)
end
function main()
InitScript()
while true do
WaitForPlayerPoolCreation()
WaitForValidPlayer()
GetPlayerCoords()
SaveCoordsToLog()
Wait(2000)
end
Wait(300)
end
-- start
main(); |
|
Speichert dies nun im GTAIV\Alice ordner.
Analyse:
Wir haben 3 Globale Variablen 1 Table.
Unsere erste erstellte Funktion lautet InitScript().
In ihr steht nicht viel.
Mit Wait(Millisekunden) haltet ihr das Script für diese Millisekunden zahl an. (Hier 10000 = 10 sec)
Unsere nächste Funktion ist da schon Interessanter.
Die While läuft solange wie kein Spieler erstellt wurde.
Nun schauen wir uns WaitForValidPlayer an, diese sieht etwas kompilizierter aus, ist aber im Prinziep einfach.
Als erstes wird PLAYER_CHAR auf 0 gesetzt.
repeat ist nichts anderes als While nur das erst der inhalt ausgeführt wird und dann geprüft.
Mit CallNative ruft ihr eine Native Funktion auf.
Hier "CONVERT_INT_TO_PLAYERINDEX".
| code: |
1:
|
PLAYER_ID = GetIntResult() |
|
Hier wird die Spielerid auf den Wert gesetzt den CONVERT_INT_TO_PLAYERINDEX zurück gibt.
Den Wert holen wir uns über GetIntResult()
Nun prüfen wir ob die Spielerid größer oder gleich 0 ist (und nicht z.B. -1).
Mit PushInt(WERT) legen wir Wert auf den Stack, welche sich die Funktion (CallNative) als Parameter braucht
Mit GetFloatParam(WERT) bekommt ihr den Wert von der Funktion zurück (WERT ist dabei die Rückgabe position).
Die Native Funktion GET_CHAR_COORDINATES hat z.B. 3 Rückgabewerte 1 ist der erste, 2 der zweite ...
PrintFloatToLog(WERT) speichert in die Logdatei von Alice WERT (Muss eine Kommazahl sein, ansonsten Float durch
Int oder String ersetzten! Beispiel: PrintIntToLog(WERT))
Wichtig ist bei main() das diese Funktion sich nie schließt.
Das macht ihr mit while true (zu deutsch:
Diese While bricht nie ab da sie ja immer Wahr ist.
Zu guter letzt ruft ihr main() in eurem Script auf.
Schon habt ihr euren ersten Positionsspeicherer geschrieben ;x
__________________

|
|
24.12.2008 11:14 |
|
|
ZAZ
Informant
Dabei seit: 08.04.2006
 |
|
| RE: [TUT] ALICE Scripts mit LUA |
 |
Na sowas, nun ist ja Alice schon älter als unser Jahr 2009 und hat auch schon richtige Wellen geschlagen.
Aber trotzdem bin Ich der erste, der hier seinen Senf abgibt.
Das Script oben stürtzt bei mir ab, liegt vielleicht an der Alice version, momentan 0.3.2 für GTA4-3.Patch.
Aber den code PrintFloatToLog kann ich gut gebrauchen.
Ich hab ja schon viel probiert, um die Werte meiner Variablen anzuzeigen, aber alles erfolglos.
Mit PRINTINT oder PRINTFLOAT stürtzts ab oder geht gar nix.
Immerhin funktioniert folgender code sehr schön:
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING","Hollo User",3000,1)
Achja, netter Tut
, vielleicht kannst Du ja noch ein Script posten, das auch bei Alice 0.3.2 funktioniert.
//Aschratt: GTA IV Modding kommt eh seehhhhrrr langsam nur in die Gänge... Aber R* is selbst schuld...
__________________

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ZAZ: 14.04.2009 20:56.
|
|
14.04.2009 20:54 |
|
|
Erdgnome
Auftraggeber
  

Dabei seit: 18.11.2008
Old nickname here: DMA TAKE 2
Themenstarter
 |
|
Ja, ich denke ich muss das komplette Tutorial überarbeiten.
Die Alice 3.2 Scripte sind komplett anders.
Ich setz mich da jetzt mal ran.
__________________

|
|
14.04.2009 21:08 |
|
|
ZAZ
Informant
Dabei seit: 08.04.2006
 |
|
| Zitat: |
| //Aschratt: GTA IV Modding kommt eh seehhhhrrr langsam nur in die Gänge... Aber R* is selbst schuld. |
Na da regt sich ja was. Wie siehts mit Dir aus, schon was in Richtung Alice probiert?
Ja die GTA4 modding scene hält sich bescheiden obwohl recht früh die ersten tools breit standen. Viele waren daran interessiert die waffen zu frisieren oder sich nen anderen Vorteil im MP zu verschaffen.
Aber die meisten sind froh wenn ihr game überhaupt funktioniert, besonders der Multiplayer und lassens wohl lieber so wie es ist.
Und dann fehlen noch diejenigen, deren Hardwareleistung nicht ausreicht und die Kiddies, die es nicht kriegen.
__________________

|
|
15.04.2009 00:45 |
|
|
Erdgnome
Auftraggeber
  

Dabei seit: 18.11.2008
Old nickname here: DMA TAKE 2
Themenstarter
 |
|
[PLATZHALTER]
Ich muss es doch noch eben bearbeiten, hab nen kleinen aber feinen Fehler in meinem Tut gefunden.
__________________

|
|
16.04.2009 21:59 |
|
|
Aschratt
Moderator
  

Dabei seit: 01.04.2006
Nation: Germany City: Karl-Marx-Stadt
 |
|
@ZAZ: Nun, ich finde die ganzen Checksum-Checks für Dateien für den Multiplayer affig. Lieber hätte Rockstar nen Mod Support machen können. Mit ALICE habe ich mich bisher nicht groß beschäftigt. Dazu habe ich z.Z. einfach keine Zeit. Ich habe mich Anfangs mal mit den Paths beschäftigt und dafür eine C++ Libary geschrieben, aber sonst habe ich auch noch nicht viel an GTA IV gemacht. Ich finde SA macht mehr Spaß
__________________
|
|
17.04.2009 15:29 |
|
|
|
|
|
 |
Impressum
|