Ich weiß wie man die Z Angle des Fahrzeuges bekommt Und es macht jetzt eh nichts mehr aus, denn ich habe schon die richtige Funktion gefunden
*edit* Habe ich leider doch nicht, die Funtkion stimmt nicht mit der Z Angle überein.
stock Float:GetAngleBetweenPoints(Float:x1, Float:y1, Float:x2, Float:y2){
new Float:angle = atan2(y2-y1, x2-x1);
return angle;
}
Beiträge von Oskaar1994
-
-
Habe gerade gemerkt, dass disAngleFormat einfach zu klein war, so dass es das zweite ~ nicht mehr mitgenommen hat Jetzt brauche ich nur noch eine Funktion, die mir die Z Rotation, des Fahrzeuges ausgibt mit der ich direkt auf einen genauen Punkt zu fahre.
-
Was ist wenn du es so machst?
format(disAngleFormat,sizeof(disAngleFormat),"CRS:~w~ %0.2f",disAngle);
Leider immernoch das gleiche. -
Das oben ist kein Beispiel, so habe ich es im Script Und wenn ich das mache ist alles wieder normal:
PlayerTextDrawSetString(playerid,CrsTD[playerid],"CRS: ~w~-"); -
%i muss zu %f Angle ist nämlich vom Datetyp Float und nicht Integer
Danke mal wieder ein blöder Leichtsinnsfehler von mir;)
*edit* Leider immer noch das gleiche Problem. -
Hey,
ich habe derzeit ein kleines Problem. Immer wenn ich das mache : GetVehicleZAngle(GetPlayerVehicleID(playerid),disAngle);
format(disAngleFormat,sizeof(disAngleFormat),"CRS: ~w~%i",disAngle);
PlayerTextDrawSetString(playerid,CrsTD[playerid],disAngleFormat);
Wird aus dem Text des Textdraw ERROR: Unmatched tilde. Das kommt doch eigentlich nur wenn z.B. ein ~ hinter dem w fehlt.
Dann hätte ich noch eine Frage. Hat jemand eine Funktion für mich, mit der ich die Z Rotation eines Fahrzeuges bekomme, wenn es genau auf einen bestimmten Punkt zufahren soll. Schonmal danke im Vorraus -
Danke euch allen
-
Bringt den Server leider wieder zum Abstürzen und da wird doch dann keine 0 eingefügt oder verstehe ich das falsch ?
-
Also mit valstr dreht jetzt alles durch. Und deine Methode kann ich auch nicht benutzen, da ich davor noch mit der Zahl rechnen muss. So verwende ich es:
GetVehicleZAngle(aveh, angleZ);
format(angleFormat, sizeof (angleFormat),"~w~[%s] [%s] [%s] [%s] ~w~[%s] [%s] [%s]",FMEx(floatround(angleZ)-3),FMEx(floatround(angleZ)-2),FMEx(floatround(angleZ)-1),FMEx(floatround(angleZ)),FMEx(floatround(angleZ)+1),FMEx(floatround(angleZ)+2),FMEx(floatround(angleZ)+3));
PlayerTextDrawSetString(playerid,HeadingTD[playerid],angleFormat);
stock FMEx(iNum)
{
new convertedInt[3];
new convertedInt1[3];
valstr(convertedInt,0);
valstr(convertedInt1,00);
new szStr[3];
format(szStr,sizeof(szStr),"%d",iNum);
if(iNum < 10){
strins(szStr,convertedInt1,0);
}
if(iNum >= 10 && iNum < 100){
strins(szStr,convertedInt,0);
}
return szStr;
} -
iNum ist bei dir ein Integer, strins benötigt einen String. Eigentlich sollte sogar der Compiler dir schon sagen, dass das nicht funktionieren kann, solange iNum ein Integer ist.
Also müsste ich dann vorher Valstr benutzen ? Und der Compiler hat nicht gemeckert.
-
Hm leider funktioniert es immer noch nicht und der Server crasht nach ein paar Sekunden.
-
Ich benutze doch garkeine Schleife Und mir fällt gerade auf ich wollte die Zeile eigentlich so machen:
if(iNum >= 10 && iNum < 100){ -
Hey,
habe ein kleines Problem. Ich habe mir eine Funktion erstellt die Zahlen unter 100 mit einer bzw. zwei Nullen versehen soll. Also z.B. 9 ---> 009 27 ---> 027. Das ganze klappt leider nicht und bringt den Server nach ein paar Sekunden zum crashen. Was mache ich falsch ?
stock FMEx(iNum)
{
new szStr[3];
format(szStr,sizeof(szStr),"%d",iNum);
if(iNum < 10){
strins(szStr,"00",0);
}
if(iNum >= 100 && iNum < 100){
strins(szStr,"0",0);
}
return szStr;
} -
Ups, habe gerade gemerkt, dass ich zum Testen eine Funktion gemacht hatte die ForSale bei allen Schildern auf 0 setzt. Trotzdem danke für die Hilfe Ich hätte da aber noch eine bzw. zwei Fragen. Wie kann ich es machen wenn bei allen Schildern ForSale 0 ist, also wenn es nicht zum Verkauf steht, dass eine Nachricht returnt wird ? Und die zweite Frage wäre bezüglich der Anzahl der Schilder. Da ein String ja höchstens 1024 Zeichen groß sein kann, wie mache ich es wenn ich sehr viele Schilder habe ?
-
Also ich habe das Array mal verkleinert, hilft leider nichts. Und geprintet wird nur das erste, und das 200mal. Also halt immer: i: 0 // i: 1 // i: 2 usw.
-
Hey,
habe ein kleines System gebastelt mit dem man sich Schilder also Werbetafeln mieten kann. Nun will ich einen Dialog erstellen der alle verfügbaren also alle zum Verkauf stehenden Schilder anzeigt. Das habe ich auch gemacht nur wird er im Spiel nicht angezeigt. Die Schilder werden ordnungsgemäß geladed und erstellt, nur der Dialog will nicht. Was mache ich falsch ?
stock ShowSigns(playerid)
{
new signFormat[800];
new signLocation[30];
for(new i=0;i<sizeof(SignInfo);i++){
if(SignInfo[i][ID] == 0)continue;
if(SignInfo[i][ForSale] != 1) continue;
Get3DZoneForCoords(signLocation, sizeof(signLocation), SignInfo[i][x], SignInfo[i][y], SignInfo[i][z]);
format(signFormat,sizeof(signFormat),"%s{FFFFFF}ID: {FF9900}%i {FFFFFF}|| Location: {FF9900}%s {FFFFFF}|| Price: {FF9900}%s\n",signFormat,SignInfo[i][ID],signLocation,FM(SignInfo[i][Price]));
}
ShowPlayerDialog(playerid,48,DIALOG_STYLE_LIST,"Available billboards",signFormat,"Select","Back");
return 1;
} -
Ich würde einfach PutPlayerInVehicle benutzen. Und wichtig ist, dass beim Aussteigen RemovePlayerFromVehicle benutzt wird sonst crasht der Client.
-
-
Hier, damit sollte es klappen:
stock ConvertToEuler(Float: qw, Float: qx, Float:qy, Float:qz, &Float:heading, &Float:attitude, &Float:bank) {
new Float: sqw = qw*qw,Float: sqx = qx*qx,Float: sqy = qy*qy,Float: sqz = qz*qz,Float: unit = sqx + sqy + sqz + sqw,Float: test = qx*qy + qz*qw;
if (test > 0.499*unit) return heading = 2*atan2(qx,qw),attitude = 3.141592653/2,bank = 0;
if (test < -0.499*unit) return heading = -2*atan2(qx,qw),attitude = -3.141592653/2,bank = 0;
return heading = atan2(2*qy*qw - 2*qx*qz, sqx - sqy - sqz + sqw),attitude = asin(2*test/unit),bank = atan2(2*qx*qw - 2*qy*qz, -sqx + sqy - sqz + sqw);
}
stock GetVehicleRotation(vehicleid,&Float:heading, &Float:attitude, &Float:bank) {
new Float:quat_w,Float:quat_x,Float:quat_y,Float:quat_z;
GetVehicleRotationQuat(vehicleid,quat_w,quat_x,quat_y,quat_z);
ConvertToEuler(quat_w,quat_x,quat_z,quat_y, heading, attitude, bank);
return bank = -1*bank,1;
}mfg.
Bekomme leider in den folgenden Zeilen noch Tag Mismatches:
if (test > 0.499*unit) return heading = 2*atan2(qx,qw),attitude = 3.141592653/2,rotbank = 0;
if (test < -0.499*unit) return heading = -2*atan2(qx,qw),attitude = -3.141592653/2,rotbank = 0;
return heading = atan2(2*qy*qw - 2*qx*qz, sqx - sqy - sqz + sqw),attitude = asin(2*test/unit),rotbank = atan2(2*qx*qw - 2*qy*qz, -sqx + sqy - sqz + sqw);
Und falls sich jemand fragt wieso ich bank zu rotbank geändert habe, ich hatte schonmal irgendwo bank im Script und Pawno hat gemeckert -
Hey,
habe gestern eine Funktion gefunden mit der ich die komplette Fahrzeug Rotation bekommen kann. Es arbeitet mit GetVehicleRotationQuat, aber es gibt die falschen Werte aus. Wieso kann ich das so einfach behaupten ? Ich habe das was die Funktion für die Z Rotation zurück gibt mit GetVehicleZAngle verglichen, aber es kommt nicht das selbe raus. Hat jemand eine Funktion die auch richtig arbeitet dafür so ähnlich wie diese ?
stock GetVehicleRotation(vehicleid,&Float:rotx,&Float:roty,&Float:rotz) {
new Float:quat_w,Float:quat_x,Float:quat_y,Float:quat_z;
GetVehicleRotationQuat(vehicleid,quat_w,quat_x,quat_y,quat_z);
x = atan2(2*((quat_x*quat_y)+(quat_w+quat_z)),(quat_w*quat_w)+(quat_x*quat_x)-(quat_y*quat_y)-(quat_z*quat_z));
y = atan2(2*((quat_y*quat_z)+(quat_w*quat_x)),(quat_w*quat_w)-(quat_x*quat_x)-(quat_y*quat_y)+(quat_z*quat_z));
z = asin(-2*((quat_x*quat_z)+(quat_w*quat_y)));
return 1;
}