Hiho
Ich habe gerade überhaupt keine Ahnung, wie ich das machen soll.
Im Moment habe ich ein Blitzersystem, dass IsPlayerInRangeOfPoint benutzt. Nur blitzt der ja rundum über einen bestimmten Radius.
Nur wie kann ich machen, dass der entweder vorne oder hinten blitzt?
Hab schon iwie gedacht mit der Facing Angle des Fahrzeugs und der Rotation des Blitzers (x,y,z je auf 0.0).
Kennt sich da jemand aus..?
MFG
Alles anzeigen
Ich hab dir mal was kleines gebastelt
stock Check_If_Point_In_Triangle(playerid,Float:X,Float:Y,Float:Z,Float:R,Float:MAX_Z)
{
new const Float:Winkel = 60.0;
new const Float:Weite = 30.0;
new Float:Pos[8];
GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
Pos[4] = Y+(Weite*floatsin(Winkel+R,degrees));
Pos[5] = Y-(Weite*floatsin(R-Winkel,degrees));
Pos[6] = X+(Weite*floatcos(Winkel+R,degrees));
Pos[7] = X-(Weite*floatcos(R-Winkel,degrees));
return (((Y-Pos[4])*(Pos[0]-X) + (Pos[6]-X)*(Pos[1]-Y)) <0 ||((Pos[4]-Pos[5])*(Pos[0]-Pos[6]) + (Pos[7]-Pos[6])*(Pos[1]-Pos[4])) <0 ||((Pos[5]-Y)*(Pos[0]-Pos[7]) + (X-Pos[7])*(Pos[1]-Pos[5])) <0 || Pos[2] > MAX_Z || Pos[2] < Z) ? 0:1;
}
damit kannst du jeweilig abprüfen ob der spieler von einem gewissen punkt in einem dreieck steht
und um das ganze selbst zu testen da ich mal davon ausgehe das du dir bestimmt nicht vorstellen kannst was genau die berechnung macht und wie es benutzt wird
noch ein beispiel code
new Float:Array[4];
if(!strcmp("/test",cmdtext)){
new const Float:Winkel = 60.0;
new const Float:Weite = 30.0;
GetPlayerPos(playerid,Array[0],Array[1],Array[2]);
GetPlayerFacingAngle(playerid,Array[3]);
CreateObject(18880,Array[0],Array[1],Array[2]-1.0,0.0,0.0,Array[3]-180);
CreateObject(18880,Array[0]+(Weite*floatcos(Winkel+Array[3],degrees)),Array[1]+(Weite*floatsin(Winkel+Array[3],degrees)),Array[2]-1.0,0.0,0.0,Array[3]+180);
CreateObject(18880,Array[0]-(Weite*floatcos(Array[3]-Winkel,degrees)),Array[1]-(Weite*floatsin(Array[3]-Winkel,degrees)),Array[2]-1.0,0.0,0.0,Array[3]+180);
return 1;
}else if(!strcmp("/set",cmdtext)){
new str_1[30];
format(str_1,30,"Du bist %s",(Check_If_Point_In_Triangle(playerid,Array[0],Array[1],Array[2]-1.0,Array[3],20.0))?("drinnen"):("drausen"));
SendClientMessage(playerid,-1,str_1);
return 1;
}
Es kann gut sein das es vllt kürzer geht aber ein anderer weg ist mir beim durchgehen nicht eingefallen als das über die winkelfunktionen zu machen
falls einer einen einfacheren weg hätte könnte er ihn ja auch drunter posten.
//edit
was du auch machen könntest wäre die Zonen per Streamer Plugin zu erstellen mit der Funktion
CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1);
das wär wohl doch das einfachste