Wenn du RemovePlayerFromVehicle innerhalb von "newstate == PLAYER_STATE_DRIVER" (OnPlayerStateChange) machst, ist eine Überprüfung "IsPlayerInAnyVehicle" sinnlos. Das PLAYER_STATE_DRIVER sagt ja alles...
Beiträge von Mann im Mond
-
-
Benutze um strings zu vergleichen strmp:
if (strcmp(name3, CarInfo[carid][carsowner], true) == 0) -
Wenn du es nicht hinkriegst versuchs damit:
http://forum.sa-mp.com/index.php?topic=14702.0Damit kannst du ganz bequem deine Zone einzeichnen und das Programm gibt dir Koordinaten aus samt Beschreibung. Bei den Koordinaten ist aber meines Wissens nach ein "," anstatt eines "." . Das dann noch ändern...
-
Da fragst du doch auch schon: Admin level habe 0 schimer
Erstell eine Variable und weis der den Wert zu des Adminlevels.
// ganz oben
new
Admin[MAX_PLAYERS];// OnPlayerConect
Admin[playerid] = 0;// /makeadmin
//Eine überprüfung der Eingabe hinter /makeadmin:
Admin[EingabeSpieler] = EingabeAdminLevel; // mach das mit Hilfe von z.B. strtok oder sscanf// in deinen Admin Befehlen eine Überprüfung
if(Admin[playerid] < BenötigtesAdminLevel)
{
// Spieler hat keine Berechtigung
return 1;
} -
Dann fehlt dir in deiner SQL Datenbank der Eintrag Deagle
-
Die Adminfrage, wie man Adminlevel/system erstellt gabs inzwischen schon zwei mal seit gestern. Schau mal hier, vielleicht hilft dir das: admin lvl
EDIT: Da du 2 Themen hast (brauche mal für 2 große fette sachen hilfe ^^) ist es irgendwie unklar, wo man hinschreiben soll
-
Oder anstatt das Auto zu verschieben, was wie ich mir vorstellen kann in engen Gassen Probleme machen kann, einfach den Spieler über dem Auto spawnen lassen.
SetPlayerPos(playerid, x, y, z+2); -
Hm bei welcher Zeile kommen die Fehler?
Der obere Teil muss außerdem in OnPlayerCommandText, der untere Teil ab "// strtok" außerhalb der Callbacks -
Ehm damit ändert man aber kein Wert in einer Datei, wie er es oben wollte. Damit änderst du die Variable einer "playerid" (das ist kein bestimmter Spieler, sondern einfach der, der drauf kommt).
Wenn du einen Wert in einer Datei ändern willst, musst du die Datei öffnen, den entsprechenden Wert ändern und die Datei wieder schliessen. Das machst du gleich, wie dus auch beim Login eines Spielers machst. Da überprüfst du auch, ob die Datei des Spielers existiert und lest alle Werte aus... -
Da steht doch alles drin, außerdem wird gerade das selbe Thema ein paar Themen weiter unten behandelt:
Wie speichere ich hier Admin?[Habe schon angefangen aber klappt nicht] -
Und bei OnVehicleSpawm damit die Autos auch nachdem sie explodiert sind noch getunt sind
-
Ja natürlich das geht auch mit Hilfe von strtok und strval
new
string[128],
idx;
string = strtok(cmdtext, idx);
if(strcmp(string,"dm",true) == 0)
{
new
number;
string = strtok(cmdtext, idx);
if(string[0] == 0)
{
// 1. Parameter ("Wüste") fehlt
return 1;
}
string = strtok(cmdtext, idx);
if(string[0] == 0)
{
// 2. Parameter (Zahl) fehlt
return 1;
}
number = strval(string);
// ... Zum überprüfen dann einfach ...
if(strcmp(string,"wüste",true) == 0)
{
if(number == 1)
{
// Spieler hat /dm Wüste 1 eingeben
}
}
}// strtok
strtok(const string[], &index)
{
new length = strlen(string);
while ((index < length) && (string[index] <= ' '))
{
index++;
}new offset = index;
new result[20];
while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
} -
Du solltest einen globale Variable erstellen, um die Zeit hochzuzählen. SetPlayerPos solltest du nicht innerhalb der Schleife machen, da es ja ausreicht EINMALIG die Position zu setzen, nicht jede Sekunde erneut.
Bsp.: Dein Tutorial startet beim Befehl /tutorial. Dann setze bei diesen Befehl die Position/Angle usw. und die Variable pTutorial auf 1. Das gleiche geht auch, wenn dus beim Login willst oder bei jedem Spawn...
// Ganz oben
new
pTutorial[MAX_PLAYERS];
// OnPlayerConnectpTutorial[playerid] = 0;
// In deinen Sekundentimer
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
if(pTutorial[i] > 0)
{
switch(pTutorial[playerid])
{
case 5:
{
//Nachricht nach 5 Sekunden
}
case 20:
{
//Nachricht nach 20 Sekunden
}
case 40:
{
//Ende nach 40 Sekunden
pTutorial[i] = 0;
}
}
}
}
}// zum Starten vom Tutorial
// Hier dann deine SetPlayerPos usw.
pTutorial[playerid] = 1;// zum Beenden vom Tutorial
pTutorial[playerid] = 0;
-
Wo hast du deinen Code oben eingefügt?
-
Dazu müsstest du überprüfen (beim Connect) ob ein Eintragt in der Datenbank existiert. Am besten suchst du nach dem Namen in der Datenbank und gibts dann die Mysql ID aus.
Das kannst du mit Hilfe vonherausfinden. Oder da du den Mysql Teil von Moderntopia hast, kannst auch da schaun wies die gemacht haben.
EDIT: Such im Moderntopiascipt nach "gPlayerAccount" und "MySQLCheckAccount" und füge das bei dir hinzu. Die Überprüng von "gPlayerAccount" bei /login nicht vergessen, dann sollte alles gehen
-
Kann zwar nur Lags verindern, aber schont auf jeden Fall die CPU, besonders in Verbindung mit sscanf.
Ich habe beides ausprobiert und konnte damit nur Positives merken, was Lags und CPU Belastung angeht. Außerdem ist es in Verbindung mit sscanf auf jeden Fall einfacher in der Erweiterung, sowie Erstellung.
Das wird jeder merken, der damit arbeitet... Für mich auf jeden Fall die bessere und schnellere Alternative zum ressourcenziehenden strtok.EDIT: Zurück zu der Frage: Was ist an einem Banksystem so schwer wenn man schon Erfahrung mit dem Scripten hat? Speicher in deinem .ini File oder deine Datenbank (ich weiß nciht was oder ob du überhaupt schon Werte speicherst) einfach Variablen für den Spieler und setze die entsprechend bei /deposit und /withdraw. Wie du Daten speicherst, findest du in diesem Forum mehr als genug...
// Sagen wir du arbeitest mit PlayerInfo[playerid][pBank] für den Kontostand deines Spielers
dcmd_deposit(playerid,params[])
{
new
string[50],
amount;
if(sscanf(params,"d",amount))
{
// Falsche Eingabe
}
else if(amount < 0 || amount > GetPlayerMoney(playerid))
{
// Falsche Geldmenge, zu groß oder zu klein
}
else
{
GivePlayerMoney(playerid,-amount);
PlayerInfo[playerid][pBank] += amount;
format(string,sizeof(string),"Du hast $%d auf dein Bankkonto eingezahlt",amount);
SendClientMessage(playerid,FARBE,string);
}
return 1;
}dcmd_withdraw(playerid,params[])
{
new
string[50],
amount;
if(sscanf(params,"d",amount))
{
// Falsche Eingabe
}
else if(amount < 0 || amount > PlayerInfo[playerid][pBank])
{
// Falsche Geldmenge, zu groß oder zu klein
}
else
{
GivePlayerMoney(playerid,amount);
PlayerInfo[playerid][pBank] -= amount;
format(string,sizeof(string),"Du hast $%d von deinem Bankkonto abgehoben",amount);
SendClientMessage(playerid,FARBE,string);
}
return 1;
}sscanf findest du hier
-
// Oben
new
pickup,
bool:ArenaActiv;// OnGameModeInit()
pickup = CreatePickup(model,type,Float:X,Float:Y,Float:Z);// OnPlayerPickUpPickup(playerid, pickupid)
if(pickupid == pickup)
{
if(ArenaActiv)
{
// Code zum sttarte die Arena
}
else
{
// Arena nicht aktiv
}
}// Aktivieren der Arena
ArenaActiv = true;// Deaktivieren der Arena
ArenaActiv = false; -
Benutze CreatePickup innerhalb von OnGameModeInit z.B. und es geht.
// Oben
new
pickup;// OnGameModeInit()
pickup = CreatePickup(model,type,Float:X,Float:Y,Float:Z); -
new
weapon,
ammo;
for(new slot = 0; slot < 15; slot++)
{
GetPlayerWeaponData(playerid, slot, weapon, ammo);
if(weapon > 0 && weapon < 47 && ammo > 0)
{
// Er hat mindestens eine Waffe (Waffenid = "weapon", Munition = "ammo")
}
}
Du brauchst doch keine Array, um herauszufinden, ob er eine Waffe trägt. Da reicht ein einfacher Integer -