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

Играю с кодом повреждения баков. Отладку делаю на ЛаГГ-3 4 серии.

Код:
    public void rareAction(float paramFloat, boolean paramBoolean)
    {
        super.rareAction(paramFloat, paramBoolean);
        if(paramBoolean)
        {
типа какие-то эффекты
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] > 4 && World.Rnd().nextFloat() < 0.07F)
                nextDMGLevel(((FlightModelMain) (super.FM)).AS.astateEffectChunks[0] + "0", 0, this);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] > 4 && World.Rnd().nextFloat() < 0.07F)
                nextDMGLevel(((FlightModelMain) (super.FM)).AS.astateEffectChunks[1] + "0", 0, this);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] > 4 && World.Rnd().nextFloat() < 0.07F)
                nextDMGLevel(((FlightModelMain) (super.FM)).AS.astateEffectChunks[2] + "0", 0, this);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] > 4 && World.Rnd().nextFloat() < 0.07F)
                nextDMGLevel(((FlightModelMain) (super.FM)).AS.astateEffectChunks[3] + "0", 0, this);

код ниже позволяет перекидываться огню на соседний бак
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] > 4 && World.Rnd().nextFloat() < 0.14F)
                ((FlightModelMain) (super.FM)).AS.hitTank(this, 1, 1);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] > 4 && World.Rnd().nextFloat() < 0.14F)
                ((FlightModelMain) (super.FM)).AS.hitTank(this, 0, 1);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] > 4 && World.Rnd().nextFloat() < 0.14F)
                ((FlightModelMain) (super.FM)).AS.hitTank(this, 3, 1);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] > 4 && World.Rnd().nextFloat() < 0.14F)
                ((FlightModelMain) (super.FM)).AS.hitTank(this, 2, 1);

код ниже позволяет затухать бакам
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] > 4 && World.Rnd().nextFloat() < 0.1F)
				((FlightModelMain) (super.FM)).AS.setTankState(this, 0, ((FlightModelMain) (super.FM)).AS.astateTankStates[0] - 2);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] > 4 && World.Rnd().nextFloat() < 0.1F)
				((FlightModelMain) (super.FM)).AS.setTankState(this, 1, ((FlightModelMain) (super.FM)).AS.astateTankStates[1] - 2);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] > 4 && World.Rnd().nextFloat() < 0.1F)
				((FlightModelMain) (super.FM)).AS.setTankState(this, 2, ((FlightModelMain) (super.FM)).AS.astateTankStates[2] - 2);
            if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] > 4 && World.Rnd().nextFloat() < 0.1F)
				((FlightModelMain) (super.FM)).AS.setTankState(this, 3, ((FlightModelMain) (super.FM)).AS.astateTankStates[3] - 2);
        }
    }
Так же в классе самолёта стоит протектор
Код:
    public void rareAction(float dt, boolean bMaster)
    {
        super.rareAction(dt, bMaster);
        if(bMaster)
        {
            for(int i = 0; i < 4; i++)
                if(((FlightModelMain) (super.FM)).AS.astateTankStates[i] > 0 && ((FlightModelMain) (super.FM)).AS.astateTankStates[i] < 5 && World.Rnd().nextFloat() < 0.1F)
                    ((FlightModelMain) (super.FM)).AS.repairTank(i);
        }
    }
Убирал разные части кода и смотрел что происходит.
Протектор довольно быстро заделывает пробитый бак, код работает.
Огонь перекидывается на соседний бак как и положено, но если нет кода затухания бака, то самолёт обречён, у меня всегда в таком случае ломало консоль.
Если включён код затухания, то соседний бак успевает получить повреждения, но, скорее всего, бак успеет потухнуть, а соседний бак не успеет разгореться.

Так же в классе Ла-5 есть такой код. Особо не понял на что он влияет, будто консоль чаще ломает при горящем баке.
Код:
     protected boolean cutFM(int paramInt1, int paramInt2, Actor paramActor)
    {
        switch(paramInt1)
        {
        case 33: // '!'
            if(World.Rnd().nextFloat() < 0.233F)
                ((FlightModelMain) (super.FM)).AS.hitTank(this, 1, 6);
            return super.cutFM(34, paramInt2, paramActor);

        case 36: // '$'
            if(World.Rnd().nextFloat() < 0.233F)
                ((FlightModelMain) (super.FM)).AS.hitTank(this, 2, 6);
            return super.cutFM(37, paramInt2, paramActor);

        case 34: // '"'
        case 35: // '#'
        default:
            return super.cutFM(paramInt1, paramInt2, paramActor);
        }
    }
Dimas1999 вне форума   Ответить с цитированием