@@ -9060,6 +9060,7 @@
(try_begin),
(store_script_param, ":value", 3),
(store_script_param, ":value_2", 4),
(store_script_param, ":value_3", 5),
#validity check
(eq, "$g_multiplayer_poll_running", 0),
(store_mission_timer_a, ":mission_timer"),
@@ -9070,6 +9071,8 @@
(eq, ":value", 1), # kicking a player
(try_begin),
(eq, "$g_multiplayer_kick_voteable", 1),
(this_or_next|neg|multiplayer_is_dedicated_server), #client-servers see all players as admin
(neg|player_is_admin, ":value_2"),
(player_is_active, ":value_2"),
(assign, ":continue", 1),
(try_end),
@@ -9077,6 +9080,8 @@
(eq, ":value", 2), # banning a player
(try_begin),
(eq, "$g_multiplayer_ban_voteable", 1),
(this_or_next|neg|multiplayer_is_dedicated_server), #client-servers see all players as admin
(neg|player_is_admin, ":value_2"),
(player_is_active, ":value_2"),
(save_ban_info_of_player, ":value_2"),
(assign, ":continue", 1),
@@ -9098,7 +9103,6 @@
(eq, ":value", 3), #vote for map and factions
(try_begin),
(eq, "$g_multiplayer_factions_voteable", 1),
(store_script_param, ":value_3", 5),
(store_script_param, ":value_4", 6),
(call_script, "script_multiplayer_fill_map_game_types", "$g_multiplayer_game_type"),
(assign, ":num_maps", reg0),
@@ -9118,11 +9122,16 @@
(try_end),
(else_try),
(eq, ":value", 4), #vote for number of bots
(store_script_param, ":value_3", 5),
(store_add, ":upper_limit", "$g_multiplayer_num_bots_voteable", 1),
(is_between, ":value_2", 0, ":upper_limit"),
(is_between, ":value_3", 0, ":upper_limit"),
(assign, ":continue", 1),
(else_try),
(eq, ":value", 5), #admin custom poll
(player_is_admin, ":player_no"),
(neg|str_is_empty, s37),
(assign, ":value_2", -1),
(assign, ":continue", 1),
(try_end),
(eq, ":continue", 1),
#condition checks are done
@@ -9130,10 +9139,12 @@
(try_begin),
(eq, ":value", 1), #kicking a player
(str_store_player_username, s1, ":value_2"),
(call_script, "script_multiplayer_get_reason_string", ":value_3"),
(server_add_message_to_log, "str_poll_kick_player_s1_by_s0"),
(else_try),
(eq, ":value", 2), #banning a player
(str_store_player_username, s1, ":value_2"),
(call_script, "script_multiplayer_get_reason_string", ":value_3"),
(server_add_message_to_log, "str_poll_ban_player_s1_by_s0"),
(else_try),
(eq, ":value", 0), #vote for map
@@ -9160,30 +9171,56 @@
(assign, "$g_multiplayer_poll_num_sent", 0),
(assign, "$g_multiplayer_poll_yes_count", 0),
(assign, "$g_multiplayer_poll_no_count", 0),
(assign, "$g_multiplayer_poll_admin_override", 0),
(assign, "$g_multiplayer_poll_to_show", ":value"),
(assign, "$g_multiplayer_poll_value_to_show", ":value_2"),
(try_begin),
(eq, ":value", 3),
(assign, "$g_multiplayer_poll_value_2_to_show", ":value_3"),
(assign, "$g_multiplayer_poll_value_3_to_show", ":value_4"),
(try_begin), #store requester in upper bits of faction 1
(is_between, ":player_no", 1, multiplayer_max_possible_player_id),
(store_mul, "$g_multiplayer_poll_value_2_to_show", ":player_no", multiplayer_pack_message_shift_size),
(else_try),
(assign, "$g_multiplayer_poll_value_2_to_show", 0),
(try_end),
(store_add, "$g_multiplayer_poll_value_2_to_show", ":value_3", "$g_multiplayer_poll_value_2_to_show"), #faction 1
(assign, "$g_multiplayer_poll_value_3_to_show", ":value_4"), #faction 2
(else_try),
(eq, ":value", 4),
(assign, "$g_multiplayer_poll_value_2_to_show", ":value_3"),
(assign, "$g_multiplayer_poll_value_3_to_show", -1),
(assign, "$g_multiplayer_poll_value_2_to_show", ":value_3"), #bots team 2
(assign, "$g_multiplayer_poll_value_3_to_show", ":player_no"), #requester
(else_try),
(eq, ":value", 1),
(assign, "$g_multiplayer_poll_value_2_to_show", ":player_no"), #requester
(assign, "$g_multiplayer_poll_value_3_to_show", ":value_3"), #reason
(else_try),
(eq, ":value", 2),
(assign, "$g_multiplayer_poll_value_2_to_show", ":player_no"), #requester
(assign, "$g_multiplayer_poll_value_3_to_show", ":value_3"), #reason
(else_try),
(assign, "$g_multiplayer_poll_value_2_to_show", -1),
(assign, "$g_multiplayer_poll_value_2_to_show", ":player_no"), #requester
(assign, "$g_multiplayer_poll_value_3_to_show", -1),
(try_end),
(store_add, ":poll_disable_until", ":mission_timer", multiplayer_poll_disable_period),
(player_set_slot, ":player_no", slot_player_poll_disabled_until_time, ":poll_disable_until"),
(try_begin),
(neg|player_is_admin, ":player_no"), #only limit non admin polling
(store_add, ":poll_disable_until", ":mission_timer", multiplayer_poll_disable_period),
(player_set_slot, ":player_no", slot_player_poll_disabled_until_time, ":poll_disable_until"),
(try_end),
(store_add, "$g_multiplayer_poll_end_time", ":mission_timer", 60),
(get_max_players, ":num_players"),
(try_for_range, ":cur_player", 0, ":num_players"),
(player_is_active, ":cur_player"),
(player_set_slot, ":cur_player", slot_player_can_answer_poll, 1),
(val_add, "$g_multiplayer_poll_num_sent", 1),
(try_begin),
(eq, ":value", 5), #send custom poll question
(multiplayer_send_string_to_player, ":cur_player", multiplayer_event_return_admin_poll_question, s37),
(try_end),
(multiplayer_send_4_int_to_player, ":cur_player", multiplayer_event_ask_for_poll, "$g_multiplayer_poll_to_show", "$g_multiplayer_poll_value_to_show", "$g_multiplayer_poll_value_2_to_show", "$g_multiplayer_poll_value_3_to_show"),
(try_end),
(try_begin),
(eq, ":value", 3), #convert back to faction 1 only, for other scripts
(store_mod, "$g_multiplayer_poll_value_2_to_show", "$g_multiplayer_poll_value_2_to_show", multiplayer_pack_message_shift_size),
(try_end),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_answer_to_poll),
@@ -9191,16 +9228,30 @@
(store_script_param, ":value", 3),
#validity check
(eq, "$g_multiplayer_poll_running", 1),
(is_between, ":value", 0, 2),
(is_between, ":value", 0, 3),
(player_slot_eq, ":player_no", slot_player_can_answer_poll, 1),
#condition checks are done
(player_set_slot, ":player_no", slot_player_can_answer_poll, 0),
(try_begin),
(eq, ":value", 0),
(val_add, "$g_multiplayer_poll_no_count", 1),
(else_try),
(eq, ":value", 1),
(val_add, "$g_multiplayer_poll_yes_count", 1),
(eq, ":value", 2), #abstain
(val_sub, "$g_multiplayer_poll_num_sent", 1),
(else_try),
(player_is_admin, ":player_no"),
(try_begin), #override poll, ending it
(eq, ":value", 0),
(assign, "$g_multiplayer_poll_admin_override", -1),
(else_try),
(eq, ":value", 1),
(assign, "$g_multiplayer_poll_admin_override", 1),
(try_end),
(else_try),
(try_begin),
(eq, ":value", 0),
(val_add, "$g_multiplayer_poll_no_count", 1),
(else_try),
(eq, ":value", 1),
(val_add, "$g_multiplayer_poll_yes_count", 1),
(try_end),
(try_end),
(try_end),
(else_try),
@@ -9217,11 +9268,12 @@
(eq, ":event_type", multiplayer_event_admin_ban_player),
(try_begin),
(store_script_param, ":value", 3),
(store_script_param, ":perm_temp", 4),
#validity check
(player_is_admin, ":player_no"),
(player_is_active, ":value"),
#condition checks are done
(ban_player, ":value", 0, ":player_no"),
(ban_player, ":value", ":perm_temp", ":player_no"),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_admin_set_valid_vote_ratio),
@@ -9346,6 +9398,48 @@
(assign, "$g_multiplayer_force_default_armor", ":value"),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_admin_message_set_player),
(try_begin),
(store_script_param, ":target", 3),
#validity check
(player_is_admin, ":player_no"),
#condition checks are done
(player_set_slot, ":player_no", slot_player_admin_message_target, ":target"),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_admin_message_to_player),
(try_begin),
#validity check
(player_is_admin, ":player_no"),
(neg|str_is_empty, s0),
(player_get_slot, ":target", ":player_no", slot_player_admin_message_target),
(str_store_player_username, s1, ":player_no"),
(try_begin),
(eq, ":target", 0), #send to all players
(get_max_players, ":num_players"),
(try_for_range, ":cur_player", 0, ":num_players"), #include server (0) for hosting clients
(player_is_active, ":cur_player"),
(multiplayer_send_int_to_player, ":cur_player", multiplayer_event_admin_message_set_admin, ":player_no"),
(multiplayer_send_string_to_player, ":cur_player", multiplayer_event_admin_message, s0),
(try_end),
(server_add_message_to_log, "@*ADMIN* [{s1}] {s0}"),
(else_try),
(player_is_active, ":target"),
(multiplayer_send_int_to_player, ":target", multiplayer_event_admin_message_set_admin, ":player_no"),
(multiplayer_send_string_to_player, ":target", multiplayer_event_admin_message, s0),
(str_store_player_username, s2, ":target"),
(server_add_message_to_log, "@*ADMIN* [{s1}] -> [{s2}] {s0}"),
(try_end),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_admin_set_poll_question),
(try_begin),
#validity check
(player_is_admin, ":player_no"),
(neg|str_is_empty, s0),
(str_store_string, s37, s0), #this register should be one not used elsewhere in the module system
(try_end),
(else_try),
###############
#CLIENT EVENTS#
###############
@@ -9585,6 +9679,10 @@
(player_is_active, ":value_2"), #might go offline before here
(assign, ":continue_to_poll", 1),
(else_try),
(eq, ":value", 5),
(neg|str_is_empty, s37), #check poll question recieved
(assign, ":continue_to_poll", 1),
(else_try),
(assign, ":continue_to_poll", 1),
(try_end),
(try_begin),
@@ -9593,6 +9691,7 @@
(assign, "$g_multiplayer_poll_value_to_show", ":value_2"),
(assign, "$g_multiplayer_poll_value_2_to_show", ":value_3"),
(assign, "$g_multiplayer_poll_value_3_to_show", ":value_4"),
(assign, "$g_multiplayer_poll_admin_override", 0),
(store_mission_timer_a, ":mission_timer"),
(store_add, "$g_multiplayer_poll_client_end_time", ":mission_timer", 60),
(start_presentation, "prsnt_multiplayer_poll"),
@@ -9719,6 +9818,28 @@
(else_try),
(assign, "$g_my_spawn_count", ":value"),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_admin_message_set_admin),
(try_begin),
(store_script_param, ":admin", 3),
(assign, "$g_multiplayer_admin_message_player_no", ":admin"),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_admin_message),
(try_begin),
#validity check
(neg|str_is_empty, s0),
(player_is_active, "$g_multiplayer_admin_message_player_no"),
(str_store_string, s36, s0), #this register should be one not used elsewhere in the module system
(start_presentation, "prsnt_multiplayer_admin_message"),
(try_end),
(else_try),
(eq, ":event_type", multiplayer_event_return_admin_poll_question),
(try_begin),
#validity check
(neg|str_is_empty, s0),
(str_store_string, s37, s0), #this register should be one not used elsewhere in the module system
(try_end),
(try_end),
]),
@@ -9738,8 +9859,18 @@
(store_mul, ":vote_ratio", 100, "$g_multiplayer_poll_yes_count"),
(val_div, ":vote_ratio", ":total_votes"),
(try_begin),
(eq, "$g_multiplayer_poll_admin_override", 1),
(assign, ":result", 3),
(else_try),
(eq, "$g_multiplayer_poll_admin_override", -1),
(assign, ":result", 2),
(else_try),
(ge, ":vote_ratio", "$g_multiplayer_valid_vote_ratio"),
(assign, ":result", 1),
(try_end),
(try_begin),
(this_or_next|eq, ":result", 3),
(eq, ":result", 1),
(try_begin),
(eq, "$g_multiplayer_poll_to_show", 1), #kick player
(try_begin),
@@ -9775,6 +9906,7 @@
(player_is_active, ":cur_player"),
(multiplayer_send_2_int_to_player, ":cur_player", multiplayer_event_show_multiplayer_message, multiplayer_message_type_poll_result, ":result"),
(try_end),
(this_or_next|eq, ":result", 3),
(eq, ":result", 1),
]),
@@ -11096,6 +11228,39 @@
(try_end),
]),
# script_multiplayer_get_reason_string
# Input: reason_id
# Output: s2 = poll reason
("multiplayer_get_reason_string",
[
(store_script_param, ":reason_id", 1),
(val_add, ":reason_id", multiplayer_poll_reasons_begin),
(try_begin),
(this_or_next|lt, ":reason_id", multiplayer_poll_reasons_begin),
(ge, ":reason_id", multiplayer_poll_reasons_end),
(store_sub, ":reason_id", multiplayer_poll_reasons_end, 1),
(try_end),
(str_store_string, s2, ":reason_id"),
]),
# script_cf_multiplayer_stored_player_no_is_valid
# Input: none
# Output: none, return true or false
("cf_multiplayer_stored_player_no_is_valid",
[
(assign, ":continue", 1),
(try_begin),
(eq, "$g_multiplayer_players_list_selected_player_no", 0),
(else_try),
(player_is_active, "$g_multiplayer_players_list_selected_player_no"),
(player_slot_eq, "$g_multiplayer_players_list_selected_player_no", slot_player_button_index, "$g_multiplayer_players_list_selected_player_check_no"),
(else_try),
(display_message, "str_stored_player_invalid", 0xFF990000),
(assign, ":continue", 0),
(end_try),
(eq, ":continue", 1),
]),
# script_multiplayer_fill_map_game_types
# Input: game_type
# Output: num_maps