include "vehicle.gs" class Selfcar isclass Vehicle { Asset SA3_coupled, SA3_uncouped; // для bool DeRailed; ////НАСТРОЙКА СЦЕПКИ//// /////// НАЧАЛО ///////// public void SetCouplerAttach(int pos, bool type){ //// Устанавливает сцепку взависимости от параметров //// pos: //// 0 - спереди вагона (front_couple) //// 1 - сзади вагона (back_couple) //// type: //// false - разомкнутая (SA3-uncoupled) //// true - сомкнутая (SA3-coupled) if (pos == 0) { //перед вагона if (type == true) {SetFXAttachment ("front_couple", SA3_coupled);} //устанавливаем размкнутую сцепку else {SetFXAttachment ("front_couple", SA3_uncouped);} //устанавливаем сомкнутую сцепку } else{ //зад вагона if (type == true) {SetFXAttachment ("back_couple", SA3_coupled);} //устанавливаем размкнутую сцепку else {SetFXAttachment ("back_couple", SA3_uncouped);} //устанавливаем сомкнутую сцепку } } public int GetMyPosition(Train MyTrain) { //// Возвращет позицию вагона в составе //// 0 - одиночный //// 1 - Первый //// 2 - В центре //// 3 - Последний Vehicle[] TrainVehiclesArray; int ArraySize; int result; TrainVehiclesArray = MyTrain.GetVehicles(); // получаем массив вагонов в составе ArraySize = TrainVehiclesArray.size(); // получаем количестово элементов массива(количество вагонов в составе) if (ArraySize == 1) {result = 0;} // вагон одиночный else if (me == TrainVehiclesArray[0]) {result = 1;} // вагонов больше одного, этот вагон находится первым в составе else if (me == TrainVehiclesArray[ArraySize-1]) {result = 3;} // вагонов больше одного, этот вагон находится в конце состава else {result = 2;} // вагонов больше одного, этот вагон находится в центре состава return result; } public void SetCoupler(int pos, bool direction){ // устанавливает соответствующий тип сцепки и буф. фонарей для переда и зада вагона в зависимости от положения и направления вагона в составе if (pos == 0) { // вагон одиночный SetCouplerAttach(0,false); SetMeshVisible("left_red_bf",true,0); SetCouplerAttach(1,false); SetMeshVisible("left_red_bf_b",true,0); } else if (pos == 1){ // вагон в начале состава if (direction) { SetCouplerAttach(0,false); SetCouplerAttach(1,true); SetMeshVisible("left_red_bf",true,2); SetMeshVisible("left_red_bf_b",false,2); } else { SetCouplerAttach(0,true); SetCouplerAttach(1,false); SetMeshVisible("left_red_bf",false,2); SetMeshVisible("left_red_bf_b",true,2); } } else if (pos == 2){ // вагон в центре состава SetCouplerAttach(0,true); SetMeshVisible("left_red_bf",false,2); SetCouplerAttach(1,true); SetMeshVisible("left_red_bf_b",false,2); } else if (pos == 3){ // вагон в конце состава if (direction) { SetCouplerAttach(0,true); SetCouplerAttach(1,false); SetMeshVisible("left_red_bf",false,2); SetMeshVisible("left_red_bf_b",true,2); } else { SetCouplerAttach(0,false); SetCouplerAttach(1,true); SetMeshVisible("left_red_bf",true,2); SetMeshVisible("left_red_bf_b",false,2); } } } thread void CouplerMonitor(void){ int pos; Train MyTrain; bool direction; while (!DeRailed) { MyTrain = me.GetMyTrain(); // получаем состав, которому принадлежит этот вагон if (MyTrain != null) { // пропускаем код если для вагона нет состава direction = me.GetDirectionRelativeToTrain(); // получаем направление вагона относительно состава pos = GetMyPosition(MyTrain); // получаем положение вагона в составе SetCoupler(pos, direction); // включаем/выключаем фонари, устанавливаем сцепки } Sleep(5); // всем спать 5 секунд } } ////НАСТРОЙКА СЦЕПКИ//// /////// КОНЕЦ ////////// thread void MonStart(void){ Message msg; DeRailed = false; CouplerMonitor(); // Запускаем слежение за сцепкой while (!DeRailed){ wait(){on "Vehicle", "Derailed", msg:{if (msg.src == me) DeRailed = true;} } } } public void Init(void){ inherited(); SA3_coupled=GetAsset().FindAsset("SA3-coupled"); //SA3_coupled - сомкнутая сцепка SA3_uncouped=GetAsset().FindAsset("SA3-uncoupled"); //SA3_uncouped - разомкнутая сцепка SetCouplerAttach(0,false); // устанавливаем переднюю сцепку в положение - разомкнуто SetCouplerAttach(1,false); // устанавливаем заднюю сцепку в положение - разомкнуто MonStart(); } };