void *Com_LoadLibrary( const char *dllname, int build_ordinals_table ) { searchpath_t *search; int pack_ind; char path [MAX_SYSPATH]; void *pHandle = LoadLibrary( dllname ); if(!pHandle) { search = FS_FindFile( dllname, &pack_ind, true ); if(!search) { pHandle = 0; } sprintf( path, "%s%s", search->filename, dllname ); pHandle = LoadLibrary( path ); if(!pHandle) { MsgDev(D_ERROR, "loading library %s: %s", dllname, dlerror()); return NULL; } } return pHandle; }
void *Com_LoadLibrary( const char *dllname, int build_ordinals_table ) { searchpath_t *search; int pack_ind; char path [MAX_SYSPATH]; void *pHandle; qboolean dll = host.enabledll && (Q_stristr(dllname, ".dll") != 0); #ifdef DLL_LOADER if(dll) { pHandle = Loader_LoadLibrary( dllname ); } else #endif #ifdef _WIN32 pHandle = LoadLibrary( dllname ); #else pHandle = dlopen( dllname, RTLD_LAZY ); #endif if(!pHandle) { search = FS_FindFile( dllname, &pack_ind, true ); sprintf( path, "%s%s", search->filename, dllname ); #ifdef DLL_LOADER if(dll) { pHandle = Loader_LoadLibrary( path ); } else #endif #ifdef _WIN32 pHandle = LoadLibrary( path ); #else pHandle = dlopen( path, RTLD_LAZY ); #endif if(!pHandle) { MsgDev(D_ERROR, "loading library %s: %s\n", dllname, dlerror()); return NULL; } } return pHandle; }
/* =============== PR_LoadProgs =============== */ void PR_LoadProgs (void) { int i; char num[32]; static int lumpsize[6] = { sizeof(dstatement_t), sizeof(ddef_t), sizeof(ddef_t), sizeof(dfunction_t), 4, 4 }; int filesize = 0; const char *progsname; progs = NULL; // decide whether to load qwprogs.dat, progs.dat or spprogs.dat #ifdef WITH_NQPROGS if (Cvar_Value("sv_forcenqprogs")) goto use_progs; #endif if (!deathmatch.value) { if (Q_stricmp(com_gamedirfile, "qw") && strcmp(com_gamedirfile, "")) { // if we're using a custom mod, anything // in gamedir is preferred to stock *progs.dat qbool check; check = FS_FindFile ("spprogs.dat"); if (check && file_from_gamedir) goto use_spprogs; #ifdef WITH_NQPROGS check = FS_FindFile ("progs.dat"); if (check && file_from_gamedir) goto use_progs; #endif check = FS_FindFile ("qwprogs.dat"); if (check && file_from_gamedir) goto use_qwprogs; } use_spprogs: progs = (dprograms_t *) FS_LoadHunkFile ("spprogs.dat"); progsname = "spprogs.dat"; pr_nqprogs = false; if (!progs) { #ifdef WITH_NQPROGS use_progs: progs = (dprograms_t *)FS_LoadHunkFile ("progs.dat"); progsname = "progs.dat"; pr_nqprogs = true; } #endif if (!progs) { use_qwprogs: progs = (dprograms_t *)FS_LoadHunkFile ("qwprogs.dat"); progsname = "qwprogs.dat"; pr_nqprogs = false; } } else // deathmatch { if (Q_stricmp(com_gamedirfile, "qw") && strcmp(com_gamedirfile, "")) { qbool check; check = FS_FindFile ("qwprogs.dat"); if (check && file_from_gamedir) goto dm_use_qwprogs; #ifdef WITH_NQPROGS check = FS_FindFile ("progs.dat"); if (check && file_from_gamedir) goto dm_use_progs; #endif } dm_use_qwprogs: progs = (dprograms_t *) FS_LoadHunkFile ("qwprogs.dat"); progsname = "qwprogs.dat"; pr_nqprogs = false; if (!progs) { #ifdef WITH_NQPROGS dm_use_progs: progs = (dprograms_t *)FS_LoadHunkFile ("progs.dat"); progsname = "progs.dat"; pr_nqprogs = true; } #endif } if (!progs) Host_Error ("PR_LoadProgs: couldn't load progs.dat"); filesize = fs_filesize; if (filesize < (int)sizeof(*progs)) Host_Error("%s is corrupt", progsname); Com_DPrintf ("Using %s (%i bytes).\n", progsname, filesize); // add prog crc to the serverinfo sprintf (num, "%i", CRC_Block ((byte *)progs, filesize)); svs.info.set("*progs", num); // byte swap the header for (i = 0; i < sizeof(*progs)/4; i++) ((int *)progs)[i] = LittleLong ( ((int *)progs)[i] ); if (progs->version != PROG_VERSION) Host_Error ("progs.dat has wrong version number (%i should be %i)", progs->version, PROG_VERSION); if (progs->crc != (pr_nqprogs ? NQ_PROGHEADER_CRC : PROGHEADER_CRC)) Host_Error ("You must have the qwprogs.dat from QuakeWorld installed"); // check lump offsets and sizes for (i = 0; i < 6; i ++) { if (((int *)progs)[i*2 + 2] < sizeof(*progs) || ((int *)progs)[i*2 + 2] + ((int *)progs)[i*2 + 3]*lumpsize[i] > filesize) Host_Error("progs.dat is corrupt"); } pr_functions = (dfunction_t *)((byte *)progs + progs->ofs_functions); pr_strings = (char *)progs + progs->ofs_strings; pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs); pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs); pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements); pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals); pr_globals = (float *)pr_global_struct; PR_InitStrings (); pr_edict_size = progs->entityfields * 4 + sizeof (edict_t) - sizeof(entvars_t); // byte swap the lumps for (i=0 ; i<progs->numstatements ; i++) { pr_statements[i].op = LittleShort(pr_statements[i].op); pr_statements[i].a = LittleShort(pr_statements[i].a); pr_statements[i].b = LittleShort(pr_statements[i].b); pr_statements[i].c = LittleShort(pr_statements[i].c); } for (i=0 ; i<progs->numfunctions; i++) { pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement); pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start); pr_functions[i].s_name = LittleLong (pr_functions[i].s_name); pr_functions[i].s_file = LittleLong (pr_functions[i].s_file); pr_functions[i].numparms = LittleLong (pr_functions[i].numparms); pr_functions[i].locals = LittleLong (pr_functions[i].locals); } for (i=0 ; i<progs->numglobaldefs ; i++) { pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type); pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs); pr_globaldefs[i].s_name = LittleLong (pr_globaldefs[i].s_name); } for (i=0 ; i<progs->numfielddefs ; i++) { pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type); if (pr_fielddefs[i].type & DEF_SAVEGLOBAL) Host_Error ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL"); pr_fielddefs[i].ofs = LittleShort (pr_fielddefs[i].ofs); pr_fielddefs[i].s_name = LittleLong (pr_fielddefs[i].s_name); } for (i=0 ; i<progs->numglobals ; i++) ((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]); #ifdef WITH_NQPROGS if (pr_nqprogs) { memcpy (pr_globaloffsetpatch, pr_globaloffsetpatch_nq, sizeof(pr_globaloffsetpatch)); for (i = 0; i < 106; i++) { pr_fieldoffsetpatch[i] = (i < 8) ? i : (i < 25) ? i + 1 : (i < 28) ? i + (102 - 25) : (i < 73) ? i - 2 : (i < 74) ? i + (105 - 73) : (i < 105) ? i - 3 : /* (i == 105) */ 8; } for (i=0 ; i<progs->numfielddefs ; i++) pr_fielddefs[i].ofs = PR_FIELDOFS(pr_fielddefs[i].ofs); } else { memset (pr_globaloffsetpatch, 0, sizeof(pr_globaloffsetpatch)); for (i = 0; i < 106; i++) pr_fieldoffsetpatch[i] = i; } #endif // find optional QC-exported functions SpectatorConnect = ED_FindFunctionOffset ("SpectatorConnect"); SpectatorThink = ED_FindFunctionOffset ("SpectatorThink"); SpectatorDisconnect = ED_FindFunctionOffset ("SpectatorDisconnect"); GE_ClientCommand = ED_FindFunctionOffset ("GE_ClientCommand"); GE_ConsoleCommand = ED_FindFunctionOffset ("GE_ConsoleCommand"); GE_PausedTic = ED_FindFunctionOffset ("GE_PausedTic"); GE_ShouldPause = ED_FindFunctionOffset ("GE_ShouldPause"); // find optional QC-exported fields fofs_maxspeed = ED_FindFieldOffset ("maxspeed"); fofs_gravity = ED_FindFieldOffset ("gravity"); fofs_items2 = ED_FindFieldOffset ("items2"); fofs_movement = ED_FindFieldOffset ("movement"); fofs_vw_index = ED_FindFieldOffset ("vw_index"); for (i = 3; i < 8; i++) fofs_buttonX[i-3] = ED_FindFieldOffset(va("button%i", i)); // reset stuff like ZQ_CLIENTCOMMAND, progs must enable it explicitly memset (&pr_ext_enabled, sizeof(pr_ext_enabled), 0); PR_Exec_Init (); }
/* ================== CL_ParseServerInfo ================== */ void CL_ParseServerInfo (void) { char *str, tempname[MAX_QPATH];; int i; int nummodels, numsounds; char model_precache[MAX_MODELS][MAX_QPATH]; char sound_precache[MAX_SOUNDS][MAX_QPATH]; extern qboolean r_loadq3player; //void R_PreMapLoad (char *); char mapname[MAX_QPATH]; Con_DPrintf ("Serverinfo packet received.\n"); // // wipe the client_state_t struct // CL_ClearState (); // parse protocol version number i = MSG_ReadLong (); if (i != PROTOCOL_VERSION) { Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION); return; } // parse maxclients cl.maxclients = MSG_ReadByte (); if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) { Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients); return; } cl.scores = Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores"); // parse gametype cl.gametype = MSG_ReadByte (); // parse signon message str = MSG_ReadString (); strncpy (cl.levelname, str, sizeof(cl.levelname)-1); // seperate the printfs so the server message can have a color Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n"); Con_Printf ("%c%s\n", 2, str); // // first we go through and touch all of the precache data that still // happens to be in the cache, so precaching something else doesn't // needlessly purge it // // precache models for (i=0 ; i<NUM_MODELINDEX ; i++) cl_modelindex[i] = -1; // precache models memset (cl.model_precache, 0, sizeof(cl.model_precache)); for (nummodels=1 ; ; nummodels++) { str = MSG_ReadString (); if (!str[0]) break; if (nummodels==MAX_MODELS) { Con_Printf ("Server sent too many model precaches\n"); return; } if (r_loadq3models.value) { if (!strcmp(str, "progs/player.mdl") && FS_FindFile("progs/player/head.md3") && FS_FindFile("progs/player/upper.md3") && FS_FindFile("progs/player/lower.md3")) { Q_strncpyz (tempname, "progs/player/lower.md3", MAX_QPATH); str = tempname; cl_modelindex[mi_player] = nummodels; r_loadq3player = true; } else { COM_StripExtension (str, tempname); strcat (tempname, ".md3"); if (FS_FindFile(tempname)) str = tempname; } } Q_strncpyz (model_precache[nummodels], str, sizeof(model_precache[nummodels])); Mod_TouchModel (str); if (!strcmp(model_precache[nummodels], "progs/player.mdl")) cl_modelindex[mi_player] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/eyes.mdl")) cl_modelindex[mi_eyes] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/missile.mdl")) cl_modelindex[mi_rocket] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/grenade.mdl")) cl_modelindex[mi_grenade] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/flame.mdl")) cl_modelindex[mi_flame1] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/flame2.mdl")) cl_modelindex[mi_flame2] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/s_expl.spr")) cl_modelindex[mi_explo1] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/s_explod.spr")) cl_modelindex[mi_explo2] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/s_bubble.spr")) cl_modelindex[mi_bubble] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/gib1.mdl")) cl_modelindex[mi_gib1] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/gib2.mdl")) cl_modelindex[mi_gib2] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/gib3.mdl")) cl_modelindex[mi_gib3] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/fish.mdl")) cl_modelindex[mi_fish] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/dog.mdl")) cl_modelindex[mi_dog] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/soldier.mdl")) cl_modelindex[mi_soldier] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/enforcer.mdl")) cl_modelindex[mi_enforcer] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/knight.mdl")) cl_modelindex[mi_knight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/hknight.mdl")) cl_modelindex[mi_hknight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/wizard.mdl")) cl_modelindex[mi_scrag] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/ogre.mdl")) cl_modelindex[mi_ogre] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/demon.mdl")) cl_modelindex[mi_fiend] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/shalrath.mdl")) cl_modelindex[mi_vore] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/shambler.mdl")) cl_modelindex[mi_shambler] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_dog.mdl")) cl_modelindex[mi_h_dog] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_guard.mdl")) cl_modelindex[mi_h_soldier] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_mega.mdl")) cl_modelindex[mi_h_enforcer] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_knight.mdl")) cl_modelindex[mi_h_knight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_hknight.mdl")) cl_modelindex[mi_h_hknight] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_wizard.mdl")) cl_modelindex[mi_h_scrag] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_ogre.mdl")) cl_modelindex[mi_h_ogre] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_demon.mdl")) cl_modelindex[mi_h_fiend] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_shal.mdl")) cl_modelindex[mi_h_vore] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_shams.mdl")) cl_modelindex[mi_h_shambler] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_zombie.mdl")) cl_modelindex[mi_h_zombie] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/h_player.mdl")) cl_modelindex[mi_h_player] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/w_s_key.mdl")) cl_modelindex[mi_w_s_key] = nummodels; else if (!strcmp(model_precache[nummodels], "progs/w_g_key.mdl")) cl_modelindex[mi_w_g_key] = nummodels; } if (r_loadq3player) { if (nummodels + 1 >= MAX_MODELS) { Con_Printf ("Server sent too many model precaches -> can't load Q3 player model\n"); Q_strncpyz (model_precache[cl_modelindex[mi_player]], cl_modelnames[mi_player], sizeof(model_precache[cl_modelindex[mi_player]])); } else { Q_strncpyz (model_precache[nummodels], "progs/player/upper.md3", sizeof(model_precache[nummodels])); cl_modelindex[mi_q3torso] = nummodels++; Q_strncpyz (model_precache[nummodels], "progs/player/head.md3", sizeof(model_precache[nummodels])); cl_modelindex[mi_q3head] = nummodels++; } } // precache sounds memset (cl.sound_precache, 0, sizeof(cl.sound_precache)); for (numsounds=1 ; ; numsounds++) { str = MSG_ReadString (); if (!str[0]) break; if (numsounds==MAX_SOUNDS) { Con_Printf ("Server sent too many sound precaches\n"); return; } strcpy (sound_precache[numsounds], str); S_TouchSound (str); } //COM_StripExtension (COM_SkipPath(model_precache[1]), mapname); //R_PreMapLoad (mapname); // // now we try to load everything else until a cache allocation fails // loading_num_step[loading_level] = nummodels + numsounds; sprintf(loading_name[loading_level], "Models and Sounds"); for (i=1 ; i<nummodels ; i++) { cl.model_precache[i] = Mod_ForName (model_precache[i], false); if (cl.model_precache[i] == NULL) { Con_Printf("Model %s not found\n", model_precache[i]); return; } CL_KeepaliveMessage (); loading_cur_step[loading_level]++; SCR_UpdateScreen (); } // load the extra "no-flamed-torch" model cl.model_precache[nummodels] = Mod_ForName ("progs/flame0.mdl", false); cl_modelindex[mi_flame0] = nummodels++; cl.model_precache[nummodels] = Mod_ForName ("progs/flag.mdl", false); cl_modelindex[mi_flag] = nummodels++; S_BeginPrecaching (); for (i=1 ; i<numsounds ; i++) { cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]); CL_KeepaliveMessage (); loading_cur_step[loading_level]++; SCR_UpdateScreen (); } S_EndPrecaching (); Clear_LoadingFill (); // local state cl_entities[0].model = cl.worldmodel = cl.model_precache[1]; R_NewMap (); Hunk_Check (); // make sure nothing is hurt noclip_anglehack = false; // noclip is turned off at start }