Report post

Are you sure you want to report the post shown below? This will send an email to the ATVO administrators. Please include a short reason for reporting.

Users reporting for no reason may be locked out.


Post

Posted by Kyle H
on
Hi Nick - apologies for the messy formatting. I'm having trouble recognizing drivers off of the spreadsheet, it never seems to recognize when a driver is in the sheet and assigns them the default points value of zero. The script does correctly add the current points earned during the race, but not adding the points from Column9 (the points accumulated so far this season).

I didn't think DriverID was a necessary column, since the spreadsheet data binding works fine with just names, but I did try adding a column with IDs and have the same problem. Does anything stick out to you that would cause this?



using System; 
using ATVO.ThemesSDK;
using ATVO.ThemesSDK.Data.Entity;
using ATVO.ThemeEditor.ThemeModels;
using ATVO.ThemeEditor.Controls;
using ATVO.ThemeEditor.Scripting.DotNET;
using ATVO.ThemesSDK.Data.Enums;
using ATVO.ThemesSDK.Data.Results;
using System.Linq;
using System.Data;
using System.Collections.Generic;


namespace Scripts
{
public class Script : IScript
{

ChampDriver driver;


int[] PointStructure = new int[] { 0, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
private Dictionary<int, ChampDriver> _standings = new Dictionary<int, ChampDriver>();


public object Execute(ThemeContentItem item, object value, string parameter, ISimulation sim)
{
UpdateSessionStandings(sim);
LoadStandings(item.Theme);
IEntitySessionResult result = (IEntitySessionResult) value;

var pos = result.LivePosition;
int CurrentPoints = PointStructure[pos];

//Lap Led Point
if (result.LapsLed > 0)
{
CurrentPoints++;
}
//Pole Position Point
if (result.StartPosition == 1)
{
CurrentPoints++;
}
//Winner Point
if (result.LivePosition == 1)
{
CurrentPoints++;
}

int TotalPoints = CurrentPoints + driver.ChampPoints;

return TotalPoints;

}
/////////////////////////////////////////////////////////////////////////////////////////////////////////


private void LoadStandings(Theme theme)
{
if (_standings.Count == 0)
{
// Read current standings from embedded csv
// Columns: customer_id, position, carnumber, drivername, points
var sheet = theme.Spreadsheets.Find("Champ_Standings.csv");

foreach (var row in sheet.Table.Data.Rows.OfType<DataRow>())
{
var custid = row[1];
var position = row[0];
var carnum = row[11];
var name = row[2];
var points = row[9];

var driver = new ChampDriver();
driver.CustomerId = Convert.ToInt32(custid);
driver.ChampPosition = Convert.ToInt32(position);
driver.CarNumber = carnum.ToString();
driver.Name = name.ToString();
driver.ChampPoints = Convert.ToInt32(points);

_standings.Add(driver.CustomerId, driver);
}
}
}

private void UpdateSessionStandings(ISimulation sim)
{
// Loop through entity results in the session and update the standings
foreach (var result in sim.Session.Current.Results)
{

// Check if there is a driver in the session who was NOT in the standings csv
if (!_standings.ContainsKey(result.Entity.Id))
{
// This driver isn't in the standings yet, let's add him
driver = new ChampDriver();
driver.CustomerId = result.Entity.Id;
driver.Name = result.Entity.Name;
driver.CarNumber = result.Entity.Car.Number;
driver.ChampPoints = 0;
_standings.Add(driver.CustomerId, driver);
}
else
{
// Otherwise, grab him from memory
driver = _standings[result.Entity.Id];
}

// Link him to the session entity
driver.Entity = result.Entity;

}
}

public class ChampDriver
{
public IEntity Entity {get;set;}
public int CustomerId {get;set;}
public string CarNumber {get;set;}
public string Name {get;set;}

public int ChampPosition {get;set;}
public int ChampPoints {get;set;}
public int LiveChampPosition {get;set;}
public int LiveChampPoints {get;set;}
}
}
}