SA-MP Forums Archive
skycrane - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+--- Thread: skycrane (/showthread.php?tid=501748)



skycrane - Pillhead2007 - 20.03.2014

im trying to make a skycrane for helicopter I got most things right but I cant seem to get the closest car to attach to the object that's attached to my helicopter here is my code please help me
PHP код:
new Float:VMX,Float:VMY,Float:VMZ;
new 
Magnet4Players[MAX_PLAYERS];
new 
MagnetTimer;
forward MagnetMovementUp(playerid);
forward MagnetMovementDown(playerid);
enum MInfo
{
  
Float:MagnetPos,
  
Magnet,
  
Magnetic,
  
IsMagnetActive,
};
new 
MagnetInfo[MAX_PLAYERS][MInfo];
stock GetClosestVehicle(playerid, Float:Range = 100.0)
{
    new 
ClosestVehicle;
    new 
Float:ClosestDist = 100000.0;
    new 
Float:DistX;
    new 
Float:DistY;
    new 
Float:DistZ;
    new 
Float:px;
    new 
Float:py;
    new 
Float:pz;
    new 
Float:CheckDist;
    
// Get the players position
    
GetPlayerPos(playerid, px, py, pz);
    
// Loop through vehicles to find cloest vehicle
    
for(new i = 0; i < MAX_VEHICLES; i++)
    {
        
// Vehicle doesn't exist
        
if(!GetVehicleModel(i)) continue;
        
// Get vehicle position
        
GetVehiclePos(i, DistX, DistY, DistZ);
        
// Get the distance
        
CheckDist = floatsqroot(
                    
floatpower(floatsub(DistX, px), 2.0) +
                    
floatpower(floatsub(DistY, py), 2.0) +
                    
floatpower(floatsub(DistZ, pz), 2.0));
        
// Distance less than range?
        
if(CheckDist <= Range)
        {
            
// Distance less than cloest distance, new cloest distance!
            
if(CheckDist < ClosestDist)
            {
                
ClosestDist = CheckDist;
                
ClosestVehicle = i;
            }
        }
    }
    
// Cloest less than or equal to the range return the closest vehicle ID
    
if(ClosestDist <= Range) return ClosestVehicle;
    
// no vehichle? return INVALID_VEHICLE_ID
    
return INVALID_VEHICLE_ID;
}
stock HelicopterMagnet(playerid, vehicleid)
{
  new 
modelid = GetVehicleModel(vehicleid);
  switch(
modelid)
  {
    case 
417:
    {
      
GetVehiclePos(vehicleid,VMX,VMY,VMZ);
      
Magnet4Players[playerid] = CreateObject(3053, VMX, VMY, VMZ-0.0, 0.0, 0.0, 0.0, 96);
      
MagnetInfo[playerid][MagnetPos] = 0.0;
      
AttachObjectToVehicle(Magnet4Players[playerid], vehicleid, 0.0, 0.0, MagnetInfo[playerid][MagnetPos], 0.0, 0.0, 0.0);
      
MagnetInfo[playerid][Magnet] = 1;
      
MagnetInfo[playerid][Magnetic] = 1;
      
MagnetInfo[playerid][IsMagnetActive] = 0;
      return 
1;
    }
  }
  return 
1;
}
stock DestroyMagnet(playerid)
{
  if(
MagnetInfo[playerid][Magnetic] == 1)
  {
    
MagnetInfo[playerid][Magnet] = 0;
    
DestroyObject[Magnet4Players[playerid]);
    return 
1;
  }
  return 
1;
}
public 
MagnetMovementUp(playerid)
{
  new 
vehicleid = GetPlayerVehicleID(playerid);
  if(
MagnetInfo[playerid][MagnetPos] <= -1.4)
  {
    
GetObjectPos(Magnet4Players[playerid], VMX, VMY, VMZ);
    
MagnetInfo[playerid][MagnetPos] = MagnetInfo[playerid][MagnetPos]+0.1;
    if(
MagnetInfo[playerid][MagnetPos] >= -1.5)
    {
      
MagnetInfo[playerid][MagnetPos] = -1.5;
    }
    
MoveObject(Magnet4Players[playerid], VMX, VMY, MagnetInfo[playerid][MagnetPos],1.0);
    
AttachObjectToVehicle(Magnet4Players[playerid], vehicleid, 0.0, 0.0, MagnetInfo[playerid][MagnetPos], 0.0, 0.0, 0.0);
    
SetCameraBehindPlayer(playerid);
  }
  return 
1;
}
public 
MagnetMovementDown(playerid)
{
  new 
vehicleid = GetPlayerVehicleID(playerid);
  if(
MagnetInfo[playerid][MagnetPos] <= 0.0)
  {
    
GetObjectPos(Magnet4Players[playerid], VMX, VMY, VMZ);
    
MagnetInfo[playerid][MagnetPos] = MagnetInfo[playerid][MagnetPos]-0.1;
    
MoveObject(Magnet4Players[playerid], VMX, VMY, MagnetInfo[playerid][MagnetPos],1.0);
    
AttachObjectToVehicle(Magnet4Players[playerid], vehicleid, 0.0, 0.0, MagnetInfo[playerid][MagnetPos], 0.0, 0.0, 0.0);
    
SetCameraBehindPlayer(playerid);
  }
  else if(
MagnetInfo[playerid][MagnetPos] >= 1.5)
  {
    
GetObjectPos(Magnet4Players[playerid], VMX, VMY, VMZ);
    
MagnetInfo[playerid][MagnetPos] = -1.5;
    
MoveObject(Magnet4Players[playerid], VMX, VMY, MagnetInfo[playerid][MagnetPos],1.0);
    
AttachObjectToVehicle(Magnet4Players[playerid], vehicleid, 0.0, 0.0, MagnetInfo[playerid][MagnetPos], 0.0, 0.0, 0.0);
  }
  return 
1;
}public 
OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
  if(
PRESSED(KEY_ANALOG_UP))
  {
    
MagnetTimer = SetTimer("MagnetMovementUp",30,1);
    return 
1;
  }
  if(
PRESSED(KEY_ANALOG_DOWN))
  {
    
MagnetTimer = SetTimer("MagnetMovementDown",30,1);
    return 
1;
  }
  if(
RELEASED(KEY_ANALOG_UP))
  {
    
KillTimer(MagnetTimer);
  }
  if(
RELEASED(KEY_ANALOG_DOWN))
  {
    
KillTimer(MagnetTimer);
  }
  if(
PRESSED(KEY_CROUCH))
  {
    if(
MagnetInfo[playerid][Magnetic] == 1)
    {
      if(
MagnetInfo[playerid][IsMagnetActive] == 0)
      {
        new 
veh = GetClosestVehicle(playerid, 100.0);
        if(
veh != INVALID_VEHICLE_ID)
        {
          
MagnetInfo[playerid][IsMagnetActive] = 1;
          
GetObjectPos(Magnet4Players[playerid], VMX, VMY, MagnetInfo[playerid][MagnetPos]);
          
AttachTrailerToVehicle(veh, Magnet4Players[playerid]);
          
//AttachTrailerToVehicle(Magnet4Players[playerid],veh,VMX,VMY, MagnetInfo[playerid][MagnetPos],0.0,0.0,0.0);
        
}
      }
      else
      {
        
MagnetInfo[playerid][IsMagnetActive] = 0;
      }
    }
  }
  return 
1;
}
public 
OnPlayerStateChange(playerid, newstate, oldstate)
{
  if(
newstate == 2 && oldstate == 1)
  {
    new 
vehicleid = GetPlayerVehicleID(playerid);
    
HelicopterMagnet(playerid,vehicleid);
  }
  return 
1;
} 



Re: skycrane - Pillhead2007 - 21.03.2014

anyone still need help with this ive made about 5 filterscripts different ways with other peoples distance native still no joy any1 skilled enough starting do me heading I don't want no timers it will lag too much want it smooth as f*CK please please help wrecking my head hahaha


Re: skycrane - Carac - 21.03.2014

Don't try to get stressed and keep tight mate, your answer will probably come soon enough.


Re: skycrane - Pillhead2007 - 05.07.2014

still hasn't came lol


Re: skycrane - Dignity - 05.07.2014

The code seems to be okay, you just need to experiment with things. Did you try playing around with the range?

pawn Код:
stock GetClosestVehicle(playerid, Float:Range = 100.0)