if(dini_Int(file,ip) != GetPlayerIp(player1,tmp3,100))
zu:
format(ip, sizeof(ip), dini_Get(file, "ip"));
GetPlayerIp(player1,tmp3,sizeof(tmp3));
if(strcmp(ip, tmp3))
{
//IP stimmt nicht.
}
Warum strcmp? Weil die IP ein String ist.
if(dini_Int(file,ip) != GetPlayerIp(player1,tmp3,100))
zu:
format(ip, sizeof(ip), dini_Get(file, "ip"));
GetPlayerIp(player1,tmp3,sizeof(tmp3));
if(strcmp(ip, tmp3))
{
//IP stimmt nicht.
}
Warum strcmp? Weil die IP ein String ist.
Sorry, natürlich nicht die else's sondern die #endif's.
So ist es.
Du wirst dann auch merken, dass die amx Datei ein wenig kleiner ist als zuvor, da ja weniger Speicher reserviert werden muss.
Genau.
MAX_PLAYERS kannst du in der a_samp.inc auch kleiner machen, wenn du weniger Slots hast, das spart unnötige Durchläufe.
Kein Problem, dafür ist das Forum ja da!
Um das noch hinzuzufügen:
dreamer5655:
Das wird dir einen Klammerfehler geben, da das hier nicht korrekt ist:
if(SpielerInfo[playerid][pLevel] <= 1))
Eine Klammer zu viel hinten
Außerdem ist die 1 falsch, das muss eine 0 sein. ![]()
if(SpielerInfo[playerid][pLevel] <= 0) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du hast kein Level mehr zu verkaufen.");
Ja, genau so.
EDIT: (Post unten)
ciaxx: Da dein Problem behoben ist, wäre es gut, wenn du den Thread auf erledigt setzt. Danke!
Ich bin mir ziemlich sicher, dass du eine Haus ID hast, woher sonst weißt du an welche Position du den Spieler setzen sollst, außer über eine ID? Die ID wird wahrscheinlich der Index des Array sein (i?).
Poste ansonsten mal den Befehl mit dem du ein privates Haus betrittst.
Zu deinem Beispiel: Nein, das klappt so nicht.
Wenn jedes private Haus seine eigene Welt haben soll, dann kannst du beim Betreten des Hauses einfach
SetPlayerVirtualWorld(playerid, hausID+1000);
machen, dann gehst du auf jeden Fall sicher, dass sich in der Welt niemand befindet, solange du sonst keine Welten zwischen 1000 und 1500 (mit der Annahme, dass du 500 Häuser hast) verwendest.
Nein, du erstellst einfach nur ein einzelnes Textdraw, mit irgendeinem Text. Du setzt den Text ja in dem Timer, mit TextDrawSetString.
Nein, sowas gibt es nicht. Das musst du, am besten mit einem Textdraweditor, selbst machen.
Das Textdraw das den Countdown anzeigen soll musst du natürlich unter OnGameModeInit erstellen. Das TextDrawCreate gibt dir dann die TextdrawID zurück.
if(IsPlayerInFrac(playerid, 4)
Zu
if(IsPlayerInFrac(playerid, 4))
EDIT: (Post unten)
DerFamer: Da dein Problem behoben ist, wäre es gut, wenn du den Thread auf erledigt setzt. Danke!
Das mit dem Timer ist relativ leicht.
Ich gehe einfach mal davon aus, dass man den Timer nur einmal starten kann, global gesehen, sprich wenn Spieler A ihn startet, dann kann ihn Spieler B nicht auch starten.
Global unter den Includes:
new countTimer = -1;
Im Befehl, dort wo der Timer gestartet werden soll:
if(countTimer != -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Countdown ist bereits an.");
if(!params[0]) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit ein.");
new time = strval(params);
if(time < 1 || time > 60) return SendClientMessage(playerid, 0xFF0000FF, "Gebe eine Zeit zwischen 1 und 60 ein.");
countTimer = SetTimerEx("CountDownObjekte", 1000, true, "dd", playerid, time);
Und das Timer-Callback:
forward CountDownObjekte(playerid, count);
public CountDownObjekte(playerid, count)
{
count--;
if(count <= 0)
{
KillTimer(countTimer);
countTimer = -1;
//Hier die Objekte erstellen
}
new str[16];
format(str, sizeof(str), "Countdown: %d", count);
//TextDrawSetString? / SendClientMessage?
return 1;
}
Du darfst beim SetObjectMaterial nicht mehr tmpobjid verwenden, sondern musst gObj[0] bzw. gObj[1] verwenden, da steht ja jetzt die Objekt ID drin.
Und die SendClientMessage darf nicht innerhalb der Schleife stehen, entweder davor oder danach.
CMD:edoor(playerid,params[])
{
static bool:status;
if(!status)
{
//Objekte erstellen
}
else
{
for(new i=0; i<sizeof(gObj); i++)
{
if(gObj[i] != -1) DestroyObject(gObj[i]);
gObj[i] = -1;
}
}
status = !status;
return 1;
}
CMD:deletetest(playerid,params[])
{
for(new i=0; i<sizeof(gObj); i++) DestroyObject(gObj[i]);
}
Bzw, besser ist es so:
CMD:deletetest(playerid,params[])
{
for(new i=0; i<sizeof(gObj); i++)
{
if(gObj[i] != -1) DestroyObject(gObj[i]);
gObj[i] = -1;
}
}
Und bei der Deklaration:
new gObj[2] = {-1,...};
Das verhindert Fehler.
new tmpobjid;
Das ist eine temporäre Variable, auf die du nur Zugriff hast, während der Befehl ausgeführt wird. Weder zuvor noch danach ist sie vorhanden.
new gObj[2];
Das schreibst du ja unter die Includes, sprich es ist global deklariert, somit hast du jederzeit Zugriff und der Wert bleibt erhalten, daher kannst du darüber das Objekt später löschen.
Schau mal:
Unter den Includes:
new PlayerText:tachoText[MAX_PLAYERS];
OnPlayerConnect:
tachoText[playerid] = CreatePlayerTextDraw(playerid, 320.0, 240.0, "Tacho");
//Hier noch Farbe etc...
Und im Timer:
PlayerTextDrawSetString(i, tachoText[i], string);
PlayerTextDrawShow(i, tachoText[i]);
Bei OnPlayerDisconnect löschst du das Textdraw wieder:
PlayerTextDrawDestroy(i, tachoText[i]);
Ich weiß nicht wie die Codes heißen bei dir.
Suche einfach in allen nach:
ZitatYou are not an admin