feat: T4 weapon loading and dumping (#869)

* feat: T4 weapon loading and dumping

* chore: adjust naming of weapon enum values

* chore: fix typo in type names

* chore: rename t4 weapon loader files

* feat: dump and load gdt weapons for t4

* chore: weapon loaders to use similar logic

---------

Co-authored-by: Jan Laupetin <[email protected]>
This commit is contained in:
mo
2026-07-02 07:10:24 +02:00
committed by GitHub
co-authored by Jan Laupetin
parent ee63355fd2
commit fb4b00398c
32 changed files with 2536 additions and 46 deletions
+2 -2
View File
@@ -2855,7 +2855,7 @@ namespace IW3
WEAPOVERLAYRETICLE_NUM,
};
enum WeapOverlayInteface_t
enum WeapOverlayInterface_t
{
WEAPOVERLAYINTERFACE_NONE = 0x0,
WEAPOVERLAYINTERFACE_JAVELIN = 0x1,
@@ -3150,7 +3150,7 @@ namespace IW3
Material* overlayMaterial;
Material* overlayMaterialLowRes;
weapOverlayReticle_t overlayReticle;
WeapOverlayInteface_t overlayInterface;
WeapOverlayInterface_t overlayInterface;
float overlayWidth;
float overlayHeight;
float fAdsBobFactor;
+2
View File
@@ -52,6 +52,8 @@ namespace
"vertexdecl",
"vertexshader",
"pixelshader",
"accuracygraph",
"flametable",
};
static_assert(std::extent_v<decltype(SUB_ASSET_TYPE_NAMES)> == SUB_ASSET_TYPE_COUNT);
} // namespace
+67
View File
@@ -60,6 +60,8 @@ namespace T4
SUB_ASSET_TYPE_VERTEX_DECL,
SUB_ASSET_TYPE_VERTEX_SHADER,
SUB_ASSET_TYPE_PIXEL_SHADER,
SUB_ASSET_TYPE_ACCURACY_GRAPH,
SUB_ASSET_TYPE_FLAME_TABLE,
SUB_ASSET_TYPE_COUNT
};
@@ -83,6 +85,69 @@ namespace T4
XAsset* assets;
};
struct cspField_t
{
const char* szName;
int iOffset;
int iFieldType;
};
enum csParseFieldType_t
{
CSPFT_STRING,
CSPFT_STRING_MAX_STRING_CHARS,
CSPFT_STRING_MAX_QPATH,
CSPFT_STRING_MAX_OSPATH,
CSPFT_INT,
CSPFT_BOOL,
CSPFT_FLOAT,
CSPFT_MILLISECONDS,
CSPFT_FX,
CSPFT_XMODEL,
CSPFT_MATERIAL,
CSPFT_SOUND,
CSPFT_NUM_BASE_FIELD_TYPES
};
enum weapFieldType_t
{
WFT_WEAPONTYPE = CSPFT_NUM_BASE_FIELD_TYPES,
WFT_WEAPONCLASS,
WFT_OVERLAYRETICLE,
WFT_PENETRATE_TYPE,
WFT_IMPACT_TYPE,
WFT_STANCE,
WFT_PROJ_EXPLOSION,
WFT_OFFHAND_CLASS,
WFT_ANIMTYPE,
WFT_ACTIVE_RETICLE_TYPE,
WFT_GUIDED_MISSILE_TYPE,
WFT_BOUNCE_SOUND,
WFT_STICKINESS,
WFT_OVERLAYINTERFACE,
WFT_INVENTORYTYPE,
WFT_FIRETYPE,
WFT_CLIPTYPE,
WFT_AMMOCOUNTER_CLIPTYPE,
WFT_ICONRATIO_HUD,
WFT_ICONRATIO_AMMOCOUNTER,
WFT_ICONRATIO_KILL,
WFT_ICONRATIO_DPAD,
WFT_HIDETAGS,
WFT_NOTETRACKSOUNDMAP,
WFT_ANIM_NAME,
WFT_NUM_FIELD_TYPES,
};
struct AccuracyGraph
{
vec2_t* graphKnots;
int graphKnotCount;
};
using AssetPhysPreset = Asset<ASSET_TYPE_PHYSPRESET, PhysPreset>;
using AssetPhysConstraints = Asset<ASSET_TYPE_PHYSCONSTRAINTS, PhysConstraints>;
using AssetDestructibleDef = Asset<ASSET_TYPE_DESTRUCTIBLEDEF, DestructibleDef>;
@@ -117,6 +182,8 @@ namespace T4
using SubAssetVertexDecl = SubAsset<SUB_ASSET_TYPE_VERTEX_DECL, MaterialVertexDeclaration>;
using SubAssetVertexShader = SubAsset<SUB_ASSET_TYPE_VERTEX_SHADER, MaterialVertexShader>;
using SubAssetPixelShader = SubAsset<SUB_ASSET_TYPE_PIXEL_SHADER, MaterialPixelShader>;
using SubAssetAccuracyGraph = SubAsset<SUB_ASSET_TYPE_ACCURACY_GRAPH, AccuracyGraph>;
using SubAssetFlameTable = SubAsset<SUB_ASSET_TYPE_FLAME_TABLE, FlameTable>;
} // namespace T4
DEFINE_ASSET_NAME_ACCESSOR(T4::AssetPhysPreset, name);
+91 -22
View File
@@ -1013,6 +1013,8 @@ namespace T4
SURF_TYPE_CUSHION,
SURF_TYPE_FRUIT,
SURF_TYPE_PAINTED_METAL,
SURF_TYPE_PLAYER,
SURF_TYPE_TALL_GRASS,
SURF_TYPE_NUM
};
@@ -2999,7 +3001,11 @@ namespace T4
WEAPTYPE_GRENADE = 0x1,
WEAPTYPE_PROJECTILE = 0x2,
WEAPTYPE_BINOCULARS = 0x3,
WEAPTYPE_NUM = 0x4,
WEAPTYPE_GAS = 0x4,
WEAPTYPE_BOMB = 0x5,
WEAPTYPE_MINE = 0x6,
WEAPTYPE_NUM,
};
enum weapClass_t
@@ -3013,8 +3019,10 @@ namespace T4
WEAPCLASS_ROCKETLAUNCHER = 0x6,
WEAPCLASS_TURRET = 0x7,
WEAPCLASS_NON_PLAYER = 0x8,
WEAPCLASS_ITEM = 0x9,
WEAPCLASS_NUM = 0xA,
WEAPCLASS_GAS = 0x9,
WEAPCLASS_ITEM = 0xA,
WEAPCLASS_NUM,
};
enum PenetrateType
@@ -3023,7 +3031,8 @@ namespace T4
PENETRATE_TYPE_SMALL = 0x1,
PENETRATE_TYPE_MEDIUM = 0x2,
PENETRATE_TYPE_LARGE = 0x3,
PENETRATE_TYPE_COUNT = 0x4,
PENETRATE_TYPE_NUM,
};
enum ImpactType
@@ -3035,9 +3044,13 @@ namespace T4
IMPACT_TYPE_SHOTGUN = 0x4,
IMPACT_TYPE_GRENADE_BOUNCE = 0x5,
IMPACT_TYPE_GRENADE_EXPLODE = 0x6,
IMPACT_TYPE_ROCKET_EXPLODE = 0x7,
IMPACT_TYPE_PROJECTILE_DUD = 0x8,
IMPACT_TYPE_COUNT = 0x9,
IMPACT_TYPE_RIFLE_GRENADE = 0x7,
IMPACT_TYPE_ROCKET_EXPLODE = 0x8,
IMPACT_TYPE_PROJECTILE_DUD = 0x9,
IMPACT_TYPE_MORTAR_SHELL = 0xA,
IMPACT_TYPE_TANK_SHELL = 0xB,
IMPACT_TYPE_NUM,
};
enum weapInventoryType_t
@@ -3046,7 +3059,8 @@ namespace T4
WEAPINVENTORY_OFFHAND = 0x1,
WEAPINVENTORY_ITEM = 0x2,
WEAPINVENTORY_ALTMODE = 0x3,
WEAPINVENTORYCOUNT = 0x4,
WEAPINVENTORY_NUM,
};
enum weapFireType_t
@@ -3056,7 +3070,8 @@ namespace T4
WEAPON_FIRETYPE_BURSTFIRE2 = 0x2,
WEAPON_FIRETYPE_BURSTFIRE3 = 0x3,
WEAPON_FIRETYPE_BURSTFIRE4 = 0x4,
WEAPON_FIRETYPECOUNT = 0x5,
WEAPON_FIRETYPE_NUM,
};
enum OffhandClass
@@ -3065,7 +3080,8 @@ namespace T4
OFFHAND_CLASS_FRAG_GRENADE = 0x1,
OFFHAND_CLASS_SMOKE_GRENADE = 0x2,
OFFHAND_CLASS_FLASH_GRENADE = 0x3,
OFFHAND_CLASS_COUNT = 0x4,
OFFHAND_CLASS_NUM,
};
enum weapStance_t
@@ -3073,7 +3089,8 @@ namespace T4
WEAPSTANCE_STAND = 0x0,
WEAPSTANCE_DUCK = 0x1,
WEAPSTANCE_PRONE = 0x2,
WEAPSTANCE_NUM = 0x3,
WEAPSTANCE_NUM,
};
enum activeReticleType_t
@@ -3081,7 +3098,8 @@ namespace T4
VEH_ACTIVE_RETICLE_NONE = 0x0,
VEH_ACTIVE_RETICLE_PIP_ON_A_STICK = 0x1,
VEH_ACTIVE_RETICLE_BOUNCING_DIAMOND = 0x2,
VEH_ACTIVE_RETICLE_COUNT = 0x3,
VEH_ACTIVE_RETICLE_NUM,
};
enum weaponIconRatioType_t
@@ -3089,7 +3107,8 @@ namespace T4
WEAPON_ICON_RATIO_1TO1 = 0x0,
WEAPON_ICON_RATIO_2TO1 = 0x1,
WEAPON_ICON_RATIO_4TO1 = 0x2,
WEAPON_ICON_RATIO_COUNT = 0x3,
WEAPON_ICON_RATIO_NUM,
};
enum weapClipType_t
@@ -3100,7 +3119,8 @@ namespace T4
WEAPON_CLIPTYPE_DP28 = 0x3,
WEAPON_CLIPTYPE_PTRS = 0x4,
WEAPON_CLIPTYPE_LMG = 0x5,
WEAPON_CLIPTYPECOUNT = 0x6,
WEAPON_CLIPTYPE_NUM,
};
enum ammoCounterClipType_t
@@ -3112,22 +3132,25 @@ namespace T4
AMMO_COUNTER_CLIP_ROCKET = 0x4,
AMMO_COUNTER_CLIP_BELTFED = 0x5,
AMMO_COUNTER_CLIP_ALTWEAPON = 0x6,
AMMO_COUNTER_CLIP_COUNT = 0x7,
AMMO_COUNTER_CLIP_NUM,
};
enum weapOverlayReticle_t
{
WEAPOVERLAYRETICLE_NONE = 0x0,
WEAPOVERLAYRETICLE_CROSSHAIR = 0x1,
WEAPOVERLAYRETICLE_NUM = 0x2,
WEAPOVERLAYRETICLE_NUM,
};
enum WeapOverlayInteface_t
enum WeapOverlayInterface_t
{
WEAPOVERLAYINTERFACE_NONE = 0x0,
WEAPOVERLAYINTERFACE_JAVELIN = 0x1,
WEAPOVERLAYINTERFACE_TURRETSCOPE = 0x2,
WEAPOVERLAYINTERFACECOUNT = 0x3,
WEAPOVERLAYINTERFACE_NUM,
};
enum weapProjExposion_t
@@ -3139,7 +3162,10 @@ namespace T4
WEAPPROJEXP_DUD = 0x4,
WEAPPROJEXP_SMOKE = 0x5,
WEAPPROJEXP_HEAVY = 0x6,
WEAPPROJEXP_NUM = 0x7,
WEAPPROJEXP_FIRE = 0x7,
WEAPPROJEXP_NAPALMBLOB = 0x8,
WEAPPROJEXP_NUM,
};
enum WeapStickinessType
@@ -3148,7 +3174,8 @@ namespace T4
WEAPSTICKINESS_ALL = 0x1,
WEAPSTICKINESS_GROUND = 0x2,
WEAPSTICKINESS_GROUND_WITH_YAW = 0x3,
WEAPSTICKINESS_COUNT = 0x4,
WEAPSTICKINESS_NUM,
};
enum guidedMissileType_t
@@ -3158,7 +3185,49 @@ namespace T4
MISSILE_GUIDANCE_HELLFIRE = 0x2,
MISSILE_GUIDANCE_JAVELIN = 0x3,
MISSILE_GUIDANCE_BALLISTIC = 0x4,
MISSILE_GUIDANCE_COUNT = 0x5,
MISSILE_GUIDANCE_NUM,
};
enum WeaponAnimSlot
{
WEAP_ANIM_ROOT = 0x0,
WEAP_ANIM_IDLE = 0x1,
WEAP_ANIM_EMPTY_IDLE = 0x2,
WEAP_ANIM_FIRE = 0x3,
WEAP_ANIM_HOLD_FIRE = 0x4,
WEAP_ANIM_LASTSHOT = 0x5,
WEAP_ANIM_RECHAMBER = 0x6,
WEAP_ANIM_MELEE = 0x7,
WEAP_ANIM_MELEE_CHARGE = 0x8,
WEAP_ANIM_RELOAD = 0x9,
WEAP_ANIM_RELOAD_EMPTY = 0xA,
WEAP_ANIM_RELOAD_START = 0xB,
WEAP_ANIM_RELOAD_END = 0xC,
WEAP_ANIM_RAISE = 0xD,
WEAP_ANIM_FIRST_RAISE = 0xE,
WEAP_ANIM_DROP = 0xF,
WEAP_ANIM_ALT_RAISE = 0x10,
WEAP_ANIM_ALT_DROP = 0x11,
WEAP_ANIM_QUICK_RAISE = 0x12,
WEAP_ANIM_QUICK_DROP = 0x13,
WEAP_ANIM_EMPTY_RAISE = 0x14,
WEAP_ANIM_EMPTY_DROP = 0x15,
WEAP_ANIM_SPRINT_IN = 0x16,
WEAP_ANIM_SPRINT_LOOP = 0x17,
WEAP_ANIM_SPRINT_OUT = 0x18,
WEAP_ANIM_DEPLOY = 0x19,
WEAP_ANIM_BREAKDOWN = 0x1A,
WEAP_ANIM_DETONATE = 0x1B,
WEAP_ANIM_NIGHTVISION_WEAR = 0x1C,
WEAP_ANIM_NIGHTVISION_REMOVE = 0x1D,
WEAP_ANIM_ADS_FIRE = 0x1E,
WEAP_ANIM_ADS_LASTSHOT = 0x1F,
WEAP_ANIM_ADS_RECHAMBER = 0x20,
WEAP_ANIM_ADS_UP = 0x21,
WEAP_ANIM_ADS_DOWN = 0x22,
NUM_WEAP_ANIMS,
};
enum hitLocation_t
@@ -3586,7 +3655,7 @@ namespace T4
Material* overlayMaterial;
Material* overlayMaterialLowRes;
weapOverlayReticle_t overlayReticle;
WeapOverlayInteface_t overlayInterface;
WeapOverlayInterface_t overlayInterface;
float overlayWidth;
float overlayHeight;
float fAdsBobFactor;
+2 -2
View File
@@ -4295,7 +4295,7 @@ namespace T6
AMMO_COUNTER_CLIP_COUNT = 0x7,
};
enum WeapOverlayInteface_t
enum WeapOverlayInterface_t
{
WEAPOVERLAYINTERFACE_NONE = 0x0,
WEAPOVERLAYINTERFACE_JAVELIN = 0x1,
@@ -4671,7 +4671,7 @@ namespace T6
float adsMoveSpeedScale;
float sprintDurationScale;
weapOverlayReticle_t overlayReticle;
WeapOverlayInteface_t overlayInterface;
WeapOverlayInterface_t overlayInterface;
float overlayWidth;
float overlayHeight;
float fAdsBobFactor;