mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-18 23:49:19 +02:00
Merge branch 'tmj-dev' into lua
This commit is contained in:
170
DynObj.cpp
170
DynObj.cpp
@@ -1263,71 +1263,65 @@ int TDynamicObject::Dettach(int dir)
|
||||
.CouplingFlag; // sprzęg po rozłączaniu (czego się nie da odpiąć
|
||||
}
|
||||
|
||||
void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir)
|
||||
{ // funkcja rozłączajaca podłączone sprzęgi,
|
||||
// jeśli odległość przekracza (MinDist)
|
||||
void TDynamicObject::CouplersDettach(double MinDist, int MyScanDir) {
|
||||
// funkcja rozłączajaca podłączone sprzęgi, jeśli odległość przekracza (MinDist)
|
||||
// MinDist - dystans minimalny, dla ktorego mozna rozłączać
|
||||
if (MyScanDir > 0)
|
||||
{
|
||||
if (PrevConnected) // pojazd od strony sprzęgu 0
|
||||
{
|
||||
if (MoverParameters->Couplers[0].CoupleDist > MinDist) {
|
||||
// sprzęgi wirtualne zawsze przekraczają
|
||||
|
||||
if ((PrevConnectedNo ? PrevConnected->NextConnected :
|
||||
PrevConnected->PrevConnected) == this)
|
||||
{ // Ra: nie rozłączamy znalezionego, jeżeli nie do nas
|
||||
// podłączony (może jechać w
|
||||
// innym kierunku)
|
||||
PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = NULL;
|
||||
if (PrevConnectedNo == 0)
|
||||
{
|
||||
PrevConnected->PrevConnectedNo = 2; // sprzęg 0 nie podłączony
|
||||
PrevConnected->PrevConnected = NULL;
|
||||
}
|
||||
else if (PrevConnectedNo == 1)
|
||||
{
|
||||
PrevConnected->NextConnectedNo = 2; // sprzęg 1 nie podłączony
|
||||
PrevConnected->NextConnected = NULL;
|
||||
}
|
||||
if (MyScanDir > 0) {
|
||||
// pojazd od strony sprzęgu 0
|
||||
if( ( PrevConnected != nullptr )
|
||||
&& ( MoverParameters->Couplers[ TMoverParameters::side::front ].CoupleDist > MinDist ) ) {
|
||||
// sprzęgi wirtualne zawsze przekraczają
|
||||
if( ( PrevConnectedNo == TMoverParameters::side::front ?
|
||||
PrevConnected->PrevConnected :
|
||||
PrevConnected->NextConnected )
|
||||
== this ) {
|
||||
// Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony
|
||||
// (może jechać w innym kierunku)
|
||||
PrevConnected->MoverParameters->Couplers[PrevConnectedNo].Connected = nullptr;
|
||||
if( PrevConnectedNo == TMoverParameters::side::front ) {
|
||||
// sprzęg 0 nie podłączony
|
||||
PrevConnected->PrevConnectedNo = 2;
|
||||
PrevConnected->PrevConnected = nullptr;
|
||||
}
|
||||
else if( PrevConnectedNo == TMoverParameters::side::rear ) {
|
||||
// sprzęg 1 nie podłączony
|
||||
PrevConnected->NextConnectedNo = 2;
|
||||
PrevConnected->NextConnected = nullptr;
|
||||
}
|
||||
|
||||
// za to zawsze odłączamy siebie
|
||||
PrevConnected = NULL;
|
||||
PrevConnectedNo = 2; // sprzęg 0 nie podłączony
|
||||
MoverParameters->Couplers[0].Connected = nullptr;
|
||||
}
|
||||
// za to zawsze odłączamy siebie
|
||||
PrevConnected = nullptr;
|
||||
PrevConnectedNo = 2; // sprzęg 0 nie podłączony
|
||||
MoverParameters->Couplers[ TMoverParameters::side::front ].Connected = nullptr;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (NextConnected) // pojazd od strony sprzęgu 1
|
||||
{
|
||||
if (MoverParameters->Couplers[1].CoupleDist > MinDist) {
|
||||
// sprzęgi wirtualne zawsze przekraczają
|
||||
|
||||
if ((NextConnectedNo ? NextConnected->NextConnected :
|
||||
NextConnected->PrevConnected) == this)
|
||||
{ // Ra: nie rozłączamy znalezionego, jeżeli nie do nas
|
||||
// podłączony (może jechać w
|
||||
// innym kierunku)
|
||||
NextConnected->MoverParameters->Couplers[NextConnectedNo].Connected = NULL;
|
||||
if (NextConnectedNo == 0)
|
||||
{
|
||||
NextConnected->PrevConnectedNo = 2; // sprzęg 0 nie podłączony
|
||||
NextConnected->PrevConnected = NULL;
|
||||
}
|
||||
else if (NextConnectedNo == 1)
|
||||
{
|
||||
NextConnected->NextConnectedNo = 2; // sprzęg 1 nie podłączony
|
||||
NextConnected->NextConnected = NULL;
|
||||
}
|
||||
else {
|
||||
// pojazd od strony sprzęgu 1
|
||||
if( ( NextConnected != nullptr )
|
||||
&& ( MoverParameters->Couplers[ TMoverParameters::side::rear ].CoupleDist > MinDist ) ) {
|
||||
// sprzęgi wirtualne zawsze przekraczają
|
||||
if( ( NextConnectedNo == TMoverParameters::side::front ?
|
||||
NextConnected->PrevConnected :
|
||||
NextConnected->NextConnected )
|
||||
== this) {
|
||||
// Ra: nie rozłączamy znalezionego, jeżeli nie do nas podłączony
|
||||
// (może jechać w innym kierunku)
|
||||
NextConnected->MoverParameters->Couplers[ NextConnectedNo ].Connected = nullptr;
|
||||
if( NextConnectedNo == TMoverParameters::side::front ) {
|
||||
// sprzęg 0 nie podłączony
|
||||
NextConnected->PrevConnectedNo = 2;
|
||||
NextConnected->PrevConnected = nullptr;
|
||||
}
|
||||
else if( NextConnectedNo == TMoverParameters::side::rear ) {
|
||||
// sprzęg 1 nie podłączony
|
||||
NextConnected->NextConnectedNo = 2;
|
||||
NextConnected->NextConnected = nullptr;
|
||||
}
|
||||
|
||||
NextConnected = NULL;
|
||||
NextConnectedNo = 2; // sprzęg 1 nie podłączony
|
||||
MoverParameters->Couplers[1].Connected = nullptr;
|
||||
}
|
||||
// za to zawsze odłączamy siebie
|
||||
NextConnected = nullptr;
|
||||
NextConnectedNo = 2; // sprzęg 1 nie podłączony
|
||||
MoverParameters->Couplers[1].Connected = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1338,15 +1332,7 @@ void TDynamicObject::ABuScanObjects( int Direction, double Distance )
|
||||
// pojazdu
|
||||
// ScanDir=1 - od strony Coupler0, ScanDir=-1 - od strony Coupler1
|
||||
auto const initialdirection = Direction; // zapamiętanie kierunku poszukiwań na torze początkowym, względem sprzęgów
|
||||
/*
|
||||
TTrackFollower const *firstaxle = (initialdirection > 0 ? &Axle0 : &Axle1); // można by to trzymać w trainset
|
||||
TTrack const *track = firstaxle->GetTrack(); // tor na którym "stoi" skrajny wózek
|
||||
// (może być inny niż tor pojazdu)
|
||||
if( firstaxle->GetDirection() < 0 ) {
|
||||
// czy oś jest ustawiona w stronę Point1?
|
||||
Direction = -Direction; // jeśli tak, to kierunek szukania będzie przeciwny
|
||||
}
|
||||
*/
|
||||
|
||||
TTrack const *track = RaTrackGet();
|
||||
if( RaDirectionGet() < 0 ) {
|
||||
// czy oś jest ustawiona w stronę Point1?
|
||||
@@ -1429,6 +1415,18 @@ void TDynamicObject::ABuScanObjects( int Direction, double Distance )
|
||||
|
||||
if( foundobject->MoverParameters->Couplers[ foundcoupler ].CouplingFlag == coupling::faux ) {
|
||||
// Ra: wpinamy się wirtualnym tylko jeśli znaleziony ma wirtualny sprzęg
|
||||
if( ( foundcoupler == TMoverParameters::side::front ?
|
||||
foundobject->PrevConnected :
|
||||
foundobject->NextConnected )
|
||||
!= this ) {
|
||||
// but first break existing connection of the target,
|
||||
// otherwise we risk leaving the target's connected vehicle with active one-side connection
|
||||
foundobject->CouplersDettach(
|
||||
1.0,
|
||||
( foundcoupler == TMoverParameters::side::front ?
|
||||
1 :
|
||||
-1 ) );
|
||||
}
|
||||
foundobject->MoverParameters->Attach( foundcoupler, mycoupler, this->MoverParameters, coupling::faux );
|
||||
|
||||
if( foundcoupler == TMoverParameters::side::front ) {
|
||||
@@ -1453,18 +1451,18 @@ void TDynamicObject::ABuScanObjects( int Direction, double Distance )
|
||||
}
|
||||
}
|
||||
|
||||
// odległość do najbliższego pojazdu w linii prostej
|
||||
// Ra: jeśli dwa samochody się mijają na odcinku przed zawrotką, to odległość między nimi nie może być liczona w linii prostej!
|
||||
fTrackBlock = MoverParameters->Couplers[mycoupler].CoupleDist;
|
||||
if( track->iCategoryFlag & 254 ) {
|
||||
// jeśli samochód
|
||||
if( distance > MoverParameters->Dim.L + foundobject->MoverParameters->Dim.L ) {
|
||||
// przeskanowana odległość większa od długości pojazdów
|
||||
// else if (ActDist<ScanDist) //dla samochodów musi być uwzględniona
|
||||
// droga do
|
||||
// zawrócenia
|
||||
fTrackBlock = distance; // ta odległość jest wiecej warta
|
||||
}
|
||||
// NOTE: the distance we get is approximated as it's measured between active axles, not vehicle ends
|
||||
fTrackBlock = distance;
|
||||
if( distance < 100.0 ) {
|
||||
// at short distances start to calculate range between couplers directly
|
||||
// odległość do najbliższego pojazdu w linii prostej
|
||||
fTrackBlock = std::min( fTrackBlock, MoverParameters->Couplers[ mycoupler ].CoupleDist );
|
||||
}
|
||||
if( ( false == TestFlag( track->iCategoryFlag, 1 ) )
|
||||
&& ( distance > 50.0 ) ) {
|
||||
// Ra: jeśli dwa samochody się mijają na odcinku przed zawrotką, to odległość między nimi nie może być liczona w linii prostej!
|
||||
// NOTE: the distance is approximated, and additionally less accurate for cars heading in opposite direction
|
||||
fTrackBlock = distance - ( 0.5 * ( MoverParameters->Dim.L + foundobject->MoverParameters->Dim.L ) );
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -2589,15 +2587,19 @@ bool TDynamicObject::Update(double dt, double dt1)
|
||||
tp.CategoryFlag = MyTrack->iCategoryFlag & 15;
|
||||
tp.DamageFlag = MyTrack->iDamageFlag;
|
||||
tp.QualityFlag = MyTrack->iQualityFlag;
|
||||
if ((MoverParameters->Couplers[0].CouplingFlag > 0) &&
|
||||
(MoverParameters->Couplers[1].CouplingFlag > 0))
|
||||
{
|
||||
|
||||
// couplers
|
||||
if( ( MoverParameters->Couplers[ 0 ].CouplingFlag != coupling::faux )
|
||||
&& ( MoverParameters->Couplers[ 1 ].CouplingFlag != coupling::faux ) ) {
|
||||
|
||||
MoverParameters->InsideConsist = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
else {
|
||||
|
||||
MoverParameters->InsideConsist = false;
|
||||
}
|
||||
//
|
||||
|
||||
// napiecie sieci trakcyjnej
|
||||
// Ra 15-01: przeliczenie poboru prądu powinno być robione wcześniej, żeby na
|
||||
// tym etapie były
|
||||
|
||||
Reference in New Issue
Block a user