Skip to content

Proxy for SCP: Secret Laboratory allowing you to link multiple servers into one!

License

Notifications You must be signed in to change notification settings

not-pyroman/XProxy

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GitHub Downloads (all assets, all releases) Discord

XProxy

Proxy for SCP: Secret Laboratory allowing you to link multiple servers into one!

Features

  • Virtual lobby - Allowing you to select specific server which you want to connect to.
  • Queue system - If server is full you will be added to queue and when system detects if theres free slot and then you will be connected.
  • Fallback system - Server shutdowns or timeouts without any reason you will be connected to available server.

Pterodactyl Egg proxy.json

Setup

  1. Depending if you use linux or windows download proper installer

  2. Make sure you have Dotnet 7.0 Runtime installed

  3. Run proxy by using XProxy.exe on windows or XProxy on linux.

  4. Configure config.yml inside Data folder, if you have verkey you need to create verkey.txt and put verkey here.

  5. Every server under proxy needs to be hidden on serverlist CENTRAL COMMAND !private and config_gameplay.txt needs to have

enable_ip_ratelimit: false

enable_proxy_ip_passthrough: true
trusted_proxies_ip_addresses:
 - <IP OF YOUR PROXY>
  • Replace <IP OF YOUR PROXY> with public ip if your proxy is not running on same machine or with local ip, if you dont know which ip to set just before adding ip just connect to server via proxy and check console.

Placeholders

These placeholders can be used in lobby hint or server name.

Placeholder Desc
%playersInQueue_<server>% Shows amount of players in queue to specific server.
%onlinePlayers_<server>% Shows amount of online players on specific server.
%maxPlayers_<server>% Shows amount of maximum players on specific
%proxyOnlinePlayers% Shows total amount of connected players to proxy.
%proxyMaxPlayers% Shows maximum amount of player which can connect to proxy.

FAQ

  • If you see logs like that image this means your console is not supporting ANSI colors !

  • Inside config_patcher.yml change AnsiColors to false !

  • Make sure to set proper game version in config_patcher.yml because auto updater will be not downloading proper builds and you will be not able to connect to this server.

Servers using XProxy

  • If you want to test how proxy works on existing servers you can try joining these:
IP Name
45.79.40.209:9000 image

Central Commands

Command Arguments Description
!public Shows your server on serverlist.
!private Hides your server from serverlist.
!api show/reset/clear Manage your SCP: SL api key.

Console Commands

Command Arguments Description
servers Shows all servers.
players Shows players playing on servers.
send all/id@steam serverName Sends all players or target to specific server.
maintenance toggle Toggles maintenance
maintenance servername name Changes server name set when maintenance is enabled.
reload Reloads configs.
sendhint message Sends hint to all players.
broadcast message Sends broadcast to all players.

Lobby Commands

Command Arguments Description
.connect serverName Connects you to specific server.
.servers Shows all servers.

Queue Commands

Command Arguments Description
.hub / .lobby Sends you back to lobby.

Default config

# Enables debug logs.
debug: false
# Language of messages.
langauge: 'en'
# Port which proxy will use to listen for connections.
port: 7777
# Email used for listing your server on SCP SL serverlist.
email: '[email protected]'
# Server name.
serverName: 'Example server name.'
# Server information.
pastebin: 'm4DqS5r0'
# Version of game.
gameVersion: '13.5.1'
# Maximum amount of players which can connect to your proxy.
maxPlayers: 50
# Priority servers used for first connection and fallback servers.
priorities:
- 'lobby'
# Available servers.
servers:
  'lobby':
    # Name of server.
    name: 'Lobby'
    # IP Address of target server.
    ip: '127.0.0.1'
    # Port of target server.
    port: 7777
    # Maximum amount of players which can connect to server.
    maxPlayers: 50
    # Connection type set to Proxied will connect players to specific server, simulation needs to have Simulation set to specific type example lobby
    connectionType: 'Simulated'
    # Simulation set when player connects to server, plugins can register custom ones and you need to specify type here.
    simulation: 'lobby'
    # PreAuth will contain IP Address of client and target server will set this ip address to that one only if enable_proxy_ip_passthrough is set to true and trusted_proxies_ip_addresses has your proxy ip!
    sendIpAddressInPreAuth: false
  'vanilla':
    # Name of server.
    name: 'Vanilla'
    # IP Address of target server.
    ip: '127.0.0.1'
    # Port of target server.
    port: 7778
    # Maximum amount of players which can connect to server.
    maxPlayers: 20
    # Connection type set to Proxied will connect players to specific server, simulation needs to have Simulation set to specific type example lobby
    connectionType: 'Proxied'
    # Simulation set when player connects to server, plugins can register custom ones and you need to specify type here.
    simulation: '-'
    # PreAuth will contain IP Address of client and target server will set this ip address to that one only if enable_proxy_ip_passthrough is set to true and trusted_proxies_ip_addresses has your proxy ip!
    sendIpAddressInPreAuth: true
# User permissions
users:
  'admin@admin':
    # If player can join when maintenance is enabled.
    ignoreMaintenance: true
# If maintenance mode is enabled.
maintenanceMode: false
# Name of server visbile on serverlist when maintenance mode is enabled.
maintenanceServerName: 'Maintenance mode'
# Auto updates proxy if needed.
autoUpdater: true

Default language ( you can submit translations via issues )

proxyVersion: 'Running version (f=green)%version%(f=white) for game version (f=green)%gameVersion%(f=white)'
proxyIsUpToDate: 'Proxy is up to date!'
proxyIsOutdated: 'Proxy is outdated, new version (f=green)%version%(f=white)'
downloadingUpdate: 'Downloading update (f=green)%percentage%%(f=white)...'
downloadedUpdate: 'Downloaded update!'
playerTag: '(f=white)[(f=darkcyan)%serverIpPort%(f=white)] [(f=cyan)%server%(f=white)]'
playerErrorTag: '(f=red)[(f=darkcyan)%serverIpPort%(f=red)] [(f=cyan)%server%(f=red)]'
proxy: 'proxy'
currentServer: 'current server'
serverIsOfflineKickMessage: 'Server %server% is offline!'
proxyStartedListeningMessage: 'Listening on server (f=green)0.0.0.0:%port%(f=white)'
proxyClientClosedConnectionMessage: '%tag% Client (f=green)%address%(f=white) ((f=green)%userid%(f=white)) closed connection."'
proxyClientDisconnectedWithReasonMessage: '%tag% Client (f=green)%address%(f=white) ((f=green)%userid%(f=white)) disconnected with reason (f=green)%reason%(f=white).'
commandRegisteredMessage: 'Command (f=green)%name%(f=white) registered!'
commandAlreadyRegisteredMessage: 'Command (f=green)%name%(f=yellow) is already registered!'
commandNotExistsMessage: 'Unknown command %name%, type "help"'
configLoadedMessage: 'Loaded config!'
configSavedMessage: 'Saved config!'
tokenLoadedMessage: 'Verification token loaded! Server probably will be listed on public list.'
tokenReloadedMessage: 'Verification token reloaded.'
centralCommandMessage: '[(f=green)%command%(f=white)] %message%'
verificationChallengeObtainedMessage: 'Verification challenge and response have been obtained.'
failedToUpdateMessage: 'Could not update server data on server list - %error%'
receivedTokenMessage: 'Received verification token from central server.'
messageFromCentralsMessage: '[(f=green)MESSAGE FROM CENTRAL SERVER(f=white)] %message%'
tokenSavedMessage: 'New verification token saved.'
tokenFailedToSaveMessage: 'New verification token could not be saved: (f=green)%error%(f=red)'
passwordSavedMessage: 'New password saved.'
passwordFailedToSaveMessage: 'New password could not be saved.'
cantUpdateDataMessage: 'Could not update data on server list.'
cantRefreshPublicKeyMessage: 'Can''t refresh central server public key - invalid signature!'
cantRefreshPublicKey2Message: 'Can''t refresh central server public key - %message% %response%!'
obtainedPublicKeyMessage: 'Downloaded public key from central server.'
serverListedMessage: 'Server is listed on serverlist!'
noDependenciesToLoadMessage: 'No dependencies to load.'
loadedAllDependenciesMesssage: 'Successfully loaded all (f=green)%loaded%(f=white) dependencies!'
pluginDisabledMessage: '[(f=darkcyan)%current%/%max%(f=white)] Plugin (f=green)%name%(f=white) is disabled!'
pluginHasMissingDependenciesMessage: '[(f=darkcyan)%current%/%max%(f=white)] Plugin (f=green)%name%(f=white) failed to load, missing dependencies'
pluginMissingDependencyMessage: '                                          - (f=green)%name%(f=white) %version%'
pluginInvalidEntrypointMessage: '[(f=darkcyan)%current%/%max%(f=white)] Plugin (f=green)%name%(f=white) don''t have any valid entrypoints!'
pluginLoadedMessage: '[(f=darkcyan)%current%/%max%(f=white)] Plugin (f=green)%name%(f=white) loaded!'
noPluginsToLoadMessage: 'No plugins to load.'
loadedAllPluginsMesssage: 'Successfully loaded all (f=green)%loaded%(f=white) plugins!'
pluginsLoadedAndFailedToLoadMessage: 'Loaded (f=green)%loaded%(f=white) plugins and (f=red)%failed%(f=white) failed to load!'
loadedPublicKeyFromCache: 'Loaded central server public key from cache.'
downloadPublicKeyFromCentrals: 'Downloading public key from central server...'
preAuthIsInvalidMessage: 'Preauth is invalid for connection (f=green)%address%(f=yellow) failed on (f=green)%failed%(f=yellow)'
maintenanceDisconnectMessage: 'Client (f=green)%address%(f=white) ((f=green)%userid%(f=white)) server is (f=yellow)under maintenance(f=white)!'
playerRedirectToMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) redirect to (f=green)%server%(f=white)!'
playerRoundRestartMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) roundrestart, time %time%.'
playerSentChallengeMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) sent (f=green)challenge(f=white)!'
playerIsConnectingMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) is connecting...'
playerConnectedMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) connected!'
playerNetworkExceptionMessage: '%tag% Exception while updating network for client (f=green)%address%(f=red) ((f=green)%userid%(f=red)), %message%'
playerUnbatchingExceptionMessage: '%tag% Exception while unbatching message for (f=green)%address%(f=red) ((f=green)%userid%(f=red)) from %condition%, %message%'
playerExceptionSendToProxyMessage: '%tag% Exception while sending message to proxy for (f=green)%address%(f=red) ((f=green)%userid%(f=red)), %message%'
playerExceptionSendToServerMessage: '%tag% Exception while sending message to current server for (f=green)%address%(f=red) ((f=green)%userid%(f=red)), %message%'
playerServerIsOfflineMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) server is offline!'
playerDelayedConnectionMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) delayed for (f=green)%time%(f=white) seconds.'
playerServerIsFullMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) server is full.'
playerBannedMessage: '%tag% (f=green)%address%(f=white) ((f=green)%useid%(f=white)) banned for (f=red)%reason%(f=white), expires (f=red)%date% %time%(f=white).'
playerReceivedChallengeMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) received (f=green)challenge(f=white).'
playerDisconnectedMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) disconnected, reason (f=green)%reason%(f=white)'
playerDisconnectedWithReasonMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) disconnected, reason (f=green)%reason%(f=white)'
playerServerTimeoutMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) server timeout.'
playerServerShutdownMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) server shutdown.'
lobbyConnectedMessage: '%tag% (f=green)%address%(f=white) ((f=green)%userid%(f=white)) connected to lobby!'
lobbyConnectingToServerHint: 'Connecting to <color=green>%server%</color>...'
lobbyMainHint:
- '<b>LOBBY</b>'
- '<color=orange>%proxyOnlinePlayers%</color>/<color=orange>%proxyMaxPlayers%</color>'
- ''
- 'Servers'
- '%serversLine1%'
- '%serversLine2%'
- ''
- 'You will join server <color=green>%server%</color>'
- ''
- 'Press <color=orange>Q</color> to change server which you want to join, hold <color=orange><b>Q</b></color> to join.'
lobbyServerLine1: '<color=%selectedColor%>%server%</color>'
selectedServerColor: 'green'
defaultServerColor: 'white'
lobbyServerLine2: '<color=orange>%onlinePlayers%</color>/<color=orange>%maxPlayers%</color>'
positionInQueue: 'Position <color=orange><b>%position%</b></color>/<color=orange>%totalInQueue%</color>'
firstPositionInQueue: '<color=green>Position</color> <color=orange><b>%position%</b></color>/<color=orange>%totalInQueue%</color>'
lostConnectionHint: '<color=yellow><b>XProxy</b></color>

  Server is not responding for <color=green><b>%time%</b></color> seconds...'
searchingForFallbackServerHint: '<color=yellow><b>XProxy</b></color>

  Searching for fallback server...'
onlineServerNotFoundHint: '<color=yellow><b>XProxy</b></color>

  <color=red>Can''t find any online servers, disconnecting...</color>'
connectingToServerHint: '<color=yellow><b>XProxy</b></color>

  Connecting to server <color=green>%server%</color>...'
maintenanceKickMessage: 'Server is under maintenance!'

About

Proxy for SCP: Secret Laboratory allowing you to link multiple servers into one!

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 99.9%
  • Dockerfile 0.1%