01:28
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 1
  • 1
Модератор форума: Alcoholik  
[FS] LGMS
zEscДата: Понедельник, 30.04.2012, 00:00 | Сообщение # 1
Global Elite
Группа: Ангел Хранитель
Сообщений: 896
Награды: 20
Репутация: 856
Замечания: 0%
Статус:
LGMS



LGMS - Система лазерного наведения ракет


Автор: OFFREAL


Идея: Игрок используя снайперскую винтовку наводит красный маркер на предполагаемую цель, после чего запрашивает ракетный удар с воздуха


Использование:
- Команда для начала наведения /aim
- Приближение/удаление маркера zoom+/- винтовки
- Запрос атаки кнопка медленный шаг (ID 1024)
- Чтобы разместить красный маркер точно на земле, следите за лучом высотомера под маркером






Недостатки системы:
[-] Одновременно может использовать только один игрок
[-] Надо следить за высотомером при наведении
[-] Ракеты пролетают сквозь препятствия, здания, объекты
[-] Максимальный радиус прицеливания 100 метров
[-] Для нормального использования надо привыкнуть


Достоинства системы:
[+] Используется всего один таймер
[+] Снайперка превращается в грозное оружие
[+] Не используется SetPlayerPosFindZ
[+] Не сдвигается камера игрока
[+] Маркер устанавливается только в режиме прицеливания


[cut=Код]
Code
/*
lgms.pwn
Laser-Guided Missiles System [LGMS] by OFFREAL
(Система лезерного наведения ракет)
01.07.2011
NOT Commercial - OpenSource
*/

#include <a_samp>

#define VERSION "1.0 beta" // версия

#define POINT 19282    // указатель цели
#define ROCKET 354  // модель ракеты
#define LASER 18643 // высотомер

#define MAX_RAD 100 // максимальный радиус прицела
#define MIN_RAD 10  // минимальный радиус прицела
#define AIM_TIME 30 // максимальное время прицеливания
#define ROCKETS 3   // количесво ракет за 1 удар

#define AIRF16 minrand(250,350) // случайное положения бомбардировщика

#define R_SPD 50.0  // скорость ракет

// Параметры системы:
new
      Float:AimRAD,    // радиус прицела
      PlayerAIMER = INVALID_PLAYER_ID,    // игрок - наводчик
      SystemSTATE,    // статус системы: 0 свободна, 1 прицеливание, 2 полет ракет
      Defeat,            // подтверждение удара
      AimerTIME,      // время прицеливания
      Float:AimerVECTOR[3],   // вектор камеры игрока - наводчика
      Float:CamPOS[3],        // позиция камеры игрока - наводчика
      Float:BangPOS[3],       // точка удара
      AimUpdateCount;         // счетчик срабатывания основного таймера

// Таймеры:
new AimTIMER;    // таймер наведения
forward AimUpdate(); // функция таймера

// Объекты
new
      Rocket[ROCKETS],
      RedGlow = INVALID_OBJECT_ID,
      AimerH = INVALID_OBJECT_ID;

//=========================================================

public OnFilterScriptInit()
{
      AimTIMER = SetTimer("AimUpdate", 100, 1);
      RedGlow = CreateObject(POINT, 0.00, 0.00, 10000.00, 0.00, 0.00, 0.00);
        
      print("\n");
      printf("filterscript LGMS v%s", VERSION);
      print("Laser-Guided Missiles System [LGMS] by OFFREAL");
      print("\n");
        
      return 1;
}

public OnFilterScriptExit()
{
      DestroyObject(RedGlow);
        
      for(new r=0; r<ROCKETS; r++)
      {
          DestroyObject(Rocket[r]);
      }
        
      DestroyPlayerObject(PlayerAIMER, AimerH);
      KillTimer(AimTIMER);
      return 1;
}

stock minrand(min, max)
{
     return random(max - min) + min;
}

public OnPlayerCommandText(playerid,cmdtext[])
{
      new idx;
      new cmd[128];
      cmd = strtok(cmdtext,idx);
      if(!strcmp(cmd,"/aim",true))
      {
          if(GetPlayerWeapon(playerid) != 34)
          {
              SendClientMessage(playerid, -1, "[LGMS] Для наводки ракет используется прицел снайперской винтовки, выберите это оружие!");
              return 1;
          }
          if(!SystemSTATE)
          {
              SendClientMessage(playerid, -1, "[LGMS] Вход в режим прицеливания, у вас есть " #AIM_TIME " секунд пока самолет в воздухе!!!");
              SystemSTATE = 1;
              PlayerAIMER = playerid;
              AimerTIME = 0;
              AimUpdateCount = 0;
              AimRAD = 30.00;
              AimerH = CreatePlayerObject(playerid, LASER, 0.00, 0.00, 10000.00, 00.00, 90.00, 0.00);
              GameTextForPlayer(playerid, "~r~attack key:~n~~k~~SNEAK_ABOUT~",1999, 4);
          }
          else
          {
              SendClientMessage(playerid, -1, "[LGMS] Самолеты в пути, ждать осталось меньше минуты!");
          }
            
          return 1;
      }
      return 0;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{

      if(playerid == PlayerAIMER && SystemSTATE == 1)
      {
        
          if((newkeys & 8) && (newkeys & 128)) // отдаление
          {
                 if(AimRAD > MIN_RAD)
              {
                  AimRAD -= 2.0;
              }
          }

          if((newkeys & 32) && (newkeys & 128)) // приближение
          {
              if(AimRAD < MAX_RAD)
              {
                  AimRAD += 1.0;
              }
          }
                
          if(newkeys & 1024)
          {
              SystemSTATE = 2;
                     
              new Float:RND[2];
              RND[0] =  BangPOS[0] + ( random(2) ? -AIRF16 : AIRF16 );
              RND[1] =  BangPOS[1] + ( random(2) ? -AIRF16 : AIRF16 );

              //printf("X %f | Y %f | R %f", RND[0], RND[1], AimRAD);

              new ftime = 3600000, bangtime;

              for(new r=0; r<ROCKETS; r++)
              {
                  Rocket[r] = CreateObject(ROCKET,RND[0]+minrand(-30,30),RND[1]+minrand(-30,30),BangPOS[2]+200.00+minrand(-30,30),0.00,0.00,0.00);
                  bangtime = MoveObject(Rocket[r], BangPOS[0]+minrand(-10,10), BangPOS[1]+minrand(-10,10), BangPOS[2], 50.00 );
                  if(bangtime < ftime)
                  {
                      ftime = bangtime;
                  }
              }
                     
              DestroyPlayerObject(playerid, AimerH);
              AimerH = INVALID_OBJECT_ID;
                     
              new str[128];
              format(str,sizeof(str),"[LGMS] Цель захвачена, удар через %d секунд", ftime/1000);
              SendClientMessage(playerid, -1, str);
              AimerTIME = 0;
              //PlayerAIMER = INVALID_PLAYER_ID;
          }
      }
      return 1;
}

public AimUpdate()
{
      if(SystemSTATE != 1){return;}
      if(PlayerAIMER == INVALID_PLAYER_ID){return;}
      new keys[3];
      GetPlayerKeys(PlayerAIMER, keys[0],keys[1],keys[2]);
      //printf("Keys %d", keys[0]);
      if( keys[0] & 128 && GetPlayerWeapon(PlayerAIMER) == 34)
      {
          GetPlayerCameraFrontVector(PlayerAIMER, AimerVECTOR[0], AimerVECTOR[1], AimerVECTOR[2]);
          GetPlayerCameraPos(PlayerAIMER, CamPOS[0], CamPOS[1], CamPOS[2]);
          BangPOS[0] = CamPOS[0] + AimRAD*AimerVECTOR[0];
          BangPOS[1] = CamPOS[1] + AimRAD*AimerVECTOR[1];
          BangPOS[2] = CamPOS[2] + AimRAD*AimerVECTOR[2];
          SetObjectPos(RedGlow, BangPOS[0], BangPOS[1], BangPOS[2]);
          SetPlayerObjectPos(PlayerAIMER, AimerH, BangPOS[0], BangPOS[1], BangPOS[2]);
        }

      if( ++AimUpdateCount%10 == 0 )
      {
          AimerTIME++;
          //printf("AUC %d | AT %d", AimUpdateCount, AimerTIME);
          if(AimerTIME >= AIM_TIME)
          {
              SystemSTATE = 0;
              AimerTIME = 0;
              SendClientMessage(PlayerAIMER, -1, "[LGMS] Вы не успели прицелиться, самолет улетел!");
              SetObjectPos(RedGlow,0.00, 0.00, 10000.00);
              DestroyPlayerObject(PlayerAIMER, AimerH);
              AimerH = INVALID_OBJECT_ID;
                 PlayerAIMER = INVALID_PLAYER_ID;
          }
      }
}

public OnObjectMoved(objectid)
{
      for(new r=0; r<ROCKETS; r++)
      {
          if( objectid == Rocket[r] )
          {
              Defeat++;
              //printf("defeat %d", Defeat);
              GetObjectPos(Rocket[r],BangPOS[0], BangPOS[1], BangPOS[2]);
              DestroyObject(Rocket[r]);
              CreateExplosion(BangPOS[0], BangPOS[1], BangPOS[2], 6, 10.0);
              CreateExplosion(BangPOS[0], BangPOS[1], BangPOS[2], 13, 10.0);
          }
      }
        
      if(Defeat >= ROCKETS)
      {
          SendClientMessage(PlayerAIMER, -1, "[LGMS] Произведен ракетный удар по цели!");
          SetObjectPos(RedGlow,0.00, 0.00, 10000.00);
          SystemSTATE = 0;
          AimerTIME = 0;
          PlayerAIMER = INVALID_PLAYER_ID;
          Defeat = 0;
      }
        
      return 1;
}

stock strtok(const string[], &index)
{
      new length = strlen(string);
      while ((index < length) && (string[index] <= ' '))
      {
          index++;
      }

      new offset = index;
      new result[20];
      while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
      {
          result[index - offset] = string[index];
          index++;
      }
      result[index - offset] = EOS;
      return result;
}

[/cut]





Сообщение отредактировал DjCubex - Понедельник, 30.04.2012, 00:02
AirKiteДата: Понедельник, 30.04.2012, 03:01 | Сообщение # 2
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
Проще было бы реализовать через OnPlayerClickMap. Кстати, скрипт я так понял работает с Map Andreas ???


[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)


Jabber: airkite@qip.ru
[Addon] QuickBinder
[FS] Online Players Record
oleg_tarantulaДата: Понедельник, 30.04.2012, 12:34 | Сообщение # 3
Постоялец
Группа: Продвинутые
Сообщений: 345
Награды: 5
Город: -
Репутация: 118
Замечания: 60%
Статус:
Неплохо так. Отличная реализация.


  • Страница 1 из 1
  • 1
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua