Merge pull request #389 from h1-mod/develop
This commit is contained in:
commit
a558e76aa8
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -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
14
.gitmodules
vendored
@ -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
|
||||
|
BIN
data/cdata/fallback/fonts/defaultBold.otf
Normal file
BIN
data/cdata/fallback/fonts/defaultBold.otf
Normal file
Binary file not shown.
27
data/cdata/scripts/mp/team_balance.gsc
Normal file
27
data/cdata/scripts/mp/team_balance.gsc
Normal 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();
|
||||
}
|
13
data/cdata/ui_scripts/custom_depot/mod_eula.lua
Normal file
13
data/cdata/ui_scripts/custom_depot/mod_eula.lua
Normal 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)
|
272
data/cdata/ui_scripts/discord/__init__.lua
Normal file
272
data/cdata/ui_scripts/discord/__init__.lua
Normal 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)
|
193
data/cdata/ui_scripts/hud_info/hud.lua
Normal file
193
data/cdata/ui_scripts/hud_info/hud.lua
Normal 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)
|
121
data/cdata/ui_scripts/hud_info/settings.lua
Normal file
121
data/cdata/ui_scripts/hud_info/settings.lua
Normal 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
|
5
data/cdata/ui_scripts/mods/__init__.lua
Normal file
5
data/cdata/ui_scripts/mods/__init__.lua
Normal file
@ -0,0 +1,5 @@
|
||||
require("loading")
|
||||
|
||||
if (Engine.InFrontend()) then
|
||||
require("download")
|
||||
end
|
24
data/cdata/ui_scripts/mods/download.lua
Normal file
24
data/cdata/ui_scripts/mods/download.lua
Normal 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)
|
115
data/cdata/ui_scripts/mods/loading.lua
Normal file
115
data/cdata/ui_scripts/mods/loading.lua
Normal 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)
|
27
data/cdata/ui_scripts/patches/__init__.lua
Normal file
27
data/cdata/ui_scripts/patches/__init__.lua
Normal 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
|
11
data/cdata/ui_scripts/patches/background_effects.lua
Normal file
11
data/cdata/ui_scripts/patches/background_effects.lua
Normal 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
|
19
data/cdata/ui_scripts/patches/disable_useless_things.lua
Normal file
19
data/cdata/ui_scripts/patches/disable_useless_things.lua
Normal 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
|
105
data/cdata/ui_scripts/patches/language.lua
Normal file
105
data/cdata/ui_scripts/patches/language.lua
Normal 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
|
35
data/cdata/ui_scripts/patches/scoreboard.lua
Normal file
35
data/cdata/ui_scripts/patches/scoreboard.lua
Normal 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
|
25
data/cdata/ui_scripts/patches/shader_dialog.lua
Normal file
25
data/cdata/ui_scripts/patches/shader_dialog.lua
Normal 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
|
53
data/cdata/ui_scripts/patches/sp_unlockall.lua
Normal file
53
data/cdata/ui_scripts/patches/sp_unlockall.lua
Normal 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
|
||||
|
@ -4,3 +4,4 @@ end
|
||||
|
||||
require("lobby")
|
||||
require("serverlist")
|
||||
require("confirm")
|
12
data/cdata/ui_scripts/server_list/confirm.lua
Normal file
12
data/cdata/ui_scripts/server_list/confirm.lua
Normal 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
|
@ -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,
|
252
data/cdata/ui_scripts/server_list/serverlist.lua
Normal file
252
data/cdata/ui_scripts/server_list/serverlist.lua
Normal 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
|
145
data/cdata/ui_scripts/stats/__init__.lua
Normal file
145
data/cdata/ui_scripts/stats/__init__.lua
Normal 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
|
@ -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()
|
@ -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)
|
@ -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)
|
@ -1 +0,0 @@
|
||||
-- this patch has been moved to ui_scripts/patches/gamemodes.lua
|
@ -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)
|
@ -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
|
@ -1,3 +0,0 @@
|
||||
if (game:issingleplayer()) then
|
||||
require("loading")
|
||||
end
|
@ -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)
|
@ -1 +0,0 @@
|
||||
-- this patch has been moved to ui_scripts/patches/no_mode_switch.lua
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
16
data/zone_source/build.txt
Normal file
16
data/zone_source/build.txt
Normal 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
|
1
data/zone_source/deu_h1_mod_common.csv
Normal file
1
data/zone_source/deu_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,german
|
|
1
data/zone_source/eng_h1_mod_common.csv
Normal file
1
data/zone_source/eng_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,english
|
|
1
data/zone_source/ens_h1_mod_common.csv
Normal file
1
data/zone_source/ens_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,english_safe
|
|
1
data/zone_source/fra_h1_mod_common.csv
Normal file
1
data/zone_source/fra_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,french
|
|
1
data/zone_source/fra_h1_mod_common_mp.csv
Normal file
1
data/zone_source/fra_h1_mod_common_mp.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,french
|
|
2
data/zone_source/h1_mod_common.csv
Normal file
2
data/zone_source/h1_mod_common.csv
Normal file
@ -0,0 +1,2 @@
|
||||
localize,english
|
||||
ttf,fonts/default.otf
|
|
1
data/zone_source/ita_h1_mod_common.csv
Normal file
1
data/zone_source/ita_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,italian
|
|
1
data/zone_source/jpp_h1_mod_common.csv
Normal file
1
data/zone_source/jpp_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,japanese_partial
|
|
1
data/zone_source/kor_h1_mod_common.csv
Normal file
1
data/zone_source/kor_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,korean
|
|
1
data/zone_source/pol_h1_mod_common.csv
Normal file
1
data/zone_source/pol_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,polish
|
|
1
data/zone_source/por_h1_mod_common.csv
Normal file
1
data/zone_source/por_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,portuguese
|
|
1
data/zone_source/rus_h1_mod_common.csv
Normal file
1
data/zone_source/rus_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,russian
|
|
1
data/zone_source/rus_h1_mod_common_mp.csv
Normal file
1
data/zone_source/rus_h1_mod_common_mp.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,russian
|
|
1
data/zone_source/sch_h1_mod_common.csv
Normal file
1
data/zone_source/sch_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,simplified_chinese
|
|
1
data/zone_source/spa_h1_mod_common.csv
Normal file
1
data/zone_source/spa_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,spanish
|
|
1
data/zone_source/tch_h1_mod_common.csv
Normal file
1
data/zone_source/tch_h1_mod_common.csv
Normal file
@ -0,0 +1 @@
|
||||
localize,traditional_chinese
|
|
@ -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"
|
||||
}
|
BIN
data/zonetool/h1_mod_common/fonts/default.otf
Normal file
BIN
data/zonetool/h1_mod_common/fonts/default.otf
Normal file
Binary file not shown.
94
data/zonetool/h1_mod_common/localizedstrings/english.json
Normal file
94
data/zonetool/h1_mod_common/localizedstrings/english.json
Normal 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"
|
||||
}
|
6
data/zonetool/localizedstrings/english.json
Normal file
6
data/zonetool/localizedstrings/english.json
Normal 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?"
|
||||
}
|
6
data/zonetool/localizedstrings/english_safe.json
Normal file
6
data/zonetool/localizedstrings/english_safe.json
Normal 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?"
|
||||
}
|
51
data/zonetool/localizedstrings/french.json
Normal file
51
data/zonetool/localizedstrings/french.json
Normal 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."
|
||||
}
|
17
data/zonetool/localizedstrings/german.json
Normal file
17
data/zonetool/localizedstrings/german.json
Normal 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"
|
||||
}
|
26
data/zonetool/localizedstrings/italian.json
Normal file
26
data/zonetool/localizedstrings/italian.json
Normal 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"
|
||||
}
|
18
data/zonetool/localizedstrings/japanese_partial.json
Normal file
18
data/zonetool/localizedstrings/japanese_partial.json
Normal 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": "アンロックをキャンセル"
|
||||
}
|
18
data/zonetool/localizedstrings/korean.json
Normal file
18
data/zonetool/localizedstrings/korean.json
Normal 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": "잠금 해제 취소"
|
||||
}
|
18
data/zonetool/localizedstrings/polish.json
Normal file
18
data/zonetool/localizedstrings/polish.json
Normal 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"
|
||||
}
|
18
data/zonetool/localizedstrings/portuguese.json
Normal file
18
data/zonetool/localizedstrings/portuguese.json
Normal 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"
|
||||
}
|
242
data/zonetool/localizedstrings/russian.json
Normal file
242
data/zonetool/localizedstrings/russian.json
Normal 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": "Чарли не сëрфят"
|
||||
}
|
18
data/zonetool/localizedstrings/simplified_chinese.json
Normal file
18
data/zonetool/localizedstrings/simplified_chinese.json
Normal 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": "取消解锁"
|
||||
}
|
18
data/zonetool/localizedstrings/spanish.json
Normal file
18
data/zonetool/localizedstrings/spanish.json
Normal 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"
|
||||
}
|
18
data/zonetool/localizedstrings/traditional_chinese.json
Normal file
18
data/zonetool/localizedstrings/traditional_chinese.json
Normal 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": "取消解鎖"
|
||||
}
|
354
data/zonetool/rus_h1_mod_common_mp/localizedstrings/russian.json
Normal file
354
data/zonetool/rus_h1_mod_common_mp/localizedstrings/russian.json
Normal 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
2
deps/GSL
vendored
@ -1 +1 @@
|
||||
Subproject commit 330583f47800c60cf001239550d291d16274756a
|
||||
Subproject commit 6c6111acb7b5d687ac006969ac96e5b1f21374cd
|
2
deps/asmjit
vendored
2
deps/asmjit
vendored
@ -1 +1 @@
|
||||
Subproject commit 5c469e3f7c307da939d38d72e09f08db7ca076ef
|
||||
Subproject commit 5b5b0b38775938df4d3779604ff1db60b9a9dcbf
|
2
deps/curl
vendored
2
deps/curl
vendored
@ -1 +1 @@
|
||||
Subproject commit 8beff4355956e3d18ceb3afc21c1f3edec82543c
|
||||
Subproject commit af5999a6742ea90011e7fa08aade7eac9943b76a
|
30
deps/extra/gsc-tool/interface.cpp
vendored
Normal file
30
deps/extra/gsc-tool/interface.cpp
vendored
Normal 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
9
deps/extra/gsc-tool/interface.hpp
vendored
Normal 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
1
deps/gsc-tool
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 7d374025b7675bada64c247ebe9378dd335a33da
|
1
deps/json
vendored
Submodule
1
deps/json
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 4c6cde72e533158e044252718c013a48bcff346c
|
2
deps/libtomcrypt
vendored
2
deps/libtomcrypt
vendored
@ -1 +1 @@
|
||||
Subproject commit 8fd5dad96b56beb53b5cf199cb63fb76dfba32bb
|
||||
Subproject commit 29986d04f2dca985ee64fbca1c7431ea3e3422f4
|
2
deps/libtommath
vendored
2
deps/libtommath
vendored
@ -1 +1 @@
|
||||
Subproject commit 4b47368501321c795d5b54d87a5bab35a21a7940
|
||||
Subproject commit 03de03dee753442d4b23166982514639c4ccbc39
|
2
deps/lua
vendored
2
deps/lua
vendored
@ -1 +1 @@
|
||||
Subproject commit d61b0c60287c38008d312ddd11724a15b1737f7b
|
||||
Subproject commit be908a7d4d8130264ad67c5789169769f824c5d1
|
2
deps/minhook
vendored
2
deps/minhook
vendored
@ -1 +1 @@
|
||||
Subproject commit 4a455528f61b5a375b1f9d44e7d296d47f18bb18
|
||||
Subproject commit 49d03ad118cf7f6768c79a8f187e14b8f2a07f94
|
68
deps/premake/gsc-tool.lua
vendored
Normal file
68
deps/premake/gsc-tool.lua
vendored
Normal 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
17
deps/premake/json.lua
vendored
Normal 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
2
deps/protobuf
vendored
@ -1 +1 @@
|
||||
Subproject commit fb6f8da08b60b6beb5bb360d79dd3feda0147da7
|
||||
Subproject commit 7ce9c415455c098409222702b3b4572b47232882
|
2
deps/rapidjson
vendored
2
deps/rapidjson
vendored
@ -1 +1 @@
|
||||
Subproject commit 27c3a8dc0e2c9218fe94986d249a12b5ed838f1d
|
||||
Subproject commit a98e99992bd633a2736cc41f96ec85ef0c50e44d
|
2
deps/sol2
vendored
2
deps/sol2
vendored
@ -1 +1 @@
|
||||
Subproject commit 4de99c5b41b64b7e654bf8e48b177e8414a756b7
|
||||
Subproject commit f81643aa0c0c507c0cd8400b8cfedc74a34a19f6
|
2
deps/stb
vendored
2
deps/stb
vendored
@ -1 +1 @@
|
||||
Subproject commit af1a5bc352164740c1cc1354942b1c6b72eacb8a
|
||||
Subproject commit 8b5f1f37b5b75829fc72d38e7b5d4bcbf8a26d55
|
2
deps/zlib
vendored
2
deps/zlib
vendored
@ -1 +1 @@
|
||||
Subproject commit eff308af425b67093bab25f80f1ae950166bece1
|
||||
Subproject commit e554695638228b846d49657f31eeff0ca4680e8a
|
88
src/client/component/arena.cpp
Normal file
88
src/client/component/arena.cpp
Normal 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)
|
@ -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)
|
||||
|
0
src/client/component/arxan.hpp
Normal file
0
src/client/component/arxan.hpp
Normal 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);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user