void DrawAmmoBar(WEAPON *p, int x, int y, int width, int height) { if(!p) return; if(p->iAmmoType != -1) { if(!gWR.CountAmmo(p->iAmmoType)) return; float f = (float)gWR.CountAmmo(p->iAmmoType) / (float)p->iMax1; x = DrawBar(x, y, width, height, f); // Do we have secondary ammo too? if(p->iAmmo2Type != -1) { f = (float)gWR.CountAmmo(p->iAmmo2Type) / (float)p->iMax2; x += 5; //!!! DrawBar(x, y, width, height, f); } } }
void DrawAmmoBar(WEAPON *p, int x, int y, int width, int height) { if(!p) return; if(p->iAmmoType != -1) { if(!gWR.CountAmmo(p->iAmmoType)) return; float f = (float)gWR.CountAmmo(p->iAmmoType) / (float)p->iMax1; x = DrawBar(x, y, width, height, f); } }
int CHudAmmo::VidInit(void) { // Load sprites for buckets (top row of weapon menu) m_HUD_bucket0 = gHUD.GetSpriteIndex("bucket1"); m_HUD_selection = gHUD.GetSpriteIndex("selection"); ghsprBuckets = gHUD.GetSprite(m_HUD_bucket0); giBucketWidth = gHUD.GetSpriteRect(m_HUD_bucket0).right - gHUD.GetSpriteRect(m_HUD_bucket0).left; giBucketHeight = gHUD.GetSpriteRect(m_HUD_bucket0).bottom - gHUD.GetSpriteRect(m_HUD_bucket0).top; gHR.iHistoryGap = max(gHR.iHistoryGap, gHUD.GetSpriteRect(m_HUD_bucket0).bottom - gHUD.GetSpriteRect(m_HUD_bucket0).top); // If we've already loaded weapons, let's get new sprites gWR.LoadAllWeaponSprites(); if(ScreenWidth >= 640) { giABWidth = 20; giABHeight = 4; } else { giABWidth = 10; giABHeight = 2; } return 1; }
// // WeaponList -- Tells the hud about a new weapon type. // int CHudAmmo::MsgFunc_WeaponList(const char *pszName, int iSize, void *pbuf) { BEGIN_READ(pbuf, iSize); WEAPON Weapon; strcpy(Weapon.szName, READ_STRING()); Weapon.iAmmoType = (int)READ_CHAR(); Weapon.iMax1 = READ_BYTE(); if(Weapon.iMax1 == 255) Weapon.iMax1 = -1; Weapon.iAmmo2Type = READ_CHAR(); Weapon.iMax2 = READ_BYTE(); if(Weapon.iMax2 == 255) Weapon.iMax2 = -1; Weapon.iSlot = READ_CHAR(); Weapon.iSlotPos = READ_CHAR(); Weapon.iId = READ_CHAR(); Weapon.iFlags = READ_BYTE(); Weapon.iClip = 0; gWR.AddWeapon(&Weapon); return 1; }
// // Think: // Used for selection of weapon menu item. // void CHudAmmo::Think(void) { if ( gHUD.m_fPlayerDead ) return; if ( gHUD.m_iWeaponBits != gWR.iOldWeaponBits ) { gWR.iOldWeaponBits = gHUD.m_iWeaponBits; for (int i = 0; i < MAX_WEAPONS-1; i++ ) { WEAPON *p = gWR.GetWeapon(i); if ( p ) { if ( gHUD.m_iWeaponBits & ( 1 << p->iId ) ) { gWR.PickupWeapon( p ); } else { gWR.DropWeapon( p ); } } } } if (!gpActiveSel) return; // has the player selected one? if (gHUD.m_iKeyBits & IN_ATTACK) { if (gpActiveSel != (WEAPON *)1) { ServerCmd(gpActiveSel->szName); g_weaponselect = gpActiveSel->iId; } gpLastSel = gpActiveSel; gpActiveSel = NULL; gHUD.m_iKeyBits &= ~IN_ATTACK; PlaySound("common/wpn_select.wav", 1); } }
//------------------------------------------------------------------------ // Command Handlers //------------------------------------------------------------------------ // Slot button pressed void CHudAmmo::SlotInput( int iSlot ) { // Let the Viewport use it first, for menus if ( gViewPort && gViewPort->SlotInput( iSlot ) ) return; gWR.SelectSlot(iSlot, FALSE, 1); }
int CHudAmmo::Init(void) { gHUD.AddHudElem(this); HOOK_MESSAGE(CurWeapon); HOOK_MESSAGE(WeaponList); HOOK_MESSAGE(AmmoPickup); HOOK_MESSAGE(WeapPickup); HOOK_MESSAGE(ItemPickup); HOOK_MESSAGE(HideWeapon); HOOK_MESSAGE(AmmoX); HOOK_MESSAGE(Crosshair); HOOK_MESSAGE(Brass); HOOK_COMMAND("slot1", Slot1); HOOK_COMMAND("slot2", Slot2); HOOK_COMMAND("slot3", Slot3); HOOK_COMMAND("slot4", Slot4); HOOK_COMMAND("slot5", Slot5); HOOK_COMMAND("slot6", Slot6); HOOK_COMMAND("slot7", Slot7); HOOK_COMMAND("slot8", Slot8); HOOK_COMMAND("slot9", Slot9); HOOK_COMMAND("slot10", Slot10); HOOK_COMMAND("cancelselect", Close); HOOK_COMMAND("invnext", NextWeapon); HOOK_COMMAND("invprev", PrevWeapon); HOOK_COMMAND("adjust_crosshair", Adjust_Crosshair); HOOK_COMMAND("rebuy", Rebuy); HOOK_COMMAND("autobuy", Autobuy); Reset(); m_pHud_DrawHistory_Time = CVAR_CREATE( "hud_drawhistory_time", HISTORY_DRAW_TIME, 0 ); m_pHud_FastSwitch = CVAR_CREATE( "hud_fastswitch", "0", FCVAR_ARCHIVE ); // controls whether or not weapons can be selected in one keypress CVAR_CREATE( "cl_observercrosshair", "1", 0 ); m_pClCrosshairColor = CVAR_CREATE( "cl_crosshair_color", "50 250 50", FCVAR_ARCHIVE ); m_pClCrosshairTranslucent = CVAR_CREATE( "cl_crosshair_translucent", "1", FCVAR_ARCHIVE ); m_pClCrosshairSize = CVAR_CREATE( "cl_crosshair_size", "auto", FCVAR_ARCHIVE ); m_pClDynamicCrosshair = CVAR_CREATE("cl_dynamiccrosshair", "1", FCVAR_ARCHIVE); m_iFlags |= HUD_ACTIVE; //!!! m_R = 50; m_G = 250; m_B = 50; m_iAlpha = 200; m_cvarB = m_cvarR = m_cvarG = -1; m_iCurrentCrosshair = 0; m_bAdditive = 1; m_iCrosshairScaleBase = 1024; m_bDrawCrosshair = true; gWR.Init(); gHR.Init(); return 1; };
// // Think: // Used for selection of weapon menu item. // void CHudAmmo::Think(void) { if ( gHUD.m_fPlayerDead ) return; if ( gHUD.m_iWeaponBits != gWR.iOldWeaponBits ) { gWR.iOldWeaponBits = gHUD.m_iWeaponBits; for (int i = MAX_WEAPONS-1; i > 0; i-- ) { WEAPON *p = gWR.GetWeapon(i); if ( p ) { if ( gHUD.m_iWeaponBits & ( 1 << p->iId ) ) gWR.PickupWeapon( p ); else gWR.DropWeapon( p ); } } } if (!gpActiveSel) return; // has the player selected one? if (gHUD.m_iKeyBits & IN_ATTACK) { if (gpActiveSel != (WEAPON *)1) { ServerCmd(gpActiveSel->szName); g_weaponselect = gpActiveSel->iId; } gpLastSel = gpActiveSel; gpActiveSel = NULL; gHUD.m_iKeyBits &= ~IN_ATTACK; // Fograin92: Replaced with new audio engine gSoundEngine.PlaySound("common/wpn_select.wav", g_vecZero, SND_2D, 0, CVAR_GET_FLOAT("sm_snd_sfx")); } }
// // AmmoX -- Update the count of a known type of ammo // int CHudAmmo::MsgFunc_AmmoX(const char *pszName, int iSize, void *pbuf) { BEGIN_READ(pbuf, iSize); int iIndex = READ_BYTE(); int iCount = READ_BYTE(); gWR.SetAmmo(iIndex, abs(iCount)); return 1; }
void CDiscPanel::Update( int iDiscNo, bool bGlow, int iPowerup ) { int iDiscs = gWR.GetAmmo( 1 ); // Grey disc for missing discs if ( iDiscs < iDiscNo+1 ) { setImage( m_pDiscTGA_Grey ); } // Powerups override team colored discs else if ( iPowerup & POW_TRIPLE ) { setImage( m_pDiscTGA_Triple ); } else if ( iPowerup & POW_FAST ) { setImage( m_pDiscTGA_Fast ); } else if ( iPowerup & POW_FREEZE ) { setImage( m_pDiscTGA_Freeze ); } else if ( iPowerup & POW_HARD ) { setImage( m_pDiscTGA_Hard ); } else if (g_iTeamNumber == 1) { if ( gWR.GetAmmo( 1 ) == 3 ) setImage( m_pDiscTGA_RedGlow ); else setImage( m_pDiscTGA_Red ); } else { if ( gWR.GetAmmo( 1 ) == 3 ) setImage( m_pDiscTGA_BlueGlow ); else setImage( m_pDiscTGA_Blue ); } }
WEAPON *WeaponsResource::GetNextActivePos(int iSlot, int iSlotPos) { if(iSlotPos >= MAX_WEAPON_POSITIONS || iSlot >= MAX_WEAPON_SLOTS) return NULL; WEAPON *p = gWR.rgSlots[iSlot][iSlotPos + 1]; if(!p || !gWR.HasAmmo(p)) return GetNextActivePos(iSlot, iSlotPos + 1); return p; }
// Selects the next item in the weapon menu void CHudAmmo::UserCmd_NextWeapon( void ) { if( gHUD.m_fPlayerDead || ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ))) return; if( !gpActiveSel || gpActiveSel == (WEAPON *)1 ) gpActiveSel = m_pWeapon; int pos = 0; int slot = 0; if( gpActiveSel ) { pos = gpActiveSel->iSlotPos + 1; slot = gpActiveSel->iSlot; } for( int loop = 0; loop <= 1; loop++ ) { for( ; slot < MAX_WEAPON_SLOTS; slot++ ) { for( ; pos < MAX_WEAPON_POSITIONS; pos++ ) { WEAPON *wsp = gWR.GetWeaponSlot( slot, pos ); if( wsp && gWR.HasAmmo( wsp )) { gpActiveSel = wsp; return; } } pos = 0; } slot = 0; // start looking from the first slot again } gpActiveSel = NULL; }
// Selects the previous item in the menu void CHudAmmo::UserCmd_PrevWeapon( void ) { if( gHUD.m_fPlayerDead || ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ))) return; if( !gpActiveSel || gpActiveSel == (WEAPON *)1 ) gpActiveSel = m_pWeapon; int pos = MAX_WEAPON_POSITIONS - 1; int slot = MAX_WEAPON_SLOTS - 1; if( gpActiveSel ) { pos = gpActiveSel->iSlotPos - 1; slot = gpActiveSel->iSlot; } for( int loop = 0; loop <= 1; loop++ ) { for( ; slot >= 0; slot-- ) { for( ; pos >= 0; pos-- ) { WEAPON *wsp = gWR.GetWeaponSlot( slot, pos ); if( wsp && gWR.HasAmmo( wsp )) { gpActiveSel = wsp; return; } } pos = MAX_WEAPON_POSITIONS - 1; } slot = MAX_WEAPON_SLOTS - 1; } gpActiveSel = NULL; }
// // CurWeapon: Update hud state with the current weapon and clip count. Ammo // counts are updated with AmmoX. Server assures that the Weapon ammo type // numbers match a real ammo type. // int CHudAmmo::MsgFunc_CurWeapon(const char *pszName, int iSize, void *pbuf) { static wrect_t nullrc; int fOnTarget = FALSE; BEGIN_READ(pbuf, iSize); int iState = READ_BYTE(); int iId = READ_BYTE(); int iClip = READ_CHAR(); // detect if we're also on target if(iState > 1) { fOnTarget = TRUE; } if(iId < 1) { SetCrosshair(0, nullrc, 0, 0, 0); return 0; } // Is player dead??? if((iId == -1) && (iClip == -1)) { gHUD.m_fPlayerDead = TRUE; gpActiveSel = NULL; return 1; } gHUD.m_fPlayerDead = FALSE; WEAPON *pWeapon = gWR.GetWeapon(iId); if(!pWeapon) return 0; if(iClip < -1) pWeapon->iClip = abs(iClip); else pWeapon->iClip = iClip; if(iState == 0) // we're not the current weapon, so update no more return 1; m_pWeapon = pWeapon; m_fFade = 200.0f; //!!! m_iFlags |= HUD_ACTIVE; return 1; }
void CHudAmmo::Reset(void) { m_fFade = 0; m_iFlags |= HUD_ACTIVE; //!!! gpActiveSel = NULL; gHUD.m_iHideHUDDisplay = 0; gWR.Reset(); gHR.Reset(); // VidInit(); }
void CHudAmmo::Reset( void ) { m_fFade = 0; m_iFlags |= HUD_ACTIVE; //!!! gpActiveSel = NULL; gHUD.m_iHideHUDDisplay = 0; gWR.Reset(); gHR.Reset(); SetCrosshair( 0, nullRc, 0, 0, 0 ); // reset crosshair m_pWeapon = NULL; // reset last weapon }
void CHudAmmo::Reset(void) { m_fFade = 0; m_iFlags |= HUD_ACTIVE; //!!! m_pWeapon = NULL; // Vit_amiN: reset the crosshair gpActiveSel = NULL; gHUD.m_iHideHUDDisplay = 0; gWR.Reset(); gHR.Reset(); // VidInit(); }
void CHudAmmo::Reset(void) { m_fFade = 0; m_iFlags |= HUD_ACTIVE; //!!! gpActiveSel = NULL; gHUD.m_iHideHUDDisplay = 0; // Added by Pcjoe m_blSliding = false; m_blSlideIn = false; m_blPrevStatus = false; m_flSlideTime = 0; m_flLastSelect = 0; gWR.Reset(); gHR.Reset(); }
int CHudAmmo::Init( void ) { gHUD.AddHudElem( this ); HOOK_MESSAGE( CurWeapon ); HOOK_MESSAGE( WeaponList ); HOOK_MESSAGE( AmmoPickup ); HOOK_MESSAGE( WeapPickup ); HOOK_MESSAGE( ItemPickup ); HOOK_MESSAGE( HideWeapon ); HOOK_MESSAGE( AmmoX ); HOOK_COMMAND( "slot1", Slot1 ); HOOK_COMMAND( "slot2", Slot2 ); HOOK_COMMAND( "slot3", Slot3 ); HOOK_COMMAND( "slot4", Slot4 ); HOOK_COMMAND( "slot5", Slot5 ); HOOK_COMMAND( "slot6", Slot6 ); HOOK_COMMAND( "slot7", Slot7 ); HOOK_COMMAND( "slot8", Slot8 ); HOOK_COMMAND( "slot9", Slot9 ); HOOK_COMMAND( "slot10", Slot10 ); HOOK_COMMAND( "cancelselect", Close ); HOOK_COMMAND( "invnext", NextWeapon ); HOOK_COMMAND( "invprev", PrevWeapon ); Reset(); CVAR_REGISTER( "hud_drawhistory_time", HISTORY_DRAW_TIME, 0 ); // controls whether or not weapons can be selected in one keypress CVAR_REGISTER( "hud_fastswitch", "0", FCVAR_ARCHIVE ); m_iFlags |= HUD_ACTIVE; //!!! gWR.Init(); gHR.Init(); return 1; }
int CHudAmmo::Draw(float flTime) { int a, x, y, r, g, b; int AmmoWidth; if (!(gHUD.m_iWeaponBits & (1<<(WEAPON_SUIT)) )) return 1; if ( (gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL )) ) return 1; // Draw Weapon Menu DrawWList(flTime); // Draw ammo pickup history gHR.DrawAmmoHistory( flTime ); if (!(m_iFlags & HUD_ACTIVE)) return 0; if (!m_pWeapon) return 0; // Fograin92: We're rendering ammo counters using new HUD, begone with this thing! return 0; WEAPON *pw = m_pWeapon; // shorthand // SPR_Draw Ammo if ((pw->iAmmoType < 0) && (pw->iAmmo2Type < 0)) return 0; int iFlags = DHN_DRAWZERO; // draw 0 values AmmoWidth = gHUD.GetSpriteRect(gHUD.m_HUD_number_0).right - gHUD.GetSpriteRect(gHUD.m_HUD_number_0).left; a = (int) max( MIN_ALPHA, m_fFade ); if (m_fFade > 0) m_fFade -= (gHUD.m_flTimeDelta * 20); // Fograin92: A little changes //UnpackRGB(r,g,b, RGB_YELLOWISH); r = SM_HUDcolor(1); g = SM_HUDcolor(2); b = SM_HUDcolor(3); ScaleColors(r, g, b, a ); // Does this weapon have a clip? y = ScreenHeight - gHUD.m_iFontHeight - gHUD.m_iFontHeight/2; // Does weapon have any ammo at all? if (m_pWeapon->iAmmoType > 0) { int iIconWidth = m_pWeapon->rcAmmo.right - m_pWeapon->rcAmmo.left; if (pw->iClip >= 0) { // room for the number and the '|' and the current ammo x = ScreenWidth - (8 * AmmoWidth) - iIconWidth; x = gHUD.DrawHudNumber(x, y, iFlags | DHN_3DIGITS, pw->iClip, r, g, b); wrect_t rc; rc.top = 0; rc.left = 0; rc.right = AmmoWidth; rc.bottom = 100; int iBarWidth = AmmoWidth/10; x += AmmoWidth/2; // Fograin92: A little changes //UnpackRGB(r,g,b, RGB_YELLOWISH); r = SM_HUDcolor(1); g = SM_HUDcolor(2); b = SM_HUDcolor(3); // draw the | bar FillRGBA(x, y, iBarWidth, gHUD.m_iFontHeight, r, g, b, a); x += iBarWidth + AmmoWidth/2;; // GL Seems to need this ScaleColors(r, g, b, a ); x = gHUD.DrawHudNumber(x, y, iFlags | DHN_3DIGITS, gWR.CountAmmo(pw->iAmmoType), r, g, b); } else { // SPR_Draw a bullets only line x = ScreenWidth - 4 * AmmoWidth - iIconWidth; x = gHUD.DrawHudNumber(x, y, iFlags | DHN_3DIGITS, gWR.CountAmmo(pw->iAmmoType), r, g, b); } // Draw the ammo Icon int iOffset = (m_pWeapon->rcAmmo.bottom - m_pWeapon->rcAmmo.top)/8; SPR_Set(m_pWeapon->hAmmo, r, g, b); SPR_DrawAdditive(0, x, y - iOffset, &m_pWeapon->rcAmmo); } // Does weapon have seconday ammo? if (pw->iAmmo2Type > 0) { int iIconWidth = m_pWeapon->rcAmmo2.right - m_pWeapon->rcAmmo2.left; // Do we have secondary ammo? if ((pw->iAmmo2Type != 0) && (gWR.CountAmmo(pw->iAmmo2Type) > 0)) { y -= gHUD.m_iFontHeight + gHUD.m_iFontHeight/4; x = ScreenWidth - 4 * AmmoWidth - iIconWidth; x = gHUD.DrawHudNumber(x, y, iFlags|DHN_3DIGITS, gWR.CountAmmo(pw->iAmmo2Type), r, g, b); // Draw the ammo Icon SPR_Set(m_pWeapon->hAmmo2, r, g, b); int iOffset = (m_pWeapon->rcAmmo2.bottom - m_pWeapon->rcAmmo2.top)/8; SPR_DrawAdditive(0, x, y - iOffset, &m_pWeapon->rcAmmo2); } } return 1; }
void CHudAmmo::UserCmd_Slot10(void) { gWR.SelectSlot(9, FALSE, 1); }
//------------------------------------------------------------------------ // Command Handlers //------------------------------------------------------------------------ // Slot button pressed void CHudAmmo::SlotInput( int iSlot ) { gWR.SelectSlot( iSlot, FALSE, 1 ); }
// // Draw Weapon Menu // int CHudAmmo::DrawWList(float flTime) { // int r,g,b,x,y,a,i; int baseX, baseY, x,y; bool blFakeActive = false; // Check if sliding is finished if(m_blSliding) { if(m_flSlideTime + SLIDETIME < gHUD.m_flTime) { m_blSliding = false; m_blSlideIn = false; m_flSlideTime = 0; } } // "Fake" active weapon so we can slide the weapon bar out with the correct information if ( !gpActiveSel ) { // start sliding if(m_blPrevStatus) { m_blPrevStatus = false; SlideIn(); blFakeActive = true; gpActiveSel = gpLastSel; if(!gpActiveSel) return 0; } else if(m_blSliding) { blFakeActive = true; gpActiveSel = gpLastSel; if(!gpActiveSel) return 0; } else { m_blPrevStatus = false; return 0; } } else { if(!m_blPrevStatus) { SlideOut(); } m_blPrevStatus = true; } int iActiveSlot; if ( gpActiveSel == (WEAPON *)1 ) iActiveSlot = -1; // current slot has no weapons else iActiveSlot = gpActiveSel->iSlot; baseX=x=0; baseY=y=GetYBase(m_iweapcenterHeight); // Ensure that there are available choices in the active slot if ( iActiveSlot > 0 ) { if ( !gWR.GetFirstPos( iActiveSlot ) ) { gpActiveSel = (WEAPON *)1; iActiveSlot = -1; } } // Draw left bar edge SPR_Set(gHUD.GetSprite(m_HUD_wpleft), 255, 255, 255 ); SPR_DrawHoles(0,x,y, &gHUD.GetSpriteRect(m_HUD_wpleft)); // Move over drawing position to the end of the left bar x+=m_iweapedgeWidth; // Draw all of the buckets for (int i = 0; i < MAX_WEAPON_SLOTS; i++) { // Set bucket rect wrect_t bucketrect; bucketrect.top = 0; bucketrect.left = 0; bucketrect.bottom = BUCKET_HEIGHT; bucketrect.right = BUCKET_WIDTH; // If this is the active slot, draw the bigger pictures, WEAPON *p = gWR.GetFirstPos( i ); /* int iWidth = BUCKET_WIDTH; int iHeight = BUCKET_HEIGHT;*/ if ( p ) {/* iWidth = p->rcActive.right - p->rcActive.left; iHeight = p->rcActive.bottom - p->rcActive.top;*/ } for ( int iPos = 0; iPos < MAX_WEAPON_POSITIONS; iPos++ ) { p = gWR.GetWeaponSlot( i, iPos ); if ( !p || !p->iId ) continue; // Draw bucket SPR_Set(gHUD.GetSprite(m_HUD_wpcenter), 255, 255, 255 ); SPR_DrawHoles(0, x, y, &gHUD.GetSpriteRect(m_HUD_wpcenter)); // Active weapon if ( gpActiveSel == p ) { SPR_Set(p->hActive, 255, 255, 255 ); SPR_Draw(0, x+OFFSETBUCKET_X, y+OFFSETBUCKET_Y, &bucketrect); } // Unactive weapon else { SPR_Set(p->hInactive, 255, 255, 255 ); SPR_Draw(0, x+OFFSETBUCKET_X, y+OFFSETBUCKET_Y, &bucketrect); } x+=m_iweapcenterWidth; } } // Draw right bar edge SPR_Set(gHUD.GetSprite(m_HUD_wpright), 255, 255, 255 ); SPR_DrawHoles(0,x,y, &gHUD.GetSpriteRect(m_HUD_wpright)); // Set active back to NULL if(blFakeActive) { gpActiveSel = NULL; } // Redone by Pcjoe /* x = 10; //!!! y = 10; //!!! // Ensure that there are available choices in the active slot if ( iActiveSlot > 0 ) { if ( !gWR.GetFirstPos( iActiveSlot ) ) { gpActiveSel = (WEAPON *)1; iActiveSlot = -1; } } // Draw top line for ( i = 0; i < MAX_WEAPON_SLOTS; i++ ) { int iWidth; UnpackRGB(r,g,b, RGB_YELLOWISH); if ( iActiveSlot == i ) a = 255; else a = 192; ScaleColors(r, g, b, 255); SPR_Set(gHUD.GetSprite(m_HUD_bucket0 + i), r, g, b ); // make active slot wide enough to accomodate gun pictures if ( i == iActiveSlot ) { WEAPON *p = gWR.GetFirstPos(iActiveSlot); if ( p ) iWidth = p->rcActive.right - p->rcActive.left; else iWidth = giBucketWidth; } else iWidth = giBucketWidth; SPR_DrawAdditive(0, x, y, &gHUD.GetSpriteRect(m_HUD_bucket0 + i)); x += iWidth + 5; } a = 128; //!!! x = 10; // Draw all of the buckets for (i = 0; i < MAX_WEAPON_SLOTS; i++) { y = giBucketHeight + 10; // If this is the active slot, draw the bigger pictures, // otherwise just draw boxes if ( i == iActiveSlot ) { WEAPON *p = gWR.GetFirstPos( i ); int iWidth = giBucketWidth; if ( p ) iWidth = p->rcActive.right - p->rcActive.left; for ( int iPos = 0; iPos < MAX_WEAPON_POSITIONS; iPos++ ) { p = gWR.GetWeaponSlot( i, iPos ); if ( !p || !p->iId ) continue; UnpackRGB( r,g,b, RGB_YELLOWISH ); // if active, then we must have ammo. if ( gpActiveSel == p ) { SPR_Set(p->hActive, r, g, b ); SPR_DrawAdditive(0, x, y, &p->rcActive); SPR_Set(gHUD.GetSprite(m_HUD_selection), r, g, b ); SPR_DrawAdditive(0, x, y, &gHUD.GetSpriteRect(m_HUD_selection)); } else { // Draw Weapon if Red if no ammo if ( gWR.HasAmmo(p) ) ScaleColors(r, g, b, 192); else { UnpackRGB(r,g,b, RGB_REDISH); ScaleColors(r, g, b, 128); } SPR_Set( p->hInactive, r, g, b ); SPR_DrawAdditive( 0, x, y, &p->rcInactive ); } // Draw Ammo Bar DrawAmmoBar(p, x + giABWidth/2, y, giABWidth, giABHeight); y += p->rcActive.bottom - p->rcActive.top + 5; } x += iWidth + 5; } else { // Draw Row of weapons. UnpackRGB(r,g,b, RGB_YELLOWISH); for ( int iPos = 0; iPos < MAX_WEAPON_POSITIONS; iPos++ ) { WEAPON *p = gWR.GetWeaponSlot( i, iPos ); if ( !p || !p->iId ) continue; if ( gWR.HasAmmo(p) ) { UnpackRGB(r,g,b, RGB_YELLOWISH); a = 128; } else { UnpackRGB(r,g,b, RGB_REDISH); a = 96; } FillRGBA( x, y, giBucketWidth, giBucketHeight, r, g, b, a ); y += giBucketHeight + 5; } x += giBucketWidth + 5; } }*/ return 1; }
void CHudAmmo::UserCmd_Slot9(void) { gWR.SelectSlot(8, FALSE, 1); }
// // CurWeapon: Update hud state with the current weapon and clip count. Ammo // counts are updated with AmmoX. Server assures that the Weapon ammo type // numbers match a real ammo type. // int CHudAmmo::MsgFunc_CurWeapon(const char *pszName, int iSize, void *pbuf) { static wrect_t nullrc; int fOnTarget = FALSE; BEGIN_READ(pbuf, iSize); int iState = READ_BYTE(); int iId = READ_CHAR(); int iClip = READ_CHAR(); // detect if we're also on target if(iState > 1) { fOnTarget = TRUE; } if(iId < 1) { SetCrosshair(0, nullrc, 0, 0, 0); return 0; } // Is player dead??? if((iId == -1) && (iClip == -1)) { gHUD.m_fPlayerDead = TRUE; gpActiveSel = NULL; return 1; } gHUD.m_fPlayerDead = FALSE; WEAPON *pWeapon = gWR.GetWeapon(iId); if(!pWeapon) return 0; if(iClip < -1) pWeapon->iClip = abs(iClip); else pWeapon->iClip = iClip; if(iState == 0) // we're not the current weapon, so update no more return 1; m_pWeapon = pWeapon; if(!(gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL))) { if(gHUD.m_iFOV >= 90) { // normal crosshairs if(fOnTarget && m_pWeapon->hAutoaim) SetCrosshair(m_pWeapon->hAutoaim, m_pWeapon->rcAutoaim, 255, 255, 255); else SetCrosshair(m_pWeapon->hCrosshair, m_pWeapon->rcCrosshair, 255, 255, 255); } else { // zoomed crosshairs if(fOnTarget && m_pWeapon->hZoomedAutoaim) SetCrosshair(m_pWeapon->hZoomedAutoaim, m_pWeapon->rcZoomedAutoaim, 255, 255, 255); else SetCrosshair(m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 255, 255); } } m_fFade = 200.0f; //!!! m_iFlags |= HUD_ACTIVE; return 1; }
int CHudAmmo::Draw(float flTime) { wrect_t nullrc; int a, x, y, r, g, b; int AmmoWidth; if (!(gHUD.m_iWeaponBits & (1<<(WEAPON_SUIT)) )) return 1; if ( (gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL )) ) return 1; // Draw Weapon Menu DrawWList(flTime); // Draw ammo pickup history gHR.DrawAmmoHistory( flTime ); if (!(m_iFlags & HUD_ACTIVE)) return 0; if (!m_pWeapon) return 0; if( gHUD.m_iFOV > 40 ) { SetCrosshair( 0, nullrc, 0, 0, 0); DrawCrosshair(flTime, m_pWeapon->iId); // draw a dynamic crosshair } else { SetCrosshair(m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 255, 255); } WEAPON *pw = m_pWeapon; // shorthand // SPR_Draw Ammo if ((pw->iAmmoType < 0) && (pw->iAmmo2Type < 0)) return 0; int iFlags = DHN_DRAWZERO; // draw 0 values AmmoWidth = gHUD.GetSpriteRect(gHUD.m_HUD_number_0).right - gHUD.GetSpriteRect(gHUD.m_HUD_number_0).left; a = (int) max( MIN_ALPHA, m_fFade ); if (m_fFade > 0) m_fFade -= (gHUD.m_flTimeDelta * 20); DrawUtils::DrawUtils::UnpackRGB(r,g,b, RGB_YELLOWISH); DrawUtils::DrawUtils::ScaleColors(r, g, b, a ); // Does this weapon have a clip? y = ScreenHeight - gHUD.m_iFontHeight - gHUD.m_iFontHeight/2; // Does weapon have any ammo at all? if (m_pWeapon->iAmmoType > 0) { int iIconWidth = m_pWeapon->rcAmmo.right - m_pWeapon->rcAmmo.left; if (pw->iClip >= 0) { // room for the number and the '|' and the current ammo x = ScreenWidth - (8 * AmmoWidth) - iIconWidth; x = DrawUtils::DrawHudNumber(x, y, iFlags | DHN_3DIGITS, pw->iClip, r, g, b); int iBarWidth = AmmoWidth/10; x += AmmoWidth/2; DrawUtils::UnpackRGB(r,g,b, RGB_YELLOWISH); // draw the | bar FillRGBA(x, y, iBarWidth, gHUD.m_iFontHeight, r, g, b, a); x += iBarWidth + AmmoWidth/2;; // GL Seems to need this DrawUtils::ScaleColors(r, g, b, a ); x = DrawUtils::DrawHudNumber(x, y, iFlags | DHN_3DIGITS, gWR.CountAmmo(pw->iAmmoType), r, g, b); } else { // SPR_Draw a bullets only line x = ScreenWidth - 4 * AmmoWidth - iIconWidth; x = DrawUtils::DrawHudNumber(x, y, iFlags | DHN_3DIGITS, gWR.CountAmmo(pw->iAmmoType), r, g, b); } // Draw the ammo Icon int iOffset = (m_pWeapon->rcAmmo.bottom - m_pWeapon->rcAmmo.top)/8; SPR_Set(m_pWeapon->hAmmo, r, g, b); SPR_DrawAdditive(0, x, y - iOffset, &m_pWeapon->rcAmmo); } // Does weapon have seconday ammo? if (pw->iAmmo2Type > 0) { int iIconWidth = m_pWeapon->rcAmmo2.right - m_pWeapon->rcAmmo2.left; // Do we have secondary ammo? if ((pw->iAmmo2Type != 0) && (gWR.CountAmmo(pw->iAmmo2Type) > 0)) { y -= gHUD.m_iFontHeight + gHUD.m_iFontHeight/4; x = ScreenWidth - 4 * AmmoWidth - iIconWidth; x = DrawUtils::DrawHudNumber(x, y, iFlags|DHN_3DIGITS, gWR.CountAmmo(pw->iAmmo2Type), r, g, b); // Draw the ammo Icon SPR_Set(m_pWeapon->hAmmo2, r, g, b); int iOffset = (m_pWeapon->rcAmmo2.bottom - m_pWeapon->rcAmmo2.top)/8; SPR_DrawAdditive(0, x, y - iOffset, &m_pWeapon->rcAmmo2); } } return 1; }
// // CurWeapon: Update hud state with the current weapon and clip count. Ammo // counts are updated with AmmoX. Server assures that the Weapon ammo type // numbers match a real ammo type. // int CHudAmmo::MsgFunc_CurWeapon(const char *pszName, int iSize, void *pbuf ) { static wrect_t nullrc; BEGIN_READ( pbuf, iSize ); int iState = READ_BYTE(); int iId = READ_CHAR(); int iClip = READ_CHAR(); if ( iId < 1 ) { SetCrosshair(0, nullrc, 0, 0, 0); return 0; } if ( g_iUser1 != OBS_IN_EYE ) { // Is player dead??? if ((iId == -1) && (iClip == -1)) { gHUD.m_fPlayerDead = TRUE; gpActiveSel = NULL; return 1; } gHUD.m_fPlayerDead = FALSE; } WEAPON *pWeapon = gWR.GetWeapon( iId ); if ( !pWeapon ) return 0; if ( iClip < -1 ) pWeapon->iClip = abs(iClip); else pWeapon->iClip = iClip; if ( iState == 0 ) // we're not the current weapon, so update no more return 1; m_pWeapon = pWeapon; /*if( gHUD.m_iFOV <= 40 ) { // zoomed crosshairs if (fOnTarget && m_pWeapon->hZoomedAutoaim) SetCrosshair(m_pWeapon->hZoomedAutoaim, m_pWeapon->rcZoomedAutoaim, 255, 255, 255); else SetCrosshair(m_pWeapon->hZoomedCrosshair, m_pWeapon->rcZoomedCrosshair, 255, 255, 255); } else { SetCrosshair( 0, nullrc, 0, 0, 0); }*/ m_fFade = 200.0f; //!!! m_iFlags |= HUD_ACTIVE; return 1; }
int CHudAmmo::Draw(float flTime) { int a, x, y, r, g, b; int AmmoWidth; int iCrossX; int iCrossY; int iCrossLength; char *chCrossHair = "+"; // Heh /*if (!(gHUD.m_iWeaponBits & (1<<(WEAPON_SUIT)) )) return 1;*/ if((gHUD.m_iHideHUDDisplay & (HIDEHUD_WEAPONS | HIDEHUD_ALL))) return 1; // Draw Weapon Menu DrawWList(flTime); // Draw ammo pickup history gHR.DrawAmmoHistory(flTime); if(!(m_iFlags & HUD_ACTIVE)) return 0; if(!m_pWeapon) return 0; WEAPON *pw = m_pWeapon; // shorthand // SPR_Draw Ammo if((pw->iAmmoType < 0) && (pw->iAmmo2Type < 0)) return 0; int iFlags = DHN_DRAWZERO; // draw 0 values AmmoWidth = gHUD.GetSpriteRect(gHUD.m_HUD_number_0).right - gHUD.GetSpriteRect(gHUD.m_HUD_number_0).left; a = (int)max(MIN_ALPHA, m_fFade); if(m_fFade > 0) m_fFade -= (gHUD.m_flTimeDelta * 20); UnpackRGB(r, g, b, RGB_YELLOWISH); ScaleColors(r, g, b, a); // Does this weapon have a clip? y = ScreenHeight - gHUD.m_iFontHeight - gHUD.m_iFontHeight / 2; /******************* DRAW CROSSHAIR *********************/ iCrossLength = gHUD.m_scrinfo.charWidths[*chCrossHair]; iCrossY = ScreenHeight / 2 - gHUD.m_scrinfo.iCharHeight / 2; iCrossX = ScreenWidth / 2 - iCrossLength / 2; gHUD.DrawHudString(iCrossX, iCrossY, iCrossX + 50, chCrossHair, 170, 170, 170); /******************* DRAW CROSSHAIR *********************/ // Does weapon have any ammo at all? if(m_pWeapon->iAmmoType > 0) { int iIconWidth = m_pWeapon->rcAmmo.right - m_pWeapon->rcAmmo.left; if(pw->iClip >= 0) { x = ScreenWidth - (8 * AmmoWidth) - iIconWidth; UnpackRGB(r, g, b, RGB_YELLOWISH); // GL Seems to need this ScaleColors(r, g, b, a); m_iNumberXPosition = x = gHUD.DrawHudNumber(x, y, iFlags | DHN_3DIGITS, gWR.CountAmmo(pw->iAmmoType), r, g, b); } // Draw the ammo Icon int iOffset = (m_pWeapon->rcAmmo.bottom - m_pWeapon->rcAmmo.top) / 8; SPR_Set(m_pWeapon->hAmmo, r, g, b); SPR_DrawAdditive(0, x, y - iOffset, &m_pWeapon->rcAmmo); m_iXPosition = x; } return 1; }
// // Draw Weapon Menu // int CHudAmmo::DrawWList(float flTime) { int r, g, b, x, y, a, i; if(!gpActiveSel) return 0; int iActiveSlot; if(gpActiveSel == (WEAPON *)1) iActiveSlot = -1; // current slot has no weapons else iActiveSlot = gpActiveSel->iSlot; x = 10; //!!! y = 10; //!!! // Ensure that there are available choices in the active slot if(iActiveSlot > 0) { if(!gWR.GetFirstPos(iActiveSlot)) { gpActiveSel = (WEAPON *)1; iActiveSlot = -1; } } // Draw top line for(i = 0; i < MAX_WEAPON_SLOTS; i++) { int iWidth; UnpackRGB(r, g, b, RGB_YELLOWISH); if(iActiveSlot == i) a = 255; else a = 192; ScaleColors(r, g, b, 255); SPR_Set(gHUD.GetSprite(m_HUD_bucket0 + i), r, g, b); // make active slot wide enough to accomodate gun pictures if(i == iActiveSlot) { WEAPON *p = gWR.GetFirstPos(iActiveSlot); if(p) iWidth = p->rcActive.right - p->rcActive.left; } else iWidth = giBucketWidth; if(i == iActiveSlot) SPR_DrawAdditive(0, x + 104, y, &gHUD.GetSpriteRect(m_HUD_bucket0 + i)); else SPR_DrawAdditive(0, x, y, &gHUD.GetSpriteRect(m_HUD_bucket0 + i)); x += iWidth + 5; } a = 128; //!!! x = 10; // Draw all of the buckets for(i = 1; i < MAX_WEAPON_SLOTS + 1; i++) { y = giBucketHeight + 10; // If this is the active slot, draw the bigger pictures, // otherwise just draw boxes if(i == iActiveSlot) { WEAPON *p = gWR.GetFirstPos(i); int iWidth = giBucketWidth; if(p) iWidth = p->rcActive.right - p->rcActive.left; for(int iPos = 0; iPos < MAX_WEAPON_POSITIONS; iPos++) { p = gWR.GetWeaponSlot(i, iPos); if(!p || !p->iId) continue; UnpackRGB(r, g, b, RGB_YELLOWISH); // if active, then we must have ammo. if(gpActiveSel == p) { if(gWR.HasAmmo(p)) ScaleColors(r, g, b, 192); else { UnpackRGB(r, g, b, RGB_REDISH); ScaleColors(r, g, b, 128); } SPR_Set(p->hActive, r, g, b); SPR_DrawAdditive(0, x, y, &p->rcActive); } else { // Draw Weapon if Red if no ammo if(gWR.HasAmmo(p)) ScaleColors(r, g, b, 192); else { UnpackRGB(r, g, b, RGB_REDISH); ScaleColors(r, g, b, 128); } SPR_Set(p->hInactive, r, g, b); SPR_DrawAdditive(0, x, y, &p->rcInactive); } // Draw Ammo Bar DrawAmmoBar(p, x + giABWidth / 2, y, giABWidth, giABHeight); y += p->rcActive.bottom - p->rcActive.top + 5; } x += iWidth + 5; } else { // Draw Row of weapons. UnpackRGB(r, g, b, RGB_YELLOWISH); for(int iPos = 0; iPos < MAX_WEAPON_POSITIONS; iPos++) { WEAPON *p = gWR.GetWeaponSlot(i, iPos); if(!p || !p->iId) continue; if(gWR.HasAmmo(p)) { UnpackRGB(r, g, b, RGB_YELLOWISH); a = 128; } else { UnpackRGB(r, g, b, RGB_REDISH); a = 96; } FillRGBA(x, y, giBucketWidth, giBucketHeight, r, g, b, a); y += giBucketHeight + 5; } x += giBucketWidth + 5; } } return 1; }