# Blender Text Editor: set WEAPON, then Run Script. No animation keyframes are changed.
import bpy

WEAPON = "CHANGE_ME"  # m4 / rm277 / m590a1 / cheytac_m200 / mg338 / staccato_2011_p
CHANGES = {'m4': {'aim_down_settle': 'ads_down_settle', 'aim_fire': 'fire_ads', 'aim_in': 'ads_up', 'aim_out': 'ads_down', 'aim_reload': 'reload_ads', 'aim_reload_empty': 'reload_empty_ads', 'aim_reload_empty_xmaglrg': 'reload_empty_xmaglrg_ads', 'aim_reload_xmaglrg': 'reload_xmaglrg_ads', 'aim_switch_to_auto': 'selectsemi_off_ads', 'aim_switch_to_semi': 'selectsemi_on_ads', 'draw': 'raise', 'draw_first': 'raise_first', 'holster': 'drop', 'static_idle': 'idle', 'switch_to_auto': 'selectsemi_off', 'switch_to_semi': 'selectsemi_on'}, 'rm277': {'aim_fire': 'fire_ads', 'aim_reload': 'reload_ads', 'aim_reload_drummag': 'reload_drum_ads', 'aim_reload_empty': 'reload_empty_ads', 'aim_reload_empty_drummag': 'reload_empty_drum_ads', 'aim_switch_to_auto': 'selectsemi_off_ads', 'aim_switch_to_semi': 'selectsemi_on_ads', 'bullet_additive_drummag': 'bullet_additive_drum', 'draw': 'raise', 'draw_first': 'raise_first', 'holster': 'drop', 'inspect_drummag': 'inspect_drum', 'inspect_empty_drummag': 'inspect_empty_drum', 'reload_drummag': 'reload_drum', 'reload_empty_drummag': 'reload_empty_drum', 'static_idle': 'idle', 'switch_to_auto': 'selectsemi_off', 'switch_to_semi': 'selectsemi_on', 'aim_down_settle': 'down_settle', 'aim_in': 'ads_up', 'aim_out': 'ads_down'}, 'm590a1': {'aim_fire': 'fire_ads', 'aim_fire_rechamber': 'fire_rechamber_ads', 'aim_in': 'ads_up', 'aim_out': 'ads_down', 'aim_reload_empty_chamber_end': 'reload_empty_chamber_end_ads', 'aim_reload_empty_chamber_start': 'reload_empty_chamber_start_ads', 'aim_reload_empty_start': 'reload_empty_start_ads', 'aim_reload_end': 'reload_end_ads', 'aim_reload_loop': 'reload_loop_ads', 'aim_reload_start': 'reload_start_ads', 'aim_up_additive': 'ads_up_additive', 'draw': 'raise', 'draw_first': 'raise_first', 'empty_additive': 'idle_empty_additive', 'holster': 'drop', 'melee_fatal_01': 'gun_butt_fatal_01_barmini', 'melee_fatal_02': 'gun_butt_fatal_02_barmini', 'melee_hit_01': 'gun_butt_hit_01_barmini', 'melee_hit_02': 'gun_butt_hit_02_barmini', 'melee_hit_03': 'gun_butt_hit_03_barmini', 'melee_miss_01': 'gun_butt_miss_01_barmini', 'melee_miss_02': 'gun_butt_miss_02_barmini', 'melee_miss_03': 'gun_butt_miss_03_barmini', 'static_idle': 'idle', 'super_sprint_loop': 'super_sprint_loop_proto'}, 'cheytac_m200': {'aim_down_settle': 'ads_down_settle', 'aim_fire': 'fire_ads', 'aim_fire_rechamber': 'fire_rechamber_ads', 'aim_in': 'ads_up', 'aim_out': 'ads_down', 'aim_reload': 'reload_ads', 'aim_reload_empty': 'reload_empty_ads', 'aim_up_additive': 'ads_up_additive', 'bullet_additive': 'bullet_additive_5', 'draw': 'raise', 'draw_first': 'raise_first', 'holster': 'drop', 'static_idle': 'idle', 'super_sprint_loop': 'super_sprint_loop_proto'}, 'mg338': {'aim_down_settle': 'ads_down_settle', 'aim_fire': 'fire_ads', 'aim_in': 'ads_up', 'aim_out': 'ads_down', 'bullet_additive': 'bullets', 'draw': 'raise', 'draw_first': 'raise_first', 'empty_additive': 'idle_empty_additive', 'fire_last_ads': 'fire_last_ads', 'holster': 'drop', 'static_idle': 'idle', 'super_sprint_loop': 'super_sprint_loop_proto', 'ads_fire': 'fire_ads', 'ads_fire_last': 'fire_last_ads'}, 'staccato_2011_p': {'aim_down_settle': 'ads_down_settle', 'aim_fire': 'fire_ads', 'aim_in': 'ads_up', 'aim_out': 'ads_down', 'aim_reload': 'reload_ads', 'aim_reload_empty': 'reload_empty_ads', 'aim_reload_empty_barcomp': 'reload_empty_barcomp_ads', 'aim_up_additive': 'ads_up_additive', 'draw': 'raise', 'draw_first': 'raise_first', 'draw_first_barcomp': 'raise_first_barcomp', 'fire_last_ads': 'fire_last_ads', 'holster': 'drop', 'holster_empty': 'drop_empty', 'melee_fatal_01': 'melee_fatal', 'static_idle': 'idle', 'super_sprint_loop': 'super_sprint_loop_proto', 'ads_fire': 'fire_ads', 'ads_reload': 'reload_ads', 'ads_reload_empty': 'reload_empty_ads', 'ads_reload_empty_barcomp': 'reload_empty_barcomp_ads', 'ads_fire_last': 'fire_last_ads'}}

if WEAPON not in CHANGES:
    raise RuntimeError("Set WEAPON to the weapon whose .blend file is currently open.")
pending = [(action, CHANGES[WEAPON][action.name]) for action in bpy.data.actions if action.name in CHANGES[WEAPON] and CHANGES[WEAPON][action.name] != action.name]
conflicts = [name for action, name in pending if bpy.data.actions.get(name) is not None and bpy.data.actions.get(name) is not action]
targets = [name for action, name in pending]
conflicts += sorted({name for name in targets if targets.count(name) > 1})
if conflicts:
    raise RuntimeError("Rename cancelled: destination Actions already exist: " + ", ".join(conflicts))
for action, name in pending:
    action.name = name
print("Renamed", len(pending), "Actions for", WEAPON, "; save the .blend file after checking.")
