Beispiel #1
0
BOOL
vncServer::Authenticated(vncClientId clientid)
{
	vncClientList::iterator i;
	BOOL authok = TRUE;

	omni_mutex_lock l1(m_desktopLock);
	omni_mutex_lock l2(m_clientsLock);

	// Search the unauthenticated client list
	for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
	{
		// Is this the right client?
		if ((*i) == clientid)
		{
			vncClient *client = GetClient(clientid);

			// Yes, so remove the client and add it to the auth list
			m_unauthClients.erase(i);

			// Create the screen handler if necessary
			if (m_desktop == NULL)
			{
				if (RemoveWallpaperEnabled()) {
					m_wallpaper_wait = TRUE;
					DoNotify(WM_SRV_CLIENT_HIDEWALLPAPER, 0, 0);
				}
				m_desktop = new vncDesktop();
				if (m_desktop == NULL)
				{
					vnclog.Print(LL_CONNERR, VNCLOG("failed to allocate desktop object\n"));
					client->Kill();
					authok = FALSE;
					break;
				}
				if (!m_desktop->Init(this))
				{
					vnclog.Print(LL_CONNERR, VNCLOG("failed to initialize desktop object\n"));

					client->Kill();
					authok = FALSE;

					delete m_desktop;
					m_desktop = NULL;

					break;
				}
			}

			// Create a buffer object for this client
			vncBuffer *buffer = new vncBuffer(m_desktop);
			if (buffer == NULL)
			{
				vnclog.Print(LL_CONNERR, VNCLOG("failed to allocate buffer object\n"));
				client->Kill();
				authok = FALSE;
				break;
			}

			// Tell the client about this new buffer
			client->SetBuffer(buffer);

			// Add the client to the auth list
			m_authClients.push_back(clientid);

			break;
		}
	}

	// Notify anyone interested of this event
	DoNotify(WM_SRV_CLIENT_AUTHENTICATED, 0, 0);

	vnclog.Print(LL_INTINFO, VNCLOG("Authenticated() done\n"));

	// If so configured, beep to indicate the new connection is
	// present.
	if (authok && GetBeepConnect())
	{
		MessageBeep(MB_OK);
	}

	return authok;
}
Beispiel #2
0
	float PlantExplosive::GetPriority()
	{
		if ( IsActive() )
			return GetLastPriority();

		ExplosiveTargetType myTargetType = XPLO_TYPE_DYNAMITE;
		ETQW_Weapon weaponType = ETQW_WP_HE_CHARGE;
		switch ( GetClient()->GetClass() )
		{
			case ETQW_CLASS_ENGINEER:
			{
				weaponType = ETQW_WP_HE_CHARGE;
				myTargetType = XPLO_TYPE_DYNAMITE;
				break;
			}
			/*case ETQW_CLASS_COVERTOPS:
			{
			weaponType = ETQW_WP_SATCHEL;
			myTargetType = XPLO_TYPE_SATCHEL;
			break;
			}*/
			default:
				return 0.0;
		}

		mMapGoal.reset();

		if ( InterfaceFuncs::IsWeaponCharged( GetClient(), weaponType, Primary ) )
		{
			{
				GoalManager::Query qry( 0xbbcae592 /* PLANT */, GetClient() );
				System::mInstance->mGoalManager->GetGoals( qry );
				for ( uint32_t i = 0; i < qry.mList.size(); ++i )
				{
					if ( BlackboardIsDelayed( qry.mList[ i ]->GetSerialNum() ) )
						continue;

					if ( qry.mList[ i ]->GetSlotsOpen( MapGoal::TRACK_INPROGRESS ) < 1 )
						continue;

					ConstructableState cState = InterfaceFuncs::IsDestroyable( GetClient(), qry.mList[ i ]->GetEntity() );
					if ( cState == CONST_DESTROYABLE )
					{
						mMapGoal = qry.mList[ i ];
						break;
					}
				}
			}

			if ( !mMapGoal )
			{
				GoalManager::Query qry( 0xa411a092 /* MOVER */, GetClient() );
				System::mInstance->mGoalManager->GetGoals( qry );
				for ( uint32_t i = 0; i < qry.mList.size(); ++i )
				{
					if ( BlackboardIsDelayed( qry.mList[ i ]->GetSerialNum() ) )
						continue;

					mMapGoal = qry.mList[ i ];
					break;
				}
			}
		}
		return mMapGoal ? mMapGoal->GetPriorityForClient( GetClient() ) : 0.f;
	}
Beispiel #3
0
	void MountMg42::OnTarget()
	{
		if ( !GetClient()->HasEntityFlag( ETQW_ENT_FLAG_MOUNTED ) )
			GetClient()->PressButton( BOT_BUTTON_USE );
	}
BOOL CFtpClientReqSocket::SendCommand( )
{
	CSourceURL &sourceUrl = (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->m_SourceURL;
	CStringA strLine;

	switch( m_FtpState )
	{
	case ftpUSER:// Sending login
		{			
			strLine = "USER ";
			strLine += sourceUrl.m_sLogin;
			break;
		}
	case ftpPASS:// Sending password
		{			
			strLine = "PASS ";
			strLine += sourceUrl.m_sPassword;
			break;
		}
	case ftpLIST_PASVPORT:// Selecting passive or active mode
		{			
			if ( m_bPassive )
			{
				strLine = "PASV";
			}
			break;
		}
	case ftpSIZE:// Listing file size
		{
			strLine = "SIZE ";
			int pos = sourceUrl.m_sPath.ReverseFind( _T('/') );
			if( pos == -1 ) {
				pos = sourceUrl.m_sPath.ReverseFind( _T('\\') );
			}

			if( pos == -1 ) {
				strLine += sourceUrl.m_sPath;
			} else {
				strLine += (LPCTSTR(sourceUrl.m_sPath) + pos + 1);
			}
			
			break;
		}
	case ftpCWD:
		{
			strLine = "CWD ";
			int pos = sourceUrl.m_sPath.ReverseFind( _T('/') );
			if( pos == -1 ) {
				pos = sourceUrl.m_sPath.ReverseFind( _T('\\') );
			}

			if( pos == -1 ) {
				this->m_FtpState = ftpSIZE_TYPE;
				return SendCommand();
			} else {
				CString path( LPCTSTR(sourceUrl.m_sPath) , pos );
				strLine += path;
			}
		}
		break;
	case ftpSIZE_TYPE:
	case ftpRETR_TYPE:// Selecting BINARY type for transfer
		{			
			strLine = "TYPE I";
			break;
		}
	case ftpRETR_PASVPORT:
		{
			// Selecting passive or active mode
			if ( m_bPassive )
			{
				strLine = "PASV";
			}
			break;
		}
	case ftpRETR_REST: /// 注意断点续传 
		{			
			uint64 uiStartPos;
			(DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->GetUrlStartPosForReq( uiStartPos ); //< 通知Peer层获取下载任务,并计算请求起始点
			strLine.Format( "REST %I64u", uiStartPos );
			break;
		}
	case ftpRETR: // Retrieving file
		{			
			strLine = _T("RETR ");
			int pos = sourceUrl.m_sPath.ReverseFind( _T('/') );
			if( pos == -1 ) {
				pos = sourceUrl.m_sPath.ReverseFind( _T('\\') );
			}

			if( pos == -1 ) {
				strLine += sourceUrl.m_sPath;
			} else {
				strLine += (LPCTSTR(sourceUrl.m_sPath) + pos + 1);
			}
			break;
		}
	case ftpABOR:// Transfer aborting
		{			
			strLine = _T("ABOR");
			break;
		}
	default:
		return TRUE;
	}
	
	if( GetClient() )
		GetClient()->AddPeerLog(new CTraceSendMessage((CString)strLine));

	strLine  += "\r\n";

	TRACE( "<< %s",  (LPCSTR) strLine );

/*
	char buffer[1024];

	// Convert Unicode String to MutiBytes String
	int nMulti = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)strLine.GetBuffer(), strLine.GetLength(), NULL, 0 , NULL, NULL);
	WideCharToMultiByte(CP_ACP, 0, strLine.GetBuffer(), strLine.GetLength(), buffer, nMulti, NULL, NULL);
	strLine.ReleaseBuffer();
*/

	CRawPacket* pFtpCMDPacket = new CRawPacket(strLine);
	theStats.AddUpDataOverheadFileRequest(pFtpCMDPacket->size);
	SendPacket(pFtpCMDPacket);

	return TRUE;
}
Beispiel #5
0
	State::StateStatus PlantMine::Update( float fDt )
	{
		if ( DidPathFail() )
		{
			BlackboardDelay( 10.f, mMapGoal->GetSerialNum() );
			return State_Finished;
		}

		if ( !mMapGoal->IsAvailable( GetClient()->GetTeam() ) )
			return State_Finished;

		// If it's not destroyable, consider it a success.
		if ( !InterfaceFuncs::IsDestroyable( GetClient(), mMapGoal->GetEntity() ) )
		{
			return State_Finished;
		}

		if ( mLandMineEntity.IsValid() && !IGame::IsEntityValid( mLandMineEntity ) )
			return State_Finished;

		if ( DidPathSucceed() )
		{
			GetClient()->ResetStuckTime();

			static float MIN_DIST_TO_TARGETPOS = 32.0f;
			static float MIN_DIST_TO_MINE = 32.0f;

			// Have we already thrown out a mine?
			if ( mLandMineEntity.IsValid() )
			{
				// Is it armed yet?
				if ( InterfaceFuncs::GetExplosiveState( GetClient(), mLandMineEntity ) == XPLO_ARMED )
					return State_Finished;

				// Disable avoidance for this frame.
				//.mClient->GetSteeringSystem()->SetNoAvoidTime(IGame::GetTime());

				// Not armed yet, keep trying.
				if ( EngineFuncs::EntityPosition( mLandMineEntity, mLandMinePosition ) &&
					EngineFuncs::EntityVelocity( mLandMineEntity, mLandMineVelocity ) )
				{
					GetClient()->PressButton( BOT_BUTTON_CROUCH );

					FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) );
					FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_PLIERS ) );

					// Do we need to get closer?
					bool bCloseEnough = ( GetClient()->GetPosition() - mLandMinePosition ).Length() < MIN_DIST_TO_MINE;
					GetClient()->GetSteeringSystem()->SetTarget( bCloseEnough ? GetClient()->GetPosition() : mLandMinePosition );
				}
				return State_Busy;
			}

			// Move closer if necessary.
			bool bCloseEnough = ( GetClient()->GetPosition() - mTargetPosition ).Length() < MIN_DIST_TO_TARGETPOS;
			GetClient()->GetSteeringSystem()->SetTarget( bCloseEnough ? GetClient()->GetPosition() : mTargetPosition );

			// keep watching the target position.
			FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) );
			FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_LANDMINE ) );
		}
		return State_Busy;
	}
Beispiel #6
0
	void OnClientLogin() override {
		SendAdmins(GetUser()->GetUserName() + " attached (from " + GetClient()->GetRemoteIP() + ")");
	}
Beispiel #7
0
	void SendAdmins(const CString &msg) {
		CZNC::Get().Broadcast(msg, true, nullptr, GetClient());
	}
BOOL
vncServer::Authenticated(vncClientId clientid)
{
	vncClientList::iterator i;
	BOOL authok = TRUE;
//	vnclog.Print(LL_INTINFO, VNCLOG("Lock2\n"));
	omni_mutex_lock l1(m_desktopLock);
//	vnclog.Print(LL_INTINFO, VNCLOG("Lock3\n"));
	omni_mutex_lock l2(m_clientsLock);

	// Search the unauthenticated client list
	for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
	{
		// Is this the right client?
		if ((*i) == clientid)
		{
			vncClient *client = GetClient(clientid);
			

			// Yes, so remove the client and add it to the auth list
			m_unauthClients.erase(i);

			// Create the screen handler if necessary
			if (m_desktop == NULL)
			{
				m_desktop = new vncDesktop();
				if (m_desktop == NULL)
				{
					client->Kill();
					authok = FALSE;
					break;
				}
				if (!m_desktop->Init(this))
				{
					vnclog.Print(LL_INTINFO, VNCLOG("Desktop init failed, unlock in application mode ? \n"));
					client->Kill();
					authok = FALSE;
					delete m_desktop;
					m_desktop = NULL;

					break;
				}
			}

			// Tell the client about this new buffer
			client->SetBuffer(&(m_desktop->m_buffer));

			// Add the client to the auth list
			m_authClients.push_back(clientid);

			break;
		}
	}

	// Notify anyone interested of this event
	DoNotify(WM_SRV_CLIENT_AUTHENTICATED, 0, 0);

	vnclog.Print(LL_INTINFO, VNCLOG("Authenticated() done\n"));

	return authok;
}
Beispiel #9
0
// Execute command from script
bool CChar::Player_OnVerb( CScript &s, CTextConsole * pSrc ) 
{
	ADDTOCALLSTACK("CChar::Player_OnVerb");
	if ( !m_pPlayer || !pSrc )
		return false;

	LPCTSTR pszKey = s.GetKey();
	int cpVerb = FindTableSorted( pszKey, CCharPlayer::sm_szVerbKeys, COUNTOF(CCharPlayer::sm_szVerbKeys)-1 );

	if ( cpVerb <= -1 )
	{
		if ( ( !strnicmp(pszKey, "GUILD", 5) ) || ( !strnicmp(pszKey, "TOWN", 4) ) )
		{
			bool bIsGuild = !strnicmp(pszKey, "GUILD", 5);
			pszKey += bIsGuild ? 5 : 4;
			if ( *pszKey == '.' )
			{
				pszKey += 1;
				CItemStone *pMyGuild = Guild_Find(bIsGuild ? MEMORY_GUILD : MEMORY_TOWN);
                if ( pMyGuild )
                {
                        CScript sToParse(pszKey, s.GetArgRaw());
                        return pMyGuild->r_Verb(sToParse, pSrc);
                }
			}
			return false;
		}
	}

	switch ( cpVerb )
	{
		case CPV_KICK: // "KICK" = kick and block the account
			return (IsClient() && GetClient()->addKick(pSrc));

		case CPV_PASSWORD:	// "PASSWORD"
		{
			// Set/Clear the password
			if ( pSrc != this )
			{
				if ( pSrc->GetPrivLevel() <= GetPrivLevel() || pSrc->GetPrivLevel() < PLEVEL_Admin )
				{
					pSrc->SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_PRIV));
					return false;
				}
			}

			CAccount * pAccount = m_pPlayer->GetAccount();
			ASSERT(pAccount != NULL);

			if ( !s.HasArgs() )
			{
				pAccount->ClearPassword();
				SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_PASSCLEAR));
				SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_PASSCLEAR_RELOG));
				g_Log.Event(LOGM_ACCOUNTS|LOGL_EVENT, "Account '%s', password cleared\n", pAccount->GetName());
			}
			else
			{
				if ( pAccount->SetPassword(s.GetArgStr()) )
				{
					SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_ACCEPTPASS));
					g_Log.Event(LOGM_ACCOUNTS|LOGL_EVENT, "Account '%s', password set to '%s'\n", pAccount->GetName(), s.GetArgStr());
					return true;
				}

				SysMessage(g_Cfg.GetDefaultMsg(DEFMSG_MSG_ACC_INVALIDPASS));
			}
			break;
		}

		default:
			return false;
	}

	return true;
}
	void CClientConnection::OnRawConnectFailed()
	{
		m_nState = CClient::STATE_FAILED;
		SetErrorCode(CClient::ERRCODE_NETWORK);
		GetClient()->GetClientApp()->QueueLoginFailed(GetClient());
	}
	void CClientConnection::ProcessPacket(_U32 len, const _U8* data)
	{
		if(m_nState==CClient::STATE_LOGINING)
		{
			_U16 code;
			if(len<sizeof(code))
			{
				SetErrorCode(CClient::ERRCODE_UNKOWN);
				Disconnect();
				return;
			}

			code = *data;
			switch(code)
			{
			case 0x0: // login completed
				m_nState = CClient::STATE_LOGINED;
				GetClient()->GetClientApp()->QueueLoginDone(GetClient());
				break;
			case 0x1: // redirect
				if(len<sizeof(code)+sizeof(ASOCK_ADDR))
				{
					SetErrorCode(CClient::ERRCODE_UNKOWN);
				}
				else
				{
					m_saRedirectAddr = *((const ASOCK_ADDR*)(data+sizeof(code)));
					m_nLoginDataSize = (_U16)len - sizeof(code) - sizeof(ASOCK_ADDR) + sizeof(_U16);
					if(m_nLoginDataSize>sizeof(m_LoginData))
					{
						SetErrorCode(CClient::ERRCODE_UNKOWN);
					}
					else
					{
						*((_U16*)m_LoginData) = (_U16)m_nLoginDataSize - sizeof(_U16);
						memcpy(m_LoginData+sizeof(_U16), data+sizeof(code)+sizeof(ASOCK_ADDR), (size_t)m_nLoginDataSize);
						m_bNeedRedirect = true;
					}
				}
				Disconnect();
				break;
			default:
				ZION_ASSERT(0);
				SetErrorCode(CClient::ERRCODE_UNKOWN);
				Disconnect();
				break;
			}
		}
		else if(m_nState==CClient::STATE_LOGINED)
		{
			_U16 id;
			if(len<sizeof(id))
			{
				SetErrorCode(CClient::ERRCODE_UNKOWN);
				Disconnect();
			}
			else
			{
				id = *((const _U16*)data);
				GetClient()->GetClientApp()->QueueData(GetClient(), id&0xff, id>>8, len-sizeof(id), data+sizeof(id));
			}
		}
void CHttpClientReqSocket::OnConnect(int nErrorCode)
{
	CClientReqSocket::OnConnect(nErrorCode);
	if (GetClient())
		GetClient()->OnSocketConnected(nErrorCode);
}
Beispiel #13
0
void GWindow::Pour()
{
	GRect Cli = GetClient();
	if (!Cli.Valid())
		return;
	GRegion Client(Cli);
	GViewI *MenuView = 0;

	GRegion Update(Client);
	bool HasTools = false;
	GViewI *v;
	List<GViewI>::I Lst = Children.Start();

	{
		GRegion Tools;
		
		for (v = *Lst; v; v = *++Lst)
		{
			bool IsMenu = MenuView == v;
			if (!IsMenu && IsTool(v))
			{
				GRect OldPos = v->GetPos();
				Update.Union(&OldPos);
				
				if (HasTools)
				{
					// 2nd and later toolbars
					if (v->Pour(Tools))
					{
						if (!v->Visible())
						{
							v->Visible(true);
						}

						if (OldPos != v->GetPos())
						{
							// position has changed update...
							v->Invalidate();
						}

						Tools.Subtract(&v->GetPos());
						Update.Subtract(&v->GetPos());
					}
				}
				else
				{
					// First toolbar
					if (v->Pour(Client))
					{
						HasTools = true;

						if (!v->Visible())
						{
							v->Visible(true);
						}

						if (OldPos != v->GetPos())
						{
							v->Invalidate();
						}

						GRect Bar(v->GetPos());
						Bar.x2 = GetClient().x2;

						Tools = Bar;
						Tools.Subtract(&v->GetPos());
						Client.Subtract(&Bar);
						Update.Subtract(&Bar);
					}
				}
			}
		}
	}

	Lst = Children.Start();
	for (GViewI *v = *Lst; v; v = *++Lst)
	{
		bool IsMenu = MenuView == v;
		if (!IsMenu && !IsTool(v))
		{
			GRect OldPos = v->GetPos();
			Update.Union(&OldPos);

			if (v->Pour(Client))
			{
				GRect p = v->GetPos();

				if (!v->Visible())
				{
					v->Visible(true);
				}

				v->Invalidate();

				Client.Subtract(&v->GetPos());
				Update.Subtract(&v->GetPos());
			}
			else
			{
				// non-pourable
			}
		}
	}
	
	for (int i=0; i<Update.Length(); i++)
	{
		Invalidate(Update[i]);
	}
}
Beispiel #14
0
void GWindow::Pour()
{
	GRegion Client(GetClient());
	GRegion Update;
	bool HasTools = false;
	GViewI *v;

	{
		GRegion Tools;

		for (v = Children.First(); v; v = Children.Next())
		{
			GView *k = dynamic_cast<GView*>(v);
			if (k && k->_IsToolBar)
			{
				GRect OldPos = v->GetPos();
				Update.Union(&OldPos);

				if (HasTools)
				{
					// 2nd and later toolbars
					if (v->Pour(Tools))
					{
						if (!v->Visible())
						{
							v->Visible(true);
						}

						if (OldPos != v->GetPos())
						{
							// position has changed update...
							v->Invalidate();
						}

						Tools.Subtract(&v->GetPos());
						Update.Subtract(&v->GetPos());
					}
				}
				else
				{
					// First toolbar
					if (v->Pour(Client))
					{
						HasTools = true;

						if (!v->Visible())
						{
							v->Visible(true);
						}

						if (OldPos != v->GetPos())
						{
							v->Invalidate();
						}

						GRect Bar(v->GetPos());
						Bar.x2 = GetClient().x2;
						Tools = Bar;
						Tools.Subtract(&v->GetPos());
						Client.Subtract(&Bar);
						Update.Subtract(&Bar);
					}
				}
			}
		}
	}

	for (v = Children.First(); v; v = Children.Next())
	{
		GView *k = dynamic_cast<GView*>(v);
		if (!(k && k->_IsToolBar))
		{
			GRect OldPos = v->GetPos();
			Update.Union(&OldPos);

			if (v->Pour(Client))
			{
				if (!v->Visible())
				{
					v->Visible(true);
				}

				if (OldPos != v->GetPos())
				{
					// position has changed update...
					v->Invalidate();
				}

				Client.Subtract(&v->GetPos());
				Update.Subtract(&v->GetPos());
			}
			else
			{
				// make the view not visible
				// v->Visible(FALSE);
			}
		}
	}

	for (int i=0; i<Update.Length(); i++)
	{
		Invalidate(Update[i]);
	}
}
Beispiel #15
0
	virtual void OnClientLogin() override {
		Log("[" + GetUser()->GetUserName() + "] connected to ZNC from " + GetClient()->GetRemoteIP());
	}
Beispiel #16
0
void CChatChanMember::SendChatMsg(CHATMSG_TYPE iType, LPCTSTR pszName1, LPCTSTR pszName2, CLanguageID lang )
{
	ADDTOCALLSTACK("CChatChanMember::SendChatMsg");
	GetClient()->addChatSystemMessage(iType, pszName1, pszName2, lang );
}
Beispiel #17
0
	virtual void OnClientDisconnect() override {
		Log("[" + GetUser()->GetUserName() + "] disconnected from ZNC from " + GetClient()->GetRemoteIP());
	}
Beispiel #18
0
void CChatChanMember::ToggleReceiving()
{
	ADDTOCALLSTACK("CChatChanMember::ToggleReceiving");
	m_fReceiving = !m_fReceiving;
	GetClient()->addChatSystemMessage((m_fReceiving) ? CHATMSG_ReceivingPrivate : CHATMSG_NoLongerReceivingPrivate);
}
Beispiel #19
0
	void OnClientDisconnect() override {
		SendAdmins(GetUser()->GetUserName() + " detached (from " + GetClient()->GetRemoteIP() + ")");
	}
Beispiel #20
0
LPCTSTR CChatChanMember::GetChatName() const
{
	ADDTOCALLSTACK("CChatChanMember::GetChatName");
	return( GetClient()->GetAccount()->m_sChatName );
}
/// 收到一个headerLine后对应发下一个Command或连接数据通道(  edit code from shareaza )
BOOL CFtpClientReqSocket::OnHeaderLine ( CStringA& strHeader, CStringA& strValue )
{
	TRACE( ">> %s: %s\n", strHeader, strValue );
	m_bDecLaunchTimes = FALSE;
	m_bServerErr = FALSE;

	if( strHeader[0]=='4' )
	{		
		m_bDecLaunchTimes = TRUE;
	}
	else if( strHeader[0]=='5' )
	{
		m_bServerErr = TRUE;
	}
	
	if( strHeader=="450" && m_FtpState==ftpABOR )
	{
		return TRUE;
	}
	else if( m_bDecLaunchTimes || m_bServerErr )
	{
		(DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->OnCmdSocketErr(strHeader);
		return TRUE;
	}
   
	switch( m_FtpState )
	{
	case ftpConnecting:
		if ( strHeader == "220" ) // Connected
		{		
			m_FtpState = ftpUSER;
			return SendCommand();
		}
		break;

	case ftpUSER:
		if ( strHeader == "331" )	// Access allowed
		{				
			m_FtpState = ftpPASS;
			return SendCommand ();
		} else if( strHeader == "230" ) {	// no need pass
			m_FtpState = ftpSIZE_TYPE;  // ftpSIZE_TYPE
			return SendCommand();
		}

		// Wrong login or other errors
		// 530: This FTP server is anonymous only.
		break;

	case ftpPASS:
		if ( strHeader == "230" )	// Logged in
		{
			m_FtpState = ftpCWD;  // ftpSIZE_TYPE
			return SendCommand();
		} 		
		break;
	case ftpCWD:
		if ( strHeader == "250" )	// Type I setted
		{
			m_FtpState = ftpSIZE_TYPE;
			return SendCommand();
		} 		
		break;
	case ftpSIZE_TYPE:
		if ( strHeader == "200" )	// Type I setted
		{
			m_FtpState = ftpSIZE;			
			return SendCommand();
		} 		
		break;
	case ftpSIZE:
		if ( strHeader == "213" )	// SIZE reply
		{
			uint64 ui64FileSize = _atoi64( strValue );
			if( (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->OnFileSizeKnown( ui64FileSize ) ) //can go on 
			{
				m_FtpState = ftpRETR_PASVPORT;
				return SendCommand();
			}
			else
			{
				m_FtpState = ftpABOR; //< 对应的Peer不参与下载,socket abort 结束!
				return SendCommand();
			}
		} 				
		break;

	case ftpRETR_TYPE:
		if ( strHeader == "200" )	// Type I setted
		{
			m_FtpState = ftpRETR_PASVPORT;
			return SendCommand();
		} 
		break;

	case ftpRETR_PASVPORT:
		if ( strHeader == "227" || strHeader == "200" )	// Entered passive or active mode
		{			
			if ( m_bPassive )
			{
				SOCKADDR_IN host;
				if( !ParsePASVArgs( strValue, host ) )
				{
					// Wrong PASV reply format
					ASSERT( FALSE );
					return FALSE;
				}
				else
				{
					CFtpClientDataSocket *pClientDataSocket = (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->GetClientDataSocket(false);
					if( NULL!=pClientDataSocket )
						(DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->CloseDataSocket();
					pClientDataSocket = (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->GetClientDataSocket();
					if( pClientDataSocket->Create() )
					{
						/// 按ftp服务器给的ip地址和端口开始连通数据通道.
						pClientDataSocket->Connect( (SOCKADDR*)&host, sizeof host );
						return TRUE;
					}
					else
					{
						m_FtpState = ftpABOR;
					}
					//return TRUE;
				}
			}
			else
			{
				m_FtpState = ftpABOR;				
			}		
			m_FtpState = ftpRETR_REST;
			return SendCommand();
		} 		
		break;

	case ftpRETR_REST:
		if ( strHeader == "350" )	// Offset setted
		{		
			GetClient()->SetDownloadState( DS_DOWNLOADING ); //这时候就应该进入下载阶段了.

			m_FtpState = ftpRETR;
			return SendCommand (); /// ok,可以开始向ftp服务器请求要下载的文件了
		}
		break;

	case ftpRETR:
		if ( strHeader == "125" || strHeader == "150" )	// Transfer started
		{
			//GetClient()->SetDownloadState( DS_DOWNLOADING ); //放在这里可能数据已经来了,但该消息还没来.他们是异步的.
			m_FtpState = ftpDownloading;			
			return TRUE; // Downloading
		} 
		else if ( strHeader == "226" || strHeader == "426" )	// Transfer completed
		{
			m_FtpState = ftpABOR; // Aborting
			return FALSE;
		} 

		break;

	case ftpABOR:
		{
			if( GetClient() && (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->PendingBlockReqCount()>0 )
			{
				m_FtpState = ftpRETR_REST; //ftpRETR_PASVPORT
				SendCommand();
			}	
		}
		break;
	case ftpDownloading:
		{
			/// 下载中如果没出错,那就是下完了
		}
		break;
	case ftpClose:
		{									
			if( GetClient() && (DYNAMIC_DOWNCAST(CFtpClient,GetClient()))->PendingBlockReqCount()>0 )
			{
				m_FtpState = ftpRETR_PASVPORT;
				SendCommand();
			}			
		}
		break;
	default:
		ASSERT( FALSE ); // Really unexpected errors
	}

	return FALSE;
}
Beispiel #22
0
bool CChar::Use_Key( CItem * pKey, CItem * pItemTarg )
{
	ADDTOCALLSTACK("CChar::Use_Key");
	ASSERT(pKey);
	ASSERT(pKey->IsType(IT_KEY));
	if ( !pItemTarg )
	{
		SysMessageDefault(DEFMSG_MSG_KEY_TARG);
		return false;
	}

	if ( pKey != pItemTarg && pItemTarg->IsType(IT_KEY) )
	{
		// We are trying to copy a key ?
		if ( !CanUse(pItemTarg, true) )
		{
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_REACH);
			return false;
		}

		if ( !pKey->m_itKey.m_lockUID && !pItemTarg->m_itKey.m_lockUID )
		{
			SysMessageDefault(DEFMSG_MSG_KEY_BLANKS);
			return false;
		}
		if ( pItemTarg->m_itKey.m_lockUID && pKey->m_itKey.m_lockUID )
		{
			SysMessageDefault(DEFMSG_MSG_KEY_NOTBLANKS);
			return false;
		}

		// Need tinkering tools ???
		if ( !Skill_UseQuick(SKILL_TINKERING, 30 + Calc_GetRandLLVal(40)) )
		{
			SysMessageDefault(DEFMSG_MSG_KEY_FAILC);
			return false;
		}
		if ( pItemTarg->m_itKey.m_lockUID )
			pKey->m_itKey.m_lockUID = pItemTarg->m_itKey.m_lockUID;
		else
			pItemTarg->m_itKey.m_lockUID = pKey->m_itKey.m_lockUID;
		return true;
	}

	if ( !pKey->m_itKey.m_lockUID )
	{
		SysMessageDefault(DEFMSG_MSG_KEY_ISBLANK);
		return false;
	}
	if ( pKey == pItemTarg )	// rename the key
	{
		if ( IsClient() )
			GetClient()->addPromptConsole(CLIMODE_PROMPT_NAME_KEY, g_Cfg.GetDefaultMsg(DEFMSG_MSG_KEY_SETNAME), pKey->GetUID());
		return false;
	}

	if ( !CanUse(pItemTarg, false) )
	{
		SysMessageDefault(DEFMSG_MSG_KEY_CANTREACH);
		return false;
	}

	if ( m_pArea->GetResourceID() == pKey->m_itKey.m_lockUID )
	{
		if ( Use_MultiLockDown(pItemTarg) )
			return true;
	}

	if ( !pItemTarg->m_itContainer.m_lockUID )	// or m_itContainer.m_lockUID
	{
		SysMessageDefault(DEFMSG_MSG_KEY_NOLOCK);
		return false;
	}
	if ( !pKey->IsKeyLockFit(pItemTarg->m_itContainer.m_lockUID) )	// or m_itKey
	{
		SysMessageDefault(DEFMSG_MSG_KEY_WRONGLOCK);
		return false;
	}

	return Use_KeyChange(pItemTarg);
}
void CFtpClientReqSocket::DataReceived(const BYTE* pucData, UINT uSize)
{	
	if( !IsEntireResponse((const char*)pucData,uSize) ) //先检查是否有一个完整HeaderLine回来了..
		return ;

	CStringA strLine;
	CStringA strNumber;
	CStringA strMultiNumber;
	CStringA strMultiReply;

	LPCSTR pData=(LPCSTR)pucData;
	bool bMultiLine = false;

	while ( uSize>0 )
	{
		LPCSTR pszNl = (LPCSTR)memchr(pData, '\n', uSize);

		if(!pszNl)
			return;
		
		int iLineLen = pszNl - pData;
		ASSERT( iLineLen >= 0 );
		if (iLineLen > 0)
			strLine = CStringA(pData, iLineLen - 1); 

		pData += (strLine.GetLength() + 2);
		uSize -= (strLine.GetLength() + 2);

		if( GetClient() )
		{
			GetClient()->AddPeerLog(new CTraceServerMessage(CString(strLine)));
		}

		BOOL bNumber = ( strLine.GetLength() >= 3 ) &&
			_istdigit( strLine[0] ) && _istdigit( strLine[1] ) && _istdigit( strLine[2] );

		if ( bNumber )
			strNumber = strLine.Left( 3 );

		if ( !bMultiLine && bNumber && strLine[3] == _T('-') )
		{
			// Got first line of multi-line reply
			bMultiLine = TRUE;
			strMultiNumber = strNumber;
			strMultiReply = strLine.Mid( 4 );
		}
		else if ( !bMultiLine && bNumber )
		{
			// Got single-line reply
			if ( !OnHeaderLine( strNumber, strLine.Mid( 4 ).Trim( " \t\r\n" ) ) ) 
				return ;
		}
		else if ( bMultiLine && bNumber && strLine[3] == ' ' &&
			strMultiNumber == strNumber )
		{
			// Got last line of multi-line reply
			bMultiLine = FALSE;
			strMultiReply += "\n";
			strMultiReply += strLine.Mid( 4 );
			if ( ! OnHeaderLine( strNumber, strMultiReply.Trim( " \t\r\n" ) ) )
				return ;
		}
		else if ( bMultiLine )
		{			
			strMultiReply += "\n";
			strMultiReply += strLine;
		}
	}
}
Beispiel #24
0
bool CChar::Use_KeyChange( CItem * pItemTarg )
{
	ADDTOCALLSTACK("CChar::Use_KeyChange");
	// Lock or unlock the item.
	switch ( pItemTarg->GetType() )
	{
		case IT_SIGN_GUMP:
			// We may rename the sign.
			if ( IsClient() )
				GetClient()->addPromptConsole(CLIMODE_PROMPT_NAME_SIGN, g_Cfg.GetDefaultMsg(DEFMSG_MSG_KEY_TARG_SIGN), pItemTarg->GetUID());
			return true;
		case IT_CONTAINER:
			pItemTarg->SetType(IT_CONTAINER_LOCKED);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_CONT_LOCK);
			break;
		case IT_CONTAINER_LOCKED:
			pItemTarg->SetType(IT_CONTAINER);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_CONT_ULOCK);
			break;
		case IT_SHIP_HOLD:
			pItemTarg->SetType(IT_SHIP_HOLD_LOCK);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_HOLD_LOCK);
			break;
		case IT_SHIP_HOLD_LOCK:
			pItemTarg->SetType(IT_SHIP_HOLD);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_HOLD_ULOCK);
			break;
		case IT_DOOR:
		case IT_DOOR_OPEN:
			pItemTarg->SetType(IT_DOOR_LOCKED);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_DOOR_LOCK);
			break;
		case IT_DOOR_LOCKED:
			pItemTarg->SetType(IT_DOOR);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_DOOR_ULOCK);
			break;
		case IT_SHIP_TILLER:
			if ( IsClient() )
				GetClient()->addPromptConsole(CLIMODE_PROMPT_NAME_SHIP, g_Cfg.GetDefaultMsg(DEFMSG_MSG_SHIPNAME_PROMT), pItemTarg->GetUID());
			return true;
		case IT_SHIP_PLANK:
			pItemTarg->Ship_Plank(false);	// just close it.
			if ( pItemTarg->GetType() == IT_SHIP_SIDE_LOCKED )
			{
				pItemTarg->SetType(IT_SHIP_SIDE);
				SysMessageDefault(DEFMSG_MSG_KEY_TARG_SHIP_ULOCK);
				break;
			}
			// Then fall thru and lock it.
		case IT_SHIP_SIDE:
			pItemTarg->SetType(IT_SHIP_SIDE_LOCKED);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_SHIP_LOCK);
			break;
		case IT_SHIP_SIDE_LOCKED:
			pItemTarg->SetType(IT_SHIP_SIDE);
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_SHIP_ULOCK);
			break;
		default:
			SysMessageDefault(DEFMSG_MSG_KEY_TARG_NOLOCK);
			return false;
	}

	pItemTarg->Sound(0x049);
	return true;
}
Beispiel #25
0
	State::StateStatus BuildConstruction::Update( float fDt )
	{
		if ( DidPathFail() )
		{
			BlackboardDelay( 10.f, mMapGoal->GetSerialNum() );
			return State_Finished;
		}

		if ( !mMapGoal->IsAvailable( GetClient()->GetTeam() ) )
			return State_Finished;

		//////////////////////////////////////////////////////////////////////////
		// Check the construction status
		ConstructableState cState = InterfaceFuncs::GetConstructableState( GetClient(), mMapGoal->GetEntity() );
		switch ( cState )
		{
			case CONST_INVALID: // Invalid constructable, fail
				return State_Finished;
			case CONST_BUILT:	// It's built, consider it a success.
				return State_Finished;
			case CONST_UNBUILT:
			case CONST_BROKEN:
				// This is what we want.
				break;
		}
		//////////////////////////////////////////////////////////////////////////

		if ( DidPathSucceed() )
		{
			float fDistanceToConstruction = ( mConstructionPos - GetClient()->GetPosition() ).SquaredLength();
			if ( fDistanceToConstruction > 4096.0f )
			{
				// check for badly waypointed maps
				if ( !mAdjustedPosition )
				{
					// use our z value because some trigger entities may be below the ground
					Vector3f checkPos( mConstructionPos.X(), mConstructionPos.Y(), GetClient()->GetEyePosition().Z() );

					obTraceResult tr;
					EngineFuncs::TraceLine( tr, GetClient()->GetEyePosition(), checkPos,
						NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), GetClient()->GetGameID(), True );

					if ( tr.mFraction != 1.0f && !tr.mHitEntity.IsValid() )
					{
						mMapGoal->SetDeleteMe( true );
						return State_Finished;
					}

					// do a trace to adjust position
					EngineFuncs::TraceLine( tr,
						GetClient()->GetEyePosition(),
						mConstructionPos,
						NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), -1, False );

					if ( tr.mFraction != 1.0f )
					{
						mConstructionPos = *(Vector3f*)tr.mEndpos;
					}

					mAdjustedPosition = true;
				}
			}
			else
			{
				FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) );
				FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_PLIERS ) );
			}
			GetClient()->GetSteeringSystem()->SetTarget( mConstructionPos, 64.f );
		}
		return State_Busy;
	}
Beispiel #26
0
void GSplitter::CalcRegions(bool Follow)
{
	GRect Rect = GetClient();
	
	d->PosA = Rect;
	if (Border())
	{
		d->PosA.Size(SPLITER_BORDER, SPLITER_BORDER);
	}

	d->PosB = d->PosA;

	if (d->SplitFollow && Follow)
	{
		d->SplitPos = max(1, ((d->Vertical) ? X()-10 : Y()-10) + d->SplitSet);
	}
	else if (Rect.Valid())
	{
		int Max = d->Vertical ? X()-10 : Y()-10;
		if (Max > 0)
		{
			d->SplitPos = max(1, d->SplitPos);
			d->SplitPos = min(Max, d->SplitPos);
		}
	}

	if (d->Vertical)
	{
		d->PosA.x2 = d->PosA.x1 + d->SplitPos;
		d->PosB.x1 = d->PosA.x2 + d->BarSize;
	}
	else
	{
		d->PosA.y2 = d->PosA.y1 + d->SplitPos;
		d->PosB.y1 = d->PosA.y2 + d->BarSize;
	}

	GRect r = d->PosA;
	if (d->BorderA)
	{
		r.Size(SPLITER_INSET, SPLITER_INSET);
	}

	if (d->ViewA)
	{
		if (d->ViewA->IsAttached())
		{
			if (r.Valid())
			{
				GRegion Rgn(r);
				d->ViewA->SetPos(r);
				d->ViewA->Pour(Rgn);
			}
			d->ViewA->Visible(r.Valid());
		}
		else
		{
			d->ViewA->SetPos(r);
		}
	}

	r = d->PosB;
	if (d->BorderB)
	{
		r.Size(SPLITER_INSET, SPLITER_INSET);
	}

	if (d->ViewB)
	{
		if (d->ViewB->IsAttached())
		{
			if (r.Valid())
			{
				GRegion Rgn(r);
				d->ViewB->SetPos(r);
				d->ViewB->Pour(Rgn);
			}
			d->ViewB->Visible(r.Valid());
		}
		else
		{
			d->ViewB->SetPos(r);
		}
	}

	#if 0
	if (d->ViewA && !stricmp(d->ViewA->GetClass(), "GTree"))
	{
		printf("Split::OnPosChange cli=%s a=%s b=%s\n",
			GetClient().GetStr(),
			d->PosA.GetStr(),
			d->PosB.GetStr());
	}
	#endif
	
	// printf("CalcPos Client=%s Value=%i A=%s B=%s\n", GetClient().GetStr(), (int)Value(), d->PosA.GetStr(), d->PosB.GetStr());
}
Beispiel #27
0
	State::StateStatus PlantExplosive::_UpdateDynamite()
	{
		switch ( mGoalState )
		{
			case LAY_EXPLOSIVE:
			{
				if ( !InterfaceFuncs::IsWeaponCharged( GetClient(), ETQW_WP_HE_CHARGE, Primary ) )
					return State_Finished;

				/*if(.mClient->IsDebugEnabled(BOT_DEBUG_GOALS))
				{
				RenderBuffer::AddOBB(.mMapGoal->GetWorldBounds(), COLOR::ORANGE);

				Vector3f vCenter;
				mMapGoal->GetWorldBounds().CenterPoint(vCenter);
				RenderBuffer::AddLine(.mClient->GetPosition(), vCenter, COLOR::GREEN, 1.0f);
				RenderBuffer::AddLine(.mClient->GetPosition(), mMapGoal->GetPosition(), COLOR::RED, 1.0f);
				}*/

				float fDistanceToTarget = ( mTargetPosition - GetClient()->GetPosition() ).SquaredLength();
				if ( fDistanceToTarget > 10000.0f )
				{
					// Move toward it.
					//.mClient->GetSteeringSystem()->SetTarget(.mTargetPosition);

					// check for badly waypointed maps
					if ( !mAdjustedPosition )
					{
						mAdjustedPosition = true;

						// use our z value because some trigger entities may be below the ground
						Vector3f vCheckPos( mTargetPosition.X(), mTargetPosition.Y(), GetClient()->GetEyePosition().Z() );
						/*if(.mClient->IsDebugEnabled(BOT_DEBUG_GOALS))
						{
						RenderBuffer::AddLine(GetClient()->GetEyePosition(), vCheckPos, COLOR::GREEN, 2.0f);
						}*/

						obTraceResult tr;
						EngineFuncs::TraceLine( tr, GetClient()->GetEyePosition(), vCheckPos,
							NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), GetClient()->GetGameID(), True );
						if ( tr.mFraction != 1.0f && !tr.mHitEntity.IsValid() )
						{
							//.mTargetEntity->SetDeleteMe(true);
							return State_Finished;
						}

						// do a trace to adjust position
						EngineFuncs::TraceLine( tr, GetClient()->GetEyePosition(), mTargetPosition,
							NULL, ( TR_MASK_SOLID | TR_MASK_PLAYERCLIP ), -1, False );
						if ( tr.mFraction != 1.0f )
						{
							mTargetPosition = Vector3f( tr.mEndpos );
						}
					}
				}
				else
				{
					// We're within range, so let's start laying.
					GetClient()->ResetStuckTime();
					FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) );
					FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_HE_CHARGE ) );
				}
				break;
			}
			case ARM_EXPLOSIVE:
			{
				if ( InterfaceFuncs::GetExplosiveState( GetClient(), mExplosiveEntity ) == XPLO_ARMED )
				{
					BlackboardDelay( 30.f, mMapGoal->GetSerialNum() );
					return State_Finished;
				}

				// Disable avoidance for this frame.
				GetClient()->GetSteeringSystem()->SetNoAvoidTime( IGame::GetTime() );

				// update dynamite position
				EngineFuncs::EntityPosition( mExplosiveEntity, mExplosivePosition );

				// move a little bit close if dyno too far away
				if ( ( mExplosivePosition - GetClient()->GetPosition() ).SquaredLength() > 2500.0f )
				{
					GetClient()->GetSteeringSystem()->SetTarget( mExplosivePosition );
				}
				else
				{
					GetClient()->ResetStuckTime();
					FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) );
					FINDSTATEIF( WeaponSystem, GetRootState(), AddWeaponRequest( Priority::Medium, GetNameHash(), ETQW_WP_PLIERS ) );
				}
				break;
			}
			default:
				// keep processing
				break;
		}
		return State_Busy;
	}
Beispiel #28
0
void GSplitter::OnPaint(GSurface *pDC)
{
	GRect r = GetClient();

	pDC->Colour(LC_MED, 24);
	if (Border())
	{
		LgiFlatBorder(pDC, r, SPLITER_BORDER);
	}

	// bar
	pDC->Colour(LC_MED, 24);
	if (d->Vertical)
	{
		/* Old Win32
		pDC->Rectangle(PosA.x2, PosA.y1, PosB.x1, PosA.y2);
		pDC->Rectangle(PosA.x1, PosA.y2, PosA.x2, PosB.y1);
		*/
		pDC->Rectangle(d->PosA.x2+1, r.y1, d->PosB.x1-1, r.y2);
	}
	else
	{
		pDC->Rectangle(r.x1, d->PosA.y2+1, r.x2, d->PosB.y1-1);
	}

	// PosA region
	r = d->PosA;
	if (r.X() > SPLITER_MIN_X && r.Y() > SPLITER_MIN_Y)
	{
		if (d->BorderA)
		{
			LgiWideBorder(pDC, r, DefaultSunkenEdge);
		}

		if (d->ViewA)
		{
			#ifdef WIN32
			if (!d->ViewA->Handle())
			{
				pDC->SetClient(&d->PosA);
				d->ViewA->OnPaint(pDC);
				pDC->SetClient(NULL);
			}
			else
			#endif
			{
				// View is real and will paint itself
			}
		}
		else
		{
			pDC->Colour(LC_WORKSPACE, 24);
			pDC->Rectangle(&r);
		}
	}
	else
	{
		// too small
	}

	r = d->PosB;
	if (r.X() > SPLITER_MIN_X && r.Y() > SPLITER_MIN_Y)
	{
		if (d->BorderB)
		{
			LgiWideBorder(pDC, r, DefaultSunkenEdge);
		}

		if (d->ViewB)
		{
			#ifdef WIN32
			if (!d->ViewB->Handle())
			{
				pDC->SetClient(&d->PosB);
				d->ViewB->OnPaint(pDC);
				pDC->SetClient(NULL);
			}
			else
			#endif
			{
				// View is real and will paint itself
			}
		}
		else
		{
			pDC->Colour(LC_WORKSPACE, 24);
			pDC->Rectangle(&r);
		}
	}
	else
	{
		// too small
	}
}
Beispiel #29
0
	State::StateStatus MountMg42::Update( float fDt )
	{
		if ( DidPathFail() )
		{
			BlackboardDelay( 10.f, mMapGoal->GetSerialNum() );
			return State_Finished;
		}

		if ( !mMapGoal->IsAvailable( GetClient()->GetTeam() ) )
			return State_Finished;

		//////////////////////////////////////////////////////////////////////////
		// Only fail if a friendly player is on this gun or gun has been destroyed in the meantime
		//int gunHealth = InterfaceFuncs::GetGunHealth(.mClient, mMG42Goal->GetEntity());
		GameEntity mounter = InterfaceFuncs::GetMountedPlayerOnMG42( GetClient(), mMapGoal->GetEntity() );
		if ( InterfaceFuncs::IsMountableGunRepairable( GetClient(), mMapGoal->GetEntity() ) ||
			( mounter.IsValid() && ( mounter != GetClient()->GetGameEntity() ) && GetClient()->IsAllied( mounter ) ) )
		{
			return State_Finished;
		}
		//////////////////////////////////////////////////////////////////////////

		if ( DidPathSucceed() )
		{
			GetClient()->GetSteeringSystem()->SetTarget( mMapGoal->GetPosition() );
			FINDSTATEIF( Aimer, GetRootState(), AddAimRequest( Priority::Medium, this, GetNameHash() ) );

			if ( GetClient()->HasEntityFlag( ETQW_ENT_FLAG_MOUNTED ) )
			{
				mTargetZone.Update( GetClient() );

				if ( !mGotGunProperties )
				{
					mGotGunProperties = true;
					_GetMG42Properties();
					mAimPoint = mMapGoal->GetPosition() + mGunCenterArc * 512.f;
				}

				if ( mNextScanTime < IGame::GetTime() )
				{
					mNextScanTime = IGame::GetTime() + (int)Mathf::IntervalRandom( 2000.0f, 7000.0f );
					mScanDirection = (int)Mathf::IntervalRandom( 0.0f, (float)NUM_SCAN_TYPES );

					// we're mounted, so lets look around mid view.
					mTargetZone.UpdateAimPosition();
				}

				if ( mTargetZone.HasAim() )
					mScanDirection = SCAN_ZONES;

				switch ( mScanDirection )
				{
					case SCAN_DEFAULT:
						if ( mMapGoal->GetFacing() != Vector3f::ZERO )
						{
							mAimPoint = mMG42Position + mMapGoal->GetFacing() * 1024.f;
							break;
						}
					case SCAN_MIDDLE:
					{
						mAimPoint = mMG42Position + mGunCenterArc * 1024.f;
						break;
					}
					case SCAN_LEFT:
						if ( mScanLeft != Vector3f::ZERO )
						{
							mAimPoint = mMG42Position + mScanLeft * 1024.f;
							break;
						}
					case SCAN_RIGHT:
						if ( mScanRight != Vector3f::ZERO )
						{
							mAimPoint = mMG42Position + mScanRight * 1024.f;
							break;
						}
					case SCAN_ZONES:
					{
						mAimPoint = mTargetZone.GetAimPosition();
						break;
					}
					default:
						break;
				}
			}
		}
		return State_Busy;
	}
Beispiel #30
0
void CDuiSplitWnd::Relayout(UINT uMode)
{
	CRect rcClient;
	GetClient(&rcClient);

	BOOL bRowSplit=!m_bColMode;
	BOOL bColSplit=m_bColMode;

	if((uMode & layout_vert) && bColSplit)
	{//列模式,垂直方向发生变化
		for(int i=0;i<m_arrPane.GetCount(); i++)
		{
			CRect rcPane;
			m_arrPane[i]->GetRect(&rcPane);
			rcPane.top=rcClient.top;
			rcPane.bottom=rcClient.bottom;
			m_arrPane[i]->Move(rcPane);
		}
	}else if(uMode & layout_horz && bRowSplit)
	{//行模式,水平方向发生变化
		for(int i=0;i<m_arrPane.GetCount(); i++)
		{
			CRect rcPane;
			m_arrPane[i]->GetRect(&rcPane);
			rcPane.left=rcClient.left;
			rcPane.right=rcClient.right;
			m_arrPane[i]->Move(rcPane);
		}
	}else if(uMode & layout_pos)
	{//只是窗口位置发生变化
		//获得第一个窗格的原坐标
		CRect rcPane1;
		if(m_arrPane.GetCount())
		{
			m_arrPane[0]->GetRect(&rcPane1);
		}
		//与客户区坐标比较计算出偏移量
		CPoint ptOffset=rcClient.TopLeft()-rcPane1.TopLeft();

		for(int i=0;i<m_arrPane.GetCount(); i++)
		{
			CRect rcPane;
			m_arrPane[i]->GetRect(&rcPane);
			rcPane.OffsetRect(ptOffset);
			m_arrPane[i]->Move(rcPane);
		}
	}
	
	//检查列模式下水平方向有没有变化 或者 行模式下垂直方向上有没有变化
	if((bRowSplit && !(uMode & layout_vert)) || ( bColSplit && !(uMode & layout_horz)))
		return;

	//计算出理想的及最小的宽度或者高度
    int nTotalIdeal=0,nTotalMin=0;
    for(int i=0; i<m_arrPane.GetCount(); i++)
    {
        if (!m_arrPane[i]->IsVisible()) continue;
        nTotalIdeal+=m_arrPane[i]->m_nSizeIdeal;
        nTotalMin+=m_arrPane[i]->m_nSizeMin;
    }

    int nInter=(GetVisiblePanelCount()-1)*m_nSepSize;
    int nSize=m_bColMode?rcClient.Width():rcClient.Height();

    CRect rcPane=rcClient;
    if(m_bColMode) rcPane.right=rcPane.left;
    else rcPane.bottom=rcPane.top;

    long & nLT= m_bColMode?rcPane.left:rcPane.top;
    long & nRB= m_bColMode?rcPane.right:rcPane.bottom;

    if(nTotalMin+nInter > nSize)
    {
        //set all pane to minimize size
        for(int i=0; i<m_arrPane.GetCount(); i++)
        {
            if (!m_arrPane[i]->IsVisible()) continue;
            nRB+=m_arrPane[i]->m_nSizeMin;
            m_arrPane[i]->Move(&rcPane);
            nLT=nRB+m_nSepSize;
            nRB=nLT;
        }
    }
    else if(nTotalIdeal+nInter<nSize)
    {
        //set all pane to nIdealSize except the lowest priority one, which will be extent to fill all space
        int iLowest=0,nPriority=-1;
        int i;
        for(i=0; i<m_arrPane.GetCount(); i++)
        {
            if (!m_arrPane[i]->IsVisible()) continue;
            if(m_arrPane[i]->m_nPriority>nPriority)
            {
                nPriority=m_arrPane[i]->m_nPriority;
                iLowest=i;
            }
        }
        for(i=0; i<m_arrPane.GetCount(); i++)
        {
            if (!m_arrPane[i]->IsVisible()) continue;
            if(i!=iLowest)
                nRB+=m_arrPane[i]->m_nSizeIdeal;
            else
                nRB+=m_arrPane[i]->m_nSizeIdeal+nSize-(nTotalIdeal+nInter);
            m_arrPane[i]->Move(&rcPane);
            nLT=nRB+m_nSepSize;
            nRB=nLT;
        }
    }
    else
    {
        //set high priority pane size to ideal size and set low pane to remain size
        PANEORDER *pnPriority=new PANEORDER[m_arrPane.GetCount()];
        int *pPaneSize=new int [m_arrPane.GetCount()];

        int i;
        for(i=0; i<m_arrPane.GetCount(); i++)
        {
            pnPriority[i].idx=i;
            pnPriority[i].pPane=m_arrPane[i];
        }
        qsort(pnPriority,m_arrPane.GetCount(),sizeof(PANEORDER),FunComp);

        //为每一个格子分配空间
        int nRemainSize=nSize-nInter;
        BOOL bMinimize=FALSE;
        for(i=0; i<m_arrPane.GetCount(); i++)
        {
            if (!m_arrPane[i]->IsVisible()) continue;
            if(!bMinimize)
            {
                int nRequiredMin=0;
                for(int j=i+1; j<m_arrPane.GetCount(); j++)
                {
                    if (!m_arrPane[j]->IsVisible()) continue;
                    nRequiredMin+=pnPriority[j].pPane->m_nSizeMin;
                }
                if(nRequiredMin<nRemainSize-pnPriority[i].pPane->m_nSizeIdeal)
                    pPaneSize[pnPriority[i].idx]=pnPriority[i].pPane->m_nSizeIdeal;
                else
                {
                    pPaneSize[pnPriority[i].idx]=nRemainSize-nRequiredMin;
                    bMinimize=TRUE;
                }
            }
            else
            {
                pPaneSize[pnPriority[i].idx]=pnPriority[i].pPane->m_nSizeMin;
            }
            nRemainSize-=pPaneSize[pnPriority[i].idx];
        }

        //设置格子位置
        for(i=0; i<m_arrPane.GetCount(); i++)
        {
            if (!m_arrPane[i]->IsVisible()) continue;
            nRB+=pPaneSize[i];
            m_arrPane[i]->Move(&rcPane);
            nLT=nRB+m_nSepSize;
            nRB=nLT;
        }

        delete [] pPaneSize;
        delete [] pnPriority;
    }
}