[Aporte] GetMTS y GetKMS de vehiculos.(Sencillo)

Aprende lo que no sabes de este lenguaje y encuentra herramientas y códigos útiles.

Moderador: Ayudantes

Reglas del Foro
  • Si tu código es corto, no crees un tema nuevo para liberarlo, publica un mensaje en el tema [Funciones] ¡Publica tu código aquí!.
  • Si creas una guía, debes explicar el código claramente. Evita poner la explicación en forma de comentarios dentro del mismo y no olvides utilizar el BBCode correspondiente: [Pawn]Código aquí[/Pawn].
  • No postear códigos sin probar. Publicar códigos con errores (que impidan compilar el script para el cual está destinado) en este apartado es motivo de sanción.
  • Si tu código necesita plugins, includes u otros códigos adicionales para funcionar, debes mencionarlo en el mensaje.
  • Si has utilizado códigos de otros autores, recuerda colocar los créditos correspondientes. (El plagio es motivo de sanción).
  • Si tu aporte es para un GameMode en específico, debes publicar el tema en el apartado "Guías y Aportes para GameModes específicos".
Responder
Avatar de Usuario
MattHudson
Moderador Global
Moderador Global
Mensajes: 1666
Registrado: 31 Oct 2015 18:16
Ubicación: Argentina, Buenos Aires, San Miguel.
Contactar:
Reputación: 89

29 Abr 2017 21:48

Como dice el titulo, con esto guardaremos en una variable(KMS_Metros) los metros recorridos por cada vehículo, podremos "convertirlo" a Kilómetros con un simple macro llamado GetKMS, obtenerlo con GetMTS, reiniciarlo con ResetKMS, y modificarlo a su gusto(en este caso, usaremos OnPlayerStateChange y OnPlayerExitVehicle, pero también se puede hacer con comandos de encender/apagar vehículos, o con un loop que valla auto por auto este ocupado o no(ejemplo:si esta siendo remolcado)).

En resumen, lo que hacemos con esto es sacar diferencias de distancias entre punto y punto con GetVehicleDistanceFromPoint entre el vehículo y el punto que guardamos previamente de la posición del mismo. Si la distancia es menor a 100 no se guardara(con esto medimos los metros).

Código:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

// Obviamente, utilizaremos el todopoderoso include:
#include	<a_samp>
//Defines de funciones:
#define	  	GetMTS(%0)		 [email protected]_R[%0] //Con esto obtenemos los metros exactos.
#define		GetKMS(%0)		(KMS_Metros[%0] * 0.001)//Con esto obtenemos los kilómetros(convirtiendo los metros a kilómetros)
#define		ResetKMS(%0)	 KMS_Metros[%0] = 0;//Con esto reiniciamos los metros recorridos.
//Variables usadas:
new KMS_Metros[MAX_VEHICLES] = 0,/*Contamos la cantidad de metros*/
	Float:KMS_VPos[3],/*Array que guarda la posición del vehículo cada X tiempo*/
	KMS_Timer[MAX_PLAYERS];/*Timer con el que modificamos los correspondientes valores*/
//Funciones:
//En la función OnPlayerDisconnect(llamada cuando el jugador se desconecta)
KillTimer(KMS_Timer[playerid]);//Detenemos el timer.

//En la función OnPlayerExitVehicle(llamada cuando el jugador sale de un vehículo)
	KillTimer(KMS_Timer[playerid]);//Detenemos el timer.
	
//En la función OnPlayerStateChange(llamada cuando el jugador cambia su estado(oldstate a newstate)). No use OnPlayerEnterVehicle por cuestiones de errores falsos que suelen ocurrir con otras funciones.
if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)//Verificamos que su estado viejo(oldstate) sea a pie, y que el nuevo(newstate) sea como conductor del vehiculo.
{
 	GetVehiclePos(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2]);//Obtenemos la posición del vehiculo y la guardamos en el array creado anteriormente.
	KMS_Timer[playerid] = SetTimerEx("KMS_FuncionTimer", 1000, true, "i", playerid);//Iniciamos el timer que modificara los metros recorridos(KMs)
}
else if(oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_STATE_ONFOOT) KillTimer(KMS_Timer[playerid]);//Si no se cumplio el primer condicional, si el jugador estaba como conductor, y ahora esta a pie, detenemos el timer(seria como algo que actúe si OnPlayerExitVehicle no se ejecuta)

//Fuera de cualquier otro código:
forward KMS_FuncionTimer(playerid); public KMS_FuncionTimer(playerid)//Le damos el que hacer a la función del timer.
{
	if(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2]) <= 100)//Revisamos que la distancia entre la posición del coche antes y después de cada momento en el que se acciona la función sea mayor a 100.
	{
	    KMS_Metros[GetPlayerVehicleID(playerid)] += floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2])); //Le damos el valor de los metros al vehículo convirtiendo el numero real(float) a numero entero.
    }
    GetVehiclePos(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2]);
}

//Stocks:
//Una función que usaremos para evitar errores en la distancia recorrida.
stock KMS_SetVehiclePos(vehicleid, float:X, float:Y, float:Z)
{
	SetVehiclePos(vehicleid, X, Y, Z);
	[email protected]_P[0] = X, [email protected]_P[1] = Y, [email protected]_P[2] = Z;
}
  Cantidad de llaves: Abiertas(4)-Cerradas(4) | Lineas Totales: 42
Se puede usar como include si le hacemos los correspondientes hooks a OnPlayerStateChange, OnPlayerDisconnect y OnPlayerExitVehicle.



Créditos:
-Idea: Yo, se me ocurrió cuando recordaba mis tiempos en GTA:V Online, y recordé el centro de estadísticas del jugador en la linea que decía "distancia recorrida a pie", y dije; "¿Porque no hacerlo en Pawn para el kilómetraje de cada vehículo?", y aquí esta. Primero considere hacerlo en un include, pero como a algunos le resultara tedioso usarlo así, preferí hacerlo de esta forma.
-Código: Yo.
-Stock para prevenir errores: Código:Yo, idea: Un compañero de la secundaria que programa el inspeccionar de Google Chrome.

Errores:
-Supongo que ninguno.

¿Sugerencias?:
-Publicala como comentario.


EDIT:
-Correji un error en un callback.
Avatar de Usuario
BlackPro
Aprendiz
Aprendiz
Mensajes: 217
Registrado: 12 Abr 2015 09:31
Ubicación: Mapper y Scripter
Reputación: 0

30 Abr 2017 01:29

MattHudson escribió:
29 Abr 2017 21:48
Como dice el titulo, con esto guardaremos en una variable(KMS_Metros) los metros recorridos por cada vehículo, podremos "convertirlo" a Kilómetros con un simple macro llamado GetKMS, obtenerlo con GetMTS, reiniciarlo con ResetKMS, y modificarlo a su gusto(en este caso, usaremos OnPlayerStateChange y OnPlayerExitVehicle, pero también se puede hacer con comandos de encender/apagar vehículos, o con un loop que valla auto por auto este ocupado o no(ejemplo:si esta siendo remolcado)).

En resumen, lo que hacemos con esto es sacar diferencias de distancias entre punto y punto con GetVehicleDistanceFromPoint entre el vehículo y el punto que guardamos previamente de la posición del mismo. Si la distancia es menor a 100 no se guardara(con esto medimos los metros).

Código:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

// Obviamente, utilizaremos el todopoderoso include:
#include	<a_samp>
//Defines de funciones:
#define	  	GetMTS(%0)		 [email protected]_R[%0] //Con esto obtenemos los metros exactos.
#define		GetKMS(%0)		(KMS_Metros[%0] * 0.001)//Con esto obtenemos los kilómetros(convirtiendo los metros a kilómetros)
#define		ResetKMS(%0)	 KMS_Metros[%0] = 0;//Con esto reiniciamos los metros recorridos.
//Variables usadas:
new KMS_Metros[MAX_VEHICLES] = 0,/*Contamos la cantidad de metros*/
	Float:KMS_VPos[3],/*Array que guarda la posición del vehículo cada X tiempo*/
	KMS_Timer[MAX_PLAYERS];/*Timer con el que modificamos los correspondientes valores*/
//Funciones:
//En la función OnPlayerDisconnect(llamada cuando el jugador se desconecta)
KillTimer(KMS_Timer[playerid]);//Detenemos el timer.

//En la función OnPlayerExitVehicle(llamada cuando el jugador sale de un vehículo)
	KillTimer(KMS_Timer[playerid]);//Detenemos el timer.
	
//En la función OnPlayerStateChange(llamada cuando el jugador cambia su estado(oldstate a newstate)). No use OnPlayerEnterVehicle por cuestiones de errores falsos que suelen ocurrir con otras funciones.
if(oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)//Verificamos que su estado viejo(oldstate) sea a pie, y que el nuevo(newstate) sea como conductor del vehiculo.
{
 	GetVehiclePos(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2]);//Obtenemos la posición del vehiculo y la guardamos en el array creado anteriormente.
	KMS_Timer[playerid] = SetTimerEx("KMS_FuncionTimer", 1000, true, "i", playerid);//Iniciamos el timer que modificara los metros recorridos(KMs)
}
else if(oldstate == PLAYER_STATE_DRIVER && newstate == PLAYER_STATE_ONFOOT) KillTimer(KMS_Timer[playerid]);//Si no se cumplio el primer condicional, si el jugador estaba como conductor, y ahora esta a pie, detenemos el timer(seria como algo que actúe si OnPlayerExitVehicle no se ejecuta)

//Fuera de cualquier otro código:
Funcion KMS_FuncionTimer(playerid)//Le damos el que hacer a la función del timer.
{
	if(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2]) <= 100)//Revisamos que la distancia entre la posición del coche antes y después de cada momento en el que se acciona la función sea mayor a 100.
	{
	    KMS_Metros[GetPlayerVehicleID(playerid)] += floatround(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2])); //Le damos el valor de los metros al vehículo convirtiendo el numero real(float) a numero entero.
    }
    GetVehiclePos(GetPlayerVehicleID(playerid), KMS_VPos[0], KMS_VPos[1], KMS_VPos[2]);
}

//Stocks:
//Una función que usaremos para evitar errores en la distancia recorrida.
stock KMS_SetVehiclePos(vehicleid, float:X, float:Y, float:Z)
{
	SetVehiclePos(vehicleid, X, Y, Z);
	[email protected]_P[0] = X, [email protected]_P[1] = Y, [email protected]_P[2] = Z;
}
  Cantidad de llaves: Abiertas(4)-Cerradas(4) | Lineas Totales: 42
Se puede usar como include si le hacemos los correspondientes hooks a OnPlayerStateChange, OnPlayerDisconnect y OnPlayerExitVehicle.



Créditos:
-Idea: Yo, se me ocurrió cuando recordaba mis tiempos en GTA:V Online, y recordé el centro de estadísticas del jugador en la linea que decía "distancia recorrida a pie", y dije; "¿Porque no hacerlo en Pawn para el kilómetraje de cada vehículo?", y aquí esta. Primero considere hacerlo en un include, pero como a algunos le resultara tedioso usarlo así, preferí hacerlo de esta forma.
-Código: Yo.
-Stock para prevenir errores: Código:Yo, idea: Un compañero de la secundaria que programa el inspeccionar de Google Chrome.

Errores:
-Supongo que ninguno.

¿Sugerencias?:
-Publicala como comentario.
Buen aporte!!!
60% Mapper
40% Scripter
7% Webmaster
walkingSleep
Aprendiz
Aprendiz
Mensajes: 5
Registrado: 07 Sep 2016 10:53
Reputación: 0

30 Abr 2017 03:43

Jajajaja, eres lo más fantasma que vi en mucho tiempo. "Un programador de la secundaria que programa el inspeccionar elemento de Google Chrome", te piensas que un niño de 16 años va a tener algo que ver en Google? JAJAJAJAJAJAAJAA, fantasma
Avatar de Usuario
MattHudson
Moderador Global
Moderador Global
Mensajes: 1666
Registrado: 31 Oct 2015 18:16
Ubicación: Argentina, Buenos Aires, San Miguel.
Contactar:
Reputación: 89

30 Abr 2017 09:45

walkingSleep escribió:
30 Abr 2017 03:43
Jajajaja, eres lo más fantasma que vi en mucho tiempo. "Un programador de la secundaria que programa el inspeccionar elemento de Google Chrome", te piensas que un niño de 16 años va a tener algo que ver en Google? JAJAJAJAJAJAAJAA, fantasma
Dejaste mas que claro que:
-No entendiste la ironía.
-No sabes lo que es el inspeccionar de Google Chrome:
[ Imagen Externa ]

De todas formas, gracias por el comentario, se agradece que me capturen los caza-fantasmas [ Imagen Externa ]
walkingSleep
Aprendiz
Aprendiz
Mensajes: 5
Registrado: 07 Sep 2016 10:53
Reputación: 0

30 Abr 2017 13:11

MattHudson escribió:
30 Abr 2017 09:45
walkingSleep escribió:
30 Abr 2017 03:43
Jajajaja, eres lo más fantasma que vi en mucho tiempo. "Un programador de la secundaria que programa el inspeccionar elemento de Google Chrome", te piensas que un niño de 16 años va a tener algo que ver en Google? JAJAJAJAJAJAAJAA, fantasma
Dejaste mas que claro que:
-No entendiste la ironía.
-No sabes lo que es el inspeccionar de Google Chrome:
[ Imagen Externa ]

De todas formas, gracias por el comentario, se agradece que me capturen los caza-fantasmas [ Imagen Externa ]
Evidentemente sé que es el inspeccionar el elemento, ahora dime, ¿qué ironía hay en lo que has escrito? Me da a mí que hay alguien que no sabe lo que es la ironía..
Avatar de Usuario
MattHudson
Moderador Global
Moderador Global
Mensajes: 1666
Registrado: 31 Oct 2015 18:16
Ubicación: Argentina, Buenos Aires, San Miguel.
Contactar:
Reputación: 89

12 Nov 2017 18:19

walkingSleep escribió:
30 Abr 2017 13:11
¿qué ironía hay en lo que has escrito? Me da a mí que hay alguien que no sabe lo que es la ironía..
[ Imagen Externa ]

Evita desviar el tema o podrás recibir una advertencia administrativa a tu cuenta.



Tip;
¿A quien le importa eso?, lo importante del post es el código, no que escribí en las ayudas.


Última reactivación por MattHudson en 12 Nov 2017 18:19
Responder