The online racing simulator
Searching in All forums
(990 results)
NotAnIllusion
S3 licensed
Added one more ugly hack to sendGap() for dealing with tracks that have zero splits (lap only). Previously it should have thrown index notices or worse. Untested because I can't do so with the AIs, and couldn't find a server running a custom track that has people on it.

Btw, is there a spoiler tag on this forum, because it would be useful for hiding these big blocks of code..

Now it's unsupported Tilt

ABGap v0.0.6
Spoiler - click to reveal

<?php 
class ABGap extends Plugins
{
    const 
URL 'https://www.lfs.net/forum/thread/89031-ABGap-%28code-dump%2C-unsupported%29';
    const 
NAME 'ABGap';
    const 
AUTHOR 'notanillusion';
    const 
VERSION '0.0.6';
    const 
DESCRIPTION 'Gap delta to car ahead and behind';

    public function 
__construct() {        
        
$this->registerPacket('onLap'ISP_LAP);    // record times, display gaps
        
$this->registerPacket('onMci'ISP_MCI);    // update positions
        
$this->registerPacket('onNpl'ISP_NPL);    // add new plids
        
$this->registerPacket('onPll'ISP_PLL);    // remove unusued plids
        
$this->registerPacket('onRst'ISP_RST);    // update total splits and laps, fresh db table
        
$this->registerPacket('onSpx'ISP_SPX);    // record times, display gaps
        
$this->registerPacket('onSta'ISP_STA);    // update viewplid
            
        
$this->consts = array(
            
'GAP_AHEAD' => -1,
            
'GAP_BEHIND' => 1,
            
            
'SPLIT_LAP' => 255
        
);
        
        
$this->db $this->newDb();
        if (!
$this->db)
            die(
'Failed to create database.'.PHP_EOL);

        
$result $this->createTable($this->db);
        if (!
$result)
            die(
'Failed to create table.'.PHP_EOL);
        
        
$this->playerData = array();    // plid => array(pos, lap), ...
        
$this->viewPlid 0;
        
$this->laps 0;
        
$this->splits 0;
    }
    
    public function 
__destruct() {
        
$this->db->close();
    }
    
    
/// *** PACKET FUNCTIONS START *** ///
    
    
public function onLap(IS_LAP $lap) {
        if (!
count($this->playerData))        // ignore hotlap mode
            
return;
        
        
$pos $this->playerData[$lap->PLID]['pos'];
            
        
$q "INSERT INTO timing (plid, lap, split, pos, time)
            VALUES (
$lap->PLID$lap->LapsDone, ".$this->consts['SPLIT_LAP'].", $pos$lap->ETime)";
            
        
$result $this->db->exec($q);
        
        
// Don't check for gap ahead if we're 1st.
        
if ($lap->PLID === $this->viewPlid && $this->playerData[$this->viewPlid]['pos'] > 1) {
            
$plidAhead $this->getPlidAhead($pos$lap->LapsDone$this->consts['SPLIT_LAP']);
            
            
// Sometimes when cars are really close to one another across a split, the SPX for the car behind in positions
            // can arrive first. Don't display gap when that happens.
            
if ($plidAhead === null) {
                return;
            }
            
$this->sendGap($plidAhead$this->consts['GAP_AHEAD'], $lap->LapsDone$this->consts['SPLIT_LAP']);
        }
        
        
// Don't check for gap behind if we're last.
        
if (!$this->isLastPlaceByPlid($this->viewPlid)) {
            if (
$this->getPlidAhead($pos$lap->LapsDone$this->consts['SPLIT_LAP']) == $this->viewPlid)
                
$this->sendGap($lap->PLID$this->consts['GAP_BEHIND'], $lap->LapsDone$this->consts['SPLIT_LAP']);
        }
    }

    public function 
onMci(IS_MCI $mci) {
        foreach (
$mci->Info as $compcar) {
            if (!
$compcar->Position)
                continue;
            
$this->playerData[$compcar->PLID]['pos'] = $compcar->Position;
            
$this->playerData[$compcar->PLID]['lap'] = $compcar->Lap;
        }
    }
    
    public function 
onNpl(IS_NPL $npl) {
        
$this->playerData[$npl->PLID]['pos'] = $npl->NumP;
        
$this->playerData[$npl->PLID]['lap'] = 1;
    }
    
    public function 
onPll(IS_PLL $pll) {
        unset(
$this->playerData[$pll->PLID]);
    }
    
    public function 
onRst(IS_RST $rst) {
        
$this->laps $rst->RaceLaps;
        
$this->splits $this->getNumSplitsRst($rst);
        
        
$this->playerData = array();
        
        
$result $this->createTable($this->db);
        if (!
$result) {
            echo(
'Failed to create table.'.PHP_EOL);
            return;
        }
}
    
    public function 
onSpx(IS_SPX $spx) {
        if (!
count($this->playerData))
            return;
        
        
$pos $this->playerData[$spx->PLID]['pos'];
        
$lap $this->playerData[$spx->PLID]['lap'];
        
        if (!
$lap$lap++;
        
        
$q "INSERT INTO timing (plid, lap, split, pos, time)
            VALUES (
$spx->PLID$lap$spx->Split{$this->playerData[$spx->PLID]['pos']}$spx->ETime)";
            
        
$result $this->db->exec($q);
        
        if (
$spx->PLID === $this->viewPlid && $this->playerData[$this->viewPlid]['pos'] > 1) {
            
$plidAhead $this->getPlidAhead($pos$lap$spx->Split);
            
            if (
$plidAhead === null) {
                return;
            }
            
$this->sendGap($plidAhead$this->consts['GAP_AHEAD'], $lap$spx->Split);
        }
        
        if (!
$this->isLastPlaceByPlid($this->viewPlid)) {
            if (
$this->getPlidAhead($pos$lap$spx->Split) == $this->viewPlid) {
                
$this->sendGap($spx->PLID$this->consts['GAP_BEHIND'], $lap$spx->Split);
            }
        }
    }
    
    public function 
onSta(IS_STA $sta) {
        
$this->viewPlid $sta->ViewPLID;
    }
    
    
/// *** PACKET FUNCTIONS END *** ///
    
    
function createTable($db) {
        
$q 'DROP TABLE timing';
        @
$this->db->exec($q);
        
        
$q 'CREATE TABLE timing(
            id INTEGER PRIMARY KEY ASC,
            plid INTEGER,
            lap INTEGER,
            split INTEGER,
            pos INTEGER,
            time INTEGER
        )'
;
        
        
$result $this->db->exec($q);

        return 
$result;
    }
    
    function 
getNumSplitsRst($rst) {
        
$splits 0;
        
        for (
$i 3$i 0$i--) {
            if (
$rst->{"Split$i"} && $rst->{"Split$i"} != 65535) {
                
$splits $i;
                break;
            }
        }
        return 
$splits;
    }
    
    function 
getPlidAhead($pos$lap$split) {
        
$pos--;

        
$q "SELECT plid FROM timing WHERE pos=$pos AND lap=$lap AND split=$split;";
        
$result $this->db->query($q);
        
        if (
$result === false)
            return;
        
$row $result->fetchArray();
        
        return 
$row['plid'];
    }
    
    function 
getTime($plid$lap$split) {
        
$q "SELECT * FROM timing WHERE plid=$plid AND lap=$lap AND split=$split;";
        
$result $this->db->query($q);
        
        
$time 0;

        while(
$row $result->fetchArray()) {
            if (
array_key_exists('time'$row))
                
$time $row['time'];
        }
        
        return 
$time;
    }
    
    function 
isLastPlaceByPlid($plid) {
        if (
$this->playerData[$plid]['pos'] >= count($this->playerData)) {
            return 
true;
        }
        
        return 
false;
    }
    
    function 
ms2str ($ms$ahead) {
        
$retval '';
        
        
$hour abs($ms / (1000 60 60));
        if (
$hour >= 1) {
            
$retval .= strval(intval($hour)) . ':';
        }
        
        
$min = ($hour intval($hour)) * 60;
        if (
$hour >= && $min 1) {
            
$retval .= '00:';
        }
        else if (
$min >= 10) {
            
$retval .= strval(intval($min)) . ':';
        }
        else if (
$min && $min 10) {
            
$retval .= '0' strval(intval($min)) . ':';
        }
        
        
$sec = ($min intval($min)) * 60;
        
$retval .= number_format($sec3);
        
        if (
$ms >= && $ahead 0) {
            
$retval "^1+$retval";
        }
        
        if (
$ms && $ahead 0) {
            
$retval "^2-$retval";
        }
        
        if (
$ms >= && $ahead 0) {
            
$retval "^1-$retval";
        }
        
        if (
$ms && $ahead 0) {
            
$retval "^2+$retval";
        }
        
        return 
$retval;
    }
    
    function 
newDb() {
        
$db = new SQLite3(':memory:');
        return 
$db;
    }
    
    function 
getGap($a$b$lap$split) {
        
$plidACurTime $this->getTime($a$lap$split);
        
$plidBCurTime $this->getTime($b$lap$split);
        
$gap $plidACurTime $plidBCurTime;
        
        return 
$gap;
    }
    
    function 
sendGap($plid$mode$lap$split) {
        if (
$split === false)
            return;
        
        if (
$this->splits === 0) {
            
$split 255;
        }
        
        
$curGap $this->getGap($this->viewPlid$plid$lap$split);
        
        switch (
$split) {
            case 
255:
                
$split $this->splits;
            break;
            
            case 
1:
                
$split 255;
                
$lap--;
            break;
            
            default:
                if (
$this->splits === 0) {
                    
$lap--;
                } else {
                    
$split--;
                }
            break;
        }
        
        
$prevGap $this->getGap($this->viewPlid$plid$lap$split);
        
        
$gapDelta $curGap $prevGap;

        if (
$mode == $this->consts['GAP_BEHIND']) {
            
$msg '^3Gap delta to car behind: ';
        } else {
            
$msg '^3Gap delta to car ahead: ';
        }
        
        
$timemsg $this->ms2str($gapDelta$mode);
        
$msg .= $timemsg;
        
        
IS_MSL()->Msg($msg)->Send();
    }
}
?>



http://pastebin.com/KtsS07v5
Last edited by NotAnIllusion, .
NotAnIllusion
S3 licensed
Wizard, what wizard? Not even aware of any wizard. In fact, running
findstr /S /I "wizard" .\*

from the Windows' command prompt from the PRISM root gives zero matches. Maybe I need a wizard for using wizards.. Big grin

FTR: I can't remember whether I'm using the zip from the forum thread or the zip download from GitHub, if that makes any difference.
ABGap (code dump, unsupported)
NotAnIllusion
S3 licensed
I won't be optimising, rewriting or otherwise working on this in the future, but I'll post this here anyway. Perhaps as an example of everything one should not do in a plugin.. Feel free to do whatever with the code soup, like, move to code snippets.

ABGap shows a chat message with the gap delta to the car ahead (when the viewed car crosses a split) and behind (when the car behind the viewed car crosses a split).



---

Notes:
- Tested with PHP 7, PRISM version 0.4.6.4.
- Uses SQLite3, so php_sqlite3.dll needs to be enabled in php.ini.
- Gap is to the car that was ahead/behind at the split, not necessarily to the car that is currently ahead or behind if positions have changed.
- Super hacky, ewww.

/path/to/prism/plugins/ABGap.php
Spoiler - click to reveal

<?php 
class ABGap extends Plugins
{
    const 
URL '';
    const 
NAME 'ABGap';
    const 
AUTHOR 'notanillusion';
    const 
VERSION '0.0.5';
    const 
DESCRIPTION 'Gap delta to car ahead and behind';

    public function 
__construct() {        
        
$this->registerPacket('onLap'ISP_LAP);    // record times, display gaps
        
$this->registerPacket('onMci'ISP_MCI);    // update positions
        
$this->registerPacket('onNpl'ISP_NPL);    // add new plids
        
$this->registerPacket('onPll'ISP_PLL);    // remove unusued plids
        
$this->registerPacket('onRst'ISP_RST);    // update total splits and laps, fresh db table
        
$this->registerPacket('onSpx'ISP_SPX);    // record times, display gaps
        
$this->registerPacket('onSta'ISP_STA);    // update viewplid
            
        
$this->consts = array(
            
'GAP_AHEAD' => -1,
            
'GAP_BEHIND' => 1,
            
            
'SPLIT_LAP' => 255
        
);
        
        
$this->db $this->newDb();
        if (!
$this->db)
            die(
'Failed to create database.'.PHP_EOL);

        
$result $this->createTable($this->db);
        if (!
$result)
            die(
'Failed to create table.'.PHP_EOL);
        
        
$this->playerData = array();    // plid => array(pos, lap), ...
        
$this->viewPlid 0;
        
$this->laps 0;
        
$this->splits 0;
    }
    
    public function 
__destruct() {
        
$this->db->close();
    }
    
    
/// *** PACKET FUNCTIONS START *** ///
    
    
public function onLap(IS_LAP $lap) {
        if (!
count($this->playerData))        // ignore hotlap mode
            
return;
        
        
$pos $this->playerData[$lap->PLID]['pos'];
            
        
$q "INSERT INTO timing (plid, lap, split, pos, time)
            VALUES (
$lap->PLID$lap->LapsDone, ".$this->consts['SPLIT_LAP'].", $pos$lap->ETime)";
            
        
$result $this->db->exec($q);
        
        
// Don't check for gap ahead if we're 1st.
        
if ($lap->PLID === $this->viewPlid && $this->playerData[$this->viewPlid]['pos'] > 1) {
            
$plidAhead $this->getPlidAhead($pos$lap->LapsDone$this->consts['SPLIT_LAP']);
            
            
// Sometimes when cars are really close to one another across a split, the SPX for the car behind in positions
            // can arrive first. Don't display gap when that happens.
            
if ($plidAhead === null) {
                return;
            }
            
$this->sendGap($plidAhead$this->consts['GAP_AHEAD'], $lap->LapsDone$this->consts['SPLIT_LAP']);
        }
        
        
// Don't check for gap behind if we're last.
        
if (!$this->isLastPlaceByPlid($this->viewPlid)) {
            if (
$this->getPlidAhead($pos$lap->LapsDone$this->consts['SPLIT_LAP']) == $this->viewPlid)
                
$this->sendGap($lap->PLID$this->consts['GAP_BEHIND'], $lap->LapsDone$this->consts['SPLIT_LAP']);
        }
    }

    public function 
onMci(IS_MCI $mci) {
        foreach (
$mci->Info as $compcar) {
            if (!
$compcar->Position)
                continue;
            
$this->playerData[$compcar->PLID]['pos'] = $compcar->Position;
            
$this->playerData[$compcar->PLID]['lap'] = $compcar->Lap;
        }
    }
    
    public function 
onNpl(IS_NPL $npl) {
        
$this->playerData[$npl->PLID]['pos'] = $npl->NumP;
        
$this->playerData[$npl->PLID]['lap'] = 1;
    }
    
    public function 
onPll(IS_PLL $pll) {
        unset(
$this->playerData[$pll->PLID]);
    }
    
    public function 
onRst(IS_RST $rst) {
        
$this->laps $rst->RaceLaps;
        
$this->splits $this->getNumSplitsRst($rst);
        
        
$this->playerData = array();
        
        
$result $this->createTable($this->db);
        if (!
$result) {
            echo(
'Failed to create table.'.PHP_EOL);
            return;
        }
}
    
    public function 
onSpx(IS_SPX $spx) {
        if (!
count($this->playerData))
            return;
        
        
$pos $this->playerData[$spx->PLID]['pos'];
        
$lap $this->playerData[$spx->PLID]['lap'];
        
        if (!
$lap$lap++;
        
        
$q "INSERT INTO timing (plid, lap, split, pos, time)
            VALUES (
$spx->PLID$lap$spx->Split{$this->playerData[$spx->PLID]['pos']}$spx->ETime)";
            
        
$result $this->db->exec($q);
        
        if (
$spx->PLID === $this->viewPlid && $this->playerData[$this->viewPlid]['pos'] > 1) {
            
$plidAhead $this->getPlidAhead($pos$lap$spx->Split);
            
            if (
$plidAhead === null) {
                return;
            }
            
$this->sendGap($plidAhead$this->consts['GAP_AHEAD'], $lap$spx->Split);
        }
        
        if (!
$this->isLastPlaceByPlid($this->viewPlid)) {
            if (
$this->getPlidAhead($pos$lap$spx->Split) == $this->viewPlid) {
                
$this->sendGap($spx->PLID$this->consts['GAP_BEHIND'], $lap$spx->Split);
            }
        }
    }
    
    public function 
onSta(IS_STA $sta) {
        
$this->viewPlid $sta->ViewPLID;
    }
    
    
/// *** PACKET FUNCTIONS END *** ///
    
    
function createTable($db) {
        
$q 'DROP TABLE timing';
        @
$this->db->exec($q);
        
        
$q 'CREATE TABLE timing(
            id INTEGER PRIMARY KEY ASC,
            plid INTEGER,
            lap INTEGER,
            split INTEGER,
            pos INTEGER,
            time INTEGER
        )'
;
        
        
$result $this->db->exec($q);

        return 
$result;
    }
    
    function 
getNumSplitsRst($rst) {
        
$splits 0;
        
        for (
$i 3$i 0$i--) {
            if (
$rst->{"Split$i"} && $rst->{"Split$i"} != 65535) {
                
$splits $i;
                break;
            }
        }
        return 
$splits;
    }
    
    function 
getPlidAhead($pos$lap$split) {
        
$pos--;

        
$q "SELECT plid FROM timing WHERE pos=$pos AND lap=$lap AND split=$split;";
        
$result $this->db->query($q);
        
        if (
$result === false)
            return;
        
$row $result->fetchArray();
        
        return 
$row['plid'];
    }
    
    function 
getTime($plid$lap$split) {
        
$q "SELECT * FROM timing WHERE plid=$plid AND lap=$lap AND split=$split;";
        
$result $this->db->query($q);
        
        
$time 0;

        while(
$row $result->fetchArray()) {
            if (
array_key_exists('time'$row))
                
$time $row['time'];
        }
        
        return 
$time;
    }
    
    function 
isLastPlaceByPlid($plid) {
        if (
$this->playerData[$plid]['pos'] >= count($this->playerData)) {
            return 
true;
        }
        
        return 
false;
    }
    
    function 
ms2str ($ms$ahead) {
        
$retval '';
        
        
$hour abs($ms / (1000 60 60));
        if (
$hour >= 1) {
            
$retval .= strval(intval($hour)) . ':';
        }
        
        
$min = ($hour intval($hour)) * 60;
        if (
$hour >= && $min 1) {
            
$retval .= '00:';
        }
        else if (
$min >= 10) {
            
$retval .= strval(intval($min)) . ':';
        }
        else if (
$min && $min 10) {
            
$retval .= '0' strval(intval($min)) . ':';
        }
        
        
$sec = ($min intval($min)) * 60;
        
$retval .= number_format($sec3);
        
        if (
$ms >= && $ahead 0) {
            
$retval "^1+$retval";
        }
        
        if (
$ms && $ahead 0) {
            
$retval "^2-$retval";
        }
        
        if (
$ms >= && $ahead 0) {
            
$retval "^1-$retval";
        }
        
        if (
$ms && $ahead 0) {
            
$retval "^2+$retval";
        }
        
        return 
$retval;
    }
    
    function 
newDb() {
        
$db = new SQLite3(':memory:');
        return 
$db;
    }
    
    function 
getGap($a$b$lap$split) {
        
$plidACurTime $this->getTime($a$lap$split);
        
$plidBCurTime $this->getTime($b$lap$split);
        
$gap $plidACurTime $plidBCurTime;
        
        return 
$gap;
    }
    
    function 
sendGap($plid$mode$lap$split) {
        if (
$split === false)
            return;
        
        
$curGap $this->getGap($this->viewPlid$plid$lap$split);
        
        switch (
$split) {
            case 
255:
                
$split $this->splits;
            break;
            
            case 
1:
                
$split 255;
                
$lap--;
            break;
            
            default:
                
$split--;
            break;
        }
        
        
$prevGap $this->getGap($this->viewPlid$plid$lap$split);
        
        
$gapDelta $curGap $prevGap;

        if (
$mode == $this->consts['GAP_BEHIND']) {
            
$msg '^3Gap delta to car behind: ';
        } else {
            
$msg '^3Gap delta to car ahead: ';
        }
        
        
$timemsg $this->ms2str($gapDelta$mode);
        
$msg .= $timemsg;
        
        
IS_MSL()->Msg($msg)->Send();
    }
}
?>




Or http://pastebin.com/WDFa1VxX
Last edited by NotAnIllusion, .
NotAnIllusion
S3 licensed
I'm aware that PRISM displays the packets in the console, as you can see from the screencap. That was to ensure that the packet got passed to the plugin when I was having trouble receiving more than one of them.

Correct abridged answer to my question then is,
Quote :set the ISF_MCI flag (flags = 32) in hosts.ini.

I wasn't aware of the flags variable in hosts.ini because
1) it's not there by default
2) I didn't see it in the documentation, or
3) I did see it in the documentation, but didn't understand what I read.

It works now, so thanks.
NotAnIllusion
S3 licensed

<?php 
    
public function __construct() {
        
$this->registerPacket('onMci'ISP_MCI);
    }
?>


<?php 
    
public function onMci(IS_MCI $mci) {
        echo(
'< MCI'.PHP_EOL);
    }
?>

I receive one MCI (or NLP, makes no difference), and then nothing. Do I need to tell PRISM to send them to my plugin at steady intervals? Ignore the PHP tags, those are obviously not in those places in the plugin.

Anyway, it doesn't matter now. I wrote the InSim app without PRISM, so it's fine.
NotAnIllusion
S3 licensed
Space Cop
http://www.imdb.com/title/tt3892384/

An extremely over-the-top, mental throwback / spoof movie. Recommended if you want to lose brain cells. Soundtrack was pretty sweet..
How to start receiving NLP / MCIs?
NotAnIllusion
S3 licensed
Plugin, running on a local client. Apart from subscribing to the packet / datagram, what else do I need to do?
NotAnIllusion
S3 licensed
As long as one set of tyres doesn't easily last a race distance, there will be tyre management. Making tyres that last a bit longer only means that the first pit stop will be slightly later. Unless tyre stops are made to be a forced 2-lap window for everyone..
NotAnIllusion
S3 licensed
I'm going to wait and see how large the cities are. If they're only a tiny bit larger than the ones in ETS2, I'll wait until this is on sale for < 5€ or something. :\. New scenery is cool, but highways aren't thaaat exciting.
NotAnIllusion
S3 licensed
1) I would say windowed, not minimised.
2) Changed lighting in the same environment, very unlikely. Changed track enviroment, possibly. Various tracks and cars were used while I was connected.
NotAnIllusion
S3 licensed
Quote from Scawen :That is strange. Was that at Kyoto? It seems like some kind of memory corruption. Can you make it happen again? Can you remember selecting any options or pressing any keys before that happened? Was it ok when you first joined and then this happened after a while

- It was at Kyoto.
- Can't reproduce.
- Can't remember doing anything that would have caused it.
- Forgot to save replay
- Initially it was fine, it happened after a while.
- It fixed itself when the race was ended and a different track environment was loaded.
- The client version at the time was *K6*, not 7, just to clarify.
- I'll definitely try to get more info if it happens again.

Specifically, it happened while the LFS window wasn't in focus. I had left the game client connected to SRS:TestingGrounds in the background, while I was doing other things like browsing the web. No way to tell exactly what I was doing at the time. Maybe it has something to do with the new handling of window when it's not in focus?

At one point I had a brief look at the LFS window to find the error messages and the corruption. Nothing more I can say about it at this time.
NotAnIllusion
S3 licensed
Not sure if this is test patch related. I glanced at my LFS client while I was connected to the AI development server, saw several lines of
Quote :GetFinishedObject - Error 1 - Not enough vertex colours

And the lighting went all wonky.
NotAnIllusion
S3 licensed
There is even footage of the Ferrari FXX K played on the PlayStation 4 https://www.youtube.com/watch?v=RRS-y2LopOU
NotAnIllusion
S3 licensed
Reduce the braking power so low in the setup that lock-ups don't happen, for cars that don't have ABS.
NotAnIllusion
S3 licensed
I did find the server, but it's private. I'm guessing that's intentional for now.
NotAnIllusion
S3 licensed
Some racing cars such as V8 Supercars use a line lock system used to stop the car from rolling away when stationary: https://en.wikipedia.org/wiki/Line_lock

Perhaps the GTRs should have that instead of a real cable handbrake.
NotAnIllusion
S3 licensed
Quote from Kova. :displays settings coulours are totally working wrong

Confirmed (K2).

If I drag the red slider further to the right, the resulting colour reset to dark green.
LFS crashes on alt+f4 when using Japanese IME (Windows 10)
NotAnIllusion
S3 licensed
Problem:
LFS crashes when the key combination alt+f4 is used while Japanese IME is active. It only happens after the player is loaded on to a track.

Examples (Japanese IME is active):
- load LFS to main menu and alt+f4 -> no crash
- select hotlapping, car and track, go to garage and alt+f4 -> no crash
- go to track and alt+f4 -> crash
- go back to garage and alt+f4 -> crash
- go to spectate and alt+f4 -> no crash
---
- go to spectate in multiplayer mode and alt+f4 -> crash

Reproduce steps (install Japanese IME first from Windows' language/regional options):
- open LFS
- select hotlapping
- load any car and track combination
- enter the track (start a hotlap session)
- alt+shift to switch language to Japanese IME (or use the language bar in the task bar)
- alt+f4

Crash information 1:
Quote :
Viallisen sovelluksen nimi: LFS.exe, versio: 0.0.0.0, aikaleima: 0x56840286
Viallisen moduulin nimi: imetip.dll, versio: 15.0.10586.0, aikaleima: 0x5632d402
Poikkeuskoodi: 0xc0000005
Virhepoikkeama: 0x00031cd8
Viallisen prosessin tunnus: 0x1454
Viallisen sovelluksen käynnistysaika: 0x01d149af4602a8dc
Viallisen sovelluksen polku: D:\programs\lfs\LFS.exe
Viallisen moduulin polku: C:\Windows\SYSTEM32\IME\shared\imetip.dll
Raportin tunnus: 64861534-2798-46fc-b4c8-05be4a1e7a69
Viallisen paketin koko nimi:
Viallisen paketin suhteellinen sovellustunnus:

Crash information 2:
Quote :
Viallisen sovelluksen nimi: LFS.exe, versio: 0.0.0.0, aikaleima: 0x56840286
Viallisen moduulin nimi: imetip.dll, versio: 15.0.10586.0, aikaleima: 0x5632d402
Poikkeuskoodi: 0xc000041d
Virhepoikkeama: 0x00031cd8
Viallisen prosessin tunnus: 0x1454
Viallisen sovelluksen käynnistysaika: 0x01d149af4602a8dc
Viallisen sovelluksen polku: D:\programs\lfs\LFS.exe
Viallisen moduulin polku: C:\Windows\SYSTEM32\IME\shared\imetip.dll
Raportin tunnus: 250c7677-5d9b-416e-a0b5-8a1b1378a2be
Viallisen paketin koko nimi:
Viallisen paketin suhteellinen sovellustunnus:

Maybe nothing can be done since the crash happens outside of LFS in imetip.dll Shrug
NotAnIllusion
S3 licensed
If pretty much everything is going OOS, will the ones uploaded up to that point be archived (not the SPRs, just the timing data) or be lost forever?
NotAnIllusion
S3 licensed
ST165 or gtfo.
NotAnIllusion
S3 licensed
Try reducing the number of dynamic reflections in graphics, and turning off post-processing shaders in miscallaneous if you haven't already. And of course, if you are able to use a lower resolution..
NotAnIllusion
S3 licensed
I bought the S3 licence because LFS has given me far more than £24s' worth of enjoyment over the many years that I've played it. I still expect to see the tyre physics, the VWS and other content to see the light of day, but even if that's not the case, I don't feel as if I've been robbed or disrespected.

The Rockingham track itself feels solid, and the club layouts are fun. ISCC Long is more fun than the standard ISCC BTCC layout, who'd of thunk it, eh?
NotAnIllusion
S3 licensed
Was unable to complete the purchase using the card method. I tried with a VISA Electron by selecting the Electron option, but got a "number doesn't match type of card" error. The same thing happened when I selected the standard VISA option. The card is enabled for online purchases and I've used it for that many times.

Worked with Paypal which is linked to the same card.
NotAnIllusion
S3 licensed
Well, my sentiments regarding the release model are similar. Not only are there separate Euro and American truck simulators, but there will eventually be a coach simulator too instead of baking it into existing products. Perhaps eventually there will be an all-inclusive product, and the DLC is licenced so that one doesn't have to the pay twice+ for areas owned in other SCS sims. Will never happen.. On the other hand I do understand it a little bit. They're a small group of developers, releasing with huge amounts of content would mean that their product would be seriously out of date by the release date.

The other thing that bothers me is that ATS uses Prism3D, which by now is very old, and as seen by Promods, ETS2MP and other things, it struggles sometimes where I think it shouldn't. I guess they'll have made some optimisations, but remains to be seen how close to a ETS2 reskin with a new area and weight stations it'll be.

Anyways, I'm not too bothered. I'll get it when it's on sale.
FGED GREDG RDFGDR GSFDG