Port addfilelocal from saturn

Modified to turn off features we don't have / prevent resyncs
This commit is contained in:
NepDisk 2025-09-14 01:00:11 -04:00
parent 2a669a665e
commit 72596e8d03
7 changed files with 66 additions and 16 deletions

View file

@ -184,6 +184,7 @@ static void Command_AcceptInvite_f(void);
static void Command_RejectInvite_f(void); static void Command_RejectInvite_f(void);
static void Command_LeaveParty_f(void); static void Command_LeaveParty_f(void);
static void Command_Addfilelocal(void);
static void Command_Addfile(void); static void Command_Addfile(void);
static void Command_ListWADS_f(void); static void Command_ListWADS_f(void);
static void Command_ListDoomednums_f(void); static void Command_ListDoomednums_f(void);
@ -858,6 +859,7 @@ void D_RegisterServerCommands(void)
COM_AddCommand("showmap", Command_Showmap_f); COM_AddCommand("showmap", Command_Showmap_f);
COM_AddCommand("maphash", Command_Maphash_f); COM_AddCommand("maphash", Command_Maphash_f);
COM_AddCommand("addfilelocal", Command_Addfilelocal);
COM_AddCommand("addfile", Command_Addfile); COM_AddCommand("addfile", Command_Addfile);
COM_AddCommand("listwad", Command_ListWADS_f); COM_AddCommand("listwad", Command_ListWADS_f);
COM_AddCommand("listmapthings", Command_ListDoomednums_f); COM_AddCommand("listmapthings", Command_ListDoomednums_f);
@ -4763,6 +4765,44 @@ static void Got_RunSOCcmd(UINT8 **cp, INT32 playernum)
G_SetGameModified(true, false); G_SetGameModified(true, false);
} }
static void Command_Addfilelocal(void)
{
const char *fn;
INT32 i;
size_t docompat = COM_CheckPartialParm("-c");
size_t nocompat = COM_CheckPartialParm("-n");
wadcompat_t compat = WC_AUTO;
if (docompat && nocompat)
{
CONS_Printf(M_GetText("Please specify only one of -c or -n\n"));
return;
}
else if (docompat)
compat = WC_ON;
else if (nocompat)
compat = WC_OFF;
if (COM_Argc() != 2 + (docompat || nocompat))
{
CONS_Printf(M_GetText("addfilelocal [-c|-n] <filename.pk3/wad/lua/soc>: Load local add-on\n"
"-c forces compatmode, -n disables it.\n"));
return;
}
else
fn = COM_Argv(1);
// Disallow non-printing characters and semicolons.
for (i = 0; fn[i] != '\0'; i++)
if (!isprint(fn[i]) || fn[i] == ';')
return;
// Add any wad file, ignoring checks for if it contains complex things like
// lua. Great for complex but client-side customizations, like different
// level cards or anything like that.
P_AddWadFile(fn, compat, true);
}
/** Adds a pwad at runtime. /** Adds a pwad at runtime.
* Searches for sounds, maps, music, new images. * Searches for sounds, maps, music, new images.
*/ */
@ -4856,7 +4896,7 @@ static void Command_Addfile(void)
// Add file on your client directly if it is trivial, or you aren't in a netgame. // Add file on your client directly if it is trivial, or you aren't in a netgame.
if (!(netgame || multiplayer) || musiconly) if (!(netgame || multiplayer) || musiconly)
{ {
P_AddWadFile(fn, compat); P_AddWadFile(fn, compat, false);
addedfiles[numfilesadded++] = fn; addedfiles[numfilesadded++] = fn;
continue; continue;
} }
@ -4996,7 +5036,7 @@ static void Got_Addfilecmd(UINT8 **cp, INT32 playernum)
ncs = findfile(filename, filehash, true); ncs = findfile(filename, filehash, true);
if (ncs != FS_FOUND || !P_AddWadFile(filename, compat)) if (ncs != FS_FOUND || !P_AddWadFile(filename, compat, false))
{ {
Command_ExitGame_f(); Command_ExitGame_f();
if (ncs == FS_FOUND) if (ncs == FS_FOUND)

View file

@ -563,7 +563,7 @@ INT32 CL_CheckFiles(void)
// CONS_Printf("checking %d of %d / %d of %d?\n", i, fileneedednum, j, numwadfiles); // CONS_Printf("checking %d of %d / %d of %d?\n", i, fileneedednum, j, numwadfiles);
// CONS_Printf("i: %s / j: %s \n", fileneeded[i].filename, wadfiles[j]->filename); // CONS_Printf("i: %s / j: %s \n", fileneeded[i].filename, wadfiles[j]->filename);
if (j < numwadfiles && !wadfiles[j]->important) if (j < numwadfiles && !wadfiles[j]->important && !wadfiles[j]->localfile)
{ {
// Unimportant on our side. // Unimportant on our side.
++j; ++j;
@ -656,7 +656,7 @@ boolean CL_LoadServerFiles(void)
continue; // Already loaded continue; // Already loaded
else if (fileneeded[i].status == FS_FOUND) else if (fileneeded[i].status == FS_FOUND)
{ {
P_PartialAddWadFile(fileneeded[i].filename, fileneeded[i].compatmode ? WC_ON : WC_OFF); P_PartialAddWadFile(fileneeded[i].filename, fileneeded[i].compatmode ? WC_ON : WC_OFF, false);
G_SetGameModified(true, false); G_SetGameModified(true, false);
fileneeded[i].status = FS_OPEN; fileneeded[i].status = FS_OPEN;
return false; return false;

View file

@ -3082,7 +3082,7 @@ static void G_LoadDemoExtraFiles(demoheader_t *header)
} }
else else
{ {
P_PartialAddWadFile(file->filename, file->compatmode ? WC_ON : WC_OFF); P_PartialAddWadFile(file->filename, file->compatmode ? WC_ON : WC_OFF, false);
} }
} }
} }

View file

@ -9128,7 +9128,7 @@ boolean P_RunSOC(const char *socfilename)
lumpnum_t lump; lumpnum_t lump;
if (strstr(socfilename, ".soc") != NULL) if (strstr(socfilename, ".soc") != NULL)
return P_AddWadFile(socfilename, WC_AUTO); return P_AddWadFile(socfilename, WC_AUTO, false);
lump = W_CheckNumForName(socfilename); lump = W_CheckNumForName(socfilename);
if (lump == LUMPERROR) if (lump == LUMPERROR)
@ -9348,11 +9348,11 @@ UINT8 P_InitMapData(boolean existingmapheaders)
// Add a wadfile to the active wad files, // Add a wadfile to the active wad files,
// replace sounds, musics, patches, textures, sprites and maps // replace sounds, musics, patches, textures, sprites and maps
// //
boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat) boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat, boolean local)
{ {
UINT16 wadnum; UINT16 wadnum;
if ((wadnum = P_PartialAddWadFile(wadfilename, compat)) == UINT16_MAX) if ((wadnum = P_PartialAddWadFile(wadfilename, compat, local)) == UINT16_MAX)
return false; return false;
P_MultiSetupWadFiles(true); P_MultiSetupWadFiles(true);
@ -9450,7 +9450,7 @@ static boolean P_CheckVoteReplacements(char *name)
// Add a WAD file and do the per-WAD setup stages. // Add a WAD file and do the per-WAD setup stages.
// Call P_MultiSetupWadFiles as soon as possible after any number of these. // Call P_MultiSetupWadFiles as soon as possible after any number of these.
// //
UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat) UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat, boolean local)
{ {
size_t i; size_t i;
UINT16 numlumps, wadnum; UINT16 numlumps, wadnum;
@ -9486,6 +9486,9 @@ UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat)
{ {
partadd_important = true; partadd_important = true;
} }
wadfiles[wadnum]->localfile = local;
if (partadd_stage != 0) if (partadd_stage != 0)
{ {
partadd_earliestfile = wadnum; partadd_earliestfile = wadnum;
@ -9573,14 +9576,20 @@ UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat)
K_InitBrightmapsPwad(wadnum); K_InitBrightmapsPwad(wadnum);
// Reload TERRAIN // Reload TERRAIN
if (K_InitTerrainPwad(wadnum)) if (!local)
partadd_terrainloaded = true; {
if (K_InitTerrainPwad(wadnum))
partadd_terrainloaded = true;
}
// //
// look for skins // look for skins
// //
R_AddSkins(wadnum); // faB: wadfile index in wadfiles[] if (!local)
R_PatchSkins(wadnum); // toast: PATCH PATCH {
R_AddSkins(wadnum); // faB: wadfile index in wadfiles[]
R_PatchSkins(wadnum); // toast: PATCH PATCH
}
// //
// edit music defs // edit music defs

View file

@ -88,7 +88,7 @@ void P_PostLoadLevel(void);
void HWR_LoadLevel(void); void HWR_LoadLevel(void);
#endif #endif
void P_UnloadLevel(void); void P_UnloadLevel(void);
boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat); boolean P_AddWadFile(const char *wadfilename, wadcompat_t compat, boolean local);
#define MAPRET_ADDED (1) #define MAPRET_ADDED (1)
#define MAPRET_CURRENTREPLACED (1<<1) #define MAPRET_CURRENTREPLACED (1<<1)
@ -100,7 +100,7 @@ extern INT16 wadnamemap;
// WARNING: The following functions should be grouped as follows: // WARNING: The following functions should be grouped as follows:
// any amount of PartialAdds followed by MultiSetups until returned true, // any amount of PartialAdds followed by MultiSetups until returned true,
// as soon as possible. // as soon as possible.
UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat); UINT16 P_PartialAddWadFile(const char *wadfilename, wadcompat_t compat, boolean local);
// Run a single stage of multisetup, or all of them if fullsetup set. // Run a single stage of multisetup, or all of them if fullsetup set.
// fullsetup true: run everything // fullsetup true: run everything
// otherwise // otherwise

View file

@ -1142,7 +1142,7 @@ void I_GetEvent(void)
break; break;
case SDL_DROPFILE: case SDL_DROPFILE:
dropped_filedir = evt.drop.file; dropped_filedir = evt.drop.file;
P_AddWadFile(dropped_filedir, WC_AUTO); P_AddWadFile(dropped_filedir, WC_AUTO, false);
SDL_free(dropped_filedir); // Free dropped_filedir memory SDL_free(dropped_filedir); // Free dropped_filedir memory
break; break;
case SDL_QUIT: case SDL_QUIT:

View file

@ -131,6 +131,7 @@ struct wadfile_t
boolean important; // also network - !W_VerifyNMUSlumps boolean important; // also network - !W_VerifyNMUSlumps
boolean compatmode; boolean compatmode;
boolean localfile;
}; };
typedef enum wadcompat typedef enum wadcompat