Pages: 1 2 3 [4]   Go Down
  Print  
Author Topic: Voting Plugin  (Read 3227 times)
Full Member
***
OS: Linux
Type: Owner dedicated server(s)
Gameservers: CoD4
Posts: 50
Offline Offline
« Reply #45 on: January 24, 2010, 05:19:34 AM »

@Ismael
Yep I got still the same problem.
Logged
Full Member
***
OS: Linux
Type: Owner dedicated server(s)
Gameservers: CoD4
Posts: 50
Offline Offline
« Reply #46 on: February 10, 2010, 11:04:35 AM »

The problem is still NOT solved with this vote plugin!  Cry

I'm waiting about almost 3 months!  Shocked

Quote
From: Bakes
December 27, 2009, 05:57:24 AM
I'm writing my own mapvote plugin at the moment, which works differently. Should be done tonight, I'm writing it around that bug.
Undecided
« Last Edit: February 10, 2010, 11:09:00 AM by danger89 » Logged
Dev. Team
Hero Member
*****
Posts: 1038
Offline Offline
Don't contact me on Xfire! I will just reject you!
« Reply #47 on: February 10, 2010, 01:29:26 PM »

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
Code: python

__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
Code: xml

 
   b3/extplugins/conf/maplist.txt
   15
   15
   1
   50
 



maplist.txt
Code:
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.
Logged

Full Member
***
OS: Linux
Type: Owner dedicated server(s)
Gameservers: CoD4
Posts: 50
Offline Offline
« Reply #48 on: February 19, 2010, 07:55:17 AM »

Thank you very much!  Grin I will test it...

Sorry to be so blunt, that was not my intention. I know you work hard for it and B3 is just a hobby for you all Wink Forgive me  Cry


EDIT:
Indeed its a Beta version, this equal to !map, so without any voting possibility. I think I need to wait a little bit longer untill you finished it...
« Last Edit: February 19, 2010, 08:52:49 AM by danger89 » Logged
Jr. Member
**
Posts: 36
Offline Offline
« Reply #49 on: March 08, 2010, 09:17:14 AM »

Hey,

there is a some trouble if u have some similar map names.

i.e. u have in the maplist
Code:
mp_tojane
mp_tojane_night

so u cant call a vote for mp_tojane. U will get the message: "More than one map matches the name, be more specific"

I found the source, but I dont know how to fix it. Line 315-321
Code:
for map in self._mapList:
if s in map:
self._map  = map
if matched:
client.message('^7More than one map matches the name, be more specific')
return False
matched = True
Logged
Tags:
Pages: 1 2 3 [4]   Go Up
  Print  
 
Jump to: