1. Introduction
Alright, this OSP will be massive. The modding scene of Warband seems to have gone pretty extinct as of late, so I guess I may give people some goodies before I leave it altogether (as a New Year 2022 present; happy new year!). Before getting rid of all Warband-related stuff, I think it is nice to salvage some stuff I deem worthy enough to share and which will not disrupt balance in MP. Here is a bundle of MP scripts related to one another that I wrote for my mod Varena NeoGK (https://forums.taleworlds.com/index.php?threads/varena-neogk.447294/); they deal with killstreaks and statistics in general. Maybe someone will find them useful, who knows?
To know what I am talking about, here are some pictures of:
2. License
I created the scripts all alone from scratch, therefore giving me credit is mandatory. All adjustments or big modifications may be done at one's discretion, whatever they want to do with the scripts. They may (they work perfectly in Native MP) exhibit some worse scripting than if a professional wrote them, therefore they are provided as they are. I do not want to receive suggestions or improvement solutions regarding them, so respect that please.
3. The scripts and their installation and properties
Alright, this OSP will be massive. The modding scene of Warband seems to have gone pretty extinct as of late, so I guess I may give people some goodies before I leave it altogether (as a New Year 2022 present; happy new year!). Before getting rid of all Warband-related stuff, I think it is nice to salvage some stuff I deem worthy enough to share and which will not disrupt balance in MP. Here is a bundle of MP scripts related to one another that I wrote for my mod Varena NeoGK (https://forums.taleworlds.com/index.php?threads/varena-neogk.447294/); they deal with killstreaks and statistics in general. Maybe someone will find them useful, who knows?
To know what I am talking about, here are some pictures of:
- Killfeed killstreak messages
- Session statistics presentation
- Lifetime statistics presentation
2. License
I created the scripts all alone from scratch, therefore giving me credit is mandatory. All adjustments or big modifications may be done at one's discretion, whatever they want to do with the scripts. They may (they work perfectly in Native MP) exhibit some worse scripting than if a professional wrote them, therefore they are provided as they are. I do not want to receive suggestions or improvement solutions regarding them, so respect that please.
3. The scripts and their installation and properties
- The below script's description from Varena NeoGK's thread linked above: Lifetime statistics conveniently showing important information during gameplay (kills are the only thing not present across all gamemodes - disabled in Invasion for obvious reasons - slaying bots is easy and would spam the killfeed/ display inflated amount of kills).
Python:
("lifetime_statistics", prsntf_read_only|prsntf_manual_end_only, 0, [
(ti_on_presentation_load,
[(presentation_set_duration, 99999),
(set_fixed_point_multiplier, 1000),
(create_mesh_overlay, reg0, "mesh_white_plane"),
(overlay_set_color, reg0, 0x000000),
(overlay_set_alpha, reg0, 0x35),
(position_set_x, pos1, 10),
(position_set_y, pos1, 530),
(overlay_set_position, reg0, pos1),
(position_set_x, pos1, 12150),
(position_set_y, pos1, 5030),
(overlay_set_size, reg0, pos1),
(create_mesh_overlay, reg0, "mesh_white_plane"),
(overlay_set_color, reg0, 0xE07910),
(overlay_set_alpha, reg0, 0xE3),
(position_set_x, pos1, 10),
(position_set_y, pos1, 610),
(overlay_set_position, reg0, pos1),
(position_set_x, pos1, 12150),
(position_set_y, pos1, 50),
(overlay_set_size, reg0, pos1),
(create_text_overlay, "$g_presentation_obj_lifetime_statistics_1", "str_empty_string", tf_with_outline),
(overlay_set_color, "$g_presentation_obj_lifetime_statistics_1", 0xE07910),
(position_set_x, pos1, 5),
(position_set_y, pos1, 610),
(overlay_set_position, "$g_presentation_obj_lifetime_statistics_1", pos1),
(position_set_x, pos1, 700),
(position_set_y, pos1, 700),
(overlay_set_size, "$g_presentation_obj_lifetime_statistics_1", pos1),
(create_text_overlay, "$g_presentation_obj_lifetime_statistics_2", "str_empty_string", tf_with_outline),
(overlay_set_color, "$g_presentation_obj_lifetime_statistics_2", 0xFFFFFF),
(position_set_x, pos1, 5),
(position_set_y, pos1, 590),
(overlay_set_position, "$g_presentation_obj_lifetime_statistics_2", pos1),
(position_set_x, pos1, 700),
(position_set_y, pos1, 700),
(overlay_set_size, "$g_presentation_obj_lifetime_statistics_2", pos1),
(create_text_overlay, "$g_presentation_obj_lifetime_statistics_3", "str_empty_string", tf_with_outline),
(overlay_set_color, "$g_presentation_obj_lifetime_statistics_3", 0xFFFFFF),
(position_set_x, pos1, 5),
(position_set_y, pos1, 570),
(overlay_set_position, "$g_presentation_obj_lifetime_statistics_3", pos1),
(position_set_x, pos1, 700),
(position_set_y, pos1, 700),
(overlay_set_size, "$g_presentation_obj_lifetime_statistics_3", pos1),
(create_text_overlay, "$g_presentation_obj_lifetime_statistics_4", "str_empty_string", tf_with_outline),
(overlay_set_color, "$g_presentation_obj_lifetime_statistics_4", 0xFFFFFF),
(position_set_x, pos1, 5),
(position_set_y, pos1, 550),
(overlay_set_position, "$g_presentation_obj_lifetime_statistics_4", pos1),
(position_set_x, pos1, 700),
(position_set_y, pos1, 700),
(overlay_set_size, "$g_presentation_obj_lifetime_statistics_4", pos1),
(create_text_overlay, "$g_presentation_obj_lifetime_statistics_5", "str_empty_string", tf_with_outline),
(overlay_set_color, "$g_presentation_obj_lifetime_statistics_5", 0xFFFFFF),
(position_set_x, pos1, 5),
(position_set_y, pos1, 530),
(overlay_set_position, "$g_presentation_obj_lifetime_statistics_5", pos1),
(position_set_x, pos1, 700),
(position_set_y, pos1, 700),
(overlay_set_size, "$g_presentation_obj_lifetime_statistics_5", pos1),
]),
(ti_on_presentation_run,
[
(try_begin),
(eq, "$g_display_lifetimestatistics", 0), #another presentation may be made to handle when this one is displayed or not
(presentation_set_duration, 0),
(else_try),
(multiplayer_get_my_player, ":my_pl"),
(multiplayer_get_my_team, ":my_team"),
(multiplayer_get_my_troop, ":my_tr"),
(gt, ":my_pl", -1),
(str_store_string, s2, "@Lifetime statistics"),
(overlay_set_text, "$g_presentation_obj_lifetime_statistics_1", s2),
(try_begin),
(is_between, ":my_tr", multiplayer_troops_begin, multiplayer_troops_end),
(str_store_troop_name, s1, ":my_tr"), #troop
(else_try),
(this_or_next|eq, ":my_team", multi_team_spectator),
(eq, ":my_team", multi_team_unassigned),
(str_store_string, s1, "@Spectator"), #including spectators as well
(else_try),
(eq, ":my_tr", -1),
(str_store_string, s1, "@Not decided yet"), #including state change after choosing a faction
(try_end),
(str_store_string, s2, "@Name of the troop: {s1}"),
(overlay_set_text, "$g_presentation_obj_lifetime_statistics_2", s2),
(player_get_ping, reg1, ":my_pl"), #ping
(str_store_string, s2, "@Ping (miliseconds): {reg1}"),
(overlay_set_text, "$g_presentation_obj_lifetime_statistics_3", s2),
(assign, reg1, 0),
(assign, ":time", "$g_lifetime_statistics_time_alive"), #time since last death in minutes (including seconds like in session statistics would be too much)
(val_div, ":time", 60),
(assign, reg1, ":time"),
(str_store_string, s2, "@Time survived (minutes): {reg1}"),
(overlay_set_text, "$g_presentation_obj_lifetime_statistics_4", s2),
(assign, reg1, 0),
(try_begin),
(eq, "$g_multiplayer_game_type", multiplayer_game_type_captain_coop),
(str_store_string, s2, "@Lifetime kills: not counted in Invasion mode"), #self-explanatory
(else_try),
(assign, reg1, "$g_player_controlled_agent_kill_count"),
(str_store_string, s2, "@Lifetime kills: {reg1}"),
(try_end),
(overlay_set_text, "$g_presentation_obj_lifetime_statistics_5", s2),
(try_end),
]),
]),
- The below scripts' description from Varena NeoGK's thread linked above: Killfeed messages upon being spawned, slain and killing others (the latter get colored as killstreak progresses; teamkills count as well - disabled in Invasion for obvious reasons - slaying bots is easy and would spam the killfeed/ display inflated amount of kills).
Python:
session_statistics_agent_dead = (ti_on_agent_killed_or_wounded, 0, 0, [],
[
(neg|multiplayer_is_dedicated_server),
(store_trigger_param_1, ":dead_agent_no"),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_captain_coop), #invasion-forbidden
(multiplayer_get_my_player, ":my_player_no"),
(player_get_agent_id, ":player_agent", ":my_player_no"),
(eq, ":dead_agent_no", ":player_agent"),
(multiplayer_get_my_troop, ":my_troop_no"),
(multiplayer_get_my_team, ":my_team"),
(team_get_faction, ":faction", ":my_team"),
(is_between, ":my_troop_no", multiplayer_troops_begin, multiplayer_troops_end),
(call_script, "script_multiplayer_get_troop_class", ":my_troop_no"),
(assign, ":class", reg0),
(try_begin),
(agent_is_active, ":dead_agent_no"),
(try_begin),
(le, ":class", multi_troop_class_spearman),
(val_add, "$g_session_statistics_death_count_infantry", 1),
(else_try),
(eq, ":class", multi_troop_class_cavalry),
(val_add, "$g_session_statistics_death_count_cavalry", 1),
(else_try),
(ge, ":class", multi_troop_class_archer),
(val_add, "$g_session_statistics_death_count_ranged", 1),
(try_end),
(try_end),
(try_begin),
(agent_is_active, ":dead_agent_no"),
(try_begin),
(eq, ":faction", "fac_kingdom_1"),
(val_add, "$g_session_statistics_death_count_swadians", 1),
(else_try),
(eq, ":faction", "fac_kingdom_2"),
(val_add, "$g_session_statistics_death_count_vaegirs", 1),
(else_try),
(eq, ":faction", "fac_kingdom_3"),
(val_add, "$g_session_statistics_death_count_khergits", 1),
(else_try),
(eq, ":faction", "fac_kingdom_4"),
(val_add, "$g_session_statistics_death_count_nords", 1),
(else_try),
(eq, ":faction", "fac_kingdom_5"),
(val_add, "$g_session_statistics_death_count_rhodoks", 1),
(else_try),
(eq, ":faction", "fac_kingdom_6"),
(val_add, "$g_session_statistics_death_count_sarranids", 1),
(try_end),
(try_end),
])
session_statistics_agent_dead_store_kill_count = (ti_on_agent_killed_or_wounded, 0, 0, [],
[
(neg|multiplayer_is_dedicated_server),
(store_trigger_param_1, ":slain_agent_no"),
(store_trigger_param_2, ":attacker_agent_no"),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_captain_coop), #invasion-forbidden
#the below is for making killstreaks be not counted in spec mode
(multiplayer_get_my_team, ":my_team"), #printing messages with 1 kill when not alive - fix
(neq, ":my_team", multi_team_spectator),
(neq, ":my_team", multi_team_unassigned),
(gt, ":slain_agent_no", -1),
(gt, ":attacker_agent_no", -1),
(agent_is_human, ":slain_agent_no"),
(agent_is_human, ":attacker_agent_no"),
(multiplayer_get_my_player, ":my_player_no"),
(player_get_agent_id, ":player_agent", ":my_player_no"),
(eq, ":attacker_agent_no", ":player_agent"),
(neq, ":slain_agent_no", ":player_agent"),
(agent_get_team, ":team_of_a_victim", ":slain_agent_no"),
(multiplayer_get_my_troop, ":my_troop_no"),
(multiplayer_get_my_team, ":my_team"),
(team_get_faction, ":faction", ":my_team"),
(is_between, ":my_troop_no", multiplayer_troops_begin, multiplayer_troops_end),
(call_script, "script_multiplayer_get_troop_class", ":my_troop_no"),
(assign, ":class", reg0),
(try_begin),
(agent_is_active, ":slain_agent_no"),
(try_begin),
(this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch), #in DM and Duel everyone is in their own team even though factions are shared, therefore it must have been reflected here
(eq, "$g_multiplayer_game_type", multiplayer_game_type_duel),
(try_begin),
(le, ":class", multi_troop_class_spearman),
(val_add, "$g_session_statistics_kill_count_infantry", 1),
(else_try),
(eq, ":class", multi_troop_class_cavalry),
(val_add, "$g_session_statistics_kill_count_cavalry", 1),
(else_try),
(ge, ":class", multi_troop_class_archer),
(val_add, "$g_session_statistics_kill_count_ranged", 1),
(try_end),
(else_try),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_duel),
(try_begin),
(neq, ":my_team", ":team_of_a_victim"),
(try_begin),
(le, ":class", multi_troop_class_spearman),
(val_add, "$g_session_statistics_kill_count_infantry", 1),
(else_try),
(eq, ":class", multi_troop_class_cavalry),
(val_add, "$g_session_statistics_kill_count_cavalry", 1),
(else_try),
(ge, ":class", multi_troop_class_archer),
(val_add, "$g_session_statistics_kill_count_ranged", 1),
(try_end),
(else_try),
(eq, ":my_team", ":team_of_a_victim"),
(try_begin),
(le, ":class", multi_troop_class_spearman),
(val_sub, "$g_session_statistics_kill_count_infantry", 1),
(else_try),
(eq, ":class", multi_troop_class_cavalry),
(val_sub, "$g_session_statistics_kill_count_cavalry", 1),
(else_try),
(ge, ":class", multi_troop_class_archer),
(val_sub, "$g_session_statistics_kill_count_ranged", 1),
(try_end),
(try_end),
(try_end),
(try_end),
(try_begin),
(agent_is_active, ":slain_agent_no"),
(try_begin),
(this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
(eq, "$g_multiplayer_game_type", multiplayer_game_type_duel),
(try_begin),
(eq, ":faction", "fac_kingdom_1"),
(val_add, "$g_session_statistics_kill_count_swadians", 1),
(else_try),
(eq, ":faction", "fac_kingdom_2"),
(val_add, "$g_session_statistics_kill_count_vaegirs", 1),
(else_try),
(eq, ":faction", "fac_kingdom_3"),
(val_add, "$g_session_statistics_kill_count_khergits", 1),
(else_try),
(eq, ":faction", "fac_kingdom_4"),
(val_add, "$g_session_statistics_kill_count_nords", 1),
(else_try),
(eq, ":faction", "fac_kingdom_5"),
(val_add, "$g_session_statistics_kill_count_rhodoks", 1),
(else_try),
(eq, ":faction", "fac_kingdom_6"),
(val_add, "$g_session_statistics_kill_count_sarranids", 1),
(try_end),
(else_try),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_duel),
(try_begin),
(neq, ":my_team", ":team_of_a_victim"),
(try_begin),
(eq, ":faction", "fac_kingdom_1"),
(val_add, "$g_session_statistics_kill_count_swadians", 1),
(else_try),
(eq, ":faction", "fac_kingdom_2"),
(val_add, "$g_session_statistics_kill_count_vaegirs", 1),
(else_try),
(eq, ":faction", "fac_kingdom_3"),
(val_add, "$g_session_statistics_kill_count_khergits", 1),
(else_try),
(eq, ":faction", "fac_kingdom_4"),
(val_add, "$g_session_statistics_kill_count_nords", 1),
(else_try),
(eq, ":faction", "fac_kingdom_5"),
(val_add, "$g_session_statistics_kill_count_rhodoks", 1),
(else_try),
(eq, ":faction", "fac_kingdom_6"),
(val_add, "$g_session_statistics_kill_count_sarranids", 1),
(try_end),
(else_try),
(eq, ":my_team", ":team_of_a_victim"),
(try_begin),
(eq, ":faction", "fac_kingdom_1"),
(val_sub, "$g_session_statistics_kill_count_swadians", 1),
(else_try),
(eq, ":faction", "fac_kingdom_2"),
(val_sub, "$g_session_statistics_kill_count_vaegirs", 1),
(else_try),
(eq, ":faction", "fac_kingdom_3"),
(val_sub, "$g_session_statistics_kill_count_khergits", 1),
(else_try),
(eq, ":faction", "fac_kingdom_4"),
(val_sub, "$g_session_statistics_kill_count_nords", 1),
(else_try),
(eq, ":faction", "fac_kingdom_5"),
(val_sub, "$g_session_statistics_kill_count_rhodoks", 1),
(else_try),
(eq, ":faction", "fac_kingdom_6"),
(val_sub, "$g_session_statistics_kill_count_sarranids", 1),
(try_end),
(try_end),
(try_end),
(try_end),
])
session_statistics_time_alive = (1, 0, 0, [],
[
(neg|multiplayer_is_dedicated_server),
(multiplayer_get_my_player, ":my_player_no"),
(player_get_agent_id, ":player_agent", ":my_player_no"),
(multiplayer_get_my_troop, ":my_troop_no"),
(multiplayer_get_my_team, ":my_team"),
(team_get_faction, ":faction", ":my_team"),
(is_between, ":my_troop_no", multiplayer_troops_begin, multiplayer_troops_end),
(call_script, "script_multiplayer_get_troop_class", ":my_troop_no"),
(assign, ":class", reg0),
(try_begin),
(agent_is_active, ":player_agent"),
(agent_is_alive, ":player_agent"),
(try_begin),
(le, ":class", multi_troop_class_spearman),
(val_add, "$g_session_statistics_time_alive_infantry", 1), #+1 sec
(else_try),
(eq, ":class", multi_troop_class_cavalry),
(val_add, "$g_session_statistics_time_alive_cavalry", 1), #+1 sec
(else_try),
(ge, ":class", multi_troop_class_archer),
(val_add, "$g_session_statistics_time_alive_ranged", 1), #+1 sec
(try_end),
(try_end),
(try_begin),
(agent_is_active, ":player_agent"),
(agent_is_alive, ":player_agent"),
(try_begin),
(eq, ":faction", "fac_kingdom_1"),
(val_add, "$g_session_statistics_time_alive_swadians", 1), #+1 sec
(else_try),
(eq, ":faction", "fac_kingdom_2"),
(val_add, "$g_session_statistics_time_alive_vaegirs", 1), #+1 sec
(else_try),
(eq, ":faction", "fac_kingdom_3"),
(val_add, "$g_session_statistics_time_alive_khergits", 1), #+1 sec
(else_try),
(eq, ":faction", "fac_kingdom_4"),
(val_add, "$g_session_statistics_time_alive_nords", 1), #+1 sec
(else_try),
(eq, ":faction", "fac_kingdom_5"),
(val_add, "$g_session_statistics_time_alive_rhodoks", 1), #+1 sec
(else_try),
(eq, ":faction", "fac_kingdom_6"),
(val_add, "$g_session_statistics_time_alive_sarranids", 1), #+1 sec
(try_end),
(try_end),
])
lifetime_statistics_time_alive = (1, 0, 0, [],
[
(neg|multiplayer_is_dedicated_server),
(multiplayer_get_my_player, ":my_player_no"),
(player_get_agent_id, ":player_agent", ":my_player_no"),
(try_begin),
(agent_is_active, ":player_agent"),
(agent_is_alive, ":player_agent"),
(val_add, "$g_lifetime_statistics_time_alive", 1), #+1 sec
(try_end),
])
lifetime_statistics_agent_alive = (ti_on_agent_spawn, 0, 0, [],
[
(neg|multiplayer_is_dedicated_server),
(store_trigger_param_1, ":alive_agent_no"),
(multiplayer_get_my_player, ":my_player_no"),
(player_get_agent_id, ":player_agent", ":my_player_no"),
(eq, ":alive_agent_no", ":player_agent"),
(display_message, "@You have been spawned",0x4D9617),
(assign, "$g_player_controlled_agent_kill_count", 0), #setting values to 0 for the duration of player's life upon spawn
(assign, "$g_lifetime_statistics_time_alive", 0),
])
lifetime_statistics_agent_dead = (ti_on_agent_killed_or_wounded, 0, 0, [],
[
(neg|multiplayer_is_dedicated_server),
(store_trigger_param_1, ":dead_agent_no"),
(multiplayer_get_my_player, ":my_player_no"),
(player_get_agent_id, ":player_agent", ":my_player_no"),
(eq, ":dead_agent_no", ":player_agent"),
(display_message, "@You have been slain",0xC3342C),
])
lifetime_statistics_agent_dead_store_kill_count = (ti_on_agent_killed_or_wounded, 0, 0, [],
[
(neg|multiplayer_is_dedicated_server),
(store_trigger_param_1, ":slain_agent_no"),
(store_trigger_param_2, ":attacker_agent_no"),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_captain_coop), #invasion-forbidden
#the below is for making killstreaks be not counted in spec mode - refer to this if it hasn't been fixed already
(multiplayer_get_my_team, ":my_team"), #printing messages with 1 kill when not alive - fix
(neq, ":my_team", multi_team_spectator),
(neq, ":my_team", multi_team_unassigned),
(gt, ":slain_agent_no", -1),
(gt, ":attacker_agent_no", -1),
(agent_is_human, ":slain_agent_no"),
(agent_is_human, ":attacker_agent_no"),
(multiplayer_get_my_player, ":my_player_no"),
(player_get_agent_id, ":player_agent", ":my_player_no"),
(eq, ":attacker_agent_no", ":player_agent"),
(neq, ":slain_agent_no", ":player_agent"),
(agent_get_team, ":team_of_a_victim", ":slain_agent_no"),
(try_begin),
(agent_is_active, ":slain_agent_no"),
(try_begin),
(this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
(eq, "$g_multiplayer_game_type", multiplayer_game_type_duel),
(val_add, "$g_player_controlled_agent_kill_count", 1),
(else_try),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
(neq, "$g_multiplayer_game_type", multiplayer_game_type_duel),
(try_begin),
(neq, ":my_team", ":team_of_a_victim"),
(val_add, "$g_player_controlled_agent_kill_count", 1),
(else_try),
(eq, ":my_team", ":team_of_a_victim"),
(val_sub, "$g_player_controlled_agent_kill_count", 1),
(try_end),
(try_end),
(try_end),
(assign, reg3, "$g_player_controlled_agent_kill_count"),
#the below options include different stages of killstreak as well as distinction between singular and plural forms paired with values
(try_begin),
(le, reg3, -2),
(display_message, "@{reg3} kills so far",0xEE1B5B),
(else_try),
(eq, reg3, -1),
(display_message, "@{reg3} kill so far",0xB4006E),
(else_try),
(eq, reg3, 0),
(display_message, "@{reg3} kills so far",0xB4006E),
(else_try),
(eq, reg3, 1),
(display_message, "@{reg3} kill so far",0xB7DC18),
(else_try),
(is_between, reg3, 2, 6),
(display_message, "@{reg3} kills so far",0xB7DC18),
(else_try),
(is_between, reg3, 6, 11),
(display_message, "@{reg3} kills so far",0xDCBD18),
(else_try),
(is_between, reg3, 11, 16),
(display_message, "@{reg3} kills so far",0xDC7018),
(else_try),
(ge, reg3, 16),
(display_message, "@{reg3} kills so far",0xDC3918),
(try_end),
])