Change server gamemode depending on the scene

正在查看此主题的用户

Kaldir

Squire
I think it would be very interesting if the gamemode changes depending on the current scene. So I tried my luck and started scripting in my ignorance :smile::
In module_mission_templates (around line 615):
      (eq, ":end_map", 1),
      (call_script, "script_game_multiplayer_get_game_type_mission_template", "$g_multiplayer_game_type"),
      (start_multiplayer_mission, reg0, "$g_multiplayer_selected_map", 0),
      (call_script, "script_game_set_multiplayer_mission_end"),
I thought that before the server starts the new map it wants to find out the game type and changes it. But when I change in module_scripts this:
  ("game_multiplayer_get_game_type_mission_template",
  [
    (assign, ":selected_mt", -1),
    (store_script_param, ":game_type", 1),
    (try_begin),
      (eq, ":game_type", multiplayer_game_type_deathmatch),
      (assign, ":selected_mt", "mt_multiplayer_dm"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_team_deathmatch),
      (assign, ":selected_mt", "mt_multiplayer_tdm"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_battle),
      (assign, ":selected_mt", "mt_multiplayer_bt"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_destroy),
      (assign, ":selected_mt", "mt_multiplayer_fd"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_capture_the_flag),
      (assign, ":selected_mt", "mt_multiplayer_cf"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_headquarters),
      (assign, ":selected_mt", "mt_multiplayer_hq"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_siege),
      (assign, ":selected_mt", "mt_multiplayer_sg"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_duel),
      (assign, ":selected_mt", "mt_multiplayer_duel"),
    (try_end),
    (assign, reg0, ":selected_mt"),
    ]),
to this:
  ("game_multiplayer_get_game_type_mission_template",
  [
    (assign, ":selected_mt", -1),
    (store_script_param, ":game_type", 1),
    (store_current_scene, ":cur_scene"),
    (try_begin),
      (eq, ":cur_scene", "scn_multi_scene_custom_1"),
      (assign, "selected_mt", "mt_multiplayer_bt"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_deathmatch),
      (assign, ":selected_mt", "mt_multiplayer_dm"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_team_deathmatch),
      (assign, ":selected_mt", "mt_multiplayer_tdm"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_battle),
      (assign, ":selected_mt", "mt_multiplayer_bt"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_destroy),
      (assign, ":selected_mt", "mt_multiplayer_fd"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_capture_the_flag),
      (assign, ":selected_mt", "mt_multiplayer_cf"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_headquarters),
      (assign, ":selected_mt", "mt_multiplayer_hq"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_siege),
      (assign, ":selected_mt", "mt_multiplayer_sg"),
    (else_try),
      (eq, ":game_type", multiplayer_game_type_duel),
      (assign, ":selected_mt", "mt_multiplayer_duel"),
    (try_end),
    (assign, reg0, ":selected_mt"),
    ]),
and this:
  ("multiplayer_get_mission_template_game_type",
  [
    (store_script_param, ":mission_template_no", 1),
    (assign, ":game_type", -1),
    (try_begin),
      (eq, ":mission_template_no", "mt_multiplayer_dm"),
      (assign, ":game_type", multiplayer_game_type_deathmatch),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_tdm"),
      (assign, ":game_type", multiplayer_game_type_team_deathmatch),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_bt"),
      (assign, ":game_type", multiplayer_game_type_battle),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_fd"),
      (assign, ":game_type", multiplayer_game_type_destroy),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_cf"),
      (assign, ":game_type", multiplayer_game_type_capture_the_flag),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_hq"),
      (assign, ":game_type", multiplayer_game_type_headquarters),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_sg"),
      (assign, ":game_type", multiplayer_game_type_siege),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_duel"),
      (assign, ":game_type", multiplayer_game_type_duel),
    (try_end),
    (assign, reg0, ":game_type"),
    ]),
to this:
  ("multiplayer_get_mission_template_game_type",
  [
    (store_script_param, ":mission_template_no", 1),
    (assign, ":game_type", -1),
    (store_current_scene, ":cur_scene"),
    (try_begin),
      (eq, ":cur_scene", "scn_multi_scene_custom_1"),
      (assign, ":game_type", multiplayer_game_battle),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_dm"),
      (assign, ":game_type", multiplayer_game_type_deathmatch),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_tdm"),
      (assign, ":game_type", multiplayer_game_type_team_deathmatch),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_bt"),
      (assign, ":game_type", multiplayer_game_type_battle),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_fd"),
      (assign, ":game_type", multiplayer_game_type_destroy),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_cf"),
      (assign, ":game_type", multiplayer_game_type_capture_the_flag),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_hq"),
      (assign, ":game_type", multiplayer_game_type_headquarters),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_sg"),
      (assign, ":game_type", multiplayer_game_type_siege),
    (else_try),
      (eq, ":mission_template_no", "mt_multiplayer_duel"),
      (assign, ":game_type", multiplayer_game_type_duel),
    (try_end),
    (assign, reg0, ":game_type"),
    ]),
nothing happens. The gamemode just changes if i manually start the specified map. I don't know very much about that stuff so I tried to draw logical conclusions, which has failed :grin:. I hope that somebody has a great idea to get this to work.
Thanks in advance!
 
That script only gets a number associated with the game type or vise-versa. What you'll want to do is in that trigger you mentioned, have a try-else block that assigns the desired mission template to the global variable $g_multiplayer_game_type before the line that calls start_multiplayer_mission.
 
Hmm I tried this:
multiplayer_server_check_end_map = (
  1, 0, 0, [],
  [
    (multiplayer_is_server),
    #checking for restarting the map
    (assign, ":end_map", 0),
    (try_begin),
      (this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_battle),
      (this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_destroy),
      (eq, "$g_multiplayer_game_type", multiplayer_game_type_siege),
   
      (try_begin),
        (eq, "$g_round_ended", 1),

        (store_mission_timer_a, ":seconds_past_till_round_ended"),
        (val_sub, ":seconds_past_till_round_ended", "$g_round_finish_time"),
        (store_sub, ":multiplayer_respawn_period_minus_one", "$g_multiplayer_respawn_period", 1),
        (ge, ":seconds_past_till_round_ended", ":multiplayer_respawn_period_minus_one"),
 
        (store_mission_timer_a, ":mission_timer"),   
        (try_begin),
          (this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_battle),
          (eq, "$g_multiplayer_game_type", multiplayer_game_type_destroy),
          (assign, ":reduce_amount", 90),
        (else_try),
          (assign, ":reduce_amount", 120),
        (try_end),
   
        (store_mul, ":game_max_seconds", "$g_multiplayer_game_max_minutes", 60),
        (store_sub, ":game_max_seconds_min_n_seconds", ":game_max_seconds", ":reduce_amount"), #when round ends if there are 60 seconds to map change time then change map without completing exact map time.
        (gt, ":mission_timer", ":game_max_seconds_min_n_seconds"),
        (assign, ":end_map", 1),
      (try_end),
     
      (eq, ":end_map", 1),
    (else_try),
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_battle), #battle mod has different end map condition by time
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_destroy), #fight and destroy mod has different end map condition by time
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_siege), #siege mod has different end map condition by time
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_headquarters), #in headquarters mod game cannot limited by time, only can be limited by score.
      (store_mission_timer_a, ":mission_timer"),
      (store_mul, ":game_max_seconds", "$g_multiplayer_game_max_minutes", 60),
      (gt, ":mission_timer", ":game_max_seconds"),
      (assign, ":end_map", 1),
    (else_try),
      #assuming only 2 teams in scene
      (team_get_score, ":team_1_score", 0),
      (team_get_score, ":team_2_score", 1),
      (try_begin),
        (neq, "$g_multiplayer_game_type", multiplayer_game_type_headquarters), #for not-headquarters mods
        (try_begin),
          (this_or_next|ge, ":team_1_score", "$g_multiplayer_game_max_points"),
          (ge, ":team_2_score", "$g_multiplayer_game_max_points"),
          (assign, ":end_map", 1),
        (try_end),
      (else_try),
        (assign, ":at_least_one_player_is_at_game", 0),
        (get_max_players, ":num_players"),
        (try_for_range, ":player_no", 0, ":num_players"),
          (player_is_active, ":player_no"),
          (player_get_agent_id, ":agent_id", ":player_no"),
          (ge, ":agent_id", 0),
          (neg|agent_is_non_player, ":agent_id"),
          (assign, ":at_least_one_player_is_at_game", 1),
          (assign, ":num_players", 0),
        (try_end),
   
        (eq, ":at_least_one_player_is_at_game", 1),

        (this_or_next|le, ":team_1_score", 0), #in headquarters game ends only if one team has 0 score.
        (le, ":team_2_score", 0),
        (assign, ":end_map", 1),
      (try_end),
    (try_end),
(try_begin),
      (eq, ":end_map", 1),
  (store_current_scene, ":cur_scene"),
  (try_begin),
    (eq, ":cur_scene", "scn_multi_scene_custom_1"),
    (assign, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
  (else_try),
    (eq, ":cur_scene", "scn_multi_scene_custom_2"),
    (assign, "$g_multiplayer_game_type", multiplayer_game_type_team_deathmatch),
      (try_end),
      (start_multiplayer_mission, reg0, "$g_multiplayer_selected_map", 0),
      (call_script, "script_game_set_multiplayer_mission_end"),
    (try_end),
    ])
I restored the changes I made in module_scripts.py. Nothing happens at all now. Did I understand something wrong?
Thanks for the help!
 
Quick oversight on myu part; try re-adding 
插入代码块:
(call_script, "script_game_multiplayer_get_game_type_mission_template", "$g_multiplayer_game_type"),
above the start_multiplayer_mission line.
 
Still not working. The gamemode just changes in the administrator panel so that I have to start the map again until it works.

Edit: Ok I got it to work, BUT I have to change the settings for every single map which means for example changing the map and the factions. Otherwise the server applies the default settings. My question is how or if it is possible to randomly change the factions.
("gamemode_map",
  [
    (store_current_scene, ":cur_scene"),
(try_begin),
  (eq, ":cur_scene", "scn_multi_scene_custom_1"), #Settings for multi_scene_custom_2 (Soeldnerlager)
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_battle),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_2"), #Change the map to custom scene 2
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_2"), #Settings for multi_scene_custom_3 (Khorinis)
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_battle),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_3"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_3"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_battle),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_4"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_4"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_5"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_5"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_siege),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_6"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_6"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_siege),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_7"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_7"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_8"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_8"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_battle),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_9"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_9"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_team_deathmatch),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_10"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_10"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_siege),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_11"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_11"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_deathmatch),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_12"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_12"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_team_deathmatch),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_13"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_13"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_team_deathmatch),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_14"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_14"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_battle),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_15"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_15"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_team_deathmatch),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_17"),
(else_try),
  (eq, ":cur_scene", "scn_multi_scene_custom_17"),
  (assign, "$g_multiplayer_game_type", multiplayer_game_type_battle),
  (assign, "$g_multiplayer_selected_map", "scn_multi_scene_custom_1"),
(try_end),
  ]),
multiplayer_server_check_end_map = (
  1, 0, 0, [],
  [
    (multiplayer_is_server),
    #checking for restarting the map
    (assign, ":end_map", 0),
    (try_begin),
      (this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_battle),
      (this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_destroy),
      (eq, "$g_multiplayer_game_type", multiplayer_game_type_siege),
   
      (try_begin),
        (eq, "$g_round_ended", 1),

        (store_mission_timer_a, ":seconds_past_till_round_ended"),
        (val_sub, ":seconds_past_till_round_ended", "$g_round_finish_time"),
        (store_sub, ":multiplayer_respawn_period_minus_one", "$g_multiplayer_respawn_period", 1),
        (ge, ":seconds_past_till_round_ended", ":multiplayer_respawn_period_minus_one"),
 
        (store_mission_timer_a, ":mission_timer"),   
        (try_begin),
          (this_or_next|eq, "$g_multiplayer_game_type", multiplayer_game_type_battle),
          (eq, "$g_multiplayer_game_type", multiplayer_game_type_destroy),
          (assign, ":reduce_amount", 90),
        (else_try),
          (assign, ":reduce_amount", 120),
        (try_end),
   
        (store_mul, ":game_max_seconds", "$g_multiplayer_game_max_minutes", 60),
        (store_sub, ":game_max_seconds_min_n_seconds", ":game_max_seconds", ":reduce_amount"), #when round ends if there are 60 seconds to map change time then change map without completing exact map time.
        (gt, ":mission_timer", ":game_max_seconds_min_n_seconds"),
        (assign, ":end_map", 1),
      (try_end),
     
      (eq, ":end_map", 1),
    (else_try),
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_battle), #battle mod has different end map condition by time
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_destroy), #fight and destroy mod has different end map condition by time
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_siege), #siege mod has different end map condition by time
      (neq, "$g_multiplayer_game_type", multiplayer_game_type_headquarters), #in headquarters mod game cannot limited by time, only can be limited by score.
      (store_mission_timer_a, ":mission_timer"),
      (store_mul, ":game_max_seconds", "$g_multiplayer_game_max_minutes", 60),
      (gt, ":mission_timer", ":game_max_seconds"),
      (assign, ":end_map", 1),
    (else_try),
      #assuming only 2 teams in scene
      (team_get_score, ":team_1_score", 0),
      (team_get_score, ":team_2_score", 1),
      (try_begin),
        (neq, "$g_multiplayer_game_type", multiplayer_game_type_headquarters), #for not-headquarters mods
        (try_begin),
          (this_or_next|ge, ":team_1_score", "$g_multiplayer_game_max_points"),
          (ge, ":team_2_score", "$g_multiplayer_game_max_points"),
          (assign, ":end_map", 1),
        (try_end),
      (else_try),
        (assign, ":at_least_one_player_is_at_game", 0),
        (get_max_players, ":num_players"),
        (try_for_range, ":player_no", 0, ":num_players"),
          (player_is_active, ":player_no"),
          (player_get_agent_id, ":agent_id", ":player_no"),
          (ge, ":agent_id", 0),
          (neg|agent_is_non_player, ":agent_id"),
          (assign, ":at_least_one_player_is_at_game", 1),
          (assign, ":num_players", 0),
        (try_end),
   
        (eq, ":at_least_one_player_is_at_game", 1),

        (this_or_next|le, ":team_1_score", 0), #in headquarters game ends only if one team has 0 score.
        (le, ":team_2_score", 0),
        (assign, ":end_map", 1),
      (try_end),
    (try_end),
    (try_begin),
      (eq, ":end_map", 1),
  (call_script, "script_gamemode_map"),
      (call_script, "script_game_multiplayer_get_game_type_mission_template", "$g_multiplayer_game_type"),
      (start_multiplayer_mission, reg0, "$g_multiplayer_selected_map", 1),
      (call_script, "script_game_set_multiplayer_mission_end"),         
    (try_end),
    ])

Edit2: Ok I got it. Thanks for your help Madoc!
 
后退
顶部 底部