void CMortar::MortarExplode(void) { #if 1 // mortar beam MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); WRITE_BYTE(TE_BEAMPOINTS); WRITE_COORD(pev->origin.x); WRITE_COORD(pev->origin.y); WRITE_COORD(pev->origin.z); WRITE_COORD(pev->origin.x); WRITE_COORD(pev->origin.y); WRITE_COORD(pev->origin.z + 1024); WRITE_SHORT(m_spriteTexture); WRITE_BYTE(0); // framerate WRITE_BYTE(0); // framerate WRITE_BYTE(1); // life WRITE_BYTE(40); // width WRITE_BYTE(0); // noise WRITE_BYTE(255); // r, g, b WRITE_BYTE(160); // r, g, b WRITE_BYTE(100); // r, g, b WRITE_BYTE(128); // brightness WRITE_BYTE(0); // speed MESSAGE_END(); #endif #if 0 // blast circle MESSAGE_BEGIN(MSG_BROADCAST, SVC_TEMPENTITY); WRITE_BYTE(TE_BEAMTORUS); WRITE_COORD(pev->origin.x); WRITE_COORD(pev->origin.y); WRITE_COORD(pev->origin.z + 32); WRITE_COORD(pev->origin.x); WRITE_COORD(pev->origin.y); WRITE_COORD(pev->origin.z + 32 + pev->dmg * 2 / .2); // reach damage radius over .3 seconds WRITE_SHORT(m_spriteTexture); WRITE_BYTE(0); // startframe WRITE_BYTE(0); // framerate WRITE_BYTE(2); // life WRITE_BYTE(12); // width WRITE_BYTE(0); // noise WRITE_BYTE(255); // r, g, b WRITE_BYTE(160); // r, g, b WRITE_BYTE(100); // r, g, b WRITE_BYTE(255); // brightness WRITE_BYTE(0); // speed MESSAGE_END(); #endif TraceResult tr; UTIL_TraceLine(pev->origin + Vector(0, 0, 1024), pev->origin - Vector(0, 0, 1024), dont_ignore_monsters, ENT(pev), &tr); Explode(&tr, DMG_BLAST | DMG_MORTAR); UTIL_ScreenShake(tr.vecEndPos, 25.0, 150.0, 1.0, 750); #if 0 int pitch = RANDOM_LONG(95, 124); EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/mortarhit.wav", 1.0, 0.55, 0, pitch); // ForceSound( SNDRADIUS_MP5, bits_SOUND_COMBAT ); // ExplodeModel( pev->origin, 400, g_sModelIndexShrapnel, 30 ); RadiusDamage(pev, VARS(pev->owner), pev->dmg, CLASS_NONE, DMG_BLAST); /* if ( RANDOM_FLOAT ( 0 , 1 ) < 0.5 ) { UTIL_DecalTrace( pTrace, DECAL_SCORCH1 ); } else { UTIL_DecalTrace( pTrace, DECAL_SCORCH2 ); } */ SetThink(&CMortar::SUB_Remove); pev->nextthink = gpGlobals->time + 0.1; #endif }
void Bomb::OnCollision(Entity *e) { if(e->Is("DETONATOR")) Explode(); }
void CAVMine::ProcessEvent(SEntityEvent &event) { if (m_frozen) return; switch(event.event) { case ENTITY_EVENT_ENTERAREA: { IEntity * pEntity = gEnv->pEntitySystem->GetEntity((EntityId)event.nParam[0]); CGameRules* pGR = g_pGame->GetGameRules(); if(pEntity && pGR) { // if this is a team game, mines aren't set off by their own team if(pGR->GetTeamCount() > 0 && (m_teamId != 0 && pGR->GetTeam(pEntity->GetId()) == m_teamId)) break; IPhysicalEntity *pPhysics = pEntity->GetPhysics(); if(pPhysics) { pe_status_dynamics physStatus; if(0 != pPhysics->GetStatus(&physStatus)) { // only count moving objects if(physStatus.v.GetLengthSquared() > 0.1f) m_currentWeight += physStatus.mass; if (m_currentWeight > m_triggerWeight) Explode(true); } } } break; } case ENTITY_EVENT_LEAVEAREA: { IEntity * pEntity = gEnv->pEntitySystem->GetEntity((EntityId)event.nParam[0]); if(pEntity) { IPhysicalEntity *pPhysics = pEntity->GetPhysics(); if(pPhysics) { pe_status_dynamics physStatus; if(0 != pPhysics->GetStatus(&physStatus)) { m_currentWeight -= physStatus.mass; if(m_currentWeight < 0) m_currentWeight = 0; } } } break; } default: break; } return CProjectile::ProcessEvent(event); }
STDMETHODIMP CTextSubtitleInputPinHepler::Receive( IMediaSample* pSample ) { REFERENCE_TIME tStart, tStop; pSample->GetTime(&tStart, &tStop); tStart += m_tStart; tStop += m_tStart; BYTE* pData = NULL; HRESULT hr = pSample->GetPointer(&pData); if(FAILED(hr) || pData == NULL) return hr; int len = pSample->GetActualDataLength(); if(m_mt.majortype == MEDIATYPE_Text) { if(!strncmp((char*)pData, __GAB1__, strlen(__GAB1__))) { char* ptr = (char*)&pData[strlen(__GAB1__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; WORD size = *((WORD*)(ptr)); ptr += 2; if(tag == __GAB1_LANGUAGE__) { m_pRTS->m_name = CString(ptr); } else if(tag == __GAB1_ENTRY__) { m_pRTS->Add(AToW(&ptr[8]), false, *(int*)ptr, *(int*)(ptr+4)); } else if(tag == __GAB1_LANGUAGE_UNICODE__) { m_pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_ENTRY_UNICODE__) { m_pRTS->Add((WCHAR*)(ptr+8), true, *(int*)ptr, *(int*)(ptr+4)); } ptr += size; } } else if(!strncmp((char*)pData, __GAB2__, strlen(__GAB2__))) { char* ptr = (char*)&pData[strlen(__GAB2__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; DWORD size = *((DWORD*)(ptr)); ptr += 4; if(tag == __GAB1_LANGUAGE_UNICODE__) { m_pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_RAWTEXTSUBTITLE__) { m_pRTS->Open((BYTE*)ptr, size, DEFAULT_CHARSET, m_pRTS->m_name); } ptr += size; } } else if(pData != 0 && len > 1 && *pData != 0) { CStringA str((char*)pData, len); str.Replace("\r\n", "\n"); str.Trim(); if(!str.IsEmpty()) { m_pRTS->Add(AToW(str), false, (int)(tStart / 10000), (int)(tStop / 10000)); } } else { XY_LOG_WARN("Unexpected data"); } } else if(m_mt.majortype == MEDIATYPE_Subtitle) { if(m_mt.subtype == MEDIASUBTYPE_UTF8) { CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { m_pRTS->Add(str, true, (int)(tStart / 10000), (int)(tStop / 10000)); } else { XY_LOG_WARN("Empty data"); } } else if(m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS || m_mt.subtype == MEDIASUBTYPE_ASS2) { CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { STSEntry stse; int fields = m_mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9; CAtlList<CStringW> sl; Explode(str, sl, ',', fields); if(sl.GetCount() == fields) { stse.readorder = wcstol(sl.RemoveHead(), NULL, 10); stse.layer = wcstol(sl.RemoveHead(), NULL, 10); stse.style = sl.RemoveHead(); stse.actor = sl.RemoveHead(); stse.marginRect.left = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.right = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.top = stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); if(fields == 10) stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); stse.effect = sl.RemoveHead(); stse.str = sl.RemoveHead(); } if(!stse.str.IsEmpty()) { m_pRTS->Add(stse.str, true, (int)(tStart / 10000), (int)(tStop / 10000), stse.style, stse.actor, stse.effect, stse.marginRect, stse.layer, stse.readorder); } } else { XY_LOG_WARN("Empty data"); } } else { XY_LOG_WARN("Unsupported media type "<<XyUuidToString(m_mt.subtype)); } } else { XY_LOG_WARN("Unsupported media type "<<XyUuidToString(m_mt.majortype)); } return S_OK; }
void CShaderEdit::OnUpdate() { if (m_nIDEvent == (UINT_PTR) - 1) { m_nIDEvent = SetTimer(1, 100, NULL); } CString text; int nStartChar = 0, nEndChar = -1; GetSel(nStartChar, nEndChar); if (nStartChar == nEndChar) { GetWindowText(text); while (nStartChar > 0 && _istalnum(text.GetAt(nStartChar - 1))) { nStartChar--; } } if (nStartChar < nEndChar) { text = text.Mid(nStartChar, nEndChar - nStartChar); text.TrimRight('('); text.MakeLower(); m_acdlg.m_list.ResetContent(); CString key, value; POSITION pos = m_acdlg.m_inst.GetStartPosition(); while (pos) { POSITION cur = pos; m_acdlg.m_inst.GetNextAssoc(pos, key, value); if (key.Find(text) == 0) { CAtlList<CString> sl; Explode(value, sl, '|', 2); if (sl.GetCount() != 2) { continue; } CString name = sl.RemoveHead(); CString description = sl.RemoveHead(); int i = m_acdlg.m_list.AddString(name); m_acdlg.m_list.SetItemDataPtr(i, cur); } } if (m_acdlg.m_list.GetCount() > 0) { int lineheight = GetLineHeight(); CPoint p = PosFromChar(nStartChar); p.y += lineheight; ClientToScreen(&p); CRect r(p, CSize(100, 100)); m_acdlg.MoveWindow(r); m_acdlg.SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); m_acdlg.ShowWindow(SW_SHOWNOACTIVATE); m_nEndChar = nEndChar; return; } } m_acdlg.ShowWindow(SW_HIDE); }
bool GBomb::OnTimeOut() { State = BOMB_STATE_EXPLODING; Explode(); return true; }
//----------------------------------------------------------------------------- void CHomingMissile::UpdateControlledMissile(float frameTime) { bool isServer = gEnv->bServer; bool isClient = gEnv->bClient; CActor *pClientActor=0; if (gEnv->bClient) pClientActor=static_cast<CActor *>(g_pGame->GetIGameFramework()->GetClientActor()); bool isOwner = ((!m_ownerId && isServer) || (isClient && pClientActor && (pClientActor->GetEntityId() == m_ownerId) && pClientActor->IsPlayer())); IRenderer* pRenderer = gEnv->pRenderer; IRenderAuxGeom* pGeom = pRenderer->GetIRenderAuxGeom(); float color[4] = {1,1,1,1}; const static float step = 15.f; float y = 20.f; bool bDebug = g_pGameCVars->i_debug_projectiles > 0; if (isOwner || isServer) { //If there's a target, follow the target if(isServer) { if (m_targetId) { if (m_lockedTimer>0.0f) m_lockedTimer=m_lockedTimer-frameTime; else { // If we are here, there's a target IEntity* pTarget = gEnv->pEntitySystem->GetEntity(m_targetId); if (pTarget) { AABB box; pTarget->GetWorldBounds(box); Vec3 finalDes = box.GetCenter(); SetDestination(finalDes); //SetDestination( box.GetCenter() ); if (bDebug) pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "Target Entity: %s", pTarget->GetName()); } m_lockedTimer+=0.05f; } } else if(m_autoControlled) return; } if (m_controlled && !m_autoControlled && isOwner && !m_targetId) { //Check if the weapon is still selected CWeapon *pWeapon = GetWeapon(); if(!pWeapon || !pWeapon->IsSelected()) return; if (m_controlledTimer>0.0f) m_controlledTimer=m_controlledTimer-frameTime; else if (pClientActor && pClientActor->IsPlayer()) //Follow the crosshair { if (IMovementController *pMC=pClientActor->GetMovementController()) { Vec3 eyePos(ZERO); Vec3 eyeDir(ZERO); IVehicle* pVehicle = pClientActor->GetLinkedVehicle(); if(!pVehicle) { SMovementState state; pMC->GetMovementState(state); eyePos = state.eyePosition; eyeDir = state.eyeDirection; } else { SViewParams viewParams; pVehicle->UpdateView(viewParams, pClientActor->GetEntityId()); eyePos = viewParams.position; eyeDir = viewParams.rotation * Vec3(0,1,0); //eyeDir = (viewParams.targetPos - viewParams.position).GetNormalizedSafe(); } int pierceability=7; if (IPhysicalEntity *pPE=GetEntity()->GetPhysics()) { if (pPE->GetType()==PE_PARTICLE) { pe_params_particle pp; if (pPE->GetParams(&pp)) pierceability=pp.iPierceability; } } static const int objTypes = ent_all; static const int flags = (geom_colltype_ray << rwi_colltype_bit) | rwi_colltype_any | (pierceability & rwi_pierceability_mask) | (geom_colltype14 << rwi_colltype_bit); IPhysicalWorld* pWorld = gEnv->pPhysicalWorld; static IPhysicalEntity* pSkipEnts[10]; int numSkip = CSingle::GetSkipEntities(pWeapon, pSkipEnts, 10); ray_hit hit; int hits = 0; float range=m_maxTargetDistance; hits = pWorld->RayWorldIntersection(eyePos + 1.5f*eyeDir, eyeDir*range, objTypes, flags, &hit, 1, pSkipEnts, numSkip); while (hits) { if (gEnv->p3DEngine->RefineRayHit(&hit, eyeDir*range)) break; eyePos = hit.pt+eyeDir*0.003f; range -= hit.dist+0.003f; hits = pWorld->RayWorldIntersection(eyePos, eyeDir*range, objTypes, flags, &hit, 1, pSkipEnts, numSkip); } DestinationParams params; if(hits) params.pt=hit.pt; else params.pt=(eyePos+m_maxTargetDistance*eyeDir); //Some point in the sky... GetGameObject()->InvokeRMI(SvRequestDestination(), params, eRMI_ToServer); if (bDebug) { pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "PlayerView eye direction: %.3f %.3f %.3f", eyeDir.x, eyeDir.y, eyeDir.z); pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "PlayerView Target: %.3f %.3f %.3f", hit.pt.x, hit.pt.y, hit.pt.z); pRenderer->GetIRenderAuxGeom()->DrawCone(m_destination, Vec3(0,0,-1), 2.5f, 7.f, ColorB(255,0,0,255)); } } m_controlledTimer+=0.0f; } } } //This code is shared by both modes above (auto and controlled) if(!m_destination.IsZero()) { pe_status_dynamics status; if (!GetEntity()->GetPhysics()->GetStatus(&status)) { CryLogAlways("couldn't get physics status!"); return; } pe_status_pos pos; if (!GetEntity()->GetPhysics()->GetStatus(&pos)) { CryLogAlways("couldn't get physics pos!"); return; } float currentSpeed = status.v.len(); if (currentSpeed>0.001f) { Vec3 currentVel = status.v; Vec3 currentPos = pos.pos; Vec3 goalDir(ZERO); assert(!_isnan(currentSpeed)); assert(!_isnan(currentVel.x) && !_isnan(currentVel.y) && !_isnan(currentVel.z)); //Just a security check if((currentPos-m_destination).len2()<(m_detonationRadius*m_detonationRadius)) { Explode(true, true, m_destination, -currentVel.normalized(), currentVel, m_targetId); return; } goalDir = m_destination - currentPos; goalDir.Normalize(); //Turn more slowly... currentVel.Normalize(); if(bDebug) { pRenderer->Draw2dLabel(50,55,2.0f,color,false, " Destination: %.3f, %.3f, %.3f",m_destination.x,m_destination.y,m_destination.z); pRenderer->Draw2dLabel(50,80,2.0f,color,false, " Current Dir: %.3f, %.3f, %.3f",currentVel.x,currentVel.y,currentVel.z); pRenderer->Draw2dLabel(50,105,2.0f,color,false," Goal Dir: %.3f, %.3f, %.3f",goalDir.x,goalDir.y,goalDir.z); } float cosine = currentVel.Dot(goalDir); cosine = CLAMP(cosine,-1.0f,1.0f); float totalAngle = RAD2DEG(cry_acosf(cosine)); assert(totalAngle>=0); if (cosine<0.99) { float maxAngle = m_turnSpeed*frameTime; if (maxAngle>totalAngle) maxAngle=totalAngle; float t=(maxAngle/totalAngle)*m_lazyness; assert(t>=0.0 && t<=1.0); goalDir = Vec3::CreateSlerp(currentVel, goalDir, t); goalDir.Normalize(); } if(bDebug) pRenderer->Draw2dLabel(50,180,2.0f,color,false,"Corrected Dir: %.3f, %.3f, %.3f",goalDir.x,goalDir.y,goalDir.z); pe_action_set_velocity action; action.v = goalDir * currentSpeed; GetEntity()->GetPhysics()->Action(&action); } } }
CWebServer::CWebServer(CMainFrame* pMainFrame, int nPort) : m_pMainFrame(pMainFrame) , m_nPort(nPort) { if(m_internalpages.IsEmpty()) { m_internalpages[_T("/")] = &CWebClientSocket::OnIndex; m_internalpages[_T("/index.html")] = &CWebClientSocket::OnIndex; m_internalpages[_T("/browser.html")] = &CWebClientSocket::OnBrowser; m_internalpages[_T("/controls.html")] = &CWebClientSocket::OnControls; m_internalpages[_T("/command.html")] = &CWebClientSocket::OnCommand; m_internalpages[_T("/status.html")] = &CWebClientSocket::OnStatus; m_internalpages[_T("/player.html")] = &CWebClientSocket::OnPlayer; m_internalpages[_T("/snapshot.jpg")] = &CWebClientSocket::OnSnapShotJpeg; m_internalpages[_T("/404.html")] = &CWebClientSocket::OnError404; m_internalpages[_T("/convres.html")] = &CWebClientSocket::OnConvRes; } if(m_downloads.IsEmpty()) { m_downloads[_T("/default.css")] = IDF_DEFAULT_CSS; m_downloads[_T("/vbg.gif")] = IDF_VBR_GIF; m_downloads[_T("/vbs.gif")] = IDF_VBS_GIF; m_downloads[_T("/sliderbar.gif")] = IDF_SLIDERBAR_GIF; m_downloads[_T("/slidergrip.gif")] = IDF_SLIDERGRIP_GIF; m_downloads[_T("/sliderback.gif")] = IDF_SLIDERBACK_GIF; m_downloads[_T("/1pix.gif")] = IDF_1PIX_GIF; m_downloads[_T("/headericon.png")] = IDF_HEADERICON_PNG; m_downloads[_T("/headerback.png")] = IDF_HEADERBACK_PNG; m_downloads[_T("/headerclose.png")] = IDF_HEADERCLOSE_PNG; m_downloads[_T("/leftside.png")] = IDF_LEFTSIDE_PNG; m_downloads[_T("/rightside.png")] = IDF_RIGHTSIDE_PNG; m_downloads[_T("/bottomside.png")] = IDF_BOTTOMSIDE_PNG; m_downloads[_T("/leftbottomside.png")] = IDF_LEFTBOTTOMSIDE_PNG; m_downloads[_T("/rightbottomside.png")] = IDF_RIGHTBOTTOMSIDE_PNG; m_downloads[_T("/seekbarleft.png")] = IDF_SEEKBARLEFT_PNG; m_downloads[_T("/seekbarmid.png")] = IDF_SEEKBARMID_PNG; m_downloads[_T("/seekbarright.png")] = IDF_SEEKBARRIGHT_PNG; m_downloads[_T("/seekbargrip.png")] = IDF_SEEKBARGRIP_PNG; m_downloads[_T("/logo.png")] = IDF_LOGO7; m_downloads[_T("/controlback.png")] = IDF_CONTROLBACK_PNG; m_downloads[_T("/controlbuttonplay.png")] = IDF_CONTROLBUTTONPLAY_PNG; m_downloads[_T("/controlbuttonpause.png")] = IDF_CONTROLBUTTONPAUSE_PNG; m_downloads[_T("/controlbuttonstop.png")] = IDF_CONTROLBUTTONSTOP_PNG; m_downloads[_T("/controlbuttonskipback.png")] = IDF_CONTROLBUTTONSKIPBACK_PNG; m_downloads[_T("/controlbuttondecrate.png")] = IDF_CONTROLBUTTONDECRATE_PNG; m_downloads[_T("/controlbuttonincrate.png")] = IDF_CONTROLBUTTONINCRATE_PNG; m_downloads[_T("/controlbuttonskipforward.png")] = IDF_CONTROLBUTTONSKIPFORWARD_PNG; m_downloads[_T("/controlbuttonstep.png")] = IDF_CONTROLBUTTONSTEP_PNG; m_downloads[_T("/controlvolumeon.png")] = IDF_CONTROLVOLUMEON_PNG; m_downloads[_T("/controlvolumeoff.png")] = IDF_CONTROLVOLUMEOFF_PNG; m_downloads[_T("/controlvolumebar.png")] = IDF_CONTROLVOLUMEBAR_PNG; m_downloads[_T("/controlvolumegrip.png")] = IDF_CONTROLVOLUMEGRIP_PNG; } CRegKey key; CString str(_T("MIME\\Database\\Content Type")); if(ERROR_SUCCESS == key.Open(HKEY_CLASSES_ROOT, str, KEY_READ)) { TCHAR buff[256]; DWORD len = countof(buff); for(int i = 0; ERROR_SUCCESS == key.EnumKey(i, buff, &len); i++, len = countof(buff)) { CRegKey mime; TCHAR ext[64]; ULONG len = countof(ext); if(ERROR_SUCCESS == mime.Open(HKEY_CLASSES_ROOT, str + _T("\\") + buff, KEY_READ) && ERROR_SUCCESS == mime.QueryStringValue(_T("Extension"), ext, &len)) m_mimes[CStringA(ext).MakeLower()] = CStringA(buff).MakeLower(); } } m_mimes[".html"] = "text/html"; m_mimes[".txt"] = "text/plain"; m_mimes[".css"] = "text/css"; m_mimes[".gif"] = "image/gif"; m_mimes[".jpeg"] = "image/jpeg"; m_mimes[".jpg"] = "image/jpeg"; m_mimes[".png"] = "image/png"; GetModuleFileName(AfxGetInstanceHandle(), str.GetBuffer(MAX_PATH), MAX_PATH); str.ReleaseBuffer(); m_webroot = CPath(str); m_webroot.RemoveFileSpec(); CString WebRoot = AfxGetAppSettings().WebRoot; WebRoot.Replace('/', '\\'); WebRoot.Trim(); CPath p(WebRoot); if(WebRoot.Find(_T(":\\")) < 0 && WebRoot.Find(_T("\\\\")) < 0) m_webroot.Append(WebRoot); else m_webroot = p; m_webroot.Canonicalize(); m_webroot.MakePretty(); if(!m_webroot.IsDirectory()) m_webroot = CPath(); CAtlList<CString> sl; Explode(AfxGetAppSettings().WebServerCGI, sl, ';'); POSITION pos = sl.GetHeadPosition(); while(pos) { CAtlList<CString> sl2; CString ext = Explode(sl.GetNext(pos), sl2, '=', 2); if(sl2.GetCount() < 2) continue; m_cgi[ext] = sl2.GetTail(); } m_ThreadId = 0; m_hThread = ::CreateThread(NULL, 0, StaticThreadProc, (LPVOID)this, 0, &m_ThreadId); }
void Item::Interact() { m_interactCount++; bool needsErase = false; bool spawnSubItems = false; bool createHitEffect = false; bool createCrumbleBlockParticles = false; if(m_interactCount < m_maxInteractCount) { bool changeItemModel = false; char itemFilename[64]; if(m_itemType == eItem_CopperVein) { changeItemModel = true; spawnSubItems = true; createHitEffect = true; createCrumbleBlockParticles = true; sprintf(itemFilename, "media/gamedata/items/CopperVein/CopperVein%i.item", m_interactCount); } if(m_itemType == eItem_IronVein) { changeItemModel = true; spawnSubItems = true; createHitEffect = true; createCrumbleBlockParticles = true; sprintf(itemFilename, "media/gamedata/items/IronVein/IronVein%i.item", m_interactCount); } if(m_itemType == eItem_SilverVein) { changeItemModel = true; spawnSubItems = true; createHitEffect = true; createCrumbleBlockParticles = true; sprintf(itemFilename, "media/gamedata/items/SilverVein/SilverVein%i.item", m_interactCount); } if(m_itemType == eItem_GoldVein) { changeItemModel = true; spawnSubItems = true; createHitEffect = true; createCrumbleBlockParticles = true; sprintf(itemFilename, "media/gamedata/items/GoldVein/GoldVein%i.item", m_interactCount); } if(changeItemModel) { delete m_pVoxelItem; m_pVoxelItem = new VoxelWeapon(m_pRenderer, m_pQubicleBinaryManager); m_pVoxelItem->SetVoxelCharacterParent(NULL); m_pVoxelItem->LoadWeapon(itemFilename, false); } } else { if(m_itemType == eItem_CopperVein || m_itemType == eItem_IronVein || m_itemType == eItem_SilverVein || m_itemType == eItem_GoldVein) { needsErase = true; spawnSubItems = true; createHitEffect = true; } } // Chest open/close animation if(m_itemType == eItem_Chest) { m_pVoxelItem->StartSubSectionAnimation(); if(m_itemInteracting) { m_itemInteracting = false; } else { if(m_interactCount == m_maxInteractCount) { SpawnSubItems(); } m_itemInteracting = true; } } // Sitting in chair //if(m_itemType == eItem_Chair) //{ // m_pPlayer->SetPosition(m_position + vec3(0.0f, 0.01f, 0.0f)); // m_pPlayer->SetRotation(m_rotation.y); // m_pPlayer->SetSitting(true); //} // Spawn sub items if(spawnSubItems) { SpawnSubItems(); } // Crumble particle effects if(createCrumbleBlockParticles) { // Create some block particle effects for the crumbling ore veins int numCrubleBlocks = 10; for(int i = 0; i < numCrubleBlocks; i++) { float startScale = m_renderScale; float endScale = m_renderScale; startScale *= GetRandomNumber(90, 100, 2) * 0.01f; endScale *= GetRandomNumber(25, 75, 2) * 0.01f; float lifeTime = 4.0f + GetRandomNumber(-100, 200, 1) * 0.0075f; vec3 gravity = vec3(0.0f, -1.0f, 0.0f); vec3 pointOrigin = vec3(0.0f, 0.0f, 0.0f); float r = 0.49f; float g = 0.44f; float b = 0.44f; float a = 1.0f; vec3 spawnPos = GetCenter() + vec3(GetRandomNumber(-1, 1, 2)*0.5f, GetRandomNumber(-1, 1, 2)*0.5f, GetRandomNumber(-1, 1, 2)*0.5f); BlockParticle* pParticle = m_pBlockParticleManager->CreateBlockParticle(spawnPos, spawnPos, gravity, 1.5f, pointOrigin, startScale, 0.0f, endScale, 0.0f, r, g, b, a, 0.0f, 0.0f, 0.0f, 0.0f, r, g, b, a, 0.0f, 0.0f, 0.0f, 0.0f, lifeTime, 0.0f, 0.0f, 0.0f, vec3(0.0f, 3.0f, 0.0f), vec3(1.85f, 3.0f, 1.85f), vec3(0.0f, 0.0f, 0.0f), vec3(180.0f, 180.0f, 180.0f), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, true, vec3(0.0f, 0.0f, 0.0f), true, false, false, false, NULL); if(pParticle != NULL) { pParticle->m_allowFloorSliding = true; } } } // Do a hit particle effect if(createHitEffect) { vec3 direction = GetCenter() - m_pPlayer->GetCenter(); vec3 hitParticlePos = GetCenter() - (normalize(direction) * (m_radius*0.5f)); unsigned int effectId = -1; BlockParticleEffect* pBlockParticleEffect = VoxGame::GetInstance()->GetBlockParticleManager()->ImportParticleEffect("media/gamedata/particles/combat_hit.effect", hitParticlePos, &effectId); pBlockParticleEffect->PlayEffect(); } if(needsErase) { // Explode the item Explode(); // Erase SetErase(true); } }
void CPlantedC4::C4Think() { if (!IsInWorld()) { UTIL_Remove( this ); return; } //Bomb is dead, don't think anymore if( !m_bBombTicking ) { SetThink( NULL ); return; } SetNextThink( gpGlobals->curtime + 0.12 ); #ifndef CLIENT_DLL // let the bots hear the bomb beeping // BOTPORT: Emit beep events at same time as client effects IGameEvent * event = gameeventmanager->CreateEvent( "bomb_beep" ); if( event ) { event->SetInt( "entindex", entindex() ); gameeventmanager->FireEvent( event ); } #endif // IF the timer has expired ! blow this bomb up! if (m_flC4Blow <= gpGlobals->curtime) { // give the defuser credit for defusing the bomb CBasePlayer *pBombOwner = dynamic_cast< CBasePlayer* >( GetOwnerEntity() ); if ( pBombOwner ) { pBombOwner->IncrementFragCount( 3 ); } CSGameRules()->m_bBombDropped = false; trace_t tr; Vector vecSpot = GetAbsOrigin(); vecSpot[2] += 8; UTIL_TraceLine( vecSpot, vecSpot + Vector ( 0, 0, -40 ), MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); Explode( &tr, DMG_BLAST ); CSGameRules()->m_bBombPlanted = false; IGameEvent * event = gameeventmanager->CreateEvent( "bomb_exploded" ); if( event ) { event->SetInt( "userid", pBombOwner?pBombOwner->GetUserID():-1 ); event->SetInt( "site", m_iBombSiteIndex ); event->SetInt( "priority", 9 ); gameeventmanager->FireEvent( event ); } } //if the defusing process has started if ((m_bStartDefuse == true) && (m_pBombDefuser != NULL)) { //if the defusing process has not ended yet if ( m_flDefuseCountDown > gpGlobals->curtime) { int iOnGround = FBitSet( m_pBombDefuser->GetFlags(), FL_ONGROUND ); //if the bomb defuser has stopped defusing the bomb if( m_flNextDefuse < gpGlobals->curtime || !iOnGround ) { if ( !iOnGround && m_pBombDefuser->IsAlive() ) ClientPrint( m_pBombDefuser, HUD_PRINTCENTER, "#C4_Defuse_Must_Be_On_Ground"); // release the player from being frozen m_pBombDefuser->ResetMaxSpeed(); m_pBombDefuser->m_bIsDefusing = false; #ifndef CLIENT_DLL // tell the bots someone has aborted defusing IGameEvent * event = gameeventmanager->CreateEvent( "bomb_abortdefuse" ); if( event ) { event->SetInt("userid", m_pBombDefuser->GetUserID() ); event->SetInt( "priority", 6 ); gameeventmanager->FireEvent( event ); } #endif //cancel the progress bar m_pBombDefuser->SetProgressBarTime( 0 ); m_pBombDefuser = NULL; m_bStartDefuse = false; m_flDefuseCountDown = 0; m_flDefuseLength = 0; //force it to show completely defused } return; } //if the defuse process has ended, kill the c4 else if ( !m_pBombDefuser->IsDead() ) { IGameEvent * event = gameeventmanager->CreateEvent( "bomb_defused" ); if( event ) { event->SetInt("userid", m_pBombDefuser->GetUserID() ); event->SetInt("site", m_iBombSiteIndex ); event->SetInt( "priority", 9 ); gameeventmanager->FireEvent( event ); } Vector soundPosition = m_pBombDefuser->GetAbsOrigin() + Vector( 0, 0, 5 ); CPASAttenuationFilter filter( soundPosition ); EmitSound( filter, entindex(), "c4.disarmfinish" ); // The bomb has just been disarmed.. Check to see if the round should end now m_bBombTicking = false; // release the player from being frozen m_pBombDefuser->ResetMaxSpeed(); m_pBombDefuser->m_bIsDefusing = false; CSGameRules()->m_bBombDefused = true; CSGameRules()->CheckWinConditions(); // give the defuser credit for defusing the bomb m_pBombDefuser->IncrementFragCount( 3 ); CSGameRules()->m_bBombDropped = false; CSGameRules()->m_bBombPlanted = false; // Clear their progress bar. m_pBombDefuser->SetProgressBarTime( 0 ); m_pBombDefuser = NULL; m_bStartDefuse = false; m_flDefuseLength = 10; return; } #ifndef CLIENT_DLL // tell the bots someone has aborted defusing IGameEvent * event = gameeventmanager->CreateEvent( "bomb_abortdefuse" ); if( event ) { event->SetInt("userid", m_pBombDefuser->GetUserID() ); event->SetInt( "priority", 6 ); gameeventmanager->FireEvent( event ); } #endif //if it gets here then the previouse defuser has taken off or been killed // release the player from being frozen m_pBombDefuser->ResetMaxSpeed(); m_pBombDefuser->m_bIsDefusing = false; m_bStartDefuse = false; m_pBombDefuser = NULL; } }
protected func Hit() { Explode(8); }
func Break() { Explode(24); return 1; }
void CWebServer::OnRequest(CWebClientSocket* pClient, CStringA& hdr, CStringA& body) { CPath p(pClient->m_path); CStringA ext = p.GetExtension().MakeLower(); CStringA mime; if(ext.IsEmpty()) mime = "text/html"; else m_mimes.Lookup(ext, mime); hdr = "HTTP/1.0 200 OK\r\n"; bool fHandled = false, fCGI = false; if(!fHandled && m_webroot.IsDirectory()) { CStringA tmphdr; fHandled = fCGI = CallCGI(pClient, tmphdr, body, mime); if(fHandled) { tmphdr.Replace("\r\n", "\n"); CAtlList<CStringA> hdrlines; ExplodeMin(tmphdr, hdrlines, '\n'); POSITION pos = hdrlines.GetHeadPosition(); while(pos) { POSITION cur = pos; CAtlList<CStringA> sl; CStringA key = Explode(hdrlines.GetNext(pos), sl, ':', 2); if(sl.GetCount() < 2) continue; key.Trim().MakeLower(); if(key == "content-type") {mime = sl.GetTail().Trim(); hdrlines.RemoveAt(cur);} else if(key == "content-length") {hdrlines.RemoveAt(cur);} } tmphdr = Implode(hdrlines, '\n'); tmphdr.Replace("\n", "\r\n"); hdr += tmphdr + "\r\n"; } } RequestHandler rh = NULL; if(!fHandled && m_internalpages.Lookup(pClient->m_path, rh) && (pClient->*rh)(hdr, body, mime)) { if(mime.IsEmpty()) mime = "text/html"; CString redir; if(pClient->m_get.Lookup(_T("redir"), redir) || pClient->m_post.Lookup(_T("redir"), redir)) { if(redir.IsEmpty()) redir = '/'; hdr = "HTTP/1.0 302 Found\r\n" "Location: " + CStringA(redir) + "\r\n"; return; } fHandled = true; } if(!fHandled && m_webroot.IsDirectory()) { fHandled = LoadPage(0, body, pClient->m_path); } UINT resid; CStringA res; if(!fHandled && m_downloads.Lookup(pClient->m_path, resid) && LoadResource(resid, res, _T("FILE"))) { if(mime.IsEmpty()) mime = "application/octet-stream"; memcpy(body.GetBufferSetLength(res.GetLength()), res.GetBuffer(), res.GetLength()); fHandled = true; } if(!fHandled) { hdr = mime == "text/html" ? "HTTP/1.0 301 Moved Permanently\r\n" "Location: /404.html\r\n" : "HTTP/1.0 404 Not Found\r\n"; return; } if(mime == "text/html" && !fCGI) { hdr += "Expires: Thu, 19 Nov 1981 08:52:00 GMT\r\n" "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\n" "Pragma: no-cache\r\n"; CStringA debug; if(AfxGetAppSettings().fWebServerPrintDebugInfo) { debug += "<hr>\r\n"; CString key, value; POSITION pos; pos = pClient->m_hdrlines.GetStartPosition(); while(pos) {pClient->m_hdrlines.GetNextAssoc(pos, key, value); debug += "HEADER[" + key + "] = " + value + "<br>\r\n";} debug += "cmd: " + pClient->m_cmd + "<br>\r\n"; debug += "path: " + pClient->m_path + "<br>\r\n"; debug += "ver: " + pClient->m_ver + "<br>\r\n"; pos = pClient->m_get.GetStartPosition(); while(pos) {pClient->m_get.GetNextAssoc(pos, key, value); debug += "GET[" + key + "] = " + value + "<br>\r\n";} pos = pClient->m_post.GetStartPosition(); while(pos) {pClient->m_post.GetNextAssoc(pos, key, value); debug += "POST[" + key + "] = " + value + "<br>\r\n";} pos = pClient->m_cookie.GetStartPosition(); while(pos) {pClient->m_cookie.GetNextAssoc(pos, key, value); debug += "COOKIE[" + key + "] = " + value + "<br>\r\n";} pos = pClient->m_request.GetStartPosition(); while(pos) {pClient->m_request.GetNextAssoc(pos, key, value); debug += "REQUEST[" + key + "] = " + value + "<br>\r\n";} } body.Replace("[path]", CStringA(pClient->m_path)); body.Replace("[indexpath]", "/index.html"); body.Replace("[commandpath]", "/command.html"); body.Replace("[browserpath]", "/browser.html"); body.Replace("[controlspath]", "/controls.html"); body.Replace("[wmcname]", "wm_command"); body.Replace("[setposcommand]", CMD_SETPOS); body.Replace("[setvolumecommand]", CMD_SETVOLUME); body.Replace("[debug]", debug); // TODO: add more general tags to replace } // gzip if(AfxGetAppSettings().fWebServerUseCompression && hdr.Find("Content-Encoding:") < 0) do { CString accept_encoding; pClient->m_hdrlines.Lookup(_T("accept-encoding"), accept_encoding); accept_encoding.MakeLower(); CAtlList<CString> sl; ExplodeMin(accept_encoding, sl, ','); if(!sl.Find(_T("gzip"))) break;; CHAR path[MAX_PATH], fn[MAX_PATH]; if(!GetTempPathA(MAX_PATH, path) || !GetTempFileNameA(path, "mpc_gz", 0, fn)) break; gzFile gf = gzopen(fn, "wb9"); if(!gf || gzwrite(gf, (LPVOID)(LPCSTR)body, body.GetLength()) != body.GetLength()) { if(gf) gzclose(gf); DeleteFileA(fn); break; } gzclose(gf); FILE* f = fopen(fn, "rb"); if(!f) {DeleteFileA(fn); break;} fseek(f, 0, 2); CHAR* s = body.GetBufferSetLength(ftell(f)); fseek(f, 0, 0); int len = fread(s, 1, body.GetLength(), f); ASSERT(len == body.GetLength()); fclose(f); DeleteFileA(fn); hdr += "Content-Encoding: gzip\r\n"; } while(0); CStringA content; content.Format( "Content-Type: %s\r\n" "Content-Length: %d\r\n", mime, body.GetLength()); hdr += content; }
void Bomb::Update() { SpriteEntity::Update(); if(frame == 16) Explode(); }
//---------------------------------------------------------------------------- void CHomingMissile::UpdateCruiseMissile(float frameTime) { IRenderer* pRenderer = gEnv->pRenderer; IRenderAuxGeom* pGeom = pRenderer->GetIRenderAuxGeom(); float color[4] = {1,1,1,1}; const static float step = 15.f; float y = 20.f; bool bDebug = g_pGameCVars->i_debug_projectiles > 0; if (m_targetId) { IEntity* pTarget = gEnv->pEntitySystem->GetEntity(m_targetId); if (pTarget) { AABB box; pTarget->GetWorldBounds(box); SetDestination( box.GetCenter() ); //if (bDebug) //pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "Target Entity: %s", pTarget->GetName()); } } else { // update destination pos from weapon static IItemSystem* pItemSystem = g_pGame->GetIGameFramework()->GetIItemSystem(); IItem* pItem = pItemSystem->GetItem(m_weaponId); if (pItem && pItem->GetIWeapon()) { const Vec3& dest = pItem->GetIWeapon()->GetDestination(); SetDestination( dest ); //if (bDebug) //pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "Weapon Destination: (%.1f %.1f %.1f)", dest.x, dest.y, dest.z); } } pe_status_dynamics status; if (!GetEntity()->GetPhysics()->GetStatus(&status)) return; float currentSpeed = status.v.len(); Vec3 currentPos = GetEntity()->GetWorldPos(); Vec3 goalDir(ZERO); if (!m_destination.IsZero()) { if((currentPos-m_destination).len2()<(m_detonationRadius*m_detonationRadius)) { Explode(true, true, m_destination, -status.v.normalized(), status.v, m_targetId); return; } if (bDebug) pGeom->DrawCone(m_destination, Vec3(0,0,-1), 2.5f, 7.f, ColorB(255,0,0,255)); float heightDiff = (m_cruiseAltitude-m_alignAltitude) - currentPos.z; if (!m_isCruising && heightDiff * sgn(status.v.z) > 0.f) { // if heading towards align altitude (but not yet reached) accelerate to max speed if (bDebug) pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "[HomingMissile] accelerating (%.1f / %.1f)", currentSpeed, m_maxSpeed); } else if (!m_isCruising && heightDiff * sgnnz(status.v.z) < 0.f && (status.v.z<0 || status.v.z>0.25f)) { // align to cruise if (currentSpeed != 0) { goalDir = status.v; goalDir.z = 0; goalDir.normalize(); } if (bDebug) pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "[HomingMissile] aligning"); } else { if (bDebug) pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "[HomingMissile] cruising..."); // cruise m_isCruising = true; if (!m_destination.IsZero()) { float groundDistSq = m_destination.GetSquaredDistance2D(currentPos); float distSq = m_destination.GetSquaredDistance(currentPos); float descendDistSq = sqr(m_descendDistance); if (m_isDescending || groundDistSq <= descendDistSq) { if (bDebug) pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "[HomingMissile] descending!"); if (distSq != 0) goalDir = (m_destination - currentPos).normalized(); else goalDir.zero(); m_isDescending = true; } else { Vec3 airPos = m_destination; airPos.z = currentPos.z; goalDir = airPos - currentPos; if (goalDir.len2() != 0) goalDir.Normalize(); } } } } float desiredSpeed = currentSpeed; if (currentSpeed < m_maxSpeed-0.1f) { desiredSpeed = min(m_maxSpeed, desiredSpeed + m_accel*frameTime); } Vec3 currentDir = status.v.GetNormalizedSafe(FORWARD_DIRECTION); Vec3 dir = currentDir; if (!goalDir.IsZero()) { float cosine = max(min(currentDir.Dot(goalDir), 0.999f), -0.999f); float goalAngle = RAD2DEG(acos_tpl(cosine)); float maxAngle = m_turnSpeed * frameTime; if (bDebug) { pGeom->DrawCone( currentPos, goalDir, 0.4f, 12.f, ColorB(255,0,0,255) ); pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "[HomingMissile] goalAngle: %.2f", goalAngle); } if (goalAngle > maxAngle+0.05f) dir = (Vec3::CreateSlerp(currentDir, goalDir, maxAngle/goalAngle)).normalize(); else //if (goalAngle < 0.005f) dir = goalDir; } pe_action_set_velocity action; action.v = dir * desiredSpeed; GetEntity()->GetPhysics()->Action(&action); if (bDebug) { pGeom->DrawCone( currentPos, dir, 0.4f, 12.f, ColorB(128,128,0,255) ); pRenderer->Draw2dLabel(5.0f, y+=step, 1.5f, color, false, "[HomingMissile] currentSpeed: %.1f (max: %.1f)", currentSpeed, m_maxSpeed); } }
bool CSubtitleDlDlg::Parse() { // Parse raw list ISDb::movie m; ISDb::subtitle sub; CAtlList<CStringA> sl; Explode(m_pTA->raw_list, sl, '\n'); CString str; POSITION pos = sl.GetHeadPosition(); while (pos) { str = sl.GetNext(pos); CStringA param = str.Left(max(0, str.Find('='))); CStringA value = str.Mid(str.Find('=') + 1); if (param == "ticket") { m_pTA->ticket = value; } else if (param == "movie") { m.reset(); Explode(value.Trim(" |"), m.titles, '|'); } else if (param == "subtitle") { sub.reset(); sub.id = atoi(value); } else if (param == "name") { sub.name = value; } else if (param == "discs") { sub.discs = atoi(value); } else if (param == "disc_no") { sub.disc_no = atoi(value); } else if (param == "format") { sub.format = value; } else if (param == "iso639_2") { sub.iso639_2 = value; } else if (param == "language") { sub.language = value; } else if (param == "nick") { sub.nick = value; } else if (param == "email") { sub.email = value; } else if (param.IsEmpty() && value == "endsubtitle") { m.subs.AddTail(sub); } else if (param.IsEmpty() && value == "endmovie") { m_pTA->raw_movies.AddTail(m); } else if (param.IsEmpty() && value == "end") { break; } } // Parse movies pos = m_pTA->raw_movies.GetHeadPosition(); while (pos) { ISDb::movie& raw_movie = m_pTA->raw_movies.GetNext(pos); isdb_movie_parsed p; CStringA titlesA = Implode(raw_movie.titles, '|'); titlesA.Replace("|", ", "); p.titles = UTF8To16(titlesA); p.checked = false; POSITION pos2 = raw_movie.subs.GetHeadPosition(); while (pos2) { const ISDb::subtitle& s = raw_movie.subs.GetNext(pos2); p.name = UTF8To16(s.name); p.language = s.language; p.format = s.format; p.disc.Format(_T("%d/%d"), s.disc_no, s.discs); p.ptr = reinterpret_cast<DWORD_PTR>(&s); m_parsed_movies.Add(p); } } bool ret = true; if (m_parsed_movies.IsEmpty()) { ret = false; } return ret; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPhysExplosion::InputExplode( inputdata_t &inputdata ) { Explode( inputdata.pActivator ); }