Hello, i have one problem with my insim, when im drifting its working only on one side. What can be the problem?
internal void Update(Driver car)
{
if(!isOn)
return;
packetReceive++;
double speedKhm = car.GetSpeedKmh();
double angleTotraj = car.GetShorterAngleToReachTraj();
if (!started)
{
if(speedKhm > MIN_SPEED)
{
if (angleTotraj > START_ANGLE && angleTotraj < START_MAX_ANGLE)
Start(car);
}
}
else
{
//Player is Too Slow End without Score
if (speedKhm < MIN_SPEED || isLostControl)
{
End(car);
return;
}
//This will occur when orientation change is direction
//Into a perfect drift this happen only at the complete end and not much.
double oriSpeed = car.GetOrientationSpeed();
if(clockWise != (oriSpeed>0))
{
if(Math.Abs(oriSpeed) > MIN_COUNTER_ANGLE_SPEED)
{//he apply correction
counterCorrection++;
if (Math.Abs(oriSpeed) > MAX_COUNTER_ANGLE_SPEED)
{//This should mean a lost control, since is doing "S"
End(car);
return;
}
}
}
//Record Max Angle
if (maxAngleDiff < angleTotraj)
maxAngleDiff = angleTotraj;
//Process Score
ComputeScore(car);
//Find END
if (angleTotraj < STOP_ANGLE)
{
if (score > 0 && scoreTick > (MIN_DRIFT_TIME_MS / SCORE_TICK_TIME_MS))
Sucess(car);
else
End(car);
}
}
}
private void Start(Driver driver)
{
started = true;
startTime = DateTime.Now;
clockWise = (driver.GetOrientationSpeed() > 0 ? true : false);
maxAngleDiff = 0.0d;
scoreAngle = 0.0d;
startSpeed = driver.GetSpeedKmh();
scoreSpeed = 0;
score = 0;
scoreTick = 0;
counterCorrection = 0;
packetReceive = 0;
/*if(driver.IsAdmin)
{
driver.SendUpdateButton((ushort)Button_Entry.INFO_1, "^2Drift Start "+(clockWise?"":"^7-"));
driver.SendUpdateButton((ushort)Button_Entry.INFO_2, "^7Score ^3" + score);
}*/
}
private void End(Driver driver)
{
started = false;
/*if(driver.IsAdmin)
{
driver.SendUpdateButton((ushort)Button_Entry.INFO_1, "^1Drift End");
}*/
}
private void Sucess(Driver driver)
{
if (maxAngleDiff >= BONUS_ANGLE)
score *= BONUS_ANGLE_SCORE_RATIO;
Log.feature(((IDriver)driver).DriverName + ", Done Drift Score: " + (uint)score + ".\r\n");
End(driver);
//Debug think
/*if(((Driver)driver).IsAdmin)
{
((IButton)driver).SendUpdateButton((ushort)Button_Entry.INFO_2, "^7Score ^2" + score);
}*/
((Driver)driver).driftScoreByTime += (uint)score;
if (((Driver)driver).ISession.Script.CarDriftScoring((ICar)driver, (uint)score))
return;
}
private void ComputeScore(Driver driver)
{
//Scoring calculation occur only at all SCORE_TICK_TIME_MS diff.
TimeSpan timeDiff = DateTime.Now - startTime;
if (timeDiff.TotalMilliseconds / SCORE_TICK_TIME_MS < scoreTick)
return;
//How many time we calculated the score
scoreTick++;
//Calculate correction ratio
double correctionRatio = (100.0d-(counterCorrection * 100.0d/packetReceive))/100.0d;
//Gave point for Angle
double angleToReach = driver.GetAngleToReachTraj(clockWise);
scoreAngle += (360.0d - angleToReach) * SCORE_ANGLE_RATIO;
//If player goes faster then start speed WOW, if not loose a little each time
double _scoreSpeed = ((driver.GetSpeedKmh() * 100.0d / startSpeed) - 100.0d) * SCORE_SPEED_RATIO;
if(_scoreSpeed <0.0d)
_scoreSpeed += (startSpeed / 35.0d) * (double)scoreTick;
scoreSpeed += _scoreSpeed;
//All By Correction %, Can only Lower Score
score = ((scoreAngle + scoreSpeed) * correctionRatio) - ((correctionRatio-1.0d)*40.0d);
//Only for debug purpose
/*if(((Driver)car).IsAdmin)
{
((IButton)car).SendUpdateButton((ushort)Button_Entry.INFO_2, "^7Score ^3"+score);
((IButton)car).SendUpdateButton((ushort)Button_Entry.INFO_3, "^3SA ^7" + scoreAngle);
((IButton)car).SendUpdateButton((ushort)Button_Entry.INFO_4, "^3SS ^7" + scoreSpeed);
((IButton)car).SendUpdateButton((ushort)Button_Entry.INFO_5, "^3CR ^7" + correctionRatio);
}*/
}
public bool IsOn
{
get { return isOn; }
set
{
isOn = value;
started = false;
}
}
}