Crear un lнmite en un бrea
#1

Buenas.
Alguien podrнa darme una orientaciуn sobre como poder hacer que cuando alguien se salga de determinada бrea se vuelva a introducir dentro de ella? Pero no en el centro o en cualquier otra posiciуn, si no en la ъltima posiciуn del borde. No sй si me explico correctamente, pero si me pudiesen dar una ayuda se los agradecerнa muchнsimo.
Desde ya muchas gracias.
Reply
#2

Creo que podrias hacerlo con GangZones https://sampwiki.blast.hk/wiki/GangZoneCreate
Reply
#3

Quote:
Originally Posted by SilverGaming
Посмотреть сообщение
Creo que podrias hacerlo con GangZones https://sampwiki.blast.hk/wiki/GangZoneCreate
Lo harй con las zonas dinбmicas de Streamer, pero no se me ocurre como hacer para regresarlo a la ъltima posiciуn dentro de la zona.
Reply
#4

Si lo haces con las gangzones, crea una variable y almacena cuando toca el limite, que lo retroseda.. A los bordes de la gangzone :v
Reply
#5

En un principio lo mбs fбcil es usar el streamer de Incognito, para entender lo que te voy a escribir, te recomiendo que leas primero mi tutorial sobre la manipulaciуn de datos.

Empecemos creando un cuadrado en el centro del mapa:
PHP код:
new mi_area;
public 
OnGameModeInit()
{
    
mi_area CreateDynamicRectangle(-100.0, -100.0100.0100.0);
    return 
1;

Obviamente usamos OnPlayerLeaveDynamicArea para detectar cuando el jugador abandona un бrea:
PHP код:
public OnPlayerLeaveDynamicArea(playeridareaid)
{
    
/* Obtenemos las coordenadas usadas para crear el бrea. */
    
new Float:min_x;
    new 
Float:min_y;
    new 
Float:max_x;
    new 
Float:max_y;
    
min_x Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MIN_X);
    
min_y Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MIN_Y);
    
max_x Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MAX_X);
    
max_y Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MAX_Y);
    
/* Obtenemos la posiciуn del jugador. */
    
new Float:p_x;
    new 
Float:p_y;
    new 
Float:p_z;
    
GetPlayerPos(playeridp_xp_yp_z);
    
/* Detectamos donde se encuentra el jugador respecto al бrea. */
    
if(areaid == mi_area)
    {
        if(
p_x max_x// El jugador se encuentra a la derecha del cuadrado
        
{
            
SetPlayerPos(playeridmax_xp_yp_z);
        }
        else if(
p_x min_x// El jugador se encuentra a la izquierda del cuadrado
        
{
            
SetPlayerPos(playeridmin_xp_yp_z);
        }
        if(
p_y max_y// El jugador se encuentra por encima del cuadrado
        
{
            
SetPlayerPos(playeridp_xmax_yp_z);
        }
        else if(
p_y min_y// El jugador se encuentra por debajo del cuadrado
        
{
            
SetPlayerPos(playeridp_xmin_yp_z);
        }
        return 
1;
    }
    return 
1;

Como puedes ver, hemos utilizado SetPlayerPos para colocarlo justo en el margen del cuadrado. En caso de que la posiciуn no sea muy exacta y el jugador quede fuera podrнas hacer algo como esto: max_x - 1.0 o min_y + 1.0.

Este es un ejemplo muy bбsico, no lo he probado pero deberнa funcionar. En caso de tratarse de una zona mбs compleja, las cosas se complicarнan.

Si el бrea fuese un circulo habrнa que trazar una recta desde la posiciуn del jugador al centro de la circunferencia, y detectar donde corta dicha recta con la circunferencia para poder colocar al jugador en dicha posiciуn. Para ello habrнa que desarrollar un algoritmo, no es complicado, pero sн que serнa algo mбs avanzado que el ejemplo anterior.
Reply
#6

https://sampwiki.blast.hk/wiki/SetPlayerWorldBounds hace exactamente lo que vos pedis. Te regresa al area de una forma muy elegante, mejor que con SetPlayerPos en mi opinion
Reply
#7

Efectivamente, SetPlayerWorldBounds es igual de efectivo en el caso de los rectбngulos/cuadrados.

De todas formas, para simplificar lo anterior podrнamos hacer algo como esto:
PHP код:
public OnPlayerLeaveDynamicArea(playeridareaid
{
    if(
areaid == mi_area)
    {
        
SendClientMessage(playerid, -1"No puede abandonar esta zona.");
        
SetPlayerOnSquareMargin(playeridareaid);
    }
    return 
1;

PHP код:
SetPlayerOnRectangleMargin(playeridareaid)
{
    if(
Streamer_GetIntData(STREAMER_TYPE_AREAareaidE_STREAMER_TYPE) == STREAMER_AREA_TYPE_RECTANGLE)
    {
        new 
Float:p_coords[3];
        new 
Float:area_coords[4];
        
GetPlayerPos(playeridp_coords[0], p_coords[1], p_coords[2]);
        
area_coords[0] = Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MIN_X); 
        
area_coords[1] = Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MIN_Y); 
        
area_coords[2] = Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MAX_X); 
        
area_coords[3] = Streamer_GetFloatData(STREAMER_TYPE_AREAareaidE_STREAMER_MAX_Y);
        if(
p_coords[0] > area_coords[2])
        { 
            
SetPlayerPos(playeridarea_coords[2], p_coords[1], p_coords[2]); 
        } 
        else if(
p_coords[0] < area_coords[0])
        { 
            
SetPlayerPos(playeridarea_coords[0], p_coords[1], p_coords[2]); 
        } 
        if(
p_coords[1] > area_coords[3])
        { 
            
SetPlayerPos(playeridp_coords[0], area_coords[3], p_coords[2]); 
        } 
        else if(
p_coords[1] < area_coords[1])
        { 
            
SetPlayerPos(playeridp_coords[0], area_coords[1], p_coords[2]); 
        } 
        
    }
    else
    {
        
printf("[ERROR] El бrea %d no es un rectбngulo.");
    }

Asн tambiйn podrнamos personalizar un poco mбs nuestros scripts, aсadiendo una condiciуn en OnPlayerLeaveDynamicArea por ejemplo. Con SetPlayerWorldBounds hay que estar cambiando los lнmites continuamente para permitirle al jugador desplazarse fuera de esos lнmites.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)