zEsc | Дата: Понедельник, 30.04.2012, 00:00 | Сообщение # 1 |
Global Elite
Группа:
Ангел Хранитель
Сообщений: 896
Награды: 20
Репутация: 856
Замечания: 0%
Статус: ![](/f_icons/off.gif)
| 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 |
|
|
|