I'm having troubles with my weapons that have zoom modes. what happen is
that when i change weapons the fov of the last weapon stays after the
weapon has been changed. so what i did is that i included this:
void CHeistWeaponBGun::Holster(int skiplocal)
{
   iw.data_curr        = iw.data_org;

   iw.currentZoomMode    = ZOOMMODE_LVL1;
   iw.currentFireMode    = iw.currentFireMode;
   iw.recoil_current    = iw.recoil_baselevel;

   trigger_release();
   heistweapon_setWeaponInfo(iw,m_localData);

   m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
   m_pPlayer->m_iFOV = 0;
   CHeistBaseWeapon::Holster(skiplocal);
}
into my holster code for my gun and when i run it it doesn't work at
all. it gets called by the client but it doesnt change the fov. asides
from this it seems every time i use an impluse command like the flash
light the player jumps and cycles through the zoom modes of the gun.
also the other problem i have, i'm not sure if this could cause these
problems, the iuser4 variable in delta.lst i've increased it from 10 to 32.

this is from my delta.list:
DEFINE_DELTA( iuser4, DT_SIGNED | DT_INTEGER, 32, 1.0  ),

this is from my WeaponsPostThink:
/*
=====================
HUD_WeaponsPostThink

Run Weapon firing code on client
- oh yeah, i've did extensive testing of system which does simple bit
shifting of the data in order to get the
weapon info. i'm 100% postive it isn't the case.

heistInternalWeapon *gHeistCurrWeapon;   //this data structure just hold
weapon info

void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to,
usercmd_t *cmd, double time, unsigned int random_seed )
{
   int i;
   int buttonsChanged;
   CBasePlayerWeapon *pWeapon = NULL;
   CBasePlayerWeapon *pCurrent;
   weapon_data_t nulldata, *pfrom, *pto;
   static int lasthealth;

   memset( &nulldata, 0, sizeof( nulldata ) );

   HUD_InitClientWeapons();

   // Get current clock
   gpGlobals->time = time;

   gHeistCurrWeapon = 0;

   // Fill in data based on selected weapon
   // FIXME, make this a method in each weapon?  where you pass in an
entity_state_t *?
   switch ( from->client.m_iId )
   {
       case WEAPON_CROWBAR:
           pWeapon = &g_Crowbar;
           break;

       case WEAPON_GLOCK:
           pWeapon = &g_Glock;
           break;

       case WEAPON_PYTHON:
           pWeapon = &g_Python;
           break;

       case WEAPON_MP5:
           pWeapon = &g_Mp5;
           break;

       case WEAPON_CROSSBOW:
           pWeapon = &g_Crossbow;
           break;

       case WEAPON_SHOTGUN:
           pWeapon = &g_Shotgun;
           break;

       case WEAPON_RPG:
           pWeapon = &g_Rpg;
           break;

       case WEAPON_GAUSS:
           pWeapon = &g_Gauss;
           break;

       case WEAPON_EGON:
           pWeapon = &g_Egon;
           break;

       case WEAPON_HORNETGUN:
           pWeapon = &g_HGun;
           break;

       case WEAPON_HANDGRENADE:
           pWeapon = &g_HandGren;
           break;

       case WEAPON_SATCHEL:
           pWeapon = &g_Satchel;
           break;

       case WEAPON_TRIPMINE:
           pWeapon = &g_Tripmine;
           break;

       case WEAPON_SNARK:
           pWeapon = &g_Snark;
           break;
       case WEAPON_FN49:
           pWeapon = &g_heist_FN49;
           gHeistCurrWeapon = &g_heist_FN49.iw;    //this is used to
store the data like recoil level
                                                   //to draw the hud
           break;
   }

   // Store pointer to our destination entity_state_t so we can get our
origin, etc. from it
   //  for setting up events on the client
   g_finalstate = to;

   // If we are running events/etc. go ahead and see if we
   //  managed to die between last frame and this one
   // If so, run the appropriate player killed or spawn function
   if ( g_runfuncs )
   {
       if ( to->client.health <= 0 && lasthealth > 0 )
       {
           player.Killed( NULL, 0 );

       }
       else if ( to->client.health > 0 && lasthealth <= 0 )
       {
           player.Spawn();
       }

       lasthealth = to->client.health;
   }

   // We are not predicting the current weapon, just bow out here.
   if ( !pWeapon )
       return;

   for ( i = 0; i < 32; i++ )
   {
       pCurrent = g_pWpns[ i ];
       if ( !pCurrent )
       {
           continue;
       }

       pfrom = &from->weapondata[ i ];

       pCurrent->m_fInReload            = pfrom->m_fInReload;
       pCurrent->m_fInSpecialReload    = pfrom->m_fInSpecialReload;
//        pCurrent->m_flPumpTime            = pfrom->m_flPumpTime;
       pCurrent->m_iClip                = pfrom->m_iClip;
       pCurrent->m_flNextPrimaryAttack    = pfrom->m_flNextPrimaryAttack;
       pCurrent->m_flNextSecondaryAttack = pfrom->m_flNextSecondaryAttack;
       pCurrent->m_flTimeWeaponIdle    = pfrom->m_flTimeWeaponIdle;
       pCurrent->pev->fuser1            = pfrom->fuser1;
       pCurrent->m_flStartThrow        = pfrom->fuser2;
       pCurrent->m_flReleaseThrow        = pfrom->fuser3;
       pCurrent->m_chargeReady            = pfrom->iuser1;
       pCurrent->m_fInAttack            = pfrom->iuser2;
       pCurrent->m_fireState            = pfrom->iuser3;
       if(pWeapon == pCurrent)
           pCurrent->m_localData            = pfrom->iuser4; //get
recoil, firemode and zoomlevel mode from server
       pCurrent->m_iSecondaryAmmoType        =
(int)from->client.vuser3[ 2 ];
       pCurrent->m_iPrimaryAmmoType        = (int)from->client.vuser4[ 0 ];
       player.m_rgAmmo[ pCurrent->m_iPrimaryAmmoType ]    =
(int)from->client.vuser4[ 1 ];
       player.m_rgAmmo[ pCurrent->m_iSecondaryAmmoType ]    =
(int)from->client.vuser4[ 2 ];
   }

   // For random weapon events, use this seed to seed random # generator
   player.random_seed = random_seed;

   // Get old buttons from previous state.
   player.m_afButtonLast = from->playerstate.oldbuttons;

   // Which buttsons chave changed
   buttonsChanged = (player.m_afButtonLast ^ cmd->buttons);    // These
buttons have changed this frame

   // Debounced button codes for pressed/released
   // The changed ones still down are "pressed"
   player.m_afButtonPressed =  buttonsChanged & cmd->buttons;
   // The ones not down are "released"
   player.m_afButtonReleased = buttonsChanged & (~cmd->buttons);

   // Set player variables that weapons code might check/alter
   player.pev->button = cmd->buttons;

   player.pev->velocity = from->client.velocity;
   player.pev->flags = from->client.flags;

   player.pev->deadflag = from->client.deadflag;
   player.pev->waterlevel = from->client.waterlevel;
   player.pev->maxspeed    = from->client.maxspeed;
   player.pev->fov = from->client.fov;
   player.pev->weaponanim = from->client.weaponanim;
   player.pev->viewmodel = from->client.viewmodel;
   player.m_flNextAttack = from->client.m_flNextAttack;
   player.m_flNextAmmoBurn = from->client.fuser2;
   player.m_flAmmoStartCharge = from->client.fuser3;

   //Stores all our ammo info, so the client side weapons can use them.
   player.ammo_9mm            = (int)from->client.vuser1[0];
   player.ammo_357            = (int)from->client.vuser1[1];
   player.ammo_argrens        = (int)from->client.vuser1[2];
   player.ammo_bolts        = (int)from->client.ammo_nails; //is an int
anyways...
   player.ammo_buckshot    = (int)from->client.ammo_shells;
   player.ammo_uranium        = (int)from->client.ammo_cells;
   player.ammo_hornets        = (int)from->client.vuser2[0];
   player.ammo_rockets        = (int)from->client.ammo_rockets;


// Point to current weapon object if ( from->client.m_iId ) { player.m_pActiveItem = g_pWpns[ from->client.m_iId ]; }

   if ( player.m_pActiveItem->m_iId == WEAPON_RPG )
   {
        ( ( CRpg * )player.m_pActiveItem)->m_fSpotActive =
(int)from->client.vuser2[ 1 ];
        ( ( CRpg * )player.m_pActiveItem)->m_cActiveRockets =
(int)from->client.vuser2[ 2 ];
   }

   // Don't go firing anything if we have died.
   // Or if we don't have a weapon model deployed
   if ( ( player.pev->deadflag != ( DEAD_DISCARDBODY + 1 ) ) &&
        !CL_IsDead() && player.pev->viewmodel && !g_iUser1 )
   {
       if ( player.m_flNextAttack <= 0 )
       {
           pWeapon->ItemPostFrame();
       }
   }

   // Assume that we are not going to switch weapons
   to->client.m_iId                    = from->client.m_iId;

   // Now see if we issued a changeweapon command ( and we're not dead )
   if ( cmd->weaponselect && ( player.pev->deadflag != (
DEAD_DISCARDBODY + 1 ) ) )
   {
       // Switched to a different weapon?
       if ( from->weapondata[ cmd->weaponselect ].m_iId ==
cmd->weaponselect )
       {
           CBasePlayerWeapon *pNew = g_pWpns[ cmd->weaponselect ];
           if ( pNew && ( pNew != pWeapon ) )
           {
               // Put away old weapon
               if (player.m_pActiveItem)
                   player.m_pActiveItem->Holster( );

               player.m_pLastItem = player.m_pActiveItem;
               player.m_pActiveItem = pNew;

               // Deploy new weapon
               if (player.m_pActiveItem)
               {
                   player.m_pActiveItem->Deploy( );
               }

               // Update weapon id so we can predict things correctly.
               to->client.m_iId = cmd->weaponselect;
           }
       }
   }

   // Copy in results of prediction code
   to->client.viewmodel                = player.pev->viewmodel;
   to->client.fov                        = player.pev->fov;
   to->client.weaponanim                = player.pev->weaponanim;
   to->client.m_flNextAttack            = player.m_flNextAttack;
   to->client.fuser2                    = player.m_flNextAmmoBurn;
   to->client.fuser3                    = player.m_flAmmoStartCharge;
   to->client.maxspeed                    = player.pev->maxspeed;

   //HL Weapons
   to->client.vuser1[0]                = player.ammo_9mm;
   to->client.vuser1[1]                = player.ammo_357;
   to->client.vuser1[2]                = player.ammo_argrens;

   to->client.ammo_nails                = player.ammo_bolts;
   to->client.ammo_shells                = player.ammo_buckshot;
   to->client.ammo_cells                = player.ammo_uranium;
   to->client.vuser2[0]                = player.ammo_hornets;
   to->client.ammo_rockets                = player.ammo_rockets;

   if ( player.m_pActiveItem->m_iId == WEAPON_RPG )
   {
        from->client.vuser2[ 1 ] = ( ( CRpg *
)player.m_pActiveItem)->m_fSpotActive;
        from->client.vuser2[ 2 ] = ( ( CRpg *
)player.m_pActiveItem)->m_cActiveRockets;
   }

   // Make sure that weapon animation matches what the game .dll is
telling us
   //  over the wire ( fixes some animation glitches )
   if ( g_runfuncs && ( HUD_GetWeaponAnim() != to->client.weaponanim ) )
   {
       int body = 2;

       //Pop the model to body 0.
       if ( pWeapon == &g_Tripmine )
            body = 0;

       //Show laser sight/scope combo
       if ( pWeapon == &g_Python && bIsMultiplayer() )
            body = 1;

       // Force a fixed anim down to viewmodel
       HUD_SendWeaponAnim( to->client.weaponanim, body, 1 );
   }

   for ( i = 0; i < 32; i++ )
   {
       pCurrent = g_pWpns[ i ];

       pto = &to->weapondata[ i ];

       if ( !pCurrent )
       {
           memset( pto, 0, sizeof( weapon_data_t ) );
           continue;
       }

       pto->m_fInReload                = pCurrent->m_fInReload;
       pto->m_fInSpecialReload            = pCurrent->m_fInSpecialReload;
//        pto->m_flPumpTime                = pCurrent->m_flPumpTime;
       pto->m_iClip                    = pCurrent->m_iClip;
       pto->m_flNextPrimaryAttack        = pCurrent->m_flNextPrimaryAttack;
       pto->m_flNextSecondaryAttack    = pCurrent->m_flNextSecondaryAttack;
       pto->m_flTimeWeaponIdle            = pCurrent->m_flTimeWeaponIdle;
       pto->fuser1                        = pCurrent->pev->fuser1;
       pto->fuser2                        = pCurrent->m_flStartThrow;
       pto->fuser3                        = pCurrent->m_flReleaseThrow;
       pto->iuser1                        = pCurrent->m_chargeReady;
       pto->iuser2                        = pCurrent->m_fInAttack;
       pto->iuser3                        = pCurrent->m_fireState;
       pto->iuser4                        = pCurrent->m_localData;
//local data is used to remember the recoil level and other weapon info
       // Decrement weapon counters, server does this at same time (
during post think, after doing everything else )
       pto->m_flNextReload                -= cmd->msec / 1000.0;
       pto->m_fNextAimBonus            -= cmd->msec / 1000.0;
       pto->m_flNextPrimaryAttack        -= cmd->msec / 1000.0;
       pto->m_flNextSecondaryAttack    -= cmd->msec / 1000.0;
       pto->m_flTimeWeaponIdle            -= cmd->msec / 1000.0;
       pto->fuser1                        -= cmd->msec / 1000.0;

       to->client.vuser3[2]                =
pCurrent->m_iSecondaryAmmoType;
       to->client.vuser4[0]                = pCurrent->m_iPrimaryAmmoType;
       to->client.vuser4[1]                = player.m_rgAmmo[
pCurrent->m_iPrimaryAmmoType ];
       to->client.vuser4[2]                = player.m_rgAmmo[
pCurrent->m_iSecondaryAmmoType ];

/*        if ( pto->m_flPumpTime != -9999 )
       {
           pto->m_flPumpTime -= cmd->msec / 1000.0;
           if ( pto->m_flPumpTime < -0.001 )
               pto->m_flPumpTime = -0.001;
       }*/

       if ( pto->m_fNextAimBonus < -1.0 )
       {
           pto->m_fNextAimBonus = -1.0;
       }

       if ( pto->m_flNextPrimaryAttack < -1.0 )
       {
           pto->m_flNextPrimaryAttack = -1.0;
       }

       if ( pto->m_flNextSecondaryAttack < -0.001 )
       {
           pto->m_flNextSecondaryAttack = -0.001;
       }

       if ( pto->m_flTimeWeaponIdle < -0.001 )
       {
           pto->m_flTimeWeaponIdle = -0.001;
       }

       if ( pto->m_flNextReload < -0.001 )
       {
           pto->m_flNextReload = -0.001;
       }

       if ( pto->fuser1 < -0.001 )
       {
           pto->fuser1 = -0.001;
       }
   }

   // m_flNextAttack is now part of the weapons, but is part of the
player instead
   to->client.m_flNextAttack -= cmd->msec / 1000.0;
   if ( to->client.m_flNextAttack < -0.001 )
   {
       to->client.m_flNextAttack = -0.001;
   }

   to->client.fuser2 -= cmd->msec / 1000.0;
   if ( to->client.fuser2 < -0.001 )
   {
       to->client.fuser2 = -0.001;
   }

   to->client.fuser3 -= cmd->msec / 1000.0;
   if ( to->client.fuser3 < -0.001 )
   {
       to->client.fuser3 = -0.001;
   }

   // Store off the last position from the predicted state.
   HUD_SetLastOrg();

   // Wipe it so we can't use it after this frame
   g_finalstate = NULL;
}

_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders



Reply via email to