Drift::EnableDetection(playerid = -1);
Drift::EnableDamageCheck(playerid = -1);
Drift::DisableDetection(playerid = -1);
Drift::DisableDamageCheck(playerid = -1);
bool: Drift::IsDetectionEnabled(playerid = -1);
bool: Drift::IsDamageCheckEnabled(playerid = -1);
bool: Drift::IsPlayerDrifting(playerid);
Drift::SetMinAngle(Float: angle);
Drift::SetMinSpeed(Float: speed);
Drift::SetTimeoutTicks(ticks);
Float: Drift::GetMinAngle();
Float: Drift::GetMinSpeed();
Drift::GetTimeoutTicks();
forward OnPlayerDriftStart(playerid);
forward OnPlayerDriftUpdate(playerid, Float: drift_angle, Float: speed);
forward OnPlayerDriftEnd(playerid, reason, Float: distance, time);
sampctl package install ltkarim/drift-detection
lol why re-create the thread with the same include? Simply reposting to bump?
|
You deleted it lmao, you seriously gonna deny that?
What did you even update? I see no changes from the older thread that was about a year ago. |
public OnPlayerUpdate(playerid)
{
if(g_DriftFlags & DRIFT_CHECK_ENABLED && g_DriftPlayers[playerid][playerFlags] & DRIFT_CHECK_ENABLED)
{
if(GetTickCount() > g_DriftPlayers[playerid][lastTimestamp])
{
new vehicleID = GetPlayerVehicleID(playerid);
if(vehicleID && GetPlayerState(playerid) == PLAYER_STATE_DRIVER && IsModelACar(GetVehicleModel(vehicleID)))
{
new Float: vX, Float: vY, Float: vZ;
GetVehicleVelocity(vehicleID, vX, vY, vZ);
new Float: angle;
GetVehicleZAngle(vehicleID, angle);
new Float: speed;
speed = floatsqroot(vX*vX + vY*vY + vZ*vZ) * 180.0;
new Float: direction;
direction = atan2(vY, vX);
direction -= 90.0;
if(direction < 0) direction += 360.0;
new Float: driftAngle;
driftAngle = angle - floatabs(direction);
if(driftAngle > 270.0) driftAngle -= 270.0;
if(driftAngle < -270.0) driftAngle += 270.0;
driftAngle = floatabs(driftAngle);
switch(g_DriftPlayers[playerid][driftState])
{
case DRIFT_STATE_NONE:
{
if(MIN_DRIFT_ANGLE <= driftAngle <= MAX_DRIFT_ANGLE && speed >= MIN_DRIFT_SPEED)
{
g_DriftPlayers[playerid][driftState] = DRIFT_STATE_DRIFTING;
g_DriftPlayers[playerid][startTimestamp] = GetTickCount();
GetVehicleHealth(vehicleID, g_DriftPlayers[playerid][vHealth]);
GetPlayerPos(playerid, g_DriftPlayers[playerid][startPosX], g_DriftPlayers[playerid][startPosY], g_DriftPlayers[playerid][startPosZ]);
#if defined OnPlayerDriftStart
OnPlayerDriftStart(playerid);
#endif
}
}
case DRIFT_STATE_DRIFTING:
{
if(g_DriftFlags & DAMAGE_CHECK_ENABLED && g_DriftPlayers[playerid][playerFlags] & DAMAGE_CHECK_ENABLED)
{
new Float: vehicleHealth;
GetVehicleHealth(vehicleID, vehicleHealth);
if(vehicleHealth < g_DriftPlayers[playerid][vHealth])
{
GetPlayerPos(playerid, vX, vY, vZ);
g_DriftPlayers[playerid][driftState] = DRIFT_STATE_NONE;
g_DriftPlayers[playerid][timeoutTicks] = 0;
#if defined OnPlayerDriftEnd
new Float: distance;
distance = GetPlayerDistanceFromPoint(playerid, g_DriftPlayers[playerid][startPosX], g_DriftPlayers[playerid][startPosY], g_DriftPlayers[playerid][startPosZ]);
OnPlayerDriftEnd(playerid, DRIFT_END_REASON_DAMAGED, distance, GetTickCount() - g_DriftPlayers[playerid][startTimestamp]);
#endif
}
}
else if(MIN_DRIFT_ANGLE <= driftAngle <= MAX_DRIFT_ANGLE && speed >= MIN_DRIFT_SPEED)
{
g_DriftPlayers[playerid][timeoutTicks] = 0;
#if defined OnPlayerDriftUpdate
OnPlayerDriftUpdate(playerid, driftAngle, speed);
#endif
}
else
{
g_DriftPlayers[playerid][timeoutTicks]++;
if(g_DriftPlayers[playerid][timeoutTicks] >= DRIFT_TIMEOUT_INTERVAL)
{
GetPlayerPos(playerid, vX, vY, vZ);
g_DriftPlayers[playerid][driftState] = DRIFT_STATE_NONE;
g_DriftPlayers[playerid][timeoutTicks] = 0;
#if defined OnPlayerDriftEnd
new Float: distance;
distance = GetPlayerDistanceFromPoint(playerid, g_DriftPlayers[playerid][startPosX], g_DriftPlayers[playerid][startPosY], g_DriftPlayers[playerid][startPosZ]);
OnPlayerDriftEnd(playerid, DRIFT_END_REASON_TIMEOUT, distance, GetTickCount() - g_DriftPlayers[playerid][startTimestamp]);
#endif
}
}
}
}
}
g_DriftPlayers[playerid][lastTimestamp] = GetTickCount() + DRIFT_PROCESS_INTERVAL;
}
}
#if defined Drift_OnPlayerUpdate
return Drift_OnPlayerUpdate(playerid);
#else
return true;
#endif
}
public OnPlayerUpdate(playerid) {
if(GetTickCount() > P_DATA[playerid][T_TICK])
{
new vehicleid;
if( (vehicleid = GetPlayerVehicleID(playerid)) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER )
{
if(__IsModelACar(GetVehicleModel(vehicleid)))
{
new Float:x, Float:y, Float:z, Float:a, Float:d, Float:s, Float:drift_angle;
GetVehicleVelocity(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, a);
s = floatround(floatsqroot( x*x + y*y + z*z) * 180);
d = atan2(y, x);
d = floatsub(d, 90.0);
if(d < 0.0) d = floatadd(d, 360.0);
drift_angle = a - d;
if(drift_angle > 270.0) drift_angle -= 270.0;
if(drift_angle < -270.0) drift_angle += 270.0;
drift_angle = floatabs(drift_angle);
switch (P_DATA[playerid][P_DRIFTING])
{
case 0:
{
if(MIN_DRIFT_ANGLE <= drift_angle <= MAX_DRIFT_ANGLE && s >= MIN_DRIFT_SPEED && !__IsVehicleDrivingBackwards(x, y, a))
{
P_DATA[playerid][P_DRIFTING] = true;
P_DATA[playerid][D_STARTTICK] = GetTickCount();
GetVehicleHealth(vehicleid, P_DATA[playerid][V_HEALTH]);
GetPlayerPos(playerid, P_DATA[playerid][P_STARTX], P_DATA[playerid][P_STARTY], x);
CallLocalFunction("OnDriftStart", "i", playerid);
}
}
case 1:
{
new Float:vhealth, Float:_x, Float:_y, Float:_z;
GetVehicleHealth(vehicleid, vhealth);
GetPlayerPos(playerid, _x, _y, _z);
if(vhealth < P_DATA[playerid][V_HEALTH])
{
CallLocalFunction("OnDriftEnd", "iifi", playerid, DRIFT_END_REASON_CRASH, __GetPointDistanceToPoint(P_DATA[playerid][P_STARTX], P_DATA[playerid][P_STARTY], _x, _y), GetTickCount() - P_DATA[playerid][D_STARTTICK]);
P_DATA[playerid] = R_DATA;
}
else if(__IsVehicleDrivingBackwards(x, y, a) || s < MIN_DRIFT_SPEED)
{
CallLocalFunction("OnDriftEnd", "iifi", playerid, DRIFT_END_REASON_OTHER, __GetPointDistanceToPoint(P_DATA[playerid][P_STARTX], P_DATA[playerid][P_STARTY], _x, _y), GetTickCount() - P_DATA[playerid][D_STARTTICK]);
P_DATA[playerid] = R_DATA;
}
else if(MIN_DRIFT_ANGLE <= drift_angle <= MAX_DRIFT_ANGLE && s >= MIN_DRIFT_SPEED)
{
P_DATA[playerid][T_TIMEOUT] = 0;
CallLocalFunction("OnDriftUpdate", "iff", playerid, drift_angle, s);
}
else
{
P_DATA[playerid][T_TIMEOUT]++;
if(P_DATA[playerid][T_TIMEOUT] >= DRIFT_TIMEOUT_INTERVAL)
{
CallLocalFunction("OnDriftEnd", "iifi", playerid, DRIFT_END_REASON_TIMEOUT, __GetPointDistanceToPoint(P_DATA[playerid][P_STARTX], P_DATA[playerid][P_STARTY], _x, _y), GetTickCount() - P_DATA[playerid][D_STARTTICK]);
P_DATA[playerid] = R_DATA;
}
}
}
}
}
}
P_DATA[playerid][T_TICK] = GetTickCount() + PROCESS_INTERVAL;
}
#if defined D_OnPlayerUpdate
return D_OnPlayerUpdate(playerid);
#else
return true;
#endif
}
That's not how you go around releasing things, this is nothing different, it's literally the same include (drift based concept) you're supposed to update and notify not simply delete and recreate
|
It's not hooked right, you missed an 'e' on line 324
it's : OnPlayerStateChang when it's supposed to be OnPlayerStateChange |
public OnPlayerDriftStart(playerid)
{
SendClientMessageToAll(-1, "Started");
return 1;
}
public OnPlayerDriftUpdate(playerid, Float: drift_angle, Float: speed)
{
SendClientMessageToAll(-1, "Doing");
return 1;
}
public OnPlayerDriftEnd(playerid, reason, Float: distance, time)
{
SendClientMessageToAll(-1, "Ended");
return 1;
}
You're welcome, i also just tried using it, had 0 luck getting any response,
i used this: PHP код:
|
It won't work at all for me, i kept banging the car against walls it wouldn't end for damage reason, try it now, it only ends if someone shoots the car? shouldn't be whenever the car is damaged?
|
if(g_DriftFlags & DAMAGE_CHECK_ENABLED && g_DriftPlayers[playerid][playerFlags] & DAMAGE_CHECK_ENABLED)
{
new Float: vehicleHealth;
GetVehicleHealth(vehicleID, vehicleHealth);
if(vehicleHealth < g_DriftPlayers[playerid][vHealth])
{
GetPlayerPos(playerid, vX, vY, vZ);
g_DriftPlayers[playerid][driftState] = DRIFT_STATE_NONE;
g_DriftPlayers[playerid][timeoutTicks] = 0;
#if defined OnPlayerDriftEnd
new Float: distance;
distance = GetPlayerDistanceFromPoint(playerid, g_DriftPlayers[playerid][startPosX], g_DriftPlayers[playerid][startPosY], g_DriftPlayers[playerid][startPosZ]);
OnPlayerDriftEnd(playerid, DRIFT_END_REASON_DAMAGED, distance, GetTickCount() - g_DriftPlayers[playerid][startTimestamp]);
#endif
}
}
I'll have a look again, but it should work either way:
PHP код:
|
stock Drift::SetMinAngle(Float: angle);
stock Drift::SetMinSpeed(Float: speed);
stock Drift::SetTimeoutTicks(ticks);
stock Float: Drift::GetMinAngle();
stock Float: Drift::GetMinSpeed();
stock Drift::GetTimeoutTicks();
Good job I like the new default settings, did you fix the damage check thing? Made sure it works?
|