diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..569c208 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +testing.ini +3rd-party-bin diff --git a/PublicationContent/description.txt b/PublicationContent/description.txt new file mode 100644 index 0000000..9fb72ab --- /dev/null +++ b/PublicationContent/description.txt @@ -0,0 +1,20 @@ +[img]https://raw.githubusercontent.com/GenZmeY/KF2-TAWOD/master/PublicationContent/mutbanner.png[/img] + +[h1]Description:[/h1] +[i]A small mutator that forces players to throw all their weapons on death (not just the current weapon as in the game by default). [/i] + +[h1]The mutator is not whitelisted![/h1] +You will not gain experience for playing with this mutator. + +[h1]Usage (server):[/h1] +[b]Note:[/b] If you don't understand what is written here, read the article [url=https://wiki.killingfloor2.com/index.php?title=Dedicated_Server_(Killing_Floor_2)][u]Dedicated Server (KF2 wiki)[/u][/url] before following these instructions. + +1. Open your PCServer-KFEngine.ini / LinuxServer-KFEngine.ini; +2. Add the following string to the [OnlineSubsystemSteamworks.KFWorkshopSteamworks] section: +[code]ServerSubscribedWorkshopItems=2379769040[/code] +3. Start the server and wait while the mutator is downloading; +4. Add the following line to the startup parameters and restart the server: +[code]?Mutator=TAWOD.TAWODMut[/code] + +[h1]Sources:[/h1] +[url=https://github.com/GenZmeY/KF2-TAWOD][u]Github[/u][/url] (GNU GPLv3) diff --git a/PublicationContent/mutbanner.png b/PublicationContent/mutbanner.png new file mode 100644 index 0000000..873dead Binary files /dev/null and b/PublicationContent/mutbanner.png differ diff --git a/PublicationContent/preview.png b/PublicationContent/preview.png new file mode 100644 index 0000000..d44a65f Binary files /dev/null and b/PublicationContent/preview.png differ diff --git a/PublicationContent/socialpreview.png b/PublicationContent/socialpreview.png new file mode 100644 index 0000000..fc0aaff Binary files /dev/null and b/PublicationContent/socialpreview.png differ diff --git a/PublicationContent/tags.txt b/PublicationContent/tags.txt new file mode 100644 index 0000000..80d4cf5 --- /dev/null +++ b/PublicationContent/tags.txt @@ -0,0 +1 @@ +Mutators \ No newline at end of file diff --git a/PublicationContent/title.txt b/PublicationContent/title.txt new file mode 100644 index 0000000..2b588fd --- /dev/null +++ b/PublicationContent/title.txt @@ -0,0 +1 @@ +Throw All Weapons On Dead (TAWOD) \ No newline at end of file diff --git a/README.md b/README.md index 1d9b8c5..92f4040 100644 --- a/README.md +++ b/README.md @@ -1 +1,45 @@ -# Throw All Weapons On Death Mutator +# Throw All Weapons On Death + +[![](PublicationContent/mutbanner.png)](https://steamcommunity.com/sharedfiles/filedetails/?id=2379769040) + +[![GitHub](https://img.shields.io/github/license/GenZmeY/KF2-TAWOD)](https://www.gnu.org/licenses/gpl-3.0.en.html) +[![Steam Workshop](https://img.shields.io/badge/steam-workshop-0)](https://steamcommunity.com/sharedfiles/filedetails/?id=2379769040) +[![Steam Subscriptions](https://img.shields.io/steam/subscriptions/2379769040)](https://steamcommunity.com/sharedfiles/filedetails/?id=2379769040) +[![Steam Favorites](https://img.shields.io/steam/favorites/2379769040)](https://steamcommunity.com/sharedfiles/filedetails/?id=2379769040) +[![Steam Update Date](https://img.shields.io/steam/update-date/2379769040)](https://steamcommunity.com/sharedfiles/filedetails/?id=2379769040) +[![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/GenZmeY/KF2-TAWOD)](https://github.com/GenZmeY/KF2-TAWOD/tags) + +*** + +A small mutator that forces players to throw all their weapons on death (not just the current weapon as in the game by default). + +*** + +# Build +1. Install [Killing Floor 2](https://store.steampowered.com/app/232090/Killing_Floor_2/), Killing Floor 2 - SDK and [git for windows](https://git-scm.com/download/win); +2. Open git-bash, clone this repository and go to the source folder: `git clone https://github.com/GenZmeY/KF2-TAWOD && cd KF2-TAWOD` +3. Run make.sh script: +`./make.sh --compile` +4. The compiled files will be here: +`C:\Users\\Documents\My Games\KillingFloor2\KFGame\Unpublished\BrewedPC\Script\` + +# Testing +You can check your build using the `make.sh` script. +Open git-bash in the source folder and run the script: +`./make.sh --test` +On first launch, the script will create `testing.ini` file and launch the game with the settings from it (KF-Outpost map + TAWODMut). Edit this file if you need to test the mutator with different parameters. + +# Usage (Server) +1. Open your PCServer-KFEngine.ini / LinuxServer-KFEngine.ini; +2. Add the following string to the [OnlineSubsystemSteamworks.KFWorkshopSteamworks] section: +`ServerSubscribedWorkshopItems=2379769040` +3. Start the server and wait while the mutator is downloading; +4. Add the following line to the startup parameters and restart the server: +`?Mutator=TAWOD.TAWODMut` + +# Bug reports +If you find a bug, create new issue here: [Issues](https://github.com/GenZmeY/KF2-TAWOD/issues) +Describe what the bug looks like and how to reproduce it. + +# License +The mutator is licensed under the [GNU GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html). diff --git a/TAWOD/Classes/TAWOD.upkg b/TAWOD/Classes/TAWOD.upkg new file mode 100644 index 0000000..29cb156 --- /dev/null +++ b/TAWOD/Classes/TAWOD.upkg @@ -0,0 +1,4 @@ +[Flags] +AllowDownload=True +ClientOptional=False +ServerSideOnly=False diff --git a/TAWOD/Classes/TAWODMut.uc b/TAWOD/Classes/TAWODMut.uc new file mode 100644 index 0000000..13ffade --- /dev/null +++ b/TAWOD/Classes/TAWODMut.uc @@ -0,0 +1,33 @@ +Class TAWODMut extends KFMutator; + +simulated event PostBeginPlay() +{ + super.PostBeginPlay(); + + if (WorldInfo.Game.BaseMutator == None) + WorldInfo.Game.BaseMutator = Self; + else + WorldInfo.Game.BaseMutator.AddMutator(Self); + + if (bDeleteMe) + return; + + WorldInfo.Game.DefaultPawnClass = class'TAWODPawn_Human'; + + `Log("[TAWOD] Loaded mutator."); +} + +function AddMutator(Mutator Mut) +{ + if (Mut == Self) + return; + + if (Mut.Class == Class) + Mut.Destroy(); + else + Super.AddMutator(Mut); +} + +defaultproperties +{ +} diff --git a/TAWOD/Classes/TAWODPawn_Human.uc b/TAWOD/Classes/TAWODPawn_Human.uc new file mode 100644 index 0000000..aff78b4 --- /dev/null +++ b/TAWOD/Classes/TAWODPawn_Human.uc @@ -0,0 +1,28 @@ +class TAWODPawn_Human extends KFPawn_Human; + +function ThrowActiveWeapon( optional bool bDestroyWeap ) +{ + local KFWeapon TempWeapon; + + if( Role < ROLE_Authority ) + { + return; + } + + if (Health <= 0) + { + if (InvManager != none) + foreach InvManager.InventoryActors(class'KFWeapon', TempWeapon) + if (TempWeapon.bDropOnDeath && TempWeapon.CanThrow()) + if (TempWeapon != none) + TossInventory(TempWeapon); + } + else + { + super.ThrowActiveWeapon( bDestroyWeap ); + } +} + +defaultproperties +{ +} diff --git a/make.sh b/make.sh new file mode 100644 index 0000000..8a5d751 --- /dev/null +++ b/make.sh @@ -0,0 +1,220 @@ +#!/bin/bash + +# Requirements: git-bash +# https://git-scm.com/download/win + +set -Eeuo pipefail +trap cleanup SIGINT SIGTERM ERR EXIT + +function winpath2unix () # $1: win path +{ + echo "$*" | \ + sed -r 's|^(.):|\\\1|' | \ + sed 's|\\|/|g' +} + +function unixpath2win () # $1: unix path +{ + echo "$*" | \ + sed -r 's|^/(.)|\1:|' | \ + sed 's|/|\\|g' +} + +function reg_readkey () # $1: path, $2: key +{ + winpath2unix $( + reg query "$1" //v "$2" | \ + grep -F "$2" | \ + awk '{ $1=$2=""; print $0 }' ) +} + +function show_help () +{ + echo "$ScriptName" + echo "Usage:" + echo "${ScriptName} OPTION" + echo "Options:" + echo " -c, --compile" + echo " -b, --brew" + echo " -bu, --brew-unpublished" + echo " -u, --upload" + echo " -t, --test" + echo " -h, --help" +} + +function cleanup() +{ + trap - SIGINT SIGTERM ERR EXIT + restore_kfeditorconf +} + +function get_latest_multini () +{ + local ApiUrl="https://api.github.com/repos/GenZmeY/multini/releases/latest" + local LatestTag=$(curl --silent "$ApiUrl" | grep -Po '"tag_name": "\K.*?(?=")') + local DownloadUrl="https://github.com/GenZmeY/multini/releases/download/$LatestTag/multini-windows-amd64.exe" + + mkdir -p "$ThirdPartyBin" + curl -LJs "$DownloadUrl" -o "$ThirdPartyBin/multini.exe" +} + +function backup_kfeditorconf () +{ + cp "$KFEditorConf" "$KFEditorConfBackup" +} + +function restore_kfeditorconf () +{ + if [[ -f "$KFEditorConfBackup" ]]; then + mv -f "$KFEditorConfBackup" "$KFEditorConf" + fi +} + +function setup_modpackages () +{ + multini --set "$KFEditorConf" 'ModPackages' 'ModPackages' 'TAWOD' + multini --set "$KFEditorConf" 'ModPackages' 'ModPackagesInPath' "$(unixpath2win "$MutSource")" +} + +function compiled () +{ + test -f "$MutStructScript/TAWOD.u" +} + +function compile () +{ + if ! command -v multini &> /dev/null; then + get_latest_multini + fi + + backup_kfeditorconf && setup_modpackages + + rm -rf "$MutUnpublish" + mkdir -p \ + "$MutUnpublish" \ + "$MutStructScript" + + CMD //C "$(unixpath2win "$KFEditor")" make -useunpublished & + local PID="$!" + while ps -p "$PID" &> /dev/null + do + if compiled; then + kill "$PID"; break + fi + sleep 2 + done + + restore_kfeditorconf + + if ! compiled; then + echo "Compilation failed" + return 1 + fi +} + +function brew () +{ + echo "brew command is broken. Use --brew-unpublished or brew from WorkshopUploadToolGUI instead of this." + # CMD //C "$(unixpath2win "$KFEditor")" brewcontent -platform=PC ServerExt ServerExtMut -useunpublished +} + +function brew_unpublished () +{ + rm -rf "$MutPublish" + if ! compiled; then + compile + fi + cp -rf "$MutUnpublish" "$MutPublish" +} + +function generate_wsinfo () # $1: package dir +{ + local Description=$(cat "$MutPubContent/description.txt") + local Title=$(cat "$MutPubContent/title.txt") + local Preview=$(unixpath2win "$MutPubContent/preview.png") + local Tags=$(cat "$MutPubContent/tags.txt") + local PackageDir=$(unixpath2win "$1") + echo "\$Description \"$Description\" +\$Title \"$Title\" +\$PreviewFile \"$Preview\" +\$Tags \"$Tags\" +\$MicroTxItem \"false\" +\$PackageDirectory \"$PackageDir\" +" > "$MutWsInfo" +} + +function upload () +{ + PackageDir=$(mktemp -d -u -p "$KFDoc") + cp -rf "$MutPublish"/* "$PackageDir" + generate_wsinfo "$PackageDir" + CMD //C "$(unixpath2win "$KFWorkshop")" "$MutWsInfoName" + rm -rf "$PackageDir" + rm -f "$MutWsInfo" +} + +function create_default_testing_ini () +{ +echo "Map=\"KF-Outpost\" +Game=\"KFGameContent.KFGameInfo_Survival\" +Difficulty=\"0\" +GameLength=\"0\" +Mutators=\"TAWOD.TAWODMut\" +Args=\"\"" > "$MutTestingIni" +} + +function game_test () +{ + if ! [[ -r "$MutTestingIni" ]]; then + create_default_testing_ini + fi + source "$MutTestingIni" + CMD //C "$(unixpath2win "$KFGame")" ${Map}?Difficulty=${Difficulty}?GameLength=${GameLength}?Game=${Game}?Mutator=${Mutators}?${Args} -useunpublished -log +} + +ScriptFullname=$(readlink -e "$0") +ScriptName=$(basename "$0") +ScriptDir=$(dirname "$ScriptFullname") + +SteamPath=$(reg_readkey "HKCU\Software\Valve\Steam" "SteamPath") +DocumentsPath=$(reg_readkey "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Personal") + +KFPath="$SteamPath/steamapps/common/killingfloor2" +KFBin="$KFPath/Binaries" +KFEditor="$KFBin/Win64/KFEditor.exe" +KFGame="$KFBin/Win64/KFGame.exe" +KFWorkshop="$KFBin/WorkshopUserTool.exe" + +KFDoc="$DocumentsPath/My Games/KillingFloor2" +KFConfig="$KFDoc/KFGame/Config" + +KFEditorConf="$KFConfig/KFEditor.ini" +KFEditorConfBackup="${KFEditorConf}.backup" + +MutSource="$ScriptDir" +MutPubContent="$MutSource/PublicationContent" +MutUnpublish="$KFDoc/KFGame/Unpublished" +MutPublish="$KFDoc/KFGame/Published" + +MutStructScript="$MutUnpublish/BrewedPC/Script" +MutStructPackages="$MutUnpublish/BrewedPC/Packages" +MutStructLocalization="$MutUnpublish/BrewedPC/Localization" + +MutTestingIni="$MutSource/testing.ini" +MutWsInfoName="wsinfo_serverext.txt" +MutWsInfo="$KFDoc/$MutWsInfoName" + +ThirdPartyBin="$MutSource/3rd-party-bin" + +export PATH="$PATH:$ThirdPartyBin" + +if [[ $# -eq 0 ]]; then show_help; exit 0; fi +case $1 in + -h|--help ) show_help ; ;; + -c|--compile ) compile ; ;; + -b|--brew ) brew ; ;; + -bu|--brew-unpublished ) brew_unpublished ; ;; + -u|--upload ) upload ; ;; + -t|--test ) game_test ; ;; + * ) echo "Command not recognized: $1"; exit 1;; +esac