Merge branch 'implement-new-codo-maps' into 'develop'
Resolve "Implement new CODO maps"
This commit is contained in:
commit
b6a5c18662
2
deps/fmt
vendored
2
deps/fmt
vendored
@ -1 +1 @@
|
||||
Subproject commit ed874df293f8c0831477a2abbdabfb3a0d0441a8
|
||||
Subproject commit abbefd71666055daac9e14e78262620f9e845850
|
2
deps/mongoose
vendored
2
deps/mongoose
vendored
@ -1 +1 @@
|
||||
Subproject commit a17eae4142f3ab5eea8189810189ab1fec67294a
|
||||
Subproject commit c722cfec18231c6d18ab8a73993b763aa1e0dd7e
|
@ -63,6 +63,7 @@ namespace Components
|
||||
Loader::Register(new QuickPatch());
|
||||
Loader::Register(new ServerInfo());
|
||||
Loader::Register(new ServerList());
|
||||
Loader::Register(new SlowMotion());
|
||||
Loader::Register(new StringTable());
|
||||
Loader::Register(new ZoneBuilder());
|
||||
Loader::Register(new AssetHandler());
|
||||
|
@ -76,6 +76,7 @@ namespace Components
|
||||
#include "Modules\QuickPatch.hpp"
|
||||
#include "Modules\ServerInfo.hpp"
|
||||
#include "Modules\ServerList.hpp"
|
||||
#include "Modules\SlowMotion.hpp"
|
||||
#include "Modules\StringTable.hpp"
|
||||
#include "Modules\ZoneBuilder.hpp"
|
||||
#include "Modules\AssetHandler.hpp"
|
||||
|
@ -371,7 +371,7 @@ namespace Components
|
||||
__asm
|
||||
{
|
||||
pushad
|
||||
push[esp + 20h]
|
||||
push [esp + 20h]
|
||||
|
||||
call AntiCheat::AssertCalleeModule
|
||||
|
||||
|
@ -132,7 +132,57 @@ namespace Components
|
||||
}
|
||||
}
|
||||
|
||||
if (type == 5 && name == "wc/codo_ui_viewer_black_decal3"s)
|
||||
#if DEBUG
|
||||
if (type == 9 && false)
|
||||
{
|
||||
static Game::MaterialTechniqueSet* technique = nullptr;
|
||||
|
||||
auto printTechset = [] (Game::MaterialTechniqueSet* technique, std::string zone)
|
||||
{
|
||||
FILE* fp;
|
||||
fopen_s(&fp, "test.txt", "a");
|
||||
fprintf(fp, "%s: %s\n", zone.data(), technique->name);
|
||||
|
||||
for (int i = 0; i < 48; i++)
|
||||
{
|
||||
if (technique->techniques[i])
|
||||
{
|
||||
fprintf(fp, "\t%d: %s\n", i, technique->techniques[i]->name);
|
||||
|
||||
for (int j = 0; j < technique->techniques[i]->numPasses; j++)
|
||||
{
|
||||
Game::MaterialPass* pass = &technique->techniques[i]->passes[j];
|
||||
|
||||
for (int k = 0; k < (pass->argCount1 + pass->argCount2 + pass->argCount3); k++)
|
||||
{
|
||||
fprintf(fp, "\t\t\t%d.%d.%d Para: %d\n", i, j, k, pass->argumentDef[k].paramID & 0xFFFF);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(fp, "\n");
|
||||
fclose(fp);
|
||||
};
|
||||
|
||||
static std::map<std::string, Game::MaterialTechniqueSet*> techs;
|
||||
|
||||
if (FastFiles::Current() == "mp_rust_long")
|
||||
{
|
||||
techs[name] = asset->materialTechset;
|
||||
printTechset(asset->materialTechset, "mp_rust_long");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (techs.find(name) != techs.end())
|
||||
{
|
||||
printTechset(asset->materialTechset, FastFiles::Current());
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (type == Game::XAssetType::ASSET_TYPE_MATERIAL && name == "wc/codo_ui_viewer_black_decal3"s)
|
||||
{
|
||||
asset->material->sortKey = 0xE;
|
||||
}
|
||||
@ -321,7 +371,7 @@ namespace Components
|
||||
// Log missing empty assets
|
||||
QuickPatch::OnFrame([] ()
|
||||
{
|
||||
if (Game::Sys_IsDatabaseReady() && Game::Sys_IsDatabaseReady2() && !AssetHandler::EmptyAssets.empty())
|
||||
if (FastFiles::Ready() && !AssetHandler::EmptyAssets.empty())
|
||||
{
|
||||
for (auto& asset : AssetHandler::EmptyAssets)
|
||||
{
|
||||
|
@ -197,7 +197,7 @@ namespace Components
|
||||
{
|
||||
if (ConnectProtocol::Used())
|
||||
{
|
||||
if (!Game::Sys_IsDatabaseReady() && !Game::Sys_IsDatabaseReady2())
|
||||
if (!FastFiles::Ready())
|
||||
{
|
||||
QuickPatch::Once(ConnectProtocol::Invocation);
|
||||
}
|
||||
|
@ -218,6 +218,11 @@ namespace Components
|
||||
return std::ifstream(path.data()).good();
|
||||
}
|
||||
|
||||
bool FastFiles::Ready()
|
||||
{
|
||||
return (Game::Sys_IsDatabaseReady() && Game::Sys_IsDatabaseReady2());
|
||||
}
|
||||
|
||||
const char* FastFiles::GetZoneLocation(const char* file)
|
||||
{
|
||||
const char* dir = Dvar::Var("fs_basepath").Get<const char*>();
|
||||
|
@ -12,7 +12,7 @@ namespace Components
|
||||
|
||||
static void AddZonePath(std::string path);
|
||||
static std::string Current();
|
||||
|
||||
static bool Ready();
|
||||
static bool Exists(std::string file);
|
||||
|
||||
static void LoadLocalizeZones(Game::XZoneInfo *zoneInfo, unsigned int zoneCount, int sync);
|
||||
|
@ -314,7 +314,15 @@ namespace Components
|
||||
Assert_Size(Game::XAssetEntry, 16);
|
||||
|
||||
Maps::EntryPool.clear();
|
||||
Maps::EntryPool.resize(789312);
|
||||
|
||||
if (ZoneBuilder::IsEnabled())
|
||||
{
|
||||
Maps::EntryPool.resize(1183968);
|
||||
}
|
||||
else
|
||||
{
|
||||
Maps::EntryPool.resize(789312);
|
||||
}
|
||||
|
||||
// Apply new size
|
||||
Utils::Hook::Set<DWORD>(0x5BAEB0, Maps::EntryPool.size());
|
||||
@ -404,11 +412,11 @@ namespace Components
|
||||
|
||||
Maps::AddDependency("mp_bloc_sh", "iw4x_dependencies_mp");
|
||||
Maps::AddDependency("mp_cargoship_sh", "iw4x_dependencies_mp");
|
||||
//Maps::AddDependency("mp_firingrange", "iw4x_dependencies_mp");
|
||||
//Maps::AddDependency("mp_shipment_long", "iw4x_dependencies_mp");
|
||||
//Maps::AddDependency("mp_firingrange", "iw4x_dependencies_mp");
|
||||
//Maps::AddDependency("mp_firingrange", "mp_underpass");
|
||||
//Maps::AddDependency("mp_underpass", "mp_firingrange");
|
||||
Maps::AddDependency("mp_firingrange", "iw4x_dependencies_mp");
|
||||
Maps::AddDependency("mp_shipment_long", "iw4x_dependencies_mp");
|
||||
Maps::AddDependency("mp_firingrange", "iw4x_dependencies_mp");
|
||||
Maps::AddDependency("mp_rust_long", "iw4x_dependencies_mp");
|
||||
Maps::AddDependency("mp_rust_long", "mp_rust");
|
||||
|
||||
#if defined(DEBUG) && defined(ENABLE_DXSDK)
|
||||
Command::Add("dumpmap", [] (Command::Params)
|
||||
|
85
src/Components/Modules/Slowmotion.cpp
Normal file
85
src/Components/Modules/Slowmotion.cpp
Normal file
@ -0,0 +1,85 @@
|
||||
#include "STDInclude.hpp"
|
||||
|
||||
namespace Components
|
||||
{
|
||||
int SlowMotion::Delay = 0;
|
||||
|
||||
void SlowMotion::ApplySlowMotion(int timePassed)
|
||||
{
|
||||
if (SlowMotion::Delay <= 0)
|
||||
{
|
||||
Utils::Hook::Call<void(int)>(0x60B2D0)(timePassed);
|
||||
}
|
||||
else
|
||||
{
|
||||
SlowMotion::Delay -= timePassed;
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) void SlowMotion::ApplySlowMotionStub()
|
||||
{
|
||||
__asm
|
||||
{
|
||||
pushad
|
||||
push [esp + 20h]
|
||||
|
||||
call SlowMotion::ApplySlowMotion
|
||||
|
||||
pop ecx
|
||||
popad
|
||||
|
||||
retn
|
||||
}
|
||||
}
|
||||
|
||||
void SlowMotion::SetSlowMotion()
|
||||
{
|
||||
int duration = 1000;
|
||||
float start = Game::Scr_GetFloat(0);
|
||||
float end = 1.0f;
|
||||
|
||||
if (Game::Scr_GetNumParam() >= 2)
|
||||
{
|
||||
end = Game::Scr_GetFloat(1);
|
||||
}
|
||||
|
||||
if (Game::Scr_GetNumParam() >= 3)
|
||||
{
|
||||
duration = static_cast<int>(Game::Scr_GetFloat(2) * 1000.0);
|
||||
}
|
||||
|
||||
int delay = 0;
|
||||
|
||||
if (start > end)
|
||||
{
|
||||
if (duration < 150)
|
||||
{
|
||||
delay = duration;
|
||||
}
|
||||
else
|
||||
{
|
||||
delay = 150;
|
||||
}
|
||||
}
|
||||
|
||||
duration = duration - delay;
|
||||
|
||||
Game::Com_SetSlowMotion(start, end, duration);
|
||||
SlowMotion::Delay = delay;
|
||||
|
||||
// set snapshot num to 1 behind (T6 does this, why shouldn't we?)
|
||||
for (int i = 0; i < *Game::svs_numclients; i++)
|
||||
{
|
||||
Game::svs_clients[i].snapNum = (*reinterpret_cast<DWORD*>(0x31D9384)) - 1;
|
||||
}
|
||||
}
|
||||
|
||||
SlowMotion::SlowMotion()
|
||||
{
|
||||
if (!Dedicated::IsEnabled()) return;
|
||||
|
||||
SlowMotion::Delay = 0;
|
||||
Utils::Hook(0x5F5FF2, SlowMotion::SetSlowMotion, HOOK_JUMP).Install()->Quick();
|
||||
Utils::Hook(0x60B38A, SlowMotion::ApplySlowMotionStub, HOOK_CALL).Install()->Quick();
|
||||
}
|
||||
}
|
22
src/Components/Modules/Slowmotion.hpp
Normal file
22
src/Components/Modules/Slowmotion.hpp
Normal file
@ -0,0 +1,22 @@
|
||||
#define BUTTON_FLAG_LEANLEFT 0x40
|
||||
#define BUTTON_FLAG_LEANRIGHT 0x80
|
||||
|
||||
namespace Components
|
||||
{
|
||||
class SlowMotion : public Component
|
||||
{
|
||||
public:
|
||||
SlowMotion();
|
||||
|
||||
#if defined(DEBUG) || defined(FORCE_UNIT_TESTS)
|
||||
const char* GetName() { return "SlowMotion"; };
|
||||
#endif
|
||||
|
||||
private:
|
||||
static int Delay;
|
||||
|
||||
static void SetSlowMotion();
|
||||
static void ApplySlowMotion(int timePassed);
|
||||
static void ApplySlowMotionStub();
|
||||
};
|
||||
}
|
@ -493,8 +493,11 @@ namespace Components
|
||||
Utils::Hook::Nop(0x5BB3F2, 5);
|
||||
Utils::Hook::Nop(0x5BB422, 5);
|
||||
Utils::Hook::Nop(0x5BB43A, 5);
|
||||
|
||||
// Increase asset pools
|
||||
Game::ReallocateAssetPool(Game::XAssetType::ASSET_TYPE_MAP_ENTS, 10);
|
||||
Game::ReallocateAssetPool(Game::XAssetType::ASSET_TYPE_XMODELSURFS, 8192);
|
||||
Game::ReallocateAssetPool(Game::XAssetType::ASSET_TYPE_IMAGE, 14336);
|
||||
|
||||
// hunk size (was 300 MiB)
|
||||
Utils::Hook::Set<DWORD>(0x64A029, 0x38400000); // 900 MiB
|
||||
|
@ -1005,12 +1005,29 @@ namespace Components
|
||||
if (arg->paramID >= 58 && arg->paramID <= 135) // >= 34 would be 31 in iw4 terms
|
||||
{
|
||||
arg->paramID -= 3;
|
||||
|
||||
if (Zones::Version() >= 359/* && arg->paramID <= 113*/)
|
||||
{
|
||||
arg->paramID -= 7;
|
||||
}
|
||||
}
|
||||
// >= 21 works fine for specular, but breaks trees
|
||||
// >= 4 is too low, breaks specular
|
||||
else if (arg->paramID >= 11 && arg->paramID < 58)
|
||||
{
|
||||
arg->paramID -= 2;
|
||||
|
||||
if (Zones::Version() >= 359)
|
||||
{
|
||||
if (arg->paramID > 15 && arg->paramID < 34)
|
||||
{
|
||||
arg->paramID -= 1;
|
||||
}
|
||||
else if (arg->paramID >= 50)
|
||||
{
|
||||
arg->paramID += 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1126,7 +1143,12 @@ namespace Components
|
||||
{
|
||||
bool result = Game::Load_Stream(atStreamStart, buffer, size + 4);
|
||||
|
||||
// This shouldn't make any difference.
|
||||
// The new entry is an additional remapped techset which is linked at runtime.
|
||||
// It's used when the 0x100 gameFlag in a material is set.
|
||||
// As MW2 flags are only 1 byte large, this won't be possible anyways
|
||||
int shiftTest = 4;
|
||||
|
||||
std::memmove(buffer + 8 + shiftTest, buffer + 12 + shiftTest, 196 - shiftTest);
|
||||
AssetHandler::Relocate(buffer + 12 + shiftTest, buffer + 8 + shiftTest, 196 - shiftTest);
|
||||
|
||||
@ -1143,8 +1165,12 @@ namespace Components
|
||||
//int surfaceTypeBits;
|
||||
const char *name;
|
||||
char drawSurf[6];
|
||||
char gameFlags;
|
||||
char pad;
|
||||
|
||||
union
|
||||
{
|
||||
char gameFlags;
|
||||
short sGameFlags;
|
||||
};
|
||||
char sortKey;
|
||||
char textureAtlasRowCount;
|
||||
char textureAtlasColumnCount;
|
||||
@ -1177,6 +1203,11 @@ namespace Components
|
||||
material->drawSurf[10] = material359.drawSurf[2];
|
||||
material->drawSurf[11] = material359.drawSurf[3];
|
||||
|
||||
if (material359.sGameFlags & 0x100)
|
||||
{
|
||||
//OutputDebugStringA("");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@ namespace Game
|
||||
Com_Printf_t Com_Printf = (Com_Printf_t)0x402500;
|
||||
Com_PrintMessage_t Com_PrintMessage = (Com_PrintMessage_t)0x4AA830;
|
||||
Com_ParseExt_t Com_ParseExt = (Com_ParseExt_t)0x474D60;
|
||||
Com_SetSlowMotion_t Com_SetSlowMotion = (Com_SetSlowMotion_t)0x446E20;
|
||||
|
||||
Con_DrawMiniConsole_t Con_DrawMiniConsole = (Con_DrawMiniConsole_t)0x464F30;
|
||||
Con_DrawSolidConsole_t Con_DrawSolidConsole = (Con_DrawSolidConsole_t)0x5A5040;
|
||||
@ -176,6 +177,9 @@ namespace Game
|
||||
Scr_LoadScript_t Scr_LoadScript = (Scr_LoadScript_t)0x45D940;
|
||||
Scr_GetFunctionHandle_t Scr_GetFunctionHandle = (Scr_GetFunctionHandle_t)0x4234F0;
|
||||
|
||||
Scr_GetFloat_t Scr_GetFloat = (Scr_GetFloat_t)0x443140;
|
||||
Scr_GetNumParam_t Scr_GetNumParam = (Scr_GetNumParam_t)0x4B0E90;
|
||||
|
||||
Scr_ExecThread_t Scr_ExecThread = (Scr_ExecThread_t)0x4AD0B0;
|
||||
Scr_FreeThread_t Scr_FreeThread = (Scr_FreeThread_t)0x4BD320;
|
||||
|
||||
|
@ -60,6 +60,9 @@ namespace Game
|
||||
typedef char* (__cdecl * Com_ParseExt_t)(const char **data_p);
|
||||
extern Com_ParseExt_t Com_ParseExt;
|
||||
|
||||
typedef void(__cdecl * Com_SetSlowMotion_t)(float start, float end, int duration);
|
||||
extern Com_SetSlowMotion_t Com_SetSlowMotion;
|
||||
|
||||
typedef char* (__cdecl * Con_DrawMiniConsole_t)(int localClientNum, int xPos, int yPos, float alpha);
|
||||
extern Con_DrawMiniConsole_t Con_DrawMiniConsole;
|
||||
|
||||
@ -425,6 +428,12 @@ namespace Game
|
||||
typedef int(__cdecl * Scr_LoadScript_t)(const char*);
|
||||
extern Scr_LoadScript_t Scr_LoadScript;
|
||||
|
||||
typedef float(__cdecl * Scr_GetFloat_t)(int);
|
||||
extern Scr_GetFloat_t Scr_GetFloat;
|
||||
|
||||
typedef int(__cdecl * Scr_GetNumParam_t)(void);
|
||||
extern Scr_GetNumParam_t Scr_GetNumParam;
|
||||
|
||||
typedef int(__cdecl * Scr_GetFunctionHandle_t)(const char*, const char*);
|
||||
extern Scr_GetFunctionHandle_t Scr_GetFunctionHandle;
|
||||
|
||||
|
@ -2476,6 +2476,33 @@ namespace Game
|
||||
GfxColor groundLighting;
|
||||
};
|
||||
|
||||
enum surfaceType_t
|
||||
{
|
||||
SF_TRIANGLES = 0x0,
|
||||
SF_TRIANGLES_NO_SUN_SHADOW = 0x1,
|
||||
SF_BEGIN_STATICMODEL = 0x2,
|
||||
SF_STATICMODEL_RIGID = 0x2,
|
||||
SF_STATICMODEL_INSTANCED = 0x3,
|
||||
SF_STATICMODEL_RIGID_NO_SUN_SHADOW = 0x4,
|
||||
SF_STATICMODEL_INSTANCED_NO_SUN_SHADOW = 0x5,
|
||||
SF_END_STATICMODEL = 0x6,
|
||||
SF_BMODEL = 0x6,
|
||||
SF_BEGIN_XMODEL = 0x7,
|
||||
SF_XMODEL_RIGID = 0x7,
|
||||
SF_XMODEL_SKINNED = 0x8,
|
||||
SF_END_XMODEL = 0x9,
|
||||
SF_BEGIN_FX = 0x9,
|
||||
SF_CODE = 0x9,
|
||||
SF_GLASS = 0xA,
|
||||
SF_MARK = 0xB,
|
||||
SF_SPARK = 0xC,
|
||||
SF_PARTICLE_CLOUD = 0xD,
|
||||
SF_PARTICLE_SPARK_CLOUD = 0xE,
|
||||
SF_END_FX = 0xF,
|
||||
SF_NUM_SURFACE_TYPES = 0xF,
|
||||
SF_FORCE_32_BITS = 0xFFFFFFFF,
|
||||
};
|
||||
|
||||
struct srfTriangles_t
|
||||
{
|
||||
int vertexLayerData;
|
||||
|
Loading…
Reference in New Issue
Block a user