BigETI

invasion.pwn

Nov 13th, 2014
417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 11.03 KB | None | 0 0
  1. #include <a_samp>
  2. #include <streamer_0_3z>
  3. #include <list>
  4.  
  5. enum invader_type_enum
  6. {
  7.     invader_type_mother,
  8.     invader_type_droid
  9. }
  10.  
  11. enum ship_part_enum
  12. {
  13.     ship_part_modelid,
  14.     Float:ship_part_x,
  15.     Float:ship_part_y,
  16.     Float:ship_part_z,
  17.     Float:ship_part_rotx,
  18.     Float:ship_part_roty,
  19.     Float:ship_part_rotz
  20. }
  21.  
  22. MEM::struct invader_struct
  23. {
  24.     Pointer:invader_object_arr,
  25.     Pointer:invader_object_data_arr,
  26.     invader_object_arr_len,
  27.     invader_type,
  28.     Float:invader_health
  29. }
  30.  
  31. static LIST::init<invader_list>;
  32.  
  33. static const mother_ship_data[][ship_part_enum] = {
  34.     {18876, 0.0, 0.0, 0.0, 0.0, 270.0, 270.0},
  35.     {2932, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
  36.     {2934, 0.0, -7.15, 0.0, 0.0, 0.0, 0.0},
  37.     {18876, 0.0, -16.0, 0.0, 0.0, 270.0, 270.0},
  38.     {18876, 0.0, -4.0, 0.0, 0.0, 270.0, 270.0},
  39.     {18876, 0.0, -8.0, 0.0, 0.0, 270.0, 270.0},
  40.     {18876, 0.0, -12.0, 0.0, 0.0, 270.0, 270.0},
  41.     {354, -2.55, 6.4, 0.07, 0.0, 0.0, 90.0},
  42.     {354, 2.71, 6.4, 0.07, 0.0, 0.0, 90.0},
  43.     {354, -2.55, -13.0, 0.07, 0.0, 0.0, 90.0},
  44.     {354, 2.71, -13.0, 0.07, 0.0, 0.0, 90.0}
  45. };
  46.  
  47. static const droid_ship_data[][ship_part_enum] = {
  48.     {2976, 0.0, 0.0, 0.0, 270.0, 0.0, 0.0},
  49.     {18646, 0.0, -0.01, 0.0, 90.0, 0.0, 0.0}
  50. };
  51.  
  52. stock ListIt:CreateInvader(invader_type_enum:type, Float:health, Float:x, Float:y, Float:z, Float:rotz)
  53. {
  54.     new t_invader_data[invader_struct], i;
  55.     switch(type)
  56.     {
  57.         case invader_type_mother:
  58.         {
  59.             if((t_invader_data[invader_object_arr] = MEM::malloc(t_invader_data[invader_object_arr_len] = sizeof mother_ship_data)) == Pointer:NULL) return ListIt:NULL;
  60.             if((t_invader_data[invader_object_data_arr] = MEM::malloc((sizeof mother_ship_data)*_:ship_part_enum)) == Pointer:NULL)
  61.             {
  62.                 MEM::free(t_invader_data[invader_object_arr]);
  63.                 return ListIt:NULL;
  64.             }
  65.             for(i = 0; i < sizeof mother_ship_data; i++)
  66.             {
  67.                 MEM::set_arr(t_invader_data[invader_object_data_arr], i*_:ship_part_enum, mother_ship_data[i]);
  68.                 MEM::set_val(t_invader_data[invader_object_arr], i, CreateDynamicObject(mother_ship_data[i][ship_part_modelid],
  69.                     ((mother_ship_data[i][ship_part_x]*floatcos(360.0-rotz, degrees))+(mother_ship_data[i][ship_part_y]*floatsin(360.0-rotz, degrees)))+x, (((-mother_ship_data[i][ship_part_x])*floatsin(360.0-rotz, degrees))+(mother_ship_data[i][ship_part_y]*floatcos(360.0-rotz, degrees)))+y, mother_ship_data[i][ship_part_z]+z, mother_ship_data[i][ship_part_rotx], mother_ship_data[i][ship_part_roty], mother_ship_data[i][ship_part_rotz]+rotz));
  70.                 //MEM::set_val(t_invader_data[invader_object_arr], i, CreateDynamicObject(mother_ship_data[i][ship_part_modelid], mother_ship_data[i][ship_part_x]+x, mother_ship_data[i][ship_part_y]+y, mother_ship_data[i][ship_part_z]+z, mother_ship_data[i][ship_part_rotx], mother_ship_data[i][ship_part_roty], mother_ship_data[i][ship_part_rotz]));
  71.             }
  72.         }
  73.         case invader_type_droid:
  74.         {
  75.             if((t_invader_data[invader_object_arr] = MEM::malloc(t_invader_data[invader_object_arr_len] = sizeof droid_ship_data)) == Pointer:NULL) return ListIt:NULL;
  76.             if((t_invader_data[invader_object_data_arr] = MEM::malloc((sizeof droid_ship_data)*_:ship_part_enum)) == Pointer:NULL)
  77.             {
  78.                 MEM::free(t_invader_data[invader_object_arr]);
  79.                 return ListIt:NULL;
  80.             }
  81.             for(i = 0; i < sizeof droid_ship_data; i++)
  82.             {
  83.                 MEM::set_arr(t_invader_data[invader_object_data_arr], i*_:ship_part_enum, droid_ship_data[i]);
  84.                 MEM::set_val(t_invader_data[invader_object_arr], i, CreateDynamicObject(droid_ship_data[i][ship_part_modelid],
  85.                     ((droid_ship_data[i][ship_part_x]*floatcos(360.0-rotz, degrees))+(droid_ship_data[i][ship_part_y]*floatsin(360.0-rotz, degrees)))+x, (((-droid_ship_data[i][ship_part_x])*floatsin(360.0-rotz, degrees))+(droid_ship_data[i][ship_part_y]*floatcos(360.0-rotz, degrees)))+y, droid_ship_data[i][ship_part_z]+z, droid_ship_data[i][ship_part_rotx], droid_ship_data[i][ship_part_roty], droid_ship_data[i][ship_part_rotz]+rotz));
  86.             }
  87.         }
  88.         default: return ListIt:NULL;
  89.     }
  90.     t_invader_data[invader_health] = health;
  91.     new ListIt:ret = LIST::push_back_arr(invader_list, t_invader_data);
  92.     if(ret == ListIt:NULL)
  93.     {
  94.         for(i = 0; i < sizeof mother_ship_data; i++) DestroyDynamicObject(MEM::get_val(t_invader_data[invader_object_arr], i));
  95.         MEM::free(t_invader_data[invader_object_arr]);
  96.         MEM::free(t_invader_data[invader_object_data_arr]);
  97.         return ListIt:NULL;
  98.     }
  99.     return ret;
  100. }
  101.  
  102. stock KillInvader(ListIt:invader_it, bool:explosion = true)
  103. {
  104.     new Pointer:data_ptr = LIST_IT::data_ptr(invader_it), Pointer:objects_ptr = Pointer:MEM::get_val(data_ptr, invader_object_arr);
  105.     for(new i = 0, objects_len = MEM::get_val(data_ptr, invader_object_arr_len), Float:epos[3]; i < objects_len; i++)
  106.     {
  107.         if(explosion)
  108.         {
  109.             GetDynamicObjectPos(MEM::get_val(objects_ptr, i), epos[0], epos[1], epos[2]);
  110.             CreateExplosion(epos[0], epos[1], epos[2], 0, 3.0);
  111.         }
  112.         DestroyDynamicObject(MEM::get_val(objects_ptr, i));
  113.     }
  114.     MEM::free(objects_ptr);
  115.     MEM::free(Pointer:MEM::get_val(data_ptr, invader_object_data_arr));
  116.     LIST::erase(invader_list, invader_it);
  117. }
  118.  
  119. stock KillAllInvaders(bool:explosion = true)
  120. {
  121.     new Pointer:data_ptr, Pointer:objects_ptr, objects_len, i, Float:epos[3];
  122.     LIST::foreach<invader_it>(invader_list)
  123.     {
  124.         data_ptr = LIST_IT::data_ptr(invader_it);
  125.         for(i = 0, objects_ptr = Pointer:MEM::get_val(data_ptr, invader_object_arr), objects_len = MEM::get_val(data_ptr, invader_object_arr_len); i < objects_len; i++)
  126.         {
  127.             if(explosion)
  128.             {
  129.                 GetDynamicObjectPos(MEM::get_val(objects_ptr, i), epos[0], epos[1], epos[2]);
  130.                 CreateExplosion(epos[0], epos[1], epos[2], 0, 3.0);
  131.             }
  132.             DestroyDynamicObject(MEM::get_val(objects_ptr, i));
  133.         }
  134.         MEM::free(objects_ptr);
  135.         MEM::free(Pointer:MEM::get_val(data_ptr, invader_object_data_arr));
  136.     }
  137.     LIST::clear(invader_list);
  138. }
  139.  
  140. stock MoveInvader(ListIt:invader_it, Float:x, Float:y, Float:z, Float:speed)
  141. {
  142.     new Pointer:data_ptr = LIST_IT::data_ptr(invader_it), Pointer:objects_ptr = Pointer:MEM::get_val(data_ptr, invader_object_arr), Pointer:objects_data_ptr = Pointer:MEM::get_val(data_ptr, invader_object_data_arr), object_len = MEM::get_val(data_ptr, invader_object_arr_len), i, Float:objpos[3];
  143.     for(i = 0; i < object_len; i++) StopDynamicObject(MEM::get_val(objects_ptr, i));
  144.     GetDynamicObjectPos(MEM::get_val(objects_ptr, 0), objpos[0], objpos[1], objpos[2]);
  145.     //new Float:rotz = acos((-1.0*(y-objpos[0]))/floatsqroot(floatpower(x-objpos[0], 2.0)+floatpower(y-objpos[1], 2.0))), t_ship_part_data[ship_part_enum];
  146.     new Float:rotz = 180.0+asin((-(x-objpos[0]))/floatsqroot(floatpower(x-objpos[0], 2.0)+floatpower(y-objpos[1], 2.0))), t_ship_part_data[ship_part_enum];
  147.     //if(rotz < 0.0) rotz += 360.0;
  148.     //printf("rotation: %.4f", rotz);
  149.     for(i = 0; i < object_len; i++)
  150.     {
  151.         MEM::get_arr(objects_data_ptr, i*_:ship_part_enum, t_ship_part_data);
  152.         SetDynamicObjectPos(MEM::get_val(objects_ptr, i), (t_ship_part_data[ship_part_x]*floatcos(rotz, degrees))+(t_ship_part_data[ship_part_y]*floatsin(rotz, degrees))+objpos[0], ((-t_ship_part_data[ship_part_x])*floatsin(rotz, degrees))+(t_ship_part_data[ship_part_y]*floatcos(rotz, degrees))+objpos[1], t_ship_part_data[ship_part_z]+objpos[2]);
  153.         //SetDynamicObjectPos(MEM::get_val(objects_ptr, i), (t_ship_part_data[ship_part_x]*floatcos(360.0-rotz, degrees))+(t_ship_part_data[ship_part_y]*floatsin(360.0-rotz, degrees))+objpos[0], ((-t_ship_part_data[ship_part_x])*floatsin(360.0-rotz, degrees))+(t_ship_part_data[ship_part_y]*floatcos(360.0-rotz, degrees))+objpos[1], t_ship_part_data[ship_part_z]+objpos[2]);
  154.         SetDynamicObjectRot(MEM::get_val(objects_ptr, i), t_ship_part_data[ship_part_rotx], t_ship_part_data[ship_part_roty], t_ship_part_data[ship_part_rotz]+(360.0-rotz));
  155.         MoveDynamicObject(MEM::get_val(objects_ptr, i),
  156.             (t_ship_part_data[ship_part_x]*floatcos(rotz, degrees))+(t_ship_part_data[ship_part_y]*floatsin(rotz, degrees))+x,
  157.             ((-t_ship_part_data[ship_part_x])*floatsin(rotz, degrees))+(t_ship_part_data[ship_part_y]*floatcos(rotz, degrees))+y,
  158.             t_ship_part_data[ship_part_z]+z,
  159.             speed,
  160.             t_ship_part_data[ship_part_rotx],
  161.             t_ship_part_data[ship_part_roty],
  162.             t_ship_part_data[ship_part_rotz]+(360.0-rotz));
  163.     }
  164.     //print("=====");
  165. }
  166.  
  167. public OnShootDynamicObject(playerid, weaponid, objectid, Float:fX, Float:fY, Float:fZ)
  168. {
  169.     /*static string[256];
  170.     format(string, sizeof string, "FS: [ PID: %d ] OnShootDynamicObject | WID: %d | OID: %d | fX: %.4f | fY: %.4f | fZ: %.4f", playerid, weaponid, objectid, fX, fY, fZ);
  171.     SendClientMessageToAll(0xFF0000FF, string);*/
  172.     new Pointer:invader_object_ptr, invader_objects, i, Pointer:data_ptr;
  173.     LIST::foreach<invader_it>(invader_list)
  174.     {
  175.         invader_object_ptr = Pointer:MEM::get_val(data_ptr = LIST_IT::data_ptr(invader_it), invader_object_arr);
  176.         invader_objects = MEM::get_val(data_ptr, invader_object_arr_len);
  177.         for(i = 0; i < invader_objects; i++)
  178.         {
  179.             if(MEM::get_val(invader_object_ptr, i) != objectid) continue;
  180.             new Float:spos[3], Float:health = (Float:MEM::get_val(data_ptr, invader_health))-100.0;
  181.             if(health <= 0.0)
  182.             {
  183.                 GetPlayerPos(playerid, spos[0], spos[1], spos[2]);
  184.                 PlayerPlaySound(playerid, 1139, spos[0], spos[1], spos[2]);
  185.                 KillInvader(invader_it);
  186.                 return 1;
  187.             }
  188.             GetDynamicObjectPos(objectid, spos[0], spos[1], spos[2]);
  189.             PlayerPlaySound(playerid, 1139, spos[0], spos[1], spos[2]);
  190.             MEM::set_val(data_ptr, invader_health, _:health);
  191.             return 1;
  192.         }
  193.     }
  194.     return 1;
  195. }
  196.  
  197. public OnFilterScriptInit()
  198. {
  199.     MoveInvader(CreateInvader(invader_type_mother, 1000.0, 0.0, 0.0, 10.0, 0.0), float(random(3000)-random(6000)), float(random(3000)-random(6000)), 100.0, float(random(6))+2.0);
  200.     MoveInvader(CreateInvader(invader_type_mother, 1000.0, 20.0, 0.0, 10.0, 0.0), float(random(3000)-random(6000)), float(random(3000)-random(6000)), 100.0, float(random(6))+2.0);
  201.     MoveInvader(CreateInvader(invader_type_mother, 1000.0, 40.0, 0.0, 10.0, 0.0), float(random(3000)-random(6000)), float(random(3000)-random(6000)), 100.0, float(random(6))+2.0);
  202.     MoveInvader(CreateInvader(invader_type_mother, 1000.0, 60.0, 0.0, 10.0, 0.0), float(random(3000)-random(6000)), float(random(3000)-random(6000)), 100.0, float(random(6))+2.0);
  203.     MoveInvader(CreateInvader(invader_type_mother, 1000.0, 80.0, 0.0, 10.0, 0.0), float(random(3000)-random(6000)), float(random(3000)-random(6000)), 100.0, float(random(6))+2.0);
  204.     MoveInvader(CreateInvader(invader_type_mother, 1000.0, 100.0, 0.0, 10.0, 0.0), float(random(3000)-random(6000)), float(random(3000)-random(6000)), 100.0, float(random(6))+2.0);
  205.     MoveInvader(CreateInvader(invader_type_mother, 1000.0, 120.0, 0.0, 10.0, 0.0), float(random(3000)-random(6000)), float(random(3000)-random(6000)), 100.0, float(random(6))+2.0);
  206.     SetTimer("UpdateMovement", 5000, 1);
  207.     print("\n==============================");
  208.     print("= ERMERGERD, ELEEN ENVESEEN! =");
  209.     print("=       Made by BigETI       =");
  210.     print("==============================\n");
  211.     return 1;
  212. }
  213.  
  214. public OnFilterScriptExit()
  215. {
  216.     KillAllInvaders();
  217.     return 1;
  218. }
  219.  
  220. forward UpdateMovement();
  221. public UpdateMovement() LIST::foreach<invader_it>(invader_list) MoveInvader(invader_it, float(random(2000)-random(4000)), float(random(2000)-random(4000)), 10.0, float(random(6))+2.0);
Advertisement
Add Comment
Please, Sign In to add comment