Merge pull request #389 from h1-mod/develop

This commit is contained in:
fed 2022-12-23 14:40:06 +00:00 committed by GitHub
commit a558e76aa8
268 changed files with 10214 additions and 7180 deletions

View File

@ -106,13 +106,13 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Remove old data files
run: ssh ${{ secrets.H1_MOD_MASTER_SSH_USER }}@${{ secrets.H1_MOD_MASTER_SSH_ADDRESS }} rm -rf ${{ env.H1_MOD_MASTER_PATH }}/h1-mod/data/*
run: ssh ${{ secrets.H1_MOD_MASTER_SSH_USER }}@${{ secrets.H1_MOD_MASTER_SSH_ADDRESS }} rm -rf ${{ env.H1_MOD_MASTER_PATH }}/h1-mod/*
- name: Upload h1-mod binary
run: rsync -avz h1-mod.exe ${{ secrets.H1_MOD_MASTER_SSH_USER }}@${{ secrets.H1_MOD_MASTER_SSH_ADDRESS }}:${{ env.H1_MOD_MASTER_PATH }}/h1-mod/
- name: Upload data files
run: rsync -avz ./data/ ${{ secrets.H1_MOD_MASTER_SSH_USER }}@${{ secrets.H1_MOD_MASTER_SSH_ADDRESS }}:${{ env.H1_MOD_MASTER_PATH }}/h1-mod/data/
run: rsync -avz ./data/ ${{ secrets.H1_MOD_MASTER_SSH_USER }}@${{ secrets.H1_MOD_MASTER_SSH_ADDRESS }}:${{ env.H1_MOD_MASTER_PATH }}/h1-mod/
- name: Publish changes
run: ssh ${{ secrets.H1_MOD_MASTER_SSH_USER }}@${{ secrets.H1_MOD_MASTER_SSH_ADDRESS }} ${{ secrets.H1_MOD_MASTER_SSH_CHANGE_PUBLISH_COMMAND }}

14
.gitmodules vendored
View File

@ -25,10 +25,6 @@
[submodule "deps/lua"]
path = deps/lua
url = https://github.com/lua/lua.git
[submodule "deps/stb"]
path = deps/stb
url = https://github.com/nothings/stb.git
branch = develop
[submodule "deps/libtomcrypt"]
path = deps/libtomcrypt
url = https://github.com/libtom/libtomcrypt.git
@ -48,3 +44,13 @@
[submodule "deps/curl"]
path = deps/curl
url = https://github.com/curl/curl.git
[submodule "deps/json"]
path = deps/json
url = https://github.com/nlohmann/json.git
[submodule "deps/gsc-tool"]
path = deps/gsc-tool
url = https://github.com/xensik/gsc-tool.git
branch = xlabs
[submodule "deps/stb"]
path = deps/stb
url = https://github.com/nothings/stb.git

Binary file not shown.

View File

@ -0,0 +1,27 @@
init()
{
// define the auto balance string in the game array (referenced in gsc dump, but not defined past IW6?)
precachestring(&"MP_AUTOBALANCE_NOW");
game["strings"]["autobalance"] = &"MP_AUTOBALANCE_NOW";
// define onteamselection callback function used in balanceteams()
level.onteamselection = ::set_team;
}
set_team(team)
{
if (team != self.pers["team"])
{
self.switching_teams = true;
self.joining_team = team;
self.leaving_team = self.pers["team"];
}
if (self.sessionstate == "playing")
{
self suicide();
}
maps\mp\gametypes\_menus::addtoteam(team);
maps\mp\gametypes\_menus::endrespawnnotify();
}

View File

@ -0,0 +1,13 @@
local mod_eula = function(unk1, unk2)
return LUI.EULABase.new(CoD.CreateState(0, 0, 0, 0, CoD.AnchorTypes.All), {
textStrings = LUI.EULABase.CreateTextStrings("@CUSTOM_DEPOT_EULA_", 6),
declineCallback = function(unk3)
unk2.declineCallback(unk3)
end,
acceptCallback = function(unk4)
unk2.acceptCallback(unk4)
end
})
end
LUI.MenuBuilder.registerPopupType("mod_eula", mod_eula)

View File

@ -0,0 +1,272 @@
if (game:issingleplayer() or Engine.InFrontend()) then
return
end
local container = LUI.UIVerticalList.new({
topAnchor = true,
rightAnchor = true,
top = 20,
right = 200,
width = 200,
spacing = 5
})
function canasktojoin(userid)
history = history or {}
if (history[userid] ~= nil) then
return false
end
history[userid] = true
game:ontimeout(function()
history[userid] = nil
end, 15000)
return true
end
function truncatename(name, length)
if (#name <= length - 3) then
return name
end
return name:sub(1, length - 3) .. "..."
end
function addrequest(request)
if (not canasktojoin(request.userid)) then
return
end
if (container.temp) then
container:removeElement(container.temp)
container.temp = nil
end
local invite = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
height = 75
})
invite:registerAnimationState("move_in", {
leftAnchor = true,
height = 75,
width = 200,
left = -220
})
invite:animateToState("move_in", 100)
local background = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
top = 1,
left = 1,
bottom = -1,
right = -1,
material = RegisterMaterial("white"),
color = {
r = 0,
b = 0,
g = 0
},
alpha = 0.6
})
local border = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
material = RegisterMaterial("btn_focused_rect_innerglow")
})
border:setup9SliceImage(10, 5, 0.25, 0.12)
local paddingvalue = 10
local padding = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
top = paddingvalue,
left = paddingvalue,
right = -paddingvalue,
bottom = -paddingvalue
})
local avatarmaterial = discord.getavatarmaterial(request.userid)
local avatar = LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
width = 32,
height = 32,
left = 1,
material = RegisterMaterial(avatarmaterial)
})
local username = LUI.UIText.new({
leftAnchor = true,
topAnchor = true,
height = 12,
left = 32 + paddingvalue,
color = Colors.white,
alignment = LUI.Alignment.Left,
rightAnchor = true,
font = CoD.TextSettings.BodyFontBold.Font
})
username:setText(string.format("%s^7#%s requested to join your game!", truncatename(request.username, 18),
request.discriminator))
local buttons = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
topAnchor = true,
top = 37,
height = 18
})
local createbutton = function(text, left)
local button = LUI.UIElement.new({
leftAnchor = left,
rightAnchor = not left,
topAnchor = true,
height = 18,
width = 85,
material = RegisterMaterial("btn_focused_rect_innerglow")
})
local center = LUI.UIText.new({
rightAnchor = true,
height = 12,
width = 85,
top = -6.5,
alignment = LUI.Alignment.Center,
font = CoD.TextSettings.BodyFontBold.Font
})
button:setup9SliceImage(10, 5, 0.25, 0.12)
center:setText(text)
button:addElement(center)
return button
end
buttons:addElement(createbutton("[F1] Accept", true))
buttons:addElement(createbutton("[F2] Deny"))
local fadeouttime = 50
local timeout = 10 * 1000 - fadeouttime
local function close()
container:processEvent({
name = "update_navigation",
dispatchToChildren = true
})
invite:animateToState("fade_out", fadeouttime)
invite:addElement(LUI.UITimer.new(fadeouttime + 50, "remove"))
invite:registerEventHandler("remove", function()
container:removeElement(invite)
if (container.temp) then
container:removeElement(container.temp)
container.temp = nil
end
local temp = LUI.UIElement.new({})
container.temp = temp
container:addElement(temp)
end)
end
buttons:registerEventHandler("keydown_", function(element, event)
if (event.key == "F1") then
close()
discord.respond(request.userid, discord.reply.yes)
end
if (event.key == "F2") then
close()
discord.respond(request.userid, discord.reply.no)
end
end)
invite:registerAnimationState("fade_out", {
leftAnchor = true,
rightAnchor = true,
height = 75,
alpha = 0,
left = 0
})
invite:addElement(LUI.UITimer.new(timeout, "end_invite"))
invite:registerEventHandler("end_invite", function()
close()
discord.respond(request.userid, discord.reply.ignore)
end)
local bar = LUI.UIImage.new({
bottomAnchor = true,
leftAnchor = true,
bottom = -3,
left = 3,
width = 200 - 6,
material = RegisterMaterial("white"),
height = 2,
color = {
r = 92 / 255,
g = 206 / 255,
b = 113 / 255
}
})
bar:registerAnimationState("closing", {
bottomAnchor = true,
leftAnchor = true,
bottom = -3,
left = 3,
width = 0,
height = 2
})
bar:animateToState("closing", timeout)
avatar:registerEventHandler("update", function()
local avatarmaterial = discord.getavatarmaterial(request.userid)
avatar:setImage(RegisterMaterial(avatarmaterial))
end)
avatar:addElement(LUI.UITimer.new(100, "update"))
invite:addElement(background)
invite:addElement(bar)
invite:addElement(border)
invite:addElement(padding)
padding:addElement(username)
padding:addElement(avatar)
padding:addElement(buttons)
container:addElement(invite)
end
container:registerEventHandler("keydown", function(element, event)
local first = container:getFirstChild()
if (not first) then
return
end
first:processEvent({
name = "keydown_",
key = event.key
})
end)
LUI.roots.UIRoot0:registerEventHandler("discord_join_request", function(element, event)
addrequest(event.request)
end)
LUI.roots.UIRoot0:addElement(container)

View File

@ -0,0 +1,193 @@
local mphud = luiglobals.require("LUI.mp_hud.MPHud")
local barheight = 16
local textheight = 13
local textoffsety = barheight / 2 - textheight / 2
function createinfobar()
local infobar = LUI.UIElement.new({
left = 213,
top = -6,
height = barheight,
width = 70,
leftAnchor = true,
topAnchor = true
})
infobar:registerAnimationState("minimap_on", {
left = 213,
top = -6,
height = barheight,
width = 70,
leftAnchor = true,
topAnchor = true
})
infobar:registerAnimationState("minimap_off", {
left = 0,
top = 0,
height = barheight,
width = 70,
leftAnchor = true,
topAnchor = true
})
infobar:registerAnimationState("hud_on", {
alpha = 1
})
infobar:registerAnimationState("hud_off", {
alpha = 0
})
return infobar
end
function updateinfobarvisibility()
local root = Engine.GetLuiRoot()
local menus = root:AnyActiveMenusInStack()
local infobar = root.infobar
if (not infobar) then
return
end
if (menus or Game.InKillCam()) then
infobar:animateToState("hud_off")
else
infobar:animateToState("hud_on")
end
local validstates = {"hud_on", "active", "nosignal", "scrambled"}
infobar:animateToState("minimap_off")
for i = 1, #validstates do
if (validstates[i] == root.hud.minimap.current_state) then
infobar:animateToState("minimap_on")
break
end
end
end
function populateinfobar(infobar)
elementoffset = 0
if (Engine.GetDvarBool("cg_infobar_fps")) then
infobar:addElement(infoelement({
label = Engine.Localize("@MPHUD_FPS"),
getvalue = function()
return game:getfps()
end,
width = 70,
interval = 100
}))
end
if (Engine.GetDvarBool("cg_infobar_ping")) then
infobar:addElement(infoelement({
label = Engine.Localize("@MPHUD_LATENCY"),
getvalue = function()
return game:getping() .. Engine.Localize("@MPHUD_LATENCY_MS")
end,
width = 115,
interval = 100
}))
end
updateinfobarvisibility()
end
function infoelement(data)
local container = LUI.UIElement.new({
bottomAnchor = true,
leftAnchor = true,
topAnchor = true,
width = data.width,
left = elementoffset
})
elementoffset = elementoffset + data.width + 10
local background = LUI.UIImage.new({
bottomAnchor = true,
leftAnchor = true,
topAnchor = true,
rightAnchor = true,
material = luiglobals.RegisterMaterial("white"),
color = luiglobals.Colors.black,
alpha = 0.5
})
local labelfont = CoD.TextSettings.FontBold110
local label = LUI.UIText.new({
left = 5,
top = textoffsety,
font = labelfont.Font,
height = textheight,
leftAnchor = true,
topAnchor = true,
color = {
r = 0.8,
g = 0.8,
b = 0.8
}
})
label:setText(data.label)
local _, _, left = luiglobals.GetTextDimensions(data.label, labelfont.Font, textheight)
local value = LUI.UIText.new({
left = left + 5,
top = textoffsety,
font = labelfont.Font,
height = textheight,
leftAnchor = true,
topAnchor = true,
color = {
r = 0.6,
g = 0.6,
b = 0.6
}
})
value:addElement(LUI.UITimer.new(data.interval, "update"))
value:setText(data.getvalue())
value:addEventHandler("update", function()
value:setText(data.getvalue())
end)
container:addElement(background)
container:addElement(label)
container:addElement(value)
return container
end
local updatehudvisibility = mphud.updateHudVisibility
mphud.updateHudVisibility = function(a1, a2)
updatehudvisibility(a1, a2)
updateinfobarvisibility()
end
LUI.onmenuopen("mp_hud", function(hud)
if (Engine.InFrontend()) then
return
end
local infobar = createinfobar()
local root = Engine.GetLuiRoot()
root.infobar = infobar
root.hud = hud
populateinfobar(infobar)
root:registerEventHandler("update_hud_infobar_settings", function()
infobar:removeAllChildren()
populateinfobar(infobar)
end)
root:processEvent({
name = "update_hud_infobar_settings"
})
hud.static.scalable:addElement(infobar)
end)

View File

@ -0,0 +1,121 @@
local pcdisplay = luiglobals.require("LUI.PCDisplay")
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = text
}))
menu.list:addElement(element)
end
pcdisplay.CreateOptions = function(menu)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_COLORBLIND_FILTER", "@LUA_MENU_COLOR_BLIND_DESC", LUI.Options.GetRenderColorBlindText,
LUI.Options.RenderColorBlindToggle, LUI.Options.RenderColorBlindToggle)
if Engine.IsMultiplayer() and Engine.GetDvarType("cg_paintballFx") == luiglobals.DvarTypeTable.DvarBool then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_PAINTBALL", "@LUA_MENU_PAINTBALL_DESC",
LUI.Options.GetDvarEnableTextFunc("cg_paintballFx", false), LUI.Options.ToggleDvarFunc("cg_paintballFx"),
LUI.Options.ToggleDvarFunc("cg_paintballFx"))
end
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, "@LUA_MENU_BLOOD",
"@LUA_MENU_BLOOD_DESC", LUI.Options.GetDvarEnableTextFunc("cg_blood", false), LUI.Options
.ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0)), LUI.Options
.ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0)))
if not Engine.IsMultiplayer() then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_CROSSHAIR", "@LUA_MENU_CROSSHAIR_DESC",
LUI.Options.GetDvarEnableTextFunc("cg_drawCrosshairOption", false),
LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption"), LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption"))
LUI.Options.CreateOptionButton(menu, "cg_drawDamageFeedbackOption", "@LUA_MENU_HIT_MARKER",
"@LUA_MENU_HIT_MARKER_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}})
end
if Engine.IsMultiplayer() then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_KILLSTREAK_COUNTER", "@MENU_DISPLAY_KILLSTREAK_COUNTER_DESC",
pcdisplay.GetDisplayKillstreakCounterText, pcdisplay.DisplayKillstreakCounterToggle,
pcdisplay.DisplayKillstreakCounterToggle)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_MEDAL_SPLASHES", "@MENU_DISPLAY_MEDAL_SPLASHES_DESC", pcdisplay.GetDisplayMedalSplashesText,
pcdisplay.DisplayMedalSplashesToggle, pcdisplay.DisplayMedalSplashesToggle)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_WEAPON_EMBLEMS", "@MENU_DISPLAY_WEAPON_EMBLEMS_DESC", pcdisplay.GetDisplayWeaponEmblemsText,
pcdisplay.DisplayWeaponEmblemsToggle, pcdisplay.DisplayWeaponEmblemsToggle)
end
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Common, "@MENU_BRIGHTNESS",
"@MENU_BRIGHTNESS_DESC1", nil, nil, nil, pcdisplay.OpenBrightnessMenu, nil, nil, nil)
local reddotbounds = {
step = 0.2,
max = 4,
min = 0.2
}
LUI.Options.AddButtonOptionVariant(menu, GenericButtonSettings.Variants.Slider, "@LUA_MENU_RED_DOT_BRIGHTNESS",
"@LUA_MENU_RED_DOT_BRIGHTNESS_DESC", function()
return (Engine.GetDvarFloat("r_redDotBrightnessScale") - reddotbounds.min) /
(reddotbounds.max - reddotbounds.min)
end, function()
Engine.SetDvarFloat("r_redDotBrightnessScale", math.min(reddotbounds.max, math.max(reddotbounds.min,
Engine.GetDvarFloat("r_redDotBrightnessScale") - reddotbounds.step)))
end, function()
Engine.SetDvarFloat("r_redDotBrightnessScale", math.min(reddotbounds.max, math.max(reddotbounds.min,
Engine.GetDvarFloat("r_redDotBrightnessScale") + reddotbounds.step)))
end)
createdivider(menu, Engine.Localize("@LUA_MENU_TELEMETRY"))
LUI.Options.CreateOptionButton(menu, "cg_infobar_ping", "@LUA_MENU_LATENCY", "@LUA_MENU_LATENCY_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil, function(value)
Engine.SetDvarBool("cg_infobar_ping", value)
Engine.GetLuiRoot():processEvent({
name = "update_hud_infobar_settings"
})
end)
LUI.Options.CreateOptionButton(menu, "cg_infobar_fps", "@LUA_MENU_FPS", "@LUA_MENU_FPS_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil, function(value)
Engine.SetDvarBool("cg_infobar_fps", value)
Engine.GetLuiRoot():processEvent({
name = "update_hud_infobar_settings"
})
end)
LUI.Options.InitScrollingList(menu.list, nil)
end

View File

@ -0,0 +1,5 @@
require("loading")
if (Engine.InFrontend()) then
require("download")
end

View File

@ -0,0 +1,24 @@
Engine.GetLuiRoot():registerEventHandler("mod_download_start", function(element, event)
local popup = LUI.openpopupmenu("generic_waiting_popup_", {
oncancel = function()
download.abort()
end,
withcancel = true,
text = "Downloading files..."
})
local file = ""
popup:registerEventHandler("mod_download_set_file", function(element, event)
file = event.request.name
popup.text:setText(string.format("Downloading %s...", file))
end)
popup:registerEventHandler("mod_download_progress", function(element, event)
popup.text:setText(string.format("Downloading %s (%i%%)...", file, math.floor(event.fraction * 100)))
end)
popup:registerEventHandler("mod_download_done", function()
LUI.FlowManager.RequestLeaveMenu(popup)
end)
end)

View File

@ -0,0 +1,115 @@
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = Engine.ToUpperCase(text)
}))
element.text = element:getFirstChild():getFirstChild():getNextSibling()
menu.list:addElement(element)
return element
end
function string:truncate(length)
if (#self <= length) then
return self
end
return self:sub(1, length - 3) .. "..."
end
if (game:issingleplayer()) then
LUI.addmenubutton("main_campaign", {
index = 6,
text = "@MENU_MODS",
description = Engine.Localize("@MENU_MODS_DESC"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "mods_menu")
end
})
end
function getmodname(path)
local name = path
game:addlocalizedstring(name, name)
local desc = Engine.Localize("LUA_MENU_MOD_DESC_DEFAULT", name)
local infofile = path .. "/info.json"
if (io.fileexists(infofile)) then
pcall(function()
local data = json.decode(io.readfile(infofile))
game:addlocalizedstring(data.description, data.description)
game:addlocalizedstring(data.author, data.author)
game:addlocalizedstring(data.version, data.version)
desc = Engine.Localize("@LUA_MENU_MOD_DESC", data.description, data.author, data.version)
name = data.name
end)
end
return name, desc
end
LUI.MenuBuilder.registerType("mods_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = "@MENU_MODS",
exclusiveController = 0,
menu_width = 400,
menu_top_indent = LUI.MenuTemplate.spMenuOffset,
showTopRightSmallBar = true,
uppercase_title = true
})
local modfolder = game:getloadedmod()
if (modfolder ~= "") then
local name = getmodname(modfolder)
createdivider(menu, Engine.Localize("@LUA_MENU_LOADED_MOD", name:truncate(24)))
menu:AddButton("@LUA_MENU_UNLOAD", function()
Engine.Exec("unloadmod")
end, nil, true, nil, {
desc_text = Engine.Localize("@LUA_MENU_UNLOAD_DESC")
})
end
createdivider(menu, Engine.Localize("@LUA_MENU_AVAILABLE_MODS"))
if (io.directoryexists("mods")) then
local mods = io.listfiles("mods/")
for i = 1, #mods do
if (io.directoryexists(mods[i]) and not io.directoryisempty(mods[i])) then
local name, desc = getmodname(mods[i])
if (mods[i] ~= modfolder) then
game:addlocalizedstring(name, name)
menu:AddButton(name, function()
Engine.Exec("loadmod " .. mods[i])
end, nil, true, nil, {
desc_text = desc
})
end
end
end
end
menu:AddBackButton(function(a1)
Engine.PlaySound(CoD.SFX.MenuBack)
LUI.FlowManager.RequestLeaveMenu(a1)
end)
LUI.Options.InitScrollingList(menu.list, nil)
menu:CreateBottomDivider()
menu.optionTextInfo = LUI.Options.AddOptionTextInfo(menu)
return menu
end)

View File

@ -0,0 +1,27 @@
require("language")
require("background_effects")
if game:issingleplayer() then
require("sp_unlockall")
return
end
require("disable_useless_things")
if Engine.InFrontend() then
require("shader_dialog")
require("gamemodes")
require("no_mode_switch")
else
require("scoreboard")
end
-- defined in mp_hud/hudutils.lua
function GetGameModeName()
return Engine.Localize(Engine.TableLookup(GameTypesTable.File, GameTypesTable.Cols.Ref, GameX.GetGameMode(),
GameTypesTable.Cols.Name))
end
function NeverAllowChangeTeams()
return false
end

View File

@ -0,0 +1,11 @@
if (Engine.InFrontend()) then
return
end
-- less background blur in SP, no blur in MP
LUI.MenuTemplate.InitInGameBkg = function(f39_arg0, f39_arg1)
LUI.MenuTemplate.AddDarken(f39_arg0, f39_arg1)
if game:issingleplayer() and not LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "advanced_video") then
LUI.MenuTemplate.AddWorldBlur(f39_arg0, f39_arg1)
end
end

View File

@ -0,0 +1,19 @@
if Engine.InFrontend() then
-- Disable CP
Engine.SetDvarInt("ui_enable_cp", 0)
-- Disable CP store
Engine.SetDvarInt("ui_show_store", 0)
-- Remove CoD account button
if Engine.IsMultiplayer() and CoD.IsCoDAccountRegistrationAvailableInMyRegion() then
LUI.removemenubutton("pc_controls", 4)
end
end
-- Remove social button
LUI.MenuBuilder.m_definitions["online_friends_widget"] = function()
return {
type = "UIElement"
}
end

View File

@ -0,0 +1,105 @@
local available_languages = {"english", "english_safe", "french", "german", "italian", "polish", "portuguese",
"russian", "spanish", "simplified_chinese", "traditional_chinese", "japanese_partial",
"korean"}
local current_language = "LANGUAGE"
LUI.UIButtonText.IsOffsetedLanguage = function()
return false
end
function get_user_language()
user_language = game:getcurrentgamelanguage()
end
function set_language(value)
local file_path = "players2/default/language"
local file = io.open(file_path, "w")
file:write(value)
file:close()
end
function does_zone_folder_exists(language)
return io.directoryexists("zone/" .. language)
end
get_user_language()
if user_language ~= "" and does_zone_folder_exists(user_language) then
current_language = user_language
end
LUI.addmenubutton("pc_controls", {
index = 4,
text = "LUA_MENU_CHOOSE_LANGUAGE",
description = Engine.Localize("LUA_MENU_CHOOSE_LANGUAGE_DESC"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "choose_language_menu")
end
})
LUI.MenuBuilder.registerType("choose_language_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = "LUA_MENU_CHOOSE_LANGUAGE",
menu_list_divider_top_offset = -(LUI.H1MenuTab.tabChangeHoldingElementHeight + H1MenuDims.spacing),
uppercase_title = true
})
for i = 1, #available_languages do
if does_zone_folder_exists(available_languages[i]) then
menu:AddButton(Engine.Localize(string.format("MENU_%s", available_languages[i])), function()
LUI.yesnopopup({
title = Engine.Localize("@MENU_NOTICE"),
text = Engine.Localize("MENU_" .. current_language) .. "" ..
Engine.Localize("MENU_" .. available_languages[i]) .. "\n\n" ..
Engine.Localize("@LUA_MENU_CONFIRM_LANGUAGE") .. " " ..
Engine.Localize("@MENU_APPLY_LANGUAGE_SETTINGS"),
callback = function(result)
if (result) then
set_language(available_languages[i])
updater.relaunch()
else
LUI.FlowManager.RequestLeaveMenu(popup)
end
end
})
end, available_languages[i] == current_language, true, nil, {
desc_text = Engine.Localize("LOCALE_" .. (available_languages[i]))
})
end
end
LUI.Options.InitScrollingList(menu.list, nil, {
rows = 12
})
LUI.Options.AddOptionTextInfo(menu)
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "",
helper_text = "^2" .. Engine.Localize("@LUA_MENU_DOWNLOAD") .. ": ^7https://docs.h1.gg/languages",
side = "left",
priority = -9001,
clickable = false
})
menu:AddBackButton()
return menu
end)
-- fix for ammo zeros
if not Engine.InFrontend() then
local weaponinfodef = LUI.MenuBuilder.m_definitions["WeaponInfoHudDef"]
LUI.MenuBuilder.m_definitions["WeaponInfoHudDef"] = function(...)
Engine.GetCurrentLanguage = function()
return 0
end
local res = weaponinfodef(...)
Engine.GetCurrentLanguage = function()
lang = Engine.GetDvarString("loc_language")
return lang
end
return res
end
end

View File

@ -0,0 +1,35 @@
local gametypes = {
["dm"] = true,
["dom"] = true,
["sd"] = true,
["war"] = true,
["conf"] = true,
["vlobby"] = true,
["koth"] = true,
["sab"] = true,
["ctf"] = true,
["dd"] = true,
["hp"] = true,
["gun"] = true
}
local func = LUI.mp_hud.Scoreboard.DetermineIfSingleTeamGameType
LUI.mp_hud.Scoreboard.DetermineIfSingleTeamGameType = function()
local gametype = Engine.GetDvarString("ui_gametype")
if (gametypes[gametype]) then
return func()
end
return Game.GetPlayerTeam() == Teams.free
end
local updateicon = LUI.FactionIcon.Update
LUI.FactionIcon.Update = function(element, icon, a3)
local scale = LUI.FactionIcon.BackgroundScale
if (game:isdefaultmaterial(icon .. "_soft")) then
LUI.FactionIcon.BackgroundScale = 0
end
updateicon(element, icon, a3)
LUI.FactionIcon.BackgroundScale = scale
end

View File

@ -0,0 +1,25 @@
LUI.MenuBuilder.registerPopupType("ShaderCacheDialog_original", LUI.ShaderCacheDialog.new)
local function dialog(...)
if (game:sharedget("has_accepted_shader_caching") == "1") then
return LUI.ShaderCacheDialog.new(...)
end
return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", {
popup_title = Engine.Localize("@MENU_WARNING"),
message_text = Engine.Localize("@PLATFORM_SHADER_PRECACHE_ASK"),
yes_action = function()
game:sharedset("has_accepted_shader_caching", "1")
LUI.FlowManager.RequestAddMenu(nil, "ShaderCacheDialog_original")
end,
yes_text = Engine.Localize("@MENU_YES"),
no_text = Engine.Localize("@MENU_NO_DONT_ASK"),
no_action = function()
Engine.SetDvarInt("r_preloadShadersFrontendAllow", 0)
end,
default_focus_index = 2,
cancel_will_close = false
})
end
LUI.MenuBuilder.m_types_build["ShaderCacheDialog"] = dialog

View File

@ -0,0 +1,53 @@
if Engine.InFrontend() then
local levelselectmenu = LUI.sp_menus.LevelSelectMenu
levelselectmenu.SetupInfoBoxRightForArcadeMode = function(f44_arg0, f44_arg1)
return false
end
LUI.LevelSelect.AddLevelListButtons = function(f50_arg0, f50_arg1)
for f50_local0 = 1, #f50_arg1, 1 do
if not Engine.GetDvarBool("arcademode") or not f50_arg1[f50_local0].narativeLevel then
f50_arg0:AddLevelListEntry(f50_local0, f50_arg1[f50_local0])
end
end
if not Engine.GetDvarBool("arcademode") then
if Engine.GetDvarBool("profileMenuOption_hasUnlockedAll_SP") then
f50_arg0:AddHelp({
name = "add_button_helper_text",
button_ref = "button_alt2",
helper_text = Engine.Localize("@LUA_MENU_CANCEL_UNLOCK_CAPS"),
side = "right",
clickable = true
}, levelselectmenu.SetUnlockAll)
else
f50_arg0:AddHelp({
name = "add_button_helper_text",
button_ref = "button_alt2",
helper_text = Engine.Localize("@LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE"),
side = "right",
clickable = true
}, levelselectmenu.UnlockAllPopup)
end
end
end
levelselectmenu.UnlockAllPopup = function(f56_arg0, f56_arg1)
LUI.FlowManager.RequestAddMenu(nil, "request_yesno_popup_generic", true, f56_arg1.controller, nil, {
popup_title = Engine.Localize("@LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE"),
yes_action = levelselectmenu.SetUnlockAll,
message_text = Engine.Localize("@MENU_COMPLETED_CHEAT") .. ". " ..
Engine.Localize("@LUA_MENU_CAMPAIGN_UNLOCKED_ALL_DESC")
})
end
levelselectmenu.SetUnlockAll = function(f57_arg0, f57_arg1)
Engine.SetDvarBool("profileMenuOption_hasUnlockedAll_SP",
not Engine.GetDvarBool("profileMenuOption_hasUnlockedAll_SP"))
Engine.SetDvarBool("mis_cheat", not Engine.GetDvarBool("mis_cheat"))
Engine.ExecNow("profile_menuDvarsFinish")
Engine.Exec("updategamerprofile")
local f57_local0 = LUI.FlowManager.GetTopOpenAndVisibleMenuName()
LUI.FlowManager.RequestAddMenu(nil, f57_local0, true, f57_arg1.controller, true,
LUI.LevelSelect.FindActData(f57_local0), {
reload = true
})
end
end

View File

@ -4,3 +4,4 @@ end
require("lobby")
require("serverlist")
require("confirm")

View File

@ -0,0 +1,12 @@
LUI.MenuBuilder.m_types_build["popup_confirmdownload"] = function()
return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", {
popup_title = Engine.Localize("@MENU_NOTICE"),
message_text = Engine.Localize("@LUA_MENU_3RD_PARTY_CONTENT_DESC", download.getwwwurl()),
yes_action = function()
download.userdownloadresponse(true)
end,
no_action = function()
download.userdownloadresponse(false)
end
})
end

View File

@ -1,8 +1,6 @@
local Lobby = luiglobals.Lobby
local MPLobbyOnline = LUI.mp_menus.MPLobbyOnline
game:addlocalizedstring("LUA_MENU_SERVERLIST", "SERVER LIST")
function LeaveLobby(f5_arg0)
LeaveXboxLive()
if Lobby.IsInPrivateParty() == false or Lobby.IsPrivatePartyHost() then
@ -28,6 +26,12 @@ function menu_xboxlive(f16_arg0, f16_arg1)
menu:AddBarracksButton()
menu:AddPersonalizationButton()
menu:AddDepotButton()
-- kinda a weird place to do this, but it's whatever
-- add "MODS" button below depot button
local modsButton = menu:AddButton("@MENU_MODS", function(a1, a2)
LUI.FlowManager.RequestAddMenu(a1, "mods_menu", true, nil)
end)
end
local privateMatchButton = menu:AddButton("@MENU_PRIVATE_MATCH", MPLobbyOnline.OnPrivateMatch,

View File

@ -0,0 +1,252 @@
local Lobby = luiglobals.Lobby
local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu
if (not SystemLinkJoinMenu) then
return
end
local columns = {{
offset = 40,
text = "@MENU_HOST_NAME",
dataindex = 0
}, {
offset = 500,
text = "@MENU_MAP",
dataindex = 1
}, {
offset = 725,
text = "@MENU_TYPE1",
dataindex = 3
}, {
offset = 920,
text = "@MENU_NUMPLAYERS",
dataindex = 2
}, {
offset = 1070,
text = "@MENU_PING",
dataindex = 4
}, {
offset = 10,
image = "s1_icon_locked",
customelement = function(value, offset)
return LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
left = offset,
top = 2,
material = RegisterMaterial(CoD.Material.RestrictedIcon),
alpha = value == "1" and 1 or 0,
color = {
r = 1,
b = 1,
g = 1
}
})
end,
dataindex = 5
}}
function textlength(text, font, height)
local _, _, width = luiglobals.GetTextDimensions(text, font, height)
return width
end
function trimtext(text, font, height, maxwidth)
if (maxwidth < 0) then
return text
end
while (textlength(text, font, height) > maxwidth) do
text = text:sub(1, #text - 1)
end
return text
end
SystemLinkJoinMenu.AddHeaderButton = function(menu, f12_arg1, width)
local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft)
state.width = width
local element = LUI.UIElement.new(state)
local button = SystemLinkJoinMenu.CreateButton("header", 24)
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40,
LUI.Divider.Grey))
button:makeNotFocusable()
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40,
LUI.Divider.Grey))
button.m_eventHandlers = {}
for i = 1, #columns do
if (columns[i].text) then
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil)
elseif (columns[i].image) then
local image = LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
top = 2,
left = columns[i].offset,
material = RegisterMaterial(columns[i].image)
})
button.textHolder:addElement(image)
end
end
element:addElement(button)
menu:addElement(element)
end
SystemLinkJoinMenu.AddServerButton = function(menu, controller, index)
local button = SystemLinkJoinMenu.CreateButton(index or "header", 24)
button:makeFocusable()
button.index = index
button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame)
local gettext = function(i)
local text = Lobby.GetServerData(controller, index, columns[i].dataindex)
if (columns[i].customelement) then
text = columns[i].customelement(text)
end
local islast = not columns[i + 1]
local end_ = islast and 1130 or columns[i + 1].offset
local maxlength = end_ - columns[i].offset
if (maxlength < 0) then
maxlength = columns[i].offset - end_
end
if (not islast) then
maxlength = maxlength - 50
end
return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength)
end
for i = 1, #columns do
if (columns[i].customelement) then
local value = Lobby.GetServerData(controller, index, columns[i].dataindex)
local element = columns[i].customelement(value, columns[i].offset)
button.textHolder:addElement(element)
else
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i),
luiglobals.Colors.h1.medium_grey)
end
end
menu.list:addElement(button)
return button
end
SystemLinkJoinMenu.MakeText = function(menu, f5_arg1, text, color)
local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left)
state.font = CoD.TextSettings.TitleFontSmall.Font
state.top = -6
state.height = 14
state.alignment = nil
state.glow = LUI.GlowState.None
state.color = color
local el = LUI.UIText.new(state)
el:registerAnimationState("focused", {
color = luiglobals.Colors.white
})
el:registerEventHandler("focused", function(element, event)
element:animateToState("focused", 0)
end)
el:registerEventHandler("unfocused", function(element, event)
element:animateToState("default", 0)
end)
el:setText(text)
menu:addElement(el)
return el
end
function menu_systemlink_join(f19_arg0, f19_arg1)
local width = 1145
local menu = LUI.MenuTemplate.new(f19_arg0, {
menu_title = "@PLATFORM_SYSTEM_LINK_TITLE",
menu_width = width,
menu_top_indent = 20,
disableDeco = true,
spacing = 1
})
SystemLinkJoinMenu.AddHeaderButton(menu, 80, width)
SystemLinkJoinMenu.AddLowerCounter(menu, width)
SystemLinkJoinMenu.UpdateCounterText(menu, nil)
Lobby.BuildServerList(Engine.GetFirstActiveController())
local playercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right
})
menu:addElement(playercount)
local servercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58 - 25,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right
})
menu:addElement(servercount)
menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event)
SystemLinkJoinMenu.UpdateCounterText(menu, event)
playercount:setText(Engine.Localize("@SERVERLIST_PLAYER_COUNT", serverlist:getplayercount()))
servercount:setText(Engine.Localize("@SERVERLIST_SERVER_COUNT", serverlist:getservercount()))
end)
SystemLinkJoinMenu.UpdateGameList(menu)
menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList)
LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, {
side = "all"
})
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_alt1",
helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"),
side = "right",
clickable = true,
priority = -1000
}, function(f21_arg0, f21_arg1)
SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu)
end)
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_action",
helper_text = Engine.Localize("@MENU_JOIN_GAME1"),
side = "left",
clickable = false,
priority = -1000
}, nil, nil, true)
menu:AddBackButton()
Lobby.RefreshServerList(Engine.GetFirstActiveController())
return menu
end
LUI.MenuBuilder.m_types_build["menu_systemlink_join"] = menu_systemlink_join

View File

@ -0,0 +1,145 @@
if (game:issingleplayer() or not Engine.InFrontend()) then
return
end
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = Engine.ToUpperCase(Engine.Localize(text))
}))
menu.list:addElement(element)
end
local personalizationbutton = LUI.MPLobbyBase.AddPersonalizationButton
LUI.MPLobbyBase.AddPersonalizationButton = function(menu)
personalizationbutton(menu)
menu:AddButton("@LUA_MENU_STATS", function()
LUI.FlowManager.RequestAddMenu(nil, "stats_menu")
end)
end
LUI.MenuBuilder.registerType("stats_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_STATS")),
menu_width = luiglobals.GenericMenuDims.OptionMenuWidth
})
createdivider(menu, "LUA_MENU_SETTINGS")
LUI.Options.CreateOptionButton(menu, "cg_unlockall_items", "@LUA_MENU_UNLOCKALL_ITEMS",
"@LUA_MENU_UNLOCKALL_ITEMS_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_loot", "@LUA_MENU_UNLOCKALL_LOOT",
"@LUA_MENU_UNLOCKALL_LOOT_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_classes", "@LUA_MENU_UNLOCKALL_CLASSES",
"@LUA_MENU_UNLOCKALL_CLASSES_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
createdivider(menu, "LUA_MENU_EDIT_STATS")
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige)
prestigeeditbutton(menu, function(value)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "prestige", tonumber(value))
end)
rankeditbutton(menu, function(value)
local rank = tonumber(value)
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = rank == 0 and 0 or Rank.GetRankMaxXP(tonumber(value) - 1, prestige)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "experience", experience)
end)
LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton()
return menu
end)
function prestigeeditbutton(menu, callback)
local options = {}
local max = Lobby.GetMaxPrestigeLevel()
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, {
text = "@" .. i,
value = i .. ""
})
end
Engine.SetDvarFromString("ui_prestige_level", prestige .. "")
LUI.Options.CreateOptionButton(menu, "ui_prestige_level", "@LUA_MENU_PRESTIGE", "@LUA_MENU_PRESTIGE_DESC", options,
nil, nil, callback)
end
function rankeditbutton(menu, callback)
local options = {}
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige)
local max = Rank.GetMaxRank(prestige)
local maxprestige = Lobby.GetMaxPrestigeLevel()
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, {
text = "@" .. (i + 1),
value = i .. ""
})
end
Engine.SetDvarFromString("ui_rank_level_", rank .. "")
return LUI.Options.CreateOptionButton(menu, "ui_rank_level_", "@LUA_MENU_RANK", "@LUA_MENU_RANK_DESC", options, nil,
nil, callback)
end
local isclasslocked = Cac.IsCustomClassLocked
Cac.IsCustomClassLocked = function(...)
if (Engine.GetDvarBool("cg_unlockall_classes")) then
return false
end
return isclasslocked(...)
end

View File

@ -1,117 +0,0 @@
-- modified version of https://github.com/Joelrau/S1x-IW6x-g_log-script (permission to use by author)
if (game:getdvar("gamemode") ~= "mp") then
return
end
-- setup dvars
game:setdvarifuninitialized("logfile", 1)
if (tonumber(game:getdvar("logfile")) < 1) then
return
end
game:setdvarifuninitialized("g_log", "logs/games_mp.log")
start_time = 0
function get_time()
local seconds = math.floor((game:gettime() - start_time) / 1000)
local minutes = math.floor(seconds / 60)
time = string.format("%d:%02d", minutes, seconds - minutes * 60)
while (string.len(time) < 6) do
time = " " .. time
end
time = time .. " "
return time
end
function create_path(path)
local dir = path:gsub("%/", "\\"):match("(.*[\\])")
os.execute("if not exist " .. dir .. " mkdir " .. dir)
end
function log_print(message)
local path = game:getdvar("g_log")
local file = io.open(path, "a")
if (file == nil) then
create_path(path)
file = assert(io.open(path, "a"))
end
file:write(get_time() .. message .. "\n")
file:close()
end
function init()
start_time = game:gettime()
log_print("------------------------------------------------------------")
log_print("InitGame")
-- player callbacks
level:onnotify("connected", function(player)
player:player_connected()
end)
level:onnotify("say", function(player, message, hidden)
player:say(message)
end)
level:onnotify("say_team", function(player, message, hidden)
player:say(message, "say_team")
end)
-- damage/killed hooks
game:onplayerdamage(player_damage)
game:onplayerkilled(player_killed)
-- other level notifies for log
level:onnotify("exitLevel_called", function()
log_print("ExitLevel: executed")
end)
level:onnotify("shutdownGame_called", function()
log_print("ShutdownGame:")
log_print("------------------------------------------------------------")
end)
end
function entity:player_connected()
log_print(string.format("J;%s;%i;%s", self:getguid(), self:getentitynumber(), self.name))
self:onnotifyonce("disconnect", function()
self:disconnect()
end)
end
function entity:disconnect()
log_print(string.format("Q;%s;%i;%s", self:getguid(), self:getentitynumber(), self.name))
end
function player_damage(self_, inflictor, attacker, damage, dflags, mod, weapon, vPoint, vDir, hitLoc)
if (game:isplayer(attacker) == 1) then
log_print(string.format("D;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
self_.team, self_.name, attacker:getguid(), attacker:getentitynumber(), attacker.team, attacker.name,
weapon, damage, mod, hitLoc))
else
log_print(string.format("D;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
self_.team, self_.name, "", "-1", "world", "", weapon, damage, mod, hitLoc))
end
end
function player_killed(self_, inflictor, attacker, damage, mod, weapon, vDir, hitLoc, psTimeOffset, deathAnimDuration)
if (game:isplayer(attacker) == 1) then
log_print(string.format("K;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
self_.team, self_.name, attacker:getguid(), attacker:getentitynumber(), attacker.team, attacker.name,
weapon, damage, mod, hitLoc))
else
log_print(string.format("K;%s;%i;%s;%s;%s;%i;%s;%s;%s;%i;%s;%s", self_:getguid(), self_:getentitynumber(),
self_.team, self_.name, "", "-1", "world", "", weapon, damage, mod, hitLoc))
end
end
-- this function handles 'say' and 'say_team'
function entity:say(message, mode)
if (not mode) then
mode = "say"
end
log_print(string.format("%s;%s;%i;%s;%s", mode, self:getguid(), self:getentitynumber(), self.name, message))
end
init()

View File

@ -1,23 +0,0 @@
game:addlocalizedstring("CUSTOM_DEPOT_EULA_1", "Dear User,")
game:addlocalizedstring("CUSTOM_DEPOT_EULA_2",
"By using this feature, you acknowledge that you are over 18 years old, and that any sort of chance games / gambling are allowed in your country (even if they do not involve real money).")
game:addlocalizedstring("CUSTOM_DEPOT_EULA_3",
"The H1-Mod team is not responsible if you break the law within your country, and the sole responsibility will be upon you to respect the same.")
game:addlocalizedstring("CUSTOM_DEPOT_EULA_4",
"The H1-Mod team will never include real money transactions within the modified systems. The only way to get currency, should you wish to, is by playing the game.")
game:addlocalizedstring("CUSTOM_DEPOT_EULA_5", "Best Regards,")
game:addlocalizedstring("CUSTOM_DEPOT_EULA_6", "The H1-Mod Team.")
local mod_eula = function(unk1, unk2)
return LUI.EULABase.new(CoD.CreateState(0, 0, 0, 0, CoD.AnchorTypes.All), {
textStrings = LUI.EULABase.CreateTextStrings("@CUSTOM_DEPOT_EULA_", 6),
declineCallback = function(unk3)
unk2.declineCallback(unk3)
end,
acceptCallback = function(unk4)
unk2.acceptCallback(unk4)
end
})
end
LUI.MenuBuilder.registerPopupType("mod_eula", mod_eula)

View File

@ -1,272 +0,0 @@
if (game:issingleplayer() or Engine.InFrontend()) then
return
end
local container = LUI.UIVerticalList.new({
topAnchor = true,
rightAnchor = true,
top = 20,
right = 200,
width = 200,
spacing = 5,
})
function canasktojoin(userid)
history = history or {}
if (history[userid] ~= nil) then
return false
end
history[userid] = true
game:ontimeout(function()
history[userid] = nil
end, 15000)
return true
end
function truncatename(name, length)
if (#name <= length - 3) then
return name
end
return name:sub(1, length - 3) .. "..."
end
function addrequest(request)
if (not canasktojoin(request.userid)) then
return
end
if (container.temp) then
container:removeElement(container.temp)
container.temp = nil
end
local invite = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
height = 75,
})
invite:registerAnimationState("move_in", {
leftAnchor = true,
height = 75,
width = 200,
left = -220,
})
invite:animateToState("move_in", 100)
local background = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
top = 1,
left = 1,
bottom = -1,
right = -1,
material = RegisterMaterial("white"),
color = {
r = 0,
b = 0,
g = 0,
},
alpha = 0.6,
})
local border = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
material = RegisterMaterial("btn_focused_rect_innerglow"),
})
border:setup9SliceImage(10, 5, 0.25, 0.12)
local paddingvalue = 10
local padding = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
top = paddingvalue,
left = paddingvalue,
right = -paddingvalue,
bottom = -paddingvalue,
})
local avatarmaterial = discord.getavatarmaterial(request.userid)
local avatar = LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
width = 32,
height = 32,
left = 1,
material = RegisterMaterial(avatarmaterial)
})
local username = LUI.UIText.new({
leftAnchor = true,
topAnchor = true,
height = 12,
left = 32 + paddingvalue,
color = Colors.white,
alignment = LUI.Alignment.Left,
rightAnchor = true,
font = CoD.TextSettings.BodyFontBold.Font
})
username:setText(string.format("%s^7#%s requested to join your game!",
truncatename(request.username, 18), request.discriminator))
local buttons = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
topAnchor = true,
top = 37,
height = 18,
})
local createbutton = function(text, left)
local button = LUI.UIElement.new({
leftAnchor = left,
rightAnchor = not left,
topAnchor = true,
height = 18,
width = 85,
material = RegisterMaterial("btn_focused_rect_innerglow"),
})
local center = LUI.UIText.new({
rightAnchor = true,
height = 12,
width = 85,
top = -6.5,
alignment = LUI.Alignment.Center,
font = CoD.TextSettings.BodyFontBold.Font
})
button:setup9SliceImage(10, 5, 0.25, 0.12)
center:setText(text)
button:addElement(center)
return button
end
buttons:addElement(createbutton("[F1] Accept", true))
buttons:addElement(createbutton("[F2] Deny"))
local fadeouttime = 50
local timeout = 10 * 1000 - fadeouttime
local function close()
container:processEvent({
name = "update_navigation",
dispatchToChildren = true
})
invite:animateToState("fade_out", fadeouttime)
invite:addElement(LUI.UITimer.new(fadeouttime + 50, "remove"))
invite:registerEventHandler("remove", function()
container:removeElement(invite)
if (container.temp) then
container:removeElement(container.temp)
container.temp = nil
end
local temp = LUI.UIElement.new({})
container.temp = temp
container:addElement(temp)
end)
end
buttons:registerEventHandler("keydown_", function(element, event)
if (event.key == "F1") then
close()
discord.respond(request.userid, discord.reply.yes)
end
if (event.key == "F2") then
close()
discord.respond(request.userid, discord.reply.no)
end
end)
invite:registerAnimationState("fade_out", {
leftAnchor = true,
rightAnchor = true,
height = 75,
alpha = 0,
left = 0
})
invite:addElement(LUI.UITimer.new(timeout, "end_invite"))
invite:registerEventHandler("end_invite", function()
close()
discord.respond(request.userid, discord.reply.ignore)
end)
local bar = LUI.UIImage.new({
bottomAnchor = true,
leftAnchor = true,
bottom = -3,
left = 3,
width = 200 - 6,
material = RegisterMaterial("white"),
height = 2,
color = {
r = 92 / 255,
g = 206 / 255,
b = 113 / 255,
}
})
bar:registerAnimationState("closing", {
bottomAnchor = true,
leftAnchor = true,
bottom = -3,
left = 3,
width = 0,
height = 2,
})
bar:animateToState("closing", timeout)
avatar:registerEventHandler("update", function()
local avatarmaterial = discord.getavatarmaterial(request.userid)
avatar:setImage(RegisterMaterial(avatarmaterial))
end)
avatar:addElement(LUI.UITimer.new(100, "update"))
invite:addElement(background)
invite:addElement(bar)
invite:addElement(border)
invite:addElement(padding)
padding:addElement(username)
padding:addElement(avatar)
padding:addElement(buttons)
container:addElement(invite)
end
container:registerEventHandler("keydown", function(element, event)
local first = container:getFirstChild()
if (not first) then
return
end
first:processEvent({
name = "keydown_",
key = event.key
})
end)
LUI.roots.UIRoot0:registerEventHandler("discord_join_request", function(element, event)
addrequest(event.request)
end)
LUI.roots.UIRoot0:addElement(container)

View File

@ -1 +0,0 @@
-- this patch has been moved to ui_scripts/patches/gamemodes.lua

View File

@ -1,198 +0,0 @@
local mphud = luiglobals.require("LUI.mp_hud.MPHud")
local barheight = 16
local textheight = 13
local textoffsety = barheight / 2 - textheight / 2
function createinfobar()
local infobar = LUI.UIElement.new({
left = 213,
top = -6,
height = barheight,
width = 70,
leftAnchor = true,
topAnchor = true
})
infobar:registerAnimationState("minimap_on", {
left = 213,
top = -6,
height = barheight,
width = 70,
leftAnchor = true,
topAnchor = true
})
infobar:registerAnimationState("minimap_off", {
left = 0,
top = 0,
height = barheight,
width = 70,
leftAnchor = true,
topAnchor = true
})
infobar:registerAnimationState("hud_on", {
alpha = 1
})
infobar:registerAnimationState("hud_off", {
alpha = 0
})
return infobar
end
function updateinfobarvisibility()
local root = Engine.GetLuiRoot()
local menus = root:AnyActiveMenusInStack()
local infobar = root.infobar
if (not infobar) then
return
end
if (menus or Game.InKillCam()) then
infobar:animateToState("hud_off")
else
infobar:animateToState("hud_on")
end
local validstates = {
"hud_on",
"active",
"nosignal",
"scrambled"
}
infobar:animateToState("minimap_off")
for i = 1, #validstates do
if (validstates[i] == root.hud.minimap.current_state) then
infobar:animateToState("minimap_on")
break
end
end
end
function populateinfobar(infobar)
elementoffset = 0
if (Engine.GetDvarBool("cg_infobar_fps")) then
infobar:addElement(infoelement({
label = "FPS: ",
getvalue = function()
return game:getfps()
end,
width = 70,
interval = 100
}))
end
if (Engine.GetDvarBool("cg_infobar_ping")) then
infobar:addElement(infoelement({
label = "Latency: ",
getvalue = function()
return game:getping() .. " ms"
end,
width = 115,
interval = 100
}))
end
updateinfobarvisibility()
end
function infoelement(data)
local container = LUI.UIElement.new({
bottomAnchor = true,
leftAnchor = true,
topAnchor = true,
width = data.width,
left = elementoffset
})
elementoffset = elementoffset + data.width + 10
local background = LUI.UIImage.new({
bottomAnchor = true,
leftAnchor = true,
topAnchor = true,
rightAnchor = true,
material = luiglobals.RegisterMaterial("white"),
color = luiglobals.Colors.black,
alpha = 0.5
})
local labelfont = CoD.TextSettings.FontBold110
local label = LUI.UIText.new({
left = 5,
top = textoffsety,
font = labelfont.Font,
height = textheight,
leftAnchor = true,
topAnchor = true,
color = {
r = 0.8,
g = 0.8,
b = 0.8
}
})
label:setText(data.label)
local _, _, left = luiglobals.GetTextDimensions(data.label, labelfont.Font, textheight)
local value = LUI.UIText.new({
left = left + 5,
top = textoffsety,
font = labelfont.Font,
height = textheight,
leftAnchor = true,
topAnchor = true,
color = {
r = 0.6,
g = 0.6,
b = 0.6
}
})
value:addElement(LUI.UITimer.new(data.interval, "update"))
value:setText(data.getvalue())
value:addEventHandler("update", function()
value:setText(data.getvalue())
end)
container:addElement(background)
container:addElement(label)
container:addElement(value)
return container
end
local updatehudvisibility = mphud.updateHudVisibility
mphud.updateHudVisibility = function(a1, a2)
updatehudvisibility(a1, a2)
updateinfobarvisibility()
end
LUI.onmenuopen("mp_hud", function(hud)
if (Engine.InFrontend()) then
return
end
local infobar = createinfobar()
local root = Engine.GetLuiRoot()
root.infobar = infobar
root.hud = hud
populateinfobar(infobar)
root:registerEventHandler("update_hud_infobar_settings", function()
infobar:removeAllChildren()
populateinfobar(infobar)
end)
root:processEvent({
name = "update_hud_infobar_settings"
})
hud.static.scalable:addElement(infobar)
end)

View File

@ -1,144 +0,0 @@
local pcdisplay = luiglobals.require("LUI.PCDisplay")
game:addlocalizedstring("LUA_MENU_FPS", "FPS Counter")
game:addlocalizedstring("LUA_MENU_FPS_DESC", "Show FPS Counter.")
game:addlocalizedstring("LUA_MENU_LATENCY", "Server Latency")
game:addlocalizedstring("LUA_MENU_LATENCY_DESC", "Show server latency.")
game:addlocalizedstring("LUA_MENU_RED_DOT_BRIGHTNESS", "Red dot Brightness")
game:addlocalizedstring("LUA_MENU_RED_DOT_BRIGHTNESS_DESC", "Adjust the brightness of red dot reticles.")
game:addlocalizedstring("MENU_SYSINFO_CUSTOMER_SUPPORT_URL", "https://h1.gg/")
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = text
}))
menu.list:addElement(element)
end
pcdisplay.CreateOptions = function(menu)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_COLORBLIND_FILTER", "@LUA_MENU_COLOR_BLIND_DESC", LUI.Options.GetRenderColorBlindText,
LUI.Options.RenderColorBlindToggle, LUI.Options.RenderColorBlindToggle)
if Engine.IsMultiplayer() and Engine.GetDvarType("cg_paintballFx") == luiglobals.DvarTypeTable.DvarBool then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_PAINTBALL", "@LUA_MENU_PAINTBALL_DESC",
LUI.Options.GetDvarEnableTextFunc("cg_paintballFx", false), LUI.Options.ToggleDvarFunc("cg_paintballFx"),
LUI.Options.ToggleDvarFunc("cg_paintballFx"))
end
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, "@LUA_MENU_BLOOD",
"@LUA_MENU_BLOOD_DESC", LUI.Options.GetDvarEnableTextFunc("cg_blood", false), LUI.Options
.ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0)), LUI.Options
.ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0)))
if not Engine.IsMultiplayer() then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_CROSSHAIR", "@LUA_MENU_CROSSHAIR_DESC",
LUI.Options.GetDvarEnableTextFunc("cg_drawCrosshairOption", false),
LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption"), LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption"))
LUI.Options.CreateOptionButton(menu, "cg_drawDamageFeedbackOption", "@LUA_MENU_HIT_MARKER",
"@LUA_MENU_HIT_MARKER_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}})
end
if Engine.IsMultiplayer() then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_KILLSTREAK_COUNTER", "@MENU_DISPLAY_KILLSTREAK_COUNTER_DESC",
pcdisplay.GetDisplayKillstreakCounterText, pcdisplay.DisplayKillstreakCounterToggle,
pcdisplay.DisplayKillstreakCounterToggle)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_MEDAL_SPLASHES", "@MENU_DISPLAY_MEDAL_SPLASHES_DESC", pcdisplay.GetDisplayMedalSplashesText,
pcdisplay.DisplayMedalSplashesToggle, pcdisplay.DisplayMedalSplashesToggle)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_WEAPON_EMBLEMS", "@MENU_DISPLAY_WEAPON_EMBLEMS_DESC", pcdisplay.GetDisplayWeaponEmblemsText,
pcdisplay.DisplayWeaponEmblemsToggle, pcdisplay.DisplayWeaponEmblemsToggle)
end
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Common, "@MENU_BRIGHTNESS",
"@MENU_BRIGHTNESS_DESC1", nil, nil, nil, pcdisplay.OpenBrightnessMenu, nil, nil, nil)
local reddotbounds = {
step = 0.2,
max = 4,
min = 0.2
}
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Slider,
"@LUA_MENU_RED_DOT_BRIGHTNESS",
"@LUA_MENU_RED_DOT_BRIGHTNESS_DESC",
function()
return (Engine.GetDvarFloat( "r_redDotBrightnessScale" ) -
reddotbounds.min) / (reddotbounds.max - reddotbounds.min)
end,
function()
Engine.SetDvarFloat("r_redDotBrightnessScale",
math.min(reddotbounds.max,
math.max(reddotbounds.min, Engine.GetDvarFloat("r_redDotBrightnessScale") - reddotbounds.step))
)
end,
function()
Engine.SetDvarFloat("r_redDotBrightnessScale",
math.min(reddotbounds.max,
math.max(reddotbounds.min, Engine.GetDvarFloat("r_redDotBrightnessScale") + reddotbounds.step))
)
end
)
createdivider(menu, "TELEMETRY")
LUI.Options.CreateOptionButton(menu, "cg_infobar_ping", "@LUA_MENU_LATENCY", "@LUA_MENU_LATENCY_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil, function(value)
Engine.SetDvarBool("cg_infobar_ping", value)
Engine.GetLuiRoot():processEvent({
name = "update_hud_infobar_settings"
})
end)
LUI.Options.CreateOptionButton(menu, "cg_infobar_fps", "@LUA_MENU_FPS", "@LUA_MENU_FPS_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil, function(value)
Engine.SetDvarBool("cg_infobar_fps", value)
Engine.GetLuiRoot():processEvent({
name = "update_hud_infobar_settings"
})
end)
LUI.Options.InitScrollingList(menu.list, nil)
end

View File

@ -1,3 +0,0 @@
if (game:issingleplayer()) then
require("loading")
end

View File

@ -1,123 +0,0 @@
game:addlocalizedstring("MENU_MODS", "MODS")
game:addlocalizedstring("MENU_MODS_DESC", "Load installed mods.")
game:addlocalizedstring("LUA_MENU_MOD_DESC_DEFAULT", "Load &&1.")
game:addlocalizedstring("LUA_MENU_MOD_DESC", "&&1\nAuthor: &&2\nVersion: &&3")
game:addlocalizedstring("LUA_MENU_LOADED_MOD", "Loaded mod: ^2&&1")
game:addlocalizedstring("LUA_MENU_AVAILABLE_MODS", "Available mods")
game:addlocalizedstring("LUA_MENU_UNLOAD", "Unload")
game:addlocalizedstring("LUA_MENU_UNLOAD_DESC", "Unload the currently loaded mod.")
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = Engine.ToUpperCase(text)
}))
element.text = element:getFirstChild():getFirstChild():getNextSibling()
menu.list:addElement(element)
return element
end
function string:truncate(length)
if (#self <= length) then
return self
end
return self:sub(1, length - 3) .. "..."
end
LUI.addmenubutton("main_campaign", {
index = 6,
text = "@MENU_MODS",
description = Engine.Localize("@MENU_MODS_DESC"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "mods_menu")
end
})
function getmodname(path)
local name = path
game:addlocalizedstring(name, name)
game:addlocalizedstring("LUA_MENU_MOD_DESC_DEFAULT", "Load &&1.")
local desc = Engine.Localize("LUA_MENU_MOD_DESC_DEFAULT", name)
local infofile = path .. "/info.json"
if (io.fileexists(infofile)) then
pcall(function()
local data = json.decode(io.readfile(infofile))
game:addlocalizedstring(data.description, data.description)
game:addlocalizedstring(data.author, data.author)
game:addlocalizedstring(data.version, data.version)
desc = Engine.Localize("@LUA_MENU_MOD_DESC",
data.description, data.author, data.version)
name = data.name
end)
end
return name, desc
end
LUI.MenuBuilder.registerType("mods_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = "@MENU_MODS",
exclusiveController = 0,
menu_width = 400,
menu_top_indent = LUI.MenuTemplate.spMenuOffset,
showTopRightSmallBar = true
})
local modfolder = game:getloadedmod()
if (modfolder ~= "") then
local name = getmodname(modfolder)
createdivider(menu, Engine.Localize("@LUA_MENU_LOADED_MOD", name:truncate(24)))
menu:AddButton("@LUA_MENU_UNLOAD", function()
Engine.Exec("unloadmod")
end, nil, true, nil, {
desc_text = Engine.Localize("@LUA_MENU_UNLOAD_DESC")
})
end
createdivider(menu, Engine.Localize("@LUA_MENU_AVAILABLE_MODS"))
if (io.directoryexists("mods")) then
local mods = io.listfiles("mods/")
for i = 1, #mods do
if (io.directoryexists(mods[i]) and not io.directoryisempty(mods[i])) then
local name, desc = getmodname(mods[i])
if (mods[i] ~= modfolder) then
game:addlocalizedstring(name, name)
menu:AddButton(name, function()
Engine.Exec("loadmod " .. mods[i])
end, nil, true, nil, {
desc_text = desc
})
end
end
end
end
menu:AddBackButton(function(a1)
Engine.PlaySound(CoD.SFX.MenuBack)
LUI.FlowManager.RequestLeaveMenu(a1)
end)
LUI.Options.InitScrollingList(menu.list, nil)
menu:CreateBottomDivider()
menu.optionTextInfo = LUI.Options.AddOptionTextInfo(menu)
return menu
end)

View File

@ -1 +0,0 @@
-- this patch has been moved to ui_scripts/patches/no_mode_switch.lua

View File

@ -1,20 +0,0 @@
if (game:issingleplayer()) then
return
end
if (Engine.InFrontend()) then
require("shaderdialog")
require("gamemodes")
require("no_mode_switch")
require("disable_useless_things")
end
-- defined in mp_hud/hudutils.lua
function GetGameModeName()
return Engine.Localize(Engine.TableLookup(GameTypesTable.File,
GameTypesTable.Cols.Ref, GameX.GetGameMode(), GameTypesTable.Cols.Name))
end
function NeverAllowChangeTeams()
return false
end

View File

@ -1,17 +0,0 @@
-- Disable CP
Engine.SetDvarInt("ui_enable_cp", 0)
-- Disable CP store
Engine.SetDvarInt("ui_show_store", 0)
-- Remove CoD account button
if Engine.IsMultiplayer() and CoD.IsCoDAccountRegistrationAvailableInMyRegion() then
LUI.removemenubutton("pc_controls", 4)
end
-- Remove social button
LUI.MenuBuilder.m_definitions["online_friends_widget"] = function()
return {
type = "UIElement"
}
end

View File

@ -1,28 +0,0 @@
LUI.MenuBuilder.registerPopupType("ShaderCacheDialog_original", LUI.ShaderCacheDialog.new)
game:addlocalizedstring("PLATFORM_SHADER_PRECACHE_ASK", "Would you like to populate the shader cache? It may cause crashes with certain GPUs (e.g. RTX cards) but will improve performance if successful.")
game:addlocalizedstring("MENU_NO_DONT_ASK", "No, don't ask me again")
local function dialog(...)
if (game:sharedget("has_accepted_shader_caching") == "1") then
return LUI.ShaderCacheDialog.new(...)
end
return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", {
popup_title = Engine.Localize("@MENU_WARNING"),
message_text = Engine.Localize("@PLATFORM_SHADER_PRECACHE_ASK"),
yes_action = function()
game:sharedset("has_accepted_shader_caching", "1")
LUI.FlowManager.RequestAddMenu(nil, "ShaderCacheDialog_original")
end,
yes_text = Engine.Localize("@MENU_YES"),
no_text = Engine.Localize("@MENU_NO_DONT_ASK"),
no_action = function()
Engine.SetDvarInt("r_preloadShadersFrontendAllow", 0)
end,
default_focus_index = 2,
cancel_will_close = false
})
end
LUI.MenuBuilder.m_types_build["ShaderCacheDialog"] = dialog

View File

@ -1,263 +0,0 @@
local Lobby = luiglobals.Lobby
local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu
if (not SystemLinkJoinMenu) then
return
end
game:addlocalizedstring("MENU_NUMPLAYERS", "Players")
game:addlocalizedstring("MENU_PING", "Ping")
game:addlocalizedstring("SERVERLIST_PLAYER_COUNT", "&&1 Players")
game:addlocalizedstring("SERVERLIST_SERVER_COUNT", "&&1 Servers")
local columns = {
{
offset = 40,
text = "@MENU_HOST_NAME",
dataindex = 0
},
{
offset = 500,
text = "@MENU_MAP",
dataindex = 1
},
{
offset = 700,
text = "@MENU_TYPE1",
dataindex = 3
},
{
offset = 950,
text = "@MENU_NUMPLAYERS",
dataindex = 2
},
{
offset = 1100,
text = "@MENU_PING",
dataindex = 4
},
{
offset = 10,
image = "s1_icon_locked",
customelement = function(value, offset)
return LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
left = offset,
top = 2,
material = RegisterMaterial(CoD.Material.RestrictedIcon),
alpha = value == "1" and 1 or 0,
color = {
r = 1,
b = 1,
g = 1
}
})
end,
dataindex = 5
}
}
function textlength(text, font, height)
local _, _, width = luiglobals.GetTextDimensions(text, font, height)
return width
end
function trimtext(text, font, height, maxwidth)
if (maxwidth < 0) then
return text
end
while (textlength(text, font, height) > maxwidth) do
text = text:sub(1, #text - 1)
end
return text
end
SystemLinkJoinMenu.AddHeaderButton = function(menu, f12_arg1, width)
local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft)
state.width = width
local element = LUI.UIElement.new(state)
local button = SystemLinkJoinMenu.CreateButton("header", 24)
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40,
LUI.Divider.Grey))
button:makeNotFocusable()
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40,
LUI.Divider.Grey))
button.m_eventHandlers = {}
for i = 1, #columns do
if (columns[i].text) then
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil)
elseif (columns[i].image) then
local image = LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
top = 2,
left = columns[i].offset,
material = RegisterMaterial(columns[i].image)
})
button.textHolder:addElement(image)
end
end
element:addElement(button)
menu:addElement(element)
end
SystemLinkJoinMenu.AddServerButton = function(menu, controller, index)
local button = SystemLinkJoinMenu.CreateButton(index or "header", 24)
button:makeFocusable()
button.index = index
button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame)
local gettext = function(i)
local text = Lobby.GetServerData(controller, index, columns[i].dataindex)
if (columns[i].customelement) then
text = columns[i].customelement(text)
end
local islast = not columns[i + 1]
local end_ = islast and 1130 or columns[i + 1].offset
local maxlength = end_ - columns[i].offset
if (maxlength < 0) then
maxlength = columns[i].offset - end_
end
if (not islast) then
maxlength = maxlength - 50
end
return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength)
end
for i = 1, #columns do
if (columns[i].customelement) then
local value = Lobby.GetServerData(controller, index, columns[i].dataindex)
local element = columns[i].customelement(value, columns[i].offset)
button.textHolder:addElement(element)
else
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i), luiglobals.Colors.h1.medium_grey)
end
end
menu.list:addElement(button)
return button
end
SystemLinkJoinMenu.MakeText = function(menu, f5_arg1, text, color)
local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left)
state.font = CoD.TextSettings.TitleFontSmall.Font
state.top = -6
state.height = 14
state.alignment = nil
state.glow = LUI.GlowState.None
state.color = color
local el = LUI.UIText.new(state)
el:registerAnimationState("focused", {
color = luiglobals.Colors.white
})
el:registerEventHandler("focused", function(element, event)
element:animateToState("focused", 0)
end)
el:registerEventHandler("unfocused", function(element, event)
element:animateToState("default", 0)
end)
el:setText(text)
menu:addElement(el)
return el
end
function menu_systemlink_join(f19_arg0, f19_arg1)
local width = 1145
local menu = LUI.MenuTemplate.new(f19_arg0, {
menu_title = "@PLATFORM_SYSTEM_LINK_TITLE",
menu_width = width,
menu_top_indent = 20,
disableDeco = true,
spacing = 1
})
SystemLinkJoinMenu.AddHeaderButton(menu, 80, width)
SystemLinkJoinMenu.AddLowerCounter(menu, width)
SystemLinkJoinMenu.UpdateCounterText(menu, nil)
Lobby.BuildServerList(Engine.GetFirstActiveController())
local playercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right,
})
menu:addElement(playercount)
local servercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58 - 25,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right,
})
menu:addElement(servercount)
menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event)
SystemLinkJoinMenu.UpdateCounterText(menu, event)
playercount:setText(Engine.Localize("@SERVERLIST_PLAYER_COUNT", serverlist:getplayercount()))
servercount:setText(Engine.Localize("@SERVERLIST_SERVER_COUNT", serverlist:getservercount()))
end)
SystemLinkJoinMenu.UpdateGameList(menu)
menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList)
LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, {
side = "all"
})
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_alt1",
helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"),
side = "right",
clickable = true,
priority = -1000
}, function(f21_arg0, f21_arg1)
SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu)
end)
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_action",
helper_text = Engine.Localize("@MENU_JOIN_GAME1"),
side = "left",
clickable = false,
priority = -1000
}, nil, nil, true)
menu:AddBackButton()
Lobby.RefreshServerList(Engine.GetFirstActiveController())
return menu
end
LUI.MenuBuilder.m_types_build["menu_systemlink_join"] = menu_systemlink_join

View File

@ -1,171 +0,0 @@
if (game:issingleplayer() or not Engine.InFrontend()) then
return
end
game:addlocalizedstring("LUA_MENU_STATS", "Stats")
game:addlocalizedstring("LUA_MENU_STATS_DESC", "Edit player stats settings.")
game:addlocalizedstring("LUA_MENU_UNLOCKALL_ITEMS", "Unlock all items")
game:addlocalizedstring("LUA_MENU_UNLOCKALL_ITEMS_DESC",
"Whether items should be locked based on the player's stats or always unlocked.")
game:addlocalizedstring("LUA_MENU_UNLOCKALL_LOOT", "Unlock all loot")
game:addlocalizedstring("LUA_MENU_UNLOCKALL_LOOT_DESC",
"Whether loot should be locked based on the player's stats or always unlocked.")
game:addlocalizedstring("LUA_MENU_UNLOCKALL_CLASSES", "Unlock all classes")
game:addlocalizedstring("LUA_MENU_UNLOCKALL_CLASSES_DESC",
"Whether classes should be locked based on the player's stats or always unlocked.")
game:addlocalizedstring("LUA_MENU_PRESTIGE", "Prestige")
game:addlocalizedstring("LUA_MENU_PRESTIGE_DESC", "Edit prestige level.")
game:addlocalizedstring("LUA_MENU_RANK", "Rank")
game:addlocalizedstring("LUA_MENU_RANK_DESC", "Edit rank.")
game:addlocalizedstring("LUA_MENU_UNSAVED_CHANGES", "You have unsaved changes, are you sure you want to exit?")
game:addlocalizedstring("LUA_MENU_SAVE", "Save changes")
game:addlocalizedstring("LUA_MENU_SAVE_DESC", "Save changes.")
game:addlocalizedstring("LUA_MENU_SETTINGS", "Settings")
game:addlocalizedstring("LUA_MENU_EDIT_STATS", "Edit Stats")
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = Engine.ToUpperCase(Engine.Localize(text))
}))
menu.list:addElement(element)
end
local personalizationbutton = LUI.MPLobbyBase.AddPersonalizationButton
LUI.MPLobbyBase.AddPersonalizationButton = function(menu)
personalizationbutton(menu)
menu:AddButton("@LUA_MENU_STATS", function()
LUI.FlowManager.RequestAddMenu(nil, "stats_menu")
end)
end
LUI.MenuBuilder.registerType("stats_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_STATS")),
menu_width = luiglobals.GenericMenuDims.OptionMenuWidth
})
createdivider(menu, "@LUA_MENU_SETTINGS")
LUI.Options.CreateOptionButton(menu, "cg_unlockall_items", "@LUA_MENU_UNLOCKALL_ITEMS",
"@LUA_MENU_UNLOCKALL_ITEMS_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_loot", "@LUA_MENU_UNLOCKALL_LOOT",
"@LUA_MENU_UNLOCKALL_LOOT_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_classes", "@LUA_MENU_UNLOCKALL_CLASSES",
"@LUA_MENU_UNLOCKALL_CLASSES_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
createdivider(menu, "@LUA_MENU_EDIT_STATS")
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige)
prestigeeditbutton(menu, function(value)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "prestige", tonumber(value))
end)
rankeditbutton(menu, function(value)
local rank = tonumber(value)
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = rank == 0 and 0 or Rank.GetRankMaxXP(tonumber(value) - 1, prestige)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "experience", experience)
end)
LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton()
return menu
end)
function prestigeeditbutton(menu, callback)
local options = {}
local max = Lobby.GetMaxPrestigeLevel()
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, {
text = "@" .. i,
value = i .. ""
})
end
Engine.SetDvarFromString("ui_prestige_level", prestige .. "")
LUI.Options.CreateOptionButton(menu, "ui_prestige_level", "@LUA_MENU_PRESTIGE", "@LUA_MENU_PRESTIGE_DESC", options,
nil, nil, callback)
end
function rankeditbutton(menu, callback)
local options = {}
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige)
local max = Rank.GetMaxRank(prestige)
local maxprestige = Lobby.GetMaxPrestigeLevel()
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, {
text = "@" .. (i + 1),
value = i .. ""
})
end
Engine.SetDvarFromString("ui_rank_level_", rank .. "")
return LUI.Options.CreateOptionButton(menu, "ui_rank_level_", "@LUA_MENU_RANK", "@LUA_MENU_RANK_DESC", options, nil,
nil, callback)
end
local isclasslocked = Cac.IsCustomClassLocked
Cac.IsCustomClassLocked = function(...)
if (Engine.GetDvarBool("cg_unlockall_classes")) then
return false
end
return isclasslocked(...)
end

View File

@ -0,0 +1,16 @@
deu_h1_mod_common
eng_h1_mod_common
ens_h1_mod_common
fra_h1_mod_common
fra_h1_mod_common_mp
h1_mod_common
ita_h1_mod_common
jpp_h1_mod_common
kor_h1_mod_common
pol_h1_mod_common
por_h1_mod_common
rus_h1_mod_common
rus_h1_mod_common_mp
sch_h1_mod_common
spa_h1_mod_common
tch_h1_mod_common

View File

@ -0,0 +1 @@
localize,german
1 localize german

View File

@ -0,0 +1 @@
localize,english
1 localize english

View File

@ -0,0 +1 @@
localize,english_safe
1 localize english_safe

View File

@ -0,0 +1 @@
localize,french
1 localize french

View File

@ -0,0 +1 @@
localize,french
1 localize french

View File

@ -0,0 +1,2 @@
localize,english
ttf,fonts/default.otf
1 localize english
2 ttf fonts/default.otf

View File

@ -0,0 +1 @@
localize,italian
1 localize italian

View File

@ -0,0 +1 @@
localize,japanese_partial
1 localize japanese_partial

View File

@ -0,0 +1 @@
localize,korean
1 localize korean

View File

@ -0,0 +1 @@
localize,polish
1 localize polish

View File

@ -0,0 +1 @@
localize,portuguese
1 localize portuguese

View File

@ -0,0 +1 @@
localize,russian
1 localize russian

View File

@ -0,0 +1 @@
localize,russian
1 localize russian

View File

@ -0,0 +1 @@
localize,simplified_chinese
1 localize simplified_chinese

View File

@ -0,0 +1 @@
localize,spanish
1 localize spanish

View File

@ -0,0 +1 @@
localize,traditional_chinese
1 localize traditional_chinese

View File

@ -0,0 +1,33 @@
{
"LUA_MENU_SERVERLIST": "LISTE DES SERVEURS",
"MENU_NUMPLAYERS": "Joueurs",
"MENU_PING": "Latence",
"SERVERLIST_PLAYER_COUNT": "&&1 Joueurs",
"SERVERLIST_SERVER_COUNT": "&&1 Serveurs",
"LUA_MENU_STATS": "Stats",
"LUA_MENU_STATS_DESC": "Modifier les paramètres des statistiques du joueur.",
"LUA_MENU_UNLOCKALL_ITEMS": "Déverrouiller tous les éléments",
"LUA_MENU_UNLOCKALL_ITEMS_DESC": "Si les éléments doivent être verrouillés en fonction des statistiques du joueur ou toujours déverrouillés.",
"LUA_MENU_UNLOCKALL_LOOT": "Débloquez tout le butin",
"LUA_MENU_UNLOCKALL_LOOT_DESC": "Si le butin doit être verrouillé en fonction des statistiques du joueur ou toujours déverrouillé.",
"LUA_MENU_UNLOCKALL_CLASSES": "Débloquer toutes les classes",
"LUA_MENU_UNLOCKALL_CLASSES_DESC": "Si les classes doivent être verrouillées en fonction des statistiques du joueur ou toujours déverrouillées.",
"LUA_MENU_PRESTIGE": "Prestige",
"LUA_MENU_PRESTIGE_DESC": "Modifier le niveau de prestige.",
"LUA_MENU_RANK": "Grade",
"LUA_MENU_RANK_DESC": "Modifier le grade.",
"LUA_MENU_UNSAVED_CHANGES": "Vous avez des modifications non enregistrées, êtes-vous sûr de vouloir quitter ?",
"LUA_MENU_SAVE": "Sauvegarder les modifications",
"LUA_MENU_SAVE_DESC": "Sauvegarder les modifications.",
"LUA_MENU_SETTINGS": "Paramètres",
"LUA_MENU_EDIT_STATS": "Modifier les statistiques",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "Aucune mise à jour disponible",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "Une mise à jour est disponible,\npoursuivre l'installation ?",
"UPDATER_POPUP_SUCCESSFUL": "Mise à jour réussie",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "La mise à jour nécessite un redémarrage",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Vérification des mises à jour...",
"PLATFORM_SYSTEM_LINK_TITLE": "LISTE DES SERVEURS"
}

Binary file not shown.

View File

@ -0,0 +1,94 @@
{
"CUSTOM_DEPOT_EULA_1": "Dear User,",
"CUSTOM_DEPOT_EULA_2": "By using this feature, you acknowledge that you are over the age of 18 years old, and that any sort of gambling is allowed in your country. (even if they do not involve real money)",
"CUSTOM_DEPOT_EULA_3": "The H1-mod team is not responsible if you break any law within your country, and the sole responsibility will be upon you to respect the same.",
"CUSTOM_DEPOT_EULA_4": "The H1-mod team will never include real money transactions within the modified systems. The only way to get currency, should you wish to, is by playing the game.",
"CUSTOM_DEPOT_EULA_5": "Best regards,",
"CUSTOM_DEPOT_EULA_6": "The H1-mod team.",
"LUA_MENU_FPS": "FPS Counter",
"LUA_MENU_FPS_DESC": "Show FPS counter.",
"LUA_MENU_LATENCY": "Server Latency",
"LUA_MENU_LATENCY_DESC": "Show server latency.",
"LUA_MENU_RED_DOT_BRIGHTNESS": "Red Dot Brightness",
"LUA_MENU_RED_DOT_BRIGHTNESS_DESC": "Adjust the brightness of red dot reticles.",
"MENU_SYSINFO_CUSTOMER_SUPPORT_URL": "https://h1.gg/",
"MENU_MODS": "MODS",
"MENU_MODS_DESC": "Load installed mods.",
"LUA_MENU_MOD_DESC_DEFAULT": "Load &&1.",
"LUA_MENU_MOD_DESC": "&&1\nAuthor: &&2\nVersion: &&3",
"LUA_MENU_LOADED_MOD": "Loaded mod: ^2&&1",
"LUA_MENU_AVAILABLE_MODS": "Available mods",
"LUA_MENU_UNLOAD": "Unload",
"LUA_MENU_UNLOAD_DESC": "Unload the currently loaded mod.",
"PLATFORM_SHADER_PRECACHE_ASK": "Would you like to populate the shader cache? It may cause crashes with certain GPUs (e.g. RTX cards) but will improve performance if successful.",
"MENU_NO_DONT_ASK": "No, don't ask me again",
"LUA_MENU_SERVERLIST": "SERVER LIST",
"MENU_NUMPLAYERS": "Players",
"MENU_PING": "Ping",
"SERVERLIST_PLAYER_COUNT": "&&1 Players",
"SERVERLIST_SERVER_COUNT": "&&1 Servers",
"LUA_MENU_STATS": "Stats",
"LUA_MENU_STATS_DESC": "Edit player stats settings.",
"LUA_MENU_UNLOCKALL_ITEMS": "Unlock all items",
"LUA_MENU_UNLOCKALL_ITEMS_DESC": "Whether items should be locked based on the player's stats or always unlocked.",
"LUA_MENU_UNLOCKALL_LOOT": "Unlock all loot",
"LUA_MENU_UNLOCKALL_LOOT_DESC": "Whether loot should be locked based on the player's stats or always unlocked.",
"LUA_MENU_UNLOCKALL_CLASSES": "Unlock all classes",
"LUA_MENU_UNLOCKALL_CLASSES_DESC": "Whether classes should be locked based on the player's stats or always unlocked.",
"LUA_MENU_PRESTIGE": "Prestige",
"LUA_MENU_PRESTIGE_DESC": "Edit prestige level.",
"LUA_MENU_RANK": "Rank",
"LUA_MENU_RANK_DESC": "Edit rank.",
"LUA_MENU_UNSAVED_CHANGES": "You have unsaved changes: are you sure you want to exit?",
"LUA_MENU_SAVE": "Save changes",
"LUA_MENU_SAVE_DESC": "Save changes.",
"LUA_MENU_SETTINGS": "Settings",
"LUA_MENU_EDIT_STATS": "Edit Stats",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "No updates available",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "An update is available, proceed with installation?",
"UPDATER_POPUP_SUCCESSFUL": "Update successful",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "Update requires restart",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Checking for updates...",
"MPHUD_FPS": "FPS: ",
"MPHUD_LATENCY": "Latency: ",
"MPHUD_LATENCY_MS": " ms",
"LUA_MENU_TELEMETRY": "TELEMETRY",
"LUA_MENU_3RD_PARTY_CONTENT_DESC": "Would you like to install required 3rd-party content for this server? (from &&1)",
"MENU_ENGLISH": "English",
"MENU_ENGLISH_SAFE": "English (Safe)",
"MENU_FRENCH": "Français",
"MENU_GERMAN": "Deutsch",
"MENU_ITALIAN": "Italiano",
"MENU_JAPANESE_PARTIAL": "日本語(一部)",
"MENU_KOREAN": "한국어",
"MENU_POLISH": "Polski",
"MENU_PORTUGUESE": "Português",
"MENU_RUSSIAN": "Русский",
"MENU_SIMPLIFIED_CHINESE": "简体中文",
"MENU_SPANISH": "Español",
"MENU_TRADITIONAL_CHINESE": "繁體中文",
"LOCALE_ENGLISH": "English",
"LOCALE_ENGLISH_SAFE": "English (Safe)",
"LOCALE_FRENCH": "French",
"LOCALE_GERMAN": "German",
"LOCALE_ITALIAN": "Italian",
"LOCALE_JAPANESE_PARTIAL": "Japanese (Partial)",
"LOCALE_KOREAN": "Korean",
"LOCALE_POLISH": "Polish",
"LOCALE_PORTUGUESE": "Portuguese",
"LOCALE_RUSSIAN": "Russian",
"LOCALE_SIMPLIFIED_CHINESE": "Simplified Chinese",
"LOCALE_SPANISH": "Spanish",
"LOCALE_TRADITIONAL_CHINESE": "Traditional Chinese"
}

View File

@ -0,0 +1,6 @@
{
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Unlock All Missions and Intel",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancel Unlock All Missions",
"LUA_MENU_CHOOSE_LANGUAGE_DESC": "Choose your language.",
"MENU_APPLY_LANGUAGE_SETTINGS": "Apply language settings?"
}

View File

@ -0,0 +1,6 @@
{
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Unlock All Missions and Intel",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancel Unlock All Missions",
"LUA_MENU_CHOOSE_LANGUAGE_DESC": "Choose your language.",
"MENU_APPLY_LANGUAGE_SETTINGS": "Apply language settings?"
}

View File

@ -0,0 +1,51 @@
{
"LUA_MENU_FPS": "Compteur d'IPS",
"LUA_MENU_FPS_DESC": "Afficher le compteur d'IPS.",
"LUA_MENU_LATENCY": "Latence du serveur",
"LUA_MENU_LATENCY_DESC": "Afficher la latence du serveur",
"LUA_MENU_RED_DOT_BRIGHTNESS": "Luminosité du point rouge",
"LUA_MENU_RED_DOT_BRIGHTNESS_DESC": "Ajustez la luminosité du point rouge des réticules.",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Débloquer toutes les missions",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Annuler déblocage",
"MENU_MODS": "MODS",
"MENU_MODS_DESC": "Charger les mods installés.",
"LUA_MENU_MOD_DESC_DEFAULT": "Charger &&1.",
"LUA_MENU_MOD_DESC": "&&1\nAuteur: &&2\nVersion: &&3",
"LUA_MENU_LOADED_MOD": "Mod chargé: ^2&&1",
"LUA_MENU_AVAILABLE_MODS": "Mods disponibles",
"LUA_MENU_UNLOAD": "Décharger",
"LUA_MENU_UNLOAD_DESC": "Déchargez le mod actuellement chargé.",
"PLATFORM_SHADER_PRECACHE_ASK": "Souhaitez-vous remplir le cache de shader ? Cela peut provoquer des plantages avec certains GPU (par exemple, les cartes RTX), mais améliorera les performances en cas de succès.",
"MENU_NO_DONT_ASK": "Non, ne plus me le demander",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "Aucune mise à jour disponible",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "Une mise à jour est disponible,\npoursuivre l'installation ?",
"UPDATER_POPUP_SUCCESSFUL": "Mise à jour réussie",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "La mise à jour nécessite un redémarrage",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Vérification des mises à jour...",
"MPHUD_FPS": "IPS: ",
"MPHUD_LATENCY": "Latence: ",
"MPHUD_LATENCY_MS": " ms",
"LUA_MENU_TELEMETRY": "TÉLÉMÉTRIE",
"LOCALE_ENGLISH": "Anglais",
"LOCALE_ENGLISH_SAFE": "Anglais (sécuritaire)",
"LOCALE_FRENCH": "Français",
"LOCALE_GERMAN": "Allemand",
"LOCALE_ITALIAN": "Italien",
"LOCALE_JAPANESE_PARTIAL": "Japonais (partiel)",
"LOCALE_KOREAN": "Coréen",
"LOCALE_POLISH": "Polonais",
"LOCALE_PORTUGUESE": "Portugais",
"LOCALE_RUSSIAN": "Russe",
"LOCALE_SIMPLIFIED_CHINESE": "Chinois simplifié",
"LOCALE_SPANISH": "Espagnol",
"LOCALE_TRADITIONAL_CHINESE": "Chinois traditionnel",
"LUA_MENU_CHOOSE_LANGUAGE": "Choisissez la langue",
"LUA_MENU_CHOOSE_LANGUAGE_DESC": "Choisissez la langue."
}

View File

@ -0,0 +1,17 @@
{
"LOCALE_ENGLISH": "Englisch",
"LOCALE_ENGLISH_SAFE": "Englisch (Sicher)",
"LOCALE_FRENCH": "Französisch",
"LOCALE_GERMAN": "Deutsch",
"LOCALE_ITALIAN": "Italienisch",
"LOCALE_JAPANESE_PARTIAL": "Japanisch (Untertitelt)",
"LOCALE_KOREAN": "Koreanisch",
"LOCALE_POLISH": "Polnisch",
"LOCALE_PORTUGUESE": "Portugiesisch",
"LOCALE_RUSSIAN": "Russisch",
"LOCALE_SIMPLIFIED_CHINESE": "Vereinfachtes Chinesisch",
"LOCALE_SPANISH": "Spanisch",
"LOCALE_TRADITIONAL_CHINESE": "Traditionelles Chinesisch",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Alle Missionen freischalten",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Freischalten abbrechen"
}

View File

@ -0,0 +1,26 @@
{
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Sblocca tutte le missioni",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Annulla sblocco",
"MENU_MODS_DESC": "Abilita mod installate.",
"LUA_MENU_MOD_DESC_DEFAULT": "Abilita &&1.",
"LUA_MENU_MOD_DESC": "&&1\nAutore: &&2\nVersione: &&3",
"LUA_MENU_LOADED_MOD": "Mod attiva: ^2&&1",
"LUA_MENU_AVAILABLE_MODS": "Mod disponibili",
"LUA_MENU_UNLOAD": "Disabilita",
"LUA_MENU_UNLOAD_DESC": "Disabilita la mod attualmente attiva.",
"LOCALE_ENGLISH": "Inglese",
"LOCALE_ENGLISH_SAFE": "Inglese (sicuro)",
"LOCALE_FRENCH": "Francese",
"LOCALE_GERMAN": "Tedesco",
"LOCALE_ITALIAN": "Italiano",
"LOCALE_JAPANESE_PARTIAL": "Giapponese (parziale)",
"LOCALE_KOREAN": "Coreano",
"LOCALE_POLISH": "Polacco",
"LOCALE_PORTUGUESE": "Portoghese",
"LOCALE_RUSSIAN": "Russo",
"LOCALE_SIMPLIFIED_CHINESE": "Cinese semplificato",
"LOCALE_SPANISH": "Spagnolo",
"LOCALE_TRADITIONAL_CHINESE": "Cinese tradizionale"
}

View File

@ -0,0 +1,18 @@
{
"LOCALE_ENGLISH": "英語",
"LOCALE_ENGLISH_SAFE": "英語(検閲)",
"LOCALE_FRENCH": "フランス語",
"LOCALE_GERMAN": "ドイツ語",
"LOCALE_ITALIAN": "イタリア語",
"LOCALE_JAPANESE_PARTIAL": "日本語(一部)",
"LOCALE_KOREAN": "韓国語",
"LOCALE_POLISH": "ポーランド語",
"LOCALE_PORTUGUESE": "ポルトガル語",
"LOCALE_RUSSIAN": "ロシア語",
"LOCALE_SIMPLIFIED_CHINESE": "簡体字中国語",
"LOCALE_SPANISH": "スペイン語",
"LOCALE_TRADITIONAL_CHINESE": "繁体字中国語",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "全ミッションをアンロック",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "アンロックをキャンセル"
}

View File

@ -0,0 +1,18 @@
{
"LOCALE_ENGLISH": "영어",
"LOCALE_ENGLISH_SAFE": "영어(검열)",
"LOCALE_FRENCH": "프랑스어",
"LOCALE_GERMAN": "독일어",
"LOCALE_ITALIAN": "이탈리아어",
"LOCALE_JAPANESE_PARTIAL": "일본어(일부)",
"LOCALE_KOREAN": "한국어",
"LOCALE_POLISH": "폴란드어",
"LOCALE_PORTUGUESE": "포르투갈어",
"LOCALE_RUSSIAN": "러시아어",
"LOCALE_SIMPLIFIED_CHINESE": "중국어(간체)",
"LOCALE_SPANISH": "스페인어",
"LOCALE_TRADITIONAL_CHINESE": "중국어(번체)",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "모든 임무 잠금 해제",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "잠금 해제 취소"
}

View File

@ -0,0 +1,18 @@
{
"LOCALE_ENGLISH": "Angielski",
"LOCALE_ENGLISH_SAFE": "Angielski (cenzuralny)",
"LOCALE_FRENCH": "Francuski",
"LOCALE_GERMAN": "Niemiecki",
"LOCALE_ITALIAN": "Włoski",
"LOCALE_JAPANESE_PARTIAL": "Japoński (częściowy)",
"LOCALE_KOREAN": "Koreański",
"LOCALE_POLISH": "Polski",
"LOCALE_PORTUGUESE": "Portugalski",
"LOCALE_RUSSIAN": "Rosyjski",
"LOCALE_SIMPLIFIED_CHINESE": "Chiński uproszczony",
"LOCALE_SPANISH": "Hiszpański",
"LOCALE_TRADITIONAL_CHINESE": "Chiński tradycyjny",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Odblokuj wszystkie misje",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Anuluj odblokowanie"
}

View File

@ -0,0 +1,18 @@
{
"LOCALE_ENGLISH": "Inglês",
"LOCALE_ENGLISH_SAFE": "Inglês (Censurado)",
"LOCALE_FRENCH": "Français",
"LOCALE_GERMAN": "Alemão",
"LOCALE_ITALIAN": "Italiano",
"LOCALE_JAPANESE_PARTIAL": "Japonês (Parcial)",
"LOCALE_KOREAN": "Coreano",
"LOCALE_POLISH": "Polonês",
"LOCALE_PORTUGUESE": "Português",
"LOCALE_RUSSIAN": "Russo",
"LOCALE_SIMPLIFIED_CHINESE": "Chinês simplificado",
"LOCALE_SPANISH": "Español",
"LOCALE_TRADITIONAL_CHINESE": "Chinês tradicional",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Desbloquear todas as missões",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancelar desbloqueio"
}

View File

@ -0,0 +1,242 @@
{
"LUA_MENU_FPS": "Счетчик кадров",
"LUA_MENU_FPS_DESC": "Показывать частоту кадров в секунду (FPS).",
"LUA_MENU_LATENCY": "Задержка до сервера",
"LUA_MENU_LATENCY_DESC": "Показывать пинг до сервера.",
"LUA_MENU_RED_DOT_BRIGHTNESS": "Яркость коллиматора",
"LUA_MENU_RED_DOT_BRIGHTNESS_DESC": "Регулировка яркости красной точки коллиматорных прицелов.",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Открыть все задания и чит-коды",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Вернуться к своему прогрессу прохождения",
"LUA_MENU_CHOOSE_LANGUAGE": "Выбор языка",
"LUA_MENU_CHOOSE_LANGUAGE_DESC": "Поменять язык интерфейса и озвучки.",
"MENU_MODS": "МОДЫ",
"MENU_MODS_DESC": "Запуск установленных модов.",
"LUA_MENU_MOD_DESC_DEFAULT": "Запустить &&1.",
"LUA_MENU_MOD_DESC": "&&1\nАвтор: &&2\nВерсия: &&3.",
"LUA_MENU_LOADED_MOD": "Запущенный мод: ^3&&1",
"LUA_MENU_AVAILABLE_MODS": "Доступные моды",
"LUA_MENU_UNLOAD": "Выгрузить",
"LUA_MENU_UNLOAD_DESC": "Выгрузить из игры запущенный сейчас мод.",
"PLATFORM_SHADER_PRECACHE_ASK": "Хотите скомпилировать шейдеры? С некоторыми видеокартами (например, серии GeForce RTX, GTX 16xx) это может привести к вылетам игры, но в общем случае повысит производительность.",
"MENU_NO_DONT_ASK": "Нет, больше не спрашивать",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "У вас установлены все последние обновления",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "Доступно обновление клиента игры,\nначать установку сейчас?",
"UPDATER_POPUP_SUCCESSFUL": "Обновление завершено",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "Для применения изменений необходим перезапуск игры",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Проверка наличия обновлений...",
"MPHUD_FPS": "К/С: ",
"MPHUD_LATENCY": "Задержка: ",
"MPHUD_LATENCY_MS": " мс",
"LUA_MENU_TELEMETRY": "ТЕЛЕМЕТРИЯ",
"LOCALE_ENGLISH": "Английский",
"LOCALE_ENGLISH_SAFE": "Английский цензурный",
"LOCALE_FRENCH": "Французский",
"LOCALE_GERMAN": "Немецкий",
"LOCALE_ITALIAN": "Итальянский",
"LOCALE_JAPANESE_PARTIAL": "Японский (английская озвучка)",
"LOCALE_KOREAN": "Корейский",
"LOCALE_POLISH": "Польский",
"LOCALE_PORTUGUESE": "Португальский",
"LOCALE_RUSSIAN": "Русский",
"LOCALE_SIMPLIFIED_CHINESE": "Китайский упрощенный",
"LOCALE_SPANISH": "Испанский",
"LOCALE_TRADITIONAL_CHINESE": "Китайский традиционный",
"LUA_MENU_DOWNLOAD": "Скачать",
"MPUI_MP44": "MP-44",
"WEAPON_AT4": "AT4",
"WEAPON_BARRETT": "Barrett .50",
"WEAPON_BERETTA": "M9",
"WEAPON_COLT1911": "M1911 .45",
"WEAPON_COLT45": "M1911 .45",
"WEAPON_DESERTEAGLE55": "Командирский Дезерт Игл",
"WEAPON_DESERTEAGLEGOLD": "Золотой Дезерт Игл",
"WEAPON_HK79": "HK79",
"WEAPON_MELEESHOVEL": "Могильщик",
"WEAPON_MP44": "MP-44",
"WEAPON_MP5_SILENCER": "MP5 с глушителем",
"WEAPON_NO_AMMO_CAPS": "НЕТ ПАТРОНОВ",
"WEAPON_NO_FRAG_GRENADE": "Осколочных гранат не осталось",
"WEAPON_NO_SPECIAL_GRENADE": "Особых гранат не осталось",
"WEAPON_P90_SILENCER": "P90 с глушителем",
"WEAPON_SILENCER_ATTACHMENT": "с глушителем",
"WEAPON_USP": "USP .45",
"ARMADA_INTRO": "Чарли не сëрфят",
"CGAME_CONTINUE_SAVING": "Сохранить и выйти",
"CGAME_MISSIONOBJECTIVES": "ЦЕЛИ ЗАДАНИЯ",
"CGAME_PRONE_BLOCKED": "Движение лежа заблокировано",
"CGAME_PRONE_BLOCKED_WEAPON": "С этим оружием нельзя лечь",
"CGAME_RESTART_WARNING": "Если начать игру заново, \nвесь прогресс в текущем \nзадании будет утрачен\n\nНачать заново?",
"CGAME_SAVE_WARNING": "Если вы сохраните игру сейчас,\nвесь прогресс с момента последней\nконтрольной точки будет утрачен\n\nСохранить игру?",
"CGAME_TEAMMATE": "НАПАРНИК",
"CGAME_UNKNOWN": "неизвестно",
"EXE_INVALIDUPDATESERVERDOWNLOAD": "Загруженное обновление повреждено",
"EXE_KEYWAIT": "Нажмите ESC для отмены или BACKSPACE для сброса",
"EXE_SHADERPRELOAD": "Подгрузка шейдеров... &&1%",
"EXE_YES": "Да",
"GAME_CHEATSNOTENABLED": "На этом сервере отключены чит-коды.",
"GAME_CROUCH_BLOCKED": "Здесь нельзя пригнуться",
"GAME_DIFFICULTY_HARD": "Сложность: Закаленный",
"GAME_DIFFICULTY_MEDIUM": "Сложность: Рядовой",
"GAME_DIFFICULTY_UNKNOWN": "Сложность: Неизвестна",
"GAME_OBJECTIVECOMPLETED": "Задача выполнена.",
"GAME_OBJECTIVEFAILED": "Цель не достигнута.",
"GAME_OBJECTIVESUPDATED": "Новая цель.",
"KEY_COMMAND": "Command",
"KEY_ENTER": "Enter",
"KEY_ESCAPE": "Escape",
"KEY_KP_MINUS": "- (цифр.)",
"KEY_KP_PLUS": "+ (цифр.)",
"KEY_KP_STAR": "* (цифр.)",
"KEY_MOUSE1": "ЛКМ",
"KEY_MOUSE2": "ПКМ",
"KEY_MOUSE3": "СКМ",
"KEY_USE": "использовать",
"LUA_MENU_ADVANCED_VIDEO": "Параметры графики",
"LUA_MENU_AIM_ASSIST_LOCKON_DESC": "Поворот оружия в сторону цели во время движения.",
"LUA_MENU_AIM_ASSIST_SLOWDOWN_DESC": "Замедление движений прицела при наведении оружия на цель.",
"LUA_MENU_AUTO_MANTLE_DESC": "Автоматически цепляться за уступ при прыжке рядом с ним.",
"LUA_MENU_BOTS_REGULAR": "Рядовой",
"LUA_MENU_COLOR_BLIND_DESC": "Включение и отключение цветовой схемы для людей с пониженной чувствительностью к цвету.",
"LUA_MENU_COMPLETE": "ЗАВЕРШЕНО",
"LUA_MENU_DATE": "&&2.&&1.&&3",
"LUA_MENU_DAYS": "&&1 д",
"LUA_MENU_DAYS_HOURS_MINUTES_SECONDS": "&&1 д &&2 ч &&3 м &&4 с",
"LUA_MENU_DEFENDS": "Защиты",
"LUA_MENU_DEFENDS_CAPS": "ЗАЩИТЫ",
"LUA_MENU_DISPLAY_OPTIONS": "Интерфейс",
"LUA_MENU_END_GAME": "Выйти из боя",
"LUA_MENU_GAME_SETUP": "Параметры боя",
"LUA_MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ",
"LUA_MENU_GRAPHICS": "Изображение",
"LUA_MENU_GRAPHIC_OPTIONS": "Изображение",
"LUA_MENU_LEAVE_GAME_TITLE": "Покинуть бой?",
"LUA_MENU_MODE_WINDOWED_NO_BORDER": "В окне (без границ)",
"LUA_MENU_OPTIMAL_VIDEO_AUDIO": "Сбросить настройки изображения",
"LUA_MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ",
"LUA_MENU_RESTORE_EACH_SETTING": "Вернуть параметры управления к значениям по умолчанию?",
"LUA_MENU_RESTRICTIONS_TACTICAL_CAPS": "ОГРАНИЧЕНИЯ НА ТАКТИЧЕСКОЕ ОРУЖИЕ",
"LUA_MENU_RESTRICT_TACTICAL": "Ограничение на тактическое оружие",
"LUA_MENU_SYSTEM_INFO": "Другое",
"LUA_MENU_SYSTEM_INFO_CAPS": "ДРУГОЕ",
"LUA_MENU_VIDEO_OPTIONS": "Отображение",
"LUA_MENU_VIDEO_OPTIONS_CAPS": "ОТОБРАЖЕНИЕ",
"MENU_ACT_I": "Акт I",
"MENU_ACT_II": "Акт II",
"MENU_ACT_III": "Акт III",
"MENU_ADVANCED_VIDEO": "Параметры графики",
"MENU_AIM_DOWN_THE_SIGHT": "Прицелиться",
"MENU_AIM_DOWN_THE_SIGHT_AUTOAIM": "Автонаведение при прицеливании",
"MENU_APPLY_SETTINGS": "Применить новые значения?",
"MENU_AUTOAIM": "Автонаведение",
"MENU_BRIGHTNESS": "Яркость изображения",
"MENU_BUTTON_LAYOUT": "Раскладка кнопок",
"MENU_CCS_RESTART_BUTTON_LABEL": "Перезапустить",
"MENU_CHEAT_ENABLED": "Чит-код активирован",
"MENU_COMPLETED": "Пройдено",
"MENU_COMPLETED_CHEAT": "Доступен чит-код",
"MENU_COMPLETED_HARDENED": "Пройдено (Закаленный)",
"MENU_COMPLETED_REGULAR": "Пройдено (Рядовой)",
"MENU_COMPLETED_SKILLED": "Пройдено (Опытный)",
"MENU_COMPLETED_VETERAN": "Пройдено (Ветеран)",
"MENU_CORRUPT_SAVEDATA_MESSAGE": "Сохраненные данные не были загружены, поскольку они повреждены. В случае продолжения они будут удалены.",
"MENU_CUSTOM": "Свои",
"MENU_CUSTOM_N": "Свой (&&1)",
"MENU_DEFAULT_ALT": "Станд. перевернутая",
"MENU_DIFFICULTY_HARDENED": "Сложность: Закаленный",
"MENU_DIFFICULTY_REGULAR": "Сложность: Рядовой",
"MENU_DIFFICULTY_WARNING": "Вам рекомендуется другой уровень сложности. Хотите продолжить на этом?",
"MENU_DISPLAY_MODE": "Режим вывода",
"MENU_DOF": "Глубина резкости",
"MENU_EXTRA": "Ультра",
"MENU_FILL_MEMORY_TEXTURES": "Заполнить оставшуюся память",
"MENU_FIRE_RATE": "Темп стрельбы:",
"MENU_FRAG_EQUIPMENT": "Граната/снаряжение",
"MENU_FREE_LOOK": "Своб. обзор",
"MENU_FRIENDLY_FIRE": "Огонь по своим: ",
"MENU_GO_TO_CROUCH": "Пригнуться",
"MENU_GO_TO_PRONE": "Лечь",
"MENU_GRAPHICS": "Изображение",
"MENU_HARDENED": "Закаленный",
"MENU_HIGH": "Высок.",
"MENU_INSANE": "Безумн.",
"MENU_INSPECT_WEAPON": "Осмотреть оружие",
"MENU_INTEL": "ЧИТ-КОДЫ",
"MENU_JUMP_STANCE_UP": "Прыгнуть/Подняться",
"MENU_KILLS": "Убийства",
"MENU_LARGE": "Больш.",
"MENU_LAST_CHECKPOINT": "Посл. контрольная точка",
"MENU_LAUNCH_WITHOUT_MODS": "Запустить без модов",
"MENU_LEGACY": "Классика",
"MENU_LOAD_MISSION": "Загрузить задание?",
"MENU_LOOK_INVERSION": "Инверсия обзора",
"MENU_LOWER_DIFFICULTY": "Понизить сложность",
"MENU_NORMAL_MAP_RESOLUTION": "Разрешение карт нормалей",
"MENU_NO_CONTROLLER_INITIAL": "У вас не подключен геймпад. Переключиться на схему управления клавиатурой и мышью?",
"MENU_OPTIONS": "Настройки",
"MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ",
"MENU_PAUSED_CAP": "ПАУЗА",
"MENU_QUIT": "Выйти",
"MENU_RECRUIT": "Новобранец",
"MENU_REGULAR": "Рядовой",
"MENU_REGULAR_CAPS": "РЯДОВОЙ",
"MENU_RESET_SYSTEM_DEFAULTS": "Оптимальные настройки игры",
"MENU_RESTART_LEVEL_Q": "Начать уровень сначала?",
"MENU_RESTORE_DEFAULTS": "Системные настройки будут возвращены к значениям по умолчанию, продолжить?",
"MENU_RESTORE_EACH_SETTING": "Все параметры будут возвращены к значениям по умолчанию, продолжить?",
"MENU_RESUMEGAME_NOSAVE": "Продолжить без сохранения",
"MENU_RESUMEGAME_Q_DESC": "Хотите возобновить прохождение задания?",
"MENU_RESUME_CREDITS": "Продолжить",
"MENU_SAVEDATA_CORRUPTED": "Невозможно возобновить игру, т.к. поврежден файл сохранения. Пожалуйста, перезапустите уровень из меню выбора задания.",
"MENU_SCREENSHOT": "Скриншот",
"MENU_SELECT_DIFFICULTY": "Выбор сложности",
"MENU_SELECT_GAME_TYPE": "Выбрать режим игры",
"MENU_SELECT_LEVEL": "Выбрать уровень",
"MENU_SELECT_NEXT_MISSION": "Выбрать следующее задание",
"MENU_SPECULAR_MAP": "Карта бликов",
"MENU_SPECULAR_MAP_RESOLUTION": "Разрешение карт бликов",
"MENU_SPRINT_HOLD_BREATH": "Бег/Задержка дыхания",
"MENU_SPRINT_STEADY_SNIPER_RIFLE": "Бег/Удержание прицела",
"MENU_SP_H1_ARMADA": "Чарли не сëрфят",
"MENU_STANDARD_4_3": "Стандартное 4:3",
"MENU_TEXTURE_RESOLUTION": "Разрешение текстур",
"MENU_UNLOCK": "Открыть",
"MENU_VERY_LOW": "Очень низк.",
"MENU_VIDEO": "Отображение",
"MENU_WARNING": "Внимание",
"MENU_WARNING_CHECKPOINT_RESET_TITLE": "Откат к началу задания",
"MENU_WIDE_16_10": "Широкое 16:10",
"MENU_WIDE_16_9": "Широкое 16:9",
"MENU_WIDE_21_9": "Сверхширокое 21:9",
"MENU_YES": "Да",
"PLATFORM_FOV": "Угол обзора (FOV)",
"PLATFORM_HOLD_TO_SKIP": "Удерживайте \u0001 для пропуска",
"PLATFORM_HOLD_TO_SKIP_KEYBOARD": "Удерживайте ^2ENTER^7 для пропуска\n",
"PLATFORM_LOW_AMMO_NO_RELOAD": "Мало боеприпасов",
"PLATFORM_LOW_AMMO_NO_RELOAD_CAPS": "МАЛО БОЕПРИПАСОВ",
"PLATFORM_MDAO": "Затенение методом MDAO",
"PLATFORM_PLAY_ONLINE": "Сетевая игра",
"PLATFORM_RELOAD_CAPS": "ПЕРЕЗАРЯДКА",
"PLATFORM_SSAO": "Затенение методом SSAO",
"PLATFORM_UI_ADAPTER": "Видеокарта",
"PLATFORM_UI_ANTI_ALIASING_OPTIONS": "Настройки сглаживания",
"PLATFORM_UI_CACHED_SPOT_SHADOWS": "Кэшировать точечные тени",
"PLATFORM_UI_CACHED_SUN_SHADOWS": "Кэшировать тени от солнца",
"PLATFORM_UI_DEDICATED_VIDEO_MEMORY": "Загрузка видеопамяти",
"PLATFORM_UI_IMAGE_QUALITY": "Разрешение картинки",
"PLATFORM_UI_NATIVE_RENDER_RESOLUTION": "Отрисовка в родном разрешении",
"PLATFORM_UI_NATIVE_RENDER_RESOLUTION_OPTION": "Родное (&&1 x &&2)",
"PLATFORM_UI_POST_AA": "Постобработка",
"PLATFORM_UI_SHADER_PRELOAD_AFTER_CINEMATIC": "Во время роликов",
"PLATFORM_UI_VIDEO_ADAPTER": "Видеокарта",
"PLATFORM_YES": "Да",
"PRESENCE_SP_ARMADA": "Чарли не сëрфят",
"PRESENCE_SP_ARMADA_SYSTEM_DIALOG": "Чарли не сëрфят"
}

View File

@ -0,0 +1,18 @@
{
"LOCALE_ENGLISH": "英语",
"LOCALE_ENGLISH_SAFE": "英语 (审查制度)",
"LOCALE_FRENCH": "法语",
"LOCALE_GERMAN": "德语",
"LOCALE_ITALIAN": "意大利语",
"LOCALE_JAPANESE_PARTIAL": "日语(部分)",
"LOCALE_KOREAN": "韩语",
"LOCALE_POLISH": "波兰语",
"LOCALE_PORTUGUESE": "葡萄牙语",
"LOCALE_RUSSIAN": "俄语",
"LOCALE_SIMPLIFIED_CHINESE": "简体中文",
"LOCALE_SPANISH": "西班牙语",
"LOCALE_TRADITIONAL_CHINESE": "繁体中文",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "解锁全部任务",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "取消解锁"
}

View File

@ -0,0 +1,18 @@
{
"LOCALE_ENGLISH": "Inglés",
"LOCALE_ENGLISH_SAFE": "Inglés (censura)",
"LOCALE_FRENCH": "Français",
"LOCALE_GERMAN": "Alemán",
"LOCALE_ITALIAN": "Italiano",
"LOCALE_JAPANESE_PARTIAL": "Japonés (parcial)",
"LOCALE_KOREAN": "Coreano",
"LOCALE_POLISH": "Polaco",
"LOCALE_PORTUGUESE": "Portugués",
"LOCALE_RUSSIAN": "Ruso",
"LOCALE_SIMPLIFIED_CHINESE": "Chino simplificado",
"LOCALE_SPANISH": "Español",
"LOCALE_TRADITIONAL_CHINESE": "Chino tradicional",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "Desbloquear todas las misiones",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "Cancelar desbloqueo"
}

View File

@ -0,0 +1,18 @@
{
"LOCALE_ENGLISH": "英文",
"LOCALE_ENGLISH_SAFE": "英文 (審查制度)",
"LOCALE_FRENCH": "法文",
"LOCALE_GERMAN": "德文",
"LOCALE_ITALIAN": "義大利文",
"LOCALE_JAPANESE_PARTIAL": "日文(部份)",
"LOCALE_KOREAN": "韓文",
"LOCALE_POLISH": "波蘭文",
"LOCALE_PORTUGUESE": "葡萄牙文",
"LOCALE_RUSSIAN": "俄文",
"LOCALE_SIMPLIFIED_CHINESE": "簡體中文",
"LOCALE_SPANISH": "西班牙文",
"LOCALE_TRADITIONAL_CHINESE": "繁體中文",
"LUA_MENU_CAMPAIGN_UNLOCKED_ALL_TITLE": "解鎖所有任務",
"LUA_MENU_CANCEL_UNLOCK_CAPS": "取消解鎖"
}

View File

@ -0,0 +1,354 @@
{
"CUSTOM_DEPOT_EULA_1": "Уважаемый игрок,",
"CUSTOM_DEPOT_EULA_2": "Используя эту функцию, вы подтверждаете, что вам исполнилось 18 лет и что в вашей стране разрешены азартные игры и сюрприз-механики (даже если они в них не вовлечены реальные деньги)",
"CUSTOM_DEPOT_EULA_3": "Команда H1-mod не несет ответственности, если вы нарушите какой-либо закон у себя в стране, и вы несете исключительную ответственность за соблюдение правил.",
"CUSTOM_DEPOT_EULA_4": "Команда H1-mod никогда не добавит микротранзакции с реальными деньгами в свой мод. Единственный способ получить внутриигровую валюту, если вы того захотите, это играть в игру.",
"CUSTOM_DEPOT_EULA_5": "С наилучшими пожеланиями,",
"CUSTOM_DEPOT_EULA_6": "Команда H1-mod.",
"LUA_MENU_SERVERLIST": "Список серверов",
"MENU_NUMPLAYERS": "Игроки [+боты]",
"MENU_PING": "Пинг",
"SERVERLIST_PLAYER_COUNT": "Игроков: &&1",
"SERVERLIST_SERVER_COUNT": "Серверов: &&1",
"LUA_MENU_STATS": "Статистика",
"LUA_MENU_STATS_DESC": "Изменение статистических показателей игрока.",
"LUA_MENU_UNLOCKALL_ITEMS": "Открыть все предметы",
"LUA_MENU_UNLOCKALL_ITEMS_DESC": "Определяет, должны ли камуфляжи и базовые предметы открываться в соответствии со статистикой игрока или всегда быть разблокированы.",
"LUA_MENU_UNLOCKALL_LOOT": "Открыть все трофеи",
"LUA_MENU_UNLOCKALL_LOOT_DESC": "Определяет, должно ли оружие из DLC (не включая DLC-камуфляжи) открываться по правилам или всегда быть разблокировано.",
"LUA_MENU_UNLOCKALL_CLASSES": "Открыть все классы",
"LUA_MENU_UNLOCKALL_CLASSES_DESC": "Определяет, должны ли дополнительные классы открываться при достижении нового уровня престижа или всегда быть разблокированы.",
"LUA_MENU_PRESTIGE": "Престиж",
"LUA_MENU_PRESTIGE_DESC": "Изменение уровня престижа.",
"LUA_MENU_RANK": "Ранг",
"LUA_MENU_RANK_DESC": "Изменение ранга.",
"LUA_MENU_UNSAVED_CHANGES": "Изменения не были сохранены, вы уверены, что хотите выйти?",
"LUA_MENU_SAVE": "Сохранить изменения",
"LUA_MENU_SAVE_DESC": "Внесение изменений в игру.",
"LUA_MENU_SETTINGS": "Параметры",
"LUA_MENU_EDIT_STATS": "Корректировка статистики",
"LUA_MENU_3RD_PARTY_CONTENT_DESC": "Согласны загрузить сторонний контент, необходимый для игры на этом сервере? (&&1)",
"PLATFORM_SYSTEM_LINK_TITLE": "СПИСОК СЕРВЕРОВ",
"EXE_SAY": "^3Всем^7",
"EXE_SAYTEAM": "^5Команде^7",
"MENU_SB_TOOLTIP_BTN_REFRESH": "Обновить список",
"MENU_TYPE1": "Режим",
"SERVERLIST_ADD_TO_BLACKLIST": "Добавить в ЧС",
"SERVERLIST_REMOVE_FROM_BLACKLIST": "Убрать из ЧС",
"LUI_MENU_BLACKLIST": "Черный список",
"MPUI_ATDM_RECIPE_NAME": "Usilenie",
"MPUI_BALL_RECIPE_NAME": "Stancija svjazi",
"MPUI_CONF_RECIPE_NAME": "Ubijstvo podtverzhdeno",
"MPUI_CTF_PRO_RECIPE_NAME": "Zahvat flaga PRO",
"MPUI_CTF_RECIPE_NAME": "Zahvat flaga",
"MPUI_DD_RECIPE_NAME": "Unichtozhenie",
"MPUI_DEATHMATCH_RECIPE_NAME": "Kazhdyj za sebja",
"MPUI_DOMINATION_RECIPE_NAME": "Prevoshodstvo",
"MPUI_GUN_RECIPE_NAME": "Oruzhie",
"MPUI_HEADQUARTERS_RECIPE_NAME": "Shtab",
"MPUI_HP_RECIPE_NAME": "Opornyj punkt",
"MPUI_INFECT_RECIPE_NAME": "Zarazhenie",
"MPUI_JUGG_RECIPE_NAME": "Dzhaggernaut",
"MPUI_KINGS_RECIPE_NAME": "Koroli",
"MPUI_KOTM_RECIPE_NAME": "Gora",
"MPUI_OIC_RECIPE_NAME": "Poslednij patron",
"MPUI_SABOTAGE_RECIPE_NAME": "Sabotazh",
"MPUI_SD_RECIPE_NAME": "NiU",
"MPUI_SOTF_FFA_RECIPE_NAME": "Ohota KZS",
"MPUI_SOTF_RECIPE_NAME": "Ohota",
"MPUI_SR_RECIPE_NAME": "NiS",
"MPUI_TWAR_RECIPE_NAME": "Impuls",
"MPUI_WAR_RECIPE_NAME": "Komandnyj boj",
"MPUI_XTDM_RECIPE_NAME": "XTDM",
"CLASS_SPETSNAZ_CLASSES": "КЛАССЫ СПЕЦНАЗА",
"LOOT_DEC_CHAR_REWARD_02": "ЧАД",
"LOOT_DEC_COSTUME_15": "ЧАД",
"LOOT_DEC_ITEMSET_32_SPECIAL": "ЧАД",
"LUA_MENU_SCOREBOARD_MARINES": "%d · МОРПЕХИ",
"LUA_MENU_SCOREBOARD_MARINES_LOST": "%d · МОРПЕХИ ПРОИГРАЛИ",
"MPUI_MARINES_DESERT": "Морпехи",
"MPUI_MARINES_SHORT": "Морпехи",
"MPUI_OPFOR": "Оппозиция",
"MPUI_OPFOR_SHORT": "Оппозиция",
"MPUI_SPETSNAZ": "Спецназ",
"MPUI_SPETSNAZ_SHORT": "Спецназ",
"CGAME_COMPLAINTDISMISSED": "Жалоба отклонена",
"CGAME_COMPLAINTFILED": "Жалоба учтена",
"CGAME_COMPLAINTSERVERHOST": "Нельзя пожаловаться на хост",
"CGAME_COMPLAINTTEAMKILLFILE": "Отправить жалобу на игрока &&1 за убийство товарища по команде?",
"CGAME_CONNECTIONINTERUPTED": "Связь прервана",
"CGAME_CRUSH": "раздавлен",
"CGAME_FALLING": "упал",
"CGAME_HEAD_SHOT": "выстрел в голову",
"CGAME_NOSPECTATORVOICECHAT": "Зрители не могут использовать голосовую связь.",
"CGAME_PRESSYESNO": "Для ответа ДА нажмите '&&1', для ответа НЕТ - '&&2'",
"CGAME_SB_ASSISTS": "Помощь",
"CGAME_SB_DEATHS": "Смерти",
"CGAME_SB_KILLS": "Убийства",
"CGAME_SB_PING": "Пинг",
"CGAME_SERVERHOSTTEAMKILLED": "Вас убил хост вашей же команды",
"CGAME_SPECTATOR": "ЗРИТЕЛЬ",
"CGAME_SPECTATORS": "Зрители",
"CGAME_WAITINGFORSERVERLOAD": "Ожидание загрузки новой карты на сервере",
"CGAME_YOUKILLED": "Вы убили игрока &&1",
"CGAME_YOUWEREKILLED": "Вас убил игрок &&1",
"CLANS_OFFENSIVENAME": "Имя клана отвергнуто: запрещенный текст",
"DEPOT_NEXT_DEPOT_CREDIT": "До след. начисления",
"DLC_MAPS": "Загружаемые карты",
"EXE_DISCONNECTED": "Соединение с сервером разорвано",
"EXE_ERR_BAD_GAME_FOLDER": "Указана неверная папка с игрой.",
"EXE_ERR_CORRECT_FOLDER": "Убедитесь, что игра запущена из правильной папки.",
"EXE_ERR_HIGH_PING_ONLY": "Этот сервер предназначен только для игроков с большим пингом.",
"EXE_ERR_HUNK_ALLOC_FAILED": "Не удалось выделить &&1 Мб.",
"EXE_ERR_LOW_PING_ONLY": "Этот сервер предназначен только для игроков с небольшим пингом.",
"EXE_ERR_WRONG_MAP_VERSION_NUM": "Неверная версия карты '&&1'.",
"EXE_FAVORITES": "Избранное",
"EXE_GAMEISENDING": "Не удалось войти - игра уже заканчивается",
"EXE_HOST_HANDLE_ERROR": "Не удалось обеспечить защищенную связь с сервером.",
"EXE_SERVERFILTER": "Фильтр: &&1",
"EXE_SERVERKILLED": "Сервер остановлен.",
"EXE_SV_INFO_FRIENDLY_FIRE": "Огонь по своим",
"EXE_SV_INFO_GAMETYPE": "Режим игры",
"EXE_SV_INFO_KILLCAM": "Повтор",
"EXE_SV_INFO_NAME": "имя",
"EXE_SV_INFO_PASSWORD": "С паролем",
"EXE_SV_INFO_PING": "пинг",
"EXE_TIMEDOUT": "Время ожидания запроса истекло",
"GAME_DROPPEDFORINACTIVITY": "Отключен от сервера из-за бездействия.",
"GAME_INVALIDGAMETYPE": "Неверный режим игры.",
"GAME_NOSPECTATORCALLVOTE": "Зрители не могут начинать голосование.",
"GAME_NOSPECTATORVOTE": "Зрители не могут голосовать.",
"GAME_SPECTATOR": "Зритель",
"GAME_VOTE_GAMETYPE": "Режим: ",
"LUA_MENU_CHALLENGE_XP": "&&1 XP",
"LUA_MENU_CHANGE_FACTION": "Смена фракции",
"LUA_MENU_CHANGE_TEAM": "Смена команды",
"LUA_MENU_CHANGE_TEAM_CAPS": "ВЫБОР КОМАНДЫ",
"LUA_MENU_CHOOSE_CLASS": "Смена класса",
"LUA_MENU_CHOOSE_CLASS_CAPS": "ВЫБОР КЛАССА",
"LUA_MENU_CONFIRMS": "Жетоны",
"LUA_MENU_CONFIRMS_CAPS": "ЖЕТОНЫ",
"LUA_MENU_CONFIRM_REDEEM_DUPLICATES_CAPS": "ОБМЕНЯТЬ ДУБЛИКАТЫ ПРЕДМЕТОВ (&&1) НА ОПЫТ?",
"LUA_MENU_CONF_CAPS": "УБИЙСТВО ПОДТВЕРЖДЕНО",
"LUA_MENU_CONF_RECIPE_DESC": "Версия на основе режима Убийство подтверждено",
"LUA_MENU_CONF_RECIPE_NAME": "Версия У.П.",
"LUA_MENU_CREATE_A_CLASS": "Создание классов",
"LUA_MENU_CREATE_A_CLASS_CAPS": "ИЗМЕНИТЬ КЛАСС",
"LUA_MENU_DEATHMATCH": "Каждый за себя",
"LUA_MENU_DEATHMATCH_CAPS": "КАЖДЫЙ ЗА СЕБЯ",
"LUA_MENU_DEATHMATCH_RECIPE_DESC": "Версия на основе режима Каждый за себя",
"LUA_MENU_DEATHMATCH_RECIPE_NAME": "Версия Каждый за себя",
"LUA_MENU_DESC_LEADERBOARD_CONF": "Убийство подтверждено - список лидеров",
"LUA_MENU_DESC_LEADERBOARD_DM": "Каждый за себя - список лидеров",
"LUA_MENU_DESC_LEADERBOARD_DOM": "Превосходство - список лидеров",
"LUA_MENU_DESC_LEADERBOARD_SOTF_FFA": "Охота КЗС - список лидеров",
"LUA_MENU_DM_HARDCORE": "Каждый за себя. Хардкор",
"LUA_MENU_DOMINATION": "Превосходство",
"LUA_MENU_DOMINATION_CAPS": "ПРЕВОСХОДСТВО",
"LUA_MENU_DOMINATION_RECIPE_DESC": "Версия на основе режима Превосходство",
"LUA_MENU_DOMINATION_RECIPE_NAME": "Версия Превосходство",
"LUA_MENU_ENVIRONMENT_KILLS": "Убито предметами окружения",
"LUA_MENU_FREE_ONLY": "Свободная камера",
"LUA_MENU_HEALTH_AND_DAMAGE": "Здоровье и урон",
"LUA_MENU_KILLCAM_FINAL_CAPS": "ПОСЛЕДНЕЕ УБИЙСТВО",
"LUA_MENU_KILLS": "Убийства",
"LUA_MENU_KILLS_CAPS": "УБИЙСТВА",
"LUA_MENU_LOSING": "Вы проигрываете",
"LUA_MENU_LOSSES_CAPS": "ПОРАЖЕНИЯ",
"LUA_MENU_MELEEKILLS": "С ножа",
"LUA_MENU_PLAY_TIME": "Всего наиграно",
"LUA_MENU_PRESET_CLASSES": "Готовые классы",
"LUA_MENU_PRESET_CLASSES_CAPS": "ГОТОВЫЕ КЛАССЫ",
"LUA_MENU_RATIO_CAPS": "У/С",
"LUA_MENU_RECIPE_LOAD_CUSTOM": "Загрузить свою версию",
"LUA_MENU_REPORT_DEFEAT": "Поражение",
"LUA_MENU_REPORT_DEFEAT_CAPS": "ПОРАЖЕНИЕ",
"LUA_MENU_REPORT_VICTORY": "Победа",
"LUA_MENU_REPORT_VICTORY_CAPS": "ПОБЕДА",
"LUA_MENU_ROTATION": "Несколько",
"LUA_MENU_RULES_EDIT_DEF_CLASSES": "Список заготовленных классов",
"LUA_MENU_RULES_FAST": "Быстро",
"LUA_MENU_RULES_GUN_CQC": "Холодное",
"LUA_MENU_RULES_GUN_MELEE": "Холодное",
"LUA_MENU_RULES_GUN_MELEE_RPG": "Холодное, РПГ",
"LUA_MENU_RULES_GUN_PROGRESSION_END": "Последнее оружие",
"LUA_MENU_RULES_GUN_RPG_MELEE": "РПГ, холодное",
"LUA_MENU_RULES_HEADSHOTS_ONLY": "Только попадания в голову",
"LUA_MENU_RULES_NORMAL": "По умолчанию",
"LUA_MENU_RULES_RETURN_TIME": "Время автовозврата флага",
"LUA_MENU_RULES_SETBACK_LEVELS": "Потеря уровня от ножа",
"LUA_MENU_RULES_STREAK_GRACE_PERIOD": "Отсрочка серии",
"LUA_MENU_RULES_TEAMKILL_KICK": "Исключение за убийство союзников",
"LUA_MENU_RULES_TEAM_SWITCH": "Смена команды посреди игры",
"LUA_MENU_RULES_TOGGLE_ROTATION_OFF": "Указать одну карту",
"LUA_MENU_RULES_TOGGLE_ROTATION_ON": "Указать несколько карт",
"LUA_MENU_RULES_UNLIMITED": "Без ограничений",
"LUA_MENU_SAS": "S.A.S",
"LUA_MENU_SD_RECIPE_DESC": "Версия на основе режима Найти и Уничтожить",
"LUA_MENU_SD_RECIPE_NAME": "Версия Найти и уничтожить",
"LUA_MENU_SETBACKS": "Откаты",
"LUA_MENU_SPAWN_SETTINGS": "Возрождение",
"LUA_MENU_SR_RECIPE_DESC": "Версия на основе Найти и спасти",
"LUA_MENU_SR_RECIPE_NAME": "Версия Найти и спасти",
"LUA_MENU_SUPPLY_DROP_MTX": "Редкий ящик снабжения",
"LUA_MENU_VERSUS": "VS",
"LUA_MENU_WAR_RECIPE_DESC": "Версия на основе режима Командный бой",
"LUA_MENU_WAR_RECIPE_NAME": "Версия Командный бой",
"LUA_MENU_WEAPON_ATTRIBUTE_HEADER": "СВОЙСТВА",
"LUA_MENU_WEAPON_STAT_MOBILITY": "МОБИЛЬН.",
"LUA_MENU_WEAPPERF_KILLS": "Убийства",
"LUA_MENU_WIN_PERCENTAGE": "% побед",
"LUA_MENU_WL_RATIO": "Победы/поражения",
"LUA_MP_FRONTEND_SCORE_PER_MINUTE_CAPS": "Очков в минуту",
"MENU_ALLOW_ENEMY_SPECTATING": "Наблюдение за противником: ",
"MENU_A_GAME_TYPE_WILL_BE_SELECTED_AT_RANDOM": "Режим игры будет выбран случайно.",
"MENU_CAPTURE_AND_HOLD_THE": "Зарабатывайте очки, захватывая и удерживая указанные позиции. ",
"MENU_CHANGE_GAME_TYPE": "Изменить режим игры",
"MENU_CHANGE_RATE_OF_FIRE": "Изменить темп стрельбы",
"MENU_CHANGE_WEAPON": "Сменить оружие",
"MENU_CONF_DESC": "Зарабатывайте очки, убивая противников и собирая их жетоны.",
"MENU_CREATE_A_CLASS_CAPS": "СОЗДАНИЕ КЛАССОВ",
"MENU_DEATHS": "Смерти",
"MENU_FREE_FOR_ALL": "Каждый за себя",
"MENU_GAME_OPTIONS": "Правила игры",
"MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ",
"MENU_GAME_TYPE": "Режим игры: ",
"MENU_GAME_TYPE1": "Режим игры",
"MENU_GAME_TYPES": "Режимы игры",
"MENU_GAME_TYPE_SETTINGS": "Настройки режима игры",
"MENU_HP_DESC": "Зарабатывайте очки, захватывая и удерживая опорные пункты. ",
"MENU_JOIN_SERVER_CAP": "ПОДКЛЮЧИТЬСЯ",
"MENU_KILLSTREAK_REWARD_SLOT_1": "Награды за серию убийств - ячейка 1",
"MENU_KILLSTREAK_REWARD_SLOT_2": "Награды за серию убийств - ячейка 2",
"MENU_KILLSTREAK_REWARD_SLOT_3": "Награды за серию убийств - ячейка 3",
"MENU_KILLSTREAK_REWARD_SLOT_4": "Награды за серию убийств - ячейка 4",
"MENU_KILLSTREAK_REWARD_SLOT_5": "Награды за серию убийств - ячейка 5",
"MENU_LEADERBOARD": "Список лидеров",
"MENU_LEAVE_GAME_RANKED2": "игры лишит вас бонуса за матч и",
"MENU_LEAVE_GAME_RANKED3": "будет засчитан как поражение.",
"MENU_LOAD_RECIPE_CAPS": "ЗАГРУЗИТЬ ВЕРСИЮ",
"MENU_LOAD_RECIPE_FROM_DISK": "Загрузить версию с диска",
"MENU_LOSSES": "Проигрыши",
"MENU_MELEE_CAPS": "ХОЛОДНОЕ",
"MENU_MISSES": "Промахи",
"MENU_MODIFIERS": "Модификаторы",
"MENU_ONLINE_STATS": "Сетевая статистика",
"MENU_PRESTIGE_RESET_TITLE2": "Подробнее",
"MENU_PRESTIGE_RESET_WARNING3": "Обратного пути нет...",
"MENU_PRIVATE_MATCH": "Закрытый матч",
"MENU_RATIO": "У/С",
"MENU_RECIPE_CHANGE_BASE_CAPS": "СМЕНИТЬ ТИП ВЕРСИИ",
"MENU_RECIPE_LOAD_CUSTOM": "Загрузить свою версию",
"MENU_RECIPE_SAVE_CUSTOM": "Сохранить свою версию",
"MENU_RECIPE_SETUP_CAPS": "НАСТРОЙКА ВЕРСИИ",
"MENU_REMOVE_FROM_FAVORITES": "Убрать из избранного",
"MENU_REPORT_CHEATING": "Читерство",
"MENU_SCORE_LOSING": "Вы проигрываете &&1 - &&2",
"MENU_SCORE_LOSING_WITH": "Вы проигрываете с &&1 из &&2 очков.",
"MENU_SCORE_WINNING": "Вы ведете &&1 - &&2",
"MENU_SCORE_WINNING_WITH": "Вы ведете с &&1 из &&2 очков.",
"MENU_SELECT_MATCH_TYPE": "Выбрать тип матча",
"MENU_SET_MAP_PREFERENCES": "Укажите, на каких картах вы предпочитаете играть",
"MENU_SHARED": "Урон обоим",
"MENU_SPECTATOR": "Зритель",
"MENU_SPECTATOR_MODE": "Режим зрителя",
"MENU_VIEW_FRIENDLY_FIRE": "Огонь по своим:",
"MENU_WINS": "Победы",
"MENU_WLRATIO": "Победы/Поражения",
"MPUI_ACCURACY_FRIENDS": "Меткость (Друзья)",
"MPUI_ACCURACY_GLOBAL": "Меткость (Все игроки)",
"MPUI_BOTS_REGULAR": "Рядовой",
"MPUI_CHANGE_GAMETYPEMAP": "Сменить режим игры/карту",
"MPUI_CHANGE_GAME_TYPE": "Изменить режим игры",
"MPUI_CHANGE_GAME_TYPEMAP": "Сменить режим/карту",
"MPUI_COMBATRECORD_GAMEMODESTAT_CONFIRMS": "Жетоны",
"MPUI_COMBATRECORD_GAMEMODESTAT_DEFENDS": "Защиты",
"MPUI_CONF": "Убийство подтверждено",
"MPUI_CONF_CAPS": "УБИЙСТВО ПОДТВЕРЖДЕНО",
"MPUI_CONF_RECIPE_DESC": "Версия на основе режима Убийство подтверждено",
"MPUI_DD": "Уничтожение",
"MPUI_DD_CAPS": "УНИЧТОЖЕНИЕ",
"MPUI_DEATHMATCH": "Каждый за себя",
"MPUI_DEATHMATCH_CAPS": "КАЖДЫЙ ЗА СЕБЯ",
"MPUI_DESC_CHANGE_GAMETYPE": "Выбрать другой режим игры.",
"MPUI_DESC_CHANGE_RULES": "Изменить правила матча.",
"MPUI_DESC_GAME_SETUP": "Сменить карту, режим и правила игры.",
"MPUI_DESC_LEADERBOARD_CONF": "Убийство подтверждено - список лидеров",
"MPUI_DESC_LEADERBOARD_DM": "Каждый за себя - список лидеров",
"MPUI_DESC_LEADERBOARD_DOM": "Превосходство - список лидеров",
"MPUI_DOMINATION": "Превосходство",
"MPUI_DOMINATION_CAPS": "ПРЕВОСХОДСТВО",
"MPUI_ENABLED_NO_BLEED": "Без ограничений",
"MPUI_FRIENDY_FIRE_PRE": "Огонь по своим:",
"MPUI_HARDCORE_PRE": "Хардкор:",
"MPUI_HARDPOINT": "Каждый за себя",
"MPUI_HITS": "Попадания",
"MPUI_LOSING_CAPS": "ТЕРЯЕМ",
"MPUI_LOSSES": "Поражения",
"MPUI_MISSES": "Промахи",
"MPUI_N_XP": "&&1 XP",
"MPUI_RANK": "Уровень",
"MPUI_RATIO": "У/С",
"MPUI_RECOMMENDEDPLAYERS": "Рекоменд. лимит игроков: &&1",
"MPUI_ROUND_SWITCH_PRE": "Смена сторон:",
"MPUI_RULES_FRIENDLY_FIRE": "Огонь по своим:",
"MPUI_RULES_HARDCORE": "Хардкор:",
"MPUI_RULES_INSTANT": "Сразу",
"MPUI_RULES_OLDSCHOOL": "Режим \"Старая школа\":",
"MPUI_RULES_ROUND_SWITCH": "Смена сторон:",
"MPUI_RULES_SHARED": "Урон обоим",
"MPUI_RULES_SPECTATING": "Вид от:",
"MPUI_RULES_TOGGLE_ROTATION_OFF": "Отключить ротацию карт",
"MPUI_RULES_TOGGLE_ROTATION_ON": "Включить ротацию карт",
"MPUI_RUSSIAN": "Русский",
"MPUI_SPECTATE": "Смотреть",
"MPUI_SPECTATING_PRE": "Вид от:",
"MPUI_SPECTATOR": "Зритель",
"MPUI_WAR_HARDCORE": "Командный бой. Хардкор",
"MPUI_WAR_RECIPE_DESC": "Версия на основе режима Командный бой",
"MPUI_WINLOSSRATIO": "Победы/поражения",
"MPUI_WINS": "Победы",
"MPUI_YES": "Да",
"MP_DEATHMATCH": "Каждый за себя",
"MP_DEATHMATCH_TIMER": "Каждый за себя - &&1",
"MP_HALFTIME": "Конец раунда",
"MP_IED_PRESS_LEFT_TRIGGER_TO_DETONATE": "Нажмите левый триггер, чтобы активировать детонатор",
"MP_INVALIDGAMETYPE": "Неверный режим игры.",
"MP_JOINED_ONE": "%s присоединяется к первому отряду",
"MP_KILLCAM": "ПОВТОР",
"MP_MATCH_BEGINS_IN_VAL": "Бой начнется через &&1 с",
"MP_MELEE": "Холодное",
"MP_NOSPECTATORCALLVOTE": "Зрители не могут начинать голосование.",
"MP_NOSPECTATORVOTE": "Зрители не могут голосовать.",
"MP_PLAY_TYPE": "Выберите режим",
"MP_SWITCHING_SIDES": "СМЕНА СТОРОН",
"MP_TEAMKILL": "Убийство своего",
"MP_THE_SERVER_DOES_NOT_HAVE": "На сервере нет этой карты.",
"MP_VOTE_GAMETYPE": "Режим игры: &&1",
"MP_VOTE_TEMPBAN": "Временно забанить: &&1",
"MP_ZOOM": "^3[{+ads}]^7 Смена кратности",
"PLATFORM_EMBLEM_LAYER_DOWN_KBM": "Опустить слой",
"PLATFORM_EMBLEM_LAYER_UP_KBM": "Поднять слой",
"PLATFORM_UI_HEADER_PLAY_MP_CAPS": "СЕТЕВАЯ ИГРА",
"PRESENCE_CONF_TDM": "Убийство подтверждено",
"PRESENCE_C_DOM": "Превосходство. Классика",
"PRESENCE_C_DOM_SYSTEM_DIALOG": "Превосходство, классика",
"PRESENCE_FFA": "Каждый за себя",
"PRESENCE_FFA_SYSTEM_DIALOG": "Каждый за себя",
"PRESENCE_HC_DOM": "Превосходство. Хардкор",
"PRESENCE_HC_FFA": "Каждый за себя. Хардкор",
"PRESENCE_HC_FFA_SYSTEM_DIALOG": "Каждый за себя, хардкор",
"SPLASHES_CAPTURE": "Плеймейкер!",
"SPLASHES_LAST_MAN_DEFUSE": "Крепкая хватка",
"SPLASHES_TAG_COLLECTOR": "Инкассатор",
"XBOXLIVE_DESTROYPARTY": "Распустить команду?"
}

2
deps/GSL vendored

@ -1 +1 @@
Subproject commit 330583f47800c60cf001239550d291d16274756a
Subproject commit 6c6111acb7b5d687ac006969ac96e5b1f21374cd

2
deps/asmjit vendored

@ -1 +1 @@
Subproject commit 5c469e3f7c307da939d38d72e09f08db7ca076ef
Subproject commit 5b5b0b38775938df4d3779604ff1db60b9a9dcbf

2
deps/curl vendored

@ -1 +1 @@
Subproject commit 8beff4355956e3d18ceb3afc21c1f3edec82543c
Subproject commit af5999a6742ea90011e7fa08aade7eac9943b76a

30
deps/extra/gsc-tool/interface.cpp vendored Normal file
View File

@ -0,0 +1,30 @@
#include "stdafx.hpp"
#include <xsk/h1.hpp>
#include "interface.hpp"
namespace gsc
{
std::unique_ptr<xsk::gsc::compiler> compiler()
{
auto compiler = std::make_unique<xsk::gsc::h1::compiler>();
compiler->mode(xsk::gsc::build::prod);
return compiler;
}
std::unique_ptr<xsk::gsc::decompiler> decompiler()
{
return std::make_unique<xsk::gsc::h1::decompiler>();
}
std::unique_ptr<xsk::gsc::assembler> assembler()
{
return std::make_unique<xsk::gsc::h1::assembler>();
}
std::unique_ptr<xsk::gsc::disassembler> disassembler()
{
return std::make_unique<xsk::gsc::h1::disassembler>();
}
}

9
deps/extra/gsc-tool/interface.hpp vendored Normal file
View File

@ -0,0 +1,9 @@
#pragma once
namespace gsc
{
std::unique_ptr<xsk::gsc::compiler> compiler();
std::unique_ptr<xsk::gsc::decompiler> decompiler();
std::unique_ptr<xsk::gsc::assembler> assembler();
std::unique_ptr<xsk::gsc::disassembler> disassembler();
}

1
deps/gsc-tool vendored Submodule

@ -0,0 +1 @@
Subproject commit 7d374025b7675bada64c247ebe9378dd335a33da

1
deps/json vendored Submodule

@ -0,0 +1 @@
Subproject commit 4c6cde72e533158e044252718c013a48bcff346c

2
deps/libtomcrypt vendored

@ -1 +1 @@
Subproject commit 8fd5dad96b56beb53b5cf199cb63fb76dfba32bb
Subproject commit 29986d04f2dca985ee64fbca1c7431ea3e3422f4

2
deps/libtommath vendored

@ -1 +1 @@
Subproject commit 4b47368501321c795d5b54d87a5bab35a21a7940
Subproject commit 03de03dee753442d4b23166982514639c4ccbc39

2
deps/lua vendored

@ -1 +1 @@
Subproject commit d61b0c60287c38008d312ddd11724a15b1737f7b
Subproject commit be908a7d4d8130264ad67c5789169769f824c5d1

2
deps/minhook vendored

@ -1 +1 @@
Subproject commit 4a455528f61b5a375b1f9d44e7d296d47f18bb18
Subproject commit 49d03ad118cf7f6768c79a8f187e14b8f2a07f94

68
deps/premake/gsc-tool.lua vendored Normal file
View File

@ -0,0 +1,68 @@
gsc_tool = {
source = path.join(dependencies.basePath, "gsc-tool/src")
}
function gsc_tool.import()
links {"xsk-gsc-h1", "xsk-gsc-utils"}
gsc_tool.includes()
end
function gsc_tool.includes()
includedirs {
path.join(gsc_tool.source, "utils"),
path.join(gsc_tool.source, "h1"),
path.join(dependencies.basePath, "extra/gsc-tool") -- https://github.com/GEEKiDoS/open-teknomw3/blob/master/deps/extra/gsc-tool
}
end
-- https://github.com/xensik/gsc-tool/blob/dev/premake5.lua#L95
function gsc_tool.project()
project "xsk-gsc-utils"
kind "StaticLib"
language "C++"
pchheader "stdafx.hpp"
pchsource(path.join(gsc_tool.source, "utils/stdafx.cpp"))
files {
path.join(gsc_tool.source, "utils/**.h"),
path.join(gsc_tool.source, "utils/**.hpp"),
path.join(gsc_tool.source, "utils/**.cpp")
}
includedirs {
path.join(gsc_tool.source, "utils"),
gsc_tool.source
}
zlib.includes()
project "xsk-gsc-h1"
kind "StaticLib"
language "C++"
pchheader "stdafx.hpp"
pchsource(path.join(gsc_tool.source, "h1/stdafx.cpp"))
files {
path.join(gsc_tool.source, "h1/**.h"),
path.join(gsc_tool.source, "h1/**.hpp"),
path.join(gsc_tool.source, "h1/**.cpp"),
path.join(dependencies.basePath, "extra/gsc-tool/interface.cpp")
}
includedirs {
path.join(gsc_tool.source, "h1"),
gsc_tool.source,
path.join(dependencies.basePath, "extra/gsc-tool")
}
-- https://github.com/xensik/gsc-tool/blob/dev/premake5.lua#L25
-- adding these build options fixes a bunch of parser stuff
filter "action:vs*"
buildoptions "/bigobj"
buildoptions "/Zc:__cplusplus"
filter {}
end
table.insert(dependencies, gsc_tool)

17
deps/premake/json.lua vendored Normal file
View File

@ -0,0 +1,17 @@
json = {
source = path.join(dependencies.basePath, "json")
}
function json.import()
json.includes()
end
function json.includes()
includedirs {path.join(json.source, "single_include/*")}
end
function json.project()
end
table.insert(dependencies, json)

2
deps/protobuf vendored

@ -1 +1 @@
Subproject commit fb6f8da08b60b6beb5bb360d79dd3feda0147da7
Subproject commit 7ce9c415455c098409222702b3b4572b47232882

2
deps/rapidjson vendored

@ -1 +1 @@
Subproject commit 27c3a8dc0e2c9218fe94986d249a12b5ed838f1d
Subproject commit a98e99992bd633a2736cc41f96ec85ef0c50e44d

2
deps/sol2 vendored

@ -1 +1 @@
Subproject commit 4de99c5b41b64b7e654bf8e48b177e8414a756b7
Subproject commit f81643aa0c0c507c0cd8400b8cfedc74a34a19f6

2
deps/stb vendored

@ -1 +1 @@
Subproject commit af1a5bc352164740c1cc1354942b1c6b72eacb8a
Subproject commit 8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55

2
deps/zlib vendored

@ -1 +1 @@
Subproject commit eff308af425b67093bab25f80f1ae950166bece1
Subproject commit e554695638228b846d49657f31eeff0ca4680e8a

View File

@ -0,0 +1,88 @@
#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include "game/game.hpp"
#include "filesystem.hpp"
#include "console.hpp"
#include <utils/hook.hpp>
#include <utils/io.hpp>
#include <utils/memory.hpp>
#define MAX_ARENAS 64
namespace arena
{
namespace
{
std::recursive_mutex arena_mutex;
bool parse_arena(const std::string& path)
{
std::lock_guard<std::recursive_mutex> _0(arena_mutex);
std::string buffer{};
if (filesystem::read_file(path, &buffer) && !buffer.empty())
{
*game::ui_num_arenas += game::GameInfo_ParseArenas(buffer.data(), MAX_ARENAS - *game::ui_num_arenas,
&game::ui_arena_infos[*game::ui_num_arenas]);
return true;
}
if (!game::DB_XAssetExists(game::ASSET_TYPE_RAWFILE, path.data()) ||
game::DB_IsXAssetDefault(game::ASSET_TYPE_RAWFILE, path.data()))
{
return false;
}
const auto rawfile = game::DB_FindXAssetHeader(game::ASSET_TYPE_RAWFILE, path.data(), 0).rawfile;
const auto len = game::DB_GetRawFileLen(rawfile);
const auto rawfile_buffer = utils::memory::get_allocator()->allocate_array<char>(len);
const auto _1 = gsl::finally([&]
{
utils::memory::get_allocator()->free(rawfile_buffer);
});
game::DB_GetRawBuffer(rawfile, rawfile_buffer, len);
*game::ui_num_arenas += game::GameInfo_ParseArenas(rawfile_buffer, MAX_ARENAS - *game::ui_num_arenas,
&game::ui_arena_infos[*game::ui_num_arenas]);
return true;
}
void load_arenas_stub()
{
*game::ui_num_arenas = 0;
*game::ui_arena_buf_pos = 0;
parse_arena("mp/basemaps.arena");
// read usermap arena from disk
const auto mapname = game::Dvar_FindVar("ui_mapname");
if (mapname && mapname->current.string)
{
const auto usermap_path = "usermaps/"s + mapname->current.string;
const auto arena_path = usermap_path + "/" + mapname->current.string + ".arena";
parse_arena(arena_path);
}
}
}
class component final : public component_interface
{
public:
void post_unpack() override
{
if (!game::environment::is_mp())
{
return;
}
// load custom arenas
utils::hook::jump(0x4DE030_b, load_arenas_stub);
}
};
}
REGISTER_COMPONENT(arena::component)

View File

@ -1,6 +1,9 @@
#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include "arxan.hpp"
#include "scheduler.hpp"
#include "game/game.hpp"
#include <utils/hook.hpp>
@ -137,9 +140,12 @@ namespace arxan
void post_unpack() override
{
// cba to implement sp, not sure if it's even needed
if (game::environment::is_sp()) return;
if (game::environment::is_sp())
{
return;
}
}
};
}
REGISTER_COMPONENT(arxan::component)
REGISTER_COMPONENT(arxan::component)

View File

View File

@ -2,18 +2,19 @@
#include "loader/component_loader.hpp"
#include "auth.hpp"
#include "component/command.hpp"
#include "command.hpp"
#include "console.hpp"
#include "network.hpp"
#include "game/game.hpp"
#include "steam/steam.hpp"
#include <utils/hook.hpp>
#include <utils/string.hpp>
#include <utils/smbios.hpp>
#include <utils/info_string.hpp>
#include <utils/cryptography.hpp>
#include "game/game.hpp"
#include "steam/steam.hpp"
namespace auth
{
namespace
@ -162,7 +163,6 @@ namespace auth
if (xuid != key.get_hash())
{
//MessageBoxA(nullptr, steam_id.data(), std::to_string(key.get_hash()).data(), 0);
network::send(*from, "error",
utils::string::va("XUID doesn't match the certificate: %llX != %llX", xuid, key.get_hash()), '\n');
return;
@ -250,9 +250,9 @@ namespace auth
utils::hook::set(0x12D93C_b, 0xC3);
}
command::add("guid", []()
command::add("guid", []
{
printf("Your guid: %llX\n", steam::SteamUser()->GetSteamID().bits);
console::info("Your guid: %llX\n", steam::SteamUser()->GetSteamID().bits);
});
}
};

View File

@ -1,5 +1,6 @@
#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include "game/game.hpp"
#include <utils/hook.hpp>

Some files were not shown because too many files have changed in this diff Show More