Hallo Leute ,
ich möchte euch mal zeigen wie man ein Dynamisches System auf die Beine stellt , ohne viel Aufwand,
zudem sieht es meist schwerer aus als es wirklich ist.
Verwendet...
- SII Include ( Zum Speichern , ihr könnt natürlich auch andere Methoden verwenden )
- Schleifen ( um so einiges herauszufinden )
- a_samp include (Standard Funktionen )
Als erstes erstellen wir die benötigten Variablen , hier mal die Beispiel Variablen...
#define max_points 100
enum point_struc
{
Float:x,
Float:y,
Float:z,
ist_da,
}
new punkte[max_points][point_struc];
new schon_erstellt;
wie man sieht...
- Zu erste definiere ich mir einfach mal eine Maximale Anzahl der Dynamischen Punkte
- danach erstelle ich mir ein kleine Struktur für die Übersicht
- danach Verknüpfe ich das ganze um es auf die Maximalen Dynamischen zu verteilen
- Die Variable ,,schon_erstellt´´ dient dabei für die Spätere Angabe um zu sehen bis welchen Index schon Dinge belegt sind
So nun möchte ich mit dem Code für das Laden der Objekte/Punkte fortfahren...
public OnGameModeInit()
{
new formatx[30];
if(INI_Open("punkte.cfg"))
{
for(new i = 0;i<max_points;i++)
{
format(formatx,sizeof formatx,"is_there_%d",i);
punkte[i][ist_da] = INI_ReadInt(formatx);
if(punkte[i][ist_da]) // if(punkte[i][ist_da] == 1)
{
format(formatx,sizeof formatx,"p_x_%d",i);
punkte[i][x] = INI_ReadFloat(formatx);
format(formatx,sizeof formatx,"p_y_%d",i);
punkte[i][y] = INI_ReadFloat(formatx);
format(formatx,sizeof formatx,"p_z_%d",i);
punkte[i][z] = INI_ReadFloat(formatx);
schon_erstellt++;
}
}
INI_Close();
}
return 1;
}
Ich benutze in diesem Fall SII um zu Speichern aber ihr könnt natürlich auch andere Dinge nehmen , das Prinzip bleibt gleich.
Wie ihr seht lese ich erst aus ob das Objekt erstellt wurde, das ist nötig damit er keine angaben aus Nullwerten ließt,
danach können wir fortfahren und die Koordinaten der Punkte laden x,y,z ,
und dann kommt wieder die Variable schon_erstellt , diese muss den Wert +1 Zählen damit der Index übersprungen wird
und das Skript weiß das der vorige Index belegt ist.
Kommen wir nun zum Teil Speichern...
public OnGameModeExit()
{
new formatx[30];
if(INI_Open("punkte.cfg"))
{
for(new i = 0;i<max_points;i++)
{
if(punkte[i][ist_da]) // if(punkte[i][ist_da] == 1)
{
format(formatx,sizeof formatx,"p_x_%d",i);
INI_WriteFloat(formatx,punkte[i][x]);
format(formatx,sizeof formatx,"p_y_%d",i);
INI_WriteFloat(formatx,punkte[i][y]);
format(formatx,sizeof formatx,"p_z_%d",i);
INI_WriteFloat(formatx,punkte[i][z]);
format(formatx,sizeof formatx,"is_there_%d",i);
INI_WriteInt(formatx,punkte[i][ist_da]);
}
}
INI_Save();
INI_Close();
}
return 1;
}
So hier frage ich erstmal ab ob der erstellte Punkt existiert danach speichere ich die Koordinaten , wie man sieht formatiere ich die Werte erste mit Zahlen, nach schleife in diesem Fall die Variable ,,i´´ und speichere bis zu den Maximalen Punkten ab , je nach dem ob sie nun existieren oder nicht.
Ich habe vergessen zu erwähnen das ich im Teil Laden auch erst Formatieren und dann erst angebe woraus ich Laden möchte.
So kommen wird zum Beispiel ,,Nutzen´´ , hier zeige ich euch wie man diese geladenen Variablen nun nutzen ...
Hier einmal ein Timer, es reicht schon wenn er auf 1000ms steht und wiederholen:
forward CheckForPoint();
public CheckForPoint()
{
for(new i = 0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
for(new j = 0;j<max_points;j++)
{
if(punkte[j][ist_da])
{
if(IsPlayerInRangeOfPoint(i,3.0,punkte[j][x],punkte[j][y],punkte[j][z]))GameTextForPlayer(i,"Info Punkt blubb",2000,3);
}
}
}
}
return 1;
}
Ich Frage natürlich Standard für jeden Spieler ab , dann frage ich ab ob er mit dem Server verbunden ( das spart Ressourcen ) , evntl. noch abfragen
ob er ein Bot ist das spart wieder einiges an Ressourcen, so nun erstelle ich wieder eine neue schleife um meine Punkte abzufragen , diese muss nicht unbedingt zu den max_points gehen sondern kann auch bis zu ,,schon_erstellt´´ gehen dann muss man wie man sieht nicht abfragen ob der Punkt existiert ,,punkte[j][ist_da]´´ , so nun Frage ich ab ob der Spieler sich in einem bestimmten Radius zum Punkt befindet ,,IsPlayerInRangeOfPoint´´
und lasse dann einen ,,GameText´´ erscheinen , der wiedergibt das man sich im Radius von 3.0 auf Float zum Punkt befindet usw.
Das war jetzt nicht wichtig für ein Dynamisches System aber es ist nur ein Beispiel um zu zeigen wie man sowas denn nutzt, ausnutzt usw.
So nun kommen wir zum eigentlichen Teil, das ,,InGame Creating ´´ , das ist es was ein Dynamisches System ausmacht.
Kommando :
if(strcmp(cmdtext, "/neu", true) == 0)
{
new Float:gx,
Float:gy,
Float:gz;
GetPlayerPos(playerid,gx,gy,gz);
punkte[schon_erstellt][x] = (gx);
punkte[schon_erstellt][y] = (gy);
punkte[schon_erstellt][z] = (gz);
punkte[schon_erstellt][ist_da] = (1);
schon_erstellt++;
return 1;
}
Als erstes finde ich in meinem Beispiel die Position des Spielers raus danach , gebe ich dies an die Variablen weiter , setze es auf existiert 1 und
zähle die schon erstellten hoch , das war es der Punkte sollte sofort existieren , das Speichern sollte sich nach dem beenden des Skripts erledigen je nach dem in welche Callback man es packt etc. , ich habe es z.b. in OnGameModeExit gepackt, bester Weg es nach dem beenden eben mal zu speichern
So das war es soweit , ich hoffe das hat euch einen schritt weiter gebracht und meiner Methode etwas näher xD
Have Fun