110 lines
3.1 KiB
Plaintext
110 lines
3.1 KiB
Plaintext
|
|
||
|
-- CrookR 9/3/2021
|
||
|
-- Support for 2D scope shader, helper script for easier interfacing with engine. Uses
|
||
|
-- engine mod to expose information about the current scope texture and camera movement.
|
||
|
|
||
|
local scopeState = 0
|
||
|
local lastSens = ui_options.get("control/general/mouse_sens")
|
||
|
local scopeBaseFactors = {}
|
||
|
|
||
|
function actor_on_weapon_zoom_out()
|
||
|
exec_console_cmd("scope_2dtexactive " .. 0)
|
||
|
exec_console_cmd("scope_radius " .. 0.0)
|
||
|
end
|
||
|
|
||
|
function actor_on_before_death(whoID,flags)
|
||
|
exec_console_cmd("mouse_sens " .. lastSens)
|
||
|
exec_console_cmd("scope_radius " .. 0.0)
|
||
|
exec_console_cmd("scope_2dtexactive " .. 0)
|
||
|
end
|
||
|
|
||
|
function dbugscope()
|
||
|
--return
|
||
|
|
||
|
local ply = db.actor
|
||
|
if not ( ply and ply:alive() ) then return end
|
||
|
|
||
|
local wpn = db.actor:active_item()
|
||
|
local cweapon = wpn:cast_Weapon()
|
||
|
local zf = cweapon:GetZoomFactor()
|
||
|
local sf = get_console():get_float("scope_factor")
|
||
|
|
||
|
printf("--" .. wpn:id() .. "--")
|
||
|
printf("scope: " .. scopeState .. " | sensitivity: " .. ui_options.get("control/general/mouse_sens"))
|
||
|
printf("factor: " .. tostring(zf / sf) .. " | base zoom: " .. tostring(scopeBaseFactors[wpn:id()]))
|
||
|
end
|
||
|
|
||
|
function updateScope(enabled)
|
||
|
|
||
|
local ply = db.actor
|
||
|
if not ( ply and ply:alive() ) then return end
|
||
|
|
||
|
local wpn = db.actor:active_item()
|
||
|
|
||
|
if(enabled) then
|
||
|
-- scoping in
|
||
|
lastSens = ui_options.get("control/general/mouse_sens")
|
||
|
|
||
|
if wpn then
|
||
|
|
||
|
-- get scope name
|
||
|
local scopeName = nil
|
||
|
if wpn:weapon_scope_status() == 2 then
|
||
|
if wpn:weapon_is_scope() then
|
||
|
local scope = utils_item.get_attached_scope(wpn)
|
||
|
scopeName = utils_item.get_param(scope, wpn:id(), "scope_texture", "string")
|
||
|
end
|
||
|
else
|
||
|
scopeName = utils_item.get_param(wpn:section(), wpn:id(), "scope_texture", "string")
|
||
|
end
|
||
|
|
||
|
-- get radius
|
||
|
if scopeName and scopeRadii.scopeRadii[scopeName] then
|
||
|
|
||
|
-- apply radius
|
||
|
exec_console_cmd("scope_radius " .. scopeRadii.scopeRadii[scopeName])
|
||
|
|
||
|
-- adjust zoom for factor compensation
|
||
|
local cweapon = wpn:cast_Weapon()
|
||
|
local zf = cweapon:GetZoomFactor()
|
||
|
local sf = get_console():get_float("scope_factor")
|
||
|
|
||
|
-- scale zoom factor and sensitivity to scope factor, to keep things consistent
|
||
|
if cweapon and zf and sf then
|
||
|
|
||
|
-- store unmodified value so we don't accidentally stack
|
||
|
if not scopeBaseFactors[wpn:id()] then
|
||
|
scopeBaseFactors[wpn:id()] = zf
|
||
|
end
|
||
|
|
||
|
-- apply factor and sensitivity
|
||
|
cweapon:SetZoomFactor(scopeBaseFactors[wpn:id()] / sf)
|
||
|
exec_console_cmd("mouse_sens " .. (lastSens * sf))
|
||
|
|
||
|
--dbugscope()
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
-- scoping out
|
||
|
exec_console_cmd("scope_radius " .. 0.0)
|
||
|
exec_console_cmd("mouse_sens " .. lastSens)
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
function actor_on_update()
|
||
|
if not (get_console():get_integer("scope_2dtexactive") == scopeState) then
|
||
|
scopeState = get_console():get_integer("scope_2dtexactive")
|
||
|
updateScope(scopeState > 0)
|
||
|
|
||
|
--dbugscope()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function on_game_start()
|
||
|
RegisterScriptCallback( "actor_on_weapon_zoom_out", actor_on_weapon_zoom_out )
|
||
|
RegisterScriptCallback( "actor_on_update", actor_on_update )
|
||
|
RegisterScriptCallback( "actor_on_before_death", actor_on_before_death )
|
||
|
end
|