MAX_FRAKTIONEN
...und wiie ist das definiert?
MAX_FRAKTIONEN
...und wiie ist das definiert?
[19:33:16] [debug] Run time error 4: "Array index out of bounds"
[19:33:16] [debug] Attempted to read/write array element at index 1 in array of size 1
Da, das ist dein Fehler
Wie hast du denn Fraktion deklariert?
Ich komm auf den Fehler nicht ich änder das die ganze zeit und die fehler beleiben..
Dann schreib es doch mal ordentlich
Oder lager es aus.
Hinzufüge kann der Compeiler den Code nicht compeilen warum? bzw reagiert er nicht mehr
Vermutlich weil die Zeile zu lang ist.
Aber lager das doch aus:
ocmd@2:f,family(playerid,params[])
{
if(!IsLoggedIn(playerid)) return 1;
new string[128];
if(!params[0] || params[0] == '\1') return SCM(playerid, COLOR_WHITE, "{247BA6}* Benutze: {00CC00}(/f)amily [Nachricht]");
if(Spieler[playerid][pMuted] > 0) return SCM(playerid, COLOR_WHITE, "{AFAFAF}Du wurdest stummgeschaltet.");
if(!CheckFrakForFChat(playerid)) return SCM(playerid, COLOR_WHITE, ERROR_FRAKTION);
format(string ,sizeof(string), "{33CCFF}** (( %s %s: %s )) **", GetRankName(Spieler[playerid][pFraktion], Spieler[playerid][pRank]), GetName(playerid), params);
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(IsLoggedIn(i) && Spieler[i][pFraktion] == Spieler[playerid][pFraktion]) SCM(i, COLOR_WHITE, string);
}
return 1;
}
//Entweder so:
stock CheckFrakForFChat(playerid)
{
return (7 <= Spieler[playerid][pFraktion] <= 17);
}
//Oder so:
stock CheckFrakForFChat(playerid)
{
switch(Spieler[playerid][pFraktion])
{
case 7..17: return 1;
}
return 0;
}
Alles anzeigen
Warum kommt bei /makeleader 0 1 dass der Befehl nicht existiert?
Das kommt vermutlich, weil ein RuneTime Error aufgetreten ist.
Um diesen angezeigt zu bekommen und mehr Infos dazu zu erhalten, nutze crashdetect.
Dann wird dir im Log genau angezeigt, wo der Fehler ist
Schreib es lieber so, das ist effizienter:
@AFK_CHECK();@AFK_CHECK() {
for(new i=GetPlayerPoolSize(),string[128]; i!=-1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i) || !AFK_SYS[i] || (gettime()-AFK_SYS[i]) < 120) continue;
GetPlayerName(i, string, sizeof(string));
format(string,sizeof(string),"SERVER: %s (%d) has been kicked due to inactivity",string,i);
SendClientMessageToAll(-1,string);
Kick(i), AFK_SYS[i] = 0;
}
return 1;
}
Alles anzeigen
1. Dieses @ ist quasi nur forward und public.
2. Das ist nur eine Schleife, die durch alle Spieler iteriert und prüft, ob ein Spieler länger als 120 Sekunden inaktiv war
Hier mal eine Möglichkeit:
//Oben im Skript
new AFK_SYS[MAX_PLAYERS];
//Unter OnPlayerUpdate
AFK_SYS[playerid] = gettime();
//Unter OnGameModeInit
SetTimer("@AFK_CHECK",9973,1);
//Dann iwo
@AFK_CHECK();@AFK_CHECK() {
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i) || !AFK_SYS[i] || (gettime()-AFK_SYS[i]) < 120) continue;
Kick(i); //i = playerid die 2min (120 Sekunden) AFK war
AFK_SYS[i] = 0;
}
return 1;
}
Alles anzeigen
Kennt jemand ein vernuenftiges AFK System?
...gibt soooviele AFK Systeme Hast du schon mal gegoogelt?
Was für Features willst du denn genau haben?
Das kann an vielem liegen.
Bist du sicher, dass es kein Klammerfehler ist?
Weder ein { noch ein (.
Hast du OP-Code wie #emit in deinem Skript?
Kann auch an ungültigen defines liegen...
Ein trick wäre..erstmal ganz viel auszukommentieren und es empfiehlt sich generell immer ein Backup zu haben
Ich nutze für sowas mehreren Lappis.
Nur als Tipp.
es reicht auch ein sandbox tool oder eine vm.
Dann kann man samp 2x starten
Wie kann ich das machen das ich den Rang in einer der 4 Veralter Spalten setze und wenn zb in der ersten Spalte er den Rang 4 schon hat dass ich diesen in keienr anderen vergeben kann?
z.B. so:
#define MAX_VERWALTER 4
#define ExistVerwalter(%0) (Verwalter[%0][0]!=EOS)
new Verwalter[MAX_VERWALTER][MAX_PLAYER_NAME];
new id;
if(ExistVerwalter(id)) return SCM(playerid,-1,"Ein verwalter existiert bereits!");
format(Verwalter[id],MAX_PLAYER_NAME, GetName(pID)); //Setzt den Verwalter
Alles anzeigen
Ist das eventuell zu aufwaendig umzusetzen?
Kannst es so machen:
FinishedGame()
{
new scoreTable[MAX_PLAYERS][2], idx, counter;
for(new i = GetPlayerPoolSize(); i!=-1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
scoreTable[i][0] = playerdataInfo[i][pKills];
scoreTable[i][1] = i;
counter++;
}
SortDeepArray(scoreTable, 0, .order = SORT_DESC);
new scorestring[512], minutes,seconds;
minutes = totaltime / 60;
seconds = seconds % 60;
format(scorestring,sizeof(scorestring),"Duration of the game: %d:%d",minutes,seconds);
for(new i,pID; i<counter; i++)
{
pID = scoreTable[i][1];
format(scorestring,sizeof(scorestring),"%s\n%d. Place: %d",scorestring,(i+1),playerdataInfo[pID][pKills]);
}
ShowPlayerDialog(playerid, 1234, DIALOG_STYLE_MSGBOX, "Scoreboard",scorestring, "", "");
SetTimer("GMX",15000,false);
return 1;
}
Alles anzeigen
//edit2: Habe gerade mal eine andere strcpy Funktion direkt im Script implementiert, aber auch dann schmiert der Compiler ab. Wird vielleicht irgendwas aus den YSI Bibliotheken genutzt was ich nicht weiss?
Check dein Skript evtl mal auf Klammerfehler.
Ansonsten kann es gut sein, dass ysi Probleme macht, bin mir grad gar nicht sicher, ob du dafür inzwischen schon den Zeex Compiler verwenden musst...
Probiere sie mal als new stock zu deklarieren
Du kannst das so schreiben:
stock CountTeams()
{
new count;
for(new i; i<TEAMSIZE; i++) if(GetTeamPlayerCount(i) > 0) count++;
return count;
}
stock TeamsAlive(bool:value)
{
if(CountTeams() != 1) return 1;
static const teams[][] = {
FIRST_TEAM_COLOR_TAG,
SECOND_TEAM_COLOR_TAG,
THIRD_TEAM_COLOR_TAG,
FOURTH_TEAM_COLOR_TAG,
FIFTH_TEAM_COLOR_TAG,
SIXTH_TEAM_COLOR_TAG
};
new string[128];
format(string,sizeof(string),"SERVER: All remaining teams have been wiped. Team %s {FFFFFF}has won the game!",teams[TeamsAlive(true)]);
for(new i=GetPlayerPoolSize(); i!=-1; i--)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
SendClientMessage(i,-1,string),
printf(string),
ResetPlayerData(i);
}
FinishedGame();
return i;
}
Alles anzeigen
Weiß nicht, was du mit der value als Parameter vor hast.
Es ist besser vor der Schleife einmal den String zu formatieren, ansonsten wird er bei jedem durchlauf formatiert, das ist ja ineffizient.
TeamsAlive(true) gibt hoffentlich 0 als ersten Index zurück
Mit einem Objekt Editor kann man das auch ganz einfach machen.
Man brauch ja immer nur bestimmte Punkte
Ah.. okay, also wäre es dann im Prinzip egal welchen Wert ich aus dem Array zur Initialisierung wähle?
Naja, theoretisch, aber der Wert aus dem 0ten Index bietet sich ja an, weil du dann die Schleife einfach ab 1 starten lassen kannst.
Alle anderen Werte bieten sich nicht so an, könntest natürlich auch den letzten Wert nehmen und die Schleife rückwärts laufen lassen...
Wieso nimmst du denn in der diff minus des ersten Wertes sprich
Damit ich direkt einen sinnvollen Initialisierungswert habe.
Sonst könnte mein Wert ja das Ergebnis verfälschen und so ist man sicher, dass der Median auch in dem Array ist und nicht der Startwert.
habe das jetzt so gelöst, zumindest funktioniert das bei mir:
In der Aufgabe steht, man darf das Array nicht sortieren
Das klingt nach einer interessanten Aufgabe
Also ich hätte eine Idee wie man es machen kann, ob das die Beste ist, sei mal dahin gestellt.
Du kannst einfach alle Werte aus dem Array summieren.
So danach berechnest du den Mittelwert:
So und jetzt prüfst du einfach, welches Element am nähsten dran ist:
die ID 174. Beim erneuten Ausführen (weiteres Fahrzeug wird hinzugefügt) würde man ja wieder auf die 174 kommen.
Das ist ja der Witz an seiner Tabelle, egal wie er da was hinzufügt, alle anderen Zahlen darunter müssen sich natürlich um 1 erhöhen.
Dadurch wurde eben nicht 174 wieder rauskommen, sondern 175.
Eigene Tabelle für jedes Land habe ich auch dem Entwickler gesagt jedoch findet er es zu viel arbeit und wäre zu aufwendig in C#, jedoch bin ich erst seit kurzem im Entwickler-Team und bin halt für die Website und Datenbank zuständig, somit auch für die neuen Fahrzeuge eintragen, also eigene Länder war auch mein Plan, jedoch wollte er es halt nicht.
Dann frage ihn doch, wie er sich das vorstellt, mit dem hinzufügen von Autos
Wie wurde es denn bisher gemacht, das kannst du doch dann einfach ermitteln
Du hast n Array mit den Namen. ("Schweiz", "Niederlande", ...)
Und wenn du der Schweiz ein Auto hinzufügen willst, suchst du nach der Nummer von den Niederlanden und rechnest -1 und fügst da einfach das Auto ein.
Wobei es natürlich wesentlich sinniger gewesen wäre, für jedes Land eine eigene Tabelle anzulegen