use fov and roll values of remote player during spectating

spectfovremote 0|1
    '1' uses fov and scopefov of the spectated player, '0' uses spectfov
    and the local scopefov, default is '0'

  maxrollremote sets the maximum roll to be shown during spectating

DOCREF spectfovremote
This commit is contained in:
ac-stef
2017-06-27 15:15:25 +02:00
parent 3549310e42
commit 2fa895ae90
6 changed files with 27 additions and 5 deletions
+4
View File
@@ -564,6 +564,10 @@ void sendintro()
connectrole = CR_DEFAULT;
putint(p, player1->nextprimweap->type);
loopi(2) putint(p, player1->skin(i));
putint(p, player1->maxroll);
putint(p, player1->maxrolleffect);
putint(p, player1->ffov);
putint(p, player1->scopefov);
sendpackettoserv(1, p.finalize());
}
+5 -2
View File
@@ -621,6 +621,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p, bool demo = false)
getstring(text, p);
loopi(2) getint(p);
getint(p);
loopi(4) getint(p);
if(!demo || !watchingdemo || demoprotocol > 1132) getint(p);
break;
}
@@ -641,8 +642,10 @@ 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
d->maxroll = (float)clamp(getint(p), 0, ROLLMOVMAX);
d->maxrolleffect = (float)clamp(getint(p), 0, ROLLEFFMAX);
d->ffov = (float)clamp(getint(p), 75, 120);
d->scopefov = (float)clamp(getint(p), 5, 60);
if(!demo || !watchingdemo || demoprotocol > 1132) d->address = getint(p); // partial IP address
+2 -1
View File
@@ -433,6 +433,7 @@ public:
int spectatemode, followplayercn;
int eardamagemillis;
float maxroll, maxrolleffect, movroll, effroll; // roll added by movement and damage
int ffov, scopefov;
bool allowmove() { return state!=CS_DEAD || spectatemode==SM_FLY; }
weapon *weapons[NUMGUNS];
@@ -451,7 +452,7 @@ public:
bool nocorpse;
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), lastdeath(0), clientrole(CR_DEFAULT),
team(TEAM_SPECT), spectatemode(SM_NONE), eardamagemillis(0), maxroll(ROLLMOVDEF), maxrolleffect(ROLLEFFDEF), movroll(0), effroll(0),
team(TEAM_SPECT), spectatemode(SM_NONE), eardamagemillis(0), maxroll(ROLLMOVDEF), maxrolleffect(ROLLEFFDEF), movroll(0), effroll(0), ffov(0), scopefov(0),
prevweaponsel(NULL), weaponsel(NULL), nextweaponsel(NULL), primweap(NULL), nextprimweap(NULL), lastattackweapon(NULL),
smoothmillis(-1),
head(-1, -1, -1), ignored(false), muted(false), nocorpse(false)
+6 -2
View File
@@ -469,18 +469,22 @@ void fovchanged();
FVARFP(fov, 75, 90, 120, fovchanged());
VARFP(scopefov, 5, 50, 60, fovchanged());
VARP(spectfov, 5, 110, 120);
VARP(spectfovremote, 0, 0, 1); // use spectfov or remote player's fov when spectating
void fovchanged()
{
extern float autoscopesensscale;
autoscopesensscale = tan(((float)scopefov)*0.5f*RAD)/tan(fov*0.5f*RAD);
player1->ffov = (int)fov;
player1->scopefov = scopefov;
}
float dynfov()
{
bool isscoped = player1->weaponsel->type == GUN_SNIPER && ((sniperrifle *)player1->weaponsel)->scoped;
bool useremote = spectfovremote && camera1 != player1 && camera1->type == ENT_PLAYER && ((playerent *)camera1)->ffov && ((playerent *)camera1)->scopefov;
if(camera1 != player1 && camera1->type < ENT_CAMERA) isscoped = ((playerent *)camera1)->scoping;
if(isscoped) return (float)scopefov;
else if(player1->isspectating()) return (float)spectfov;
if(isscoped) return (float) (useremote ? ((playerent *)camera1)->scopefov : scopefov);
else if(player1->isspectating()) return (float)(useremote ? ((playerent *)camera1)->ffov : spectfov);
else return (float)fov;
}
+8
View File
@@ -2959,6 +2959,10 @@ void putinitclient(client &c, packetbuf &p)
putint(p, c.skin[TEAM_CLA]);
putint(p, c.skin[TEAM_RVSF]);
putint(p, c.team);
putint(p, c.maxroll);
putint(p, c.maxrolleffect);
putint(p, c.ffov);
putint(p, c.scopefov);
putint(p, c.ip_censored);
}
@@ -3260,6 +3264,10 @@ void process(ENetPacket *packet, int sender, int chan)
int wantrole = getint(p), np = getint(p);
cl->state.nextprimary = np > 0 && np < NUMGUNS ? np : GUN_ASSAULT;
loopi(2) cl->skin[i] = getint(p);
cl->maxroll = getint(p);
cl->maxrolleffect = getint(p);
cl->ffov = getint(p);
cl->scopefov = getint(p);
int bantype = getbantype(sender);
bool banned = bantype > BAN_NONE;
bool srvfull = numnonlocalclients() > scl.maxclients;
+2
View File
@@ -259,6 +259,7 @@ struct client // server side version of "dynent" type
string servinforesponse;
string name;
int team;
int maxroll, maxrolleffect, ffov, scopefov;
char lang[3];
int ping;
int skin[2];
@@ -359,6 +360,7 @@ struct client // server side version of "dynent" type
vita = NULL;
bottomRTT = ping = 9999;
team = TEAM_SPECT;
maxroll = maxrolleffect = ffov = scopefov = 0;
state.state = CS_SPECTATE;
loopi(2) skin[i] = 0;
position.setsize(0);