(un)blinding unit, needs losMipLevel to restore orig. sight?

(un)blinding unit, needs losMipLevel to restore orig. sight?

Discuss Lua based Spring scripts (LuaUI widgets, mission scripts, gaia scripts, mod-rules scripts, scripted keybindings, etc...)

Moderator: Moderators

Post Reply
User avatar
knorke
Posts: 7971
Joined: 22 Feb 2006, 01:02

(un)blinding unit, needs losMipLevel to restore orig. sight?

Post by knorke »

I want to make a unit lose its vision and later gain it again.
classic jesus trick.

function to make unit blind:

Code: Select all

function blindUnit (unitID)
	local orgLos = Spring.GetUnitSensorRadius (unitID, "los")
	Spring.Echo ("orgLos=" .. (orgLos or "nil"))
	Spring.SetUnitSensorRadius (unitID, "los", 0)
	Spring.SetUnitSensorRadius (unitID, "airLos", 0)
end
to restore vision:

Code: Select all

function unblindUnit (unitID)
	local unitDefID = Spring.GetUnitDefID (unitID)
	local orgLos = UnitDefs[unitDefID]["losRadius"] * 64 --64 works with mah mod
	Spring.Echo ("orgLos from def=" .. (orgLos or "nil"))
	Spring.SetUnitSensorRadius (unitID, "los", orgLos)

	local orgLosAir = UnitDefs[unitDefID]["airLosRadius"] * 300 --300 is not quite right yet
	Spring.Echo ("orgLosAir from def=" .. (orgLosAir or "nil"))
	Spring.SetUnitSensorRadius (unitID, "airLos", orgLosAir)
end
Notice that you can not simply do

Code: Select all

orgLos = UnitDefs[unitDefID]["losRadius"]
Spring.SetUnitSensorRadius (unitID, "los", orgLos)
there are multiplicators.

Appearently the correct formula would be this:
https://github.com/spring/spring/blob/9 ... f.cpp#L326

Code: Select all

losRadius = udTable.GetFloat("sightDistance", 0.0f) * modInfo.losMul / (SQUARE_SIZE * (1 << modInfo.losMipLevel));
airLosRadius = udTable.GetFloat("airSightDistance", -1.0f);
if (airLosRadius == -1.0f) {
airLosRadius = udTable.GetFloat("sightDistance", 0.0f) * modInfo.airLosMul * 1.5f / (SQUARE_SIZE * (1 << modInfo.airMipLevel));
} else {
airLosRadius = airLosRadius * modInfo.airLosMul / (SQUARE_SIZE * (1 << modInfo.airMipLevel));
}
So it needs to read the losMipLevel from
http://springrts.com/wiki/Modrules.lua#sensors
But how?

/edit
Tried GetUnitSensorRadius but
Spring.GetUnitSensorRadius (unitID, "airLos")
Spring.GetUnitSensorRadius (unitID, "los")

both return 0

Spring.GetUnitSensorRadius (unitID, "radar")
returns 960 if the unit has radarDistance = 1000, in its file.
Post Reply

Return to “Lua Scripts”