mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-23 12:22:42 +00:00
484e8bbfc2
reworked network addresses to separate address family and connection type. this should make banning people more reliable, as well as simplifying a whole load of logic (no need to check for ipv4 AND ipv6). tcpconnect will keep trying to connect even if the connection wasn't instant, instead of giving up instantly. rewrote tcp connections quite a bit. sv_port_tcp now handles qtv+qizmo+http+ws+rtcbroker+tls equivalents. qtv_streamport is now a legacy cvar and now acts equivalently to sv_port_tcp (but still separate). rewrote screenshot and video capture code to use strides. this solves image-is-upside down issues with vulkan. ignore alt key in browser port. oh no! no more red text! oh no! no more alt-being-wrongly-down-and-being-unable-to-type-anything-without-forcing-alt-released! reworked audio decoder interface. now has clearly defined success/unavailable/end-of-file results. this should solve a whole load of issues with audio streaming. fixed various openal audio streaming issues too. openal also got some workarounds for emscripten's poor emulation. fixed ogg decoder to retain sync properly if seeked. updated menu_media a bit. now reads vorbis comments/id3v1 tags to get proper track names. also saves the playlist so you don't have to manually repopulate the list so it might actually be usable now (after how many years?) r_stains now defaults to 0, and is no longer enabled by presets. use decals if you want that sort of thing. added fs_noreexec cvar, so configs will not be reexeced on gamedir change. this also means defaults won't be reapplied, etc. added 'nvvk' renderer on windows, using nvidia's vulkan-inside-opengl gl extension. mostly just to see how much slower it is. fixed up the ftp server quite a lot. more complete, more compliant, and should do ipv6 properly to-boot. file transfers also threaded. fixed potential crash inside runclientphys. experimental sv_antilag=3 setting. totally untested. the aim is to avoid missing due to lagged knockbacks. may be expensive for the server. browser port's websockets support fixed. experimental support for webrtc ('works for me', requires a broker server). updated avplug(renamed to ffmpeg so people know what it is) to use ffmpeg 3.2.4 properly, with its new encoder api. should be much more robust... also added experimental audio decoder for game music etc (currently doesn't resample, so playback rates are screwed, disabled by cvar). git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5097 fc73d0e0-1445-4013-8a0c-d673dee63da5
258 lines
6.4 KiB
C
258 lines
6.4 KiB
C
#include "quakedef.h"
|
|
#include <xtl.h>
|
|
|
|
#define MAXPRINTMSG 1024 // Yes
|
|
qboolean isDedicated = false;
|
|
|
|
/*Timers, supposedly xbox supports QueryPerformanceCounter stuff*/
|
|
double Sys_DoubleTime (void)
|
|
{
|
|
static int first = 1;
|
|
static LARGE_INTEGER qpcfreq;
|
|
LARGE_INTEGER PerformanceCount;
|
|
static LONGLONG oldcall;
|
|
static LONGLONG firsttime;
|
|
LONGLONG diff;
|
|
|
|
QueryPerformanceCounter (&PerformanceCount);
|
|
if (first)
|
|
{
|
|
first = 0;
|
|
QueryPerformanceFrequency(&qpcfreq);
|
|
firsttime = PerformanceCount.QuadPart;
|
|
diff = 0;
|
|
}
|
|
else
|
|
diff = PerformanceCount.QuadPart - oldcall;
|
|
if (diff >= 0)
|
|
oldcall = PerformanceCount.QuadPart;
|
|
return (oldcall - firsttime) / (double)qpcfreq.QuadPart;
|
|
}
|
|
unsigned int Sys_Milliseconds (void)
|
|
{
|
|
return Sys_DoubleTime()*1000;
|
|
}
|
|
|
|
NORETURN void VARGS Sys_Error (const char *error, ...)
|
|
{
|
|
//FIXME: panic! everyone panic!
|
|
//you might want to figure out some way to display the message...
|
|
for(;;)
|
|
;
|
|
}
|
|
|
|
void Sys_Sleep(double seconds)
|
|
{ //yields to other processes/threads for a bit.
|
|
}
|
|
|
|
void Sys_Quit (void)
|
|
{
|
|
#if 0
|
|
Host_Shutdown ();
|
|
//successful execution.
|
|
//should go back to the system menu or something, or possibly longjmp out of the main loop.
|
|
for (;;)
|
|
;
|
|
exit(1);
|
|
#endif
|
|
}
|
|
|
|
void Sys_Shutdown(void)
|
|
{
|
|
}
|
|
void Sys_Init(void)
|
|
{ //register system-specific cvars here
|
|
}
|
|
|
|
/*prints to dedicated server console or debug output*/
|
|
void VARGS Sys_Printf (char *fmt, ...)
|
|
{
|
|
va_list argptr;
|
|
char msg[MAXPRINTMSG];
|
|
|
|
va_start (argptr,fmt);
|
|
vsnprintf(msg,sizeof(msg)-1, fmt,argptr);
|
|
msg[sizeof(msg)-1] = 0; //_vsnprintf sucks.
|
|
va_end (argptr);
|
|
|
|
//no idea what the stdout is hooked up to, lets try it anyway.
|
|
printf("%s", msg);
|
|
}
|
|
|
|
/*returns the system video mode settings, ish*/
|
|
qboolean Sys_GetDesktopParameters(int *width, int *height, int *bpp, int *refreshrate)
|
|
{
|
|
//FIXME: use XGetVideoStandard or XGetVideoFlags or something
|
|
*width = 640;
|
|
*height = 480;
|
|
*bpp = 32;
|
|
*refreshrate = 60;
|
|
return true;
|
|
}
|
|
|
|
/*dedicated server type stuff*/
|
|
qboolean Sys_InitTerminal(void)
|
|
{
|
|
return false; //failure
|
|
}
|
|
void Sys_CloseTerminal (void)
|
|
{
|
|
}
|
|
char *Sys_ConsoleInput (void)
|
|
{ //returns any text typed on the stdin, when acting as a dedicated server.
|
|
//this includes debugger commands if we're integrated with fteqccgui
|
|
return NULL;
|
|
}
|
|
|
|
/*various system notifications*/
|
|
void Sys_ServerActivity(void)
|
|
{ //player joined the server or said something. would normally flash the app in the system tray.
|
|
}
|
|
|
|
void Sys_RecentServer(char *command, char *target, char *title, char *desc) {
|
|
|
|
}
|
|
|
|
/*check any system message queues here*/
|
|
void Sys_SendKeyEvents(void)
|
|
{
|
|
}
|
|
|
|
qboolean Sys_RandomBytes(qbyte *string, int len)
|
|
{
|
|
//FIXME: should return some cryptographically strong random number data from some proper crypto library. C's rand function isn't really strong enough.
|
|
return false;
|
|
}
|
|
|
|
/*filesystem stuff*/
|
|
void Sys_mkdir (const char *path)
|
|
{
|
|
}
|
|
void Sys_rmdir (const char *path)
|
|
{
|
|
}
|
|
qboolean Sys_remove (const char *path)
|
|
{
|
|
return false; //false for failure
|
|
}
|
|
qboolean Sys_Rename (const char *oldfname, const char *newfname)
|
|
{
|
|
return false; //false for failure
|
|
}
|
|
int Sys_EnumerateFiles (const char *gpath, const char *match, int (QDECL *func)(const char *fname, qofs_t fsize, void *parm, searchpathfuncs_t *spath), void *parm, searchpathfuncs_t *spath)
|
|
{
|
|
//if func returns false, abort with false return value, otherwise return true.
|
|
//use wildcmd to compare two filenames
|
|
//note that match may contain wildcards and multiple directories with multiple wildcards all over.
|
|
return true;
|
|
}
|
|
|
|
/*consoles don't tend to need system clipboards, so this is fully internal to our engine*/
|
|
#define SYS_CLIPBOARD_SIZE 256
|
|
static char clipboard_buffer[SYS_CLIPBOARD_SIZE] = {0};
|
|
char *Sys_GetClipboard(void)
|
|
{
|
|
return clipboard_buffer;
|
|
}
|
|
void Sys_CloseClipboard(char *bf)
|
|
{
|
|
}
|
|
void Sys_SaveClipboard(char *text)
|
|
{
|
|
Q_strncpyz(clipboard_buffer, text, SYS_CLIPBOARD_SIZE);
|
|
}
|
|
|
|
/*dynamic library stubs*/
|
|
dllhandle_t *Sys_LoadLibrary(const char *name, dllfunction_t *funcs)
|
|
{
|
|
Con_Printf("Sys_LoadLibrary: %s\n", name);
|
|
return NULL;
|
|
}
|
|
void Sys_CloseLibrary(dllhandle_t *lib)
|
|
{
|
|
}
|
|
void *Sys_GetAddressForName(dllhandle_t *module, const char *exportname)
|
|
{
|
|
return NULL; //unsupported
|
|
}
|
|
char *Sys_GetNameForAddress(dllhandle_t *module, void *address)
|
|
{
|
|
return NULL; //unsupported (on most platforms, actually)
|
|
}
|
|
|
|
void main( int argc, char **argv)
|
|
{
|
|
float time, lasttime;
|
|
quakeparms_t parms;
|
|
|
|
memset(&parms, 0, sizeof(parms));
|
|
|
|
parms.argc = argc;
|
|
parms.argv = argv;
|
|
#ifdef CONFIG_MANIFEST_TEXT
|
|
parms.manifest = CONFIG_MANIFEST_TEXT;
|
|
#endif
|
|
|
|
COM_InitArgv(parms.argc, parms.argv);
|
|
TL_InitLanguages(parms.basedir);
|
|
Host_Init(&parms);
|
|
|
|
//main loop
|
|
lasttime = Sys_DoubleTime();
|
|
|
|
while (1)
|
|
{
|
|
time = Sys_DoubleTime();
|
|
Host_Frame(time - lasttime);
|
|
lasttime = time;
|
|
}
|
|
|
|
}
|
|
|
|
/*input stubs
|
|
in_generic.c should make these kinda useless, but sometimes you need more than the following three functions:
|
|
void IN_JoystickAxisEvent(unsigned int devid, int axis, float value);
|
|
void IN_KeyEvent(unsigned int devid, int down, int keycode, int unicode);
|
|
void IN_MouseMove(unsigned int devid, int abs, float x, float y, float z, float size);
|
|
that said, if they're enough, then just call those in Sys_SendKeyEvents. You can also call them from other threads just fine.
|
|
their devid values should be assigned only when a button is first pressed, or something, so controllers get assigned to seats in the order that they're pressed. so player 1 always hits a button first to ensure that they are player 1.
|
|
or just hardcode those based upon usbport numbers, but that's unreliable with usb hubs.
|
|
*/
|
|
|
|
void INS_Shutdown (void)
|
|
{
|
|
}
|
|
void INS_ReInit (void)
|
|
{
|
|
}
|
|
void INS_Move(float *movements, int pnum)
|
|
{
|
|
//accululates system-specific inputs on a per-seat basis.
|
|
}
|
|
void INS_Init (void)
|
|
{
|
|
}
|
|
void INS_Accumulate(void) //input polling
|
|
{
|
|
}
|
|
void INS_Commands (void) //used to Cbuf_AddText joystick button events in windows.
|
|
{
|
|
}
|
|
void INS_EnumerateDevices(void *ctx, void(*callback)(void *ctx, const char *type, const char *devicename, unsigned int *qdevid))
|
|
{
|
|
#if 0
|
|
unsigned int i;
|
|
for (i = 0; i < MAX_JOYSTICKS; i++)
|
|
if (sdljoy[i].controller)
|
|
callback(ctx, "joy", sdljoy[i].devname, &sdljoy[i].qdevid);
|
|
#endif
|
|
}
|
|
|
|
void INS_SetupControllerAudioDevices (void) // Not used
|
|
{
|
|
}
|
|
|
|
void INS_UpdateGrabs (void) // Not used
|
|
{
|
|
}
|
|
|