Scripts:TXT File base Automatic Announcements
I just finished this and it's late, so I'm just going to throw it up and beef up the text later. It's pretty well documented, so you shouldn't have much trouble. Refer to Woody's Automatic Announcements script for installation. The only change to that being that I had to install the script in the admin/default.py script. This could've just been me, so keep in mind.
NOTE: By default, logging is turned off since the files can get large, You should enable logging if you are having a problem and you need to debug it.
"""
advert.py - written by Dave Lawrence - thrash@fragnastika.com
Based on Woody's "Automatic Announcements" script
Loads messages from the text file "advert_msgs.txt"
Use one line per message
Log file can be used - advert_log.txt
NOTE: Only use the log file for debug. The output buffer is frequently
flushed to ensure you see timely debug messages. This *may* slow the
game server down
If you are having problems you can enable opt_SAdebug
This will allow the script to run outside BF2
There are no wrapers for the script, so the timer wont work, but you can
debug probs with the message file
NOTE: The advert_msgs.txt file is loaded into memory and I have no idea what'll
happen if you try to use an enormous file. Food for thought :)
Release notes:
advert.py v1.0
ToDo:
- Allow messages to be reloaded while the server is running (if that is even possible)
Perhaps a command from the console
Can anyone point me in the right direction on how to do this?
- Put the dbgWriter class into it's own py so we can use it everywhere!
"""
"""""""""""""""""""""""
Top-Level Imports
"""""""""""""""""""""""
import sys
"""""""""""""""""""""""
OPTIONS
"""""""""""""""""""""""
opt_Interval = 14 # Number of seconds between announcements
opt_SAdebug = 0 # For standalone debugging outside of bf2 enable this
# You can use this option to more easily figure out if your ads are loading
# Enable logging to advert_log.txt
# Warning: only do this for debugging. This log file could get huge!
opt_Debuglog = 0 # Logs to advert_log.txt
opt_Stdoutlog = 0 # Enable if you want ALL stdout msgs to be logged, you'll see the actual msh go out
"""""""""""""""""""""""
GLOBALS
"""""""""""""""""""""""
glob_dictMsgs = {} # Where all the advert messages are stored
glob_hdlDbgout = {}
glob_IdxMsg = 0
"""""""""""""""""""""""""""""""""
Functions and Classes
"""""""""""""""""""""""""""""""""
# This is where it happens :)
def tmrhdlAdvert(data):
global glob_IdxMsg
global glob_dictMsgs
# Handle the index overflow
if glob_IdxMsg >= len(glob_dictMsgs):
glob_IdxMsg = 0
host.rcon_invoke('game.sayall "%s"' % glob_dictMsgs[glob_IdxMsg])
dprint('game.sayall "%s"\n' % glob_dictMsgs[glob_IdxMsg], 1)
glob_IdxMsg += 1
class dbgWriter:
flog = {}
def __init__(self):
global glob_hdlDbgout
glob_hdlDbgout = self
if opt_Debuglog == 1 or opt_SAdebug == 0:
self.flog = open('advert_log.txt', 'w')
self.stream = self.flog
else:
self.stream = sys.stdout
# Do we modify STDOUT or leave it as the default cfg from somewhere else?
if opt_Stdoutlog == 1:
sys.stdout = self
def write(self, str):
self.stream.write(str)
def prt(self, str):
self.stream.write(str)
def flush(self):
self.stream.flush()
def dprint(msg, flush=0):
glob_hdlDbgout.prt(msg)
if flush == 1:
glob_hdlDbgout.flush()
"""""""""""""""""""""""""""""""""
Initialization and main code
"""""""""""""""""""""""""""""""""
# Init the debug writer
dbgWriter()
dprint("BF2 Advert Starting\n", 1)
# Check the interval and make sure it's not too short. Let's clamp it at 15 secs
if opt_Interval < 15:
dprint("opt_Interval=%s which is too small, changing to 15 seconds\n" % opt_Interval)
opt_Interval = 15
# TODO: There should be some way to auto detect if we're running inside the BF2 engine, hmm :-\
# Allows BF2 modules to be disabled for local debugging
if(opt_SAdebug == 0):
dprint("Importing BF2 libs\n", 1)
import bf2
import bf2.Timer
import host
else:
dprint("Running in standalone mode\n")
dprint("Importing advertisment messages\n", 1)
try:
try:
config = open('advert_msgs.cfg', 'rt')
except:
dprint("Error opening advert_msgs.cfg- Is it missing?\n")
for line_ in config:
line = line_.strip()
if len(line) == 0 or line.startswith('#'): continue
glob_dictMsgs[glob_IdxMsg] = line
dprint("%s\n" % glob_dictMsgs[glob_IdxMsg])
glob_IdxMsg += 1
except IOError:
dprint("I/O Error on advert.cfg read - does it exist?\n", 1)
pass
#Reset the glob_IdxMsg to point to the first message
glob_IdxMsg = 0
# Let's make sure that the timer gets initialized correctly
# It works now, but EA could "F" us later :)
try:
# We bypass this initialization if we're not running in BF2, this doesn;t *really* warrant a wrapper
if opt_SAdebug == 0:
timer = bf2.Timer(tmrhdlAdvert, opt_Interval, 1)
except:
dprint("'timer = bf2.Timer(tmrhdlAdvert, 1)' FAILED!!\n", 1)
try:
# We bypass this initialization if we're not running in BF2
if opt_SAdebug == 0:
timer.setRecurring(opt_Interval)
except:
dprint("'timer.setRecurring(optInterval))' FAILED!!\n", 1)
dprint("tmrhadlAdvert istalled successfully\n")
dprint("BF2 Advert Started %d messages\n" % len(glob_dictMsgs), 1)
Just call it advert.py, save it in admin/ and add the following to your admin/__init__.py or admin/default.py
import advert
The advert_msgs.cfg file needs to be in the root BF2 directory. The log file, advert_log.txt will show up in the root BF2 folder as well.
Have fun!