Begin transition to the new ModLoader paradigm. Begin cleaning up code.

This commit is contained in:
Robert MacGregor 2017-07-21 04:30:15 -04:00
parent 015a9f4dc8
commit cb9895a38e
39 changed files with 1429 additions and 967 deletions

4
.gitignore vendored
View file

@ -11,3 +11,7 @@
*.idb
*.unsuccessfulbuild
*.lastbuildstate
*.cache
*.ipch
*.exp
*.suo

Binary file not shown.

View file

@ -79,6 +79,7 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="include\DXAPI\AIConnection.h" />
<ClInclude Include="include\DXAPI\DXAPI.h" />
<ClInclude Include="include\DXAPI\FlyingVehicle.h" />
<ClInclude Include="include\DXAPI\GameBase.h" />
@ -98,8 +99,10 @@
<ClInclude Include="include\DXAPI\TCPObject.h" />
<ClInclude Include="include\DXAPI\Vehicle.h" />
<ClInclude Include="include\LinkerAPI.h" />
<ClInclude Include="include\ModLoader\ModLoader.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="source\DXAPI\AIConnection.cpp" />
<ClCompile Include="source\DXAPI\DXAPI.cpp" />
<ClCompile Include="source\DXAPI\FlyingVehicle.cpp" />
<ClCompile Include="source\DXAPI\GameBase.cpp" />

View file

@ -13,123 +13,141 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files\DXAPI">
<UniqueIdentifier>{4e8c3150-9f1d-4cbf-84f2-8dc65b11689f}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\DXAPI">
<UniqueIdentifier>{cbe0f5ac-7a8c-42ef-872a-f792f27a0cbb}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\ModLoader">
<UniqueIdentifier>{dac4c4a7-1792-4304-bbc5-7254e1795b10}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\DXAPI\DXAPI.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\FlyingVehicle.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\GameBase.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\GameConnection.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\GrenadeProjectile.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\NetConnection.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\NetObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Player.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Point3F.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Projectile.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\SceneObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\ScriptObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\ShapeBase.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\SimObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\StaticShape.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\TCPObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Vehicle.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\LinkerAPI.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\AIConnection.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\GrenadeProjectile.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\DXAPI.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\FlyingVehicle.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\GameBase.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\GameConnection.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Move.h">
<Filter>Header Files</Filter>
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Vehicle.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\NetConnection.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\NetObject.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Player.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Point3F.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\Projectile.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\SceneObject.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\ScriptObject.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\ShapeBase.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\SimObject.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\StaticShape.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\DXAPI\TCPObject.h">
<Filter>Header Files\DXAPI</Filter>
</ClInclude>
<ClInclude Include="include\ModLoader\ModLoader.h">
<Filter>Header Files\ModLoader</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="source\DXAPI\DXAPI.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\FlyingVehicle.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\GameBase.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\GameConnection.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\GrenadeProjectile.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\NetConnection.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\NetObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Player.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Point3F.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Projectile.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\SceneObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\ScriptObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\ShapeBase.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\SimObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\StaticShape.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\TCPObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Vehicle.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\LinkerAPI.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\AIConnection.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\GrenadeProjectile.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\DXAPI.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\FlyingVehicle.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\GameBase.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\GameConnection.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Move.cpp">
<Filter>Source Files</Filter>
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Vehicle.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\NetConnection.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\NetObject.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Player.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Point3F.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\Projectile.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\SceneObject.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\ScriptObject.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\ShapeBase.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\SimObject.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\StaticShape.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
<ClCompile Include="source\DXAPI\TCPObject.cpp">
<Filter>Source Files\DXAPI</Filter>
</ClCompile>
</ItemGroup>
</Project>

View file

@ -1,2 +1,2 @@
#v4.0:v100
Release|Win32|C:\t2cpp\T2-CPP-master\|
Release|Win32|C:\Documents and Settings\NobodyBla\Desktop\T2AI\T2-CPP-master\|

View file

@ -0,0 +1,24 @@
#pragma once
#include <DXAPI/Move.h>
#include <DXAPI/GameConnection.h>
namespace DX
{
class AIConnection : public GameConnection
{
public:
AIConnection(unsigned int obj);
//! Whether or not this bot should use custom moves.
bool mUseCustomMoves;
//! The custom move for this bot.
Move mCustomMove;
/**
* @brief Computes the current move for this bot.
*/
void generateMove(void);
};
} // End NameSpace DX

View file

@ -38,13 +38,25 @@ namespace DX
typedef void* UnresolvedObject;
const char *GetModPaths(void);
bool IsFile(const char *filename);
const char * StringTableInsert(const char * str,bool casesensitive);
bool GetRelativePath(const char *filename, char *ret, int buffer_length);
bool GetRunningMod(char *ret, int buffer_length);
bool memPatch(unsigned int addr, unsigned char * data, unsigned int size);
bool memToHex(unsigned int addr, char * dst, int size, bool spaces);
unsigned int memToUInt(unsigned int addr);
float memToFloat(unsigned int addr);
bool SanitizeFileName(char *ret, int buffer_length);
//! Initializes all hooks for the engine.
void initializeHooks(void);
} // End NameSpace DX

View file

@ -7,12 +7,18 @@
namespace DX
{
/**
* @brief A class representing an incoming connection to the Tribes 2 server.
*/
class GameConnection : public NetConnection
{
public:
GameConnection(unsigned int obj);
/**
* @brief Gets the control object this game connection is controlling.
* @return The shapebase instance being controlled.
*/
ShapeBase getControlObject(void);
};
} // End NameSpace DX

View file

@ -6,7 +6,9 @@
#include <LinkerAPI.h>
namespace DX
{
/**
* @brief Move structure.
*/
struct Move {
int px;
int py;
@ -26,13 +28,14 @@ namespace DX
bool triggers[6];
};
struct AIMove {
unsigned int id;
Move move;
bool used;
};
float clampFloat(float in);
float clampMove(float in);
void generateNullMove(Move * ret);
};

View file

@ -15,5 +15,7 @@ namespace DX
const unsigned int &identifier;
const unsigned int base_pointer_value;
const unsigned int &dataBlock;
char& mName;
};
} // End NameSpace DX

View file

@ -0,0 +1,39 @@
/**
* @brief ModLoader main include file.
*/
namespace ModLoader
{
//! A pointer type for a server process function.
typedef void (*ServerProcessPointer)(unsigned int);
typedef void (*InitializeModPointer)();
typedef void (*DeinitializeModPointer)();
typedef const char* (*GetManagementNamePointer)();
//! A pointer type for reading the supported mod loader version for this mod.
typedef unsigned int (*GetModLoaderVersionPointer)();
class ModLoaderCallables
{
public:
//! Hook function that is called when the mod is loaded.
InitializeModPointer mInitializeModPointer;
//! Hook function that is called when the mod is unloaded.
DeinitializeModPointer mDeinitializeModPointer;
//! Hook function for the server update loop.
ServerProcessPointer mServerProcessPointer;
//! Function called to get the name of the script object to use for registering mod management functions.
GetManagementNamePointer mGetManagementName;
};
/**
* @brief Returns the hook information from the loaded mod.
*/
typedef ModLoaderCallables* (*GetModCallablesPointer)();
}

View file

@ -0,0 +1,13 @@
#include <DXAPI/AIConnection.h>
namespace DX
{
AIConnection::AIConnection(unsigned int obj) : mUseCustomMoves(false), GameConnection(obj)
{
}
void AIConnection::generateMove(void)
{
}
} // End NameSpace DX

View file

@ -33,6 +33,7 @@ namespace DX
}
return retval;
}
bool memPatch(unsigned int addr, unsigned char * data, unsigned int size){
DWORD oldprotect=0;
DWORD oldnewprotect=0;
@ -41,6 +42,7 @@ namespace DX
VirtualProtect((void *)addr,size,oldprotect,&oldnewprotect);
return true;
}
float memToFloat(unsigned int addr){
DWORD oldprotect=0;
DWORD oldnewprotect=0;
@ -51,6 +53,7 @@ namespace DX
VirtualProtect((void *)addr,4,oldprotect,&oldnewprotect);
return true;
}
unsigned int memToUInt(unsigned int addr){
DWORD oldprotect=0;
DWORD oldnewprotect=0;
@ -61,6 +64,7 @@ namespace DX
VirtualProtect((void *)addr,4,oldprotect,&oldnewprotect);
return true;
}
bool memToHex(unsigned int addr, char * dst, int size, bool spaces=false){
DWORD oldprotect=0;
DWORD oldnewprotect=0;
@ -80,6 +84,7 @@ namespace DX
strncpy(dst,outstr,255);
return true;
}
const char *GetModPaths(void)
{
int pointer = *(int*)0x9E8690;
@ -183,4 +188,9 @@ namespace DX
return was_dirty;
}
void initializeHooks(void)
{
}
}

View file

@ -13,7 +13,7 @@ namespace DX
__asm
{
mov ecx, my_ptr;
add ecx, 3404928;
add ecx, 0x33f480;
test ecx, ecx;
mov edx, ecx;
@ -21,7 +21,7 @@ namespace DX
add edx, 4294967136;
loc_5FDA60_sim:
mov eax, [edx + 33372];
mov eax, [edx + 0x825c];
test eax, eax;
jnz got_valid_ptr;

View file

@ -7,7 +7,7 @@
namespace DX
{
SimObject::SimObject(unsigned int obj) : identifier(*(unsigned int*)(obj + 32)), fieldDictionary(*(unsigned int*)(obj + 0x2C)), dataBlock(*(unsigned int*)(obj + 0x248)),
base_pointer_value(obj)
base_pointer_value(obj), mName(*(char*)(obj + 4))
{
}
@ -45,6 +45,7 @@ namespace DX
return result;
}
const char *SimObject::getFieldValue(const char *slotname)
{
void * getfieldvalueptr=(void *)0x435210;

View file

@ -23,6 +23,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WatchDog", "Mod Sources\Wat
{9B3A3214-400B-4245-85FD-EA12D5F791D4} = {9B3A3214-400B-4245-85FD-EA12D5F791D4}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PythonMod", "Mod Sources\PythonMod\PythonMod\PythonMod.vcxproj", "{2BF01D65-C8F6-4565-AB0A-9F73B2E3D6E3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@ -49,6 +51,10 @@ Global
{1C8B5AA4-B172-45DD-9D27-55F41B6F1755}.Debug|Win32.Build.0 = Debug|Win32
{1C8B5AA4-B172-45DD-9D27-55F41B6F1755}.Release|Win32.ActiveCfg = Release|Win32
{1C8B5AA4-B172-45DD-9D27-55F41B6F1755}.Release|Win32.Build.0 = Release|Win32
{2BF01D65-C8F6-4565-AB0A-9F73B2E3D6E3}.Debug|Win32.ActiveCfg = Debug|Win32
{2BF01D65-C8F6-4565-AB0A-9F73B2E3D6E3}.Debug|Win32.Build.0 = Debug|Win32
{2BF01D65-C8F6-4565-AB0A-9F73B2E3D6E3}.Release|Win32.ActiveCfg = Release|Win32
{2BF01D65-C8F6-4565-AB0A-9F73B2E3D6E3}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

Binary file not shown.

Binary file not shown.

View file

@ -14,6 +14,7 @@
<ProjectGuid>{2A498B2D-84B2-4BBF-9532-EA17E5BA51BB}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>BaseMod</RootNamespace>
<ProjectName>BaseMod</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

Binary file not shown.

View file

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual C++ Express 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PythonMod", "PythonMod\PythonMod.vcxproj", "{2A498B2D-84B2-4BBF-9532-EA17E5BA51BB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2A498B2D-84B2-4BBF-9532-EA17E5BA51BB}.Debug|Win32.ActiveCfg = Debug|Win32
{2A498B2D-84B2-4BBF-9532-EA17E5BA51BB}.Debug|Win32.Build.0 = Debug|Win32
{2A498B2D-84B2-4BBF-9532-EA17E5BA51BB}.Release|Win32.ActiveCfg = Release|Win32
{2A498B2D-84B2-4BBF-9532-EA17E5BA51BB}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2BF01D65-C8F6-4565-AB0A-9F73B2E3D6E3}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>BaseMod</RootNamespace>
<ProjectName>PythonMod</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>include;$(IncludePath)</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>include;..\..\..\CommonAPI\Common\include;$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BASEMOD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>C:\Python27\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>C:\Python27\libs\python27.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BASEMOD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>C:\Python27\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>C:\Python27\libs\python27.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="source\BaseMod.cpp" />
<ClCompile Include="source\dllmain.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View file

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>

View file

@ -0,0 +1,7 @@
// BaseMod.cpp : Defines the exported functions for the DLL application.
//
extern "C"
{
}

View file

@ -0,0 +1,282 @@
// dllmain.cpp : Defines the entry point for the DLL application.
#include <SDKDDKVer.h>
#include <Windows.h>
#include <string>
#include <DXAPI/DXAPI.h>
#include <LinkerAPI.h>
#include <Python.h>
static int aienabled=0;
unsigned int oldaiaddr=0x0;
static unsigned int tmpobjptr=0;
static DX::Move curmove;
static char test[100];
static DX::Move *mechchangedmove;
static char test2[100];
static void * moveptrmech;
unsigned int updatemoveretptr=0x5d2d7c;
float maxrot=2.9f;
float minrot=-2.9f;
static unsigned int playerptr=0x0;
static float newTurn = 0.1f;
static float turnStrength = 1.0f;
float MECH_TURNING_SPEED=0.4f;
static unsigned int playerptr2;
extern "C"
{
static DX::AIMove aimoves[1024];
}
__declspec(naked) void updateMoveHook()
{
// this gets run from 0x5D2D6E
__asm {
mov playerptr,ebx
mov eax,[ebp+0x8]
mov moveptrmech,eax
pusha
};
MECH_TURNING_SPEED=0.4f;
if (playerptr!=0) {
playervar=&DX::Player(playerptr);
mechchangedmove=(DX::Move*) moveptrmech;
//_snprintf (command,255,"return(%d.getDataBlock());",playervar->identifier);
//strncpy(buf,Con::evaluate(command,false,NULL,true),255);
if (playervar->dataBlock!=NULL) {
playerdatavar = &DX::SimObject(playervar->dataBlock);
//Con::printf("Datablock is %s\n",buf);
if (playerdatavar->base_pointer_value!=0)
{
strcpy_s<256>(buf,playerdatavar->getFieldValue(DX::StringTableInsert("mechControlEnabled",false)));
Con::printf("mechControlEnabled: %s",buf);
if ((mechchangedmove)->freelook && ((mechchangedmove)->y>0.0) && dAtob(buf))
{
//sprintf (command,"return (%d.getDataBlock().mechTurnSpeed);",playervar->identifier);
strcpy_s<256>(buf,playerdatavar->getFieldValue(DX::StringTableInsert("mechTurnSpeed",false)));
Con::printf("mechTurnSpeed: %s",buf);
MECH_TURNING_SPEED=atof(buf);
// FIXME: The 3 here should reference the datablock's maximum turning angle -- we're essentially normalizing our rotation here.
float turnStrength = playervar->headRotationZ / 3;
// Use whatever is leftover in our forward movement
float forwardStrength = 1 - fabs(turnStrength);
// Calculate a new turn value that we use for both the main body and the head.
float newTurn = turnStrength * MECH_TURNING_SPEED;
float newHeadTurn = turnStrength * (MECH_TURNING_SPEED/20);
(mechchangedmove)->y = forwardStrength;
(mechchangedmove)->x += turnStrength;
// FIXME: Is the yaw value definitely in radians?
playervar->mRotZ += newTurn + (mechchangedmove)->yaw;
// Now, we must translate the turning strength into an appropriate subtraction for our
// head rotation.
playervar->headRotationZ += -newTurn;
(mechchangedmove)->pitch = 0;
(mechchangedmove)->yaw = 0;
(mechchangedmove)->roll = 0;
(mechchangedmove)->freelook = true;
}
}
}
}
__asm
{
popa
mov ebx,playerptr
mov eax,[ebp+8]
mov edx,[eax]
mov [ebx+0x894],edx
mov eax,[eax+4]
jmp [updatemoveretptr]
};
}
/* Return the number of arguments of the application command line */
static PyObject*
ts_tseval(PyObject *self, PyObject *args)
{
char *input;
if(!PyArg_ParseTuple(args, "s:tseval",&input))
return NULL;
std::string inputstr=std::string(input);
//Con::printf(inputstr.c_str());
return Py_BuildValue("s",Con::evaluate(inputstr.c_str(),false,NULL,false));
}
static PyMethodDef TSMethods[] = {
{"tseval", ts_tseval, METH_VARARGS,
"Evaluates TorqueScript."},
{NULL, NULL, 0, NULL}
};
DX::AIMove * getAIMovePtr(unsigned int id) {
int moveindex=0;
bool foundindex=false;
for (int x=0; x<1024; x++) {
if (aimoves[x].id==id && aimoves[x].used==true) {
moveindex=x;
foundindex=true;
break;
}
if (aimoves[x].used==false) {
moveindex=x;
break;
}
}
if (foundindex==true) {
return &aimoves[moveindex];
} else {
aimoves[moveindex].id=id;
aimoves[moveindex].used=true;
DX::generateNullMove(&(aimoves[moveindex].move));
return &aimoves[moveindex];
}
}
static unsigned int updatemovehookptr = (unsigned int)updateMoveHook;
DX::Move tmpmove;
bool consetMove(Linker::SimObject *obj, S32 argc, const char *argv[]) {
// setMove(%aicon, x, y, z, yaw, pitch, roll);
unsigned int aiconid = atoi(argv[1]);
DX::AIMove * aimove = getAIMovePtr(aiconid);
aimove->move.x=DX::clampFloat(std::stof(argv[2]));
aimove->move.y=DX::clampFloat(std::stof(argv[3]));
aimove->move.z=DX::clampFloat(std::stof(argv[4]));
aimove->move.yaw=DX::clampMove(std::stof(argv[5]));
aimove->move.pitch=DX::clampMove(std::stof(argv[6]));
aimove->move.roll=DX::clampMove(std::stof(argv[7]));
//Con::printf ("Set move variables for %d to x:%f y:%f z:%f yaw:%f pitch:%f roll:%f\n",aimove->id,aimove->move.x,aimove->move.y,aimove->move.z,aimove->move.yaw,aimove->move.pitch,aimove->move.roll);
return true;
}
newAIMoveListGeneratorPtr gen;
typedef void (__thiscall *newAIMoveListGeneratorPtr)(void*, DX::Move** moves, unsigned int * moveCount);
bool consetTrigger(Linker::SimObject *obj, S32 argc, const char *argv[]) {
unsigned int aiconid = atoi(argv[1]);
unsigned int index = atoi(argv[2]);
if (index < 6) {
DX::AIMove * aimove = getAIMovePtr(aiconid);
bool value = dAtob(argv[3]);
aimove->move.triggers[index]=value;
return true;
}
return false;
}
bool conDisableNewAI(Linker::SimObject *obj, S32 argc, const char *argv[])
{
if (aienabled==1) {
Py_Finalize();
(*((unsigned int *)0x75e360))=(unsigned int)oldaiaddr;
aienabled=0;
return true;
}
return false;
}
bool conEnableNewAI(Linker::SimObject *obj, S32 argc, const char *argv[])
{
if (aienabled==0) {
Py_Initialize();
Py_InitModule("ts", TSMethods);
oldaiaddr=(*((unsigned int *)0x75e360));
gen=(newAIMoveListGeneratorPtr)newAIMoveListGenerator;
(*((unsigned int *)0x75e360))=(unsigned int)(gen);
aienabled=1;
return true;
}
return false;
}
__declspec(dllexport) void __fastcall newAIMoveListGenerator(void* This, void* notUsed, DX::Move** moves, unsigned int* moveCount) {
tmpobjptr=(unsigned int)This;
unsigned int * origobjptr;
origobjptr=(unsigned int *) tmpobjptr;
DX::AIMove * aimove;
DX::GameConnection * aiconn;
//Con::printf ("Possible offsets for ID starting at 0x4\n");
if (origobjptr !=0 )
{
//unsigned int * idptr;
//unsigned int offset=0x4;
//for (offset=0x4; offset<0x100; offset+=0x4) {
//idptr=(unsigned int *)((* (origobjptr))+offset);
//Con::printf ("Offset: %08X Addr: %08X Data: %d",offset, idptr, *idptr);
//}
aiconn = &DX::GameConnection((unsigned int)origobjptr+0xA0);
aimove = getAIMovePtr(aiconn->identifier);
unsigned int ident=aiconn->identifier;
printf("%d\n",ident);
char movecallback[120]="";
sprintf_s<120>(movecallback,"AIMoveCallback(%d)\n",ident);
//FILE *f=fopen("AI.py","rb");
PyRun_SimpleString((std::string("import ts\nfrom ai import AIMoveCallback\nimport ai\n")+std::string(movecallback)).c_str());
//Con::evaluate(movecallback,false,NULL,NULL);
//Con::printf ("BasePointer: %08X", aiconn.base_pointer_value);
//Con::printf ("Ecx Value: %08X", origobjptr);
//Con::printf("ID: %d\n",aiconn.identifier);
//Con::evaluate ("listPlayers();",true,NULL,NULL);
//Con::printf("orig: %08X obj: %08X\n",origobjptr,0xBADABEEB);
//Con::printf("Move processed for %08X\n",(aicon.identifier));
}
//memcpy (&tmpmove,&(aimove->move),sizeof(DX::Move));
//DX::generateNullMove(&(aimove->move));
*moves = &(aimove->move);
*moveCount=1;
return;
}
__declspec(dllexport) void ModInitialize(void)
{
Con::addMethodB(NULL,"enableNewAI",&conEnableNewAI,"Enables the new Move Generation code for the AI", 1,4);
Con::addMethodB(NULL,"disableNewAI",&conDisableNewAI,"Disables the new Move Generation code for the AI", 1,4);
}
__declspec(dllexport) void ServerProcess(unsigned int deltaTime)
{
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

Binary file not shown.

View file

@ -2,12 +2,17 @@
//
#include "BaseMod.h"
#include <ModLoader\ModLoader.h>
#include "LinkerAPI.h"
#include "randomCmds.h"
extern "C"
{
BASEMOD_API unsigned int getModLoaderVersion(void)
{
return 0;
}
BASEMOD_API void ModInitialize(void)
{
Con::addMethodS(NULL,"getRandom",&conMRandom,"Random number generation based upon the Mersenne Twister algorithm.",1,3);
@ -18,4 +23,19 @@ extern "C"
return;
}
BASEMOD_API const char* getManagementName(void)
{
return "RandomMod";
}
BASEMOD_API ModLoader::ModLoaderCallables* getModCallables(void)
{
ModLoader::ModLoaderCallables* result = new ModLoader::ModLoaderCallables();
result->mInitializeModPointer = ModInitialize;
result->mGetManagementName = getManagementName;
return result;
}
}

View file

@ -63,11 +63,12 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;BASEMOD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>C:\Python27\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>ws2_32.lib;Dnsapi.lib;$(SolutionDir)\Common.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>ws2_32.lib;Dnsapi.lib;C:\Python27\libs\python27.lib;$(SolutionDir)\Common.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -78,13 +79,14 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;BASEMOD_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>C:\Python27\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>ws2_32.lib;Dnsapi.lib;$(SolutionDir)\Common.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>ws2_32.lib;Dnsapi.lib;$(SolutionDir)\Common.lib;C:\Python27\libs\python27.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View file

@ -3,7 +3,9 @@
#include <Windows.h>
#define _USE_MATH_DEFINES
#include <math.h>
//#define TORNADO_ENABLE
//#define MECH_MOVE_CODE
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
@ -25,18 +27,9 @@ BOOL APIENTRY DllMain( HMODULE hModule,
#include <DXAPI/Move.h>
#include <DXConCmds.h>
static DX::Move curmove;
static unsigned int tmpobjptr=0;
static char test[100];
static DX::Move *mechchangedmove;
static char test2[100];
static void * moveptrmech;
unsigned int updatemoveretptr=0x5d2d7c;
float maxrot=2.9f;
float minrot=-2.9f;
static unsigned int playerptr=0x0;
static float newTurn = 0.1f;
static float turnStrength = 1.0f;
extern "C"
{
@ -52,6 +45,9 @@ void *writeIntptr=(void *)0x43BF60;
void *writeStringptr=(void *)0x43C6D0;
void *readStringptr=(void *)0x43C630;
int streamReadInt(void * stream,int bitcount)
{
int retvalue=0x0;
@ -206,179 +202,10 @@ void DBunpackData(void *stream) {
}
float MECH_TURNING_SPEED=0.4f;
static unsigned int playerptr2;
__declspec(naked) void updateMoveHook()
{
// this gets run from 0x5D2D6E
__asm {
mov playerptr,ebx
mov eax,[ebp+0x8]
mov moveptrmech,eax
pusha
};
MECH_TURNING_SPEED=0.4f;
if (playerptr!=0) {
playervar=&DX::Player(playerptr);
mechchangedmove=(DX::Move*) moveptrmech;
//_snprintf (command,255,"return(%d.getDataBlock());",playervar->identifier);
//strncpy(buf,Con::evaluate(command,false,NULL,true),255);
if (playervar->dataBlock!=NULL) {
playerdatavar = &DX::SimObject(playervar->dataBlock);
//Con::printf("Datablock is %s\n",buf);
if (playerdatavar->base_pointer_value!=0)
{
strcpy_s<256>(buf,playerdatavar->getFieldValue(DX::StringTableInsert("mechControlEnabled",false)));
Con::printf("mechControlEnabled: %s",buf);
if ((mechchangedmove)->freelook && ((mechchangedmove)->y>0.0) && dAtob(buf))
{
//sprintf (command,"return (%d.getDataBlock().mechTurnSpeed);",playervar->identifier);
strcpy_s<256>(buf,playerdatavar->getFieldValue(DX::StringTableInsert("mechTurnSpeed",false)));
Con::printf("mechTurnSpeed: %s",buf);
MECH_TURNING_SPEED=atof(buf);
// FIXME: The 3 here should reference the datablock's maximum turning angle -- we're essentially normalizing our rotation here.
float turnStrength = playervar->headRotationZ / 3;
// Use whatever is leftover in our forward movement
float forwardStrength = 1 - fabs(turnStrength);
// Calculate a new turn value that we use for both the main body and the head.
float newTurn = turnStrength * MECH_TURNING_SPEED;
float newHeadTurn = turnStrength * (MECH_TURNING_SPEED/20);
(mechchangedmove)->y = forwardStrength;
(mechchangedmove)->x += turnStrength;
// FIXME: Is the yaw value definitely in radians?
playervar->mRotZ += newTurn + (mechchangedmove)->yaw;
// Now, we must translate the turning strength into an appropriate subtraction for our
// head rotation.
playervar->headRotationZ += -newTurn;
(mechchangedmove)->pitch = 0;
(mechchangedmove)->yaw = 0;
(mechchangedmove)->roll = 0;
(mechchangedmove)->freelook = true;
}
}
}
}
__asm
{
popa
mov ebx,playerptr
mov eax,[ebp+8]
mov edx,[eax]
mov [ebx+0x894],edx
mov eax,[eax+4]
jmp [updatemoveretptr]
};
}
static unsigned int updatemovehookptr = (unsigned int)updateMoveHook;
DX::AIMove * getAIMovePtr(unsigned int id) {
int moveindex=0;
bool foundindex=false;
for (int x=0; x<1024; x++) {
if (aimoves[x].id==id && aimoves[x].used==true) {
moveindex=x;
foundindex=true;
break;
}
if (aimoves[x].used==false) {
moveindex=x;
break;
}
}
if (foundindex==true) {
return &aimoves[moveindex];
} else {
aimoves[moveindex].id=id;
aimoves[moveindex].used=true;
DX::generateNullMove(&(aimoves[moveindex].move));
return &aimoves[moveindex];
}
}
DX::Move tmpmove;
__declspec(dllexport) void __cdecl newAIMoveListGenerator(DX::Move** moves, unsigned int * moveCount) {
__asm {
mov tmpobjptr,ecx
}
unsigned int * origobjptr;
origobjptr=(unsigned int *) tmpobjptr;
DX::AIMove * aimove;
DX::GameConnection * aiconn;
//Con::printf ("Possible offsets for ID starting at 0x4\n");
if (origobjptr !=0 ) {
//unsigned int * idptr;
//unsigned int offset=0x4;
//for (offset=0x4; offset<0x100; offset+=0x4) {
//idptr=(unsigned int *)((* (origobjptr))+offset);
//Con::printf ("Offset: %08X Addr: %08X Data: %d",offset, idptr, *idptr);
//}
aiconn = &DX::GameConnection((unsigned int)origobjptr+0xA0);
aimove = getAIMovePtr(aiconn->identifier);
char movecallback[120]="";
sprintf_s<120>(movecallback,"AIMoveCallback(%d);",aiconn->identifier);
Con::evaluate(movecallback,false,NULL,NULL);
//Con::printf ("BasePointer: %08X", aiconn.base_pointer_value);
//Con::printf ("Ecx Value: %08X", origobjptr);
//Con::printf("ID: %d\n",aiconn.identifier);
//Con::evaluate ("listPlayers();",true,NULL,NULL);
//Con::printf("orig: %08X obj: %08X\n",origobjptr,0xBADABEEB);
//Con::printf("Move processed for %08X\n",(aicon.identifier));
}
//memcpy (&tmpmove,&(aimove->move),sizeof(DX::Move));
//DX::generateNullMove(&(aimove->move));
*moves = &(aimove->move);
*moveCount=1;
return;
}
bool consetTrigger(Linker::SimObject *obj, S32 argc, const char *argv[]) {
unsigned int aiconid = atoi(argv[1]);
unsigned int index = atoi(argv[2]);
if (index < 6) {
DX::AIMove * aimove = getAIMovePtr(aiconid);
bool value = dAtob(argv[3]);
aimove->move.triggers[index]=value;
return true;
}
return false;
}
bool consetMove(Linker::SimObject *obj, S32 argc, const char *argv[]) {
// setMove(%aicon, x, y, z, yaw, pitch, roll);
unsigned int aiconid = atoi(argv[1]);
DX::AIMove * aimove = getAIMovePtr(aiconid);
aimove->move.x=DX::clampFloat(std::stof(argv[2]));
aimove->move.y=DX::clampFloat(std::stof(argv[3]));
aimove->move.z=DX::clampFloat(std::stof(argv[4]));
aimove->move.yaw=DX::clampMove(std::stof(argv[5]));
aimove->move.pitch=DX::clampMove(std::stof(argv[6]));
aimove->move.roll=DX::clampMove(std::stof(argv[7]));
//Con::printf ("Set move variables for %d to x:%f y:%f z:%f yaw:%f pitch:%f roll:%f\n",aimove->id,aimove->move.x,aimove->move.y,aimove->move.z,aimove->move.yaw,aimove->move.pitch,aimove->move.roll);
return true;
}
bool conEnableNewAI(Linker::SimObject *obj, S32 argc, const char *argv[])
{
(*((unsigned int *)0x75e360))=(unsigned int)newAIMoveListGenerator;
return true;
}
static S32 gravid=0;
static float movespeed=0.0;
@ -419,9 +246,8 @@ __declspec(naked) void updateMoveHook()
Con::addMethodB("GrenadeProjectile", "explode", &conProjectileExplode,"Explodes the given projectile", 5, 5);
Con::addMethodB("GameBase","setProcessTicks",&conSetProcessTicks,"Sets the flag for processing ticks or not", 3, 3);
Con::addMethodB("Projectile", "explode", &conProjectileExplode,"Explodes the given projectile", 5, 5);
Con::addMethodB(NULL,"enableNewAI",&conEnableNewAI,"Enables the new Move Generation code for the AI", 1,4);
Con::addMethodB(NULL,"setAIMove",&consetMove,"setAIMove(%aicon, x, y, z, yaw, pitch, roll)", 2,10);
Con::addMethodB(NULL,"setAITrigger", &consetTrigger, "setAITrigger(%aicon,triggerid,value);",2,5);
Con::addMethodB(NULL,"setAITrigger", &consetTrigger, "setAITrigger(%aicon,triggerid,value);",2,6);
Con::addMethodS("GrenadeProjectile", "getposition", &conGrenadeProjectileGetPosition,"Accurately gets the position of the GrenadeProjectile", 2, 2);
Con::addMethodS("GrenadeProjectile", "getvelocity", &conGrenadeProjectileGetVelocity,"Gets the velocity of the GrenadeProjectile", 2, 2);
Con::addMethodB("Projectile", "makeNerf", &conProjectileMakeNerf,"Makes the Projectile deal no damage", 2, 2);
@ -501,5 +327,6 @@ __declspec(naked) void updateMoveHook()
DX::memPatch(0x438415,(unsigned char *)dbpatch3,7);
DX::memPatch(0x5E29F0,(unsigned char *)gboaonadd,7);
#endif
Py_SetProgramName("AIInterpreter");
}
}

Binary file not shown.

Binary file not shown.

View file

@ -1,2 +1,2 @@
#v4.0:v100
Release|Win32|C:\t2cpp\T2-CPP-master\|
Release|Win32|C:\Documents and Settings\NobodyBla\Desktop\T2AI\T2-CPP-master\|

View file

@ -3,6 +3,4 @@
#include <string>
#include <unordered_set>
typedef void (*ServerProcessPointer)(unsigned int);
void serverProcessReplacement(unsigned int timeDelta);

View file

@ -4,16 +4,24 @@
#include "stdafx.h"
#include <LinkerAPI.h>
#include <DXAPI\ScriptObject.h>
#include <ModLoader\ModLoader.h>
static std::tr1::unordered_set<ServerProcessPointer> sServerProcessResponders;
//! A vector of mod callables.
static std::vector<ModLoader::ModLoaderCallables*> sModCallables;
void serverProcessReplacement(unsigned int timeDelta)
{
unsigned int servertickaddr=0x602350;
unsigned int serverthisptr=0x9E5EC0;
for (auto it = sServerProcessResponders.begin(); it != sServerProcessResponders.end(); it++)
(*it)(timeDelta);
// Call the server process hook for all eligible mods
for (auto it = sModCallables.begin(); it != sModCallables.end(); it++)
{
ModLoader::ModLoaderCallables* currentCallables = *it;
if (currentCallables->mServerProcessPointer != NULL)
currentCallables->mServerProcessPointer(timeDelta);
}
__asm
{
@ -23,15 +31,34 @@ void serverProcessReplacement(unsigned int timeDelta)
}
return;
}
// Mod Loader Implementation
bool conUnloadLoadMod(Linker::SimObject *obj,S32 argc, const char* argv[])
{
const char* targetName = argv[1];
for (auto it = sModCallables.begin(); it != sModCallables.end(); it++)
{
ModLoader::ModLoaderCallables* currentMod = *it;
if (strcmp(currentMod->mGetManagementName(), targetName) == 0)
{
// Deinitialize the mod and remove it from the list.
if (currentMod->mDeinitializeModPointer != NULL)
currentMod->mDeinitializeModPointer();
sModCallables.erase(it);
return true;
}
}
// Something weird happened.
Con::errorf(0, "Failed to unload mod: '%s'.", targetName);
return false;
}
bool conLoadMod(Linker::SimObject *obj,S32 argc, const char* argv[])
{
typedef void (*LPMODINIT)(void);
HINSTANCE hDLL = NULL;
LPMODINIT lpInitMod = NULL;
std::string raw = "mods\\";
raw += argv[1];
@ -46,25 +73,50 @@ bool conLoadMod(Linker::SimObject *obj,S32 argc, const char* argv[])
return false; // The DLL doesn't exist
}
lpInitMod = (LPMODINIT)GetProcAddress(hDLL, "ModInitialize"); // Attempt to load our entry point
if (lpInitMod == NULL)
// Attempt to load supported loader information first
ModLoader::GetModLoaderVersionPointer getModLoaderVersion = (ModLoader::GetModLoaderVersionPointer)GetProcAddress(hDLL, "getModLoaderVersion");
if (getModLoaderVersion == NULL)
{
Con::errorf(0, "loadMod(): Failed to locate entry point 'ModInitialize' in mod DLL '%s'. Is it a good mod DLL? (%u)", raw.c_str(), GetLastError());
Con::errorf(0, "loadMod(): Failed to locate entry point 'getModLoaderVersion' in mod DLL '%s'. Is it a good mod DLL? (%u)", raw.c_str(), GetLastError());
return false; // Unable to load entry point
}
lpInitMod();
Con::errorf(0, "loadMod(): Loaded and executed entry point code for mod DLL '%s'", raw.c_str());
// Check if there's a server process responder in this DLL
ServerProcessPointer serverProcess = (ServerProcessPointer)GetProcAddress(hDLL, "ServerProcess"); // Attempt to load our entry point
if (serverProcess != NULL)
ModLoader::GetModCallablesPointer getModCallables = (ModLoader::GetModCallablesPointer)GetProcAddress(hDLL, "getModCallables");
if (getModCallables == NULL)
{
sServerProcessResponders.insert(sServerProcessResponders.end(), serverProcess);
Con::errorf(0, "loadMod(): Added server process responder for mod");
Con::errorf(0, "loadMod(): Failed to locate entry point 'getModCallables' in mod DLL '%s'. Is it a good mod DLL? (%u)", raw.c_str(), GetLastError());
return false; // Unable to load entry point
}
unsigned int modLoaderVersion = getModLoaderVersion();
ModLoader::ModLoaderCallables* callables = getModCallables();
// Management name function must be provided
if (callables->mGetManagementName == NULL)
{
Con::errorf(0, "loadMod(): Loaded mod did not provide a management name. This is required.", raw.c_str(), GetLastError());
return false; // Unable to load entry point
}
const char* managementName = callables->mGetManagementName();
// Is the mod already loaded?
for (auto it = sModCallables.begin(); it != sModCallables.end(); it++)
{
ModLoader::ModLoaderCallables* currentMod = *it;
if (strcmp(currentMod->mGetManagementName(), managementName) == 0)
{
Con::errorf(0, "loadMod(): The mod is already loaded.", raw.c_str(), GetLastError());
return false;
}
}
// FIXME: We should probably only run this once at init
Con::addMethodB(NULL, "unloadMod", &conUnloadLoadMod, "Unloads a C++ modification by name.", 2, 2);
if (callables->mInitializeModPointer != NULL)
callables->mInitializeModPointer();
sModCallables.push_back(callables);
return true;
}

View file

@ -7,6 +7,7 @@
#include <stdafx.h>
#include <LinkerAPI.h>
#include <DXAPI\DXAPI.h>
#include <modLoader.h>
#include <unordered_set>
@ -20,8 +21,22 @@ BOOL APIENTRY DllMain( HMODULE hModule,
{
return true;
}
const unsigned char moduroutine[] = {0x8B, 0x3D, 0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x8B, 0x14, 0x85, 0xFC, 0xA5, 0x88, 0x00, 0x83, 0xFA, 0x00, 0x74, 0x30, 0x8B, 0x3D, 0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x31, 0xD2, 0x89, 0xF8, 0x8B, 0x04, 0x85, 0x00, 0xA6, 0x88, 0x00, 0xF7, 0x34, 0xBD, 0xFC, 0xA5, 0x88, 0x00, 0xFF, 0x0D, 0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x89, 0x14, 0x85, 0xFC, 0xA5, 0x88, 0x00, 0xB8, 0xC7, 0xCE, 0x42, 0x00, 0xFF, 0xE0, 0xFF, 0x0D, 0xEC, 0x82, 0x9E, 0x00, 0xC7, 0x04, 0x85, 0xFC, 0xA5, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xC7, 0xCE, 0x42, 0x00, 0xFF, 0xE0};
const unsigned char interpreterRoutine[] = {0x8B ,0x56 ,0x18 ,0x89 ,0x15 ,0x10 ,0xB7 ,0xA3 ,0x00 ,0x89 ,0x1D ,0x14 ,0xB7 ,0xA3 ,0x00 ,0x8B ,0x55 ,0x80 ,0x89 ,0xD0 ,0xBF ,0xD9 ,0xCE ,0x42 ,0x00 ,0x3D ,0x55 ,0x00 ,0x00 ,0x00 ,0xFF ,0xE7};
const unsigned char moduroutine[] = {
0x8B, 0x3D, 0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x8B, 0x14, 0x85, 0xFC,
0xA5, 0x88, 0x00, 0x83, 0xFA, 0x00, 0x74, 0x30, 0x8B, 0x3D, 0xEC, 0x82,
0x9E, 0x00, 0x89, 0xF8, 0x31, 0xD2, 0x89, 0xF8, 0x8B, 0x04, 0x85, 0x00,
0xA6, 0x88, 0x00, 0xF7, 0x34, 0xBD, 0xFC, 0xA5, 0x88, 0x00, 0xFF, 0x0D,
0xEC, 0x82, 0x9E, 0x00, 0x89, 0xF8, 0x89, 0x14, 0x85, 0xFC, 0xA5, 0x88,
0x00, 0xB8, 0xC7, 0xCE, 0x42, 0x00, 0xFF, 0xE0, 0xFF, 0x0D, 0xEC, 0x82,
0x9E, 0x00, 0xC7, 0x04, 0x85, 0xFC, 0xA5, 0x88, 0x00, 0x00, 0x00, 0x00,
0x00, 0xB8, 0xC7, 0xCE, 0x42, 0x00, 0xFF, 0xE0};
const unsigned char interpreterRoutine[] = {
0x8B, 0x56, 0x18, 0x89, 0x15, 0x10, 0xB7, 0xA3 ,0x00, 0x89, 0x1D, 0x14,
0xB7, 0xA3, 0x00, 0x8B, 0x55, 0x80, 0x89, 0xD0 ,0xBF, 0xD9, 0xCE, 0x42, 0x00,
0x3D, 0x55, 0x00, 0x00, 0x00, 0xFF, 0xE7};
const char* congetServPAddr(Linker::SimObject *obj, S32 argc, const char *argv[])
{
char test[256] = "";
@ -30,6 +45,7 @@ const char* congetServPAddr(Linker::SimObject *obj, S32 argc, const char *argv[]
sprintf(test2,"B8%08XFFD089EC5DC3",endian(spr));
return test2;
}
const char* congetModuAddr(Linker::SimObject *obj, S32 argc, const char *argv[])
{
char test[256] = "";
@ -38,6 +54,7 @@ const char* congetModuAddr(Linker::SimObject *obj, S32 argc, const char *argv[])
sprintf(test2,"B8%08XFFE0",endian(spr));
return test2;
}
const char* congetInterpreterAddr(Linker::SimObject *obj, S32 argc, const char *argv[])
{
char test[256] = "";
@ -63,6 +80,7 @@ class CImmDevice
Con::addVariable("$cpuspeed",TypeS32,reinterpret_cast<void*>(0x8477F8)); //1 - S32, this is so i can set my cpu speed to 31337 or osmething =P
Con::addVariable("$GameBase::showBoundingBox",TypeBool,reinterpret_cast<void*>(0x9ECF24));
DWORD oldprotect=0;
// Mod Loader Function
Con::addMethodB(NULL, "loadMod", &conLoadMod, "Loads a C++ modification.",2,2);
Con::addMethodS(NULL, "getServPAddr",&congetServPAddr,"Gets the memPatch data for ServerProcess",1,1);
@ -87,6 +105,9 @@ class CImmDevice
else
lpinitT2DLL(); // The function was loaded, call TribesNext and move on to postTN Startup
// Initialize all engine hooks
DX::initializeHooks();
return 0;
}