Skip to content

Commit be82b73

Browse files
committed
Add missing bones
1 parent 1ea65c1 commit be82b73

File tree

2 files changed

+297
-11
lines changed

2 files changed

+297
-11
lines changed

Client/mods/deathmatch/logic/CClientIFP.cpp

Lines changed: 221 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,25 @@ void CClientIFP::InsertAnimationDummySequence(std::unique_ptr<CAnimBlendSequence
549549

550550
void CClientIFP::CopyDummyKeyFrameByBoneID(BYTE* pKeyFrames, DWORD dwBoneID)
551551
{
552+
/* FrameData structure:
553+
*
554+
struct KeyFrame
555+
{
556+
short quaternionX;
557+
short quaternionY;
558+
short quaternionZ;
559+
short quaternionW;
560+
short time;
561+
};
562+
563+
struct KeyFrameCompressed : KeyFrame
564+
{
565+
short translationX;
566+
short translationY;
567+
short translationZ;
568+
};
569+
*/
570+
552571
switch (dwBoneID)
553572
{
554573
case eBoneType::NORMAL: // Normal or Root, both are same
@@ -784,7 +803,8 @@ constexpr bool CClientIFP::IsKeyFramesTypeRoot(eFrameType iFrameType)
784803

785804
std::int32_t CClientIFP::GetBoneIDFromName(const SString& strBoneName)
786805
{
787-
if (strBoneName == "root")
806+
// Some cutscene animations have different names like Root suitcase-1, etc
807+
if (strBoneName == "root" || strBoneName.substr(0, 4) == "root")
788808
return eBoneType::NORMAL;
789809
if (strBoneName == "normal")
790810
return eBoneType::NORMAL;
@@ -860,6 +880,72 @@ std::int32_t CClientIFP::GetBoneIDFromName(const SString& strBoneName)
860880
if (strBoneName == "rtoe0")
861881
return eBoneType::R_TOE_0;
862882

883+
// Cutscene bones
884+
if (strBoneName == "rthumb1")
885+
return eBoneType::R_Thumb1;
886+
if (strBoneName == "rthumb2")
887+
return eBoneType::R_Thumb2;
888+
if (strBoneName == "lthumb1")
889+
return eBoneType::L_Thumb1;
890+
if (strBoneName == "lthumb2")
891+
return eBoneType::L_Thumb2;
892+
if (strBoneName == "llip11")
893+
return eBoneType::LLIP11;
894+
if (strBoneName == "jaw22")
895+
return eBoneType::JAW22;
896+
if (strBoneName == "headnub")
897+
return eBoneType::HEADNUB;
898+
if (strBoneName == "lfinger0nub")
899+
return eBoneType::L_Finger0Nub;
900+
if (strBoneName == "rfinger0nub")
901+
return eBoneType::R_Finger0Nub;
902+
if (strBoneName == "ltoe0nub")
903+
return eBoneType::L_Toe0Nub;
904+
if (strBoneName == "rtoe0nub")
905+
return eBoneType::R_Toe0Nub;
906+
if (strBoneName == "rbrow1")
907+
return eBoneType::R_BROW1;
908+
if (strBoneName == "rbrow2")
909+
return eBoneType::R_BROW2;
910+
if (strBoneName == "lbrow1")
911+
return eBoneType::L_BROW1;
912+
if (strBoneName == "lbrow2")
913+
return eBoneType::L_BROW2;
914+
if (strBoneName == "rlid")
915+
return eBoneType::R_LID;
916+
if (strBoneName == "llid")
917+
return eBoneType::L_LID;
918+
if (strBoneName == "rtlip3")
919+
return eBoneType::R_TLIP3;
920+
if (strBoneName == "ltlip3")
921+
return eBoneType::L_TLIP3;
922+
if (strBoneName == "rtlip1")
923+
return eBoneType::R_TLIP1;
924+
if (strBoneName == "rtlip2")
925+
return eBoneType::R_TLIP2;
926+
if (strBoneName == "ltlip1")
927+
return eBoneType::L_TLIP1;
928+
if (strBoneName == "ltlip2")
929+
return eBoneType::L_TLIP2;
930+
if (strBoneName == "rcorner")
931+
return eBoneType::R_CORNER;
932+
if (strBoneName == "lcorner")
933+
return eBoneType::L_CORNER;
934+
if (strBoneName == "jaw1")
935+
return eBoneType::JAW1;
936+
if (strBoneName == "jaw2")
937+
return eBoneType::JAW2;
938+
if (strBoneName == "llip1")
939+
return eBoneType::LLIP1;
940+
if (strBoneName == "reye")
941+
return eBoneType::R_EYE;
942+
if (strBoneName == "leye")
943+
return eBoneType::L_EYE;
944+
if (strBoneName == "rcheek")
945+
return eBoneType::R_CHEEK;
946+
if (strBoneName == "lcheek")
947+
return eBoneType::L_CHEEK;
948+
863949
// for GTA 3
864950
if (strBoneName == "player")
865951
return eBoneType::NORMAL;
@@ -976,12 +1062,79 @@ SString CClientIFP::GetCorrectBoneNameFromID(const std::int32_t& iBoneID)
9761062
if (iBoneID == eBoneType::R_TOE_0)
9771063
return "R Toe0";
9781064

1065+
// Cutscene bones
1066+
if (iBoneID == eBoneType::R_Thumb1)
1067+
return "RThumb1";
1068+
if (iBoneID == eBoneType::R_Thumb2)
1069+
return "RThumb2";
1070+
if (iBoneID == eBoneType::LLIP11)
1071+
return "llip11";
1072+
if (iBoneID == eBoneType::L_Thumb1)
1073+
return "LThumb1";
1074+
if (iBoneID == eBoneType::L_Thumb2)
1075+
return "LThumb2";
1076+
if (iBoneID == eBoneType::JAW22)
1077+
return "jaw22";
1078+
if (iBoneID == eBoneType::HEADNUB)
1079+
return "HeadNub";
1080+
if (iBoneID == eBoneType::L_Finger0Nub)
1081+
return "L Finger0Nub";
1082+
if (iBoneID == eBoneType::R_Finger0Nub)
1083+
return "R Finger0Nub";
1084+
if (iBoneID == eBoneType::L_Toe0Nub)
1085+
return "L Toe0Nub";
1086+
if (iBoneID == eBoneType::R_Toe0Nub)
1087+
return "R Toe0Nub";
1088+
if (iBoneID == eBoneType::R_BROW1)
1089+
return "rbrow1";
1090+
if (iBoneID == eBoneType::R_BROW2)
1091+
return "rbrow2";
1092+
if (iBoneID == eBoneType::L_BROW2)
1093+
return "lbrow2";
1094+
if (iBoneID == eBoneType::L_BROW1)
1095+
return "lbrow1";
1096+
if (iBoneID == eBoneType::R_LID)
1097+
return "rlid";
1098+
if (iBoneID == eBoneType::L_LID)
1099+
return "llid";
1100+
if (iBoneID == eBoneType::R_TLIP3)
1101+
return "rtlip3";
1102+
if (iBoneID == eBoneType::L_TLIP3)
1103+
return "ltlip3";
1104+
if (iBoneID == eBoneType::R_TLIP1)
1105+
return "rtlip1";
1106+
if (iBoneID == eBoneType::R_TLIP2)
1107+
return "rtlip2";
1108+
if (iBoneID == eBoneType::L_TLIP1)
1109+
return "ltlip1";
1110+
if (iBoneID == eBoneType::L_TLIP2)
1111+
return "ltlip2";
1112+
if (iBoneID == eBoneType::R_CORNER)
1113+
return "rcorner";
1114+
if (iBoneID == eBoneType::L_CORNER)
1115+
return "lcorner";
1116+
if (iBoneID == eBoneType::JAW1)
1117+
return "jaw1";
1118+
if (iBoneID == eBoneType::JAW2)
1119+
return "jaw2";
1120+
if (iBoneID == eBoneType::LLIP1)
1121+
return "llip1";
1122+
if (iBoneID == eBoneType::R_EYE)
1123+
return "reye";
1124+
if (iBoneID == eBoneType::L_EYE)
1125+
return "leye";
1126+
if (iBoneID == eBoneType::R_CHEEK)
1127+
return "rcheek";
1128+
if (iBoneID == eBoneType::L_CHEEK)
1129+
return "lcheek";
1130+
9791131
return "";
9801132
}
9811133

9821134
SString CClientIFP::GetCorrectBoneNameFromName(const SString& strBoneName)
9831135
{
984-
if (strBoneName == "root")
1136+
// Some cutscene animations have different names like Root suitcase-1, etc
1137+
if (strBoneName == "root" || strBoneName.substr(0, 4) == "root")
9851138
return "Normal";
9861139
if (strBoneName == "normal")
9871140
return "Normal";
@@ -1057,6 +1210,72 @@ SString CClientIFP::GetCorrectBoneNameFromName(const SString& strBoneName)
10571210
if (strBoneName == "rtoe0")
10581211
return "R Toe0";
10591212

1213+
// Cutscene bones
1214+
if (strBoneName == "rthumb1")
1215+
return "RThumb1";
1216+
if (strBoneName == "rthumb2")
1217+
return "RThumb2";
1218+
if (strBoneName == "llip11")
1219+
return "llip11";
1220+
if (strBoneName == "lthumb1")
1221+
return "LThumb1";
1222+
if (strBoneName == "lthumb2")
1223+
return "LThumb2";
1224+
if (strBoneName == "jaw22")
1225+
return "jaw22";
1226+
if (strBoneName == "headnub")
1227+
return "HeadNub";
1228+
if (strBoneName == "lfinger0nub")
1229+
return "L Finger0Nub";
1230+
if (strBoneName == "rfinger0nub")
1231+
return "R Finger0Nub";
1232+
if (strBoneName == "ltoe0nub")
1233+
return "L Toe0Nub";
1234+
if (strBoneName == "rtoe0nub")
1235+
return "R Toe0Nub";
1236+
if (strBoneName == "rbrow1")
1237+
return "rbrow1";
1238+
if (strBoneName == "rbrow2")
1239+
return "rbrow2";
1240+
if (strBoneName == "lbrow1")
1241+
return "lbrow1";
1242+
if (strBoneName == "lbrow2")
1243+
return "lbrow2";
1244+
if (strBoneName == "rlid")
1245+
return "rlid";
1246+
if (strBoneName == "llid")
1247+
return "llid";
1248+
if (strBoneName == "rtlip3")
1249+
return "rtlip3";
1250+
if (strBoneName == "ltlip3")
1251+
return "ltlip3";
1252+
if (strBoneName == "rtlip1")
1253+
return "rtlip1";
1254+
if (strBoneName == "rtlip2")
1255+
return "rtlip2";
1256+
if (strBoneName == "ltlip1")
1257+
return "ltlip1";
1258+
if (strBoneName == "ltlip2")
1259+
return "ltlip2";
1260+
if (strBoneName == "rcorner")
1261+
return "rcorner";
1262+
if (strBoneName == "lcorner")
1263+
return "lcorner";
1264+
if (strBoneName == "jaw1")
1265+
return "jaw1";
1266+
if (strBoneName == "jaw2")
1267+
return "jaw2";
1268+
if (strBoneName == "llip1")
1269+
return "llip1";
1270+
if (strBoneName == "reye")
1271+
return "reye";
1272+
if (strBoneName == "leye")
1273+
return "leye";
1274+
if (strBoneName == "rcheek")
1275+
return "rcheek";
1276+
if (strBoneName == "lcheek")
1277+
return "lcheek";
1278+
10601279
// For GTA 3
10611280
if (strBoneName == "player")
10621281
return "Normal";

Client/mods/deathmatch/logic/CClientIFP.h

Lines changed: 76 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,44 @@ class CClientIFP final : public CClientEntity, CFileReader
196196
R_THIGH = 51,
197197
R_CALF = 52,
198198
R_FOOT = 53,
199-
R_TOE_0 = 54
199+
R_TOE_0 = 54,
200+
201+
// Cutscene bones
202+
R_Thumb1 = 28,
203+
R_Thumb2 = 29,
204+
LLIP11 = 30,
205+
L_Thumb1 = 38,
206+
L_Thumb2 = 39,
207+
208+
JAW22 = 40,
209+
210+
HEADNUB = 303,
211+
L_Finger0Nub = 304,
212+
R_Finger0Nub = 305,
213+
L_Toe0Nub = 306,
214+
R_Toe0Nub = 307,
215+
216+
R_BROW1 = 5001,
217+
R_BROW2 = 5002,
218+
L_BROW2 = 5003,
219+
L_BROW1 = 5004,
220+
R_LID = 5005,
221+
L_LID = 5006,
222+
R_TLIP3 = 5007,
223+
L_TLIP3 = 5008,
224+
R_TLIP1 = 5009,
225+
R_TLIP2 = 5010,
226+
L_TLIP1 = 5011,
227+
L_TLIP2 = 5012,
228+
R_CORNER = 5013,
229+
L_CORNER = 5014,
230+
JAW1 = 5015,
231+
JAW2 = 5016,
232+
LLIP1 = 5017,
233+
R_EYE = 5018,
234+
L_EYE = 5019,
235+
R_CHEEK = 5020,
236+
L_CHEEK = 5021,
200237
};
201238

202239
CClientIFP(class CClientManager* pManager, ElementID ID);
@@ -279,16 +316,46 @@ class CClientIFP final : public CClientEntity, CFileReader
279316
bool m_bUnloading;
280317
CAnimManager* m_pAnimManager;
281318

282-
// 32 because there are 32 bones in a ped model
283-
const unsigned short m_kcIFPSequences = 32;
319+
// 64 because there are 32 bones in a ped model + 32 possibly cutscene bones
320+
const unsigned short m_kcIFPSequences = 64;
284321
// We'll keep all key frames compressed by default. GTA:SA will decompress
285322
// them, when it's going to play the animation. We don't need to worry about it.
286323
const bool m_kbAllKeyFramesCompressed = true;
287324

288-
const DWORD m_karruBoneIds[32] = {0, 1, 2, 3, 4, 5, 8, 6, 7, 31, 32, 33, 34, 35, 36, 21, 22, 23, 24, 25, 26, 302, 301, 201, 41, 42, 43, 44, 51, 52, 53, 54};
289-
const char m_karrstrBoneNames[32][24] = {
290-
"Normal", "Pelvis", "Spine", "Spine1", "Neck", "Head", "Jaw", "L Brow",
291-
"R Brow", "Bip01 L Clavicle", "L UpperArm", "L ForeArm", "L Hand", "L Finger", "L Finger01", "Bip01 R Clavicle",
292-
"R UpperArm", "R ForeArm", "R Hand", "R Finger", "R Finger01", "L breast", "R breast", "Belly",
293-
"L Thigh", "L Calf", "L Foot", "L Toe0", "R Thigh", "R Calf", "R Foot", "R Toe0"};
325+
const DWORD m_karruBoneIds[64] = {0, 1, 2, 3, 4, 5, 8, 6, 7, 31, 32, 33, 34, 35, 36, 21,
326+
22, 23, 24, 25, 26, 302, 301, 201, 41, 42, 43, 44, 51, 52, 53, 54,
327+
28, 29, 30, 38, 39, 40, 303, 304, 305, 306, 307, 5001, 5002, 5003, 5004, 5005,
328+
5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5020, 5021};
329+
const char m_karrstrBoneNames[64][24] = {"Normal", "Pelvis",
330+
"Spine", "Spine1",
331+
"Neck", "Head",
332+
"Jaw", "L Brow",
333+
"R Brow", "Bip01 L Clavicle",
334+
"L UpperArm", "L ForeArm",
335+
"L Hand", "L Finger",
336+
"L Finger01", "Bip01 R Clavicle",
337+
"R UpperArm", "R ForeArm",
338+
"R Hand", "R Finger",
339+
"R Finger01", "L breast",
340+
"R breast", "Belly",
341+
"L Thigh", "L Calf",
342+
"L Foot", "L Toe0",
343+
"R Thigh", "R Calf",
344+
"R Foot", "R Toe0",
345+
"RThumb1", "RThumb2",
346+
"llip11", "LThumb1",
347+
"LThumb2", "jaw22",
348+
"HeadNub", "L Finger0Nub",
349+
"R Finger0Nub", "L Toe0Nub",
350+
"R Toe0Nub", "rbrow1",
351+
"rbrow2", "lbrow2",
352+
"lbrow1", "rlid",
353+
"llid", "rtlip3",
354+
"ltlip3", "rtlip1",
355+
"rtlip2", "ltlip1",
356+
"ltlip2", "rcorner",
357+
"lcorner", "jaw1",
358+
"jaw2", "llip1",
359+
"reye", "leye",
360+
"rcheek", "lcheek"};
294361
};

0 commit comments

Comments
 (0)