Kyance

SAMP - Submarine script

Aug 15th, 2014
676
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 24.49 KB | None | 0 0
  1. // Full credits to Kyance [http://forum.sa-mp.com/member.php?u=197133]
  2. // Big thanks to Virtual1ty for assisting me in optimising the code [http://forum.sa-mp.com/member.php?u=53564]
  3.  
  4. #define FILTERSCRIPT
  5.  
  6. #include <a_samp>
  7. #include <zcmd>
  8. #include <foreach>
  9. #include <sscanf2>
  10. #include <crashdetect>
  11.  
  12. #define MAX_SUBS 20
  13.  
  14. #define PRESSED(%0) \
  15.     (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
  16.  
  17.  
  18. #define PUB:%0(%1)  forward %0(%1); \
  19.                     public %0(%1)
  20.  
  21.  
  22.  
  23. enum sInfo
  24. {
  25.     ID, UserID, Object,
  26.     Float:sX, Float:sY, Float:sZ, Float:sAngle,
  27.     Torpedos, TorpedoLoaded, TorpedoObject,
  28.     LifeBoat, LifeBoatID,
  29.     Health,
  30.     IsActive, InUse
  31. };
  32. new gSubmarineInfo[MAX_SUBS][sInfo];
  33.  
  34. enum lbInfo
  35. {
  36.     lbID, vehicleID
  37. };
  38. new gLifeboatInfo[MAX_SUBS][lbInfo];
  39.  
  40. new
  41.     gSubmarines,
  42.     gPlayerState        [MAX_PLAYERS char],
  43.     gPlayerSubID        [MAX_PLAYERS],
  44.    
  45.     gPlayerCamObj       [MAX_PLAYERS],
  46.    
  47.     bool:gPlayerInSub   [MAX_PLAYERS char],
  48.     bool:gPlayerCanShoot[MAX_PLAYERS],
  49.     gPlayerSubWarnTick  [MAX_PLAYERS],
  50.     gPlayerShot         [MAX_PLAYERS],
  51.     gPlayerDmg          [MAX_PLAYERS][MAX_SUBS],
  52.    
  53.     Text3D:gLifeboatLabel[MAX_VEHICLES]
  54. ;
  55.  
  56.  
  57. forward Float:GetXYInFrontOfPlayer(playerid, &Float:q, &Float:w, Float:distance);
  58. forward Float:GetXYInFrontOfObject(objectid, playerid, &Float:x, &Float:y, Float:distance);
  59. //
  60. stock Float:GetXYInFrontOfPlayer(playerid, &Float:q, &Float:w, Float:distance)
  61. {
  62.     new Float:a;
  63.     GetPlayerPos(playerid, q, w, a);
  64.     if (GetPlayerState(playerid) == PLAYER_STATE_DRIVER) GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
  65.     else GetPlayerFacingAngle(playerid, a);
  66.     q += (distance * floatsin(-a, degrees));
  67.     w += (distance * floatcos(-a, degrees));
  68.     return a;
  69. }
  70.  
  71. stock Float:GetXYInFrontOfObject(objectid, playerid, &Float:x, &Float:y, Float:distance)
  72. {
  73.     new Float:a;
  74.     GetObjectPos(objectid, x, y, a);
  75.     GetPlayerFacingAngle(playerid, a);
  76.  
  77.     x += (distance * floatsin(-a, degrees));
  78.     y += (distance * floatcos(-a, degrees));
  79. }
  80.  
  81. stock GetDistance( Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2 )
  82. {
  83.     return floatround( floatsqroot( ( ( x1 - x2 ) * ( x1 - x2 ) ) + ( ( y1 - y2 ) * ( y1 - y2 ) ) + ( ( z1 - z2 ) * ( z1 - z2 ) ) ) );
  84. }
  85. //
  86.  
  87. public OnFilterScriptInit()
  88. {
  89.     gSubmarines = 0;
  90.     for (new i; i < _:sInfo; ++i) gSubmarineInfo[i][sInfo:i] = 0;
  91.     foreach(Player, x) ResetData(x);
  92.     print("\n-> Submarine script v1.5 loaded\n-->Created by: Kyance and Virtual1ty");
  93.     return 1;
  94. }
  95.  
  96. public OnFilterScriptExit()
  97. {
  98.     print("\n-> Submarine script v1.5 unloaded\n-->Created by: Kyance and Virtual1ty");
  99.    
  100.     DestroySubmarines();
  101.     foreach(Player, i)
  102.     {
  103.         if (gPlayerInSub{i})
  104.         {
  105.             UnfreezePlayer(i);
  106.             RemovePlayerFromSubmarine(i, gPlayerSubID[i]);
  107.         }
  108.         if (IsValidObject(gPlayerCamObj[i])) DestroyObject(gPlayerCamObj[i]);
  109.     }
  110.     return 1;
  111. }
  112.  
  113. RemovePlayerFromSubmarine(playerid, submarineid)
  114. {
  115.     gPlayerInSub   {playerid} = false;
  116.     gPlayerSubID   [playerid] = 0;
  117.     gPlayerCanShoot[playerid] = false;
  118.    
  119.     if (IsValidObject(gPlayerCamObj[playerid])) DestroyObject(gPlayerCamObj[playerid]);
  120.     SetCameraBehindPlayer(playerid);
  121.     gSubmarineInfo[gPlayerSubID[playerid]][InUse] = 0; gSubmarineInfo[gPlayerSubID[playerid]][UserID] = -1;
  122.    
  123.     SetPlayerPos(playerid, gSubmarineInfo[submarineid][sX], gSubmarineInfo[submarineid][sY], gSubmarineInfo[submarineid][sZ]+3);
  124. }
  125.  
  126. PutPlayerInSubmarine(playerid, submarineid)
  127. {
  128.     gPlayerInSub   {playerid} = true;
  129.     gPlayerSubID   [playerid] = gSubmarineInfo[submarineid][ID];
  130.     gPlayerCanShoot[playerid] = false;
  131.  
  132.     gSubmarineInfo[submarineid][UserID] = playerid;
  133.    
  134.     gPlayerCamObj[playerid] = CreateObject(19300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
  135.     AttachObjectToObject(gPlayerCamObj[playerid], gSubmarineInfo[submarineid][Object], 0.0, -5.0, 1.6, 0.0, 0.0, 0.0);
  136.    
  137.     SetPlayerPos(playerid, gSubmarineInfo[submarineid][sX], gSubmarineInfo[submarineid][sY], gSubmarineInfo[submarineid][sZ] - 4.0);
  138.     AttachCameraToObject(playerid, gPlayerCamObj[playerid]);
  139. }
  140.  
  141. public OnPlayerConnect(playerid)
  142. {
  143.     ResetData(playerid);
  144.     return 1;
  145. }
  146.  
  147. public OnPlayerDisconnect(playerid, reason)
  148. {
  149.     gPlayerState{playerid} = PLAYER_STATE_WASTED;
  150.    
  151.     if(gPlayerSubID[playerid])
  152.     {
  153.         RemovePlayerFromSubmarine(playerid, gPlayerSubID[playerid]);
  154.         ResetData(playerid);
  155.     }
  156.     return 1;
  157. }
  158.  
  159. public OnPlayerDeath(playerid, killerid, reason)
  160. {
  161.     gPlayerState{playerid} = PLAYER_STATE_WASTED;
  162.     if(gPlayerSubID[playerid])
  163.     {
  164.         RemovePlayerFromSubmarine(playerid, gPlayerSubID[playerid]);
  165.         ResetData(playerid);
  166.     }
  167.     return 1;
  168. }
  169.  
  170. public OnPlayerStateChange(playerid, newstate, oldstate)
  171. {
  172.     gPlayerState{playerid} = newstate;
  173.     return 1;
  174. }
  175.  
  176. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  177. {
  178.     if (gPlayerInSub{playerid})
  179.     {
  180.         new Float:X, Float:Y, Float:Z;
  181.         GetPlayerPos(playerid, X, Y, Z);
  182.        
  183.         if (PRESSED(KEY_YES))
  184.         {
  185.             if (gSubmarineInfo[gPlayerSubID[playerid]][TorpedoLoaded] && gPlayerCanShoot{playerid})
  186.             {
  187.                 if (gSubmarineInfo[gPlayerSubID[playerid]][Torpedos] > 0)
  188.                 {
  189.                     new string[98];
  190.                     gPlayerCanShoot{playerid} = false;
  191.                    
  192.                     gSubmarineInfo[gPlayerSubID[playerid]][Torpedos]--;
  193.                     format(string, sizeof(string), "{FFFFFF}* {00C0FF}SUBMARINE: Torpedo away! Remaining torpedos: %d/4", gSubmarineInfo[gPlayerSubID[playerid]][Torpedos]);
  194.                     foreach(Player, i)
  195.                     {
  196.                         if (IsPlayerInRangeOfPoint(i, 20.0, X, Y, Z))
  197.                         {
  198.                             SendClientMessage(i, -1, string);
  199.                         }
  200.                     }
  201.                     gSubmarineInfo[gPlayerSubID[playerid]][TorpedoObject] = CreateObject(1636, gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY] - 2.0, gSubmarineInfo[gPlayerSubID[playerid]][sZ], 0, 0, 0);
  202.                     //GetXYInFrontOfObject(gSubmarineInfo[gPlayerSubID[playerid]][TorpedoObject], playerid, gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY], 150.0);
  203.                     gSubmarineInfo[gPlayerSubID[playerid]][sX] -= (150.0 * floatsin(-gSubmarineInfo[gPlayerSubID[playerid]][sAngle], degrees));
  204.                     gSubmarineInfo[gPlayerSubID[playerid]][sY] -= (150.0 * floatcos(-gSubmarineInfo[gPlayerSubID[playerid]][sAngle], degrees));
  205.                        
  206.                     new time = MoveObject(gSubmarineInfo[gPlayerSubID[playerid]][TorpedoObject], gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY], gSubmarineInfo[gPlayerSubID[playerid]][sZ], 65.0);
  207.                     SetTimerEx("DetonateTorpedo", time, false, "iii", gPlayerSubID[playerid], playerid, gSubmarineInfo[gPlayerSubID[playerid]][TorpedoObject]);
  208.                     format(string, sizeof(string), "{FFFFFF}* {00C0FF}SUBMARINE: The torpedo will explode in approx. %d seconds!", time/1000);
  209.                     SendClientMessage(playerid, -1, string);
  210.                 }
  211.                 else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: You've ran out of torpedos!");
  212.             }
  213.             else
  214.             {
  215.                 SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: Loading torpedo..");
  216.                 SetTimerEx("TorpedoLoadedT", 2500+random(3000), false, "ii", playerid, gPlayerSubID[playerid]);
  217.             }
  218.         }
  219.         else if (PRESSED(KEY_NO))
  220.         {
  221.             if (gSubmarineInfo[gPlayerSubID[playerid]][LifeBoat])
  222.             {
  223.                 GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY], gSubmarineInfo[gPlayerSubID[playerid]][sZ]);
  224.                 SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: Deploying lifeboat..");
  225.                 SetTimerEx("LifeboatLoaded", 3000+random(2000), false, "ii", playerid, gPlayerSubID[playerid]);
  226.             }
  227.             else
  228.             {
  229.                 new Float:X2, Float:Y2, Float:Z2, bool:found = false;
  230.                 for (new i = 1; i < MAX_VEHICLES; i++)
  231.                 {
  232.                     for (new x = 0; x < MAX_SUBS; x++)
  233.                     {
  234.                         if (GetVehicleModel(i) == 473 && i == gLifeboatInfo[x][vehicleID])
  235.                         {
  236.                             GetVehiclePos(i, X2, Y2, Z2);
  237.                             //if (IsPlayerInRangeOfPoint(playerid, 20.0, X2, Y2, Z2))
  238.                             if(GetDistance(X2, Y2, Z2, gSubmarineInfo[x][sX], gSubmarineInfo[x][sY], gSubmarineInfo[x][sZ]) < 20)
  239.                             {
  240.                                 found = true;
  241.                                 DestroyVehicle(i);
  242.                                 break;
  243.                             }
  244.                         }
  245.                     }
  246.                 }
  247.                 if (found)
  248.                 {
  249.                     SetTimerEx("LoadLifeboat", 2000+random(2500), false, "ii", playerid, gPlayerSubID[playerid]);
  250.                     SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: Since you're near a lifeboat, it's being loaded on your submarine.");
  251.                 }
  252.                 else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: You aren't near a lifeboat to load it back on your submarine!");
  253.             }
  254.         }
  255.         //
  256.     }
  257.     return 1;
  258. }
  259.  
  260. public OnPlayerUpdate(playerid)
  261. {
  262.     static Keys, ud, lr;
  263.     GetPlayerKeys(playerid, Keys, ud, lr);
  264.    
  265.     if (gPlayerInSub{playerid})
  266.     {
  267.         static Float:x, Float:y, Float:z;
  268.        
  269.         if (ud < 0)
  270.         { // UP
  271.             GetPlayerPos(playerid, x, y, z);
  272.             SetPlayerPos(playerid, x, y, z);
  273.            
  274.             GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  275.             x -= (1.5 * floatsin(-gSubmarineInfo[gPlayerSubID[playerid]][sAngle], degrees));
  276.             y -= (1.5 * floatcos(-gSubmarineInfo[gPlayerSubID[playerid]][sAngle], degrees));
  277.             SetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  278.             // Track submarine position
  279.             GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY], gSubmarineInfo[gPlayerSubID[playerid]][sZ]);
  280.         }
  281.         else if (ud > 0)
  282.         { // DOWN
  283.             GetPlayerPos(playerid, x, y, z);
  284.             SetPlayerPos(playerid, x, y, z);
  285.            
  286.             GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  287.             x += (0.5 * floatsin(-gSubmarineInfo[gPlayerSubID[playerid]][sAngle], degrees));
  288.             y += (0.5 * floatcos(-gSubmarineInfo[gPlayerSubID[playerid]][sAngle], degrees));
  289.             SetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  290.             // Track submarine position
  291.             GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY], gSubmarineInfo[gPlayerSubID[playerid]][sZ]);
  292.         }
  293.         if (lr < 0)
  294.         { // LEFT
  295.             GetObjectRot(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  296.             z += 0.5;
  297.             SetObjectRot(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  298.             // Track submarine orientation
  299.             gSubmarineInfo[gPlayerSubID[playerid]][sAngle] = z;
  300.         }
  301.         else if (lr > 0)
  302.         { // RIGHT
  303.             GetObjectRot(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  304.             z -= 0.5;
  305.             SetObjectRot(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  306.             // Track submarine orientation
  307.             gSubmarineInfo[gPlayerSubID[playerid]][sAngle] = z;
  308.         }
  309.        
  310.         if (Keys & KEY_JUMP)
  311.         {
  312.             if (gSubmarineInfo[gPlayerSubID[playerid]][sZ] < 1.0)
  313.             {
  314.                 GetPlayerPos(playerid, x, y, z);
  315.                 SetPlayerPos(playerid, x, y, z + 0.5);
  316.                
  317.                 GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  318.                 z += 0.6;
  319.                 SetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  320.                
  321.                 if (gSubmarineInfo[gPlayerSubID[playerid]][sZ] > 2.0)
  322.                 {
  323.                     GetPlayerPos(playerid, x, y, z);
  324.                     SetPlayerPos(playerid, x, y, z - 0.5);
  325.                    
  326.                     GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  327.                     SetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z - 0.4);
  328.                     // Track submarine position
  329.                     GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY], gSubmarineInfo[gPlayerSubID[playerid]][sZ]);
  330.                 }
  331.             }
  332.             else
  333.             {
  334.                 if (gettime() - gPlayerSubWarnTick[playerid] > 3)
  335.                 {
  336.                     GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~r~MAX HEIGHT REACHED", 2500, 3);
  337.                     gPlayerSubWarnTick[playerid] = gettime();
  338.                 }
  339.             }
  340.         }
  341.        
  342.         if (Keys & KEY_SPRINT)
  343.         {
  344.             if (z > -23.0)
  345.             {
  346.                 GetPlayerPos(playerid, x, y, z);
  347.                 SetPlayerPos(playerid, x, y, z - 0.5);
  348.                
  349.                 GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  350.                 z -= 0.4;
  351.                 SetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  352.                
  353.                 if (z < -23.0)
  354.                 {
  355.                     GetPlayerPos(playerid, x, y, z);
  356.                     SetPlayerPos(playerid, x, y, z + 0.5);
  357.                    
  358.                     GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z);
  359.                     SetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], x, y, z + 0.6);
  360.                     // Track submarine position
  361.                     GetObjectPos(gSubmarineInfo[gPlayerSubID[playerid]][Object], gSubmarineInfo[gPlayerSubID[playerid]][sX], gSubmarineInfo[gPlayerSubID[playerid]][sY], gSubmarineInfo[gPlayerSubID[playerid]][sZ]);
  362.                 }
  363.             }
  364.             else
  365.             {
  366.                 if (gettime() - gPlayerSubWarnTick[playerid] > 2)
  367.                 {
  368.                     GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~r~MAX DEPTH REACHED", 1500, 3);
  369.                     gPlayerSubWarnTick[playerid] = gettime();
  370.                 }
  371.             }
  372.         }
  373.         //
  374.     }
  375.     return 1;
  376. }
  377.  
  378. public OnVehicleDeath(vehicleid, killerid)
  379. {
  380.     for (new x = 0; x < MAX_SUBS; x++)
  381.     {
  382.         if (vehicleid == gLifeboatInfo[x][vehicleID])
  383.         {
  384.             DestroyLifeboat(vehicleid);
  385.         }
  386.     }
  387.     return 1;
  388. }
  389.  
  390.  
  391. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  392. {
  393.     if( hittype == BULLET_HIT_TYPE_OBJECT && hitid != INVALID_OBJECT_ID )
  394.     {
  395.         for(new i = 0; i < MAX_SUBS; i++)
  396.         {
  397.             if(hitid == gSubmarineInfo[i][Object])
  398.             {
  399.                 if(gPlayerShot[playerid] != hitid) gPlayerDmg[playerid][hitid] = 0;
  400.                
  401.                 switch(GetPlayerWeapon(playerid))
  402.                 {
  403.                     case 22, 23: gSubmarineInfo[hitid][Health]--;
  404.                     case 24: gSubmarineInfo[hitid][Health] -= random(3);
  405.                     case 25..27: gSubmarineInfo[hitid][Health] -= random(3);
  406.                     case 28, 29, 32: gSubmarineInfo[hitid][Health] -= random(2);
  407.                     case 30, 31: gSubmarineInfo[hitid][Health] -= random(4);
  408.                     case 33, 34: gSubmarineInfo[hitid][Health] -= random(5);
  409.                     case 38: gSubmarineInfo[hitid][Health] -= random(12);
  410.                 }
  411.                 gPlayerDmg[playerid][hitid] += random(12);
  412.                
  413.                 new string[148], DialogString[240];
  414.                 if(gSubmarineInfo[hitid][Health] > 1)
  415.                 {
  416.                     gPlayerShot[playerid] = hitid;
  417.                     format(string, sizeof(string), "~r~SUBMARINE DAMAGED\n~y~%d/~r~500 ~y~health remaining", gSubmarineInfo[hitid][Health]);
  418.                     GameTextForPlayer(playerid, string, 1000, 3);
  419.                 }
  420.                 else
  421.                 {
  422.                     foreach(Player, x)
  423.                     {
  424.                         if(gPlayerShot[x] == hitid)
  425.                         {
  426.                             GameTextForPlayer(x, "~r~SUBMARINE DESTROYED", 2500, 3);
  427.                             format(DialogString, sizeof(DialogString), "%s\n{33AA33}%s dealt {FC4949}%d damage.", DialogString, GetName(x), gPlayerDmg[x][hitid]);
  428.                             format(string, sizeof(string), "* {33AA33}%s dealt {FC4949}%d damage {33AA33}to the {FC4949}Submarine.", GetName(x), gPlayerDmg[x][hitid]);
  429.                             SendClientMessageToAll(-1, string);
  430.                         }
  431.                     }
  432.                     ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "{33AA33}Players who assisted", DialogString, "Close", "");
  433.                    
  434.                    
  435.                     RemovePlayerFromSubmarine(gSubmarineInfo[hitid][UserID], hitid);
  436.                     DestroySubmarine(hitid);
  437.                 }
  438.             }
  439.         }
  440.     }
  441.     return 1;
  442. }
  443. /*----------------------------------------------------------------------------*/
  444. PUB: FreezePlayer(playerid) return TogglePlayerControllable(playerid, false);
  445. PUB: UnfreezePlayer(playerid) return TogglePlayerControllable(playerid, true);
  446.  
  447.  
  448. PUB:DetonateTorpedo(submarineid, playerid, torpedoid)
  449. {
  450.     new Float:X, Float:Y, Float:Z;
  451.     GetObjectPos(torpedoid, X, Y, Z);
  452.     foreach(Player, i)
  453.     {
  454.         if (i == playerid || IsPlayerAdmin(i)) continue;
  455.         if (IsPlayerInRangeOfPoint(i, 6.0, X, Y, Z))
  456.         {
  457.             if (IsPlayerInAnyVehicle(i)) SetVehicleHealth(i, 235.0), RemovePlayerFromVehicle(i);
  458.  
  459.             SpawnPlayer  (i);
  460.             OnPlayerDeath(i, playerid, 51);
  461.         }
  462.     }
  463.     CreateExplosion(X, Y + 1.0, Z, 2, 150.0);
  464.     CreateExplosion(X, Y + 1.0, Z, 3, 150.0);
  465.     CreateExplosion(X, Y + 1.0, Z, 4, 150.0);
  466.     DestroyObject(torpedoid); if(gSubmarineInfo[submarineid][Object] != INVALID_OBJECT_ID) return DestroyObject(gSubmarineInfo[submarineid][TorpedoObject]);
  467.     return 1;
  468. }
  469. PUB:TorpedoLoadedT(playerid, submarineid)
  470. {
  471.     if (gSubmarineInfo[submarineid][Torpedos] > 0)
  472.     {
  473.         gSubmarineInfo[submarineid][TorpedoLoaded] = 1; gPlayerCanShoot{playerid} = true;
  474.         SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: Torpedo loaded, ready to be used!");
  475.     }
  476.     else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: Could not find any torpedos..");
  477.     return 1;
  478. }
  479. PUB:LifeboatLoaded(playerid, submarineid)
  480. {
  481.     CreateLifeboat(playerid, submarineid, gSubmarineInfo[submarineid][sX] + 4.0, gSubmarineInfo[submarineid][sY], gSubmarineInfo[submarineid][sZ], gSubmarineInfo[submarineid][sAngle]);
  482.     SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}LIFEBOAT: Lifeboat deployed, exit the submarine and jump on the lifeboat!");
  483.     return 1;
  484. }
  485. PUB:LoadLifeboat(playerid, submarineid)
  486. {
  487.     gSubmarineInfo[submarineid][LifeBoat] = 1;
  488.     SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: The lifeboat has been successfully loaded on your submarine!");
  489.     return 1;
  490. }
  491.  
  492.  
  493. stock CreateLifeboat(playerid, submarineid, Float:X, Float:Y, Float:Z, Float:Angle)
  494. {
  495.     gSubmarineInfo[gPlayerSubID[playerid]][LifeBoat] = 0;
  496.     gLifeboatInfo[submarineid][vehicleID] = CreateVehicle(473, X, Y, Z, Angle, 8, 8, 120);
  497.     gLifeboatInfo[submarineid][lbID] = submarineid;
  498.    
  499.     new str[128];
  500.     format(str, sizeof(str), "{FFFFFF}Lifeboat of submarine {64CC66}%d\n{FFFFFF}Submarine has {64CC66}%d torpedos.\n{FFFFFF}Submarine has {64CC66}%d health.", submarineid, gSubmarineInfo[submarineid][Torpedos], gSubmarineInfo[submarineid][Health]);
  501.     gLifeboatLabel[gLifeboatInfo[submarineid][vehicleID]] = Create3DTextLabel(str, -1, X, Y + 1.0, Z, 60.0, 0, 1);
  502.     Attach3DTextLabelToVehicle(gLifeboatLabel[gLifeboatInfo[submarineid][vehicleID]], gLifeboatInfo[submarineid][vehicleID], X, Y + 1.0, Z);
  503. }
  504. stock DestroyLifeboat(submarineid)
  505. {
  506.     gLifeboatInfo[submarineid][lbID] = 0;
  507.     DestroyVehicle(gLifeboatInfo[submarineid][vehicleID]);
  508.     Delete3DTextLabel(gLifeboatLabel[gLifeboatInfo[submarineid][vehicleID]]);
  509. }
  510.  
  511. stock CreateSubmarine(submarineid, Float:X, Float:Y, Float:Z, Float:Angle)
  512. {
  513.     gSubmarineInfo[submarineid][ID] = submarineid;
  514.     gSubmarineInfo[submarineid][Object] = CreateObject(9958, X, Y, Z, 0.0, 0.0, Angle);
  515.     gSubmarineInfo[submarineid][sX] = X, gSubmarineInfo[submarineid][sY] = Y, gSubmarineInfo[submarineid][sZ] = Z, gSubmarineInfo[submarineid][sAngle] = Angle;
  516.     GetObjectPos(gSubmarineInfo[submarineid][Object], gSubmarineInfo[submarineid][sX], gSubmarineInfo[submarineid][sY], gSubmarineInfo[submarineid][sZ]);
  517.     gSubmarineInfo[submarineid][Torpedos] = 4, gSubmarineInfo[submarineid][TorpedoLoaded] = 0;
  518.     gSubmarineInfo[submarineid][LifeBoat] = 1, gSubmarineInfo[submarineid][LifeBoatID] = submarineid;
  519.     gSubmarineInfo[submarineid][IsActive] = 1, gSubmarineInfo[submarineid][InUse] = 0;
  520.     gSubmarineInfo[submarineid][Health] = 500;
  521.  
  522.     gSubmarines++;
  523. }
  524. stock DestroySubmarine(submarineid)
  525. {
  526.     gSubmarineInfo[submarineid][ID] = -1;
  527.     DestroyObject(gSubmarineInfo[submarineid][Object]), gSubmarineInfo[submarineid][Object] = INVALID_OBJECT_ID;
  528.     DestroyObject(gSubmarineInfo[submarineid][TorpedoObject]), gSubmarineInfo[submarineid][TorpedoObject] = INVALID_OBJECT_ID;
  529.     gSubmarineInfo[submarineid][Torpedos] = 0, gSubmarineInfo[submarineid][TorpedoLoaded] = 0;
  530.     gSubmarineInfo[submarineid][IsActive] = 0, gSubmarineInfo[submarineid][InUse] = 0;
  531.     gSubmarineInfo[submarineid][Health] = 0;
  532.     DestroyLifeboat(submarineid);
  533.  
  534.     gSubmarines--;
  535. }
  536. stock DestroySubmarines()
  537. {
  538.     for (new submarineid = 0; submarineid < MAX_SUBS; submarineid++)
  539.     {
  540.         gSubmarineInfo[submarineid][ID] = -1;
  541.         DestroyObject(gSubmarineInfo[submarineid][Object]), gSubmarineInfo[submarineid][Object] = INVALID_OBJECT_ID;
  542.         DestroyObject(gSubmarineInfo[submarineid][TorpedoObject]), gSubmarineInfo[submarineid][TorpedoObject] = INVALID_OBJECT_ID;
  543.         gSubmarineInfo[submarineid][sX] = 0.0, gSubmarineInfo[submarineid][sY] = 0.0, gSubmarineInfo[submarineid][sZ] = 0.0, gSubmarineInfo[submarineid][sAngle] = 0.0;
  544.         gSubmarineInfo[submarineid][Torpedos] = 0, gSubmarineInfo[submarineid][TorpedoLoaded] = 0;
  545.         gSubmarineInfo[submarineid][IsActive] = 0, gSubmarineInfo[submarineid][InUse] = 0;
  546.         gSubmarineInfo[submarineid][Health] = 0;
  547.         DestroyLifeboat(submarineid);
  548.     }
  549.  
  550.     gSubmarines = 0;
  551. }
  552.  
  553. stock GetAvailableID()
  554. {
  555.     for (new i = 0; i < MAX_SUBS; i++)
  556.     {
  557.         if (!gSubmarineInfo[i][IsActive]) return i;
  558.     }
  559.     return MAX_SUBS;
  560. }
  561.  
  562. stock GetName(playerid)
  563. {
  564.     new pnameid[24];
  565.     GetPlayerName(playerid,pnameid,sizeof(pnameid));
  566.     return pnameid;
  567. }
  568.  
  569. stock ResetData(playerid)
  570. {
  571.     gPlayerState[playerid] = GetPlayerState(playerid);
  572.     gPlayerSubID[playerid] = -1;
  573.  
  574.     gPlayerCamObj[playerid] = INVALID_OBJECT_ID;
  575.  
  576.     gPlayerInSub{playerid} = false;
  577.     gPlayerCanShoot[playerid] = false;
  578.     gPlayerSubWarnTick[playerid] = 0;
  579.     gPlayerShot[playerid] = -1;
  580.     for (new i = 0; i < MAX_SUBS; i++) gPlayerDmg[playerid][i] = 0;
  581. }
  582. /*----------------------------------------------------------------------------*/
  583.  
  584. CMD:createsubmarine(playerid, params[])
  585. {
  586.     if (!IsPlayerAdmin(playerid)) return 0;
  587.  
  588.     new Float:X, Float:Y, Float:Z, Float:Angle;
  589.     GetPlayerPos(playerid, X, Y, Z);
  590.     if (Z > 1.0) return SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: Your position is too high to create an submarine ( not in water ? )");
  591.     else if (Z < -1.0) return SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: Your position is too low to create an submarine ( below water ? )");
  592.  
  593.     new subID = GetAvailableID();
  594.     if (subID < 20)
  595.     {
  596.         GetPlayerPos(playerid, X, Y, Z), GetPlayerFacingAngle(playerid, Angle);
  597.        
  598.         CreateSubmarine(subID, X, Y, Z+3.0, Angle+180.0);
  599.        
  600.         SetPlayerPos(playerid, X, Y, Z+6.0);
  601.         //gPlayerCamObj[playerid] = CreateObject(19300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
  602.         //AttachObjectToObject(gPlayerCamObj[playerid], gSubmarineInfo[subID][Object], 0.0, -5.0, 1.6, 0.0, 0.0, 0.0);
  603.     }
  604.     else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: The max. amount of submarines has been reached.");
  605.     return 1;
  606. }
  607. CMD:destroysubmarine(playerid, params[])
  608. {
  609.     if (!IsPlayerAdmin(playerid)) return 0;
  610.  
  611.     if (gSubmarines)
  612.     {
  613.         new subID;
  614.         if (sscanf(params, "d", subID)) return SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}USAGE: /destroysubmarine ID");
  615.         if (0 < subID >= 20) return SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}USAGE: /destroysubmarine ID[0-20]");
  616.        
  617.         if (gSubmarineInfo[subID][InUse]) return SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: This submarine is in use.");
  618.         if (gSubmarineInfo[subID][IsActive]) DestroySubmarine(subID);
  619.         else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: Submarine not active!");
  620.     }
  621.     else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: The aren't any submarines spawned!");
  622.     return 1;
  623. }
  624. CMD:destroysubmarines(playerid, params[])
  625. {
  626.     if (!IsPlayerAdmin(playerid)) return 0;
  627.  
  628.     if (gSubmarines) DestroySubmarines();
  629.     else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: There aren't any submarines spawned!");
  630.     return 1;
  631. }
  632.  
  633. CMD:submarine(playerid, params[])
  634. {
  635.     gPlayerState{playerid} = GetPlayerState(playerid);
  636.     if (gPlayerInSub{playerid})
  637.     {
  638.         UnfreezePlayer(playerid);
  639.         RemovePlayerFromSubmarine(playerid, gPlayerSubID[playerid]);
  640.         SetPlayerHealth(playerid, 100.0);
  641.         SetCameraBehindPlayer(playerid);
  642.         SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: You've left the submarine.");
  643.     }
  644.     else
  645.     {
  646.         if (gPlayerState{playerid} == PLAYER_STATE_ONFOOT)
  647.         {
  648.             for (new i = 0; i < MAX_SUBS; i++)
  649.             {
  650.                 if (gSubmarineInfo[i][IsActive] && !gSubmarineInfo[i][InUse])
  651.                 {
  652.                     if (IsPlayerInRangeOfPoint(playerid, 10.0, gSubmarineInfo[i][sX], gSubmarineInfo[i][sY], gSubmarineInfo[i][sZ]))
  653.                     {
  654.                         //FreezePlayer(playerid);
  655.                         PutPlayerInSubmarine(playerid, i);
  656.                         SetPlayerHealth(playerid, 0x7F800000);
  657.                        
  658.                         SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: You've entered a submarine.");
  659.                         SendClientMessage(playerid, -1, "{FFFFFF}* {00C0FF}SUBMARINE: Use movement keys to control it. Use {00FF00}Y{FFFFFF} to shoot a torpedo, and {00FF00}N{FFFFFF} to deploy a lifeboat.");
  660.                         break;
  661.                     }
  662.                     else SendClientMessage(playerid, -1, "{FFFFFF}* {FC4949}SUBMARINE: You're not near any submarines!");
  663.                 }
  664.             }
  665.         }
  666.         //else RemovePlayerFromVehicle(playerid);
  667.     }
  668.     return 1;
  669. }
Advertisement
Add Comment
Please, Sign In to add comment