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"); ?>