void LoginClientPacket( char buf[] )
{
	fprintf( log, "Login_Client-> " );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	Login_Client_Forward( buf );

	if( buf[0] == -24 ) //ping packet
	{
		PINGPACKETSSINCETELEPORT++;
		if( ON_TIME_MOVE )
		{
			if( PINGPACKETSSINCETELEPORT == 1 )
			{
				generate_random_movement_packet();
				char say[] = {'T','E','L','E','P','O','R','T','E','D',' ','(','T','I','M','E',')','\0'};
				generate_systemtalk_packet( say );
			}
		}
		IGNORE_PACKETS_TILL_PING = 0;
		ENEMIES_KILLED_SINCE_PING = 0;
	}
}
void LoginServerPacket( char buf[] )
{
	fprintf( log, "Login_Server-> " );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	if( buf[0] == -55 ) // If server change
	{
		ChangeServer( buf );
		FD_ZERO( &read_fds );
		return;
	}
	else // else just forward
	{
		Login_Server_Forward( buf );
	}
}

void PriClientPacket( char buf[] )
{
	fprintf( log, "Pri_Client-> " );
	if( FILTERS_ENABLED == 1 || buf[0] == 46 )
	{
		switch ( buf[0] )
		{
		case -56:Pri_Client_ChooseChar( buf );
				return;
		case -46:Pri_Client_Attack( buf );
				return;
		case -6:Pri_Client_Skill( buf );
				return;
		case -54:Pri_Client_Movement( buf );
				return;
		case 46:Pri_Client_Talk( buf );
				return;
		case 24:Pri_Client_OpenWindow( buf );
				return;
		case -82:Pri_Client_Mailbox3( buf );
				return;
		case -70:Pri_Client_MailboxCompose( buf );
				return;
		case -78:Pri_Client_MailboxSendMail( buf );
				return;
		case -76:Pri_Client_MailboxSendMailBody( buf );
				return;
		case -74:Pri_Client_MailboxSendMailTitle( buf );
				return;
		case 124:Pri_Client_Quit1( buf );
				return;
		}
	}
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	Pri_Client_Forward( buf );
}

void PriServerPacket( char buf[] )
{
	fprintf( log, "Pri_Server-> " );
	if( buf[0] == -55 ) // Server change, always enabled.
	{
		ChangeServer( buf );
		FD_ZERO( &read_fds );
		return;
	}
	if( FILTERS_ENABLED )
	{
		switch ( buf[0] )
		{
		case -45:Pri_Server_Damage( buf );
				 return;
		case   7:Pri_Server_Status( buf );
				 return;
		case -61:Pri_Server_Mailbox2( buf );
				 return;
		case -81:Pri_Server_Mailbox4( buf );
				 return;
		case -79:Pri_Server_MailboxContent( buf );
				 return;
		case -77:Pri_Server_Mailbox5( buf );
				 return;
		case -53:Pri_Server_OtherMovement( buf );
				 return;
		case  47:Pri_Server_OtherTalk( buf );
				 return;
		case -51:Pri_Server_OtherSight( buf );
				 return;
		case -15:Pri_Server_OtherSightChange( buf );
				 return;
		case  -3:Pri_Server_OtherSkill( buf );
				return;
		case 125:Pri_Server_Quit2( buf );
				return;
		}
	}
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	Pri_Server_Forward( buf );
}

void SecClientPacket( char buf[] )
{
	fprintf( log, "Sec_Client-> " );
	Sec_Client_Forward( buf );
}

void SecServerPacket( char buf[] )
{
	fprintf( log, "Sec_Server_Recv-> " );
	if( !PHANTOM_MODE )
		Sec_Server_Forward( buf );
}

int SplitBuf( char buf[] )
{
	int i = 0;
	int j = 0;
	int k = 0;
	int numpackets = 0;
	//fprintf( log, "Origional-> %s\n", buf );
	while( 1 )
	{
		splitbuf[j][k] = buf[i];
		if( !buf[i] == 0x01 && buf[i+1] == '\0' )
		{
			break;
		}
		else if( buf[i] == 0x01 && buf[i+1] == '\0' )
		{
			splitbuf[j][k] = 0x01;
			break;
		}
		else if( buf[i] == 0x01 )
		{
			k++;
			splitbuf[j][k] = '\0';
			j++;
			k = 0;
		}
		else
			k++;
		i++;
	}
	k++;
	splitbuf[j][k] = '\0';
	numpackets = j + 1;
	//for( int q = 0; q < numpackets; q++ )
	//{
		//fprintf( log, "Splitbuf[%d]-> %s\n", q, splitbuf[q] );
	//}
	return numpackets;
}

void ChangeServer( char buf[] )
{
	if( PHANTOM_MODE == 1 )
	{
		PhantomChangeServer( buf );
		return;
	}
	if( PHANTOM_MODE == 2 )
		return;
	int z = 0;
	while( buf[z] != 0 )
	{
		fprintf( log, "%d ", buf[z] );
		z++;
	}
	if( FD_ISSET( pri_server_fd, &master ) ) //If pri_server_fd is there...
	{
		FD_CLR( pri_server_fd, &master ); //remove it
		FD_CLR( pri_client_fd, &master );
		sec_server_fd = pri_server_fd;//put primaties in secs
		sec_client_fd = pri_client_fd;
		sec_server_addr = pri_server_addr;
		sec_client_addr = pri_client_addr;
		sec_myprog_addr = pri_myprog_addr;
		FD_SET( sec_server_fd, &master );//read old primary as sec
		FD_SET( sec_client_fd, &master );
	}
	int i = 0;

	while( buf[i] != '1' ) //finds first part of port#
		i++;
	int StartPort = i;
	SERVERNEWLISTENPORT = 0;
	while( buf[i] != ':' )
		SERVERNEWLISTENPORT = ( SERVERNEWLISTENPORT * 10 ) + ( buf[i++] - '0' ); // gets port
	i++;
	int StartIPAddress = i;
	int j = 0;
	while( buf[i] != ',' )
	{
		TempIP[j] = buf[i];			// extracts ip address
		j++;
		i++;
	}
	TempIP[14] = '\0';				// terminate the string


	printf( "%s:%d\n", TempIP, SERVERNEWLISTENPORT );
	fprintf( log, "%s:%d\n", TempIP, SERVERNEWLISTENPORT );
	MYPROGNEWLISTENPORT++;
	int inttempMYPROGNEWLISTENPORT = MYPROGNEWLISTENPORT;
	int q = 0;  // limited to 5 number ports.  If changes must rethink
	for( q; q < 5; q++ )
	{	// Inject my port for client to connect to
		buf[StartPort + 4 - q] = ( inttempMYPROGNEWLISTENPORT % 10 ) + '0';
		inttempMYPROGNEWLISTENPORT = inttempMYPROGNEWLISTENPORT / 10;
	}


	buf[StartIPAddress] = '9';		// Inject my address for client to
	buf[StartIPAddress + 1] = '9';	// reconnect to, just on different
	buf[StartIPAddress + 2] = '9';	//port
	buf[StartIPAddress + 3] = '.';
	buf[StartIPAddress + 4] = '9';   //limited to length.  if changes must rethink
	buf[StartIPAddress + 5] = '9';
	buf[StartIPAddress + 6] = '9';
	buf[StartIPAddress + 7] = '.';
	buf[StartIPAddress + 8] = '9';
	buf[StartIPAddress + 9] = '9';
	buf[StartIPAddress + 10] = '.';
	buf[StartIPAddress + 11] = '9';
	buf[StartIPAddress + 12] = '9';
	buf[StartIPAddress + 13] = '9';


	//Get myprog listen port ready for connection to RM client
	pri_myprog_addr.sin_family = AF_INET;
	pri_myprog_addr.sin_port = htons( MYPROGNEWLISTENPORT );
	pri_myprog_addr.sin_addr.s_addr = htonl( INADDR_ANY );
	memset( &( pri_myprog_addr.sin_zero ), '\0', 8 );
	int sin_size;
	char yes = '1';
	sin_size = sizeof( struct sockaddr_in );

	if( ( pri_client_fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
	{
		perror( "socket" );
		printf( "socket error in pri_client_fd\n" );
		fprintf( log, "socket error in pri_client_fd\n" );
		exit( 1 );
	}
	if( setsockopt( pri_client_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( int ) ) == -1 )
	{
		perror( "setsockopt" );
		printf( "setsockopt error in pri_client_fd\n" );
		fprintf( log, "setsockopt error in pri_client_fd\n" );
		exit( 1 );
	}

	if( bind( pri_client_fd, ( struct sockaddr * )&pri_myprog_addr, sizeof( struct sockaddr ) ) == -1 )
	{
		perror( "bind" );
		printf( "bind error in pri_client_fd\n" );
		fprintf( log, "bind error in pri_client_fd\n" );
		exit( 1 );
	}

	listen( pri_client_fd, BACKLOG );
	fflush( log );
	//Forward edited changeserver packet to client, but which client??
	if( FD_ISSET( sec_server_fd, &master ) )
	{
		if( send( sec_client_fd, buf, strlen(buf), 0 ) == -1 )
		{
			perror( "send" );
			printf( "send error in sec_client_fd\n" );
			fprintf( log, "send error in sec_client_fd\n" );
			exit( 1 );
		}
		fprintf( log, "Sec_Client-> Edited ChangeServer Packet-> %s\n", buf );
	}
	else
	{
		if( send( login_client_fd, buf, strlen(buf), 0 ) == -1 )
		{
			perror( "send" );
			printf( "send error in login_client_fd\n" );
			fprintf( log, "send error in login_client_fd\n" );
			exit( 1 );
		}
		fprintf( log, "Login_Client-> Edited ChangeServer Packet-> %s\n", buf );
	}

	printf( "Listening for Redmoon Client..." );
	fprintf( log, "Listening for Redmoon Client..." );
	fflush( log );
	//Wait for new connection response from client
	pri_client_fd = accept( pri_client_fd, ( struct sockaddr * )&pri_client_addr, &sin_size );
	if( pri_client_fd == -1 )
	{
		perror( "accept" );
		printf( "accept error in pri_client_fd \n" );
		fprintf( log, "accept error in pri_client_fd\n" );
		exit( 1 );
	}
	printf( "Done\n" );
	fprintf( log, "Done\n" );
	fflush( log );
	printf( "Connecting to Redmoon Server..." );
	fprintf( log, "Connecting to Redmoon Server..." );
	fflush( log );


	//Get new connection with server
	pri_server_addr.sin_family = AF_INET;
	pri_server_addr.sin_port = htons( SERVERNEWLISTENPORT );
	pri_server_addr.sin_addr.s_addr = inet_addr( TempIP );
	memset( &( pri_server_addr.sin_zero ), '\0', 8 );

	//Open socket for connection to Redmoon server
	if( ( pri_server_fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
	{
		perror( "socket" );
		printf( "socket error in pri_server_fd\n" );
		fprintf( log, "socket error in pri_server_fd\n" );
		exit( 1 );
	}

	if( connect( pri_server_fd, ( struct sockaddr * )&pri_server_addr, sizeof( struct sockaddr ) ) == -1 )
	{
		perror( "connect" );
		printf( "connect error in pri_client_fd\n" );
		fprintf( log, "connect error in pri_client_fd\n" );
		exit( 1 );
	}
	printf( "Done\n" );
	fprintf( log, "Done\n" );
	fflush( log );

	//Got new connection with server

	FD_SET( pri_client_fd, &master ); // add pri_client_fd to master list
	FD_SET( pri_server_fd, &master ); // add pri_server_fd to master list
	FD_ZERO( &read_fds );
	CONNECTIONS = CONNECTIONS + 2;
	PINGPACKETSSINCETELEPORT = 0;
}


void PhantomChangeServer( char buf[] )
{
	char say[] = {'P','H','A','N','T','O','M',' ','M','O','D','E',' ','E','N','G','A','G','E','D','\0'};
	generate_systemtalk_packet( say );
	int z = 0;
	while( buf[z] != 0 )
	{
		fprintf( log, "%d ", buf[z] );
		z++;
	}
	int i = 0;

	while( buf[i] != '1' ) //finds first part of port#
		i++;
	int StartPort = i;
	SERVERNEWLISTENPORT = 0;
	while( buf[i] != ':' )
		SERVERNEWLISTENPORT = ( SERVERNEWLISTENPORT * 10 ) + ( buf[i++] - '0' ); // gets port
	i++;
	int StartIPAddress = i;
	int j = 0;
	while( buf[i] != ',' )
	{
		TempIP[j] = buf[i];			// extracts ip address
		j++;
		i++;
	}
	TempIP[14] = '\0';				// terminate the string

	printf( "%s:%d\n", TempIP, SERVERNEWLISTENPORT );
	fprintf( log, "%s:%d\n", TempIP, SERVERNEWLISTENPORT );

	//Get new connection with server
	sec_server_addr.sin_family = AF_INET;
	sec_server_addr.sin_port = htons( SERVERNEWLISTENPORT );
	sec_server_addr.sin_addr.s_addr = inet_addr( TempIP );
	memset( &( sec_server_addr.sin_zero ), '\0', 8 );

	//Open socket for connection to Redmoon server
	if( ( sec_server_fd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
	{
		perror( "socket" );
		printf( "socket error in sec_server_fd\n" );
		fprintf( log, "socket error in sec_server_fd\n" );
		exit( 1 );
	}

	if( connect( sec_server_fd, ( struct sockaddr * )&sec_server_addr, sizeof( struct sockaddr ) ) == -1 )
	{
		perror( "connect" );
		printf( "connect error in sec_server_fd\n" );
		fprintf( log, "connect error in sec_server_fd\n" );
		exit( 1 );
	}
	printf( "Done\n" );
	fprintf( log, "Done\n" );
	fflush( log );

	//Got new connection (on sec) with server

	FD_SET( sec_server_fd, &master ); // add sec_server_fd to master list
	FD_ZERO( &read_fds );
	CONNECTIONS = CONNECTIONS + 1;
	PINGPACKETSSINCETELEPORT = 0;
	generate_choosechar_packet( );
	PHANTOM_MODE = 2;
}


void Pri_Client_ChooseChar( char buf[] )
{
	fprintf( log, "Choose Character-> ");
	int q = 8;
	int p = 0;
	while( buf[q] != 7 )
	{
		fprintf( log, "%c", buf[q] );
		CHARNAME[p] = buf[q];
		p++;
		q++;
	}
	fprintf( log, "-> " );
	int z = 0;
	while( buf[z] != 0 )
	{
		fprintf( log, "%d ", buf[z] );
		z++;
	}
	fprintf( log, "-> " );
	CHARNAME[p] = '\0';
	Pri_Client_Forward( buf );
}

void Pri_Client_Attack( char buf[] )
{
	fprintf( log, "%dAttack-> ", NUM_ATTACK );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	if( FILTERS_ENABLED )
	{
		int i = 0;
		while( i++ < NUM_ATTACK )
			Pri_Client_Forward( buf );
		if( ON_ATTACK_HEAL )
			generate_doctor_packet( buf );
	}
}

void Pri_Client_Movement( char buf[] )
{
	int x = 0, y = 0;
	int i = 6;
	if( buf[i] != 7 )
		x = buf[i];
	else
		x = 15 - buf[++i];
	i += 3;
	if( buf[i] != 7 )
		y = buf[i];
	else
		y = 15 - buf[++i];
	i += 5;
	if( buf[i] == 7 )
		i++;
	i += 2;

	if(x < 0) x = 256 + x;
	if(y < 0) y = 256 + y;

	if( buf[i] == 13 )
	{
		if( STAMINA )
			buf[i] = 14;
		fprintf( log, "Movement-> Ran to X:%d y:%d ", x, y );
	}
	else
	{
		fprintf( log, "Movement-> Walked to X:%d y:%d ", x, y );
		if( ON_WALK_HEAL )
			generate_doctor_packet( buf );
	}

	Pri_Client_Forward( buf );
}

void Pri_Client_Skill( char buf[] )
{
	fprintf( log, "%dSkill-> ", NUM_SKILL );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	if( FILTERS_ENABLED )
	{
		int i = 0;
		while( i++ < NUM_SKILL )
		{
			Pri_Client_Forward( buf );
			if( ( i % 5 ) == 0 )
				if( ON_SKILL_HEAL )
					generate_doctor_packet( buf );
		}
		if( AUTO_ABS )
			generate_abs_packet( buf );
		if( ON_SKILL_HEAL )
			generate_doctor_packet( buf );
	}
}

void Pri_Client_Talk( char buf[] )
{
	int i = 0;
	while( i != 100 && buf[i] != 45 && buf[i] != '\0' )
		i++;
	if( buf[i] == 45 )
	{
		fprintf( log, "SystemCommand-> " );
		if( buf[i+1] == 70 && buf[i+2] == 69 )
		{
			FILTERS_ENABLED = ( buf[i+3] - 48 );
			fprintf( log, "FILTERS_ENABLED changed to %d-> ", FILTERS_ENABLED );
			char say[] = {'F','I','L','T','E','R','S','_','E','N','A','B','L','E','D',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + FILTERS_ENABLED,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 78 && buf[i+2] == 65 )
		{
			NUM_ATTACK = ( buf[i+3] - 48 );
			fprintf( log, "NUM_ATTACK changed to %d-> ", NUM_ATTACK );
			char say[] = {'N','U','M','_','A','T','T','A','C','K',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + NUM_ATTACK,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 78 && buf[i+2] == 83 )
		{
			NUM_SKILL = ( buf[i+3] - 48 );
			fprintf( log, "NUM_SKILL changed to %d-> ", NUM_SKILL );
			char say[] = {'N','U','M','_','S','K','I','L','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + NUM_SKILL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 83 && buf[i+2] == 84 )
		{
			STAMINA = ( buf[i+3] - 48 );
			fprintf( log, "STAMINA changed to %d-> ", STAMINA );
			char say[] = {'S','T','A','M','I','N','A',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + STAMINA,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 68 && buf[i+3] == 72 )
		{
			ON_DAMAGE_HEAL = ( buf[i+4] - 48 );
			fprintf( log, "ON_DAMAGE_HEAL changed to %d-> ", ON_DAMAGE_HEAL );
			char say[] = {'O','N','_','D','A','M','A','G','E','_','H','E','A','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_DAMAGE_HEAL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 68 && buf[i+3] == 83 )
		{
			ON_DAMAGE_SKILL = ( buf[i+4] - 48 );
			fprintf( log, "ON_DAMAGE_SKILL changed to %d-> ", ON_DAMAGE_SKILL );
			char say[] = {'O','N','_','D','A','M','A','G','E','_','S','K','I','L','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_DAMAGE_SKILL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 68 && buf[i+3] == 65 )
		{
			ON_DAMAGE_ATTACK = ( buf[i+4] - 48 );
			fprintf( log, "ON_DAMAGE_ATTACK changed to %d-> ", ON_DAMAGE_ATTACK );
			char say[] = {'O','N','_','D','A','M','A','G','E','_','A','T','T','A','C','K',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_DAMAGE_ATTACK,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 83 && buf[i+3] == 77 )
		{
			ON_SIGHT_MOVE = ( buf[i+4] - 48 );
			fprintf( log, "ON_SIGHT_MOVE changed to %d-> ", ON_SIGHT_MOVE );
			char say[] = {'O','N','_','S','I','G','H','T','_','M','O','V','E',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_SIGHT_MOVE,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 83 && buf[i+3] == 83 )
		{
			ON_SIGHT_SKILL = ( buf[i+4] - 48 );
			fprintf( log, "ON_SIGHT_SKILL changed to %d-> ", ON_SIGHT_SKILL );
			char say[] = {'O','N','_','S','I','G','H','T','_','S','K','I','L','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_SIGHT_SKILL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 83 && buf[i+3] == 65 )
		{
			ON_SIGHT_ATTACK = ( buf[i+4] - 48 );
			fprintf( log, "ON_SIGHT_ATTACK changed to %d-> ", ON_SIGHT_ATTACK );
			char say[] = {'O','N','_','S','I','G','H','T','_','A','T','T','A','C','K',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_SIGHT_ATTACK,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 84 && buf[i+3] == 77 )
		{
			ON_TIME_MOVE = ( buf[i+4] - 48 );
			fprintf( log, "ON_TIME_MOVE changed to %d-> ", ON_TIME_MOVE );
			char say[] = {'O','N','_','T','I','M','E','_','M','O','V','E',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_TIME_MOVE,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 'O' && buf[i+2] == 'A' && buf[i+3] == 'H' )
		{
			ON_ATTACK_HEAL = ( buf[i+4] - 48 );
			fprintf( log, "ON_ATTACK_HEAL changed to %d-> ", ON_ATTACK_HEAL );
			char say[] = {'O','N','_','A','T','T','A','C','K','_','H','E','A','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_ATTACK_HEAL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 'O' && buf[i+2] == 'W' && buf[i+3] == 'H' )
		{
			ON_WALK_HEAL = ( buf[i+4] - 48 );
			fprintf( log, "ON_WALK_HEAL changed to %d-> ", ON_WALK_HEAL );
			char say[] = {'O','N','_','W','A','L','K','_','H','E','A','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_WALK_HEAL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 'O' && buf[i+2] == 'S' && buf[i+3] == 'H' )
		{
			ON_SKILL_HEAL = ( buf[i+4] - 48 );
			fprintf( log, "ON_SKILL_HEAL changed to %d-> ", ON_SKILL_HEAL );
			char say[] = {'O','N','_','S','K','I','L','L','_','H','E','A','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_SKILL_HEAL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 'O' && buf[i+2] == 'O' && buf[i+3] == 'S' && buf[i+4] == 'H' )
		{
			ON_OTHER_SKILL_HEAL = ( buf[i+5] - 48 );
			fprintf( log, "ON_OTHER_SKILL_HEAL changed to %d-> ", ON_OTHER_SKILL_HEAL );
			char say[] = {'O','N','_','O','T','H','E','R','_','S','K','I','L','L','_','H','E','A','L',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + ON_OTHER_SKILL_HEAL,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 80 && buf[i+2] == 87 )
		{
			PLAYER_WATCH = ( buf[i+3] - 48 );
			fprintf( log, "PLAYER_WATCH changed to %d-> ", PLAYER_WATCH );
			char say[] = {'P','L','A','Y','E','R','_','W','A','T','C','H',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + PLAYER_WATCH,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 71 && buf[i+2] == 87 )
		{
			GM_WATCH = ( buf[i+3] - 48 );
			fprintf( log, "GM_WATCH changed to %d-> ", GM_WATCH );
			char say[] = {'G','M','_','W','A','T','C','H',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + GM_WATCH,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 71 && buf[i+2] == 81 )
		{
			GM_QUIT = ( buf[i+3] - 48 );
			fprintf( log, "GM_QUIT changed to %d-> ", GM_QUIT );
			char say[] = {'G','M','_','Q','U','I','T',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + GM_QUIT,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 'P' && buf[i+2] == 'M' )
		{
			PHANTOM_MODE = ( buf[i+3] - 48 );
			fprintf( log, "PHANTOM_MODE changed to %d-> ", PHANTOM_MODE );
			char say[] = {'P','H','A','N','T','O','M',' ','M','O','D','E',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + PHANTOM_MODE,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 88 && buf[i+2] == 89 )
		{
			char say[] = {'X',':',CURRENT_X,',',' ','Y',':',CURRENT_Y,'\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 77 && buf[i+2] == 80 )
		{
			generate_mapchange_packet( buf, i + 3 );
			char say[] = {'M','A','P',' ','C','H','A','N','G','E','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 65 && buf[i+2] == 80 )
		{
			AUTOPILOT = ( buf[i+3] - 48 );
			fprintf( log, "AUTOPILOT changed to %d-> ", AUTOPILOT );
			char say[] = {'A','U','T','O','P','I','L','O','T',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + AUTOPILOT,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 76 && buf[i+2] == 68 )
		{
			generate_coords_from_file( buf, i );
			return;
		}
		if( buf[i+1] == 79 && buf[i+2] == 84 )
		{
			generate_othertalk_packet( buf, i );
			return;
		}
		if( buf[i+1] == 77 && buf[i+2] == 66 )
		{
			fprintf( log, "Mailbox-> " );
			generate_mailbox_packet( buf );
			char say[] = {'M','A','I','L','B','O','X','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 77 && buf[i+2] == 77 )
		{
			MAIL_MONEY = ( buf[i+3] - 48 );
			fprintf( log, "MAIL_MONEY changed to %d-> ", MAIL_MONEY );
			char say[] = {'M','A','I','L','_','M','O','N','E','Y','c','h','a','n','g','e','d',' ','t','o',' ',48 + MAIL_MONEY,'.','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 84 && buf[i+2] == 82 )
		{
			fprintf( log, "Trader-> " );
			generate_trader_packet( buf );
			char say[] = {'T','R','A','D','E','R','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 68 && buf[i+2] == 82 )
		{
			fprintf( log, "Doctor-> " );
			generate_doctor_packet( buf );
			char say[] = {'D','O','C','T','O','R','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 'C' && buf[i+2] == 'I' )
		{
			fprintf( log, "CreateItem-> " );
			generate_createitem_packet( buf );
			char say[] = {'C','R','E','A','T','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 'A' && buf[i+2] == 'D' )
		{
			fprintf( log, "AutoABS-> " );
			if( ( buf[i+3] - 48 ) == 0 || ( buf[i+3] - 48 ) == 1 )
			{
				AUTO_ABS = ( buf[i+3] - 48 );
				char say[] = {'A','U','T','O','_','A','B','S',' ','c','h','a','n','g','e','d',' ','t','o',' ',48 + AUTO_ABS,'\0'};
				generate_systemtalk_packet( say );
			}
			else
			{
				generate_abs_packet( buf );
				char say[] = {'A','B','S','1','\0'};
				generate_systemtalk_packet( say );
			}
			return;
		}
		if( buf[i+1] == 'Q' && buf[i+2] == 'T' )
		{
			fprintf( log, "Quit-> " );
			char say[] = {'Q','U','I','T','\0'};
			generate_systemtalk_packet( say );
			generate_quit_packet( buf );
			return;
		}

		if( buf[i+1] == 66 && buf[i+2] == 75 )
		{
			fprintf( log, "Bank-> " );
			generate_bank_packet( buf );//ONLY WORKS INSIDE BANK!!!!!!!!!!!!!!!!!!!!!!
			char say[] = {'B','A','N','K','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 82 && buf[i+2] == 71 )
		{
			if( buf[i+3] == 83 && buf[i+4] == 84 && buf[i+5] == 50 )
			{
				fprintf( log, "st2RunAwayGirl-> " );
				generate_st2runawaygirl_packet( buf );
				char say[] = {'S','T','2','R','U','N','A','W','A','Y','G','I','R','L','\0'};
				generate_systemtalk_packet( say );
			}
			else
				fprintf( log, "ERROR RUNAWAY GIRL " );
			return;
		}
		if( buf[i+1] == 70 && buf[i+2] == 86 )
		{
			if( buf[i+3] == 83 && buf[i+4] == 84 && buf[i+5] == 50 )
			{
				fprintf( log, "st1FoodVendor-> " );
				generate_st1foodvendor_packet( buf );
				char say[] = {'S','T','2','F','O','O','D',' ','V','E','N','D','O','R','\0'};
				generate_systemtalk_packet( say );
				return;
			}
			if( buf[i+3] == 83 && buf[i+4] == 84 && buf[i+5] == 49 )
			{
				fprintf( log, "st1FoodVendor-> " );
				generate_st1foodvendor_packet( buf );
				char say[] = {'S','T','1','F','O','O','D',' ','V','E','N','D','O','R','\0'};
				generate_systemtalk_packet( say );
				return;
			}
			fprintf( log, "ERROR RUNAWAY GIRL " );
			return;
		}
		if( buf[i+1] == 65 && buf[i+2] == 82 )
		{
			if( buf[i+3] == 83 && buf[i+4] == 84 && buf[i+5] == 50 )
			{
				fprintf( log, "st2Arms-> " );
				generate_st2arms_packet( buf );
				char say[] = {'S','T','2','A','R','M','S',' ','D','E','A','L','E','R','\0'};
				generate_systemtalk_packet( say );
				return;
			}
			if( buf[i+3] == 83 && buf[i+4] == 84 && buf[i+5] == 49 )
			{
				fprintf( log, "st1Arms-> " );
				generate_st1arms_packet( buf );
				char say[] = {'S','T','1','A','R','M','S',' ','D','E','A','L','E','R','\0'};
				generate_systemtalk_packet( say );
				return;
			}
			fprintf( log, "ERROR ARMS " );
			return;
		}
		if( buf[i+1] == 77 && buf[i+2] == 86 )
		{
			fprintf( log, "Move-> " );
			generate_movement_packet( buf, i );
			char say[] = {'M','O','V','E','D','\0'};
			generate_systemtalk_packet( say );
			return;
		}
		if( buf[i+1] == 84 && buf[i+2] == 69 )
		{
			fprintf( log, "Teleport-> " );
			generate_random_movement_packet();
			char say[] = {'T','E','L','E','P','O','R','T','E','D','\0'};
			generate_systemtalk_packet( say );
			return;
		}
	}
	else
	{
		fprintf( log, "TalkPacket-> " );
		Pri_Client_Forward( buf );
	}
}

void Pri_Client_OpenWindow( char buf[] )
{
	fprintf( log, "OpenWindow-> " );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	Pri_Client_Forward( buf );
}

void Pri_Client_Mailbox3( char buf[] )
{
	fprintf( log, "Mailbox3-> " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Client_Forward( buf );
}

void Pri_Client_MailboxCompose( char buf[] )
{
	fprintf( log, "MailboxCompose-> " );
	//int q = 0;
	//while( buf[q] != 1 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Client_Forward( buf );
}

void Pri_Client_MailboxSendMail( char buf[] )
{
	fprintf( log, "MailboxSendMail-> " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Client_Forward( buf );
}

void Pri_Client_MailboxSendMailBody( char buf[] )
{
	fprintf( log, "MailboxSendMailBody-> " );
	int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Client_Forward( buf );
}

void Pri_Client_MailboxSendMailTitle( char buf[] )
{
	fprintf( log, "MailboxSendMailTitle-> " );
	if( MAIL_MONEY )
	{
		generate_mailmoney_packet();
		return;
	}
	else
	{
		int q = 0;
		while( buf[q] != 0 )
		{
			fprintf( log, "%d ", buf[q] );
			q++;
		}
		Pri_Client_Forward( buf );
	}
}

void Pri_Client_Quit1( char buf[] )
{
	fprintf( log, "Quit1-> " );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	PHANTOM_MODE = 0;
	Pri_Client_Forward( buf );
}

void Login_Client_Forward( char buf[] )
{
	if( send( login_server_fd, buf, strlen( buf ), 0 ) == -1 ) // Forward it to login_server
	{
		perror( "send" );
		printf( "send error in login_server_fd\n" );
		fprintf( log, "send error in login_server_fd\n" );
	}
	fprintf( log, "Login_Server \n" );
}

void Pri_Client_Forward( char buf[] )
{
	if( send( pri_server_fd, buf, strlen( buf ), 0 ) == -1 ) // Forward it to main_server
	{
		perror( "send" );
		printf( "send error in pri_server_fd\n" );
		fprintf( log, "send error in pri_server_fd\n" );
	}
	fprintf( log, "Pri_Server \n" );
	return;
}

void Sec_Client_Forward( char buf[] )
{
	if( send( sec_server_fd, buf, strlen( buf ), 0 ) == -1 ) // Forward it to main_server
	{
		perror( "send" );
		printf( "send error in sec_server_fd\n" );
		fprintf( log, "send error in sec_server_fd\n" );
	}
	fprintf( log, "Sec_Server \n" );
	return;
}

void Pri_Server_Damage( char buf[] )
{
	fprintf( log, "Damage-> ", buf );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}

	int p = 0;
	while( buf[p] != 30 && buf[p - 1] != 30 )
	{
		if( buf[p] == '\0' )
			break;
		p++;
	}
	while( buf[p] != CHARNAME[0] )
	{
		if( buf[p] == '\0' )
			break;
		p++;
	}
	if( buf[p] == CHARNAME[0] && buf[p+1] == CHARNAME[1] && buf[p+2] == CHARNAME[2] && buf[p+3] == CHARNAME[3] )
	{
		//if it is a damage packet against you, not an enemy.
		if( ON_DAMAGE_HEAL )
		{
			fprintf( log, "Doctor-> " );
			generate_doctor_packet( buf );
		}
		if( ON_DAMAGE_SKILL )
		{
			if(strstr(buf,CHARNAME) > 0)
			{
				int i = 0;
				char enemyid[25];
				while( buf[i] != 43 )
					i++;
				int k = 0;
				while( buf[i] != 7 )
				{
					enemyid[k] = buf[i];
					i++;
					k++;
				}
				char skillpacket[50] = {-6,7,15,20,7,15,7,12,7,15};
				int j;
				for( j = 0; j < k; j++ )
				{
					skillpacket[10 + j] = enemyid[j];
				}

				int numzeros = 18 - j;  // length of remaining portion of packet - j for monster id length

				int p = j + 10;
				for (int n=0; n < numzeros; n++)
				{
					skillpacket[p] = 7;
					skillpacket[p + 1] = 15;
					p += 2;
				}
				skillpacket[p] = 1;
				skillpacket[p + 1] = '\0';
				PriClientPacket( skillpacket );
			}
		}
		if( ON_DAMAGE_ATTACK )
		{
			if(strstr(buf,CHARNAME) > 0)
			{
				int i = 0;
				char enemyid[25];
				while( buf[i] != 43 )
					i++;
				int k = 0;
				while( buf[i] != 7 )
				{
					enemyid[k] = buf[i];
					i++;
					k++;
				}
				char skillpacket[50] = {-6,7,15,20,7,15,7,12,7,15};
				int j;
				for( j = 0; j < k; j++ )
				{
					skillpacket[10 + j] = enemyid[j];
				}

				int numzeros = 18 - j;  // length of remaining portion of packet - j for monster id length

				int p = j + 10;
				for (int n=0; n < numzeros; n++)
				{
					skillpacket[p] = 7;
					skillpacket[p + 1] = 15;
					p += 2;
				}
				skillpacket[p] = 1;
				skillpacket[p + 1] = '\0';
				PriClientPacket( skillpacket );
			}
		}
	}
	Pri_Server_Forward( buf );
}

void Pri_Server_Status( char buf[] )
{
	fprintf( log, "Status-> " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Server_Forward( buf );
}

void Pri_Server_Mailbox2( char buf[] )
{
	fprintf( log, "Mailbox2-> " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Server_Forward( buf );
}

void Pri_Server_Mailbox4( char buf[] )
{
	fprintf( log, "Mailbox4-> " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Server_Forward( buf );
}

void Pri_Server_MailboxContent( char buf[] )
{
	fprintf( log, "MailboxContent-> " );
	/*int i = 6;

	fprintf( log, "No: " );
	if( buf[i] == 7 )
	{
		fprintf( log, "%d  ", 15 - buf[i+1] );
		i++;
	}
	else
		fprintf( log, "%d  ", buf[i] );
	i += 4;
	fprintf( log, "Status: " );
	if( buf[i] == 14 )
		fprintf( log, "Read      " );
	else if( buf[i] == 15 )
		fprintf( log, "Not Read  " );
	else
		fprintf( log, "ERROR  " );

	while( buf[i] != ';' )
		i++;
	i++;
	fprintf( log, "From: ", buf[i] );
	while( buf[i] != 7 && buf[i] != 15 )
	{
		fprintf( log, "%c", buf[i] );
		i++;
	}
	fprintf( log, "  Title: ", buf[i] );
	while( buf[i] == 7 || buf[i] == 15 )
		i++;
	while( buf[i] != 32 )
	{
		fprintf( log, "%c", buf[i] );
		i++;
	}
	fprintf( log, "  " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	*/
	Pri_Server_Forward( buf );
}

void Pri_Server_Mailbox5( char buf[] )
{
	fprintf( log, "Mailbox5-> " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Server_Forward( buf );
}

void Pri_Server_OtherMovement( char buf[] )
{
	fprintf( log, "OtherMovement-> " );
	int i = 8;
	if( buf[i] > 64 && buf[i] < 125 ) //if it is a player
	{
		while( buf[i] != 7 )//output player name
		{
			fprintf( log, "%c", buf[i] );
			i++;
		}
		if( PLAYER_WATCH || GM_WATCH )
		{
			if( GM_WATCH )
			{
				if( buf[8] == 'G' && buf[9] == 'M' )
				{
					char say[] = {'G','M',' ','M','O','V','E','D',' ','O','N',' ','Y','O','U','R',' ','S','C','R','E','E','N','!','!','!','\0'};
					generate_systemtalk_packet( say );
				}
				if( buf[8] == 'G' && buf[9] == 'C' )
				{
					char say[] = {'G','C',' ','M','O','V','E','D',' ','O','N',' ','Y','O','U','R',' ','S','C','R','E','E','N','!','!','!','\0'};
					generate_systemtalk_packet( say );
				}
			}
			if( PLAYER_WATCH == 2 )
			{
				char say[] = {'P','L','A','Y','E','R',' ','M','O','V','E','D',' ','O','N',' ','Y','O','U','R',' ','S','C','R','E','E','N','\0'};
				generate_systemtalk_packet( say );
			}
		}
	}
	else //it is a monster
	{
		while( buf[i] != 7 ) //output monster id
		{
			fprintf( log, "%d ", buf[i] );
			i++;
		}
	}
	fprintf( log, "-> " );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	Pri_Server_Forward( buf );
}

void Pri_Server_OtherTalk( char buf[] )
{
	fprintf( log, "OtherTalk-> " );
	int q = 10;
	while( buf[q] != 10 )
	{
		fprintf( log, "%c", buf[q] );
		q++;
	}
	fprintf( log, " said \"" );
	q++;
	while( buf[q] != 1 )
	{
		fprintf( log, "%c", buf[q] );
		q++;
	}
	fprintf( log, "\"-> " );
	q = 0;
	while( buf[q] != 1 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	Pri_Server_Forward( buf );
}

void Pri_Server_OtherSight( char buf[] )
{
	fprintf( log, "OtherSight-> " );
	int i = 8;
	if( buf[i] == '?' || buf[i+1] == '?' || buf[i+2] == '?' || buf[i+4] == '?' )
		return;
	if( buf[i] > 64 && buf[i] < 125 ) //if it is a player
	{
		if( GM_WATCH )
		{
			if( buf[8] == 'G' && buf[9] == 'M' )
			{
				char say[] = {'G','M',' ','E','N','T','E','R','E','D',' ','Y','O','U','R',' ','S','C','R','E','E','N','!','!','!','\0'};
				generate_systemtalk_packet( say );
				if( GM_QUIT )
				{
					char say[] = {'Q','U','I','T','T','I','N','G','.','.','.','\0'};
					generate_systemtalk_packet( say );
					generate_quit_packet( buf );
				}
			}
			else if( buf[8] == 'G' && buf[9] == 'C' )
			{
				char say[] = {'G','C',' ','E','N','T','E','R','E','D',' ','Y','O','U','R',' ','S','C','R','E','E','N','!','!','!','\0'};
				generate_systemtalk_packet( say );
				if( GM_QUIT )
				{
					char say[] = {'Q','U','I','T','T','I','N','G','.','.','.','\0'};
					generate_systemtalk_packet( say );
					generate_quit_packet( buf );
				}
			}
			else
			{
				if( PLAYER_WATCH )
				{
					if( CHARNAME[0] != buf[8] && CHARNAME[1] != buf[9] )
					{
						char say[] = {'P','L','A','Y','E','R',' ','E','N','T','E','R','E','D',' ','Y','O','U','R',' ','S','C','R','E','E','N','!','!','!','\0'};
						generate_systemtalk_packet( say );
					}
				}
			}
		}
		if( ON_SIGHT_MOVE && LAST_SIGHTED_WAS_MONSTER )
		{
			generate_random_movement_packet();
			char say[] = {'T','E','L','E','P','O','R','T','E','D',' ','(','P','L','A','Y','E','R',')','\0'};
			generate_systemtalk_packet( say );
			IGNORE_PACKETS_TILL_PING = 1;
		}
		while( buf[i] != 7 )
		{
			fprintf( log, "%c", buf[i] );
			i++;
		}
		fprintf( log, "-> " );
		int q = 0;
		while( buf[q] != 0 )
		{
			fprintf( log, "%d ", buf[q] );
			q++;
		}
		LAST_SIGHTED_WAS_MONSTER = 0;
	}
	else
	{
		if( !IGNORE_PACKETS_TILL_PING || ENEMIES_KILLED_SINCE_PING < 25 )
		{
			if( ON_SIGHT_SKILL || ON_SIGHT_ATTACK )
			{
				while( buf[i] != 7 )
				{
					fprintf( log, "%c", buf[i] );
					i++;
				}
				while( buf[i] != 30 )
				{
					i++;
					if( i > 9990 )
						break;
				}
				i++;
				i++;
				while( buf[i] == 7 && buf[i+1] == 15 )
				{
					i++;
					i++;
					if( i > 9990 )
						break;
				}
				int x = 0;
				int y = 0;
				if( buf[i] != 7 )
				{
					if( buf[i] > 0 )
					{
						x = buf[i];
					}
					else
					{
						x = 256 + buf[i];
					}
				}
				else
				{
					i++;
					x = 15 - buf[i];
				}
				i = i + 3;
				if( buf[i] != 7 )
				{
					if( buf[i] > 0 )
					{
						y = buf[i];
					}
					else
					{
						y = 256 + buf[i];
					}
				}
				else
				{
					i++;
					y = 15 - buf[i];
				}
				fprintf( log, " at X:%d Y:%d ", x, y );
				char coords[2];
				coords[0] = x;
				coords[1] = y;
				//identify enemy
				i = 0;
				char enemyid[25];
				while( buf[i] != 43 )
					i++;
				int k = 0;
				while( buf[i] != 7 )
				{
					enemyid[k] = buf[i];
					i++;
					k++;
				}
				enemyid[k] = '\0';
				//teleport to monster if
				for( int p = 0; p < 10; p++ )
				{
					if(strstr(RECENT_MONSTERS[p],enemyid) > 0)
					{//already attacked enemy
						return;
					}
				}
				//teleport to enemy and add to RECENT_MONSTERS
				int q = 0;
				while( enemyid[q] != '\0' )
				{
					RECENT_MONSTERS[CURRENT_MONSTER][q] = enemyid[q];
					q++;
				}
				RECENT_MONSTERS[CURRENT_MONSTER][q] = '\0';
				CURRENT_MONSTER++;
				if( CURRENT_MONSTER = 10 )
					CURRENT_MONSTER = 0;
				generate_movement_packet_from_coords( coords );
				char say[] = {'T','E','L','E','P','O','R','T','E','D',' ','(','M','O','N','S','T','E','R',')','\0'};
				generate_systemtalk_packet( say );
				if( ON_SIGHT_SKILL )
				{
					char skillpacket[50] = {-6,7,15,20,7,15,7,12,7,15};
					int j;
					for( j = 0; j < k; j++ )
					{
						skillpacket[10 + j] = enemyid[j];
					}

					int numzeros = 18 - j;  // length of remaining portion of packet - j for monster id length

					int p = j + 10;
					for ( int n = 0; n < numzeros; n++ )
					{
						skillpacket[p] = 7;
						skillpacket[p + 1] = 15;
						p += 2;
					}
					skillpacket[p] = 1;
					skillpacket[p + 1] = '\0';
					PriClientPacket( skillpacket );
					ENEMIES_KILLED_SINCE_PING++;
				}
				if( ON_SIGHT_ATTACK )
				{
					//generate attack packet on enemy
					if( !ON_SIGHT_SKILL )
						ENEMIES_KILLED_SINCE_PING++;
				}
			}
			LAST_SIGHTED_WAS_MONSTER = 1;
			fprintf( log, "-> " );
			int q = 0;
			while( buf[q] != 0 )
			{
				fprintf( log, "%d ", buf[q] );
				q++;
			}
		}
	}
	Pri_Server_Forward( buf );
}

void Pri_Server_OtherSightChange( char buf[] )
{
	fprintf( log, "OtherSightChange-> " );
	int p = 8;
	while( buf[p] != 7 )
	{
		fprintf( log, "%c", buf[p] );
		p++;
	}
	fprintf( log, "-> " );
	int q = 0;
	while( buf[q] != 0 )
	{
		fprintf( log, "%d ", buf[q] );
		q++;
	}
	Pri_Server_Forward( buf );
}

void Pri_Server_OtherSkill( char buf[] )
{
	fprintf( log, "OtherSkill-> " );
	int i = 8;
	if( buf[i] > 64 && buf[i] < 125 ) //if it is a player
	{
		while( buf[i] != 7 )//output player name
		{
			fprintf( log, "%c", buf[i] );
			i++;
		}
		fprintf( log, "-> " );
	}
	else //it is a monster
	{
		while( buf[i] != 7 ) //output monster id
		{
			fprintf( log, "%d ", buf[i] );
			i++;
		}
		fprintf( log, "-> " );
		if( ON_OTHER_SKILL_HEAL )
			generate_doctor_packet( buf );
	}
	Pri_Server_Forward( buf );
}

void Pri_Server_Quit2( char buf[] )
{
	fprintf( log, "Quit2-> " );
	//int q = 0;
	//while( buf[q] != 0 )
	//{
	//	fprintf( log, "%d ", buf[q] );
	//	q++;
	//}
	Pri_Server_Forward( buf );
}

void Login_Server_Forward( char buf[] )
{
	if( send( login_client_fd, buf, strlen( buf ), 0 ) == -1 ) // Forward it to login_client
	{
		perror( "send" );
		printf( "send error in login_client_fd\n" );
		fprintf( log, "send error in login_client_fd\n" );
	}
	fprintf( log, "Login_Client \n" );
}

void Pri_Server_Forward( char buf[] )
{
	if( send( pri_client_fd, buf, strlen( buf ), 0 ) == -1 ) // Forward it to primary client
	{
		perror( "send" );
		printf( "send error in pri_client_fd\n" );
		fprintf( log, "send error in pri_client_fd\n" );
	}
	fprintf( log, "Pri_Client \n" );
}

void Sec_Server_Forward( char buf[] )
{
	if( send( sec_client_fd, buf, strlen( buf ), 0 ) == -1 ) // Forward it to secondary client
	{
		perror( "send" );
		printf( "send error in sec_client_fd\n" );
		fprintf( log, "send error in sec_client_fd\n" );
	}
	fprintf( log, "Sec_Client \n" );
}