Skip to content

Commit a79c9f0

Browse files
authored
MHWILDS: Fix module struct (tdb81) (#1528)
1 parent 33f5978 commit a79c9f0

File tree

3 files changed

+210
-4
lines changed

3 files changed

+210
-4
lines changed

shared/sdk/RETypeDB.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,16 +1190,34 @@ std::span<uint32_t> REModule::get_types() const {
11901190

11911191
std::span<uint32_t> REModule::get_methods() const {
11921192
auto tdb = RETypeDB::get();
1193+
1194+
#if TDB_VER == 81
1195+
spdlog::warn("This TDB version does not support REModule::get_methods()");
1196+
return {};
1197+
#else
11931198
return std::span<uint32_t>{(uint32_t*)tdb->get_bytes(this->methods_start), (size_t)this->methods_count};
1199+
#endif
11941200
}
11951201

11961202
std::span<uint32_t> REModule::get_instantiated_methods() const {
11971203
auto tdb = RETypeDB::get();
1204+
1205+
#if TDB_VER == 81
1206+
spdlog::warn("This TDB version does not support REModule::get_instantiated_methods()");
1207+
return {};
1208+
#else
11981209
return std::span<uint32_t>{(uint32_t*)tdb->get_bytes(this->method_instantiations_start), (size_t)this->method_instantiations_count};
1210+
#endif
11991211
}
12001212

12011213
std::span<uint32_t> REModule::get_member_references() const {
12021214
auto tdb = RETypeDB::get();
1215+
1216+
#if TDB_VER == 81
1217+
spdlog::warn("This TDB version does not support REModule::get_member_references()");
1218+
return {};
1219+
#else
12031220
return std::span<uint32_t>{(uint32_t*)tdb->get_bytes(this->member_references_start), (size_t)this->member_references_count};
1221+
#endif
12041222
}
12051223
} // namespace sdk

shared/sdk/RETypeDB.hpp

Lines changed: 191 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,179 @@ struct GenericListData {
444444
};
445445
}
446446

447+
namespace tdb81 {
448+
struct REMethodDefinition;
449+
struct REMethodImpl;
450+
struct REField;
451+
struct REFieldImpl;
452+
struct REProperty;
453+
struct RETypeImpl;
454+
struct REPropertyImpl;
455+
struct REParameterDef;
456+
struct REModule;
457+
458+
struct TDB {
459+
uint32_t magic;
460+
uint32_t version;
461+
uint32_t numTypes;
462+
uint32_t typesStartOfGenericsProbably; // I think this is the index of the start of the generics list in the types array (or start of something else)
463+
464+
uint32_t unk_int_tdb74;
465+
466+
uint32_t numMethods;
467+
uint32_t numFields;
468+
uint32_t numTypeImpl;
469+
uint32_t numFieldImpl;
470+
uint32_t numMethodImpl;
471+
uint32_t numPropertyImpl;
472+
uint32_t numProperties;
473+
uint32_t numEvents;
474+
475+
uint32_t numParams;
476+
uint32_t numAttributes;
477+
int32_t numInitData;
478+
uint32_t numAttributes2;
479+
uint32_t numInternStrings;
480+
uint32_t numModules;
481+
int32_t devEntry;
482+
int32_t appEntry;
483+
484+
uint32_t numStringPool;
485+
uint32_t numBytePool;
486+
487+
uint32_t padding;
488+
489+
sdk::REModule* modules;
490+
sdk::RETypeDefinition (*types)[93788];
491+
sdk::RETypeImpl (*typesImpl)[256];
492+
sdk::REMethodDefinition (*methods)[703558];
493+
sdk::REMethodImpl (*methodsImpl)[56756];
494+
sdk::REField (*fields)[1];
495+
sdk::REFieldImpl (*fieldsImpl)[1];
496+
sdk::REProperty (*properties)[256];
497+
sdk::REPropertyImpl (*propertiesImpl)[1];
498+
void* events;
499+
sdk::REParameterDef (*params)[10000];
500+
class ::REAttributeDef (*attributes)[2000];
501+
int32_t (*initData)[19890];
502+
void* unk;
503+
int32_t (*attributes2)[256];
504+
char (*stringPool)[1];
505+
uint8_t (*bytePool)[256];
506+
int32_t (*internStrings)[14154];
507+
};
508+
509+
static_assert(sizeof(TDB) == 240);
510+
511+
struct REModule {
512+
uint32_t guid[4];
513+
int32_t unk1;
514+
uint32_t unk2;
515+
uint16_t major;
516+
uint16_t minor;
517+
uint16_t build;
518+
uint16_t revision;
519+
uint32_t flags;
520+
int32_t assembly_name_offset; // string
521+
int32_t location_offset; // string
522+
uint32_t unk3;
523+
uint32_t module_name_offset; // string
524+
uint32_t unk4;
525+
int32_t types_count;
526+
int32_t types_start;
527+
};
528+
static_assert(sizeof(REModule) == 0x40);
529+
530+
#pragma pack(push, 4)
531+
struct REParameterDef {
532+
uint16_t attributes_id;
533+
uint16_t init_data_index;
534+
uint32_t name_offset : 30;
535+
uint32_t modifier : 2;
536+
uint32_t type_id : TYPE_INDEX_BITS;
537+
uint32_t flags : (32 - TYPE_INDEX_BITS);
538+
};
539+
540+
struct REMethodDefinition {
541+
uint32_t declaring_typeid : TYPE_INDEX_BITS;
542+
uint32_t params_lo : 13;
543+
uint32_t impl_id : 19;
544+
uint32_t params_hi : 13;
545+
int32_t encoded_offset;
546+
};
547+
static_assert(sizeof(REMethodDefinition) == 0xC);
548+
549+
struct REMethodImpl {
550+
uint16_t attributes_id;
551+
int16_t vtable_index;
552+
uint16_t flags;
553+
uint16_t impl_flags;
554+
uint32_t name_offset;
555+
};
556+
557+
struct RETypeImpl {
558+
int32_t name_offset; // 0x0
559+
int32_t namespace_offset; // 0x4
560+
int32_t field_size; // 0x8
561+
int32_t static_field_size; // 0xc
562+
uint64_t unk_pad : 33; // 0x10
563+
uint64_t num_member_fields : 24; // 0x10
564+
uint64_t unk_pad_2 : 7; // 0x10
565+
uint16_t num_member_methods; // 0x18
566+
int16_t num_native_vtable; // 0x1a
567+
int16_t interface_id; // 0x1c
568+
char pad_1e[0x12];
569+
};
570+
#if TDB_VER >= 71
571+
static_assert(sizeof(RETypeImpl) == 0x30);
572+
static_assert(offsetof(RETypeImpl, num_member_methods) == 0x18);
573+
#endif
574+
575+
struct REProperty {
576+
uint64_t impl_id : 20;
577+
uint64_t getter : 22;
578+
uint64_t setter : 22;
579+
};
580+
581+
struct REPropertyImpl {
582+
uint16_t flags;
583+
uint16_t attributes_id;
584+
int32_t name_offset;
585+
};
586+
#pragma pack(pop)
587+
588+
struct ParamList {
589+
uint16_t numParams; //0x0000
590+
uint16_t invokeID; //0x0002
591+
uint32_t returnType; //0x0004
592+
uint32_t params[1]; //0x0008
593+
};
594+
595+
struct REField {
596+
uint64_t declaring_typeid : TYPE_INDEX_BITS;
597+
uint64_t impl_id : TYPE_INDEX_BITS;
598+
uint64_t field_typeid : TYPE_INDEX_BITS;
599+
uint64_t init_data_hi : 6;
600+
uint64_t rest2 : 1;
601+
};
602+
603+
struct REFieldImpl {
604+
uint16_t attributes_id;
605+
uint16_t unk : 1;
606+
uint16_t flags : 15;
607+
uint32_t offset : 26;
608+
uint32_t init_data_lo : 6;
609+
uint32_t name_offset : 28;
610+
uint32_t init_data_mid : 4;
611+
};
612+
613+
struct GenericListData {
614+
uint32_t definition_typeid : TYPE_INDEX_BITS;
615+
uint32_t num : (32 - TYPE_INDEX_BITS);
616+
uint32_t types[1];
617+
};
618+
}
619+
447620
namespace tdb74 {
448621
struct REMethodDefinition;
449622
struct REMethodImpl;
@@ -505,7 +678,6 @@ struct TDB {
505678
uint8_t (*bytePool)[256];
506679
int32_t (*internStrings)[14154];
507680
};
508-
509681
struct REModule {
510682
uint32_t guid[4];
511683
int32_t unk1;
@@ -1354,8 +1526,11 @@ struct TDB {
13541526
#pragma pack(pop)
13551527
}
13561528

1357-
// TODO?
1358-
struct REModule_ : public sdk::tdb74::REModule {};
1529+
#if TDB_VER == 81
1530+
struct REModule_: public sdk::tdb81::REModule {};
1531+
#else
1532+
struct REModule_: public sdk::tdb74::REModule {};
1533+
#endif
13591534

13601535
#if TDB_VER >= 84
13611536
struct RETypeDB_ : public sdk::tdb84::TDB {};
@@ -1371,6 +1546,19 @@ struct REParameterDef : public sdk::tdb84::REParameterDef {};
13711546
struct GenericListData : public sdk::tdb84::GenericListData {};
13721547
using ParamList = sdk::tdb84::ParamList;
13731548

1549+
#elif TDB_VER >= 81
1550+
struct RETypeDB_ : public sdk::tdb81::TDB {};
1551+
struct REMethodDefinition_ : public sdk::tdb81::REMethodDefinition {};
1552+
struct REMethodImpl : public sdk::tdb81::REMethodImpl {};
1553+
using REField_ = sdk::tdb81::REField;
1554+
struct REFieldImpl : public sdk::tdb81::REFieldImpl {};
1555+
struct RETypeImpl : public sdk::tdb81::RETypeImpl {};
1556+
struct REPropertyImpl : public sdk::tdb81::REPropertyImpl {};
1557+
struct REProperty : public sdk::tdb81::REProperty {};
1558+
struct REParameterDef : public sdk::tdb81::REParameterDef {};
1559+
struct GenericListData : public sdk::tdb81::GenericListData {};
1560+
using ParamList = sdk::tdb81::ParamList;
1561+
13741562
#elif TDB_VER >= 74
13751563
struct RETypeDB_ : public sdk::tdb74::TDB {};
13761564

shared/sdk/TDBVer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#elif defined(MHSTORIES3)
88
#define TDB_VER 82
99
#elif defined(MHWILDS)
10-
#define TDB_VER 74
10+
#define TDB_VER 81
1111
#elif defined(DD2)
1212
#define TDB_VER 73
1313
#elif defined(SF6)

0 commit comments

Comments
 (0)