Hallo Leute,
ich habe beschlossen ein Tutorial über das erstellen eines Haussystems zu machen.
Dies ist kein Scripting-Basics Tutorial, und verlang mindestens Grundwissen und ein funktionierendes Gehirn um es zu verstehen!
Fangen wir mal an...
Das Ziel:
Das Ziel dieses Tutorials ist es, am Ende ein Haussystem zu haben, das Häuser automatisch beim Spielstart erstellt. Spieler sollen die Häuser kaufen, vermieten und abschliessen können. Dabei soll das System möglichst wenig Arbeitsaufwand haben. Natürlich soll das Script nur so wenig Ressourcen brauchen, wie es machbar ist.
Der Weg:
Um unser Ziel zu verwirklichen werden wir 2 Dateien erstellen. In der einen Datei werden die Häuser zeilenweise gespeichert. In der anderen Datei werden wir das "Setup" des Hauses speichern. Also alle Informationen, wie z.B. Besitzer, Mieter, Miete ect..
Um das ganze möglichst komfortabel zu gestalten verwenden wir das Filterscript h_interiors. Dies erweitert die SA:MP um 6 neue Callbacks und Funktionen.
Die Dateien:
.HOUSES - Datei
Die Datei für die Häuser wird in etwa das Layout wie die AddInteriors() Funktion in h_interiors bekommen. Jedoch mit einem "|" als Zwischenzeichen, und einer ID am Anfang. Die ID dient der Zuordnung, damit wir die Hauskonfiguration aus der 2. Datei auch einem Haus zuordnen können.
So würde eine solche Datei dann aussehen:
1|Welcome home|NULL|0|1953.704956|1342.881958|15.374607|86.697219|NULL|NULL|NULL|YES|byee|NULL|3|235.407196|1187.490844|1080.257812|83.480270|NULL|NULL|NULL|YES
2|Welcome Home|NULL|0|1959.484252|1340.293334|15.374607|1.088764|NULL|NULL|NULL|YES|Bye|NULL|2|225.111801|1240.140380|1082.140625|96.546875|NULL|NULL|NULL|YES
Die ID am Anfang ist fortlaufend. (So wie man es z.B. von MySQL her kennt.
.HOUSEDATA - Datei
Die Housedata Datei ist eine viel kleinere Datei. In ihr wird nach folgendem Layout gespeichert:
Somit könnte eine solche Datei so aussehen:
Diese 2 Datein legen wir nun mit Hilfe von der Windows Konsole an. Benutzer anderer Systeme werden schon wissen, wie sie das am einfachstem machen...
Wir öffnen die Windows Konsole.
Windows XP Benutzer:
Start -> Ausführen -> cmd eingeben -> Enter drücken
Windows Vista & 7 Benutzer:
Start -> cmd eingeben -> Enter drücken
Nun gebt ihr folgende Zeilen ein:
Danach können wir die Konsole schließen, und die 2 neuen Dateien auf dem Desktop in den Ordner Scriptfiles kopieren.
Häuser erstellen:
Am besten erstellen wir die Häuser mit dem AddInteriors Generator von h_interiors. Die Beschreibung und Bedienung mit einem Video sind hier zu finden. Wir müssen nun lediglich den generierten Funktionsaufruf ( AddInterior(....) ) umschreiben. Das machen wir, indem wir alles außer der Parameter entfernen, und zwischen die Parameter ein "|" einfügen.
Also wird aus:
AddInterior ( "Welcome home!" , NULL , 0 , 1953.704956 , 1342.881958 , 15.374607 , 86.697219 , NULL , NULL , NULL , YES , "byee" , NULL , 3 , 235.407196 , 1187.490844 , 1080.257812 , 83.480270 , NULL , NULL , NULL , YES );
das:
Welcome home!|NULL|0|1953.704956|1342.881958|15.374607|86.697219|NULL|NULL|NULL|YES|byee|NULL|3|235.407196|1187.490844|1080.257812|83.480270|NULL|NULL|NULL|YES
Zum Schluss fügen wir vorne noch die ID ein. Dann wird daraus das:
1|Welcome home!|NULL|0|1953.704956|1342.881958|15.374607|86.697219|NULL|NULL|NULL|YES|byee|NULL|3|235.407196|1187.490844|1080.257812|83.480270|NULL|NULL|NULL|YES
In der HOUSES Datei sähe das mit mehreren Häusern so aus:
1|Welcome home!|NULL|0|1953.704956|1342.881958|15.374607|86.697219|NULL|NULL|NULL|YES|byee|NULL|3|235.407196|1187.490844|1080.257812|83.480270|NULL|NULL|NULL|YES
2|Welcome home!|NULL|0|1953.704956|1342.881958|15.374607|86.697219|NULL|NULL|NULL|YES|byee|NULL|3|235.407196|1187.490844|1080.257812|83.480270|NULL|NULL|NULL|YES
3|Welcome home!|NULL|0|1953.704956|1342.881958|15.374607|86.697219|NULL|NULL|NULL|YES|byee|NULL|3|235.407196|1187.490844|1080.257812|83.480270|NULL|NULL|NULL|YES
4|Welcome home in your Villa|NULL|0|1953.704956|1342.881958|15.374607|86.697219|NULL|NULL|NULL|YES|byee|NULL|3|235.407196|1187.490844|1080.257812|83.480270|NULL|NULL|NULL|YES
--- Optional!
Um mit dem AddInterior Generator direkt dieses Layout zu erstellen, muss in h_interiors mit AddInterior Generator die Zeile 543 mit dieser:
format ( function , 1024 , "%s|%s|%d|%f|%f|%f|%f|NULL|NULL|NULL|%s" , p[ playerid ][ iM ] , VWorld , p[ playerid ][ iIID ] , p[ playerid ][ iX ] , p[ playerid ][ iY ] , p[ playerid ][ iZ ] , p[ playerid ][ iA ] , AK );
und die Zeile 553 mit dieser Zeile ersetzt werden!
format ( temp_function , 512 , "|%s|%s|%d|%f|%f|%f|%f|NULL|NULL|NULL|%s" , p[ playerid ][ oM ] , VWorld , p[ playerid ][ oIID ] , p[ playerid ][ oX ] , p[ playerid ][ oY ] , p[ playerid ][ oZ ] , p[ playerid ][ oA ] , AK );
---
Das Scripting (endlich):
Als erstes empfieht es sich die h_interiors include und ein paar defines und kleine Makros einzufügen:
#include <h_interiors> // h_interiors include einbinden
#define MAX_HOUSES 10 // Anzahl maximaler Häuser
#define HOUSEFILE "tutorial.HOUSES" // Datei aller Häuser
#define HOUSEDATAFILE "tutorial.HOUSEDATA" // Datei der Hausinformationen
#define stf(%0) floatstr(%0) // Kürzeres floatstr
#define stv(%0) strval(%0) // Kürzeres strval
#define UNALLOWED_NAME "-1NOBODY-1" // Ein Spielername dient als Platzhalter.
#define _GetPlayerMoney(%0) GetPlayerMoney(%0) // Kann geändert werden ( bei z.B. Anticheat System )
#define _GivePlayerMoney(%0,%1) GivePlayerMoney(%0,%1) // Kann geändert werden ( bei z.B. Anticheat System )
Nun legen wir ein paar Variablen an, die wir benötigen werden:
enum houseinfo // Mehr muss von den Häusern nicht gespeichert werden, dank h_interiors.
{
sID, // sID wird die ID aus den Datein
InteriorID // InteriorID ist die ID, die von AddInterior zurückgegeben wird.
}
enum housedata // Hier befinden sich die ganzen Hausinformationen
{
sID, // sID wird die ID aus den Datein
Prize, // Haus Kaufpreis
AllowRent, // Mieten erlauben 0 = Nein , 1 = Ja
Owner[ MAX_PLAYER_NAME ], // Besitzername
Tenant[ MAX_PLAYER_NAME ],// Mietername
Rent, // Mietkosten
Lockstate // Türschloss 0 = Offen , 1 = Verschlossen
}
new HouseData[ MAX_HOUSES ][ housedata ];
new House[ MAX_HOUSES ][ houseinfo ];
new ActualHouse[ MAX_PLAYERS ];// Interior, indem sich der Spieler befindet
new CreatedHouses; // Anzahl erzeugter Häuser
Nun sollten wir als erstes prüfen, ob ein Spieler mit unerlaubtem Namen verdinden möchte. Das geschieht so:
public OnPlayerConnect(playerid)
{
new name[ MAX_PLAYER_NAME ];
GetPlayerName ( playerid , name , MAX_PLAYER_NAME );
if ( !strcmp ( name , UNALLOWED_NAME ) )
{
SendClientMessage ( playerid , 0x666666AA , "Es tut uns leid, aber dieser Name ist nicht zulässig." );
Kick ( playerid );
}
return 1;
}Darauf gehe ich nicht detailierter ein, denn das sollte wohl klar sein.
Ich musste das Tutorial leider in 2 Teile teilen...
also wartet auf Teil 2