Das ist relativ einfach.
Du kannst über das "DrunkLevel" des Spielers, die FPS Zahl ermitteln:
http://wiki.sa-mp.com/wiki/SetPlayerDrunkLevel
Beiträge von FACE
-
-
Du brauchst ein Streaming programm.
Über einen Client auf deinem Rechner sendest du zu dem StreamingServer (wahrscheinlich auch dein Rechner, sofern nicht allzu professionell).Haken an der Sache: Bei kleiner Internetanbindung geht der Stream in die Knie. Jeder Listener zehrt an der Übertragungsdichte. (mal bildhaft umschrieben)
Dies hat aber eigentlich nichts mit San-Andreas zu tun
-
Du setzt eine Variable, welche enthält, ob sich der Spieler im DM befindet oder nicht.
Hierfür gibt es extra den "Boolean". Eine Variable, welche nur zwei Werte annehmen kann: True (1), oder False (0).also oben im Script definieren wir die Variable:
new bool:PlayDM[MAX_PLAYERS];Beim Connecten ist diese natürlich auf "false" zu setzen:
Wenn der Spieler das DeathMatch betritt, setze die Variable auf "true":
PlayDM[playerid]=true;
Beim Verlassen natürlich wieder auf "false":
PlayDM[playerid]=false;Nun zum Command Block:
(unter OnPlayerCommandText)
if(PlayDM[playerid]==true && /*Hier kommt dein Exit command hin, aber verneint!!!!!, sonst kann er ja die DM-Zone nichtmehr verlassen*/) { return SendClientMessage(playerid, 0xFFAAAA,"Du bist in der DM-Zone und kannst keine CMDs benutzen!");}Nun zum /exit Command:
(wieder unter OnPlayerCommandText)
if(/*dein Exit Command*/)
{
if(PlayDM[playerid]==true){/*Dein Code zum Verlassen der DM arena*/}else{SendClientMessage(playerid,0xFFAAAA,"Du bist nicht in der DM-Arena");}
return 1;
} -
Dann bau halt eine zweite if-Abfrage ein:
ocmd:tor(playerid,params[])
{
if(!isPlayerInFrakt(playerid,1)) return SendClientMessage(playerid,ROT,"Du bist kein Polizist");
if(IsPlayerInRangeOfPoint(playerid,10, 1592.19, -1638.02, 13.43))
{//ERSTES TOR BEGINN
MoveObject(tor, 1592.19, -1638.02, 13.43-10,10); // und hier gehts runter..
SetTimerEx("torzu", 1000*5, 0, "i", playerid);
{
MoveObject(tor2, 1548.81, -1627.67, 15.00-10,10);
SetTimerEx("torzu2", 1000*5, 0, "i", playerid);
}
}//ERSTES TOR ENDE
if(IsPlayerInRangeOfPoint(playerid,10, 1592.19, -1638.02, 13.43))
{//ZWEITES TOR BEGINN
MoveObject(tor, 1592.19, -1638.02, 13.43-10,10); // und hier gehts runter..
SetTimerEx("torzu", 1000*5, 0, "i", playerid);
{
MoveObject(tor2, 1548.81, -1627.67, 15.00-10,10);
SetTimerEx("torzu2", 1000*5, 0, "i", playerid);
}
//Die Werte hier fürs zweite Tor müsst/musst ihr/du natürlich ändern ;)
}//ZWEITES TOR ENDE
return 1;
} -
if(IsPlayerInRangeOfPoint(playerid,10, 1592.19, -1638.02, 13.43))
Prüfung genug ? -
Das ist wohl der falsche Bereich.
Begib dich dafür am besten in den Bereich "Markplatz" -
if(MullabfuhrCP[playerid] == 1 && IsPlayerInRangeOfPoint(playerid,10.0,1355.6742,-1749.4160,13.3807))
{
GivePlayerMoney(playerid, trinkgeld);
format(string, sizeof(string), "** Du hast den Müll aufgeladen und %d€ erhalten, fahr zum Nächsten Checkpoint.",trinkgeld);
SendClientMessage(playerid, COLOR_GREEN, string);
SetPlayerCheckpoint(playerid, 1531.7, -1668, 13.3, 5.0);
MullabfuhrCP[playerid] = 2;
return 1;//Beenden der Aktion
}Viell. ein Ansatz?
Diese "else if" Sache heißt ja "sonst wenn", sprich wenn der ParameterWert(e) nicht passen, aber andere Kriterien erfüllen, tu bla...
Jetzt wird das Script von oben nach unten vom Server durchglesen..... (bildhaft)
Du erhöhst den Wert und es passt auf die nächste Abfrage
Du erhöhst den Wert wieder und es passt auch auf die darauffolgende Abfrage.
Und so weiter.......
Beim letzten CP, oder danach blendet er dann aus und der Drops ist gelutscht. -
Dann musst du noch irgendetwas anderes in deinem Script haben, was auf diese Funktion Einfluss nimmt, bzw. diese blockiert oder Ähnliches.
Habs selbst getestet und es funktioniert wunderbar. -
http://wiki.sa-mp.com/wiki/Scripting_Basics_DE
Dort sind die grundlegensten Funktionen (auch mit Beispielen) relativ einfach dargelegt.
Einfach mal ein wenig einlesen -
Ich hätte noch eine weitere Vermutung.
Du erhöhst den Wert (den für die CPs).
Es wird direkt die nächste Klammer ausgelesen, folglich läuft das so weiter, bis der letzte Checkpoint erreicht ist und dann ausgeblendet wird. -
Schmeiß mal den ganzen alten Kram raus und hau mal das neue direkt hier aus den Fenstern rein.
Hab das bei mir jetzt direkt ausm Testscript entnommen.Zu deiner Funktion. Bau einfach mal einen TestCommand, mit welchem du folgendes auslöst:
schulung[playerid]=1;
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[0][0],FahrschulCheckpoints[0][1],FahrschulCheckpoints[0][2],3.0);
SendClientMessage(playerid, GELB, "[Fahrschuhle]Auf Zum ersten Checkpoint."); -
Lösch mal das DisablePlayerCheckpoint(playerid);. Wahrscheinlich nimmt das Einfluss auf das Setzen neuer Checkpoints in derselben Fkt.
-
Habs überarbeitet und getestet, funktioniert doch wunderbar
Oben im Script:
new schulung[MAX_PLAYERS];new Float:FahrschulCheckpoints[19][3] = {
{-2083.3999023438, -129.19999694824, 35.0},
{-2052.8999023438, -140.39999389648, 35.0},
{-2070.5, -145.7998046875, 35.0},
{-2068.5, -118.90000152588, 35.0},
{-2069.599609375, -131.19921875, 35.0},
{-2024.3000488281, -203.10000610352, 35.0},
{-2039.2998046875, -128.8994140625, 34.900001525879},
{-2025.19921875, -180.2998046875, 35.0},
{-2042.3000488281, -163.5, 35.0},
{-2042.099609375, -193.0, 35.0},
{-2057.3000488281, -156.5, 35.0},
{-2038.6999511719, -240.5, 35.0},
{-2083.1999511719, -245.89999389648, 36.099998474121},
{-2069.3000488281, -236.69999694824, 35.0},
{-2058.6999511719, -228.80000305176, 35.0},
{-2088.5, -204.10000610352, 35.0},
{-2067.5, -213.69999694824, 38.0},
{-2083.0, -157.19999694824, 35.0},
{-2083.0, -157.19999694824, 35.0}
//{-2091.8999023438, -129, 34.400001525879}
};Unter OnPlayerCheckpoint:
public OnPlayerEnterCheckpoint(playerid)
{
if(schulung[playerid]>0)//Wenn sich der Spieler in der Prüfung befindet.
{
DisablePlayerCheckpoint(playerid);
if(schulung[playerid]<sizeof(FahrschulCheckpoints))
{
schulung[playerid]++;
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[schulung[playerid]-1][0],FahrschulCheckpoints[schulung[playerid]-1][1],FahrschulCheckpoints[schulung[playerid]-1][2],3.0);
SendClientMessage(playerid, 0xFFAAFF, "[Fahrschuhle]Sie haben den Checkpoint Erreicht.");
SendClientMessage(playerid, 0xFFAAFF, "[Fahrschuhle]Ab zum Nächsten.");
}
else//Wenn letzter Checkpoint
{
SendClientMessage(playerid, 0xFFAAFF, "------------------Erfogreich Bestanden----------------------");
SendClientMessage(playerid, 0xFFAAFF, "[Fahrschuhle]Sie haben ihr Führerschein erfolgreich Bestanden.");
//SetPlayerCheckpoint(playerid, -2091.8999023438, -129, 34.400001525879, 2.0);//Keine Ahnung wofür du das brauchst, aber ich lasse es mal drin.
sInfo[playerid][sSpieler_autoschein] = 1;
schulung[playerid] = 0;//Prüfung beendet.
}
}
return 1;
}Zum Auslösen der Prüfung (also der Command oder was auch immer):
schulung[playerid]=1;
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[0][0],FahrschulCheckpoints[0][1],FahrschulCheckpoints[0][2],3.0);Würde eventuell die CP noch etwas größer machen, aber das wars dann auch schon
-
btw. OnOccupiedVehicle sollte nicht für diese Sachen verwendet werden, da das viel zu viel Rechenleistung zieht.
Verdammt ich hab den Haken gefunden:
Note: This does not include vehicle health changes
Bezieht sich auf OnVehicleDamageStatusUpdate.
Sollte also jemand drauf schießen oder ähnliches, passiert nichts! -
Ha moment!
Nimm mal das DisablePlayerCheckpoint(playerid); raus
Evtl. klappt es dann.
Mit der Funktion sollte er ja den vorherigen CP entfernen, aber das fällt ja eh weg, da ein neuer CP gesetzt wird. -
Sorry, aber ich schaue mir keine Scripts über TeamViewer an.
Hint: Schreib dir doch einfach mal ein paar Testmessages rein, um das Ganze auf Herz und Nieren zu prüfen und den Fehler zu finden.Ich kaue ja nicht alles vor
(Ist ja dein Script) -
Verdammt, es sind ja strings
-
Der Fehler kann ja nur hier in diesen beiden Zeilen liegen, da die Messages ja ausgegeben werden und diese in derselben Klammer/Schleife stehen.
schulung[playerid]++;
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[schulung[playerid]-1][0],FahrschulCheckpoints[schulung[playerid]-1][1],FahrschulCheckpoints[schulung[playerid]-1][2],3.0);Gedankenrechnung:
-Start der Prüfung: schulung[playerid]=1;
-jetzt unsere schleife: schulung[playerid]++; --> schulung[playerid] ist jetzt 2.
Nun zum Checkpoint: SetPlayerCheckpoint(playerid,FahrschulCheckpoints[2-1 ; also 1.][0],etc...
Das sollte doch eigentlich passen.
Um aber sicherzugehen, setzen wir ein paar Klammern, damit er die Rechnung auch als Ganzes benutzt:
SetPlayerCheckpoint(playerid,FahrschulCheckpoints[(schulung[playerid]-1)][0],FahrschulCheckpoints[(schulung[playerid]-1)][1],FahrschulCheckpoints[(schulung[playerid]-1)][2],3.0); -
Ich lasse halt am Anfang einfach nichts abspeichern, sondern lediglich zwischenspeichern.
Da du, wie du ja selbst schriebst, noch Anfänger bist, finde ich es imho nicht ratsam, dass du versuchst eine komplexe (auch redundanz-freie) Datenbank aufzubauen.
Datenbankstrukturen sind da wohl eher ein gutes Stück schwerer, weshalb ich auch nicht verstehen kann, wieso dir hier zuerst zu MySQL geraten wird. -
Den Aufbau des Arrays finde ich unsinnig.
Warum du extra angibst, dass nur ein einziger Wert in jeder Zeile steht entzieht sich meiner Logik.
Auch die Rcon Funktion finde ich sehr skuril.Hätte es folgendermaßen gelöst.
new Gamemodes[] =
{
{Gamemode1},
{Gamemode2},
{Gamemode3}
};new gamemoderandom = random(sizeof(Gamemodes));
new gamemodestring [64];format(gamemodestring,sizeof(gamemodestring),"changemode %s",Gamemodes[gamemoderandom]);SendRconCommand(gamemodestring);