Na ja irgendwie ist kein Code ein wenig durcheinander.
1.) Vor "OnGameModeInit" gehört ein "public"
2.) Befehle gehören nicht in "public OnGameModeInit" sondern in "public OnPlayerCommandText"
3.) Hast du den #include wirklich ganz ganz oben?
Am besten zeigst du mehr von deinem Code, da in dem kleinen Ausschnitt schon massenhaft Fehler sind
Beiträge von Mann im Mond
-
-
Weiß ich genauso wenig auswendig wie du, aber vielleicht wirst du hier fündig:
http://wiki.sa-mp.com/wiki/InteriorIDs -
gTeam[playerid]
wird zu
gTeam[i] -
Inwiefern? Als Einweisung in den Beruf? Falls ja, natürlich, müsstest halt anstatt der Variable "Tutorial" eine neue erstellen und mit der so umgehen wie mit Tutorial. Und dann bei dem Befehl mit dem man invitet wird noch die Kamera umsetzen/Spieler umsetzen/Variable wieder auf 0 usw.
-
Aso ok dann benutze SetTimerEx
Bei /earn:
SetTimerEx("speeren",10000,false,"d",playerid);und dann änderst du das "speeren" in
public speeren(playerid)
{
mission[playerid] = 0;
return 1;
} -
Ich glaube nicht, dass das ohne Umwege machbar ist. Du könntest im Filterscript irgendetwas ausführen und dies im eigentlichen Gamemode überprüfen. Was genau fällt mir aber auf die Schnelle grad nicht ein...
-
Dadurch würde aber jede Variable jedes Spielers betroffen sein, außerdem wissen wir immer noch nicht, ob die Variable überhaupt für Spieler ist oder für Autos oder für Bäume...
-
Hä? Ich habe es extra gerade neu geschrieben, wenn du das meinst. Aber ich verstehe nicht, was daran Top sein soll. Eigentlich wollte ich kein neues schreiben, aber das in dem Link war tatsächlich fehlerhaft und kann nicht funktionieren, also musste ich es geringfügig umändern...
-
Ich hab extra hingeschrieben, dass meins oben nur ein Beispiel war mit der "playerid". Zeig mal wie du mission erstellt hast, dann kann ich dir weiterhelfen.
-
// oben
new Tutorial[MAX_PLAYERS];
forward Tutorial();// OnPlayerConnect
Tutorial[playerid] = -1;// OnGameModeInit
SetTimer("Tutorial",1000,1); // am Besten benutzt du einen breits bestehenden sekündlichen Timer// Das hier hinmachen, wo das Tutorial starten soll
Tutorial[playerid] = 0;// Das hier hinmachen, wo das Tutorial enden soll
Tutorial[playerid] = -1;// der neue Public
public Tutorial()
{
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
if(Tutorial[i] > -1)
{
Tutorial[i]++;
switch(Tutorial[i])
{
case 5:
{
// Nach 5 Sekunden wird das aufgerufen
// hier kannst du dann SendClientMessage(i,FARBE,"Text"); machen
}
case 10:
{
// Nach 10 Sekunden wird das aufgerufen
// hier kannst du dann SendClientMessage(i,FARBE,"Text"); machen
}
case 50:
{
// Nach 50 Sekunden kommt der letze Text
// hier kannst du dann SendClientMessage(i,FARBE,"Text"); machen
Tutorial[i] = -1;
}
}
}
}
}
}
Es gibt noch viele andere Wege ein Tutorial umzusetzen, aber du benötigst immer einen Timer - ob er sich wiederholt oder nicht... -
beim compilen enstehen errors/warnings und das kommt núnter die includes
#include
#pragma tabsize 0
schon wieder zu langsam xD
Beim Compilen kommen nur dann Warnings (Fehler wegen "loose identitation" gibts ned), wenn du zu faul dazu bist deinen Code richtig einzurücken. Wenn du diese Fehler unterdrückst, kann kaum einer ohne große Anstrengung deinen Code entziffern. Lass das #pragma also weg und lern lieber wie man richtig einrückt.
Also anstatt:
if(x = y)
{
if(z = a)
{
if(a = b)
{
//Test2
if(r = k)
{
//Test 5
}
}
else
{
//Test
}
}
}
kann man es auch so schreiben:
if(x = y)
{
if(z = a)
{
if(a = b)
{
//Test2
if(r = k)
{
//Test 5
}
}
else
{
//Test
}
}
}
Was kannst du besser lesen, wenn du was dran verändern möchtest? -
SetPlayerPos(playerid,x,y,z);
SetPlayerFacingAngle(playerid,angle);
SetPlayerInterior(playerid,interior);Alles zu finden unter Wiki
-
"array must be indexed bedeutet" du hast die Angaben (in den Klammern) hinter der Variable vergessen:
Wie hast du mission erstellt? Wahrscheinlich mit
new mission[MAX_PLAYERS]; //oder so ähnlich
dann musst du in deinem Befehl auch
mission[playerid] = 0;
Ich weiß zwar nicht, für was die Variable gut ist, ob für Autos Spieler oder Sonstiges, aber mein Beispiel oben war eben auf eine Variable für die Spieler ausgelegt -
Ich kanns nur vermuten, da ich die Speicherung über MySQL vorziehe und noch nie mit dini gearbeitet hab, aber musst du als "filename" nicht nur den Dateinamen angeben oder kannst du dort auch eine Ordnerangabe mit reinmachen ("tuning")? Also ich denke es liegt daran, dass das Script die Datei nicht findet (wegen Pfadangabe oder falschere Ordner) und deshalb die Datei nicht löscht. Mach mal nach der Klammer von dini_exist eine Bestätigungsnachricht hin, die gesendet wird, um zu überprüfen, ob es an dem Problem liegt, was ich vermute.
Also du musst dann kontrollieren ob die Nachricht gesendet wird oder nicht.... -
Ehm, warum lässt du die wichtigesten Sachen aus meinem dir vorgeschlagenen Code weg. So wird es kaum funktionieren...
Du musst doch die Variable (den Parameter) "fuel" definieren mit Hilfe von
string = strtok(cmdtext,idx);
string = strtok(cmdtext,idx);
string = strtok(cmdtext,idx);
if(string[0] == 0)
{
// Spieler hat keinen Parameter angegeben
return 1;
}
fuel = strval(string);
Außerdem solltest du noch ein paar SendClientMessage reinbauen zur Bestätigung -
Du kannst die Variable z.B. durch das
new
veh = GetPlayerVehicleID(playerid);
bestimmen. Dadurch wird das Fahrzeug aufgetankt, in welchem der Spieler gerade sitzt.ZitatNun muss ich noch beim Tank cmd haben, dass er pro Liter tankt , was meiner Meinung nach schwer ist. Wie geb ich an, dass er Pro Liter 1 € abzieht?
Derzeit muss ich es leider noch so machen, dass er volltankt aber immer volltankt^^.Du musst einen Paramter benutzen, den der Spieler bestimmen muss, wie viel er tanken will.
Mit dcmd und sscanf:
dcmd_fuel(playerid,params[])
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
// Spieler ist kein Fahrer
return 1;
}
new
fuel,
carid = GetPlayerVehicleID(playerid);
if(sscanf(params,"d", fuel))
{
// Spieler hat keinen Parameter angegeben
return 1;
}
if(Fuel[carid]+fuel > 100) // 100 ist die maximale Menge
{
// Es passt nicht so viel Sprit in das Auto
return 1;
}
Fuel[carid] += fuel;
GivePlayerMoney(playerid,-fuel); // Da 1 Liter $1 kostet
//[... Meldungen usw ...]
return 1:
}
Ohne:
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
// Spieler ist kein Fahrer
return 1;
}
new
string[128],
fuel,
carid = GetPlayerVehicleID(playerid),
idx;
string = strtok(cmdtext,idx);
if(string[0] == 0)
{
// Spieler hat keinen Parameter angegeben
return 1;
}
fuel = strval(string);
if(Fuel[carid]+fuel > 100) // 100 ist die maximale Menge
{
// Es passt nicht so viel Sprit in das Auto
return 1;
}
Fuel[carid] += fuel;
GivePlayerMoney(playerid,-fuel); // Da 1 Liter $1 kostet
//[... Meldungen usw ...]
return 1: -
Na ja für was nimmt man sich die Mühe viel zu schreiben, um einem was zu erklären, wenn später wieder einer kommt der dann genau das vorschlägt, über was ich weiter oben schon was geschrieben habe...
-
dcmd bzw. sscanf ist kürzer bei Commands mit Parametern,doch bei Commands ohne Variablen erweist es umständlicher .Nebenbei: Versteht man strtok, ist dies genau so einfach
Es ging nicht um umständlicher sonderm um effektiver. dcmd ist umein Vielfaches effektiver als strcmp zu benutzen. Außerdem finde ich es sowohl mit oder ohne Variablen einfacher, da man nicht immer mit diesen strcmp rumhantieren muss. Für sscanf gilt das Gleiche: effektiver und einfacher zu nutzen und um später neue Paramter anzuhängen -
Wie schon oben gesagt, glaube ich dass dies nicht geht. Je nachdem wie mans nimmt, ist es ein SAMP Bug, allerdings heisst ja der public "OnPLAYER.."
-
@ Kayer: Ich hab mit mal erlaubt deinen Code auszubessern:
new
name[MAX_PLAYER_NAME], //Welcher Name ist bitte 64 Zeichen lang? Keiner
string[54];
GetPlayerName(playerid, name, sizeof(name)); // Klammern nicht vergessen
//new row; //Hä? Willst du einen switch auf ne neu erstellte Variable loslassen?
switch(reason) // Bei OnPlayerDisconnect wird reason mitübergeben
{
case 0:
{
format(string, sizeof(string), " %s hat den Server verlassen. [Kick/Ban]", name);
SendClientMessageToAll(COLOR_RED, string);
}
case 1:
{
format(string, sizeof(string), " %s hat den Server verlassen. [Verlassen]", name);
SendClientMessageToAll(COLOR_RED, string);
}
case 2:
{
format(string, sizeof(string), " %s hat den Server verlassen. [Timeout]", name);
SendClientMessageToAll(COLOR_RED, string);
}
}
return 1;
1.) Einrücken
2.) Auf die Größe der Strings achten
3.) Drauf achten, welche Variable du überprüfen musst
4.) Auf Klammern achten