13 Sep 2007

This commit is contained in:
g-cont 2007-09-13 00:00:00 +04:00 committed by Alibek Omarov
parent a5bd066548
commit fd89db2808
23 changed files with 1102 additions and 158 deletions

View File

@ -14,7 +14,7 @@ SV_ClipToLinks SV_ClipMoveToEntities
6. Перевести сервер на float OK
7. Имплементация загрузки дллок (в лаунчер) OK
8. Перенести в лаунчер большинство Sys_ вызовов OK
9. Присоеденить msvcrt.dll ко всем проектам
//==================================================

View File

@ -382,7 +382,7 @@ CL_Quit_f
void CL_Quit_f (void)
{
CL_Disconnect ();
Com_Quit ();
Sys_Quit ();
}
/*

View File

@ -618,8 +618,6 @@ MISC
#define EXEC_INSERT 1 // insert at current position, but don't run yet
#define EXEC_APPEND 2 // add to end of the command buffer
void Com_Quit (void);
int Com_ServerState (void); // this should have just been a cvar...
void Com_SetServerState (int state);

View File

@ -43,23 +43,6 @@ float time_before_game;
float time_after_game;
float time_before_ref;
float time_after_ref;
/*
=============
Com_Quit
Both client and server can use this, and it will
do the apropriate things.
=============
*/
void Com_Quit (void)
{
SV_Shutdown ("Server quit\n", false);
CL_Shutdown ();
Sys_Quit ();
}
/*
==================
Com_ServerState

View File

@ -80,7 +80,7 @@ cvar_t *qport;
netadr_t net_from;
sizebuf_t net_message;
byte net_message_buffer[MAX_MSGLEN];
byte net_message_buffer[MAX_MSGLEN];
/*
===============
@ -96,7 +96,6 @@ void Netchan_Init (void)
port = RANDOM_LONG(1, 65535);
Msg("netchan port %d\n", port );
showpackets = Cvar_Get ("showpackets", "0", 0);
showdrop = Cvar_Get ("showdrop", "0", 0);
qport = Cvar_Get ("qport", va("%i", port), CVAR_NOSET);

View File

@ -28,13 +28,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
typedef struct
{
byte data[MAX_MSGLEN];
int datalen;
int datalen;
} loopmsg_t;
typedef struct
{
loopmsg_t msgs[MAX_LOOPBACK];
int get, send;
int get, send;
} loopback_t;
@ -43,13 +43,62 @@ static cvar_t *noudp;
static cvar_t *noipx;
loopback_t loopbacks[2];
int ip_sockets[2];
int ipx_sockets[2];
int ip_sockets[2];
int ipx_sockets[2];
// wsock32.dll exports
static int (_stdcall *pWSACleanup)( void );
static word (_stdcall *pNtohs)( word netshort );
static int (_stdcall *pWSAGetLastError)( void );
static int (_stdcall *pCloseSocket)( SOCKET s );
static word (_stdcall *pHtons)( word hostshort );
static dword (_stdcall *pInet_Addr)( const char* cp );
static SOCKET (_stdcall *pSocket)( int af, int type, int protocol );
static struct hostent *(_stdcall *pGetHostByName)( const char* name );
static int (_stdcall *pIoctlSocket)( SOCKET s, long cmd, dword* argp );
static int (_stdcall *pWSAStartup)( word wVersionRequired, LPWSADATA lpWSAData );
static int (_stdcall *pBind)( SOCKET s, const struct sockaddr* addr, int namelen );
static int (_stdcall *pSetSockopt)( SOCKET s, int level, int optname, const char* optval, int optlen );
static int (_stdcall *pRecvFrom)( SOCKET s, char* buf, int len, int flags, struct sockaddr* from, int* fromlen );
static int (_stdcall *pSendTo)( SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen );
static int (_stdcall *pSelect)( int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timeval* timeout );
static dllfunc_t winsock_funcs[] =
{
{"bind", (void **) &pBind },
{"ntohs", (void **) &pNtohs },
{"htons", (void **) &pHtons },
{"socket", (void **) &pSocket },
{"select", (void **) &pSelect },
{"sendto", (void **) &pSendTo },
{"recvfrom", (void **) &pRecvFrom },
{"inet_addr", (void **) &pInet_Addr },
{"WSAStartup", (void **) &pWSAStartup },
{"WSACleanup", (void **) &pWSACleanup },
{"setsockopt", (void **) &pSetSockopt },
{"ioctlsocket", (void **) &pIoctlSocket },
{"closesocket", (void **) &pCloseSocket },
{"gethostbyname", (void **) &pGetHostByName },
{"WSAGetLastError", (void **) &pWSAGetLastError },
{ NULL, NULL }
};
dll_info_t winsock_dll = { "wsock32.dll", winsock_funcs, NULL, NULL, NULL, true, 0, 0 };
char *NET_ErrorString (void);
//=============================================================================
void NET_OpenWinSock( void )
{
Sys_LoadLibrary( &winsock_dll );
}
void NET_FreeWinSock( void )
{
Sys_FreeLibrary( &winsock_dll );
}
void NetadrToSockadr (netadr_t *a, struct sockaddr *s)
{
memset (s, 0, sizeof(*s));
@ -160,8 +209,8 @@ char *NET_AdrToString (netadr_t a)
static char s[64];
if (a.type == NA_LOOPBACK) sprintf (s, "loopback");
else if (a.type == NA_IP) sprintf (s, "%i.%i.%i.%i:%i", a.ip[0], a.ip[1], a.ip[2], a.ip[3], ntohs(a.port));
else sprintf (s, "%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x:%i", a.ipx[0], a.ipx[1], a.ipx[2], a.ipx[3], a.ipx[4], a.ipx[5], a.ipx[6], a.ipx[7], a.ipx[8], a.ipx[9], ntohs(a.port));
else if (a.type == NA_IP) sprintf (s, "%i.%i.%i.%i:%i", a.ip[0], a.ip[1], a.ip[2], a.ip[3], pNtohs(a.port));
else sprintf (s, "%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x:%i", a.ipx[0], a.ipx[1], a.ipx[2], a.ipx[3], a.ipx[4], a.ipx[5], a.ipx[6], a.ipx[7], a.ipx[8], a.ipx[9], pNtohs(a.port));
return s;
}
@ -208,7 +257,7 @@ bool NET_StringToSockaddr (char *s, struct sockaddr *sadr)
DO(17, sa_nodenum[4]);
DO(19, sa_nodenum[5]);
sscanf (&s[22], "%u", &val);
((struct sockaddr_ipx *)sadr)->sa_socket = htons((unsigned short)val);
((struct sockaddr_ipx *)sadr)->sa_socket = pHtons((unsigned short)val);
}
else
{
@ -222,16 +271,16 @@ bool NET_StringToSockaddr (char *s, struct sockaddr *sadr)
if (*colon == ':')
{
*colon = 0;
((struct sockaddr_in *)sadr)->sin_port = htons((short)atoi(colon+1));
((struct sockaddr_in *)sadr)->sin_port = pHtons((short)atoi(colon+1));
}
if (copy[0] >= '0' && copy[0] <= '9')
{
*(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(copy);
*(int *)&((struct sockaddr_in *)sadr)->sin_addr = pInet_Addr(copy);
}
else
{
if (! (h = gethostbyname(copy)) )
if (! (h = pGetHostByName(copy)) )
return 0;
*(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0];
}
@ -350,14 +399,14 @@ bool NET_GetPacket (netsrc_t sock, netadr_t *net_from, sizebuf_t *net_message)
continue;
fromlen = sizeof(from);
ret = recvfrom (net_socket, net_message->data, net_message->maxsize
ret = pRecvFrom (net_socket, net_message->data, net_message->maxsize
, 0, (struct sockaddr *)&from, &fromlen);
SockadrToNetadr (&from, net_from);
if (ret == -1)
{
err = WSAGetLastError();
err = pWSAGetLastError();
if (err == WSAEWOULDBLOCK)
continue;
@ -428,10 +477,10 @@ void NET_SendPacket (netsrc_t sock, int length, void *data, netadr_t to)
NetadrToSockadr (&to, &addr);
ret = sendto (net_socket, data, length, 0, &addr, sizeof(addr) );
ret = pSendTo (net_socket, data, length, 0, &addr, sizeof(addr) );
if (ret == -1)
{
int err = WSAGetLastError();
int err = pWSAGetLastError();
// wouldblock is silent
if (err == WSAEWOULDBLOCK)
@ -476,23 +525,23 @@ int NET_IPSocket (char *net_interface, int port)
int i = 1;
int err;
if ((newsocket = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
if ((newsocket = pSocket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
err = WSAGetLastError();
err = pWSAGetLastError();
if (err != WSAEAFNOSUPPORT)
Msg ("WARNING: UDP_OpenSocket: socket: %s", NET_ErrorString());
return 0;
}
// make it non-blocking
if (ioctlsocket (newsocket, FIONBIO, &_true) == -1)
if (pIoctlSocket (newsocket, FIONBIO, &_true) == -1)
{
Msg ("WARNING: UDP_OpenSocket: ioctl FIONBIO: %s\n", NET_ErrorString());
return 0;
}
// make it broadcast capable
if (setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
if (pSetSockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
{
Msg ("WARNING: UDP_OpenSocket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString());
return 0;
@ -506,14 +555,14 @@ int NET_IPSocket (char *net_interface, int port)
if (port == PORT_ANY)
address.sin_port = 0;
else
address.sin_port = htons((short)port);
address.sin_port = pHtons((short)port);
address.sin_family = AF_INET;
if( bind (newsocket, (void *)&address, sizeof(address)) == -1)
if( pBind (newsocket, (void *)&address, sizeof(address)) == -1)
{
Msg ("WARNING: UDP_OpenSocket: bind: %s\n", NET_ErrorString());
closesocket (newsocket);
pCloseSocket (newsocket);
return 0;
}
@ -583,23 +632,23 @@ int NET_IPXSocket (int port)
int _true = 1;
int err;
if ((newsocket = socket (PF_IPX, SOCK_DGRAM, NSPROTO_IPX)) == -1)
if ((newsocket = pSocket (PF_IPX, SOCK_DGRAM, NSPROTO_IPX)) == -1)
{
err = WSAGetLastError();
err = pWSAGetLastError();
if (err != WSAEAFNOSUPPORT)
Msg ("WARNING: IPX_Socket: socket: %s\n", NET_ErrorString());
return 0;
}
// make it non-blocking
if (ioctlsocket (newsocket, FIONBIO, &_true) == -1)
if (pIoctlSocket (newsocket, FIONBIO, &_true) == -1)
{
Msg ("WARNING: IPX_Socket: ioctl FIONBIO: %s\n", NET_ErrorString());
return 0;
}
// make it broadcast capable
if (setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof(_true)) == -1)
if (pSetSockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof(_true)) == -1)
{
Msg ("WARNING: IPX_Socket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString());
return 0;
@ -611,12 +660,12 @@ int NET_IPXSocket (int port)
if (port == PORT_ANY)
address.sa_socket = 0;
else
address.sa_socket = htons((short)port);
address.sa_socket = pHtons((short)port);
if( bind (newsocket, (void *)&address, sizeof(address)) == -1)
if( pBind (newsocket, (void *)&address, sizeof(address)) == -1)
{
Msg ("WARNING: IPX_Socket: bind: %s\n", NET_ErrorString());
closesocket (newsocket);
pCloseSocket (newsocket);
return 0;
}
@ -664,8 +713,7 @@ void NET_OpenIPX (void)
port = PORT_ANY;
}
ipx_sockets[NS_CLIENT] = NET_IPXSocket (port);
if (!ipx_sockets[NS_CLIENT])
ipx_sockets[NS_CLIENT] = NET_IPXSocket (PORT_ANY);
if (!ipx_sockets[NS_CLIENT]) ipx_sockets[NS_CLIENT] = NET_IPXSocket (PORT_ANY);
}
}
@ -693,12 +741,12 @@ void NET_Config (bool multiplayer)
{
if (ip_sockets[i])
{
closesocket (ip_sockets[i]);
pCloseSocket (ip_sockets[i]);
ip_sockets[i] = 0;
}
if (ipx_sockets[i])
{
closesocket (ipx_sockets[i]);
pCloseSocket (ipx_sockets[i]);
ipx_sockets[i] = 0;
}
}
@ -736,7 +784,7 @@ void NET_Sleep(int msec)
}
timeout.tv_sec = msec/1000;
timeout.tv_usec = (msec%1000)*1000;
select(i+1, &fdset, NULL, NULL, &timeout);
pSelect(i+1, &fdset, NULL, NULL, &timeout);
}
//===================================================================
@ -752,11 +800,12 @@ NET_Init
void NET_Init (void)
{
WORD wVersionRequested;
int r;
int r;
wVersionRequested = MAKEWORD(1, 1);
NET_OpenWinSock(); // loading wsock32.dll
r = WSAStartup (MAKEWORD(1, 1), &winsockdata);
r = pWSAStartup (MAKEWORD(1, 1), &winsockdata);
if(r) Sys_Error("Winsock initialization failed.");
Msg("Winsock Initialized\n");
@ -773,11 +822,11 @@ void NET_Init (void)
NET_Shutdown
====================
*/
void NET_Shutdown (void)
void NET_Shutdown (void)
{
NET_Config (false); // close sockets
WSACleanup ();
pWSACleanup ();
NET_FreeWinSock();
}
@ -790,7 +839,7 @@ char *NET_ErrorString (void)
{
int code;
code = WSAGetLastError ();
code = pWSAGetLastError ();
switch (code)
{
case WSAEINTR: return "WSAEINTR";

842
engine/common/net_wins.c_ Normal file
View File

@ -0,0 +1,842 @@
/*
Copyright (C) 1997-2001 Id Software, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
// net_wins.c
#include "winsock.h"
#include "wsipx.h"
#include "engine.h"
#define MAX_LOOPBACK 4
typedef struct
{
byte data[MAX_MSGLEN];
int datalen;
} loopmsg_t;
typedef struct
{
loopmsg_t msgs[MAX_LOOPBACK];
int get, send;
} loopback_t;
cvar_t *net_shownet;
static cvar_t *noudp;
static cvar_t *noipx;
loopback_t loopbacks[2];
int ip_sockets[2];
int ipx_sockets[2];
char *NET_ErrorString (void);
//=============================================================================
void NetadrToSockadr (netadr_t *a, struct sockaddr *s)
{
memset (s, 0, sizeof(*s));
if (a->type == NA_BROADCAST)
{
((struct sockaddr_in *)s)->sin_family = AF_INET;
((struct sockaddr_in *)s)->sin_port = a->port;
((struct sockaddr_in *)s)->sin_addr.s_addr = INADDR_BROADCAST;
}
else if (a->type == NA_IP)
{
((struct sockaddr_in *)s)->sin_family = AF_INET;
((struct sockaddr_in *)s)->sin_addr.s_addr = *(int *)&a->ip;
((struct sockaddr_in *)s)->sin_port = a->port;
}
else if (a->type == NA_IPX)
{
((struct sockaddr_ipx *)s)->sa_family = AF_IPX;
memcpy(((struct sockaddr_ipx *)s)->sa_netnum, &a->ipx[0], 4);
memcpy(((struct sockaddr_ipx *)s)->sa_nodenum, &a->ipx[4], 6);
((struct sockaddr_ipx *)s)->sa_socket = a->port;
}
else if (a->type == NA_BROADCAST_IPX)
{
((struct sockaddr_ipx *)s)->sa_family = AF_IPX;
memset(((struct sockaddr_ipx *)s)->sa_netnum, 0, 4);
memset(((struct sockaddr_ipx *)s)->sa_nodenum, 0xff, 6);
((struct sockaddr_ipx *)s)->sa_socket = a->port;
}
}
void SockadrToNetadr (struct sockaddr *s, netadr_t *a)
{
if (s->sa_family == AF_INET)
{
a->type = NA_IP;
*(int *)&a->ip = ((struct sockaddr_in *)s)->sin_addr.s_addr;
a->port = ((struct sockaddr_in *)s)->sin_port;
}
else if (s->sa_family == AF_IPX)
{
a->type = NA_IPX;
memcpy(&a->ipx[0], ((struct sockaddr_ipx *)s)->sa_netnum, 4);
memcpy(&a->ipx[4], ((struct sockaddr_ipx *)s)->sa_nodenum, 6);
a->port = ((struct sockaddr_ipx *)s)->sa_socket;
}
}
bool NET_CompareAdr (netadr_t a, netadr_t b)
{
if (a.type != b.type)
return false;
if (a.type == NA_LOOPBACK)
return TRUE;
if (a.type == NA_IP)
{
if (a.ip[0] == b.ip[0] && a.ip[1] == b.ip[1] && a.ip[2] == b.ip[2] && a.ip[3] == b.ip[3] && a.port == b.port)
return true;
return false;
}
if (a.type == NA_IPX)
{
if ((memcmp(a.ipx, b.ipx, 10) == 0) && a.port == b.port)
return true;
return false;
}
return false;
}
/*
===================
NET_CompareBaseAdr
Compares without the port
===================
*/
bool NET_CompareBaseAdr (netadr_t a, netadr_t b)
{
if (a.type != b.type)
return false;
if (a.type == NA_LOOPBACK)
return TRUE;
if (a.type == NA_IP)
{
if (a.ip[0] == b.ip[0] && a.ip[1] == b.ip[1] && a.ip[2] == b.ip[2] && a.ip[3] == b.ip[3])
return true;
return false;
}
if (a.type == NA_IPX)
{
if ((memcmp(a.ipx, b.ipx, 10) == 0))
return true;
return false;
}
return false;
}
char *NET_AdrToString (netadr_t a)
{
static char s[64];
if (a.type == NA_LOOPBACK) sprintf (s, "loopback");
else if (a.type == NA_IP) sprintf (s, "%i.%i.%i.%i:%i", a.ip[0], a.ip[1], a.ip[2], a.ip[3], ntohs(a.port));
else sprintf (s, "%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x:%i", a.ipx[0], a.ipx[1], a.ipx[2], a.ipx[3], a.ipx[4], a.ipx[5], a.ipx[6], a.ipx[7], a.ipx[8], a.ipx[9], ntohs(a.port));
return s;
}
/*
=============
NET_StringToAdr
localhost
idnewt
idnewt:28000
192.246.40.70
192.246.40.70:28000
=============
*/
#define DO(src,dest) \
copy[0] = s[src]; \
copy[1] = s[src + 1]; \
sscanf (copy, "%x", &val); \
((struct sockaddr_ipx *)sadr)->dest = val
bool NET_StringToSockaddr (char *s, struct sockaddr *sadr)
{
struct hostent *h;
char *colon;
int val;
char copy[128];
memset (sadr, 0, sizeof(*sadr));
if ((strlen(s) >= 23) && (s[8] == ':') && (s[21] == ':')) // check for an IPX address
{
((struct sockaddr_ipx *)sadr)->sa_family = AF_IPX;
copy[2] = 0;
DO(0, sa_netnum[0]);
DO(2, sa_netnum[1]);
DO(4, sa_netnum[2]);
DO(6, sa_netnum[3]);
DO(9, sa_nodenum[0]);
DO(11, sa_nodenum[1]);
DO(13, sa_nodenum[2]);
DO(15, sa_nodenum[3]);
DO(17, sa_nodenum[4]);
DO(19, sa_nodenum[5]);
sscanf (&s[22], "%u", &val);
((struct sockaddr_ipx *)sadr)->sa_socket = htons((unsigned short)val);
}
else
{
((struct sockaddr_in *)sadr)->sin_family = AF_INET;
((struct sockaddr_in *)sadr)->sin_port = 0;
strcpy (copy, s);
// strip off a trailing :port if present
for (colon = copy ; *colon ; colon++)
if (*colon == ':')
{
*colon = 0;
((struct sockaddr_in *)sadr)->sin_port = htons((short)atoi(colon+1));
}
if (copy[0] >= '0' && copy[0] <= '9')
{
*(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(copy);
}
else
{
if (! (h = gethostbyname(copy)) )
return 0;
*(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0];
}
}
return true;
}
#undef DO
/*
=============
NET_StringToAdr
localhost
idnewt
idnewt:28000
192.246.40.70
192.246.40.70:28000
=============
*/
bool NET_StringToAdr (char *s, netadr_t *a)
{
struct sockaddr sadr;
if (!strcmp (s, "localhost"))
{
memset (a, 0, sizeof(*a));
a->type = NA_LOOPBACK;
return true;
}
if (!NET_StringToSockaddr (s, &sadr))
return false;
SockadrToNetadr (&sadr, a);
return true;
}
bool NET_IsLocalAddress (netadr_t adr)
{
return adr.type == NA_LOOPBACK;
}
/*
=============================================================================
LOOPBACK BUFFERS FOR LOCAL PLAYER
=============================================================================
*/
bool NET_GetLoopPacket (netsrc_t sock, netadr_t *net_from, sizebuf_t *net_message)
{
int i;
loopback_t *loop;
loop = &loopbacks[sock];
if (loop->send - loop->get > MAX_LOOPBACK)
loop->get = loop->send - MAX_LOOPBACK;
if (loop->get >= loop->send)
return false;
i = loop->get & (MAX_LOOPBACK-1);
loop->get++;
memcpy (net_message->data, loop->msgs[i].data, loop->msgs[i].datalen);
net_message->cursize = loop->msgs[i].datalen;
memset (net_from, 0, sizeof(*net_from));
net_from->type = NA_LOOPBACK;
return true;
}
void NET_SendLoopPacket (netsrc_t sock, int length, void *data, netadr_t to)
{
int i;
loopback_t *loop;
loop = &loopbacks[sock^1];
i = loop->send & (MAX_LOOPBACK-1);
loop->send++;
memcpy (loop->msgs[i].data, data, length);
loop->msgs[i].datalen = length;
}
//=============================================================================
bool NET_GetPacket (netsrc_t sock, netadr_t *net_from, sizebuf_t *net_message)
{
int ret;
struct sockaddr from;
int fromlen;
int net_socket;
int protocol;
int err;
if (NET_GetLoopPacket (sock, net_from, net_message))
return true;
for (protocol = 0 ; protocol < 2 ; protocol++)
{
if (protocol == 0)
net_socket = ip_sockets[sock];
else
net_socket = ipx_sockets[sock];
if (!net_socket)
continue;
fromlen = sizeof(from);
ret = recvfrom (net_socket, net_message->data, net_message->maxsize
, 0, (struct sockaddr *)&from, &fromlen);
SockadrToNetadr (&from, net_from);
if (ret == -1)
{
err = WSAGetLastError();
if (err == WSAEWOULDBLOCK)
continue;
if (err == WSAEMSGSIZE)
{
MsgWarn("NET_GetPacket: Oversize packet from %s\n", NET_AdrToString(*net_from));
continue;
}
if (dedicated->value) // let dedicated servers continue after errors
Msg ("NET_GetPacket: %s from %s\n", NET_ErrorString(), NET_AdrToString(*net_from));
else Host_Error("NET_GetPacket: %s from %s\n", NET_ErrorString(), NET_AdrToString(*net_from));
continue;
}
if (ret == net_message->maxsize)
{
Msg ("Oversize packet from %s\n", NET_AdrToString (*net_from));
continue;
}
net_message->cursize = ret;
return true;
}
return false;
}
//=============================================================================
void NET_SendPacket (netsrc_t sock, int length, void *data, netadr_t to)
{
int ret;
struct sockaddr addr;
int net_socket;
if ( to.type == NA_LOOPBACK )
{
NET_SendLoopPacket (sock, length, data, to);
return;
}
if (to.type == NA_BROADCAST)
{
net_socket = ip_sockets[sock];
if (!net_socket) return;
}
else if (to.type == NA_IP)
{
net_socket = ip_sockets[sock];
if (!net_socket) return;
}
else if (to.type == NA_IPX)
{
net_socket = ipx_sockets[sock];
if (!net_socket) return;
}
else if (to.type == NA_BROADCAST_IPX)
{
net_socket = ipx_sockets[sock];
if (!net_socket) return;
}
else
{
MsgWarn("NET_SendPacket: bad address type\n");
return;
}
NetadrToSockadr (&to, &addr);
ret = sendto (net_socket, data, length, 0, &addr, sizeof(addr) );
if (ret == -1)
{
int err = WSAGetLastError();
// wouldblock is silent
if (err == WSAEWOULDBLOCK)
return;
// some PPP links dont allow broadcasts
if ((err == WSAEADDRNOTAVAIL) && ((to.type == NA_BROADCAST) || (to.type == NA_BROADCAST_IPX)))
return;
if (dedicated->value) // let dedicated servers continue after errors
{
Msg ("NET_SendPacket ERROR: %s to %s\n", NET_ErrorString(), NET_AdrToString (to));
}
else
{
if (err == WSAEADDRNOTAVAIL)
{
MsgWarn("NET_SendPacket: %s : %s\n", NET_ErrorString(), NET_AdrToString (to));
}
else
{
Host_Error("NET_SendPacket: %s to %s\n", NET_ErrorString(), NET_AdrToString(to));
}
}
}
}
//=============================================================================
/*
====================
NET_Socket
====================
*/
int NET_IPSocket (char *net_interface, int port)
{
int newsocket;
struct sockaddr_in address;
bool _true = true;
int i = 1;
int err;
if ((newsocket = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
err = WSAGetLastError();
if (err != WSAEAFNOSUPPORT)
Msg ("WARNING: UDP_OpenSocket: socket: %s", NET_ErrorString());
return 0;
}
// make it non-blocking
if (ioctlsocket (newsocket, FIONBIO, &_true) == -1)
{
Msg ("WARNING: UDP_OpenSocket: ioctl FIONBIO: %s\n", NET_ErrorString());
return 0;
}
// make it broadcast capable
if (setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
{
Msg ("WARNING: UDP_OpenSocket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString());
return 0;
}
if (!net_interface || !net_interface[0] || !stricmp(net_interface, "localhost"))
address.sin_addr.s_addr = INADDR_ANY;
else
NET_StringToSockaddr (net_interface, (struct sockaddr *)&address);
if (port == PORT_ANY)
address.sin_port = 0;
else
address.sin_port = htons((short)port);
address.sin_family = AF_INET;
if( bind (newsocket, (void *)&address, sizeof(address)) == -1)
{
Msg ("WARNING: UDP_OpenSocket: bind: %s\n", NET_ErrorString());
closesocket (newsocket);
return 0;
}
return newsocket;
}
/*
====================
NET_OpenIP
====================
*/
void NET_OpenIP (void)
{
cvar_t *ip;
int port;
int dedicated;
ip = Cvar_Get ("ip", "localhost", CVAR_NOSET);
dedicated = Cvar_VariableValue ("dedicated");
if (!ip_sockets[NS_SERVER])
{
port = Cvar_Get("ip_hostport", "0", CVAR_NOSET)->value;
if (!port)
{
port = Cvar_Get("hostport", "0", CVAR_NOSET)->value;
if (!port)
{
port = Cvar_Get("port", va("%i", PORT_SERVER), CVAR_NOSET)->value;
}
}
ip_sockets[NS_SERVER] = NET_IPSocket (ip->string, port);
if (!ip_sockets[NS_SERVER] && dedicated) Sys_Error("Couldn't allocate dedicated server IP port");
}
// dedicated servers don't need client ports
if (dedicated) return;
if (!ip_sockets[NS_CLIENT])
{
port = Cvar_Get("ip_clientport", "0", CVAR_NOSET)->value;
if (!port)
{
port = Cvar_Get("clientport", va("%i", PORT_CLIENT), CVAR_NOSET)->value;
if (!port)
port = PORT_ANY;
}
ip_sockets[NS_CLIENT] = NET_IPSocket (ip->string, port);
if (!ip_sockets[NS_CLIENT])
ip_sockets[NS_CLIENT] = NET_IPSocket (ip->string, PORT_ANY);
}
}
/*
====================
IPX_Socket
====================
*/
int NET_IPXSocket (int port)
{
int newsocket;
struct sockaddr_ipx address;
int _true = 1;
int err;
if ((newsocket = socket (PF_IPX, SOCK_DGRAM, NSPROTO_IPX)) == -1)
{
err = WSAGetLastError();
if (err != WSAEAFNOSUPPORT)
Msg ("WARNING: IPX_Socket: socket: %s\n", NET_ErrorString());
return 0;
}
// make it non-blocking
if (ioctlsocket (newsocket, FIONBIO, &_true) == -1)
{
Msg ("WARNING: IPX_Socket: ioctl FIONBIO: %s\n", NET_ErrorString());
return 0;
}
// make it broadcast capable
if (setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof(_true)) == -1)
{
Msg ("WARNING: IPX_Socket: setsockopt SO_BROADCAST: %s\n", NET_ErrorString());
return 0;
}
address.sa_family = AF_IPX;
memset (address.sa_netnum, 0, 4);
memset (address.sa_nodenum, 0, 6);
if (port == PORT_ANY)
address.sa_socket = 0;
else
address.sa_socket = htons((short)port);
if( bind (newsocket, (void *)&address, sizeof(address)) == -1)
{
Msg ("WARNING: IPX_Socket: bind: %s\n", NET_ErrorString());
closesocket (newsocket);
return 0;
}
return newsocket;
}
/*
====================
NET_OpenIPX
====================
*/
void NET_OpenIPX (void)
{
int port;
int dedicated;
dedicated = Cvar_VariableValue ("dedicated");
if (!ipx_sockets[NS_SERVER])
{
port = Cvar_Get("ipx_hostport", "0", CVAR_NOSET)->value;
if (!port)
{
port = Cvar_Get("hostport", "0", CVAR_NOSET)->value;
if (!port)
{
port = Cvar_Get("port", va("%i", PORT_SERVER), CVAR_NOSET)->value;
}
}
ipx_sockets[NS_SERVER] = NET_IPXSocket (port);
}
// dedicated servers don't need client ports
if (dedicated)
return;
if (!ipx_sockets[NS_CLIENT])
{
port = Cvar_Get("ipx_clientport", "0", CVAR_NOSET)->value;
if (!port)
{
port = Cvar_Get("clientport", va("%i", PORT_CLIENT), CVAR_NOSET)->value;
if (!port)
port = PORT_ANY;
}
ipx_sockets[NS_CLIENT] = NET_IPXSocket (port);
if (!ipx_sockets[NS_CLIENT])
ipx_sockets[NS_CLIENT] = NET_IPXSocket (PORT_ANY);
}
}
/*
====================
NET_Config
A single player game will only use the loopback code
====================
*/
void NET_Config (bool multiplayer)
{
int i;
static bool old_config;
if (old_config == multiplayer)
return;
old_config = multiplayer;
if (!multiplayer)
{ // shut down any existing sockets
for (i=0 ; i<2 ; i++)
{
if (ip_sockets[i])
{
closesocket (ip_sockets[i]);
ip_sockets[i] = 0;
}
if (ipx_sockets[i])
{
closesocket (ipx_sockets[i]);
ipx_sockets[i] = 0;
}
}
}
else
{ // open sockets
if (! noudp->value)
NET_OpenIP ();
if (! noipx->value)
NET_OpenIPX ();
}
}
// sleeps msec or until net socket is ready
void NET_Sleep(int msec)
{
struct timeval timeout;
fd_set fdset;
extern cvar_t *dedicated;
int i;
if (!dedicated || !dedicated->value)
return; // we're not a server, just run full speed
FD_ZERO(&fdset);
i = 0;
if (ip_sockets[NS_SERVER]) {
FD_SET(ip_sockets[NS_SERVER], &fdset); // network socket
i = ip_sockets[NS_SERVER];
}
if (ipx_sockets[NS_SERVER]) {
FD_SET(ipx_sockets[NS_SERVER], &fdset); // network socket
if (ipx_sockets[NS_SERVER] > i)
i = ipx_sockets[NS_SERVER];
}
timeout.tv_sec = msec/1000;
timeout.tv_usec = (msec%1000)*1000;
select(i+1, &fdset, NULL, NULL, &timeout);
}
//===================================================================
static WSADATA winsockdata;
/*
====================
NET_Init
====================
*/
void NET_Init (void)
{
WORD wVersionRequested;
int r;
wVersionRequested = MAKEWORD(1, 1);
r = WSAStartup (MAKEWORD(1, 1), &winsockdata);
if(r) Sys_Error("Winsock initialization failed.");
Msg("Winsock Initialized\n");
noudp = Cvar_Get ("noudp", "0", CVAR_NOSET);
noipx = Cvar_Get ("noipx", "0", CVAR_NOSET);
net_shownet = Cvar_Get ("net_shownet", "0", 0);
}
/*
====================
NET_Shutdown
====================
*/
void NET_Shutdown (void)
{
NET_Config (false); // close sockets
WSACleanup ();
}
/*
====================
NET_ErrorString
====================
*/
char *NET_ErrorString (void)
{
int code;
code = WSAGetLastError ();
switch (code)
{
case WSAEINTR: return "WSAEINTR";
case WSAEBADF: return "WSAEBADF";
case WSAEACCES: return "WSAEACCES";
case WSAEDISCON: return "WSAEDISCON";
case WSAEFAULT: return "WSAEFAULT";
case WSAEINVAL: return "WSAEINVAL";
case WSAEMFILE: return "WSAEMFILE";
case WSAEWOULDBLOCK: return "WSAEWOULDBLOCK";
case WSAEINPROGRESS: return "WSAEINPROGRESS";
case WSAEALREADY: return "WSAEALREADY";
case WSAENOTSOCK: return "WSAENOTSOCK";
case WSAEDESTADDRREQ: return "WSAEDESTADDRREQ";
case WSAEMSGSIZE: return "WSAEMSGSIZE";
case WSAEPROTOTYPE: return "WSAEPROTOTYPE";
case WSAENOPROTOOPT: return "WSAENOPROTOOPT";
case WSAEPROTONOSUPPORT: return "WSAEPROTONOSUPPORT";
case WSAESOCKTNOSUPPORT: return "WSAESOCKTNOSUPPORT";
case WSAEOPNOTSUPP: return "WSAEOPNOTSUPP";
case WSAEPFNOSUPPORT: return "WSAEPFNOSUPPORT";
case WSAEAFNOSUPPORT: return "WSAEAFNOSUPPORT";
case WSAEADDRINUSE: return "WSAEADDRINUSE";
case WSAEADDRNOTAVAIL: return "WSAEADDRNOTAVAIL";
case WSAENETDOWN: return "WSAENETDOWN";
case WSAENETUNREACH: return "WSAENETUNREACH";
case WSAENETRESET: return "WSAENETRESET";
case WSAECONNABORTED: return "WSWSAECONNABORTEDAEINTR";
case WSAECONNRESET: return "WSAECONNRESET";
case WSAENOBUFS: return "WSAENOBUFS";
case WSAEISCONN: return "WSAEISCONN";
case WSAENOTCONN: return "WSAENOTCONN";
case WSAESHUTDOWN: return "WSAESHUTDOWN";
case WSAETOOMANYREFS: return "WSAETOOMANYREFS";
case WSAETIMEDOUT: return "WSAETIMEDOUT";
case WSAECONNREFUSED: return "WSAECONNREFUSED";
case WSAELOOP: return "WSAELOOP";
case WSAENAMETOOLONG: return "WSAENAMETOOLONG";
case WSAEHOSTDOWN: return "WSAEHOSTDOWN";
case WSASYSNOTREADY: return "WSASYSNOTREADY";
case WSAVERNOTSUPPORTED: return "WSAVERNOTSUPPORTED";
case WSANOTINITIALISED: return "WSANOTINITIALISED";
case WSAHOST_NOT_FOUND: return "WSAHOST_NOT_FOUND";
case WSATRY_AGAIN: return "WSATRY_AGAIN";
case WSANO_RECOVERY: return "WSANO_RECOVERY";
case WSANO_DATA: return "WSANO_DATA";
default: return "NO ERROR";
}
}

View File

@ -43,7 +43,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
# ADD CPP /nologo /MT /W3 /GX /O2 /Ob0 /I "./" /I "prvm" /I "common" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /Ob0 /I "./" /I "prvm" /I "common" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "NDEBUG" /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
@ -54,7 +54,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
# ADD LINK32 gdi32.lib winmm.lib kernel32.lib user32.lib wsock32.lib /nologo /subsystem:windows /dll /pdb:none /machine:I386 /nodefaultlib:"libc.lib"
# ADD LINK32 winmm.lib user32.lib msvcrt.lib /nologo /subsystem:windows /dll /pdb:none /machine:I386 /nodefaultlib:"libc.lib"
# SUBTRACT LINK32 /debug /nodefaultlib
# Begin Custom Build
TargetDir=\XASH3D\src_main\!source\temp\engine\!release
@ -80,7 +80,7 @@ SOURCE="$(InputPath)"
# PROP Ignore_Export_Lib 1
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
# ADD CPP /nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "prvm" /I "common" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /FD /c
# ADD CPP /nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "prvm" /I "common" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /FD /c
# SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "_DEBUG" /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
@ -91,7 +91,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386
# ADD LINK32 winmm.lib wsock32.lib kernel32.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 winmm.lib user32.lib msvcrt.lib /nologo /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"msvcrtd.lib" /pdbtype:sept
# SUBTRACT LINK32 /incremental:no /map /nodefaultlib
# Begin Custom Build
TargetDir=\XASH3D\src_main\!source\temp\engine\!debug

View File

@ -168,6 +168,12 @@ System Events
#define MsgWarn Con_DWarnf
#define Sys_LoadLibrary std.LoadLibrary
#define Sys_FreeLibrary std.FreeLibrary
#define Sys_Sleep std.sleep
#define Sys_Print std.print
#define Sys_Quit std.exit
#define Sys_ConsoleInput std.input
/*
===========================================
Host Interface

78
engine/engine.plg Normal file
View File

@ -0,0 +1,78 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: engine - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\Temp\RSP159C.tmp" with contents
[
winmm.lib user32.lib msvcrt.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\engine\!debug/engine.pdb" /debug /machine:I386 /nodefaultlib:"msvcrtd.lib" /out:"..\temp\engine\!debug/engine.dll" /implib:"..\temp\engine\!debug/engine.lib" /pdbtype:sept
"\XASH3D\src_main\!source\temp\engine\!debug\cl_cin.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_ents.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_fx.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_input.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_inv.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_main.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_newfx.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_parse.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_pred.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_scrn.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_tent.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_view.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cmd.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cmodel.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\common.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\console.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\crc.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cvar.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\host.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\in_win.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\keys.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\md4.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\menu.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\net_chan.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\net_msg.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\net_wins.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\pmove.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\qmenu.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\snd_dma.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\snd_mem.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\snd_mix.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\snd_win.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_ccmds.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_ents.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_game.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_init.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_main.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_phys.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_save.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_send.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_spawn.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_studio.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_user.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_world.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\system.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\vid_dll.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\vid_menu.obj"
]
Creating command line "link.exe @C:\Temp\RSP159C.tmp"
Creating temporary file "C:\Temp\RSP159D.bat" with contents
[
@echo off
copy \XASH3D\src_main\!source\temp\engine\!debug\engine.dll "D:\Xash3D\bin\engine.dll"
]
Creating command line "C:\Temp\RSP159D.bat"
Linking...
<h3>Output Window</h3>
Performing Custom Build Step on \XASH3D\src_main\!source\temp\engine\!debug\engine.dll
‘ª®¯¨à®¢ ­® ä ©«®¢: 1.
<h3>Results</h3>
engine.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -127,7 +127,7 @@ void Host_Init (char *funcname, int argc, char **argv)
s = va("%4.2f %s %s %s", VERSION, "x86", __DATE__, BUILDSTRING);
Cvar_Get ("version", s, CVAR_SERVERINFO|CVAR_NOSET);
if (dedicated->value) Cmd_AddCommand ("quit", Com_Quit);
if (dedicated->value) Cmd_AddCommand ("quit", Sys_Quit);
NET_Init ();
Netchan_Init ();
@ -256,7 +256,7 @@ void Host_Main( void )
while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage (&msg, NULL, 0, 0)) Com_Quit ();
if (!GetMessage (&msg, NULL, 0, 0)) Sys_Quit ();
host.sv_timer = msg.time;
TranslateMessage (&msg);
DispatchMessage (&msg);
@ -272,6 +272,8 @@ void Host_Main( void )
Host_Frame (time); // engine frame
oldtime = newtime;
}
host.state = HOST_SHUTDOWN;
}
@ -282,9 +284,12 @@ Host_Shutdown
*/
void Host_Free (void)
{
SV_Shutdown ("Server shutdown\n", false);
CL_Shutdown ();
Host_FreePlatform();
if(host.state != HOST_ERROR)
{
SV_Shutdown ("Server shutdown\n", false);
CL_Shutdown ();
}
Host_FreePlatform ();
}
/*

View File

@ -24,10 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "client.h"
#include "snd_loc.h"
#define iDirectSoundCreate(a,b,c) pDirectSoundCreate(a,b,c)
extern HWND cl_hwnd;
HRESULT (WINAPI *pDirectSoundCreate)(GUID FAR *lpGUID, LPDIRECTSOUND FAR *lplpDS, IUnknown FAR *pUnkOuter);
// 64K is > 1 second at 16-bit, 22050 Hz
#define WAV_BUFFERS 64
@ -39,20 +36,26 @@ typedef enum {SIS_SUCCESS, SIS_FAILURE, SIS_NOTAVAIL} sndinitstat;
cvar_t *s_wavonly;
static bool dsound_init;
static bool wav_init;
static bool snd_firsttime = true, snd_isdirect, snd_iswave;
static bool primary_format_set;
static bool dsound_init;
static bool wav_init;
static bool snd_firsttime = true, snd_isdirect, snd_iswave;
static bool primary_format_set;
// starts at 0 for disabled
static int snd_buffer_count = 0;
static int sample16;
static int snd_sent, snd_completed;
static int snd_buffer_count = 0;
static int sample16;
static int snd_sent, snd_completed;
/*
* Global variables. Must be visible to window-procedure function
* so it can unlock and free the data block after it has been played.
*/
// Global variables. Must be visible to window-procedure function
// so it can unlock and free the data block after it has been played.
static HRESULT (_stdcall *pDirectSoundCreate)( GUID* lpGUID, LPDIRECTSOUND* lplpDS, IUnknown* pUnkOuter );
static dllfunc_t dsound_funcs[] =
{
{"DirectSoundCreate", (void **) &pDirectSoundCreate },
{ NULL, NULL }
};
dll_info_t dsound_dll = { "dsound.dll", dsound_funcs, NULL, NULL, NULL, false, 0, 0 };
HANDLE hData;
@ -356,39 +359,17 @@ sndinitstat SNDDMA_InitDirect (void)
dma.channels = 2;
dma.samplebits = 16;
if (s_khz->value == 44)
dma.speed = 44100;
if (s_khz->value == 22)
dma.speed = 22050;
else
dma.speed = 11025;
if (s_khz->value == 44) dma.speed = 44100;
if (s_khz->value == 22) dma.speed = 22050;
else dma.speed = 11025;
Msg( "Initializing DirectSound\n");
if ( !hInstDS )
{
MsgDev(D_INFO, "...loading dsound.dll: " );
hInstDS = LoadLibrary("dsound.dll");
if (hInstDS == NULL)
{
MsgDev (D_INFO, "failed\n");
return SIS_FAILURE;
}
MsgDev (D_INFO, "ok\n");
pDirectSoundCreate = (void *)GetProcAddress(hInstDS,"DirectSoundCreate");
if (!pDirectSoundCreate)
{
MsgDev (D_ERROR, "*** couldn't get DS proc addr ***\n");
return SIS_FAILURE;
}
}
if(!Sys_LoadLibrary( &dsound_dll ))
return SIS_FAILURE;
MsgDev(D_INFO, "...creating DS object: " );
while ( ( hresult = iDirectSoundCreate( NULL, &pDS, NULL ) ) != DS_OK )
while ( ( hresult = pDirectSoundCreate( NULL, &pDS, NULL ) ) != DS_OK )
{
if (hresult != DSERR_ALLOCATED)
{

View File

@ -38,22 +38,14 @@ void Sys_Error( const char *error, ... )
vsprintf( syserror1, error, argptr );
va_end( argptr );
host.state = HOST_ERROR;
SV_Shutdown(va("Server fatal crashed: %s\n", syserror1), false);
CL_Shutdown();
std.error("%s", syserror1);
}
void Sys_Quit (void)
{
std.exit();
}
void Sys_Print(const char *pMsg)
{
std.print((char *)pMsg );
}
double Sys_DoubleTime( void )
{
// precision timer
@ -61,16 +53,6 @@ double Sys_DoubleTime( void )
return host.realtime;
}
/*
================
Sys_ConsoleInput
================
*/
char *Sys_ConsoleInput( void )
{
return std.input();
}
/*
================
Sys_SendKeyEvents

View File

@ -63,18 +63,6 @@ DLL GLUE
==========================================================================
*/
void VID_Error (char *fmt, ...)
{
va_list argptr;
char msg[MAX_INPUTLINE];
va_start (argptr, fmt);
vsprintf (msg, fmt, argptr);
va_end (argptr);
Host_Error("%s", msg);
}
stdinout_api_t VID_GetStdio( void )
{
static stdinout_api_t io;
@ -84,9 +72,12 @@ stdinout_api_t VID_GetStdio( void )
io.print = Sys_Print;
io.printf = Msg;
io.dprintf = MsgDev;
io.error = VID_Error;
io.exit = Com_Quit;
io.input = Sys_ConsoleInput;
io.error = Host_Error;
io.exit = Sys_Quit;
io.input = Sys_ConsoleInput;
io.sleep = Sys_Sleep;
io.LoadLibrary = Sys_LoadLibrary;
io.FreeLibrary = Sys_FreeLibrary;
return io;
}

View File

@ -236,7 +236,6 @@ void PlatformMain ( void )
strcpy(typemod, "things" );
break;
}
if(!CompileMod) return;//back to shutdown
mempool = Mem_AllocPool("compiler");

View File

@ -56,8 +56,8 @@ LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /opt:nowin98
# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib /nologo /dll /pdb:none /machine:I386 /opt:nowin98
# Begin Custom Build
TargetDir=\Xash3D\src_main\!source\temp\launcher\!release
InputPath=\Xash3D\src_main\!source\temp\launcher\!release\launcher.dll
TargetDir=\XASH3D\src_main\!source\temp\launcher\!release
InputPath=\XASH3D\src_main\!source\temp\launcher\!release\launcher.dll
SOURCE="$(InputPath)"
"D:\Xash3D\bin\launcher.dll" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
@ -92,8 +92,8 @@ LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# Begin Custom Build
TargetDir=\Xash3D\src_main\!source\temp\launcher\!debug
InputPath=\Xash3D\src_main\!source\temp\launcher\!debug\launcher.dll
TargetDir=\XASH3D\src_main\!source\temp\launcher\!debug
InputPath=\XASH3D\src_main\!source\temp\launcher\!debug\launcher.dll
SOURCE="$(InputPath)"
"D:\Xash3D\bin\launcher.dll" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"

View File

@ -140,6 +140,7 @@ void Sys_Exit (void)
Sys_FreeConsole();
exit(sys_error);
}
//=======================================================================
// DLL'S MANAGER SYSTEM
//=======================================================================
@ -152,6 +153,9 @@ bool Sys_LoadLibrary ( dll_info_t *dll )
// check errors
if(!dll) return false; // invalid desc
if(!dll->name) return false; // nothing to load
if(dll->link) return true; // already loaded
MsgDev(D_ERROR, "Sys_LoadLibrary: Loading %s", dll->name );
if(dll->fcts)
{
@ -162,7 +166,8 @@ bool Sys_LoadLibrary ( dll_info_t *dll )
}
else native_lib = true;
dll->link = LoadLibrary (va("bin/%s", dll->name));
if(!dll->link) dll->link = LoadLibrary ( va("bin/%s", dll->name));
if(!dll->link) dll->link = LoadLibrary ( dll->name ); // environment pathes
// No DLL found
if (!dll->link)
@ -210,17 +215,21 @@ bool Sys_LoadLibrary ( dll_info_t *dll )
sprintf(errorstring, "Sys_LoadLibrary: mismatch version (%i should be %i)\n", check->apiversion, dll->apiversion);
goto error;
}
else MsgDev(D_ERROR, " [%d]", check->apiversion );
if(check->api_size != dll->api_size)
{
sprintf(errorstring, "Sys_LoadLibrary: mismatch interface size (%i should be %i)\n", check->api_size, dll->api_size);
goto error;
}
}
MsgDev(D_ERROR, " - ok\n");
return true;
error:
MsgDev(D_ERROR, " - failed\n");
Sys_FreeLibrary ( dll ); // trying to free
if(dll->crash) Sys_Error( errorstring );
else Msg( errorstring );
else MsgDev( D_INFO, errorstring );
return false;
}

View File

@ -11,6 +11,22 @@
#include "qcclib.h"
#include "blankframe.h"
static uint (_stdcall *qtimeBeginPeriod) ( uint period );
static dword (_stdcall *qtimeGetTime) ( void );
static dllfunc_t winmm_funcs[] =
{
{"timeBeginPeriod", (void **) &qtimeBeginPeriod },
{"timeGetTime", (void **) &qtimeGetTime },
{ NULL, NULL }
};
dll_info_t winmm_dll = { "winmm.dll", winmm_funcs, "", NULL, NULL, true, 0, 0 };
void Plat_LinkDlls( void )
{
//Sys_LoadLibrary( &winmm_dll );
}
char *strupr (char *start)
{

View File

@ -98,6 +98,9 @@ extern gameinfo_t GI;
#define MsgDev std.dprintf
#define MsgWarn std.wprintf
#define Sys_Error std.error
#define Sys_LoadLibrary std.LoadLibrary
#define Sys_FreeLibrary std.FreeLibrary
#define Malloc(size) Mem_Alloc(basepool, size)
#define Z_Malloc(size) Mem_Alloc(zonepool, size)

View File

@ -22,6 +22,8 @@ bool InitPlatform ( int argc, char **argv )
InitMemory();
Plat_InitCPU();
Plat_LinkDlls();
ThreadSetDefault();
FS_Init( argc, argv );

View File

@ -54,7 +54,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /opt:nowin98
# ADD LINK32 kernel32.lib winmm.lib user32.lib /nologo /dll /pdb:none /machine:I386 /opt:nowin98
# ADD LINK32 kernel32.lib winmm.lib /nologo /dll /pdb:none /machine:I386 /opt:nowin98
# Begin Custom Build
TargetDir=\XASH3D\src_main\!source\temp\platform\!release
InputPath=\XASH3D\src_main\!source\temp\platform\!release\platform.dll
@ -90,7 +90,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib winmm.lib user32.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libc.lib" /pdbtype:sept
# ADD LINK32 kernel32.lib winmm.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libc.lib" /pdbtype:sept
# SUBTRACT LINK32 /incremental:no /nodefaultlib
# Begin Custom Build
TargetDir=\XASH3D\src_main\!source\temp\platform\!debug

View File

@ -23,6 +23,7 @@ typedef int bool;
bool InitPlatform ( int argc, char **argv );
void ClosePlatform ( void );
void Plat_InitCPU( void );
void Plat_LinkDlls( void );
double Plat_DoubleTime( void );
filesystem_api_t FS_GetAPI( void );

View File

@ -56,5 +56,5 @@ if exist progs\server.dat copy progs\server.dat D:\Xash3D\xash\server.dat
echo Build succeeded!
echo Please wait. Xash is now loading
cd D:\Xash3D\
xash.exe -game valve +map skytest -debug
xash.exe -game valve +map skytest -debug -log
:done