⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameinvitems.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	CLASS:		CInvBinoculars
//
//	PURPOSE:	Binoculars inventory item
//
// *********************************************************************** //


void CInvBinoculars::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_BINOCULARS);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );

	m_hstrPic = pServerDE->CreateString("binoculars.pcx");
	m_hstrPicH = pServerDE->CreateString("binoculars_h.pcx");
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvBinoculars::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvBinoculars::Activate()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return DFALSE;

	// Make sure it's a player
	if( IsPlayer( m_hOwner ))
	{
		CPlayerObj *pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
		
		// If already in zoom mode because of something else (sniper), then ignore this...
		if( pObj->GetZoomMode( ))
			return DFALSE;

		m_bIsActive = DTRUE;

		SendActionMessage( );		

		pObj->SetZoomMode(DTRUE, 98); // Number is the cursor type (AM)
	}
	else
	{
		m_bIsActive = DTRUE;
	}

	return m_bIsActive;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvBinoculars::Deactivate()
//
//	PURPOSE:	Deactivates the item
//
// ----------------------------------------------------------------------- //

int CInvBinoculars::Deactivate()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return DFALSE;

	// Make sure it's a player
	if( IsPlayer( m_hOwner )) 
	{
		CPlayerObj *pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
		m_bIsActive = DFALSE;
		SendActionMessage( );		
		pObj->SetZoomMode(DFALSE);
	}
	else
		m_bIsActive = DFALSE;

	return m_bIsActive;
}


// *********************************************************************** //
//
//	CLASS:		CInvTheEye
//
//	PURPOSE:	TheEye inventory item
//
// *********************************************************************** //


CInvTheEye::CInvTheEye() : CInvItem(INV_THEEYE)
{
    m_hSeeingObject = DNULL;
}


void CInvTheEye::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_EYE);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );
    m_hSeeingObject = NULL;
    m_bDropped = DFALSE;

	m_hstrPic = pServerDE->CreateString("the_eye.pcx");
	m_hstrPicH = pServerDE->CreateString("the_eye_h.pcx");
}


void CInvTheEye::Term()
{
	CInvItem::Term();

	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	if (m_hSeeingObject)
	{
		pServerDE->RemoveObject(m_hSeeingObject);
		m_hSeeingObject = DNULL;
	}

}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::SetRotation()
//
//	PURPOSE:	Sets the rotation for the eye item
//
// ----------------------------------------------------------------------- //

void CInvTheEye::SetRotation(DRotation *pRot)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !m_hSeeingObject) return;

	pServerDE->SetObjectRotation(m_hSeeingObject, pRot);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::Dropit()
//
//	PURPOSE:	Drops the eye
//
// ----------------------------------------------------------------------- //

int CInvTheEye::Dropit()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return DFALSE;

    if (!m_hSeeingObject)
    {
        ObjectCreateStruct theStruct;
	    INIT_OBJECTCREATESTRUCT(theStruct);

	    DRotation rRot;
        ROT_INIT(rRot);
        
    	// Make sure it's a player
	    if(IsPlayer(m_hOwner)) 
    	{
    		CPlayerObj *pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
            pObj->GetPlayerRotation(&rRot);

	        DVector vPos, vDims, vF, vU, vR;
            pServerDE->GetObjectPos(m_hOwner, &vPos);
        	pServerDE->GetObjectDims(m_hOwner, &vDims);
			pServerDE->GetRotationVectors(&rRot, &vU, &vR, &vF);

			VEC_MULSCALAR(vF, vF, 300.0f);

			// Position the Eye at Eye Level...
        	vPos.y += vDims.y / 2.0f;
	        vPos.y -= 1;
         	
            ROT_COPY(theStruct.m_Rotation, rRot);
	        VEC_COPY(theStruct.m_Pos, vPos);

	        theStruct.m_NextUpdate = 0.001f;
    
    	    HCLASS pClass = pServerDE->GetClass("SeeingEye");
    
            // Check to make sure this is a valid class.
            if (pClass)
            {    
            	LPBASECLASS pObject = pServerDE->CreateObject(pClass, &theStruct);
      
                if (pObject)
                {
                    m_hSeeingObject = pServerDE->ObjectToHandle(pObject);
                    
					pServerDE->SetVelocity(m_hSeeingObject, &vF);

                    SeeingEye *pEye = (SeeingEye*)pObject;
                    
                    // Initialize the eye with the Owner and Client
        		    pEye->Init(m_hOwner, pObj->GetClient() );
                
    				m_bDropped = DTRUE;
                    return DTRUE;
                }
            }     
    	}
        
    }
    
	return DFALSE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvTheEye::Activate()
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return DFALSE;

    int nOn = 1;
  
	if(m_hSeeingObject && pServerDE->IsKindOf(pServerDE->GetObjectClass(m_hOwner), pServerDE->GetClass("CPlayerObj"))) 
	{
		CPlayerObj *pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
        
		HMESSAGEWRITE hMsg = pServerDE->StartMessage(pObj->GetClient(), SMSG_ALL_SEEING_EYE);
		pServerDE->WriteToMessageByte(hMsg, (DBYTE)nOn);
		pServerDE->WriteToMessageObject(hMsg, m_hSeeingObject);
		pServerDE->EndMessage(hMsg);
    }            

    m_bIsActive = DTRUE;
	return m_bIsActive;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::Deactivate()
//
//	PURPOSE:	Deactivates the item
//
// ----------------------------------------------------------------------- //

int CInvTheEye::Deactivate()
{
   	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return DFALSE;

    m_bIsActive = DFALSE;
    
    int nOff = 0;
  
	if(m_hSeeingObject && pServerDE->IsKindOf(pServerDE->GetObjectClass(m_hOwner), pServerDE->GetClass("CPlayerObj"))) 
    {
		CPlayerObj *pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
        
        HMESSAGEWRITE hMsg = pServerDE->StartMessage(pObj->GetClient(), SMSG_ALL_SEEING_EYE);
        pServerDE->WriteToMessageByte(hMsg, (DBYTE)nOff);
        pServerDE->WriteToMessageObject(hMsg, m_hSeeingObject);
        pServerDE->EndMessage(hMsg);
    }        
    
	return m_bIsActive;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::ActivateItem()
//
//	PURPOSE:	activates or deactivates the eye
//
// ----------------------------------------------------------------------- //
DBOOL CInvTheEye::ActivateItem(char *msgbuf)
{
    if ( IsDropped() )
    {
		if (!IsActive())
		{
			if( !Activate())
				return DFALSE;

    		_mbscat((unsigned char*)msgbuf, (const unsigned char*)" on");
	    }
		else
		{
			Deactivate();
			_mbscat((unsigned char*)msgbuf, (const unsigned char*)" off");
		}
    }
    else
    {
		Dropit();
        
    	if ( IsDropped() )
	    	_mbscpy((unsigned char*)msgbuf, (const unsigned char*)GetDisplayName());
    }                        

	_mbscpy((unsigned char*)msgbuf, (const unsigned char*)GetDisplayName());
	return DTRUE;   
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::PickItUp()
//
//	PURPOSE:	Pick up the eye
//
// ----------------------------------------------------------------------- //

void CInvTheEye::PickItUp()
{
   	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	m_bDropped = DFALSE;
    m_bIsActive = DFALSE;
    
    m_hSeeingObject = NULL;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::Save
//
//	PURPOSE:	Save the object
//
// ----------------------------------------------------------------------- //

void CInvTheEye::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !hWrite) return;

	CInvItem::Save(hWrite, dwSaveFlags);

	pServerDE->WriteToLoadSaveMessageObject(hWrite, m_hSeeingObject);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTheEye::Load
//
//	PURPOSE:	Load the object
//
// ----------------------------------------------------------------------- //

void CInvTheEye::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !hRead) return;

	CInvItem::Load(hRead, dwLoadFlags);

	pServerDE->ReadFromLoadSaveMessageObject(hRead, &m_hSeeingObject);

	if( m_hSeeingObject )
	{
        SeeingEye *pEye = ( SeeingEye * )pServerDE->HandleToObject( m_hSeeingObject );
    	CPlayerObj *pObj = (CPlayerObj*)pServerDE->HandleToObject(m_hOwner);
        
        // Initialize the eye with the Owner and Client
        pEye->Init(m_hOwner, pObj->GetClient() );
	}
	else
	{
		m_bDropped = DFALSE;
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvProxBomb::Init()
//
//	PURPOSE:	Initializes the bomb.
//
// ----------------------------------------------------------------------- //

void CInvProxBomb::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_PROX);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );

	m_hstrPic = pServerDE->CreateString("p_bombs.pcx");
	m_hstrPicH = pServerDE->CreateString("p_bombs_h.pcx");
}



// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvProxBomb::ActivateItem()
//
//	PURPOSE:	default activate item behavior
//
// ----------------------------------------------------------------------- //

DBOOL CInvProxBomb::ActivateItem(char *msgbuf)
{
	if ( !Activate( ))
		return DFALSE;

	_mbscpy((unsigned char*)msgbuf, (const unsigned char*)GetDisplayName());
	return DTRUE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvProxBomb::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvProxBomb::Activate()
{
	CPlayerObj *pPlayer;

	if( IsPlayer( m_hOwner ))
	{
		pPlayer = (CPlayerObj*)g_pServerDE->HandleToObject(m_hOwner);
		pPlayer->m_InventoryMgr.SelectInventoryWeapon( WEAP_PROXIMITYBOMB );
	}

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvRemoteBomb::Init()
//
//	PURPOSE:	Initializes the bomb.
//
// ----------------------------------------------------------------------- //

void CInvRemoteBomb::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_REMOTE);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );

	m_hstrPic = pServerDE->CreateString("r_bombs.pcx");
	m_hstrPicH = pServerDE->CreateString("r_bombs_h.pcx");
}



// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvRemoteBomb::ActivateItem()
//
//	PURPOSE:	default activate item behavior
//
// ----------------------------------------------------------------------- //

DBOOL CInvRemoteBomb::ActivateItem(char *msgbuf)
{
	if ( !Activate( ))
		return DFALSE;

	_mbscpy((unsigned char*)msgbuf, (const unsigned char*)GetDisplayName());
	return DTRUE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvRemoteBomb::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvRemoteBomb::Activate()
{
	CPlayerObj *pPlayer;

	if( IsPlayer( m_hOwner ))
	{
		pPlayer = (CPlayerObj*)g_pServerDE->HandleToObject(m_hOwner);
		pPlayer->m_InventoryMgr.SelectInventoryWeapon( WEAP_REMOTEBOMB );
	}

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTimeBomb::Init()
//
//	PURPOSE:	Initializes the bomb.
//
// ----------------------------------------------------------------------- //

void CInvTimeBomb::Init(HOBJECT hOwner)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	CInvItem::Init(hOwner);

	m_hstrItemName = pServerDE->FormatString(IDS_ITEM_TIME);
	m_hstrDisplayName = pServerDE->CopyString( m_hstrItemName );

	m_hstrPic = pServerDE->CreateString("t_bombs.pcx");
	m_hstrPicH = pServerDE->CreateString("t_bombs_h.pcx");
}



// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTimeBomb::ActivateItem()
//
//	PURPOSE:	default activate item behavior
//
// ----------------------------------------------------------------------- //

DBOOL CInvTimeBomb::ActivateItem(char *msgbuf)
{
	if ( !Activate( ))
		return DFALSE;

	_mbscpy((unsigned char*)msgbuf, (const unsigned char*)GetDisplayName());
	return DTRUE;
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CInvTimeBomb::Activate()
//
//	PURPOSE:	Activates the item
//
// ----------------------------------------------------------------------- //

int CInvTimeBomb::Activate()
{
	CPlayerObj *pPlayer;

	if( IsPlayer( m_hOwner ))
	{
		pPlayer = (CPlayerObj*)g_pServerDE->HandleToObject(m_hOwner);
		pPlayer->m_InventoryMgr.SelectInventoryWeapon( WEAP_TIMEBOMB );
	}

	return DTRUE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -