From 74eb2013dfa0e13c54f151f98f344e29629c16c3 Mon Sep 17 00:00:00 2001
From: ampreeT <61920833+ampreeT@users.noreply.github.com>
Date: Tue, 2 Jul 2024 16:50:20 -0700
Subject: [PATCH 1/9] README update + windows install script
---
README.md | 293 +++++++++++++++++++-----
scripts/srccoop-bms-windows-install.ps1 | 35 +++
2 files changed, 265 insertions(+), 63 deletions(-)
create mode 100644 scripts/srccoop-bms-windows-install.ps1
diff --git a/README.md b/README.md
index b76c53e..80eb7a2 100644
--- a/README.md
+++ b/README.md
@@ -1,72 +1,239 @@
+
+
+
+
+---
+
[![CI](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml/badge.svg)](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml)
[![GitHub Release](https://img.shields.io/github/v/release/ampreeT/SourceCoop?style=flat&label=Release&labelColor=%232C3137&color=%23EB551B)](https://github.com/ampreeT/SourceCoop/releases/latest)
[![Discord](https://img.shields.io/discord/973591793117564988.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/Fh77rxQaEB)
-# SourceCoop
-
-SourceCoop is a cooperative mod for multi-player Source Engine games, that
-- Enables players to play together on single-player campaigns or maps
-- Complements existing cooperative campaigns or maps
-- Fixes various crashes
-- Re-enables single-player functionality
-- Includes map configs adjusting for cooperative play
-- Comes with optional addons, enhancing your experience
-- Can be used by server owners as the ultimate map config tool
-- Is built on [SourceMod](https://www.sourcemod.net)
-- __Only needs to be installed on the server__.
-
-## Installation Guide
-__If you are someone who is looking to play on a server__, you are already completely set up and ready to play! Cooperative servers can be found on the server browser just like any other server.
-
-__If you are a server operator who is looking to host your own cooperative server__, then follow the instructions below.
-- Install [Metamod:Source](https://www.sourcemm.net/downloads.php?branch=stable)
- - Latest tested build ➤ __1148__
-- Install [SourceMod](https://www.sourcemod.net/downloads.php?branch=stable)
- - Latest tested build ➤ __6960__
-- Install the latest release of SourceCoop from the [releases page](https://github.com/ampreeT/SourceCoop/releases).
-
-A step-by-step guide for Black Mesa is also available on [Steam](https://steamcommunity.com/sharedfiles/filedetails/?id=2200247356).
-
-## Additional information
-- [Features & Configuration](https://github.com/ampreeT/SourceCoop/wiki/Features-&-Configuration)
-- [Server running tips](https://github.com/ampreeT/SourceCoop/wiki/Server-running-tips)
-- [Authoring maps for SourceCoop](https://github.com/ampreeT/SourceCoop/wiki/Authoring-maps-for-SourceCoop)
-- [EDT Map script format](https://github.com/ampreeT/SourceCoop/wiki/EDT---Map-script-format)
-- [Developing](https://github.com/ampreeT/SourceCoop/wiki/Developing)
-- [Public Servers](https://github.com/ampreeT/SourceCoop/wiki/Public-Servers)
+| Table of Contents |
+|:--:|
+| [🖥️ Setup Guide](#setup-guide) - [⚙️ Configuration](#configuration) - [🌎 Campaign Support](#campaign-support) - [Contributing](#contributing) - [📸 Credits](#credits) |
+| [Features & Configuration](https://github.com/ampreeT/SourceCoop/wiki/Features-&-Configuration) - [Server Running Tips](https://github.com/ampreeT/SourceCoop/wiki/Server-running-tips) - [Public Servers](https://github.com/ampreeT/SourceCoop/wiki/Public-Servers) |
+| [📝 Developing](https://github.com/ampreeT/SourceCoop/wiki/Developing) - [🗃️ EDT Map Script Format](https://github.com/ampreeT/SourceCoop/wiki/EDT---Map-script-format) - [📘 Authoring Maps](https://github.com/ampreeT/SourceCoop/wiki/Authoring-maps-for-SourceCoop) |
+
+
+
+SourceCoop is a cooperative mod for Source Engine games that enables single-player campaigns to be played together.
+It currently supports
+
+ Black Mesa
+ and
+
+ Half-Life 2: Deathmatch
+.
+
+- Supports campaigns.
+- Restores single-player functionality.
+- Handles player and equipment persistence between maps.
+- Easy to use optional addons.
+- Easy for mappers to convert new and existing maps from single-player into cooperative.
+
+## 🖥️ Setup Guide
+
+__If you are someone who is looking to play on a server__, then you are already set up and ready to play! Cooperative servers can be found in the server browser just like any other server.
+
+> #### 🌐 Player Downloads
+>
+> Upon joining a server, players will be able to automatically download most necessary files. For custom workshop maps in Black Mesa, players will have to manually subscribe to the Steam Workshop item before starting their game. [An official Steam Workshop collection containing all supported SourceCoop maps can be found here](https://steamcommunity.com/sharedfiles/filedetails/?id=2375865650).
+
+__If you are a server operator who is looking to host your own cooperative server__, then follow a installation method below and forward the necessary ports:
+
+### 🔨 Manual Installation
+
+- Install a Source Engine Dedicated Server using
+
+ SteamCMD
+.
+ -
+ Black Mesa Dedicated Server
+ (AppID ➤ __346680__)
+
+ ##### SteamCMD Terminal (Black Mesa)
+
+ ```powershell
+ login "anonymous"
+ app_update 346680
+ quit
+ ```
+
+ -
+ Half-Life 2: Deathmatch Dedicated Server
+ (AppID ➤ __232370__)
+
+ ##### SteamCMD Terminal (Half-Life 2: Deathmatch)
+
+ ```powershell
+ login "anonymous"
+ app_update 232370
+ quit
+ ```
+
+- Install [Metamod:Source](https://www.sourcemm.net/downloads.php?branch=stable) (latest tested build ➤ __1155__) onto the server.
+- Install
+
+ SourceMod
+ (latest tested build ➤ __6968__) onto the server.
+- Install [the latest SourceCoop release](https://github.com/ampreeT/SourceCoop/releases) onto the server.
+
+A visual step-by-step guide for Black Mesa is also available on
+
+ Steam
+.
+
+### 📜 Script Installation
+
+The script installation will automatically go through the process of installing the server prerequisites, files and plugins that are required for running a cooperative server.
+
+- Download the corresponding installation script for your system.
+ - [🪟 Windows PowerShell](scripts/srccoop-bms-windows-install.ps1)
+ - [🐧 Linux Bash]()
+
+- Run the following commands in a terminal to execute the script:
+
+> #### 📂 Directories
+>
+> On script execution, the following directories will be created within the terminal's current directory:
+>
+> - Black Mesa Dedicated Server
+> - SteamCMD
+
+##### Windows PowerShell (Admin Access)
+
+```
+Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
+./srccoop-bms-windows-install.ps1
+```
+
+##### Linux Bash (Sudo Access)
+
+```
+sudo ./srccoop-bms-linux-install.ps1
+```
+
+### 🛜 Port Forwarding
+
+##### Server Inbound Rules
+
+| Port | Forward Type | Description |
+|-------|--------------|-----------------------------------------------------------------------------|
+| 27015 | TCP/UDP | Game transmission, pings and RCON - Can be changed using `-port` on startup |
+| 27020 | UDP | SourceTV transmission - Can be changed using `+tv_port` on startup |
+| 27005 | UDP | Client Port - Can be changed using `-clientport` on startup |
+| 26900 | UDP | Steam Port, outgoing - Can be changed using `-sport` on startup |
+
+## ⚙️ Configuration
+
+### Commands
+
+### ConVars
+
+| Name | Default | Description | Addon |
+|-------------------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|
+| sourcecoop_homemap | | The map to return to after finishing a campaign/map. Example Value: `"bm_c1a0a"` | |
+| sourcecoop_respawntime | `2.0` | Sets the player respawn time in seconds. Minimum Value: `0.1` | |
+| sourcecoop_survival_mode | `0` | Controls whether if survival mode is enabled. Values: `0` = off, `1` = respawn players if everyone is dead, `2` = restart the map if everyone is dead | |
+| sourcecoop_survival_respawn | `1` | Controls whether to respawn dead players at checkpoints when the ConVar `sourcecoop_survival_mode` is set to `1`. Values: `0` = No respawn, `1` = Respawn | |
+| sourcecoop_survival_spawn_timeout | `-1` | Number of seconds after the map starts (after initial timer) to allow spawning in. Set value to `-1` for no time limit. To allow players to load into the server, this value should be set to a high enough value. | |
+| sourcecoop_team | `"scientist"` | Controls the cooperative team when the ConVar `mp_teamplay` is set to `1`. If this is set to a empty or invalid value, then team management is not enforced. Values: `"marines"`, `"scientist"`, team index | |
+| sourcecoop_disable_teamselect | `1` | Controls whether to spawn players instantly by skipping the team select screen. Values: `0` = Team select, `1` = No team select | |
+| sourcecoop_start_wait_period | `15.0` | The max number of seconds to wait since the first player spawned in to start the map. The timer is skipped when all players enter the game. | |
+| sourcecoop_end_wait_period | `60.0` | The max number of seconds to wait since the first player triggered a changelevel. The timer speed increases each time a new player finishes the level. | |
+| sourcecoop_end_wait_factor | `1.0` | Controls how much the number of finished players increases the changelevel timer speed. Values: `0.0` (full) to `1.0` (none, timer will run full length) | |
+| sourcecoop_end_wait_display_mode | `1` | Sets which method to show changelevel countdown. Values: `0` = Panel, `1` = HUD Text | |
+| sourcecoop_validate_steamids | `0` | Validate players steam id's? Increases security at the cost of some functionality breakage when Steam goes down. At the time of writing this includes survival mode and equipment persistence. | |
+| sourcecoop_debug | `0` | Sets debug log locations. This is available only if the plugin has been compiled with debugging enabled. | |
+| sourcecoop_debug_parts | `6` | Selects additional information included in debug logs. This is available only if the plugin has been compiled with debugging enabled. | |
+| sourcecoop_voting_autoreload | `1` | Sets whether to reload all votemap menu entries on map change. This can prolong map loading times. | Voting |
+| sourcecoop_voting_skipintro | `1` | Allows players to vote to skip the intro sequence. | Voting |
+| sourcecoop_voting_restartmap | `1` | Enables voting to restart the current map. | Voting |
+| sourcecoop_voting_changemap | `1` | Permits players to vote for changing the map. | Voting |
+| sourcecoop_voting_survival | `2` | Allows voting for survival mode. Use values from `sourcecoop_survival_mode` to select the specific mode for voting. | Voting |
+| sourcecoop_ks_default | | Sets the default state for killsounds. Players can individually toggle killsounds in the coop menu and their preferences will be saved in cookies. | Killsounds |
+| sourcecoop_next_stuck | `60.0` | Prevents using the `stuck` command for this many seconds after each use. | Unstuck |
+| sourcecoop_earbleed_default | `0` | Sets the default player preference for the ear-bleed effect caused by explosions in cooperative mode. Preferences are saved in cookies. | Earbleed |
+| sourcecoop_killfeed_default | `1` | Awards scoreboard score to players for killing NPCs. | Scoring |
+| sourcecoop_thirdperson_enabled | | Enables whether if players are allowed to use thirdperson via chat command `!thirdperson`, console command `thirdperson` or the coop menu. Be aware that this requires enabling cheats on the client to work. Using thirdperson will break some weapon effects due to client-side prediction glitches. | |
+| sourcecoop_difficulty | | | |
+| sourcecoop_difficulty_auto | | | |
+| sourcecoop_difficulty_auto_min | | | |
+| sourcecoop_difficulty_auto_max | | | |
+| sourcecoop_difficulty_announce | | | |
+| sourcecoop_difficulty_ignoredmgto | | | |
+| sourcecoop_difficulty_ignoredmgfrom | | | |
+
+#### Toggleable Features
+
+ConVar: `sc_ft <0 or 1>`
+
+> #### ⚠️ Potential Gameplay Impact
+>
+> It is recommended to leave these features at the default values as these are configured per map within EDT configurations. Modifying feature values could negatively impact the gameplay experience.
+
+| Feature | Description |
+|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------|
+| FIRSTPERSON_DEATHCAM | Enables the first-person death camera. |
+| HEV_SOUNDS | Enables HEV sounds. |
+| INSTANCE_ITEMS | Instances pickup items and weapons for each player. Instanced items disappear once picked up and 'respawn' along with the player. |
+| INSTANCE_ITEMS_NORESET | If enabled, items will not 'respawn' picked up items after death. |
+| KEEP_EQUIPMENT | Makes players spawn with previously picked up equipment (suit, weapons). Global for all players. |
+| STRIP_DEFAULT_EQUIPMENT | Removes default multiplayer equipment. |
+| STRIP_DEFAULT_EQUIPMENT_KEEPSUIT | |
+| DISABLE_CANISTER_DROPS | Disables item drops when players die in multiplayer. |
+| NO_TELEFRAGGING | Prevents teleporting props and players from slaying other players. |
+| NOBLOCK | Prevents player-on-player collisions. (This feature requires `mp_teamplay 1` to fix smoothness issues.) |
+| SHOW_WELCOME_MESSAGE | Shows players a greeting message with basic plugin info. |
+| AUTODETECT_MAP_END | Detects commonly used commands for ending singleplayer maps from `point_clientcommand` and `point_servercommand` entities and changes the map. At first, this feature checks `sourcecoop_homemap` is set (see below), then checks if `nextmap` is set. If none are set, the map is not changed. Recommended to keep enabled. |
+| CHANGELEVEL_FX | Show visual effects (spawn particles) at level change locations. |
+| TRANSFER_PLAYER_STATE | Enables player persistence through level changes. Currently, players will carry over their health, armor and equipment for the first spawn point (checkpoint) in the map. Afterwards, the default map equipment is used. |
+
+## 🌎 Campaign Support
+
+
+
+- [Main Campaign](https://store.steampowered.com/app/362890/Black_Mesa/)
+- [Stojkeholm](https://steamcommunity.com/sharedfiles/filedetails/?id=2320533262)
+- [Emergency 17](https://steamcommunity.com/sharedfiles/filedetails/?id=934371395)
+
+SourceCoop __allows single-player map configurations__ without decompiling and redistributing; __learn more about creating your own__ on the [EDT Map Script Format](https://github.com/ampreeT/SourceCoop/wiki/EDT---Map-script-format).
## Contributing
+
__If you are looking to help with the development of the project__, we are always looking for more help! Heres some ways you can help:
+
+- Reporting inconsistencies and bugs
- Debugging and tracking down issues
- Adding features
-- Adding configs for new campaigns or levels
-
-If you are interested in helping us, contact us on [Discord](https://discord.gg/Fh77rxQaEB) or create a pull request.
-
-## Credits
-- __ampreeT__ :: programming, reverse engineering, map editing
- - [Steam](https://steamcommunity.com/id/ampreeT) | [GitHub](https://github.com/ampreeT)
-- __kasull__ :: programming, reverse engineering, trailer production
- - [Steam](https://steamcommunity.com/id/kasull/) | [GitHub](https://github.com/kasullian)
-- __Alienmario__ :: programming, reverse engineering, map editing
- - [Steam](https://steamcommunity.com/id/4oM0/) | [GitHub](https://github.com/Alienmario)
-- __Balimbanana__ :: programming, reverse engineering
- - [Steam](https://steamcommunity.com/id/Balimbanana/) | [GitHub](https://github.com/Balimbanana)
-- __Rock__ :: programming, map editing
- - [Steam](https://steamcommunity.com/id/Rock48/) | [GitHub](https://github.com/Rock48)
-- __Krozis Kane__ :: map editing
- - [Steam](https://steamcommunity.com/id/Krozis_Kane/) | [GitHub](https://github.com/KrozisKane)
-- __ReservedRegister__ :: reverse engineering
- - [GitHub](https://github.com/ReservedRegister)
-
-[__raicovx__](https://github.com/raicovx) :: Equipment persistence
-| [__Jimmy-Baby__](https://github.com/Jimmy-Baby) :: Damage effects addon
-| [__Removiekeen__](https://steamcommunity.com/profiles/76561198804614641/) :: logo design
-| [__yarik2720__](https://github.com/yarik2720) :: CI, Russian translation
-
-#### Third-party libraries
-[SourceMod](https://github.com/alliedmodders/sourcemod)
-| [SourceScramble](https://github.com/nosoop/SMExt-SourceScramble)
-| [stocksoup](https://github.com/nosoop/stocksoup)
-| [sm-logdebug](https://github.com/Alienmario/sm-logdebug)
-| [smlib](https://github.com/bcserv/smlib/tree/transitional_syntax)
\ No newline at end of file
+- Adding new configurations for campaigns and maps
+
+__If you are interested in helping us__, contact us on [Discord](https://discord.gg/Fh77rxQaEB) or create a pull request.
+
+## 📸 Credits
+
+### 🙏 Contributors
+
+- __ampreeT__ :: [Steam](https://steamcommunity.com/id/ampreeT) | [GitHub](https://github.com/ampreeT) :: programming, reverse engineering, map editing
+- __kasull__ :: [Steam](https://steamcommunity.com/id/kasull/) | [GitHub](https://github.com/kasullian) :: programming, reverse engineering, trailer production
+- __Alienmario__ :: [Steam](https://steamcommunity.com/id/4oM0/) | [GitHub](https://github.com/Alienmario) :: programming, reverse engineering, map editing
+- __Balimbanana__ :: [Steam](https://steamcommunity.com/id/Balimbanana/) | [GitHub](https://github.com/Balimbanana) :: programming, reverse engineering
+- __Rock__ :: [Steam](https://steamcommunity.com/id/Rock48/) | [GitHub](https://github.com/Rock48) :: programming, map editing
+- __Krozis Kane__ :: [Steam](https://steamcommunity.com/id/Krozis_Kane/) | [GitHub](https://github.com/KrozisKane) :: map editing
+- __ReservedRegister__ :: [GitHub](https://github.com/ReservedRegister) :: reverse engineering
+- __raicovx__ :: [Github](https://github.com/raicovx) :: equipment persistence
+- __Jimmy-Baby__ :: [Github](https://github.com/Jimmy-Baby) :: damage effects addon
+- __Removiekeen__ :: [Steam](https://steamcommunity.com/profiles/76561198804614641/) :: logo design
+- __yarik2720__ :: [Github](https://github.com/yarik2720) :: russian translation, ci/cd
+
+### 🗄️ External Libraries
+
+- [SourceMod](https://github.com/alliedmodders/sourcemod)
+- [SourceScramble](https://github.com/nosoop/SMExt-SourceScramble)
+- [stocksoup](https://github.com/nosoop/stocksoup)
+- [sm-logdebug](https://github.com/Alienmario/sm-logdebug)
+- [smlib](https://github.com/bcserv/smlib/tree/transitional_syntax)
diff --git a/scripts/srccoop-bms-windows-install.ps1 b/scripts/srccoop-bms-windows-install.ps1
new file mode 100644
index 0000000..1f1454e
--- /dev/null
+++ b/scripts/srccoop-bms-windows-install.ps1
@@ -0,0 +1,35 @@
+# Download and extract SteamCMD.
+New-Item -Name "SteamCMD" -ItemType Directory
+Invoke-WebRequest -Uri "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip" -OutFile ".tmp.zip"
+Expand-Archive -LiteralPath ".tmp.zip" -DestinationPath "./SteamCMD"
+Remove-Item -Path ".tmp.zip" -Force
+
+# Install Black Mesa Dedicated Server.
+New-Item -Name "Black Mesa Dedicated Server" -ItemType Directory
+Start-Process -FilePath "./SteamCMD/steamcmd.exe" -ArgumentList '+force_install_dir "../Black Mesa Dedicated Server"', "+login anonymous", "+app_update 346680", "+quit" -Wait -NoNewWindow
+
+# Install the latest version of Metamod Source.
+Invoke-WebRequest -OutFile ".tmp.zip" -Uri (((Invoke-WebRequest -Uri "https://www.sourcemm.net/downloads.php").Links | Where-Object { $_.href -like "*-windows.zip" }).href | Select-Object -First 1)
+Expand-Archive -LiteralPath ".tmp.zip" -DestinationPath "./Black Mesa Dedicated Server/bms"
+Remove-Item -Path ".tmp.zip" -Force
+
+# Install the latest version of SourceMod.
+Invoke-WebRequest -OutFile ".tmp.zip" -Uri (((Invoke-WebRequest -Uri "https://www.sourcemod.net/downloads.php").Links | Where-Object { $_.href -like "*-windows.zip" }).href | Select-Object -First 1)
+Expand-Archive -LiteralPath ".tmp.zip" -DestinationPath "./Black Mesa Dedicated Server/bms"
+Remove-Item -Path ".tmp.zip" -Force
+
+# Install the latest version of Accelerator.
+Invoke-WebRequest -OutFile ".tmp.zip" -Uri ("https://builds.limetech.io/" + ((Invoke-WebRequest -Uri "https://builds.limetech.io/?p=accelerator").Links | Where-Object { $_.href -like "*-windows.zip" } | Select-Object -First 1).href)
+Expand-Archive -LiteralPath ".tmp.zip" -DestinationPath "./Black Mesa Dedicated Server/bms"
+Remove-Item -Path ".tmp.zip" -Force
+
+# Install the latest release of SourceCoop.
+Invoke-WebRequest -OutFile ".tmp.zip" -Uri ((Invoke-WebRequest "https://api.github.com/repos/ampreeT/SourceCoop/releases/latest" | ConvertFrom-Json).assets | Where-Object { $_.name -like "*-bms.zip" } | Select-Object -First 1).browser_download_url
+Expand-Archive -LiteralPath ".tmp.zip" -DestinationPath "./Black Mesa Dedicated Server/bms"
+Remove-Item -Path ".tmp.zip" -Force
+
+# OPTIONAL: Remove textures to save ~9 GB.
+# Materials are needed on the server but textures are not needed.
+# If the server ever needs to be updated, these files will be redownloaded again.
+Remove-Item -Path "./Black Mesa Dedicated Server/bms/bms_textures*" -Force
+Remove-Item -Path "./Black Mesa Dedicated Server/hl2/hl2_textures*" -Force
\ No newline at end of file
From edf9d5de98c8b47c4dfbf809dcef91f0a5e213c1 Mon Sep 17 00:00:00 2001
From: ampreeT <61920833+ampreeT@users.noreply.github.com>
Date: Tue, 2 Jul 2024 16:52:28 -0700
Subject: [PATCH 2/9] stadium edt
---
edt/bms/bm_stadium4_a4.edt | 85 ++++++++++++++++++++++++++++++++++++++
1 file changed, 85 insertions(+)
create mode 100644 edt/bms/bm_stadium4_a4.edt
diff --git a/edt/bms/bm_stadium4_a4.edt b/edt/bms/bm_stadium4_a4.edt
new file mode 100644
index 0000000..f605dc2
--- /dev/null
+++ b/edt/bms/bm_stadium4_a4.edt
@@ -0,0 +1,85 @@
+#base "base/bm_sp_campaign.edt"
+
+"config"
+{
+ "campaign" "Stadium"
+ "chapter" "Stadium"
+
+ "equipment"
+ {
+ "item" "item_suit"
+ "item" "item_weapon_crowbar"
+ "item" "item_weapon_glock"
+ "item" "item_weapon_357"
+ "item" "item_weapon_mp5"
+ "item" "item_weapon_shotgun"
+ "item" "item_weapon_crossbow"
+ "item" "item_weapon_rpg"
+ "item" "item_weapon_satchel"
+ "item" "item_weapon_tau"
+ "item" "item_weapon_gluon"
+ "item" "item_weapon_hivehand"
+ "item" "item_weapon_snark"
+ "item" "item_weapon_snark"
+ "item" "item_weapon_snark"
+ "item" "item_weapon_satchel"
+ "item" "item_weapon_satchel"
+ "item" "item_weapon_satchel"
+ "item" "item_weapon_satchel"
+ "item" "item_weapon_satchel"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_frag"
+ "item" "item_weapon_tripmine"
+ "item" "item_weapon_tripmine"
+ "item" "item_weapon_tripmine"
+ "item" "item_weapon_tripmine"
+ "item" "item_weapon_tripmine"
+ "item" "item_ammo_mp5"
+ "item" "item_ammo_mp5"
+ "item" "item_ammo_mp5"
+ "item" "item_ammo_mp5"
+ "item" "item_ammo_mp5"
+ "item" "item_ammo_mp5"
+ "item" "item_grenade_rpg"
+ "item" "item_grenade_rpg"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_shotgun"
+ "item" "item_ammo_357"
+ "item" "item_ammo_357"
+ "item" "item_ammo_energy"
+ "item" "item_ammo_energy"
+ "item" "item_ammo_energy"
+ "item" "item_ammo_energy"
+ "item" "item_ammo_energy"
+ "item" "item_longjump"
+ "item" "item_battery"
+ "item" "item_battery"
+ "item" "item_battery"
+ "item" "item_battery"
+ "item" "item_battery"
+ "item" "item_battery"
+ "item" "item_battery"
+ "item" "item_grenade_mp5"
+ "item" "item_grenade_mp5"
+ "item" "item_grenade_mp5"
+ }
+
+ "checkpoint"
+ {
+ "use_map_spawnpoint" "1"
+ }
+}
\ No newline at end of file
From e35911e65d90668ac6c37c231597ac2896ce36b5 Mon Sep 17 00:00:00 2001
From: ampreeT <61920833+ampreeT@users.noreply.github.com>
Date: Tue, 2 Jul 2024 16:58:37 -0700
Subject: [PATCH 3/9] temp ec2 setup
---
scripts/setup-srccoop-bms-ec2.sh | 125 +++++++++++++++++++++++++++++++
1 file changed, 125 insertions(+)
create mode 100644 scripts/setup-srccoop-bms-ec2.sh
diff --git a/scripts/setup-srccoop-bms-ec2.sh b/scripts/setup-srccoop-bms-ec2.sh
new file mode 100644
index 0000000..480df0d
--- /dev/null
+++ b/scripts/setup-srccoop-bms-ec2.sh
@@ -0,0 +1,125 @@
+#!/bin/bash
+
+# `setup-srccoop-bms-ec2.sh` can be used as user data to deploy to EC2 instances.
+#
+# Steps:
+#
+# - Operating System: Amazon Linux 2 AMI
+# - Machine: t3a.micro
+# - Security Group: TODO
+# - Storage: 35 GB, Root Volume: gp3
+# - Insert this file as user data
+# - Launch instance
+# - Connect to the server using `screen -r srcds`.
+#
+# TODO:
+#
+# - Enable logging on SRCDS
+# - Enable logging on SourceMod
+
+HOME_USER_INSTALL="ec2-user"
+
+# Exit early on error.
+set -x -e
+
+sudo yum update -y
+# Used for running 32-bit SteamCMD.
+sudo yum install glibc.i686 -y
+# Used for running the dedicated server.
+sudo yum install libstdc++.so.6 -y
+# Used for running the dedicated server.
+sudo yum install ncurses-compat-libs.i686 -y
+
+su "$HOME_USER_INSTALL" -c bash << 'EOF'
+# Login into user account.
+function download_extract() {
+ wget "$1" -O "contents.temp"
+ if [[ "$1" == *.tar.gz ]]; then
+ tar zxf "contents.temp"
+ elif [[ "$1" == *.zip ]]; then
+ unzip "contents.temp"
+ fi
+ rm "contents.temp"
+}
+
+# Exit early on error.
+set -x -e
+
+# Create `SteamCMD` directory.
+cd ~
+mkdir -p "SteamCMD"
+cd "SteamCMD"
+
+# Download SteamCMD.
+download_extract "http://media.steampowered.com/client/steamcmd_linux.tar.gz"
+
+# Install Black Mesa Dedicated Server.
+echo -e "login anonymous\napp_update 346680\nquit" | ~/SteamCMD/steamcmd.sh
+
+# Remove textures to save ~9 GB.
+# Materials are needed on the server but textures are not needed.
+cd "../Steam/steamapps/common/Black Mesa Dedicated Server"
+rm bms/bms_textures*
+rm hl2/hl2_textures*
+
+# Install Metamod Source, SourceMod, Accelerator and SourceCoop.
+cd "bms"
+download_extract "https://mms.alliedmods.net/mmsdrop/1.11/mmsource-1.11.0-git1155-linux.tar.gz"
+download_extract "https://sm.alliedmods.net/smdrop/1.11/sourcemod-1.11.0-git6964-linux.tar.gz"
+download_extract "https://builds.limetech.io/files/accelerator-2.5.0-git138-cd575aa-linux.zip"
+download_extract $(wget -qO- "https://api.github.com/repos/ampreeT/SourceCoop/releases/latest" | grep "browser_download_url" | cut -d '"' -f 4)
+
+# Create `mapcycle.txt`.
+rm mapcycle.txt
+echo "bm_c0a0a" >> "mapcycle.txt" # Black Mesa: Chapter 1
+echo "bm_c1a0a" >> "mapcycle.txt" # Black Mesa: Chapter 2
+echo "bm_c1a1a" >> "mapcycle.txt" # Black Mesa: Chapter 3
+echo "bm_c1a2a" >> "mapcycle.txt" # Black Mesa: Chapter 4
+echo "bm_c1a3a" >> "mapcycle.txt" # Black Mesa: Chapter 5
+echo "bm_c1a4a" >> "mapcycle.txt" # Black Mesa: Chapter 6
+echo "bm_c2a1a" >> "mapcycle.txt" # Black Mesa: Chapter 7
+echo "bm_c2a1a" >> "mapcycle.txt" # Black Mesa: Chapter 8
+echo "bm_c2a2a" >> "mapcycle.txt" # Black Mesa: Chapter 9
+echo "bm_c2a3a" >> "mapcycle.txt" # Black Mesa: Chapter 10
+echo "bm_c2a4a" >> "mapcycle.txt" # Black Mesa: Chapter 11
+echo "bm_c2a4e" >> "mapcycle.txt" # Black Mesa: Chapter 12
+echo "bm_c2a5a" >> "mapcycle.txt" # Black Mesa: Chapter 13
+echo "bm_c3a1a" >> "mapcycle.txt" # Black Mesa: Chapter 14
+echo "bm_c3a2a" >> "mapcycle.txt" # Black Mesa: Chapter 15
+echo "bm_c4a1a" >> "mapcycle.txt" # Black Mesa: Chapter 16
+echo "bm_c4a2a" >> "mapcycle.txt" # Black Mesa: Chapter 17
+echo "bm_c4a3a" >> "mapcycle.txt" # Black Mesa: Chapter 18
+#echo "fd01" >> "mapcycle.txt" # Further Data
+
+cd "cfg"
+
+# Empty `autoexec.cfg` as the default settings is not used on the server.
+rm "autoexec.cfg"
+echo "" >> "autoexec.cfg"
+
+# Create `server.cfg`.
+rm "server.cfg"
+echo "// SourceCoop settings" >> "server.cfg"
+echo "hostname \"Black Mesa: Deathmatch\"" >> "server.cfg" # make this adjustable
+echo "mp_timelimit 0 // Prevents map switch from round timers." >> "server.cfg"
+echo "mp_fraglimit 0 // Prevents the match from ending when a player has a high enough score." >> "server.cfg"
+echo "mp_teamplay 1 // Enables the scientist team." >> "server.cfg"
+echo "mp_friendlyfire 0 // Disables friendly fire." >> "server.cfg"
+echo "mp_forcerespawn 1" >> "server.cfg"
+echo "" >> "server.cfg"
+echo "// Add your settings below" >> "server.cfg"
+# sv_password "" // Sets a server password for locking the server.
+# rcon_password "" // Sets a RCON password for accessing adminstrative features.
+
+# Add your maps, plugins and configuration here.
+
+# Adds a job to launch the `srcds_run` everytime the instance starts.
+# `srcds_run` handles server restarts if the server goes down.
+(crontab -l; echo "@reboot screen -dmS srcds ~/Steam/steamapps/common/Black\ Mesa\ Dedicated\ Server/srcds_run -console -game bms -port 27015 -insecure +sv_lan 0 +maxplayers 18 +map bm_c1a0a") | crontab -
+EOF
+
+# Reboot the instance to start the Black Mesa Dedicated Server.
+sudo reboot
+
+echo "hostname \"Black Mesa: Deathmatch\"" >> "server.cfg" # make this adjustable
+echo "mp_timelimit 0 // Prevents map switch from round timers." >> "server.cfg"
\ No newline at end of file
From 3bc861a88d05998118924c8f2ce075289bf39310 Mon Sep 17 00:00:00 2001
From: ampreeT <61920833+ampreeT@users.noreply.github.com>
Date: Tue, 9 Jul 2024 17:27:26 -0700
Subject: [PATCH 4/9] fix readme formatting + icons
---
README.md | 119 ++++++++----------------
images/icon-bms-small.png | Bin 0 -> 1786 bytes
images/icon-hl2dm-small.png | Bin 0 -> 1958 bytes
images/icon-sourcemod-small.png | Bin 0 -> 3205 bytes
images/icon-steam-small.png | Bin 0 -> 1211 bytes
scripts/srccoop-bms-windows-install.ps1 | 2 +-
6 files changed, 38 insertions(+), 83 deletions(-)
create mode 100644 images/icon-bms-small.png
create mode 100644 images/icon-hl2dm-small.png
create mode 100644 images/icon-sourcemod-small.png
create mode 100644 images/icon-steam-small.png
diff --git a/README.md b/README.md
index 80eb7a2..50738b8 100644
--- a/README.md
+++ b/README.md
@@ -1,29 +1,12 @@
-
+
-
+
+
+
----
-
-[![CI](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml/badge.svg)](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml)
-[![GitHub Release](https://img.shields.io/github/v/release/ampreeT/SourceCoop?style=flat&label=Release&labelColor=%232C3137&color=%23EB551B)](https://github.com/ampreeT/SourceCoop/releases/latest)
-[![Discord](https://img.shields.io/discord/973591793117564988.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/Fh77rxQaEB)
-
-| Table of Contents |
-|:--:|
-| [🖥️ Setup Guide](#setup-guide) - [⚙️ Configuration](#configuration) - [🌎 Campaign Support](#campaign-support) - [Contributing](#contributing) - [📸 Credits](#credits) |
-| [Features & Configuration](https://github.com/ampreeT/SourceCoop/wiki/Features-&-Configuration) - [Server Running Tips](https://github.com/ampreeT/SourceCoop/wiki/Server-running-tips) - [Public Servers](https://github.com/ampreeT/SourceCoop/wiki/Public-Servers) |
-| [📝 Developing](https://github.com/ampreeT/SourceCoop/wiki/Developing) - [🗃️ EDT Map Script Format](https://github.com/ampreeT/SourceCoop/wiki/EDT---Map-script-format) - [📘 Authoring Maps](https://github.com/ampreeT/SourceCoop/wiki/Authoring-maps-for-SourceCoop) |
-
-
SourceCoop is a cooperative mod for Source Engine games that enables single-player campaigns to be played together.
-It currently supports
-
- Black Mesa
- and
-
- Half-Life 2: Deathmatch
-.
+It currently supports Black Mesa and Half-Life 2: Deathmatch.
- Supports campaigns.
- Restores single-player functionality.
@@ -31,7 +14,13 @@ It currently supports
-
- SteamCMD
-.
- -
- Black Mesa Dedicated Server
- (AppID ➤ __346680__)
-
- ##### SteamCMD Terminal (Black Mesa)
-
- ```powershell
- login "anonymous"
- app_update 346680
- quit
- ```
-
- -
- Half-Life 2: Deathmatch Dedicated Server
- (AppID ➤ __232370__)
-
- ##### SteamCMD Terminal (Half-Life 2: Deathmatch)
-
+- Install a Source Engine Dedicated Server using SteamCMD.
+ - Black Mesa Dedicated Server (AppID ➤ __346680__)
+ - Half-Life 2: Deathmatch Dedicated Server (AppID ➤ __232370__)
+ ##### SteamCMD Terminal
```powershell
login "anonymous"
- app_update 232370
+ app_update
quit
```
-
- Install [Metamod:Source](https://www.sourcemm.net/downloads.php?branch=stable) (latest tested build ➤ __1155__) onto the server.
-- Install
-
- SourceMod
- (latest tested build ➤ __6968__) onto the server.
+- Install [SourceMod](https://www.sourcemod.net/downloads.php?branch=stable) (latest tested build ➤ __6968__) onto the server.
- Install [the latest SourceCoop release](https://github.com/ampreeT/SourceCoop/releases) onto the server.
-A visual step-by-step guide for Black Mesa is also available on
-
- Steam
-.
+A visual step-by-step guide for Black Mesa is also available on Steam.
### 📜 Script Installation
@@ -92,26 +56,21 @@ The script installation will automatically go through the process of installing
- [🐧 Linux Bash]()
- Run the following commands in a terminal to execute the script:
-
-> #### 📂 Directories
->
-> On script execution, the following directories will be created within the terminal's current directory:
->
-> - Black Mesa Dedicated Server
-> - SteamCMD
-
-##### Windows PowerShell (Admin Access)
-
-```
-Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
-./srccoop-bms-windows-install.ps1
-```
-
-##### Linux Bash (Sudo Access)
-
-```
-sudo ./srccoop-bms-linux-install.ps1
-```
+ > #### 📂 New Directories
+ >
+ > On script execution, the following directories will be created within the terminal's current directory:
+ >
+ > - Black Mesa Dedicated Server
+ > - SteamCMD
+ ##### Windows PowerShell (Admin Access)
+ ```
+ Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
+ ./srccoop-bms-windows-install.ps1
+ ```
+ ##### Linux Bash (Sudo Access)
+ ```
+ sudo ./srccoop-bms-linux-install.ps1
+ ```
### 🛜 Port Forwarding
@@ -168,9 +127,9 @@ sudo ./srccoop-bms-linux-install.ps1
ConVar: `sc_ft <0 or 1>`
-> #### ⚠️ Potential Gameplay Impact
+> #### ⚠️ Gameplay Impact
>
-> It is recommended to leave these features at the default values as these are configured per map within EDT configurations. Modifying feature values could negatively impact the gameplay experience.
+> It is recommended to leave these features at the default values as these are configured per map within EDT configurations. __Modifying feature values could negatively impact the gameplay experience__.
| Feature | Description |
|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------|
@@ -191,11 +150,7 @@ ConVar: `sc_ft <0 or 1>`
## 🌎 Campaign Support
-
+
- [Main Campaign](https://store.steampowered.com/app/362890/Black_Mesa/)
- [Stojkeholm](https://steamcommunity.com/sharedfiles/filedetails/?id=2320533262)
diff --git a/images/icon-bms-small.png b/images/icon-bms-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cf7288f7e3ecc9d1cc87f6a402e48042af94fd0
GIT binary patch
literal 1786
zcmVBDJEWRX@}RRHRCMNM$ujNgHUzhf3=}OdU#b
zHrtTcYkU2*pL2MaJ2Q92yV>%>>|UL{_x$g<=bn4cxo1`|&y|z;96~`P#~mO
zzePYb=#%1;#+XSRFeQaEs7&p7Xs#6Ti-r7W6`ltji4_qvk{E~(1Wi*Lql!q97xp7n
z(wKlQD0*zq)a5@&v5?OxyooXr%QcfMInk5m8GSU`wvCCI-7&f#B9k6a5E!u+7NeP@
zm9YjRo>)ZE82KMCGJQUCzdj;IJVkR`7?#IssG#lPB8ZzI^MQ|$8O!4g
z>;iG{HMf}=&JgHp-1PY`vIZsraq?W0Pwg3fhY(LvScbwkIJ8=4jjNIhe
zYNJYZ_5$m#K27cN>t?|YR#EHh6-Ta|oLB({JHVsI**3u7(Ff>1{0(qiOQ4Uxu>vU0
zwn1>b#Jt+uzi0Wm2Wc+Or*^IF`V}b_CRRWO?SN7%0z?FFbU(Z9djxOyhfr1g^(8j`
z_*<$oXQ`KFp-~Gax*nO)39=vkJpG67!W|w*MDRB&l%FY3n|(D(PU$twctx%h@+*?E
zknJv+u{C^bNbu16qGEW?r{!f3C!J|LG$@ZhI2IVKe&*tCG
zCFZ4Q#R*NP1P&bJieSv`-^s4~AI051j9=TJ{KN@XUig{iumM)Xp2m)+ev7pWPjlnc
zT{O!@#Lckt-d~Uz%g2~#LJHGZH-p&uA%{t}Bzf1M+FB=?)aYlPi
zEX#~3G_PG|@mJr*Uth+__ObJxpM&EjFt!{=qa7-$f&VDbv+oewCclKLQkgzYb?&u*
zPYQ2*F5)FHfzcY*-(l%DKSou_jNeM%ZC~Dk3Faz}h|yF8k&p@lU;GXLt;KoPe)o8i
zpTMW*w!;Y3i)X1_I**93{R{UY;9sJy2!yt!Z<
zxsHgC&3~#b#=+Wc7;Bl_K~$Aixro2IU?L#qr<n?cQ2`4-vr~yd_cTiMb=a
ztp$%nSA&KbI8@4_-Yp+y_xGOds*pAtEIfQK^>^Pe8a4wlncjpvHG$w5FAPeJ@V8OK
z=^sk*h>s>*P&LuQv5<V;HnA&l4AUwXjTQER>qQ}n
zgg1NAsv$ov?2^iSsD@3c&%YT6>>Z$I?
ziB6UZThG2j4Bh<`GJ8Ibs?wOBNhVd>LY9(<2=#yd34fykK;PlJ+a|rVCDN_kc>kfV
zB5nr!7S(@T=#UuO?9Q)mvhnBV1BGt86K`yytFLskklm`6&eK}?k2Mx!Js
zzozf@uj6F<+4ZeQXp}A`{bt+XmP*lfblbn8ng>w7#p+8BgJtPpZ4zw#8-x28Kr
zPuf?yVH#I2vGT%CBSqre7MT;LZDI_~i&B2}fuIiRvS3$buFbLd*!}qRO;bE26RjHB
zHZdkzqsHPBCs;lA80xpWI&?eU=EbwzIDHST%5}t+-6kIk5yXWQhtaN$O96(ES85xr6jh-a&T%
z?Rca6aC-WJi?>muRW4F{_YJBuFHxI&4fXv<=9aQPyj)FRVA(^YBw#6I@7AsZ;$Mx@
zERE7Et05+n1#yBqP+N&D2gXavOi)SmOCG9c6h79;hMfaDMreKWCj9hE;Y~4T91)p9
zWFfrV(wA+gvGj#3ZLo<8xeEqZ5RoZod}^*F$}wO;O?e@mBF^I3G>Iqbt7=eqb;G~{
z$g%OMxl(w5PVr=ZOof7=M?i9bqoLnngo^zN9Qve2eju8xDic>mcsMb}2TCAkM3@?%
c3jWgjFF8ztXJl&GQ2+n{07*qoM6N<$f;AFjng9R*
literal 0
HcmV?d00001
diff --git a/images/icon-hl2dm-small.png b/images/icon-hl2dm-small.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ee3ab00ae1c19e120d99a1a629135eb8125431a
GIT binary patch
literal 1958
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
Z{{t{0rD%E(=#u~d002ovPDHLkV1hh4IhX(d
literal 0
HcmV?d00001
diff --git a/scripts/srccoop-bms-windows-install.ps1 b/scripts/srccoop-bms-windows-install.ps1
index 1f1454e..badb88a 100644
--- a/scripts/srccoop-bms-windows-install.ps1
+++ b/scripts/srccoop-bms-windows-install.ps1
@@ -29,7 +29,7 @@ Expand-Archive -LiteralPath ".tmp.zip" -DestinationPath "./Black Mesa Dedicated
Remove-Item -Path ".tmp.zip" -Force
# OPTIONAL: Remove textures to save ~9 GB.
-# Materials are needed on the server but textures are not needed.
+# On the server, materials are needed but textures are not.
# If the server ever needs to be updated, these files will be redownloaded again.
Remove-Item -Path "./Black Mesa Dedicated Server/bms/bms_textures*" -Force
Remove-Item -Path "./Black Mesa Dedicated Server/hl2/hl2_textures*" -Force
\ No newline at end of file
From ee5b604c232a1175db6edc0033d53949d6fdf669 Mon Sep 17 00:00:00 2001
From: ampreeT <61920833+ampreeT@users.noreply.github.com>
Date: Tue, 9 Jul 2024 17:30:04 -0700
Subject: [PATCH 5/9] fix readme formatting
---
README.md | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 50738b8..0cde029 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,8 @@
-
-
-
-
+[![](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml/badge.svg)](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml)
+[![](https://img.shields.io/github/v/release/ampreeT/SourceCoop?style=flat&label=Release&labelColor=%232C3137&color=%23EB551B)](https://github.com/ampreeT/SourceCoop/releases/latest)
+[![](https://img.shields.io/discord/973591793117564988.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/Fh77rxQaEB)
SourceCoop is a cooperative mod for Source Engine games that enables single-player campaigns to be played together.
It currently supports Black Mesa and Half-Life 2: Deathmatch.
From 17fceda4cd671beae5d2764aebdfa2f6bcf965bc Mon Sep 17 00:00:00 2001
From: ampreeT <61920833+ampreeT@users.noreply.github.com>
Date: Fri, 30 Aug 2024 17:40:26 -0700
Subject: [PATCH 6/9] readme update + linux/windows scripts
---
README.md | 265 +++++++++++++++---------
images/logo-sc.png | Bin 0 -> 45855 bytes
scripts/setup-srccoop-bms-ec2.sh | 125 -----------
scripts/srccoop-bms-linux-install.sh | 106 ++++++++++
scripts/srccoop-bms-windows-install.ps1 | 82 +++++++-
5 files changed, 351 insertions(+), 227 deletions(-)
create mode 100644 images/logo-sc.png
delete mode 100644 scripts/setup-srccoop-bms-ec2.sh
create mode 100644 scripts/srccoop-bms-linux-install.sh
diff --git a/README.md b/README.md
index 0cde029..3fa294c 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
-
+
-[![](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml/badge.svg)](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml)
[![](https://img.shields.io/github/v/release/ampreeT/SourceCoop?style=flat&label=Release&labelColor=%232C3137&color=%23EB551B)](https://github.com/ampreeT/SourceCoop/releases/latest)
+[![](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml/badge.svg)](https://github.com/ampreeT/SourceCoop/actions/workflows/plugin.yml)
[![](https://img.shields.io/discord/973591793117564988.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/Fh77rxQaEB)
SourceCoop is a cooperative mod for Source Engine games that enables single-player campaigns to be played together.
@@ -15,11 +15,11 @@ It currently supports SteamCMD.
- - Black Mesa Dedicated Server (AppID ➤ __346680__)
- - Half-Life 2: Deathmatch Dedicated Server (AppID ➤ __232370__)
- ##### SteamCMD Terminal
- ```powershell
- login "anonymous"
- app_update
- quit
- ```
-- Install [Metamod:Source](https://www.sourcemm.net/downloads.php?branch=stable) (latest tested build ➤ __1155__) onto the server.
-- Install [SourceMod](https://www.sourcemod.net/downloads.php?branch=stable) (latest tested build ➤ __6968__) onto the server.
-- Install [the latest SourceCoop release](https://github.com/ampreeT/SourceCoop/releases) onto the server.
-
-A visual step-by-step guide for Black Mesa is also available on Steam.
-
### 📜 Script Installation
-The script installation will automatically go through the process of installing the server prerequisites, files and plugins that are required for running a cooperative server.
+The script installation will automatically go through the process of installing the server files and plugins that are required for running a cooperative server.
+
+> #### 🐧Linux Distributions
+>
+> The Linux installation script has been tested with the following distributions:
+>
+> - Ubuntu
+> - Debian
+>
+> __If the installation script does not support the Linux distribution that you are using__, then feel free to modify the script and create a pull request!
- Download the corresponding installation script for your system.
- - [🪟 Windows PowerShell](scripts/srccoop-bms-windows-install.ps1)
- - [🐧 Linux Bash]()
+ - Black Mesa
+ - [🪟 Windows PowerShell](scripts/srccoop-bms-windows-install.ps1)
+ - [🐧 Linux Bash](scripts/srccoop-bms-linux-install.sh)
-- Run the following commands in a terminal to execute the script:
+- Run the following commands in a terminal to start the installation:
> #### 📂 New Directories
>
> On script execution, the following directories will be created within the terminal's current directory:
>
> - Black Mesa Dedicated Server
> - SteamCMD
- ##### Windows PowerShell (Admin Access)
- ```
+ > - Steam
+ ##### Windows PowerShell Terminal
+ ```powershell
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
./srccoop-bms-windows-install.ps1
```
- ##### Linux Bash (Sudo Access)
+ ##### Linux Bash Terminal
+ ```bash
+ chmod +x "./srccoop-bms-linux-install.sh"
+ ./srccoop-bms-linux-install.sh
+ ```
+
+- After the installation process is complete, the server can be started by running the following commands. [Make sure that the necessary ports are forwarded so players to be able to join the server!](#🛜-port-forwarding)
+ ##### Windows PowerShell Terminal
+ ```powershell
+ cd "Black Mesa Dedicated Server"
+ ./srcds_coop.bat
```
- sudo ./srccoop-bms-linux-install.ps1
+ ##### Linux Bash Terminal
+ ```bash
+ cd "Black Mesa Dedicated Server"
+ ./srcds_coop.sh
```
+### 🔨 Manual Installation
+
+- Install a Source Engine Dedicated Server using SteamCMD.
+ - Black Mesa Dedicated Server (AppID ➤ __346680__)
+ - Half-Life 2: Deathmatch Dedicated Server (AppID ➤ __232370__)
+ ##### SteamCMD Terminal (Black Mesa)
+ ```powershell
+ login "anonymous"
+ app_update 346680
+ quit
+ ```
+ ##### SteamCMD Terminal (Half-Life 2: Deathmatch)
+ ```powershell
+ login "anonymous"
+ app_update 232370
+ quit
+ ```
+- Install [Metamod:Source](https://www.sourcemm.net/downloads.php?branch=stable) (latest tested build ➤ __1155__) onto the server.
+- Install [SourceMod](https://www.sourcemod.net/downloads.php?branch=stable) (latest tested build ➤ __6968__) onto the server.
+- Install [the latest SourceCoop release](https://github.com/ampreeT/SourceCoop/releases) onto the server.
+- [Forward the necessary ports.](#🛜-port-forwarding)
+
+A visual step-by-step guide for Black Mesa is also available on Steam.
+
### 🛜 Port Forwarding
+In order for players to able to join the server, you will need to only forward the default game transmission TCP/UDP port `27015`. All other ports are optional.
+
##### Server Inbound Rules
| Port | Forward Type | Description |
|-------|--------------|-----------------------------------------------------------------------------|
-| 27015 | TCP/UDP | Game transmission, pings and RCON - Can be changed using `-port` on startup |
-| 27020 | UDP | SourceTV transmission - Can be changed using `+tv_port` on startup |
-| 27005 | UDP | Client Port - Can be changed using `-clientport` on startup |
-| 26900 | UDP | Steam Port, outgoing - Can be changed using `-sport` on startup |
+| `27015` | TCP/UDP | Game transmission, pings and RCON - Can be changed using `-port` on startup |
+| `27020` | UDP | SourceTV transmission - Can be changed using `+tv_port` on startup |
+| `27005` | UDP | Client Port - Can be changed using `-clientport` on startup |
+| `26900` | UDP | Steam Port, outgoing - Can be changed using `-sport` on startup |
+
+## 🌎 Campaign Support
+
+
+
+- [Main Campaign](https://store.steampowered.com/app/362890/Black_Mesa/)
+- [Stojkeholm](https://steamcommunity.com/sharedfiles/filedetails/?id=2320533262)
+- [Emergency 17](https://steamcommunity.com/sharedfiles/filedetails/?id=934371395)
+
+SourceCoop __allows single-player map configurations__ without decompiling and redistributing; __learn more about creating your own__ on the [EDT Map Script Format](https://github.com/ampreeT/SourceCoop/wiki/EDT---Map-script-format).
+
+If you have already created native cooperative support for your map by including a EDT file, please make a pull request onto the `README.md` with your Steam Workshop item link so we can showcase it off!
## ⚙️ Configuration
### Commands
-### ConVars
+| **Command** | **Description** | **Addon** |
+|---------------------------|-------------------------------------------------------------------|------------------|
+| `sm_coopmenu` | Displays the coop menu | Base |
+| `sizeup` | Displays the coop menu | Base |
+| `sm_thirdperson` | Type `!thirdperson` to go into thirdperson mode | Thirdperson |
+| `sm_firstperson` | Type `!firstperson` to exit thirdperson mode | Thirdperson |
+| `stuck` | Unstuck command | Unstuck |
+| `unstuck` | Unstuck command | Unstuck |
+| `sm_skipintro` | Starts a skip intro vote | Voting |
+| `sm_restartmap` | Starts a restart map vote | Voting |
+| `sm_changemap` | Shows a menu for changing maps | Voting |
+| `sm_survival` | Starts a survival vote | Voting |
+
+### Admin Commands
+
+| **Command** | **Description** | **Addon** |
+|---------------------------|----------------------------------------------------------------------------------------------------|------------------|
+| `sc_save` | Exports last saved player equipment state to a file. | Base |
+| `sc_load` | Imports saved data from file and attempts to equip each player. | Base |
+| `sc_clear` | Clear persisted equipment and equip players with the map defaults. | Base |
+| `sourcecoop_dump` | Command for dumping map entities to a file. | Base |
+| `sc_dump` | Command for dumping map entities to a file. | Base |
+| `sc_mkconfigs` | Creates default edt configs for all maps in the maps directory which are missing one. | Base |
+| `sc_revive` | Force respawn player. | Revive |
+| `sc_reload_maps` | Reloads all entries in the votemap menu from storage. | Voting |
-| Name | Default | Description | Addon |
-|-------------------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|
-| sourcecoop_homemap | | The map to return to after finishing a campaign/map. Example Value: `"bm_c1a0a"` | |
-| sourcecoop_respawntime | `2.0` | Sets the player respawn time in seconds. Minimum Value: `0.1` | |
-| sourcecoop_survival_mode | `0` | Controls whether if survival mode is enabled. Values: `0` = off, `1` = respawn players if everyone is dead, `2` = restart the map if everyone is dead | |
-| sourcecoop_survival_respawn | `1` | Controls whether to respawn dead players at checkpoints when the ConVar `sourcecoop_survival_mode` is set to `1`. Values: `0` = No respawn, `1` = Respawn | |
-| sourcecoop_survival_spawn_timeout | `-1` | Number of seconds after the map starts (after initial timer) to allow spawning in. Set value to `-1` for no time limit. To allow players to load into the server, this value should be set to a high enough value. | |
-| sourcecoop_team | `"scientist"` | Controls the cooperative team when the ConVar `mp_teamplay` is set to `1`. If this is set to a empty or invalid value, then team management is not enforced. Values: `"marines"`, `"scientist"`, team index | |
-| sourcecoop_disable_teamselect | `1` | Controls whether to spawn players instantly by skipping the team select screen. Values: `0` = Team select, `1` = No team select | |
-| sourcecoop_start_wait_period | `15.0` | The max number of seconds to wait since the first player spawned in to start the map. The timer is skipped when all players enter the game. | |
-| sourcecoop_end_wait_period | `60.0` | The max number of seconds to wait since the first player triggered a changelevel. The timer speed increases each time a new player finishes the level. | |
-| sourcecoop_end_wait_factor | `1.0` | Controls how much the number of finished players increases the changelevel timer speed. Values: `0.0` (full) to `1.0` (none, timer will run full length) | |
-| sourcecoop_end_wait_display_mode | `1` | Sets which method to show changelevel countdown. Values: `0` = Panel, `1` = HUD Text | |
-| sourcecoop_validate_steamids | `0` | Validate players steam id's? Increases security at the cost of some functionality breakage when Steam goes down. At the time of writing this includes survival mode and equipment persistence. | |
-| sourcecoop_debug | `0` | Sets debug log locations. This is available only if the plugin has been compiled with debugging enabled. | |
-| sourcecoop_debug_parts | `6` | Selects additional information included in debug logs. This is available only if the plugin has been compiled with debugging enabled. | |
-| sourcecoop_voting_autoreload | `1` | Sets whether to reload all votemap menu entries on map change. This can prolong map loading times. | Voting |
-| sourcecoop_voting_skipintro | `1` | Allows players to vote to skip the intro sequence. | Voting |
-| sourcecoop_voting_restartmap | `1` | Enables voting to restart the current map. | Voting |
-| sourcecoop_voting_changemap | `1` | Permits players to vote for changing the map. | Voting |
-| sourcecoop_voting_survival | `2` | Allows voting for survival mode. Use values from `sourcecoop_survival_mode` to select the specific mode for voting. | Voting |
-| sourcecoop_ks_default | | Sets the default state for killsounds. Players can individually toggle killsounds in the coop menu and their preferences will be saved in cookies. | Killsounds |
-| sourcecoop_next_stuck | `60.0` | Prevents using the `stuck` command for this many seconds after each use. | Unstuck |
-| sourcecoop_earbleed_default | `0` | Sets the default player preference for the ear-bleed effect caused by explosions in cooperative mode. Preferences are saved in cookies. | Earbleed |
-| sourcecoop_killfeed_default | `1` | Awards scoreboard score to players for killing NPCs. | Scoring |
-| sourcecoop_thirdperson_enabled | | Enables whether if players are allowed to use thirdperson via chat command `!thirdperson`, console command `thirdperson` or the coop menu. Be aware that this requires enabling cheats on the client to work. Using thirdperson will break some weapon effects due to client-side prediction glitches. | |
-| sourcecoop_difficulty | | | |
-| sourcecoop_difficulty_auto | | | |
-| sourcecoop_difficulty_auto_min | | | |
-| sourcecoop_difficulty_auto_max | | | |
-| sourcecoop_difficulty_announce | | | |
-| sourcecoop_difficulty_ignoredmgto | | | |
-| sourcecoop_difficulty_ignoredmgfrom | | | |
+### ConVars
+| **Name** | **Default** | **Description** | **Addon** |
+|----------------------------------------|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|
+| `sourcecoop_version` | | The version of the SourceCoop mod. | Base |
+| `sourcecoop_respawntime` | `2.0` | Sets player respawn time in seconds. | Base |
+| `sourcecoop_start_wait_period` | `15.0` | The max number of seconds to wait since the first player spawned in to start the map. The timer is skipped when all players enter the game. | Base |
+| `sourcecoop_end_wait_period` | `60.0` | The max number of seconds to wait since the first player triggered a changelevel. The timer speed increases each time a new player finishes the level. | Base |
+| `sourcecoop_end_wait_factor` | `1.0` | Controls how much the number of finished players increases the changelevel timer speed. `1.0` means full, `0` means none (timer will run full length). | Base |
+| `sourcecoop_homemap` | | The map to return to after finishing a campaign/map. | Base |
+| `sourcecoop_end_wait_display_mode` | `1` | Sets which method to show countdown. `0` is panel, `1` is hud text. | Base |
+| `sourcecoop_validate_steamids` | `0` | Validate players' Steam IDs? Increases security at the cost of some functionality breakage when Steam goes down. | Base |
+| `sourcecoop_default_config` | | Default edt file, relative to game folder. This file is copied when starting a map with missing config as `/.edt`. | Base |
+| `sourcecoop_default_config_dest` | `"maps"` | Destination folder for `sourcecoop_default_config`, relative to the game folder. Should be one of the edt scan paths! | Base |
+| `sc_killfeed` | `2` | Controls the display of the kill feed (`0`: disabled, `1`: chat, `2`: hud). If set to `2`, then the plugin will spawn in fake clients to display on the kill feed. | Base |
+| `sc_killfeed_player_kills` | `2` | Controls display of player kills on the kill feed (`0`: hide, `1`: players, `2`: entities). | Base |
+| `sc_killfeed_entity_kills` | `2` | Controls display of entity kills on the kill feed (`0`: hide, `1`: players, `2`: entities). | Base |
+| `sc_killfeed_suicides` | `2` | Controls display of suicides on the kill feed (`0`: hide, `1`: players, `2`: entities). | Base |
+| `sourcecoop_survival_mode` | `0` | Sets survival mode. `0` = off. `1` will respawn players if all are dead, `2` will restart the map. | Base |
+| `sourcecoop_survival_respawn` | `1` | Whether to respawn dead players at checkpoints. | Base |
+| `sourcecoop_survival_spawn_timeout` | `-1` | Number of seconds after the map starts (after initial timer) to allow spawning in, or `-1` for no time limit. | Base |
+| `sourcecoop_difficulty` | `0` | Sets the difficulty - from `0` (base difficulty) and up. | Difficulty |
+| `sourcecoop_difficulty_auto` | `2` | Sets automatic difficulty mode. `-1` disables. `0` balances difficulty between min and max convars. Values above 0 set the difficulty increment per player, ignoring the min and max cvars. | Difficulty |
+| `sourcecoop_difficulty_auto_min` | `1` | When automatic difficulty mode is set to `0`, this is the difficulty at `1` player. | Difficulty |
+| `sourcecoop_difficulty_auto_max` | `20` | When automatic difficulty mode is set to `0`, this is the difficulty at max players. | Difficulty |
+| `sourcecoop_difficulty_announce` | `1` | Toggles announcing changes in difficulty. | Difficulty |
+| `sourcecoop_difficulty_ignoredmgto` | `"npc_headcrab;npc_barnacle;npc_puffballfungus"` | List of classnames where player->npc damage is exempt from difficulty scaling. Separated by semicolon. | Difficulty |
+| `sourcecoop_difficulty_ignoredmgfrom` | `"npc_puffballfungus"` | List of classnames where npc->player damage is exempt from difficulty scaling. Separated by semicolon. | Difficulty |
+| `sourcecoop_earbleed_default` | `0` | Sets the default setting of the earbleed player preference. | Earbleed |
+| `sourcecoop_fpd_fade_ms` | `1500` | Duration in milliseconds to fade the first-person death screen to black. `0` to disable. | First Person Death |
+| `sourcecoop_fpd_player_toggle` | `1` | Enable players to choose death camera option regardless of server/map settings. | First Person Death |
+| `sourcecoop_logo_material` | `"sourcecoop/landing_screen"` | The material used for the landing screen. | Landing Screen |
+| `sourcecoop_revive_time` | `4.0` | Sets time that you have to hold `E` to revive. | Revive |
+| `sourcecoop_revive_score` | `1` | Sets score to give for reviving a player. | Revive |
+| `sourcecoop_revive_messages` | `0` | Shows messages such as `"You have started reviving x."` | Revive |
+| `sourcecoop_revive_ragdoll_effects_timer` | `4.0` | Delay for applying ragdoll highlighting effects. `-1` to disable all ragdoll effects. | Revive |
+| `sourcecoop_revive_ragdoll_particle` | `1` | Whether to spawn a particle inside player ragdolls to improve their visibility. | Revive |
+| `sourcecoop_revive_ragdoll_blink` | `1` | Whether to blink player ragdolls to improve their visibility. | Revive |
+| `sourcecoop_revive_in_classic_mode` | `1` | Whether to allow reviving in non-survival mode. | Revive |
+| `sourcecoop_killfeed_default` | `0` | Sets the default setting of the killfeed player preference. | Scoring |
+| `sourcecoop_thirdperson_enabled` | `1` | Is thirdperson enabled? | Thirdperson |
+| `sourcecoop_next_stuck` | `60.0` | Prevents using stuck for this many seconds after using. | Unstuck |
+| `sourcecoop_voting_autoreload` | `1` | Sets whether to reload all votemap menu entries on mapchange, which can prolong map loading times. | Voting |
+| `sourcecoop_voting_skipintro` | `1` | Allow skip intro voting? | Voting |
+| `sourcecoop_voting_restartmap` | `1` | Allow restart map voting? | Voting |
+| `sourcecoop_voting_changemap` | `1` | Allow change map voting? | Voting |
+| `sourcecoop_voting_survival` | `2` | Allow survival mode voting? Use one of the values from `sourcecoop_survival_mode` to select the mode to vote for. | Voting |
+| `sourcecoop_workshop_message` | `"Missing map! Subscribe to SourceCoop workshop collection + restart game"` | The message to display to players missing workshop maps. Supported placeholders: `{BSPNAME}`. | Workshop |
#### Toggleable Features
@@ -130,34 +213,24 @@ ConVar: `sc_ft <0 or 1>`
>
> It is recommended to leave these features at the default values as these are configured per map within EDT configurations. __Modifying feature values could negatively impact the gameplay experience__.
-| Feature | Description |
+| **Feature** | **Description** |
|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------|
-| FIRSTPERSON_DEATHCAM | Enables the first-person death camera. |
-| HEV_SOUNDS | Enables HEV sounds. |
-| INSTANCE_ITEMS | Instances pickup items and weapons for each player. Instanced items disappear once picked up and 'respawn' along with the player. |
-| INSTANCE_ITEMS_NORESET | If enabled, items will not 'respawn' picked up items after death. |
-| KEEP_EQUIPMENT | Makes players spawn with previously picked up equipment (suit, weapons). Global for all players. |
-| STRIP_DEFAULT_EQUIPMENT | Removes default multiplayer equipment. |
-| STRIP_DEFAULT_EQUIPMENT_KEEPSUIT | |
-| DISABLE_CANISTER_DROPS | Disables item drops when players die in multiplayer. |
-| NO_TELEFRAGGING | Prevents teleporting props and players from slaying other players. |
-| NOBLOCK | Prevents player-on-player collisions. (This feature requires `mp_teamplay 1` to fix smoothness issues.) |
-| SHOW_WELCOME_MESSAGE | Shows players a greeting message with basic plugin info. |
-| AUTODETECT_MAP_END | Detects commonly used commands for ending singleplayer maps from `point_clientcommand` and `point_servercommand` entities and changes the map. At first, this feature checks `sourcecoop_homemap` is set (see below), then checks if `nextmap` is set. If none are set, the map is not changed. Recommended to keep enabled. |
-| CHANGELEVEL_FX | Show visual effects (spawn particles) at level change locations. |
-| TRANSFER_PLAYER_STATE | Enables player persistence through level changes. Currently, players will carry over their health, armor and equipment for the first spawn point (checkpoint) in the map. Afterwards, the default map equipment is used. |
-
-## 🌎 Campaign Support
-
-
-
-- [Main Campaign](https://store.steampowered.com/app/362890/Black_Mesa/)
-- [Stojkeholm](https://steamcommunity.com/sharedfiles/filedetails/?id=2320533262)
-- [Emergency 17](https://steamcommunity.com/sharedfiles/filedetails/?id=934371395)
-
-SourceCoop __allows single-player map configurations__ without decompiling and redistributing; __learn more about creating your own__ on the [EDT Map Script Format](https://github.com/ampreeT/SourceCoop/wiki/EDT---Map-script-format).
-
-## Contributing
+| `FIRSTPERSON_DEATHCAM` | Enables the first-person death camera. |
+| `HEV_SOUNDS` | Enables HEV sounds. |
+| `INSTANCE_ITEMS` | Instances pickup items and weapons for each player. Instanced items disappear once picked up and 'respawn' along with the player. |
+| `INSTANCE_ITEMS_NORESET` | If enabled, items will not 'respawn' picked up items after death. |
+| `KEEP_EQUIPMENT` | Makes players spawn with previously picked up equipment (suit, weapons). Global for all players. |
+| `STRIP_DEFAULT_EQUIPMENT` | Removes default multiplayer equipment. |
+| `STRIP_DEFAULT_EQUIPMENT_KEEPSUIT` | |
+| `DISABLE_CANISTER_DROPS` | Disables item drops when players die in multiplayer. |
+| `NO_TELEFRAGGING` | Prevents teleporting props and players from slaying other players. |
+| `NOBLOCK` | Prevents player-on-player collisions. (This feature requires `mp_teamplay 1` to fix smoothness issues.) |
+| `SHOW_WELCOME_MESSAGE` | Shows players a greeting message with basic plugin info. |
+| `AUTODETECT_MAP_END` | Detects commonly used commands for ending singleplayer maps from `point_clientcommand` and `point_servercommand` entities and changes the map. At first, this feature checks `sourcecoop_homemap` is set (see below), then checks if `nextmap` is set. If none are set, the map is not changed. Recommended to keep enabled. |
+| `CHANGELEVEL_FX` | Show visual effects (spawn particles) at level change locations. |
+| `TRANSFER_PLAYER_STATE` | Enables player persistence through level changes. Currently, players will carry over their health, armor and equipment for the first spawn point (checkpoint) in the map. Afterwards, the default map equipment is used. |
+
+## 🌱 Contributing
__If you are looking to help with the development of the project__, we are always looking for more help! Heres some ways you can help:
@@ -173,7 +246,7 @@ __If you are interested in helping us__, contact us on [Discord](https://discord
### 🙏 Contributors
- __ampreeT__ :: [Steam](https://steamcommunity.com/id/ampreeT) | [GitHub](https://github.com/ampreeT) :: programming, reverse engineering, map editing
-- __kasull__ :: [Steam](https://steamcommunity.com/id/kasull/) | [GitHub](https://github.com/kasullian) :: programming, reverse engineering, trailer production
+- __kasull__ :: [Steam](https://steamcommunity.com/id/kasull/) | [GitHub](https://github.com/kasullian) :: programming, reverse engineering
- __Alienmario__ :: [Steam](https://steamcommunity.com/id/4oM0/) | [GitHub](https://github.com/Alienmario) :: programming, reverse engineering, map editing
- __Balimbanana__ :: [Steam](https://steamcommunity.com/id/Balimbanana/) | [GitHub](https://github.com/Balimbanana) :: programming, reverse engineering
- __Rock__ :: [Steam](https://steamcommunity.com/id/Rock48/) | [GitHub](https://github.com/Rock48) :: programming, map editing
diff --git a/images/logo-sc.png b/images/logo-sc.png
new file mode 100644
index 0000000000000000000000000000000000000000..91bbe5d94d26e969aa4a8cdb4d6e685394075f8a
GIT binary patch
literal 45855
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