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