void CLTagSingle::SetReloadFragmentTags(CTagState& fragTags, int ammoCount) { if(ammoCount <= 1) { int inventoryCount = m_pWeapon->GetInventoryAmmoCount(GetAmmoType()); TagID ammoCountID = TAG_ID_INVALID; switch(inventoryCount) { case 1: ammoCountID = fragTags.GetDef().Find(CItem::sFragmentTagCRCs.inventory_last1); break; case 2: ammoCountID = fragTags.GetDef().Find(CItem::sFragmentTagCRCs.inventory_last2); break; } if(ammoCountID != TAG_ID_INVALID) { fragTags.Set(ammoCountID, true); } } Parent::SetReloadFragmentTags(fragTags, ammoCount); }
void AShooterWeapon::UseAmmo() { if (!HasInfiniteAmmo()) { CurrentAmmoInClip--; } if (!HasInfiniteAmmo() && !HasInfiniteClip()) { CurrentAmmo--; } AShooterAIController* BotAI = MyPawn ? Cast<AShooterAIController>(MyPawn->GetController()) : NULL; AShooterPlayerController* PlayerController = MyPawn ? Cast<AShooterPlayerController>(MyPawn->GetController()) : NULL; if (BotAI) { BotAI->CheckAmmo(this); } else if(PlayerController) { AShooterPlayerState* PlayerState = Cast<AShooterPlayerState>(PlayerController->PlayerState); switch (GetAmmoType()) { case EAmmoType::ERocket: PlayerState->AddRocketsFired(1); break; case EAmmoType::EBullet: default: PlayerState->AddBulletsFired(1); break; } } }
//------------------------------------------------------------------------ void CPlant::Plant(const Vec3 &pos, const Vec3 &dir, const Vec3 &vel, bool net, int ph) { IEntityClass* ammo = m_plantparams.ammo_type_class; int ammoCount = m_pWeapon->GetAmmoCount(ammo); if (m_plantparams.clip_size==0) ammoCount = m_pWeapon->GetInventoryAmmoCount(ammo); CProjectile *pAmmo = m_pWeapon->SpawnAmmo(ammo, net); CActor *pActor=m_pWeapon->GetOwnerActor(); if (pAmmo) { pAmmo->SetParams(m_pWeapon->GetOwnerId(), m_pWeapon->GetHostId(), m_pWeapon->GetEntityId(), m_plantparams.damage, 0); pAmmo->SetDestination(m_pWeapon->GetDestination()); pAmmo->Launch(pos, dir, vel); m_projectileId = pAmmo->GetEntity()->GetId(); if (m_projectileId && !m_plantparams.simple && m_pWeapon->IsServer()) { if (pActor) { SetProjectileId(m_projectileId); m_pWeapon->GetGameObject()->InvokeRMIWithDependentObject(CC4::ClSetProjectileId(), CC4::SetProjectileIdParams(m_projectileId, m_pWeapon->GetCurrentFireMode()), eRMI_ToClientChannel, m_projectileId, pActor->GetChannelId()); } } } m_pWeapon->OnShoot(m_pWeapon->GetOwnerId(), pAmmo?pAmmo->GetEntity()->GetId():0, GetAmmoType(), pos, dir, vel); ammoCount--; if (m_plantparams.clip_size != -1) { if (m_plantparams.clip_size!=0) m_pWeapon->SetAmmoCount(ammo, ammoCount); else m_pWeapon->SetInventoryAmmoCount(ammo, ammoCount); } if (pAmmo && ph && pActor) { pAmmo->GetGameObject()->RegisterAsValidated(pActor->GetGameObject(), ph); pAmmo->GetGameObject()->BindToNetwork(); } else if (pAmmo && pAmmo->IsPredicted() && gEnv->IsClient() && gEnv->bServer && pActor && pActor->IsClient()) { pAmmo->GetGameObject()->BindToNetwork(); } if (!net) m_pWeapon->RequestShoot(ammo, pos, dir, vel, ZERO, 1.0f, pAmmo? pAmmo->GetGameObject()->GetPredictionHandle() : 0, true); m_pWeapon->HideItem(true); }
//------------------------------------------------------------------------ void CPlant::Plant(const Vec3 &pos, const Vec3 &dir, const Vec3 &vel, bool net, int ph) { IEntityClass* ammo = m_fireParams->plantparams.ammo_type_class; int weaponAmmoCount=m_pWeapon->GetAmmoCount(ammo); int inventoryAmmoCount=m_pWeapon->GetInventoryAmmoCount(ammo); int ammoCount = weaponAmmoCount; if (m_fireParams->plantparams.clip_size==0) ammoCount = inventoryAmmoCount; CProjectile *pAmmo = m_pWeapon->SpawnAmmo(ammo, net); CActor *pActor=m_pWeapon->GetOwnerActor(); if (pAmmo) { pAmmo->SetParams(CProjectile::SProjectileDesc(m_pWeapon->GetOwnerId(), m_pWeapon->GetHostId(), m_pWeapon->GetEntityId(), m_fireParams->plantparams.damage, 0.f, 0.f, 0.f, 0, 0, false)); //pAmmo->SetDestination(m_pWeapon->GetDestination()); pAmmo->Launch(pos, dir, vel); EntityId projectileId = pAmmo->GetEntity()->GetId(); if (projectileId && !m_fireParams->plantparams.simple && m_pWeapon->IsServer()) { if (pActor) { SetProjectileId(projectileId); } } } #ifdef SERVER_CHECKS if (pActor && m_pWeapon->IsServer() && m_pWeapon->IsServerSpawn(ammo)) { int totalAmmoCount=weaponAmmoCount+inventoryAmmoCount; // this needed seeing as how this seems to use weaponAmmo or inventoryAmmo but NOT both? if (totalAmmoCount <= 0) { g_pGame->GetAntiCheatManager()->FlagActivity(eCT_ServerSpawnedAmmoUsed, pActor->GetChannelId()); } } #endif ammoCount--; if (m_fireParams->plantparams.clip_size != -1) { if (m_fireParams->plantparams.clip_size!=0) m_pWeapon->SetAmmoCount(ammo, ammoCount); else m_pWeapon->SetInventoryAmmoCount(ammo, ammoCount); } if (pAmmo && ph && pActor) { pAmmo->GetGameObject()->RegisterAsValidated(pActor->GetGameObject(), ph); pAmmo->GetGameObject()->BindToNetwork(); } else if (pAmmo && pAmmo->IsPredicted() && gEnv->IsClient() && gEnv->bServer && pActor && pActor->IsClient()) { pAmmo->GetGameObject()->BindToNetwork(); } OnShoot(m_pWeapon->GetOwnerId(), pAmmo?pAmmo->GetEntity()->GetId():0, GetAmmoType(), pos, dir, vel); if (!net) m_pWeapon->RequestShoot(ammo, pos, dir, vel, ZERO, 1.0f, pAmmo? pAmmo->GetGameObject()->GetPredictionHandle() : 0, true); }