Sistema de Freno й Mano. -
Fagrinht - 11.04.2017
Buenas, he modificado un sistema de freno para que funcione al usar el comando y cargar vehнculo, pero ahora no funciona para nada, se supone que al poner /freno el vehнculo tiene que quedar inmуvil ante movimiento de un usuario, alguien se echa un vistazo por el sistema a ver si encuentra una falla?
PD; el cуdigo sale desorganizado, mбs no es asн, es cosa del foro.
Код:
new Float:VehFrenoPOS[MAX_VEHICLES][4];
new Float:VehComprobar[MAX_VEHICLES][4];
enum DataCar
{
cFreno
};
new CarInfo[MAX_VEHICLES][DataCar];
public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat)
{
new Auto = GetVehicleFromId(vehicleid);
if(CarInfo[CarInfo[Auto][cId]][cFreno] == 1)
{
GetVehiclePos(playerid, VehComprobar[CarInfo[Auto][cId]][0], VehComprobar[CarInfo[Auto][cId]][1], VehComprobar[CarInfo[Auto][cId]][2]);
GetVehicleZAngle(playerid, VehComprobar[playerid][3]);
if(VehComprobar[CarInfo[Auto][cId]][0] == VehFrenoPOS[vehicleid][0] || VehComprobar[CarInfo[Auto][cId]][1] == VehFrenoPOS[CarInfo[Auto][cId]][1] || VehComprobar[CarInfo[Auto][cId]][2] == VehFrenoPOS[CarInfo[Auto][cId]][2]|| VehComprobar[CarInfo[Auto][cId]][3] == VehFrenoPOS[CarInfo[Auto][cId]][3]) return 1;
SetVehiclePos(CarInfo[Auto][cId], VehFrenoPOS[CarInfo[Auto][cId]][0], VehFrenoPOS[CarInfo[Auto][cId]][1], VehFrenoPOS[CarInfo[Auto][cId]][2]);
SetVehicleZAngle(CarInfo[Auto][cId], VehComprobar[playerid][3]);
}
return 1;
}
>>>>>>> EN EL CARGADO; CarInfo[car][cFreno] = cache_get_field_content_int(car, "Freno");
if(CarInfo[car][cFreno] == 1)
{
VehFrenoPOS[car][0] = CarInfo[car][cLocationx];
VehFrenoPOS[car][1] = CarInfo[car][cLocationy];
VehFrenoPOS[car][2] = CarInfo[car][cLocationz];
VehFrenoPOS[car][3] = CarInfo[car][cAngle];
SetVehicleVelocity(car, 0, 0, 0);
}
//
COMMAND:freno(playerid)
{
static string[70];
if (IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
new Auto = GetPlayerVehicle(playerid);
if (!PlayerHaveKeys(playerid, Auto) && !IsACop(playerid)) return SendInfoMessage(playerid, 0, "No tienes las llaves del vehнculo para usar este comando.");
if (CarInfo[Auto][cFreno] == 0)
{
CarInfo[Auto][cFreno] = 1;
GetVehiclePos(Auto, VehFrenoPOS[Auto][0], VehFrenoPOS[Auto][1], VehFrenoPOS[Auto][2]);
GetVehicleZAngle(Auto, VehFrenoPOS[Auto][3]);
SetVehicleVelocity(Auto, 0, 0, 0);
format(string, sizeof(string), "* %s activa el freno del mano del vehнculo.", pName(playerid));
}
else
{
CarInfo[Auto][cFreno] = 0;
format(string, sizeof(string), "* %s desactiva el freno del mano del vehнculo.", pName(playerid));
}
ProxDetector(10.0, playerid, string, COL_MORADO, COL_MORADO, COL_MORADO, COL_MORADO, COL_MORADO);
SaveCar(Auto);
}
else SendInfoMessage(playerid, 0, "Necesitas estar en un vehнculo y ser el conductor para usar este comando.");
return 1;
}
//
stock GetVehicleFromId(id)
{
for(new c = 0; c < TotalVeh; c++)
{
if(id == CarInfo[c][cId]) return c;
}
return -1;
}
stock GetPlayerVehicle(playerid)
{
new car = GetPlayerVehicleID(playerid);
if (car == 0) return -1;
for (new i = 0; i < TotalVeh; i++)
if (car == CarInfo[i][cId])
return i;
return -1;
}
Respuesta: Sistema de Freno й Mano. -
Parka - 12.04.2017
ehmmmm, normalmente, deberнas hacerlo constante, que se frene Constantemente, asн no lo usarнan, tipo en OnPlayerUpdate o un timer.
"* %s activa el freno del mano del vehнculo."
Respuesta: Sistema de Freno й Mano. -
Fagrinht - 12.04.2017
Ya lo he hecho haciйndolo diferente y gracias por hacerme notar el error Parka, tanto de cуdigo como ortogrбfico.
Re: Sistema de Freno й Mano. -
RIDE2DAY - 12.04.2017
No he revisado todo el cуdigo, solo quiero comentar una incongruencia. Ten en cuenta que al utilizar GetVehiclePos en OnUnoccupiedVehicleUpdate se obtendrбn las coordenadas previas a la actualizaciуn, es decir:
PHP код:
/* Si tu tienes almacenado en unas variables datos del tipo: */
posX[vehicleid] = 1.0;
posY[vehicleid] = 2.0;
posZ[vehicleid] = 3.0;
/* Suponiendo que alguien choca contra dicho vehнculo,
GetVehiclePos devuelve los valores iniciales en OnUnoccupiedVehicleUpdate, veamos: */
new Float:veh_pos[3];
GetVehiclePos(vehicleid, veh_pos[0], veh_pos[1], veh_pos[2]);
/* Entonces: */
veh_pos[0] = posX[vehicleid] = 1.0;
/* ... */
Para evitar este fenуmeno lo correcto serнa comparar los datos de los parбmetros correspondientes a la funciуn
OnUnoccupiedVehicleUpdate, actualizada en la 0.3z.
Respuesta: Sistema de Freno й Mano. -
Fagrinht - 12.04.2017
Gracias a ambos por esa data, nunca habнa usado dicho Call, asн ha quedado,
Код:
public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat, Float:new_x, Float:new_y, Float:new_z, Float:vel_x, Float:vel_y, Float:vel_z)
{
new Auto = GetVehicleFromId(vehicleid);
if(FrenoDeMano[vehicleid] == 1)
{
//GetVehiclePos(playerid, VehComprobar[vehicleid][0], VehComprobar[vehicleid][1], VehComprobar[vehicleid][2]);
GetVehicleZAngle(playerid, VehComprobar[playerid][3]);
if(new_x == VehFrenoPOS[vehicleid][0] || new_y == VehFrenoPOS[vehicleid][1] || new_z == VehFrenoPOS[vehicleid][2]|| VehComprobar[vehicleid][3] == VehFrenoPOS[vehicleid][3]) return 1;
SetVehiclePos(vehicleid, VehFrenoPOS[vehicleid][0], VehFrenoPOS[vehicleid][1], VehFrenoPOS[vehicleid][2]);
SetVehicleZAngle(vehicleid, VehComprobar[playerid][3]);
}
return 1;
}
El Call no detecta el Angle, por ende lo dejй asн.
Respuesta: Sistema de Freno й Mano. -
adri1 - 12.04.2017
Creo que retornando 0 en la callback hace que no se mueva el vehнculo.
Respuesta: Sistema de Freno й Mano. -
OTACON - 12.04.2017