//========================================================= // Description: // Loads a view weapon. //========================================================= static void CG_LoadViewWeapon ( weaponInfo_t *weapon, const char *modelPath ) { char file[MAX_QPATH]; char *slash; //int root; //int model; Q_strncpyz (file, modelPath, sizeof (file)); slash = Q_strrchr (file, '/'); Q_strncpyz (slash, "/model_default.skin", sizeof (file) - (slash - file)); weapon->viewModelSkin = trap->R_RegisterSkin (file); trap->G2API_InitGhoul2Model (&weapon->g2ViewModel, modelPath, 0, weapon->viewModelSkin, 0, 0, 0); if ( !trap->G2_HaveWeGhoul2Models (weapon->g2ViewModel) ) { return; } /*root = trap->G2API_AddBolt (weapon->g2ViewModel, 0, "model_root"); model = trap->G2API_InitGhoul2Model (&weapon->g2ViewModel, "models/weapons2/test3_r_hand/model.glm", 1, 0, trap->R_RegisterSkin ("models/weapons2/test3_r_hand/model_default.skin"), 0, 0); if ( !trap->G2API_HasGhoul2ModelOnIndex (&weapon->g2ViewModel, 1) ) { trap->Print (S_COLOR_YELLOW "WARNING: Failed to load right hand model.\n"); } trap->G2API_SetBoltInfo (weapon->g2ViewModel, 0, root); trap->G2API_InitGhoul2Model (&weapon->g2ViewModel, "models/weapons2/test3_l_hand/model.glm", 2, 0, trap->R_RegisterSkin ("models/weapons2/test3_l_hand/model_default.skin"), 0, 0); if ( !trap->G2API_HasGhoul2ModelOnIndex (&weapon->g2ViewModel, 2) ) { trap->Print (S_COLOR_YELLOW "WARNING: Failed to load left hand model.\n"); } trap->G2API_SetBoltInfo (weapon->g2ViewModel, 0, root);*/ memset (weapon->viewModelAnims, 0, sizeof (weapon->viewModelAnims)); trap->G2API_GetGLAName (weapon->g2ViewModel, 0, file); if ( !file[0] ) { return; } slash = Q_strrchr (file, '/'); Q_strncpyz (slash, "/animation.cfg", sizeof (file) - (slash - file)); CG_LoadViewWeaponAnimations (weapon, file); }
//----------------------------------------------------------------------------- // The SDK launches the game with the full path to gameinfo.txt, so we need // to strip off the path. //----------------------------------------------------------------------------- const char *GetModDirFromPath( const char *pszPath ) { char *pszSlash = Q_strrchr( pszPath, '\\' ); if ( pszSlash ) { return pszSlash + 1; } else if ( ( pszSlash = Q_strrchr( pszPath, '/' ) ) != NULL ) { return pszSlash + 1; } // Must just be a mod directory already. return pszPath; }
void S_Play_f( void ) { int i; sfxHandle_t h; char name[256]; i = 1; while ( i<Cmd_Argc() ) { if ( !Q_strrchr(Cmd_Argv(i), '.') ) { Com_sprintf( name, sizeof(name), "%s.wav", Cmd_Argv(1) ); } else { Q_strncpyz( name, Cmd_Argv(i), sizeof(name) ); } h = S_RegisterSound( name, qfalse ); if( h ) { S_StartLocalSound( h, CHAN_LOCAL_SOUND ); } i++; } }
/* ================= PlayerIntroSound ================= */ static void PlayerIntroSound( const char *modelAndSkin ) { char model[MAX_QPATH]; char *skin; Q_strncpyz( model, modelAndSkin, sizeof(model) ); skin = Q_strrchr( model, '/' ); if ( skin ) { *skin++ = '\0'; } else { skin = model; } if( Q_stricmp( skin, "default" ) == 0 ) { skin = model; } if( Q_stricmp( skin, "red" ) == 0 ) { skin = model; } if( Q_stricmp( skin, "blue" ) == 0 ) { skin = model; } //precached in cg_info.c, CG_LoadingClient trap_SendConsoleCommand( EXEC_APPEND, va( "play sound/voice/computer/misc/%s.wav\n", skin ) ); }
//============ // UTIL_FileExtension // returns file extension //============ const char *UTIL_FileExtension( const char *in ) { const char *separator, *backslash, *colon, *dot; separator = Q_strrchr( in, '/' ); backslash = Q_strrchr( in, '\\' ); if( !separator || separator < backslash ) separator = backslash; colon = Q_strrchr( in, ':' ); if( !separator || separator < colon ) separator = colon; dot = Q_strrchr( in, '.' ); if( dot == NULL || (separator && ( dot < separator ))) return ""; return dot + 1; }
static void CG_LoadG2ModelWithSkin ( const char *modelPath, void **g2ModelPtr ) { void *g2Model = NULL; trap->G2API_InitGhoul2Model (g2ModelPtr, modelPath, 0, 0, 0, 0, 0); g2Model = *g2ModelPtr; if ( trap->G2_HaveWeGhoul2Models (g2Model) && trap->G2API_SkinlessModel (g2Model, 0) ) { char skinName[MAX_QPATH]; char *slash = NULL; int skinLen = 0; qhandle_t skin; Q_strncpyz (skinName, modelPath, sizeof (skinName)); skinLen = strlen (skinName); slash = Q_strrchr (skinName, '/'); Q_strncpyz (slash, "/model_default.skin", sizeof (skinName) - (slash - skinName)); skin = trap->R_RegisterSkin (skinName); trap->G2API_SetSkin (g2Model, 0, skin, skin); } }
armorG2Reference_t* JKG_RegisterArmorGhoul2(const char* ref, char* model) { // Check and see if we've already registered a GHOUL2 instance with this refname for (int i = 0; i < numUsedG2; i++) { if (!Q_stricmp(g2Table[i].ref, ref)) { return &g2Table[i]; } } if (numUsedG2 >= MAX_ARMOR_G2) { Com_Printf(S_COLOR_RED "Too many armor GHOUL2 instances. Ask the programmers for more space!\n"); return nullptr; // too many } // If not, try and register it // TODO: skins Q_strncpyz(g2Table[numUsedG2].ref, ref, MAX_QPATH); #ifdef _GAME // Strip out the stuff after the * char* find = Q_strrchr(model, '*'); if (find != nullptr) Q_strncpyz(model, model, find - model); #else g2Table[numUsedG2].skin = CG_HandleAppendedSkin(model); #endif trap->G2API_InitGhoul2Model(&g2Table[numUsedG2].instance, model, 0, 0, 0, 0, 0); #ifndef _GAME trap->G2API_SetSkin(g2Table[numUsedG2].instance, 0, g2Table[numUsedG2].skin, g2Table[numUsedG2].skin); g2Table[numUsedG2].numSurfaces = JKG_G2_GetNumberOfSurfaces_(model); #endif return &g2Table[numUsedG2++]; }
int main ( int argc, char* argv[] ) #endif // IPHONE { // int oldtime, newtime; // bk001204 - unused int len, i; char *cmdline; char *cdpath, *sep; void Sys_SetDefaultCDPath(const char *path); // go back to real user for config loads saved_euid = geteuid(); seteuid(getuid()); Sys_ParseArgs( argc, argv ); // bk010104 - added this for support // Can't use CopyString() or Z_Free() yet: cdpath = strdup(argv[0]); if ((sep = Q_strrchr(cdpath, '/'))) *sep = '\0'; Sys_SetDefaultCDPath(cdpath); free(cdpath); // merge the command line, this is kinda silly for (len = 1, i = 1; i < argc; i++) len += strlen(argv[i]) + 1; cmdline = malloc(len); *cmdline = 0; for (i = 1; i < argc; i++) { if (i > 1) strcat(cmdline, " "); strcat(cmdline, argv[i]); } // bk000306 - clear queues memset( &eventQue[0], 0, MAX_QUED_EVENTS*sizeof(sysEvent_t) ); memset( &sys_packetReceived[0], 0, MAX_MSGLEN*sizeof(qbyte) ); Com_Init(cmdline); NET_Init(); Sys_ConsoleInputInit(); fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY); #ifdef DEDICATED // init here for dedicated, as we don't have GLimp_Init InitSig(); #endif #ifndef IPHONE while (1) { #ifdef __linux__ Sys_ConfigureFPU(); #endif Com_Frame (); } #endif // !IPHONE }
/* =================== CG_LoadingClient =================== */ void CG_LoadingClient( int clientNum ) { const char *info; char *skin; char personality[MAX_QPATH]; char model[MAX_QPATH]; char iconName[MAX_QPATH]; info = CG_ConfigString( CS_PLAYERS + clientNum ); if ( loadingPlayerIconCount < MAX_LOADING_PLAYER_ICONS ) { Q_strncpyz( model, Info_ValueForKey( info, "model" ), sizeof( model ) ); skin = Q_strrchr( model, '/' ); if ( skin ) { *skin++ = '\0'; } else { skin = "default"; } Com_sprintf( iconName, MAX_QPATH, "models/aw_players/%s/icon_%s.tga", model, skin ); loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip( iconName ); if ( !loadingPlayerIcons[loadingPlayerIconCount] ) { Com_sprintf( iconName, MAX_QPATH, "models/aw_players/%s/icon_%s.tga", DEFAULT_MODEL, "default" ); loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip( iconName ); } if ( loadingPlayerIcons[loadingPlayerIconCount] ) { loadingPlayerIconCount++; } } Q_strncpyz( personality, Info_ValueForKey( info, "n" ), sizeof(personality) ); Q_CleanStr( personality ); CG_LoadingString( personality ); }
int UDP_Init (void) { struct hostent *local; char buff[MAXHOSTNAMELEN]; struct qsockaddr addr; char *colon; if (COM_CheckParm ("-noudp")) return -1; #if 1 // Android AndroidGetAddr(); #else // determine my name & address gethostname(buff, MAXHOSTNAMELEN); local = gethostbyname(buff); if(!local) { Con_Printf("Could not gethostbyname(\"%s\")\n", buff); return -1; } myAddr = *(int *)local->h_addr_list[0]; // if the quake hostname isn't set, set it to the machine name if (Q_strcmp(hostname.string, "UNNAMED") == 0) { buff[15] = 0; Cvar_Set ("hostname", buff); } #endif if ((net_controlsocket = UDP_OpenSocket (0)) == -1) Sys_Error("UDP_Init: Unable to open control socket\n"); sockaddr_in temp; memcpy(&temp, &broadcastaddr, sizeof(temp)); temp.sin_family = AF_INET; temp.sin_addr.s_addr = INADDR_BROADCAST; temp.sin_port = htons(net_hostport); memcpy(&broadcastaddr, &temp, sizeof(temp)); UDP_GetSocketAddr (net_controlsocket, &addr); Q_strcpy(my_tcpip_address, UDP_AddrToString (&addr)); colon = Q_strrchr (my_tcpip_address, ':'); if (colon) *colon = 0; Con_Printf("UDP Initialized\n"); tcpipAvailable = true; return net_controlsocket; }
/* =========== ForceClientSkin Forces a client's skin (for teamplay) =========== */ static void ForceClientSkin( gclient_t *client, char *model, const char *skin ) { char *p; if ((p = Q_strrchr(model, '/')) != 0) { *p = 0; } Q_strcat(model, MAX_QPATH, "/"); Q_strcat(model, MAX_QPATH, skin); }
// Message handler for PyNetworkCls void __MsgFunc_PyNetworkCls( bf_read &msg ) { char clientClass[PYNETCLS_BUFSIZE]; char networkName[PYNETCLS_BUFSIZE]; int iType = msg.ReadByte(); msg.ReadString(clientClass, PYNETCLS_BUFSIZE); msg.ReadString(networkName, PYNETCLS_BUFSIZE); DbgStrPyMsg( "__MsgFunc_PyNetworkCls: Registering Python network class message %d %s %s\n", iType, clientClass, networkName ); // Get module path const char *pch = Q_strrchr( networkName, '.' ); if( !pch ) { Warning( "Invalid python class name %s\n", networkName ); return; } int n = pch - networkName + 1; char modulePath[PYNETCLS_BUFSIZE]; Q_strncpy( modulePath, networkName, n ); // Make sure the client class is imported SrcPySystem()->Import( modulePath ); // Read which client class we are modifying PyClientClassBase *p = FindPyClientClass( clientClass ); if( !p ) { Warning( "__MsgFunc_PyNetworkCls: Invalid networked class %s\n", clientClass ); return; } // Set type p->SetType( iType ); SetupClientClassRecv( p, iType ); // Read network class name Q_strncpy( p->m_strPyNetworkedClassName, networkName, PYNETCLS_BUFSIZE ); // Attach if a network class exists unsigned short lookup = m_NetworkClassDatabase.Find( networkName ); if ( lookup != m_NetworkClassDatabase.InvalidIndex() ) { m_NetworkClassDatabase.Element(lookup)->AttachClientClass( p ); } else { Warning( "__MsgFunc_PyNetworkCls: Invalid networked class %s\n", networkName ); } }
/* ================= PlayerIntroSound ================= */ static void PlayerIntroSound( const char *modelAndSkin ) { char model[MAX_QPATH]; char *skin; Q_strncpyz( model, modelAndSkin, sizeof( model ) ); skin = Q_strrchr( model, '/' ); if ( skin ) { *skin++ = '\0'; } else { skin = model; } if ( Q_stricmp( skin, "default" ) == 0 ) { skin = model; } trap_SendConsoleCommand( EXEC_APPEND, va( "play sound/player/announce/%s.wav\n", skin ) ); }
/* ================= PlayerIcon ================= */ static void PlayerIcon( const char *modelAndSkin, char *iconName, int iconNameMaxSize ) { char *skin; char model[MAX_QPATH]; Q_strncpyz( model, modelAndSkin, sizeof(model)); skin = Q_strrchr( model, '/' ); if ( skin ) { *skin++ = '\0'; } else { skin = "default"; } Com_sprintf(iconName, iconNameMaxSize, "models/players/%s/icon_%s.tga", model, skin ); if( !trap_R_RegisterShaderNoMip( iconName ) && Q_stricmp( skin, "default" ) != 0 ) { Com_sprintf(iconName, iconNameMaxSize, "models/players/%s/icon_default.tga", model ); } }
int UDP_Init ( void ) { struct hostent *local; char buff[MAXHOSTNAMELEN]; struct qsockaddr addr; char *colon; if (COM_CheckParm ("-noudp")) return -1; // determine my name & address gethostname(buff, MAXHOSTNAMELEN); if ((local = gethostbyname(buff)) == NULL) myAddr = INADDR_LOOPBACK; else myAddr = *(int *)local->h_addr_list[0]; // if the quake hostname isn't set, set it to the machine name if (Q_strcmp(hostname->string, "UNNAMED") == 0) { buff[15] = 0; Cvar_Set (hostname, buff); } if ((net_controlsocket = UDP_OpenSocket (0)) == -1) Sys_Error("UDP_Init: Unable to open control socket\n"); ((struct sockaddr_in *)&broadcastaddr)->sin_family = AF_INET; ((struct sockaddr_in *)&broadcastaddr)->sin_addr.s_addr = INADDR_BROADCAST; ((struct sockaddr_in *)&broadcastaddr)->sin_port = htons(net_hostport); UDP_GetSocketAddr (net_controlsocket, &addr); Q_strcpy(my_tcpip_address, UDP_AddrToString (&addr)); colon = Q_strrchr (my_tcpip_address, ':'); if (colon) *colon = 0; Con_Printf("UDP Initialized\n"); tcpipAvailable = true; return net_controlsocket; }
//----------------------------------------------------------------------------- // Finds all .VMT files in a particular directory //----------------------------------------------------------------------------- bool CMaterial::LoadMaterialsInDirectory( char const* pDirectoryName, int nDirectoryNameLen, IMaterialEnumerator *pEnum, int nContext, int nFlags ) { //Assert( Q_strnicmp( pDirectoryName, "materials", 9 ) == 0 ); char *pWildCard; pWildCard = ( char * )stackalloc( nDirectoryNameLen + 7 ); Q_snprintf( pWildCard, nDirectoryNameLen + 7, "%s/*.vmt", pDirectoryName ); if ( !g_pFileSystem ) { return false; } FileFindHandle_t findHandle; const char *pFileName = g_pFullFileSystem->FindFirstEx( pWildCard, "GAME", &findHandle ); while( pFileName ) { if( !g_pFullFileSystem->FindIsDirectory( findHandle ) ) { // Strip off the 'materials/' part of the material name. char *pFileNameWithPath; int nAllocSize = nDirectoryNameLen + Q_strlen(pFileName) + 2; pFileNameWithPath = (char *)stackalloc( nAllocSize ); Q_snprintf( pFileNameWithPath, nAllocSize, "%s/%s", &pDirectoryName[MATERIAL_PREFIX_LEN], pFileName ); Q_strnlwr( pFileNameWithPath, nAllocSize ); // Strip off the extension... char *pExt = Q_strrchr( pFileNameWithPath, '.'); if (pExt) *pExt = 0; if (!pEnum->EnumMaterial( pFileNameWithPath, nContext )) { return false; } } pFileName = g_pFullFileSystem->FindNext( findHandle ); } g_pFullFileSystem->FindClose( findHandle ); return true; }
static void S_Play (void) { static int hash = 345; int i; char name[256]; sfx_t *sfx; i = 1; while (i < Cmd_Argc()) { q_strlcpy(name, Cmd_Argv(i), sizeof(name)); if (!Q_strrchr(Cmd_Argv(i), '.')) { q_strlcat(name, ".wav", sizeof(name)); } sfx = S_PrecacheSound(name); S_StartSound(hash++, 0, sfx, listener_origin, 1.0, 1.0); i++; } }
// recognize ip:port (based on ProQuake) static const char *Strip_Port (const char *host) { static char noport[MAX_QPATH]; /* array size as in Host_Connect_f() */ char *p; int port; if (!host || !*host) return host; q_strlcpy (noport, host, sizeof(noport)); if ((p = Q_strrchr(noport, ':')) == NULL) return host; *p++ = '\0'; port = Q_atoi (p); if (port > 0 && port < 65536 && port != net_hostport) { net_hostport = port; Con_Printf("Port set to %d\n", net_hostport); } return noport; }
/* =================== CG_LoadingClient =================== */ void CG_LoadingClient( int clientNum ) { const char *info; char *skin; char personality[MAX_QPATH]; char model[MAX_QPATH]; char iconName[MAX_QPATH]; if ( cgs.gametype == GT_SINGLE_PLAYER && clientNum > 0 ) { // for now only show the player's icon in SP games return; } info = CG_ConfigString( CS_PLAYERS + clientNum ); Q_strncpyz( model, Info_ValueForKey( info, "model" ), sizeof( model ) ); skin = Q_strrchr( model, '/' ); if ( skin ) { *skin++ = '\0'; } else { skin = "default"; } Com_sprintf( iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", model, skin ); // (SA) ignore player icons for the moment if ( !( cg_entities[clientNum].currentState.aiChar ) ) { // if ( loadingPlayerIconCount < MAX_LOADING_PLAYER_ICONS ) { // loadingPlayerIcons[loadingPlayerIconCount++] = trap_R_RegisterShaderNoMip( iconName ); // } } Q_strncpyz( personality, Info_ValueForKey( info, "n" ), sizeof( personality ) ); Q_CleanStr( personality ); if ( cgs.gametype == GT_SINGLE_PLAYER ) { trap_S_RegisterSound( va( "sound/player/announce/%s.wav", personality ) ); } CG_LoadingString( personality ); }
static void S_PlayVol (void) { static int hash = 543; int i; float vol; char name[256]; sfx_t *sfx; i = 1; while (i < Cmd_Argc()) { q_strlcpy(name, Cmd_Argv(i), sizeof(name)); if (!Q_strrchr(Cmd_Argv(i), '.')) { q_strlcat(name, ".wav", sizeof(name)); } sfx = S_PrecacheSound(name); vol = Q_atof(Cmd_Argv(i + 1)); S_StartSound(hash++, 0, sfx, listener_origin, vol, 1.0); i += 2; } }
void SetupGameGhoul2Model(gclient_t *client, char *modelname) { int handle; char afilename[MAX_QPATH]; char /**GLAName,*/ *slash; char GLAName[MAX_QPATH]; vec3_t tempVec = {0,0,0}; // First things first. If this is a ghoul2 model, then let's make sure we demolish this first. if (client->ghoul2 && trap_G2_HaveWeGhoul2Models(client->ghoul2)) { trap_G2API_CleanGhoul2Models(&(client->ghoul2)); } /* Com_sprintf( afilename, sizeof( afilename ), "models/players/%s/model.glm", modelname ); handle = trap_G2API_InitGhoul2Model(&client->ghoul2, afilename, 0, 0, -20, 0, 0); if (handle<0) { Com_sprintf( afilename, sizeof( afilename ), "models/players/kyle/model.glm" ); handle = trap_G2API_InitGhoul2Model(&client->ghoul2, afilename, 0, 0, -20, 0, 0); if (handle<0) { return; } } */ //rww - just load the "standard" model for the server" if (!precachedKyle) { Com_sprintf( afilename, sizeof( afilename ), "models/players/kyle/model.glm" ); handle = trap_G2API_InitGhoul2Model(&precachedKyle, afilename, 0, 0, -20, 0, 0); if (handle<0) { return; } } if (precachedKyle && trap_G2_HaveWeGhoul2Models(precachedKyle)) { trap_G2API_DuplicateGhoul2Instance(precachedKyle, &client->ghoul2); } else { return; } // The model is now loaded. GLAName[0] = 0; if (!BGPAFtextLoaded) { //get the location of the animation.cfg //GLAName = trap_G2API_GetGLAName( client->ghoul2, 0); trap_G2API_GetGLAName( client->ghoul2, 0, GLAName); if (!GLAName[0]) { if (!BG_ParseAnimationFile("models/players/_humanoid/animation.cfg")) { Com_Printf( "Failed to load animation file %s\n", afilename ); return; } return; } Q_strncpyz( afilename, GLAName, sizeof( afilename )); slash = Q_strrchr( afilename, '/' ); if ( slash ) { strcpy(slash, "/animation.cfg"); } // Now afilename holds just the path to the animation.cfg else { // Didn't find any slashes, this is a raw filename right in base (whish isn't a good thing) return; } // Try to load the animation.cfg for this model then. if ( !BG_ParseAnimationFile( afilename ) ) { // The GLA's animations failed if (!BG_ParseAnimationFile("models/players/_humanoid/animation.cfg")) { Com_Printf( "Failed to load animation file %s\n", afilename ); return; } } } trap_G2API_AddBolt(client->ghoul2, 0, "*r_hand"); trap_G2API_AddBolt(client->ghoul2, 0, "*l_hand"); // NOTE - ensure this sequence of bolt and bone accessing are always the same because the client expects them in a certain order trap_G2API_SetBoneAnim(client->ghoul2, 0, "model_root", 0, 12, BONE_ANIM_OVERRIDE_LOOP, 1.0f, level.time, -1, -1); trap_G2API_SetBoneAngles(client->ghoul2, 0, "upper_lumbar", tempVec, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL, 0, level.time); trap_G2API_SetBoneAngles(client->ghoul2, 0, "cranium", tempVec, BONE_ANGLES_POSTMULT, POSITIVE_Z, NEGATIVE_Y, POSITIVE_X, NULL, 0, level.time); if (!g2SaberInstance) { trap_G2API_InitGhoul2Model(&g2SaberInstance, "models/weapons2/saber/saber_w.glm", 0, 0, -20, 0, 0); if (g2SaberInstance) { // indicate we will be bolted to model 0 (ie the player) on bolt 0 (always the right hand) when we get copied trap_G2API_SetBoltInfo(g2SaberInstance, 0, 0); // now set up the gun bolt on it trap_G2API_AddBolt(g2SaberInstance, 0, "*flash"); } } if (g2SaberInstance) { trap_G2API_CopySpecificGhoul2Model(g2SaberInstance, 0, client->ghoul2, 1); } }
int WIPX_Init (void) { int i; char buff[MAXHOSTNAMELEN]; struct qsockaddr addr; char *p; int r; WORD wVersionRequested; if (COM_CheckParm ("-noipx")) return -1; // make sure LoadLibrary has happened successfully if (!winsock_lib_initialized) return -1; if (winsock_initialized == 0) { wVersionRequested = MAKEWORD(1, 1); r = pWSAStartup (MAKEWORD(1, 1), &winsockdata); if (r) { Con_Printf ("Winsock initialization failed.\n"); return -1; } } winsock_initialized++; for (i = 0; i < IPXSOCKETS; i++) ipxsocket[i] = 0; // determine my name & address if (pgethostname(buff, MAXHOSTNAMELEN) == 0) { // if the quake hostname isn't set, set it to the machine name if (Q_strcmp(hostname.string, "UNNAMED") == 0) { // see if it's a text IP address (well, close enough) for (p = buff; *p; p++) if ((*p < '0' || *p > '9') && *p != '.') break; // if it is a real name, strip off the domain; we only want the host if (*p) { for (i = 0; i < 15; i++) if (buff[i] == '.') break; buff[i] = 0; } Cvar_Set ("hostname", buff); } } if ((net_controlsocket = WIPX_OpenSocket (0)) == -1) { Con_Printf("WIPX_Init: Unable to open control socket\n"); if (--winsock_initialized == 0) pWSACleanup (); return -1; } ((struct sockaddr_ipx *)&broadcastaddr)->sa_family = AF_IPX; memset(((struct sockaddr_ipx *)&broadcastaddr)->sa_netnum, 0, 4); memset(((struct sockaddr_ipx *)&broadcastaddr)->sa_nodenum, 0xff, 6); ((struct sockaddr_ipx *)&broadcastaddr)->sa_socket = htons((unsigned short)net_hostport); WIPX_GetSocketAddr (net_controlsocket, &addr); Q_strcpy(my_ipx_address, WIPX_AddrToString (&addr)); p = Q_strrchr (my_ipx_address, ':'); if (p) *p = 0; Con_Printf("Winsock IPX Initialized\n"); ipxAvailable = true; return net_controlsocket; }
qboolean Netchan_CopyFileFragments(netchan_t *chan) { fragbuf_t *p; int nsize; unsigned char *buffer; int pos; signed int cursize; char filename[MAX_PATH]; char compressor[32]; fragbuf_s *n; qboolean bCompressed; unsigned int uncompressedSize; if (!chan->incomingready[FRAG_FILE_STREAM]) return FALSE; p = chan->incomingbufs[FRAG_FILE_STREAM]; if (!p) { Con_Printf("%s: Called with no fragments readied\n", __func__); chan->incomingready[FRAG_FILE_STREAM] = FALSE; return FALSE; } bCompressed = FALSE; SZ_Clear(&net_message); MSG_BeginReading(); SZ_Write(&net_message, p->frag_message.data, p->frag_message.cursize); Q_strncpy(filename, MSG_ReadString(), sizeof(filename) - 1); filename[sizeof(filename) - 1] = 0; Q_strncpy(compressor, MSG_ReadString(), sizeof(compressor) - 1); compressor[sizeof(compressor) - 1] = 0; if (!Q_stricmp(compressor, "bz2")) bCompressed = TRUE; uncompressedSize = (unsigned int)MSG_ReadLong(); #ifdef REHLDS_FIXES // TODO: this condition is invalid for server->client // TODO: add console message for client // TODO: add client name to message if (uncompressedSize > 1024 * 64) { Con_Printf("Received too large file (size=%u)\nFlushing input queue\n", uncompressedSize); Netchan_FlushIncoming(chan, 1); return FALSE; } #endif if (Q_strlen(filename) <= 0) { Con_Printf("File fragment received with no filename\nFlushing input queue\n"); Netchan_FlushIncoming(chan, 1); return FALSE; } if (Q_strstr(filename, "..")) { Con_Printf("File fragment received with relative path, ignoring\n"); Netchan_FlushIncoming(chan, 1); return FALSE; } if (filename[0] != '!' && !IsSafeFileToDownload(filename)) { Con_Printf("File fragment received with bad path, ignoring\n"); Netchan_FlushIncoming(chan, 1); return FALSE; } // This prohibits to write files to FS on server if (g_pcls.state == ca_dedicated && filename[0] != '!') { Con_Printf("File fragment received with bad path, ignoring (2)\n"); Netchan_FlushIncoming(chan, 1); return FALSE; } Q_strncpy(chan->incomingfilename, filename, MAX_PATH - 1); chan->incomingfilename[MAX_PATH - 1] = 0; if (filename[0] != '!' && FS_FileExists(filename)) { Con_Printf("Can't download %s, already exists\n", filename); Netchan_FlushIncoming(chan, 1); return TRUE; } nsize = 0; while (p) { nsize += p->frag_message.cursize; if (p == chan->incomingbufs[FRAG_FILE_STREAM]) nsize -= msg_readcount; p = p->next; } buffer = (unsigned char*)Mem_ZeroMalloc(nsize + 1); if (!buffer) { Con_Printf("Buffer allocation failed on %i bytes\n", nsize + 1); Netchan_FlushIncoming(chan, 1); return FALSE; } p = chan->incomingbufs[FRAG_FILE_STREAM]; pos = 0; while (p) { n = p->next; cursize = p->frag_message.cursize; // First message has the file name, don't write that into the data stream, just write the rest of the actual data if (p == chan->incomingbufs[FRAG_FILE_STREAM]) { // Copy it in cursize -= msg_readcount; Q_memcpy(&buffer[pos], &p->frag_message.data[msg_readcount], cursize); p->frag_message.cursize = cursize; } else { Q_memcpy(&buffer[pos], p->frag_message.data, cursize); } pos += p->frag_message.cursize; Mem_Free(p); p = n; } if (bCompressed) { unsigned char* uncompressedBuffer = (unsigned char*)Mem_Malloc(uncompressedSize); Con_DPrintf("Decompressing file %s (%d -> %d)\n", filename, nsize, uncompressedSize); BZ2_bzBuffToBuffDecompress((char*)uncompressedBuffer, &uncompressedSize, (char*)buffer, nsize, 1, 0); Mem_Free(buffer); pos = uncompressedSize; buffer = uncompressedBuffer; } if (filename[0] == '!') { if (chan->tempbuffer) { Con_DPrintf("Netchan_CopyFragments: Freeing holdover tempbuffer\n"); Mem_Free(chan->tempbuffer); } chan->tempbuffer = buffer; chan->tempbuffersize = pos; } else { char filedir[MAX_PATH]; char *pszFileName; FileHandle_t handle; #ifdef REHLDS_CHECKS Q_strncpy(filedir, filename, sizeof(filedir) - 1); filedir[sizeof(filedir) - 1] = 0; #else Q_strncpy(filedir, filename, sizeof(filedir)); #endif // REHLDS_CHECKS COM_FixSlashes(filedir); pszFileName = Q_strrchr(filedir, '\\'); if (pszFileName) { *pszFileName = 0; #ifdef REHLDS_FIXES FS_CreateDirHierarchy(filedir, "GAMEDOWNLOAD"); #endif } #ifndef REHLDS_FIXES FS_CreateDirHierarchy(filedir, "GAMEDOWNLOAD"); #endif handle = FS_OpenPathID(filename, "wb", "GAMEDOWNLOAD"); if (!handle) { Con_Printf("File open failed %s\n", filename); Netchan_FlushIncoming(chan, 1); #ifdef REHLDS_FIXES Mem_Free(buffer); #endif return FALSE; } Sys_Printf("COM_WriteFile: %s\n", filename); FS_Write(buffer, pos, 1, handle); FS_Close(handle); Mem_Free(buffer); } SZ_Clear(&net_message); chan->incomingbufs[FRAG_FILE_STREAM] = nullptr; chan->incomingready[FRAG_FILE_STREAM] = FALSE; msg_readcount = 0; return TRUE; }
int MPATH_Init ( void ) { int i; struct hostent *local = NULL; char buff[MAXHOSTNAMELEN]; struct qsockaddr addr; char *p; if (COM_CheckParm ("-mpath") == 0) return -1; flat_selector = __dpmi_allocate_ldt_descriptors(1); if (flat_selector == -1) { Con_Printf("MPATH_Init: Can't get flat selector\n"); return -1; } if (__dpmi_set_segment_base_address(flat_selector, 0) == -1) { Con_Printf("MPATH_Init: Can't seg flat base!\n"); return -1; } if (__dpmi_set_segment_limit(flat_selector, 0xffffffff) == -1) { Con_Printf("MPATH_Init: Can't set segment limit\n"); return -1; } // determine my name & address if (gethostname(buff, MAXHOSTNAMELEN) == 0) local = gethostbyname(buff); if (local) { myAddr = *(int *)local->h_addr_list[0]; // if the quake hostname isn't set, set it to the machine name if (Q_strcmp(hostname -> string, "UNNAMED") == 0) { // see if it's a text IP address (well, close enough) for (p = buff; *p; p++) if ((*p < '0' || *p > '9') && *p != '.') break; // if it is a real name, strip off the domain; we only want the host if (*p) { for (i = 0; i < 15; i++) if (buff[i] == '.') break; buff[i] = 0; } Cvar_Set (hostname, buff); } } if ((net_controlsocket = MPATH_OpenSocket (0)) == -1) Sys_Error("MPATH_Init: Unable to open control socket\n"); ((struct sockaddr_in *)&broadcastaddr)->sin_family = AF_INET; ((struct sockaddr_in *)&broadcastaddr)->sin_addr.s_addr = INADDR_BROADCAST; ((struct sockaddr_in *)&broadcastaddr)->sin_port = htons(net_hostport); MPATH_GetSocketAddr (net_controlsocket, &addr); Q_strcpy(my_tcpip_address, MPATH_AddrToString (&addr)); p = Q_strrchr (my_tcpip_address, ':'); if (p) *p = 0; Con_Printf("MPath Initialized\n"); tcpipAvailable = true; return net_controlsocket; }
/* =================== CG_LoadingClient =================== */ void CG_LoadingClient(int clientNum) { const char *info; char *skin; char personality[MAX_QPATH]; char model[MAX_QPATH]; char iconName[MAX_QPATH]; info = CG_ConfigString(CS_PLAYERS + clientNum); if (loadingPlayerIconCount < MAX_LOADING_PLAYER_ICONS) { Q_strncpyz(model, Info_ValueForKey(info, "model"), sizeof(model)); skin = Q_strrchr(model, '/'); if (skin) { *skin++ = '\0'; } else { switch (atoi(Info_ValueForKey(info, "t"))) { case TEAM_BLUE: skin = "default"; break; default: skin = "red"; break; } } if (!model[0]) strcpy(model, DEFAULT_MODEL); Com_sprintf(iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", model, skin); loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip(iconName); if (!loadingPlayerIcons[loadingPlayerIconCount]) { Com_sprintf( iconName, MAX_QPATH, "models/players/characters/%s/icon_%s.tga", model, skin ); loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip( iconName ); } if (!loadingPlayerIcons[loadingPlayerIconCount]) { Com_sprintf(iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", DEFAULT_MODEL, "default"); loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip(iconName); } if (loadingPlayerIcons[loadingPlayerIconCount]) { loadingPlayerIconCount++; } } Q_strncpyz(personality, Info_ValueForKey(info, "n"), sizeof(personality)); Q_CleanStr(personality); if (cgs.gametype == GT_SINGLE_PLAYER) { trap_S_RegisterSound(va("sound/player/announce/%s.wav", personality), qtrue); } CG_LoadingString(personality); }
/* ================== SV_WriteDownloadToClient Check to see if the client wants a file, open it if needed and start pumping the client Fill up msg with data ================== */ void SV_WriteDownloadToClient( client_t *cl , msg_t *msg ) { int curindex; int rate; int blockspersnap; int idPack = 0, missionPack = 0, unreferenced = 1; char errorMessage[1024]; char pakbuf[MAX_QPATH], *pakptr; int numRefPaks; if (!*cl->downloadName) return; // Nothing being downloaded if (!cl->download) { // Chop off filename extension. Com_sprintf(pakbuf, sizeof(pakbuf), "%s", cl->downloadName); pakptr = Q_strrchr(pakbuf, '.'); if(pakptr) { *pakptr = '\0'; // Check for pk3 filename extension if(!Q_stricmp(pakptr + 1, "pk3")) { const char *referencedPaks = FS_ReferencedPakNames(); // Check whether the file appears in the list of referenced // paks to prevent downloading of arbitrary files. Cmd_TokenizeStringIgnoreQuotes(referencedPaks); numRefPaks = Cmd_Argc(); for(curindex = 0; curindex < numRefPaks; curindex++) { if(!FS_FilenameCompare(Cmd_Argv(curindex), pakbuf)) { unreferenced = 0; // now that we know the file is referenced, // check whether it's legal to download it. missionPack = FS_idPak(pakbuf, "missionpack"); idPack = missionPack || FS_idPak(pakbuf, BASEGAME); break; } } } } cl->download = 0; // We open the file here if ( !(sv_allowDownload->integer & DLF_ENABLE) || (sv_allowDownload->integer & DLF_NO_UDP) || idPack || unreferenced || ( cl->downloadSize = FS_SV_FOpenFileRead( cl->downloadName, &cl->download ) ) < 0 ) { // cannot auto-download file if(unreferenced) { Com_Printf("clientDownload: %d : \"%s\" is not referenced and cannot be downloaded.\n", (int) (cl - svs.clients), cl->downloadName); Com_sprintf(errorMessage, sizeof(errorMessage), "File \"%s\" is not referenced and cannot be downloaded.", cl->downloadName); } else if (idPack) { Com_Printf("clientDownload: %d : \"%s\" cannot download id pk3 files\n", (int) (cl - svs.clients), cl->downloadName); if (missionPack) { Com_sprintf(errorMessage, sizeof(errorMessage), "Cannot autodownload Team Arena file \"%s\"\n" "The Team Arena mission pack can be found in your local game store.", cl->downloadName); } else { Com_sprintf(errorMessage, sizeof(errorMessage), "Cannot autodownload id pk3 file \"%s\"", cl->downloadName); } } else if ( !(sv_allowDownload->integer & DLF_ENABLE) || (sv_allowDownload->integer & DLF_NO_UDP) ) { Com_Printf("clientDownload: %d : \"%s\" download disabled", (int) (cl - svs.clients), cl->downloadName); if (sv_pure->integer) { Com_sprintf(errorMessage, sizeof(errorMessage), "Could not download \"%s\" because autodownloading is disabled on the server.\n\n" "You will need to get this file elsewhere before you " "can connect to this pure server.\n", cl->downloadName); } else { Com_sprintf(errorMessage, sizeof(errorMessage), "Could not download \"%s\" because autodownloading is disabled on the server.\n\n" "The server you are connecting to is not a pure server, " "set autodownload to No in your settings and you might be " "able to join the game anyway.\n", cl->downloadName); } } else { // NOTE TTimo this is NOT supposed to happen unless bug in our filesystem scheme? // if the pk3 is referenced, it must have been found somewhere in the filesystem Com_Printf("clientDownload: %d : \"%s\" file not found on server\n", (int) (cl - svs.clients), cl->downloadName); Com_sprintf(errorMessage, sizeof(errorMessage), "File \"%s\" not found on server for autodownloading.\n", cl->downloadName); } MSG_WriteByte( msg, svc_download ); MSG_WriteShort( msg, 0 ); // client is expecting block zero MSG_WriteLong( msg, -1 ); // illegal file size MSG_WriteString( msg, errorMessage ); *cl->downloadName = 0; if(cl->download) FS_FCloseFile(cl->download); return; } Com_Printf( "clientDownload: %d : beginning \"%s\"\n", (int) (cl - svs.clients), cl->downloadName ); // Init cl->downloadCurrentBlock = cl->downloadClientBlock = cl->downloadXmitBlock = 0; cl->downloadCount = 0; cl->downloadEOF = qfalse; } // Perform any reads that we need to while (cl->downloadCurrentBlock - cl->downloadClientBlock < MAX_DOWNLOAD_WINDOW && cl->downloadSize != cl->downloadCount) { curindex = (cl->downloadCurrentBlock % MAX_DOWNLOAD_WINDOW); if (!cl->downloadBlocks[curindex]) cl->downloadBlocks[curindex] = Z_Malloc( MAX_DOWNLOAD_BLKSIZE ); cl->downloadBlockSize[curindex] = FS_Read( cl->downloadBlocks[curindex], MAX_DOWNLOAD_BLKSIZE, cl->download ); if (cl->downloadBlockSize[curindex] < 0) { // EOF right now cl->downloadCount = cl->downloadSize; break; } cl->downloadCount += cl->downloadBlockSize[curindex]; // Load in next block cl->downloadCurrentBlock++; } // Check to see if we have eof condition and add the EOF block if (cl->downloadCount == cl->downloadSize && !cl->downloadEOF && cl->downloadCurrentBlock - cl->downloadClientBlock < MAX_DOWNLOAD_WINDOW) { cl->downloadBlockSize[cl->downloadCurrentBlock % MAX_DOWNLOAD_WINDOW] = 0; cl->downloadCurrentBlock++; cl->downloadEOF = qtrue; // We have added the EOF block } // Loop up to window size times based on how many blocks we can fit in the // client snapMsec and rate // based on the rate, how many bytes can we fit in the snapMsec time of the client // normal rate / snapshotMsec calculation rate = cl->rate; if ( sv_maxRate->integer ) { if ( sv_maxRate->integer < 1000 ) { Cvar_Set( "sv_MaxRate", "1000" ); } if ( sv_maxRate->integer < rate ) { rate = sv_maxRate->integer; } } if ( sv_minRate->integer ) { if ( sv_minRate->integer < 1000 ) Cvar_Set( "sv_minRate", "1000" ); if ( sv_minRate->integer > rate ) rate = sv_minRate->integer; } if (!rate) { blockspersnap = 1; } else { blockspersnap = ( (rate * cl->snapshotMsec) / 1000 + MAX_DOWNLOAD_BLKSIZE ) / MAX_DOWNLOAD_BLKSIZE; } if (blockspersnap < 0) blockspersnap = 1; while (blockspersnap--) { // Write out the next section of the file, if we have already reached our window, // automatically start retransmitting if (cl->downloadClientBlock == cl->downloadCurrentBlock) return; // Nothing to transmit if (cl->downloadXmitBlock == cl->downloadCurrentBlock) { // We have transmitted the complete window, should we start resending? //FIXME: This uses a hardcoded one second timeout for lost blocks //the timeout should be based on client rate somehow if (svs.time - cl->downloadSendTime > 1000) cl->downloadXmitBlock = cl->downloadClientBlock; else return; } // Send current block curindex = (cl->downloadXmitBlock % MAX_DOWNLOAD_WINDOW); MSG_WriteByte( msg, svc_download ); MSG_WriteShort( msg, cl->downloadXmitBlock ); // block zero is special, contains file size if ( cl->downloadXmitBlock == 0 ) MSG_WriteLong( msg, cl->downloadSize ); MSG_WriteShort( msg, cl->downloadBlockSize[curindex] ); // Write the block if ( cl->downloadBlockSize[curindex] ) { MSG_WriteData( msg, cl->downloadBlocks[curindex], cl->downloadBlockSize[curindex] ); } Com_DPrintf( "clientDownload: %d : writing block %d\n", (int) (cl - svs.clients), cl->downloadXmitBlock ); // Move on to the next block // It will get sent with next snap shot. The rate will keep us in line. cl->downloadXmitBlock++; cl->downloadSendTime = svs.time; } }
int UDP_Init (void) { struct hostent *local; char* buff; struct qsockaddr addr; char *colon; if (COM_CheckParm ("-noudp")) return -1; // determine my name & address struct ifaddrs *allInterfaces; if (getifaddrs(&allInterfaces) == 0) { struct ifaddrs *interface; for (interface = allInterfaces; interface != NULL; interface = interface->ifa_next) { unsigned int flags = interface->ifa_flags; struct sockaddr *addr = interface->ifa_addr; if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) { if (addr->sa_family == AF_INET) { buff = malloc(MAXHOSTNAMELEN + 1); getnameinfo(addr, addr->sa_len, buff, MAXHOSTNAMELEN, NULL, 0, NI_NUMERICHOST); if (net_ipaddressescount >= net_ipaddressessize) { int newsize = net_ipaddressescount + 4; char** newipaddresses = malloc(newsize * sizeof(char*)); if (net_ipaddresses != NULL) { memcpy(newipaddresses, net_ipaddresses, net_ipaddressescount * sizeof(char*)); free(net_ipaddresses); } net_ipaddresses = newipaddresses; net_ipaddressessize = newsize; } net_ipaddresses[net_ipaddressescount] = buff; net_ipaddressescount++; } } } freeifaddrs(allInterfaces); if (net_ipaddressescount == 0) { return -1; } if (net_ipaddress == NULL) { buff = net_ipaddresses[net_ipaddressescount - 1]; local = gethostbyname(buff); if (local == NULL) { return -1; } myAddr = *(int *)local->h_addr_list[0]; } else { qboolean found = false; for (int i = 0; i < net_ipaddressescount; i++) { buff = net_ipaddresses[i]; if (strcmp(net_ipaddress, buff) == 0) { local = gethostbyname(buff); if (local == NULL) { return -1; } myAddr = *(int *)local->h_addr_list[0]; found = true; } } if (!found) { return -1; } } } else { return -1; } // if the quake hostname isn't set, set it to the machine name if (Q_strcmp(hostname.string, "UNNAMED") == 0) { buff[15] = 0; Cvar_Set ("hostname", buff); } if ((net_controlsocket = UDP_OpenSocket (0)) == -1) Sys_Error("UDP_Init: Unable to open control socket\n"); ((struct sockaddr_in *)&broadcastaddr)->sin_family = AF_INET; ((struct sockaddr_in *)&broadcastaddr)->sin_addr.s_addr = INADDR_BROADCAST; ((struct sockaddr_in *)&broadcastaddr)->sin_port = htons(net_hostport); UDP_GetSocketAddr (net_controlsocket, &addr); Q_strcpy(my_tcpip_address, UDP_AddrToString (&addr)); colon = Q_strrchr (my_tcpip_address, ':'); if (colon) *colon = 0; Con_Printf("UDP Initialized\n"); tcpipAvailable = true; return net_controlsocket; }
int main( int argc, char **argv ) { SpewOutputFunc( VTF2TGAOutputFunc ); CommandLine()->CreateCmdLine( argc, argv ); MathLib_Init( 2.2f, 2.2f, 0.0f, 1.0f, false, false, false, false ); InitDefaultFileSystem(); const char *pVTFFileName = CommandLine()->ParmValue( "-i" ); const char *pTGAFileName = CommandLine()->ParmValue( "-o" ); bool bGenerateMipLevels = CommandLine()->CheckParm( "-mip" ) != NULL; if ( !pVTFFileName ) { Usage(); } if ( !pTGAFileName ) { pTGAFileName = pVTFFileName; } char pCurrentDirectory[MAX_PATH]; if ( _getcwd( pCurrentDirectory, sizeof(pCurrentDirectory) ) == NULL ) { fprintf( stderr, "Unable to get the current directory\n" ); return -1; } Q_StripTrailingSlash( pCurrentDirectory ); char pBuf[MAX_PATH]; if ( !Q_IsAbsolutePath( pTGAFileName ) ) { Q_snprintf( pBuf, sizeof(pBuf), "%s\\%s", pCurrentDirectory, pTGAFileName ); } else { Q_strncpy( pBuf, pTGAFileName, sizeof(pBuf) ); } Q_FixSlashes( pBuf ); char pOutFileNameBase[MAX_PATH]; Q_StripExtension( pBuf, pOutFileNameBase, MAX_PATH ); char pActualVTFFileName[MAX_PATH]; Q_strncpy( pActualVTFFileName, pVTFFileName, MAX_PATH ); if ( !Q_strstr( pActualVTFFileName, ".vtf" ) ) { Q_strcat( pActualVTFFileName, ".vtf", MAX_PATH ); } FILE *vtfFp = fopen( pActualVTFFileName, "rb" ); if( !vtfFp ) { Error( "Can't open %s\n", pActualVTFFileName ); exit( -1 ); } fseek( vtfFp, 0, SEEK_END ); int srcVTFLength = ftell( vtfFp ); fseek( vtfFp, 0, SEEK_SET ); CUtlBuffer buf; buf.EnsureCapacity( srcVTFLength ); int nBytesRead = fread( buf.Base(), 1, srcVTFLength, vtfFp ); fclose( vtfFp ); buf.SeekPut( CUtlBuffer::SEEK_HEAD, nBytesRead ); IVTFTexture *pTex = CreateVTFTexture(); if (!pTex->Unserialize( buf )) { Error( "*** Error reading in .VTF file %s\n", pActualVTFFileName ); exit(-1); } Msg( "vtf width: %d\n", pTex->Width() ); Msg( "vtf height: %d\n", pTex->Height() ); Msg( "vtf numFrames: %d\n", pTex->FrameCount() ); Msg( "TEXTUREFLAGS_POINTSAMPLE=%s\n", ( pTex->Flags() & TEXTUREFLAGS_POINTSAMPLE ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_TRILINEAR=%s\n", ( pTex->Flags() & TEXTUREFLAGS_TRILINEAR ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_CLAMPS=%s\n", ( pTex->Flags() & TEXTUREFLAGS_CLAMPS ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_CLAMPT=%s\n", ( pTex->Flags() & TEXTUREFLAGS_CLAMPT ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_CLAMPU=%s\n", ( pTex->Flags() & TEXTUREFLAGS_CLAMPU ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_BORDER=%s\n", ( pTex->Flags() & TEXTUREFLAGS_BORDER ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_ANISOTROPIC=%s\n", ( pTex->Flags() & TEXTUREFLAGS_ANISOTROPIC ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_HINT_DXT5=%s\n", ( pTex->Flags() & TEXTUREFLAGS_HINT_DXT5 ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_SRGB=%s\n", ( pTex->Flags() & TEXTUREFLAGS_SRGB ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_NORMAL=%s\n", ( pTex->Flags() & TEXTUREFLAGS_NORMAL ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_NOMIP=%s\n", ( pTex->Flags() & TEXTUREFLAGS_NOMIP ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_NOLOD=%s\n", ( pTex->Flags() & TEXTUREFLAGS_NOLOD ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_ALL_MIPS=%s\n", ( pTex->Flags() & TEXTUREFLAGS_ALL_MIPS ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_PROCEDURAL=%s\n", ( pTex->Flags() & TEXTUREFLAGS_PROCEDURAL ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_ONEBITALPHA=%s\n", ( pTex->Flags() & TEXTUREFLAGS_ONEBITALPHA ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_EIGHTBITALPHA=%s\n", ( pTex->Flags() & TEXTUREFLAGS_EIGHTBITALPHA ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_ENVMAP=%s\n", ( pTex->Flags() & TEXTUREFLAGS_ENVMAP ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_RENDERTARGET=%s\n", ( pTex->Flags() & TEXTUREFLAGS_RENDERTARGET ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_DEPTHRENDERTARGET=%s\n", ( pTex->Flags() & TEXTUREFLAGS_DEPTHRENDERTARGET ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_NODEBUGOVERRIDE=%s\n", ( pTex->Flags() & TEXTUREFLAGS_NODEBUGOVERRIDE ) ? "true" : "false" ); Msg( "TEXTUREFLAGS_SINGLECOPY=%s\n", ( pTex->Flags() & TEXTUREFLAGS_SINGLECOPY ) ? "true" : "false" ); Vector vecReflectivity = pTex->Reflectivity(); Msg( "vtf reflectivity: %f %f %f\n", vecReflectivity[0], vecReflectivity[1], vecReflectivity[2] ); Msg( "transparency: " ); if( pTex->Flags() & TEXTUREFLAGS_EIGHTBITALPHA ) { Msg( "eightbitalpha\n" ); } else if( pTex->Flags() & TEXTUREFLAGS_ONEBITALPHA ) { Msg( "onebitalpha\n" ); } else { Msg( "noalpha\n" ); } ImageFormat srcFormat = pTex->Format(); Msg( "vtf format: %s\n", ImageLoader::GetName( srcFormat ) ); int iTGANameLen = Q_strlen( pOutFileNameBase ); int iFaceCount = pTex->FaceCount(); int nFrameCount = pTex->FrameCount(); bool bIsCubeMap = pTex->IsCubeMap(); int iLastMipLevel = bGenerateMipLevels ? pTex->MipCount() - 1 : 0; for( int iFrame = 0; iFrame < nFrameCount; ++iFrame ) { for ( int iMipLevel = 0; iMipLevel <= iLastMipLevel; ++iMipLevel ) { int iWidth, iHeight, iDepth; pTex->ComputeMipLevelDimensions( iMipLevel, &iWidth, &iHeight, &iDepth ); for (int iCubeFace = 0; iCubeFace < iFaceCount; ++iCubeFace) { for ( int z = 0; z < iDepth; ++z ) { // Construct output filename char *pTempNameBuf = (char *)stackalloc( iTGANameLen + 13 ); Q_strncpy( pTempNameBuf, pOutFileNameBase, iTGANameLen + 1 ); char *pExt = Q_strrchr( pTempNameBuf, '.' ); if ( pExt ) { pExt = 0; } if ( bIsCubeMap ) { Assert( pTex->Depth() == 1 ); // shouldn't this be 1 instead of 0? static const char *pCubeFaceName[7] = { "rt", "lf", "bk", "ft", "up", "dn", "sph" }; Q_strcat( pTempNameBuf, pCubeFaceName[iCubeFace], iTGANameLen + 13 ); } if ( nFrameCount > 1 ) { char pTemp[4]; Q_snprintf( pTemp, 4, "%03d", iFrame ); Q_strcat( pTempNameBuf, pTemp, iTGANameLen + 13 ); } if ( iLastMipLevel != 0 ) { char pTemp[8]; Q_snprintf( pTemp, 8, "_mip%d", iMipLevel ); Q_strcat( pTempNameBuf, pTemp, iTGANameLen + 13 ); } if ( pTex->Depth() > 1 ) { char pTemp[6]; Q_snprintf( pTemp, 6, "_z%03d", z ); Q_strcat( pTempNameBuf, pTemp, iTGANameLen + 13 ); } if( srcFormat == IMAGE_FORMAT_RGBA16161616F ) { Q_strcat( pTempNameBuf, ".pfm", iTGANameLen + 13 ); } else { Q_strcat( pTempNameBuf, ".tga", iTGANameLen + 13 ); } unsigned char *pSrcImage = pTex->ImageData( iFrame, iCubeFace, iMipLevel, 0, 0, z ); ImageFormat dstFormat; if( srcFormat == IMAGE_FORMAT_RGBA16161616F ) { dstFormat = IMAGE_FORMAT_RGB323232F; } else { if( ImageLoader::IsTransparent( srcFormat ) || (srcFormat == IMAGE_FORMAT_ATI1N ) || (srcFormat == IMAGE_FORMAT_ATI2N )) { dstFormat = IMAGE_FORMAT_BGRA8888; } else { dstFormat = IMAGE_FORMAT_BGR888; } } // dstFormat = IMAGE_FORMAT_RGBA8888; // dstFormat = IMAGE_FORMAT_RGB888; // dstFormat = IMAGE_FORMAT_BGRA8888; // dstFormat = IMAGE_FORMAT_BGR888; // dstFormat = IMAGE_FORMAT_BGRA5551; // dstFormat = IMAGE_FORMAT_BGR565; // dstFormat = IMAGE_FORMAT_BGRA4444; // printf( "dstFormat: %s\n", ImageLoader::GetName( dstFormat ) ); unsigned char *pDstImage = new unsigned char[ImageLoader::GetMemRequired( iWidth, iHeight, 1, dstFormat, false )]; if( !ImageLoader::ConvertImageFormat( pSrcImage, srcFormat, pDstImage, dstFormat, iWidth, iHeight, 0, 0 ) ) { Error( "Error converting from %s to %s\n", ImageLoader::GetName( srcFormat ), ImageLoader::GetName( dstFormat ) ); exit( -1 ); } if( dstFormat != IMAGE_FORMAT_RGB323232F ) { if( ImageLoader::IsTransparent( dstFormat ) && ( dstFormat != IMAGE_FORMAT_RGBA8888 ) ) { unsigned char *tmpImage = pDstImage; pDstImage = new unsigned char[ImageLoader::GetMemRequired( iWidth, iHeight, 1, IMAGE_FORMAT_RGBA8888, false )]; if( !ImageLoader::ConvertImageFormat( tmpImage, dstFormat, pDstImage, IMAGE_FORMAT_RGBA8888, iWidth, iHeight, 0, 0 ) ) { Error( "Error converting from %s to %s\n", ImageLoader::GetName( dstFormat ), ImageLoader::GetName( IMAGE_FORMAT_RGBA8888 ) ); } dstFormat = IMAGE_FORMAT_RGBA8888; } else if( !ImageLoader::IsTransparent( dstFormat ) && ( dstFormat != IMAGE_FORMAT_RGB888 ) ) { unsigned char *tmpImage = pDstImage; pDstImage = new unsigned char[ImageLoader::GetMemRequired( iWidth, iHeight, 1, IMAGE_FORMAT_RGB888, false )]; if( !ImageLoader::ConvertImageFormat( tmpImage, dstFormat, pDstImage, IMAGE_FORMAT_RGB888, iWidth, iHeight, 0, 0 ) ) { Error( "Error converting from %s to %s\n", ImageLoader::GetName( dstFormat ), ImageLoader::GetName( IMAGE_FORMAT_RGB888 ) ); } dstFormat = IMAGE_FORMAT_RGB888; } CUtlBuffer outBuffer; TGAWriter::WriteToBuffer( pDstImage, outBuffer, iWidth, iHeight, dstFormat, dstFormat ); if ( !g_pFullFileSystem->WriteFile( pTempNameBuf, NULL, outBuffer ) ) { fprintf( stderr, "unable to write %s\n", pTempNameBuf ); } } else { PFMWrite( ( float * )pDstImage, pTempNameBuf, iWidth, iHeight ); } } } } } // leak leak leak leak leak, leak leak, leak leak (Blue Danube) return 0; }
{ for ( int hh = 0; hh < MAX_SPLITSCREEN_PLAYERS; ++hh ) { ACTIVE_SPLITSCREEN_PLAYER_GUARD( hh ); usermessages->HookMessage( "PyNetworkCls", __MsgFunc_PyNetworkCls ); } } CON_COMMAND_F( rpc, "", FCVAR_HIDDEN ) { int iType = atoi(args[1]); DbgStrPyMsg( "register_py_class: Registering Python network class message %d %s %s\n", iType, args[2], args[3] ); // Get module path const char *pch = Q_strrchr( args[3], '.' ); if( !pch ) { Warning("Invalid python class name %s\n", args[3] ); return; } int n = pch - args[3] + 1; char modulePath[PYNETCLS_BUFSIZE]; Q_strncpy( modulePath, args[3], n ); SrcPySystem()->Import( modulePath ); PyClientClassBase *p = FindPyClientClass(args[2]); if( !p ) { Warning("register_py_class: Invalid networked class %s\n", args[2]);