This commit is contained in:
Vasily Petrov 2026-06-18 01:18:29 +03:00
commit 2fe6ca2f65
1473 changed files with 251771 additions and 0 deletions

View file

@ -0,0 +1,628 @@
-- file: UI_MP_MAIN.SCRIPT
-- description: MP dialog with Join Game/Create Server/Options
-- created: 26.04.2005
-- author: Serge Vynnychenko
-- mail: narrator@gsc-game.kiev.ua
--
-- copyright 2005 GSC Game World
class "mp_main" (CUIScriptWnd)
function mp_main:__init() super()
self:InitControls()
self:InitCallBacks()
self.tab:SetActiveTab("client")
end
function mp_main:__finalize()
end
function mp_main:InitControls()
self:SetWndRect (Frect():set(0,0,1024,768))
local xml = CScriptXmlInit()
xml:ParseFile ("ui_mm_mp.xml")
local bk = xml:InitStatic("background", self)
self:Enable (true)
local wrk_area = CUIWindow()
xml:InitWindow ("wrk_area", 0, wrk_area)
wrk_area:SetAutoDelete (true)
self:AttachChild (wrk_area)
self.player_name = xml:InitMPPlayerName("edit_player_name", wrk_area)
xml:InitStatic ("cap_mode", wrk_area)
self.dlg_join = ui_mm_mp_join.mp_join()
self.dlg_join:InitControls (0,0, xml, self)
wrk_area:AttachChild (self.dlg_join)
self.dlg_options = ui_mm_mp_options.mp_options()
self.dlg_options:InitControls (0,0, xml, self)
self.dlg_options:Show (false)
wrk_area:AttachChild (self.dlg_options)
self.dlg_server = ui_mm_mp_server.mp_server()
self.dlg_server:InitControls (0,0, xml, self)
self.dlg_server:Show (false)
wrk_area:AttachChild (self.dlg_server)
self.dlg_demo = ui_mm_mp_demo.mp_demo()
self.dlg_demo:InitControls (0,0, xml, self)
self.dlg_demo:Show (false)
wrk_area:AttachChild (self.dlg_demo)
btn = xml:Init3tButton("btn_create", wrk_area)
self:Register (btn, "btn_create")
self.btn_create = btn
btn:Enable (false)
btn = xml:Init3tButton("btn_play_demo", wrk_area)
self:Register (btn, "btn_play_demo")
self.btn_play_demo = btn
btn:Enable (false)
btn = xml:Init3tButton("btn_join", wrk_area)
self:Register (btn, "btn_join")
self.btn_join = btn
btn = xml:Init3tButton("btn_cancel", wrk_area)
self:Register (btn, "btn_cancel")
self.tab = xml:InitTab("tab",wrk_area)
self:Register (self.tab, "tab")
self.message_box = CUIMessageBoxEx()
self:Register (self.message_box, "msg_box")
self.cap_download = xml:InitStatic ("download_static", wrk_area)
self.text_download = xml:InitStatic ("download_text", wrk_area)
self.download_progress = xml:InitProgressBar ("progress_download", wrk_area)
self.btn_cancel_download = xml:Init3tButton ("btn_cancel_download", wrk_area)
self:Register (self.btn_cancel_download, "btn_cancel_download")
-- xml:InitStatic ("static_gs_logo",self)
local _ver = xml:InitStatic ("static_version",self)
local mm = main_menu.get_main_menu()
_ver:TextControl():SetText ("ver. " .. mm:GetGSVer())
self.player_name:SetText ( mm:GetPlayerName() )
self.server_list:SetConnectionErrCb(connect_error_cb(self, mp_main.OnConnectError))
end
function mp_main:UpdateControls()
local opt = COptionsManager()
opt:SetCurrentValues("mm_mp_client")
opt:SetCurrentValues("mm_mp_server")
opt:SetCurrentValues("mm_mp_srv_filter")
opt:SaveBackupValues("mm_mp_client")
opt:SaveBackupValues("mm_mp_server")
opt:SaveBackupValues("mm_mp_srv_filter")
self.map_list:ClearList()
self.map_list:OnModeChange()
self.dlg_options:SetGameMode(self.map_list:GetCurGameType(), self)
local mm = main_menu.get_main_menu()
self.player_name:SetText ( mm:GetPlayerName() )
self:OnGameModeChange()
if( level.present() ) then
self.btn_create:Enable (false)
self.btn_join:Enable (false)
self.btn_direct_ip:Enable(false)
self.tab:Enable (false)
self.cdkey:Enable (false)
self.player_name:Enable (false)
end
end
function mp_main:InitCallBacks()
self:AddCallback("btn_cancel", ui_events.BUTTON_CLICKED, self.OnBtn_Calncel, self)
self:AddCallback("btn_create", ui_events.BUTTON_CLICKED, self.OnBtn_Create, self)
self:AddCallback("btn_join", ui_events.BUTTON_CLICKED, self.OnBtn_Join, self)
self:AddCallback("check_empty", ui_events.BUTTON_CLICKED, self.OnFilterChange,self)
self:AddCallback("check_full", ui_events.BUTTON_CLICKED, self.OnFilterChange,self)
self:AddCallback("check_with_pass", ui_events.BUTTON_CLICKED, self.OnFilterChange,self)
self:AddCallback("check_without_pass", ui_events.BUTTON_CLICKED, self.OnFilterChange,self)
self:AddCallback("check_without_ff", ui_events.BUTTON_CLICKED, self.OnFilterChange,self)
self:AddCallback("check_listen_servers",ui_events.BUTTON_CLICKED, self.OnFilterChange,self)
self:AddCallback("btn_direct_ip", ui_events.BUTTON_CLICKED, self.OnBtn_DirectIP,self)
-- ui_mm_mp_options
self:AddCallback("spin_game_mode", ui_events.LIST_ITEM_SELECT, self.OnGameModeChange,self)
self:AddCallback("tab", ui_events.TAB_CHANGED, self.OnTabChange, self)
-- ui_mm_mp_join
self:AddCallback("btn_refresh", ui_events.BUTTON_CLICKED, self.OnBtn_Refresh, self)
self:AddCallback("btn_quick_refresh", ui_events.BUTTON_CLICKED, self.OnBtn_RefreshQuick,self)
self:AddCallback("btn_server_info", ui_events.BUTTON_CLICKED, self.OnBtn_SrvInfo,self)
self:AddCallback("radio_net_conn", ui_events.TAB_CHANGED, self.OnRadio_NetChanged,self)
-- msg_box
self:AddCallback("msg_box", ui_events.MESSAGE_BOX_YES_CLICKED, self.OnDirectIP_yes,self)
self:AddCallback("edit_cd_key", ui_events.EDIT_TEXT_COMMIT, self.OnCDKeyChanged, self)
self:AddCallback("edit_player_name", ui_events.EDIT_TEXT_COMMIT, self.OnPlayerNameChanged, self)
self:AddCallback("btn_cancel_download", ui_events.BUTTON_CLICKED, self.OnBtn_CancelDownload, self)
-- demo playing
self:AddCallback("demo_list_window", ui_events.LIST_ITEM_CLICKED, self.dlg_demo.SelectDemoFile, self.dlg_demo)
self:AddCallback("demo_list_window", ui_events.WINDOW_LBUTTON_DB_CLICK, self.dlg_demo.PlaySelectedDemo, self.dlg_demo)
self:AddCallback("btn_play_demo", ui_events.BUTTON_CLICKED, self.dlg_demo.PlaySelectedDemo, self.dlg_demo)
self:AddCallback("demo_file_name", ui_events.EDIT_TEXT_COMMIT, self.dlg_demo.OnRenameDemo, self.dlg_demo)
self:AddCallback("demo_message_box", ui_events.MESSAGE_BOX_YES_CLICKED, self.dlg_demo.OnMsgBoxYes, self.dlg_demo)
self:AddCallback("demo_message_box", ui_events.MESSAGE_BOX_OK_CLICKED, self.dlg_demo.OnMsgBoxYes, self.dlg_demo)
self:AddCallback("check_demosave", ui_events.BUTTON_CLICKED, self.OnDemoSaveChange, self)
end
function mp_main:OnBtn_DirectIP()
self.message_box:InitMessageBox("message_box_direct_ip")
self.message_box:ShowDialog(true)
end
function mp_main:OnDirectIP_yes()
if (string.len(self.message_box:GetHost()) ~= 0) then
local cmd = "start client(" .. self.message_box:GetHost() .. "/name=" .. self.player_name:GetText() .. "/psw=" .. self.message_box:GetPassword() .. ")"
local console = get_console()
console:execute(cmd)
end
end
function mp_main:OnCDKeyChanged()
local cmdstr = ""
tmp = self.cdkey:GetText()
if tmp=="" then
tmp = "clear"
end
cmdstr = "cdkey " .. tmp
local console = get_console()
console:execute(cmdstr)
end
function mp_main:OnPlayerNameChanged()
local tmp = self.player_name:GetText()
local cmdstr = "name " .. tmp
local console = get_console()
console:execute(cmdstr)
end
function mp_main:ChangeNickOperationResult(profile, descr)
-- assert(profile)
end
function mp_main:OnBtn_SrvInfo()
self.server_list:ShowServerInfo()
end
function mp_main:OnGameModeChange()
self.map_list:OnModeChange()
self.dlg_options:SetGameMode(self.map_list:GetCurGameType(), self)
end
function mp_main:OnFilterChange()
local sf = SServerFilters()
sf.empty = self.filters.btn_check_empty:GetCheck()
sf.full = self.filters.btn_check_full:GetCheck()
sf.with_pass = self.filters.btn_check_with_pass:GetCheck()
sf.without_pass = self.filters.btn_check_without_pass:GetCheck()
sf.without_ff = self.filters.btn_check_without_ff:GetCheck()
sf.listen_servers = self.filters.btn_check_listen_servers:GetCheck()
self.server_list:SetFilters(sf)
end
function mp_main:OnDemoSaveChange()
local console = get_console()
if (self.check_demosave:GetCheck()) then
console:execute("cl_mpdemosave 1")
else
console:execute("cl_mpdemosave 0")
end
end
function mp_main:OnTabChange()
self.dlg_join:Show(false)
self.dlg_options:Show(false)
self.dlg_server:Show(false)
self.dlg_demo:Show(false)
self.btn_join:Show(false)
self.btn_create:Show(false)
self.btn_play_demo:Show(false)
local i = self.tab:GetActiveId()
if i == "client" then
self.dlg_join:Show(true)
self.btn_join:Show(true)
elseif i == "options" then
self.dlg_options:Show(true)
self.btn_create:Show(true)
elseif i == "server" then
self.map_list:LoadMapList()
self.map_list:OnModeChange()
self.dlg_server:Show(true)
self.btn_create:Show(true)
elseif i == "demo" then
self.dlg_demo:FillList()
self.dlg_demo:Show(true)
self.btn_play_demo:Show(true)
end
end
function mp_main:OnRadio_NetChanged()
local i = self.radio_net_connection:GetActiveId()
self.server_list:NetRadioChanged(i~="internet")
if i == "internet" then
self.server_list:RefreshList(false)
else
self.server_list:RefreshList(true)
end
self:OnFilterChange()
end
function mp_main:OnBtn_Refresh()
local i = self.radio_net_connection:GetActiveId()
if i == "internet" then
self.server_list:RefreshList(false)
else
self.server_list:RefreshList(true)
end
self:OnFilterChange()
end
function mp_main:OnBtn_RefreshQuick()
self.server_list:RefreshQuick()
end
function mp_main:OnBtn_Calncel()
local opt = COptionsManager()
opt:UndoGroup("mm_mp_client")
opt:UndoGroup("mm_mp_server")
opt:UndoGroup("mm_mp_srv_filter")
self.owner:ShowDialog(true)
self:HideDialog()
self.owner:Show (true)
end
function mp_main:OnBtn_Create()
if self.map_list:IsEmpty() then
self.message_box:InitMessageBox("select_map")
self.message_box:ShowDialog(true)
return
end
local mm = main_menu.get_main_menu()
local opt = COptionsManager()
local console = get_console()
opt:SaveValues("mm_mp_server")
opt:SaveValues("mm_mp_client")
opt:SaveValues("mm_mp_srv_filter")
self.map_list:SaveMapList()
self:GatherServerData()
if self.check_dedicated:GetCheck() then
self.map_list:StartDedicatedServer()
else
local command = self.map_list:GetCommandLine(self.player_name:GetText())
console:execute("main_menu off")
console:execute(command)
end
end
function mp_main:GatherServerData()
local cmdstr = ""
local tmp;
-- server name ------------------------------------------------------------------
tmp = self.edit_server_name:GetText()
if string.len(tmp) > 0 then
cmdstr = "/hname=" .. tmp
end
-- password ---------------------------------------------------------------------
tmp = self.edit_password:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/psw=" .. tmp
end
-- max players ------------------------------------------------------------------
tmp = self.spin_max_players:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/maxplayers=" .. tmp
end
-- public server ----------------------------------------------------------------
tmp = self.check_public_server:GetCheck()
if true == tmp then
cmdstr = cmdstr .. "/public=1"
end
tmp = self.spin_max_ping:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/maxping=" .. tmp
end
-- spectator --------------------------------------------------------------------
if self.check_spectator:GetCheck() then
tmp = self.spin_spectator:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/spectr=" .. tmp
end
end
-- spectator options --
tmp = 0;
if self.check_spec_freefly:GetCheck() then
tmp = tmp + 1
end
if self.check_spec_firsteye:GetCheck() then
tmp = tmp + 2
end
if self.check_spec_lookat:GetCheck() then
tmp = tmp + 4
end
if self.check_spec_freelook:GetCheck() then
tmp = tmp + 8
end
if self.check_spec_teamonly:GetCheck() then
tmp = tmp + 16
end
cmdstr = cmdstr .. "/spectrmds=" .. tmp
-- allow voting ------------------------------------------------------------------
tmp = self.check_allow_voting:GetCheck()
if true == tmp then
cmdstr = cmdstr .. "/vote=1"
end
-- damage block ------------------------------------------------------------------
tmp = self.spin_damage_block:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/dmgblock=" .. tmp
end
if self.check_damage_block:GetCheck() then
cmdstr = cmdstr .. "/dmbi=1"
end
-- frag limit ---------------------------------------------------------------------
tmp = self.spin_frag_limit:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/fraglimit=" .. tmp
end
-- time limit ---------------------------------------------------------------------
tmp = self.spin_time_limit:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/timelimit=" .. tmp
end
-- friendly fire ------------------------------------------------------------------
tmp = self.spin_friendly_fire:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/ffire=" .. tmp
end
-- auto team balance --------------------------------------------------------------
if self.check_auto_team_balance:GetCheck() then
cmdstr = cmdstr .. "/abalance=1"
end
-- auto team swap --------------------------------------------------------------
if self.check_auto_team_swap:GetCheck() then
cmdstr = cmdstr .. "/aswap=1"
end
-- Force respawn --------------------------------------------------------------
if self.tab_respawn:GetActiveId() == "reinforcement" then
tmp = self.spin_force_respawn:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/frcrspwn=" .. tmp
end
end
-- ARTEFACTHUNT only ----------------------------------------------
if GAME_TYPE.GAME_UNKNOWN ~= 0 then
if self.map_list:GetCurGameType() == GAME_TYPE.eGameIDArtefactHunt then
-- number of artefacts ---------------------------------------------------------
tmp = self.spin_artefacts_num:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/anum=" .. tmp
end
-- aretefact delay --------------------------------------------------------------
tmp = self.spin_artefact_delay:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/ardelta=" .. tmp
end
-- artefact stay ----------------------------------------------------------------
tmp = self.spin_artefact_stay:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/astime=" .. tmp
end
if self.tab_respawn:GetActiveId() == "artefactcapture" then -- artefact capture selected
cmdstr = cmdstr .. "/reinf=-1"
else
tmp = self.spin_reinforcement:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/reinf=" .. tmp
end
end
end
-- CAPTURETHEARTEFACT only ----------------------------------------------
if self.map_list:GetCurGameType() == GAME_TYPE.eGameIDCaptureTheArtefact then
-- number of artefacts ---------------------------------------------------------
tmp = self.spin_artefacts_num:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/anum=" .. tmp
end
tmp = self.spin_reinforcement:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/reinf=" .. tmp
end
tmp = self.spin_artreturn_time:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/artrettime=" .. tmp
end
if self.check_activated_return:GetCheck() then
cmdstr = cmdstr .. "/actret=1"
end
end
elseif GAME_TYPE.GAME_UNKNOWN == 0 then
if self.map_list:GetCurGameType() == GAME_TYPE.GAME_ARTEFACTHUNT then
-- number of artefacts ---------------------------------------------------------
tmp = self.spin_artefacts_num:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/anum=" .. tmp
end
-- aretefact delay --------------------------------------------------------------
tmp = self.spin_artefact_delay:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/ardelta=" .. tmp
end
-- artefact stay ----------------------------------------------------------------
tmp = self.spin_artefact_stay:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/astime=" .. tmp
end
if self.tab_respawn:GetActiveId() == "artefactcapture" then -- artefact capture selected
cmdstr = cmdstr .. "/reinf=-1"
else
tmp = self.spin_reinforcement:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/reinf=" .. tmp
end
end
end
end
-- friendly indicators --------------------------------------------------------------
if self.check_friendly_indicators:GetCheck() then
cmdstr = cmdstr .. "/fi=1" .. tmp
end
-- friendly indicators --------------------------------------------------------------
if self.check_friendly_names:GetCheck() then
cmdstr = cmdstr .. "/fn=1" .. tmp
end
-- anomaly time ---------------------------------------------------------------------
if false == self.check_no_anmalies:GetCheck() then
tmp = self.spin_anomaly_time:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/ans=1/anslen=" .. tmp
end
else
cmdstr = cmdstr .. "/ans=0"
end
-- pda hunt -------------------------------------------------------------------------
if self.check_pda_hunt:GetCheck() then
cmdstr = cmdstr .. "/pdahunt=1"
end
-- warm up time ---------------------------------------------------------------------
tmp = self.spin_warm_up_time:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/warmup=" .. tmp
end
-- rate of weather change -----------------------------------------------------------
tmp = self.spin_rate_of_change:GetText()
if string.len(tmp) > 0 then
cmdstr = cmdstr .. "/etimef=" .. tmp
end
self.map_list:SetServerParams(cmdstr)
end
function mp_main:GoToProfileTab()
self.tab:SetActiveTab("profile")
end
function mp_main:OnConnectError(err_code, descr)
self.message_box:InitMessageBox("message_box_error")
if (descr == "") then
descr = "mp_gp_connect_error"
end
self.message_box:SetText(game.translate_string(descr))
--if ((err_code == CServerList.ece_unique_nick_not_registred) or
-- (err_code == CServerList.ece_unique_nick_expired)) then
self:GoToProfileTab()
self.message_box:ShowDialog(true)
end
function mp_main:OnBtn_Join()
local opt = COptionsManager()
opt:SaveValues("mm_mp_client")
opt:SaveValues("mm_mp_server")
opt:SaveValues("mm_mp_srv_filter")
self.server_list:SetPlayerName(self.player_name:GetText())
self.server_list:ConnectToSelected()
end
function mp_main:OnKeyboard(dik, keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
local bind = dik_to_bind(dik)
local console = get_console()
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then
self.owner:ShowDialog(true) --new(show main window)
self:HideDialog()
self.owner:Show(true)
end
end
return true
end
function mp_main:Update()
CUIScriptWnd.Update(self)
local mm = main_menu.get_main_menu()
local sss = mm:GetPatchProgress()
if sss:GetInProgress() then
self.text_download:Show (true)
self.cap_download:Show (true)
self.download_progress:Show (true)
local _progr = sss:GetProgress()
self.download_progress:SetProgressPos (_progr)
local str = string.format("%.0f%%(%s)",_progr,sss:GetFlieName())
self.text_download:TextControl():SetText(str)
self.btn_cancel_download:Show (true)
else
self.text_download:Show (false)
self.cap_download:Show (false)
self.download_progress:Show (false)
self.btn_cancel_download:Show (false)
end
end
function mp_main:OnBtn_CancelDownload()
local mm = main_menu.get_main_menu()
mm:CancelDownload()
end