MOARdV / AvionicsSystems

MOARdV's Avionics Systems for Kerbal Space Program - a new generation of IVA enhancement.
Other
52 stars 26 forks source link

MAS Completely freezing #27

Closed DeputyLOL closed 7 years ago

DeputyLOL commented 8 years ago

This has kept happening since i reinstalled KSP. Everything is normal and then the game freezes for about 5 seconds. When it comes back, MAS is frozen completely. Monitors are stuck, alarms don't play or don't stop playing. When i try and hit a MASswitch, I get an initialization error and the log spams with: [ERR 00:08:43.975] [MASFlightComputer] MASFlightComputer.FixedUpdate exception: System.NullReferenceException: Object reference not set to an instance of an object at AvionicsSystems.MASFlightComputer+Variable.ProcessObject (System.Object value) [0x00000] in :0 at AvionicsSystems.MASFlightComputer+Variable.Evaluate (MoonSharp.Interpreter.Script script) [0x00000] in :0 at AvionicsSystems.MASFlightComputer.FixedUpdate () [0x00000] in :0

Reloading the ship seems to fix it.

Just thought i'd let you know :D

MOARdV commented 8 years ago

I haven't had any hangs or errors. There may be something particular about your installation (a mod or something else that isn't playing nice). A full log file may provide some insight. I've also updated the DLL to provide some finer-grained messages on the ProcessObject exception.

DeputyLOL commented 8 years ago

I suspect one of my scripts is causing the problem.

DeputyLOL commented 8 years ago

I might have narrowed it down to the GPWS system. Im not entirely sure whats wrong with it though. Here it is:

function ACGPWSOn()
    if ACAltitudeTerrainFeet() < 2500 then -- and fc.GetPersistent("ACGPWSON") == 1 then
        return 1
    else
        return 0
    end
end

function ACGPWSDecending()
    if ACAltitudeTerrainRateFeetPerMin() < 0 or ACVerticalSpeedFeetPerMin() < 0 then
        return 1
    else
        return 0
    end
end
-- GPWS "PULL UP"

function ACGPWSPullUp()
    if ACGPWSSinkRate() == 2 or ACGPWSTerrain() == 2 then
        return 1 -- PULL UP
    else
        return 0
    end
end

-- GPWS MODE 1 "SINK RATE" / "PULL UP"

function ACGPWSSinkRate()
    local ACGPWSSinkRateWarningThreshold = fc.Remap(ACAltitudeTerrainFeet(),0,2500,-1000,-3000)
    local ACGPWSSinkRateAlertThreshold = fc.Remap(ACAltitudeTerrainFeet(),0,2500,-1500,-8000)
    if ACVerticalSpeedFeetPerMin() < ACGPWSSinkRateWarningThreshold and ACVerticalSpeedFeetPerMin() > ACGPWSSinkRateAlertThreshold and ACGPWSTerrain() == 0 and ACGPWSTooLow() == 0 and ACGPWSOn() == 1 then
        return 1 -- SINK RATE
    elseif ACVerticalSpeedFeetPerMin() < ACGPWSSinkRateAlertThreshold and ACGPWSOn() == 1 then
        return 2 -- PULL UP
    else
        return 0
    end
end

-- GPWS MODE 2 "TERRAIN TERRAIN" / "TERRAIN" / "PULL UP"

function ACGPWSTerrain()
    local ACGPWSTerrainClosureRate = ACVerticalSpeedFeetPerMin() - ACAltitudeTerrainRateFeetPerMin()
    local ACGPWSTerrainWarningThreshold = fc.Remap(ACAltitudeTerrainFeet(),0,2000,1800,4000)
    local ACGPWSTerrainAlertThreshold = fc.Remap(ACAltitudeTerrainFeet(),0,1500,2000,3800)
    if ACGPWSTerrainClosureRate > ACGPWSTerrainWarningThreshold and ACGPWSTerrainClosureRate < ACGPWSTerrainAlertThreshold and ACGPWSOn() == 1 then
        return 1 -- TERRAIN TERRAIN
    elseif ACGPWSTerrainClosureRate > ACGPWSTerrainAlertThreshold and ACGPWSOn() == 1 then
        return 2 -- PULL UP
    else
        return 0
    end
end

-- GPWS MODE 3 "DONT SINK"

function ACGPWSDontSink()
    return 0 -- I really should work out how this works...
end

-- GPWS MODE 4 "TOO LOW TERRAIN" / "TOO LOW GEAR" / "TOO LOW FLAPS"

function ACGPWSTooLow()
    local ACGPWSTooLowGearThreshold = fc.Remap(ACAltitudeTerrainFeet(),500,1000,230,260)
    local ACGPWSTooLowFlapThreshold = fc.Remap(ACAltitudeTerrainFeet(),250,1000,230,250)
    if fc.GetGear() == 0 and ACAltitudeTerrainFeet() > 50 and ACAltitudeTerrainFeet() < 500 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACAirspeedKnots() < ACGPWSTooLowGearThreshold and ACGPWSPullUp() == 0 and ACGPWSOn() == 1 then
        return 1 --  MODE A TOO LOW GEAR
    elseif fc.GetGear() == 1 and far.GetFlapSetting() <= 1 and ACAltitudeTerrainFeet() > 30 and ACAltitudeTerrainFeet() < 250 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACAirspeedKnots() < ACGPWSTooLowFlapThreshold and ACGPWSPullUp() == 0 and ACGPWSOn() == 1 then
        return 2 -- MODE B TOO LOW FLAPS
    elseif fc.GetGear() == 0 and ACAltitudeTerrainFeet() > 30 and ACAltitudeTerrainFeet() < 1000 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACAirspeedKnots() > ACGPWSTooLowGearThreshold and ACGPWSPullUp() == 0 and ACGPWSOn() == 1 then
        return 3 -- MODE A TOO LOW TERRAIN
    elseif fc.GetGear() == 1 and far.GetFlapSetting() <= 1 and ACAltitudeTerrainFeet() > 30 and ACAltitudeTerrainFeet() < 1000 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACAirspeedKnots() > ACGPWSTooLowFlapThreshold and ACGPWSPullUp() == 0 and ACGPWSOn() == 1 then
        return 3 -- MODE B TOO LOW TERRAIN
    -- elseif ACAltitudeTerrainRateFeetPerMin() <= 0 and ACGPWSPullUp() == 0 and ACGPWSOn() == 1 then
        -- return 3 -- MODE C TOO LOW TERRAIN <-- THE FUCK GOES HERE!?!
    else
        return 0
    end
end

-- GPWS MODE 5 "GLIDE SLOPE"

function ACGPWSGlideSlope()
    return 0 -- Need an actual glide slope system first...
end

-- GPWS MODE 6 "BANK ANGLE"

function ACGPWSBankAngle()
    return 0 -- TODO
end

-- GPWS ALTITUDE CALLOUTS

function ACGPWSAltCallout()
    if ACAltitudeTerrainFeet() > 4 and ACAltitudeTerrainFeet() < 5 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 5
    elseif ACAltitudeTerrainFeet() > 5 and ACAltitudeTerrainFeet() < 10 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 10
    elseif ACAltitudeTerrainFeet() > 10 and ACAltitudeTerrainFeet() < 20 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 20
    elseif ACAltitudeTerrainFeet() > 25 and ACAltitudeTerrainFeet() < 30 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 30
    elseif ACAltitudeTerrainFeet() > 35 and ACAltitudeTerrainFeet() < 40 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 40
    elseif ACAltitudeTerrainFeet() > 45 and ACAltitudeTerrainFeet() < 50 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 50
    elseif ACAltitudeTerrainFeet() > 55 and ACAltitudeTerrainFeet() < 60 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 60
    elseif ACAltitudeTerrainFeet() > 65 and ACAltitudeTerrainFeet() < 70 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 70
    elseif ACAltitudeTerrainFeet() > 95 and ACAltitudeTerrainFeet() < 100 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 100
    elseif ACAltitudeTerrainFeet() > 190 and ACAltitudeTerrainFeet() < 200 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 200
    elseif ACAltitudeTerrainFeet() > 290 and ACAltitudeTerrainFeet() < 300 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 300
    elseif ACAltitudeTerrainFeet() > 390 and ACAltitudeTerrainFeet() < 400 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 400
    elseif ACAltitudeTerrainFeet() > 490 and ACAltitudeTerrainFeet() < 500 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 500
    elseif ACAltitudeTerrainFeet() > 990 and ACAltitudeTerrainFeet() < 1000 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 1000
    elseif ACAltitudeTerrainFeet() > 1950 and ACAltitudeTerrainFeet() < 2000 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 2000
    elseif ACAltitudeTerrainFeet() > 2450 and ACAltitudeTerrainFeet() < 2500 and ACAltitudeTerrainRateFeetPerMin() < 0 and ACGPWSOn() == 1 then
        return 2500
    else
        return 0
    end
end
MOARdV commented 7 years ago

I'm going to punt on this for now - if it's happening with the current dev builds of MAS and KSP 1.3.0, please let me know.