/*! 差分表示 @param pszFile1 [in] 自ファイル名 @param pszFile2 [in] 相手ファイル名 @param nFlgOpt [in] 0b000000000 ||||||+--- -i ignore-case 大文字小文字同一視 |||||+---- -w ignore-all-space 空白無視 ||||+----- -b ignore-space-change 空白変更無視 |||+------ -B ignore-blank-lines 空行無視 ||+------- -t expand-tabs TAB-SPACE変換 |+-------- (編集中のファイルが旧ファイル) +--------- (DIFF差分がないときにメッセージ表示) @note HandleCommandからの呼び出し対応(ダイアログなし版) @author MIK @date 2002/05/25 @date 2005/10/28 旧Command_Diffから関数名の変更。 GetCommander().Command_Diff_Dialogだけでなく新Command_Diff からも呼ばれる関数。maru @date 2013/06/21 ExecCmdを利用するように */ void CEditView::ViewDiffInfo( const TCHAR* pszFile1, const TCHAR* pszFile2, int nFlgOpt, bool bUTF8 ) /* bool bFlgCase, //大文字小文字同一視 bool bFlgBlank, //空白無視 bool bFlgWhite, //空白変更無視 bool bFlgBLine, //空行無視 bool bFlgTabSpc, //TAB-SPACE変換 bool bFlgFile12, //編集中のファイルが旧ファイル */ { CWaitCursor cWaitCursor( this->GetHwnd() ); int nFlgFile12 = 1; /* exeのあるフォルダ */ TCHAR szExeFolder[_MAX_PATH + 1]; TCHAR cmdline[1024]; GetExedir( cmdline, _T("diff.exe") ); SplitPath_FolderAndFile( cmdline, szExeFolder, NULL ); // From Here Dec. 28, 2002 MIK // diff.exeの存在チェック if( !IsFileExists( cmdline, true ) ) { WarningMessage( GetHwnd(), LS(STR_ERR_DLGEDITVWDIFF2) ); return; } cmdline[0] = _T('\0'); //今あるDIFF差分を消去する。 if( CDiffManager::getInstance()->IsDiffUse() ) GetCommander().Command_Diff_Reset(); //m_pcEditDoc->m_cDocLineMgr.ResetAllDiffMark(); //オプションを作成する TCHAR szOption[16]; // "-cwbBt" _tcscpy( szOption, _T("-") ); if( nFlgOpt & 0x0001 ) _tcscat( szOption, _T("i") ); //-i ignore-case 大文字小文字同一視 if( nFlgOpt & 0x0002 ) _tcscat( szOption, _T("w") ); //-w ignore-all-space 空白無視 if( nFlgOpt & 0x0004 ) _tcscat( szOption, _T("b") ); //-b ignore-space-change 空白変更無視 if( nFlgOpt & 0x0008 ) _tcscat( szOption, _T("B") ); //-B ignore-blank-lines 空行無視 if( nFlgOpt & 0x0010 ) _tcscat( szOption, _T("t") ); //-t expand-tabs TAB-SPACE変換 if( _tcscmp( szOption, _T("-") ) == 0 ) szOption[0] = _T('\0'); //オプションなし if( nFlgOpt & 0x0020 ) nFlgFile12 = 0; else nFlgFile12 = 1; // To Here Dec. 28, 2002 MIK { //コマンドライン文字列作成(MAX:1024) auto_sprintf( cmdline, _T("\"%ts\\%ts\" %ts \"%ts\" \"%ts\""), szExeFolder, //sakura.exeパス _T("diff.exe"), //diff.exe szOption, //diffオプション ( nFlgFile12 ? pszFile2 : pszFile1 ), ( nFlgFile12 ? pszFile1 : pszFile2 ) ); } { int nFlgOpt = 0; nFlgOpt |= 0x01; // GetStdOut if( bUTF8 ){ nFlgOpt |= 0x80; // UTF-8 out (SJISと違ってASCIIセーフなので) nFlgOpt |= 0x100; // UTF-8 in } nFlgOpt |= 0x40; // 拡張情報出力無効 COutputAdapterDiff oa(this, nFlgFile12); bool ret = ExecCmd( cmdline, nFlgOpt, NULL, &oa ); if( ret ){ if( oa.bDiffInfo == true && oa.nDiffLen > 0 ) { oa.szDiffData[oa.nDiffLen] = '\0'; AnalyzeDiffInfo( oa.szDiffData, nFlgFile12 ); } } } //DIFF差分が見つからなかったときにメッセージ表示 if( nFlgOpt & 0x0040 ) { if( !CDiffManager::getInstance()->IsDiffUse() ) { InfoMessage( this->GetHwnd(), LS(STR_ERR_DLGEDITVWDIFF5) ); } } //分割したビューも更新 m_pcEditWnd->Views_Redraw(); return; }
void CPageBoatyard::OnMyList_LButtonDClick(NMHDR* pNMHDR, LRESULT*) { GetCommander()->SwitchToPage(PAGE_DOCUMENTS); comm_->ShowDocument(2 , -1); }
void CASW_Weapon_Mines::PrimaryAttack( void ) { // Only the player fires this way so we can cast CASW_Player *pPlayer = GetCommander(); if (!pPlayer) return; CASW_Marine *pMarine = GetMarine(); #ifndef CLIENT_DLL bool bThisActive = (pMarine && pMarine->GetActiveWeapon() == this); #endif // mine weapon is lost when all mines are gone if ( UsesClipsForAmmo1() && !m_iClip1 ) { //Reload(); #ifndef CLIENT_DLL if (pMarine) { pMarine->Weapon_Detach(this); if (bThisActive) pMarine->SwitchToNextBestWeapon(NULL); } Kill(); #endif return; } if ( !pMarine || pMarine->GetWaterLevel() == 3 ) return; // MUST call sound before removing a round from the clip of a CMachineGun //WeaponSound(SINGLE); // tell the marine to tell its weapon to draw the muzzle flash //pMarine->DoMuzzleFlash(); // sets the animation on the weapon model iteself SendWeaponAnim( GetPrimaryAttackActivity() ); //pMarine->DoAnimationEvent(PLAYERANIMEVENT_HEAL); // sets the animation on the marine holding this weapon //pMarine->SetAnimation( PLAYER_ATTACK1 ); #ifndef CLIENT_DLL Vector vecSrc = pMarine->Weapon_ShootPosition( ); Vector vecAiming = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 if ( !pMarine->IsInhabited() && vecSrc.DistTo( pMarine->m_vecOffhandItemSpot ) < 150.0f ) { vecSrc.x = pMarine->m_vecOffhandItemSpot.x; vecSrc.y = pMarine->m_vecOffhandItemSpot.y; vecSrc.z += 50.0f; } QAngle ang = pPlayer->EyeAngles(); ang.x = 0; ang.z = 0; CShotManipulator Manipulator( vecAiming ); AngularImpulse rotSpeed(0,0,720); // create a pellet at some random spread direction Vector newVel = Manipulator.ApplySpread(GetBulletSpread()); newVel *= ASW_MINE_VELOCITY; if ( !pMarine->IsInhabited() ) { newVel = vec3_origin; } CASW_Mine *pMine = CASW_Mine::ASW_Mine_Create( vecSrc, ang, newVel, rotSpeed, pMarine, this ); if ( pMine ) { float flDurationScale = 1.0f; int iExtraFires = 0; //CALL_ATTRIB_HOOK_FLOAT( flDurationScale, mod_duration ); //CALL_ATTRIB_HOOK_INT( iExtraFires, mod_firewall_length ); pMine->m_flDurationScale = flDurationScale; pMine->m_iExtraFires = iExtraFires; pMarine->OnWeaponFired( this, 1 ); } pMarine->GetMarineSpeech()->Chatter(CHATTER_MINE_DEPLOYED); #endif // decrement ammo m_iClip1 -= 1; #ifndef CLIENT_DLL DestroyIfEmpty( true ); #endif m_flSoonestPrimaryAttack = gpGlobals->curtime + ASW_FLARES_FASTEST_REFIRE_TIME; if (m_iClip1 > 0) // only force the fire wait time if we have ammo for another shot m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); else m_flNextPrimaryAttack = gpGlobals->curtime; }
void CASW_Weapon_Medkit::SelfHeal() { CASW_Marine *pMarine = GetMarine(); if (pMarine) // firing from a marine { if (pMarine->GetHealth() >= pMarine->GetMaxHealth()) // already on full health return; if (pMarine->GetHealth() <= 0) // aleady dead! return; if (pMarine->m_bSlowHeal) // already healing return; if (pMarine->GetFlags() & FL_FROZEN) // don't allow this if the marine is frozen return; // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); // sets the animation on the weapon model iteself SendWeaponAnim( GetPrimaryAttackActivity() ); // sets the animation on the marine holding this weapon //pMarine->SetAnimation( PLAYER_ATTACK1 ); #ifndef CLIENT_DLL bool bMedic = (pMarine->GetMarineProfile() && pMarine->GetMarineProfile()->CanUseFirstAid()); // put a slow heal onto the marine, play a particle effect if (!pMarine->m_bSlowHeal && pMarine->GetHealth() < pMarine->GetMaxHealth()) { pMarine->AddSlowHeal( GetHealAmount(), 1, pMarine, this ); // Fire event IGameEvent * event = gameeventmanager->CreateEvent( "player_heal" ); if ( event ) { CASW_Player *pPlayer = GetCommander(); event->SetInt( "userid", ( pPlayer ? pPlayer->GetUserID() : 0 ) ); event->SetInt( "entindex", pMarine->entindex() ); gameeventmanager->FireEvent( event ); } if ( ASWGameRules()->GetInfoHeal() ) { ASWGameRules()->GetInfoHeal()->OnMarineHealed( pMarine, pMarine, this ); } pMarine->OnWeaponFired( this, 1 ); } if (pMarine->IsInfested() && bMedic) { float fCure = GetInfestationCureAmount(); // cure infestation if (fCure < 100) pMarine->CureInfestation(pMarine, fCure); } #endif // decrement ammo m_iClip1 -= 1; #ifndef CLIENT_DLL DestroyIfEmpty( false ); #endif } }
void CASW_Weapon_Assault_Shotgun::SecondaryAttack() { // Only the player fires this way so we can cast CASW_Player *pPlayer = GetCommander(); if (!pPlayer) return; CASW_Marine *pMarine = GetMarine(); if (!pMarine) return; //Must have ammo bool bUsesSecondary = UsesSecondaryAmmo(); bool bUsesClips = UsesClipsForAmmo2(); int iAmmoCount = pMarine->GetAmmoCount(m_iSecondaryAmmoType); bool bInWater = ( pMarine->GetWaterLevel() == 3 ); if ( (bUsesSecondary && ( ( bUsesClips && m_iClip2 <= 0) || ( !bUsesClips && iAmmoCount<=0 ) ) ) || bInWater || m_bInReload ) { SendWeaponAnim( ACT_VM_DRYFIRE ); BaseClass::WeaponSound( EMPTY ); m_flNextSecondaryAttack = gpGlobals->curtime + 0.5f; return; } BaseClass::WeaponSound( SPECIAL1 ); #ifndef CLIENT_DLL pMarine->GetMarineSpeech()->Chatter(CHATTER_GRENADE); Vector vecSrc = pMarine->Weapon_ShootPosition(); Vector vecThrow; // check for turning on lag compensation if (pPlayer && pMarine->IsInhabited()) { CASW_Lag_Compensation::RequestLagCompensation( pPlayer, pPlayer->GetCurrentUserCommand() ); } vecThrow = UTIL_LaunchVector(vecSrc, pPlayer->GetCrosshairTracePos(), asw_vindicator_grenade_gravity.GetFloat()) * 8.0f * asw_vindicator_grenade_velocity.GetFloat(); QAngle angAiming = pPlayer->EyeAnglesWithCursorRoll(); float fGrenadeDamage = MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_GRENADES, ASW_MARINE_SUBSKILL_GRENADE_INCENDIARY_DMG); float fGrenadeRadius = MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_GRENADES, ASW_MARINE_SUBSKILL_GRENADE_RADIUS); if (asw_debug_marine_damage.GetBool()) { Msg("Grenade damage = %f radius = %f\n", fGrenadeDamage, fGrenadeRadius); } // check the grenade fits where we want to spawn it Ray_t ray; trace_t pm; ray.Init( pMarine->WorldSpaceCenter(), vecSrc, -Vector(4,4,4), Vector(4,4,4) ); UTIL_TraceRay( ray, MASK_SOLID, pMarine, COLLISION_GROUP_PROJECTILE, &pm ); if (pm.fraction < 1.0f) vecSrc = pm.endpos; CASW_Grenade_Vindicator::Vindicator_Grenade_Create( fGrenadeDamage, fGrenadeRadius, vecSrc, angAiming, vecThrow, AngularImpulse(0,0,0), pMarine, this ); pMarine->OnWeaponFired( this, 1, true ); #endif SendWeaponAnim( GetPrimaryAttackActivity() ); pMarine->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN_PRIMARY ); // Decrease ammo if ( bUsesClips ) { m_iClip2 -= 1; } else { pMarine->RemoveAmmo( 1, m_iSecondaryAmmoType ); } #ifndef CLIENT_DLL ASWFailAdvice()->OnMarineUsedSecondary(); CEffectData data; data.m_vOrigin = GetAbsOrigin(); //data.m_vNormal = dir; //data.m_flScale = (float)amount; CPASFilter filter( data.m_vOrigin ); filter.SetIgnorePredictionCull(true); DispatchParticleEffect( "muzzleflash_grenadelauncher_main", PATTACH_POINT_FOLLOW, this, "muzzle", false, -1, &filter ); #endif // Can shoot again immediately m_flNextPrimaryAttack = gpGlobals->curtime + 0.5f; // Can blow up after a short delay (so have time to release mouse button) m_flNextSecondaryAttack = gpGlobals->curtime + 1.0f; }
void CASW_Weapon::PrimaryAttack( void ) { // If my clip is empty (and I use clips) start reload if ( UsesClipsForAmmo1() && !m_iClip1 ) { Reload(); return; } CASW_Player *pPlayer = GetCommander(); CASW_Marine *pMarine = GetMarine(); if ( !pMarine ) return; m_bIsFiring = true; // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); if (m_iClip1 <= AmmoClickPoint()) { LowAmmoSound(); } // tell the marine to tell its weapon to draw the muzzle flash pMarine->DoMuzzleFlash(); // sets the animation on the weapon model itself SendWeaponAnim( GetPrimaryAttackActivity() ); // sets the animation on the marine holding this weapon //pMarine->SetAnimation( PLAYER_ATTACK1 ); #ifdef GAME_DLL // check for turning on lag compensation if (pPlayer && pMarine->IsInhabited()) { CASW_Lag_Compensation::RequestLagCompensation( pPlayer, pPlayer->GetCurrentUserCommand() ); } #endif FireBulletsInfo_t info; info.m_vecSrc = pMarine->Weapon_ShootPosition( ); if ( pPlayer && pMarine->IsInhabited() ) { info.m_vecDirShooting = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 } else { #ifdef CLIENT_DLL Msg("Error, clientside firing of a weapon that's being controlled by an AI marine\n"); #else info.m_vecDirShooting = pMarine->GetActualShootTrajectory( info.m_vecSrc ); #endif } // To make the firing framerate independent, we may have to fire more than one bullet here on low-framerate systems, // especially if the weapon we're firing has a really fast rate of fire. info.m_iShots = 0; float fireRate = GetFireRate(); while ( m_flNextPrimaryAttack <= gpGlobals->curtime ) { m_flNextPrimaryAttack = m_flNextPrimaryAttack + fireRate; info.m_iShots++; if ( !fireRate ) break; } // Make sure we don't fire more than the amount in the clip if ( UsesClipsForAmmo1() ) { info.m_iShots = MIN( info.m_iShots, m_iClip1 ); m_iClip1 -= info.m_iShots; #ifdef GAME_DLL CASW_Marine *pMarine = GetMarine(); if (pMarine && m_iClip1 <= 0 && pMarine->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { // check he doesn't have ammo in an ammo bay CASW_Weapon_Ammo_Bag* pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(0)); if (!pAmmoBag) pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(1)); if (!pAmmoBag || !pAmmoBag->CanGiveAmmoToWeapon(this)) pMarine->OnWeaponOutOfAmmo(true); } #endif } else { info.m_iShots = MIN( info.m_iShots, pMarine->GetAmmoCount( m_iPrimaryAmmoType ) ); pMarine->RemoveAmmo( info.m_iShots, m_iPrimaryAmmoType ); } info.m_flDistance = asw_weapon_max_shooting_distance.GetFloat(); info.m_iAmmoType = m_iPrimaryAmmoType; info.m_iTracerFreq = 1; // asw tracer test everytime info.m_flDamageForceScale = asw_weapon_force_scale.GetFloat(); info.m_vecSpread = pMarine->GetActiveWeapon()->GetBulletSpread(); info.m_flDamage = GetWeaponDamage(); #ifndef CLIENT_DLL if (asw_debug_marine_damage.GetBool()) Msg("Weapon dmg = %f\n", info.m_flDamage); info.m_flDamage *= pMarine->GetMarineResource()->OnFired_GetDamageScale(); if (asw_DebugAutoAim.GetBool()) { NDebugOverlay::Line(info.m_vecSrc, info.m_vecSrc + info.m_vecDirShooting * info.m_flDistance, 64, 0, 64, true, 1.0); } #endif pMarine->FireBullets( info ); // increment shooting stats #ifndef CLIENT_DLL if (pMarine && pMarine->GetMarineResource()) { pMarine->GetMarineResource()->UsedWeapon(this, info.m_iShots); pMarine->OnWeaponFired( this, info.m_iShots ); } #endif }
void CASW_Weapon_Ammo_Satchel::DeployAmmoDrop() { CASW_Player *pPlayer = GetCommander(); if ( !pPlayer ) return; if ( gpGlobals->curtime <= m_fLastAmmoDropTime + 1.0f ) { return; } m_fLastAmmoDropTime = gpGlobals->curtime; if( m_iClip1 <= 0 ) { //softcopy: TODO //temporary let it work; "asw_ent_create asw_weapon_ammo_satchel", to make ammo pack with pre-defined packs //Assert( false ); m_iClip1 = AMMO_SATCHEL_DEFAULT_DROP_COUNT; Assert( true ); return; } CASW_Marine *pMarine = GetMarine(); if ( !pMarine ) return; WeaponSound(SINGLE); #ifndef CLIENT_DLL Vector vecAiming = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 Vector vecSrc = pMarine->Weapon_ShootPosition( ) + (vecAiming * 8); if ( !pMarine->IsInhabited() && vecSrc.DistTo( pMarine->m_vecOffhandItemSpot ) < 150.0f ) { vecSrc.x = pMarine->m_vecOffhandItemSpot.x; vecSrc.y = pMarine->m_vecOffhandItemSpot.y; } Vector newVel = GetBulletSpread(); if ( pMarine->GetWaterLevel() == 3 ) { CBaseEntity::EmitSound( "ASW_Ammobag.Fail" ); return; } Vector vecSatchelMins = Vector(-20,-20,0); Vector vecSatchelMaxs = Vector(20,20,60); trace_t tr; UTIL_TraceHull( vecSrc + Vector( 0, 0, 50 ), vecSrc + Vector( 0, 0, -50 ), vecSatchelMins, vecSatchelMaxs, MASK_SOLID, pMarine, COLLISION_GROUP_NONE, &tr ); if ( tr.startsolid || tr.allsolid || ( tr.DidHit() && tr.fraction <= 0 ) || tr.fraction >= 1.0f ) // if there's something in the way, or no floor, don't deploy { // Try right under the player vecSrc = pMarine->GetAbsOrigin(); UTIL_TraceHull( vecSrc + Vector( 0, 0, 50 ), vecSrc + Vector( 0, 0, 50 ), vecSatchelMins, vecSatchelMaxs, MASK_SOLID, pMarine, COLLISION_GROUP_NONE, &tr ); if ( tr.startsolid || tr.allsolid || ( tr.DidHit() && tr.fraction <= 0 ) || tr.fraction >= 1.0f ) { // Ok, fail CBaseEntity::EmitSound( "ASW_Ammobag.Fail" ); return; } } vecSrc.z = tr.endpos.z; CASW_Ammo_Drop *pAmmoDrop = (CASW_Ammo_Drop *)CreateEntityByName( "asw_ammo_drop" ); UTIL_TraceLine( vecSrc, vecSrc + Vector(0, 0, -60), MASK_SOLID_BRUSHONLY, this, COLLISION_GROUP_NONE, &tr); UTIL_SetOrigin( pAmmoDrop, tr.endpos ); pAmmoDrop->SetDeployer( pMarine ); DispatchSpawn( pAmmoDrop ); pAmmoDrop->PlayDeploySound(); // Rotate it in the marine's facing direction QAngle angMarine = pMarine->GetAbsAngles(); angMarine.x = 0; angMarine.z = 0; pAmmoDrop->SetAbsAngles( angMarine ); CBaseEntity *pHelpHelpImBeingSupressed = (CBaseEntity*) te->GetSuppressHost(); te->SetSuppressHost( NULL ); DispatchParticleEffect( "ammo_satchel_take_med", pAmmoDrop->GetAbsOrigin() + Vector( 0, 0, 4 ), vec3_angle ); te->SetSuppressHost( pHelpHelpImBeingSupressed ); pMarine->OnWeaponFired( this, 1 ); IGameEvent * event = gameeventmanager->CreateEvent( "player_deploy_ammo" ); if ( event ) { CASW_Marine *pMarine = GetMarine(); CASW_Player *pPlayer = NULL; if ( pMarine ) { pPlayer = pMarine->GetCommander(); } event->SetInt( "userid", ( pPlayer ? pPlayer->GetUserID() : 0 ) ); gameeventmanager->FireEvent( event ); } #endif m_iClip1--; if ( m_iClip1 <= 0 ) { #ifndef CLIENT_DLL pMarine->Weapon_Detach(this); Kill(); #endif pMarine->SwitchToNextBestWeapon( NULL ); } }
void CASW_Weapon_T75::PrimaryAttack( void ) { // Only the player fires this way so we can cast CASW_Player *pPlayer = GetCommander(); if (!pPlayer) return; CASW_Marine *pMarine = GetMarine(); #ifndef CLIENT_DLL bool bThisActive = (pMarine && pMarine->GetActiveWeapon() == this); #endif // weapon is lost when all charges are gone if ( UsesClipsForAmmo1() && !m_iClip1 ) { //Reload(); #ifndef CLIENT_DLL if (pMarine) { pMarine->Weapon_Detach(this); if (bThisActive) pMarine->SwitchToNextBestWeapon(NULL); } Kill(); #endif return; } if ( !pMarine || pMarine->GetWaterLevel() == 3 ) // firing from a marine return; // sets the animation on the weapon model iteself SendWeaponAnim( GetPrimaryAttackActivity() ); #ifndef CLIENT_DLL Vector vecSrc = pMarine->Weapon_ShootPosition( ); // TODO: Fix for AI Vector vecAiming = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); if ( !pMarine->IsInhabited() && vecSrc.DistTo( pMarine->m_vecOffhandItemSpot ) < 150.0f ) { vecSrc.x = pMarine->m_vecOffhandItemSpot.x; vecSrc.y = pMarine->m_vecOffhandItemSpot.y; vecSrc.z += 50.0f; } QAngle ang = pPlayer->EyeAngles(); ang.x = 0; ang.z = 0; CShotManipulator Manipulator( vecAiming ); AngularImpulse rotSpeed(0,0,720); Vector newVel = Manipulator.ApplySpread(GetBulletSpread()); newVel *= ASW_MINE_VELOCITY; if ( !pMarine->IsInhabited() ) { newVel = vec3_origin; } CASW_T75 *pT75 = CASW_T75::ASW_T75_Create( vecSrc, ang, newVel, rotSpeed, pMarine, this ); if ( pT75 && !pMarine->IsInhabited() ) { pT75->ActivateUseIcon( pMarine, ASW_USE_RELEASE_QUICK ); } //pMarine->GetMarineSpeech()->Chatter(CHATTER_MINE_DEPLOYED); #endif // decrement ammo m_iClip1 -= 1; #ifndef CLIENT_DLL DestroyIfEmpty( true ); #endif m_flSoonestPrimaryAttack = gpGlobals->curtime + ASW_FLARES_FASTEST_REFIRE_TIME; if (m_iClip1 > 0) // only force the fire wait time if we have ammo for another shot m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); else m_flNextPrimaryAttack = gpGlobals->curtime; }
void CASW_Weapon_Pistol::PrimaryAttack( void ) { // If my clip is empty (and I use clips) start reload if ( UsesClipsForAmmo1() && !m_iClip1 ) { Reload(); return; } CASW_Player *pPlayer = GetCommander(); CASW_Marine *pMarine = GetMarine(); if (pMarine) // firing from a marine { // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); if (m_iClip1 <= AmmoClickPoint()) BaseClass::WeaponSound( EMPTY ); m_bIsFiring = true; // tell the marine to tell its weapon to draw the muzzle flash pMarine->DoMuzzleFlash(); // sets the animation on the weapon model iteself SendWeaponAnim( GetPrimaryAttackActivity() ); // sets the animation on the marine holding this weapon //pMarine->SetAnimation( PLAYER_ATTACK1 ); #ifdef GAME_DLL // check for turning on lag compensation if (pPlayer && pMarine->IsInhabited()) { CASW_Lag_Compensation::RequestLagCompensation( pPlayer, pPlayer->GetCurrentUserCommand() ); } #endif // if (asw_pistol_hitscan.GetBool()) if (true) { FireBulletsInfo_t info; info.m_vecSrc = pMarine->Weapon_ShootPosition( ); if ( pPlayer && pMarine->IsInhabited() ) { info.m_vecDirShooting = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 } else { #ifdef CLIENT_DLL Msg("Error, clientside firing of a weapon that's being controlled by an AI marine\n"); #else info.m_vecDirShooting = pMarine->GetActualShootTrajectory( info.m_vecSrc ); #endif } info.m_iShots = 1; // Make sure we don't fire more than the amount in the clip if ( UsesClipsForAmmo1() ) { info.m_iShots = MIN( info.m_iShots, m_iClip1 ); m_iClip1 -= info.m_iShots; #ifdef GAME_DLL CASW_Marine *pMarine = GetMarine(); if (pMarine && m_iClip1 <= 0 && pMarine->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { pMarine->OnWeaponOutOfAmmo(true); } #endif } else { info.m_iShots = MIN( info.m_iShots, pMarine->GetAmmoCount( m_iPrimaryAmmoType ) ); pMarine->RemoveAmmo( info.m_iShots, m_iPrimaryAmmoType ); } info.m_flDistance = asw_weapon_max_shooting_distance.GetFloat(); info.m_iAmmoType = m_iPrimaryAmmoType; info.m_iTracerFreq = 1; info.m_flDamageForceScale = asw_weapon_force_scale.GetFloat(); info.m_vecSpread = GetBulletSpread(); info.m_flDamage = GetWeaponDamage(); #ifndef CLIENT_DLL if (asw_debug_marine_damage.GetBool()) Msg("Weapon dmg = %f\n", info.m_flDamage); info.m_flDamage *= pMarine->OnFired_GetDamageScale(); #endif pMarine->FireBullets( info ); //FireBulletsInfo_t info( 1, vecSrc, vecAiming, GetBulletSpread(), MAX_TRACE_LENGTH, m_iPrimaryAmmoType ); //info.m_pAttacker = pMarine; // Fire the bullets, and force the first shot to be perfectly accuracy //pMarine->FireBullets( info ); } else // projectile pistol { #ifndef CLIENT_DLL Vector vecSrc = pMarine->Weapon_ShootPosition( ); Vector vecAiming = vec3_origin; if ( pPlayer && pMarine->IsInhabited() ) { vecAiming = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 } else { vecAiming = pMarine->GetActualShootTrajectory( vecSrc ); } CShotManipulator Manipulator( vecAiming ); AngularImpulse rotSpeed(0,0,720); Vector newVel = Manipulator.ApplySpread(GetBulletSpread()); if ( pMarine->GetWaterLevel() == 3 ) newVel *= PELLET_WATER_VELOCITY; else newVel *= PELLET_AIR_VELOCITY; newVel *= (1.0 + (0.1 * random->RandomFloat(-1,1))); CASW_Shotgun_Pellet::Shotgun_Pellet_Create( vecSrc, QAngle(0,0,0), newVel, rotSpeed, pMarine, GetWeaponDamage() ); // decrement ammo m_iClip1 -= 1; CASW_Marine *pMarine = GetMarine(); if (pMarine && m_iClip1 <= 0 && pMarine->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { pMarine->OnWeaponOutOfAmmo(true); } #endif } // increment shooting stats #ifndef CLIENT_DLL if (pMarine && pMarine->GetMarineResource()) { pMarine->GetMarineResource()->UsedWeapon(this, 1); pMarine->OnWeaponFired( this, 1 ); } #endif } if (m_iClip1 > 0) // only force the fire wait time if we have ammo for another shot m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); else m_flNextPrimaryAttack = gpGlobals->curtime; m_fSlowTime = gpGlobals->curtime + 0.03f; if ( m_currentPistol == ASW_WEAPON_PISTOL_LEFT ) { m_currentPistol = ASW_WEAPON_PISTOL_RIGHT; } else { m_currentPistol = ASW_WEAPON_PISTOL_LEFT; } }
void CASW_Weapon_Flechette::PrimaryAttack() { // If my clip is empty (and I use clips) start reload if ( UsesClipsForAmmo1() && !m_iClip1 ) { Reload(); return; } CASW_Player *pPlayer = GetCommander(); CASW_Marine *pMarine = GetMarine(); if (pMarine) // firing from a marine { m_bIsFiring = true; // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); if (m_iClip1 <= AmmoClickPoint()) { LowAmmoSound(); } // tell the marine to tell its weapon to draw the muzzle flash pMarine->DoMuzzleFlash(); // sets the animation on the weapon model iteself SendWeaponAnim( GetPrimaryAttackActivity() ); Vector vecDir; Vector vecSrc = pMarine->Weapon_ShootPosition( ); if ( pPlayer && pMarine->IsInhabited() ) { vecDir = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 } else { #ifdef CLIENT_DLL Msg("Error, clientside firing of a weapon that's being controlled by an AI marine\n"); #else vecDir = pMarine->GetActualShootTrajectory( vecSrc ); #endif } int iShots = 1; // Make sure we don't fire more than the amount in the clip if ( UsesClipsForAmmo1() ) { iShots = MIN( iShots, m_iClip1 ); m_iClip1 -= iShots; #ifdef GAME_DLL CASW_Marine *pMarine = GetMarine(); if (pMarine && m_iClip1 <= 0 && pMarine->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { pMarine->OnWeaponOutOfAmmo(true); } #endif } else { iShots = MIN( iShots, pMarine->GetAmmoCount( m_iPrimaryAmmoType ) ); pMarine->RemoveAmmo( iShots, m_iPrimaryAmmoType ); } /*#ifndef CLIENT_DLL if (asw_debug_marine_damage.GetBool()) Msg("Weapon dmg = %d\n", info.m_flDamage); info.m_flDamage *= pMarine->GetMarineResource()->OnFired_GetDamageScale(); #endif*/ // increment shooting stats #ifndef CLIENT_DLL float fGrenadeDamage = MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_GRENADES, ASW_MARINE_SUBSKILL_GRENADE_FLECHETTE_DMG); QAngle vecRocketAngle; VectorAngles(vecDir, vecRocketAngle); vecRocketAngle[YAW] += random->RandomFloat(-10, 10); CASW_Rocket::Create(fGrenadeDamage, vecSrc, vecRocketAngle, GetMarine()); if (pMarine && pMarine->GetMarineResource()) { pMarine->GetMarineResource()->UsedWeapon(this, iShots); pMarine->OnWeaponFired( this, iShots ); } if (ASWGameRules()) ASWGameRules()->m_fLastFireTime = gpGlobals->curtime; #endif m_flNextPrimaryAttack = m_flNextPrimaryAttack + GetFireRate(); } }
void CASW_Weapon_HealGrenade::PrimaryAttack( void ) { CASW_Player *pPlayer = GetCommander(); if (!pPlayer) return; CASW_Marine *pMarine = GetMarine(); #ifndef CLIENT_DLL bool bThisActive = (pMarine && pMarine->GetActiveWeapon() == this); #endif if ( !pMarine ) return; // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); // sets the animation on the weapon model iteself SendWeaponAnim( GetPrimaryAttackActivity() ); // sets the animation on the marine holding this weapon //pMarine->SetAnimation( PLAYER_ATTACK1 ); #ifndef CLIENT_DLL Vector vecSrc = pMarine->Weapon_ShootPosition( ); Vector vecAiming = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 if ( !pMarine->IsInhabited() && vecSrc.DistTo( pMarine->m_vecOffhandItemSpot ) < 150.0f ) { vecSrc.x = pMarine->m_vecOffhandItemSpot.x; vecSrc.y = pMarine->m_vecOffhandItemSpot.y; vecSrc.z += 50.0f; } QAngle ang = pPlayer->EyeAngles(); ang.x = 0; ang.z = 0; CShotManipulator Manipulator( vecAiming ); AngularImpulse rotSpeed(0,0,720); // create a pellet at some random spread direction Vector newVel = Manipulator.ApplySpread(GetBulletSpread()); if ( pMarine->GetWaterLevel() != 3 ) { CreateProjectile( vecSrc, ang, newVel, rotSpeed, pMarine ); pMarine->OnWeaponFired( this, 1 ); } pMarine->GetMarineSpeech()->Chatter(CHATTER_MEDKIT); #endif // decrement ammo m_iClip1 -= 1; #ifndef CLIENT_DLL // destroy if empty if ( UsesClipsForAmmo1() && !m_iClip1 ) { ASWFailAdvice()->OnMedSatchelEmpty(); pMarine->GetMarineSpeech()->Chatter( CHATTER_MEDS_NONE ); if ( pMarine ) { pMarine->Weapon_Detach(this); if ( bThisActive ) pMarine->SwitchToNextBestWeapon(NULL); } Kill(); return; } #endif m_flSoonestPrimaryAttack = gpGlobals->curtime + GetRefireTime(); if (m_iClip1 > 0) // only force the fire wait time if we have ammo for another shot m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); else m_flNextPrimaryAttack = gpGlobals->curtime; //m_flLastFireTime = gpGlobals->curtime; }
void CASW_Weapon_Medical_Satchel::GiveHealthTo( CASW_Marine *pTarget ) { if ( !pTarget || m_iClip1 <= 0 ) return; if ( pTarget->GetHealth() >= pTarget->GetMaxHealth() ) // already on full health return; if ( pTarget->GetHealth() <= 0 ) // target is dead! return; if ( pTarget->m_bSlowHeal ) // already healing return; CASW_Marine *pMarine = GetMarine(); if ( !pMarine ) return; if ( pMarine->GetFlags() & FL_FROZEN ) // don't allow this if the marine is frozen return; // check if we're close enough Vector diff = pMarine->GetAbsOrigin() - pTarget->GetAbsOrigin(); if ( diff.Length() > MAX_HEAL_DISTANCE_SERVER ) // add a bit of leeway to account for lag return; bool bMedic = pMarine && pMarine->GetMarineProfile() && pMarine->GetMarineProfile()->CanUseFirstAid(); //pMarine->DoAnimationEvent(PLAYERANIMEVENT_HEAL); WeaponSound(SINGLE); int iHealAmount = GetHealAmount(); pTarget->AddSlowHeal(iHealAmount, 1, pMarine, this ); // Fire event IGameEvent * event = gameeventmanager->CreateEvent( "player_heal" ); if ( event ) { CASW_Player *pPlayer = GetCommander(); event->SetInt( "userid", ( pPlayer ? pPlayer->GetUserID() : 0 ) ); event->SetInt( "entindex", pTarget->entindex() ); gameeventmanager->FireEvent( event ); } ASWFailAdvice()->OnMarineHealed(); if ( ASWGameRules()->GetInfoHeal() ) { ASWGameRules()->GetInfoHeal()->OnMarineHealed( GetMarine(), pTarget, this ); } m_iClip1 -= 1; if ( bMedic ) { if (pTarget->IsInfested()) { float fCurePercent = GetInfestationCureAmount(); // cure infestation if ( fCurePercent > 0 && fCurePercent < 100 ) { pTarget->CureInfestation(pMarine, fCurePercent); } } bool bSkipChatter = pTarget->IsInfested(); int iTotalMeds = GetTotalMeds(); if ( m_iClip1 <= 0 ) { if ( iTotalMeds <= 0 ) { ASWFailAdvice()->OnMedSatchelEmpty(); pMarine->GetMarineSpeech()->Chatter( CHATTER_MEDS_NONE ); bSkipChatter = true; } DestroyIfEmpty( false, true ); // out of medical charges, remove this item } else if ( iTotalMeds <= 1 ) { if ( pMarine->GetMarineSpeech()->Chatter( CHATTER_MEDS_LOW ) ) { bSkipChatter = true; } } if ( !bSkipChatter ) { // try and do a special chatter? bool bSkipChatter = false; if (pMarine->GetMarineSpeech()->AllowCalmConversations(CONV_HEALING_CRASH)) { if (!pTarget->m_bDoneWoundedRebuke && pTarget->GetMarineResource() && pTarget->GetMarineResource()->m_bTakenWoundDamage) { // marine has been wounded and this is our first heal after the fact - good chance of the medic saying something if (random->RandomFloat() < asw_marine_special_heal_chatter_chance.GetFloat() * 3) { if (CASW_MarineSpeech::StartConversation(CONV_SERIOUS_INJURY, pMarine, pTarget)) { bSkipChatter = true; pTarget->m_bDoneWoundedRebuke = true; } } } // if we didn't complaint about a serious injury, check for doing a different kind of conv float fRand = random->RandomFloat(); if (!bSkipChatter && fRand < asw_marine_special_heal_chatter_chance.GetFloat()) { if (pTarget->GetMarineProfile() && pTarget->GetMarineProfile()->m_VoiceType == ASW_VOICE_CRASH && pMarine->GetMarineProfile() && pMarine->GetMarineProfile()->m_VoiceType == ASW_VOICE_BASTILLE) // bastille healing crash { if (random->RandomFloat() < 0.5f) { if (CASW_MarineSpeech::StartConversation(CONV_HEALING_CRASH, pMarine, pTarget)) bSkipChatter = true; } else { if (CASW_MarineSpeech::StartConversation(CONV_MEDIC_COMPLAIN, pMarine, pTarget)) bSkipChatter = true; } } else { if (CASW_MarineSpeech::StartConversation(CONV_MEDIC_COMPLAIN, pMarine, pTarget)) bSkipChatter = true; } } } if (!bSkipChatter) pMarine->GetMarineSpeech()->Chatter(CHATTER_HEALING); } } }
/* 指定ファイルの指定位置にタグジャンプする。 @author MIK @date 2003.04.13 新規作成 @date 2003.04.21 genta bClose追加 @date 2004.05.29 Moca 0以下が指定されたときは、善処する @date 2007.02.17 genta 相対パスの基準ディレクトリ指示を追加 */ bool CEditView::TagJumpSub( const TCHAR* pszFileName, CMyPoint ptJumpTo, //!< ジャンプ位置(1開始) bool bClose, //!< [in] true: 元ウィンドウを閉じる / false: 元ウィンドウを閉じない bool bRelFromIni, bool* pbJumpToSelf //!< [out] オプションNULL可。自分にジャンプしたか ) { HWND hwndOwner; POINT poCaret; // 2004/06/21 novice タグジャンプ機能追加 TagJump tagJump; if( pbJumpToSelf ){ *pbJumpToSelf = false; } // 参照元ウィンドウ保存 tagJump.hwndReferer = CEditWnd::getInstance()->GetHwnd(); // Feb. 17, 2007 genta 実行ファイルからの相対指定の場合は // 予め絶対パスに変換する.(キーワードヘルプジャンプで用いる) // 2007.05.19 ryoji 相対パスは設定ファイルからのパスを優先 TCHAR szJumpToFile[1024]; if( bRelFromIni && _IS_REL_PATH( pszFileName ) ){ GetInidirOrExedir( szJumpToFile, pszFileName ); } else { _tcscpy( szJumpToFile, pszFileName ); } /* ロングファイル名を取得する */ TCHAR szWork[1024]; if( FALSE != ::GetLongFileName( szJumpToFile, szWork ) ) { _tcscpy( szJumpToFile, szWork ); } // 2004/06/21 novice タグジャンプ機能追加 // 2004/07/05 みちばな // 同一ファイルだとSendMesssageで GetCaret().GetCaretLayoutPos().GetX2(),GetCaret().GetCaretLayoutPos().GetY2()が更新されてしまい、 // ジャンプ先の場所がジャンプ元として保存されてしまっているので、 // その前で保存するように変更。 /* カーソル位置変換 */ GetDocument()->m_cLayoutMgr.LayoutToLogic( GetCaret().GetCaretLayoutPos(), &tagJump.point ); // タグジャンプ情報の保存 CTagJumpManager().PushTagJump(&tagJump); /* 指定ファイルが開かれているか調べる */ /* 開かれている場合は開いているウィンドウのハンドルも返す */ /* ファイルを開いているか */ if( CShareData::getInstance()->IsPathOpened( szJumpToFile, &hwndOwner ) ) { // 2004.05.13 Moca マイナス値は無効 if( 0 < ptJumpTo.y ){ /* カーソルを移動させる */ poCaret.y = ptJumpTo.y - 1; if( 0 < ptJumpTo.x ){ poCaret.x = ptJumpTo.x - 1; }else{ poCaret.x = 0; } GetDllShareData().m_sWorkBuffer.m_LogicPoint.Set(CLogicInt(poCaret.x), CLogicInt(poCaret.y)); ::SendMessageAny( hwndOwner, MYWM_SETCARETPOS, 0, 0 ); } /* アクティブにする */ ActivateFrameWindow( hwndOwner ); if( tagJump.hwndReferer == hwndOwner ){ if( pbJumpToSelf ){ *pbJumpToSelf = true; } } } else{ /* 新しく開く */ EditInfo inf; bool bSuccess; _tcscpy( inf.m_szPath, szJumpToFile ); inf.m_ptCursor.Set(CLogicInt(ptJumpTo.x - 1), CLogicInt(ptJumpTo.y - 1)); inf.m_nViewLeftCol = CLayoutInt(-1); inf.m_nViewTopLine = CLayoutInt(-1); inf.m_nCharCode = CODE_AUTODETECT; bSuccess = CControlTray::OpenNewEditor2( G_AppInstance(), this->GetHwnd(), &inf, false, /* ビューモードか */ true // 同期モードで開く ); if( ! bSuccess ) // ファイルが開けなかった return false; // Apr. 23, 2001 genta // hwndOwnerに値が入らなくなってしまったために // Tag Jump Backが動作しなくなっていたのを修正 if( !CShareData::getInstance()->IsPathOpened( szJumpToFile, &hwndOwner ) ) return false; } // 2006.12.30 ryoji 閉じる処理は最後に(処理位置移動) // Apr. 2003 genta 閉じるかどうかは引数による // grep結果からEnterでジャンプするところにCtrl判定移動 if( bClose ) { GetCommander().Command_WINCLOSE(); // 挑戦するだけ。 } return true; }
bool CASW_Weapon_Blink::SetBlinkDestination() { CASW_Player *pPlayer = GetCommander(); if ( !pPlayer ) return false; CASW_Marine *pMarine = GetMarine(); if ( !pMarine ) return false; Vector vecStart = pPlayer->GetCrosshairTracePos() + Vector( 0, 0, 30 ); Vector vecEnd = pPlayer->GetCrosshairTracePos() - Vector( 0, 0, 30 ); trace_t tr; UTIL_TraceHull( vecStart, vecEnd, pMarine->WorldAlignMins(), pMarine->WorldAlignMaxs(), MASK_PLAYERSOLID_BRUSHONLY, pMarine, COLLISION_GROUP_PLAYER_MOVEMENT, &tr ); if ( tr.startsolid || tr.allsolid ) { m_vecInvalidDestination = vecStart; return false; } if ( pMarine->GetAbsOrigin().DistTo( tr.endpos ) > asw_blink_range.GetFloat() ) { m_vecInvalidDestination = tr.endpos; return false; } Vector vecDest = tr.endpos; // now see if we can build an AI path from the marine to this spot bool bValidRoute = false; if ( !pMarine->GetPathfinder() ) { m_vecInvalidDestination = vecDest; return false; } AI_Waypoint_t *pRoute = pMarine->GetPathfinder()->BuildRoute( pMarine->GetAbsOrigin(), vecDest, NULL, 30, NAV_GROUND, bits_BUILD_GROUND | bits_BUILD_IGNORE_NPCS ); if ( pRoute && !UTIL_ASW_DoorBlockingRoute( pRoute, true ) ) { if ( !UTIL_ASW_BrushBlockingRoute( pRoute, MASK_PLAYERSOLID_BRUSHONLY, COLLISION_GROUP_PLAYER_MOVEMENT ) ) { // if end node of the route is too Z different, then abort, to stop people jumping on top of walls AI_Waypoint_t *pLast = pRoute->GetLast(); if ( pLast ) { AI_Waypoint_t *pNode = pLast->GetPrev(); if ( !pNode || fabs( pNode->GetPos().z - pLast->GetPos().z ) < 80.0f ) { bValidRoute = true; } } } } if ( !bValidRoute ) { // find the closest node to the dest and try to path there instead CAI_Network *pNetwork = pMarine->GetNavigator() ? pMarine->GetNavigator()->GetNetwork() : NULL; if ( pNetwork ) { int nNode = pNetwork->NearestNodeToPoint( vecDest, false ); if ( nNode != NO_NODE ) { CAI_Node *pNode = pNetwork->GetNode( nNode ); if ( pNode && pNode->GetType() == NODE_GROUND ) { vecDest = pNode->GetOrigin(); if ( pRoute ) { ASWPathUtils()->DeleteRoute( pRoute ); pRoute = NULL; } pRoute = pMarine->GetPathfinder()->BuildRoute( pMarine->GetAbsOrigin(), vecDest, NULL, 30, NAV_GROUND, bits_BUILD_GROUND | bits_BUILD_IGNORE_NPCS ); if ( pRoute && !UTIL_ASW_DoorBlockingRoute( pRoute, true ) ) { if ( !UTIL_ASW_BrushBlockingRoute( pRoute, MASK_PLAYERSOLID_BRUSHONLY, COLLISION_GROUP_PLAYER_MOVEMENT ) ) { bValidRoute = true; } } if ( !bValidRoute ) { m_vecInvalidDestination = vecDest; } } } } } if ( !bValidRoute ) { if ( pRoute ) { ASWPathUtils()->DeleteRoute( pRoute ); pRoute = NULL; } return false; } if ( asw_blink_debug.GetBool() ) { ASWPathUtils()->DebugDrawRoute( pMarine->GetAbsOrigin(), pRoute ); } m_vecAbilityDestination = vecDest; if ( pRoute ) { ASWPathUtils()->DeleteRoute( pRoute ); pRoute = NULL; } return true; }
void CASW_Weapon::ItemBusyFrame( void ) { CASW_Marine* pMarine = GetMarine(); if ( !pMarine ) return; bool bAttack1, bAttack2, bReload, bOldReload, bOldAttack1; GetButtons(bAttack1, bAttack2, bReload, bOldReload, bOldAttack1 ); // check for clearing our weapon switching bool if (m_bSwitchingWeapons && gpGlobals->curtime > m_flNextPrimaryAttack) { m_bSwitchingWeapons = false; } // check for clearing our firing bool from reloading if (m_bInReload && gpGlobals->curtime > m_fReloadClearFiringTime) { ClearIsFiring(); } if ( (bReload && !bOldReload) && UsesClipsForAmmo1() && asw_fast_reload_enabled.GetBool() ) { if ( m_bInReload ) { // check for a fast reload //Msg("%f Check for fast reload while busy\n", gpGlobals->curtime); if (gpGlobals->curtime >= m_fFastReloadStart && gpGlobals->curtime <= m_fFastReloadEnd) { // todo: reduce next attack time m_fFastReloadEnd = 0; m_fFastReloadStart = 0; CBaseCombatCharacter *pOwner = GetOwner(); if ( pOwner ) { float flSucceedDelay = gpGlobals->curtime + 0.5f; pOwner->SetNextAttack( flSucceedDelay ); m_flNextPrimaryAttack = m_flNextSecondaryAttack = flSucceedDelay; } // TODO: hook up anim //pMarine->DoAnimationEvent( PLAYERANIMEVENT_RELOAD_SUCCEED ); DispatchParticleEffect( "fast_reload", PATTACH_POINT_FOLLOW, this, "muzzle" ); pMarine->m_flPreventLaserSightTime = gpGlobals->curtime + 2.5f; #ifdef GAME_DLL pMarine->m_nFastReloadsInARow++; IGameEvent * event = gameeventmanager->CreateEvent( "fast_reload" ); if ( event ) { event->SetInt( "marine", pMarine->entindex() ); event->SetInt( "reloads", pMarine->m_nFastReloadsInARow ); gameeventmanager->FireEvent( event ); } if ( pMarine->m_nFastReloadsInARow >= 4 && pMarine->IsInhabited() ) { if ( pMarine->GetMarineResource() ) { pMarine->GetMarineResource()->m_bDidFastReloadsInARow = true; } if ( pMarine->GetCommander() ) { pMarine->GetCommander()->AwardAchievement( ACHIEVEMENT_ASW_FAST_RELOADS_IN_A_ROW ); } } #endif CSoundParameters params; if ( !GetParametersForSound( "FastReload.Success", params, NULL ) ) return; EmitSound_t playparams(params); playparams.m_nPitch = params.pitch; CASW_Player *pPlayer = GetCommander(); if ( pPlayer ) { CSingleUserRecipientFilter filter( pMarine->GetCommander() ); if ( IsPredicted() && CBaseEntity::GetPredictionPlayer() ) { filter.UsePredictionRules(); } EmitSound(filter, entindex(), playparams); } //Msg("%f RELOAD SUCCESS! - bAttack1 = %d, bOldAttack1 = %d\n", gpGlobals->curtime, bAttack1, bOldAttack1 ); //Msg( "S: %f - %f - %f RELOAD SUCCESS! -- Progress = %f\n", gpGlobals->curtime, fFastStart, fFastEnd, flProgress ); #ifdef GAME_DLL pMarine->GetMarineSpeech()->PersonalChatter(CHATTER_SELECTION); #endif m_bFastReloadSuccess = true; m_bFastReloadFailure = false; } else if (m_fFastReloadStart != 0) { CSoundParameters params; if ( !GetParametersForSound( "FastReload.Miss", params, NULL ) ) return; EmitSound_t playparams(params); playparams.m_nPitch = params.pitch; CASW_Player *pPlayer = GetCommander(); if ( pPlayer ) { CSingleUserRecipientFilter filter( pMarine->GetCommander() ); if ( IsPredicted() && CBaseEntity::GetPredictionPlayer() ) { filter.UsePredictionRules(); } EmitSound(filter, entindex(), playparams); } //Msg("%f RELOAD MISSED! - bAttack1 = %d, bOldAttack1 = %d\n", gpGlobals->curtime, bAttack1, bOldAttack1 ); //Msg( "S: %f - %f - %f RELOAD MISSED! -- Progress = %f\n", gpGlobals->curtime, fFastStart, fFastEnd, flProgress ); m_fFastReloadEnd = 0; m_fFastReloadStart = 0; CBaseCombatCharacter *pOwner = GetOwner(); if ( pOwner ) { float flMissDelay = MAX( gpGlobals->curtime + 2.0f, m_flNextPrimaryAttack + 1.0f ); pOwner->SetNextAttack( flMissDelay ); m_flNextPrimaryAttack = m_flNextSecondaryAttack = flMissDelay; m_flReloadFailTime = m_flNextPrimaryAttack - gpGlobals->curtime; } // TODO: hook up anim //pMarine->DoAnimationEvent( PLAYERANIMEVENT_RELOAD_FAIL ); #ifdef GAME_DLL pMarine->m_nFastReloadsInARow = 0; #endif DispatchParticleEffect( "reload_fail", PATTACH_POINT_FOLLOW, this, "muzzle" ); #ifdef GAME_DLL pMarine->GetMarineSpeech()->PersonalChatter(CHATTER_PAIN_SMALL); #endif m_bFastReloadSuccess = false; m_bFastReloadFailure = true; } } } #ifdef CLIENT_DLL if ( m_bInReload ) { float fStart = m_fReloadStart; float fNext = MAX( m_flNextPrimaryAttack, GetOwner() ? GetOwner()->GetNextAttack() : 0 ); float fTotalTime = fNext - fStart; if (fTotalTime <= 0) fTotalTime = 0.1f; m_fReloadProgress = (gpGlobals->curtime - fStart) / fTotalTime; } else { m_fReloadProgress = 0; } //Msg( "S: %f Reload Progress = %f\n", gpGlobals->curtime, m_fReloadProgress ); #endif //CLIENT_DLL }
void CASW_Weapon_Shotgun::PrimaryAttack( void ) { // If my clip is empty (and I use clips) start reload if ( UsesClipsForAmmo1() && !m_iClip1 ) { Reload(); return; } CASW_Player *pPlayer = GetCommander(); CASW_Marine *pMarine = GetMarine(); if (pMarine) // firing from a marine { // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); if (m_iClip1 <= AmmoClickPoint()) { LowAmmoSound(); } m_bIsFiring = true; // tell the marine to tell its weapon to draw the muzzle flash pMarine->DoMuzzleFlash(); // sets the animation on the weapon model iteself SendWeaponAnim( GetPrimaryAttackActivity() ); #ifdef GAME_DLL // check for turning on lag compensation if (pPlayer && pMarine->IsInhabited()) { CASW_Lag_Compensation::RequestLagCompensation( pPlayer, pPlayer->GetCurrentUserCommand() ); } #endif Vector vecSrc = pMarine->Weapon_ShootPosition( ); // hull trace out to this shoot position, so we can be sure we're not firing from over an alien's head trace_t tr; CTraceFilterSimple tracefilter(pMarine, COLLISION_GROUP_NONE); Vector vecMarineMiddle(pMarine->GetAbsOrigin()); vecMarineMiddle.z = vecSrc.z; AI_TraceHull( vecMarineMiddle, vecSrc, Vector( -10, -10, -20 ), Vector( 10, 10, 10 ), MASK_SHOT, &tracefilter, &tr ); vecSrc = tr.endpos; Vector vecAiming = vec3_origin; if ( pPlayer && pMarine->IsInhabited() ) { vecAiming = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 } else { #ifndef CLIENT_DLL vecAiming = pMarine->GetActualShootTrajectory( vecSrc ); #endif } if (true) // hitscan pellets { #ifndef CLIENT_DLL if (asw_DebugAutoAim.GetBool()) { NDebugOverlay::Line(vecSrc, vecSrc + vecAiming * asw_weapon_max_shooting_distance.GetFloat(), 64, 0, 64, false, 120.0); } #endif int iPellets = GetNumPellets(); for (int i=0;i<iPellets;i++) { FireBulletsInfo_t info( 1, vecSrc, vecAiming, GetAngularBulletSpread(), asw_weapon_max_shooting_distance.GetFloat(), m_iPrimaryAmmoType ); info.m_pAttacker = pMarine; info.m_iTracerFreq = 1; info.m_nFlags = FIRE_BULLETS_NO_PIERCING_SPARK | FIRE_BULLETS_HULL | FIRE_BULLETS_ANGULAR_SPREAD; info.m_flDamage = GetWeaponDamage(); info.m_flDamageForceScale = asw_weapon_force_scale.GetFloat(); #ifndef CLIENT_DLL if (asw_debug_marine_damage.GetBool()) Msg("Weapon dmg = %f\n", info.m_flDamage); info.m_flDamage *= pMarine->GetMarineResource()->OnFired_GetDamageScale(); #endif // shotgun bullets have a base 50% chance of piercing //float fPiercingChance = 0.5f; //if (pMarine->GetMarineResource() && pMarine->GetMarineProfile() && pMarine->GetMarineProfile()->GetMarineClass() == MARINE_CLASS_SPECIAL_WEAPONS) //fPiercingChance += MarineSkills()->GetSkillBasedValueByMarine(pMarine, ASW_MARINE_SKILL_PIERCING); //pMarine->FirePenetratingBullets(info, 5, fPiercingChance); //pMarine->FirePenetratingBullets(info, 5, 1.0f, i, false ); pMarine->FirePenetratingBullets(info, 0, 1.0f, i, false ); } } else // projectile pellets { #ifndef CLIENT_DLL CShotManipulator Manipulator( vecAiming ); int iPellets = GetNumPellets(); for (int i=0;i<iPellets;i++) { // create a pellet at some random spread direction //CASW_Shotgun_Pellet *pPellet = Vector newVel = Manipulator.ApplySpread(GetBulletSpread()); //Vector newVel = ApplySpread( vecAiming, GetBulletSpread() ); if ( pMarine->GetWaterLevel() == 3 ) newVel *= PELLET_WATER_VELOCITY; else newVel *= PELLET_AIR_VELOCITY; newVel *= (1.0 + (0.1 * random->RandomFloat(-1,1))); CreatePellet(vecSrc, newVel, pMarine); //CASW_Shotgun_Pellet_Predicted::CreatePellet(vecSrc, newVel, pPlayer, pMarine); } #endif } // increment shooting stats #ifndef CLIENT_DLL if (pMarine && pMarine->GetMarineResource()) { pMarine->GetMarineResource()->UsedWeapon(this, 1); pMarine->OnWeaponFired( this, GetNumPellets() ); } #endif // decrement ammo m_iClip1 -= 1; #ifdef GAME_DLL CASW_Marine *pMarine = GetMarine(); if (pMarine && m_iClip1 <= 0 && pMarine->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { // check he doesn't have ammo in an ammo bay CASW_Weapon_Ammo_Bag* pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(0)); if (!pAmmoBag) pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(1)); if (!pAmmoBag || !pAmmoBag->CanGiveAmmoToWeapon(this)) pMarine->OnWeaponOutOfAmmo(true); } #endif } if (m_iClip1 > 0) // only force the fire wait time if we have ammo for another shot m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); else m_flNextPrimaryAttack = gpGlobals->curtime; m_fSlowTime = gpGlobals->curtime + 0.1f; }
void CASW_Weapon::WeaponSound( WeaponSound_t sound_type, float soundtime /* = 0.0f */ ) { //asw hack - don't allow normal reloading sounds to be triggered, since we fire them from the marine's reloading animation anim event if (sound_type == RELOAD) return; if (sound_type == SPECIAL2) sound_type = RELOAD; // If we have some sounds from the weapon classname.txt file, play a random one of them int iPitch = 100; const char *shootsound = GetASWShootSound( sound_type, iPitch ); //Msg("%s:%f WeaponSound %d %s\n", IsServer() ? "S" : "C", gpGlobals->curtime, sound_type, shootsound); if ( !shootsound || !shootsound[0] ) return; CSoundParameters params; if ( !GetParametersForSound( shootsound, params, NULL ) ) return; EmitSound_t playparams(params); if (soundtime != 0) playparams.m_flSoundTime = soundtime; playparams.m_nPitch = params.pitch; CASW_Player *pPlayer = GetCommander(); if ( params.play_to_owner_only ) { // Am I only to play to my owner? if ( GetOwner() && pPlayer && pPlayer->GetMarine() == GetOwner() ) { CSingleUserRecipientFilter filter( pPlayer ); if ( IsPredicted() && CBaseEntity::GetPredictionPlayer() ) { filter.UsePredictionRules(); } EmitSound(filter, GetOwner()->entindex(), playparams); //EmitSound( filter, GetOwner()->entindex(), shootsound, NULL, soundtime ); } } else { // Play weapon sound from the owner if ( GetOwner() ) { CPASAttenuationFilter filter( GetOwner(), params.soundlevel ); if ( IsPredicted() && CBaseEntity::GetPredictionPlayer() ) { filter.UsePredictionRules(); } EmitSound(filter, GetOwner()->entindex(), playparams); #if !defined( CLIENT_DLL ) if( sound_type == EMPTY ) { CSoundEnt::InsertSound( SOUND_COMBAT, GetOwner()->GetAbsOrigin(), SOUNDENT_VOLUME_EMPTY, 0.2, GetOwner() ); } #endif } // If no owner play from the weapon (this is used for thrown items) else { CPASAttenuationFilter filter( this, params.soundlevel ); if ( IsPredicted() && CBaseEntity::GetPredictionPlayer() ) { filter.UsePredictionRules(); } EmitSound( filter, entindex(), shootsound, NULL, soundtime ); } } }
void CASW_Weapon_Sniper_Rifle::PrimaryAttack( void ) { // If my clip is empty (and I use clips) start reload if ( UsesClipsForAmmo1() && !m_iClip1 ) { Reload(); return; } CASW_Player *pPlayer = GetCommander(); CASW_Marine *pMarine = GetMarine(); if ( !pMarine ) return; // MUST call sound before removing a round from the clip of a CMachineGun WeaponSound(SINGLE); if (m_iClip1 <= AmmoClickPoint()) BaseClass::WeaponSound( EMPTY ); m_bIsFiring = true; // tell the marine to tell its weapon to draw the muzzle flash pMarine->DoMuzzleFlash(); // sets the animation on the weapon model iteself //SendWeaponAnim( GetPrimaryAttackActivity() ); // sets the animation on the marine holding this weapon //pMarine->SetAnimation( PLAYER_ATTACK1 ); #ifdef GAME_DLL // check for turning on lag compensation if (pPlayer && pMarine->IsInhabited()) { CASW_Lag_Compensation::RequestLagCompensation( pPlayer, pPlayer->GetCurrentUserCommand() ); } #endif FireBulletsInfo_t info; info.m_vecSrc = pMarine->Weapon_ShootPosition( ); if ( pPlayer && pMarine->IsInhabited() ) { info.m_vecDirShooting = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 } else { #ifdef CLIENT_DLL Msg("Error, clientside firing of a weapon that's being controlled by an AI marine\n"); #else info.m_vecDirShooting = pMarine->GetActualShootTrajectory( info.m_vecSrc ); #endif } info.m_iShots = 1; // Make sure we don't fire more than the amount in the clip if ( UsesClipsForAmmo1() ) { info.m_iShots = MIN( info.m_iShots, m_iClip1 ); m_iClip1 -= info.m_iShots; #ifdef GAME_DLL CASW_Marine *pMarine = GetMarine(); if (pMarine && m_iClip1 <= 0 && pMarine->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) { // check he doesn't have ammo in an ammo bay CASW_Weapon_Ammo_Bag* pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(0)); if (!pAmmoBag) pAmmoBag = dynamic_cast<CASW_Weapon_Ammo_Bag*>(pMarine->GetASWWeapon(1)); if (!pAmmoBag || !pAmmoBag->CanGiveAmmoToWeapon(this)) pMarine->OnWeaponOutOfAmmo(true); } #endif } else { info.m_iShots = MIN( info.m_iShots, pMarine->GetAmmoCount( m_iPrimaryAmmoType ) ); pMarine->RemoveAmmo( info.m_iShots, m_iPrimaryAmmoType ); } info.m_flDistance = asw_weapon_max_shooting_distance.GetFloat(); info.m_iAmmoType = m_iPrimaryAmmoType; info.m_iTracerFreq = 1; info.m_flDamageForceScale = asw_weapon_force_scale.GetFloat(); info.m_vecSpread = GetBulletSpread(); info.m_flDamage = GetWeaponDamage(); #ifndef CLIENT_DLL if (asw_debug_marine_damage.GetBool()) Msg("Weapon dmg = %f\n", info.m_flDamage); info.m_flDamage *= pMarine->GetMarineResource()->OnFired_GetDamageScale(); #endif int iPenetration = 1; if ( pMarine->GetDamageBuffEndTime() > gpGlobals->curtime ) // sniper rifle penetrates more targets when marine is in a damage amp { iPenetration = 3; } pMarine->FirePenetratingBullets( info, iPenetration, 3.5f, 0, true, NULL, false ); // increment shooting stats #ifndef CLIENT_DLL if (pMarine && pMarine->GetMarineResource()) { pMarine->GetMarineResource()->UsedWeapon(this, 1); pMarine->OnWeaponFired( this, 1 ); } #endif if (m_iClip1 > 0) // only force the fire wait time if we have ammo for another shot m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); else m_flNextPrimaryAttack = gpGlobals->curtime; m_fSlowTime = gpGlobals->curtime + 0.03f; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CASW_Weapon_Chainsaw::PrimaryAttack( void ) { // If my clip is empty (and I use clips) start reload //if ( UsesClipsForAmmo1() && !m_iClip1 ) //{ //Reload(); //return; //} CASW_Player *pPlayer = GetCommander(); CASW_Marine *pMarine = GetMarine(); if ( !pMarine || !pMarine->IsAlive()) { EndAttack(); return; } // don't fire underwater if ( pMarine->GetWaterLevel() == 3 ) { if ( m_fireState != FIRE_OFF || m_hBeam ) { EndAttack(); } else { WeaponSound( EMPTY ); } m_flNextPrimaryAttack = gpGlobals->curtime + GetWeaponInfo()->m_flFireRate; m_flNextSecondaryAttack = gpGlobals->curtime + GetWeaponInfo()->m_flFireRate; return; } #ifdef GAME_DLL // check for turning on lag compensation if (pPlayer && pMarine->IsInhabited()) { CASW_Lag_Compensation::RequestLagCompensation( pPlayer, pPlayer->GetCurrentUserCommand() ); } #endif Vector vecSrc = pMarine->Weapon_ShootPosition( ); Vector vecAiming = vec3_origin; if ( pPlayer && pMarine->IsInhabited() ) { vecAiming = pPlayer->GetAutoaimVectorForMarine(pMarine, GetAutoAimAmount(), GetVerticalAdjustOnlyAutoAimAmount()); // 45 degrees = 0.707106781187 } else { #ifndef CLIENT_DLL vecAiming = pMarine->GetActualShootTrajectory( vecSrc ); #endif } // make vecaiming go down at 45 degrees vecAiming.z = 0; VectorNormalize(vecAiming); vecAiming.z = -1.0f; VectorNormalize(vecAiming); switch( m_fireState ) { case FIRE_OFF: { //if ( !HasAmmo() ) //{ //m_flNextPrimaryAttack = gpGlobals->curtime + 0.25; //m_flNextSecondaryAttack = gpGlobals->curtime + 0.25; //WeaponSound( EMPTY ); //return; //} m_flAmmoUseTime = gpGlobals->curtime;// start using ammo ASAP. SendWeaponAnim( ACT_VM_PRIMARYATTACK ); m_flShakeTime = 0; m_flStartFireTime = gpGlobals->curtime; SetWeaponIdleTime( gpGlobals->curtime + 0.1 ); m_flDmgTime = gpGlobals->curtime + ASW_CHAINSAW_PULSE_INTERVAL; SetFiringState(FIRE_STARTUP); } break; case FIRE_STARTUP: { Fire( vecSrc, vecAiming ); #ifndef CLIENT_DLL pMarine->OnWeaponFired( this, 1 ); #endif if ( gpGlobals->curtime >= ( m_flStartFireTime + ASW_CHAINSAW_CHARGE_UP_TIME ) ) { //EmitSound( "ASW_Chainsaw.AttackLoop" ); SetFiringState(FIRE_CHARGE); } if ( !HasAmmo() ) { EndAttack(); m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; m_flNextSecondaryAttack = gpGlobals->curtime + 1.0; } } break; case FIRE_CHARGE: { Fire( vecSrc, vecAiming ); #ifndef CLIENT_DLL pMarine->OnWeaponFired( this, 1 ); #endif if ( !HasAmmo() ) { EndAttack(); m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; m_flNextSecondaryAttack = gpGlobals->curtime + 1.0; } } break; } }