mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-05-10 19:01:50 +00:00
Merge branch 'miniladder-16' into 'master'
Miniladder for 1.6 See merge request KartKrew/Kart!754
This commit is contained in:
commit
3b212a1138
15 changed files with 136 additions and 58 deletions
|
|
@ -3927,6 +3927,11 @@ static void HandleConnect(SINT8 node)
|
||||||
// If a server filled out, then it'd overwrite the host and turn everyone into weird husks.....
|
// If a server filled out, then it'd overwrite the host and turn everyone into weird husks.....
|
||||||
// It's too much effort to legimately fix right now. Just prevent it from reaching that state.
|
// It's too much effort to legimately fix right now. Just prevent it from reaching that state.
|
||||||
UINT8 maxplayers = min((dedicated ? MAXPLAYERS-1 : MAXPLAYERS), cv_maxconnections.value);
|
UINT8 maxplayers = min((dedicated ? MAXPLAYERS-1 : MAXPLAYERS), cv_maxconnections.value);
|
||||||
|
UINT8 connectedplayers = 0;
|
||||||
|
|
||||||
|
for (i = dedicated ? 1 : 0; i < MAXPLAYERS; i++)
|
||||||
|
if (playernode[i] != UINT8_MAX) // We use this to count players because it is affected by SV_AddWaitingPlayers when more than one client joins on the same tic, unlike playeringame and D_NumPlayers. UINT8_MAX denotes no node for that player
|
||||||
|
connectedplayers++;
|
||||||
|
|
||||||
if (bannednode && bannednode[node].banid != SIZE_MAX)
|
if (bannednode && bannednode[node].banid != SIZE_MAX)
|
||||||
{
|
{
|
||||||
|
|
@ -3984,7 +3989,7 @@ static void HandleConnect(SINT8 node)
|
||||||
{
|
{
|
||||||
SV_SendRefuse(node, M_GetText("The server is not accepting\njoins for the moment."));
|
SV_SendRefuse(node, M_GetText("The server is not accepting\njoins for the moment."));
|
||||||
}
|
}
|
||||||
else if (D_NumPlayers() >= maxplayers)
|
else if (connectedplayers >= maxplayers)
|
||||||
{
|
{
|
||||||
SV_SendRefuse(node, va(M_GetText("Maximum players reached: %d"), maxplayers));
|
SV_SendRefuse(node, va(M_GetText("Maximum players reached: %d"), maxplayers));
|
||||||
}
|
}
|
||||||
|
|
@ -3992,7 +3997,7 @@ static void HandleConnect(SINT8 node)
|
||||||
{
|
{
|
||||||
SV_SendRefuse(node, M_GetText("Too many players from\nthis node."));
|
SV_SendRefuse(node, M_GetText("Too many players from\nthis node."));
|
||||||
}
|
}
|
||||||
else if (netgame && D_NumPlayers() + netbuffer->u.clientcfg.localplayers > maxplayers)
|
else if (netgame && connectedplayers + netbuffer->u.clientcfg.localplayers > maxplayers)
|
||||||
{
|
{
|
||||||
SV_SendRefuse(node, va(M_GetText("Number of local players\nwould exceed maximum: %d"), maxplayers));
|
SV_SendRefuse(node, va(M_GetText("Number of local players\nwould exceed maximum: %d"), maxplayers));
|
||||||
}
|
}
|
||||||
|
|
@ -5475,14 +5480,6 @@ boolean TryRunTics(tic_t realtics)
|
||||||
|
|
||||||
if (ticking)
|
if (ticking)
|
||||||
{
|
{
|
||||||
if (advancedemo)
|
|
||||||
{
|
|
||||||
if (timedemo_quit)
|
|
||||||
COM_ImmedExecute("quit");
|
|
||||||
else
|
|
||||||
D_StartTitle();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// run the count * tics
|
// run the count * tics
|
||||||
while (neededtic > gametic)
|
while (neededtic > gametic)
|
||||||
|
|
|
||||||
11
src/d_main.c
11
src/d_main.c
|
|
@ -131,7 +131,6 @@ INT32 postimgparam[MAXSPLITSCREENPLAYERS];
|
||||||
boolean sound_disabled = false;
|
boolean sound_disabled = false;
|
||||||
boolean digital_disabled = false;
|
boolean digital_disabled = false;
|
||||||
|
|
||||||
boolean advancedemo;
|
|
||||||
#ifdef DEBUGFILE
|
#ifdef DEBUGFILE
|
||||||
INT32 debugload = 0;
|
INT32 debugload = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -913,15 +912,6 @@ void D_SRB2Loop(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// D_AdvanceDemo
|
|
||||||
// Called after each demo or intro demosequence finishes
|
|
||||||
//
|
|
||||||
void D_AdvanceDemo(void)
|
|
||||||
{
|
|
||||||
advancedemo = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
// D_SRB2Main
|
// D_SRB2Main
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
@ -997,7 +987,6 @@ void D_StartTitle(void)
|
||||||
//demosequence = -1;
|
//demosequence = -1;
|
||||||
G_SetGametype(GT_RACE); // SRB2kart
|
G_SetGametype(GT_RACE); // SRB2kart
|
||||||
paused = false;
|
paused = false;
|
||||||
advancedemo = false;
|
|
||||||
|
|
||||||
// clear cmd building stuff
|
// clear cmd building stuff
|
||||||
memset(gamekeydown, 0, sizeof (gamekeydown));
|
memset(gamekeydown, 0, sizeof (gamekeydown));
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,6 @@
|
||||||
#include "d_event.h"
|
#include "d_event.h"
|
||||||
#include "w_wad.h" // for MAX_WADFILES
|
#include "w_wad.h" // for MAX_WADFILES
|
||||||
|
|
||||||
extern boolean advancedemo;
|
|
||||||
|
|
||||||
// make sure not to write back the config until it's been correctly loaded
|
// make sure not to write back the config until it's been correctly loaded
|
||||||
extern tic_t rendergametic;
|
extern tic_t rendergametic;
|
||||||
|
|
||||||
|
|
@ -52,7 +50,6 @@ const char *D_Home(void);
|
||||||
//
|
//
|
||||||
// BASE LEVEL
|
// BASE LEVEL
|
||||||
//
|
//
|
||||||
void D_AdvanceDemo(void);
|
|
||||||
void D_StartTitle(void);
|
void D_StartTitle(void);
|
||||||
|
|
||||||
#endif //__D_MAIN__
|
#endif //__D_MAIN__
|
||||||
|
|
|
||||||
|
|
@ -224,7 +224,10 @@ void readfreeslots(MYFILE *f)
|
||||||
// TODO: Out-of-slots warnings/errors.
|
// TODO: Out-of-slots warnings/errors.
|
||||||
// TODO: Name too long (truncated) warnings.
|
// TODO: Name too long (truncated) warnings.
|
||||||
if (fastcmp(type, "SFX"))
|
if (fastcmp(type, "SFX"))
|
||||||
|
{
|
||||||
|
CONS_Printf("Sound sfx_%s allocated.\n",word);
|
||||||
S_AddSoundFx(word, false, 0, false);
|
S_AddSoundFx(word, false, 0, false);
|
||||||
|
}
|
||||||
else if (fastcmp(type, "SPR"))
|
else if (fastcmp(type, "SPR"))
|
||||||
{
|
{
|
||||||
for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++)
|
for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++)
|
||||||
|
|
@ -238,39 +241,54 @@ void readfreeslots(MYFILE *f)
|
||||||
// Found a free slot!
|
// Found a free slot!
|
||||||
strncpy(sprnames[i],word,4);
|
strncpy(sprnames[i],word,4);
|
||||||
//sprnames[i][4] = 0;
|
//sprnames[i][4] = 0;
|
||||||
|
CONS_Printf("Sprite SPR_%s allocated.\n",word);
|
||||||
used_spr[(i-SPR_FIRSTFREESLOT)/8] |= 1<<(i%8); // Okay, this sprite slot has been named now.
|
used_spr[(i-SPR_FIRSTFREESLOT)/8] |= 1<<(i%8); // Okay, this sprite slot has been named now.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (i > SPR_LASTFREESLOT)
|
||||||
|
I_Error("Out of Sprite Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "S"))
|
else if (fastcmp(type, "S"))
|
||||||
{
|
{
|
||||||
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
for (i = 0; i < NUMSTATEFREESLOTS; i++)
|
||||||
if (!FREE_STATES[i]) {
|
if (!FREE_STATES[i]) {
|
||||||
|
CONS_Printf("State S_%s allocated.\n",word);
|
||||||
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||||
strcpy(FREE_STATES[i],word);
|
strcpy(FREE_STATES[i],word);
|
||||||
freeslotusage[0][0]++;
|
freeslotusage[0][0]++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (i == NUMSTATEFREESLOTS)
|
||||||
|
I_Error("Out of State Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "MT"))
|
else if (fastcmp(type, "MT"))
|
||||||
{
|
{
|
||||||
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
for (i = 0; i < NUMMOBJFREESLOTS; i++)
|
||||||
if (!FREE_MOBJS[i]) {
|
if (!FREE_MOBJS[i]) {
|
||||||
|
CONS_Printf("MobjType MT_%s allocated.\n",word);
|
||||||
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||||
strcpy(FREE_MOBJS[i],word);
|
strcpy(FREE_MOBJS[i],word);
|
||||||
freeslotusage[1][0]++;
|
freeslotusage[1][0]++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (i == NUMMOBJFREESLOTS)
|
||||||
|
I_Error("Out of Mobj Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "SKINCOLOR"))
|
else if (fastcmp(type, "SKINCOLOR"))
|
||||||
{
|
{
|
||||||
for (i = 0; i < NUMCOLORFREESLOTS; i++)
|
for (i = 0; i < NUMCOLORFREESLOTS; i++)
|
||||||
if (!FREE_SKINCOLORS[i]) {
|
if (!FREE_SKINCOLORS[i]) {
|
||||||
|
CONS_Printf("Skincolor SKINCOLOR_%s allocated.\n",word);
|
||||||
FREE_SKINCOLORS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
FREE_SKINCOLORS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
|
||||||
strcpy(FREE_SKINCOLORS[i],word);
|
strcpy(FREE_SKINCOLORS[i],word);
|
||||||
M_AddMenuColor(numskincolors++);
|
M_AddMenuColor(numskincolors++);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (i == NUMCOLORFREESLOTS)
|
||||||
|
I_Error("Out of Skincolor Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "SPR2"))
|
else if (fastcmp(type, "SPR2"))
|
||||||
{
|
{
|
||||||
|
|
@ -287,7 +305,7 @@ void readfreeslots(MYFILE *f)
|
||||||
spr2defaults[free_spr2] = 0;
|
spr2defaults[free_spr2] = 0;
|
||||||
spr2names[free_spr2++][4] = 0;
|
spr2names[free_spr2++][4] = 0;
|
||||||
} else
|
} else
|
||||||
deh_warning("Ran out of free SPR2 slots!\n");
|
I_Error("Out of SPR2 Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
}
|
}
|
||||||
else if (fastcmp(type, "TOL"))
|
else if (fastcmp(type, "TOL"))
|
||||||
{
|
{
|
||||||
|
|
@ -302,7 +320,7 @@ void readfreeslots(MYFILE *f)
|
||||||
|
|
||||||
// We don't, so freeslot it.
|
// We don't, so freeslot it.
|
||||||
if (lastcustomtol == (UINT32)MAXTOL) // Unless you have way too many, since they're flags.
|
if (lastcustomtol == (UINT32)MAXTOL) // Unless you have way too many, since they're flags.
|
||||||
deh_warning("Ran out of free typeoflevel slots!\n");
|
I_Error("Out of Typeoflevel Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
G_AddTOL(lastcustomtol, word);
|
G_AddTOL(lastcustomtol, word);
|
||||||
|
|
@ -326,7 +344,7 @@ void readfreeslots(MYFILE *f)
|
||||||
precipprops[i].name = Z_StrDup(word);
|
precipprops[i].name = Z_StrDup(word);
|
||||||
precip_freeslot++;
|
precip_freeslot++;
|
||||||
} else
|
} else
|
||||||
deh_warning("Ran out of free PRECIP slots!\n");
|
I_Error("Out of Precipitation Freeslots while allocating \"%s\"\nLoad less addons to fix this.", word);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
deh_warning("Freeslots: unknown enum class '%s' for '%s_%s'", type, type, word);
|
deh_warning("Freeslots: unknown enum class '%s' for '%s_%s'", type, type, word);
|
||||||
|
|
|
||||||
14
src/g_demo.c
14
src/g_demo.c
|
|
@ -2006,7 +2006,7 @@ void G_BeginRecording(void)
|
||||||
if (wadfiles[i]->important)
|
if (wadfiles[i]->important)
|
||||||
{
|
{
|
||||||
nameonly(( filename = va("%s", wadfiles[i]->filename) ));
|
nameonly(( filename = va("%s", wadfiles[i]->filename) ));
|
||||||
WRITESTRINGN(demo_p, filename, 64);
|
WRITESTRINGL(demo_p, filename, MAX_WADPATH);
|
||||||
WRITEMEM(demo_p, wadfiles[i]->md5sum, 16);
|
WRITEMEM(demo_p, wadfiles[i]->md5sum, 16);
|
||||||
|
|
||||||
totalfiles++;
|
totalfiles++;
|
||||||
|
|
@ -3727,7 +3727,11 @@ static void G_StopTimingDemo(void)
|
||||||
|
|
||||||
if (restorecv_vidwait != cv_vidwait.value)
|
if (restorecv_vidwait != cv_vidwait.value)
|
||||||
CV_SetValue(&cv_vidwait, restorecv_vidwait);
|
CV_SetValue(&cv_vidwait, restorecv_vidwait);
|
||||||
D_AdvanceDemo();
|
|
||||||
|
if (timedemo_quit)
|
||||||
|
COM_ImmedExecute("quit");
|
||||||
|
else
|
||||||
|
D_StartTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset engine variable set for the demos
|
// reset engine variable set for the demos
|
||||||
|
|
@ -3786,10 +3790,12 @@ boolean G_CheckDemoStatus(void)
|
||||||
{
|
{
|
||||||
G_StopDemo();
|
G_StopDemo();
|
||||||
|
|
||||||
if (modeattacking)
|
if (timedemo_quit)
|
||||||
|
COM_ImmedExecute("quit");
|
||||||
|
else if (modeattacking)
|
||||||
M_EndModeAttackRun();
|
M_EndModeAttackRun();
|
||||||
else
|
else
|
||||||
D_AdvanceDemo();
|
D_StartTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -3898,6 +3898,18 @@ static void M_DrawReplayHutReplayInfo(menudemo_t *demoref)
|
||||||
if (demoref->gametype == GT_RACE)
|
if (demoref->gametype == GT_RACE)
|
||||||
{
|
{
|
||||||
V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "TIME");
|
V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "TIME");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "SCORE");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (demoref->standings[0].timeorscore == (UINT32_MAX-1))
|
||||||
|
{
|
||||||
|
V_DrawThinString(x+32, y+39, V_SNAPTOTOP, "NO CONTEST");
|
||||||
|
}
|
||||||
|
else if (demoref->gametype == GT_RACE)
|
||||||
|
{
|
||||||
V_DrawRightAlignedString(x+84, y+40, V_SNAPTOTOP, va("%d'%02d\"%02d",
|
V_DrawRightAlignedString(x+84, y+40, V_SNAPTOTOP, va("%d'%02d\"%02d",
|
||||||
G_TicsToMinutes(demoref->standings[0].timeorscore, true),
|
G_TicsToMinutes(demoref->standings[0].timeorscore, true),
|
||||||
G_TicsToSeconds(demoref->standings[0].timeorscore),
|
G_TicsToSeconds(demoref->standings[0].timeorscore),
|
||||||
|
|
@ -3906,7 +3918,6 @@ static void M_DrawReplayHutReplayInfo(menudemo_t *demoref)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "SCORE");
|
|
||||||
V_DrawString(x+32, y+40, V_SNAPTOTOP, va("%d", demoref->standings[0].timeorscore));
|
V_DrawString(x+32, y+40, V_SNAPTOTOP, va("%d", demoref->standings[0].timeorscore));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3915,7 +3926,7 @@ static void M_DrawReplayHutReplayInfo(menudemo_t *demoref)
|
||||||
// Lat: 08/06/2020: For some reason missing skins have their value set to 255 (don't even ask me why I didn't write this)
|
// Lat: 08/06/2020: For some reason missing skins have their value set to 255 (don't even ask me why I didn't write this)
|
||||||
// and for an even STRANGER reason this passes the first check below, so we're going to make sure that the skin here ISN'T 255 before we do anything stupid.
|
// and for an even STRANGER reason this passes the first check below, so we're going to make sure that the skin here ISN'T 255 before we do anything stupid.
|
||||||
|
|
||||||
if (demoref->standings[0].skin != 0xFF)
|
if (demoref->standings[0].skin < numskins)
|
||||||
{
|
{
|
||||||
patch = faceprefix[demoref->standings[0].skin][FACE_WANTED];
|
patch = faceprefix[demoref->standings[0].skin][FACE_WANTED];
|
||||||
colormap = R_GetTranslationColormap(
|
colormap = R_GetTranslationColormap(
|
||||||
|
|
@ -4116,7 +4127,7 @@ void M_DrawReplayStartMenu(void)
|
||||||
// Lat: 08/06/2020: For some reason missing skins have their value set to 255 (don't even ask me why I didn't write this)
|
// Lat: 08/06/2020: For some reason missing skins have their value set to 255 (don't even ask me why I didn't write this)
|
||||||
// and for an even STRANGER reason this passes the first check below, so we're going to make sure that the skin here ISN'T 255 before we do anything stupid.
|
// and for an even STRANGER reason this passes the first check below, so we're going to make sure that the skin here ISN'T 255 before we do anything stupid.
|
||||||
|
|
||||||
if (demoref->standings[i].skin != 0xFF)
|
if (demoref->standings[i].skin < numskins)
|
||||||
{
|
{
|
||||||
patch = faceprefix[demoref->standings[i].skin][FACE_RANK];
|
patch = faceprefix[demoref->standings[i].skin][FACE_RANK];
|
||||||
colormap = R_GetTranslationColormap(
|
colormap = R_GetTranslationColormap(
|
||||||
|
|
|
||||||
36
src/p_mobj.c
36
src/p_mobj.c
|
|
@ -10769,21 +10769,41 @@ void P_RemovePrecipMobj(precipmobj_t *mobj)
|
||||||
void P_RemoveSavegameMobj(mobj_t *mobj)
|
void P_RemoveSavegameMobj(mobj_t *mobj)
|
||||||
{
|
{
|
||||||
// unlink from sector and block lists
|
// unlink from sector and block lists
|
||||||
P_UnsetThingPosition(mobj);
|
if (((thinker_t *)mobj)->function.acp1 == (actionf_p1)P_NullPrecipThinker)
|
||||||
|
|
||||||
// Remove touching_sectorlist from mobj.
|
|
||||||
if (sector_list)
|
|
||||||
{
|
{
|
||||||
P_DelSeclist(sector_list);
|
P_UnsetPrecipThingPosition((precipmobj_t *)mobj);
|
||||||
sector_list = NULL;
|
|
||||||
|
if (precipsector_list)
|
||||||
|
{
|
||||||
|
P_DelPrecipSeclist(precipsector_list);
|
||||||
|
precipsector_list = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// unlink from sector and block lists
|
||||||
|
P_UnsetThingPosition(mobj);
|
||||||
|
|
||||||
|
// Remove touching_sectorlist from mobj.
|
||||||
|
if (sector_list)
|
||||||
|
{
|
||||||
|
P_DelSeclist(sector_list);
|
||||||
|
sector_list = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// stop any playing sound
|
// stop any playing sound
|
||||||
S_StopSound(mobj);
|
S_StopSound(mobj);
|
||||||
|
R_RemoveMobjInterpolator(mobj);
|
||||||
|
|
||||||
// free block
|
// free block
|
||||||
P_RemoveThinker((thinker_t *)mobj);
|
// Here we use the same code as R_RemoveThinkerDelayed, but without reference counting (we're removing everything so it shouldn't matter) and without touching currentthinker since we aren't in P_RunThinkers
|
||||||
R_RemoveMobjInterpolator(mobj);
|
{
|
||||||
|
thinker_t *thinker = (thinker_t *)mobj;
|
||||||
|
thinker_t *next = thinker->next;
|
||||||
|
(next->prev = thinker->prev)->next = next;
|
||||||
|
Z_Free(thinker);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static CV_PossibleValue_t respawnitemtime_cons_t[] = {{1, "MIN"}, {300, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t respawnitemtime_cons_t[] = {{1, "MIN"}, {300, "MAX"}, {0, NULL}};
|
||||||
|
|
|
||||||
|
|
@ -3341,6 +3341,19 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
mobj->player->viewz = mobj->player->mo->z + mobj->player->viewheight;
|
mobj->player->viewz = mobj->player->mo->z + mobj->player->viewheight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mobj->type == MT_SKYBOX)
|
||||||
|
{
|
||||||
|
mtag_t tag = mobj->movedir;
|
||||||
|
if (tag < 0 || tag > 15)
|
||||||
|
{
|
||||||
|
CONS_Debug(DBG_GAMELOGIC, "LoadMobjThinker: Skybox ID %d of netloaded object is not between 0 and 15!\n", tag);
|
||||||
|
}
|
||||||
|
else if (mobj->flags2 & MF2_AMBUSH)
|
||||||
|
skyboxcenterpnts[tag] = mobj;
|
||||||
|
else
|
||||||
|
skyboxviewpnts[tag] = mobj;
|
||||||
|
}
|
||||||
|
|
||||||
if (diff2 & MD2_WAYPOINTCAP)
|
if (diff2 & MD2_WAYPOINTCAP)
|
||||||
P_SetTarget(&waypointcap, mobj);
|
P_SetTarget(&waypointcap, mobj);
|
||||||
|
|
||||||
|
|
@ -3968,10 +3981,14 @@ static void P_NetUnArchiveThinkers(void)
|
||||||
{
|
{
|
||||||
next = currentthinker->next;
|
next = currentthinker->next;
|
||||||
|
|
||||||
if (currentthinker->function.acp1 == (actionf_p1)P_MobjThinker)
|
if (currentthinker->function.acp1 == (actionf_p1)P_MobjThinker || currentthinker->function.acp1 == (actionf_p1)P_NullPrecipThinker)
|
||||||
P_RemoveSavegameMobj((mobj_t *)currentthinker); // item isn't saved, don't remove it
|
P_RemoveSavegameMobj((mobj_t *)currentthinker); // item isn't saved, don't remove it
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
(next->prev = currentthinker->prev)->next = next;
|
||||||
|
R_DestroyLevelInterpolators(currentthinker);
|
||||||
Z_Free(currentthinker);
|
Z_Free(currentthinker);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2387,6 +2387,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
|
||||||
camera[i].y += y;
|
camera[i].y += y;
|
||||||
camera[i].z += z;
|
camera[i].z += z;
|
||||||
camera[i].subsector = R_PointInSubsector(camera[i].x, camera[i].y);
|
camera[i].subsector = R_PointInSubsector(camera[i].x, camera[i].y);
|
||||||
|
R_RelativeTeleportViewInterpolation(i, x, y, z, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#include "r_state.h"
|
#include "r_state.h"
|
||||||
#include "s_sound.h"
|
#include "s_sound.h"
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
|
#include "r_fps.h"
|
||||||
|
|
||||||
/** \brief The P_MixUp function
|
/** \brief The P_MixUp function
|
||||||
|
|
||||||
|
|
@ -73,8 +74,12 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
|
||||||
// move chasecam at new player location
|
// move chasecam at new player location
|
||||||
for (i = 0; i <= r_splitscreen; i++)
|
for (i = 0; i <= r_splitscreen; i++)
|
||||||
{
|
{
|
||||||
if (thing->player == &players[displayplayers[i]] && camera[i].chase)
|
if (thing->player != &players[displayplayers[i]])
|
||||||
|
continue;
|
||||||
|
if (camera[i].chase)
|
||||||
P_ResetCamera(thing->player, &camera[i]);
|
P_ResetCamera(thing->player, &camera[i]);
|
||||||
|
R_ResetViewInterpolation(i + 1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't run in place after a teleport
|
// don't run in place after a teleport
|
||||||
|
|
|
||||||
18
src/p_tick.c
18
src/p_tick.c
|
|
@ -24,6 +24,7 @@
|
||||||
#include "lua_hook.h"
|
#include "lua_hook.h"
|
||||||
#include "m_perfstats.h"
|
#include "m_perfstats.h"
|
||||||
#include "i_system.h" // I_GetPreciseTime
|
#include "i_system.h" // I_GetPreciseTime
|
||||||
|
#include "i_video.h" // rendermode
|
||||||
#include "r_main.h"
|
#include "r_main.h"
|
||||||
#include "r_fps.h"
|
#include "r_fps.h"
|
||||||
|
|
||||||
|
|
@ -787,15 +788,20 @@ void P_Ticker(boolean run)
|
||||||
// Hack: ensure newview is assigned every tic.
|
// Hack: ensure newview is assigned every tic.
|
||||||
// Ensures view interpolation is T-1 to T in poor network conditions
|
// Ensures view interpolation is T-1 to T in poor network conditions
|
||||||
// We need a better way to assign view state decoupled from game logic
|
// We need a better way to assign view state decoupled from game logic
|
||||||
for (i = 0; i <= r_splitscreen; i++)
|
if (rendermode != render_none)
|
||||||
{
|
{
|
||||||
player_t *player = &players[displayplayers[i]];
|
for (i = 0; i <= r_splitscreen; i++)
|
||||||
const boolean skybox = (player->skybox.viewpoint && cv_skybox.value); // True if there's a skybox object and skyboxes are on
|
|
||||||
if (skybox)
|
|
||||||
{
|
{
|
||||||
R_SkyboxFrame(i);
|
player_t *player = &players[displayplayers[i]];
|
||||||
|
if (!player->mo)
|
||||||
|
continue;
|
||||||
|
const boolean skybox = (player->skybox.viewpoint && cv_skybox.value); // True if there's a skybox object and skyboxes are on
|
||||||
|
if (skybox)
|
||||||
|
{
|
||||||
|
R_SkyboxFrame(i);
|
||||||
|
}
|
||||||
|
R_SetupFrame(i);
|
||||||
}
|
}
|
||||||
R_SetupFrame(i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -216,6 +216,14 @@ void R_ResetViewInterpolation(UINT8 p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void R_RelativeTeleportViewInterpolation(UINT8 p, fixed_t xdiff, fixed_t ydiff, fixed_t zdiff, angle_t angdiff)
|
||||||
|
{
|
||||||
|
pview_old[p].x += xdiff;
|
||||||
|
pview_old[p].y += ydiff;
|
||||||
|
pview_old[p].z += zdiff;
|
||||||
|
pview_old[p].angle += angdiff;
|
||||||
|
}
|
||||||
|
|
||||||
void R_SetViewContext(enum viewcontext_e _viewcontext)
|
void R_SetViewContext(enum viewcontext_e _viewcontext)
|
||||||
{
|
{
|
||||||
UINT8 i = 0;
|
UINT8 i = 0;
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,8 @@ void R_InterpolateViewRollAngle(fixed_t frac);
|
||||||
void R_UpdateViewInterpolation(void);
|
void R_UpdateViewInterpolation(void);
|
||||||
// Reset the view states (e.g. after level load) so R_InterpolateView doesn't interpolate invalid data
|
// Reset the view states (e.g. after level load) so R_InterpolateView doesn't interpolate invalid data
|
||||||
void R_ResetViewInterpolation(UINT8 p);
|
void R_ResetViewInterpolation(UINT8 p);
|
||||||
|
// Update old view for seamless relative teleport
|
||||||
|
void R_RelativeTeleportViewInterpolation(UINT8 p, fixed_t xdiff, fixed_t ydiff, fixed_t zdiff, angle_t angdiff);
|
||||||
// Set the current view context (the viewvars pointed to by newview)
|
// Set the current view context (the viewvars pointed to by newview)
|
||||||
void R_SetViewContext(enum viewcontext_e _viewcontext);
|
void R_SetViewContext(enum viewcontext_e _viewcontext);
|
||||||
|
|
||||||
|
|
|
||||||
10
src/sounds.c
10
src/sounds.c
|
|
@ -1089,10 +1089,10 @@ sfxinfo_t S_sfx[NUMSFX] =
|
||||||
{"bhurry", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // v1.0.2 Battle overtime
|
{"bhurry", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // v1.0.2 Battle overtime
|
||||||
{"bsnipe", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Banana sniping
|
{"bsnipe", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Banana sniping
|
||||||
{"sploss", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Down to yellow sparks
|
{"sploss", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Down to yellow sparks
|
||||||
{"join", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Player joined server
|
{"join", true, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Player joined server
|
||||||
{"leave", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Player left server
|
{"leave", true, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Player left server
|
||||||
{"requst", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Got a Discord join request
|
{"requst", true, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Got a Discord join request
|
||||||
{"syfail", false, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Funny sync failure
|
{"syfail", true, 96, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Funny sync failure
|
||||||
{"itfree", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // :shitsfree:
|
{"itfree", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // :shitsfree:
|
||||||
{"dbgsal", false, 255, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Debug notification
|
{"dbgsal", false, 255, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Debug notification
|
||||||
{"cock", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Hammer cocks, bang bang
|
{"cock", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Hammer cocks, bang bang
|
||||||
|
|
@ -1353,7 +1353,7 @@ sfxenum_t S_AddSoundFx(const char *name, boolean singular, INT32 flags, boolean
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("No more free sound slots\n"));
|
I_Error("Out of Sound Freeslots while allocating \"%s\"\nLoad less addons to fix this.", name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,9 +99,10 @@ void* vres_GetPatch(virtlump_t *vlump, INT32 tag);
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|
||||||
#define MAX_WADPATH 512
|
#define MAX_WADPATH 512
|
||||||
#define MAX_WADFILES 127 // maximum of wad files used at the same time
|
#define MAX_WADFILES 255 // maximum of wad files used at the same time
|
||||||
// Replay code relies on it being an UINT8 and, just to be safe, in case some wad counter somewhere is a SINT8, you should NOT go above 127 here if you're lazy like me.
|
// Replay code relies on it being an UINT8. There are no SINT8s handling WAD indices, though.
|
||||||
// Besides, are there truly 127 wads worth your interrest?
|
// Can be set all the way up to 255 but not 256,
|
||||||
|
// because an UINT8 will never be >= 256, probably breaking some conditionals.
|
||||||
|
|
||||||
#define lumpcache_t void *
|
#define lumpcache_t void *
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue