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); }
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; }
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); }