droid: new icon from eukara that doesn't have the resized uglyness.

droid: support qw:// scheme
droid: finally added touch.cfg with some crappy programmer art to go with it.
mvd: new name cleanup logic when recording, to avoid some more chars.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5077 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2017-03-26 01:46:08 +00:00
parent 1946cdc694
commit 4fcfe8abb0
33 changed files with 259 additions and 87 deletions

View file

@ -140,8 +140,8 @@ endif
USER_TARGET:=$(FTE_TARGET)
#make droid-rel doesn't get the right stuff
#add a small default config file. its only small.
DROID_PACKSU?= $(BASE_DIR)/droid/fte.cfg
#add a small default config file. its only small. and some other stuff, because we can. This makes it much easier to get it up and running.
DROID_PACKSU?= $(BASE_DIR)/droid/fte.cfg $(BASE_DIR)/droid/default.fmf $(BASE_DIR)/droid/configs/touch.cfg
ANDROID_NDK_ROOT?=~/android-ndk-r8e
ANDROID_HOME?=~/android-sdk-linux
ANT?=ant

View file

@ -1,5 +1,6 @@
//copyright 'Spike', license gplv2+
//provides both a package manager and downloads menu.
//FIXME: block downloads of exe/dll/so/etc if not an https url (even if inside zips). also block such files from package lists over http.
#include "quakedef.h"
#ifdef WEBCLIENT
@ -1437,9 +1438,6 @@ static void PM_ListDownloaded(struct dl_download *dl)
f = dl->file;
dl->file = NULL;
if (!availablepackages)
Con_Printf("ZOMG NO PACKAGES\n");
i = dl->user_num;
if (dl != downloadablelist[i].curdl)

View file

@ -2300,7 +2300,7 @@ void CheckCustomMode(struct menu_s *menu)
info->hzfixed->common.ishidden = true;
for (i = 0; i < ASPECT_RATIOS; i++)
info->ressize[i]->common.ishidden = true;
if (info->dispmode->selectedoption != 2)
if (!info->dispmode || info->dispmode->selectedoption != 2)
{
info->resmode->common.ishidden = false;
sel = info->resmode->selectedoption;
@ -2481,9 +2481,39 @@ void M_Menu_Video_f (void)
{
extern cvar_t v_contrast, vid_conwidth, vid_conheight;
// extern cvar_t vid_width, vid_height, vid_preservegamma, vid_hardwaregamma, vid_desktopgamma;
extern cvar_t vid_fullscreen, vid_desktopsettings, vid_conautoscale;
extern cvar_t vid_desktopsettings, vid_conautoscale;
extern cvar_t vid_bpp, vid_refreshrate, vid_multisample;
#ifdef ANDROID
extern cvar_t sys_orientation;
static const char *orientationopts[] = {
"Auto",
"Landscape",
"Portrait",
"Reverse Landscape",
"Reverse Portrait",
NULL
};
static const char *orientationvalues[] = {
"",
"landscape",
"portrait",
"reverselandscape",
"reverseportrait",
NULL
};
extern cvar_t sys_glesversion_cvar;
static const char *glesopts[] = {
"GLES 1",
"GLES 2",
NULL
};
static const char *glesvalues[] = {
"1",
"2",
NULL
};
#else
extern cvar_t vid_renderer;
static const char *rendererops[] =
{
@ -2544,6 +2574,7 @@ void M_Menu_Video_f (void)
NULL
};
extern cvar_t vid_fullscreen;
static const char *fullscreenopts[] = {
"Windowed",
"Fullscreen",
@ -2551,6 +2582,7 @@ void M_Menu_Video_f (void)
NULL
};
static const char *fullscreenvalues[] = {"0", "1", "2", NULL};
#endif
static const char *aaopts[] = {
"1x",
@ -2612,6 +2644,8 @@ void M_Menu_Video_f (void)
NULL
};
static const char *scalevalues[] = { "1", "1.5", "2", "2.5", "3", "4", "5", "6", NULL};
/*
static const char *vsyncoptions[] =
{
@ -2651,8 +2685,13 @@ void M_Menu_Video_f (void)
{
MB_REDTEXT("Video Options", true),
MB_TEXT("^Ue080^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue081^Ue082", true),
#ifdef ANDROID
MB_COMBOCVAR("Orientation", sys_orientation, orientationopts, orientationvalues, NULL),
MB_COMBOCVAR("GLES Version", sys_glesversion_cvar, glesopts, glesvalues, NULL),
#else
MB_COMBOCVAR("Renderer", vid_renderer, rendererops, renderervalues, NULL),
MB_COMBOCVARRETURN("Display Mode", vid_fullscreen, fullscreenopts, fullscreenvalues, info->dispmode, vid_fullscreen.description),
#endif
MB_COMBOCVAR("Anti-aliasing", vid_multisample, aaopts, aavalues, NULL),
MB_REDTEXT(current3dres, true),
MB_COMBORETURN("Aspect", resmodeopts, resmodechoice, info->resmode, "Select method for determining or configuring display options. The desktop option will attempt to use the width, height, color depth, and refresh from your operating system's desktop environment."),

View file

@ -449,7 +449,7 @@ void M_UnbindCommand (const char *command);
#else
//no builtin menu code.
//stubs
#define M_Menu_Prompt(cb,ctx,m1,m2,m3,optionyes,optionno,optioncancel) (cb)(ctx,-1)
#define M_Menu_Prompt(cb,ctx,messages,optionyes,optionno,optioncancel) (cb)(ctx,-1)
#define M_ToggleMenu_f() Cbuf_AddText("togglemenu\n",RESTRICT_LOCAL)
//#define M_Shutdown(t) MP_Shutdown()

View file

@ -35,11 +35,11 @@ static char sys_basedir[MAX_OSPATH];
static char sys_basepak[MAX_OSPATH];
extern jmp_buf host_abort;
cvar_t sys_vibrate = CVARD("sys_vibrate", "1", "Enables the system vibrator for damage events and such things. The value provided is a duration scaler.");
cvar_t sys_vibrate = CVARFD("sys_vibrate", "1", CVAR_ARCHIVE, "Enables the system vibrator for damage events and such things. The value provided is a duration scaler.");
cvar_t sys_osk = CVAR("sys_osk", "0"); //to be toggled
cvar_t sys_keepscreenon = CVARD("sys_keepscreenon", "1", "If set, the screen will never darken. This might cost some extra battery power, but then so will running a 3d engine."); //to be toggled
cvar_t sys_orientation = CVARD("sys_orientation", "landscape", "Specifies what angle to render quake at.\nValid values are: sensor (autodetect), landscape, portrait, reverselandscape, reverseportrait");
cvar_t sys_glesversion_cvar = CVARD("sys_glesversion", "1", "Specifies which version of gles to use. 1 or 2 are valid values.");
cvar_t sys_keepscreenon = CVARFD("sys_keepscreenon", "1", CVAR_ARCHIVE, "If set, the screen will never darken. This might cost some extra battery power, but then so will running a 3d engine."); //to be toggled
cvar_t sys_orientation = CVARFD("sys_orientation", "landscape", CVAR_ARCHIVE, "Specifies what angle to render quake at.\nValid values are: sensor (autodetect), landscape, portrait, reverselandscape, reverseportrait");
cvar_t sys_glesversion_cvar = CVARFD("sys_glesversion", "1", CVAR_ARCHIVE, "Specifies which version of gles to use. 1 or 2 are valid values.");
extern cvar_t vid_conautoscale;
@ -264,7 +264,7 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_init(JNIEnv *env, jobject o
parms.argv = args;
tmp = (*env)->GetStringUTFChars(env, japkpath, NULL);
Q_strncpyz(sys_basepak, tmp, sizeof(sys_basedir));
Q_strncpyz(sys_basepak, tmp, sizeof(sys_basepak));
(*env)->ReleaseStringUTFChars(env, japkpath, tmp);
tmp = (*env)->GetStringUTFChars(env, jusrpath, NULL);

View file

@ -3420,8 +3420,8 @@ void FS_ReloadPackFilesFlags(unsigned int reloadflags)
searchpathfuncs_t *pak;
vfsfile_t *vfs = VFSOS_Open(pakname, "rb");
pak = FS_OpenPackByExtension(vfs, pakname);
if (pak)
FS_AddPathHandle(&oldpaths, "", pakname, pak, "", SPF_COPYPROTECTED|SPF_EXPLICIT, reloadflags);
if (pak) //logically should have SPF_EXPLICIT set, but that would give it a worse gamedir depth
FS_AddPathHandle(&oldpaths, "", pakname, pak, "", SPF_COPYPROTECTED, reloadflags);
i = COM_CheckNextParm ("-basepack", i);
}
@ -4884,11 +4884,27 @@ qboolean FS_FoundManifest(void *usr, ftemanifest_t *man)
//if fixedbasedir is true, stuff like -quake won't override/change the active basedir (ie: -basedir or gamedir switching without breaking gamedir)
ftemanifest_t *FS_ReadDefaultManifest(char *newbasedir, size_t newbasedirsize, qboolean fixedbasedir)
{
int i;
int game = -1;
ftemanifest_t *man = NULL;
vfsfile_t *f;
//commandline generally takes precedence
if (!man && game == -1)
{
int i;
for (i = 0; gamemode_info[i].argname; i++)
{
if (COM_CheckParm(gamemode_info[i].argname))
{
game = i;
break;
}
}
}
//hopefully this will be used for TCs.
if (!man && game == -1)
{
#ifdef BRANDING_NAME
@ -4912,19 +4928,41 @@ ftemanifest_t *FS_ReadDefaultManifest(char *newbasedir, size_t newbasedirsize, q
}
}
if (!man && game == -1)
//-basepack is primarily an android feature
i = COM_CheckParm ("-basepack");
while (!man && game == -1 && i && i < com_argc-1)
{
int i;
for (i = 0; gamemode_info[i].argname; i++)
const char *pakname = com_argv[i+1];
searchpathfuncs_t *pak;
vfsfile_t *vfs = VFSOS_Open(pakname, "rb");
pak = FS_OpenPackByExtension(vfs, pakname);
if (pak)
{
if (COM_CheckParm(gamemode_info[i].argname))
flocation_t loc;
if (pak->FindFile(pak, &loc, "default.fmf", NULL))
{
game = i;
break;
f = pak->OpenVFS(pak, &loc, "rb");
if (f)
{
size_t len = VFS_GETLEN(f);
char *fdata = BZ_Malloc(len+1);
if (fdata)
{
VFS_READ(f, fdata, len);
fdata[len] = 0;
man = FS_Manifest_Parse(NULL, fdata);
man->security = MANIFEST_SECURITY_DEFAULT;
BZ_Free(fdata);
}
VFS_CLOSE(f);
}
}
pak->ClosePath(pak);
}
i = COM_CheckNextParm ("-basepack", i);
}
if (!man && game == -1 && host_parms.manifest)
{
man = FS_Manifest_Parse(va("%sdefault.fmf", newbasedir), host_parms.manifest);

View file

@ -1491,7 +1491,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../libs/speex;..\client;../libs/freetype2/include;../common;../server;../gl;../sw;../qclib;../libs;../libs/dxsdk9/include;../libs/dxsdk7/include"
PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;GLQUAKE;D3D9QUAKE;D3D11QUAKE;SWQUAKE;VKQUAKE;MULTITHREAD;USE_MSVCRT_DEBUG"
PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;GLQUAKE;D3D8QUAKE;D3D9QUAKE;D3D11QUAKE;SWQUAKE;VKQUAKE;MULTITHREAD;USE_MSVCRT_DEBUG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
FloatingPointModel="2"
@ -29907,6 +29907,14 @@
RelativePath="..\d3d\d3d11_shader.c"
>
</File>
<File
RelativePath="..\d3d\d3d8_backend.c"
>
</File>
<File
RelativePath="..\d3d\d3d8_image.c"
>
</File>
<File
RelativePath="..\d3d\d3d_backend.c"
>
@ -29927,6 +29935,10 @@
RelativePath="..\d3d\vid_d3d11.c"
>
</File>
<File
RelativePath="..\d3d\vid_d3d8.c"
>
</File>
</Filter>
<Filter
Name="sw"

View file

@ -2,7 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fteqw"
android:versionCode="1"
android:versionName="1.0"
android:versionName="1.05"
android:installLocation="auto">
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="8"/>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
@ -11,7 +11,7 @@
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".FTEDroidActivity"
android:label="@string/app_name"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation">
<!-- launcher icon -->
@ -20,6 +20,14 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- custom url scheme, because someone didn't like using mime types properly -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="qw" />
</intent-filter>
<!-- mime types with unspecified schemes (please don't explode). one for each mime type. because I'm paranoid. -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />

View file

@ -1,13 +1,13 @@
showpic_removeall
sv_aim 0.90 //quake style, avoid needing to pitch too much
showpic gfx/touch_forward.png forward 96 -88 bm 32 32 +forward
showpic gfx/touch_back.png moveback 96 -56 bm 32 32 +back
showpic gfx/touch_moveleft.png moveleft 64 -56 bm 32 32 +moveleft
showpic gfx/touch_moveright.png moveright 128 -56 bm 32 32 +moveright
showpic res/drawable/touch_moveforward.tga forward -16 -88 bm 32 32 +forward
showpic res/drawable/touch_moveback.tga moveback -16 -56 bm 32 32 +back
showpic res/drawable/touch_moveleft.tga moveleft -48 -56 bm 32 32 +moveleft
showpic res/drawable/touch_moveright.tga moveright 16 -56 bm 32 32 +moveright
showpic gfx/touch_attack.png attack 32 -56 bm 32 32 +attack
showpic gfx/touch_jump.png jump 160 -56 bm 32 32 +jump
showpic res/drawable/touch_attack.tga attack -80 -56 bm 32 32 +attack
showpic res/drawable/touch_jump.tga jump 48 -56 bm 32 32 +jump
showpic gfx/touch_turnleft.png turnleft 0 -56 bm 32 32 +left
showpic gfx/touch_turnright.png turnright 192 -56 bm 32 32 +right
showpic res/drawable/touch_turnleft.tga turnleft -112 -56 bm 32 32 +left
showpic res/drawable/touch_turnright.tga turnright 80 -56 bm 32 32 +right

23
engine/droid/default.fmf Normal file
View file

@ -0,0 +1,23 @@
//documentation on this file can be found at https://sourceforge.net/p/fteqw/code/HEAD/tree/trunk/specs/fte_manifests.txt
FTEManifestVer 1
game afterquake
name "AfterQuake"
//listing dp here allows listing public dp servers, but still won't be listed inside dp
protocolname "FTE-Quake DarkPlaces-Quake"
basegame id1
basegame qw
basegame *fte
disablehomedir 1
//first, so we don't favour it over pak1.pak
//avoids distributing the demo as anything other than the demo.
package id1/gpl_maps.pk3
archivedpackage id1/pak0.pak - id1/pak0.pak http://triptohell.info/moodles/live/QUAKE_SW.zip
package id1/pak1.pak
package id1/new_playermodel_only.pak
//autoupdate stuff
//FIME FIXME FIXME - on android we have no https support
downloadsurl "http://fte.triptohell.info/downloadables.php"
install "AfterQuake - Minimum"

View file

@ -15,4 +15,4 @@ vid_conwidth "0" //make something up based upon aspect ratio
vid_conheight "300" //not using autoscale as it can make the menu unusable.
vid_conautoscale "0" // Text/Menu size. 2 is the default. 4 is bigger
exec configs/touch.cfg
exec touch.cfg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -495,6 +495,9 @@ public class FTEDroidActivity extends Activity
ori = 9;//android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
else if (ors.equalsIgnoreCase("fullsensor"))
ori = 10;//android.content.pm.ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR;
//and the default, because specifying it again is always useless.
else
ori = android.content.pm.ActivityInfo.SCREEN_ORIENTATION_SENSOR;
android.util.Log.i("FTEDroid", "Orientation changed to " + ori + " (" + ors + ").");
act.setRequestedOrientation(ori);
}

View file

@ -1889,7 +1889,11 @@ void Mod_LoadLighting (model_t *loadmodel, qbyte *mod_base, lump_t *l, qboolean
lightmodel = loadmodel;
relitsurface = 0;
}
else if (!lightmodel && r_deluxmapping_cvar.value>1 && r_deluxmapping && !luxdata && !(r_shadow_realtime_world.ival && r_shadow_realtime_world_lightmaps.value<=0))
else if (!lightmodel && r_deluxmapping_cvar.value>1 && r_deluxmapping && !luxdata
#ifdef RTLIGHTS
&& !(r_shadow_realtime_world.ival && r_shadow_realtime_world_lightmaps.value<=0)
#endif
)
{ //if deluxemapping is on, generate missing lux files a little more often, but don't bother if we have rtlights on anyway.
writelitfile = false;
numlightdata = l->filelen;

View file

@ -7050,12 +7050,10 @@ const char *SV_CheckRejectConnection(netadr_t *adr, const char *uinfo, unsigned
}
Info_SetValueForKey(clfeatures, "basicprotocol", bp, sizeof(clfeatures));
Info_SetValueForKey(clfeatures, "guid", guid, sizeof(clfeatures));
Info_SetValueForKey(clfeatures, "maxsounds", "256", sizeof(clfeatures));
Info_SetValueForKey(clfeatures, "maxmodels", "256", sizeof(clfeatures));
//this is not the limits of the client itself, but the limits that the server is able and willing to send to them.
if ((pext1 & PEXT_SOUNDDBL) || (protocol == SCP_BJP3 || protocol == SCP_FITZ666 || protocol == SCP_DARKPLACES6) || (protocol == SCP_DARKPLACES7))
if ((pext1 & PEXT_SOUNDDBL) || (pext2 & PEXT2_REPLACEMENTDELTAS) || (protocol == SCP_BJP3 || protocol == SCP_FITZ666 || protocol == SCP_DARKPLACES6) || (protocol == SCP_DARKPLACES7))
Info_SetValueForKey(clfeatures, "maxsounds", va("%i", MAX_PRECACHE_SOUNDS), sizeof(clfeatures));
else
Info_SetValueForKey(clfeatures, "maxsounds", "256", sizeof(clfeatures));

View file

@ -798,7 +798,7 @@ void SVQW_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg,
if (to->dpflags != from->dpflags && (protext & PEXT_DPFLAGS))
evenmorebits |= U_DPFLAGS;
if ((to->tagentity != from->tagentity || to->tagindex != from->tagindex) && (protext & PEXT_DPFLAGS))
if ((to->tagentity != from->tagentity || to->tagindex != from->tagindex) && (protext & PEXT_SETATTACHMENT))
evenmorebits |= U_TAGINFO;
if ((to->light[0] != from->light[0] || to->light[1] != from->light[1] || to->light[2] != from->light[2] || to->light[3] != from->light[3] || to->lightstyle != from->lightstyle || to->lightpflags != from->lightstyle) && (protext & PEXT_DPFLAGS))

View file

@ -1792,7 +1792,7 @@ void SV_ClientProtocolExtensionsChanged(client_t *client)
//you need to reconnect for this to update, of course. so make sure its not *too* low...
client->max_net_ents = bound(512, pr_maxedicts.ival, MAX_EDICTS);
client->maxmodels = MAX_PRECACHE_MODELS; //protocol limited to 14 bits.
client->maxmodels = min(1u<<14, MAX_PRECACHE_MODELS); //protocol limited to 14 bits.
}
else if (ISQWCLIENT(client)) //readd?
{
@ -1804,7 +1804,7 @@ void SV_ClientProtocolExtensionsChanged(client_t *client)
client->max_net_ents += 1024;
if (client->fteprotocolextensions & PEXT_MODELDBL)
client->maxmodels = MAX_PRECACHE_MODELS;
client->maxmodels = 512;
}
else if (ISDPCLIENT(client))
{

View file

@ -1240,44 +1240,6 @@ qboolean SV_MVDWritePackets (int num)
return true;
}
// table of readable characters, same as ezquake
char readable[256] =
{
'.', '_', '_', '_', '_', '.', '_', '_',
'_', '_', '\n', '_', '\n', '>', '.', '.',
'[', ']', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '.', '_', '_', '_',
' ', '!', '\"', '#', '$', '%', '&', '\'',
'(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?',
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', '{', '|', '}', '~', '_',
'_', '_', '_', '_', '_', '.', '_', '_',
'_', '_', '_', '_', '_', '>', '.', '.',
'[', ']', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '.', '_', '_', '_',
' ', '!', '\"', '#', '$', '%', '&', '\'',
'(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?',
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', '{', '|', '}', '~', '_'
};
#define chartbl readable
void MVD_Init (void)
{
#define MVDVARGROUP "Server MVD cvars"
@ -1707,9 +1669,12 @@ qboolean SV_MVD_Record (mvddest_t *dest)
#ifdef PEXT_VIEW2
demo.recorder.fteprotocolextensions |= PEXT_VIEW2;
#endif
demo.recorder.fteprotocolextensions2 = PEXT2_VOICECHAT | PEXT2_SETANGLEDELTA | PEXT2_PRYDONCURSOR | (pext_replacementdeltas.ival?PEXT2_REPLACEMENTDELTAS:0);
demo.recorder.fteprotocolextensions2 = PEXT2_VOICECHAT | PEXT2_SETANGLEDELTA | /*PEXT2_PRYDONCURSOR |*/ (pext_replacementdeltas.ival?PEXT2_REPLACEMENTDELTAS:0);
/*enable these, because we might as well (stat ones are always useful)*/
demo.recorder.zquake_extensions = Z_EXT_PM_TYPE | Z_EXT_PM_TYPE_NEW | Z_EXT_VIEWHEIGHT | Z_EXT_SERVERTIME | Z_EXT_PITCHLIMITS | Z_EXT_JOIN_OBSERVE | Z_EXT_VWEP;
// if (demo.recorder.fteprotocolextensions2 & PEXT2_REPLACEMENTDELTAS) //replacementdeltas makes a number of earlier extensions obsolete...
// demo.recorder.fteprotocolextensions &= ~(PEXT_COLOURMOD|PEXT_DPFLAGS|PEXT_ENTITYDBL|PEXT_ENTITYDBL2|PEXT_FATNESS|PEXT_HEXEN2|PEXT_HULLSIZE|PEXT_MODELDBL|PEXT_SCALE|PEXT_SETATTACHMENT|PEXT_SOUNDDBL|PEXT_SPAWNSTATIC2|PEXT_TRANS);
}
else
{
@ -1912,6 +1877,80 @@ void SV_MVD_SendInitialGamestate(mvddest_t *dest)
singledest = NULL;
}
//double-underscores will get merged together.
const char *SV_GenCleanTable(void)
{
static char tab[256];
static int tabbuilt = -1;
int mode = com_parseutf8.ival>0;
int i;
if (tabbuilt == mode)
return tab;
//identity
for(i = 0; i < 32; i++)
tab[i] = '_'; //unprintables.
for( ; i < 128; i++)
tab[i] = i;
//cheesy way around NUL.mvd etc filenames.
for(i = 'A'; i <= 'Z'; i++)
tab[i] = i + ('a'-'A');
//these chars are reserved by windows, so its generally best to not use them, even on loonix
tab['<'] = '[';
tab['>'] = ']';
tab['|'] = '_';
tab[':'] = '_';
tab['*'] = '_';
tab['?'] = '_';
tab['\\']= '_';
tab['/'] = '_';
tab['\"']= '_';
//some extra ones to make unix scripts nicer.
tab['&'] = '_';
tab['~'] = '_';
tab['`'] = '_';
tab[','] = '_';
tab[' '] = '_'; //don't use spaces, it means files need quotes, and then stuff bugs out.
tab['.'] = '_'; //many windows programs can't properly deal with multiple dots
if (mode)
{
//high chars are regular utf-8. yay
for(i = 128; i < 256; i++)
tab[i] = i;
}
else
{
//second row contains coloured numbers for the hud
tab[16] = '[';
tab[17] = ']';
for(i = 0; i < 10; i++)
tab[18+i] = '0'+i;
tab[28] = '_'; //'.'
tab[29] = //line breaks
tab[30] =
tab[31] = '_';
//high chars
//the first 16 chars of the high range are actually different.
tab[128] = '_'; //scrollbars
tab[129] = '_';
tab[130] = '_';
tab[130] = '_';
for(i = 132; i < 128+16; i++)
tab[18+i] = '_'; //LEDs mostly
//but the rest of the table is just recoloured.
for(i = 128+16; i < 256; i++)
tab[i] = tab[i&127];
}
return tab;
}
/*
====================
SV_CleanName
@ -1924,6 +1963,7 @@ char *SV_CleanName (unsigned char *name)
{
static char text[1024];
char *out = text;
const char *chartbl = SV_GenCleanTable();
*out = chartbl[*name++];
@ -1933,7 +1973,12 @@ char *SV_CleanName (unsigned char *name)
else *++out = chartbl[*name++];
*++out = 0;
return text;
out = text;
while (*out == '.')
out++; //leading dots (which could be caused by all sorts of things) are bad. boo hidden files.
return out;
}
/*

View file

@ -1359,9 +1359,9 @@ static void SV_SoundMulticast(client_t *client, sizebuf_t *msg, void *vctx)
MSG_WriteShort (msg, bound(-32768, ctx->timeofs*1000, 32767));
if (field_mask & FTESND_VELOCITY)
{
MSG_WriteShort (msg, ctx->vel[0]*8);
MSG_WriteShort (msg, ctx->vel[1]*8);
MSG_WriteShort (msg, ctx->vel[2]*8);
MSG_WriteShort (msg, bound(-32767, ctx->vel[0]*8, 32767));
MSG_WriteShort (msg, bound(-32767, ctx->vel[1]*8, 32767));
MSG_WriteShort (msg, bound(-32767, ctx->vel[2]*8, 32767));
}
if (field_mask & DPSND_SPEEDUSHORT4000)
MSG_WriteShort (msg, bound(1, ctx->ratemul*4000, 65535));

View file

@ -1043,10 +1043,14 @@ void SV_SendClientPrespawnInfo(client_t *client)
else
{
int maxclientsupportedsounds = 256;
#ifdef PEXT_SOUNDDBL
#ifdef PEXT_SOUNDDBL
if (client->fteprotocolextensions & PEXT_SOUNDDBL)
maxclientsupportedsounds = MAX_PRECACHE_SOUNDS;
#endif
#endif
#ifdef PEXT_SOUNDDBL
if (client->fteprotocolextensions2 & PEXT2_REPLACEMENTDELTAS)
maxclientsupportedsounds = MAX_PRECACHE_SOUNDS;
#endif
started = false;
//allows stalling for the soundlist command, for compat.
@ -1060,7 +1064,7 @@ void SV_SendClientPrespawnInfo(client_t *client)
{
started = true;
client->prespawn_allow_soundlist = false;
#ifdef PEXT_SOUNDDBL
#if defined(PEXT_SOUNDDBL) || defined(PEXT2_REPLACEMENTDELTAS)
if (client->prespawn_idx > 255)
{
MSG_WriteByte (&client->netchan.message, svcfte_soundlistshort);
@ -1164,7 +1168,7 @@ void SV_SendClientPrespawnInfo(client_t *client)
{
started = true;
client->prespawn_allow_modellist = false;
#ifdef PEXT_SOUNDDBL
#if defined(PEXT_SOUNDDBL) || defined(PEXT2_REPLACEMENTDELTAS)
if (client->prespawn_idx > 255)
{
MSG_WriteByte (&client->netchan.message, svcfte_modellistshort);