[Duda]Saber cuando un auto esta en el agua
#1

Hola, como dice el titulo quisiera saber cuando un coche esta en el agua, lo que quiero hacer es que si un usuario cae al agua en un auto por accidente lo teleporte a una X posicion.

їAlguien sabe que podria usar o hacer?
Reply
#2

http://forum.sa-mp.com/showthread.ph...PlayerSwimming
Reply
#3

Quote:
Originally Posted by LatinZ
Посмотреть сообщение
eso no detecta es cuando un jugador hace la animaciуn de nadar?
Reply
#4

Un cуdigo simple podrнa ser detectar la posiciуn del jugador:

pawn Код:
new Float: X, Float: Y, Float: Z;
GetPlayerPos(playerid, X, Y, Z);
Y si la posiciуn "Z" del usuario estб en un nъmero menor a 1 (El nivel del mar, a excepciуn de algunos lugares como la cantera que contienen posiciones mбs bajas); lo coloca en la posiciуn que usted desea.

Algo como:

pawn Код:
new Float: X, Float: Y, Float: Z;
GetPlayerPos(playerid, X, Y, Z);
new State = GetPlayerState(playerid);
if(Z < 1)
{
if(State == PLAYER_STATE_DRIVER)
{
// Code.
}
return 1;
}
El ъnico problema serнan posiciones muy bajas como la cantera; en casos asн puede usar IsPlayerInRangeOfPoint para hacer una excepciуn en lugares como la cantera.

Se solucionarнa con algo como:

pawn Код:
new Float: X, Float: Y, Float: Z;
GetPlayerPos(playerid, X, Y, Z);
new State = GetPlayerState(playerid);
if(IsPlayerInRangeOfPoint(playerid, 100.0, "Coordenada X central de la cantera", "Coordenada Y central de la cantera", "Coordenada Z central de la cantera")) return 0;
if(Z < 1)
{
if(State == PLAYER_STATE_DRIVER)
{
// Funciуn para colocar los autos en la posiciуn que usted desea.
}
return 1;
}
Tambiйn podrнa funcionar de forma mбs simple con:

pawn Код:
new Float: X, Float: Y, Float: Z;
GetPlayerPos(playerid, X, Y, Z);
if(IsPlayerInRangeOfPoint(playerid, 100.0, "Coordenada X central de la cantera", "Coordenada Y central de la cantera", "Coordenada Z central de la cantera")) return 0;
if(Z < 1)
{
if(State == PLAYER_STATE_DRIVER)
{
new Veh = GetPlayerVehicleID(playerid);
SetVehiclePos(Veh, Pox, Poy, Poz);
SetPlayerPos(playerid, Pox, Poy, Poz);
PutPlayerInVehicle(playerid, Veh, 0);
}
return 1;
}
Algo mбs simple serнa OnPlayerEnterDynamicArea (https://sampforum.blast.hk/showthread.php?tid=235122) pero si le es muy complicado mejor use IsPlayerInRangeOfPoint para detectar si el usuario estб en la cantera o en un lugar bajo el nivel del mar.

El cуdigo lo puede colocar en OnPlayerUpdate o en algъn timer (De preferencia el timer para no saturar el servidor )

Suerte, espero le sirva
Reply
#5

https://sampforum.blast.hk/showthread.php?tid=400049Te va a gustar
Reply
#6

Parece que lo estбn re descansando (al menos eso parece, estб pidiendo algo que detecte cuando un vehнculo estб en el agua y le pasan funciones que detectan animaciуn de nado y esas cosas para el jugador.

Probб con esto (******й y lo encontrй de una en la secciуn en inglйs, buscar no cuesta nada eh...):

pawn Код:
stock IsVehicleInWater(vehicleid)
{
        new Float:water_areas[][] =
        {
                {25.0,  2313.0, -1417.0,        23.0},
                {15.0,  1280.0, -773.0,         1082.0},
                {15.0,  1279.0, -804.0,         86.0},
                {20.0,  1094.0, -674.0,         111.0},
                {26.0,  194.0,  -1232.0,        76.0},
                {25.0,  2583.0, 2385.0,         15.0},
                {25.0,  225.0,  -1187.0,        73.0},
                {50.0,  1973.0, -1198.0,        17.0}
        };
        for(new t=0; t < sizeof water_areas; t++)
        if(GetVehicleDistanceFromPoint(vehicleid,water_areas[t][1],water_areas[t][2],water_areas[t][3]) <= water_areas[t][0]) return 1;
    return 0;
}
Ejemplo;
pawn Код:
if(IsVehicleInWater(vehicleid))
{
    SendClientMessageToAll(-1, "Vehicle is in water.");
}
PD: Con respecto a lo de Ygzeb, a pesar de que estй mal ese mйtodo, їno serнa mбs fбcil usar GetVehiclePos?
Reply
#7

Quote:
Originally Posted by Glimma
Посмотреть сообщение
Parece que lo estбn re descansando (al menos eso parece, estб pidiendo algo que detecte cuando un vehнculo estб en el agua y le pasan funciones que detectan animaciуn de nado y esas cosas para el jugador.

Probб con esto (******й y lo encontrй de una en la secciуn en inglйs, buscar no cuesta nada eh...):

pawn Код:
stock IsVehicleInWater(vehicleid)
{
        new Float:water_areas[][] =
        {
                {25.0,  2313.0, -1417.0,        23.0},
                {15.0,  1280.0, -773.0,         1082.0},
                {15.0,  1279.0, -804.0,         86.0},
                {20.0,  1094.0, -674.0,         111.0},
                {26.0,  194.0,  -1232.0,        76.0},
                {25.0,  2583.0, 2385.0,         15.0},
                {25.0,  225.0,  -1187.0,        73.0},
                {50.0,  1973.0, -1198.0,        17.0}
        };
        for(new t=0; t < sizeof water_areas; t++)
        if(GetVehicleDistanceFromPoint(vehicleid,water_areas[t][1],water_areas[t][2],water_areas[t][3]) <= water_areas[t][0]) return 1;
    return 0;
}
Ejemplo;
pawn Код:
if(IsVehicleInWater(vehicleid))
{
    SendClientMessageToAll(-1, "Vehicle is in water.");
}
PD: Con respecto a lo de Ygzeb, a pesar de que estй mal ese mйtodo, їno serнa mбs fбcil usar GetVehiclePos?
Sн, serнa lo mбs adecuado pero eso depende del scripter, lo que yo coloco es un modelo (Solo un modelo) para que lo entienda de la forma mбs simple posible y en base a eso saque sus propias conclusiones y pueda realizar su propio cуdigo; mi objetivo es que el usuario pueda aprender a realizar el cуdigo por йl mismo. Sin embargo, admito que para un scripter con mбs conocimiento lo ideal serнa hacer lo que usted sugiere; aъn asн, lo ideal no siempre es lo mбs simple y fбcil de entender.

їPor quй estarнa mal el mйtodo? Me gustarнa aprender un poco mбs ya que sй de otras formas de detectar esto pero me pareciу la forma mбs simple y fбcil de entender Creo que este ejemplo servirнa para realizar muchas funciones ъtiles basбndose en el nivel del mar del servidor
Reply
#8

Quote:
Originally Posted by Ygzeb
Посмотреть сообщение
Sн, serнa lo mбs adecuado pero eso depende del scripter, lo que yo coloco es un modelo para que lo entienda de la forma mбs simple posible y en base a eso saque sus propias conclusiones y pueda realizar su propio cуdigo. Sin embargo, admito que para un scripter con mбs conocimiento lo ideal serнa hacer lo que usted sugiere; aъn asн, lo ideal no siempre es lo mбs simple y fбcil de entender.

їPor quй estarнa mal el mйtodo? Me gustarнa aprender un poco mбs ya que sй de otras formas de detectar esto pero me pareciу la forma mбs simple y fбcil de entender Creo que este ejemplo servirнa para realizar muchas funciones ъtiles basбndose en el nivel del mar del servidor
Igual no estб mal, perdуn si sonу muy ofensivo lo mнo, pero estб bien que cada uno aporte su grano de arena, siempre y cuando lo haga con el fin de ayudar y/o a su vez aprender.

Digo que estб mal el planteo, porque, si querйs hacer algo bбsico, yo usarнa directamente la funciуn GetVehiclePos en lugar de GetPlayerPos + GetPlayerState, al usar una funciуn menos, en este caso, serнa algo mбs bбsico y ademбs, mбs eficiente.
Reply
#9

Para nada, no sonу mal; mбs que nada me dio curiosidad saber el motivo de por que estaba mal ya que mi objetivo es ayudar a los usuarios a aprender y tambiйn aprender mientras lo hago. Siempre estoy agradecido de tener la oportunidad de aprender algo nuevo sobre este lenguaje de programaciуn y corregir mis errores. Nunca se sabe lo suficiente

Sin rencores; no hay ningъn problema

Creo que ya se desviу un poco el tema por lo que evitarй responder mбs a no ser que sea para aportar al tema

* Es correcto, estб mal el planteo y serнa mбs simple usar GetVehiclePos; editarй el comentario y aсadirй esa versiуn, sin embargo dejarй el ejemplo anterior ya que el nivel del mar puede servir para una infinidad de cosas
Reply
#10

La mejor manera que yo harнa:

pawn Код:
static bool:VehicleInWater_@[MAX_VEHICLES];

#define IsVehicleInWater(%1) VehicleInWater_@[%1]


public OnVehicleDeath(vehicleid, killerid)
{
    new Float:Pos[3];
    GetVehiclePos(vehicleid, Pos[0], Pos[1], Pos[2]);
    MapAndreas_FindZ_For2DCoord(Pos[0], Pos[1], Pos[2]);

    if(!floatcmp(Pos[2], 0.00000)) IsVehicleInWater(vehicleid) = true; // No comentar nada acerca de este cуdigo, funcionarб.
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    if(IsVehicleInWater(vehicleid)) IsVehicleInWater(vehicleid) = false;
    return 1;
}

Necesitarбs MapAndreas.


AVISO: Si un vehнculo muere en la posiciуn Z 0.00000, lo tomarб como que estб en el agua, aunque creo que es muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy muy poco probable.


EDIT: No te diste cuenta que entre esos 'muy' habнa un 'mury'.


EDIT: No, no lo habнa.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)