Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <a_samp>
- #include <zcmd>
- #include <foreach>
- #include <sscanf2>
- #define MAX_SUBS 20
- #define PRESSED(%0) \
- (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
- #define PUB:%0(%1) forward %0(%1); \
- public %0(%1)
- new Submarines;
- enum sInfo
- {
- ID, Object,
- Float:sX, Float:sY, Float:sZ, Float:sAngle,
- Torpedos, TorpedoLoaded, TorpedoObject,
- LifeBoat, LifeBoatID,
- Health,
- IsActive, InUse
- };
- new Submarine[MAX_SUBS][sInfo];
- enum lbInfo
- {
- lbID, vehicleID
- };
- new LifeboatInfo[MAX_SUBS][lbInfo];
- new Text3D:Label[MAX_VEHICLES];
- forward Float:GetXYInFrontOfPlayer(playerid, &Float:q, &Float:w, Float:distance);
- forward Float:GetXYInFrontOfObject(objectid, playerid, &Float:x, &Float:y, Float:distance);
- new
- bool:inSub[ MAX_PLAYERS char ],
- SubID[ MAX_PLAYERS ] = 0,
- CanShoot[ MAX_PLAYERS ] = 0
- ;
- //
- Float:GetXYInFrontOfPlayer(playerid, &Float:q, &Float:w, Float:distance)
- {
- new Float:a;
- GetPlayerPos(playerid, q, w, a);
- if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER) GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
- else GetPlayerFacingAngle(playerid, a);
- q += (distance * floatsin(-a, degrees));
- w += (distance * floatcos(-a, degrees));
- return a;
- }
- Float:GetXYInFrontOfObject(objectid, playerid, &Float:x, &Float:y, Float:distance)
- {
- new Float:a;
- GetObjectPos(objectid, x, y, a);
- GetPlayerFacingAngle(playerid, a);
- x += (distance * floatsin(-a, degrees));
- y += (distance * floatcos(-a, degrees));
- }
- //
- public OnFilterScriptInit()
- {
- for( new i; i < _: sInfo; ++i ) Submarine[ i ][ sInfo: i ] = 0, Submarines = 0;
- print("\n--> Submarine script v1 loaded\n--->Created by: Kyance");
- return 1;
- }
- public OnFilterScriptExit()
- {
- print("\n--> Submarine script v1 un-loaded\n--->Created by: Kyance");
- DestroySubmarines();
- foreach(Player, i)
- {
- if(inSub{ i })
- {
- UnfreezePlayer(i);
- inSub{ i } = false, SubID[i] = 0, CanShoot[i] = 0;
- }
- }
- return 1;
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- inSub{ playerid } = false;
- SubID[playerid] = 0, CanShoot[playerid] = 0;
- return 1;
- }
- public OnPlayerDeath(playerid, killerid, reason)
- {
- inSub{ playerid } = false;
- SubID[playerid] = 0, CanShoot[playerid] = 0;
- return 1;
- }
- public OnPlayerUpdate(playerid)
- {
- new Float:pos[4], key[3];
- GetPlayerKeys(playerid, key[0], key[1], key[2]);
- if(inSub{ playerid })
- {
- if(key[1] == KEY_UP)
- {
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- GetXYInFrontOfPlayer(playerid, pos[0], pos[1], 1.5);
- SetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- GetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectPos(Submarine[SubID[playerid]][Object], pos[0], pos[1], Submarine[SubID[playerid]][sZ]);
- }
- else if(key[1] == KEY_DOWN)
- {
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- GetXYInFrontOfPlayer(playerid, pos[0], pos[1], -0.5);
- SetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- GetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectPos(Submarine[SubID[playerid]][Object], pos[0], pos[1], Submarine[SubID[playerid]][sZ]);
- }
- if(key[2] == KEY_LEFT)
- {
- GetPlayerFacingAngle(playerid, pos[3]);
- SetPlayerFacingAngle(playerid, pos[3] + 0.5);
- SetCameraBehindPlayer(playerid);
- GetObjectRot(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectRot(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]+0.5);
- }
- else if(key[2] == KEY_RIGHT)
- {
- GetPlayerFacingAngle(playerid, pos[3]);
- SetPlayerFacingAngle(playerid, pos[3] - 0.5);
- SetCameraBehindPlayer(playerid);
- GetObjectRot(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectRot(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]-0.5);
- }
- if(key[0] == KEY_JUMP)
- {
- if(pos[2] < 2.0)
- {
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- SetPlayerPos(playerid, pos[0], pos[1], pos[2] + 0.5);
- GetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]+0.6);
- if(pos[2] > 2.0)
- {
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- SetPlayerPos(playerid, pos[0], pos[1], pos[2] - 1.0);
- GetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]-1.1);
- }
- }
- else GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~r~MAX HEIGHT REACHED", 2500, 3);
- }
- else if(key[0] == KEY_SPRINT)
- {
- if(pos[2] > -23.0)
- {
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- SetPlayerPos(playerid, pos[0], pos[1], pos[2] - 0.5);
- GetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]-0.4);
- if(pos[2] < -23.0)
- {
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- SetPlayerPos(playerid, pos[0], pos[1], pos[2] + 1.0);
- GetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]+0.9);
- }
- }
- else GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~r~MAX DEPTH REACHED", 1500, 3);
- }
- }
- return 1;
- }
- public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- {
- if(inSub{ playerid })
- {
- new Float:X, Float:Y, Float:Z;
- GetPlayerPos(playerid, X, Y, Z);
- new Float:X2, Float:Y2, Float:Z2;
- new string[92];
- if(newkeys & KEY_YES)
- {
- if(Submarine[SubID[playerid]][TorpedoLoaded] && CanShoot[playerid])
- {
- if(Submarine[SubID[playerid]][Torpedos])
- {
- Submarine[SubID[playerid]][Torpedos]--;
- format(string, sizeof(string), "SUBMARINE: Torpedo away! Remaining torpedos: %d/4", Submarine[SubID[playerid]][Torpedos]);
- CanShoot[playerid] = 0;
- foreach(Player, i)
- {
- if(IsPlayerInRangeOfPoint(i, 20, X, Y, Z))
- {
- SendClientMessage(i, -1, string);
- }
- }
- string = "\0";
- Submarine[SubID[playerid]][TorpedoObject] = CreateObject(1636, Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY]-2, Submarine[SubID[playerid]][sZ], 0, 0, 0);
- GetXYInFrontOfObject(Submarine[SubID[playerid]][TorpedoObject], playerid, Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], 150.0);
- new time = MoveObject(Submarine[SubID[playerid]][TorpedoObject], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ], 65.0);
- SetTimerEx("DetonateTorpedo", time, false, "ii", playerid, Submarine[SubID[playerid]][TorpedoObject]);
- format(string, sizeof(string), "SUBMARINE: The torpedo will explode in approx. %d seconds!", time/1000);
- SendClientMessage(playerid, -1, string), string = "\0";
- }
- else SendClientMessage(playerid, -1, "SUBMARINE: You've ran out of torpedos!");
- }
- else
- {
- SendClientMessage(playerid, -1, "SUBMARINE: Loading torpedo..");
- SetTimerEx("TorpedoLoadedT", 2500+random(3000), false, "ii", playerid, SubID[playerid]);
- }
- }
- else if(PRESSED(KEY_NO))
- {
- if(Submarine[SubID[playerid]][LifeBoat])
- {
- GetObjectPos(Submarine[SubID[playerid]][Object], Submarine[SubID[playerid]][sX], Submarine[SubID[playerid]][sY], Submarine[SubID[playerid]][sZ]);
- SendClientMessage(playerid, -1, "SUBMARINE: Deploying lifeboat..");
- SetTimerEx("LifeboatLoaded", 3000+random(2000), false, "ii", playerid, SubID[playerid]);
- }
- else
- {
- new count = 0;
- for(new i = 1; i < MAX_VEHICLES; i++)
- {
- for(new x = 1; x < MAX_SUBS; x++)
- {
- if(GetVehicleModel(i) == 473 && i == LifeboatInfo[x][vehicleID])
- {
- GetVehiclePos(i, X2, Y2, Z2);
- if(IsPlayerInRangeOfPoint(playerid, 10, X2, Y2, Z2))
- {
- count = 1;
- DestroyVehicle(i);
- break;
- }
- }
- }
- }
- if(count)
- {
- SetTimerEx("LoadLifeboat", 2000+random(2500), false, "ii", playerid, SubID[playerid]);
- SendClientMessage(playerid, -1, "SUBMARINE: Since you're near a lifeboat, it's being loaded on your submarine.");
- }
- else SendClientMessage(playerid, -1, "SUBMARINE: You aren't near a lifeboat to load it back on your submarine!");
- }
- }
- }
- return 1;
- }
- public OnVehicleDeath(vehicleid, killerid)
- {
- for(new x = 1; x < MAX_SUBS; x++)
- {
- if(vehicleid == LifeboatInfo[x][vehicleID])
- {
- DestroyLifeboat(vehicleid);
- }
- }
- return 1;
- }
- /*----------------------------------------------------------------------------*/
- stock FreezePlayer(playerid) return TogglePlayerControllable(playerid, false);
- stock UnfreezePlayer(playerid) return TogglePlayerControllable(playerid, true);
- stock GetClosestPlayer(playerid)
- {
- new Float:dist = 150.0;
- new id = -1;
- new Float:x,Float:y,Float:z; new Float:x2, Float:y2, Float:z2;
- new Float:tmpdis;
- GetPlayerPos(playerid,x,y,z);
- foreach(Player, i)
- {
- GetPlayerPos(i,x2,y2,z2);
- tmpdis = floatsqroot(floatpower(floatabs(floatsub(x2,x)),2)+floatpower(floatabs(floatsub(y2,y)),2)+floatpower(floatabs(floatsub(z2,z)),2));
- if(tmpdis < dist)
- {
- dist = tmpdis;
- id = i;
- }
- }
- return id;
- }
- PUB:DetonateTorpedo(playerid, torpedoid)
- {
- new Float:X, Float:Y, Float:Z;
- GetObjectPos(torpedoid, X,Y,Z);
- foreach(Player, i)
- {
- if(i == playerid || IsPlayerAdmin(i)) continue;
- if(IsPlayerInRangeOfPoint(i, 6, X, Y, Z))
- {
- if(IsPlayerInAnyVehicle(i)) SetVehicleHealth(i, 235), RemovePlayerFromVehicle(i);
- SpawnPlayer(i);
- OnPlayerDeath(i, playerid, 51);
- }
- }
- CreateExplosion(X, Y + 1 , Z, 2, 150);
- CreateExplosion(X, Y + 1 , Z, 3, 150);
- CreateExplosion(X, Y + 1 , Z, 4, 150);
- DestroyObject(torpedoid);
- return 1;
- }
- PUB:TorpedoLoadedT(playerid, submarineid)
- {
- if(Submarine[submarineid][Torpedos])
- {
- SendClientMessage(playerid, -1, "SUBMARINE: Torpedo loaded, ready to be used!");
- Submarine[submarineid][TorpedoLoaded] = 1, CanShoot[playerid] = 1;
- }
- else SendClientMessage(playerid, -1, "SUBMARINE: Could not find any torpedos..");
- return 1;
- }
- PUB:LifeboatLoaded(playerid, submarineid)
- {
- CreateLifeboat(playerid, submarineid, Submarine[submarineid][sX]+4, Submarine[submarineid][sY], Submarine[submarineid][sZ], Submarine[submarineid][sAngle]);
- SendClientMessage(playerid, -1, "LIFEBOAT: Lifeboat deployed, exit the submarine and jump on the lifeboat!");
- return 1;
- }
- PUB:LoadLifeboat(playerid, submarineid)
- {
- Submarine[submarineid][LifeBoat] = 1;
- SendClientMessage(playerid, -1, "SUBMARINE: The lifeboat has been successfully loaded on your submarine!");
- return 1;
- }
- stock CreateLifeboat(playerid, submarineid, Float:X, Float:Y, Float:Z, Float:Angle)
- {
- Submarine[SubID[playerid]][LifeBoat] = 0;
- LifeboatInfo[submarineid][vehicleID] = CreateVehicle(473, X, Y, Z, Angle, 8, 8, 120);
- LifeboatInfo[submarineid][lbID] = submarineid;
- new lString[124];
- format(lString, sizeof(lString), "{FFFFFF}Lifeboat of submarine {64CC66}%d\n{FFFFFF}Submarine had {64CC66}%d torpedos.\n{FFFFFF}Submarine had {64CC66}%d health.", submarineid, Submarine[submarineid][Torpedos], Submarine[submarineid][Health]);
- Label[LifeboatInfo[submarineid][vehicleID]] = Create3DTextLabel(lString, -1, X,Y+1,Z, 60, 0, 1);
- Attach3DTextLabelToVehicle(Label[LifeboatInfo[submarineid][vehicleID]], LifeboatInfo[submarineid][vehicleID], X, Y+1, Z);
- }
- stock DestroyLifeboat(submarineid)
- {
- DestroyVehicle(LifeboatInfo[submarineid][vehicleID]);
- LifeboatInfo[submarineid][lbID] = 0;
- Delete3DTextLabel(Label[LifeboatInfo[submarineid][vehicleID]]);
- }
- stock CreateSubmarine(submarineid, Float:X, Float:Y, Float:Z, Float:Angle)
- {
- Submarine[submarineid][ID] = submarineid;
- Submarine[submarineid][Object] = CreateObject(9958, X, Y, Z, 0, 0, Angle);
- Submarine[submarineid][sX] = X, Submarine[submarineid][sY] = Y, Submarine[submarineid][sZ] = Z, Submarine[submarineid][sAngle] = Angle;
- Submarine[submarineid][Torpedos] = 4, Submarine[submarineid][TorpedoLoaded] = 0;
- Submarine[submarineid][LifeBoat] = 1, Submarine[submarineid][LifeBoatID] = submarineid;
- Submarine[submarineid][Health] = 500;
- Submarine[submarineid][IsActive] = 1, Submarine[submarineid][InUse] = 0;
- Submarines++;
- }
- stock DestroySubmarine(submarineid)
- {
- Submarine[submarineid][ID] = -1;
- DestroyObject(Submarine[submarineid][Object]), Submarine[submarineid][Object] = INVALID_OBJECT_ID; DestroyObject(Submarine[submarineid][TorpedoObject]);
- Submarine[submarineid][sX] = -1, Submarine[submarineid][sY] = -1, Submarine[submarineid][sZ] = -1, Submarine[submarineid][sAngle] = -1;
- Submarine[submarineid][Torpedos] = 0, Submarine[submarineid][TorpedoLoaded] = 0;
- Submarine[submarineid][Health] = 0;
- Submarine[submarineid][IsActive] = -1, Submarine[submarineid][InUse] = -1;
- DestroyLifeboat(submarineid);
- Submarines--;
- }
- stock DestroySubmarines()
- {
- for(new submarineid = 1; submarineid < MAX_SUBS; submarineid++)
- {
- Submarine[submarineid][ID] = -1;
- DestroyObject(Submarine[submarineid][Object]), Submarine[submarineid][Object] = INVALID_OBJECT_ID; DestroyObject(Submarine[submarineid][TorpedoObject]);
- Submarine[submarineid][sX] = -1, Submarine[submarineid][sY] = -1, Submarine[submarineid][sZ] = -1, Submarine[submarineid][sAngle] = -1;
- Submarine[submarineid][Torpedos] = 0, Submarine[submarineid][TorpedoLoaded] = 0;
- Submarine[submarineid][Health] = 0;
- Submarine[submarineid][IsActive] = -1, Submarine[submarineid][InUse] = -1;
- DestroyLifeboat(submarineid);
- }
- Submarines = 0;
- }
- stock GetAvailableID()
- {
- for(new i = 1; i<MAX_SUBS; i++)
- {
- if(!Submarine[i][IsActive]) return i;
- }
- return -1;
- }
- /*----------------------------------------------------------------------------*/
- CMD:createsubmarine(playerid, params[]) {
- if(IsPlayerAdmin(playerid))
- {
- new Float:X, Float:Y, Float:Z, Float:Angle;
- GetPlayerPos(playerid, X, Y, Z);
- if(Z > 1) return SendClientMessage(playerid, -1, "SUBMARINE: Your position is too high to create an submarine ( not in water ? )");
- else if(Z < -1) return SendClientMessage(playerid, -1, "SUBMARINE: Your position is too low to create an submarine ( below water ? )");
- new subID = GetAvailableID();
- if(subID < 20)
- {
- GetPlayerPos(playerid, X, Y, Z), GetPlayerFacingAngle(playerid, Angle);
- CreateSubmarine(subID, X, Y, Z+3, Angle+180);
- SetPlayerPos(playerid, X, Y, Z+6);
- }
- else SendClientMessage(playerid, -1, "SUBMARINE: The max. amount of submarines has been reached.");
- }
- else return 0;
- return 1;
- }
- CMD:destroysubmarine(playerid, params[]) {
- if(IsPlayerAdmin(playerid))
- {
- if(Submarines)
- {
- new subID;
- if(sscanf(params, "u", subID)) return SendClientMessage(playerid, -1, "USAGE: /destroysubmarine ID");
- if(Submarine[subID][IsActive]) DestroySubmarine(subID);
- else return SendClientMessage(playerid, -1, "SUBMARINE: Submarine not active!");
- if(Submarine[subID][InUse]) return SendClientMessage(playerid, -1, "SUBMARINE: This submarine is in use.");
- }
- else SendClientMessage(playerid, -1, "SUBMARINE: The aren't any submarines spawned!");
- }
- else return 0;
- return 1;
- }
- CMD:destroysubmarines(playerid, params[]) {
- if(IsPlayerAdmin(playerid))
- {
- if(Submarines) DestroySubmarines();
- else SendClientMessage(playerid, -1, "SUBMARINE: The aren't any submarines spawned!");
- }
- else return 0;
- return 1;
- }
- CMD:submarine(playerid, params[]) {
- if(inSub{ playerid })
- {
- UnfreezePlayer(playerid);
- inSub{ playerid } = false, Submarine[SubID[playerid]][InUse] = 0, SubID[playerid] = 0, CanShoot[playerid] = 0;
- SendClientMessage(playerid, -1, "SUBMARINE: You've left the submarine.");
- }
- else
- {
- if(!IsPlayerInAnyVehicle(playerid))
- {
- for(new i = 1; i < MAX_SUBS; i++)
- {
- if(Submarine[i][IsActive] && !Submarine[i][InUse])
- {
- if(IsPlayerInRangeOfPoint(i, 10, Submarine[i][sX], Submarine[i][sY], Submarine[i][sZ]))
- {
- FreezePlayer(playerid);
- inSub{ playerid } = true, SubID[playerid] = Submarine[i][ID];
- CanShoot[playerid] = 0;
- SendClientMessage(playerid, -1, "SUBMARINE: You've entered a submarine.");
- SendClientMessage(playerid, -1, "SUBMARINE: Use UP, DOWN, LEFT and RIGHT keys to control it. Use Y to shoot a torpedo, and N to deploy a lifeboat.");
- }
- }
- }
- }
- }
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment