Weiterhin empfehle ich dir abzufragen ob die strings (NULL) sind, da das Resultat auch 0 wäre und so Fehler entstehen könnten
Können Sie in diesem Fall nicht sein, da sscanf das ja gerade prüft, dass diese nicht NULL sind ![]()
Weiterhin empfehle ich dir abzufragen ob die strings (NULL) sind, da das Resultat auch 0 wäre und so Fehler entstehen könnten
Können Sie in diesem Fall nicht sein, da sscanf das ja gerade prüft, dass diese nicht NULL sind ![]()
Wenn 2 string gleich sind, erfährst du es mit: !strcmp
kriege ich die Meldung dass dieser Befehl nicht existiert
Das liegt daran, dass am Ende return 0; steht.
ocmd:enter(playerid, params[])
{
for(new x; x<sizeof(fmInfo); x++)
{
if(!fmInfo[x][fff_id] || fmInfo[x][fhi_x]==0.0 || !IsPlayerInRangeOfPoint(playerid,2,fmInfo[x][fhx],fmInfo[x][fhy],fmInfo[x][fhz]))continue;
SetPlayerPos(playerid,fmInfo[x][fhi_x],fmInfo[x][fhi_y],fmInfo[x][fhi_z]);
SetPlayerInterior(playerid,fmInfo[x][ff_Interior]);
SetPlayerVirtualWorld(playerid,x);
return 1;
}
for(new i; i<sizeof(sbInfo); i++)
{
if(!IsPlayerInRangeOfPoint(playerid, 5.0, sbInfo[i][sbx], sbInfo[i][sby], sbInfo[i][sbz])) continue;
SetPlayerInterior(playerid, sbInfo[i][sbint]);
SetPlayerPos(playerid, sbInfo[i][isbx], sbInfo[i][isby], sbInfo[i][isbz]);
SetPlayerVirtualWorld(playerid, i);
return 1;
}
for(new e; e<sizeof(hInfo); e++)
{
if(!hInfo[e][h_id] || hInfo[e][ih_x]==0.0 || !IsPlayerInRangeOfPoint(playerid,2,hInfo[e][h_x],hInfo[e][h_y],hInfo[e][h_z])) continue;
SetPlayerPos(playerid,hInfo[e][ih_x],hInfo[e][ih_y],hInfo[e][ih_z]);
SetPlayerInterior(playerid,hInfo[e][h_interior]);
SetPlayerVirtualWorld(playerid,e);
return 1;
}
for(new u; u<sizeof(bInfo); u++)
{
if(!bInfo[u][b_id]||bInfo[u][ibx]==0.0||!IsPlayerInRangeOfPoint(playerid,2,bInfo[u][bx],bInfo[u][by],bInfo[u][bz]))continue;
SetPlayerPos(playerid,bInfo[u][ibx],bInfo[u][iby],bInfo[u][ibz]);
SetPlayerInterior(playerid,bInfo[u][b_interior]);
SetPlayerVirtualWorld(playerid,u);
return 1;
}
return SendClientMessage(playerid,-1,"* Sie befinden sich an keinem Eingang!");
}
ocmd:exit(playerid, params[])
{
for(new x; x<sizeof(fmInfo); x++)
{
if(GetPlayerVirtualWorld(playerid)!=x || !IsPlayerInRangeOfPoint(playerid,2,fmInfo[x][fhi_x],fmInfo[x][fhi_y],fmInfo[x][fhi_z]))continue;
SetPlayerPos(playerid, fmInfo[x][fhx], fmInfo[x][fhy], fmInfo[x][fhz]);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);
return 1;
}
if(GetPlayerInterior(playerid) != 0)
{
for(new i; i<sizeof(sbInfo); i++)
{
if(!IsPlayerInRangeOfPoint(playerid, 5.0, sbInfo[i][isbx], sbInfo[i][isby], sbInfo[i][isbz])) continue;
SetPlayerInterior(playerid, 0);
SetPlayerPos(playerid, sbInfo[i][sbx], sbInfo[i][sby], sbInfo[i][sbz]);
SetPlayerVirtualWorld(playerid, 0);
return 1;
}
}
for(new e; e<sizeof(hInfo); e++)
{
if(GetPlayerVirtualWorld(playerid)!=e || !IsPlayerInRangeOfPoint(playerid,2,hInfo[e][ih_x],hInfo[e][ih_y],hInfo[e][ih_z]))continue;
SetPlayerPos(playerid, hInfo[e][h_x], hInfo[e][h_y], hInfo[e][h_z]);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);
return 1;
}
for(new u; u<sizeof(bInfo); u++)
{
if(GetPlayerVirtualWorld(playerid)!=u || !IsPlayerInRangeOfPoint(playerid,2,bInfo[u][ibx],bInfo[u][iby],bInfo[u][ibz]))continue;
SetPlayerPos(playerid, bInfo[u][bx], bInfo[u][by], bInfo[u][bz]);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);
return 1;
}
if(IsPlayerInRangeOfPoint(playerid, 5.0, 866.91089, 1857.31665, -30.40188))//Stadthallen Exit
{
SetPlayerPos(playerid, 1481.0325,-1772.2615,18.7958);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);
return 1;
}
return SendClientMessage(playerid,-1,"* Sie befinden sich an keinem Exit Punkt!");
}
Alles anzeigen
Probiers mal so ![]()
PS: Du kannst in den Schleifen auch die Variablen alle gleich nennen (nur so als Tipp) ist n bisschen übersichtlicher ![]()
Stimmt jetzt nicht so ganz da man theoretisch Pakete an den Server senden kann mit denen man hupt
...klar...man kann so einiges. Kann auch eine Bot Armada draufpacken und alle hupen lassen, damit die Tore aufgehen, Mensch jetzt hab ichs dem Server aber gezeigt ![]()
Zumal man auch durch das package sagen könnte, dass man online ist...
In der 0.1 Version gab es auch mal einen Bug, dass gekickte Spieler immer noch Commands eingeben konnten haha ![]()
Aber sind wir mal realistisch und bleiben bei normalem Code Flow.
Hmm ka was Schuld ist aber es klappt nicht Pfffff
Ja, wir haben es verstanden. Es geht darum, dass du diese print Statements setzt und es herausfindest.
Dann printe dir mal deine Position und die, die du eingegeben hast und vergleiche diese.
Bzw checke ob OnPlayerCommandText aufgerufen wird
Irgendwo muss ja der Fehler sein
Das meinte ich...
Du hast nichts von dem gemacht...was ich gerade geschrieben habe.
Wie soll ich dir jetzt helfen? ![]()
Dann printe dir mal deine Position und die, die du eingegeben hast und vergleiche diese.
Bzw checke ob OnPlayerCommandText aufgerufen wird ![]()
Irgendwo muss ja der Fehler sein ![]()
aber es klappt trotzdem net das Tor geht nicht auf
Dir ist klar, dass du diese X, Y und Z Koordinaten auch mit echten Koordinaten ersetzen musst?
So macht dein Code mehr Sinn:
//Pack das mal ganz nach oben
if(PlayerInfo[playerid][pTot] == 1) return SendClientMessage(playerid, COLOR_GREY, "Tote können keine Befehle nutzen!");
if(newkeys & KEY_CTRL_BACK)
{
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER))
{
if(IsPlayerInRangeOfPoint(playerid,10.0, X, Y, Z)) OnPlayerCommandText(playerid,"/gate");
else if(IsPlayerInRangeOfPoint(playerid,10.0, X, Y, Z)) OnPlayerCommandText(playerid,"/gate2");
}
else OnPlayerCommandText(playerid, "/enter");
}
Alles anzeigen
IsPlayerConnected ist da komplett überflüssig, da der Spieler ja online sein muss..um zu hupen...wird für offline Spieler eher schwierig haha xD
Und dann ein else if darauf anzuwenden..macht auch keinen Sinn...
Achte mehr auf Code-Logik ![]()
Weil es zu einem Fehler kommt und zwar geht die Schleife MAX_PLAYERS durch und nicht bis zum maximalen PizzaTextdraw.
Und da sprengt das natürlich das Array.
Aber lass mich dir noch weitere Dinge empfehlen:
Die Schleife also einfach so schreiben:
PS: Sehr schöner Post! Guter Debug, gefällt mir! ![]()
Hier mal ein Beispiel ![]()
//Oben im Skript
new lastHotDog[MAX_PLAYERS];
//Im Command ganz oben:
if(lastHotDog[playerid] > gettime()) return SendClientMessage(playeird, -1, "* Sie können den Befehl noch nicht wieder verwenden!");
//Im Command wenn er etwas bekommt:
lastHotDog[playerid] = gettime()+10; //Nur alle 10 Sekunden
Da du ja Dinge ausgibst bzw Clientseitig machst, kann der Header nicht nachträglich irgendwie noch darein geschoben werden.
Nutze eine Clientseitige Weiterleitung wie z.B.:
Die 15 steht für die Sekunden, wie lange gewartet werden soll.
Das kommt darauf an, was du vor hast.
Google mal nach Taxi System, da kommen ganz viele schon.
Daran kannst du dich orientieren und tutorials zu NPCs gibts auch massig.
Vor 6 Jahren hatte ich da mal ein System zu geschrieben sogar hahaha ![]()
Wie die Zeit vergeht ![]()
Ist es Möglich das ein Actor als "Taxifahrer" umfährt den man per Anruf rufen kann?
Nein, Actor kann man leider nicht in ein Fahrzeug setzen ![]()
Sowas wäre aber mit NPCs möglich ![]()
Wie füge ich das richtig ein?? @Kaliber
Lies nochmal meinen Text...
ich habe nirgends etwas von einer Gang Abfrage geschrieben...wieso schickst du mir das?! ![]()
OnPlayerDeath überlist es die Gang/Mafia Mitglieder
2 Möglichkeiten:
Da du ja schon crashdetect geladen hast, zeig uns mal den server.log, da steht eine genauere Fehlerbeschreibung drinnen ![]()
Also es gibt hier viele Möglichkeiten das zu realisieren, aber mal hier eine ganz simple:
Und ich hab das mal mit Tab-Headers gemacht den Dialog, das finde ich schöner (Aber kannst auch nur DIALOG_LIST verwenden, das macht für den Code keinen Unterschied) ![]()
if(dialogid == 73)
{
if(!response) return 1;
if(listitem == 0)
{
new str[18*13] = "Waffenname\tSchuss",tmp[16],c;
for(new i,w,a; i < 13; i++)
{
GetPlayerWeaponData(playerid, i, w, a);
if(w > 0 && a > 0)
{
format(str, sizeof(str), "%s\n%s\t%d", str, WaffenNamen[w], a);
}
}
ShowPlayerDialog(playerid, 74, DIALOG_STYLE_TABLIST_HEADERS, "Waffen", str, "Auswählen", "Beenden");
return 1;
}
return 1;
}
if(dialogid == 74)
{
if(!response) return 1;
for(new i,w,a,c; i<13; i++)
{
GetPlayerWeaponData(playerid, i, w, a);
if(w > 0 && a > 0 && c++==listitem)
{
//Das ist die Waffe, die er ausgewählt hat
GivePlayerWeapon(playerid,w,a);
break;
}
}
return 1;
}
Alles anzeigen
Hier noch wenn du es hören magst ein kleiner Optimierungsvorschlag, die dialogid nicht mit if prüfen. Da der ja dann 74 if-Abfragen erstmal durchgehen muss, bis der zu deinem Dialog kommt und je mehr du noch machst, desto länger dauert das. Da 74 eine Konstante ist, kannst du hier mit switch arbeiten, was du unbedingt tun solltest, da das eine jumptable ist und der Code dann direkt dahin springt. Dann hast du nicht O(x), sondern O(1) und das ist natürlich wesentlich besser ![]()
O-Notation: https://de.wikipedia.org/wiki/…le#Beispiele_und_Notation
ob ich das Ganze hier jetzt richtig verstanden habe, aber müsste denke ich so gehen
Das ist so aus mehreren Gründen falsch:
Das Thema war (hoffentlich) schon erledigt, hatte ihm das eigentlich versucht ausführlich zu erklären in mehreren Posts.
Achso, dann geht auf deren Servern die Uhr falsch.
3 Möglichkeiten das jetzt zu beheben: