Merge pull request #635 from fedddddd/develop

v3.0.3
This commit is contained in:
fed 2024-02-12 16:16:24 +01:00 committed by GitHub
commit d5764d17c2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
409 changed files with 36423 additions and 13798 deletions

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Discord Server
url: https://discord.gg/dpnRn2tKT9/
about: Please ask and answer support questions here.

31
.github/ISSUE_TEMPLATE/get-help.md vendored Normal file
View File

@ -0,0 +1,31 @@
---
name: Get help
about: Get help using H2-Mod
title: ''
labels: discussion
assignees: ''
---
_Do not open an issue here if you need help with modding or have a problem getting the client to run.
It is very likely your problem will be resolved by reading the [README](https://github.com/fedddddd/h2-mod#installation) carefully.
Ask in the `#help` channel on the [Discord](https://discord.gg/dpnRn2tKT9) server if you still have problems.
Before opening a new issue, please see [Issues](https://github.com/fedddddd/h2-mod/issues) and check that a similar issue does not already exist
If this does not apply, please continue by filling in the template below._
**What are you trying to do?**
A short, concise description of the outcome you are trying to achieve.
**What problem are you having?**
A clear and concise description of the problem that is blocking you from your desired outcome, ex. "H2-Mod is crashing with this error message: ..."
Please walk us through the steps you have taken when you encountered this problem.
If H2-Mod is crashing, include the minidump file and the crash address in text form. Screenshots showing the message box with the crash address are not acceptable.
**What have you tried so far?**
Describe any steps you've already taken to try to get past this issue. Have you found a workaround?
**What version of H2-Mod are you using?**
Please make sure you are up to date with the latest build from the `main` or `develop` branch.
**Anything else we should know?**
Add any other context about the problem here.

View File

@ -0,0 +1,27 @@
---
name: Request a feature
about: Suggest a new feature or enhancement
title: ''
labels: feature
assignees: ''
---
_Before opening a new feature request, please see [Issues](https://github.com/fedddddd/h2-mod/issues) and check that a similar issue does not already exist.
If this a new request, help us help you by filling in the template below.
H2-Mod is not in active development right now. Please keep in mind that if there is not a clear positive impact on the gameplay to be gained by this feature request, it may be closed at the maintainers' discretion._
**What problem will this solve?**
A clear and concise description of the problem this new feature is meant to solve, ex. "There is something wrong with the game" or "There is something wrong with H2-Mod's source code".
Please limit your request to a single feature; create multiple feature requests instead.
**What might be a solution?**
A clear and concise description of what you want to happen. If you are proposing changes to H2-Mod's source code, tell us which component you want to be changed.
If you propose changes to the game, you may use images or videos to illustrate what aspect of the game should be changed.
**What other alternatives have you already considered?**
A clear and concise description of any alternative solutions or features you've considered.
It may help others to find workarounds until the problem is resolved.
**Anything else we should know?**
Add any other context or screenshots about the feature request here.

View File

@ -8,6 +8,9 @@ on:
branches: branches:
- "*" - "*"
types: [opened, synchronize, reopened] types: [opened, synchronize, reopened]
concurrency:
group: ${{ github.ref }}
cancel-in-progress: false
jobs: jobs:
build: build:
name: Build binaries name: Build binaries
@ -18,20 +21,11 @@ jobs:
- Debug - Debug
- Release - Release
steps: steps:
- name: Wait for previous workflows
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop')
uses: softprops/turnstyle@v1
with:
poll-interval-seconds: 10
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check out files - name: Check out files
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
submodules: true submodules: true
fetch-depth: 0 fetch-depth: 0
# NOTE - If LFS ever starts getting used during builds, switch this to true!
lfs: false lfs: false
- name: Add msbuild to PATH - name: Add msbuild to PATH

6
.gitmodules vendored
View File

@ -43,9 +43,9 @@
[submodule "deps/curl"] [submodule "deps/curl"]
path = deps/curl path = deps/curl
url = https://github.com/curl/curl.git url = https://github.com/curl/curl.git
[submodule "deps/gsc-tool-h2"]
path = deps/gsc-tool-h2
url = https://github.com/fedddddd/gsc-tool-h2.git
[submodule "deps/json"] [submodule "deps/json"]
path = deps/json path = deps/json
url = https://github.com/nlohmann/json.git url = https://github.com/nlohmann/json.git
[submodule "deps/gsc-tool"]
path = deps/gsc-tool
url = https://github.com/xensik/gsc-tool.git

View File

@ -14,7 +14,7 @@
**NOTE**: You must legally own Call of Duty®: Modern Warfare® 2 Campaign Remastered to run this mod. Cracked/Pirated versions of the game are **NOT** supported. **NOTE**: You must legally own Call of Duty®: Modern Warfare® 2 Campaign Remastered to run this mod. Cracked/Pirated versions of the game are **NOT** supported.
1. Download the latest **[release](https://github.com/fedddddd/h2-mod/releases/latest/download/h2-mod.exe)** or **[develop](https://master.fed0001.xyz/data-dev/h2-mod.exe)** build 1. Download the latest **[release](https://h2-mod.fed.cat/data/h2-mod.exe)** or **[develop](https://h2-mod.fed.cat/data-dev/h2-mod.exe)** build
2. Drop the file in your **Call of Duty: Modern Warfare 2 Campaign Remastered** installation folder. 2. Drop the file in your **Call of Duty: Modern Warfare 2 Campaign Remastered** installation folder.
3. Run **h2-mod.exe** and make sure you press **"YES"** when asked whether to install updates. 3. Run **h2-mod.exe** and make sure you press **"YES"** when asked whether to install updates.

View File

@ -0,0 +1,21 @@
main()
{
replacefunc(maps\char_museum::ramirez_jukebox, ::ramirez_jukebox);
}
ramirez_jukebox()
{
common_scripts\utility::flag_wait("museum_ready");
wait 4;
jukebox = getent("ramirez_jukebox", "targetname");
jukebox makeusable();
for (;;)
{
jukebox waittill("trigger");
index = randomint(37);
jukebox maps\_utility::play_sound_on_entity("museum_ramirez_ee_" + index);
maps\_utility::giveachievement_wrapper("RAMIREZ");
}
}

View File

@ -1,3 +1,5 @@
#include maps\_endmission;
main() main()
{ {
replacefunc(maps\_credit_h2_autogen::_id_B775, ::initiwcredits); replacefunc(maps\_credit_h2_autogen::_id_B775, ::initiwcredits);

View File

@ -0,0 +1,171 @@
#include maps\_endmission;
main()
{
// fix credits victory screen & add wait after giving mission achievements
replacefunc(maps\_endmission::_nextmission, ::nextmission);
}
give_mission_achievement(name)
{
was_unlocked = achievementunlocked(name);
maps\_utility::giveachievement_wrapper(name);
if (!was_unlocked)
{
wait 4;
}
}
nextmission(var_0)
{
level notify("achievements_level_complete");
if (level.script == "ending" && level._id_AC38 != "credits_1")
{
changelevel("");
}
else
{
if (!isdefined(var_0))
var_0 = 0;
level notify("nextmission");
level.player notify("levelComplete");
level.nextmission = 1;
level.player enableinvulnerability();
if (maps\_utility::arcademode())
{
level._id_AC81 = 1;
thread _id_D36F::_id_AF95();
common_scripts\utility::flag_wait("arcademode_ending_complete");
}
var_1 = undefined;
setsaveddvar("ui_nextMission", "1");
setdvar("ui_showPopup", "0");
setdvar("ui_popupString", "");
if (level.script == "ending")
{
level.script = "af_chase";
nextmission(1);
level.script = "ending";
}
game["previous_map"] = level.script;
var_1 = level.missionsettings getlevelindex(level.script);
if (!(level.script == "af_chase" && var_0) && !maps\_utility::achievement_conditions("IMMORTAL"))
{
_func_1FC(level.script, var_1);
updategamerprofileall();
maps\_endmission::check_immortal_achievement();
}
maps\_gameskill::auto_adust_zone_complete("aa_main_" + level.script);
if (!isdefined(var_1))
{
missionsuccess(level.script);
return;
}
if (level.script != "ending" && !(level.script == "af_chase" && var_0))
{
level.player thread maps\_hud_util::fade_out(1, undefined);
soundscripts\_snd::snd_message("end_mission_fade_to_black");
wait 2;
maps\_utility::level_end_save();
}
if (level.script != "af_chase" || var_0)
{
level.missionsettings setlevelcompleted(var_1);
var_3 = maps\_endmission::updatesppercent();
updategamerprofile();
if (level.missionsettings hasachievement(var_1))
{
give_mission_achievement(level.missionsettings getachievement(var_1));
}
if (level.missionsettings haslevelveteranaward(var_1) && getlevelcompleted(var_1) == 4 && level.missionsettings check_other_haslevelveteranachievement(var_1))
{
give_mission_achievement(level.missionsettings getlevelveteranaward(var_1));
}
if (level.missionsettings hasmissionhardenedaward() && level.missionsettings getlowestskill() > 2)
{
give_mission_achievement(level.missionsettings gethardenedaward());
}
level.missionsettings maps\_endmission::_id_D1B9();
var_4 = level.missionsettings.levels.size;
}
if (level.script == "af_chase" && var_0)
return;
if (level.script == "ending" && level._id_AC38 == "credits_1")
common_scripts\utility::flag_wait("af_chase_nextmission");
if (level.script == "airplane" || level.script == "ending")
{
if (level.credits_active)
{
level notify("credits_ended");
credits_end();
}
setsaveddvar("ui_nextMission", "0");
return;
}
else
{
var_4 = var_1 + 1;
}
if (getdvarint("limited_mode"))
{
setsaveddvar("ui_nextMission", "0");
changelevel("");
return;
}
if (maps\_utility::arcademode())
{
if (!getdvarint("arcademode_full"))
{
setsaveddvar("ui_nextMission", "0");
changelevel("");
return;
}
if (level.script == "cargoship")
{
changelevel("blackout", level.missionsettings getkeepweapons(var_1));
return;
}
else if (level.script == "airlift")
{
changelevel("village_assault", level.missionsettings getkeepweapons(var_1));
return;
}
else if (level.script == "jeepride")
{
changelevel("airplane", level.missionsettings getkeepweapons(var_1));
return;
}
}
if (level.missionsettings skipssuccess(var_1))
{
changelevel(level.missionsettings getlevelname(var_4), level.missionsettings getkeepweapons(var_1));
return;
}
missionsuccess(level.missionsettings getlevelname(var_4), level.missionsettings getkeepweapons(var_1));
}
}

View File

@ -0,0 +1,25 @@
main()
{
replacefunc(maps\gulag_code::surprise, ::surprise);
}
surprise()
{
level endon("cancel_surprise");
tv = getent("surprise_tv", "script_noteworthy");
tv thread maps\gulag_code::surprise_tv();
common_scripts\utility::flag_wait("player_nears_cell_door3");
maps\gulag_code::surprise_damage_trigger();
maps\gulag_code::surprise_flag_touching();
tv thread maps\_utility::play_sound_on_entity("h2_zombie_easter_egg");
tv.screen = spawn("script_model", tv.origin);
tv.screen.angles = tv.angles;
tv.screen setmodel("com_tv1_pho_zombie");
wait 3.3;
tv.screen delete();
maps\_utility::giveachievement_wrapper("BRAINS");
}

View File

@ -0,0 +1,2 @@
require("toast")
require("menu")

View File

@ -0,0 +1,372 @@
LUI.MenuBuilder.registerType("achievements_menu", function(root, controller)
local menuwidth = 500
local menu = LUI.MenuTemplate.new(root, {
menu_title = "@LUA_MENU_ACHIEVEMENTS",
exclusiveController = 0,
menu_width = menuwidth,
menu_top_indent = LUI.MenuTemplate.spMenuOffset,
showTopRightSmallBar = true,
uppercase_title = true
})
local black_state = CoD.CreateState(nil, nil, nil, nil, CoD.AnchorTypes.All)
black_state.red = 0
black_state.blue = 0
black_state.green = 0
black_state.alpha = 0
black_state.left = -100
black_state.right = 100
black_state.top = -100
black_state.bottom = 100
local black = LUI.UIImage.new(black_state)
black:setPriority(-1000)
black:registerAnimationState("BlackScreen", {
alpha = 1
})
black:registerAnimationState("Faded", {
alpha = 0
})
menu:addElement(black)
local currentbackground = nil
local changebackground = function(background, isvideobg)
if (not Engine.InFrontend() or currentbackground == background) then
return
end
currentbackground = background
if (isvideobg) then
PersistentBackground.ChangeBackground(nil, background)
else
PersistentBackground.ChangeBackground(background, "")
PersistentBackground.ChangeBackground(background, nil)
end
black:animateInSequence( {
{
"BlackScreen",
0
},
{
"Faded",
1000
}
})
end
local itemheight = 80
local itemwidth = menuwidth
local itemspacing = 10
local maxrowelements = 1
local rowelements = 0
local newrow = function()
local currentrow = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
width = itemheight * maxrowelements,
height = itemheight,
})
menu.list.currentrow = currentrow
menu.list:addElement(currentrow)
menu.list.currentrow:makeFocusable()
end
newrow()
local addelement = function(element)
local container = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
width = itemheight,
height = itemheight,
left = rowelements * (itemheight + itemspacing)
})
container:addElement(element)
container:makeFocusable()
menu.list.currentrow:addElement(container)
rowelements = rowelements + 1
if (rowelements == maxrowelements) then
newrow()
rowelements = 0
end
end
local achievementtable = achievements.table()
local unlockcount = 0
for i = 0, #achievementtable do
if (achievementtable[i]) then
unlockcount = unlockcount + 1
end
end
for i = 0, achievements.count() - 1 do
local btnbg = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
width = itemwidth,
height = itemheight,
material = RegisterMaterial("h2_btn_unfocused")
})
btnbg:setup9SliceImage()
btnbg:registerAnimationState("locked", {
material = RegisterMaterial("h2_btn_unfocused_locked")
})
local raritynames = {
"common",
"rare",
"legendary",
"epic",
}
local rarityname = raritynames[achievements.getrarity(i) + 1]
local raritystrip = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
width = 10,
height = itemheight,
material = RegisterMaterial("depot_button_rarity_strip_" .. rarityname)
})
raritystrip:registerAnimationState("hide", {
alpha = 0
})
raritystrip:registerAnimationState("show", {
alpha = 1
})
raritystrip:setup9SliceImage()
local glow = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
width = itemwidth,
height = itemheight,
material = RegisterMaterial("depot_button_rarity_glow_" .. rarityname)
})
glow:registerAnimationState("hide", {
alpha = 0
})
glow:registerAnimationState("show", {
alpha = 1
})
local glow2 = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
width = itemwidth,
height = itemheight,
material = RegisterMaterial("depot_button_rarity_glow_" .. rarityname)
})
glow2:registerAnimationState("hide", {
alpha = 0
})
glow2:registerAnimationState("show", {
alpha = 1
})
glow:animateToState("hide")
glow2:animateToState("hide")
local achievementcontainer = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
width = itemwidth,
height = itemheight,
})
local image = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
top = itemspacing / 2,
left = itemspacing / 2 + 10,
width = itemheight - itemspacing,
height = itemheight - itemspacing,
material = RegisterMaterial("trophy_" .. i)
})
image:registerAnimationState("locked", {
topAnchor = true,
leftAnchor = true,
top = itemspacing / 2 + 15,
left = itemspacing / 2 + 15 + 10,
width = itemheight - itemspacing - 30,
height = itemheight - itemspacing - 30,
material = RegisterMaterial("icon_lock_mini")
})
local textwidth = itemwidth - itemheight - itemspacing * 2
local title = LUI.UIText.new({
topAnchor = true,
leftAnchor = true,
top = itemspacing + 5,
left = itemheight + 5 + 10,
color = {
r = 0.7,
g = 0.7,
b = 0.7,
},
width = textwidth,
font = CoD.TextSettings.Font23.Font,
height = CoD.TextSettings.Font23.Height
})
local desc = LUI.UIText.new({
topAnchor = true,
leftAnchor = true,
top = itemspacing + CoD.TextSettings.Font23.Height + 10,
left = itemheight + 5 + 10,
width = textwidth,
alignment = LUI.Alignment.Left,
color = {
r = 0.7,
g = 0.7,
b = 0.7,
},
font = CoD.TextSettings.Font21.Font,
height = CoD.TextSettings.Font21.Height
})
local focusedtext = {
color = {r = 1, g = 1, b = 1}
}
desc:registerAnimationState("focused", focusedtext)
title:registerAnimationState("focused", focusedtext)
title:setText(Engine.ToUpperCase(Engine.Localize(achievements.getname(i))))
desc:setText(Engine.Localize(achievements.getdetails(i)))
achievementcontainer:setHandleMouse(true)
local locked = not achievementtable[i]
if (locked) then
raritystrip:animateToState("hide")
end
local background = achievements.getbackground(i)
achievementcontainer:registerEventHandler("mouseenter", function()
Engine.PlaySound(CoD.SFX.MouseOver)
if (background ~= nil and achievementtable[i]) then
changebackground(background, false)
else
changebackground("sp_menus_bg_regular", true)
end
if (locked) then
btnbg:setImage(RegisterMaterial("h2_btn_focused_locked"))
else
raritystrip:animateToState("show")
title:animateToState("focused")
desc:animateToState("focused")
glow:animateToState("show")
glow2:animateToState("show")
end
end)
achievementcontainer:registerEventHandler("mouseleave", function()
if (locked) then
btnbg:setImage(RegisterMaterial("h2_btn_unfocused_locked"))
else
title:animateToState("default")
desc:animateToState("default")
glow:animateToState("hide")
glow2:animateToState("hide")
end
end)
achievementcontainer:addElement(btnbg)
achievementcontainer:addElement(glow)
achievementcontainer:addElement(glow2)
achievementcontainer:addElement(raritystrip)
achievementcontainer:addElement(image)
achievementcontainer:addElement(title)
achievementcontainer:addElement(desc)
if (locked) then
btnbg:animateToState("locked")
image:animateToState("locked")
if (achievements.issecret(i)) then
title:setText(Engine.ToUpperCase(Engine.Localize("ACHIEVEMENT_HIDDEN")))
desc:setText(Engine.Localize("ACHIEVEMENT_HIDDEN_DESC"))
end
end
addelement(achievementcontainer)
end
if (rowelements == 0) then
menu.list.currentrow:close()
end
LUI.Options.InitScrollingList(menu.list, nil, {
rows = 5
})
local createprogressbar = function()
local barwidth = itemwidth + 17
local progressbar = LUI.UIElement.new({
bottomAnchor = true,
leftAnchor = true,
width = barwidth,
bottom = -90,
height = 15
})
local bg = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
alpha = 0.55,
color = Colors.grey_14,
})
local bar = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
bottomAnchor = true,
width = 0,
material = RegisterMaterial("h1_ui_progressbar_green")
})
progressbar.setprogress = function(fraction)
bar:registerAnimationState("progress", {
topAnchor = true,
leftAnchor = true,
bottomAnchor = true,
width = fraction * (barwidth),
})
bar:animateToState("progress", 300)
end
progressbar.setprogress(unlockcount / achievements.count())
progressbar:addElement(bg)
progressbar:addElement(bar)
progressbar:addElement(LUI.DecoFrame.new(nil, LUI.DecoFrame.Grey))
return progressbar
end
menu:addElement(createprogressbar())
menu:AddBackButton()
return menu
end)

View File

@ -0,0 +1,203 @@
if (Engine.InFrontend()) then
return
end
local hud = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
width = 500,
height = 500,
left = 0
})
local hidetimer = LUI.UITimer.new(5000, "hide_toast")
local finishtimer = LUI.UITimer.new(6000, "notification_finished")
local animtime = 250
hud:setPriority(1000)
local isshowingachievement = false
local notificationqueue = {}
local shownotificationinternal = nil
local shownextnotification = function()
isshowingachievement = false
local data = notificationqueue[1]
if (data == nil) then
return
end
table.remove(notificationqueue, 1)
shownotificationinternal(data)
end
local createtoast = function()
local height = 80
local width = 400
local padding = 10
local leftoffset = 10
local titlefont = CoD.TextSettings.Font27
local descfont = CoD.TextSettings.Font21
local imagesize = height - padding * 2
local textoffset = padding * 2 + imagesize
local textyoffset = height / 2 - (titlefont.Height + descfont.Height) / 2
local text2yoffset = 5
local container = LUI.UIElement.new({
topAnchor = true,
leftAnchor = true,
top = 100,
left = 0,
width = width,
height = height
})
container:registerAnimationState("hide", {
topAnchor = true,
leftAnchor = true,
top = 100,
left = -1000,
width = width,
height = height
})
container:registerAnimationState("show", {
topAnchor = true,
leftAnchor = true,
top = 100,
left = 0,
width = width,
height = height
})
container:registerAnimationState("show_right", {
topAnchor = true,
leftAnchor = true,
top = 100,
left = 40,
width = width,
height = height
})
local bg = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
rightAnchor = true,
bottomAnchor = true,
alpha = 0.55,
color = Colors.grey_14,
})
local imagebg = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
top = padding,
left = padding + leftoffset,
width = imagesize,
height = imagesize,
material = RegisterMaterial("trophy_border")
})
local image = LUI.UIImage.new({
topAnchor = true,
leftAnchor = true,
top = padding,
left = padding + leftoffset,
width = imagesize,
height = imagesize,
})
local title = LUI.UIText.new({
topAnchor = true,
leftAnchor = true,
top = textyoffset,
left = textoffset + leftoffset,
font = titlefont.Font,
height = titlefont.Height
})
local desc = LUI.UIText.new({
topAnchor = true,
leftAnchor = true,
width = width - textoffset - leftoffset - padding,
alignment = LUI.Alignment.Left,
top = textyoffset + titlefont.Height + text2yoffset,
left = textoffset + leftoffset,
font = descfont.Font,
height = descfont.Height
})
container:addElement(bg)
container:addElement(imagebg)
container:addElement(image)
container:addElement(title)
container:addElement(desc)
container:addElement(LUI.DecoFrame.new(nil, LUI.DecoFrame.Grey))
container:animateToState("hide")
container:addElement(hidetimer)
container:addElement(finishtimer)
container:registerEventHandler("hide_toast", function()
LUI.UITimer.Stop(hidetimer)
container:animateToState("hide", animtime)
end)
container:registerEventHandler("notification_finished", function()
LUI.UITimer.Stop(finishtimer)
shownextnotification()
end)
hud:addElement(container)
container.image = image
container.title = title
container.desc = desc
return container
end
local toast = createtoast()
shownotificationinternal = function(data)
isshowingachievement = true
LUI.UITimer.Reset(hidetimer)
LUI.UITimer.Reset(finishtimer)
toast:animateToState("hide")
toast:animateToState("show", animtime)
toast.title:setText(data.title)
toast.desc:setText(data.description)
toast.image:setImage(data.image)
if (data.sound) then
Engine.PlaySound(data.sound)
end
end
function addnotification(data)
table.insert(notificationqueue, data)
if (not isshowingachievement) then
shownextnotification()
end
end
local addachievementnotification = function(id)
addnotification({
title = Engine.Localize("ACHIEVEMENT_EARNED"),
description = Engine.ToUpperCase(Engine.Localize("ACHIEVEMENT_NAME_" .. id)),
image = RegisterMaterial("trophy_" .. id),
sound = "ui_achievement_unlocked"
})
end
hud:registerEventHandler("earned_achievement", function(element, event)
addachievementnotification(event.id)
end)
LUI.roots.UIRoot0:addElement(hud)

View File

@ -1 +1,2 @@
require("credits") require("credits")
require("victoryscreen")

View File

@ -0,0 +1,85 @@
local specopsmod = "mods/specops"
function CampaignCompleteMenu()
Engine.ExecNow("profile_menuDvarsSetup")
Engine.SetDvarBool("profileMenuOption_resumeIsGameCompleted", true)
Engine.ExecNow("profile_menuDvarsFinish")
Engine.Exec("updategamerprofile")
local victory = LUI.UIImage.new({
material = RegisterMaterial("victory"),
top = -300,
width = 1126,
height = 563,
alpha = 0
})
victory:registerAnimationState("show", {
alpha = 1
})
victory:animateInSequence({
{
"default",
0
},
{
"show",
1000
}
})
local topoffset = 590
local text = LUI.UIText.new({
leftAnchor = true,
rightAnchor = true,
topAnchor = true,
bottomAnchor = false,
top = topoffset,
bottom = topoffset + CoD.TextSettings.BodyFont18.Height,
font = CoD.TextSettings.BodyFont18.Font,
alignment = LUI.Alignment.Center,
alpha = 0
})
text:registerAnimationState("show", {
alpha = 1
})
text:setText(Engine.Localize("@MENU_SP_CONTINUE_TO_SPECIAL_OPS_CAPS"))
victory:addElement(text)
victory.text = text
victory.skipLocked = true
victory:addElement(LUI.UITimer.new(3000, "enable_quit", nil, true))
victory:registerEventHandler("enable_quit", function (element, event)
element.text:animateToState("show", 300)
element.skipLocked = false
end)
local buttonhandler = function (element, event)
if (element.skipLocked) then
return
else
if (mods.getinfo(specopsmod).isvalid) then
mods.load(specopsmod)
else
game:openlink("specops")
Engine.PlaySound(CoD.SFX.MenuAccept)
Engine.PopupClosed(event.controller, "accept_normal")
LUI.FlowManager.RequestCloseAllMenus(element)
end
end
end
local bindbutton = LUI.UIBindButton.new()
bindbutton:registerEventHandler("button_start", buttonhandler)
bindbutton:registerEventHandler("button_action", buttonhandler)
bindbutton:registerEventHandler("button_secondary", buttonhandler)
bindbutton.handlePrimary = true
victory:addElement(bindbutton)
return victory
end
LUI.MenuBuilder.m_types_build["MENU_CAMPAIGN_COMPLETED"] = CampaignCompleteMenu

View File

@ -0,0 +1,31 @@
LUI.addmenubutton("main_campaign", {
index = 6,
text = "@MENU_MODS",
description = Engine.Localize("@MENU_MODS_DESC"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "mods_menu")
end
})
LUI.addmenubutton("main_campaign", {
index = 6,
text = "@LUA_MENU_ACHIEVEMENTS",
description = Engine.Localize("@LUA_MENU_ACHIEVEMENTS_DESC"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "achievements_menu")
end
})
local maincampaign = LUI.MenuBuilder.m_types_build["main_campaign"]
LUI.MenuBuilder.m_types_build["main_campaign"] = function(...)
local initlist = LUI.Options.InitScrollingList
LUI.Options.InitScrollingList = function(list)
initlist(list, nil ,{
rows = 10
})
end
local menu = maincampaign(...)
LUI.Options.InitScrollingList = initlist
return menu
end

View File

@ -29,15 +29,6 @@ function string:truncate(length)
return self:sub(1, length - 3) .. "..." return self:sub(1, length - 3) .. "..."
end 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) function getmodname(path)
local modinfo = mods.getinfo(path) local modinfo = mods.getinfo(path)

View File

@ -11,6 +11,10 @@ LUI.MenuBuilder.registerPopupType("motd", function()
end) end)
LUI.onmenuopen("main_campaign", function(menu) LUI.onmenuopen("main_campaign", function(menu)
if (not motd.hasmotd()) then
return
end
if (not motd.hasseentoday()) then if (not motd.hasseentoday()) then
motd.sethasseentoday() motd.sethasseentoday()
LUI.FlowManager.RequestPopupMenu(nil, "motd") LUI.FlowManager.RequestPopupMenu(nil, "motd")

View File

@ -1 +1,2 @@
require("unlockall") require("unlockall")
require("pausequit")

View File

@ -0,0 +1,18 @@
if (Engine.InFrontend()) then
return
end
LUI.onmenuopen("sp_pause_menu", function(element)
local menu = element:getFirstChild()
local button = menu:AddButton("@LUA_MENU_ACHIEVEMENTS", function()
LUI.FlowManager.RequestAddMenu(nil, "achievements_menu")
end)
menu.list:removeElement(button)
menu.list:insertElement(button, 4)
menu:AddButton("@MENU_QUIT_TO_DESKTOP", function()
LUI.FlowManager.RequestAddMenu(nil, "quit_popmenu")
end)
end)

View File

@ -1,210 +1,3 @@
require("settings")
require("language") require("language")
require("audio")
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
LUI.addmenubutton("pc_controls", {
index = 4,
text = "@MENU_GENERAL",
description = Engine.Localize("@MENU_GENERAL_DESC"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "settings_menu")
end
})
LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = "@MENU_GENERAL",
menu_list_divider_top_offset = -(LUI.H1MenuTab.tabChangeHoldingElementHeight + H1MenuDims.spacing),
menu_width = GenericMenuDims.OptionMenuWidth
})
createdivider(menu, "@LUA_MENU_UPDATES")
LUI.Options.CreateOptionButton(
menu,
"cg_auto_update",
"@LUA_MENU_AUTO_UPDATE",
"@LUA_MENU_AUTO_UPDATE_DESC",
{
{
text = "@LUA_MENU_ENABLED",
value = true
},
{
text = "@LUA_MENU_DISABLED",
value = false
}
}
)
menu:AddButton("@LUA_MENU_CHECK_UPDATES", function()
LUI.tryupdating(false)
end, nil, true, nil, {
desc_text = Engine.Localize("@LUA_MENU_CHECK_UPDATES_DESC")
})
createdivider(menu, "@LUA_MENU_DRAWING")
LUI.Options.CreateOptionButton(
menu,
"cg_drawFPS",
"@LUA_MENU_DRAW_FPS",
"@LUA_MENU_DRAW_FPS_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = 0
},
{
text = "@LUA_MENU_FPS_ONLY",
value = 1
},
{
text = "@LUA_MENU_FPS_AND_VIEWPOS",
value = 2
}
}
)
LUI.Options.CreateOptionButton(
menu,
"cg_drawSpeed",
"@LUA_MENU_DRAW_SPEED",
"@LUA_MENU_DRAW_SPEED_DESC",
{
{
text = "@LUA_MENU_ENABLED",
value = true
},
{
text = "@LUA_MENU_DISABLED",
value = false
}
}
)
LUI.Options.CreateOptionButton(
menu,
"cg_speedGraph",
"@LUA_MENU_DRAW_SPEEDGRAPH",
"@LUA_MENU_DRAW_SPEEDGRAPH_DESC",
{
{
text = "@LUA_MENU_ENABLED",
value = true
},
{
text = "@LUA_MENU_DISABLED",
value = false
}
}
)
createdivider(menu, "@LUA_MENU_RENDERING")
LUI.Options.CreateOptionButton(
menu,
"r_fullbright",
"@LUA_MENU_R_FULLBRIGHT",
"@LUA_MENU_R_FULLBRIGHT_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = 0
},
{
text = "@LUA_MENU_ENABLED",
value = 1
},
{
text = "@LUA_MENU_MODE2",
value = 2
},
{
text = "@LUA_MENU_MODE3",
value = 3
}
}
)
createdivider(menu, "@LUA_MENU_AUDIO_OPTIONS")
LUI.Options.CreateOptionButton(
menu,
"snd_musicDisabledForCustomSoundtrack",
"@LUA_MENU_MUSIC",
"@LUA_MENU_MUSIC_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = true
},
{
text = "@LUA_MENU_ENABLED",
value = false
},
}
)
createdivider(menu, "@MENU_GAME_BEGINNING")
LUI.Options.CreateOptionButton(
menu,
"intro",
"@LUA_MENU_INTRO",
"@LUA_MENU_INTRO_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = false
},
{
text = "@LUA_MENU_ENABLED",
value = true
},
}
)
LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton()
return menu
end
if not Engine.InFrontend() then
LUI.MenuTemplate.AddVignette = function(f36_arg0)
if not LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "advanced_video") then
local f36_local0 = CoD.CreateState(0, 0, 0, 0, CoD.AnchorTypes.All)
f36_local0.material = RegisterMaterial("h1_ui_bg_vignette")
local self = LUI.UIImage.new(f36_local0)
self:setupFullWindowElement()
f36_arg0:addElement(self)
end
end
LUI.MenuTemplate.InitInGameBkg = function(f38_arg0, f38_arg1, f38_arg2, f38_arg3)
LUI.MenuTemplate.AddDarken(f38_arg0, f38_arg1, f38_arg3, 0.55)
if not Engine.IsMultiplayer() and not LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "advanced_video") then
LUI.MenuTemplate.AddWorldBlur(f38_arg0, f38_arg1)
end
end
end

View File

@ -0,0 +1,207 @@
local function GetVolume()
return (Engine.GetProfileData("snd_volume") - SliderBounds.Volume.Min) / (SliderBounds.Volume.Max - SliderBounds.Volume.Min)
end
local function VolumeLess(a1)
LUI.Options.ProfileDataMenuOption(a1, SliderBounds.Volume.Min, SliderBounds.Volume.Max, -SliderBounds.Volume.Step, "snd_volume")
end
local function VolumeMore(a1)
LUI.Options.ProfileDataMenuOption(a1, SliderBounds.Volume.Min, SliderBounds.Volume.Max, SliderBounds.Volume.Step, "snd_volume")
end
local function dvarmenuoption(name, min, max, step)
Engine.SetDvarFloat(name, math.min(max, math.max(min, Engine.GetDvarFloat(name) + step)))
end
local function getvolumefunc(name)
return function()
return (Engine.GetDvarFloat(name) - SliderBounds.Volume.Min) / (SliderBounds.Volume.Max - SliderBounds.Volume.Min)
end
end
local function getvolumelessfunc(name)
return function()
dvarmenuoption(name, SliderBounds.Volume.Min, SliderBounds.Volume.Max, -SliderBounds.Volume.Step)
end
end
local function getvolumemorefunc(name)
return function()
dvarmenuoption(name, SliderBounds.Volume.Min, SliderBounds.Volume.Max, SliderBounds.Volume.Step)
end
end
LUI.PCAudio.new = function (a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_AUDIO_OPTIONS")),
menu_top_indent = Engine.IsMultiplayer() and 0 or LUI.MenuTemplate.spMenuOffset,
menu_width = GenericMenuDims.OptionMenuWidth
})
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Slider,
"@MENU_MASTER_VOLUME",
"@MENU_MASTER_VOLUME_DESC",
GetVolume,
VolumeLess,
VolumeMore
)
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Slider,
"@MENU_MUSIC_VOLUME",
"@MENU_MUSIC_VOLUME_DESC",
getvolumefunc("snd_musicVolume"),
getvolumelessfunc("snd_musicVolume"),
getvolumemorefunc("snd_musicVolume")
)
local speakeroptions = {
{
text = "@LUA_MENU_AUTODETECT_SPEAKERS",
value = 0
}
}
local speakerconfig = Engine.GetDvarInt("snd_detectedSpeakerConfig")
if speakerconfig > 1 then
speakeroptions[#speakeroptions + 1] = {
text = "@LUA_MENU_STEREO",
value = 2
}
speakeroptions[#speakeroptions + 1] = {
text = "@LUA_MENU_HEADPHONE",
value = 50
}
end
if speakerconfig > 2 then
speakeroptions[#speakeroptions + 1] = {
text = "@LUA_MENU_FOUR_SPEAKERS",
value = 4
}
end
if speakerconfig > 4 then
speakeroptions[#speakeroptions + 1] = {
text = "@LUA_MENU_FIVE_ONE_SPEAKERS",
value = 6
}
end
if speakerconfig > 6 then
speakeroptions[#speakeroptions + 1] = {
text = "@LUA_MENU_SEVEN_ONE_SPEAKERS",
value = 8
}
end
LUI.Options.CreateOptionButton(
menu,
"snd_speakerConfig",
"@LUA_MENU_SPEAKER_CONFIG",
"@LUA_MENU_SPEAKER_CONFIG_DESC",
speakeroptions
)
if Engine.IsMultiplayer() then
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Select,
"@LUA_MENU_MUSIC",
"@LUA_MENU_MUSIC_DESC",
LUI.Options.GetDvarEnableTextFunc("snd_musicDisabled", true),
LUI.Options.ToggleDvarFunc("snd_musicDisabled"),
LUI.Options.ToggleDvarFunc("snd_musicDisabled")
)
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Select,
"@LUA_MENU_ANNOUNCER",
"@LUA_MENU_ANNOUNCER_DESC",
LUI.Options.GetDvarEnableTextFunc("snd_announcerDisabled", true),
LUI.Options.ToggleDvarFunc("snd_announcerDisabled"),
LUI.Options.ToggleDvarFunc("snd_announcerDisabled")
)
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Select,
"@LUA_MENU_BATTLECHATTER",
"@LUA_MENU_BATTLECHATTER_DESC",
LUI.Options.GetDvarEnableTextFunc("snd_battleChatterDisabled", true),
LUI.Options.ToggleDvarFunc("snd_battleChatterDisabled"),
LUI.Options.ToggleDvarFunc("snd_battleChatterDisabled")
)
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Select,
"@LUA_MENU_PUSH_TO_TALK",
"@LUA_MENU_PUSH_TO_TALK_DESC",
LUI.Options.GetDvarEnableTextFunc("cl_pushToTalk", false),
LUI.Options.ToggleDvarFunc("cl_pushToTalk"),
LUI.Options.ToggleDvarFunc("cl_pushToTalk")
)
end
if not Engine.IsMultiplayer() and Engine.ShouldShowSubtitlesOption() then
LUI.Options.CreateControlProfileDataButton(
menu,
"subtitles",
"profile_toggleSubtitles",
nil,
"LUA_MENU_SUBTITLES",
"PLATFORM_UI_OPTIONS_SUBTITLES_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = false
},
{
text = "@LUA_MENU_ENABLED",
value = true
}
}
)
end
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Select,
"@LUA_MENU_HITSOUND",
"@LUA_MENU_HITSOUND_DESC",
LUI.Options.GetDvarEnableTextFunc("snd_hitsoundDisabled", true),
LUI.Options.ToggleDvarFunc("snd_hitsoundDisabled"),
LUI.Options.ToggleDvarFunc("snd_hitsoundDisabled")
)
if Engine.IsPC() and Engine.GetDvarBool("snd_wasapiSampleRateConverterNeeded") then
LUI.Options.AddButtonOptionVariant(
menu,
GenericButtonSettings.Variants.Select,
"@LUA_MENU_LOWQUALITYAUDIO",
"@LUA_MENU_LOWQUALITYAUDIO_DESC",
LUI.Options.GetDvarEnableTextFunc("snd_lowQualityAudio", false),
LUI.Options.ToggleDvarFunc("snd_lowQualityAudio"),
LUI.Options.ToggleDvarFunc("snd_lowQualityAudio")
)
end
LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton(function(a1, a2)
Engine.ExecNow("profile_menuDvarsFinish", a2.controller)
Engine.Exec("updategamerprofile")
LUI.FlowManager.RequestLeaveMenu(a1)
end)
return menu
end
LUI.MenuBuilder.m_types_build["pc_audio"] = LUI.PCAudio.new

View File

@ -0,0 +1,210 @@
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
LUI.addmenubutton("pc_controls", {
index = 4,
text = "@MENU_GENERAL",
description = Engine.Localize("@MENU_GENERAL_DESC"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "settings_menu")
end
})
LUI.MenuBuilder.m_types_build["settings_menu"] = function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = "@MENU_GENERAL",
menu_list_divider_top_offset = -(LUI.H1MenuTab.tabChangeHoldingElementHeight + H1MenuDims.spacing),
menu_width = GenericMenuDims.OptionMenuWidth
})
createdivider(menu, "@LUA_MENU_UPDATES")
LUI.Options.CreateOptionButton(
menu,
"cg_auto_update",
"@LUA_MENU_AUTO_UPDATE",
"@LUA_MENU_AUTO_UPDATE_DESC",
{
{
text = "@LUA_MENU_ENABLED",
value = true
},
{
text = "@LUA_MENU_DISABLED",
value = false
}
}
)
if (Engine.InFrontend()) then
menu:AddButton("@LUA_MENU_CHECK_UPDATES", function()
LUI.tryupdating(false)
end, nil, true, nil, {
desc_text = Engine.Localize("@LUA_MENU_CHECK_UPDATES_DESC")
})
end
createdivider(menu, "@LUA_MENU_DRAWING")
LUI.Options.CreateOptionButton(
menu,
"cg_drawFPS",
"@LUA_MENU_DRAW_FPS",
"@LUA_MENU_DRAW_FPS_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = 0
},
{
text = "@LUA_MENU_FPS_ONLY",
value = 1
},
{
text = "@LUA_MENU_FPS_AND_VIEWPOS",
value = 2
}
}
)
LUI.Options.CreateOptionButton(
menu,
"cg_drawSpeed",
"@LUA_MENU_DRAW_SPEED",
"@LUA_MENU_DRAW_SPEED_DESC",
{
{
text = "@LUA_MENU_ENABLED",
value = true
},
{
text = "@LUA_MENU_DISABLED",
value = false
}
}
)
LUI.Options.CreateOptionButton(
menu,
"cg_speedGraph",
"@LUA_MENU_DRAW_SPEEDGRAPH",
"@LUA_MENU_DRAW_SPEEDGRAPH_DESC",
{
{
text = "@LUA_MENU_ENABLED",
value = true
},
{
text = "@LUA_MENU_DISABLED",
value = false
}
}
)
createdivider(menu, "@LUA_MENU_RENDERING")
LUI.Options.CreateOptionButton(
menu,
"r_fullbright",
"@LUA_MENU_R_FULLBRIGHT",
"@LUA_MENU_R_FULLBRIGHT_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = 0
},
{
text = "@LUA_MENU_ENABLED",
value = 1
},
{
text = "@LUA_MENU_MODE2",
value = 2
},
{
text = "@LUA_MENU_MODE3",
value = 3
}
}
)
createdivider(menu, "@LUA_MENU_AUDIO_OPTIONS")
LUI.Options.CreateOptionButton(
menu,
"snd_musicDisabledForCustomSoundtrack",
"@LUA_MENU_MUSIC",
"@LUA_MENU_MUSIC_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = true
},
{
text = "@LUA_MENU_ENABLED",
value = false
},
}
)
createdivider(menu, "@MENU_GAME_BEGINNING")
LUI.Options.CreateOptionButton(
menu,
"intro",
"@LUA_MENU_INTRO",
"@LUA_MENU_INTRO_DESC",
{
{
text = "@LUA_MENU_DISABLED",
value = false
},
{
text = "@LUA_MENU_ENABLED",
value = true
},
}
)
LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton()
return menu
end
if not Engine.InFrontend() then
LUI.MenuTemplate.AddVignette = function(f36_arg0)
if not LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "advanced_video") then
local f36_local0 = CoD.CreateState(0, 0, 0, 0, CoD.AnchorTypes.All)
f36_local0.material = RegisterMaterial("h1_ui_bg_vignette")
local self = LUI.UIImage.new(f36_local0)
self:setupFullWindowElement()
f36_arg0:addElement(self)
end
end
LUI.MenuTemplate.InitInGameBkg = function(f38_arg0, f38_arg1, f38_arg2, f38_arg3)
LUI.MenuTemplate.AddDarken(f38_arg0, f38_arg1, f38_arg3, 0.55)
if not Engine.IsMultiplayer() and not LUI.FlowManager.IsMenuTopmost(Engine.GetLuiRoot(), "advanced_video") then
LUI.MenuTemplate.AddWorldBlur(f38_arg0, f38_arg1)
end
end
end

View File

@ -33,3 +33,4 @@ sna_h2_mod_common
sna_h2_mod_patch_af_caves sna_h2_mod_patch_af_caves
spa_h2_mod_common spa_h2_mod_common
tch_h2_mod_common tch_h2_mod_common
tur_h2_mod_common

View File

@ -1,2 +1,3 @@
techset,,2d
material,logo_h2mod material,logo_h2mod
localize,english localize,english

1 material techset,,2d logo_h2mod
1 techset,,2d
2 material material,logo_h2mod logo_h2mod
3 localize localize,english english

View File

@ -1,3 +1,5 @@
techset,,2d
material,h2_ui_featured_pip_focused material,h2_ui_featured_pip_focused
material,h1_ui_featured_pip_unfocused material,h1_ui_featured_pip_unfocused
material,h2_ui_btn_focused_stroke_square material,h2_ui_btn_focused_stroke_square
@ -19,3 +21,131 @@ material,featured_panel_thumbnail_6
material,featured_panel_thumbnail_7 material,featured_panel_thumbnail_7
material,featured_panel_thumbnail_8 material,featured_panel_thumbnail_8
material,motd_image material,motd_image
material,depot_button_rarity_corner_common
material,depot_button_rarity_corner_epic
material,depot_button_rarity_corner_legendary
material,depot_button_rarity_corner_rare
material,depot_button_rarity_corner_reward
material,depot_button_rarity_glow_common
material,depot_button_rarity_glow_epic
material,depot_button_rarity_glow_legendary
material,depot_button_rarity_glow_rare
material,depot_button_rarity_glow_reward
material,depot_button_rarity_strip_common
material,depot_button_rarity_strip_epic
material,depot_button_rarity_strip_legendary
material,depot_button_rarity_strip_rare
material,depot_button_rarity_strip_reward
material,trophy_border
material,trophy_0
material,trophy_1
material,trophy_2
material,trophy_3
material,trophy_4
material,trophy_5
material,trophy_6
material,trophy_7
material,trophy_8
material,trophy_9
material,trophy_10
material,trophy_11
material,trophy_12
material,trophy_13
material,trophy_14
material,trophy_15
material,trophy_16
material,trophy_17
material,trophy_18
material,trophy_19
material,trophy_20
material,trophy_21
material,trophy_22
material,trophy_23
material,trophy_24
material,trophy_25
material,trophy_26
material,trophy_27
material,trophy_28
material,trophy_29
material,trophy_30
material,trophy_31
material,trophy_32
material,trophy_33
material,trophy_34
material,trophy_35
material,trophy_36
material,trophy_37
material,trophy_38
material,trophy_39
material,trophy_40
material,trophy_41
material,trophy_42
material,trophy_43
material,trophy_44
material,trophy_45
material,trophy_46
material,trophy_47
material,trophy_48
material,trophy_49
material,trophy_50
material,trophy_51
material,trophy_52
material,achievement_bg_0
material,achievement_bg_1
material,achievement_bg_2
material,achievement_bg_3
material,achievement_bg_4
material,achievement_bg_5
material,achievement_bg_6
material,achievement_bg_7
material,achievement_bg_8
material,achievement_bg_9
material,achievement_bg_10
material,achievement_bg_11
material,achievement_bg_12
material,achievement_bg_13
material,achievement_bg_14
material,achievement_bg_15
material,achievement_bg_16
material,achievement_bg_17
material,achievement_bg_18
material,achievement_bg_19
material,achievement_bg_20
material,achievement_bg_21
material,achievement_bg_22
material,achievement_bg_23
material,achievement_bg_24
material,achievement_bg_25
material,achievement_bg_26
material,achievement_bg_27
material,achievement_bg_28
material,achievement_bg_29
material,achievement_bg_30
material,achievement_bg_31
material,achievement_bg_32
material,achievement_bg_33
material,achievement_bg_34
material,achievement_bg_35
material,achievement_bg_36
material,achievement_bg_37
material,achievement_bg_38
material,achievement_bg_39
material,achievement_bg_40
material,achievement_bg_41
material,achievement_bg_42
material,achievement_bg_43
material,achievement_bg_44
material,achievement_bg_45
material,achievement_bg_46
material,achievement_bg_47
material,achievement_bg_48
material,achievement_bg_49
material,achievement_bg_50
material,achievement_bg_51
material,achievement_bg_52
localize,english
sound,ui_achievement_unlocked

1 material techset,,2d h2_ui_featured_pip_focused
1 techset,,2d
2 material,h2_ui_featured_pip_focused
3 material material,h1_ui_featured_pip_unfocused h2_ui_featured_pip_focused
4 material material,h2_ui_btn_focused_stroke_square h1_ui_featured_pip_unfocused
5 material material,h1_prestige_leftright_arrow h2_ui_btn_focused_stroke_square
21 material material,featured_panel_thumbnail_8 featured_panel_thumbnail_7
22 material material,motd_image featured_panel_thumbnail_8
23 material material,depot_button_rarity_corner_common motd_image
24 material,depot_button_rarity_corner_epic
25 material,depot_button_rarity_corner_legendary
26 material,depot_button_rarity_corner_rare
27 material,depot_button_rarity_corner_reward
28 material,depot_button_rarity_glow_common
29 material,depot_button_rarity_glow_epic
30 material,depot_button_rarity_glow_legendary
31 material,depot_button_rarity_glow_rare
32 material,depot_button_rarity_glow_reward
33 material,depot_button_rarity_strip_common
34 material,depot_button_rarity_strip_epic
35 material,depot_button_rarity_strip_legendary
36 material,depot_button_rarity_strip_rare
37 material,depot_button_rarity_strip_reward
38 material,trophy_border
39 material,trophy_0
40 material,trophy_1
41 material,trophy_2
42 material,trophy_3
43 material,trophy_4
44 material,trophy_5
45 material,trophy_6
46 material,trophy_7
47 material,trophy_8
48 material,trophy_9
49 material,trophy_10
50 material,trophy_11
51 material,trophy_12
52 material,trophy_13
53 material,trophy_14
54 material,trophy_15
55 material,trophy_16
56 material,trophy_17
57 material,trophy_18
58 material,trophy_19
59 material,trophy_20
60 material,trophy_21
61 material,trophy_22
62 material,trophy_23
63 material,trophy_24
64 material,trophy_25
65 material,trophy_26
66 material,trophy_27
67 material,trophy_28
68 material,trophy_29
69 material,trophy_30
70 material,trophy_31
71 material,trophy_32
72 material,trophy_33
73 material,trophy_34
74 material,trophy_35
75 material,trophy_36
76 material,trophy_37
77 material,trophy_38
78 material,trophy_39
79 material,trophy_40
80 material,trophy_41
81 material,trophy_42
82 material,trophy_43
83 material,trophy_44
84 material,trophy_45
85 material,trophy_46
86 material,trophy_47
87 material,trophy_48
88 material,trophy_49
89 material,trophy_50
90 material,trophy_51
91 material,trophy_52
92 material,achievement_bg_0
93 material,achievement_bg_1
94 material,achievement_bg_2
95 material,achievement_bg_3
96 material,achievement_bg_4
97 material,achievement_bg_5
98 material,achievement_bg_6
99 material,achievement_bg_7
100 material,achievement_bg_8
101 material,achievement_bg_9
102 material,achievement_bg_10
103 material,achievement_bg_11
104 material,achievement_bg_12
105 material,achievement_bg_13
106 material,achievement_bg_14
107 material,achievement_bg_15
108 material,achievement_bg_16
109 material,achievement_bg_17
110 material,achievement_bg_18
111 material,achievement_bg_19
112 material,achievement_bg_20
113 material,achievement_bg_21
114 material,achievement_bg_22
115 material,achievement_bg_23
116 material,achievement_bg_24
117 material,achievement_bg_25
118 material,achievement_bg_26
119 material,achievement_bg_27
120 material,achievement_bg_28
121 material,achievement_bg_29
122 material,achievement_bg_30
123 material,achievement_bg_31
124 material,achievement_bg_32
125 material,achievement_bg_33
126 material,achievement_bg_34
127 material,achievement_bg_35
128 material,achievement_bg_36
129 material,achievement_bg_37
130 material,achievement_bg_38
131 material,achievement_bg_39
132 material,achievement_bg_40
133 material,achievement_bg_41
134 material,achievement_bg_42
135 material,achievement_bg_43
136 material,achievement_bg_44
137 material,achievement_bg_45
138 material,achievement_bg_46
139 material,achievement_bg_47
140 material,achievement_bg_48
141 material,achievement_bg_49
142 material,achievement_bg_50
143 material,achievement_bg_51
144 material,achievement_bg_52
145 localize,english
146 sound,ui_achievement_unlocked
147
148
149
150
151

View File

@ -0,0 +1,2 @@
localize,turkish
stringtable,video/subtitles.csv
1 localize turkish
2 stringtable video/subtitles.csv

View File

@ -9,3 +9,4 @@ russian,h2_mod_font_bank,h2_mod_font_default,h2_mod_font_default_bold
russian_partial,h2_mod_font_bank,h2_mod_font_default,h2_mod_font_default_bold russian_partial,h2_mod_font_bank,h2_mod_font_default,h2_mod_font_default_bold
simplified_chinese,h2_mod_font_default,h2_mod_font_default_bold simplified_chinese,h2_mod_font_default,h2_mod_font_default_bold
traditional_chinese,h2_mod_font_default,h2_mod_font_default_bold traditional_chinese,h2_mod_font_default,h2_mod_font_default_bold
turkish,h2_mod_font_bank,h2_mod_font_default,h2_mod_font_default_bold

1 *,h2_mod_font_mix
9 russian_partial,h2_mod_font_bank,h2_mod_font_default,h2_mod_font_default_bold
10 simplified_chinese,h2_mod_font_default,h2_mod_font_default_bold
11 traditional_chinese,h2_mod_font_default,h2_mod_font_default_bold
12 turkish,h2_mod_font_bank,h2_mod_font_default,h2_mod_font_default_bold

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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