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]);
}
}
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"; } }
Be very careful with that code, specifically this part:
Code:
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"; } } Also I suggest detecting stuff like that under OnPlayerUpdate with static variables, simply because it gets called more frequently. |
I only meant for detecting the 'Y' key, that's why there are if-checks to prevent that. Also, I suppose you only want torpedos to be fired every "X" seconds, so then you can also limit it that way by using GetTickCount() or gettime() so it only gets called once when needed. Like it's done in "Grand Larceny" with class selection (changing cities).
|
Well what do you mean, it doesn't work sideways, you can only fire torpedos forwards/backwards?
I don't know what to tell you, somewhere is a mistake at your end, one of the variables you are using isn't correctly set, it's either "inSub{playerid}" or "CanShoot[playerid]". Also show your code for moving the submarine, somekind of problem must be there if the torpedo only get's created when moving, as you said. |
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;
}