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
This commit is contained in:
ac-stef
2017-04-29 18:23:23 +02:00
parent deb73081e8
commit 1b596e059a
6 changed files with 40 additions and 41 deletions
+3 -2
View File
@@ -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] ]
+2 -2
View File
@@ -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)
+6 -8
View File
@@ -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)
+9 -5
View File
@@ -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)
+19 -23
View File
@@ -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);
+1 -1
View File
@@ -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);