| El sistema completo por favor | GM(Desde 0)
// [ DEVELOPMENT GAMEMODE ]
// INCLUDES:
#include <a_samp>
#include <sscanf2>
#include <zcmd>
// PER-PLAYER VARIABLES:
// GENERAL:
new pSpectatingPlayer[MAX_PLAYERS],
Float:pSpectatingPos[MAX_PLAYERS][4],
pSpectatingInterior[MAX_PLAYERS],
pSpectatingVirtualWorld[MAX_PLAYERS];
// STATES:
new bool:sSpectating[MAX_PLAYERS] = false,
bool:sBeingSpectated[MAX_PLAYERS] = false;
// MAIN:
main()
{
print("Development Mode: spectate.amx");
}
// CALLBACKS:
public OnGameModeInit()
{
return 1;
}
public OnGameModeExit()
{
return 1;
}
public OnPlayerSpawn(playerid)
{
if(IsPlayerSpectating(playerid))
{
SetPlayerInterior(playerid, pSpectatingInterior[playerid]);
SetPlayerVirtualWorld(playerid, pSpectatingVirtualWorld[playerid]);
SetPlayerPos(playerid, pSpectatingPos[playerid][0], pSpectatingPos[playerid][1], pSpectatingPos[playerid][2]);
SetPlayerFacingAngle(playerid, pSpectatingPos[playerid][3]);
SetCameraBehindPlayer(playerid);
sSpectating[playerid] = false;
sBeingSpectated[pSpectatingPlayer[playerid]] = false;
pSpectatingPlayer[playerid] = -1;
}
return 1;
}
// COMMANDS:
CMD:spec(playerid, params[])
{
new lookupid;
if(sscanf(params, "u", lookupid)) return SendClientMessage(playerid, -1, "Usage: /spec (id/name).");
if(!IsPlayerConnected(lookupid)) return SendClientMessage(playerid, -1, "Player isn't connected to the server.");
if(IsPlayerNPC(lookupid)) return SendClientMessage(playerid, -1, "You cannot spectate a bot.");
if(lookupid == playerid) return SendClientMessage(playerid, -1, "You cannot spectate yourself.");
if(IsPlayerSpectating(lookupid)) return SendClientMessage(playerid, -1, "You cannot spectate a player that's currently spectating.");
if(IsPlayerBeiningSpectated(lookupid)) return SendClientMessage(playerid, -1, "That player is already being spectated.");
if(!IsPlayerSpectating(playerid))
{
GetPlayerPos(playerid, pSpectatingPos[playerid][0], pSpectatingPos[playerid][1], pSpectatingPos[playerid][2]);
GetPlayerFacingAngle(playerid, pSpectatingPos[playerid][3]);
pSpectatingInterior[playerid] = GetPlayerInterior(playerid);
pSpectatingVirtualWorld[playerid] = GetPlayerVirtualWorld(playerid);
}
sSpectating[playerid] = true;
TogglePlayerSpectating(playerid, true);
sBeingSpectated[lookupid] = true;
pSpectatingPlayer[playerid] = lookupid;
if(IsPlayerInAnyVehicle(lookupid))
{
//SetPlayerInterior(playerid, GetVehicleInterior(GetPlayerVehicleID(lookupid))); // You need to get the function "GetVehicleInterior(...)", it can be found in YSF or somewhere else.
SetPlayerVirtualWorld(playerid, GetVehicleVirtualWorld(GetPlayerVehicleID(lookupid)));
PlayerSpectateVehicle(playerid, GetPlayerVehicleID(lookupid));
}
else
{
SetPlayerInterior(playerid, GetPlayerInterior(lookupid));
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(lookupid));
PlayerSpectatePlayer(playerid, lookupid);
}
return 1;
}
CMD:specoff(playerid, params[])
{
if(!IsPlayerSpectating(playerid)) return SendClientMessage(playerid, -1, "** You are not spectating anyone.");
TogglePlayerSpectating(playerid, false);
SetPlayerInterior(playerid, 0);
SetPlayerVirtualWorld(playerid, 0);
return 1;
}
// FUNCTIONS:
stock IsPlayerSpectating(playerid)
{
if(sSpectating[playerid]) return true;
return false;
}
stock IsPlayerBeiningSpectated(playerid)
{
if(sBeingSpectated[playerid]) return true;
return false;
}
|
pawn Код:
|
|
y por que no utilizas el filterscript llamado adminspec (o lo utilizas de base) que viene por defecto en los archivos de sa-mp?.
si miras el cуdigo te darбs cuenta que esta la soluciуn a tu problema que mencionas. saludos. |
//
// ADMIN SPECTATE FILTER SCRIPT
// kye 2007
//
#pragma tabsize 0
#include <a_samp>
#include <core>
#include <float>
#include "../include/gl_common.inc"
#define COLOR_GREY 0xAFAFAFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_WHITE 0xFFFFFFFF
//------------------------------------------------------------------------------------------------------
#define ADMIN_SPEC_TYPE_NONE 0
#define ADMIN_SPEC_TYPE_PLAYER 1
#define ADMIN_SPEC_TYPE_VEHICLE 2
new gSpectateID[MAX_PLAYERS];
new gSpectateType[MAX_PLAYERS];
//------------------------------------------------------------------------------------------------------
public OnFilterScriptInit()
{
}
//------------------------------------------------------------------------------------------------------
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
// IF ANYONE IS SPECTATING THIS PLAYER, WE'LL ALSO HAVE
// TO CHANGE THEIR INTERIOR ID TO MATCH
new x = 0;
while(x!=MAX_PLAYERS) {
if( IsPlayerConnected(x) && GetPlayerState(x) == PLAYER_STATE_SPECTATING &&
gSpectateID[x] == playerid && gSpectateType[x] == ADMIN_SPEC_TYPE_PLAYER )
{
SetPlayerInterior(x,newinteriorid);
}
x++;
}
}
//------------------------------------------------------------------------------------------------------
public OnPlayerCommandText(playerid, cmdtext[])
{
new cmd[256];
new specplayerid, specvehicleid, idx;
// WE ONLY DEAL WITH COMMANDS FROM ADMINS IN THIS FILTERSCRIPT
if(!IsPlayerAdmin(playerid)) return 0;
cmd = strtok(cmdtext, idx);
// SPECTATE A PLAYER
if(strcmp(cmd, "/specplayer", true) == 0) {
new tmp[256];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) {
SendClientMessage(playerid, COLOR_WHITE, "USAGE: /specplayer [playerid]");
return 1;
}
specplayerid = strval(tmp);
if(!IsPlayerConnected(specplayerid)) {
SendClientMessage(playerid, COLOR_RED, "specplayer: that player isn't active.");
return 1;
}
TogglePlayerSpectating(playerid, 1);
PlayerSpectatePlayer(playerid, specplayerid);
SetPlayerInterior(playerid,GetPlayerInterior(specplayerid));
gSpectateID[playerid] = specplayerid;
gSpectateType[playerid] = ADMIN_SPEC_TYPE_PLAYER;
return 1;
}
// SPECTATE A VEHICLE
if(strcmp(cmd, "/specvehicle", true) == 0) {
new tmp[256];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) {
SendClientMessage(playerid, COLOR_WHITE, "USAGE: /specvehicle [vehicleid]");
return 1;
}
specvehicleid = strval(tmp);
if(specvehicleid < MAX_VEHICLES) {
TogglePlayerSpectating(playerid, 1);
PlayerSpectateVehicle(playerid, specvehicleid);
gSpectateID[playerid] = specvehicleid;
gSpectateType[playerid] = ADMIN_SPEC_TYPE_VEHICLE;
}
return 1;
}
// STOP SPECTATING
if(strcmp(cmd, "/specoff", true) == 0) {
TogglePlayerSpectating(playerid, 0);
gSpectateID[playerid] = INVALID_PLAYER_ID;
gSpectateType[playerid] = ADMIN_SPEC_TYPE_NONE;
return 1;
}
return 0;
}
//------------------------------------------------------------------------------------------------------