Fine, have this. It should still be regarded as a beta, I haven't looked at it for a while and certainly haven't bugtested it much. Config options should be pretty obvious.
Usage: player types 'rtv' (note, not a bot command), once enough players have said 'rtv' a vote is started with four random maps contained in maps.txt, the map gets rotated onto the map with the plurality. Hopefully it will work for you, I haven't edited the plugin since the 20th December. You might need to do a few modifications.
It is licensed under the GPLv2.
rtv.py
__version__ = '1.0'
__author__ = 'Bakes'
import b3, re
import b3.events
import threading
import random
import time
#--------------------------------------------------------------------------------------------------
class RtvPlugin(b3.plugin.Plugin):
_adminPlugin = None
_voteActive = False
_voteLastActive = None
activeclients = {}
voteallowed = True
maps = []
randomizedmaps = {}
votedclients = {}
def onStartup(self):
self.registerEvent(b3.events.EVT_CLIENT_SAY)
self.registerEvent(b3.events.EVT_GAME_ROUND_START)
"""\
Initialize plugin settings
"""
file = open(self.config.get('settings', 'maplist'), 'r')
for line in file:
self.maps.append(line)
# get the admin plugin so we can register commands
self._adminPlugin = self.console.getPlugin('admin')
if not self._adminPlugin:
# something is wrong, can't start without admin plugin
self.error('Could not find admin plugin')
return False
self.debug('Started')
def onEvent(self, event):
if event.type == b3.events.EVT_CLIENT_SAY:
self.debug(self._adminPlugin.parseUserCmd(event.data)[0])
if self._adminPlugin.parseUserCmd(event.data)[0].startswith('rtv'):
if event.client.maxLevel > self.config.getint('settings', 'minlevel'):
if self.voteallowed:
try:
failed = True
self.debug('failed set to false')
if not self.activeclients[event.client.id]:
self.debug('This was not meant to happen')
except KeyError:
self.debug('failed set to true')
failed = False
if failed == False:
self.debug('Rocking the Vote?')
self.rockthevote(event.client, event.data)
else:
event.client.message('You have already voted')
return False
else:
event.client.message('You do not have permission to use rockthevote')
elif event.type == b3.events.EVT_GAME_ROUND_START:
self.debug('Round Started')
def allowvote(self):
self.voteallowed = True
def rockthevote(self, client, data):
if not self._voteActive:
self.activeclients[client.id] = True
if (float(len(self.activeclients))/float(len(self.console.clients.getList()))) > float(self.config.getint('settings', 'rtv_threshold_percent')/100):
self.console.say('The vote is being rocked!')
self.activeclients = {}
self.randomizedmaps = {}
random.shuffle(self.maps)
i = 0
for map in self.maps:
map = map.strip()
if i > 4:
break
else:
self.randomizedmaps[map] = 0
i = i + 1
self.console.say('Vote for a new map! The choices are:')
for map in self.randomizedmaps:
self.console.say('^1'+map)
self._voteActive = True
timer = threading.Timer(self.config.getint('settings', 'time_to_vote'), self.activatemap)
timer.start()
self.console.say('Please type ^1rtv ^2mapname ^7to vote for a new map! You have %s seconds' % self.config.get('settings', 'time_to_vote'))
else:
self.activeclients[client.id] = True
mapname = self._adminPlugin.parseUserCmd(data)[1]
if not mapname:
client.message('You must specify a mapname when voting!')
else:
try:
self.debug(mapname)
if self.randomizedmaps[mapname]:
self.debug('Client entered an acceptable map')
except KeyError:
#else:
string = ''
client.message('You must select a valid map, the options are:')
for map in self.randomizedmaps:
string = string+map+', '
client.message(string)
return False
self.randomizedmaps[mapname] = self.randomizedmaps[mapname] + 1
client.message('Your vote was ^2successful')
def activatemap(self):
self.debug('map activating')
best = 0
bestmap = None
for map in self.randomizedmaps:
if self.randomizedmaps[map] > best:
best = self.randomizedmaps[map]
bestmap = map
self._voteActive = False
self.activeclients = {}
if best > 0:
self.console.say('New map has been selected! Rotating to %s' % bestmap)
time.sleep(3)
self.console.write('map %s' % bestmap)
self.debug('Map Change, so setting vote allowed false until map has been played for a bit')
self.voteallowed = False
t = threading.Timer(self.config.getint('settings','time_before_rtv'), self.allowvote)
t.start()
else:
self.console.say('Noone voted!')
self._voteActive = False
plugin_rtv.xml
b3/extplugins/conf/maplist.txt
15
15
1
50
maplist.txt
mp_crash
mp_strike
mp_backlot
mp_bog
mp_crossfire
mp_crash_snow
mp_showdown
A small tip for you, demanding will get you nowhere in life. Developers may work hard to improve your experience, but it should not be demanded of us. We don't get anything out of b3 except for satisfaction, we have no salary, we get no money, and for myself at least, b3 is a big timesink (strange as it may seem, I don't run any gameservers, so get absolutely nothing out of b3), we have other things to do. I have been working flat out since the beginning of January, I assume Ismael has also had too much time to do any b3 work.
Sorry that it's a bit late (it's actually only two months, not three), but you shouldn't expect anything of me, even if I do give a deadline, because I only do b3 when I want to work on improving my python.