i want make "OnPlayerKeyStateChange" example KEY_FIRE for spectating the next,
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf>
#include <foreach>
#include <cnr/cnr_mysqlFunctions> // Since you might have the newer version of sscanf it would be '#include <sscanf2>'
#undef MAX_PLAYERS
#define MAX_PLAYERS 32 // Here you need to set the maximum number of players able to play on your server at any given time, I'll put 32 because that's the max players on my server.
#define Grey 0xC0C0C0FF
#define white 0xFFFFFFFF // Defining the color 'Grey'
new String[128], Float:SpecX[MAX_PLAYERS], Float:SpecY[MAX_PLAYERS], Float:SpecZ[MAX_PLAYERS], vWorld[MAX_PLAYERS], Inter[MAX_PLAYERS];
new IsSpecing[MAX_PLAYERS], Name[MAX_PLAYER_NAME], IsBeingSpeced[MAX_PLAYERS],spectatorid[MAX_PLAYERS];
COMMAND:spec(playerid, params[])
{
new id;
new otherPlayer;
if(!sscanf(params, "u", otherPlayer))
{
if(playerData[playerid][playerLevel] >= playerData[otherPlayer][playerLevel])return SendClientMessage(playerid, white, "{B7B7B7}[SERVER] {FFFFFF}You cannot use this command on that player.");
if(playerData[playerid][playerLevel] >= 1)return 0;// This checks if the player is logged into RCON, if not it will return 0; (Showing "SERVER: Unknown Command") You can replace it with your own admin check.
if(id == INVALID_PLAYER_ID)return SendClientMessage(playerid, white, "{B7B7B7}[SERVER] {FFFFFF}That player is not online!");// This is to ensure that you don't fill the param with an invalid player id.
GetPlayerPos(playerid,SpecX[playerid],SpecY[playerid],SpecZ[playerid]);// This is getting and saving the player's position in a variable so they'll respawn at the same place they typed '/spec'
Inter[playerid] = GetPlayerInterior(playerid);// Getting and saving the interior.
vWorld[playerid] = GetPlayerVirtualWorld(playerid);//Getting and saving the virtual world.
TogglePlayerSpectating(playerid, true);// Now before we use any of the 3 functions listed above, we need to use this one. It turns the spectating mode on.
if(IsPlayerInAnyVehicle(id))//Checking if the player is in a vehicle.
{
if(GetPlayerInterior(id) > 0)//If the player's interior is more than 0 (the default) then.....
{
SetPlayerInterior(playerid,GetPlayerInterior(id));//.....set the spectator's interior to that of the player being spectated.
}
if(GetPlayerVirtualWorld(id) > 0)//If the player's virtual world is more than 0 (the default) then.....
{
SetPlayerVirtualWorld(playerid,GetPlayerVirtualWorld(id));//.....set the spectator's virtual world to that of the player being spectated.
}
PlayerSpectateVehicle(playerid,GetPlayerVehicleID(id));// Now remember we checked if the player is in a vehicle, well if they're in a vehicle then we'll spec the vehicle.
}
else// If they're not in a vehicle, then we'll spec the player.
{
if(GetPlayerInterior(id) > 0)
{
SetPlayerInterior(playerid,GetPlayerInterior(id));
}
if(GetPlayerVirtualWorld(id) > 0)
{
SetPlayerVirtualWorld(playerid,GetPlayerVirtualWorld(id));
}
PlayerSpectatePlayer(playerid,id);// Letting the spectator spec the person and not a vehicle.
}
GetPlayerName(id, Name, sizeof(Name));//Getting the name of the player being spectated.
format(String, sizeof(String),"{FE9A2E}[ADMIN] {FFFFFF}You have begun to spectate %s.",Name);// Formatting a string to send to the spectator.
SendClientMessage(playerid, white, String);//Sending the formatted message to the spectator.
IsSpecing[playerid] = 1;// Just saying that the spectator has begun to spectate someone.
IsBeingSpeced[id] = 1;// Just saying that a player is being spectated (You'll see where this comes in)
spectatorid[playerid] = id;// Saving the spectator's id into this variable.
}
return 1;// Returning 1 - saying that the command has been sent.
}
COMMAND:specoff(playerid, params[])
{
if(playerData[playerid][playerLevel] >= 1)return 0;// This checks if the player is logged into RCON, if not it will return 0; (Showing "SERVER: Unknown Command")
if(IsSpecing[playerid] == 0)return SendClientMessage(playerid,Grey,"You are not spectating anyone.");
TogglePlayerSpectating(playerid, 0);//Toggling spectate mode, off. Note: Once this is called, the player will be spawned, there we'll need to reset their positions, virtual world and interior to where they typed '/spec'
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
if(IsBeingSpeced[playerid] == 1)//If the player being spectated, disconnects, then turn off the spec mode for the spectator.
{
foreach(Player,i)
{
if(spectatorid[i] == playerid)
{
TogglePlayerSpectating(i,false);// This justifies what's above, if it's not off then you'll be either spectating your connect screen, or somewhere in blueberry (I don't know why)
}
}
}
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(IsBeingSpeced[playerid] == 1)//If the player being spectated, dies, then turn off the spec mode for the spectator.
{
foreach(Player,i)
{
if(spectatorid[i] == playerid)
{
TogglePlayerSpectating(i,false);// This justifies what's above, if it's not off then you'll be either spectating your connect screen, or somewhere in blueberry (I don't know why)
}
}
}
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)// If the player's state changes to a vehicle state we'll have to spec the vehicle.
{
if(IsBeingSpeced[playerid] == 1)//If the player being spectated, enters a vehicle, then let the spectator spectate the vehicle.
{
foreach(Player,i)
{
if(spectatorid[i] == playerid)
{
PlayerSpectateVehicle(i, GetPlayerVehicleID(playerid));// Letting the spectator, spectate the vehicle of the player being spectated (I hope you understand this xD)
}
}
}
}
if(newstate == PLAYER_STATE_ONFOOT)
{
if(IsBeingSpeced[playerid] == 1)//If the player being spectated, exists a vehicle, then let the spectator spectate the player.
{
foreach(Player,i)
{
if(spectatorid[i] == playerid)
{
PlayerSpectatePlayer(i, playerid);// Letting the spectator, spectate the player who exited the vehicle.
}
}
}
}
return 1;
}
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)//This is called when a player's interior is changed.
{
if(IsBeingSpeced[playerid] == 1)//If the player being spectated, changes an interior, then update the interior and virtualword for the spectator.
{
foreach(Player,i)
{
if(spectatorid[i] == playerid)
{
SetTimer("spec",3000,false);
}
}
}
return 1;
}
public OnPlayerSpawn(playerid)
{
if(IsSpecing[playerid] == 1)
{
SetPlayerPos(playerid,SpecX[playerid],SpecY[playerid],SpecZ[playerid]);// Remember earlier we stored the positions in these variables, now we're gonna get them from the variables.
SetPlayerInterior(playerid,Inter[playerid]);//Setting the player's interior to when they typed '/spec'
SetPlayerVirtualWorld(playerid,vWorld[playerid]);//Setting the player's virtual world to when they typed '/spec'
IsSpecing[playerid] = 0;//Just saying you're free to use '/spec' again YAY :D
IsBeingSpeced[spectatorid[playerid]] = 0;//Just saying that the player who was being spectated, is not free from your stalking >:D
}
return 1;
}
forward spec(playerid);
public spec(playerid)
{
foreach(Player,i)
{
SetPlayerInterior(i,GetPlayerInterior(playerid));
SetPlayerVirtualWorld(i,GetPlayerVirtualWorld(playerid));
}
}
forward ConnectedPlayers();
public ConnectedPlayers()
{
new Connected;
for(new i = 0; i < MAX_PLAYERS; i++) if(IsPlayerConnected(i)) Connected++;
return Connected;
}