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
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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."),
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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
|
@ -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"
|
|
@ -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
|
||||
|
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 4.3 KiB |
BIN
engine/droid/res/drawable-xhdpi/icon.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
engine/droid/res/drawable-xxhdpi/icon.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
engine/droid/res/drawable/icon.png
Normal file
After Width: | Height: | Size: 137 KiB |
BIN
engine/droid/res/drawable/touch_attack.tga
Normal file
BIN
engine/droid/res/drawable/touch_jump.tga
Normal file
BIN
engine/droid/res/drawable/touch_moveback.tga
Normal file
BIN
engine/droid/res/drawable/touch_moveforward.tga
Normal file
BIN
engine/droid/res/drawable/touch_moveleft.tga
Normal file
BIN
engine/droid/res/drawable/touch_moveright.tga
Normal file
BIN
engine/droid/res/drawable/touch_turnleft.tga
Normal file
BIN
engine/droid/res/drawable/touch_turnright.tga
Normal 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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|