void AAWeapon::HandleFiring() { if (CurrentAmmoInClip > 0 && CanFire()) { if (GetNetMode() != NM_DedicatedServer) { SimulateWeaponFire(); } if (MyPawn && MyPawn->IsLocallyControlled()) { FireWeapon(); UseAmmo(); BurstCounter++; } } else if (CanReload()) { StartReload(); } else if (MyPawn && MyPawn->IsLocallyControlled()) { if (GetCurrentAmmo() == 0 && !bRefiring) { PlayWeaponSound(OutOfAmmoSound); } /* Reload after firing last round */ if (CurrentAmmoInClip <= 0 && CanReload()) { StartReload(); } /* Stop weapon fire FX, but stay in firing state */ if (BurstCounter > 0) { OnBurstFinished(); } } if (MyPawn && MyPawn->IsLocallyControlled()) { if (Role < ROLE_Authority) { ServerHandleFiring(); } /* Retrigger HandleFiring on a delay for automatic weapons */ bRefiring = (CurrentState == EWeaponState::Firing && TimeBetweenShots > 0.0f); if (bRefiring) { GetWorldTimerManager().SetTimer(TimerHandle_HandleFiring, this, &AAWeapon::HandleFiring, TimeBetweenShots, false); } } LastFireTime = GetWorld()->GetTimeSeconds(); }
void DrawFullScreenStuff () { // Draw health DrINumberOuter (CPlayer->health, 4, -10, false, 7); screen->DrawTexture (Images[imgMEDI], 14, -17, DTA_HUDRules, HUD_Normal, DTA_CenterBottomOffset, true, TAG_DONE); // Draw armor ABasicArmor *armor = CPlayer->mo->FindInventory<ABasicArmor>(); if (armor != NULL && armor->Amount != 0) { DrINumberOuter (armor->Amount, 35, -10, false, 7); screen->DrawTexture (TexMan(armor->Icon), 45, -17, DTA_HUDRules, HUD_Normal, DTA_CenterBottomOffset, true, TAG_DONE); } // Draw ammo AAmmo *ammo1, *ammo2; int ammocount1, ammocount2; GetCurrentAmmo (ammo1, ammo2, ammocount1, ammocount2); if (ammo1 != NULL) { // Draw primary ammo in the bottom-right corner DrINumberOuter (ammo1->Amount, -23, -10, false, 7); screen->DrawTexture (TexMan(ammo1->Icon), -14, -17, DTA_HUDRules, HUD_Normal, DTA_CenterBottomOffset, true, TAG_DONE); if (ammo2 != NULL) { // Draw secondary ammo just above the primary ammo DrINumberOuter (ammo2->Amount, -23, -48, false, 7); screen->DrawTexture (TexMan(ammo2->Icon), -14, -55, DTA_HUDRules, HUD_Normal, DTA_CenterBottomOffset, true, TAG_DONE); } } if (deathmatch) { // Draw frags (in DM) DrBNumberOuterFont (CPlayer->fragcount, -44, 1); } // Draw inventory if (CPlayer->inventorytics == 0) { if (CPlayer->InvSel != 0) { if (ItemFlash > 0) { FTexture *cursor = Images[CursorImage]; screen->DrawTexture (cursor, -28, -15, DTA_HUDRules, HUD_Normal, DTA_LeftOffset, cursor->GetWidth(), DTA_TopOffset, cursor->GetHeight(), DTA_Alpha, ItemFlash, TAG_DONE); } DrINumberOuter (CPlayer->InvSel->Amount, -51, -10, false, 7); screen->DrawTexture (TexMan(CPlayer->InvSel->Icon), -42, -17, DTA_HUDRules, HUD_Normal, DTA_CenterBottomOffset, true, TAG_DONE); } } else { CPlayer->InvFirst = ValidateInvFirst (6); int i = 0; AInventory *item; if (CPlayer->InvFirst != NULL) { for (item = CPlayer->InvFirst; item != NULL && i < 6; item = item->NextInv(), ++i) { if (item == CPlayer->InvSel) { screen->DrawTexture (Images[CursorImage], -100+i*35, -21, DTA_HUDRules, HUD_HorizCenter, DTA_Alpha, TRANSLUC75, TAG_DONE); } if (item->Icon != 0) { screen->DrawTexture (TexMan(item->Icon), -94 + i*35, -19, DTA_HUDRules, HUD_HorizCenter, TAG_DONE); } DrINumberOuter (item->Amount, -89 + i*35, -10, true, 7); } } } // Draw pop screen (log, keys, and status) if (CurrentPop != POP_None && PopHeight < 0) { DrawPopScreen (screen->GetHeight()); } }
void DrawMainBar () { AInventory *item; int i; // Pop screen (log, keys, and status) if (CurrentPop != POP_None && PopHeight < 0) { DrawPopScreen (Scaled ? (ST_Y - 8) * screen->GetHeight() / 200 : ST_Y - 8); } DrawImage (Images[imgINVBACK], 0, 0); DrawImage (Images[imgINVTOP], 0, -8); // Health DrINumber (CPlayer->health, 79, -6, imgFONG0); if (CPlayer->cheats & CF_GODMODE) { HealthBar.SetVial (999); } else { HealthBar.SetVial (CPlayer->health); } DrawImage (&HealthBar, 49, 4); DrawImage (&HealthBar, 49, 7); // Armor item = CPlayer->mo->FindInventory<ABasicArmor>(); if (item != NULL && item->Amount > 0) { DrawImage (TexMan(item->Icon), 2, 9); DrINumber (item->Amount, 27, 23, imgFONY0); } // Ammo AAmmo *ammo1, *ammo2; int ammocount1, ammocount2; GetCurrentAmmo (ammo1, ammo2, ammocount1, ammocount2); if (ammo1 != NULL) { DrINumber (ammo1->Amount, 311, -6, imgFONG0); DrawImage (TexMan(ammo1->Icon), 290, 13); if (ammo2 != NULL) { /* int y = MIN (-5 - BigHeight, -5 - TexMan(ammo1->Icon)->GetHeight()); screen->DrawTexture (TexMan(ammo2->Icon), -14, y, DTA_HUDRules, HUD_Normal, DTA_CenterBottomOffset, true, TAG_DONE); DrBNumberOuterFont (ammo2->Amount, -67, y - BigHeight); */ } } // Sigil item = CPlayer->mo->FindInventory<ASigil>(); if (item != NULL) { DrawImage (TexMan(item->Icon), 253, 7); } // Inventory CPlayer->InvFirst = ValidateInvFirst (6); for (item = CPlayer->InvFirst, i = 0; item != NULL && i < 6; item = item->NextInv(), ++i) { if (item == CPlayer->InvSel) { screen->DrawTexture (Images[CursorImage], 42 + 35*i + ST_X, 12 + ST_Y, DTA_320x200, Scaled, DTA_Alpha, FRACUNIT - ItemFlash, TAG_DONE); } if (item->Icon != 0) { DrawImage (TexMan(item->Icon), 48 + 35*i, 14); } DrINumber (item->Amount, 74 + 35*i, 23, imgFONY0); } }
void AShooterWeapon::HandleFiring() { if ((CurrentAmmoInClip > 0 || HasInfiniteClip() || HasInfiniteAmmo()) && CanFire()) { if (GetNetMode() != NM_DedicatedServer) { SimulateWeaponFire(); } if (MyPawn && MyPawn->IsLocallyControlled()) { FireWeapon(); UseAmmo(); // update firing FX on remote clients if function was called on server BurstCounter++; } } else if (CanReload()) { StartReload(); } else if (MyPawn && MyPawn->IsLocallyControlled()) { if (GetCurrentAmmo() == 0 && !bRefiring) { PlayWeaponSound(OutOfAmmoSound); AShooterPlayerController* MyPC = Cast<AShooterPlayerController>(MyPawn->Controller); AShooterHUD* MyHUD = MyPC ? Cast<AShooterHUD>(MyPC->GetHUD()) : NULL; if (MyHUD) { MyHUD->NotifyOutOfAmmo(); } } // stop weapon fire FX, but stay in Firing state if (BurstCounter > 0) { OnBurstFinished(); } } if (MyPawn && MyPawn->IsLocallyControlled()) { // local client will notify server if (Role < ROLE_Authority) { ServerHandleFiring(); } // reload after firing last round if (CurrentAmmoInClip <= 0 && CanReload()) { StartReload(); } // setup refire timer bRefiring = (CurrentState == EWeaponState::Firing && WeaponConfig.TimeBetweenShots > 0.0f); if (bRefiring) { GetWorldTimerManager().SetTimer(TimerHandle_HandleFiring, this, &AShooterWeapon::HandleFiring, WeaponConfig.TimeBetweenShots, false); } } LastFireTime = GetWorld()->GetTimeSeconds(); }
void ASWeapon::HandleFiring() { if (CurrentAmmoInClip > 0 && CanFire()) { if (GetNetMode() != NM_DedicatedServer) { SimulateWeaponFire(); } if (MyPawn && MyPawn->IsLocallyControlled()) { FireWeapon(); UseAmmo(); // Update firing FX on remote clients if this is called on server BurstCounter++; } } else if (CanReload()) { StartReload(); } else if (MyPawn && MyPawn->IsLocallyControlled()) { if (GetCurrentAmmo() == 0 && !bRefiring) { PlayWeaponSound(OutOfAmmoSound); } /* Reload after firing last round */ if (CurrentAmmoInClip <= 0 && CanReload()) { StartReload(); } /* Stop weapon fire FX, but stay in firing state */ if (BurstCounter > 0) { OnBurstFinished(); } } if (MyPawn && MyPawn->IsLocallyControlled()) { if (Role < ROLE_Authority) { ServerHandleFiring(); } /* Retrigger HandleFiring on a delay for automatic weapons */ bRefiring = (CurrentState == EWeaponState::Firing && TimeBetweenShots > 0.0f); if (bRefiring) { GetWorldTimerManager().SetTimer(TimerHandle_HandleFiring, this, &ASWeapon::HandleFiring, TimeBetweenShots, false); } } /* Make Noise on every shot. The data is managed by the PawnNoiseEmitterComponent created in SBaseCharacter and used by PawnSensingComponent in SZombieCharacter */ if (MyPawn) { MyPawn->MakePawnNoise(1.0f); } LastFireTime = GetWorld()->GetTimeSeconds(); }