Ja, stimmt ja alles.
Er hat 250k abgeladen, das bedeutet, in der Frak[1][frakEisen] das war leer.
Anscheinend hast du da einen Fehler beim Laden ![]()
printe dir das mal, bevor du da was einlädst.
bzw zeig mal wie du es lädst ![]()
Ja, stimmt ja alles.
Er hat 250k abgeladen, das bedeutet, in der Frak[1][frakEisen] das war leer.
Anscheinend hast du da einen Fehler beim Laden ![]()
printe dir das mal, bevor du da was einlädst.
bzw zeig mal wie du es lädst ![]()
Hab es soweit angepasst.
Nein, du hast vergessen beim else Vehicle[vehicleid][vehMats] = 0; zu setzen..so wie in meinem Code.
Aber wen die Fraktion nur 5.000 brauchen liefert er trotzdem 25k ab?
Bist du dir denn sicher, dass nur 5k gebraucht werden?
Printe dir doch mal gebraucht und schau, welcher Wert da berechnet wird.
Und ich hoffe dir ist klar, dass du angegeben hast, dass in das Lager 250k passen.
einfach nur hinfahren und die menge was das biz braucht abladen. Wen zuviel geladen ist bleibt der Rest bzw sollte es bleiben. Schließlich bezahlt man dafür so gesehn.
Dann musst du das berechnen.
new gebraucht = 250000-Frak[1][frakEisen]; //Das ist der Wert der benötigt wird, zur vollen Menge
if(Vehicle[vehicleid][vehMats] > gebraucht)
{
//Wenn er mehr dabei hat, als gebraucht wird
Vehicle[vehicleid][vehMats] -= gebraucht;
Frak[1][frakEisen] += gebraucht;
}
else
{
//Wenn er weniger dabei hat
Vehicle[vehicleid][vehMats] = 0;
Frak[1][frakEisen] += Vehicle[vehicleid][vehMats];
}
Alles anzeigen
Vehicle[vehicleid][vehMats] -= Vehicle[vehicleid][vehMats];
Also da steht ja quasi x -= x;
Eine äquivalente andere Schreibweise wäre x = x-x
Daraus resultiert logischerweise x=0 was du da machst.
Hinfahren Materialien abladen heißt wen ich 5000 Materialien ablade sind so gesehn wen ich 30.000 geladen habe
Wie willst du denn 5000 abladen, wenn du gar keinen Parameter angibst.
Vehicle[vehicleid][vehMats] -= Vehicle[vehicleid][vehMats];
Was glaubst du, macht diese Zeile? ![]()
Aber das Problem ist wen ich es ablade werden z.b die 30k Mats ersetzt mit den was ich abgeladen habe?
Was genau..willst du uns damit sagen?
Wen ja der fehler bleibt gleich :o
Dann printe dir doch mal, was er ausgibt in der Konsole...
new veh = GetPlayerVehicleID(playerid);
new trailer = GetVehicleTrailer(veh);
new model = GetVehicleModel(trailer);
printf("veh: %d | trailer: %d | model: %d",veh,trailer,model);
Was sagt er denn dann? ![]()
den Trailer mit der ID 435 angehängt
In diesem Fall müsste die vehicleid 435 sein.
Du willst aber bestimmt, dass die modelid 435 ist ![]()
Also häng ein GetVehicleModel noch drum herum ![]()
kann ich es auch so machen?
Nein.
Entweder das Gegenteil:
new Fraktion[MAX_FRAKTIONEN+1][FraktionDaten];
oder wirklich so, wie ich es geschrieben habe mit dem -1 ![]()
hoffe jemand kann mir helfen
Du machst es dir viel zu kompliziert, schreib es einfach nur so:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_JUMP) && !IsPlayerInAnyVehicle(playerid) && GetPlayerSpeed(playerid) > 20)
{
ClearAnimations(playerid);
ApplyAnimation(playerid,"ped","FALL_land",4.1,0,0,0,0,0,1);
}
return 1;
}
stock GetPlayerSpeed(playerid)
{
new Float:x,Float:y,Float:z;
GetPlayerVelocity(playerid,x,y,z);
return floatround(VectorSize(x,y,z)*170.0);
}
Alles anzeigen
#define MAX_FRAKTIONEN 1
Okay, alles klar ![]()
Das Problem ist du hast einen index.
Also schauen wir uns das mal an:
new x[1];
x[0] = 5; //Das ist kein Problem, denn ein Array fängt bei 0 an
x[1] = 3; //Das geht nicht...weil wir nur 1nen Index zur Verfügung haben und zwar die 0
Du versuchst aber, genau das untere auf x[1] zuzugreifen.
Die Lösung ist ganz einfach, du musst entweder überall Fraktion[f_ID-1] verwenden oder direkt nur 0 als Fraktion eingeben, da sich das ja auf den Index bezieht ![]()
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 ![]()