Показать сообщение отдельно
Старый 03.04.2023, 23:53   #843
Dimas1999
Местный
 
Аватар для Dimas1999
 
Регистрация: 18.11.2015
Адрес: Анапа
Сообщений: 1,662
По умолчанию

Вот нашёл в коде P-40 кусок повреждения тяг управления дросселем.
Код:
            if(s.startsWith("xxcontrols"))
                if(s.endsWith("1"))
                {
                    if(World.Rnd().nextFloat() < 0.3F)
                    {
                        FM.AS.setEngineSpecificDamage(shot.initiator, 0, 6);
                        Aircraft.debugprintln(this, "*** Engine Controls Out..");
                    }
                    if(World.Rnd().nextFloat() < 0.3F)
                    {
                        FM.AS.setEngineSpecificDamage(shot.initiator, 0, 1);
                        Aircraft.debugprintln(this, "*** Engine Controls Out..");
                    }
У Яков и ЛаГГов тяга управления присутствует и тоже под номером 1. У более новых самолётов коллижены управления есть 1, 2 и 3. В коде поломка прописана по окончанию.
Код:
            if(s.startsWith("xxcontrols"))
            {
                if(s.endsWith("1"))
У Яка и ЛаГГа их 8, но идёт повреждение любых тяг при попадании по любому xxcontrols в зависимости от силы попадания. Но мне вот что не понравилось.
Код:
            if(s.startsWith("xxcontrols"))
            {
                debuggunnery("Controls: Hit..");
                int i = s.charAt(10) - 48;
                switch(i)
                {
                default:
                    break;

                case 1: // '\001'
                    if(getEnergyPastArmor(0.1F, shot) > 0.0F)
                    {
                        if(World.Rnd().nextFloat() < 0.1F)
                            FM.AS.setEngineSpecificDamage(shot.initiator, 0, 1);
                        if(World.Rnd().nextFloat() < 0.1F)
                            FM.AS.setEngineSpecificDamage(shot.initiator, 0, 6);
                        if(World.Rnd().nextFloat() < 0.1F)
                            FM.AS.setEngineSpecificDamage(shot.initiator, 0, 7);
                    }
                    break;
Нашёл флаги повреждения "setEngineSpecificDamage" 1, 6 и 7 в классе AircraftState.
Код:
        case 1: // '\001'
            if(((FlightModelMain) (((SndAircraft) (aircraft)).FM)).EI.engines[enginenumber].isHasControlThrottle())
                ((FlightModelMain) (((SndAircraft) (aircraft)).FM)).EI.engines[enginenumber].doSetKillControlThrottle();
            break;

        case 6: // '\006'
            if(((FlightModelMain) (((SndAircraft) (aircraft)).FM)).EI.engines[enginenumber].isHasControlProp())
                ((FlightModelMain) (((SndAircraft) (aircraft)).FM)).EI.engines[enginenumber].doSetKillControlProp();
            break;

        case 7: // '\007'
            if(((FlightModelMain) (((SndAircraft) (aircraft)).FM)).EI.engines[enginenumber].isHasControlMix())
                ((FlightModelMain) (((SndAircraft) (aircraft)).FM)).EI.engines[enginenumber].doSetKillControlMix();
            break;
Значит при попадании по любому xxcontrols с энергией 0.1F с вероятностью 0,1% может выбить РУД, управление смесью или шагом винта. По такой логике я правильно понимаю, что при попадании по xxcontrols7 в хвосте с нужной энергией у нас может выбить управление мотором? Если это так, то бред какой-то)

Нашёл в чистой игре код повреждения водорадиатора у Спитфайра.
Код:
            if(s.startsWith("xwater"))
            {
                if(FM.AS.astateEngineStates[0] == 0)
                {
                    debuggunnery("Engine Module: Water Radiator Pierced..");
                    FM.AS.hitEngine(shot.initiator, 0, 1);
                    FM.AS.doSetEngineState(shot.initiator, 0, 1);
                } else
                if(FM.AS.astateEngineStates[0] == 1)
                {
                    debuggunnery("Engine Module: Water Radiator Pierced..");
                    FM.AS.hitEngine(shot.initiator, 0, 1);
                    FM.AS.doSetEngineState(shot.initiator, 0, 2);
                }
Как он работает? Ни энергии, ни вероятности тут нет, флагов повреждения тоже не смог найти. Меня всё не покидает мысль как сделать повреждение водорадиатора Якам, ЛаГГам и не только.
Вот в классе Бф-110 тоже есть код пробития водорадиатора, есть уже условия повреждения, но опять не понял что запускает этот код, что начинает ломаться.
Код:
            if(s.startsWith("xxw"))
            {
                if(getEnergyPastArmor(World.Rnd().nextFloat(0.1F, 0.75F), shot) > 0.0F)
                {
                    int i1 = s.charAt(3) - 49;
                    if(FM.AS.astateEngineStates[i1] == 0)
                    {
                        debuggunnery("Engine Module (" + (i1 != 0 ? "Right" : "Left") + "): Water Radiator Pierced..");
                        FM.AS.hitEngine(shot.initiator, i1, 2);
                        FM.AS.doSetEngineState(shot.initiator, i1, 2);
                    }
                    getEnergyPastArmor(2.22F, shot);
                }
Dimas1999 вне форума   Ответить с цитированием