admin Дата: Воскресенье, 04.09.2011, 23:43:43 | Сообщение # 1
Группа: Администраторы
Сообщений: 3869
Добрый вечер. Хочу поделиться с высшими умами скриптинга такой проблемой: Недавно скачал инклуд - VM (VehicleMissiles), который дает возможность устанавливать ракеты на машины и по нажатии кнопки выстреливать эти ракеты, которые затем взрываются. Но вот в чем проблема. Летят они только в горизонтальной плоскости! Не могли бы вы мне дописать или показать пример, как сделать так, чтобы ракета летела в ту сторону, в какую направлено транспортное средство? Просто я хочу реализовать этот инклуд для самолета Rustler (тот что с пулеметами), если не модифицировать инклуд, то я не смогу расстреливать наземные объекты, потому как, если я нацелился на землю и выстреливаю ракету, то она летит горизонталь прямо, а не вниз, как я нацелился... Выкладываю весь код:Code
#include <a_samp> /*------------------------------------ native AddVehicleMissiles(vehicleid,Float:offsetx,Float:offsetz) native RemoveVehicleMissiles(vehicleid) native IsVehicleHot(vehicleid) -------------------------------------*/ #define MISSILE_DETONATE_TIME 1000 //milliseconds #define MISSILE_EXPLODE_TYPE 10 #define MISSILE_EXPLODE_RADIUS 10.0 #define MISSILE_SPEED 90.0 #define MISSILE_FIRE_KEY 1 new VehicleFire[MAX_VEHICLES]; new VehicleBomb[MAX_VEHICLES][2]; new VehicleSmok[MAX_VEHICLES][2]; new Float:VehicleOffsetX[MAX_VEHICLES]; new Float:VehicleOffsetY[MAX_VEHICLES]; new Float:VehicleOffsetZ[MAX_VEHICLES]; forward VM_OnPlayerKeyStateChange(playerid,newkeys); forward VM_Explode(vehicleid,mode); forward VM_OnVehicleFire(vehicleid,slot); stock AddVehicleMissiles(vehicleid,Float:offsetx,Float:offsetz) { if(!VehicleFire[vehicleid]) { new Float:x,Float:u; GetVehiclePos(vehicleid,x,u,u); if(x != 0) { if(!IsValidObject(VehicleBomb[vehicleid][1])) { VehicleBomb[vehicleid][0] = CreateObject(3790,0.0,0.0,0.0,0,0,0,300.0);//Это у нас идет 1 ракета VehicleBomb[vehicleid][1] = CreateObject(3790,0.0,0.0,0.0,0,0,0,300.0);//А это 2 AttachObjectToVehicle(VehicleBomb[vehicleid][0],vehicleid,offsetx,0,offsetz,0,0,270); AttachObjectToVehicle(VehicleBomb[vehicleid][1],vehicleid,-offsetx,0,offsetz,0,0,270); VehicleOffsetX[vehicleid] = offsetx; VehicleOffsetZ[vehicleid] = offsetz; return 1; } } } return 0; } stock RemoveVehicleMissiles(vehicleid) { if(!VehicleFire[vehicleid]) { if(VehicleBomb[IsValidObject(vehicleid][1])) { if(VehicleBomb[vehicleid][0]) { DestroyObject(VehicleBomb[vehicleid][0]); DestroyObject(VehicleBomb[vehicleid][1]); return 1; } return DestroyObject(VehicleBomb[vehicleid][1]),1; } } return 0; } stock IsVehicleHot(vehicleid) { if(IsValidObject(VehicleBomb[vehicleid][1])) return 1; return 0; } public VM_OnPlayerKeyStateChange(playerid,newkeys) { if((newkeys & MISSILE_FIRE_KEY) == (MISSILE_FIRE_KEY)) { new id = GetPlayerVehicleID(playerid); if(!VehicleFire[id]) { if(id) { if(IsValidObject(VehicleBomb[id][1])) { new Float:x, Float:y, Float:z, Float:a; VehicleFire[id] = 1; if(IsValidObject(VehicleBomb[id][0])) { DestroyObject(VehicleBomb[id][0]); GetVehiclePos(id,x,y,z); GetVehicleZAngle(id,a); a += 270; z += VehicleOffsetZ[id]; x += (VehicleOffsetX[id] * floatsin(-a, degrees)); y += (VehicleOffsetX[id] * floatcos(-a, degrees)); VehicleBomb[id][0] = CreateObject(3790,x,y,z,0,0,a,300.0); VehicleSmok[id][0] = CreateObject(18731,x,y,z-1.3,0,0,0,300.0); a += 90; x += (90 * floatsin(-a, degrees));//я знаю что загадка кроется где то тут, но так как геометрию в школе никогда не любил, поэтому сейчас и мучаюсь, не понимаю y += (90 * floatcos(-a, degrees));// MoveObject(VehicleBomb[id][0],x,y,z,MISSILE_SPEED); MoveObject(VehicleSmok[id][0],x,y,z-1.3,MISSILE_SPEED); SetTimerEx("VM_Explode",MISSILE_DETONATE_TIME,0,"dd",id,0); VM_OnVehicleFire(id,0); return 1; } DestroyObject(VehicleBomb[id][1]); GetVehiclePos(id,x,y,z); GetVehicleZAngle(id,a); a += 90; z += VehicleOffsetZ[id]; x += (VehicleOffsetX[id] * floatsin(-a, degrees)); y += (VehicleOffsetX[id] * floatcos(-a, degrees)); VehicleBomb[id][1] = CreateObject(3790,x,y,z,0,0,a+180,300.0); VehicleSmok[id][1] = CreateObject(18731,x,y,z-1.3,0,0,0,300.0); a += 270; x += (30 * floatsin(-a, degrees)); y += (30 * floatcos(-a, degrees)); MoveObject(VehicleBomb[id][1],x,y,z,MISSILE_SPEED); MoveObject(VehicleSmok[id][1],x,y,z-1.3,MISSILE_SPEED); SetTimerEx("VM_Explode",MISSILE_DETONATE_TIME,0,"dd",id,1); VM_OnVehicleFire(id,1); return 1; } } return 1; } } return 1; } public VM_Explode(vehicleid,mode) { if(IsValidObject(VehicleBomb[vehicleid][mode])) { new Float:x, Float:y, Float:z; GetObjectPos(VehicleBomb[vehicleid][mode],x,y,z); CreateExplosion(x,y,z,MISSILE_EXPLODE_TYPE,MISSILE_EXPLODE_RADIUS); DestroyObject(VehicleBomb[vehicleid][mode]); DestroyObject(VehicleSmok[vehicleid][mode]); VehicleFire[vehicleid] = 0; return 1; } return 1; }
Чтобы протестировать скрипт надо создать новый инклуд VM.inc, засунуть туда код выше, затем в свой ФС добавить это: Code
#include <VM> //добавить в паблик public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) вот это VM_OnPlayerKeyStateChange (playerid, newkeys); //затемв любое место засунуть этот паблик public VM_OnVehicleFire(vehicleid,slot) { AddVehicleMissiles(vehicleid,0.5,0.5); return 1; } //в паблике с командами поместить новую команду if(strcmp(cmd, "/missilescreate", true) == 0) { AddVehicleMissiles(vehicleid,0.5,0.5); }
Автор самого кода:Backwardsman97 Автор написание по русский - Mikeyfry
zm-jail.ru Разработка сайта samp-pawno.ru
Сообщение Добрый вечер. Хочу поделиться с высшими умами скриптинга такой проблемой: Недавно скачал инклуд - VM (VehicleMissiles), который дает возможность устанавливать ракеты на машины и по нажатии кнопки выстреливать эти ракеты, которые затем взрываются. Но вот в чем проблема. Летят они только в горизонтальной плоскости! Не могли бы вы мне дописать или показать пример, как сделать так, чтобы ракета летела в ту сторону, в какую направлено транспортное средство? Просто я хочу реализовать этот инклуд для самолета Rustler (тот что с пулеметами), если не модифицировать инклуд, то я не смогу расстреливать наземные объекты, потому как, если я нацелился на землю и выстреливаю ракету, то она летит горизонталь прямо, а не вниз, как я нацелился... Выкладываю весь код:Code
#include <a_samp> /*------------------------------------ native AddVehicleMissiles(vehicleid,Float:offsetx,Float:offsetz) native RemoveVehicleMissiles(vehicleid) native IsVehicleHot(vehicleid) -------------------------------------*/ #define MISSILE_DETONATE_TIME 1000 //milliseconds #define MISSILE_EXPLODE_TYPE 10 #define MISSILE_EXPLODE_RADIUS 10.0 #define MISSILE_SPEED 90.0 #define MISSILE_FIRE_KEY 1 new VehicleFire[MAX_VEHICLES]; new VehicleBomb[MAX_VEHICLES][2]; new VehicleSmok[MAX_VEHICLES][2]; new Float:VehicleOffsetX[MAX_VEHICLES]; new Float:VehicleOffsetY[MAX_VEHICLES]; new Float:VehicleOffsetZ[MAX_VEHICLES]; forward VM_OnPlayerKeyStateChange(playerid,newkeys); forward VM_Explode(vehicleid,mode); forward VM_OnVehicleFire(vehicleid,slot); stock AddVehicleMissiles(vehicleid,Float:offsetx,Float:offsetz) { if(!VehicleFire[vehicleid]) { new Float:x,Float:u; GetVehiclePos(vehicleid,x,u,u); if(x != 0) { if(!IsValidObject(VehicleBomb[vehicleid][1])) { VehicleBomb[vehicleid][0] = CreateObject(3790,0.0,0.0,0.0,0,0,0,300.0);//Это у нас идет 1 ракета VehicleBomb[vehicleid][1] = CreateObject(3790,0.0,0.0,0.0,0,0,0,300.0);//А это 2 AttachObjectToVehicle(VehicleBomb[vehicleid][0],vehicleid,offsetx,0,offsetz,0,0,270); AttachObjectToVehicle(VehicleBomb[vehicleid][1],vehicleid,-offsetx,0,offsetz,0,0,270); VehicleOffsetX[vehicleid] = offsetx; VehicleOffsetZ[vehicleid] = offsetz; return 1; } } } return 0; } stock RemoveVehicleMissiles(vehicleid) { if(!VehicleFire[vehicleid]) { if(VehicleBomb[IsValidObject(vehicleid][1])) { if(VehicleBomb[vehicleid][0]) { DestroyObject(VehicleBomb[vehicleid][0]); DestroyObject(VehicleBomb[vehicleid][1]); return 1; } return DestroyObject(VehicleBomb[vehicleid][1]),1; } } return 0; } stock IsVehicleHot(vehicleid) { if(IsValidObject(VehicleBomb[vehicleid][1])) return 1; return 0; } public VM_OnPlayerKeyStateChange(playerid,newkeys) { if((newkeys & MISSILE_FIRE_KEY) == (MISSILE_FIRE_KEY)) { new id = GetPlayerVehicleID(playerid); if(!VehicleFire[id]) { if(id) { if(IsValidObject(VehicleBomb[id][1])) { new Float:x, Float:y, Float:z, Float:a; VehicleFire[id] = 1; if(IsValidObject(VehicleBomb[id][0])) { DestroyObject(VehicleBomb[id][0]); GetVehiclePos(id,x,y,z); GetVehicleZAngle(id,a); a += 270; z += VehicleOffsetZ[id]; x += (VehicleOffsetX[id] * floatsin(-a, degrees)); y += (VehicleOffsetX[id] * floatcos(-a, degrees)); VehicleBomb[id][0] = CreateObject(3790,x,y,z,0,0,a,300.0); VehicleSmok[id][0] = CreateObject(18731,x,y,z-1.3,0,0,0,300.0); a += 90; x += (90 * floatsin(-a, degrees));//я знаю что загадка кроется где то тут, но так как геометрию в школе никогда не любил, поэтому сейчас и мучаюсь, не понимаю y += (90 * floatcos(-a, degrees));// MoveObject(VehicleBomb[id][0],x,y,z,MISSILE_SPEED); MoveObject(VehicleSmok[id][0],x,y,z-1.3,MISSILE_SPEED); SetTimerEx("VM_Explode",MISSILE_DETONATE_TIME,0,"dd",id,0); VM_OnVehicleFire(id,0); return 1; } DestroyObject(VehicleBomb[id][1]); GetVehiclePos(id,x,y,z); GetVehicleZAngle(id,a); a += 90; z += VehicleOffsetZ[id]; x += (VehicleOffsetX[id] * floatsin(-a, degrees)); y += (VehicleOffsetX[id] * floatcos(-a, degrees)); VehicleBomb[id][1] = CreateObject(3790,x,y,z,0,0,a+180,300.0); VehicleSmok[id][1] = CreateObject(18731,x,y,z-1.3,0,0,0,300.0); a += 270; x += (30 * floatsin(-a, degrees)); y += (30 * floatcos(-a, degrees)); MoveObject(VehicleBomb[id][1],x,y,z,MISSILE_SPEED); MoveObject(VehicleSmok[id][1],x,y,z-1.3,MISSILE_SPEED); SetTimerEx("VM_Explode",MISSILE_DETONATE_TIME,0,"dd",id,1); VM_OnVehicleFire(id,1); return 1; } } return 1; } } return 1; } public VM_Explode(vehicleid,mode) { if(IsValidObject(VehicleBomb[vehicleid][mode])) { new Float:x, Float:y, Float:z; GetObjectPos(VehicleBomb[vehicleid][mode],x,y,z); CreateExplosion(x,y,z,MISSILE_EXPLODE_TYPE,MISSILE_EXPLODE_RADIUS); DestroyObject(VehicleBomb[vehicleid][mode]); DestroyObject(VehicleSmok[vehicleid][mode]); VehicleFire[vehicleid] = 0; return 1; } return 1; }
Чтобы протестировать скрипт надо создать новый инклуд VM.inc, засунуть туда код выше, затем в свой ФС добавить это: Code
#include <VM> //добавить в паблик public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) вот это VM_OnPlayerKeyStateChange (playerid, newkeys); //затемв любое место засунуть этот паблик public VM_OnVehicleFire(vehicleid,slot) { AddVehicleMissiles(vehicleid,0.5,0.5); return 1; } //в паблике с командами поместить новую команду if(strcmp(cmd, "/missilescreate", true) == 0) { AddVehicleMissiles(vehicleid,0.5,0.5); }
Автор самого кода:Backwardsman97 Автор написание по русский - Mikeyfry Автор - admin Дата добавления - 04.09.2011 в 23:43:43