for(new e;e<=sizeof Building;e++)
Das ist falsch.
Schreib das mal:
for(new e;e<sizeof Building;e++)
Und setz mal unter Zeile 14 ein return 1; sonst läuft der Code ja weiter ![]()
for(new e;e<=sizeof Building;e++)
Das ist falsch.
Schreib das mal:
for(new e;e<sizeof Building;e++)
Und setz mal unter Zeile 14 ein return 1; sonst läuft der Code ja weiter ![]()
Er kommt nicht soweit, nicht mal zum ersten es wird nix geprintet wie immer der selbe Fehler
Dann tritt der Fehler früher auf, wenn er da nicht mal rein geht ![]()
Das bedeutet...mehr prints und zwar früher haha ![]()
Ich hab da am Ende ein Print aber soweit kommt der erst garnicht.
Wenn ich sage..alles voller prints setzen, meine ich sicher nicht nur einen print ![]()
Sondern...überall in jede Code ebene.
Also immer vor die { was setzen um eben zu schauen, was gemacht wird.
und der string ist egal, wichtiger wäre sowas wie printf("A: %d",b); und beim Nächsten "B: %d" usw...xD
Dann pack da mal überall prints rein und schaue, was genau aufgerufen wird und welchen Wert die wichtigen Variablen haben ![]()
Kann dir morgen mal so ein System schreiben, oder direkt eine Include und es generalisieren und mal releasen.
Gerade nur keine Zeit ![]()
also ich habe 8 Biz soll ich jetzt noch 6 Dummys hinterherschicken oder wie
muss ich das verstehen?
Richtig, so dass du gleichviele Ints, wie Bizzes hast.
Sonst wie gesagt, bau es dynamisch auf, dann kannste einfach prüfen, ob das Biz schon einen Interior hat oder nicht.
FindCarByPlate
Nur mal aus Spaß, dass kann zu einer gefährlichen Funktion werden ![]()
Im worst worst case, sind 500 Spieler online und alle 9999 Autos vergeben.
Und wir wollen blöderweise eins der letzten Autos checken.
Das macht 500*9999 String Abfragen, das sind 4.999.500 ![]()
Resultat: ~930ms
Das bedeutet, dein Server würde für ne Sekunde hängen, spammt man den Befehl, wäre er quasi unspielbar und down xD
Wenn, dann solltest du direkt mit Zahlen arbeiten
(mit Zahlen sind es immer noch ~200ms)
Der Witz aber ist, dass der Code nicht einmal funktioniert. Denn wenn der Spieler, dem das Kennzeichen gehört nicht online ist, kann das Auto nicht zugeordnet werden.
Es wäre hier viel effizienter einen einfachen MySQL Query zu nutzen, mit dem du prüfst, zu wem das eindeutige Kennzeichen gehört ![]()
10.000 eindeutig zufällige Zahlen effizient zu generieren, die sich nicht wiederholen, ist gar nicht mal so trivial in Pawn.
Mir fällt mir ein, entweder y_iterate zu nutzen, oder besser ein eigenes System zu entwickeln.
Sprich du hast eine Datenbank mit 10.000 Einträgen. Dann wählst du random(n) (wo n die Anzahl der Einträge in der Datenbank ist) aus und löschst diese.
Dann bist du kannst du dir immer sicher sein, dass das eindeutig ist, und das super effizient.
Das was ich geschrieben habe nach oben, da wo bInfo auch schon vorher war.
Schreibs mal so:
enum bizinteriors{
Name[35],
Interior,
Welt,
Biztype,
Float:IX,Float:IY,Float:IZ// Exit Position
}
static const BizInts[][bizinteriors]={
{"Dummy",0,0,0,0.0,0.0,0.0},
{"24/7",17,1,1,/*InteriorPos*/-25.884498,-185.868988,1003.546873}
};
enum bizinfo{
db_bid,
biztype,
biztype2,
bwaren,
bbesitzer[24],
bbizkasse,
beintritt,
Float:bX,
Float:bY,
Float:bZ,
bInterior,
bopentime,
bmaxwaren,
bizbefehl
};
//weiter unten
new bInfo[sizeof(BizInts)][bizinfo];
Alles anzeigen
Das zwingt dich, dass jedes Biz, jetzt einen Interior benötigt, den du angeben musst, wenn dir das "anfangs" lieber ist..wieso auch immer ![]()
Und wie gesagt, lösche MAX_BIZ. (Vorerst. Wenn du dynamische Interiors verwendest, kannst es ja wieder einführen. Wobei es nicht nötig ist, da du ja sizeof überall verwendest und sich das dadurch dynamisch anpasst, wenn du die größe von dem Array ändert).
Jetzt ist es auch egal, ob du sizeof(bInfo) oder sizeof(BizInts) verwendest, da die den gleichen Wert haben ![]()
Okay, der Erste Beitrag mit den Buildings hat mich super verwirrt...das hat ja nichts mit dem zu tun, was du gerade machst. Sowas kannst du also weglassen, das verwirrt nur.
In meinen Augen, macht es überhaupt keinen Sinn, die Biz Positionen dynamisch in MySQL zu speichern, wohingegen du die Interiors zu den Bizzes statisch lädst.
Was macht das für einen Sinn?
Wäre es nicht sinniger, das alles dynamisch laden zu lassen?
Sonst kannst du direkt auch die Bizzes statisch laden lassen xD
Wenn du keinen Dummy dann nutzt:
if(bInfo[bizid][db_bid]==0)continue;
Diese Zeile macht dann keinen Sinn mehr.
PS: Strings deklariert man immer außerhalb von Schleifen.
Der Fehler entsteht offensichtlich, weil du mehr dynamische Bizzes hast, als statische Interiors angegeben.
Das ist dein Fehler. Also machst du beides dynamisch, löst das quasi all deine Probleme und macht dein System um einiges sauberer.
Was soll ich jetzt machen ich kann da doch nicht sizeof(BizInts) hinschreiben.
Doooch kannst du, du schaffst das ![]()
Vertrau mir ![]()
//Edit: bzw verwende mal überall sizeof(bInfo) Denn eigentlich greifst du ja überall darauf nur zu
Wieso hast du so viele Variablen?!?! Eigentlich reicht eine ![]()
Ich habe extra die 0 nie besetzt weil es ja wie du es schon sagst zu Komplikationen führt.
Doch kannst du, wenn du überall das sizeof verwendest, kommt es zu keinen Komplikationen.
Erstmal 2 Fragen:
MAX_BIZ stimmt nicht mit sizeof(BizInts) überein.
Lösche am besten MAX_BIZ und verwende überall nur sizeof(BizInts) ![]()
Der Fehler bedeutet:
Du hast ein Array:
new test[] = "Halt";
[0] = 'H'
[1] = 'a'
[2] = 'l'
[3] = 't'
Versuchst du jetzt auf index 4 zuzugreifen, bekommst du einen Fehler, da dieser ja nicht zugänglich ist, obwohl die Variable 4 Einträge hat.
Das liegt nun mal daran, dass der index bei 0 beginnt ![]()
Das Problem ist, dass das alles überschrieben wird, falls noch ein Spieler stirbt.
Das kann man elegant lösen, sogar ohne globale Variablen:
//Hoffe da ist ein Check, dass killerid != INVALID_PLAYER_ID
new Float:xv,Float:yv,Float:zv,totstring[MAX_PLAYER_NAME*2+17],vWorld,pickup,Text3D:totsign;
sInfo[killerid][kills]++;
GetPlayerPos(playerid,xv,yv,zv);
vWorld = GetPlayerVirtualWorld(playerid);
format(totstring,sizeof(totstring),"† %s †\n~\n Mörder: %s",getPlayerName(playerid),getPlayerName(killerid));
pickup = CreatePickup(1254,1,xv,yv,zv,vWorld);
totsign = Create3DTextLabel(totstring,Blutrot,xv,yv,zv,10,vWorld,1);
SetTimerEx("totVanish",60000,false,"ii",pickup,_:totsign);
//Und dann der public
forward totVanish(pickup,totsign);
public totVanish(pickup,totsign)
{
DestroyPickup(pickupid);
Delete3DTextLabel(Text3D:totsign);
return 1;
}
Alles anzeigen
Jo ich versuch gerade zu finden wo OnGameModeExit definiert ist oder Rcon Command "exit" aber ich finde nur die natives und nicht die funktion, weißt du wo die sind?
Ich habe keine Ahnung, was du suchst.
This callback is called when a gamemode ends, either through 'gmx', the server being shut down, or [wiki]GameModeExit[/wiki].
This callback will NOT be called if the server crashes or the process is killed by other means, such as using the Linux kill command or pressing the close-button on the Windows console.
Ich empfehle dir einen eigenen restart befehl, wo du alles speicherst und danach dann den Server neustartest ![]()
oder kann ich IsPlayerAdmin lassen für Adminbefehle? (Kein RCON)
Ich verstehe die Frage nicht? IsPlayerAdmin ist nur für RCON Admins.
Wenn du möchtest, dass sich ein RCON Admin Admin Befehle ausführen darf, dann kannst du es drinnen lassen, das liegt doch an dir ![]()
iPAA(playerid)
Hier fehlt der Rang. Du müsstest z.B. iPAA(playerid, 4) schreiben.
Allerdings fragst du ja zusätzlich immer das Admin Level ab..machst du ja direkt neben iPAA...
2x abfragen brauchst du es nicht ![]()
Zeile 2 natürlich löschen...
Dafür gibt es ja Zeile 4...
Deine Variante sagt wieder tag mismatch
Ist das etwa ein bool?
Dann schreib es so:
So habe ich es versucht da kommt tag missmatch.
Wenn dann so:
stock SendAdminMessage(color, message[])
{
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(SD[i][pEingeloggt] == 1 && (SpielerDaten[i][pAdmin] > 0 || IPA(i))) SendClientMessage(i, color, message);
}
return 1;
}
Will irgendwie nicht.
Das hilft mir relativ wenig...was passiert denn?!
edit: IsPlayerAdmin ist nur eine Abfrage ob man RCON Admin ist?
Korrekt: [wiki]IsPlayerAdmin[/wiki] Check if a player is logged in as an RCON admin.
Ich meine übrigens das au Zeile 26.
Achso, dann schreibe das so:
format(string,sizeof(string), GARN(pID));
SD[pID][pAdmin] = adminid;
format(string, sizeof(string), "Du hast %s %s den Teamrang %s gegeben", string,SD[pID][pName], GARN(pID));
SCM(playerid, BLAU, string);
SendAdminMessage klappt immer noch nicht. Ich habs auch mit deinem Vorschlag probiert.
Das ist seeehr merkwürdig ![]()
Bist du denn sicher, dass Eingeloggt[i] auf 1 ist und du das damit machst und nicht mit SD[playerid][pEingeloggt]?
Diese Nachriht bekomt dann doch auch der der den anderen zum Admin macht oder?
In deinem Fall, ja, da du ihn zum Admin machst und dann SAM aufrufst.
das wenn ich zb nen Spieler n Teamrang gebe da steht Spieler xy wurde von yz zum Supporter ernannt
Das machst du doch?! Das steht doch in Zeile 28.
jedoch will endAdminMesage immer noch nicht
Ich sagte ja schon dein Code ist korrekt.
Das einzige was du evtl nicht berücksichtigt hast ist, dass der RCON Admin keine Nachrichten bekommt.
Soll dieser auch die Nachrichten bekommen? Wenn ja, schreib die Funktion so: