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:
@@ -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] ]
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user