About the parasitic interior illumination from the landing light.
The simplest expedient is to reduce the local, self illumination intensity and or range emitted by the LightPoint source. It has no bearing on the ground spot intensity, only the surfaces in the immediate environs. Like our cockpit interior. As mentioned, some special mask might be feasible, but I don't know how to do that. Yet.
The intensity for local illumination is set in AircraftState.class:
private void doSetLandingLightState(boolean flag)
{
bLandingLightOn = flag;
for(int i = 0; i < astateLandingLightEffects.length; i++)
{
if(astateLandingLightEffects[i] != null)
{
Eff3DActor.finish(astateLandingLightEffects[i]);
astateLandingLightLights[i].light.setEmit(0.0F, 0.0F);
}
astateLandingLightEffects[i] = null;
}
if(flag)
{
for(int j = 0; j < astateLandingLightEffects.length; j++)
{
Aircraft.debugprintln(aircraft, "AS: Checking '" + astateEffectChunks[j + 24] + "' visibility..");
boolean flag1 = aircraft.isChunkAnyDamageVisible(astateEffectChunks[j + 24]);
Aircraft.debugprintln(aircraft, "AS: '" + astateEffectChunks[j + 24] + "' is " + (flag1 ? "visible" : "invisible") + "..");
if(flag1)
{
String s = "3DO/Effects/Fireworks/FlareWhiteWide.eff";
astateLandingLightEffects[j] = Eff3DActor.New(actor, actor.findHook("_LandingLight0" + j), null, 1.0F, s, -1F);
/* astateLandingLightLights[j].light.setEmit(1.2F, 8F); */
astateLandingLightLights[j].light.setEmit(0.3F, 9F);
}
}
}
}
Here, the stock intensity and range of 1.2 and 8, respectively, have been altered to 0.3 and 9 in my own game. I don't know what are the units, nor how they're scaled. I just fiddle until I get what I like.
The intensity has been reduced to 1/4 (by the numbers), while the range was slightly increased. This has the effect of making a softer, more diffuse pattern of local illumination upon the plane.
If you want no interior illumination at all, drop the range sufficiently.
Because a landing light is a highly directed beam, spill lighting is not generally an intense thing. And so decreasing this aspect is a not unrealistic approach.
While I'm at it, might I suggest altering the color from the rather strong cyan to a more neutral hue. If we want pure white, all RGB values would be 1.0. This is done in this method, also in AircraftState.class:
public void set(Actor actor, boolean bool)
The relevant chunk of code from that method:
for (int i = 0; i < 4; i++) {
try {
astateEffectChunks[i + 18] = this.actor.findHook("_LandingLight0" + i).chunkName();
astateEffectChunks[i + 18] = astateEffectChunks[i + 18].substring(0, astateEffectChunks[i + 18].length() - 1);
Aircraft.debugprintln(aircraft, ("AS: Landing Lamp #" + i + " attached to '" + astateEffectChunks[i + 18] + "' substring.."));
HookNamed hooknamed = new HookNamed(aircraft, "_LandingLight0" + i);
loc_2_.set(1.0, 0.0, 0.0, 0.0F, 0.0F, 0.0F);
hooknamed.computePos(this.actor, loc, loc_2_);
Point3d point3d = loc_2_.getPoint();
astateLandingLightLights[i] = new LightPointActor(new LightPoint(), point3d);
/* astateLandingLightLights[i].light.setColor(0.4941176F, 0.9098039F, 0.9607843F); */
astateLandingLightLights[i].light.setColor(0.96F, 0.91F, 0.84F);
astateLandingLightLights[i].light.setEmit(0.0F, 0.0F);
this.actor.draw.lightMap().put("_LandingLight0" + i, astateLandingLightLights[i]);
} catch (Exception exception) {
/* empty */
} finally {
/* empty */
}
}
Note the stock RGB values of (0.4941176F, 0.9098039F, 0.9607843F); that gives the cyan hue. My RGB values of (0.96F, 0.91F, 0.84F) make for a decidedly warm white. I might change to (1.0F, 1.0F, 1.0F), for pure white.
This takes care of the local light parameters. If you alter the light color, you want to do so for the ground spot as well, for consistency. That's done in Aircraft.class:
public void updateLLights() {
pos.getRender(_tmpLoc);
if (lLight == null) {
if (!(_tmpLoc.getX() < 1.0)) {
lLight = new LightPointWorld[] { null, null, null, null };
for (int i = 0; i < 4; i++) {
lLight[i] = new LightPointWorld();
/* lLight[i].setColor(0.49411765F, 0.9098039F, 0.9607843F); */
lLight[i].setColor(0.96F, 0.91F, 0.84F);
lLight[i].setEmit(0.0F, 0.0F);
try {
lLightHook[i] = new HookNamed(this, "_LandingLight0" + i);
} catch (Exception exception) {
/* empty */
}
}
}
} else {
for (int i = 0; i < 4; i++) {
if (FM.AS.astateLandingLightEffects[i] != null) {
lLightLoc1.set(0.0, 0.0, 0.0, 0.0F, 0.0F, 0.0F);
lLightHook[i].computePos(this, _tmpLoc, lLightLoc1);
lLightLoc1.get(lLightP1);
/* lLightLoc1.set(1000.0, 0.0, 0.0, 0.0F, 0.0F, 0.0F); */
lLightLoc1.set(3000.0, 0.0, 0.0, 0.0F, 0.0F, 0.0F);
lLightHook[i].computePos(this, _tmpLoc, lLightLoc1);
lLightLoc1.get(lLightP2);
Engine.land();
if (Landscape.rayHitHQ(lLightP1, lLightP2, lLightPL)) {
lLightPL.z++;
lLightP2.interpolate(lLightP1, lLightPL, 0.95F);
lLight[i].setPos(lLightP2);
float f = (float) lLightP1.distance(lLightPL);
float f_105_ = f * 0.5F + 30.0F;
/* float f_106_ = 0.5F - 0.5F * f / 1000.0F; */
float f_106_ = 0.5F - 0.5F * f / 3000.0F;
lLight[i].setEmit(f_106_, f_105_);
} else
lLight[i].setEmit(0.0F, 0.0F);
} else if (lLight[i].getR() != 0.0F)
lLight[i].setEmit(0.0F, 0.0F);
}
}
}
Note that the setColor function has replicated the values for the light itself. Toward the bottom of the method the distance out to which the ground spot can be cast is set. I went from the rather restrictive 1000m to 3000m. Note that this limit is defined twice; first for the actual limit, the second to calculate the ground spot illumination as it varies by distance.