2 Timer , einer checkt die Energie vorher , der andere nachher , sollte eig. nicht schwer sein, aber so wie die Funktion willst ,
heißt es du möchtest das , das Skript Mauern/ Objekte Synchronisiert , stell dir vor einer schießt auf das Auto und das Auto bleibt stehen
Natürlich kannst du auch 1 Timer nehmen der auf 900/ 800 ms arbeitet und per Case abfrage 2x Checkt
Beiträge von BlackFoX
-
-
Danke für das Feedback , nein es ist nicht gerade für den Anfänger gedacht sondern für Fortgeschrittene ,
es soll das Prinzip des Systems erklären , das oben gezeigte Beispiel soll die Anwendungsweise darstellen,
ich möchte noch hinzufügen das dies meine Methode ist , welche Methode andere Scripter anwenden bei solchen System kann ich nicht sagen.@Big_Pump2 , du musst nicht gleich ein dickes Haus System schreiben sondern erstmal versuchen etwas leichteres daraus zu zaubern um das Prinzip
zu begreifen, glaub mir ist wie Fahrrad fahren -
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 speichernSo das war es soweit , ich hoffe das hat euch einen schritt weiter gebracht und meiner Methode etwas näher xD
Have Fun
- SII Include ( Zum Speichern , ihr könnt natürlich auch andere Methoden verwenden )
-
-
if(IsPlayerInRangeOfPoint(playerid,5.0,1416.3047,-3010.1921,1.9465))
-
-
-
Kannst dazu den Portions Manager von Paragon nehmen , der Lizenzschlüssel ist frei
-
Auf Rockstar sind zwar noch keine Infos zu sehen aber in der PSP Szene munkelt man drüber das es schon in Planung sei ,
ich glaub hier nichts aber wenn dann wär das schon ne tolle Sache , möchte mal gerne wissen wie die Grafik dort sein wird :> -
GTA IV ist wie damals GTA 3 , danach kamen die guten Special Versionen wie Vice City und San Andreas daher ist nicht unmöglich,
wäre schon ne geile Sache auf Grafik Niveau GTA IV nur diesmal bitte mit weniger Fehlern & einem saubereren Code *g* -
Toll ein Fake Video , nach dem Rockstar Games GTA China Town Wars für PSP raus gebracht hat bezweifle ich sowas xD
-
Es bewirkt schon was, denn dann wird die Aktion die der Spieler gerade ausführt abgebrochen , diese Funktion hat hervorragend Funktioniert in der 0.2x,
jedoch weiß ich nicht wie es in der 0.3a aussieht -
if(newstate == 2)
{
if(vehicleid == 133 || vehicleid == 134 || vehicleid == 135 || vehicleid == 163 || vehicleid == 164 || vehicleid == 165)
{
if(!TakingLesson[playerid] && !IsAnInstructor(playerid))
{
SendClientMessage(playerid,COLOR_GREY," Du bist kein Fahrlehrer !");
RemovePlayerFromVehicle(playerid);
}
}
} -
Sicher das du die neusten Sa-mp Includes hast bzw. Pawn ?
Parameter Info :
[url='http://wiki.sa-mp.com/wiki/CreatePickup']CreatePickup(model, typ, x, y, z, Virtuelle Welt);
-
for(new h = 0; h < sizeof(HouseInfo); h++)
{
if(HouseInfo[h][hOwned] == 0)
{
CreatePickup(1273, 2, HouseInfo[h][hEntrancex], HouseInfo[h][hEntrancey], HouseInfo[h][hEntrancez],-1);
pickups++;
}
if(HouseInfo[h][hOwned] == 1)
{
CreatePickup(1239, 2, HouseInfo[h][hEntrancex], HouseInfo[h][hEntrancey], HouseInfo[h][hEntrancez],-1);
pickups++;
}
} -
na ja wie auch immer ich kann es mir schon denken, du hast wahrscheinlich falsche Includes verwendet dort wird die Callback anders deklariert ...
daher nimmst du einfach die neuen aus einem runtergeladenen Archiv der neuen Version & ersetzt die alten gegen die neuen -
Du hast die Klasse anders Deklariert als sie wirklich existiert...
beispiel:
forward klasse(id,ic);
public klasse(id)Richtig ist das
forward klasse(id);
public klasse(id)nur als Beispiel
-
public pcheck()//8586
{
for(new i = 0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i))
{
if(PlayerToPoint(5.0, i, 20.505138, -1530.430542, 2.202931))
{
GameTextForPlayer(i, "~y~Tippe /Lossantos", 5000, 3);
}
}
}
return 1;
} -
Nutz einfach GameTextForPlayer das spart Ressourcen
-
Das muss
if (strcmp("/LosSantos", cmdtext, true, 10) == 0)
In OnPlayerCommandText...Das muss
public pcheck()//8586
{
for(new i = 0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i))
{
if(PlayerToPoint(5.0, i, 20.505138, -1530.430542, 2.202931))
{
SendClientMessage(i, COLOR_LIGHTBLUE,"Tippe /Los Santos");
}
}
}
return 1;
}
irgendwo hin nur nicht in eine andere Klasse da es selber eine Klasse ist wie man am ,,public´´ unschwer erkennen kann...danach gehst du in die Klasse OnGameModeInit und setzt da rein...
SetTimer("pcheck",1000,1);