TextDrawShowForPlayer(playerid,Text: willkommen);
Defintiv nicht.
Text:Willkommen[MAX_PLAYERS]
Ist es so definiert hat es ein "Tag", da brauch man ganz bestimmt nicht noch Text: als "Tag" angeben.
Beiträge von Goldkiller
-
-
Ist nicht schonender.Lass es lieber wie es ist, am Ende kommt noch alles durcheinander
-
Nimmst einfach Primzahlen.
http://de.wikibooks.org/wiki/P…mzahlen_%282_-_100.000%29
SetTimer("Bla1",997,true);
SetTimer("Bla2",1009,true); -
Wir haben dazu mal einen Extra Thread gehabt. Code Optimierung
1. OnPlayerUpdate so gut wie nicht benutzen.
2. Genau so wie ein normales Array.Ob du jetzt immer extra
new PlayerInfo_Level[MAX_PLAYERS],PlayerInfo_Money[MAX_PLAYERS],...
hast oder es direkt
new PlayerInfo[MAX_PLAYERS][e_PlayerInfo]; // e_PlayerInfo ist natürlich enum
ist egal,nur ist es für die meisten übersichtlicher,ist aber Geschmackssache.3. - Glaube kaum, dass es da große Unterschiede gibt.Meine aber switch() ist langsamer als if,else if,else ... .
4. http://forum.sa-mp.de/wbb/san-…de-multitimer/#post371586
Dazu gibt es auch ein ausführliches Tutorial auf Englisch : http://forum.sa-mp.com/showthread.php?t=61322ZitatSetPVarInt und GetPVarInt zu arbeiten das bringt viel weil sonst erstellst du für jeden spieler eine variable dienst obwohl er kein Polizist ist
Da hast du aber das Problem CPU vs Speicher.Denn PVars sind defintiv nicht schneller als Variablen//Edit:
Ein super Thread dazu,aber auch in Englisch.Code optimisations , kann ich nur empfehlen.Bis auf Lists und Binary Trees konnt Ich mir auch alles davon beibringen. -
Das kannst du nicht in einem Zug erstellen.Zum einen hättest du sowieso nur eine ProgressBar erstellt,zum anderen ist es nicht möglich im Kopf zu nutzen.
new Bar:drugs[MAX_PLAYERS];
// OnPlayerConnect()
drugs[playerid] = CreateProgressBar(50.0, 300.0,_, _, 0xFFFF00FF, 20.0); -
Wahrheit schreibt man übrigens mit h ;).
Hast ja jetzt nicht so die Welle geschlagen, wie du es dir vllt erhofft hast :D. -
Wozu brauch man überhaupt ein Array / String, um die X-Koordinate eines Spielers zu speichern?
Falls du einen guten Grund hast,
format(SpielerStats[playerid][PositionX],256,"%f",X); // sizeof() funktioniert soweit Ich weiss nicht bei Mutli-Dimension ArraysSonst kannst du aber auch
enum e_Blabla {
Float:PositionX,
Float:PositionY,
...new
Float:X,Float:Y,Float:Z;
GetPlayerPos(playerid,X,Y,Z);
SpielerStats[playerid][PositionX] = X; -
Okay.
Das %0 ist sozusagen ein Parameter.Anstelle wo %0 im Define steht,wird dann an diese Stelle eingesetzt,was du an der Stelle von %0 als Parameter übergeben hast.Da dass ganze vom PreProzessor abgearbeitet wird,verändert sich der Code vorm kompilieren,je nachdem welchen Wert du als %0 Parameter übergibst.
Hast du angenommen im Code:
PRESSED(KEY_FIRE)
wird durch den Pre-Prozessor daraus
(((newkeys & (KEY_FIRE)) == (KEY_FIRE)) && ((oldkeys & (KEY_FIRE)) != (KEY_FIRE)))
Da KEY_FIRE auch nur ein define ist,wird es in etwa so aussehen ( angenommen KEY_FIRE ist 512 ) :
(((newkeys & (512)) == (512)) && ((oldkeys & (512)) != (K512)))
Es gibt dazu auch seit kurzem ein Tutorial -> * Klick *Nun zum \ ,auch bekannt als Backslash (Ganz wichtig,kein normales / Slash ).
Das Backslash ist dazu gut,um dem Kompiler zu sagen,dass der Code in der nächsten Zeile fortgeführt wird.
Wäre dort kein Backslash,würde der Kompiler meckern.
#define PRESSED(%0)
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
Denn er wüsste nichts mit
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
anzufangen.
Kannst es ja mal in PAWNO ausprobieren, auch der Highlighter erkennt das Backslash in diesem Define und highlighted demnach die folgende Zeile ;).
Man hätte es natürlich auch so machen können, Alles in eine Zeile.
#define PRESSED(%0) (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
Doch sieht es übersichtlicher aus mit einer neuen Zeile.Man kann Backslash auch in Strings benutzen,aber das kannst ja selber mal austesten :p.Müsste im groben so stimmen,ob es alles richtig ist weiss niemand x).
-
Da ist noch was falsch.
format(string,sizeof(string),"Tank: %d/100",Gas[vehicle]);
Dort nimmst du vehicle als index,hast es aber außerhalb des loops mit GetPlayerVehicle(i) zugewiesen.i ist aber noch nicht deklariert worden.public UpdateSpeedo();
{
new
vehicle,
string[32];
for(new i = 0; i < MAX_PLAYERS; i++) {
if(IsPlayerConnected(i)) {
vehicle = GetPlayerVehicleID(i);
if(!vehicle) continue;
format(string,sizeof(string),"%s",CarName[GetVehicleModel(vehicle) - 400]);
TextDrawSetString(NAME[i], string);format(string,sizeof(string),"%d KM/H",GetPlayerSpeed(i,true));
TextDrawSetString(TEMPO[i], string);format(string,sizeof(string),"Tank: %d/100",Gas[vehicle]);
TextDrawSetString(TANK[i], string);
}
}
}
return 1;
}
Eine Abfrage,ob der Spieler im Fahrzeug ist,wird auch benötigt. -
Gute Frage,mit PRESSED() ist es natürlich besser.Habs einfach weggelassen, weil Ich mir dachte er wird es sowieso nicht benutzen.Ich hatte auch noch Recht.
ZitatAm besten erklären wir nochmal alles genau...
damit auch jeder Anfänger versteht das wir Ihnen nur helfen wollen.
Ich hoffe doch mal,dass das Ironie ist ;D. Die meisten lesen sich ja nicht die Grundlagen durch, die dann immer alle gleich mit zu erklären hat kaum einer Lust,Ich auch nicht. -
Oh man.
if(!strlen(sup[playerid]))
strlen() liefert dir die Länge des Strings.Ist die Länge also 0, so is der String leer.
Du kannst natürlich auch gucken ob die Länge 10 Zeichen ist oder Sonstiges.
if(strlen(sup[playerid]) == 10)Es lässt sich auch vereinfacht darstellen ohne strlen.
if(!sup[playerid][0])
Bleib aber vielleicht erstmal bei strlen() , denn Ich denke so ist es zu schwer für dich zum verstehen. -
Wieso hast nicht das von mir ausprobiert ?
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
//
//if(newkeys & KEY_FIRE)
if(PRESSED(KEY_FIRE))
{
printf("DBG: #1,Schuss: %d",Schuss[playerid]);
if(IsPlayerInRangeOfPoint(playerid,5.0,293.8557,-159.7837,1011.9882) && (Schuss[playerid] < 6))
{
printf("DBG: #2");
Schuss[playerid]++;
if(Schuss[playerid] == 6) {
printf("DBG: #3");
SendClientMessage(playerid, Grün, "Super gehe nun zum dem Computer.");
}
}
}
Ist ja wohl defintiv einfacher gescriptet.Sollte es nicht gehen,haben wir ja die Debug-Informationen.Anstatt PlayerToPoint() würde Ich dir sowieso empfehlen IsPlayerInRangeOfPoint() zu benutzen,ist nähmlich eine native Funktion
#1. IsPlayerInRangeOfPoint angepasst
#2. PRESSED() eingefügt -
Das steht doch dort auch in der Meldung
ZitatThe function returns both values and arrays, which is not allowed.
If a function returns an array, all return statements must specify
an array (of the same size and dimensions).
Kurz gesagt,nur ein Typ ist erlaubt bei der Rückgabe.
Entweder nur Integer,Float oder Arrays ( Strings). -
Kann ich mir nicht vorstellen,deswegen haben Ich es selber mal getestet.
Unten siehst du den Code,bei mir hat es nicht gecrasht.Liegt vielleicht auch an der Server Version,Ich habe es mit 0.3a r7 getestet und als Filterscript und GameMode geladen.
#include <a_samp>new TestArray[5];
enum e_Test {
a,
b,
c,
d,
e
}new eTest[e_Test];
public OnFilterScriptInit()
{
TestArray[3] = 2;
eTest[code=c] = 5;
CallLocalFunction("TestPublic", "d", TestArray[3]);
CallLocalFunction("TestPublic", "d", eTest[code=c]);
return 1;
}
forward TestPublic(integer);
public TestPublic(integer) {
printf("integer: %d",integer);
return 1;
}public OnFilterScriptExit()
{
return 1;
}//Edit: Mit enum's habe Ich dort auch keine Probleme.
-
Ich verstehe nicht ganz was du meinst.
Willst du wissen,wo im enum sich 5 befindet bzw b?Denn Ich glaube kaum,dass du das meinst:
new
x = Test[b]; -
Du darfst keine Zahl am Anfang einer Funktion haben.
Mach aus "5MinText" irgendwas Anderes, "TextEx" oder sowas. -
Das schaffst du nicht alleine ?
if(newkeys & KEY_FIRE)
{
if(PlayerToPoint(5.0,playerid,293.8557,-159.7837,1011.9882) && (Schuss[playerid] < 6))
{
Schuss[playerid]++;
if(Schuss[playerid] == 6) {
SendClientMessage(playerid, Grün, "Super gehe nun zum dem Computer.");
}
}
} -
Muss nicht,es kann.Ist sowieso besser bei Keys,da es dort um Bits geht.
Das zu erklären wäre zu viel,da es Viele nicht verstehen.
Ich hab das >> hier << mal erklärt.#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
// Ist von Y_Less
// if(newkeys == KEY_FIRE) - Anstatt diese Zeile
//
if(PRESSED(KEY_FIRE)) -
Eben nicht.
2, ist 0 und 1.
3, ist 0,1 und 2.Kannst dir so merken.
Die Größe ( 3 ) , lässt zugreifen auf 0 bis ( Größe ( 3 ) - 1 ). -
Zitat
Forenregeln
Benutze eine aussagekräftige Überschrift, welche den Inhalt deines Beitrages beschreibt. Verwende keine permanente Großschrift oder spezielle Zeichen, um auf sich aufmerksam zu machen. Großschrift wird von vielen als SCHREIEN angesehen. (z.B. ICH BRAUCHE DRINGEND HILFE !!!!).
Nochmal und du hast 3Warnungen und somit einen bann.Du bist lang genug im Forum um das zu wissen.new Float:BombPos[MAX_PLAYERS][3]; // 3,nicht 2!
Du willst ganz klar 3 Positionen speichern,nicht 2.Außerdem ist es Float:, nicht Integer ;).Denn die Position kann auch 104.23,532.0145, 10.5 sein.