diff --git a/ModLoader b/ModLoader deleted file mode 160000 index 3e7e0a1..0000000 --- a/ModLoader +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3e7e0a16cc1826031505b2d7a71e1dafa6624ca9 diff --git a/ModLoader/CoreModSystem.sln b/ModLoader/CoreModSystem.sln new file mode 100755 index 0000000..20d3fd5 --- /dev/null +++ b/ModLoader/CoreModSystem.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Desktop +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CoreModSystem", "ModLoader.vcxproj", "{8740E782-7AC2-4A57-85D5-592C914C5285}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8740E782-7AC2-4A57-85D5-592C914C5285}.Debug|Win32.ActiveCfg = Debug|Win32 + {8740E782-7AC2-4A57-85D5-592C914C5285}.Debug|Win32.Build.0 = Debug|Win32 + {8740E782-7AC2-4A57-85D5-592C914C5285}.Release|Win32.ActiveCfg = Release|Win32 + {8740E782-7AC2-4A57-85D5-592C914C5285}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/ModLoader/CoreModSystem.suo b/ModLoader/CoreModSystem.suo new file mode 100755 index 0000000..16edfd0 Binary files /dev/null and b/ModLoader/CoreModSystem.suo differ diff --git a/ModLoader/CoreModSystem.v11.suo b/ModLoader/CoreModSystem.v11.suo new file mode 100755 index 0000000..892582a Binary files /dev/null and b/ModLoader/CoreModSystem.v11.suo differ diff --git a/ModLoader/ModLoader.vcxproj b/ModLoader/ModLoader.vcxproj new file mode 100755 index 0000000..ff4a3cc --- /dev/null +++ b/ModLoader/ModLoader.vcxproj @@ -0,0 +1,137 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {8740E782-7AC2-4A57-85D5-592C914C5285} + t2dll + Win32Proj + CoreModSystem + + + + DynamicLibrary + Unicode + true + + + DynamicLibrary + Unicode + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + false + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;include\;include\bullet\; + $(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;lib\; + $(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;include\;include\bullet\; + $(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSdkDir)lib;$(FrameworkSDKDir)\lib;lib\; + t2dll + t2dll + + + + Disabled + C:\Documents and Settings\Linker\My Documents\Code\t2dll\lualib\include;%(AdditionalIncludeDirectories) + WIN32;BULLET_WINE;_DEBUG;_WINDOWS;_USRDLL;T2DLL_EXPORTS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + NotUsing + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + + + %(DelayLoadDLLs) + true + Windows + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + C:\Documents and Settings\Linker\My Documents\Code\t2dll\lualib\include;%(AdditionalIncludeDirectories) + WIN32;BULLET_WINE;NDEBUG;_WINDOWS;_USRDLL;T2DLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDLL + NotUsing + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + + + + + %(DelayLoadDLLs) + true + Windows + true + true + MachineX86 + + + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ModLoader/ModLoader.vcxproj.filters b/ModLoader/ModLoader.vcxproj.filters new file mode 100755 index 0000000..0219ba4 --- /dev/null +++ b/ModLoader/ModLoader.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {47c39120-a88e-47c4-b0a8-4bf738d54a5c} + + + {9cb2992f-6959-4153-a4c4-d9ea4d86347d} + + + + + Include + + + Include + + + Include + + + Include + + + + + Source + + + Source + + + Source + + + \ No newline at end of file diff --git a/ModLoader/include/config.h b/ModLoader/include/config.h new file mode 100755 index 0000000..712656a --- /dev/null +++ b/ModLoader/include/config.h @@ -0,0 +1,7 @@ +/* + * config.h + * Contains configuration information for BulletDLL + * Copyright (c) 2013 Robert MacGregor +*/ + +#define MAXIMUM_BULLET_NODES 256 \ No newline at end of file diff --git a/ModLoader/include/stdafx.h b/ModLoader/include/stdafx.h new file mode 100755 index 0000000..5d2427f --- /dev/null +++ b/ModLoader/include/stdafx.h @@ -0,0 +1,32 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +// Modify the following defines if you have to target a platform prior to the ones specified below. +// Refer to MSDN for the latest info on corresponding values for different platforms. +#ifndef WINVER // Allow use of features specific to Windows XP or later. +#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. +#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. +#endif + +#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. +#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. +#endif + +#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later. +#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE. +#endif + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include + +// TODO: reference additional headers your program requires here +#include "t2api.h" +#include "config.h" \ No newline at end of file diff --git a/ModLoader/include/t2ConCmds.h b/ModLoader/include/t2ConCmds.h new file mode 100755 index 0000000..c291122 --- /dev/null +++ b/ModLoader/include/t2ConCmds.h @@ -0,0 +1,15 @@ +/* + * t2conCmds.h + * Original code by Linker + * Modified by Robert MacGregor +*/ + +#include "stdafx.h" + +// Linker's original functions +const char* conGuiTsCtrlProject(SimObject *obj,S32 argc, const char* argv[]); +bool conNetObjectSetGhostable(SimObject *obj,S32 argc, const char* argv[]); +const char* conGetVariable(SimObject *obj,S32 argc, const char* argv[]); + +// Mod Loader Implementation +bool conLoadMod(SimObject *obj,S32 argc, const char* argv[]); \ No newline at end of file diff --git a/ModLoader/include/t2api.h b/ModLoader/include/t2api.h new file mode 100755 index 0000000..f18faec --- /dev/null +++ b/ModLoader/include/t2api.h @@ -0,0 +1,109 @@ +#pragma once + +void initT2Api(); + + +//api stuff + +typedef unsigned int U32; +typedef int S32; +typedef float F32; + +typedef unsigned int dsize_t; + +//for addvariable +#define TypeS32 1 +#define TypeBool 3 +#define TypeF32 5 + + +//dshit +inline dsize_t dStrlen(const char *str) +{ + return (dsize_t)strlen(str); +} + +class Namespace { + const char* mName; +}; + + + +class SimObject{ + SimObject* group; + const char* objectName; //04h: objectName + SimObject* nextNameObject; //8 + SimObject* nextManagerNameObject; //c + SimObject* nextIdObject; //10h: nextIdObject + U32 stuff; //14 + U32 mFlags; //18h + U32 mNotifyList; //actually a pointer + U32 mId; //20h: mId + //more stuff +}; + +class SimIdDictionary +{ + enum + { + DefaultTableSize = 4096, + TableBitMask = 4095 + }; + SimObject *table[DefaultTableSize]; +}; +extern SimIdDictionary* gIdDictionary; + +class Point3F +{ + public: + F32 x; + F32 y; + F32 z; +}; + + +//GuiTSCtrl +class GuiTSCtrl {}; +class HoverVehicle {}; +void GuiTSCtrl_project(GuiTSCtrl *obj, const Point3F &pt, Point3F *dest); //fake + + +namespace Sim { + extern SimObject* (*findObject)(U32 id); +} + + +//console + +typedef const char * (*StringCallback)(SimObject *obj, S32 argc, const char *argv[]); +typedef S32 (*IntCallback)(SimObject *obj, S32 argc, const char *argv[]); +typedef F32 (*FloatCallback)(SimObject *obj, S32 argc, const char *argv[]); +typedef void (*VoidCallback)(SimObject *obj, S32 argc, const char *argv[]); +typedef bool (*BoolCallback)(SimObject *obj, S32 argc, const char *argv[]); + + +extern void (*someTest)(void); +//functions +namespace Con{ + +extern char * (*getReturnBuffer)(U32 bufferSize); + +extern void (*addMethodB)(const char *nsName, const char *name, BoolCallback cb, const char *usage, S32 minArgs, S32 maxArgs); +extern void (*addMethodS)(const char *nsName, const char *name, StringCallback cb, const char *usage, S32 minArgs, S32 maxArgs); + +extern bool (*addVariable)(const char *name, S32 t, void *dp); + +extern void (*printf)(const char* fmt,...); +extern void (*errorf)(U32 type, const char* fmt,...); + +extern const char * (*getVariable)(const char *name); +extern const char * (*execute)(S32 argc, const char *argv[]); +extern const char * (*executef)(S32 argc, ...); +extern const char * (*executem)(SimObject *object, S32 argc, const char *argv[]); +extern const char * (*evaluate)(const char* string, bool echo, const char *fileName, bool cf); +} + +//d-util +extern int (*dSscanf)(const char *buffer, const char *format, ...); +extern int (*dSprintf)(char *buffer, dsize_t bufferSize, const char *format, ...); +extern bool (*dAtob)(const char *str); \ No newline at end of file diff --git a/ModLoader/source/t2ConCmds.cpp b/ModLoader/source/t2ConCmds.cpp new file mode 100755 index 0000000..c420585 --- /dev/null +++ b/ModLoader/source/t2ConCmds.cpp @@ -0,0 +1,84 @@ +/* + * t2ConCmds.cpp + * Original code by Linker + * Modified by Robert MacGregor +*/ + +#include + +#include "stdafx.h" +#include "t2ConCmds.h" + +// Linker's implementations +const char* conGuiTsCtrlProject(SimObject *obj,S32 argc, const char* argv[]) { + Point3F pt; + Point3F rt; + dSscanf(argv[2],"%g %g %g",&pt.x,&pt.y,&pt.z); + GuiTSCtrl_project(reinterpret_cast(obj),pt,&rt); + + char* buffer = Con::getReturnBuffer(255); + dSprintf(buffer,255,"%g %g %g",rt.x,rt.y,rt.z); + + return buffer; +} + +bool conNetObjectSetGhostable(SimObject *obj,S32 argc, const char* argv[]) { + if (dAtob(argv[2])) { + __asm { + push ecx + mov ecx, [obj] + mov eax,[ecx+40h] + or eax, 100h + mov [ecx+40h], eax + pop ecx + } + } else { + __asm { + xor eax, eax + or eax, 100h + not eax + push ecx + mov ecx,[obj] + and eax, [ecx+40h] + mov [ecx+40h],eax + push 40h + mov eax, 0x585BE0 + call eax + pop ecx + } + } + return 1; +} + +const char* conGetVariable(SimObject *obj,S32 argc, const char* argv[]) { + return Con::getVariable(argv[1]); +} + +// Mod Loader Implementation +bool conLoadMod(SimObject *obj,S32 argc, const char* argv[]) +{ + typedef void (*LPMODINIT)(void); + HINSTANCE hDLL = NULL; + LPMODINIT lpInitMod = NULL; + + std::string raw = argv[1]; + + std::wstring input(raw.begin(), raw.end()); + std::wstring modification = L"mods/"; + modification += input; + modification += L".dll"; + + hDLL = LoadLibrary(modification.c_str()); // AfxLoadLibrary is probably better. + + if (hDLL == NULL) + return false; // The DLL doesn't exist + else + lpInitMod = (LPMODINIT)GetProcAddress(hDLL, "?ModInitialize@@YAXXZ"); // Attempt to load our entry point + + if (lpInitMod == NULL) + return false; // Unable to load entry point + else + lpInitMod(); // The function was loaded, call TribesNext and move on to postTN Startup + + return true; +} \ No newline at end of file diff --git a/ModLoader/source/t2api.cpp b/ModLoader/source/t2api.cpp new file mode 100755 index 0000000..be583ab --- /dev/null +++ b/ModLoader/source/t2api.cpp @@ -0,0 +1,89 @@ +#include "stdafx.h" + +SimIdDictionary* gIdDictionary = reinterpret_cast(0x009E9194); + +//439550 +namespace Sim { + SimObject* (*findObject)(U32 id) = + (SimObject* (_cdecl *)(U32 id) ) + 0x439550; +} + +//hackey way to do member functions, .... +void GuiTSCtrl_project(GuiTSCtrl *obj, const Point3F &pt, Point3F *dest) { + typedef void (__cdecl *projFunc)(const Point3F &pt, Point3F *dest); + static projFunc p = (projFunc)0x4d0b40; + + __asm { + push dest; + push pt; + mov ecx,obj; + lea eax, p; + mov eax, [eax]; + call eax; + } +} + +void (*someTest)(void) = + (void (__cdecl *)(void)) + 0x4FD9B3; + +namespace Con { + +char* (*getReturnBuffer)(U32 bufferSize) = + (char *(__cdecl *)(U32)) + 0x42caa0; + +void (*addMethodB)(const char *nsName, const char *name, BoolCallback cb, const char *usage, S32 minArgs, S32 maxArgs) = + (void (__cdecl *)(const char *, const char *,BoolCallback,const char *,S32,S32)) + 0x426510; + +void (*addMethodS)(const char *, const char *,StringCallback, const char *, S32, S32) = + (void (__cdecl *)(const char *,const char *,StringCallback,const char *,S32,S32)) + 0x426410; + +bool (*addVariable)(const char *name, S32 t, void *dp) = + (bool (__cdecl *)(const char *name, S32 t, void *dp)) + 0x4263B0; + +const char * (*execute)(S32 argc, const char *argv[]) = + (const char * (__cdecl *)(S32 argc, const char *argv[])) + 0x4267A0; + +const char * (*executef)(S32 argc, ...) = + (const char * (__cdecl *)(S32 argc, ...)) + 0x4269E0; + +const char * (*evaluate)(const char* string, bool echo, const char *fileName, bool cf) = + (const char * (__cdecl *)(const char* string, bool echo, const char *fileName, bool cf)) + 0x426690; + +const char * (*executem)(SimObject *object, S32 argc, const char *argv[]) = + (const char * (__cdecl *)(SimObject *object, S32 argc, const char *argv[])) + 0x426800; + +const char * (*getVariable)(const char *name) = + (const char * (__cdecl *)(const char *name)) + 0x4261F0; + +void (*printf)(const char* fmt,...) = + (void (__cdecl *)(const char* fmt,...)) + 0x425F30; + +void (*errorf)(U32 type, const char* fmt,...)= + (void (__cdecl *)(U32, const char*,...)) + 0x425FB0; + +} + +int (*dSscanf)(const char *buffer, const char *format, ...) = + (int (__cdecl *)(const char *,const char *,...)) + 0x55b640; + +int (*dSprintf)(char *buffer, dsize_t bufferSize, const char *format, ...) = + (int (__cdecl *)(char *,dsize_t,const char *,...)) + 0x55b5e0; + +bool (*dAtob)(const char *str) = + (bool (__cdecl *)(const char *str)) + 0x55B490; diff --git a/ModLoader/source/t2dll.cpp b/ModLoader/source/t2dll.cpp new file mode 100755 index 0000000..94ba387 --- /dev/null +++ b/ModLoader/source/t2dll.cpp @@ -0,0 +1,53 @@ +/* + * t2dll.cpp + * Original code by Linker + * Modified by Robert MacGregor +*/ + +#include "stdafx.h" +#include "t2ConCmds.h" +#include "t2api.h" +#include + +BOOL APIENTRY DllMain( HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + return true; +} + +__declspec(dllexport) void initT2Dll(void) +{ + // Run Linker's old implementations ... + Con::addMethodS("GuiTSCtrl","project",&conGuiTsCtrlProject,"projects a world space vector to on-screen position",3,3); + Con::addMethodB("NetObject","SetGhostable",&conNetObjectSetGhostable,"set or unset object to be ghostable",3,3); + Con::addMethodS(NULL,"getVariable",&conGetVariable,"Get a variable without restrictions",2,2); + + Con::addVariable("$cpuspeed",TypeS32,reinterpret_cast(0x8477F8)); //1 - S32, this is so i can set my cpu speed to 31337 or osmething =P + Con::addVariable("$GameBase::showBoundingBox",TypeBool,reinterpret_cast(0x9ECF24)); + + // Mod Loader Function + Con::addMethodB(NULL, "loadMod", &conLoadMod, "Loads a C++ modification.",2,2); + + // Load the original TribesNext DLL if available + typedef void (*LPINITT2DLL)(void); + HINSTANCE hDLL = NULL; + LPINITT2DLL lpinitT2DLL = NULL; + hDLL = LoadLibrary(L"tribesnext.dll"); // AfxLoadLibrary is probably better. + + if (hDLL == NULL) + return; // The DLL doesn't exist + else + lpinitT2DLL = (LPINITT2DLL)GetProcAddress(hDLL, "_Z9initT2Dllv"); // Attempt to load our entry point + + if (lpinitT2DLL == NULL) + return; // Unable to load entry point + else + lpinitT2DLL(); // The function was loaded, call TribesNext and move on to postTN Startup +} + +#ifdef _MANAGED +#pragma managed(pop) +#endif +