Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 153 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ on:
types: [opened, reopened, synchronize]
release:
types: [published]
workflow_dispatch:

jobs:
windows:
name: 'Windows'
runs-on: windows-2019
runs-on: windows-2025

env:
solution: 'msvc/metamod.sln'
Expand All @@ -28,21 +29,103 @@ jobs:
with:
fetch-depth: 0

# TODO: add support of 141_xp toolchain at VS2022+
# - name: Install v140, v141 and v142 toolsets
# shell: cmd
# run: |
# "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe" modify ^
# --installPath "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" ^
# --add Microsoft.VisualStudio.Component.WindowsXP ^
# --add Microsoft.VisualStudio.Component.VC.v140 ^
# --add Microsoft.VisualStudio.Component.VC.v140.x86.x64 ^
# --add Microsoft.VisualStudio.Component.VC.v140.xp ^
# --add Microsoft.VisualStudio.Component.VC.140.CRT ^
# --add Microsoft.VisualStudio.Component.VC.v141 ^
# --add Microsoft.VisualStudio.Component.VC.v141.x86.x64 ^
# --add Microsoft.VisualStudio.Component.VC.v141.xp ^
# --add Microsoft.VisualStudio.Component.VC.v142 ^
# --add Microsoft.VisualStudio.Component.VC.v142.x86.x64 ^
# --quiet --norestart

- name: Select PlatformToolset
id: select_toolset
shell: pwsh
run: |
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$vs2019 = & $vswhere -products * -version "[16.0,17.0)" -property installationPath -latest
$vs2022 = & $vswhere -products * -version "[17.0,)" -property installationPath -latest

if ($vs2019) {
"toolset=v142" >> $env:GITHUB_OUTPUT
Write-Host "Selected v142"
} elseif ($vs2022) {
"toolset=v143" >> $env:GITHUB_OUTPUT
Write-Host "Selected v143 toolset"
} else {
Write-Error "No suitable Visual Studio installation found"
exit 1
}

- name: Setup MSBuild
uses: microsoft/setup-msbuild@v2

- name: Build
run: |
msbuild ${{ env.solution }} -p:Configuration="${{ env.buildRelease }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=v142
$toolset = '${{ steps.select_toolset.outputs.toolset }}'
msbuild ${{ env.solution }} -p:Configuration="${{ env.buildRelease }}" /t:Clean,Build /p:Platform=${{ env.buildPlatform }} /p:PlatformToolset=$toolset /p:XPDeprecationWarning=false

- name: Get app version
id: get_version
shell: pwsh
run: |
$versionFile = "metamod/version/appversion.h"
if (-not (Test-Path $versionFile)) {
Write-Error "Version file not found: $versionFile"
exit 1
}

$content = Get-Content $versionFile
foreach ($line in $content) {
if ($line -match '^\s*#define\s+APP_VERSION\s+"([^"]+)"') {
$version = $matches[1]
"version=$version" >> $env:GITHUB_OUTPUT
Write-Host "Found version: $version"
exit 0
}
}
Write-Error "APP_VERSION not found in file"
exit 1

- name: Show version
run: echo "Version is ${{ steps.get_version.outputs.version }}"
- name: Get rcedit from chocolatey
shell: pwsh
run: |
choco install rcedit -y

- name: Move files
run: |
mkdir publish\debug
mkdir publish\addons\metamod

move msvc\${{ env.buildRelease }}\metamod.dll publish\addons\metamod\metamod.dll
move msvc\${{ env.buildRelease }}\metamod.pdb publish\debug\metamod.pdb

- name: Edit resources at windows binaries
run: |
rcedit ${{ github.workspace }}\publish\addons\metamod\metamod.dll --set-version-string ProductName "Metamod-R" --set-file-version "${{ steps.get_version.outputs.version }}" --set-product-version "${{ steps.get_version.outputs.version }}" --set-version-string FileDescription "Metamod-R is fully reworked fork of original Metamod-p by Jussi Kivilinna. Metamod allows running multiple mod-like plugin DLLs, to add functionality or change the behavior of the running HLDS game mod., Commit: $env:GITHUB_SHA" --set-version-string "Comments" "Commit: $env:GITHUB_SHA" --set-version-string CompanyName "ReHLDS Dev Team" --set-version-string LegalCopyright "Copyright 2025 ReHLDS DevTeam"
shell: "pwsh"

- name: Import PFX and sign
if: github.event_name != 'pull_request'
env:
KEY_PFX_PASS: ${{ secrets.KEY_PFX_PASS }}
run: |
$pfxBase64 = "${{ secrets.KEY_PFX_B64 }}"
[IO.File]::WriteAllBytes("${{ github.workspace }}\signing-cert.pfx", [Convert]::FromBase64String($pfxBase64))
certutil -f -p "${{ secrets.KEY_PFX_PASS }}" -importPFX "${{ github.workspace }}\signing-cert.pfx"
& 'C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\signtool.exe' sign /a /f "${{ github.workspace }}\signing-cert.pfx" /p $env:KEY_PFX_PASS /d "Metamod-R" /du "https://rehlds.dev/" /tr "http://timestamp.digicert.com" /td sha256 /fd sha256 /v ${{ github.workspace }}\publish\addons\metamod\metamod.dll
Remove-Item -Recurse -Force "${{ github.workspace }}\signing-cert.pfx"
shell: "pwsh"
- name: Deploy artifacts
uses: actions/upload-artifact@v4
with:
Expand Down Expand Up @@ -71,6 +154,50 @@ jobs:
git cmake rsync \
g++ gcc


- name: GPG Import
run: |
echo "${{ secrets.PUB_ASC }}" > "${{ secrets.PUB_ASC_FILE }}"
echo "${{ secrets.KEY_ASC }}" > "${{ secrets.KEY_ASC_FILE }}"

# Import the public key
gpg --batch --yes --import "${{ secrets.PUB_ASC_FILE }}"
if [[ $? -ne 0 ]]; then
echo "Error: Failed to import the public key"
exit 1
fi

# Import the private key
gpg --batch --yes --import "${{ secrets.KEY_ASC_FILE }}"
if [[ $? -ne 0 ]]; then
echo "Error: Failed to import the private key"
exit 2
fi

# Extract the fingerprint of the imported public key
GPG_LINUX_FINGERPRINT=$(gpg --list-keys --with-colons | grep '^fpr' | head -n 1 | cut -d: -f10)

# Check if the fingerprint was extracted
if [[ -z "$GPG_LINUX_FINGERPRINT" ]]; then
echo "Error: Failed to extract the fingerprint of the key"
exit 3
fi

# Set the trust level for the key
echo "$GPG_LINUX_FINGERPRINT:6:" | gpg --batch --import-ownertrust
if [ $? -ne 0 ]; then
echo "Error: Failed to set trust for the key $GPG_LINUX_FINGERPRINT"
exit 4
fi

echo "Key $GPG_LINUX_FINGERPRINT successfully imported and trusted"
gpg --list-keys

#export for global use
echo "GPG_LINUX_FINGERPRINT=$GPG_LINUX_FINGERPRINT" >> $GITHUB_ENV
shell: bash
if: github.event_name != 'pull_request'

- name: Build using Intel GCC Compiler
run: |
rm -rf build && cmake -DCMAKE_BUILD_TYPE=COMPAT_GLIBC -B build && cmake --build build -j8
Expand All @@ -89,6 +216,7 @@ jobs:
--include=plinfo.h \
--exclude='*' metamod/src/ publish/sdk
rsync metamod/extra/config.ini publish/addons/metamod
rsync metamod/extra/plugins.ini publish/addons/metamod
rsync -a metamod/extra/example/ publish/example_plugin
rsync -a publish/sdk/ publish/example_plugin/include/metamod

Expand Down Expand Up @@ -152,7 +280,29 @@ jobs:
github.event.action == 'published' &&
startsWith(github.ref, 'refs/tags/')
run: |

# new runner, niw signs
echo "${{ secrets.PUB_ASC }}" > "${{ secrets.PUB_ASC_FILE }}"
echo "${{ secrets.KEY_ASC }}" > "${{ secrets.KEY_ASC_FILE }}"
gpg --batch --yes --import "${{ secrets.PUB_ASC_FILE }}"
gpg --batch --yes --import "${{ secrets.KEY_ASC_FILE }}"
GPG_LINUX_FINGERPRINT=$(gpg --list-keys --with-colons | grep '^fpr' | head -n 1 | cut -d: -f10)
echo "$GPG_LINUX_FINGERPRINT:6:" | gpg --batch --import-ownertrust
echo "GPG_LINUX_FINGERPRINT=$GPG_LINUX_FINGERPRINT" >> $GITHUB_ENV

sign_file() {
local file=$1
gpg --batch --yes --detach-sign --armor -u "$GPG_LINUX_FINGERPRINT" "$file"
if [ $? -ne 0 ]; then
echo "Error: Failed to sign $file"
exit 2
fi
echo "$file signed successfully."
}

# Pack and sign final archive
7z a -tzip metamod-bin-${{ env.APP_VERSION }}.zip addons/ example_plugin/ sdk/
sign_file "metamod-bin-${{ env.APP_VERSION }}.zip"

- name: Publish artifacts
uses: softprops/action-gh-release@v2
Expand Down
8 changes: 8 additions & 0 deletions metamod/extra/plugins.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Default location: $gamedir/addons/metamod/plugins.ini, ie "cstrike/addons/metamod/plugins.ini".
# Plugins are described in a file "plugins.ini" and each line describes a plugin to load:
#
# <platform> <filepath> [<description>]
# Fields are whitespace delimited (tabs/spaces).
#
# linux path/to/plugin.so
# win32 path/to/plugin.dll
33 changes: 26 additions & 7 deletions metamod/msvc/PreBuild.bat
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,32 @@ set commitURL=
set commitCount=0
set branch_name=master

for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find "."') do set "dt=%%a"
set "YYYY=%dt:~0,4%"
set "MM=%dt:~4,2%"
set "DD=%dt:~6,2%"
set "hour=%dt:~8,2%"
set "min=%dt:~10,2%"
set "sec=%dt:~12,2%"
for /f "tokens=*" %%i in ('powershell -NoProfile -Command ^
"$now = Get-Date; Write-Output ('{0:yyyy}|{0:MM}|{0:dd}|{0:HH}|{0:mm}|{0:ss}' -f $now)"') do (
for /f "tokens=1-6 delims=|" %%a in ("%%i") do (
set "YYYY=%%a"
set "MM=%%b"
set "DD=%%c"
set "hour=%%d"
set "min=%%e"
set "sec=%%f"
)
)

echo YYYY=%YYYY%
echo MM=%MM%
echo DD=%DD%
echo hour=%hour%
echo min=%min%
echo sec=%sec%

:: for /f "delims=" %%a in ('wmic OS Get localdatetime ^| find "."') do set "dt=%%a"
:: set "YYYY=%dt:~0,4%"
:: set "MM=%dt:~4,2%"
:: set "DD=%dt:~6,2%"
:: set "hour=%dt:~8,2%"
:: set "min=%dt:~10,2%"
:: set "sec=%dt:~12,2%"

::
:: Remove leading zero from MM (e.g 09 > 9)
Expand Down
3 changes: 2 additions & 1 deletion metamod/msvc/metamod.vcxproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
Expand Down Expand Up @@ -214,6 +214,7 @@
</ItemGroup>
<ItemGroup>
<None Include="..\extra\config.ini" />
<None Include="..\extra\plugins.ini" />
<None Include="metamod.def" />
</ItemGroup>
<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion metamod/src/metamod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void metamod_startup()
Q_snprintf(execFile, sizeof execFile, "%s/%s", g_config->directory(), EXEC_CFG);

META_CONS(" ");
META_CONS(" Metamod-r version %s Copyright (c) 2016-2018 ReHLDS Team (rebuild of original Metamod by Will Day and Jussi Kivilinna)", APP_VERSION);
META_CONS(" Metamod-r version %s Copyright (c) 2016-2025 ReHLDS Team (rebuild of original Metamod by Will Day and Jussi Kivilinna)", APP_VERSION);
META_CONS(" Metamod-r comes with ABSOLUTELY NO WARRANTY; for details type `meta gpl'.");
META_CONS(" This is free software, and you are welcome to redistribute it");
META_CONS(" under certain conditions; type `meta gpl' for details.");
Expand Down