pawn Код:
new infmgun[MAX_VEHICLES]
,infmgunextra[MAX_VEHICLES]
,ClosestVehicle[MAX_VEHICLES];
public OnVehicleSpawn(vehicleid)
{
new model = GetVehicleModel( vehicleid );
switch(model)
{
case 411:
{
if( vehhasrocket[ vehicleid ] == 0 )
{
vehhasrocket[ vehicleid ] = 1;
infmgun[vehicleid] = CreateDynamicObject( 3790, 0, 0, 0, 0, 0, 0 );
AttachDynamicObjectToVehicle( infmgun[vehicleid], vehicleid, 02, 0, 0, 0.000000, 0.000000, 90); //Object Model: 2985 |
minigunnum ++;
}
}
}
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(PRESSED(KEY_FIRE) && vehhasrocket[vehid] == 1)
{
vehhasrocket[vehid] = 0;
new Float:x,Float:y,Float:z;
RocketPos(vehid,x,y,z);
DestroyObject(infmgun[vehid]);
infmgunextra[vehid] = CreateObject(3790,x+2,y,z,0,0,180,300);
ClosestVehicle[vehid] = GetClosestVehicle(playerid,150);
UpdateMissile(infmgunextra[vehid],ClosestVehicle[vehid]);
SetTimerEx("missile",250,1,"i",vehid);
}
return 1;
}
stock RocketPos(vehicleid,Float:x,Float:y,Float:z)
{
new mod = GetVehicleModel(vehicleid);
switch(mod)
{
case(411):
{
GetObjectPos(infmgun[vehicleid],x,y,z);
}
}
return 1;
}
stock RocketPosExtra(vehicleid,Float:x,Float:y,Float:z)
{
new mod = GetVehicleModel(vehicleid);
switch(mod)
{
case(411):
{
GetObjectPos(infmgunextra[vehicleid],x,y,z);
}
}
return 1;
}
forward missile(vehid);
public missile(vehid)
{
new Float:ox,Float:oy,Float:oz;
RocketPosExtra(vehid,ox,oy,oz);
if(GetVehicleDistanceFromPoint(ClosestVehicle[vehid],ox,oy,oz) > 5)
{
UpdateMissile(infmgunextra[vehid],ClosestVehicle[vehid]);
}else{
DestroyObject(infmgunextra[vehid]);
CreateExplosion(ox,oy,oz,7,10);
}
return 1;
}
forward VehicleHasDriver(vehicleid);
public VehicleHasDriver(vehicleid)
{
for(new i=0;i<=MAX_PLAYERS;i++)
{
if(IsPlayerInAnyVehicle(i))
{
if(GetPlayerVehicleID(i)==vehicleid)
{
if(GetPlayerState(i) == PLAYER_STATE_DRIVER)
{
return 1;
}
}
}
}
return 0;
}
stock GetClosestVehicle(playerid, Float:range)
{
new Float:p_X;
new Float:p_Y;
new Float:p_Z;
new Float:Distance;
new Float:PretendentDistance = range +1;
new Pretendent;
GetPlayerPos(playerid, p_X, p_Y, p_Z);
for(new vehicleid=1; vehicleid < MAX_VEHICLES; vehicleid++)
{
if(VehicleHasDriver(vehicleid))
{
if(vehicleid != GetPlayerVehicleID(playerid))
{
Distance = GetVehicleDistanceFromPoint(vehicleid, p_X, p_Y, p_Z);
if(Distance <= range && Distance <= PretendentDistance)
{
Pretendent = vehicleid;
PretendentDistance = Distance;
}
}
}
}
return Pretendent;
}
stock Float:GetAngleFromPosToPos(Float:X, Float:Y, Float:PointX, Float:PointY)
{
new Float:Angle;
if(X > PointX && Y > PointY)
Angle = floatabs(atan2(floatsub(PointX, X), floatsub(PointY, Y)));
if(X > PointX && Y <= PointY)
Angle = floatadd(floatabs(atan2(floatsub(Y, PointY), floatsub(PointX, X))), 270.0);
if(X <= PointX && Y > PointY)
Angle = floatadd(floatabs(atan2(floatsub(PointY, Y), floatsub(X, PointX))), 90.0);
if(X <= PointX && Y <= PointY)
Angle = floatadd(floatabs(atan2(floatsub(X, PointX), floatsub(Y, PointY))), 180.0);
return Angle >= 360.0 ? floatsub(Angle, 360.0) : Angle;
}
stock UpdateMissile(objectid, targetvehicle)
{
new
Float: fFromX,
Float: fFromY,
Float: fFromZ,
Float: fToX,
Float: fToY,
Float: fToZ
;
GetObjectPos(objectid, fFromX, fFromY, fFromZ);
GetVehiclePos(targetvehicle, fToX, fToY, fToZ);
new Float: fTargetAngle = GetAngleFromPosToPos(fFromX, fFromY, fToX, fToY);
SetObjectRot(objectid, 0.0, 0, 180+fTargetAngle);
MoveObject(objectid, fToX, fToY, fToZ, 150.0);
}