diff --git a/README.md b/README.md index 1fd3c22..4eb0d11 100644 --- a/README.md +++ b/README.md @@ -5,21 +5,53 @@ * FFMPEG * youtube-dl * On game server: - * custom sourcemod - * sm-ext-AsyncSocket extension - * smjansson extension - * SMJSONAPI plugin - * sm-ext-Voice extension + * [custom sourcemod](https://github.com/BotoX/sourcemod) + * [sm-ext-AsyncSocket extension](https://git.botox.bz/CSSZombieEscape/sm-ext-AsyncSocket) + * [smjansson extension](https://forums.alliedmods.net/showthread.php?t=184604) + * [SMJSONAPI plugin](https://git.botox.bz/CSSZombieEscape/sm-plugins/src/branch/master/SMJSONAPI) or [here](https://cloud.botox.bz/s/TDRq7XwMFmW8NeQ) + * [sm-ext-Voice extension](https://git.botox.bz/CSSZombieEscape/sm-ext-Voice) ## 1. Install * Install python3 and python-virtualenv - * Create a virtualenv: `virtualenv venv` + * Create a virtualenv: `python3 -m venv venv` * Activate the virtualenv: `. venv/bin/activate` * Install all dependencies: `pip install -r requirements.txt` ## 2. Usage Set up game server stuff. + +You need to have SourceTV enabled and use the vaudio_celt voice codec: +`cstrike/cfg/autoexec.cfg ` +``` +// Server Cvars +sv_consistency 0 +sv_pure -1 + +// Source TV +tv_allow_camera_man 0 +tv_autorecord 0 +tv_delay 0 +tv_enable 1 +tv_maxclients 16 +tv_maxrate 0 +tv_name "TorchTV" +tv_transmitall 1 +tv_chattimelimit 1 + +sv_voicecodec "vaudio_celt" + +map de_dust2 +``` + +Don't put `+map` into your startup cmdline. + Adapt config.json. ##### Make sure you are in the virtualenv! (`. venv/bin/activate`) Run: `python main.py` + + +### Dectalk + * Install wine + * Run as normal user (not root) + * Run torchlight with: `xvfb-run -a python main.py` diff --git a/Torchlight/AsyncClient.py b/Torchlight/AsyncClient.py index 7461b18..3a8db2c 100755 --- a/Torchlight/AsyncClient.py +++ b/Torchlight/AsyncClient.py @@ -80,7 +80,7 @@ class AsyncClient(): Data = json.dumps(obj, ensure_ascii = False, separators = (',', ':')).encode("UTF-8") - with (await self.SendLock): + async with self.SendLock: if not self.Protocol: return None diff --git a/Torchlight/Commands.py b/Torchlight/Commands.py index 0aa3c47..70be785 100755 --- a/Torchlight/Commands.py +++ b/Torchlight/Commands.py @@ -331,7 +331,7 @@ class OpenWeather(BaseCommand): import geoip2.database def __init__(self, torchlight): super().__init__(torchlight) - self.GeoIP = self.geoip2.database.Reader("/usr/share/GeoIP/GeoLite2-City.mmdb") + self.GeoIP = self.geoip2.database.Reader("/var/lib/GeoIP/GeoLite2-City.mmdb") self.Triggers = ["!w", "!vv"] self.Level = 0 @@ -713,7 +713,7 @@ class Say(BaseCommand): asyncio.ensure_future(self.Say(player, Language, message[1])) return 0 -''' + class DECTalk(BaseCommand): import tempfile def __init__(self, torchlight): @@ -753,7 +753,7 @@ class DECTalk(BaseCommand): asyncio.ensure_future(self.Say(player, message[1])) return 0 -''' + class Stop(BaseCommand): def __init__(self, torchlight): diff --git a/Torchlight/PlayerManager.py b/Torchlight/PlayerManager.py index 7e000f8..05bd7f1 100755 --- a/Torchlight/PlayerManager.py +++ b/Torchlight/PlayerManager.py @@ -2,7 +2,6 @@ # -*- coding: utf-8 -*- import asyncio import logging -import numpy from .Constants import * class PlayerManager(): @@ -10,7 +9,7 @@ class PlayerManager(): self.Logger = logging.getLogger(__class__.__name__) self.Torchlight = master - self.Players = numpy.empty(MAXPLAYERS + 1, dtype = object) + self.Players = [None] * (MAXPLAYERS + 1) self.Storage = self.StorageManager(self) self.Torchlight().GameEvents.HookEx("player_connect", self.Event_PlayerConnect) @@ -68,7 +67,7 @@ class PlayerManager(): self.Storage.Reset() - for i in range(1, self.Players.size): + for i in range(1, len(self.Players)): if self.Players[i]: self.Players[i].OnDisconnect("mapchange") self.Players[i].OnConnect() @@ -90,7 +89,7 @@ class PlayerManager(): def __len__(self): Count = 0 - for i in range(1, self.Players.size): + for i in range(1, len(self.Players)): if self.Players[i]: Count += 1 return Count @@ -104,7 +103,7 @@ class PlayerManager(): return self.Players[key] def __iter__(self): - for i in range(1, self.Players.size): + for i in range(1, len(self.Players)): if self.Players[i]: yield self.Players[i] diff --git a/config.json b/config.json index c138e91..3dae1a8 100644 --- a/config.json +++ b/config.json @@ -1,13 +1,13 @@ { "VoiceServer": { - "Host": "10.0.0.101", + "Host": "127.0.0.1", "Port": 27020, "SampleRate": 22050 }, "SMAPIServer": { - "Host": "10.0.0.101", + "Host": "127.0.0.1", "Port": 27021 }, @@ -38,10 +38,16 @@ "ChatCooldown": 15 }, + "Advertiser": + { + "MaxSpan": 30, + "AdStop": 10 + }, + "TorchRCON": { "Host": "0.0.0.0", - "Port": 27015, + "Port": 27115, "Password": "***" }, diff --git a/requirements.txt b/requirements.txt index 5bf5fe2..2272c72 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,21 +1,7 @@ aiohttp -appdirs -async-timeout beautifulsoup4 -certifi -chardet gTTS -gTTS-token -idna lxml -multidict -numpy -olefile -packaging Pillow -pyparsing python-magic -requests -six -urllib3 -yarl \ No newline at end of file +geoip2