void CTexelDiffuseMethod::PostGenerate() { for (size_t i = 0; i < m_aTextures.size(); i++) { if (m_aTextures[i].m_pclrData) CRenderer::UnloadTextureData(m_aTextures[i].m_pclrData); } if (m_pGenerator->GetWorkListener()) m_pGenerator->GetWorkListener()->SetAction("Averaging reads", m_iWidth*m_iHeight); // Average out all of the reads. for (size_t i = 0; i < m_iWidth*m_iHeight; i++) { // Don't immediately return, just skip this loop. We have cleanup work to do. if (m_pGenerator->IsStopped()) break; if (m_aiDiffuseReads[i]) m_avecDiffuseValues[i] /= (float)m_aiDiffuseReads[i]; else m_avecDiffuseValues[i] = Vector(0,0,0); // When exporting to png sometimes a pure white value will suffer integer overflow. m_avecDiffuseValues[i] *= 0.99f; if (m_pGenerator->GetWorkListener()) m_pGenerator->GetWorkListener()->WorkProgress(i); } if (!m_pGenerator->IsStopped()) Bleed(); }
void CTexelAOMethod::PostGenerate() { size_t i; if (m_pGenerator->GetWorkListener()) m_pGenerator->GetWorkListener()->SetAction("Averaging reads", m_iWidth*m_iHeight); // Average out all of the reads. for (i = 0; i < m_iWidth*m_iHeight; i++) { // Don't immediately return, just skip this loop. We have cleanup work to do. if (m_pGenerator->IsStopped()) break; if (m_aiShadowReads[i]) m_avecShadowValues[i] /= (float)m_aiShadowReads[i]; else m_avecShadowValues[i] = Vector(0,0,0); // When exporting to png sometimes a pure white value will suffer integer overflow. m_avecShadowValues[i] *= 0.99f; if (m_pGenerator->GetWorkListener()) m_pGenerator->GetWorkListener()->WorkProgress(i); } // Somebody get this ao some clotters and morphine, STAT! if (!m_pGenerator->IsStopped()) Bleed(); }
void curse_think(edict_t *self) { //Find my curse slot que_t *slot = NULL; slot = que_findtype(self->enemy->curses, NULL, self->atype); // curse self-terminates if the enemy dies or the duration expires if (!slot || !que_valident(slot)) { que_removeent(self->enemy->curses, self, true); return; } CurseEffects(self->enemy, 10, 242); //Stick with the target VectorCopy(self->enemy->s.origin, self->s.origin); gi.linkentity(self); //Next think time self->nextthink = level.time + FRAMETIME; LifeDrain(self);// 3.5 this must be called last, because it may free the curse ent Bleed(self);//4.2 }
void CASW_Alien::TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr ) { #ifdef GAME_DLL m_fNoDamageDecal = false; if ( m_takedamage == DAMAGE_NO ) return; #endif CTakeDamageInfo subInfo = info; #ifdef GAME_DLL SetLastHitGroup( ptr->hitgroup ); m_nForceBone = ptr->physicsbone; // save this bone for physics forces #endif Assert( m_nForceBone > -255 && m_nForceBone < 256 ); // mining laser does reduced damage if ( info.GetDamageType() & DMG_ENERGYBEAM ) { subInfo.ScaleDamage( asw_alien_mining_laser_damage_scale.GetFloat() ); } if ( subInfo.GetDamage() >= 1.0 && !(subInfo.GetDamageType() & DMG_SHOCK ) && !( subInfo.GetDamageType() & DMG_BURN ) ) { #ifdef GAME_DLL Bleed( subInfo, ptr->endpos + m_LagCompensation.GetLagCompensationOffset(), vecDir, ptr ); if ( ptr->hitgroup == HITGROUP_HEAD && m_iHealth - subInfo.GetDamage() > 0 ) { m_fNoDamageDecal = true; } #else Bleed( subInfo, ptr->endpos, vecDir, ptr ); //OnHurt(); #endif } if( !info.GetInflictor() ) { subInfo.SetInflictor( info.GetAttacker() ); } AddMultiDamage( subInfo, this ); #ifdef GAME_DLL #else CASW_Marine *pMarine = dynamic_cast<CASW_Marine*>( subInfo.GetAttacker() ); CASW_Player *pPlayerAttacker = NULL; if ( pMarine ) { pPlayerAttacker = pMarine->GetCommander(); } IGameEvent * event = gameeventmanager->CreateEvent( "alien_hurt" ); if ( event ) { event->SetInt( "attacker", ( pPlayerAttacker ? pPlayerAttacker->GetUserID() : 0 ) ); event->SetInt( "entindex", entindex() ); event->SetInt( "amount", subInfo.GetDamage() ); gameeventmanager->FireEventClientSide( event ); } UTIL_ASW_ClientFloatingDamageNumber( subInfo ); #endif }
void CTexelNormalMethod::PostGenerate() { Bleed(); TexturizeValues(m_avecNormalValues); }
void Client::BulletHitPlayer(spades::client::Player *hurtPlayer, HitType type, spades::Vector3 hitPos, spades::client::Player *by) { SPADES_MARK_FUNCTION(); SPAssert(type != HitTypeBlock); // don't bleed local player if (!IsFirstPerson(GetCameraMode()) || &GetCameraTargetPlayer() != hurtPlayer) { Bleed(hitPos); } if (hurtPlayer == world->GetLocalPlayer()) { // don't player hit sound now; // local bullet impact sound is // played by checking the decrease of HP return; } if (!IsMuted()) { if (type == HitTypeMelee) { Handle<IAudioChunk> c = audioDevice->RegisterSound("Sounds/Weapons/Spade/HitPlayer.opus"); audioDevice->Play(c, hitPos, AudioParam()); } else { Handle<IAudioChunk> c; switch (SampleRandomInt(0, 2)) { case 0: c = audioDevice->RegisterSound("Sounds/Weapons/Impacts/Flesh1.opus"); break; case 1: c = audioDevice->RegisterSound("Sounds/Weapons/Impacts/Flesh2.opus"); break; case 2: c = audioDevice->RegisterSound("Sounds/Weapons/Impacts/Flesh3.opus"); break; } AudioParam param; param.volume = 4.f; audioDevice->Play(c, hitPos, param); } } if (by == world->GetLocalPlayer() && hurtPlayer) { net->SendHit(hurtPlayer->GetId(), type); if (type == HitTypeHead) { Handle<IAudioChunk> c = audioDevice->RegisterSound("Sounds/Feedback/HeadshotFeedback.opus"); AudioParam param; param.volume = cg_hitFeedbackSoundGain; audioDevice->PlayLocal(c, param); } hitFeedbackIconState = 1.f; if (hurtPlayer->GetTeamId() == world->GetLocalPlayer()->GetTeamId()) { hitFeedbackFriendly = true; } else { hitFeedbackFriendly = false; } } }
void Client::PlayerKilledPlayer(spades::client::Player *killer, spades::client::Player *victim, KillType kt) { // play hit sound if (kt == KillTypeWeapon || kt == KillTypeHeadshot) { // don't play on local: see BullethitPlayer if (victim != world->GetLocalPlayer()) { if (!IsMuted()) { Handle<IAudioChunk> c; switch (SampleRandomInt(0, 2)) { case 0: c = audioDevice->RegisterSound("Sounds/Weapons/Impacts/Flesh1.opus"); break; case 1: c = audioDevice->RegisterSound("Sounds/Weapons/Impacts/Flesh2.opus"); break; case 2: c = audioDevice->RegisterSound("Sounds/Weapons/Impacts/Flesh3.opus"); break; } AudioParam param; param.volume = 4.f; audioDevice->Play(c, victim->GetEye(), param); } } } // The local player is dead; initialize the look-you-are-dead cam if (victim == world->GetLocalPlayer()) { followCameraState.enabled = false; Vector3 v = -victim->GetFront(); followAndFreeCameraState.yaw = atan2(v.y, v.x); followAndFreeCameraState.pitch = 30.f * M_PI / 180.f; } // emit blood (also for local player) // FIXME: emiting blood for either // client-side or server-side hit? switch (kt) { case KillTypeGrenade: case KillTypeHeadshot: case KillTypeMelee: case KillTypeWeapon: Bleed(victim->GetEye()); break; default: break; } // create ragdoll corpse if (cg_ragdoll && victim->GetTeamId() < 2) { Corpse *corp; corp = new Corpse(renderer, map, victim); if (victim == world->GetLocalPlayer()) lastMyCorpse = corp; if (killer != victim && kt != KillTypeGrenade) { Vector3 dir = victim->GetPosition() - killer->GetPosition(); dir = dir.Normalize(); if (kt == KillTypeMelee) { dir *= 6.f; } else { if (killer->GetWeapon()->GetWeaponType() == SMG_WEAPON) { dir *= 2.8f; } else if (killer->GetWeapon()->GetWeaponType() == SHOTGUN_WEAPON) { dir *= 4.5f; } else { dir *= 3.5f; } } corp->AddImpulse(dir); } else if (kt == KillTypeGrenade) { corp->AddImpulse(MakeVector3(0, 0, -4.f - SampleRandomFloat() * 4.f)); } corp->AddImpulse(victim->GetVelocty() * 32.f); corpses.emplace_back(corp); if (corpses.size() > corpseHardLimit) { corpses.pop_front(); } else if (corpses.size() > corpseSoftLimit) { RemoveInvisibleCorpses(); } } // add chat message std::string s; s = ChatWindow::TeamColorMessage(killer->GetName(), killer->GetTeamId()); std::string cause; bool isFriendlyFire = killer->GetTeamId() == victim->GetTeamId(); if (killer == victim) isFriendlyFire = false; Weapon *w = killer ? killer->GetWeapon() : nullptr; // only used in case of KillTypeWeapon switch (kt) { case KillTypeWeapon: switch (w ? w->GetWeaponType() : RIFLE_WEAPON) { case RIFLE_WEAPON: cause += _Tr("Client", "Rifle"); break; case SMG_WEAPON: cause += _Tr("Client", "SMG"); break; case SHOTGUN_WEAPON: cause += _Tr("Client", "Shotgun"); break; } break; case KillTypeFall: //! A cause of death shown in the kill feed. cause += _Tr("Client", "Fall"); break; case KillTypeMelee: //! A cause of death shown in the kill feed. cause += _Tr("Client", "Melee"); break; case KillTypeGrenade: cause += _Tr("Client", "Grenade"); break; case KillTypeHeadshot: //! A cause of death shown in the kill feed. cause += _Tr("Client", "Headshot"); break; case KillTypeTeamChange: //! A cause of death shown in the kill feed. cause += _Tr("Client", "Team Change"); break; case KillTypeClassChange: //! A cause of death shown in the kill feed. cause += _Tr("Client", "Weapon Change"); break; default: cause += "???"; break; } s += " ["; if (isFriendlyFire) s += ChatWindow::ColoredMessage(cause, MsgColorFriendlyFire); else if (killer == world->GetLocalPlayer() || victim == world->GetLocalPlayer()) s += ChatWindow::ColoredMessage(cause, MsgColorGray); else s += cause; s += "] "; if (killer != victim) { s += ChatWindow::TeamColorMessage(victim->GetName(), victim->GetTeamId()); } killfeedWindow->AddMessage(s); // log to netlog if (killer != victim) { NetLog("%s (%s) [%s] %s (%s)", killer->GetName().c_str(), world->GetTeam(killer->GetTeamId()).name.c_str(), cause.c_str(), victim->GetName().c_str(), world->GetTeam(victim->GetTeamId()).name.c_str()); } else { NetLog("%s (%s) [%s]", killer->GetName().c_str(), world->GetTeam(killer->GetTeamId()).name.c_str(), cause.c_str()); } // show big message if player is involved if (victim != killer) { Player *local = world->GetLocalPlayer(); if (killer == local || victim == local) { std::string msg; if (killer == local) { if ((int)cg_centerMessage == 2) msg = _Tr("Client", "You have killed {0}", victim->GetName()); } else { msg = _Tr("Client", "You were killed by {0}", killer->GetName()); } centerMessageView->AddMessage(msg); } } }
void CAOGenerator::Generate() { double flTimeStarted = Application()->GetTime(); if (!m_eAOMethod) return; m_pWorkListener->BeginProgress(); m_pWorkListener->SetAction("Setting up", 0); m_bIsGenerating = true; m_bStopGenerating = false; m_bDoneGenerating = false; m_bIsBleeding = false; m_flLowestValue = -1; m_flHighestValue = 0; if (SMAKWindow()) SMAKWindow()->ClearDebugLines(); memset(&m_bPixelMask[0], 0, m_iWidth*m_iHeight*sizeof(bool)); if (m_eAOMethod == AOMETHOD_SHADOWMAP) { ShadowMapSetupScene(); GenerateShadowMaps(); } else { if (m_eAOMethod == AOMETHOD_RENDER) RenderSetupScene(); // In AO debug mode we need this to do the debug rendering, so do it anyways. else if (ao_debug.GetBool()) RenderSetupScene(); GenerateByTexel(); } size_t i; m_pWorkListener->SetAction("Averaging reads", m_iWidth*m_iHeight); // Average out all of the reads. for (i = 0; i < m_iWidth*m_iHeight; i++) { // Don't immediately return, just skip this loop. We have cleanup work to do. if (m_bStopGenerating) break; if (m_eAOMethod == AOMETHOD_SHADOWMAP) m_avecShadowValues[i] = Vector(m_avecShadowValues[i].x, m_avecShadowValues[i].x, m_avecShadowValues[i].x); if (m_aiShadowReads[i]) m_avecShadowValues[i] /= (float)m_aiShadowReads[i]; else m_avecShadowValues[i] = Vector(0,0,0); m_pWorkListener->WorkProgress(i); } if (m_eAOMethod == AOMETHOD_RENDER || m_eAOMethod == AOMETHOD_SHADOWMAP) { if (m_eAOMethod == AOMETHOD_SHADOWMAP) { m_oAOFB.Destroy(); CRenderer::UnloadVertexDataFromGL(m_iScene); CRenderer::UnloadVertexDataFromGL(m_iSceneDepth); } else { for (size_t i = 0; i < m_aiSceneMaterials.size(); i++) CRenderer::UnloadVertexDataFromGL(m_aiSceneMaterials[i]); m_oRenderFB.Destroy(); } } // Somebody get this ao some clotters and morphine, STAT! m_bIsBleeding = true; if (!m_bStopGenerating) Bleed(); m_bIsBleeding = false; if (!m_bStopGenerating) m_bDoneGenerating = true; m_bIsGenerating = false; // One last call to let them know we're done. m_pWorkListener->EndProgress(); double flTimeEnded = Application()->GetTime(); double flTimePassed = flTimeEnded - flTimeStarted; TMsg(sprintf("AO generation completed in %f seconds\n", flTimePassed)); }