From 1b596e059a54710d6064ed9be0286ea266afe158 Mon Sep 17 00:00:00 2001 From: ac-stef Date: Sat, 29 Apr 2017 18:23:23 +0200 Subject: [PATCH] roll update - split into strafe roll (maxroll) and damage roll (maxrolleffect) - locally recompute remote players roll (can be removed from pos pkt) - fix maxrollremote DOCREF maxroll maxrolleffect maxrollremote --- config/menus_settings.cfg | 5 +++-- source/src/clientgame.cpp | 4 ++-- source/src/clients2c.cpp | 14 ++++++------- source/src/entity.h | 14 ++++++++----- source/src/physics.cpp | 42 ++++++++++++++++++--------------------- source/src/worldlight.cpp | 2 +- 6 files changed, 40 insertions(+), 41 deletions(-) diff --git a/config/menus_settings.cfg b/config/menus_settings.cfg index 344d6ed6..893d7b9a 100644 --- a/config/menus_settings.cfg +++ b/config/menus_settings.cfg @@ -571,6 +571,7 @@ menuitemcheckbox [ Spectator info ] "(= $hidespecthud 0)" [ menuitemcheckbox [ Quick messages ] "(= $hidehudmsgs 0)" [ hidehudmsgs (= $arg1 0) ] menuitemcheckbox [ Damage direction indicator ] "(= $hidedamageindicator 0)" [ hidedamageindicator (= $arg1 0) ] menuitemcheckbox [ Damage screen flash ] "$damagescreen" [ damagescreen $arg1 ] +menuitemslider [ Damage maxroll ] 0 (getvarrange max maxrolleffect) "$maxrolleffect" 1 [] [ maxrolleffect $arg1 ] menuitemcheckbox [ Crosshair team-sign ] "$crosshairteamsign" [ crosshairteamsign $arg1 ] menuitemcheckbox [ CTF icons ] "(= $hidectfhud 0)" [ hidectfhud (= $arg1 0) ] menuitemcheckbox [ KTF flag direction indicator ] "(! $hidektfindicator)" [ hidektfindicator (! $arg1) ] @@ -582,8 +583,8 @@ menuitemslider [ Game time: ] 0 2 "$gametimedisplay" 1 [None "Count backward menuitemslider [ Wall clock: ] 0 6 [findlist $wallclockformatlist $wallclockformat] 1 [None "HH:MM (local, 24h)" "HH:MM:SS (local, 24h)" "HH:MM (local, 12h)" "HH:MM:SS (local, 12h)" "HH:MM (UTC/GMT)" "HH:MM:SS (UTC/GMT)"] [ persistidents 1; alias wallclockformat (at $wallclockformatlist $arg1); persistidents 0 ] menuitemslider [ Extra messages: ] 0 3 "$hudextras" 1 ["No extra messages" "Show extra messages in console" "Pop up extra messages!" "SPAM EXTRA MESSAGES!"] [ hudextras $arg1 ] menuitemslider [ Hand alignment: ] 0 1 "$righthanded" 1 [Left-handed Right-handed] [ righthanded $arg1 ] -menuitemslider [ Max-roll: ] 0 20 "$maxroll" 1 [] [ maxroll $arg1 ] -menuitemslider [ Spectator max-roll: ] 0 1 "$maxrollremote" 1 [Off On] [ maxrollremote $arg1 ] +menuitemslider [ Max-roll: ] 0 (getvarrange max maxroll) "$maxroll" 1 [] [ maxroll $arg1 ] +menuitemslider [ Spectator max-roll: ] 0 (getvarrange max maxrollremote) "$maxrollremote" 2 [] [ maxrollremote $arg1 ] menuitem [] -1 menuitem [Customize your scoreboard...] [ showmenu [Customize your scoreboard] ] diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index db92755a..b0a1e644 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -373,7 +373,7 @@ void deathstate(playerent *pl) pl->spectatemode = SM_DEATHCAM; pl->respawnoffset = pl->lastpain = lastmillis; pl->move = pl->strafe = 0; - pl->pitch = pl->roll = 0; + pl->pitch = pl->roll = pl->movroll = pl->effroll = 0; pl->attacking = false; pl->weaponsel->onownerdies(); @@ -661,7 +661,7 @@ void gotoplayerstart(playerent *d, entity *e) d->o.z = e->z; d->yaw = float(e->attr1) / ENTSCALE10; d->pitch = 0; - d->roll = 0; + d->roll = d->movroll = d->effroll = 0; } void findplayerstart(playerent *d, bool mapcenter, int arenaspawn) diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 0a9da268..9b217105 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -108,8 +108,6 @@ void updatelagtime(playerent *d) extern void trydisconnect(); -VARP(maxrollremote, 0, 0, 20); // bound remote "roll" values by our maxroll?! - void parsepositions(ucharbuf &p) { int type; @@ -120,7 +118,7 @@ void parsepositions(ucharbuf &p) { int cn, f, g; vec o, vel; - float yaw, pitch, roll = 0; + float yaw, pitch = 0; bool scoping;//, shoot; if(type == SV_POSC) { @@ -131,7 +129,7 @@ void parsepositions(ucharbuf &p) o.y = q.getbits(usefactor + 4) / DMF; yaw = q.getbits(9) * 360.0f / 512; pitch = (q.getbits(8) - 128) * 90.0f / 127; - roll = !q.getbits(1) ? (q.getbits(6) - 32) * 20.0f / 31 : 0.0f; + if(!q.getbits(1)) q.getbits(6); if(!q.getbits(1)) { vel.x = (q.getbits(4) - 8) / DVELF; @@ -160,7 +158,7 @@ void parsepositions(ucharbuf &p) yaw = (float)getuint(p); pitch = (float)getint(p); g = getuint(p); - if ((g>>3) & 1) roll = (float)(getint(p)*20.0f/125.0f); + if ((g>>3) & 1) getint(p); if (g & 1) vel.x = getint(p)/DVELF; else vel.x = 0; if ((g>>1) & 1) vel.y = getint(p)/DVELF; else vel.y = 0; if ((g>>2) & 1) vel.z = getint(p)/DVELF; else vel.z = 0; @@ -190,7 +188,6 @@ void parsepositions(ucharbuf &p) sniperrifle *sr = (sniperrifle *)d->weaponsel; sr->scoped = d->scoping = scoping; } - d->roll = roll; d->strafe = (f&3)==3 ? -1 : f&3; f >>= 2; d->move = (f&3)==3 ? -1 : f&3; @@ -230,8 +227,6 @@ void parsepositions(ucharbuf &p) if(d->state==CS_LAGGED || d->state==CS_SPAWNING) d->state = CS_ALIVE; // when playing a demo spectate first player we know about if(player1->isspectating() && player1->spectatemode==SM_NONE) togglespect(); - extern void clamproll(physent *pl); - clamproll((physent *) d); break; } @@ -605,6 +600,9 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false) loopi(2) d->setskin(i, getint(p)); d->team = getint(p); +// d->maxroll = (float)clamp(getint(p), 0, ROLLMOVMAX); FIXME: uncomment on protocol bump + etc. +// d->maxrolleffect = (float)clamp(getint(p), 0, ROLLEFFMAX); FIXME: uncomment on protocol bump + if(!demo || !watchingdemo || demoprotocol > 1132) d->address = getint(p); // partial IP address if(m_flags) loopi(2) diff --git a/source/src/entity.h b/source/src/entity.h index 379f8f3c..f80af4e5 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -407,6 +407,11 @@ public: #ifndef STANDALONE #define HEADSIZE 0.4f +#define ROLLMOVMAX 20 +#define ROLLMOVDEF 0 +#define ROLLEFFMAX 30 +#define ROLLEFFDEF 10 + class playerent : public dynent, public playerstate { private: @@ -426,6 +431,7 @@ public: int spectatemode, followplayercn; int eardamagemillis; int respawnoffset; + float maxroll, maxrolleffect, movroll, effroll; // roll added by movement and damage bool allowmove() { return state!=CS_DEAD || spectatemode==SM_FLY; } weapon *weapons[NUMGUNS]; @@ -443,7 +449,7 @@ public: bool ignored, muted; playerent() : curskin(0), clientnum(-1), lastupdate(0), plag(0), ping(0), address(0), lifesequence(0), frags(0), flagscore(0), deaths(0), points(0), tks(0), lastpain(0), lastvoicecom(0), clientrole(CR_DEFAULT), - team(TEAM_SPECT), spectatemode(SM_NONE), eardamagemillis(0), respawnoffset(0), + team(TEAM_SPECT), spectatemode(SM_NONE), eardamagemillis(0), respawnoffset(0), maxroll(ROLLMOVDEF), maxrolleffect(ROLLEFFDEF), movroll(0), effroll(0), prevweaponsel(NULL), weaponsel(NULL), nextweaponsel(NULL), primweap(NULL), nextprimweap(NULL), lastattackweapon(NULL), smoothmillis(-1), head(-1, -1, -1), ignored(false), muted(false) @@ -477,10 +483,8 @@ public: void damageroll(float damage) { - extern void clamproll(physent *pl); - float damroll = 2.0f*damage; - roll += roll>0 ? damroll : (roll<0 ? -damroll : (rnd(2) ? damroll : -damroll)); // give player a kick - clamproll(this); + damage *= effroll > 0.001f || (effroll > -0.001f && rnd(2)) ? 2.0f : -2.0f; // give player a kick + effroll = clamp(effroll + damage, -maxrolleffect, maxrolleffect); } void hitpush(int damage, const vec &dir, playerent *actor, int gun) diff --git a/source/src/physics.cpp b/source/src/physics.cpp index 0c9d848e..b01b1dcf 100644 --- a/source/src/physics.cpp +++ b/source/src/physics.cpp @@ -351,7 +351,9 @@ bool collide(physent *d, bool spawn, float drop, float rise) return false; } -VARP(maxroll, 0, 0, 20); // note: when changing max value, fix network transmission +VARFP(maxroll, 0, ROLLMOVDEF, ROLLMOVMAX, player1->maxroll = maxroll); +VARFP(maxrolleffect, 0, ROLLEFFDEF, ROLLEFFMAX, player1->maxrolleffect = maxrolleffect); +VARP(maxrollremote, 0, ROLLMOVDEF + ROLLEFFDEF, ROLLMOVMAX + ROLLEFFMAX); //VAR(recoilbackfade, 0, 100, 1000); void resizephysent(physent *pl, int moveres, int curtime, float min, float max) @@ -393,18 +395,6 @@ void resizephysent(physent *pl, int moveres, int curtime, float min, float max) // moveres indicated the physics precision (which is lower for monsters and multiplayer prediction) // local is false for multiplayer prediction -void clamproll(physent *pl) -{ - extern int maxrollremote; - int mroll = pl == player1 ? maxroll : maxrollremote; - if(pl->roll > mroll) pl->roll = mroll; - else if(pl->roll < -mroll) pl->roll = -mroll; -} - -float var_f = 0; -int var_i = 0; -bool var_b = true; - FVARP(flyspeed, 1.0, 2.0, 5.0); void moveplayer(physent *pl, int moveres, bool local, int curtime) @@ -719,19 +709,25 @@ void moveplayer(physent *pl, int moveres, bool local, int curtime) if(pl->type==ENT_CAMERA) return; - if(pl->type!=ENT_BOUNCE && pl==player1) + if(pl->type!=ENT_BOUNCE) { - // automatically apply smooth roll when strafing - if(pl->strafe==0) + if(pl->type == ENT_PLAYER) { - pl->roll = pl->roll/(1+(float)sqrt((float)curtime)/25); + // automatically apply smooth roll when strafing + playerent *p = (playerent *)pl; + float iir = 1.0f + sqrtf((float)curtime) / 25.0f; + if(pl->strafe==0) + { + p->movroll /= iir; + } + else + { + p->movroll = clamp(p->movroll + pl->strafe * curtime / -30.0f, -p->maxroll, p->maxroll); + } + p->effroll /= iir; // fade damage roll + pl->roll = p->movroll + p->effroll; + if(pl != player1) pl->roll = clamp(pl->roll, (float)-maxrollremote, (float)maxrollremote); } - else - { - pl->roll += pl->strafe*curtime/-30.0f; - clamproll(pl); - } - // smooth pitch const float fric = 6.0f/curtime*20.0f; pl->pitch += pl->pitchvel*(curtime/1000.0f)*pl->maxspeed*(pl->crouching ? 0.75f : 1.0f); diff --git a/source/src/worldlight.cpp b/source/src/worldlight.cpp index b2e08587..2520beb5 100644 --- a/source/src/worldlight.cpp +++ b/source/src/worldlight.cpp @@ -10,7 +10,7 @@ void lightray(float bx, float by, const persistent_entity &light, float fade = 1 float ly = light.y+(flicker ? (rnd(21)-10)*0.1f : 0); float dx = bx-lx; float dy = by-ly; - float dist = (float)sqrt(dx*dx+dy*dy); + float dist = sqrtf(dx*dx+dy*dy); if(dist<1.0f) return; int reach = light.attr1; int steps = (int)(reach*reach*1.6f/dist);