From 2ac12cf158d69e070f4ef23673ce582f7e43284e Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Sun, 26 Aug 2007 00:00:21 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@1274 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/bot/bot_ai.cpp | 4 +-- source/src/entity.h | 8 +++--- source/src/hudgun.cpp | 2 +- source/src/server.cpp | 12 +++++---- source/src/weapon.cpp | 51 +++++++++++++++++++++------------------ 5 files changed, 41 insertions(+), 36 deletions(-) diff --git a/source/src/bot/bot_ai.cpp b/source/src/bot/bot_ai.cpp index a83a6144..49ea98d5 100644 --- a/source/src/bot/bot_ai.cpp +++ b/source/src/bot/bot_ai.cpp @@ -760,11 +760,11 @@ int CBot::GetShootDelay() // UNDONE if ((WeaponInfoTable[m_pMyEnt->gunselect].eWeaponType == TYPE_MELEE) || (WeaponInfoTable[m_pMyEnt->gunselect].eWeaponType == TYPE_AUTO)) - return m_pMyEnt->gunwait; + return m_pMyEnt->gunwait[m_pMyEnt->gunselect]; float flMinShootDelay = m_pBotSkill->flMinAttackDelay; float flMaxShootDelay = m_pBotSkill->flMaxAttackDelay; - return max(m_pMyEnt->gunwait, int(RandomFloat(flMinShootDelay, flMaxShootDelay) * 1000.0f)); + return max(m_pMyEnt->gunwait[m_pMyEnt->gunselect], int(RandomFloat(flMinShootDelay, flMaxShootDelay) * 1000.0f)); } void CBot::CheckReload() // reload gun if no enemies are around diff --git a/source/src/entity.h b/source/src/entity.h index eb8abd43..eb332c55 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -195,9 +195,9 @@ struct playerstate { int health, armour; int primary, nextprimary; - int gunselect, gunwait; + int gunselect; int akimbo; - int ammo[NUMGUNS], mag[NUMGUNS]; + int ammo[NUMGUNS], mag[NUMGUNS], gunwait[NUMGUNS]; playerstate() : primary(GUN_ASSAULT), nextprimary(GUN_ASSAULT) {} @@ -259,9 +259,8 @@ struct playerstate health = 100; armour = 0; gunselect = GUN_PISTOL; - gunwait = 0; akimbo = 0; - loopi(NUMGUNS) ammo[i] = mag[i] = 0; + loopi(NUMGUNS) ammo[i] = mag[i] = gunwait[i] = 0; ammo[GUN_KNIFE] = mag[GUN_KNIFE] = 1; } @@ -349,6 +348,7 @@ struct playerent : dynent, playerstate playerstate::respawn(); history.reset(); lastaction = akimbolastaction[0] = akimbolastaction[1] = 0; + lastattackgun = -1; akimbomillis = 0; attacking = false; weaponchanging = false; diff --git a/source/src/hudgun.cpp b/source/src/hudgun.cpp index f8d07fe9..9304eee9 100644 --- a/source/src/hudgun.cpp +++ b/source/src/hudgun.cpp @@ -20,7 +20,7 @@ struct weaponmove void calcmove(vec base, int basetime) { int timediff = NADE_THROWING ? (lastmillis-player1->thrownademillis) : lastmillis-basetime; - int animtime = attackdelay(player1->gunselect); + int animtime = min(player1->gunwait[player1->gunselect], attackdelay(player1->gunselect)); int rtime = reloadtime(player1->gunselect); kick = k_rot = 0.0f; diff --git a/source/src/server.cpp b/source/src/server.cpp index 3057db83..1e6f0907 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -767,14 +767,15 @@ void processevent(client *c, shotevent &e) clientstate &gs = c->state; int wait = e.millis - gs.lastshot; if(!gs.isalive(gamemillis) || - (gs.gunwait && wait=NUMGUNS || + (gs.gunwait[e.gun] && waitgamemillis) gs.gunwait /= 2; + gs.gunwait[e.gun] = attackdelay(e.gun); + if(e.gun==GUN_PISTOL && gs.akimbomillis>gamemillis) gs.gunwait[e.gun] /= 2; sendf(-1, 1, "ri9x", SV_SHOTFX, c->clientnum, e.gun, int(e.from[0]*DMF), int(e.from[1]*DMF), int(e.from[2]*DMF), int(e.to[0]*DMF), int(e.to[1]*DMF), int(e.to[2]*DMF), @@ -844,11 +845,12 @@ void processevent(client *c, reloadevent &e) gs.ammo[e.gun] -= numbullets; int wait = e.millis - gs.lastshot; - if(gs.gunwait && waitgunwait[i]) d->gunwait[i] = max(d->gunwait[i] - (millis-d->lastaction), 0); + d->lastaction = millis; + if(akimbo) loopi(2) d->akimbolastaction[i] = millis; +} + void checkweaponswitch() { if(!player1->weaponchanging) return; @@ -17,8 +25,7 @@ void checkweaponswitch() { addmsg(SV_WEAPCHANGE, "ri", player1->gunselect); player1->weaponchanging = false; - if(player1->gunwait) player1->gunwait = max(player1->gunwait - (lastmillis-player1->lastaction), 0); - player1->lastaction = player1->gunwait ? lastmillis : 0; + updatelastaction(player1); } else if(timeprogress>WEAPONCHANGE_TIME/2) { @@ -33,8 +40,7 @@ void weaponswitch(int gun) { player1->weaponchanging = true; player1->thrownademillis = 0; - if(player1->gunwait) player1->gunwait = max(player1->gunwait - (lastmillis-player1->lastaction), 0); - player1->lastaction = player1->akimbolastaction[0] = player1->akimbolastaction[1] = lastmillis; + updatelastaction(player1, 0, true); player1->nextweapon = gun; playsound(S_GUNCHANGE); } @@ -102,12 +108,10 @@ void reload(playerent *d) if(!reloadable_gun(d->gunselect) || d->ammo[d->gunselect]<=0) return; if(d->mag[d->gunselect] >= (has_akimbo(d) ? 2 : 1)*guns[d->gunselect].magsize) return; if(d == player1) setscope(false); - - if(player1->gunwait) player1->gunwait = max(player1->gunwait - (lastmillis-player1->lastaction), 0); + + updatelastaction(d, 0, true); d->reloading = true; - d->lastaction = lastmillis; - d->akimbolastaction[0] = d->akimbolastaction[1] = lastmillis; - d->gunwait += guns[d->gunselect].reloadtime; + d->gunwait[d->gunselect] += guns[d->gunselect].reloadtime; int numbullets = (has_akimbo(d) ? 2 : 1)*guns[d->gunselect].magsize - d->mag[d->gunselect]; if(numbullets > d->ammo[d->gunselect]) numbullets = d->ammo[d->gunselect]; @@ -517,7 +521,7 @@ void thrownade(playerent *d, const vec &vel, bounceent *p) if(d==player1) { - player1->lastaction = lastmillis; + updatelastaction(player1); addmsg(SV_THROWNADE, "ri7", int(d->o.x*DMF), int(d->o.y*DMF), int(d->o.z*DMF), int(vel.x*DMF), int(vel.y*DMF), int(vel.z*DMF), lastmillis-p->millis); } } @@ -703,10 +707,10 @@ bool hasammo(playerent *d) // bot mod { if(!d->mag[d->gunselect]) { - if (d->type==ENT_BOT) playsound(S_NOAMMO, &d->o); + if(d->type==ENT_BOT) playsound(S_NOAMMO, &d->o); else playsoundc(S_NOAMMO); - d->gunwait = 250; - d->lastaction = lastmillis; + updatelastaction(d); + d->gunwait[d->gunselect] += 250; d->lastattackgun = -1; return false; } else return true; @@ -732,11 +736,11 @@ void shoot(playerent *d, vec &targ) d->weaponchanging = true; d->nextweapon = d->mag[GUN_GRENADE] ? GUN_GRENADE : d->primary; d->thrownademillis = 0; - d->lastaction = lastmillis-1-WEAPONCHANGE_TIME/2; + updatelastaction(d, -1-WEAPONCHANGE_TIME/2); } - if(d->weaponchanging || attacktimegunwait) return; - d->gunwait = 0; + if(d->weaponchanging || attacktimegunwait[d->gunselect]) return; + d->gunwait[d->gunselect] = 0; d->reloading = false; if(d->attacking && !d->inhandnade) // activate @@ -744,8 +748,8 @@ void shoot(playerent *d, vec &targ) if(!hasammo(d)) return; d->mag[d->gunselect]--; new_nade(d); - d->gunwait = attackdelay(d->gunselect); - d->lastaction = lastmillis; + updatelastaction(d); + d->gunwait[d->gunselect] = attackdelay(d->gunselect); d->lastattackgun = d->gunselect; addmsg(SV_SHOOT, "ri2i6i", lastmillis, d->gunselect, @@ -759,12 +763,12 @@ void shoot(playerent *d, vec &targ) else { if(autoreload && d == player1 && !d->mag[d->gunselect] && lastmillis-d->lastaction>guns[d->gunselect].attackdelay) { reload(d); return; } - if(d->weaponchanging || attacktimegunwait) return; - d->gunwait = 0; + if(d->weaponchanging || attacktimegunwait[d->gunselect]) return; + d->gunwait[d->gunselect] = 0; d->reloading = false; if(!d->attacking) { d->shots = 0; return; } - d->lastaction = lastmillis; + updatelastaction(d); d->lastattackgun = d->gunselect; if(d->gunselect!=GUN_KNIFE && !hasammo(d)) { d->shots = 0; return; } @@ -781,7 +785,6 @@ void shoot(playerent *d, vec &targ) if(d->gunselect!=GUN_KNIFE) d->mag[d->gunselect]--; from.z -= 0.2f; // below eye - if(attacktimegunwait) from = to; } spreadandrecoil(from,to,d); @@ -801,8 +804,8 @@ void shoot(playerent *d, vec &targ) if(!guns[d->gunselect].projspeed) raydamage(from, to, d); - d->gunwait = attackdelay(d->gunselect); - if(has_akimbo(d)) d->gunwait /= 2; // make akimbo pistols shoot twice as fast as normal pistol + d->gunwait[d->gunselect] = attackdelay(d->gunselect); + if(has_akimbo(d)) d->gunwait[d->gunselect] /= 2; // make akimbo pistols shoot twice as fast as normal pistol shootv(d->gunselect, from, to, d, true, 0); if(d==player1)