Dieser Warning bedeutet, dass der stock zu weit unten im Script ist, füge ihn so weit wie möglich oben ein!
Beiträge von Templer
-
-
oO sehe da einige Fehler ^^, also zu deinen Problemen...
Ersetze public Tank(playerid) durch public Tank() (und beim forward bitte auch ändern...).
Deinen SetTimer Funktion bitte aus OnPlayerEnterVehicle rauslöschen und bei OnGameModeInit einfügen.
Den Tank Befehl mit meinem ersetzen...
dcmd_tanken(playerid,params[])
{
#pragma unused params
new playerState = GetPlayerState(playerid);
if (playerState == PLAYER_STATE_DRIVER)
{
for(new i=0;i<sizeof(Tankstellen);i++)
{
if(IsPlayerInRangeOfPoint(playerid,15.0,Tankstellen[i][0],Tankstellen[i][1],Tankstellen[i][2]))
{
new Wagen = GetPlayerVehicleID(playerid), msg[128];
new Full = 100-Tankmenge[Wagen];
new Kosten = Full*50;
format(msg, sizeof msg,"Du hast %d Liter für %d$ getankt.",Full,Kosten);
SendClientMessage(playerid,ORANGE,msg);
Tankmenge[Wagen] = 100;
return 1;
}
}
SendClientMessage(playerid,ORANGE,"Du bist nicht an der Tankstelle!");
return 1;
}
else
{
SendClientMessage(playerid,ORANGE,"Du bist in keinem Fahrzeug!");
}
return 1;
}
und zu deinem TextDraw Problem, bei TextDrawSetString kannste dir das text: rauslöschen, also muss die Zeile dann so aussehen
TextDrawSetString(tankdraw,string1);
und nicht so
TextDrawSetString(Text:tankdraw,string1);Leider sehe ich auch einen TextDraw Konflikt, also bitte schicke mir den ganzen Code wo dieses TextDrawSetString steht
//Edit: hier bitte bad company, einfach den Anweisungen folgen
//Ganz Oben im Script fügst folgende Zeilen ein...
#define TANK_ZEIT (1000) //Wert in Millisekunden, in welchen Intervallen der Tank abgezogen wird...
new Text:Tankanzeige[MAX_PLAYERS];
forward TankTimer();//Unter OnGameModeInit dies..
public OnGameModeInit()
{
SetTimer("TankTimer", TANK_ZEIT, 1);
return 1;
}//Danach unter OnPlayerKeyStateChange gehört folgendes...
public OnPlayerKeyStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
{
new tankstring[128];
format(tankstring, sizeof(tankstring), "Tank: %d", Tankmenge[GetPlayerVehicleID(playerid)]);
Tankanzeige[playerid] = TextDrawCreate(518, 431, tankstring);
TextDrawFont(Tankanzeige[playerid], 3);
TextDrawLetterSize(Tankanzeige[playerid], 0.6, 1.8);
TextDrawColor(Tankanzeige[playerid], 0xCCCCCCFF);
TextDrawSetOutline(Tankanzeige[playerid], 2);
TextDrawShowForPlayer(playerid, Tankanzeige[playerid]);
}
if(newstate == PLAYER_STATE_ONFOOT) TextDrawDestroy(Tankanzeige[playerid]);
}//Bei OnPlayerDisconnect...
public OnPlayerDisconnect(playerid)
{
if(IsPlayerInAnyVehicle(playerid)) TextDrawDestroy(Tankanzeige[playerid]);
}//und zuletzt diese public Funktion irgendwo unten in dein Script
public TankTimer()
{
new string[128], i = 0;
for(; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
{
format(string, sizeof(string), "Tank: %d", Tankmenge[GetPlayerVehicleID(i)]);
TextDrawSetString(Tankanzeige[i], string);
}
}
return true;
} -
AI... Doch dummheitsfehler sry xD
stock Float:randfloat(Float:kleinerfloat, Float:grosserfloat) //by Templer
{
new kleinezahl = floatround(kleinerfloat, floatround_round), grossezahl = floatround(grosserfloat, floatround_round);
return floatadd(float(random(grossezahl - kleinezahl)), kleinerfloat)
} -
Ok, weißte was ich mach es dir nun ganz anders, weil so wie ich es im Pfusch geschrieben habe sowieso nur Ressourcenverschwendung ist...
Also zunächst löscht du mal diese Teile heraus aus deinem Script:
switch(newstate)
{
case PLAYER_STATE_DRIVER,PLAYER_STATE_PASSENGER: BenzinTimer[playerid] = SetTimerEx("Benzintank",2000,1,"dd",playerid,vehicleid);
case PLAYER_STATE_ONFOOT: KillTimer(BenzinTimer[playerid]);
}if(IsPlayerInAnyVehicle(playerid)) KillTimer(BenzinTimer[playerid]);
new BenzinTimer[MAX_PLAYERS];
Danach ändern wir das Tank Public um:
forward Benzintank();
public Benzintank()
{
for(new playerid = 0; playerid < MAX_PLAYERS; playerid++)
{
if(IsPlayerConnected(playerid))
{
new vehicleid = GetPlayerVehicleID(playerid);
Benzin[vehicleid] -= 1;
if(Benzin[vehicleid] == 0)
{
GameTextForPlayer(playerid,"Dein Tank ist leer",500,1);
TogglePlayerControllable(playerid,0);
}
return 1;
}
}
}und setzen dann unter OnGameModeInit folgende Zeile ein...
SetTimer("Benzintank", 2000, 1);
und Ruhe ist... xD
-
Ersetze mal bitte die beiden Sachen und teste es nochmals
public OnPlayerStateChange(playerid, newstate, oldstate)
{
switch(newstate)
{
case PLAYER_STATE_DRIVER,PLAYER_STATE_PASSENGER: BenzinTimer[playerid] = SetTimerEx("Benzintank",2000,1,"dd",playerid,vehicleid);
case PLAYER_STATE_ONFOOT: KillTimer(BenzinTimer[playerid]);
}
return 1;
}public Benzintank(vehicleid,playerid)
{
Benzin[vehicleid] -= 1;
if(Benzin[vehicleid] == 0)
{
GameTextForPlayer(playerid,"Dein Tank ist leer",500,1);
TogglePlayerControllable(playerid,0);
}
return 1;
} -
Hier bitte, extra für dich geschrieben
stock randfloat(Float:kleinerfloat, Float:grosserfloat) //by Templer
{
new kleinezahl = floatround(kleinerfloat, floatround_round), grossezahl = floatround(grosserfloat, floatround_round);
return floatadd(float(random(grossezahl - kleinezahl)), kleinerfloat)
} -
Die Zeile 92 ist deine maximale Zeilenlänge vom Script und bei dieser Zeile wird angezeigt welche globale Variablen nicht genützt werden, wie man laut Fehlermeldung sehen kann wie die Definition VehicleNames
Was ich aber schon einmal bei jemanden gesehen habe, dass du die merkwürdigsten Fehler überhaupt hast, und es immer an besonderen Fehlern liegt. Bei dem Kollegen der sowas "spinnendes" hatte, konnte keine Struktur einhalten und hat herumgeschrieben was das Zeug hielt und somit er selbst nichtmehr wusset, wo es richtig reingehört xD Bei dir kann es auch an einem Klammerfehler handeln, denn diese bekannten 26 Error müssten nicht immer sein... Nebenbei schau mal herum ob du
TextDrawSetString nicht wirklich irgendwoanders definiert hast, oder es mit dem Fehler was ich vorher beschrieben hab, zusammenhängt. -
Nein du verstehst was falsch, die Funktion KillTimer killt den Timer vollständig, auch wenn du ihn so eingestellt hast, dass er sich wiederholt!
Hier dein Beispiel mit korrekter Ausführung!
new BenzinTimer[MAX_PLAYERS];
public OnPlayerDisconnect(playerid)
{
if(IsPlayerInAnyVehicle(playerid)) KillTimer(BenzinTimer[playerid]);
}public OnPlayerStateChange(playerid, newstate, oldstate)
{
switch(newstate)
{
case PLAYER_STATE_DRIVER,PLAYER_STATE_PASSENGER: BenzinTimer[playerid] = SetTimerEx("Benzintank",2000,1,"ud",playerid,vehicleid);
case PLAYER_STATE_ONFOOT: KillTimer(BenzinTimer[playerid]);
}
return 1;
}public Benzintank(vehicleid,playerid)
{
vehicleid = GetPlayerVehicleID(playerid);
Benzin[vehicleid] -= 1;
if(Benzin[vehicleid] == 0)
{
GameTextForPlayer(playerid,"Dein Tank ist leer",500,1);
TogglePlayerControllable(playerid,0);
}
return 1;
} -
So, ich will jetzt keinen Roman vorlesen und zeige dir ein Beispiel, wie du aus einer Liste von ner Datei einen Spielernamen löschen kannst, eig ganz simple
stock LoescheSpielerAusListe(spielername[])
{
new File:testdatei = fopen("spielernamen.txt",io_readwrite), Daten[512];
if(testdatei) //Wenn das öffnen der Datei spielernamen.txt erfolgt ist
{
fread(testdatei, Daten, sizeof(Daten)); //Auslesen der Daten in der Datei in einen String, in dem Fall in 'Daten'
new found = strfind(Daten, spielername, false); //Suchen nach dem Spielernamen
if(found == -1) return false; //Vorgang abbrechen wenn Spielername nicht gefunden wurde
strdel(Daten, found, (found+strlen(spielername))); //Lösche Spieler aus Liste
fwrite(testdatei, Daten); //Überschreibe Datei mit gelöschtem Spielernamen
fclose(testdatei); //Schließe Datei
return true; //Vorgang erfolgreich
}
return false; //Wenn Datei nicht geöffnet werden konnte
}Bei weiteren Fragen einfach posten...
-
Ich versteh es auch ned, aber pass auf:
Du hast ja vorher es so ca gehabt:
"Geschwindigkeit : %d ~n~ Tacho : %d",
nun anscheinend erkennt PAWN das mit dem : anders, wenn du vorher und nacher ein Leerzeichen hast, also bei Textdraws. Ich hab also nur ein Leer von einer Seite vom : gelöscht und dann sieht es so aus:
"Geschwindigkeit: %d ~n~ Tacho: %d",Also, no comment xD
-
haha, hab den Fehler gefunden, welcher sehr lustig ist und ich nicht erklären kann xD
ersetze die Zeile:
format(string,sizeof(string),"Fahrzeug : %s~n~KM/H : %d~n~Tank : %d ",CarName[GetVehicleModel(GetPlayerVehicleID(i))-400],floatround(value/1600),Benzin[vehicleid]);mit
format(string,sizeof(string),"Fahrzeug: %s~n~KM/H: %d~n~Tank: %d",CarName[GetVehicleModel(GetPlayerVehicleID(i))-400],floatround(value/1600),Benzin[vehicleid]);
-
//EDIT 2: Also könntest du bitte ein Screenshot vom Tacho InGame machen ?
-
Er hat was vergessen der Pixel 8D:
if (strcmp("/kart", cmdtext, true, 10) == 0)
{
new string[128],Player[MAX_PLAYER_NAME];
GetPlayerName(playerid,Player,sizeof(Player));
format(string,sizeof(string)," %s hat /kart betreten",Player);
SendClientMessageToAll(COLOR_GREEN, string);
SetPlayerPos(playerid,2286.1597, 605.1251, 10.8203);
GameTextForPlayer(playerid,"~r~Kart Racing", 5000, 3);
return 1;}
-
Wie ist die Definition von
Benzin[MAX_VEHICLES];
? -
Ah ok gesehen, da ist eine Klammer zuviel, also einfach, in dem Fall, die Zeile wo der 1. Error ist rauslöschen.
-
Zu local variable "GetPlayerName" shadows a variable at a preceding level kann es sein, dass du oder ein Include unabsichtlich GetPlayerName neu definiert hat und somit es zu einem "kleinen" Konflikt kommt.
Was mir aber derzeit noch auffällt, dass du GetPlayerName so verwendest GetPlayerName(playerid,aName,sizeof aName);
und nicht so
GetPlayerName(playerid,aName,sizeof(aName));, also der Inhalt von sizeof gehört in Klammer.
-
Ach lol, ein bissl gesucht und gefunden und da das Samp Wiki offline ist hier Copy & Paste vom Wiki:
Zitat
AllowPlayerTeleportZitatEnable/Disable the teleporting ability for a player by right-clicking on the map
Parameters: (playerid, allow)
Important Note: This function will work only if AllowAdminTeleport is working, and you have to be an admin.Das Beispiel von mir ist als Anhang dabei. Jedoch weiß ich jetzt ned ob mit right-clicking on the map das mit der Kartenmarkierung verwechselt wurde.
-
Ach lol jungs ned im Ernst ... xD Der Arme will doch nur ne gesamte InteriorListe haben, weil im Samp Wiki nicht alle stehen, also echt
Also hier ist eine schöne Liste mit Bildern:
http://weedarr.wikidot.com/interior
Solltest du wirklich alle haben, empfehle ich dir dieses kleine GameMode wo du dann InGame zu jedem Interior porten kannst:
(Ja, ich nütze derzeit den Google Cache vom Samp Forum, damit ich ned ganz so hilflos bin ^^)
-
Zu deinem 1. Error, wo ist der? Ich finde ihn nicht bzw keine Anmerkung wo der Fehler ist.
Zum 2., bitte erklär mir kurz wozu die definition gang bei deinem 2. Error dient. Also was du eigentlich vor hattest herauszufiltern.
-
Es gibt ja eine Option die man unter OnGameModeInit einfügt, glaube mit dem Namen AllowAdminsTeleport womit man sich anscheinend als RCON-Admin dorthin teleportiert wo der Marker auf der Karte gesetzt wurde. Leider ist derzeit das Samp Wiki offline, aber ich habe bis jetzt gar keine Funktion gefunden, welche die Positionen ausliest. Sollte es wohl auch ned geben.