Was meinst du?
Du müsstest schon etwas mehr Informationen von dir geben, sonst kann ich dir leider nicht wirklich helfen. Erkläre bitte ganz genau im Detail (nichts vergessen), was der Befehl machen soll und was du eingeben und abfragen willst.
Was meinst du?
Du müsstest schon etwas mehr Informationen von dir geben, sonst kann ich dir leider nicht wirklich helfen. Erkläre bitte ganz genau im Detail (nichts vergessen), was der Befehl machen soll und was du eingeben und abfragen willst.
Da fehlt noch der Code vom Kauf und Verkauf, außerdem von dem Code, der bei OnPlayerPickUpPickup das Textdraw anzeigt.
Kannst du dazu bitte noch erklären, was genau das Problem ist? Also was von den drei Bildern ist korrekt, und was sollte anders sein?
Dann kann ich das Problem so leider nicht nachvollziehen, wenn das ein direkter Aufruf ist.
Könntest du vielleicht von dem Problem mal ein kurzes Video hochladen, damit wir uns das Problem besser vorstellen können? Vielleicht gibt das Hinweise auf die Ursache.
Du startest in dem Befehl einen Timer, in dem du das "i" mit gibst (d steht für Integer).
SetTimerEx("CreateGiftAgain", 30000, false, "d", i);
Das Callback zu dem Timer sieht dann so aus:
forward CreateGiftAgain(i);
public CreateGiftAgain(i)
{
GiftBox[i][e_oID] = CreateDynamicObject(19054, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z], 0.0, 0.0, GiftBox[i][e_a]);
GiftBox[i][e_label] = CreateDynamic3DTextLabel("/takegift\nTo get your gift.",0x10F441AA,GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]+0.25,8.0);
new str[16];
format(str, sizeof(str), "ID: %i.", i);
GiftBox[i][e_GiftID] = CreateDynamic3DTextLabel(str,0xFF0000FF, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]+1.10,8.0);
return 1;
}
Gegegebenfalls musst du das Objekt und die Labels wieder anpassen, ich habe das von der Laden-Funktion auf der Seite zuvor genommen.
@Jeffry dein Code funktioniert, nur dann wenn ich das Fahrzeug schon einmal in dem Fall mit meinem Befehl respawne.
Ich verstehe nicht wirklich was du meinst, sorry. Kannst du bitte genauers erklären, wann es geht und wann nicht?
Wenn es mit SetVehicleVelocity nicht klappt, dann sehe ich da kaum eine Möglichkeit.
Außer man löscht den Zug und erstellt ihn gleich wieder, aber ob das so wirklich toll aussieht bezweifle ich.
Ich würde es mit dem zweiten Weg machen, dass du das Objekt wie bei dem Befehl löschst, nur die Datei nicht löschst und die Variablen nicht zurück setzt.
Danach kannst du dann über die Variablen das Objekt einfach wieder erstellen.
Hast du es umbenannt, wenn nämlich nicht, dann musst du die "giftPos" zu "GiftBox" umbenennen.
Ich wusste nicht, ob das was zu bedeuten hatte, daher habe ich es so gelassen.
CMD:takegift(playerid)
{
for(new i = 0; i < MaxGifts; i++)
{
if(GiftBox[i][e_x] == 0.0 && GiftBox[i][e_y] == 0.0 && GiftBox[i][e_z] == 0.0) continue;
if(IsPlayerInRangeOfPoint(playerid, 5.0, giftPos[i][e_x], giftPos[i][e_y], giftPos[i][e_z]))
{
RandomGift(playerid);
return 1;
}
}
return 1;
}
Und:
new randomgift = random(MaxGifts) + 1;
zu:
new randomgift = random(3) + 1;
Der Fehler liegt daran, dass du mit der vehicleid auf den Index zugreifst, das beim Laden aber nicht so machst.
Du musst es bei OnVehicleSpawn so machen, um den richtigen Index (das ist nicht die vehicleid) herauszufinden:
public OnVehicleSpawn(vehicleid)
{
new engine, lights, alarm, doors, bonnet, boot, objective;
new id = -1;
for(new i = 0; i < sizeof(VehicleInfo); i++)
{
if(vehicleid == VehicleInfo[i][v_DLID])
{
id = i;
break;
}
}
if(id != -1)
{
if(VehicleInfo[id][v_Schloss] == true)
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
doors = 1; // Türen werden geschlossen
print("vSchloss == true");
}
else
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
doors = 0; // Türen werden geöffnet
print("vSchloss == false");
}
printf("doors: %d",doors);
SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
}
return 1;
}
Ok, aufgerufen wird es wohl, daher ist es doppelt da. Dann kannst du die Zeile wieder entfernen.
Wozu gehört denn der erste Print?
SpielerAuto[playerid][x][aKilometer] = (Meter[SpielerAuto[playerid][x][aID]]+GetDistanceToLastPoint(SpielerAuto[playerid][x][aID])) / 250;
zu:
if(SpielerAuto[playerid][x][aID] > -1) SpielerAuto[playerid][x][aKilometer] = (Meter[SpielerAuto[playerid][x][aID]]+GetDistanceToLastPoint(SpielerAuto[playerid][x][aID])) / 250;
Füge mal unter dem SetVehicleToRespawn das hier ein, möglicherweise ruft die Funktion das Callback gar nicht auf:
OnVehicleSpawn(id);
Ah, sorry. War ein Denkfehler von mir.
So:
new jackpot = lottopot * (100+lottofaktor) / 100;
Dann kommt es auf's gleiche raus.
5 /100
Das gibt zwar 0,05, aber da Integers keine Nachkommastellen unterstützen, wird es auf 0 abgeschnitten. Deshalb geht das nicht, und deshalb brauchst du auch kein floatround.
Du müsstest sonst mit Floats arbeiten, das würde dann gehen.
Da mein Vertrag im April ausläuft:

9,90€ einmalig
- 30€ Guthaben wegen web.de Club (30-Tage kostenlose Testphase) geschenkt [hoffe das klappt]
- 25€ Guthaben für Rufnummernmitnahme geschenkt
6,99€ / Monat
Für's Vodafone Netz ist das ein ziemlich gutes Angebot, habe eigentlich noch nie ein besseres gesehen, bei dem man auch nach 24 Monaten die gleichen Konditionen hat.
5/100 = 0.00000 ist.... Aber woran liegt das eigentlich sollte doch 0.05 heraus kommen?
Das liegt daran, dass Integers nicht mit Nachkommastellen arbeiten können, also kommt 0 raus. 99/100 wäre auch 0.
Mache es so, dann wird erst der Lottopot multipliziert:
new jackpot = lottopot * (1+lottofaktor) / 100;
Ah ja, stimmt, das fragst du ja da in der Mitte ab, da habe ich auch nicht drauf geachtet. Hast natürlich Recht, dann kann man das so vergessen.
Ich denke die einfachste Variante, auch für den Nutzer, ist es, den Befehl mit 6 Parametern aufzubauen.
Alternativ über 6 Dialoge, die nacheinander kommen.
Anstatt der Eingabe von "i" eine Schleife durch "i":
for(new i=0; i<MaxGifts; i++)
{
//Hier dann jeweils löschen, wie gewohnt.
}
Versuchs mal so, die 5 Zeichen sind auf jeden Fall zu wenig gewesen, für 6 Zahlen:
ocmd:lotto(playerid,params[])
{
new pzahlen[7],str[128];
if(startetlotto == 0)return SCM(playerid,frot,"[FEHLER]: Es wurde keine Runde Lotto gestartet!");
if(sscanf(params,"s[7]",pzahlen))return SCM(playerid,frot,"[FEHLER]: /lotto [6 Zahlen]");
if(strlen(pzahlen) != 6)return SCM(playerid,frot,"[FEHLER]: Du musst 6 Zahlen eingeben!");
SCM(playerid,frot,"[ZAHLEN]: %s",pzahlen);
for(new i=0;i<6;i++)
{
pZahlen[playerid][i] = pzahlen[i] - 48;
SCM(playerid,frot,"Zahl %d : %d",i+1,pZahlen[playerid][i]);
if(pZahlen[playerid][i] < 1 || pZahlen[playerid][i] > 45)return SCM(playerid,frot,"[FEHLER]: Die Zahlen müssen zwischen 1 und 45 liegen!");
if(i < 5)
{
format(str,sizeof(str),"%s %d. Zahl: %d",str,i+1,pZahlen[playerid][i]);
continue;
}
format(str,sizeof(str),"%s Zusatzzahl: %d",str,pZahlen[playerid][i]);
}
if(GetPlayerMoney(playerid) < lottokosten)return SCM(playerid,frot,"[FEHLER]: Du brauchst %d um dir ein Los zu kaufen!",lottokosten);
GivePlayerMoney(playerid,-lottokosten);
lottopot += lottokosten;
SCM(playerid,iblau,str);
return 1;
}
Gegebenenfalls löst das das Problem schon.
pZahlen[playerid][i] = strval(pzahlen[i]);
zu:
pZahlen[playerid][i] = pzahlen[i] - 48;