rendered paste body<?php
require_once('BZFlag_Info/BZFlag_Info.php');
require_once('BZFlag_Info/BZFlag_Flags.php');
require_once('BZFlag_Info/BZFlag_Packetmgr.php');
require_once('debug.php');
error_reporting (E_ALL);
class BZFlag_Loop extends BZFlag_Connection {
function __construct($server){
//$this->debug = array(&$this,'DEBUG_PACKET');
parent::__construct($server);
}
function loop($logPlayer,$logPassword,$logEmail='BZFlag_Info Log'){
$token = BZFlag_Info::gettoken($logPlayer,$logPassword);
$this->joinAs($logPlayer,$logEmail,$token);
$this->msg('Starting loop...');
foreach($this->players as $v){
$player = str_pad($v['status'],2);
$player.= str_pad($v['score'],4);
$player.= str_pad("({$v['won']}-{$v['lost']}",7).')';
$player.= "[";
$player.= str_pad($v['tks'],2);
$player.= "] ";
$player.= $v['sign'];
$this->msg($player);
}
$this->msg('');
while (1){
set_time_limit(0);
try{
$this->justReadPackets(1);
//echo str_repeat(' ',1024)."\n";
flush();
}catch (Exception $e){
echo "\n\n====================\n";
$this->msg($e->getMessage());
echo "\n=====================\n\n";
if(!$this->playerConnected) break;
}
}
}
function handlePacket($packet){
//Define custom hooks for diffrent types of packets
switch ($packet['code']){
case self::MsgKilled:$this->getMsgKilled($packet);break;
case self::MsgMessage:$this->getMsgMessage($packet);break;
case self::MsgAlive:$this->getMsgAlive($packet);break;
case self::MsgFlagUpdate:$this->getMsgFlagUpdate($packet);break;
case self::MsgGrabFlag:$this->getMsgGrabFlag($packet);break;
case self::MsgDropFlag:$this->getMsgDropFlag($packet);break;
case self::MsgAddPlayer:$this->getMsgAddPlayer($packet);break;
case self::MsgRemovePlayer:$this->getMsgRemovePlayer($packet);break;
case self::MsgCaptureFlag:$this->getMsgCaptureFlag($packet);break;
case self::MsgPlayerUpdateSmall:$this->getMsgPlayerUpdateSmall($packet);break;
default:parent::handlePacket($packet);//if we don't handle it, use the default handler
}
}
//
// DEBUG ADDED BY TANNER
//
function debugPacket($packet){
if(is_string($this->debug)||is_array($this->debug)) call_user_func($this->debug,$packet);
else{
$s = function_exists('packetTitle')?packetTitle($packet['code']):'dec '.$packet['code'];
printf("\nPacket (%s hex 0x%X len %s)\n",$s,$packet['code'],$packet['len']);
if($packet['data']){
foreach (unpack('C*',$packet['data']) as $v){
if($v<32) echo ' .';
else if($v>126) echo ' ~';
else echo ' '.chr($v);
}
echo "\n ";
foreach (unpack('C*',$packet['data']) as $v) printf(' %02X',$v);echo "\n";
}
}
}
function getMsgPlayerUpdateSmall($packet){
//$data = unpack('npx/npy/npz/nvx/nvy/nvz/nazimuth/nangvel/nstatus/norder',$packet['data']);
//$this->DEBUG_PACKET($packet);
print_r(unpack('Ltime/Cslot/Lorder/Sstatus/S3pos/S3velo/Sheading',$packet['data']));
//echo strlen($packet['data']);
die();
}
function getMsgKilled($packet){
$data = parent::getMsgKilled($packet);
//echo "PLAYER DIED: $name ({$data['player']},$reason) BY $killer({$data['killer']})\n";
$name = $data['playername'];
$killer = $data['killername'];
switch ($data['reason']){
case 5:
$msg = "$name self-destructed";
break;
case 2:
$msg = "$name got run over by $killer";
break;
case 6:
case 7:
$msg = "$name was killed by the enviorment";
break;
default:
if($data['flag']){
if(class_exists('BZFlag_Flaglist')){
if(!$flag=BZFlag_Flaglist::getName($data['flag'])){
$flag = "Unknown flag {$data['flag']}";
}
}else{
$flag = "flag abbr. {$data['flag']}";
}
}
$tp = $this->players[$data['player']]['team'];
$tk = $this->players[$data['killer']]['team'];
if($tk>0 && $tp==$tk && $data['player']!=$data['killer']){
$killer = "teammate $killer";
}
switch($data['flag']){
case null:
$msg = "$name was killed by $killer";
break;
case 'L':
$msg = "$name was fried by by $killer's Laser";
break;
case 'SW':
$msg = "$name felt the effects of $killer's Shockwave";
break;
default:
$msg = "$name was killed by $killer with $flag";
break;
}
break;
}
$this->msg($msg,self::MsgKilled);
}
function getMsgGrabFlag($packet){
$data = unpack('Cplayer/nid/a2flag',$packet['data']);
if(class_exists('BZFlag_Flaglist')){
if(!$flag=BZFlag_Flaglist::getName($data['flag'])){
$flag = "Unknown flag {$data['flag']}";
}
}else{
$flag = "flag abbr. {$data['flag']}";
}
$name = $this->callsignFromId($data['player']);
$this->msg("$name grabbed $flag({$data['id']})",self::MsgGrabFlag);
}
function getMsgDropFlag($packet){
$data = unpack('Cplayer/nid/a2flag',$packet['data']);
if(class_exists('BZFlag_Flaglist')){
if(!$flag=BZFlag_Flaglist::getName($data['flag'])){
$flag = "Unknown flag {$data['flag']}";
}
}else{
$flag = "flag abbr. {$data['flag']}";
}
$name = $this->callsignFromId($data['player']);
$this->msg("$name dropped $flag({$data['id']})",self::MsgDropFlag);
}
function getMsgCaptureFlag($packet){
$data = unpack('Cplayer/nflag/nbase',$packet['data']);
//$this->DEBUG_PACKET($packet);
$name = $this->callsignFromId($data['player']);
$flag = $this->teams[$data['flag']+1]['name'];
$base = $this->teams[$data['base']]['name'];
$this->msg("$name captured the $flag Flag for $base",self::MsgCaptureFlag);
}
function getMsgAlive($packet){
//there is lots more data sent in MsgAlive, but it is
//position and orientation data that we don't need
$data = unpack('Cplayer',$packet['data']);
$name = $this->callsignFromId($data['player']);
$this->msg("PLAYER IS ALIVE: $name ({$data['player']})",self::MsgAlive);
}
function getMsgFlagUpdate($packet){
$count = 0;
$flagIndex = 0;
$data = $packet['data'];
$data = substr($data,1);
while($data){
$flag = unpack('nf',$data);$flag=$flag['f'];
$data = substr($data,2);
//if($this->debug) $this->msg("FlagId: $flag",self::MsgFlagUpdate);
//msg = world->getFlag( int( flagIndex )).unpack( msg );
//world->initFlag( int( flagIndex ));
}
}
function getMsgMessage($packet){
parent::getMsgMessage($packet);
$msg = $this->messages[count($this->messages)-1];
$f = $msg['from'];
$t = $msg['to'];
if(self::MsgToRogueTeam>=$t && $t>=self::MsgToHuntedTeam) $print.="[Team] {$msg['fromname']}: ";
else if($t == self::MsgToAdmins) $print.="[Admin] {$msg['fromname']}: ";
else if($f==self::MsgToServerPlayer) $print.='[SERVER->] ';
else if ($t==self::MsgToAllPlayers) $print.="{$msg['fromname']}: ";
else $print.="[{$msg['fromname']}->] ";
$print.=$msg['message'];
$this->msg($print,self::MsgMessage);
}
function getMsgAddPlayer($packet){
$data = parent::getMsgAddPlayer($packet);
$player = $this->callsignFromId($data['id']);
$team = $data['team']!=0?$data['teamName'].' team':'rouges';
$this->msg("$player joined the $team",self::MsgAddPlayer);
}
function getMsgRemovePlayer($packet){
$data = parent::getMsgRemovePlayer($packet);
$player = $data['sign'];
$team = $data['team']!=0?$data['teamName'].' team':'rouges';
$this->msg("$player left the server",self::MsgRemovePlayer);
}
/** spill the contents of a packet recieved
* @param array $packet
*/
function DEBUG_PACKET($packet){
printf("Packet: %s (hex 0x%X len %s)\n",packetTitle($packet['code']),$packet['code'],$packet['len']);
foreach (unpack('C*',$packet['data']) as $v){
$v=chr($v);
switch ($v){
case "\n":case "\r":case "\0":echo ' ';break;
default:echo " $v";break;
}
}
echo "\n ";
foreach (unpack('C*',$packet['data']) as $v) printf(' %02X',$v);echo "\n";
}
/** Print a message to stdout
* @param str $msg
* @param int $type
*/
function msg($msg,$type=0){
//echo str_pad("\n$msg",2024);
echo str_pad("\n$msg",50);
flush();
}
}
$server = "lodxcol.bzflag.org:5200";
$s = new BZFlag_Loop($server);
$s->debug = 5;
$s->loop("Doctor Who","pack11","Beta Test Bot");
?>