├── chatfun
├── ouch.txt
├── rail.txt
├── fuckyou.txt
├── hit.txt
├── gay.txt
├── kill.txt
├── cookies.txt
├── README.md
├── beer.txt
├── fuck.txt
└── shit.txt
├── Map_Names
├── README.md
└── Map_Names.txt
├── scripts
├── wipeout.factories
└── mappool_wipeout.txt
├── linux_tools
├── ServerStatus.py
├── autodownload.sh
├── download_new.sh
├── redownload.sh
├── README.md
└── server_reboot.py
├── teamsize.py
├── restartonlybots.py
├── echo.py
├── highping.py
├── commands.py
├── mapmonitor.py
├── autobalance.py
├── getmap.py
├── specall.py
├── mapLimiter.py
├── voicechat.py
├── doVote.py
├── listmaps.py
├── myFun
├── Working_Sounds.txt
└── README.md
├── restartserver.py
├── funwarmup.py
├── handicap.py
├── commlink.py
└── inviteonly.py
/chatfun/ouch.txt:
--------------------------------------------------------------------------------
1 | ^7Do you need a bandaid {}^7? Don't cry.
2 | ^7Do you need a bandaid {}^7? Don't cry.
3 | ^7Do you need a bandaid {}^7? Don't cry.
4 |
--------------------------------------------------------------------------------
/chatfun/rail.txt:
--------------------------------------------------------------------------------
1 | ^7Get some skill {}^7. The rail is just a weapon.
2 | ^7Get some skill {}^7. The rail is just a weapon.
3 | ^7Get some skill {}^7. The rail is just a weapon.
4 |
--------------------------------------------------------------------------------
/chatfun/fuckyou.txt:
--------------------------------------------------------------------------------
1 | ^7Why so mean {}^7? Masturbation relieves stress.
2 | ^7Why so mean {}^7? Masturbation relieves stress.
3 | ^7Why so mean {}^7? Masturbation relieves stress.
4 |
--------------------------------------------------------------------------------
/chatfun/hit.txt:
--------------------------------------------------------------------------------
1 | ^7{}^7 slaps {}^7 in the face with a rocket launcher.
2 | ^7If {}^7 slaps {}^7 the bitch scream might make everyone deaf.
3 | {}^7 pulls out his LG and slaps {}^7 with the butt end.
4 | {}^7's hand hurts from slapping {}^7 repeatedly.
5 |
--------------------------------------------------------------------------------
/Map_Names/README.md:
--------------------------------------------------------------------------------
1 | # USE THIS Map_Names.txt file with the listmaps.py on the main plugins page.
2 |
3 | Put the Map_Names.txt into your Quake Live server install directory, typically /qlds
4 |
5 | Keep the format of the file if you edit it to add maps or correct errors.
6 |
7 | Feel free to upload additions/corrections.
8 |
--------------------------------------------------------------------------------
/chatfun/gay.txt:
--------------------------------------------------------------------------------
1 | ^7Are you saying you are gay {}^7?
2 | ^7Hug a gay person {}^7, it might make you feel better.
3 | ^7Gays are people too {}^7.
4 | ^7Why do you have to bash on being gay {}^7? Hiding something?
5 | ^7Oh, you're straight? Well, so is spaghetti until it gets hot and wet.
6 | ^7Why did God create gay men? So fat girls could dance.
7 | ^7Are you saying you are gay {}^7?
8 | ^7Are you saying you are gay {}^7?
9 |
--------------------------------------------------------------------------------
/scripts/wipeout.factories:
--------------------------------------------------------------------------------
1 | [{
2 | "cvars": {
3 | "roundtimelimit": "18000",
4 | "g_startingweapons": "8447",
5 | "g_startingAmmo_rg": "50",
6 | "g_startingAmmo_rl": "50",
7 | "g_startingAmmo_gl": "15",
8 | "g_startingAmmo_lg": "200",
9 | "g_startingAmmo_pg": "200",
10 | "g_startingAmmo_sg": "50",
11 | "g_startingAmmo_hmg": "200",
12 | "g_startingAmmo_mg": "200",
13 | "dmflags": "28",
14 | "g_startingArmor": "100",
15 | "g_startingHealthBonus": "0",
16 | "g_startingHealth": "200",
17 | "g_allowKill": "0",
18 | "g_overtime": "0"
19 | },
20 | "author": "BarelyMiSSeD",
21 | "description": "Wipeout gametype",
22 | "basegt": "ca",
23 | "id": "wipeout",
24 | "title": "Wipeout"
25 | }]
--------------------------------------------------------------------------------
/chatfun/kill.txt:
--------------------------------------------------------------------------------
1 | {}^7 shoots {}^7 in the ass with a rocket.
2 | {}^7 had fun watching {}^7 elplode from all the LG fire.
3 | {}^7 stuck a Rail Gun up {}^7's ass and watched the rail come out of his head.
4 | {}^7 likes to watch {}^7 explode from rocket fire.
5 | ^7The gauntlet is the perfect weapon for {}^7 to kill {}^7 REPEATEDLY.
6 | ^7Who wants to see {}^7 shove his machine gun up {}^7's nose and shoot?
7 | {}^7 doesn't like having to clean {}^7's brains off of his gauntlet.
8 | {}^7 is a big fan of Face Rockets, especially in {}^7's face.
9 | {}^7 grabs his machine gun and shoots {}^7 in the back of the head.
10 | ^7The cops can't prove {}^7 killed {}^7. The rocket blew him away.
11 | {}^7 doesn't want to kill {}^7, but the rocket doesn't have that problem.
12 | ^7All the bullets from {}^7's HMG are making {}^7 leak all over the floor.
13 | {}^7 made a big mess in here with {}^7's brains.
14 | {}^7 is ligning up a rail shot on {}^7 right now.
15 | ^7Do you think {}^7 will go to jail if {}^7 shows up dead?
16 |
--------------------------------------------------------------------------------
/linux_tools/ServerStatus.py:
--------------------------------------------------------------------------------
1 | # ServerStatus.py is a plugin for minqlx to:
2 | # -Store the current player count into the redis database to be read by server_reboot.py
3 | # created by BarelyMiSSeD on 1-4-2020
4 | #
5 |
6 | import minqlx
7 |
8 | COUNT_KEY = "minqlx:connected" # Must match CHECK_KEY in server_reboot.py (should not need to edit)
9 |
10 | VERSION = "1.1"
11 |
12 |
13 | class ServerStatus(minqlx.Plugin):
14 | def __init__(self):
15 | self.add_hook("player_loaded", self.handle_player_loaded)
16 | self.add_hook("player_disconnect", self.handle_player_disconnect)
17 |
18 | self.save_count()
19 |
20 | def handle_player_loaded(self, player):
21 | self.save_count()
22 | return
23 |
24 | def handle_player_disconnect(self, player, reason):
25 | self.save_count()
26 | return
27 |
28 | @minqlx.delay(2)
29 | def save_count(self):
30 | connected_count = len(self.players())
31 | if connected_count < 0:
32 | connected_count = 0
33 | self.db.set(COUNT_KEY, connected_count)
34 |
--------------------------------------------------------------------------------
/scripts/mappool_wipeout.txt:
--------------------------------------------------------------------------------
1 | # specify 1 map per line, mapname|factoryid
2 | # ex: aerowalk|ffa
3 | # see factories.txt for valid factory id values
4 | 6plusplus|wipeout
5 | almostlost|wipeout
6 | asylum|wipeout
7 | brimstoneabbey|wipeout
8 | campgrounds|wipeout
9 | ca_tamb|wipeout
10 | chemicalreaction|wipeout
11 | corrosion|wipeout
12 | cowsmap|wipeout
13 | deepinside|wipeout
14 | devilish|wipeout
15 | dreadfulplace|wipeout
16 | eviscerated|wipeout
17 | foolishlegacy|wipeout
18 | henhouse|wipeout
19 | hiddenfortress|wipeout
20 | intervention|wipeout
21 | leftbehind|wipeout
22 | leviathan|wipeout
23 | limbus|wipeout
24 | lockdown|wipeout
25 | monastery|wipeout
26 | overkill|wipeout
27 | prodcmap7|wipeout
28 | proverek2|wipeout
29 | psidm7|wipeout
30 | purgatory|wipeout
31 | quarantine|wipeout
32 | realmofsteelrats|wipeout
33 | repent|wipeout
34 | retribution|wipeout
35 | terminatria|wipeout
36 | theedge|wipeout
37 | theoldendomain|wipeout
38 | tornado|wipeout
39 | trinity|wipeout
40 | ts_ca1|wipeout
41 | warehouse|wipeout
42 | windsongkeep|wipeout
43 |
--------------------------------------------------------------------------------
/chatfun/cookies.txt:
--------------------------------------------------------------------------------
1 | ^1Q^7: What cookie makes you rich? ^1A^7: A fortune cookie!
2 | ^1Q^7: Why did the cookie cry? ^1A^7: Because his mother was a wafer so long!
3 | ^7For me? Thank you, {}!
4 | ^7Why do we cook bacon and bake cookies?
5 | ^1Q^7: When should you take a cookie to the doctor? ^1A^7: When it feels crummy.
6 | ^1Q^7: What do the cookie and the computer have in common? ^1A^7: They both have chips.
7 | ^7For me? Thank you, {}!
8 | ^1Q^7: How can you tell a blonde's baking chocolate chip cookies? ^1A^7: M&M shells are all over the floor
9 | ^1Q^7: What is green and brown and crawls through the grass? ^1A^7: A Girl Scout who has lost her cookie
10 | ^1Q^7: What kind of keys to kids like to carry? ^1A^7: Cookies!
11 | ^1Q^7: Why do basketball players love cookies? ^1A^7: Because they can dunk them!
12 | ^7For me? Thank you, {}!
13 | ^1Q^7: What did the Gingerbread Man put on his bed? ^1A^7: A cookie sheet!
14 | ^1Q^7: What is a monster's favorite food? ^1A^7: Ghoul scout cookies.
15 | ^7For me? Thank you, {}!
16 | ^7I LOVE cookies {}^7!! Do you have some cookies for me?
17 | ^7I LOVE cookies {}^7!! Do you have some cookies for me?
18 |
--------------------------------------------------------------------------------
/linux_tools/autodownload.sh:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 | timestamp() {
3 | date +"%T"
4 | }
5 |
6 | me=`basename "$0"`
7 | echo "========== $me has started. =========="
8 | echo "========= $(date) ========="
9 |
10 | workshopFile='workshop.txt'
11 | steamCMD='/home/steam/steamcmd'
12 | installLocation='/home/steam/steamcmd/steamapps/common/qlds'
13 | workshopIDs=`cat $installLocation/baseq3/$workshopFile | grep -v '#' | sed '/^[ \t]*$/d'`
14 | numOfIDs=`echo "$workshopIDs" | wc -l`
15 | counter=0
16 |
17 | while [ $counter -lt $numOfIDs ]; do
18 | currentID=`echo $workshopIDs | awk '{ print $1 }'`
19 | workshopIDs=`echo $workshopIDs | cut -d ' ' -f2-`
20 | echo -e "$(timestamp) Downloading item $(expr $counter + 1) of $numOfIDs from Steam with id $currentID"
21 | $steamCMD/steamcmd.sh +login anonymous +force_install_dir /home/steam/steamcmd/steamapps/common/qlds/ +workshop_download_item 282440 $currentID +quit > /dev/null
22 | if [ $? -ne 0 ]; then
23 | echo -e "$(timestamp) Download of id $currentID failed with steamcmd error code $?"
24 | else
25 | echo -e "$(timestamp) Download of id $currentID completed"
26 | fi
27 | ((counter++))
28 | done
29 | echo "=== Done === $(date) ==="
30 | exit 0
31 |
--------------------------------------------------------------------------------
/teamsize.py:
--------------------------------------------------------------------------------
1 | # teamsize.py is a plugin for minqlx to:
2 | # -limit the teamsize admins are able to set when using !teamsize or !ts
3 | # created by BarelyMiSSeD on 7-12-2019
4 | #
5 | """
6 | //Set these cvar(s) in your server.cfg (or wherever you set your minqlx variables).:
7 | set qlx_teamsizemin "2"
8 | set qlx_teamsizemax "12"
9 | """
10 |
11 | import minqlx
12 |
13 | VERSION = "v1.00"
14 |
15 |
16 | class teamsize(minqlx.Plugin):
17 | def __init__(self):
18 | self.add_command(("teamsize", "ts"), self.cmd_teamsize, priority=minqlx.PRI_HIGH)
19 |
20 | # Cvar(s).
21 | self.set_cvar_once("qlx_teamsizemin", "2")
22 | self.set_cvar_once("qlx_teamsizemax", "12")
23 |
24 | def cmd_teamsize(self, player, msg, channel):
25 | if len(msg) < 2:
26 | return
27 | try:
28 | n = int(msg[1])
29 | except ValueError:
30 | return
31 | if n > self.get_cvar("qlx_teamsizemax", int):
32 | player.tell("^6That teamsize is too large")
33 | return minqlx.RET_STOP_ALL
34 | elif n < self.get_cvar("qlx_teamsizemin", int):
35 | player.tell("^6That teamsize is too small")
36 | return minqlx.RET_STOP_ALL
37 |
--------------------------------------------------------------------------------
/linux_tools/download_new.sh:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 | timestamp() {
3 | date +"%T"
4 | }
5 |
6 | me=`basename "$0"`
7 | echo "========== $me has started. =========="
8 | echo "========= $(date) ========="
9 |
10 | workshopFile='workshop.txt'
11 | steamCMD='/home/steam/steamcmd'
12 | installLocation='/home/steam/steamcmd/steamapps/common/qlds'
13 | workshopIDs=`cat $installLocation/baseq3/$workshopFile | grep -v '#' | sed '/^[ \t]*$/d'`
14 | numOfIDs=`echo "$workshopIDs" | wc -l`
15 | counter=0
16 |
17 | while [ $counter -lt $numOfIDs ]; do
18 | currentID=`echo $workshopIDs | awk '{ print $1 }'`
19 | workshopIDs=`echo $workshopIDs | cut -d ' ' -f2-`
20 | if [ ! -d "$installLocation/steamapps/workshop/content/282440/$currentID" ]; then
21 | echo -e "$(timestamp) Downloading item $(expr $counter + 1) of $numOfIDs from Steam with id $currentID"
22 | $steamCMD/steamcmd.sh +login anonymous +force_install_dir $installLocation/ +workshop_download_item 282440 $currentID +quit
23 | if [ $? -ne 0 ]; then
24 | echo -e "$(timestamp) Download of id $currentID failed with steamcmd error code $?"
25 | else
26 | echo -e "$(timestamp) Download of id $currentID completed"
27 | fi
28 | else
29 | echo -e "Steam directory for workshop item $currentID already exists, skipping."
30 | fi
31 | ((counter++))
32 | done
33 | echo "=== Done === $(date) ==="
34 | exit 0
35 |
--------------------------------------------------------------------------------
/chatfun/README.md:
--------------------------------------------------------------------------------
1 | # Chatfun.py
2 |
3 | I created this plugin to create a little bit of fun on the server that doesn't ahve to do with playing.
4 |
5 | The server will respond to things said in the server in chat and with some !commands.
6 |
7 | Put the chatfun.py and all the text files in the minqlx plugins directory.
8 |
9 | Use !fun to see what commands will get a repsonse.
10 |
11 |
12 | Command(s) available with chatfun.py listed with the set permission level.
13 |
14 | • Permission level 4
15 |
16 | !chatfun
17 |
18 | Turns the automatic response to certain words said in normal chat on or off.
19 | This will override the setting in the config until the server is restarted.
20 |
21 | Usage: !chatfun on|off
22 |
23 |
24 | CVARs to be set. The settings are shown with the default settings. Set these in the same config file you set the other minqlx bot cvars.
25 |
26 |
27 | set qlx_chatfunAdmin "4" - Sets the minqlx permission level needed to turn the chatfun auto responses on/off in game with
28 | !chatfun . This will override the qlx_chatfunReply setting until the server is restarted.
29 | set qlx_chatfunPauseTime "5" - Sets the amount of seconds between each response from the server.
30 | set qlx_chatfunReply "1" - Turns on/off the auto responses from the server to trigger text said in normal chat.
31 |
--------------------------------------------------------------------------------
/restartonlybots.py:
--------------------------------------------------------------------------------
1 | # This is an extension plugin for minqlx.
2 | # Copyright (C) 2018 BarelyMiSSeD (github)
3 |
4 | # You can redistribute it and/or modify it under the terms of the
5 | # GNU General Public License as published by the Free Software Foundation,
6 | # either version 3 of the License, or (at your option) any later version.
7 |
8 | # You should review a copy of the GNU General Public License
9 | # along with minqlx. See .
10 |
11 | # This is a plugin for the minqlx admin bot.
12 | # It kicks bots out of a server if they are the only ones remaining
13 |
14 | """
15 | // Enable to restart the server when only bots remain. Disabling it will kick all bots when only bots remain.
16 | // (0=disable, 1=enable)
17 | set qlx_rboRestartServer "0"
18 | """
19 |
20 | import minqlx
21 |
22 | VERSION = "1.1"
23 |
24 |
25 | class restartonlybots(minqlx.Plugin):
26 | def __init__(self):
27 | self.set_cvar_once("qlx_rboRestartServer", "0")
28 |
29 | self.add_hook("player_disconnect", self.handle_player_disconnect)
30 |
31 | def handle_player_disconnect(self, player, reason):
32 | self.check_players()
33 |
34 | @minqlx.delay(5)
35 | def check_players(self):
36 | bots_count = 0
37 | players = self.players()
38 | for player in players:
39 | if str(player.steam_id)[0] == "9":
40 | bots_count += 1
41 |
42 | if bots_count > 0 and bots_count == len(players):
43 | if self.get_cvar("qlx_rboRestartServer", bool):
44 | minqlx.console_print("^1Restarting server because no human players are connected.")
45 | minqlx.console_command("quit")
46 | else:
47 | minqlx.console_print("^1Kicking the bots because no human players are connected.")
48 | for player in players:
49 | player.kick()
50 |
--------------------------------------------------------------------------------
/linux_tools/redownload.sh:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 | timestamp() {
3 | date +"%T"
4 | }
5 |
6 | me=`basename "$0"`
7 | echo "========== $me has started. =========="
8 | echo "========= $(date) ========="
9 |
10 | workshopFile='workshop.txt'
11 | steamCMD='/home/steam/steamcmd'
12 | installLocation='/home/steam/steamcmd/steamapps/common/qlds'
13 | workshopIDs=`cat $installLocation/baseq3/$workshopFile | grep -v '#' | sed '/^[ \t]*$/d'`
14 | numOfIDs=`echo "$workshopIDs" | wc -l`
15 | counter=0
16 |
17 | if [ -f "$installLocation/steamapps/workshop/appworkshop_282440.acf" ]; then
18 | echo -e "Renaming workshop item file $installLocation/steamapps/workshop/appworkshop_282440.acf to appworkshop_282440.acf.old"
19 | mv -f $installLocation/steamapps/workshop/appworkshop_282440.acf $installLocation/steamapps/workshop/appworkshop_282440.acf.old
20 | fi
21 | if [ -d "$installLocation/steamapps/workshop/content/282440_old" ]; then
22 | rm -rf $installLocation/steamapps/workshop/content/282440_old
23 | fi
24 | if [ -d "$installLocation/steamapps/workshop/content/282440" ]; then
25 | echo -e "Renaming workshop directory $installLocation/steamapps/workshop/content/282440 to $installLocation/steamapps/workshop/content/282440_old"
26 | mv $installLocation/steamapps/workshop/content/282440 $installLocation/steamapps/workshop/content/282440_old
27 | fi
28 |
29 | while [ $counter -lt $numOfIDs ]; do
30 | currentID=`echo $workshopIDs | awk '{ print $1 }'`
31 | workshopIDs=`echo $workshopIDs | cut -d ' ' -f2-`
32 | echo -e "$(timestamp) Downloading item $(expr $counter + 1) of $numOfIDs from Steam with id $currentID"
33 | $steamCMD/steamcmd.sh +login anonymous +force_install_dir $installLocation/ +workshop_download_item 282440 $currentID +quit > /dev/null
34 | if [ $? -ne 0 ]; then
35 | echo -e "$(timestamp) Download of id $currentID failed with steamcmd error code $?"
36 | else
37 | echo -e "$(timestamp) Download of id $currentID completed"
38 | fi
39 | ((counter++))
40 | done
41 | echo "=== Done === $(date) ==="
42 | exit 0
43 |
--------------------------------------------------------------------------------
/chatfun/beer.txt:
--------------------------------------------------------------------------------
1 | {}^7 hands {}^7 an ice cold ^4Miller Lite^7.
2 | {}^7 gives {}^7 a rocky mountain cold ^4Coors Light^7.
3 | {}^7 hands {}^7 an ice cold ^4Miller Lite^7.
4 | {}^7 gives {}^7 a ^4Heineken^7 to enjoy.
5 | {}^7 slides a ^4Samuel Adams Boston Lager^7 to {}^7.
6 | {}^7 offers {}^7 a cold ^4Dos Equis^7.
7 | {}^7 tosses {}^7 a can of ^4Budweiser^7.
8 | {}^7 likes {}^7 and slides over a cold ^4Blue Moon^7 beer.
9 | {}^7 is trying to get {}^7 drunk on ^4Newcastle Brown Ale^7.
10 | {}^7 will give {}^7 a ^4Corona^7 for a blow job.
11 | {}^7 pops open a ^4Amstel Lager^7 and hands it to {}^7.
12 | {}^7 gives {}^7 an ice cold ^4Yuengling^7.
13 | {}^7 reaches in the coller and pulls out an ice cold ^4Michelob^7 for {}^7.
14 | {}^7 offers {}^7 a refreshing ^4Killian's Irish Red^7.
15 | {}^7 gets a ^4Sierra Nevada^7 and hands it to {}^7.
16 | {}^7 thinks this ^4Bass Ale^7 is just what {}^7 needs.
17 | {}^7 opens a cooler full of ^4Dogfish Head^7 and gets the coldest one for {}^7.
18 | {}^7 gets a ^4Sapparo Premium Lager^7 for {}^7.
19 | {}^7 thinks {}^7 deserves an ice cold ^4Molson Canadian^7.
20 | {}^7 hopes {}^7 will enjoy this ^4Cerveceria Modelo^7.
21 | ^7A ^4Labatt Blue^7 sounds like the perfect beer for {}^7 to give to {}^7.
22 | {}^7 tosses {}^7 a ^4St. Pauli Girl^7 Lager.
23 | {}^7 gives {}^7 a ^4Beck's^7 with all the ice cold condesation still dripping from it.
24 | {}^7 hands {}^7 a nice ^4Bitburger^7 Premium Beer.
25 | {}^7 gets a ^4Shiner Bock^7 for {}^7.
26 | {}^7 gets a ^4Magic Hat^7 beer for {}^7.
27 | {}^7 hands a bottle of ^4Foster's Lager^7 to {}^7.
28 | {}^7 hands {}^7 a six pack of ^4Coors Light^7.
29 | {}^7 has a lot of ^4Coors Light^7 and offers a can to {}^7.
30 | {}^7 is a big fan of ^4Hofbrauhaus^7 German beer and hands a bottle to {}^7.
31 | {}^7 knows that {}^7 likes Pabst ^4Blue Ribbon^7 and got some just for {}^7.
32 | {}^7 konws that {}^7 is a real Quake Player and got ^4Miller Genuine Draft^7 to celebrate.
33 | {}^7 hands {}^7 a cold ^4Browns Cherry Rasberry Ale^7.
34 | {}^7 gives a ice cold ^4Hofbrau Munchen Dunkel^7 to {}^7.
35 | {}^7 slides a ^4Weihenstephaner Lager^7 across the bar to {}^7.
36 | {}^7 gives a ice cold ^4Black Sheep Monty Python^7 to {}^7.
37 | {}^7 gives {}^7 a cold ^4Hoegaarden Witbier^7 to {}^7.
38 | {}^7 makes sure the ^4Steigl Pilsner^7 is ice cold and gives it to {}^7.
39 | {}^7 unzips his zipper and offers a ^4Staropramen Premium Lager^7 to {}^7 for a blow job.
40 | {}^7 hopes {}^7 likes this ice cold ^4Yanjing Pale Lager^7 from China.
41 | {}^7 thinks {}^7 is inot exotic beers and passes over an ice cold ^4Defiant Medusa IPA^7.
42 | {}^7 saves his ^4Brooklyn Brown Ale^7 for real Quake players and slides a cold one to {}^7.
43 |
--------------------------------------------------------------------------------
/chatfun/fuck.txt:
--------------------------------------------------------------------------------
1 | ^7That's a dirty mouth you have {}^7.
2 | ^7Are you asking how to fuck {}^7?
3 | ^7Put on a good show {}^7, no one likes a bad Fucker.
4 | ^1Fuck^7: ^31)^7 to have sexual intercourse with. ^32)^7 [Slang] To treat unfairly or harshly.
5 | ^7I am probably going to HELL for exessive use of the word FUCK. How about you {}^7?
6 | ^7The short answer is 'NO', the long answer is '^1FUCK NO^7'.
7 | ^7I hate it when people tell me swearing isn't necessary. I am FUCKING vulgar, not stupid.
8 | ^7You'r right, lets do this the dumbest fucking way possible since it's easier for you.
9 | ^7When i say 'Have a nice day.', remember that the ^1Fucker^7 is silent.
10 | ^7I konw I swear a lot. ^41)^7 I'm sorry. ^42)^7 I'll be good. ^43)^7 1&2 are lies. ^44)^1 Fuck Off!!!
11 | ^7I am currently experiencing life at a rate of Several ^4WTF's^7 per hour.
12 | ^7FaceBook asks 'What's on your mind?', it shoudl ask ^'3What's your fucking problem now?'
13 | ^7If you go home with somebody, and they don't have books, don't fuck 'em!
14 | ^7Style is knowing who you are, what you want to say, and not giving a FUCK.
15 | ^7If you can't say 'Fuck' you can't say, 'Fuck the government'.
16 | ^7What kind of fuckery is this?
17 | ^7If i'm going to fuck up my life, does it really matter which way i do it?
18 | ^7Who’d cum first, you or your clone {}^7? To find out, go fuck yourself!
19 | ^7You going to ^1fuck it^7 or kill it {}^7?
20 | ^7I like the word 'fuck'. The word means what it means, it also means whatever you need it to mean.
21 | ^7One middle finger isn't always enough to let someone know how you feel. Use both hands.
22 | ^7Keep your head up high and your middle finger higher {}^7.
23 | ^7Haters are like crickets, they chirp all fucking day and when you walk by them they shut the fuck up!
24 | ^7Im having one of those days where my middle finger is answering all my questions.
25 | ^7If you are asking how to fuck {}^7 try visiting PornHub.com
26 | ^7My attitude today is brought to you by, fuck you.
27 | ^7When I put on headphones, it seems like suddenly everybody wants to fucking talk.
28 | ^7I love the sound you make when you shut the fuck up.
29 | ^7If you have a problem, write it on a piece of paper, fold it up, and shove it up your fucking ass.
30 | ^7Please, just save us both some time, and Shut the fuck up.
31 | ^7Some people just need a high five, in the face with the CHAIR.
32 | ^7Sometimes I wish I was a bird. So I could fly over certain people and shit on their heads!
33 | ^7And by 'K...' I mean 'Fuck you.'
34 | ^7I'm working with two speeds today, slow and fuck you. Which one you want?
35 | ^7Didn't give a fuck yesterday, Don't give a fuck today, And I probably won't give a fuck tomorrow.
36 | ^7OFF is the general direction which you should fuck.
37 | ^7Sorry... I couldn't hear you over all the fuck I don't give.
38 |
--------------------------------------------------------------------------------
/chatfun/shit.txt:
--------------------------------------------------------------------------------
1 | ^7Don't shit in here {}^7. We don't want it to smell like your house.
2 | ^7Quiet {}^7. No one wants to hear you complain.
3 | ^7You have such a vast vocabulary {}^7.
4 | ^7Yours stinks like everyone else's {}^7, so shit in your own house.
5 | ^7Why are you advertising shitting {}^7? Think yours is pretty?
6 | ^7Stop describing the contents of your underwear {}^7.
7 | ^7You know it was a good shit when you come back and your screensaver is on.
8 | ^7Is there a Number 2 stain remover? {}^7's shorts are Fucked!!
9 | ^1Constipation^7: Same SHIT different day.
10 | ^7There's nothing worse than walking in on your mom having a shit... on dad!!!
11 | ^7How many of us look at the toilet paper after a wipe? How do the blind cope?
12 | ^7What is 6 inches long and starts with a ^1P^7? A shit.
13 | ^7Constipation sufferers just don't give a shit.
14 | ^7I just shit my pants. Serves me right for eating them in the first place.
15 | ^7I jsut looked up myself on the internet. Now my webcam smells like shit.
16 | {}^7 feels like shit in the morning, but his wife makes him stick to cornflakes.
17 | ^7Anyone else notice that it is impossible to scratch your ass without smelling your fingers after?
18 | ^7I just took my son's shitty diaper off. Not sure why I tried it on in the first place.
19 | ^7What all fortune cookies should say: You are about to take a massive shit in 10 minutes.
20 | ^7Guess who is still together after all that shit?... My ass cheeks.
21 | ^7My Chinese girlfriend said 'You shit in bed'.... So I did.
22 | ^7Confucius say: Crowded elevator always smell different to midget.
23 | ^7Confucius say: Man who fart in Church sit in own pew.
24 | ^7Definition of a fart: A turd honking for the right of way!
25 | ^7Definition of bravery: A man with diarrhea chancing a fart!
26 | ^7Definition of surprise: A fart with a lump in it!
27 | ^7Why do farts stink? So that deaf people can enjoy them too!
28 | ^7How can you tell if a woman is wearing pantyhose? If she farts, her ankles swell.
29 | ^7What do you get if you eat beans and onions? Tear Gas.
30 | ^7What's invisible and smells like carrots? Easter Bunny farts.
31 | ^1'Shit Ton'^7 is my favorite unit of measurement.
32 | ^7When hiring a prostitute in Amsterdam, never ask her to "sit on my face" in a 'shilly dutch akshent'
33 | ^7I felt shit earlier. Now my fingers stink!!
34 | ^7I went on the bus this morning. Probably should have gone before leaving the house though.
35 | ^7I don't konw why my wife complains. I shit a log today bigger than my cock and it didn't hurt much.
36 | ^7There are two reasons I never drink toilet water: Number 1 and Number 2.
37 | ^7My wife knocked on the door: 'Are you shitting love?' Me: ' No I am shitting shit.'
38 | ^7Fill a whoopee cushion with brown sauce to make it look like the person who sat on it has followed through.
39 | ^7Replace the fake turds with real ones to play a trick on the tricksters.
40 | ^7I am not saying it's cold outside, but I just tripped over some dog shit.
41 | ^7I was on the toilet once for so long, I finally said to myself, 'I'm getting too old for this shit'.
42 |
--------------------------------------------------------------------------------
/echo.py:
--------------------------------------------------------------------------------
1 | # This is an extension plugin for minqlx.
2 | # Copyright (C) 2018 BarelyMiSSeD (github)
3 |
4 | # You can redistribute it and/or modify it under the terms of the
5 | # GNU General Public License as published by the Free Software Foundation,
6 | # either version 3 of the License, or (at your option) any later version.
7 |
8 | # You should review a copy of the GNU General Public License
9 | # along with minqlx. See .
10 |
11 | # This is a plugin prints the command issuer and the command with arguments to the console
12 | # so they can be seen and logged.
13 | # It gets all the commands loaded on the server automatically.
14 | # Edit the DONT_ECHO list below to exclude the commands you don't want echoed.
15 | # The command !echo will show all the commands being echoed.
16 |
17 | import minqlx
18 | import time
19 |
20 | DONT_ECHO = ["elo", "elos", "bdm", "bdms", "bdsm", "teams", "teens", "a", "listsounds", "q", "s", "time", "rockets",
21 | "pummel", "airpummel", "grenades", "plasma", "airrail", "telefrag", "teamtelefrag", "speed"]
22 |
23 | VERSION = "1.7"
24 |
25 |
26 | class echo(minqlx.Plugin):
27 | def __init__(self):
28 | self.add_hook("command", self.handle_command, priority=minqlx.PRI_HIGHEST)
29 | self.add_command("echo", self.cmd_echo)
30 |
31 | self._server_commands = []
32 | self._command = [None, 0]
33 | self.populate_server_commands()
34 |
35 | def handle_command(self, caller, command, args):
36 | self.process_command(caller, command, args)
37 | return
38 |
39 | def process_command(self, caller, command, args):
40 | _name = command.name
41 | _time = time.time()
42 | if not str(caller).startswith("RconDummyPlayer") and _name in self._server_commands:
43 | if _name == self._command[0] and _time - self._command[1] < 0.1:
44 | return
45 | self._command = [_name, _time]
46 | minqlx.console_print("^1{} ^3issued command^7: {}".format(caller, args))
47 | return
48 |
49 | @minqlx.delay(10)
50 | def populate_server_commands(self):
51 | loaded_scripts = self.plugins
52 | for script, handler in loaded_scripts.items():
53 | try:
54 | for cmd in handler.commands:
55 | self._server_commands.append(cmd.name)
56 | except:
57 | continue
58 | for cmd in DONT_ECHO:
59 | for entry in self._server_commands:
60 | if cmd in entry:
61 | self._server_commands.remove(entry)
62 |
63 | def cmd_echo(self, player, msg, channel):
64 | self.list_echo(player)
65 | return
66 |
67 | @minqlx.thread
68 | def list_echo(self, player):
69 | count = 0
70 | echo_commands = []
71 | for entry in self._server_commands:
72 | count += len(entry)
73 | echo_commands += entry
74 | player.tell("^2Echoing {} commands^7: ^1{}".format(count, "^7, ^1".join(echo_commands)))
75 |
--------------------------------------------------------------------------------
/highping.py:
--------------------------------------------------------------------------------
1 | # This is an extension plugin for minqlx.
2 | # Copyright (C) 2020 BarelyMiSSeD (github)
3 | # https://github.com/BarelyMiSSeD/minqlx-plugins
4 |
5 | # You can redistribute it and/or modify it under the terms of the
6 | # GNU General Public License as published by the Free Software Foundation,
7 | # either version 3 of the License, or (at your option) any later version.
8 |
9 | # You should have received a copy of the GNU General Public License
10 | # along with minqlx. If not, see .
11 |
12 | # highping.py is a plugin for minqlx to:
13 | # - check players when they join a team for a ping that is higher than the setting.
14 | # - Put the players back to spec who do not meet the ping requirements
15 | # - allow admins to execute the high ping check on all players using the !999 command
16 |
17 | # created by BarelyMiSSeD on 3-16-2020
18 |
19 | """
20 | // sets the ping limit looked for when getting a players average ping
21 | set qlx_highpingMax "250"
22 | // sets the number of ping samples taken for each player checked
23 | // Adjust this lower/higher if the ping test results are taking too long or are inaccurate
24 | set qlx_highpingSamples "10"
25 | """
26 |
27 | import minqlx
28 | import time
29 |
30 | VERSION = "1.2"
31 |
32 |
33 | class highping(minqlx.Plugin):
34 | def __init__(self):
35 | super().__init__()
36 | self.set_cvar_once("qlx_highpingMax", "250")
37 | self.set_cvar_once("qlx_highpingSamples", "10")
38 | self.add_hook("team_switch", self.handle_team_switch)
39 | self.add_command("999", self.cmd_check_pings, 5)
40 |
41 | def handle_team_switch(self, player, old_team, new_team):
42 | self.check_ping(player, new_team)
43 |
44 | @minqlx.thread
45 | def check_ping(self, player, new_team):
46 | if new_team != "spectator":
47 | ping = 0
48 | samples = self.get_cvar("qlx_highpingSamples", int)
49 | for x in range(samples):
50 | ping += player.ping
51 | time.sleep(0.2)
52 | ping = ping / samples
53 | if ping >= self.get_cvar("qlx_highpingMax", int):
54 | player.put("spectator")
55 | player.tell("^1Your ping is too high to play on this server, as a result you were put to spectate.")
56 |
57 | def cmd_check_pings(self, player=None, msg=None, channel=None):
58 | self.check_pings()
59 |
60 | @minqlx.thread
61 | def check_pings(self):
62 | players = self.teams()
63 | teams = players['red'] + players['blue'] + players['free']
64 | pings = {}
65 | max_ping = self.get_cvar("qlx_highpingMax", int)
66 | samples = self.get_cvar("qlx_highpingSamples", int)
67 | for player in teams:
68 | pings[player.steam_id] = 0
69 | for x in range(samples):
70 | pings[player.steam_id] += player.ping
71 | time.sleep(0.2)
72 | pings[player.steam_id] = pings[player.steam_id] / samples
73 |
74 | for player, ping in pings:
75 | if ping >= max_ping:
76 | player.put("spectator")
77 | player.tell("^1Your ping is too high to play on this server, as a result you were put to spectate.")
78 |
--------------------------------------------------------------------------------
/commands.py:
--------------------------------------------------------------------------------
1 | # This is an extension plugin for minqlx.
2 | # Copyright (C) 2018 BarelyMiSSeD (github)
3 |
4 | # You can redistribute it and/or modify it under the terms of the
5 | # GNU General Public License as published by the Free Software Foundation,
6 | # either version 3 of the License, or (at your option) any later version.
7 |
8 | # You should have received a copy of the GNU General Public License
9 | # along with minqlx. If not, see .
10 |
11 | # This is a plugin and command listing script for the minqlx admin bot.
12 | # This plugin will list all the in game commands loaded on the server.
13 | """
14 | //Server Config cvars
15 | //Set the permission level needed to list the commands
16 | set qlx_commandsAdmin "0"
17 | //Enable to show only the commands the calling player can use, disable to show all commands (0=disable, 1=enable)
18 | set qlx_commandsOnlyEligible "1"
19 | """
20 |
21 | import minqlx
22 | from re import sub
23 |
24 | VERSION = "1.0"
25 |
26 |
27 | class commands(minqlx.Plugin):
28 | def __init__(self):
29 | # queue cvars
30 | self.set_cvar_once("qlx_commandsAdmin", "0")
31 | self.set_cvar_once("qlx_commandsOnlyEligible", "1")
32 |
33 | # Minqlx bot commands
34 | self.add_command("plugins", self.list_plugins, self.get_cvar("qlx_commandsAdmin", int))
35 | self.add_command(("lc", "listcmds", "listcommands"), self.cmd_list, self.get_cvar("qlx_commandsAdmin", int),
36 | usage="")
37 |
38 | def list_plugins(self, player, msg, channel):
39 | p = self.plugins
40 | s = set(p)
41 | message = []
42 | count = 0
43 | for i in s:
44 | count += 1
45 | if count % 7 or count == 0:
46 | message.append(i + "^7, ^6")
47 | else:
48 | message.append(i + "^7, ^6\n")
49 | if count:
50 | message[count - 1] = sub(r"\^[0-9][, \\n]", "", message[count - 1])
51 | player.tell("^1{} ^3Plugins found:".format(count))
52 | player.tell("^6{}".format("".join(message)))
53 |
54 | def cmd_list(self, player, msg, channel):
55 | p = self.plugins
56 | s = set(p)
57 | e = self.get_cvar("qlx_commandsOnlyEligible", bool)
58 | a = self.db.get_permission(player)
59 | player.tell("^1Plugin^7: ^2Number of Commands")
60 | count = 0
61 | search = msg[1].lower() if len(msg) > 1 else None
62 | for i in s:
63 | if search and search not in i.lower():
64 | continue
65 | message = []
66 | try:
67 | c = p[i].commands
68 | if len(c):
69 | for cmd in c:
70 | name = cmd.name
71 | b = cmd.permission
72 | c_list = []
73 | if e and a < b:
74 | continue
75 | for item in name:
76 | c_list.append(item)
77 | message.append("^7(^2{}^7) ^6{}".format(b, "^7|^6".join(c_list)))
78 | m = len(message)
79 | if m:
80 | player.tell("^1{}^7: {} ^3Command{}".format(i, m, "s" if m > 1 else ""))
81 | player.tell("{}".format("^7, ".join(message)))
82 | count += 1
83 | except:
84 | continue
85 | if not count:
86 | player.tell("^3No Plugin matches ^4{}".format(search))
87 |
--------------------------------------------------------------------------------
/mapmonitor.py:
--------------------------------------------------------------------------------
1 | # mapmonitor.py is a plugin for minqlx to:
2 | # -check on a map change for a change to a bad map
3 | # -If all players are disconnected on a map change it changes to the default map
4 | # -If enabled (default is enabled) the script will also change to the default map when all players disconnect
5 | # created by BarelyMiSSeD on 11-17-2018
6 | #
7 | """
8 | Set these cvars in your server.cfg (or wherever you set your minqlx variables).:
9 | set qlx_mmDefaultMap "almostlost ca" //set the default map and factory type
10 | set qlx_mmCheckTime "60" //The amount of time the script will check after a map change for a bad map
11 | set qlx_mmChangeWhenEmpty "1" //Enable to change to default map when all players disconnect (1=enabled, 0=disabled)
12 | """
13 |
14 | import minqlx
15 | import time
16 |
17 | Version = 1.5
18 |
19 |
20 | class mapmonitor(minqlx.Plugin):
21 | def __init__(self):
22 | # cvars
23 | self.set_cvar_once("qlx_mmDefaultMap", "almostlost ca")
24 | self.set_cvar_once("qlx_mmCheckTime", "60")
25 | self.set_cvar_once("qlx_mmChangeWhenEmpty", "1")
26 |
27 | # Minqlx bot Hooks
28 | self.add_hook("map", self.handle_map)
29 | self.add_hook("player_disconnect", self.handle_player_disconnect)
30 | self.add_hook("console_print", self.handle_console_print)
31 | self.add_hook("game_end", self.handle_game_end)
32 |
33 | # Minqlx bot commands
34 | self.add_command("map", self.map_change, 2, usage=" [factory]")
35 |
36 | # Script Variables
37 | self._map_change_time = 0.0
38 | self.map_changed = True
39 | self.player_count = 0
40 |
41 | def handle_map(self, mapname, factory):
42 | self._map_change_time = time.time()
43 |
44 | @minqlx.delay(5)
45 | def check():
46 | self.check_player_count()
47 |
48 | check()
49 |
50 | def handle_player_disconnect(self, player, reason):
51 | if len(self.players()) - 1 <= 0 and self.get_cvar("qlx_mmChangeWhenEmpty", bool):
52 | self.def_change_map()
53 | self.player_count = 0
54 |
55 | def handle_console_print(self, text):
56 | if text.startswith("zmq RCON command"):
57 | args = text.split(":")
58 | if args[1].startswith(" map "):
59 | self.player_count = len(self.players())
60 | self.map_changed = True
61 |
62 | def handle_game_end(self, data):
63 | self.player_count = len(self.players())
64 |
65 | @minqlx.thread
66 | def check_player_count(self):
67 | if self.player_count != 0 or not self.map_changed and self._map_change_time != 0.0:
68 | loop_time = self.get_cvar("qlx_mmCheckTime", int)
69 | while time.time() - self._map_change_time < loop_time:
70 | time.sleep(1)
71 | if len(self.players()) == 0:
72 | self.player_count = 0
73 | self.def_change_map()
74 | return
75 | self.map_changed = False
76 | self.player_count = len(self.players())
77 | self._map_change_time = 0.0
78 |
79 | @minqlx.next_frame
80 | def def_change_map(self):
81 | current_map = "{} {}".format(self.get_cvar("mapname"), self.get_cvar("g_factory"))
82 | default_map = self.get_cvar("qlx_mmDefaultMap").strip()
83 | if current_map != default_map:
84 | minqlx.console_print("^1Changing map to {}".format(default_map))
85 | self.map_changed = True
86 | minqlx.console_command("map {}".format(self.get_cvar("qlx_mmDefaultMap")))
87 |
88 | def map_change(self, player, msg, channel):
89 | if "essentials" not in self._loaded_plugins:
90 | """Changes the map."""
91 | if len(msg) < 2:
92 | return minqlx.RET_USAGE
93 | self.change_map(msg[1], msg[2] if len(msg) > 2 else None)
94 | self.map_changed = True
95 | self.player_count = len(self.players())
96 |
--------------------------------------------------------------------------------
/autobalance.py:
--------------------------------------------------------------------------------
1 | # This is an extension plugin for minqlx.
2 | # Copyright (C) 2023 BarelyMiSSeD (github)
3 |
4 | # You can redistribute it and/or modify it under the terms of the
5 | # GNU General Public License as published by the Free Software Foundation,
6 | # either version 3 of the License, or (at your option) any later version.
7 |
8 | # You should have received a copy of the GNU General Public License
9 | # along with minqlx. If not, see .
10 |
11 | # This plugin is meant to be used as an extension to the balance.py included in the minqlx-plugins.
12 | # It will automatically execute a balance at the start of a match.
13 | # It will deny a shuffle vote, if enabled, since it will balance at the start of the match.
14 | # It will give a message that a balance will execute at the start of the game whenever someone calls a shuffle,
15 | # even when denying shuffle voting is enabled.
16 | # The specqueue plugin is used to ensure we have even teams at game start, so make sure it is loaded before this plugin.
17 | # This plugin will still work without specqueue, but if the total player on the teams add to an odd number, balancing
18 | # will not occur.
19 |
20 | # created by BarelyMiSSeD on 1-28-2023
21 |
22 |
23 | """
24 | // Cvar(s)
25 | // Deny a shuffle vote called by a player (1=Deny Vote, 0=Allow Vote).
26 | set qlx_balanceDenyShuffleVote "1"
27 |
28 |
29 | Commands
30 | toggle : changes the setting of the shuffle vote deny. This does not change the cvar setting,
31 | so restarting the server will restore it to the setting in the cvar.
32 | """
33 |
34 | import minqlx
35 |
36 | VERSION = "1.0"
37 | SUPPORTED_GAMETYPES = ("ad", "ca", "ctf", "dom", "ft", "tdm")
38 |
39 |
40 | class autobalance(minqlx.Plugin):
41 | def __init__(self):
42 | try:
43 | self.balance = self.plugins["balance"]
44 | except KeyError:
45 | raise KeyError("balance.py was not found as a loaded minqlx script.\n"
46 | "Check the load order so doVote loads after balance.\n"
47 | "Exiting script load.")
48 |
49 | self.set_cvar_once("qlx_balanceDenyShuffleVote", "1")
50 |
51 | self.add_hook("vote_called", self.handle_vote_called, priority=minqlx.PRI_HIGH)
52 | self.add_hook("game_countdown", self.handle_game_countdown)
53 |
54 | self.add_command("toggle", self.toggle_shuffle, 3)
55 |
56 | self.deny_shuffle = bool(int(minqlx.get_cvar("qlx_balanceDenyShuffleVote")))
57 | try:
58 | self.specqueue = self.plugins["specqueue"]
59 | except KeyError:
60 | self.specqueue = None
61 |
62 | def handle_vote_called(self, caller, vote, args):
63 | if vote.lower() == "shuffle":
64 | if self.game.state in ["in_progress", "countdown"]:
65 | self.msg("^3Game is active. Shuffle vote denied.")
66 | return minqlx.RET_STOP_ALL
67 | elif self.deny_shuffle and self.game.type_short in SUPPORTED_GAMETYPES:
68 | self.msg("^3Shuffle vote ^1denied^3. Teams ^4will be balanced ^3at start of game.")
69 | return minqlx.RET_STOP_ALL
70 |
71 | @minqlx.delay(1)
72 | def handle_game_countdown(self):
73 | teams = self.teams()
74 | diff = len(teams["red"]) - len(teams["blue"])
75 | if diff != 0 and self.specqueue:
76 | self.specqueue.even_the_teams()
77 | self.center_print("*Balancing Teams*")
78 | self.msg("^3Balancing by ^2ELO ^3Skill ratings from ^7{}".format(minqlx.get_cvar("qlx_balanceUrl")))
79 | players = dict([(p.steam_id, self.game.type_short) for p in teams["red"] + teams["blue"]])
80 | self.balance.add_request(players, self.balance.callback_balance, minqlx.CHAT_CHANNEL)
81 |
82 | def toggle_shuffle(self, player, msg, channel):
83 | if self.deny_shuffle:
84 | self.deny_shuffle = False
85 | player.tell("^3Shuffle vote denying has been ^4Disabled^7. ^3Players may now call shuffle votes.")
86 | else:
87 | self.deny_shuffle = True
88 | player.tell("^3Shuffle vote denying has been ^2Enabled^7. ^3Player's shuffle votes will be denied.")
89 |
--------------------------------------------------------------------------------
/linux_tools/README.md:
--------------------------------------------------------------------------------
1 | # Download Files
2 | I put the download files together to allow server admins to update their maps on their server by just running these bash shell scripts.
3 | *** Make sure to set execute permissions on these .sh files ***
4 |
5 | Here is how I use them:
6 | 1) Shut down all the servers running on the same Quake Live server install
7 | 2) Run the redownload.sh using one of your workshop.txt files. (If you only have one workshop file, skip to step 4)
8 | 3) Run the download_new.sh for each of the workshop files you have, including the one you ran the redownload on, so you can catch any that were missed or see why they didn't download. (you can rename the files to something like download_new_server2.sh, but make sure to have a .sh file for each workshop.txt file)
9 | 4) start your servers.
10 |
11 | The autodownload.sh is there if you like the way it downloads and overwrites the current files, but I don't use this file.
12 | See the descriptions for each file below.
13 |
14 |
15 | # autodownload.sh
16 | *** This works best if ran when the server is not running .. because of updates to the appworkshop_282440.acf file ***
17 | This file is for downloading maps to your quake live server without messing with what has already downloaded.
18 | Unlike when the server starts up, this gives a lot more time for the workshop item to download.
19 | Line 10: Edit the workshopFile name to match the name of your server's workshop file.
20 | Line 11: Edit the steamCMD to match the containing directory structure of the steamcmd.sh file.
21 | Line 12: Edit the installLocation to match the directory where your quake live server is installed.
22 |
23 | The remaining variables should not need to be edited.
24 |
25 | # redownload.sh
26 | *** This needs to be ran when the server is not running .. because it moves the workshop items to a different location so the server will not have access to them until the downloads are complete. ***
27 | This file is for re-downloading maps to your quake live server.
28 | Unlike when the server starts up, this gives a lot more time for the workshop item to download.
29 | It moves the workshop items to a directory named 282440_old then downloads the items to the default directory.
30 | It renames the file used to record what has been downloaded to appworkshop_282440.acf.old so steam thinks nothing has been downloaded.
31 | Line 10: Edit the workshopFile name to match the name of your server's workshop file.
32 | Line 11: Edit the steamCMD to match the containing directory structure of the steamcmd.sh file.
33 | Line 12: Edit the installLocation to match the directory where your quake live server is installed.
34 |
35 | The remaining variables should not need to be edited.
36 |
37 | # download_new.sh
38 | *** This should be ran when the server is not running .. because the server will not know of the existence of the workshop items until it is started again and editing the appworkshop_282440.acf when the server is running is problematic. ***
39 | This file is for downloading new workshop items added to your workshop items file,
40 | or items that did not load with redownload.sh.
41 | It will skip items that have already been downloaded.
42 | The download messages from steamcmd will be displayed using this file so you can see if a workshop item does not exist.
43 | Line 10: Edit the workshopFile name to match the name of your server's workshop file.
44 | Line 11: Edit the steamCMD to match the containing directory structure of the steamcmd.sh file.
45 | Line 12: Edit the installLocation to match the directory where your quake live server is installed.
46 |
47 | The remaining variables should not need to be edited.
48 |
49 |
50 | If the status messages are not appearing correctly you may have a workshop.txt that is not correctly formatted for Linux.
51 | Try running dos2unix on the file. EX: dos2unix workshop.txt
52 | This will convert the line feeds from windows format to the standard linux format.
53 |
54 | # Server Restarting
55 | server_reboot.py and ServerStatus.py
56 | The files must be used together. They allow rebooting the linux server if the Quake Live servers are empty.
57 | The server_reboot.py is responsible for checking and rebooting the linux server.
58 | The ServerStatus.py is a minqlx plugin that saves the current player count to the redis database so it can be read by server_reboot.py.
59 | The setup instructions for the files are in the files at the top. The ServerStatus.py should only need to be loaded as a plugin on each Quake Live server, it has no variables that need to be set.
60 | The server_reboot.py has variables at the top of the file, the ones in all CAPS, that need to be set. The redis database password is the only one that HAS to be set if you use a password for your database, otherwise set it to "".
61 |
--------------------------------------------------------------------------------
/getmap.py:
--------------------------------------------------------------------------------
1 | # This is an extension plugin for minqlx.
2 | # Copyright (C) 2020 BarelyMiSSeD (github)
3 |
4 | # You can redistribute it and/or modify it under the terms of the
5 | # GNU General Public License as published by the Free Software Foundation,
6 | # either version 3 of the License, or (at your option) any later version.
7 |
8 | # You should review a copy of the GNU General Public License
9 | # along with minqlx. See .
10 |
11 | # This is a plugin for the minqlx admin bot.
12 | # It allows the admin to download a map to the server and add new IDs to the server's workshop text file.
13 | # It will them restart the server, if it is empty, so that the map can be played.
14 | # It will also allow removal of maps from the server. This wills imply comment the ID in the workshop
15 | # file then restart the server.
16 | # This has worked in my tests every time. I am not guaranteeing it will work in every case.
17 |
18 | # Usage Instructions: !getmap