• Страница 1 из 1
  • 1
Форум » PAWNO » Уроки Pawno » Cruise Control - удержание постоянной скорости автомобиля.
Cruise Control - удержание постоянной скорости автомобиля.
Дмитрий Дата: Четверг, 05.04.2012, 20:45 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий

Здравствуйте!Суть системы думаю понятна из названия. Набираем нужную нам скорость и фиксируем её с помощью системы круиз контроля, то есть авто двигается с постоянной скоростью.

И так ко всем глобальным переменным добавляем:


Code
[size=14]new Ctrl = KEY_ACTION;   
new Float:CruiseSpeed[MAX_PLAYERS];   
new Float:PlayerHeadingAngle[MAX_PLAYERS];   
new bool:Control[MAX_PLAYERS];  [/size]


Далее ко всем forward's:

Code
[size=14]forward CruiseControl(playerid); [/size] 


В public OnPlayerConnect(playerid):

Code
Control[playerid] = false;


Добавим команду в public OnPlayerCommandText(playerid, cmdtext[]):

Code
[size=14]if(strcmp(cmd, "/chelp", true) == 0)   
      {   
          if(IsPlayerConnected(playerid))   
          {   
              SendClientMessage(playerid, COLOR_GREEN," ________________________________________________________________________");   
              SendClientMessage(playerid, COLOR_GRAD3," Cистема круиз контроля для поддержания постоянной скорости автомобиля.");   
              SendClientMessage(playerid, COLOR_GRAD4," Включение: наберите нужную скорость и нажмите левый CTRL");   
              SendClientMessage(playerid, COLOR_GRAD4," Выключение: нажмите также левый CTRL или просто остановите авто");   
              SendClientMessage(playerid, COLOR_GREEN," ________________________________________________________________________");   
          }   
          return true;   
      }   [/size]


Добавим активацию системы по кнопке LCTRL в public OnPlayerKeyStateChange(playerid, newkeys, oldkeys):

Code
[size=13]if (CruiseSpeed[playerid] != 0.00 && (newkeys & Ctrl) && Control[playerid] == true)   
      {   
          CruiseSpeed[playerid] = 0.00;   
          Control[playerid] = false;   
          return true;   
      }   
      if ((newkeys & Ctrl) && !(oldkeys & Ctrl) && IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)   
      {   
          new vid = GetPlayerVehicleID(playerid);   
          if(GetVehicleModel(vid) == 510 || GetVehicleModel(vid) == 481 || vid == 186 || vid ==  187 || vid ==  188 || vid ==  189) return false;   
          if (GetVehicleSpeed(vid) == 0) return false;   
          new Float:x, Float:y, Float:z;   
          GetVehicleVelocity(vid, x, y, z);   
          Control[playerid] = true;   
          GetVehicleZAngle(vid, PlayerHeadingAngle[playerid]);   
          DistanceFlat(0, 0, x, y, CruiseSpeed[playerid]);   
          SetTimerEx("CruiseControl", 500, false, "d", playerid);   
          SendClientMessage(playerid, 0x2641FEAA, "* Круиз контроль включен");   

                           }   [/size]


В конец мода добавим функции системы:

Code
[size=13]public CruiseControl(playerid)   
{   
      new vid = GetPlayerVehicleID(playerid);   
      new Float:x, Float:y, Float:z;   
      GetVehicleVelocity(vid, x, y, z);   

      new keysp, ud, lr;   
      GetPlayerKeys(playerid, keysp, ud, lr);   

      new Float:angle, Float:heading, Float:speed;   
      GetVehicleZAngle(vid, angle);   
      GetVehicleHeadingAngle(vid, heading);   
      DistanceFlat(0, 0, x, y, speed);   
         
      if (CruiseSpeed[playerid] == 0.00 || GetPlayerState(playerid) != PLAYER_STATE_DRIVER || (speed < 0.7 * CruiseSpeed[playerid]) || z > 1 ||   
              (floatabs(angle - heading) > 50 && floatabs(angle - heading) < 310))   
      {                     
          CruiseSpeed[playerid] = 0.00;   
          Control[playerid] = false;   
          SendClientMessage(playerid, 0x2641FEAA, "* Круиз контроль выключен");    
          return false;   
      }   
      GetVehicleZAngle(vid, PlayerHeadingAngle[playerid]);   
      GetXYVelocity(vid, x, y, CruiseSpeed[playerid]);   
      SetVehicleVelocity(vid, x, y, z);   
      return SetTimerEx("CruiseControl", 500, false, "d", playerid);   
}   

GetXYVelocity(vehicleid, &Float:x, &Float:y, Float:speed)   
{   
      new Float:a;   
      x = 0.0;   
      y = 0.0;   
      GetVehicleZAngle(vehicleid, a);   
      x += (speed * floatsin(-a, degrees));   
      y += (speed * floatcos(-a, degrees));   
}   

GetAngleToXY(Float:X, Float:Y, Float:CurrentX, Float:CurrentY, &Float:Angle)   
{   
      Angle = atan2(Y-CurrentY, X-CurrentX);   
      Angle = floatsub(Angle, 90.0);   
      if(Angle < 0.0) Angle = floatadd(Angle, 360.0);   
}   

GetVehicleHeadingAngle(vehicleid, &Float:a)   
{   
      new Float:x, Float:y, Float:z;   
      GetVehicleVelocity(vehicleid, x, y, z);   
      GetAngleToXY(x, y, 0, 0, a);   
}   
GetVehicleSpeed(vehicleid)   
{   
      new Float:Vx, Float:Vy, Float:Vz;   
      GetVehicleVelocity(vehicleid, Vx, Vy, Vz);   
      new Float:rtn;   
      rtn = floatsqroot(floatpower(Vx*100,2) + floatpower(Vy*100,2));   
      rtn = floatsqroot(floatpower(rtn,2) + floatpower(Vz*100,2));   
      return floatround(rtn);   
}   
DistanceFlat(Float:ax, Float:ay, Float:bx,Float:by, &Float:distance)   
{   
      distance = floatsqroot(floatpower(bx-ax,2)+floatpower(by-ay,2));   
      return floatround(distance);   
}   [/size]


Вот и всё. Cruise Control готов, садимся в автомобиль, набираем нужную нам скорость и жмем левый CTRL.
Для остановки жмём также CTRL или просто тормозим.


From Russia With Love!
Форум » PAWNO » Уроки Pawno » Cruise Control - удержание постоянной скорости автомобиля.
  • Страница 1 из 1
  • 1
Поиск: