/*
Scriptinformation:
@ Author(s): <NicoAiko>
@ Version: <0.1>
@ Type: <Include>
@ Language(s): <German>
*/
#include <a_samp>
#include <Farben>
#define function:%0(%1) \
forward %0(%1); \
public %0(%1)
#define MAX_MODELID 211
/*
native n_VehicleInit(Hoch,Runter);
native n_OnVehicleSpawn(vehicleid);
native n_OnPlayerStateChange(playerid,newstate,oldstate);
native n_OnPlayerKeyStateChange(playerid,newkeys,oldkeys);
native SetVehicleModelMaxGangSpeed(modelid,BackGang,Gang1,Gang2=-1,Gang3=-1,Gang4=-1,Gang5=-1,Gang6=-1);
native GetVehicleModelMaxSpeed(vehicleid,&BackGang,&Gang1,&Gang2,&Gang3,&Gang4,&Gang5,&Gang6);
native GetVehicleModelMaxGangSpeed(vehicleid);
native GetVehicleATMGang(vehicleid);
*/
new n_Gang[MAX_VEHICLES] = -1;
new n_Max_Speed_Gang_Timer[MAX_VEHICLES];
new n_Max_Gang_Speed[MAX_MODELID][7]; // [0] = Rückwärts [1] - [6] = 1 - 6
new n_GangRunterKey;
new n_GangHochKey;
function:n_VehicleInit(Hoch,Runter)
{
print(" - Gangschaltungs-System -\n");
print(" - made by NicoAiko -\n");
print(" - (c) ~~ NicoAiko ~~ -\n");
print(" - - 2012 - -");
for(new i = 0; i < MAX_MODELID; i++)
{
n_Max_Gang_Speed[i][0] = 0;
n_Max_Gang_Speed[i][1] = 0;
n_Max_Gang_Speed[i][2] = 0;
n_Max_Gang_Speed[i][3] = 0;
n_Max_Gang_Speed[i][4] = 0;
n_Max_Gang_Speed[i][5] = 0;
n_Max_Gang_Speed[i][6] = 0;
}
for(new i = 0; i < MAX_VEHICLES; i++)
{
n_Gang[i] = -1;
}
n_GangHochKey = Hoch;
n_GangRunterKey = Runter;
return 1;
}
function:n_OnVehicleSpawn(vehicleid)
{
n_Gang[vehicleid] = -1;
return 1;
}
function:n_OnPlayerStateChange(playerid,newstate,oldstate)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(newstate == PLAYER_STATE_DRIVER)
{
n_Max_Speed_Gang_Timer[vehicleid] = SetTimerEx("UpdateVehicleState",500,1,"i",vehicleid);
}
if(oldstate == PLAYER_STATE_DRIVER)
{
KillTimer(n_Max_Speed_Gang_Timer[vehicleid]);
}
return 1;
}
function:UpdateVehicleState(vehicleid)
{
new modelid = GetVehicleModel(vehicleid);
new engine,rest[6];
GetVehicleParamsEx(vehicleid,engine,rest[0],rest[1],rest[2],rest[3],rest[4],rest[5]);
if(engine && n_Gang[vehicleid] == -1)
{ n_Gang[vehicleid] = 1; }
if(!engine && n_Gang[vehicleid] > -1)
{ n_Gang[vehicleid] = -1; }
if(GetVehicleModelMaxGangSpeed(vehicleid))
{
if(GetVehicleATMGang(vehicleid) < 3)
{
new Float:x[2],Float:y[2];
n_GetXYFrontTheVehicle(vehicleid,x[0],y[0],10);
n_GetXYBehindTheVehicle(vehicleid,x[1],y[1],10);
SetTimerEx("BackOrFrontVehicle",500,0,"dffff",vehicleid,x[0],y[0],x[1],y[1]);
}
if(n_GetSpeed(vehicleid) >= GetVehicleModelMaxGangSpeed(vehicleid))
{
n_SetSpeed(vehicleid,GetVehicleModelMaxGangSpeed(vehicleid));
}
if(n_GetSpeed(vehicleid) < n_Max_Gang_Speed[modelid-400][GetVehicleATMGang(vehicleid)-1] && GetVehicleATMGang(vehicleid) > 1)
{ SetVehicleGangDown(vehicleid); }
}
return 1;
}
function:BackOrFrontVehicle(vehicleid,Float:nx0,Float:ny0,Float:nx1,Float:ny1)
{
new Float:x,Float:y,Float:z;
GetVehiclePos(vehicleid,x,y,z);
if(GetVehicleDistanceFromPoint(vehicleid,nx0,ny0,z) > GetVehicleDistanceFromPoint(vehicleid,nx1,ny1,z) && n_Gang[vehicleid] > 0)
{ n_Gang[vehicleid] = 0; return 1; }
else if(GetVehicleDistanceFromPoint(vehicleid,nx0,ny0,z) < GetVehicleDistanceFromPoint(vehicleid,nx1,ny1,z) && n_Gang[vehicleid] == 0)
{ n_Gang[vehicleid] = 1; return 1; }
return 1;
}
function:n_OnPlayerKeyStateChange(playerid,newkeys,oldkeys)
{
if(newkeys & n_GangHochKey)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
new vehicleid = GetPlayerVehicleID(playerid);
if(!IsVehicleAbleToGangHoch(vehicleid)) return 1; // Fragt ab, ob das Fahrzeug in der Lage ist mit der derzeitigen Geschwindigkeit (siehe die Funktion) hochzuschalten
SetVehicleGangUp(vehicleid);
return 1;
}
if(newkeys & n_GangRunterKey)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return 1;
new vehicleid = GetPlayerVehicleID(playerid);
if(!IsVehicleAbleToGangRunter(vehicleid)) return 1;
SetVehicleGangDown(vehicleid);
return 1;
}
return 1;
}
function:IsVehicleAbleToGangHoch(vehicleid)
{
new modelid = GetVehicleModel(vehicleid);
new gang = GetVehicleATMGang(vehicleid);
if(gang == 6) return 0;
switch(gang)
{
case 0: return 1;
case 1..3:
{
if(n_GetSpeed(vehicleid) < (n_Max_Gang_Speed[modelid-400][gang+1]/3)*2) return 0;
else return 1;
}
case 4,5:
{
if(n_GetSpeed(vehicleid) < floatround((n_Max_Gang_Speed[modelid-400][gang+1]/5)*2.5)) return 0;
else return 1;
}
default: return 0;
}
return 1;
}
function:IsVehicleAbleToGangRunter(vehicleid)
{
new modelid = GetVehicleModel(vehicleid);
new gang = GetVehicleATMGang(vehicleid);
if(gang == 1) return 0;
switch(gang)
{
case 0: return 0;
case 2,3:
{
if(n_GetSpeed(vehicleid) > (n_Max_Gang_Speed[modelid-400][gang-1]/3)*2) return 1;
else return 0;
}
case 4..6:
{
if(n_GetSpeed(vehicleid) > floatround((n_Max_Gang_Speed[modelid-400][gang-1]/5)*2.5)) return 1;
else return 0;
}
default: return 0;
}
return 1;
}
SetVehicleGangDown(vehicleid)
return n_Gang[vehicleid]--;
SetVehicleGangUp(vehicleid)
return n_Gang[vehicleid]++;
stock SetVehicleModelMaxGangSpeed(modelid,BackGang,Gang1,Gang2=-1,Gang3=-1,Gang4=-1,Gang5=-1,Gang6=-1) // MUST STAY stock!!
{
if(modelid < 400 || modelid > 611) { printf("Fehler! Die angegebene ModelID ist unter 400 oder über 611! Angegeben: %d",modelid); return 0; }
if(Gang1 <= 10) { printf("Error! Gang 1 darf NICHT kleiner als 10 km/h sein!!!"); return 0; }
if(BackGang <= 10) { printf("Error! Rückwärtsgang darf NICHT kleiner als 10 km/h sein!!!"); return 0; }
n_Max_Gang_Speed[modelid-400][0] = BackGang;
n_Max_Gang_Speed[modelid-400][1] = Gang1;
if(Gang2 <= -1)
{
n_Max_Gang_Speed[modelid-400][2] = -1;
n_Max_Gang_Speed[modelid-400][3] = -1;
n_Max_Gang_Speed[modelid-400][4] = -1;
n_Max_Gang_Speed[modelid-400][5] = -1;
n_Max_Gang_Speed[modelid-400][6] = -1;
return 1;
}
else n_Max_Gang_Speed[modelid-400][2] = Gang2;
if(Gang3 <= -1)
{
n_Max_Gang_Speed[modelid-400][3] = -1;
n_Max_Gang_Speed[modelid-400][4] = -1;
n_Max_Gang_Speed[modelid-400][5] = -1;
n_Max_Gang_Speed[modelid-400][6] = -1;
return 1;
}
else n_Max_Gang_Speed[modelid-400][3] = Gang3;
if(Gang4 <= -1)
{
n_Max_Gang_Speed[modelid-400][4] = -1;
n_Max_Gang_Speed[modelid-400][5] = -1;
n_Max_Gang_Speed[modelid-400][6] = -1;
return 1;
}
else n_Max_Gang_Speed[modelid-400][4] = Gang4;
if(Gang5 <= -1)
{
n_Max_Gang_Speed[modelid-400][5] = -1;
n_Max_Gang_Speed[modelid-400][6] = -1;
return 1;
}
else n_Max_Gang_Speed[modelid-400][5] = Gang5;
if(Gang6 <= -1) n_Max_Gang_Speed[modelid-400][6] = -1;
else n_Max_Gang_Speed[modelid-400][6] = Gang6;
return 1;
}
function:n_GetXYBehindTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance)
{
new Float:a;
GetVehiclePos(vehicleid,x,y,a);
GetVehicleZAngle(vehicleid,a);
x -= (distance * floatsin(-a,degrees));
y -= (distance * floatcos(-a,degrees));
return 1;
}
function:n_GetXYFrontTheVehicle(vehicleid, &Float:x, &Float:y, Float:distance)
{
new Float:a;
GetVehiclePos(vehicleid,x,y,a);
GetVehicleZAngle(vehicleid,a);
x += (distance * floatsin(-a,degrees));
y += (distance * floatcos(-a,degrees));
return 1;
}
function:Float:GetDistanceBetweenPoints(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2) {
return floatsqroot(floatpower(x1 - x2, 2) + floatpower(y1 - y2, 2) + floatpower(z1 - z2, 2)); }
function:GetVehicleModelMaxSpeed(vehicleid,&BackGang,&Gang1,&Gang2,&Gang3,&Gang4,&Gang5,&Gang6)
{
new modelid = GetVehicleModel(vehicleid);
if(n_Max_Gang_Speed[modelid-400][0] <= 0) // Gang 1 (Hier fragt er ab, ob es verändert wurde)
/* Wenn die maximale Geschwindigkeit nicht verändert wurde bzw. nicht angegeben wurde, dann ist sie 0!
Hat ein Fahrzeug z.B. 4 Gänge sind 4 davon über -1! Gang 5 & 6 wären dann -1! */
{
BackGang = 0,
Gang1 = 0,
Gang2 = 0,
Gang3 = 0,
Gang4 = 0,
Gang5 = 0,
Gang6 = 0;
return 1;
}
BackGang = n_Max_Gang_Speed[modelid-400][0];
Gang1 = n_Max_Gang_Speed[modelid-400][1];
Gang2 = n_Max_Gang_Speed[modelid-400][2];
Gang3 = n_Max_Gang_Speed[modelid-400][3];
Gang4 = n_Max_Gang_Speed[modelid-400][4];
Gang5 = n_Max_Gang_Speed[modelid-400][5];
Gang6 = n_Max_Gang_Speed[modelid-400][6];
return 1;
}
function:GetVehicleModelMaxGangSpeed(vehicleid)
{
new n_MaxGangSpeed[7],n_ATMGang,modelid;
modelid = GetVehicleModel(vehicleid);
GetVehicleModelMaxSpeed(vehicleid,n_MaxGangSpeed[0],n_MaxGangSpeed[1],n_MaxGangSpeed[2],n_MaxGangSpeed[3],n_MaxGangSpeed[4],n_MaxGangSpeed[5],n_MaxGangSpeed[6]);
n_ATMGang = GetVehicleATMGang(vehicleid);
return n_Max_Gang_Speed[modelid-400][n_ATMGang];
}
function:GetVehicleATMGang(vehicleid)
{
return n_Gang[vehicleid];
}
function:n_GetSpeed(vehicleid)
{
new Float:x,Float:y,Float:z;
new Float:speed;
GetVehicleVelocity(vehicleid,x,y,z);
speed = floatsqroot(x*x+y*y+z*z) * 200;
new realspeed = floatround(speed);
return realspeed;
}
function:n_SetSpeed(vehicleid,Float:speed)
{
new Float:x[2],Float:y[2],Float:z[2],Float:angle;
GetVehicleVelocity(vehicleid,x[0],y[0],z[0]);
GetVehiclePos(vehicleid,x[1],y[1],z[1]);
GetVehicleZAngle(vehicleid,angle);
angle = 360 - angle;
x[0] = (floatsin(angle,degrees) * (speed/200) + floatcos(angle, degrees) * 0 + x[1]) - x[1];
y[0] = (floatcos(angle,degrees) * (speed/200) + floatsin(angle, degrees) * 0 + y[1]) - y[1];
SetVehicleVelocity(vehicleid,x[0],y[0],z[0]);
return 1;
}