pID = strlen(inputtext);
zu:
pID = strval(inputtext);
strlen = die Länge des Inputs
strval = der Wert des Inputs
pID = strlen(inputtext);
zu:
pID = strval(inputtext);
strlen = die Länge des Inputs
strval = der Wert des Inputs
Das tut die Entfernung immer weiter machen Hilfe
Na dann musst du es logischerweise kleiner machen. Setz es auf 0.1 oder 0.0, oder -0.1.
@DerJonny.[47]:
new AdminDuty[MAX_PLAYERS];
Das?
Du musst einfach die 0.2 am Ende größer machen. Sollte nicht allzu schwer sein
SetPlayerAttachedObject(playerid,0,18646, 2, 0.0, 0.0, 0.2);
Slot (0) hat gefehlt.
Ja, sonst hätte ich dir noch mehr gegeben. Es kann sein, dass du die 0.2 noch ändern musst, das habe ich nur geschätzt.
SetPlayerAttachedObject(playerid, 0, 19419, 2, 0.0, 0.0, 0.2);
Anstatt das ganze myobject Gedöns.
Dann kann man nicht mehr springen.
Man benutzt hier lieber SetPlayerAttachedObject.
Welche Wetter ID ist Gewitter? Finde nur Regen.
8
Auf Anfrage in PM:
Kannst du bitte noch das ganze Textdraw wie du es erstellst posten? Dann könnte ich es morgen kurz selbst testen, was genau passiert, weil Anhand bloßen Zahlen kannich dir nichts genaues sagen.
Es waren paar kleine Fehler im Code.
stock sectostr ( t, args=0 )
{
new EndText[128] = "\0";
if(args == 1)
{
t = sectostr_one (31536000, "Jahr", "Jahre", "ein", t, EndText);
t = sectostr_one (604800, "Woche", "Wochen", "eine", t, EndText);
t = sectostr_one (86400, "Tag", "Tage", "einen", t, EndText);
t = sectostr_one (3600, "Stunde", "Stunden", "eine", t, EndText);
t = sectostr_one (60, "Minute", "Minuten", "eine", t, EndText);
t = sectostr_one (1, "Sekunde", "Sekunden", "eine", t, EndText);
} else {
t = sectostr_one (31536000, "Jahr", "Jahre", "einem", t, EndText);
t = sectostr_one (604800, "Woche", "Wochen", "einer", t, EndText);
t = sectostr_one (86400, "Tag", "Tage", "einen", t, EndText);
t = sectostr_one (3600, "Stunde", "Stunden", "einer", t, EndText);
t = sectostr_one (60, "Minute", "Minuten", "einer", t, EndText);
t = sectostr_one (1, "Sekunde", "Sekunden", "einer", t, EndText);
}
if(strlen(EndText) == 0)
{
format (EndText, sizeof(EndText), "0 Sekunden");
}
return EndText;
}
stock sectostr_one (x, cap[], cappl[], capone[], t, EndText[128])
{
new num;
if(t >= x)
{
num = t / x; //Hier das mit float und so war falsch, so ist es besser.
t = t%x;
if(strlen(EndText) != 0) //Hier stand == 0, war nicht richtig.
{
if (t > 0) format(EndText,sizeof(EndText), "%s, ", EndText);
else format(EndText,sizeof(EndText), "%s und ", EndText);
}
if(num > 1) format(EndText,sizeof(EndText), "%s%i %s", EndText, num, cappl);
else format(EndText,sizeof(EndText), "%s%s %s", EndText, capone, cap); //Die Lücken waren falsch gesetzt.
}
return t;
}
Test-Ausgabe:
Respekt für die Idee, habe ich so noch nicht gesehen, finds aber gut. Gute Sache.
EDIT: Da warst 1ms schneller als ich. Aber schau dir trotzdem meinen Code noch an, das mit den Rundungen kannst du dir sparen. Außerdem ist der Rückgabewert nur ein Integer und kein String.
Sieht in PAWN so aus:
stock sectostr ( t, args=0 )
{
new EndText[128];
if(args == 1)
{
EndText = sectostr_one (31536000, "Jahr", "Jahre", "ein", t);
EndText = sectostr_one (604800, "Woche", "Wochen", "eine", t);
EndText = sectostr_one (86400, "Tag", "Tage", "einen", t);
EndText = sectostr_one (3600, "Stunde", "Stunden", "eine", t);
EndText = sectostr_one (60, "Minute", "Minuten", "eine", t);
EndText = sectostr_one (1, "Sekunde", "Sekunden", "eine", t);
} else {
EndText = sectostr_one (31536000, "Jahr", "Jahre", "einem", t);
EndText = sectostr_one (604800, "Woche", "Wochen", "einer", t);
EndText = sectostr_one (86400, "Tag", "Tage", "einen", t);
EndText = sectostr_one (3600, "Stunde", "Stunden", "einer", t);
EndText = sectostr_one (60, "Minute", "Minuten", "einer", t);
EndText = sectostr_one (1, "Sekunde", "Sekunden", "einer", t);
}
if(strlen(EndText) == 0)
{
format (EndText, sizeof(EndText), "0 Sekunden");
}
return EndText;
}
stock sectostr_one (x, cap[], cappl[], capone[], t)
{
new Float:num, EndText[128];
if(t >= x)
{
num = floatround(time/x, floatround_ceil);
num = floatround(num);
t = t%x;
if(strlen(EndText) == 0)
{
if (t > 0) format(EndText,sizeof(EndText), "%s, ", EndText);
else format(EndText,sizeof(EndText), "%s und ", EndText);
}
if(floatint(num) > 1) format(EndText,sizeof(EndText), "%s %i %s", EndText, floatint(num), cappl);
else format(EndText,sizeof(EndText), "%s %s %s", EndText, capone, cappl);
}
return EndText;
}
Ich glaube eine Erklärung brauchst du nicht, ein Anfänger scheinst du ja nicht zu sein also wirst du das verstehen, da bin ich mir sicher.
d=floatsqroot(((OldPos[p][0]-x)*(OldPos[p][0]-x))+((OldPos[p][1]-y)*(OldPos[p][1]-y))+((OldPos[p][2]-z)*(OldPos[p][2]-z))) / 10.0;
Und erhöhe "/ 10.0" auf 20.0, oder eben so weit wie es dir genehm ist.
OldPos[p][0] = 0.0;
OldPos[p][1] = 0.0;
OldPos[p][2] = 0.0;
zu:
if(!IsPlayerInAnyVehicle(p))
{
OldPos[p][0] = 0.0;
OldPos[p][1] = 0.0;
OldPos[p][2] = 0.0;
}
else
{
OldPos[p][0] = x;
OldPos[p][1] = y;
OldPos[p][2] = z;
}
Habs getestet, tut dann. Liegt wahrscheinlich an der Zeitverzögerung zwischen den Aufrufen der Funktionen, so tuts aber.
Logs:
ZitatAlles anzeigenSpoiler anzeigen [17/10/2013 21:59:23] 100.000000
[17/10/2013 21:59:23] 100.000000
[17/10/2013 21:59:24] 100.000000
[17/10/2013 21:59:24] 100.000000
[17/10/2013 21:59:24] 100.000000
[17/10/2013 21:59:24] 99.987220
[17/10/2013 21:59:24] 99.937492
[17/10/2013 21:59:24] 99.867210
[17/10/2013 21:59:24] 99.760856
[17/10/2013 21:59:24] 99.650054
[17/10/2013 21:59:24] 99.507148
[17/10/2013 21:59:25] 99.355888
[17/10/2013 21:59:25] 99.233100
[17/10/2013 21:59:25] 99.013679
//Steht, und fährt weiter:
[17/10/2013 21:59:45] 52.129135
[17/10/2013 21:59:45] 52.129135
[17/10/2013 21:59:45] 52.129135
[17/10/2013 21:59:45] 52.129135
[17/10/2013 21:59:45] 52.126121
[17/10/2013 21:59:45] 52.106731
[17/10/2013 21:59:46] 52.048084
[17/10/2013 21:59:46] 51.970993
[17/10/2013 21:59:46] 51.857616
[17/10/2013 21:59:46] 51.772205
[17/10/2013 21:59:46] 51.566181
EDIT:
Das return 1; bei IsASweeper (...) ist nicht gut. Wenn du den Verbrauch überspringen willst, dann nimm continue; sonst wird die Schleife einfach abgebrochen.
@[ApL]Arendium: Recht haste! Der Code ist zwar nicht richtig, aber das fehlt in dem ganzen Code natürlich.
public Timer()
{
for(new i=0; i<MAX_PLAYERS; i++) if(SpielerHatNeWaffe(i) && IsPlayerNearObject(i, Objekt, 5.0)) SendClientMessageToAll(0xFFFFFFFF, "Der hat ne Waffe!"); //Wenn Waffe & bei Objekt => Message
return 1;
}
So.
Code zeigen, wie er grade ist. Kannst du dir merken, immer den Code dazu, ohne geht nix.
Hast du dich teleportiert? Das geht nämlich nicht, außer du setzt die drei OldPos Werte zu 0.0, wenn man sich im Auto teleportiert.
1.)
public OnPlayerSpawn(playerid)
{
IsPlayerNearObject(playerid, Objekt, 5.0);
SetTimerEx("Timer",3000,true,"i",playerid);
return 1;
}
Tödlich! Du startest jedes mal einen neuen Timer wenn er spawnt. Entferne den Timer hier, und mach stattdessen bei OnGameModeInit:
SetTimer("Timer", 3000, 1);
2.)
//playerid auch bei "forward" weg machen
public Timer()
{
for(new i=0; i<MAX_PLAYERS; i++) if(SpielerHatNeWaffe(i)) SendClientMessage(i, 0xFFFFFFFF, "Der hat ne Waffe!");
return 1;
}
stock IsPlayerNearObject(playerid, objectid, Float:range)
{
new Float:pos[3];
GetObjectPos(objectid,pos[0],pos[1],pos[2]);
if(IsPlayerInRangeOfPoint(playerid,range,pos[0],pos[1],pos[2])) return true;
return false;
}
Der Rest so wie ich es gesagt habe.
Dort wo du das Objekt erstellst:
Objekt = CreateObject(980, ...);
Falls du weitere Fragen hast, dann zeig noch wie und wo du das Objekt erstellst.
floatpower = a ^ b (a hoch b) z.B. 5 ^ 3 = 5 * 5 * 5 = 125
floatsqroot = Wurzel z.B. Wurzel 9 = 3
floatfract = den Teil hinterm Komma z.B. 1.234 => 0.234 wird ausgegeben
floatabs = Absolutwert z.B, -123 = 123
floatsin/cos/tan = Sinus Cosinus Tangens
floatcmp: http://wiki.sa-mp.com/wiki/Floatcmp
Wenn der Teil von dem "return" einem stock zugehörig ist, dann ändere:
stock Funktionsname(...)
zu:
stock Float:Funktionsname(...)
Ansonsten poste den Rest der da noch dazugehört.