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 @@ +
+ +SourceCoop + +--- + [![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 + +

+ +Black Mesa - +Steam Workshop Collection +

+ +- [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 @@ -
+SourceCoop -SourceCoop + + + ---- - -[![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 -

- -Black Mesa - -Steam Workshop Collection -

+

Black Mesa - Steam Workshop Collection

- [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 zcmYjS3piA1AD<@0sxcS|VWI|;+!7L|X3XWxWG3c z61WL2G8v#ys1yn$sbn%}LsEr6u9~3Y&;UwokY`i?PK|>E05U)c=AqNbAxwOvKQ4rY zzbD!>QDyL=M!z8)`-P)Q801H&O0gX}Z9H9%oNLsXYtpGo+0OMNw4bm{4c~P!!}>w7 z2~-!1^7A2G%Cvf0k5n`w<{A--Mx6@+YhND{lTQ5FTMXB8?92v56POC2XhKLU4G#w3 z01D9c-R8-2DF6N5Uq%BGLw8Tr=^hHiWgm2TRjYROwjDO1A(o<*-6^iuVGg7wkNa$`Bov1!`Koswo629x#3d4*@R}cY1 zu4Gz?^DWB1wX00BQ*)>t`4+G1bc31rnR;Z?F&hx1QfXkqjuRF%DrLCTsIy=*7zpB* zGp&56lr)}OMUovzfD--?=a?Sh7RKKDyjq_M0D=fN^;ZLH0X)v0KB0M5luLE0?Rb?z za~5W%0m-D3pl(6hV6n;cd1NRHpU-!`U5IYZ#z2QzlWNOm5ardVgpl1(mA)dgw%jeP z$G3v9L?Z236>9vf!QJo8WR)9O3~*T0-v}7 zemXfR5t-Q3E-6)O#!*}Jr`l2r=~~Oj|9DCzVD<8=n`Aig)mAE_;O&rS8T1d@1K0ZE zFxBuRyb}bDsw)`oQtj0Ss-$DAN-F!{e3fFWvFB@DRgO|A(EbP+O65mGF=RHVDW0kh z?!(m(p-owBAXDDAd=9!2L-RpUwd-mXD3$X^G|tRV3ysz@#1iRAvQ|FQY%dJ9nnfkz z+37VLc6^)x$G|JP;A~ZlSeHKGLIZ9U^zcO+EG>(SnmGFHH!vnYY7|wLu6cFWHB}UJ z#pNQl;Nnu`YCj%fOZksun~6EThZ}b~AxH!Zeqr$Nr?$o0^T_4y#6#Y9vYZpA{+*`i zOncOorln_+F<_*fpvU#y(f3;_D+2L@S;PJ}*aWwsxD{^7cBB*G`ldB)Y;ckU7413o-MhiwwR!_x0wXUYSxKw$sE zRhs@HU!!kLg!2Vc)Je<>*Or^?7f=825RdhD-2k5ag~1Mw2;FmPM>1c`<|Sh0Xy1qh z8vEyyV(=2QVbdiCkE@GWe&<}&sS8;a z&8>5*2BpzbGus7&_jzoumzveZ{ay#ftc5-PEw0nz-XWN)IiB$PzdM?jb;GNXTQ8Qm zkEZsqJjT|`=5a^Oi**J(#hNYsa~8zcomW@eKWW`}2;D9E(CV$Tv~DQ9&G=I6f3D}x zmj{nr=?;x6iJXZi4LqLCC!Na(>KSNoO3@(;=pN%fW%Wtnnzu6FZ9@*0zWXdfDd}== z^aCOG60doBDk#`RGwAxqdeZ<4akKIABcJZ~ksXS%X5n;~C}uqB^Gv+(@$1SupQ_Vt z%NfyrkvaCV(V+u7YMCCgQHjaE4Pu8x`9=ji{@RHi7oq&&#?B9Y^b@ssnT=+^aJKcg zZ!xp+=OdqS?@DCb>ckPBGD;eA^!O zPz$YnIJ7sRYoBD<#_Vy7`|Q-zSsoId_MO6^WBtvRKm8QVKXdug4@Cz#g*9)-BFF-q zT}Sb!m7xm3qWq@ay+YEfTaTj0%LZGW@{s7Vkl7Bee(B}VE!Wn{PFYa?`i0$=sK=$x z}9Q&)S>16oKAExw*%cj$F`QR!u~=?HAH0AIuyKD(eT(VX>Vc#2Dqg6rb?-{F47V7myoA{47?btRG2l^hK1 zxZ-dV-!pI$=QTxt(t$+4ejNnYL3<8h6>wFt+QZ!gY4>1t829jIz|+Bj=D=}o1f-JJ zA*f}Rl}2}U(Y#VGEgF_oD|lj%m$H%-vgkMYJc!!M#CkGvspWu4)OyI2kjO0>OhU04 zoqHL5VuCZJip>PaqgsB8hXR*z50skQnr2uZu5~TSsabC(*Uh4+NRYCh$yVTi zV#nU$p>Lket{GyhM(*#~s;(tB4AzuU;mCR1LBk&Qf}}$9vmuZQIAX8|!wx2~?<+P3 zGEZ@Gnh_6PRZI|>|hwkC;<5&sS(_m9BGfwmB=+8}_0M%{*yVsrBO z-vg^baBC2jo#6N1aOyRPEdoAguTO5!iuygZJIotn!a9)Kr;^-r+{zMGEk^_Fu~ku8 zbt^ZB+}D8+GW_{qJ@EnRWh1kEk+ zMpV<0h4pCv6TVu(&ME1X?^Dd=o`{{?KxH*9zQ^b++ruw`HXtwuNJ_Xi{$*kZ0bdD( zQyI-W(}2Zq1hpBna*12J>IS*5PE8L>>?cd>QC12<5v!$E-~<$%SXSH)e!JpVu8u)Z zze%ZiZ4G<)4j6;ip6$U1&kTEDVpFuJNmx`zl8=ffZ;4T{!OC^(`nI6wF!ZU1J;QJ|7 zc4B5@D1B!Yhz(7y$^+V}Q7I7zwB0{Vr!8YsuNzy(rmDvN`ukI8bXPaE&bAWYgR~y* z_%Yxy4xi)zQx-_>wJ~Ptn!jr4Z}?ZZoCYj;gV;-D_I3vLFc@~w3j6zXJ8)B{2cHgM zE&jGjSHDN4tHMPO0ZD{L?rEn@s6*O2>D=b<G{gW>IOOQ&X|*{40{&x1*)M{MsjG=283m=7q5d9jx%I zTYD16u<{yLSjj1QZIF2EjriK%HFG;Tyme{tvV*aa3%}`$ol8(JjVX55Jh@RaG*)rX zR!*|(7QwOULJ?3E3vCNJxsAz@oJqas1bb$nH*=O}%HFsRtM>TGOCcVLzkNQ(lhIIn zC=tmu+X5T9&;xbVW4F+@NohAsxdzG?WKv#Tg=1YKig+*DfX05y8J zOKvj9dm#8B9Js)lk<%*;I}}vyt*X1d_K+ zOryOse6(*?^?_>$|HS|nj@(PnH-Ps#$gZpRV$^6Mh+HPa<7)&04}~Qnva18vN%3qf!JJ0bla%;ag*C~)(*7S$cQMu1P-EYHC}RgI^DO}zpg7mgaU}ceoh|IN17TQg;poE9l{jrc z1G#-#ha1qsClQj|zk!e+0~5J#+V}zQ3Y##s~5!!Mr zMYSiUQLov*4LaAa+>(`tD6L6*qjGkM-)Q-e#%gat%*xegJ`!Xt^Qf8J8=avsR*yoJpi=_Vle#IpL-uA$9PEidf&EY3LhL*Ra(L{XHUKzE@pE>Q)-vp{>$&o3IcTuVG8 zv7dv~nKH5B2gLQ4l~Kv{Ppxws=b79@>>RsUlv}YWo9^!DBB!mgaKn>|C*!mQCU+#z zAH;S63V~vw*NIhDC(jHU1P}cAe&Tg#GVH1VsmlPilMz5aoZA`Sm&B>un~U6vO*u5} z2VQec;R88`_K!G~%P}s`VDtqsyqvTp+PMYa@725%o|>FppcT)#z?0YYhvw+uW&D>5 z^*;gz;ry=Hwg%=^#TITjxo4r)x1aP;FQmJiG{^;bU!s$9fC=K7sr9Iy%jAv#F}<*D zi#|36^3YaGp)Upfp0l^c#lxw?1Bl^HdNo#+w~TZlnoHR{*(3 z+21&qfA#TndSz2(~u}6QBf1SHb-Zg=J^zzTp(Y~Q5?4l#ik}fZAIf( zQrC$a0x@X=b(yf1T&eX*&hRq1_p;y0d9oZimCgmKc1C!{HehvnjHKqYyygVsT%k{5 z=JL7NpTQ9alUp=y#kKb!?<2dgFDd$8~J%IaI%zh_F zX&#UUpp)HXhV(&-f#uPQR%=~dB#2-PJpp)Q3MeYF1+vQ zpZne}a0z?1XXiQ3InVcd&U2pkoL2yiZluqUI73h#U?wOxFu*@l3*rTiDkyBcey+Vc z3<>4zJ$OPmuo%=*AiBF?KST|%St-eEs{Xwt6oCd<_D*`mOmqw60HgmKxQlod%xF42#c0~#>Ky@P)hOYi_fv>{Woa!wX-5)JAfO- zLST!8#Y_)JsVaJ`7I^cO>Fmy2&D$SlFz59YQauS+mSW9@uNg5chIi6l;PFXsaqD&i zKsCrPP0&4p9xb9Hq9cT8{r1#^I2!IY(cJ7K)sp~#u4}Aa{vLTh6ybC_cskyVA1g*g zpJ9mTDILBB3Ef6UgyWeu5!13T3iDBw(5*XU|_o(;ar0TXyFjIlDLSSX}9uN|aI|!9COB$lJLJ z5kV{H0J+eiqBJz5*87ho+PY9N>-GdbWP^3-_8^ z*|02)KCTFqQndQo$@ns#?C%OuN?|8fptHS6kDWTpc+lE5d(eQsUFcnr;dqkV^mg@P zd+u?bPa4O?D>bAo&7z>>0vI|N2IAK)wr;G`3$MDW_7t3%f9Ozlw2(w&NKREs7{^yaFQR>YVYdTrwa&!MtE+4WNy)8j{? zfXHwsBEp5sH#vXhCU@_*Qe1H@utI`X+u6p@*VG-^SZV+k4#yUB{as*GL%U-Az9QzO zOdz+&iz_0GYqbrmoRiGlPxd2WVSyYIl<#0$fmcj3)9!14)jw@h9GVumu9IVjvmiB| zUQP#BZ#S~>`%sc9V@z?12Vchf>0tTFQ%DRmo>klqrcOe3|LX=d%{K27Asv}Dm`4| z3TnhOH!I7^yz}{7UsvJ~1hy|~b-q(H@gUkvMBGaJzb%Sdl=7miqhhJTx{TLsU>hr7 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 @@ SourceCoop - - - - +[![](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 @@ -SourceCoop +SourceCoop -[![](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 + +

Black Mesa - Steam Workshop Collection

+ +- [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 - -

Black Mesa - Steam Workshop Collection

- -- [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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 literal 0 HcmV?d00001 diff --git a/scripts/setup-srccoop-bms-ec2.sh b/scripts/setup-srccoop-bms-ec2.sh deleted file mode 100644 index 480df0d..0000000 --- a/scripts/setup-srccoop-bms-ec2.sh +++ /dev/null @@ -1,125 +0,0 @@ -#!/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 diff --git a/scripts/srccoop-bms-linux-install.sh b/scripts/srccoop-bms-linux-install.sh new file mode 100644 index 0000000..8c03a34 --- /dev/null +++ b/scripts/srccoop-bms-linux-install.sh @@ -0,0 +1,106 @@ +#!/bin/bash -e + +# Install packages for SteamCMD and Black Mesa Dedicated Server. +sudo dpkg --add-architecture i386 +sudo apt-get update -y +sudo apt-get install unzip -y +sudo apt-get install wget -y +# Required for running SteamCMD. +sudo apt-get install lib32gcc-s1 -y +# Required for running Black Mesa Dedicated Server. +sudo apt-get install lib32stdc++6 -y +sudo apt-get install libncurses5 libncurses5:i386 -y + +# Install SteamCMD. +mkdir -p "./SteamCMD" +wget "http://media.steampowered.com/client/steamcmd_linux.tar.gz" -O ".tmp.tar.gz" +tar -xf ".tmp.tar.gz" -C "./SteamCMD" +rm ".tmp.tar.gz" + +# Install Black Mesa Dedicated Server. +# TODO: Check error code of process and early exit on failure. +mkdir -p "./Black Mesa Dedicated Server" +echo -e "force_install_dir \"../Black Mesa Dedicated Server\"\nlogin anonymous\napp_update 346680\nquit" | ./SteamCMD/steamcmd.sh + +# Install the latest version of Metamod Source. +wget $(wget -qO- "https://www.sourcemm.net/downloads.php" | grep " "./Black Mesa Dedicated Server/srcds_coop.sh" +chmod +x "./Black Mesa Dedicated Server/srcds_coop.sh" + +# Create a `mapcycle.txt` consisting of the starting chapter maps. +map_cycle_txt=$(cat << EOF +bm_c0a0a +bm_c1a0a +bm_c1a1a +bm_c1a2a +bm_c1a3a +bm_c1a4a +bm_c2a1a +bm_c2a1a +bm_c2a2a +bm_c2a3a +bm_c2a4a +bm_c2a4e +bm_c2a5a +bm_c3a1a +bm_c3a2a +bm_c4a1a +bm_c4a2a +bm_c4a3a +EOF +) +echo "$map_cycle_txt" > "./Black Mesa Dedicated Server/bms/mapcycle.txt" + +# Create a `server.cfg` with ideal default settings. +server_cfg=$(cat << EOF +// SourceCoop settings. +mp_timelimit 0 // Prevents map switch from round timers. +mp_fraglimit 0 // Prevents the match from ending when a player has a high enough score. +mp_teamplay 1 // Enables the scientist team. +mp_friendlyfire 0 // Disables friendly fire. +mp_forcerespawn 1 // Forces the player to respawn. + +// Add your settings below. +hostname "Black Mesa: Cooperative" // The name of the server. +sv_password "" // Sets a server password for locking the server. +rcon_password "" // Sets a RCON password for accessing adminstrative features. This is not recommended and SourceMod should be used instead. +EOF +) +echo "$server_cfg" > "./Black Mesa Dedicated Server/bms/cfg/server.cfg" + +# Empty the default `autoexec.cfg` as it does nothing for the server. +> "./Black Mesa Dedicated Server/bms/cfg/autoexec.cfg" + +# Create an empty `userconfig.cfg` to suppress console warnings. +> "./Black Mesa Dedicated Server/bms/cfg/userconfig.cfg" \ No newline at end of file diff --git a/scripts/srccoop-bms-windows-install.ps1 b/scripts/srccoop-bms-windows-install.ps1 index badb88a..1f64ce7 100644 --- a/scripts/srccoop-bms-windows-install.ps1 +++ b/scripts/srccoop-bms-windows-install.ps1 @@ -1,10 +1,13 @@ -# Download and extract SteamCMD. +$ErrorActionPreference = "Stop" + +# Install 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. +# TODO: Check error code of process and early exit on failure. 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 @@ -28,8 +31,75 @@ Invoke-WebRequest -OutFile ".tmp.zip" -Uri ((Invoke-WebRequest "https://api.gith Expand-Archive -LiteralPath ".tmp.zip" -DestinationPath "./Black Mesa Dedicated Server/bms" Remove-Item -Path ".tmp.zip" -Force -# OPTIONAL: Remove textures to save ~9 GB. -# 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 +## OPTIONAL: Remove textures to save ~9 GB. +## 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 + +# Commented out due to stdout being malformed. +## Install Alien Swarm: Reactive Drop Dedicated Server. +## The default `srcds.exe` will always spawn a new console while the `srcds_console.exe` that is shipped with Alien Swarm: Reactive Drop does not. +## https://github.com/Facepunch/garrysmod-issues/issues/3771#issuecomment-1507467323 +#New-Item -Name "Alien Swarm Reactive Drop" -ItemType Directory +#Start-Process -FilePath "./SteamCMD/steamcmd.exe" -ArgumentList '+force_install_dir "../Alien Swarm Reactive Drop"', "+login anonymous", "+app_update 582400", "+quit" -Wait -NoNewWindow +#Copy-Item "./Alien Swarm Reactive Drop/srcds_console.exe" -Destination "./Black Mesa Dedicated Server" -Force +#Remove-Item -Path "./Alien Swarm Reactive Drop" -Force -Recurse + +# Create a script to run and automatically restart the server. +$srcds_coop_bat = @' +@echo off +echo [%time%] Starting Black Mesa Dedicated Server.. + +:loop +start /WAIT /B srcds.exe -nomessagebox -console -insecure -game bms +maxplayers 32 +map bm_c0a0a +echo [%time%] Restarting Black Mesa Dedicated Server.. +timeout 5 > nul +goto loop +'@ +Set-Content -Path "./Black Mesa Dedicated Server/srcds_coop.bat" -Value $srcds_coop_bat + +# Create a `mapcycle.txt` consisting of the starting chapter maps. +$map_cycle_txt = @' +bm_c0a0a +bm_c1a0a +bm_c1a1a +bm_c1a2a +bm_c1a3a +bm_c1a4a +bm_c2a1a +bm_c2a1a +bm_c2a2a +bm_c2a3a +bm_c2a4a +bm_c2a4e +bm_c2a5a +bm_c3a1a +bm_c3a2a +bm_c4a1a +bm_c4a2a +bm_c4a3a +'@ +Set-Content -Path "./Black Mesa Dedicated Server/bms/mapcycle.txt" -Value $map_cycle_txt + +# Create a `server.cfg` with ideal default settings. +$server_cfg = @' +// SourceCoop settings. +mp_timelimit 0 // Prevents map switch from round timers. +mp_fraglimit 0 // Prevents the match from ending when a player has a high enough score. +mp_teamplay 1 // Enables the scientist team. +mp_friendlyfire 0 // Disables friendly fire. +mp_forcerespawn 1 // Forces the player to respawn. + +// Add your settings below. +hostname "Black Mesa: Cooperative" // The name of the server. +sv_password "" // Sets a server password for locking the server. +rcon_password "" // Sets a RCON password for accessing adminstrative features. This is not recommended and SourceMod should be used instead. +'@ +Set-Content -Path "./Black Mesa Dedicated Server/bms/cfg/server.cfg" -Value $server_cfg + +# Empty the default `autoexec.cfg` as it does nothing for the server. +Set-Content -Path "./Black Mesa Dedicated Server/bms/cfg/autoexec.cfg" -Value "" + +# Create an empty `userconfig.cfg` to suppress console warnings. +Set-Content -Path "./Black Mesa Dedicated Server/bms/cfg/userconfig.cfg" -Value "" \ No newline at end of file From f5f5b78d2af866a22127836034b69513f19b0993 Mon Sep 17 00:00:00 2001 From: ampreeT <61920833+ampreeT@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:21:09 -0700 Subject: [PATCH 7/9] shortened table --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3fa294c..ad782f5 100644 --- a/README.md +++ b/README.md @@ -182,12 +182,12 @@ If you have already created native cooperative support for your map by including | `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_difficulty_ignoredmgto` | | List of classnames where player->npc damage is exempt from difficulty scaling. Separated by semicolon. | Difficulty | +| `sourcecoop_difficulty_ignoredmgfrom` | | 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_logo_material` | | 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 | From 746c5a1e0c2f93173bce066196cb5167e0e1a7cf Mon Sep 17 00:00:00 2001 From: ampreeT <61920833+ampreeT@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:35:02 -0700 Subject: [PATCH 8/9] fixed header ids --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ad782f5..0570cef 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,11 @@ It currently supports ## 🖥️ 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. @@ -66,7 +67,7 @@ The script installation will automatically go through the process of installing ./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) +- 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" @@ -98,10 +99,11 @@ The script installation will automatically go through the process of installing - 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) +- [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. @@ -115,6 +117,7 @@ In order for players to able to join the server, you will need to only forward t | `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

Black Mesa - Steam Workshop Collection

@@ -127,6 +130,7 @@ SourceCoop __allows single-player map configurations__ without decompiling and r 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 @@ -230,6 +234,7 @@ ConVar: `sc_ft <0 or 1>` | `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: @@ -241,6 +246,7 @@ __If you are looking to help with the development of the project__, we are alway __If you are interested in helping us__, contact us on [Discord](https://discord.gg/Fh77rxQaEB) or create a pull request. + ## 📸 Credits ### 🙏 Contributors From 83bf2430df79969d361cd2ea06c849538e8e9b56 Mon Sep 17 00:00:00 2001 From: ampreeT <61920833+ampreeT@users.noreply.github.com> Date: Fri, 30 Aug 2024 22:12:36 -0700 Subject: [PATCH 9/9] updated srcds_coop --- scripts/srccoop-bms-linux-install.sh | 2 +- scripts/srccoop-bms-windows-install.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/srccoop-bms-linux-install.sh b/scripts/srccoop-bms-linux-install.sh index 8c03a34..50eba21 100644 --- a/scripts/srccoop-bms-linux-install.sh +++ b/scripts/srccoop-bms-linux-install.sh @@ -52,7 +52,7 @@ rm ".tmp.zip" srcds_coop_bash=$(cat << EOF #!/bin/bash -./srcds_run -console -insecure -game bms +maxplayers 32 +map bm_c0a0a +./srcds_run -console -game bms -ip 0.0.0.0 +maxplayers 32 +mp_teamplay 1 +map bm_c0a0a EOF ) echo "$srcds_coop_bash" > "./Black Mesa Dedicated Server/srcds_coop.sh" diff --git a/scripts/srccoop-bms-windows-install.ps1 b/scripts/srccoop-bms-windows-install.ps1 index 1f64ce7..f1fc800 100644 --- a/scripts/srccoop-bms-windows-install.ps1 +++ b/scripts/srccoop-bms-windows-install.ps1 @@ -52,7 +52,7 @@ $srcds_coop_bat = @' echo [%time%] Starting Black Mesa Dedicated Server.. :loop -start /WAIT /B srcds.exe -nomessagebox -console -insecure -game bms +maxplayers 32 +map bm_c0a0a +start /WAIT /B srcds.exe -nomessagebox -console -game bms -ip 0.0.0.0 +maxplayers 32 +mp_teamplay 1 +map bm_c0a0a echo [%time%] Restarting Black Mesa Dedicated Server.. timeout 5 > nul goto loop