diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 9ade70301..b55441b2d 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -65,6 +65,7 @@ // ------ static void Got_NameAndColor(UINT8 **cp, INT32 playernum); +static void Got_WeaponPref(UINT8 **cp, INT32 playernum); static void Got_PowerLevel(UINT8 **cp, INT32 playernum); static void Got_PartyInvite(UINT8 **cp, INT32 playernum); static void Got_AcceptPartyInvite(UINT8 **cp, INT32 playernum); @@ -221,6 +222,11 @@ static void Command_KartGiveItem_f(void); // CLIENT VARIABLES // ========================================================================= +void SendWeaponPref(void); +void SendWeaponPref2(void); +void SendWeaponPref3(void); +void SendWeaponPref4(void); + static CV_PossibleValue_t usemouse_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Force"}, {0, NULL}}; #if (defined (__unix__) && !defined (MSDOS)) || defined(__APPLE__) || defined (UNIXCOMMON) static CV_PossibleValue_t mouse2port_cons_t[] = {{0, "/dev/gpmdata"}, {1, "/dev/ttyS0"}, @@ -624,6 +630,7 @@ void D_RegisterServerCommands(void) Forceskin_cons_t[i].strvalue = NULL; } RegisterNetXCmd(XD_NAMEANDCOLOR, Got_NameAndColor); + RegisterNetXCmd(XD_WEAPONPREF, Got_WeaponPref); RegisterNetXCmd(XD_POWERLEVEL, Got_PowerLevel); RegisterNetXCmd(XD_PARTYINVITE, Got_PartyInvite); RegisterNetXCmd(XD_ACCEPTPARTYINVITE, Got_AcceptPartyInvite); @@ -2093,6 +2100,55 @@ static void Got_NameAndColor(UINT8 **cp, INT32 playernum) SetFollower(playernum, follower); } +void SendWeaponPref(void) +{ + XBOXSTATIC UINT8 buf[1]; + + buf[0] = 0; + if (cv_flipcam.value) + buf[0] |= 1; + SendNetXCmd(XD_WEAPONPREF, buf, 1); +} + +void SendWeaponPref2(void) +{ + XBOXSTATIC UINT8 buf[1]; + + buf[0] = 0; + if (cv_flipcam2.value) + buf[0] |= 1; + SendNetXCmd2(XD_WEAPONPREF, buf, 1); +} + +void SendWeaponPref3(void) +{ + XBOXSTATIC UINT8 buf[1]; + + buf[0] = 0; + if (cv_flipcam3.value) + buf[0] |= 1; + SendNetXCmd3(XD_WEAPONPREF, buf, 1); +} + +void SendWeaponPref4(void) +{ + XBOXSTATIC UINT8 buf[1]; + + buf[0] = 0; + if (cv_flipcam4.value) + buf[0] |= 1; + SendNetXCmd4(XD_WEAPONPREF, buf, 1); +} + +static void Got_WeaponPref(UINT8 **cp,INT32 playernum) +{ + UINT8 prefs = READUINT8(*cp); + + players[playernum].pflags &= ~(PF_FLIPCAM); + if (prefs & 1) + players[playernum].pflags |= PF_FLIPCAM; +} + static void Got_PowerLevel(UINT8 **cp,INT32 playernum) { UINT16 race = (UINT16)READUINT16(*cp); @@ -2300,6 +2356,13 @@ void D_SendPlayerConfig(void) SendNameAndColor3(); if (splitscreen > 2) SendNameAndColor4(); + SendWeaponPref(); + if (splitscreen) + SendWeaponPref2(); + if (splitscreen > 1) + SendWeaponPref3(); + if (splitscreen > 2) + SendWeaponPref4(); { UINT8 buf[4]; diff --git a/src/d_player.h b/src/d_player.h index 8ee63ca20..4ae420052 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -56,70 +56,72 @@ typedef enum // typedef enum { + // Flip camera angle with gravity flip prefrence. + PF_FLIPCAM = 1, // Cheats - PF_GODMODE = 1, - PF_NOCLIP = 1<<1, - PF_INVIS = 1<<2, + PF_GODMODE = 1<<1, + PF_NOCLIP = 1<<2, + PF_INVIS = 1<<3, // True if button down last tic. - PF_ATTACKDOWN = 1<<3, - PF_USEDOWN = 1<<4, - PF_JUMPDOWN = 1<<5, - PF_WPNDOWN = 1<<6, + PF_ATTACKDOWN = 1<<4, + PF_USEDOWN = 1<<5, + PF_JUMPDOWN = 1<<6, + PF_WPNDOWN = 1<<7, // Unmoving states - PF_STASIS = 1<<7, // Player is not allowed to move - PF_JUMPSTASIS = 1<<8, // and that includes jumping. + PF_STASIS = 1<<8, // Player is not allowed to move + PF_JUMPSTASIS = 1<<9, // and that includes jumping. PF_FULLSTASIS = PF_STASIS|PF_JUMPSTASIS, // Did you get a time-over? - PF_TIMEOVER = 1<<9, + PF_TIMEOVER = 1<<10, // SRB2Kart: Spectator that wants to join - PF_WANTSTOJOIN = 1<<10, + PF_WANTSTOJOIN = 1<<11, // Character action status - PF_JUMPED = 1<<11, - PF_SPINNING = 1<<12, - PF_STARTDASH = 1<<13, - PF_THOKKED = 1<<14, + PF_JUMPED = 1<<12, + PF_SPINNING = 1<<13, + PF_STARTDASH = 1<<14, + PF_THOKKED = 1<<15, // Are you gliding? - PF_GLIDING = 1<<15, + PF_GLIDING = 1<<16, // Tails pickup! - PF_CARRIED = 1<<16, + PF_CARRIED = 1<<17, // Sliding (usually in water) like Labyrinth/Oil Ocean - PF_SLIDING = 1<<17, + PF_SLIDING = 1<<18, // Hanging on a rope - PF_ROPEHANG = 1<<18, + PF_ROPEHANG = 1<<19, // Hanging on an item of some kind - zipline, chain, etc. (->tracer) - PF_ITEMHANG = 1<<19, + PF_ITEMHANG = 1<<20, // On the mace chain spinning around (->tracer) - PF_MACESPIN = 1<<20, + PF_MACESPIN = 1<<21, /*** NIGHTS STUFF ***/ // Is the player in NiGHTS mode? - PF_NIGHTSMODE = 1<<21, - PF_TRANSFERTOCLOSEST = 1<<22, + PF_NIGHTSMODE = 1<<22, + PF_TRANSFERTOCLOSEST = 1<<23, // Spill rings after falling - PF_NIGHTSFALL = 1<<23, - PF_DRILLING = 1<<24, - PF_SKIDDOWN = 1<<25, + PF_NIGHTSFALL = 1<<24, + PF_DRILLING = 1<<25, + PF_SKIDDOWN = 1<<26, /*** TAG STUFF ***/ - PF_TAGGED = 1<<26, // Player has been tagged and awaits the next round in hide and seek. - PF_TAGIT = 1<<27, // The player is it! For Tag Mode + PF_TAGGED = 1<<27, // Player has been tagged and awaits the next round in hide and seek. + PF_TAGIT = 1<<28, // The player is it! For Tag Mode /*** misc ***/ - PF_FORCESTRAFE = 1<<28, // Turning inputs are translated into strafing inputs - PF_HITFINISHLINE = 1<<29, // Already hit the finish line this tic + PF_FORCESTRAFE = 1<<29, // Turning inputs are translated into strafing inputs + PF_HITFINISHLINE = 1<<30, // Already hit the finish line this tic // free: 1<<30 and 1<<31 } pflags_t; diff --git a/src/dehacked.c b/src/dehacked.c index 92e80a475..372863bd5 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8481,6 +8481,9 @@ static const char *const MAPTHINGFLAG_LIST[4] = { #endif static const char *const PLAYERFLAG_LIST[] = { + // Flip camera angle with gravity flip prefrence. + "FLIPCAM", + // Cheats "GODMODE", "NOCLIP", diff --git a/src/g_game.c b/src/g_game.c index fed573d13..1b994ede1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1506,7 +1506,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // spectator aiming shit, ahhhh... { INT32 player_invert = invertmouse ? -1 : 1; - INT32 screen_invert = (player->mo && (player->mo->eflags & MFE_VERTICALFLIP) && (!thiscam->chase)) ? -1 : 1; // set to -1 or 1 to multiply + INT32 screen_invert = + (player->mo && (player->mo->eflags & MFE_VERTICALFLIP) + && (!thiscam->chase || player->pflags & PF_FLIPCAM)) //because chasecam's not inverted + ? -1 : 1; // set to -1 or 1 to multiply // mouse look stuff (mouse look is not the same as mouse aim) if (mouseaiming && player->spectator) @@ -1674,7 +1677,7 @@ static void Analog_OnChange(void) } */ - //SendWeaponPref(); + SendWeaponPref(); } static void Analog2_OnChange(void) @@ -1691,7 +1694,7 @@ static void Analog2_OnChange(void) } */ - //SendWeaponPref2(); + SendWeaponPref2(); } static void Analog3_OnChange(void) @@ -1708,7 +1711,7 @@ static void Analog3_OnChange(void) } */ - //SendWeaponPref3(); + SendWeaponPref3(); } static void Analog4_OnChange(void) @@ -1725,7 +1728,7 @@ static void Analog4_OnChange(void) } */ - //SendWeaponPref4(); + SendWeaponPref4(); } // @@ -2616,7 +2619,7 @@ void G_PlayerReborn(INT32 player) jointime = players[player].jointime; splitscreenindex = players[player].splitscreenindex; spectator = players[player].spectator; - pflags = (players[player].pflags & (PF_TIMEOVER|PF_TAGIT|PF_TAGGED|PF_WANTSTOJOIN)); + pflags = (players[player].pflags & (PF_TIMEOVER|PF_FLIPCAM|PF_TAGIT|PF_TAGGED|PF_WANTSTOJOIN)); // As long as we're not in multiplayer, carry over cheatcodes from map to map if (!(netgame || multiplayer)) diff --git a/src/p_mobj.c b/src/p_mobj.c index 027655f47..2547f3212 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1168,6 +1168,26 @@ static void P_PlayerFlip(mobj_t *mo) if (mo->tracer) mo->tracer->eflags ^= MFE_VERTICALFLIP; } + else if (mo->player->pflags & PF_FLIPCAM) + { + UINT8 i; + + mo->player->aiming = InvAngle(mo->player->aiming); + + for (i = 0; i <= r_splitscreen; i++) + { + if (mo->player-players == displayplayers[i]) + { + localaiming[i] = mo->player->aiming; + if (camera[i].chase) { + camera[i].aiming = InvAngle(camera[i].aiming); + camera[i].z = mo->z - camera[i].z + mo->z; + if (mo->eflags & MFE_VERTICALFLIP) + camera[i].z += FixedMul(20*FRACUNIT, mo->scale); + } + } + } + } } // @@ -3579,6 +3599,8 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled if (encoremode) postimg = postimg_mirror; + else if (player->pflags & PF_FLIPCAM && !(player->pflags & PF_NIGHTSMODE) && player->mo->eflags & MFE_VERTICALFLIP) + postimg = postimg_flip; else if (player->awayviewtics && player->awayviewmobj && !P_MobjWasRemoved(player->awayviewmobj)) // Camera must obviously exist { camera_t dummycam; @@ -7037,6 +7059,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->eflags & MFE_VERTICALFLIP) { mobj->z = mobj->target->z - FixedMul(16*FRACUNIT, mobj->target->scale) - mobj->height; + if (mobj->target->player->pflags & PF_FLIPCAM) + mobj->eflags |= MFE_VERTICALFLIP; } else mobj->z = mobj->target->z + (mobj->target->height) + FixedMul(8*FRACUNIT, mobj->target->scale); // Adjust height for height changes diff --git a/src/r_main.c b/src/r_main.c index 15278e66f..5f7b0cadd 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -151,6 +151,10 @@ static void ChaseCam_OnChange(void); static void ChaseCam2_OnChange(void); static void ChaseCam3_OnChange(void); static void ChaseCam4_OnChange(void); +static void FlipCam_OnChange(void); +static void FlipCam2_OnChange(void); +static void FlipCam3_OnChange(void); +static void FlipCam4_OnChange(void); void SendWeaponPref(void); void SendWeaponPref2(void); void SendWeaponPref3(void); @@ -161,6 +165,10 @@ consvar_t cv_chasecam = {"chasecam", "On", CV_CALL, CV_OnOff, ChaseCam_OnChange, consvar_t cv_chasecam2 = {"chasecam2", "On", CV_CALL, CV_OnOff, ChaseCam2_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_chasecam3 = {"chasecam3", "On", CV_CALL, CV_OnOff, ChaseCam3_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_chasecam4 = {"chasecam4", "On", CV_CALL, CV_OnOff, ChaseCam4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_flipcam = {"flipcam", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_flipcam2 = {"flipcam2", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam2_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_flipcam3 = {"flipcam3", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam3_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_flipcam4 = {"flipcam4", "No", CV_SAVE|CV_CALL|CV_NOINIT, CV_YesNo, FlipCam4_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_shadow = {"shadow", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skybox = {"skybox", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -274,6 +282,27 @@ static void ChaseCam4_OnChange(void) else CV_SetValue(&cv_analog4, 1);*/ } + +static void FlipCam_OnChange(void) +{ + SendWeaponPref(); +} + +static void FlipCam2_OnChange(void) +{ + SendWeaponPref2(); +} + +static void FlipCam3_OnChange(void) +{ + SendWeaponPref3(); +} + +static void FlipCam4_OnChange(void) +{ + SendWeaponPref4(); +} + // // R_PointOnSide // Traverse BSP (sub) tree, @@ -1459,6 +1488,10 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_soniccd); CV_RegisterVar(&cv_allowmlook); CV_RegisterVar(&cv_homremoval); + CV_RegisterVar(&cv_flipcam); + CV_RegisterVar(&cv_flipcam2); + CV_RegisterVar(&cv_flipcam3); + CV_RegisterVar(&cv_flipcam4); // Enough for dedicated server if (dedicated) diff --git a/src/r_main.h b/src/r_main.h index ea6f6aa87..879d4c6eb 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -75,6 +75,7 @@ boolean R_DoCulling(line_t *cullheight, line_t *viewcullheight, fixed_t vz, fixe extern consvar_t cv_showhud, cv_translucenthud; extern consvar_t cv_homremoval; extern consvar_t cv_chasecam, cv_chasecam2, cv_chasecam3, cv_chasecam4; +extern consvar_t cv_flipcam, cv_flipcam2, cv_flipcam3, cv_flipcam4; extern consvar_t cv_shadow; extern consvar_t cv_translucency; extern consvar_t /*cv_precipdensity,*/ cv_drawdist, /*cv_drawdist_nights,*/ cv_drawdist_precip;