Comando /spec
#1

Bueno,quisiera pedir el comando /spec completo ya que he buscado y ninguno funciona,lo que pasa es que cuando el jugador al que se estб specteando entra a un interior el que estб specteando se va a la mierda :/ y lo que quisiera es que aunque el jugador entre al interior aъn siga specteando.Gracias | El sistema completo por favor | GM(Desde 0)
Reply
#2

pawn Код:
// [ 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;
}
Aya tu si quieres hacerle modificaciones.
Reply
#3

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
pawn Код:
// [ 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;
}
Aya tu si quieres hacerle modificaciones.
Gracias
Reply
#4

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.
Reply
#5

Quote:
Originally Posted by OTACON
Посмотреть сообщение
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.
No tengo ese FS,de todas maneras lo que hizo Sick es la manera que buscaba.
Reply
#6

PHP код:
//
//  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(playeridnewinterioridoldinteriorid)
{
    
// IF ANYONE IS SPECTATING THIS PLAYER, WE'LL ALSO HAVE
    // TO CHANGE THEIR INTERIOR ID TO MATCH
    
new 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(playeridcmdtext[])
{
    new 
cmd[256];
    new 
specplayeridspecvehicleididx;
    
// WE ONLY DEAL WITH COMMANDS FROM ADMINS IN THIS FILTERSCRIPT
    
if(!IsPlayerAdmin(playerid)) return 0;
    
cmd strtok(cmdtextidx);
    
// SPECTATE A PLAYER
     
if(strcmp(cmd"/specplayer"true) == 0) {
        new 
tmp[256];
        
tmp strtok(cmdtextidx);
        if(!
strlen(tmp)) {
            
SendClientMessage(playeridCOLOR_WHITE"USAGE: /specplayer [playerid]");
            return 
1;
        }
        
specplayerid strval(tmp);
        
        if(!
IsPlayerConnected(specplayerid)) {
            
SendClientMessage(playeridCOLOR_RED"specplayer: that player isn't active.");
            return 
1;
        }
        
        
TogglePlayerSpectating(playerid1);
        
PlayerSpectatePlayer(playeridspecplayerid);
        
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(cmdtextidx);
        if(!
strlen(tmp)) {
            
SendClientMessage(playeridCOLOR_WHITE"USAGE: /specvehicle [vehicleid]");
            return 
1;
        }
        
specvehicleid strval(tmp);
        
        if(
specvehicleid MAX_VEHICLES) {
            
TogglePlayerSpectating(playerid1);
            
PlayerSpectateVehicle(playeridspecvehicleid);
            
gSpectateID[playerid] = specvehicleid;
            
gSpectateType[playerid] = ADMIN_SPEC_TYPE_VEHICLE;
        }
         return 
1;
    }
    
// STOP SPECTATING
     
if(strcmp(cmd"/specoff"true) == 0) {
        
TogglePlayerSpectating(playerid0);
        
gSpectateID[playerid] = INVALID_PLAYER_ID;
        
gSpectateType[playerid] = ADMIN_SPEC_TYPE_NONE;
        return 
1;
    }
    return 
0;
}
//------------------------------------------------------------------------------------------------------ 

PD: tu problema era por lo de OnPlayerInteriorChange, revisa.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)