Beispiel #1
0
void ItemPickup::ObjectTouch(HOBJECT hObject)
{
	DBYTE nValue;
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	// Always at least one object...
	nValue = ( DBYTE )DCLAMP( m_fValue * m_fValueMult, 0, 255 );
	if( nValue == 0 && m_fValueMult > 0.0f )
		nValue = 1;

	HMESSAGEWRITE hMessage = pServerDE->StartMessageToObject(this, hObject, MID_INVENTORYITEMTOUCH);
	pServerDE->WriteToMessageByte(hMessage, (DBYTE)m_nType);
	pServerDE->WriteToMessageByte( hMessage, nValue );
	pServerDE->EndMessage(hMessage);
}
Beispiel #2
0
DBOOL CFlashlightFX::Update()
{
	if (!m_pClientDE || m_bWantRemove || !m_hServerObject || !m_hObject) return DFALSE;

	DDWORD dwUsrFlags;
	m_pClientDE->GetObjectUserFlags(m_hServerObject, &dwUsrFlags);

	// Hidden
	if (!(dwUsrFlags & USRFLG_VISIBLE))
	{
		m_pClientDE->SetObjectFlags(m_hObject, 0);
	}
	else
	{
		DRotation rRot;
		DVector vPos, vF, vR, vU;
		m_pClientDE->GetObjectRotation(m_hServerObject, &rRot);
		m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);
		m_pClientDE->GetObjectPos(m_hServerObject, &vPos);

		// Cast a line to see where to put the light..
		ClientIntersectQuery iQuery;
		ClientIntersectInfo  iInfo;
	
		VEC_COPY(iQuery.m_From, vPos);
		VEC_COPY(iQuery.m_Direction, vF);
		iQuery.m_Flags = INTERSECT_OBJECTS;

		DFLOAT fDistance = 1000.0f;  // Far, far, away...

		if (m_pClientDE->CastRay(&iQuery, &iInfo))
		{		
			// Place the light
			m_pClientDE->SetObjectPos(m_hObject, &iInfo.m_Point);
			// Calculate the distance
			VEC_SUB(vPos, vPos, iInfo.m_Point);
			fDistance = VEC_MAG(vPos); 
			if (fDistance < 10.0f) fDistance = 10.0f;

			// The farther away, the brighter and bigger the light
			DFLOAT fRadius = fDistance * 0.40f;
			m_pClientDE->SetLightRadius(m_hObject, fRadius);

			// Determine the minimum intensity based on the current light level
			// (so we don't end up casting a dark light instead).
			DFLOAT fMinIntensity = 100.0f;
			DVector vColor;
			if (m_pClientDE->Common()->GetPointShade(&vPos, &vColor))
			{
				if (vColor.x > fMinIntensity) fMinIntensity = vColor.x;
				if (vColor.y > fMinIntensity) fMinIntensity = vColor.y;
				if (vColor.z > fMinIntensity) fMinIntensity = vColor.z;
			}
			fMinIntensity = DCLAMP((fMinIntensity + 32), 0, 255);
			fMinIntensity /= 255.0f;

			DFLOAT fIntensity = (1000.0f - (fDistance/2.0f)) / 1000.0f;
			if (fIntensity < fMinIntensity) fIntensity = fMinIntensity;

			m_pClientDE->SetLightColor(m_hObject, fIntensity, fIntensity, fIntensity);

			m_pClientDE->SetObjectFlags(m_hObject, FLAG_VISIBLE);
		}
		else
		{
			m_pClientDE->SetObjectFlags(m_hObject, 0);
		}
	}

	return DTRUE;
}
Beispiel #3
0
DDWORD KeyPickup::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return DFALSE;

	switch(messageID)
	{
		case MID_PRECREATE:
		{
			DDWORD dwRet = PickupObject::EngineMessageFn(messageID, pData, fData);

			ObjectCreateStruct *pStruct = (ObjectCreateStruct*)pData;

			if (fData == PRECREATE_WORLDFILE || fData == PRECREATE_STRINGPROP)
			{
				GenericProp genProp;

				if (g_pServerDE->GetPropGeneric("ObjectName", &genProp) == DE_OK)
				{
					if (genProp.m_String[0]) m_hstrObjectName = g_pServerDE->CreateString(genProp.m_String);
				}

				if (g_pServerDE->GetPropGeneric("ResourceNum", &genProp) == DE_OK)
					m_nNameID = genProp.m_Long;

/*				if(m_nNameID)
				{
					g_pServerDE->FreeString(m_hstrObjectName);
					m_hstrObjectName = g_pServerDE->FormatString(m_nNameID);
				}
*/
				if (g_pServerDE->GetPropGeneric("IconFile", &genProp) == DE_OK)
				{
					if (genProp.m_String[0]) m_hstrIconFile = g_pServerDE->CreateString(genProp.m_String);
				}

				if (g_pServerDE->GetPropGeneric("HiIconFile", &genProp) == DE_OK)
				{
					if (genProp.m_String[0]) m_hstrIconFileH = g_pServerDE->CreateString(genProp.m_String);
				}

				if (g_pServerDE->GetPropGeneric("ModelFile", &genProp) == DE_OK)
				{
					if (genProp.m_String[0]) m_hstrFilename = g_pServerDE->CreateString(genProp.m_String);
				}

				if (g_pServerDE->GetPropGeneric("ModelSkin", &genProp) == DE_OK)
				{
					if (genProp.m_String[0]) m_hstrSkinName = g_pServerDE->CreateString(genProp.m_String);
				}

				if (g_pServerDE->GetPropGeneric("UseCount", &genProp) == DE_OK)
				{
					m_byUseCount = (DBYTE)DCLAMP(genProp.m_Long, 0, 255);
				}
			}

			if (m_hstrFilename && m_hstrSkinName)
			{
				char *pszTemp;
				pszTemp = g_pServerDE->GetStringData(m_hstrFilename);
				if( pszTemp )
					_mbscpy((unsigned char*)pStruct->m_Filename, (const unsigned char*)pszTemp);
				pszTemp = g_pServerDE->GetStringData(m_hstrSkinName);
				if( pszTemp )
					_mbscpy((unsigned char*)pStruct->m_SkinName, (const unsigned char*)pszTemp);
			}

			return dwRet;
		}

		case MID_INITIALUPDATE:
		{
			if (fData != INITIALUPDATE_SAVEGAME)
			{
//				DVector vDims;
//				VEC_SET(vDims, 20.0f, 25.0f, 10.0f);

//				pServerDE->SetObjectDims(m_hObject, &vDims);
			}
			break;
		}

		case MID_SAVEOBJECT:
			Save((HMESSAGEWRITE)pData, (DDWORD)fData);
			break;

		case MID_LOADOBJECT:
			Load((HMESSAGEREAD)pData, (DDWORD)fData);
			break;

		default : break;
	}

	return PickupObject::EngineMessageFn(messageID, pData, fData);
}