2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\r
7 GtkRadiant is free software; you can redistribute it and/or modify
\r
8 it under the terms of the GNU General Public License as published by
\r
9 the Free Software Foundation; either version 2 of the License, or
\r
10 (at your option) any later version.
\r
12 GtkRadiant is distributed in the hope that it will be useful,
\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 GNU General Public License for more details.
\r
17 You should have received a copy of the GNU General Public License
\r
18 along with GtkRadiant; if not, write to the Free Software
\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\r
23 #include "version.h"
\r
25 /*! \file plugin.cpp
\r
28 HydraToolz by Dominic Clifton - Hydra (Hydra@Hydras-World.com)
\r
33 This plugin allows the user to rebuild the "wad" key pair in the worldspawn
\r
34 so that it has a list of all the .wad files in use.
\r
42 v1.0 - 10/March/2003
\r
43 - Added more console output
\r
44 - Removed some old test code
\r
45 - Tweaked dialog box.
\r
46 - Fixed up for Radiant 1.3.5
\r
56 // =============================================================================
\r
59 _QERFuncTable_1 g_FuncTable;
\r
60 _QERFileSystemTable g_FileSystemTable;
\r
61 _QEREntityTable g_EntityTable;
\r
64 // =============================================================================
\r
65 // Ripped from cmdlib.cpp
\r
68 ====================
\r
70 ====================
\r
72 void ExtractFilePath (const char *path, char *dest)
\r
76 src = path + strlen(path) - 1;
\r
79 // back up until a \ or the start
\r
81 while (src != path && *(src-1) != '/' && *(src-1) != '\\')
\r
84 memcpy (dest, path, src-path);
\r
88 void ExtractFileName (const char *path, char *dest)
\r
92 src = path + strlen(path) - 1;
\r
95 // back up until a \ or the start
\r
97 while (src != path && *(src-1) != '/'
\r
98 && *(src-1) != '\\' )
\r
108 void ConvertDOSToUnixName( char *dst, const char *src )
\r
112 if ( *src == '\\' )
\r
121 // End of rip from cmdlib.cpp
\r
123 // =============================================================================
\r
124 // Actual Plugin Code
\r
126 // get the wad name from the shader name (or an actual wadname) and add to a list of wad names making
\r
127 // sure we don't add duplicates.
\r
129 GSList *AddToWadList(GSList *wadlist, const char *shadername, const char *wad)
\r
131 char tmpstr[QER_MAX_NAMELEN];
\r
133 if (!shadername && !wad) return wadlist;
\r
137 if (strcmp(shadername,"color") == 0)
\r
139 ExtractFilePath(shadername,tmpstr);
\r
140 // Sys_Printf("checking: %s\n",shadername);
\r
142 int l = strlen(tmpstr) - 1;
\r
144 if (tmpstr[l] == '/' || tmpstr[l] == '\\')
\r
148 Sys_Printf("HydraToolz: WARNING: Unknown wad file for shader %s\n",shadername);
\r
152 ExtractFileName(tmpstr,tmpstr);
\r
154 wadname = (char *)malloc(strlen(tmpstr) + 5);
\r
155 sprintf(wadname,"%s.wad",tmpstr);
\r
159 wadname=strdup(wad);
\r
162 for (GSList *l = wadlist; l != NULL ; l = l->next)
\r
164 if (!stricmp((char *)l->data,wadname))
\r
171 Sys_Printf("HydraToolz: Adding Wad File to WAD list: %s (reason: ",wadname);
\r
173 Sys_Printf("see shader \"%s\")\n", shadername);
\r
175 Sys_Printf("already in WAD key. )\n");
\r
176 return ( g_slist_append (wadlist, wadname ) );
\r
179 void UpdateWadKeyPair( void )
\r
183 char wads[2048]; // change to CString usage ?
\r
188 GSList *wadlist = NULL;
\r
191 char cleanwadname[QER_MAX_NAMELEN];
\r
195 pEntity = (entity_t *)g_FuncTable.m_pfnGetEntityHandle(0); // get the worldspawn ent
\r
197 Sys_Printf("HydraToolz: Searching for in-use wad files...\n");
\r
198 for(pEpair = pEntity->epairs; pEpair != NULL; pEpair = pEpair->next)
\r
200 if (stricmp(pEpair->key,"wad") == 0)
\r
202 strcpy(wads,pEpair->value);
\r
203 ConvertDOSToUnixName(wads,wads);
\r
205 Sys_Printf("HydraToolz: Current wad key is \"%s\"!\n",wads);
\r
207 // ok, we got the list of ; delimited wads, now split it into a GSList that contains
\r
208 // just the wad names themselves.
\r
214 p2 = strchr(p1,';');
\r
216 *p2 = 0; // swap the ; with a null terminator
\r
218 if (strchr(p1,'/') || strchr(p1,'\\'))
\r
220 ExtractFileName(p1,cleanwadname);
\r
221 wadlist = AddToWadList (wadlist, NULL, cleanwadname);
\r
225 wadlist = AddToWadList (wadlist, NULL, p1);
\r
228 p1 = p2+1; // point back to the remainder of the string
\r
230 p1 = NULL; // make it so we exit the loop.
\r
234 // ok, now we have a list of wads in GSList.
\r
235 // now we need to add any new wadfiles (with their paths) to this list
\r
236 // so scan all brushes and see what wads are in use
\r
237 // FIXME: scan brushes only in the region ?
\r
239 break; // we don't need to process any more key/pairs.
\r
244 Sys_Printf("HydraToolz: No \"wad\" keypair wound in worldspawn\n");
\r
247 nb = g_FuncTable.m_pfnAllocateActiveBrushHandles();
\r
248 for( i = 0; i < nb; i++ )
\r
250 b = (brush_t *)g_FuncTable.m_pfnGetActiveBrushHandle(i);
\r
251 if (b->patchBrush) // patches in halflife ?
\r
253 wadlist = AddToWadList(wadlist, b->pPatch->pShader->getName(),NULL);
\r
256 for (f=b->brush_faces ; f ; f=f->next)
\r
258 wadlist = AddToWadList(wadlist, f->pShader->getName(),NULL);
\r
262 g_FuncTable.m_pfnReleaseActiveBrushHandles();
\r
264 nb = g_FuncTable.m_pfnAllocateSelectedBrushHandles();
\r
265 for( i = 0; i < nb; i++ )
\r
267 b = (brush_t *)g_FuncTable.m_pfnGetSelectedBrushHandle(i);
\r
268 if (b->patchBrush) // patches in halflife ?
\r
270 wadlist = AddToWadList(wadlist, b->pPatch->pShader->getName(),NULL);
\r
273 for (f=b->brush_faces ; f ; f=f->next)
\r
275 wadlist = AddToWadList(wadlist, f->pShader->getName(),NULL);
\r
279 g_FuncTable.m_pfnReleaseSelectedBrushHandles();
\r
281 Sys_Printf("HydraToolz: Rebuilding worldspawn's \"wad\" key-pair...\n");
\r
282 // Now we have a complete list of wadnames (without paths) so we just have to turn this
\r
283 // back to a ; delimited list.
\r
288 // skip wad files if they start with "common-"
\r
289 if (strnicmp((char *)wadlist->data,"common-",7) == 0)
\r
291 Sys_Printf("HydraToolz: Skipping radiant/user-supplied wad file %s\n",(char *)wadlist->data);
\r
298 actualwad = vfsGetFullPath((char *)wadlist->data);
\r
302 strcat(wads, actualwad);
\r
306 Sys_Printf("HydraToolz: WARNING: could not locate wad file %s\n",(char *)wadlist->data);
\r
307 strcat(wads, (char *)wadlist->data);
\r
311 free (wadlist->data);
\r
312 wadlist = g_slist_remove (wadlist, wadlist->data);
\r
315 // store the wad list back in the worldspawn.
\r
318 //free(pEpair->value);
\r
319 //pEpair->value = strdup(wads);
\r
320 SetKeyValue(pEntity, "wad", wads);
\r
321 Sys_Printf("HydraToolz: Setting worldspawn \"wad\" key value to \"%s\"\n",wads);
\r
325 Sys_Printf("HydraToolz: Finished rebuilding wad keypair!\n");
\r
329 // =============================================================================
\r
330 // PLUGIN INTERFACE STUFF
\r
333 const char *PLUGIN_NAME = "HydraToolz";
\r
335 // commands in the menu
\r
336 const char *PLUGIN_COMMANDS = "About...;Create/Update WAD keypair";
\r
338 const char *PLUGIN_ABOUT = "HydraToolz v1.0 for GTKRadiant\n\n"
\r
341 extern "C" void* WINAPI QERPlug_GetFuncTable ()
\r
343 return &g_FuncTable;
\r
346 const char* QERPlug_Init (void* hApp, void *pWidget)
\r
348 return "HydraToolz for GTKRadiant"; // do we need this ? hmmm
\r
351 const char* QERPlug_GetName()
\r
353 return (char*)PLUGIN_NAME;
\r
356 const char* QERPlug_GetCommandList()
\r
358 return PLUGIN_COMMANDS;
\r
361 extern "C" void QERPlug_Dispatch(const char* p, vec3_t vMin, vec3_t vMax, bool bSingleBrush)
\r
363 if(!strcmp(p, "Create/Update WAD keypair"))
\r
364 UpdateWadKeyPair();
\r
365 else if(!strcmp(p, "About..."))
\r
366 g_FuncTable.m_pfnMessageBox(NULL, PLUGIN_ABOUT, "About", MB_OK, NULL);
\r
369 // =============================================================================
\r
372 CSynapseServer* g_pSynapseServer = NULL;
\r
373 CSynapseClientHydraToolz g_SynapseClient;
\r
375 extern "C" CSynapseClient* SYNAPSE_DLL_EXPORT Synapse_EnumerateInterfaces (const char *version, CSynapseServer *pServer)
\r
377 if (strcmp(version, SYNAPSE_VERSION))
\r
379 Syn_Printf("ERROR: synapse API version mismatch: should be '" SYNAPSE_VERSION "', got '%s'\n", version);
\r
382 g_pSynapseServer = pServer;
\r
383 g_pSynapseServer->IncRef();
\r
384 Set_Syn_Printf(g_pSynapseServer->Get_Syn_Printf());
\r
386 g_SynapseClient.AddAPI(PLUGIN_MAJOR, "HydraToolz", sizeof(_QERPluginTable));
\r
387 g_SynapseClient.AddAPI(RADIANT_MAJOR, NULL, sizeof(g_FuncTable), SYN_REQUIRE, &g_FuncTable);
\r
388 g_SynapseClient.AddAPI(VFS_MAJOR, "wad", sizeof(g_FileSystemTable), SYN_REQUIRE, &g_FileSystemTable);
\r
389 g_SynapseClient.AddAPI(ENTITY_MAJOR, NULL, sizeof(g_EntityTable), SYN_REQUIRE, &g_EntityTable);
\r
390 return &g_SynapseClient;
\r
393 bool CSynapseClientHydraToolz::RequestAPI(APIDescriptor_t *pAPI)
\r
395 if (!strcmp(pAPI->major_name, PLUGIN_MAJOR))
\r
397 _QERPluginTable *pTable = static_cast<_QERPluginTable*>(pAPI->mpTable);
\r
398 pTable->m_pfnQERPlug_Init = QERPlug_Init;
\r
399 pTable->m_pfnQERPlug_GetName = QERPlug_GetName;
\r
400 pTable->m_pfnQERPlug_GetCommandList = QERPlug_GetCommandList;
\r
401 pTable->m_pfnQERPlug_Dispatch = QERPlug_Dispatch;
\r
405 Syn_Printf("ERROR: RequestAPI( '%s' ) not found in '%s'\n", pAPI->major_name, GetInfo());
\r
409 const char* CSynapseClientHydraToolz::GetInfo()
\r
411 return "HydraToolz plugin built " __DATE__ " " RADIANT_VERSION;
\r