############################################################### # # # bf2bot.py - Python script intended for use with the # # bf2bot PPF plugin - http://www.bf2bot.com # # # # Released: 03.09.2005 # # Python Script Version: 1.2 # ############################################################### import bf2 import host import socket import scoringCommon from bf2.stats.constants import * from bf2 import g_debug # the IP of the machine to send the data to DEST_MACHINE = '999.999.999.999' # the port of of the machine to send the data to DEST_PORT = 4300 # how many seconds in between each ticket status update TICKET_STATUS_DELAY = 60 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # non blocking s.setblocking(0) # want the socket to stay open s.settimeout(None) # show ticket status timer ticketStatusTimer = None def init(): global ticketStatusTimer global TICKET_STATUS_DELAY if g_debug: print 'Initialising BF2Bot.com IRC Match script' # game status handler host.registerGameStatusHandler(onGameStatusChange) # Player Events # only run when in game state host.registerHandler('PlayerConnect', onPlayerConnect) host.registerHandler('PlayerChangeTeams', onPlayerChangeTeams, 1) #host.registerHandler('PlayerScore', onPlayerScore) host.registerHandler('PlayerRevived', onPlayerRevived, 1) host.registerHandler('PlayerKilled', onPlayerKilled, 1) #host.registerHandler('PlayerDeath', onPlayerDeath) # only run when in game state host.registerHandler('PlayerDisconnect', onPlayerDisconnect) # Game Events host.registerHandler('ControlPointChangedOwner', onControlPointChangedOwner, 1) # Misc Events host.registerHandler('ChatMessage', onChatMessage, 1) ticketStatusTimer = bf2.Timer(onTicketStatusTimer, TICKET_STATUS_DELAY, 1) ticketStatusTimer.setRecurring(TICKET_STATUS_DELAY) s.sendto("BF2Bot.com IRC Match Python script initialised on the server", (DEST_MACHINE,DEST_PORT)) host.rcon_invoke('echo "bf2bot.py loaded"') def sendMessage(message): s.sendto(message, (DEST_MACHINE,DEST_PORT)) def onTicketStatusTimer(data): if host.pmgr_getNumberOfPlayers() > 0: sendMessage("ticketStatus: %s,%s,%s,%s,%s" % (bf2.gameLogic.getTeamName(1), host.sgl_getParam('tickets', 1, 0), bf2.gameLogic.getTeamName(2), host.sgl_getParam('tickets', 2, 0), host.sgl_getMapName())) def stripmessage(text): text = text.replace("HUD_TEXT_CHAT_TEAM", "") text = text.replace("HUD_TEXT_CHAT_SQUAD", "") text = text.replace("HUD_TEXT_CHAT_COMMANDER", "") text = text.replace("HUD_CHAT_DEADPREFIX", "") text = text.replace("§1DEAD§0", "DEAD") return text def onGameStatusChange(statusChange): if statusChange == bf2.GameStatus.Playing: sendMessage("gameStatePlaying: %s,%s,%s,%s" % (bf2.gameLogic.getTeamName(1), bf2.gameLogic.getTeamName(2), host.sgl_getMapName(), host.ss_getParam('maxPlayers'))) elif statusChange == bf2.GameStatus.EndGame: sendMessage("gameStateEndGame: %s,%s,%s,%s,%s" % (bf2.gameLogic.getTeamName(1), host.sgl_getParam('tickets', 1, 0), bf2.gameLogic.getTeamName(2), host.sgl_getParam('tickets', 2, 0), host.sgl_getMapName())) elif statusChange == bf2.GameStatus.PreGame: sendMessage("gameStatePreGame:") elif statusChange == bf2.GameStatus.Paused: sendMessage("gameStatePaused:") elif statusChange == bf2.GameStatus.RestartServer: sendMessage("gameStateRestart:") elif statusChange == bf2.GameStatus.NotConnected: sendMessage("gameStateNotConnected:") # # Player Events # def onPlayerConnect(player): sendMessage("playerConnect: %s" % (player.getName())) def onPlayerChangeTeams(player, humanHasSpawned): sendMessage("playerChangeTeam: %s,%s" % (player.getName(), player.getTeam())) def onPlayerRevived(revivee, medic): sendMessage("playerRevived: %s,%s,%s,%s,%s,%s,%s,%s,%s" % (medic.getTeam(), medic.getName(), medic.score.score + scoringCommon.SCORE_REVIVE, medic.score.kills, medic.score.deaths, revivee.getName(), revivee.score.score, revivee.score.kills, revivee.score.deaths)) #TODO: crashing in plane/heli doesn't show def onPlayerKilled(victim, attacker, weapon, assists, victimSoldierObject): if victim.getName() == attacker.getName(): sendMessage("playerKilledSelf: %s,%s,%s,%s,%s" % (victim.getName(), victim.getTeam(), victim.score.score + scoringCommon.SCORE_SUICIDE, victim.score.kills, victim.score.deaths + 1)) elif victim.getTeam() == attacker.getTeam(): sendMessage("playerTeamkilled: %s,%s,%s,%s,%s,%s,%s,%s,%s" % (attacker.getTeam(), attacker.getName(), attacker.score.score + scoringCommon.SCORE_TEAMKILL, attacker.score.kills, attacker.score.deaths, victim.getName(), victim.score.score, victim.score.kills, victim.score.deaths + 1)) elif attacker == None and weapon == None and victimSoldierObject != None: #TODO: being run over by a vehicle doesn't show if hasattr(attacker, 'lastDrivingPlayerIndex'): attacker = bf2.playerManager.getPlayerByIndex(victimSoldierObject.lastDrivingPlayerIndex) sendMessage("playerKilled: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,roadkill" % (attacker.getName(), attacker.getTeam(), attacker.score.score + scoringCommon.SCORE_KILL, attacker.score.kills + 1, attacker.score.deaths, victim.getName(), victim.getTeam(), victim.score.score, victim.score.kills, victim.score.deaths + 1)) else: sendMessage("playerKilled: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s" % (attacker.getName(), attacker.getTeam(), attacker.score.score + scoringCommon.SCORE_KILL, attacker.score.kills + 1, attacker.score.deaths, victim.getName(), victim.getTeam(), victim.score.score, victim.score.kills, victim.score.deaths + 1, weapon.templateName)) def onPlayerDeath(player, soldierObject): sendMessage("playerDeath: %s,%s,%s,%s,%s" % (player.getName(), player.getTeam(), player.score.score, player.score.kills, player.score.deaths + 1)) def onPlayerDisconnect(player): sendMessage("playerDisconnect: %s,%s" % (player.getName(), player.getTeam())) # # Game Events # def onControlPointChangedOwner(controlPoint, underAttack): flagPos = controlPoint.cp_getParam('flag') owner = controlPoint.cp_getParam('team') if flagPos == 1 and underAttack == 1 and owner == 0: sendMessage("controlPointCapture: 1,%s" % (controlPoint.templateName)) elif flagPos == 2 and underAttack == 1 and owner == 0: sendMessage("controlPointCapture: 2,%s" % (controlPoint.templateName)) elif underAttack == 0 and owner == flagPos: sendMessage("controlPointNeutralised: %s" % (controlPoint.templateName)) # # Misc Events # def onChatMessage(player_id, text, channel, flags): if player_id == -1: sendMessage("chatServer: %s,%s,%s" % (channel, flags, text)) else: player = bf2.playerManager.getPlayerByIndex(player_id) sendMessage("chatPlayer: %s,%s,%s,%s,%s" % (channel, flags, player.getName(), player.getTeam(), stripmessage(text)))