Code:
-- Free job purchase
function MoneyManager:get_cost_of_premium_contract(job_id, difficulty) return 0 end
-- Spawning Jobs
-- job_id: "branchbank_cash_prof", etc
-- difficulty: "easy" *Easy*, "normal" *Normal*, "hard" *Hard*, "overkill" *Very Hard*, "overkill_145" *Overkill*
function add_job(job_id, difficulty)
local difficulty_id = tweak_data:difficulty_to_index( difficulty )
table.insert( managers.crimenet._presets, { job_id = job_id, difficulty_id = difficulty_id, difficulty = difficulty, chance = 1 } )
managers.crimenet._MAX_ACTIVE_JOBS = managers.crimenet._MAX_ACTIVE_JOBS + 1
end
-- _NEW_JOB_MIN_TIME/_NEW_JOB_MAX_TIME are a better alternative to managers.crimenet._debug_mass_spawning
managers.crimenet._NEW_JOB_MIN_TIME = 0
managers.crimenet._NEW_JOB_MAX_TIME = 0
managers.crimenet._presets = { }
managers.crimenet._active_jobs = { }
managers.crimenet._MAX_ACTIVE_JOBS = 0
add_job("welcome_to_the_jungle_prof", "overkill_145")
add_job("framing_frame_prof", "overkill_145")
add_job("branchbank_prof", "overkill_145")
add_job("ukrainian_job_prof", "overkill_145")
add_job("watchdogs_prof", "overkill_145")
add_job("alex_prof", "overkill_145")
add_job("firestarter_prof", "overkill_145")
add_job("nightclub_prof", "overkill_145")
add_job("branchbank_gold_prof", "overkill_145")
add_job("family", "overkill_145")
managers.player:player_unit():camera()._camera_object:set_fov(90)
function PlayerStandard:_check_action_weapon_gadget( t, input )
local new_fov = 0
local new_sens = false
if input.btn_weapon_gadget_press then
if self._equipped_unit:base()._gadget_on then
new_fov = 90 -- desired FOV without zoom goes here
new_sens = false
else
new_fov = 20 -- zoom FOV goes here
new_sens = true
end
if self._equipped_unit:base().toggle_gadget then
if self._equipped_unit:base():has_gadget() then
self._equipped_unit:base():toggle_gadget()
self._unit:network():send( "set_weapon_gadget_state", self._equipped_unit:base()._gadget_on )
self._camera_unit:base():set_fov_instant( new_fov )
managers.menu:set_mouse_sensitivity( new_sens )
end
end
end
end
if not _alwaysMessiah then _alwaysMessiah = CopDamage.damage_bullet end
function CopDamage:damage_bullet( attack_data )
local result = _alwaysMessiah(self, attack_data)
if result.type == "death" and attack_data.attacker_unit == managers.player:player_unit() and attack_data.attacker_unit:character_damage():bleed_out() then
attack_data.attacker_unit:character_damage():revive( true )
end
return result
end
-- Don't taze me bro
function PlayerTased:enter( state_data, enter_data )
PlayerTased.super.enter( self, state_data, enter_data )
self._next_shock = Application:time() + 10
self._taser_value = 1
self._recover_delayed_clbk = "PlayerTased_recover_delayed_clbk"
managers.enemy:add_delayed_clbk( self._recover_delayed_clbk, callback( self, self, "clbk_exit_to_std" ), Application:time() )
end
-- Super jump (when running, you jump 1.5x high)
function PlayerStandard:_perform_jump(jump_vec)
local v = math.UP * 470
if self._running then
v = math.UP * 470 * 1.3
end
self._unit:mover():set_velocity( v )
end
function PlayerDamage:damage_fall( data )
end
-- disable drillhax ********************************
if _oldJamming then
TimerGui._set_jamming_values = _oldJamming
_oldJamming = nil
end
if _oldStart then
TimerGui.start = _oldStart
_oldStart = nil
end
-- Allow restart on pro jobs
if not _oldIsProfessional then _oldIsProfessional = JobManager.is_current_job_professional end
if not _newIsProfessional then _newIsProfessional = function(self) return false end end
if not _lobbyStateEnter then _lobbyStateEnter = IngameLobbyMenuState.at_enter end
function IngameLobbyMenuState:at_enter()
JobManager.is_current_job_professional = _newIsProfessional
_lobbyStateEnter(self)
JobManager.is_current_job_professional = _oldIsProfessional
end
if not _lobbyContinue then _lobbyContinue = GameOverState.continue end
function GameOverState:continue()
JobManager.is_current_job_professional = _newIsProfessional
_lobbyContinue(self)
JobManager.is_current_job_professional = _oldIsProfessional
end
if not _lobbyShutDownNetwork then _lobbyShutDownNetwork = GameOverState._shut_down_network end
function GameOverState:_shut_down_network( ... )
JobManager.is_current_job_professional = _newIsProfessional
_lobbyShutDownNetwork(self, ...)
JobManager.is_current_job_professional = _oldIsProfessional
end
if not _lobbyLoadStartMenu then _lobbyLoadStartMenu = GameOverState._load_start_menu end
function GameOverState:_load_start_menu( ... )
JobManager.is_current_job_professional = _newIsProfessional
_lobbyLoadStartMenu(self, ...)
JobManager.is_current_job_professional = _oldIsProfessional
end
if not _lobbySetBtnText then _lobbySetBtnText = GameOverState._set_continue_button_text end
function GameOverState:_set_continue_button_text()
JobManager.is_current_job_professional = _newIsProfessional
_lobbySetBtnText(self)
JobManager.is_current_job_professional = _oldIsProfessional
end
function MenuCallbackHandler:singleplayer_restart() return true end
local player = managers.player:player_unit()
if managers.hud then
managers.hud:show_hint( { text = "Proceed to the Objective." } )
end
-- Small loot value multiplier (extra jewelry cash value in jewelry store, deposit boxes in bank heist, etc)
if not _uvSmallLoot then _uvSmallLoot = PlayerManager.upgrade_value end
function PlayerManager:upgrade_value( category, upgrade, default )
if category == "player" and upgrade == "small_loot_multiplier" then
return 50
else
return _uvSmallLoot(self, category, upgrade, default)
end
end
if not _uvlSmallLoot then _uvlSmallLoot = PlayerManager.upgrade_value_by_level end
function PlayerManager:upgrade_value_by_level( category, upgrade, level, default )
if category == "player" and upgrade == "small_loot_multiplier" then
return 10
else
return _uvlSmallLoot(self, category, upgrade, level, default)
end
end
-- COLORSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
-- Mark enemies
function setEnemyColor(unit)
local enemyType = unit:base()._tweak_table
local color, target_color
-- Civilians | Green
if enemyType == "civilian" or enemyType == "civilian_female" then
color = Vector3( 0.1687, 0.5529, 0 )
target_color = Vector3( 0.1688, 0.5529, 0 )
-- Taser | Blue
elseif enemyType == "taser" then
color = Vector3(0, 0.3804, 0.6235)
target_color = Vector3(0.001, 0.3804, 0.6235)
-- Shield | Orange
elseif enemyType == "shield" then
color = Vector3(1, 0.5, 0)
target_color = Vector3(1.001, 0.5, 0)
-- Tank | Yellow
elseif enemyType == "tank" then
color = Vector3(1, 1, 0)
target_color = Vector3(1.001, 1, 0)
-- Sniper | Pink
elseif enemyType == "sniper" then
color = Vector3(1, 0.35, 0.35)
target_color = Vector3(1.001, 0.35, 0.35)
-- Cop/unknown | Purple
else
color = Vector3(0.5216, 0, 0.5529)
target_color = Vector3(0.5217, 0, 0.5529)
end
-- Set colors
managers.game_play_central._enemy_contour_units[unit:key()].color = color
managers.game_play_central._enemy_contour_units[unit:key()].target_color = target_color
end
function mark_enemies()
local units = World:find_units_quick( "all", 3, 16, 21, managers.slot:get_mask( "enemies" ) )
for i,unit in ipairs( units ) do
if not unit:brain() or not unit:brain()._logic_data or
not unit:brain()._logic_data.objective or
(unit:brain()._logic_data.objective.type ~= "surrender" and
unit:brain()._logic_data.objective.type ~= "follow") then
if tweak_data.character[ unit:base()._tweak_table ].silent_priority_shout then
managers.game_play_central:add_enemy_contour( unit, true )
setEnemyColor(unit)
elseif unit:character_damage().on_marked_state then
managers.game_play_central:add_enemy_contour( unit, false )
setEnemyColor(unit)
end
end
end
for u_key, unit in pairs( managers.groupai:state()._security_cameras ) do
managers.game_play_central:add_marked_contour_unit( unit )
managers.network:session():send_to_peers_synched( "mark_contour_unit", unit )
end
end
function UnitNetworkHandler:mark_enemy( unit, marking_strength, sender ) end
if managers.hud then -- Check if in-game, otherwise, GameSetup class isn't prepared yet and code fails
if not _gameUpdate then _gameUpdate = GameSetup.update end
do
local _gameUpdateLastMark
function GameSetup:update( t, dt )
_gameUpdate(self, t, dt)
if not _gameUpdateLastMark or t - _gameUpdateLastMark > 4 then
_gameUpdateLastMark = t
mark_enemies()
end
end
end
end
-- COLORSSSSSSSSSSSSSSSSSSSSSSSSSSe489057tsioafoasdfSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS*S*S*S*S**S*S*S*S**S*S*S*S
-- Force specific escape ("escape_cafe", "escape_park", "escape_street", "escape_overpass", "escape_garage", "escape_overpass_night")
if not _setInterrupt then _setInterrupt = JobManager.set_next_interupt_stage end
function JobManager:set_next_interupt_stage( interrupt )
_setInterrupt(self, "escape_garage")
end
-- Make cameras not trigger the alarm
function SecurityCamera:_sound_the_alarm( detected_unit ) end
-- Makes guards & people in general stop calling the cops **************************************************************
-- function GroupAIStateBase:on_police_called( called_reason ) end
-- Unlimited messiah charges (self-revive)
function PlayerDamage:consume_messiah_charge() return true end
function PlayerDamage:got_messiah_charges() return true end
-- Infinite ECM jammer battery
function ECMJammerBase:update( unit, t, dt )
self._battery_life = self._max_battery_life
end
-- Unlimited doctor bag uses
function DoctorBagBase:_take( unit )
unit:character_damage():recover_health() -- replenish()
return 0
end
-- No flashbangs
function CoreEnvironmentControllerManager:set_flashbang( flashbang_pos, line_of_sight, travel_dis, linear_dis ) end
-- No hit disorientation
function CoreEnvironmentControllerManager:hit_feedback_front() end
function CoreEnvironmentControllerManager:hit_feedback_back() end
function CoreEnvironmentControllerManager:hit_feedback_right() end
function CoreEnvironmentControllerManager:hit_feedback_left() end
function CoreEnvironmentControllerManager:hit_feedback_up() end
function CoreEnvironmentControllerManager:hit_feedback_down() end
-- 100% Armor piercing
if not _uvArmorPierce then _uvArmorPierce = PlayerManager.upgrade_value end
function PlayerManager:upgrade_value( category, upgrade, default )
if category == "weapon" and upgrade == "armor_piercing_chance" then
return 1
elseif category == "weapon" and upgrade == "armor_piercing_chance_silencer" then
return 1
else
return _uvArmorPierce(self, category, upgrade, default)
end
end
-- Long timer for defusing C4 on Rats Day 3
tweak_data.interaction.c4_diffusible.timer = 4000
tweak_data.player.put_on_mask_time = 2
-- No bag pickup cooldown *!@*(&!^#*(&^!@(*#&^(!@&*#^(*&^@#*&^@*(&#^*(@&#^*(@&^#)*FUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
function PlayerManager:carry_blocked_by_cooldown() return false end -- Remove cooldown between picking up bags
-- function PlayerManager:is_carrying() return false end
-- BaseInteractionExt.can_carry = function() return true end
Application:debug( "has_category_upgrade:sync_interacted: peer upgrade checks out,", peer )
-- Stops civs from reporting you
function CivilianLogicFlee.clbk_chk_call_the_police( ignore_this, data ) end
-- Stops police from saying they are calling the police all the time
function CopLogicArrest._say_call_the_police( data, my_data ) end
-- Prevents panic buttons
if not _actionRequest then _actionRequest = CopMovement.action_request end
function CopMovement:action_request( action_desc )
-- action_desc.variant == "cmf_so_press_alarm_wall": civilian in Bank Heist pressing panic button, etc
-- action_desc.variant == "cmf_so_press_alarm_table": tellers in Bank Heist pressing panic button, etc
-- action_desc.variant == "cmf_so_call_police": civilians calling the police
-- action_desc.variant == "arrest_call": cops saying they are calling the police
return _actionRequest(self, action_desc)
end
NewRaycastWeaponBase.recoil_multiplier = function(self) return .5 end
NewRaycastWeaponBase.reload_speed_multiplier = function(self) return 3.5 end
NewRaycastWeaponBase._get_spread = function(self) return 1.2 end
PlayerStandard._can_run_directional = function(self) return true end
PlayerStandard._can_stand = function(self) return true end
PlayerMovement.is_stamina_drained = function(self) return false end
function PlayerMovement:_change_stamina( value ) end
PlayerStandard._get_swap_speed_multiplier = function(self) return 5 end
function PlayerManager:carry_blocked_by_cooldown() return false end
PlayerManager.body_armor_movement_penalty = function(self) return 1 end -- TURN OFF FOR MP **********
function PlayerManager:has_category_upgrade( category, upgrade)
if category == "player" and (upgrade == "civ_harmless_melee" or upgrade == "civ_harmless_bullets") then return false end
return true -- Other upgrades (eg. Joker)
end
PlayerManager.chk_minion_limit_reached = function(self) return false end
-- 100% Dodge
if not _uvDodge then _uvDodge = PlayerManager.upgrade_value end
function PlayerManager:upgrade_value( category, upgrade, default )
if category == "player" and upgrade == "passive_dodge_chance" then
return 0.59
else
return _uvDodge(self, category, upgrade, default)
end
end
-- Full map Intimidate civs w/ noise!! AHA
if not _uvAura then _uvAura = PlayerManager.upgrade_value end
function PlayerManager:upgrade_value( category, upgrade, default )
if category == "player" and upgrade == "intimidate_aura" then
return 30000
else
return _uvAura(self, category, upgrade, default)
end
end
-- INTERACTION DISTANCE WOOOOT
function BaseInteractionExt:interact_distance()
if self.tweak_data == "access_camera" or tostring(self._unit:name()) == "Idstring(@ID14f05c3d9ebb44b6@)" or self.tweak_data == "trip_mine" or self.tweak_data == "invisible_interaction_open" or self.tweak_data == "stn_int_place_camera" or self.tweak_data == "hud_int_pickup_asset" or self.tweak_data == "shaped_sharge" or self.tweak_data == "pickup_keycard" or self.tweak_data == "burning_money" or self.tweak_data == "stash_planks" or self.tweak_data == "stash_planks_pickup" then
return self._tweak_data.interact_distance or tweak_data.interaction.INTERACT_DISTANCE
end
return 20000 -- default is 200
end
-- MASTERRRRR INTIMIDATOR
-- Unlimited [500 actually, but who cares] & instant intimidations
if not _upgradeValueIntimidate then _upgradeValueIntimidate = PlayerManager.upgrade_value end
function PlayerManager:upgrade_value( category, upgrade, default )
if category == "player" and upgrade == "convert_enemies" then
return true
elseif category == "player" and upgrade == "player_assets_cost_multiplier" then
return true
elseif category == "player" and upgrade == "player_additional_assets" then
return true
elseif category == "player" and upgrade == "player_drill_speed_multiplier1" then
return true
elseif category == "player" and upgrade == "player_drill_speed_multiplier2" then
return true
elseif category == "player" and upgrade == "player_drill_alert" then
return true
elseif category == "player" and upgrade == "intimidate_range_mul" then
return 50
elseif category == "player" and upgrade == "player_silent_drill" then
return true
elseif category == "player" and upgrade == "drill_autorepair" then
return 1
elseif category == "player" and upgrade == "temporary_combat_medic_damage_multiplier1" then
return true
elseif category == "player" and upgrade == "doctor_bag_amount_increase1" then
return true
elseif category == "player" and upgrade == "player_pistol_revive_from_bleed_out_1" then
return true
elseif category == "player" and upgrade == "player_pistol_revive_from_bleed_out_2" then
return true
elseif category == "player" and upgrade == "temporary_no_ammo_cost_1" then
return true
elseif category == "player" and upgrade == "temporary_no_ammo_cost_2" then
return true
elseif category == "player" and upgrade == "ammo_bag_ammo_increase1" then
return true
elseif category == "player" and upgrade == "player_revive_health_boost" then
return true
elseif category == "player" and upgrade == "player_civ_calming_alerts" then
return true
elseif category == "player" and upgrade == "player_civ_intimidation_mul" then
return true
elseif category == "player" and upgrade == "player_buy_cost_multiplier_1" then
return true
elseif category == "player" and upgrade == "player_buy_cost_multiplier_2" then
return true
elseif category == "player" and upgrade == "cable_tie_quantity" then
return 5
elseif category == "player" and upgrade == "pistol_damage_multiplier" then
return true
elseif category == "player" and upgrade == "player_revive_health_boost" then
return true
elseif category == "player" and upgrade == "corpse_dispose" then
return true
elseif category == "player" and upgrade == "team_xp_multiplier" then
return true
elseif category == "player" and upgrade == "player_taser_self_shock" then
return true
elseif category == "player" and upgrade == "player_silent_kill" then
return true
elseif category == "player" and upgrade == "weapon_passive_swap_speed_multiplier_2" then
return true
elseif category == "player" and upgrade == "move_spread_multiplier" then
return 0
elseif category == "weapon" and upgrade == "weapon_clip_ammo_increase_1" then
return true
elseif category == "player" and upgrade == "player_passive_loot_drop_multiplier" then
return true
elseif category == "player" and upgrade == "player_loot_drop_multiplier_1" then
return true
elseif category == "player" and upgrade == "player_loot_drop_multiplier_2" then
return true
elseif category == "player" and upgrade == "damage_shake_multiplier" then
return 0
elseif category == "player" and upgrade == "player_damage_dampener" then
return true
elseif category == "player" and upgrade == "weapon_silencer_damage_multiplier_1" then
return true
elseif category == "player" and upgrade == "weapon_silencer_damage_multiplier_2" then
return true
elseif category == "player" and upgrade == "player_overkill_all_weapons" then
return true
elseif category == "player" and upgrade == "shotgun_enter_steelsight_speed_multiplier" then
return true
elseif category == "player" and upgrade == "smg_enter_steelsight_speed_multiplier" then
return true
elseif category == "player" and upgrade == "run_dodge_chance" then
return 1
elseif category == "player" and upgrade == "weapon_silencer_enter_steelsight_speed_multiplier" then
return true
elseif category == "player" and upgrade == "player_additional_lives_1" then
return true
elseif category == "player" and upgrade == "player_cheat_death_chance" then
return true
elseif category == "player" and upgrade == "convert_enemies_max_minions" then
return 500
elseif category == "player" and upgrade == "convert_enemies_health_multiplier" then
return 0.25
elseif category == "player" and upgrade == "convert_enemies_damage_multiplier" then
return 4.5
elseif category == "player" and upgrade == "health_multiplier" then
return 5
elseif category == "player" and upgrade == "armor_multiplier" then
return 4
elseif category == "player" and upgrade == "passive_damage_multiplier" then
return 3
elseif category == "player" and upgrade == "team_stamina_multiplier" then
return 4
elseif category == "player" and upgrade == "melee_damage_multiplier" then
return 25
elseif category == "player" and upgrade == "pick_up_ammo_multiplier" then
return 3
elseif category == "player" and upgrade == "bleed_out_health_multiplier" then
return 5
elseif category == "weapon" and upgrade == "headshot_damage_multiplier" then
return 5
else
return _upgradeValueIntimidate(self, category, upgrade, default)
end
end
if not _onIntimidated then _onIntimidated = CopLogicIdle.on_intimidated end
function CopLogicIdle.on_intimidated( data, amount, aggressor_unit )
CopLogicIdle._surrender( data, amount )
return true
end
CopLogicAttack.on_intimidated = CopLogicIdle.on_intimidated
CopLogicArrest.on_intimidated = CopLogicIdle.on_intimidated
CopLogicSniper.on_intimidated = CopLogicIdle.on_intimidated
-- Setup logic for shields to be able to be intimidated
CopBrain._logic_variants.shield.intimidated = CopLogicIntimidated
if not _onIIntimidated then _onIIntimidated = CopLogicIntimidated.on_intimidated end
function CopLogicIntimidated.on_intimidated( data, amount, aggressor_unit )
-- If shield we skip animations, go straight to conversion & spawn a new shield since it was destroyed during intimidation
if data.unit:base()._tweak_table == "shield" then
CopLogicIntimidated._do_tied( data, aggressor_unit )
CopInventory._chk_spawn_shield( data.unit:inventory(), nil )
else
_onIIntimidated(data, amount, aggressor_unit)
end
end
-- Setup a proper sniper-rifle for snipers (100% accuracy, no spread)
CopBrain._logic_variants.sniper = clone( CopBrain._logic_variants.security )
CopBrain._logic_variants.sniper.attack = CopLogicSniper
if not _onSniperEnter then _onSniperEnter = CopLogicSniper.enter end
function CopLogicSniper.enter( data, new_logic_name, enter_params )
if data.unit:brain()._logic_data and data.unit:brain()._logic_data.objective and data.unit:brain()._logic_data.objective.type == "follow" then
data.char_tweak.weapon[ data.unit:inventory():equipped_unit():base():weapon_tweak_data().usage ] = tweak_data.character.presets.weapon.sniper.m4
data.char_tweak.weapon[ data.unit:inventory():equipped_unit():base():weapon_tweak_data().usage ].spread = 0
-- Get dat 100% accuracy
for distance=1, 3 do
for interpolate=1,2 do
data.char_tweak.weapon[ data.unit:inventory():equipped_unit():base():weapon_tweak_data().usage ].FALLOFF[distance].acc[interpolate] = 1
end
end
end
_onSniperEnter(data, new_logic_name, enter_params)
end
-- MASTERRRRRR INTIMIDATOR END
BaseInteractionExt._has_required_upgrade = function(self) return true end
BaseInteractionExt.can_interact = function(self, player) return true end
-- Carry mods (throwing distance, movement speed, jumping, running)
local car_arr = { 'being', 'mega_heavy', 'heavy', 'medium', 'light', 'coke_light' }
for i, name in ipairs(car_arr) do
tweak_data.carry.types[ name ].throw_distance_multiplier = 1
tweak_data.carry.types[ name ].jump_modifier = 1
tweak_data.carry.types[ name ].can_run = true
end
-- Instant deploy for your equipped GEAR
PlayerManager.selected_equipment_deploy_timer = function(self) return 0.5 end
-- Instant interaction (except for pagers because it doesn't work so well when you are client on multiplayer)
if not _getTimer then _getTimer = BaseInteractionExt._get_timer end
function BaseInteractionExt:_get_timer()
if self.tweak_data == "corpse_alarm_pager" then
return 5 -- if pagers don't work properly (eg. when you're a client in multiplayer) use 'return _getTimer(self)' instead.
elseif self.tweak_data == "shaped_sharge" then
return 1.9 -- this is you planting on a door
elseif self.tweak_data == "revive" then
return 3 -- reviving speed unto teammates
elseif self.tweak_data == "c4_diffusible" then
return 2 -- this is you defusing c4 on rats
elseif self.tweak_data == "corpse_dispose" then
return 1.4
elseif self.tweak_data == "pick_lock_hard_no_skill" then
return 0
end
return 0.1
end
-- Perfect Pagers
function GroupAIStateBase:on_successful_alarm_pager_bluff() end
-- PLAYER BUFFS
managers.player:player_unit():character_damage():replenish()
-- Infinite saw
if not _fireSaw then _fireSaw = SawWeaponBase.fire end
function SawWeaponBase:fire( from_pos, direction, dmg_mul, shoot_player, spread_mul, autohit_mul, suppr_mul, target_unit )
local result = _fireSaw( self, from_pos, direction, dmg_mul, shoot_player, spread_mul, autohit_mul, suppr_mul, target_unit )
if managers.player:player_unit() == self._setup.user_unit then
self.set_ammo(self, 1.0)
end
return result
end
-- Infinite cable ties
function PlayerManager:remove_special( name ) end
-- No cash penalty for killing civillians
function MoneyManager.get_civilian_deduction() return 0 end
function MoneyManager.civilian_killed() return end
MoneyManager.get_civilian_deduction = function(self) return 0 end
-- Allow interaction with anything (ECM jammers, picking locks, deploying shaped charges, etc)
function BaseInteractionExt:_has_required_upgrade() return true end
-- function BaseInteractionExt:_has_required_deployable() return true end
function BaseInteractionExt:can_interact(player) return true end
function PlayerManager:has_category_upgrade( category, upgrade) return true end -- Other upgrades (eg. Joker)
function PlayerManager:carry_blocked_by_cooldown() return false end -- Remove cooldown between picking up bags
-- Infinite sentry ammo, no recoil, left the weapon spread in because sentries have a tough time killing if they shoot in one spot
function SentryGunWeapon:fire( blanks, expend_ammo )
local fire_obj = self._effect_align[ self._interleaving_fire ]
local from_pos = fire_obj:position()
local direction = fire_obj:rotation():y()
mvector3.spread( direction, tweak_data.weapon[ self._name_id ].SPREAD * self._spread_mul )
World:effect_manager():spawn( self._muzzle_effect_table[ self._interleaving_fire ] ) -- , normal = col_ray.normal } )
if self._use_shell_ejection_effect then
World:effect_manager():spawn( self._shell_ejection_effect_table )
end
local ray_res = self:_fire_raycast( from_pos, direction, blanks )
if self._alert_events and ray_res.rays then
RaycastWeaponBase._check_alert( self, ray_res.rays, from_pos, direction, self._unit )
end
return ray_res
end
-- Sentry god mode
function SentryGunDamage:damage_bullet( attack_data ) end
-- Interact through walls
function ObjectInteractionManager:interact( player )
if( alive( self._active_object ) ) then
local interacted,timer = self._active_object:interaction():interact_start( player )
if timer then
self._active_object_locked_data = true
end
return interacted or interacted == nil or false, timer, self._active_object
end
return false
end
local mvec1 = Vector3()
function ObjectInteractionManager:_update_targeted( player_pos, player_unit )
local mvec3_dis = mvector3.distance
--clean out far away objects
if( #self._close_objects > 0 ) then
for k, v in pairs( self._close_objects ) do
if( alive( v ) and v:interaction():active() ) then
if mvec3_dis( player_pos, v:interaction():interact_position() ) > v:interaction():interact_distance() then
table.remove( self._close_objects, k )
end
else
table.remove( self._close_objects, k )
end
end
end
--check for new objects
for i = 1, self._close_freq, 1 do
if( self._close_index >= self._interactive_count ) then
self._close_index = 1
else
self._close_index = self._close_index + 1
end
local obj = self._interactive_objects[ self._close_index ]
if( alive(obj) and obj:interaction():active() and not self:_in_close_list( obj ) ) then
if( mvec3_dis(player_pos, obj:interaction():interact_position()) <= obj:interaction():interact_distance() ) then
table.insert( self._close_objects, obj )
end
end
end
-- local locked = self._active_object_locked_data and alive( self._active_object )
local locked = false
if self._active_object_locked_data then
if not alive( self._active_object ) or not self._active_object:interaction():active() then
self._active_object_locked_data = nil
else
-- print( "dist", mvec3_dis(player_pos, self._active_object:interaction():interact_position()) )
-- locked = ( mvec3_dis(player_pos, self._active_object:interaction():interact_position()) - self._active_object_locked_data.distance ) < 20
locked = ( mvec3_dis(player_pos, self._active_object:interaction():interact_position()) <= self._active_object:interaction():interact_distance() )
end
end
if locked then
return
end
local last_active = self._active_object
local blocked = player_unit:movement():object_interaction_blocked()
if( #self._close_objects > 0 ) and not blocked then
--find the one the player is looking at
local active_obj = nil
local current_dot = 0.9
local player_fwd = player_unit:camera():forward()
local camera_pos = player_unit:camera():position()
for k, v in pairs( self._close_objects ) do
if( alive( v ) ) then
mvector3.set( mvec1, v:interaction():interact_position() )
mvector3.subtract( mvec1, camera_pos )
mvector3.normalize( mvec1 )
local dot = mvector3.dot( player_fwd, mvec1 )
if( dot > current_dot ) then
current_dot = dot
active_obj = v
end
end
end
if( active_obj and self._active_object ~= active_obj ) then
if alive( self._active_object ) then
self._active_object:interaction():unselect()
end
if not active_obj:interaction():selected( player_unit ) then
active_obj = nil
end
end
self._active_object = active_obj
else
self._active_object = nil
end
--unselect the last one
if( alive( last_active ) ) then
if( not self._active_object ) then
self._active_object = nil
last_active:interaction():unselect()
end
end
end
any quick pointers? Or i'll have to just quit -_-