Separated DirectX content from:

1) dll entry functions
2) Server (inside the dll)
3) Server-Client interface.

uMod now detects if a DirectX device was created and is under "control" of uMod (a counter is shown after the game name). Thus if the injection did not work properly, uMod wont show a DX9 or DX9EX count.
This commit is contained in:
code@koerner-de.net
2012-03-22 20:35:16 +00:00
parent 0c11963a9c
commit 56844968e4
52 changed files with 1329 additions and 1416 deletions
+110
View File
@@ -0,0 +1,110 @@
ATTENTION : Vous utilisez ce programme à vous risque !
1) Si le programme plante, vous n'aurez probablement aucune aide des développeurs,
mais vous pouvez envoyer le bogue sur http://code.google.com/p/texmod/issues/list
2) Les jeux peuvent détecter les modifications de uMod, vous prenez le risque de bannir
votre compte en ligne !
3) C'est un projet open-source. Le code peut être récupéré, modifié et compilé
par tout le monde. Téléchargez Universal Modding Engine seulement sur des sources sûres !
Ne télécharger pas et n'utiliser pas d'autres versions modifiées de ce logiciel,
par exemple des versions envoyées par votre équipe ou votre guilde !
Le site officiel : http://code.google.com/p/texmod/downloads/list
Universal Modding Engine utilise le D3DX9_43.dll (32bit). En raison de la licence CLUF cette dll
ne peut pas être livrée avec Universal Modding Engine . Si vous n'avez pas D3DX9_43.dll
d'installé sur votre système, Universal Modding Engine va vous afficher un message
au démarrage du programme.
Que fait Universal Modding Engine (uMod) V1.0 ?
-Extraire et sauvegarder des textures d'un jeu DX9 (la texture d'origine peut se modifier)
-Extraire et sauvegarder toutes les textures d'un jeu DX9
-Charger des textures dans un jeu pour remplacer les textures d'origines
-Supporte les textures DDS
-Supporte les fichiers compressés (ZIP) pour faire un MOD (modifier plusieurs textures à la fois)
-Supporte les fichiers de TexMod *.tpf
Toutes les options peuvent s'activer ou se désactiver, pendant que le jeu est lancé !
Ainsi, vous pouvez rechercher une texture dans le jeu, l'enregistrer sur disque, la modifier,
la charger dans le jeu, éditer une autre texture, la charger dans le jeu, etc...,
Activer ou désactiver des MODs sans aucun redémarrage du jeu.
Remarque : Si vous cochez "Sauvegarder toutes les textures", les textures qui seront enregistrées,
sont les textures chargées dans le jeu après le moment où vous avez coché la case.
Si vous activez cette option, pendant qu'une carte est chargée, vous n'allez probablement rien enregistrer,
parce que toutes les textures sont déjà chargées. Changez de Carte ou rechargez-là.
Les fichiers compressés peuvent inclure le fichier "texmod.def" qui contient le hash et le nom du fichier.
Chaque ligne doit avoir le format "hash|filename.dds"
Si elle ne contient pas un "texmod.def" chaque fichier sera décompressé et seuls les fichiers ayant
le format "*_hash.dds" seront utilisés.
Le fichier zip peut inclure un fichier "Comment.txt". Le contenu sera affiché comme commentaire
dans l'interface graphique.
Si vous chargez des textures seules, elles doivent correspondre au format "*_hash.dds"
Comment Universal Modding Engine interagit avec les jeux ?
Universal Modding Engine intercepte la connexion entre le jeu et DirectX.
Il est nécessaire, que Universal Modding Engine soit lancé avant le jeu.
L'interface graphique de Universal Modding Engine est comme un serveur.
Un jeu correctement intercepté par Universal Modding Engine-dll se connectera au démarrage sur le serveur.
L'interface graphique de Universal Modding Engine peut gérer plusieurs jeux en même temps. Il sera
également traiter chaque jeu en tant que processus indépendant (si le même jeu
a été lancé plus d'une fois).
Comment Universal Modding Engine fonctionne ?
Il y a trois façon pour que Universal Modding Engine intercepte la connexion à DirectX :
(Ne PAS utiliser plus d'une méthode à la fois !)
1) Ajouter l'exécutable du jeu dans le menu "Réglages->Ajouter un jeu"
Pour Steam, voir plus bas.
Problèmes connus : Guild Wars (Win XP)
2) Lancer le jeu directement via le menu uMod
"Réglages->Lancer le jeu avec uMod" ou
"Réglages->Lancer le jeu avec uMod (en ligne de commande)".
Le jeu se lance directement.
3) Copier le d3d9.dll (depuis le répertoire de Universal Modding Engine) dans votre dossier de jeu.
Certain jeu recherche les DLLs dans leur répertoire avant d'aller chercher les DLLs dans
le dossier du système.
Cette méthode ne fonctionne que sur certain jeu.
ATTENTION : Ne jamais copier ce fichier DLL dans votre répertoire système !!!
Problèmes connus : Guild Wars
Si vous avez choisi la première ou la troisième méthode, il vous suffit de lancer Universal Modding Engine
et de lancer le jeu séparément. Ne PAS lancer le jeu via uMod.
Si le jeu se lance et tout fonctionne, un nouveau onglet va s'ouvrir directement dans uMod.
Dans cet onglet vous pouvez modifier le jeu. Appuyer sur "Mettre à jour"
pour envoyer les changements au jeu. Vous pouvez sauvegarder vos paramètres actuels comme thème.
Un thème peut être lancé par défaut au démarrage d'un jeu.
Pour charger une texture ou un mod, vous devez cocher la case du fichier. Si vous voulez décharger un mod,
il faut simplement décocher la case et cliquer sur "Mettre à jour".
En cliquant sur "Mettre à jour", seules les textures chargées dans uMod seront misent à jour
(si une texture chargée est supprimée de la liste, cela va juste décocher la texture).
Cliquez sur "Mettre à jour (Recharger)" pour recharger les fichiers de texture sur le disque dur.
(Si vous venez de modifier une texture déjà chargée par exemple).
En raison du fait que plusieurs mods peuvent modifier la même texture, seuls le mod / la texture
du premier fichier de la liste est pris en compte pour la modification. L'action de ce mod
(c'est à dire le chargement ou le déchargement) est effectuée, indépendamment des autres mods.
Comment faire pour que Universal Modding Engine fonctionne avec Steam ?
Universal Modding Engine cherche le nom et le chemin du fichier binaire exécuté.
Ainsi vous ne devez pas ajouter Steam.exe mais plutôt le game.exe
exemple : C:\Steam\SteamApps\acoount_name\portal\hl2.exe
Si vous ne trouvez pas l'exécutable, il suffit de commencer le jeu et
d'utiliser "le Gestionnaire des tâches" pour rechercher dans quel dossier il se trouve en
faisant un clique droit sur le nom de l'exécutable "Propriétés"->"Emplacement".
@@ -0,0 +1,75 @@
# by mirHL|
MenuHelp:Aiuto|
MenuAbout:Informazioni|
MenuAcknowledgement:Riconoscimenti|
MenuStartGame:Avvia il gioco da uMod|
MenuStartGameCMD:Avvia il gioco da uMod (con riga di comando)|
MenuUseHook:Usa hook globale|
MenuAddGame:Aggiungi gioco|
MenuDeleteGame:Rimuovi gioco|
MenuLoadTemplate:Carica template|
MenuSaveTemplate:Salva template|
MenuSaveTemplateAs:Salva template come...|
MenuSetDefaultTemplate:Imposta template come predefinito|
MenuLanguage:Cambia lingua (Change language)|
MenuExit:Esci|
MainMenuMain:Comandi|
MainMenuHelp:Aiuto|
ButtonOpen:Apri texture/archivio|
ButtonDirectory:Imposta cartella lavoro|
ButtonUpdate:Aggiorna|
ButtonReload:Aggiorna (ricarica)|
ChooseFile:Seleziona un file|
ChooseDir:Seleziona una cartella|
CheckBoxSaveSingleTexture:Salva singole texture|
TextCtrlTemplate:Template: |
CheckBoxSaveAllTextures:Salva tutte le texture|
TextCtrlSavePath:Percorso lavori: |
SelectLanguage:Seleziona una lingua|
StartGame:Seleziona il gioco da far partire.|
CommandLine:Imposta opzioni da riga di comando.|
ChooseGame:Seleziona un eseguibile di un gioco.|
DeleteGame:Seleziona i giochi da rimuovere.|
GameAlreadyAdded:Il gioco è già stato aggiunto.|
ExitGameAnyway:Chiudere uMod mentre il gioco è in esecuzione potrebbe farlo crashare.
Uscire comunque?|
NoComment:Nessun commento.|
Author:Autore: |
Error_GameIsHooked:L'hook globale è attivo e questo è in conflitto col lancio! Per favore rimuovi il gioco dalla lista o spegni l'hook.|
Error_ProcessNotStarted:Il gioco non è potuto essere avviato.|
Error_RemoveHook:Rimuovere l'Hook mentre il gioco è in esecuzione potrebbe farlo crashare.|
Error_FileNotSupported:Questo tipo di file non è supportato:|
Error_DLLNotFound:
Impossibile caricare la dll.
La dll injection non funzionerà.
Questo accade perchè D3DX9_43.dll non è installato nel sistema.
Installa DirectX End-User Runtime Web Installer.|
Error_FktNotFound:Impossibile caricare una funzione fuori della dll.
La dll injection non funzionerà.|
Error_AlreadyRunning:Un altro processo di uMod è in esecuzione.|
Error_Send:Impossibile arrivare al gioco.|
Error_KeyTwice:Hai assegnato due volte lo stesso tasto.|
Error_NoSavePath:Non hai selezionato un percorso di salvataggio.|
Error_KeyNotSet:Qualche tasto non è assegnato.|
Error_SaveFile:Impossibile salvare il file.|
Error_NoPipe:Pipe non è aperto.|
Error_WritePipe:impossibile scrivere in pipe.|
Error_FlushPipe:Impossibile ripulire pipe buffer.|
Error_Hash:Impossibile trovare l'hash, forse il file non è chiamato *_HASH.dds|
Error_FileOpen:Impossibile aprire il file.|
Error_FileRead:Impossibile leggere il file.|
Error_Memory:Impossibile allocare abbastanza memoria|
Error_Unzip:Impossibile scomprimere.|
Error_ZipEntry:Impossibile trovare Zip entry.|
KeyBack:Precedente|
KeySave:Salva|
KeyNext:Successivo|
FontColour:Colore caratteri (RGB):|
TextureColour:Colore texture (RGB):|
+30 -9
View File
@@ -46,7 +46,8 @@ uMod_Client::~uMod_Client(void)
void* uMod_Client::Entry(void)
{
char buffer[SMALL_BUFSIZE];
while (1)
bool run = true;
while (run)
{
unsigned long size;
bool ret = ReadFile(
@@ -56,28 +57,48 @@ void* uMod_Client::Entry(void)
&size, // number of bytes read
NULL); // not overlapped I/O
if (ret || GetLastError()==ERROR_MORE_DATA)
if (ret)// || GetLastError()==ERROR_MORE_DATA)
{
unsigned int pos=0;
MsgStruct *commands;
bool update_textures = false;
while (pos<size-sizeof(MsgStruct))
while (pos<=size-sizeof(MsgStruct))
{
commands = (MsgStruct*) &buffer[pos];
//unsigned int add_length = 0;
/*
switch (commands->Control)
{
case CONTROL_ADD_CLIENT:
{
uMod_Event event( uMod_EVENT_TYPE, ID_Add_Device);
event.SetValue(commands->Value);
event.SetClient(this);
wxPostEvent( MainFrame, event);
break;
}
case CONTROL_REMOVE_CLIENT:
{
uMod_Event event( uMod_EVENT_TYPE, ID_Delete_Device);
event.SetValue(commands->Value);
event.SetClient(this);
wxPostEvent( MainFrame, event);
break;
}
case CONTROL_GAME_EXIT:
{
run = false;
pos=size;
break;
}
}
*/
pos+=sizeof(MsgStruct);// + add_length;
}
}
else
{
break;
}
else if (GetLastError()!=ERROR_MORE_DATA) run = false;
}
CloseHandle(Pipe.In);
Pipe.In = INVALID_HANDLE_VALUE;
+10 -1
View File
@@ -38,7 +38,13 @@ public:
// You *must* copy here the data to be transported
uMod_Event( const uMod_Event &event )
: wxCommandEvent(event) { this->SetText( event.GetText()); PipeIn=((uMod_Event&)event).GetPipeIn(); PipeOut=((uMod_Event&)event).GetPipeOut(); Name=((uMod_Event&)event).GetName(); Client=((uMod_Event&)event).GetClient();}
: wxCommandEvent(event)
{ this->SetText( event.GetText());
Value=((uMod_Event&)event).GetValue();
PipeIn=((uMod_Event&)event).GetPipeIn(); PipeOut=((uMod_Event&)event).GetPipeOut();
Name=((uMod_Event&)event).GetName();
Client=((uMod_Event&)event).GetClient();
}
// Required for sending with wxPostEvent()
wxEvent* Clone() const { return new uMod_Event(*this); }
@@ -46,11 +52,13 @@ public:
wxString GetText() const { return m_Text; }
void SetText( const wxString& text ) { m_Text = text; }
int GetValue(void) {return Value;}
wxString GetName(void) {return Name;}
HANDLE GetPipeIn(void) {return PipeIn;}
HANDLE GetPipeOut(void) {return PipeOut;}
uMod_Client * GetClient(void) {return Client;}
void SetValue(int value) {Value=value;}
void SetName( wxString name) {Name=name;}
void SetPipeIn( HANDLE pipe) {PipeIn=pipe;}
void SetPipeOut( HANDLE pipe) {PipeOut=pipe;}
@@ -58,6 +66,7 @@ public:
private:
int Value;
wxString Name;
HANDLE PipeIn;
HANDLE PipeOut;
+26 -4
View File
@@ -60,6 +60,8 @@ BEGIN_EVENT_TABLE(uMod_Frame, wxFrame)
EVT_COMMAND (ID_Add_Game, uMod_EVENT_TYPE, uMod_Frame::OnAddGame)
EVT_COMMAND (ID_Delete_Game, uMod_EVENT_TYPE, uMod_Frame::OnDeleteGame)
EVT_COMMAND (ID_Add_Device, uMod_EVENT_TYPE, uMod_Frame::OnAddDevice)
EVT_COMMAND (ID_Delete_Device, uMod_EVENT_TYPE, uMod_Frame::OnRemoveDevice)
END_EVENT_TABLE()
IMPLEMENT_APP(MyApp)
@@ -260,10 +262,7 @@ void uMod_Frame::OnAddGame( wxCommandEvent &event)
delete page;
return;
}
name = name.AfterLast('\\');
name = name.AfterLast('/');
name = name.BeforeLast('.');
Notebook->AddPage( page, name, true);
Notebook->AddPage( page, page->GetPageName(), true);
Clients[NumberOfGames] = client;
NumberOfGames++;
@@ -286,6 +285,29 @@ void uMod_Frame::OnDeleteGame( wxCommandEvent &event)
}
}
void uMod_Frame::OnAddDevice( wxCommandEvent &event)
{
uMod_Client *client = ((uMod_Event&)event).GetClient();
for (int i=0; i<NumberOfGames; i++) if (Clients[i]==client)
{
uMod_GamePage *page = (uMod_GamePage*) Notebook->GetPage(i);
page->AddDXDevice(((uMod_Event&)event).GetValue());
Notebook->SetPageText( i, page->GetPageName());
return;
}
}
void uMod_Frame::OnRemoveDevice( wxCommandEvent &event)
{
uMod_Client *client = ((uMod_Event&)event).GetClient();
for (int i=0; i<NumberOfGames; i++) if (Clients[i]==client)
{
uMod_GamePage *page = (uMod_GamePage*) Notebook->GetPage(i);
page->RemoveDXDevice(((uMod_Event&)event).GetValue());
Notebook->SetPageText( i, page->GetPageName());
return;
}
}
void uMod_Frame::OnClose(wxCloseEvent& event)
{
+24 -1
View File
@@ -31,10 +31,33 @@ public:
~uMod_Frame(void);
/**
* A game has started and opend a pipe to the GUI. The Server thus create an event and send it to the main frame.
* @param event
*/
void OnAddGame( wxCommandEvent &event);
/**
* A game has quite and closed it pipe to the GUI. The Server thus create an event and send it to the main frame.
* @param event
*/
void OnDeleteGame( wxCommandEvent &event);
/**
* A game has created a DX device. The Server thus create an event and send it to the main frame.
* @param event
*/
void OnAddDevice( wxCommandEvent &event);
/**
* A game has deleted a DX device. The Server thus create an event and send it to the main frame.
* @param event
*/
void OnRemoveDevice( wxCommandEvent &event);
/**
* The user tries to close the GUI.
* @param WXUNUSED
*/
void OnClose(wxCloseEvent& WXUNUSED(event));
+76
View File
@@ -25,6 +25,9 @@ uMod_GamePage::uMod_GamePage( wxNotebook *parent, const wxString &exe, const wxS
ExeName = exe;
TemplateName = save;
CounterDX9 = 0; CounterDX9EX = 0;
CounterDX10 = 0; CounterDX10EX = 0;
//SetBackgroundColour( *wxLIGHT_GREY);
//SetBackgroundColour( wxColour( "LIGHT GREY"));
@@ -185,6 +188,79 @@ int uMod_GamePage::AddTexture( const wxString &file_name)
return UpdateGame();
}
wxString uMod_GamePage::GetPageName(void)
{
wxString ret;
ret = ExeName;
ret = ret.AfterLast('\\');
ret = ret.AfterLast('/');
ret = ret.BeforeLast('.');
if (CounterDX9 || CounterDX9EX || CounterDX10 || CounterDX10EX)
{
wxString temp;
ret.append(" (");
if (CounterDX9)
{
temp.Printf("DX9: %d", CounterDX9);
ret.append(temp);
}
if (CounterDX9EX)
{
if (!temp.IsEmpty()) ret.append(",");
temp.Printf("DX9EX: %d", CounterDX9EX);
ret.append(temp);
}
if (CounterDX10)
{
if (!temp.IsEmpty()) ret.append(",");
temp.Printf("DX10: %d", CounterDX10);
ret.append(temp);
}
if (CounterDX10EX)
{
if (!temp.IsEmpty()) ret.append(",");
temp.Printf("DX10EX: %d", CounterDX10EX);
ret.append(temp);
}
ret.append(")");
}
return ret;
}
int uMod_GamePage::AddDXDevice(int version)
{
switch (version)
{
case VERSION_DX9:
CounterDX9++; break;
case VERSION_DX9EX:
CounterDX9EX++; break;
case VERSION_DX10:
CounterDX10++; break;
case VERSION_DX10EX:
CounterDX10EX++; break;
}
return 0;
}
int uMod_GamePage::RemoveDXDevice(int version)
{
switch (version)
{
case VERSION_DX9:
if (CounterDX9>0) CounterDX9--; break;
case VERSION_DX9EX:
if (CounterDX9EX>0) CounterDX9EX--; break;
case VERSION_DX10:
if (CounterDX10>0) CounterDX10--; break;
case VERSION_DX10EX:
if (CounterDX10EX>0) CounterDX10EX--; break;
}
return 0;
}
int uMod_GamePage::GetSettings(void)
{
int key_back = ChoiceKeyBack->GetSelection();
+8
View File
@@ -53,10 +53,18 @@ public:
int UpdateLanguage(void);
wxString GetPageName(void);
int AddDXDevice(int version);
int RemoveDXDevice(int version);
wxString LastError;
private:
int CounterDX9, CounterDX9EX;
int CounterDX10, CounterDX10EX;
int GetSettings(void);
int SetColour( wxTextCtrl** txt, int *colour);
int GetColour( wxTextCtrl* txt, int def);
+2
View File
@@ -98,6 +98,8 @@ enum
ID_Menu_SetDefaultTemplate,
ID_Add_Game,
ID_Delete_Game,
ID_Add_Device,
ID_Delete_Device,
ID_Button_Texture, //this entry must be the last!!
};
+1
View File
@@ -32,6 +32,7 @@ uMod_Sender::uMod_Sender(PipeStruct &pipe) : Pipe(pipe)
uMod_Sender::~uMod_Sender(void)
{
if (Buffer!=NULL) delete [] Buffer;
if (OldTextures!=NULL) delete [] OldTextures;
}