All pastes #506467 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-05-24 00:25 UTC
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");
?>