From abab63c1db050949c8b925839816a47ce6da5320 Mon Sep 17 00:00:00 2001 From: solareon <769465+solareon@users.noreply.github.com> Date: Sun, 23 Jun 2024 16:30:20 +0200 Subject: [PATCH] refactor(client): release anims --- client/clothing.lua | 1905 +++++++++++++++++++++---------------------- client/trunk.lua | 6 +- 2 files changed, 954 insertions(+), 957 deletions(-) diff --git a/client/clothing.lua b/client/clothing.lua index 0c9582d..7ae7481 100644 --- a/client/clothing.lua +++ b/client/clothing.lua @@ -1,953 +1,952 @@ -local config = require 'config.client' -local variations = { - jackets = {male = {}, female = {}}, - hair = {male = {}, female = {}}, - bags = {male = {}, female = {}}, - visor = {male = {}, female = {}}, - gloves = { - male = { - [16] = 4, - [17] = 4, - [18] = 4, - [19] = 0, - [20] = 1, - [21] = 2, - [22] = 4, - [23] = 5, - [24] = 6, - [25] = 8, - [26] = 11, - [27] = 12, - [28] = 14, - [29] = 15, - [30] = 0, - [31] = 1, - [32] = 2, - [33] = 4, - [34] = 5, - [35] = 6, - [36] = 8, - [37] = 11, - [38] = 12, - [39] = 14, - [40] = 15, - [41] = 0, - [42] = 1, - [43] = 2, - [44] = 4, - [45] = 5, - [46] = 6, - [47] = 8, - [48] = 11, - [49] = 12, - [50] = 14, - [51] = 15, - [52] = 0, - [53] = 1, - [54] = 2, - [55] = 4, - [56] = 5, - [57] = 6, - [58] = 8, - [59] = 11, - [60] = 12, - [61] = 14, - [62] = 15, - [63] = 0, - [64] = 1, - [65] = 2, - [66] = 4, - [67] = 5, - [68] = 6, - [69] = 8, - [70] = 11, - [71] = 12, - [72] = 14, - [73] = 15, - [74] = 0, - [75] = 1, - [76] = 2, - [77] = 4, - [78] = 5, - [79] = 6, - [80] = 8, - [81] = 11, - [82] = 12, - [83] = 14, - [84] = 15, - [85] = 0, - [86] = 1, - [87] = 2, - [88] = 4, - [89] = 5, - [90] = 6, - [91] = 8, - [92] = 11, - [93] = 12, - [94] = 14, - [95] = 15, - [96] = 4, - [97] = 4, - [98] = 4, - [99] = 0, - [100] = 1, - [101] = 2, - [102] = 4, - [103] = 5, - [104] = 6, - [105] = 8, - [106] = 11, - [107] = 12, - [108] = 14, - [109] = 15, - [110] = 4, - [111] = 4, - [115] = 112, - [116] = 112, - [117] = 112, - [118] = 112, - [119] = 112, - [120] = 112, - [121] = 112, - [122] = 113, - [123] = 113, - [124] = 113, - [125] = 113, - [126] = 113, - [127] = 113, - [128] = 113, - [129] = 114, - [130] = 114, - [131] = 114, - [132] = 114, - [133] = 114, - [134] = 114, - [135] = 114, - [136] = 15, - [137] = 15, - [138] = 0, - [139] = 1, - [140] = 2, - [141] = 4, - [142] = 5, - [143] = 6, - [144] = 8, - [145] = 11, - [146] = 12, - [147] = 14, - [148] = 112, - [149] = 113, - [150] = 114, - [151] = 0, - [152] = 1, - [153] = 2, - [154] = 4, - [155] = 5, - [156] = 6, - [157] = 8, - [158] = 11, - [159] = 12, - [160] = 14, - [161] = 112, - [162] = 113, - [163] = 114, - [165] = 4, - [166] = 4, - [167] = 4, - [168] = 4, - [170] = 15, - [171] = 0, - [172] = 1, - [173] = 2, - [174] = 4, - [175] = 5, - [176] = 6, - [177] = 8, - [178] = 11, - [179] = 12, - [180] = 14, - [181] = 112, - [182] = 113, - [183] = 114, - [185] = 184, - [186] = 184, - [187] = 184, - [188] = 184, - [189] = 185, - [190] = 184, - [191] = 184, - [192] = 184, - [193] = 184, - [194] = 184, - }, - female = { - [16] = 11, - [17] = 3, - [18] = 3, - [19] = 3, - [20] = 0, - [21] = 1, - [22] = 2, - [23] = 3, - [24] = 4, - [25] = 5, - [26] = 6, - [27] = 7, - [28] = 9, - [29] = 11, - [30] = 12, - [31] = 14, - [32] = 15, - [33] = 0, - [34] = 1, - [35] = 2, - [36] = 3, - [37] = 4, - [38] = 5, - [39] = 6, - [40] = 7, - [41] = 9, - [42] = 11, - [43] = 12, - [44] = 14, - [45] = 15, - [46] = 0, - [47] = 1, - [48] = 2, - [49] = 3, - [50] = 4, - [51] = 5, - [52] = 6, - [53] = 7, - [54] = 9, - [55] = 11, - [56] = 12, - [57] = 14, - [58] = 15, - [59] = 0, - [60] = 1, - [61] = 2, - [62] = 3, - [63] = 4, - [64] = 5, - [65] = 6, - [66] = 7, - [67] = 9, - [68] = 11, - [69] = 12, - [70] = 14, - [71] = 15, - [72] = 0, - [73] = 1, - [74] = 2, - [75] = 3, - [76] = 4, - [77] = 5, - [78] = 6, - [79] = 7, - [80] = 9, - [81] = 11, - [82] = 12, - [83] = 14, - [84] = 15, - [85] = 0, - [86] = 1, - [87] = 2, - [88] = 3, - [89] = 4, - [90] = 5, - [91] = 6, - [92] = 7, - [93] = 9, - [94] = 11, - [95] = 12, - [96] = 14, - [97] = 15, - [98] = 0, - [99] = 1, - [100] = 2, - [101] = 3, - [102] = 4, - [103] = 5, - [104] = 6, - [105] = 7, - [106] = 9, - [107] = 11, - [108] = 12, - [109] = 14, - [110] = 15, - [111] = 3, - [112] = 3, - [113] = 3, - [114] = 0, - [115] = 1, - [116] = 2, - [117] = 3, - [118] = 4, - [119] = 5, - [120] = 6, - [121] = 7, - [122] = 9, - [123] = 11, - [124] = 12, - [125] = 14, - [126] = 15, - [127] = 3, - [128] = 3, - [132] = 129, - [133] = 129, - [134] = 129, - [135] = 129, - [136] = 129, - [137] = 129, - [138] = 129, - [139] = 130, - [140] = 130, - [141] = 130, - [142] = 130, - [143] = 130, - [144] = 130, - [145] = 130, - [146] = 131, - [147] = 131, - [148] = 131, - [149] = 131, - [150] = 131, - [151] = 131, - [152] = 131, - [154] = 153, - [155] = 153, - [156] = 153, - [157] = 153, - [158] = 153, - [159] = 153, - [160] = 153, - [162] = 161, - [163] = 161, - [164] = 161, - [165] = 161, - [166] = 161, - [167] = 161, - [168] = 161, - [169] = 15, - [170] = 15, - [171] = 0, - [172] = 1, - [173] = 2, - [174] = 3, - [175] = 4, - [176] = 5, - [177] = 6, - [178] = 7, - [179] = 9, - [180] = 11, - [181] = 12, - [182] = 14, - [183] = 129, - [184] = 130, - [185] = 131, - [186] = 153, - [187] = 0, - [188] = 1, - [189] = 2, - [190] = 3, - [191] = 4, - [192] = 5, - [193] = 6, - [194] = 7, - [195] = 9, - [196] = 11, - [197] = 12, - [198] = 14, - [199] = 129, - [200] = 130, - [201] = 131, - [202] = 153, - [203] = 161, - [204] = 161, - [206] = 3, - [207] = 3, - [208] = 3, - [209] = 3, - [211] = 15, - [212] = 0, - [213] = 1, - [214] = 2, - [215] = 3, - [216] = 4, - [217] = 5, - [218] = 6, - [219] = 7, - [220] = 9, - [221] = 11, - [222] = 12, - [223] = 14, - [224] = 129, - [225] = 130, - [226] = 131, - [227] = 153, - [228] = 161, - [230] = 229, - [231] = 229, - [232] = 229, - [233] = 229, - [234] = 229, - [235] = 229, - [236] = 229, - [237] = 229, - [238] = 229, - [239] = 229, - } - } -} - -local function addNewVariation(which, gender, one, two, single) - local where = variations[which][gender] - if not single then - where[one] = two - where[two] = one - else - where[one] = two - end -end - -CreateThread(function() - -- male visor/Hat variations - addNewVariation("visor", "male", 9, 10) - addNewVariation("visor", "male", 18, 67) - addNewVariation("visor", "male", 82, 67) - addNewVariation("visor", "male", 44, 45) - addNewVariation("visor", "male", 50, 68) - addNewVariation("visor", "male", 51, 69) - addNewVariation("visor", "male", 52, 70) - addNewVariation("visor", "male", 53, 71) - addNewVariation("visor", "male", 62, 72) - addNewVariation("visor", "male", 65, 66) - addNewVariation("visor", "male", 73, 74) - addNewVariation("visor", "male", 76, 77) - addNewVariation("visor", "male", 79, 78) - addNewVariation("visor", "male", 80, 81) - addNewVariation("visor", "male", 91, 92) - addNewVariation("visor", "male", 104, 105) - addNewVariation("visor", "male", 109, 110) - addNewVariation("visor", "male", 116, 117) - addNewVariation("visor", "male", 118, 119) - addNewVariation("visor", "male", 123, 124) - addNewVariation("visor", "male", 125, 126) - addNewVariation("visor", "male", 127, 128) - addNewVariation("visor", "male", 130, 131) - addNewVariation("visor", "male", 135, 136) - addNewVariation("visor", "male", 137, 138) - addNewVariation("visor", "male", 139, 140) - addNewVariation("visor", "male", 142, 143) - addNewVariation("visor", "male", 147, 148) - addNewVariation("visor", "male", 151, 152) - addNewVariation("visor", "male", 127, 128) - addNewVariation("visor", "male", 130, 131) - -- female visor/Hat variations - addNewVariation("visor", "female", 43, 44) - addNewVariation("visor", "female", 49, 67) - addNewVariation("visor", "female", 64, 65) - addNewVariation("visor", "female", 65, 64) - addNewVariation("visor", "female", 51, 69) - addNewVariation("visor", "female", 50, 68) - addNewVariation("visor", "female", 52, 70) - addNewVariation("visor", "female", 62, 71) - addNewVariation("visor", "female", 72, 73) - addNewVariation("visor", "female", 75, 76) - addNewVariation("visor", "female", 78, 77) - addNewVariation("visor", "female", 79, 80) - addNewVariation("visor", "female", 18, 66) - addNewVariation("visor", "female", 66, 81) - addNewVariation("visor", "female", 81, 66) - addNewVariation("visor", "female", 86, 84) - addNewVariation("visor", "female", 90, 91) - addNewVariation("visor", "female", 103, 104) - addNewVariation("visor", "female", 108, 109) - addNewVariation("visor", "female", 115, 116) - addNewVariation("visor", "female", 117, 118) - addNewVariation("visor", "female", 122, 123) - addNewVariation("visor", "female", 124, 125) - addNewVariation("visor", "female", 126, 127) - addNewVariation("visor", "female", 129, 130) - addNewVariation("visor", "female", 134, 135) - addNewVariation("visor", "female", 136, 137) - addNewVariation("visor", "female", 138, 139) - addNewVariation("visor", "female", 141, 142) - addNewVariation("visor", "female", 146, 147) - addNewVariation("visor", "female", 150, 151) - -- male bags - addNewVariation("bags", "male", 45, 44) - addNewVariation("bags", "male", 41, 40) - addNewVariation("bags", "male", 82, 81) - addNewVariation("bags", "male", 86, 85) - -- female bags - addNewVariation("bags", "female", 45, 44) - addNewVariation("bags", "female", 41, 40) - addNewVariation("bags", "female", 82, 81) - addNewVariation("bags", "female", 86, 85) - -- male hair - addNewVariation("hair", "male", 7, 15, true) - addNewVariation("hair", "male", 43, 15, true) - addNewVariation("hair", "male", 9, 43, true) - addNewVariation("hair", "male", 11, 43, true) - addNewVariation("hair", "male", 15, 43, true) - addNewVariation("hair", "male", 16, 43, true) - addNewVariation("hair", "male", 17, 43, true) - addNewVariation("hair", "male", 20, 43, true) - addNewVariation("hair", "male", 22, 43, true) - addNewVariation("hair", "male", 45, 43, true) - addNewVariation("hair", "male", 47, 43, true) - addNewVariation("hair", "male", 49, 43, true) - addNewVariation("hair", "male", 51, 43, true) - addNewVariation("hair", "male", 52, 43, true) - addNewVariation("hair", "male", 53, 43, true) - addNewVariation("hair", "male", 56, 43, true) - addNewVariation("hair", "male", 58, 43, true) - -- female hair - addNewVariation("hair", "female", 1, 49, true) - addNewVariation("hair", "female", 2, 49, true) - addNewVariation("hair", "female", 7, 49, true) - addNewVariation("hair", "female", 9, 49, true) - addNewVariation("hair", "female", 10, 49, true) - addNewVariation("hair", "female", 11, 48, true) - addNewVariation("hair", "female", 14, 53, true) - addNewVariation("hair", "female", 15, 42, true) - addNewVariation("hair", "female", 21, 42, true) - addNewVariation("hair", "female", 23, 42, true) - addNewVariation("hair", "female", 31, 53, true) - addNewVariation("hair", "female", 39, 49, true) - addNewVariation("hair", "female", 40, 49, true) - addNewVariation("hair", "female", 42, 53, true) - addNewVariation("hair", "female", 45, 49, true) - addNewVariation("hair", "female", 48, 49, true) - addNewVariation("hair", "female", 49, 48, true) - addNewVariation("hair", "female", 52, 53, true) - addNewVariation("hair", "female", 53, 42, true) - addNewVariation("hair", "female", 54, 55, true) - addNewVariation("hair", "female", 59, 42, true) - addNewVariation("hair", "female", 59, 54, true) - addNewVariation("hair", "female", 68, 53, true) - addNewVariation("hair", "female", 76, 48, true) - -- male Top/Jacket variations - addNewVariation("jackets", "male", 29, 30) - addNewVariation("jackets", "male", 31, 32) - addNewVariation("jackets", "male", 42, 43) - addNewVariation("jackets", "male", 59, 60) - addNewVariation("jackets", "male", 68, 69) - addNewVariation("jackets", "male", 74, 75) - addNewVariation("jackets", "male", 87, 88) - addNewVariation("jackets", "male", 93, 94) - addNewVariation("jackets", "male", 99, 100) - addNewVariation("jackets", "male", 101, 102) - addNewVariation("jackets", "male", 103, 104) - addNewVariation("jackets", "male", 126, 127) - addNewVariation("jackets", "male", 129, 130) - addNewVariation("jackets", "male", 131, 132) - addNewVariation("jackets", "male", 184, 185) - addNewVariation("jackets", "male", 188, 189) - addNewVariation("jackets", "male", 194, 195) - addNewVariation("jackets", "male", 196, 197) - addNewVariation("jackets", "male", 198, 199) - addNewVariation("jackets", "male", 200, 203) - addNewVariation("jackets", "male", 202, 205) - addNewVariation("jackets", "male", 206, 207) - addNewVariation("jackets", "male", 209, 212) - addNewVariation("jackets", "male", 210, 211) - addNewVariation("jackets", "male", 217, 218) - addNewVariation("jackets", "male", 229, 230) - addNewVariation("jackets", "male", 232, 233) - addNewVariation("jackets", "male", 235, 236) - addNewVariation("jackets", "male", 241, 242) - addNewVariation("jackets", "male", 251, 253) - addNewVariation("jackets", "male", 256, 261) - addNewVariation("jackets", "male", 262, 263) - addNewVariation("jackets", "male", 265, 266) - addNewVariation("jackets", "male", 267, 268) - addNewVariation("jackets", "male", 279, 280) - addNewVariation("jackets", "male", 292, 293) - addNewVariation("jackets", "male", 294, 295) - addNewVariation("jackets", "male", 296, 297) - addNewVariation("jackets", "male", 300, 303) - addNewVariation("jackets", "male", 301, 302) - addNewVariation("jackets", "male", 305, 306) - addNewVariation("jackets", "male", 311, 312) - addNewVariation("jackets", "male", 300, 303) - addNewVariation("jackets", "male", 301, 302) - addNewVariation("jackets", "male", 305, 306) - addNewVariation("jackets", "male", 311, 312) - addNewVariation("jackets", "male", 314, 315) - addNewVariation("jackets", "male", 316, 317) - addNewVariation("jackets", "male", 318, 319) - addNewVariation("jackets", "male", 321, 322) - addNewVariation("jackets", "male", 330, 331) - addNewVariation("jackets", "male", 336, 337) - addNewVariation("jackets", "male", 339, 126) - addNewVariation("jackets", "male", 340, 341) - addNewVariation("jackets", "male", 343, 344) - addNewVariation("jackets", "male", 346, 234) - addNewVariation("jackets", "male", 347, 260) - addNewVariation("jackets", "male", 348, 349) - addNewVariation("jackets", "male", 352, 353) - addNewVariation("jackets", "male", 354, 355) - addNewVariation("jackets", "male", 359, 360) - -- female Top/Jacket variations - addNewVariation("jackets", "female", 53, 52) - addNewVariation("jackets", "female", 57, 58) - addNewVariation("jackets", "female", 62, 63) - addNewVariation("jackets", "female", 84, 85) - addNewVariation("jackets", "female", 90, 91) - addNewVariation("jackets", "female", 92, 93) - addNewVariation("jackets", "female", 94, 95) - addNewVariation("jackets", "female", 117, 118) - addNewVariation("jackets", "female", 120, 121) - addNewVariation("jackets", "female", 128, 129) - addNewVariation("jackets", "female", 187, 186) - addNewVariation("jackets", "female", 190, 191) - addNewVariation("jackets", "female", 196, 197) - addNewVariation("jackets", "female", 198, 199) - addNewVariation("jackets", "female", 200, 201) - addNewVariation("jackets", "female", 202, 205) - addNewVariation("jackets", "female", 204, 207) - addNewVariation("jackets", "female", 210, 211) - addNewVariation("jackets", "female", 213, 216) - addNewVariation("jackets", "female", 214, 215) - addNewVariation("jackets", "female", 225, 226) - addNewVariation("jackets", "female", 227, 228) - addNewVariation("jackets", "female", 239, 240) - addNewVariation("jackets", "female", 242, 243) - addNewVariation("jackets", "female", 244, 364) - addNewVariation("jackets", "female", 245, 246) - addNewVariation("jackets", "female", 249, 250) - addNewVariation("jackets", "female", 259, 261) - addNewVariation("jackets", "female", 265, 270) - addNewVariation("jackets", "female", 271, 272) - addNewVariation("jackets", "female", 274, 275) - addNewVariation("jackets", "female", 276, 277) - addNewVariation("jackets", "female", 280, 281) - addNewVariation("jackets", "female", 292, 293) - addNewVariation("jackets", "female", 305, 306) - addNewVariation("jackets", "female", 307, 308) - addNewVariation("jackets", "female", 311, 314) - addNewVariation("jackets", "female", 312, 313) - addNewVariation("jackets", "female", 316, 317) - addNewVariation("jackets", "female", 325, 326) - addNewVariation("jackets", "female", 327, 328) - addNewVariation("jackets", "female", 329, 330) - addNewVariation("jackets", "female", 332, 333) - addNewVariation("jackets", "female", 339, 340) - addNewVariation("jackets", "female", 345, 346) - addNewVariation("jackets", "female", 351, 352) - addNewVariation("jackets", "female", 354, 121) - addNewVariation("jackets", "female", 355, 356) - addNewVariation("jackets", "female", 357, 359) - addNewVariation("jackets", "female", 358, 360) - addNewVariation("jackets", "female", 362, 363) - addNewVariation("jackets", "female", 366, 367) - addNewVariation("jackets", "female", 365, 269) - addNewVariation("jackets", "female", 370, 371) - addNewVariation("jackets", "female", 372, 373) - addNewVariation("jackets", "female", 378, 379) -end) - -local drawables = { - ["Top"] = { - Drawable = 11, - Table = variations.jackets, - Emote = {Dict = "missmic4", Anim = "michael_tux_fidget", Move = 51, Dur = 1500} - }, - ["Gloves"] = { - Drawable = 3, - Table = variations.gloves, - Remember = true, - Emote = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200} - }, - ["Shoes"] = { - Drawable = 6, - Table = {Standalone = true, male = 34, female = 35}, - Emote = {Dict = "random@domestic", Anim = "pickup_low", Move = 0, Dur = 1200} - }, - ["Neck"] = { - Drawable = 7, - Table = {Standalone = true, male = 0, female = 0 }, - Emote = {Dict = "clothingtie", Anim = "try_tie_positive_a", Move = 51, Dur = 2100} - }, - ["Vest"] = { - Drawable = 9, - Table = {Standalone = true, male = 0, female = 0 }, - Emote = {Dict = "clothingtie", Anim = "try_tie_negative_a", Move = 51, Dur = 1200} - }, - ["Bag"] = { - Drawable = 5, - Table = variations.bags, - Emote = {Dict = "anim@heists@ornate_bank@grab_cash", Anim = "intro", Move = 51, Dur = 1600} - }, - ["Mask"] = { - Drawable = 1, - Table = {Standalone = true, male = 0, female = 0 }, - Emote = {Dict = "mp_masks@standard_car@ds@", Anim = "put_on_mask", Move = 51, Dur = 800} - }, - ["Hair"] = { - Drawable = 2, - Table = variations.hair, - Remember = true, - Emote = {Dict = "clothingtie", Anim = "check_out_a", Move = 51, Dur = 2000} - }, -} - -local Extras = { - ["Shirt"] = { - Drawable = 11, - Table = { - Standalone = true, male = 252, female = 74, - Extra = { - {Drawable = 8, Id = 15, Tex = 0, Name = "Extra Undershirt"}, - {Drawable = 3, Id = 15, Tex = 0, Name = "Extra Gloves"}, - {Drawable = 10, Id = 0, Tex = 0, Name = "Extra Decals"}, - } - }, - Emote = {Dict = "clothingtie", Anim = "try_tie_negative_a", Move = 51, Dur = 1200} - }, - ["Pants"] = { - Drawable = 4, - Table = {Standalone = true, male = 61, female = 14}, - Emote = {Dict = "re@construction", Anim = "out_of_breath", Move = 51, Dur = 1300} - }, - ["Bagoff"] = { - Drawable = 5, - Table = {Standalone = true, male = 0, female = 0}, - Emote = {Dict = "clothingtie", Anim = "try_tie_negative_a", Move = 51, Dur = 1200} - }, -} - -local Props = { - ["Visor"] = { - Prop = 0, - Variants = variations.visor, - Emote = { - On = {Dict = "mp_masks@standard_car@ds@", Anim = "put_on_mask", Move = 51, Dur = 600}, - Off = {Dict = "missheist_agency2ahelmet", Anim = "take_off_helmet_stand", Move = 51, Dur = 1200} - } - }, - ["Hat"] = { - Prop = 0, - Emote = { - On = {Dict = "mp_masks@standard_car@ds@", Anim = "put_on_mask", Move = 51, Dur = 600}, - Off = {Dict = "missheist_agency2ahelmet", Anim = "take_off_helmet_stand", Move = 51, Dur = 1200} - } - }, - ["Glasses"] = { - Prop = 1, - Emote = { - On = {Dict = "clothingspecs", Anim = "take_off", Move = 51, Dur = 1400}, - Off = {Dict = "clothingspecs", Anim = "take_off", Move = 51, Dur = 1400} - } - }, - ["Ear"] = { - Prop = 2, - Emote = { - On = {Dict = "mp_cp_stolen_tut", Anim = "b_think", Move = 51, Dur = 900}, - Off = {Dict = "mp_cp_stolen_tut", Anim = "b_think", Move = 51, Dur = 900} - } - }, - ["Watch"] = { - Prop = 6, - Emote = { - On = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200}, - Off = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200} - } - }, - ["Bracelet"] = { - Prop = 7, - Emote = { - On = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200}, - Off = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200} - } - }, -} - -LastEquipped = {} -Cooldown = false - -local function PlayToggleEmote(e, cb) - lib.requestAnimDict(e.Dict) - if cache.vehicle then e.Move = 51 end - TaskPlayAnim(cache.ped, e.Dict, e.Anim, 3.0, 3.0, e.Dur, e.Move, 0, false, false, false) - local Pause = e.Dur - 500 - Pause = Pause < 500 and 500 or Pause - IncurCooldown(Pause) - Wait(Pause) -- Lets wait for the emote to play for a bit then do the callback. - cb() -end - -function ResetClothing(anim) - if type(anim) == "table" then - anim = true - end - local e = drawables.Top.Emote - if anim then TaskPlayAnim(cache.ped, e.Dict, e.Anim, 3.0, 3.0, 3000, e.Move, 0, false, false, false) end - for _, v in pairs(LastEquipped) do - if v then - if v.Drawable then SetPedComponentVariation(cache.ped, v.Id, v.Drawable, v.Texture, 0) - elseif v.Prop then ClearPedProp(cache.ped, v.Id) SetPedPropIndex(cache.ped, v.Id, v.Prop, v.Texture, true) end - end - end - LastEquipped = {} -end - -RegisterNetEvent('qb-radialmenu:ResetClothing', ResetClothing) - -function ToggleClothing(data) - local which = data.id or data[1] - local extra = data.extra - if which == "Shirt" or which == "Pants" or which == "Bagoff" then - extra = true - end - if Cooldown then return end - local Toggle = drawables[which] - if extra then Toggle = Extras[which] end - local Cur = { -- Lets check what we are currently wearing. - Drawable = GetPedDrawableVariation(cache.ped, Toggle.Drawable), - Id = Toggle.Drawable, - Ped = cache.ped, - Texture = GetPedTextureVariation(cache.ped, Toggle.Drawable), - } - local Gender = IsMpPed(cache.ped) - if which ~= "Mask" then - if not Gender then Notify(locale("info.wrong_ped")) return false end -- We cancel the command here if the person is not using a multiplayer model. - end - local Table = Toggle.Table[Gender] - if not Toggle.Table.Standalone then -- "Standalone" is for things that dont require a variant, like the shoes just need to be switched to a specific drawable. Looking back at this i should have planned ahead, but it all works so, meh! - for k,v in pairs(Table) do - if not Toggle.Remember then - if k == Cur.Drawable then - PlayToggleEmote(Toggle.Emote, function() SetPedComponentVariation(cache.ped, Toggle.Drawable, v, Cur.Texture, 0) end) return true - end - else - if not LastEquipped[which] then - if k == Cur.Drawable then - PlayToggleEmote(Toggle.Emote, function() LastEquipped[which] = Cur SetPedComponentVariation(cache.ped, Toggle.Drawable, v, Cur.Texture, 0) end) return true - end - else - local Last = LastEquipped[which] - PlayToggleEmote(Toggle.Emote, function() SetPedComponentVariation(cache.ped, Toggle.Drawable, Last.Drawable, Last.Texture, 0) LastEquipped[which] = false end) return true - end - end - end - Notify(locale("info.no_variants")) return - else - if not LastEquipped[which] then - if Cur.Drawable ~= Table then - PlayToggleEmote(Toggle.Emote, function() - LastEquipped[which] = Cur - SetPedComponentVariation(cache.ped, Toggle.Drawable, Table, 0, 0) - if Toggle.Table.Extra then - local extraToggled = Toggle.Table.Extra - for _, v in pairs(extraToggled) do - local ExtraCur = {Drawable = GetPedDrawableVariation(cache.ped, v.Drawable), Texture = GetPedTextureVariation(cache.ped, v.Drawable), Id = v.Drawable} - SetPedComponentVariation(cache.ped, v.Drawable, v.Id, v.Tex, 0) - LastEquipped[v.Name] = ExtraCur - end - end - end) - return true - end - else - local Last = LastEquipped[which] - PlayToggleEmote(Toggle.Emote, function() - SetPedComponentVariation(cache.ped, Toggle.Drawable, Last.Drawable, Last.Texture, 0) - LastEquipped[which] = false - if Toggle.Table.Extra then - local extraToggled = Toggle.Table.Extra - for _, v in pairs(extraToggled) do - if LastEquipped[v.Name] then - Last = LastEquipped[v.Name] - SetPedComponentVariation(cache.ped, Last.Id, Last.Drawable, Last.Texture, 0) - LastEquipped[v.Name] = false - end - end - end - end) - return true - end - end - Notify(locale("info.already_wearing")) return false -end - -RegisterNetEvent('qb-radialmenu:ToggleClothing', ToggleClothing) - -function ToggleProps(id) - if Cooldown then return end - local Prop = Props[id] or Props[id[1]] - local Cur = { -- Lets get out currently equipped prop. - Id = Prop.Prop, - Ped = cache.ped, - Prop = GetPedPropIndex(cache.ped, Prop.Prop), - Texture = GetPedPropTextureIndex(cache.ped, Prop.Prop), - } - if not Prop.Variants then - if Cur.Prop ~= -1 then -- If we currently are wearing this prop, remove it and save the one we were wearing into the LastEquipped table. - PlayToggleEmote(Prop.Emote.Off, function() LastEquipped[id] = Cur ClearPedProp(cache.ped, Prop.Prop) end) return true - else - local Last = LastEquipped[id] -- Detect that we have already taken our prop off, lets put it back on. - if Last then - PlayToggleEmote(Prop.Emote.On, function() SetPedPropIndex(cache.ped, Prop.Prop, Last.Prop, Last.Texture, true) end) LastEquipped[id] = false return true - end - end - Notify(locale("info.nothing_to_remove")) return false - else - local Gender = IsMpPed(cache.ped) - if not Gender then Notify(locale("info.wrong_ped")) return false end -- We dont really allow for variants on ped models, Its possible, but im pretty sure 95% of ped models dont really have variants. - variations = Prop.Variants[Gender] - for k,v in pairs(variations) do - if Cur.Prop == k then - PlayToggleEmote(Prop.Emote.On, function() SetPedPropIndex(cache.ped, Prop.Prop, v, Cur.Texture, true) end) return true - end - end - Notify(locale("info.no_variants")) return false - end -end - -RegisterNetEvent('qb-radialmenu:ToggleProps', ToggleProps) - -for k,v in pairs(config.clothingCommands) do - RegisterCommand(k, v.Func, false) - --log("Created /"..k.." ("..v.Desc..")") -- Useful for translation checking. - TriggerEvent("chat:addSuggestion", "/"..k, v.Desc) -end - -AddEventHandler('onResourceStop', function(resource) -- Mostly for development, restart the resource and it will put all the clothes back on. - if resource == GetCurrentResourceName() then - ResetClothing() - end -end) - -function IncurCooldown(ms) - CreateThread(function() - Cooldown = true Wait(ms) Cooldown = false - end) -end - -function Notify(message, color) -- However you want your notifications to be shown, you can switch it up here. - exports.qbx_core:Notify(message, color) -end - -function IsMpPed(ped) - local male = `mp_m_freemode_01` local female = `mp_f_freemode_01` - local CurrentModel = GetEntityModel(ped) - if CurrentModel == male then return "male" elseif CurrentModel == female then return "female" else return false end -end - -RegisterNetEvent('dpc:EquipLast', function() - for _, v in pairs(LastEquipped) do - if v then - if v.Drawable then SetPedComponentVariation(cache.ped, v.ID, v.Drawable, v.Texture, 0) - elseif v.Prop then ClearPedProp(cache.ped, v.ID) SetPedPropIndex(cache.ped, v.ID, v.Prop, v.Texture, true) end - end - end - LastEquipped = {} -end) - -RegisterNetEvent('dpc:ResetClothing', function() - LastEquipped = {} -end) +local config = require 'config.client' +local variations = { + jackets = {male = {}, female = {}}, + hair = {male = {}, female = {}}, + bags = {male = {}, female = {}}, + visor = {male = {}, female = {}}, + gloves = { + male = { + [16] = 4, + [17] = 4, + [18] = 4, + [19] = 0, + [20] = 1, + [21] = 2, + [22] = 4, + [23] = 5, + [24] = 6, + [25] = 8, + [26] = 11, + [27] = 12, + [28] = 14, + [29] = 15, + [30] = 0, + [31] = 1, + [32] = 2, + [33] = 4, + [34] = 5, + [35] = 6, + [36] = 8, + [37] = 11, + [38] = 12, + [39] = 14, + [40] = 15, + [41] = 0, + [42] = 1, + [43] = 2, + [44] = 4, + [45] = 5, + [46] = 6, + [47] = 8, + [48] = 11, + [49] = 12, + [50] = 14, + [51] = 15, + [52] = 0, + [53] = 1, + [54] = 2, + [55] = 4, + [56] = 5, + [57] = 6, + [58] = 8, + [59] = 11, + [60] = 12, + [61] = 14, + [62] = 15, + [63] = 0, + [64] = 1, + [65] = 2, + [66] = 4, + [67] = 5, + [68] = 6, + [69] = 8, + [70] = 11, + [71] = 12, + [72] = 14, + [73] = 15, + [74] = 0, + [75] = 1, + [76] = 2, + [77] = 4, + [78] = 5, + [79] = 6, + [80] = 8, + [81] = 11, + [82] = 12, + [83] = 14, + [84] = 15, + [85] = 0, + [86] = 1, + [87] = 2, + [88] = 4, + [89] = 5, + [90] = 6, + [91] = 8, + [92] = 11, + [93] = 12, + [94] = 14, + [95] = 15, + [96] = 4, + [97] = 4, + [98] = 4, + [99] = 0, + [100] = 1, + [101] = 2, + [102] = 4, + [103] = 5, + [104] = 6, + [105] = 8, + [106] = 11, + [107] = 12, + [108] = 14, + [109] = 15, + [110] = 4, + [111] = 4, + [115] = 112, + [116] = 112, + [117] = 112, + [118] = 112, + [119] = 112, + [120] = 112, + [121] = 112, + [122] = 113, + [123] = 113, + [124] = 113, + [125] = 113, + [126] = 113, + [127] = 113, + [128] = 113, + [129] = 114, + [130] = 114, + [131] = 114, + [132] = 114, + [133] = 114, + [134] = 114, + [135] = 114, + [136] = 15, + [137] = 15, + [138] = 0, + [139] = 1, + [140] = 2, + [141] = 4, + [142] = 5, + [143] = 6, + [144] = 8, + [145] = 11, + [146] = 12, + [147] = 14, + [148] = 112, + [149] = 113, + [150] = 114, + [151] = 0, + [152] = 1, + [153] = 2, + [154] = 4, + [155] = 5, + [156] = 6, + [157] = 8, + [158] = 11, + [159] = 12, + [160] = 14, + [161] = 112, + [162] = 113, + [163] = 114, + [165] = 4, + [166] = 4, + [167] = 4, + [168] = 4, + [170] = 15, + [171] = 0, + [172] = 1, + [173] = 2, + [174] = 4, + [175] = 5, + [176] = 6, + [177] = 8, + [178] = 11, + [179] = 12, + [180] = 14, + [181] = 112, + [182] = 113, + [183] = 114, + [185] = 184, + [186] = 184, + [187] = 184, + [188] = 184, + [189] = 185, + [190] = 184, + [191] = 184, + [192] = 184, + [193] = 184, + [194] = 184, + }, + female = { + [16] = 11, + [17] = 3, + [18] = 3, + [19] = 3, + [20] = 0, + [21] = 1, + [22] = 2, + [23] = 3, + [24] = 4, + [25] = 5, + [26] = 6, + [27] = 7, + [28] = 9, + [29] = 11, + [30] = 12, + [31] = 14, + [32] = 15, + [33] = 0, + [34] = 1, + [35] = 2, + [36] = 3, + [37] = 4, + [38] = 5, + [39] = 6, + [40] = 7, + [41] = 9, + [42] = 11, + [43] = 12, + [44] = 14, + [45] = 15, + [46] = 0, + [47] = 1, + [48] = 2, + [49] = 3, + [50] = 4, + [51] = 5, + [52] = 6, + [53] = 7, + [54] = 9, + [55] = 11, + [56] = 12, + [57] = 14, + [58] = 15, + [59] = 0, + [60] = 1, + [61] = 2, + [62] = 3, + [63] = 4, + [64] = 5, + [65] = 6, + [66] = 7, + [67] = 9, + [68] = 11, + [69] = 12, + [70] = 14, + [71] = 15, + [72] = 0, + [73] = 1, + [74] = 2, + [75] = 3, + [76] = 4, + [77] = 5, + [78] = 6, + [79] = 7, + [80] = 9, + [81] = 11, + [82] = 12, + [83] = 14, + [84] = 15, + [85] = 0, + [86] = 1, + [87] = 2, + [88] = 3, + [89] = 4, + [90] = 5, + [91] = 6, + [92] = 7, + [93] = 9, + [94] = 11, + [95] = 12, + [96] = 14, + [97] = 15, + [98] = 0, + [99] = 1, + [100] = 2, + [101] = 3, + [102] = 4, + [103] = 5, + [104] = 6, + [105] = 7, + [106] = 9, + [107] = 11, + [108] = 12, + [109] = 14, + [110] = 15, + [111] = 3, + [112] = 3, + [113] = 3, + [114] = 0, + [115] = 1, + [116] = 2, + [117] = 3, + [118] = 4, + [119] = 5, + [120] = 6, + [121] = 7, + [122] = 9, + [123] = 11, + [124] = 12, + [125] = 14, + [126] = 15, + [127] = 3, + [128] = 3, + [132] = 129, + [133] = 129, + [134] = 129, + [135] = 129, + [136] = 129, + [137] = 129, + [138] = 129, + [139] = 130, + [140] = 130, + [141] = 130, + [142] = 130, + [143] = 130, + [144] = 130, + [145] = 130, + [146] = 131, + [147] = 131, + [148] = 131, + [149] = 131, + [150] = 131, + [151] = 131, + [152] = 131, + [154] = 153, + [155] = 153, + [156] = 153, + [157] = 153, + [158] = 153, + [159] = 153, + [160] = 153, + [162] = 161, + [163] = 161, + [164] = 161, + [165] = 161, + [166] = 161, + [167] = 161, + [168] = 161, + [169] = 15, + [170] = 15, + [171] = 0, + [172] = 1, + [173] = 2, + [174] = 3, + [175] = 4, + [176] = 5, + [177] = 6, + [178] = 7, + [179] = 9, + [180] = 11, + [181] = 12, + [182] = 14, + [183] = 129, + [184] = 130, + [185] = 131, + [186] = 153, + [187] = 0, + [188] = 1, + [189] = 2, + [190] = 3, + [191] = 4, + [192] = 5, + [193] = 6, + [194] = 7, + [195] = 9, + [196] = 11, + [197] = 12, + [198] = 14, + [199] = 129, + [200] = 130, + [201] = 131, + [202] = 153, + [203] = 161, + [204] = 161, + [206] = 3, + [207] = 3, + [208] = 3, + [209] = 3, + [211] = 15, + [212] = 0, + [213] = 1, + [214] = 2, + [215] = 3, + [216] = 4, + [217] = 5, + [218] = 6, + [219] = 7, + [220] = 9, + [221] = 11, + [222] = 12, + [223] = 14, + [224] = 129, + [225] = 130, + [226] = 131, + [227] = 153, + [228] = 161, + [230] = 229, + [231] = 229, + [232] = 229, + [233] = 229, + [234] = 229, + [235] = 229, + [236] = 229, + [237] = 229, + [238] = 229, + [239] = 229, + } + } +} + +local function addNewVariation(which, gender, one, two, single) + local where = variations[which][gender] + if not single then + where[one] = two + where[two] = one + else + where[one] = two + end +end + +CreateThread(function() + -- male visor/Hat variations + addNewVariation("visor", "male", 9, 10) + addNewVariation("visor", "male", 18, 67) + addNewVariation("visor", "male", 82, 67) + addNewVariation("visor", "male", 44, 45) + addNewVariation("visor", "male", 50, 68) + addNewVariation("visor", "male", 51, 69) + addNewVariation("visor", "male", 52, 70) + addNewVariation("visor", "male", 53, 71) + addNewVariation("visor", "male", 62, 72) + addNewVariation("visor", "male", 65, 66) + addNewVariation("visor", "male", 73, 74) + addNewVariation("visor", "male", 76, 77) + addNewVariation("visor", "male", 79, 78) + addNewVariation("visor", "male", 80, 81) + addNewVariation("visor", "male", 91, 92) + addNewVariation("visor", "male", 104, 105) + addNewVariation("visor", "male", 109, 110) + addNewVariation("visor", "male", 116, 117) + addNewVariation("visor", "male", 118, 119) + addNewVariation("visor", "male", 123, 124) + addNewVariation("visor", "male", 125, 126) + addNewVariation("visor", "male", 127, 128) + addNewVariation("visor", "male", 130, 131) + addNewVariation("visor", "male", 135, 136) + addNewVariation("visor", "male", 137, 138) + addNewVariation("visor", "male", 139, 140) + addNewVariation("visor", "male", 142, 143) + addNewVariation("visor", "male", 147, 148) + addNewVariation("visor", "male", 151, 152) + addNewVariation("visor", "male", 127, 128) + addNewVariation("visor", "male", 130, 131) + -- female visor/Hat variations + addNewVariation("visor", "female", 43, 44) + addNewVariation("visor", "female", 49, 67) + addNewVariation("visor", "female", 64, 65) + addNewVariation("visor", "female", 65, 64) + addNewVariation("visor", "female", 51, 69) + addNewVariation("visor", "female", 50, 68) + addNewVariation("visor", "female", 52, 70) + addNewVariation("visor", "female", 62, 71) + addNewVariation("visor", "female", 72, 73) + addNewVariation("visor", "female", 75, 76) + addNewVariation("visor", "female", 78, 77) + addNewVariation("visor", "female", 79, 80) + addNewVariation("visor", "female", 18, 66) + addNewVariation("visor", "female", 66, 81) + addNewVariation("visor", "female", 81, 66) + addNewVariation("visor", "female", 86, 84) + addNewVariation("visor", "female", 90, 91) + addNewVariation("visor", "female", 103, 104) + addNewVariation("visor", "female", 108, 109) + addNewVariation("visor", "female", 115, 116) + addNewVariation("visor", "female", 117, 118) + addNewVariation("visor", "female", 122, 123) + addNewVariation("visor", "female", 124, 125) + addNewVariation("visor", "female", 126, 127) + addNewVariation("visor", "female", 129, 130) + addNewVariation("visor", "female", 134, 135) + addNewVariation("visor", "female", 136, 137) + addNewVariation("visor", "female", 138, 139) + addNewVariation("visor", "female", 141, 142) + addNewVariation("visor", "female", 146, 147) + addNewVariation("visor", "female", 150, 151) + -- male bags + addNewVariation("bags", "male", 45, 44) + addNewVariation("bags", "male", 41, 40) + addNewVariation("bags", "male", 82, 81) + addNewVariation("bags", "male", 86, 85) + -- female bags + addNewVariation("bags", "female", 45, 44) + addNewVariation("bags", "female", 41, 40) + addNewVariation("bags", "female", 82, 81) + addNewVariation("bags", "female", 86, 85) + -- male hair + addNewVariation("hair", "male", 7, 15, true) + addNewVariation("hair", "male", 43, 15, true) + addNewVariation("hair", "male", 9, 43, true) + addNewVariation("hair", "male", 11, 43, true) + addNewVariation("hair", "male", 15, 43, true) + addNewVariation("hair", "male", 16, 43, true) + addNewVariation("hair", "male", 17, 43, true) + addNewVariation("hair", "male", 20, 43, true) + addNewVariation("hair", "male", 22, 43, true) + addNewVariation("hair", "male", 45, 43, true) + addNewVariation("hair", "male", 47, 43, true) + addNewVariation("hair", "male", 49, 43, true) + addNewVariation("hair", "male", 51, 43, true) + addNewVariation("hair", "male", 52, 43, true) + addNewVariation("hair", "male", 53, 43, true) + addNewVariation("hair", "male", 56, 43, true) + addNewVariation("hair", "male", 58, 43, true) + -- female hair + addNewVariation("hair", "female", 1, 49, true) + addNewVariation("hair", "female", 2, 49, true) + addNewVariation("hair", "female", 7, 49, true) + addNewVariation("hair", "female", 9, 49, true) + addNewVariation("hair", "female", 10, 49, true) + addNewVariation("hair", "female", 11, 48, true) + addNewVariation("hair", "female", 14, 53, true) + addNewVariation("hair", "female", 15, 42, true) + addNewVariation("hair", "female", 21, 42, true) + addNewVariation("hair", "female", 23, 42, true) + addNewVariation("hair", "female", 31, 53, true) + addNewVariation("hair", "female", 39, 49, true) + addNewVariation("hair", "female", 40, 49, true) + addNewVariation("hair", "female", 42, 53, true) + addNewVariation("hair", "female", 45, 49, true) + addNewVariation("hair", "female", 48, 49, true) + addNewVariation("hair", "female", 49, 48, true) + addNewVariation("hair", "female", 52, 53, true) + addNewVariation("hair", "female", 53, 42, true) + addNewVariation("hair", "female", 54, 55, true) + addNewVariation("hair", "female", 59, 42, true) + addNewVariation("hair", "female", 59, 54, true) + addNewVariation("hair", "female", 68, 53, true) + addNewVariation("hair", "female", 76, 48, true) + -- male Top/Jacket variations + addNewVariation("jackets", "male", 29, 30) + addNewVariation("jackets", "male", 31, 32) + addNewVariation("jackets", "male", 42, 43) + addNewVariation("jackets", "male", 59, 60) + addNewVariation("jackets", "male", 68, 69) + addNewVariation("jackets", "male", 74, 75) + addNewVariation("jackets", "male", 87, 88) + addNewVariation("jackets", "male", 93, 94) + addNewVariation("jackets", "male", 99, 100) + addNewVariation("jackets", "male", 101, 102) + addNewVariation("jackets", "male", 103, 104) + addNewVariation("jackets", "male", 126, 127) + addNewVariation("jackets", "male", 129, 130) + addNewVariation("jackets", "male", 131, 132) + addNewVariation("jackets", "male", 184, 185) + addNewVariation("jackets", "male", 188, 189) + addNewVariation("jackets", "male", 194, 195) + addNewVariation("jackets", "male", 196, 197) + addNewVariation("jackets", "male", 198, 199) + addNewVariation("jackets", "male", 200, 203) + addNewVariation("jackets", "male", 202, 205) + addNewVariation("jackets", "male", 206, 207) + addNewVariation("jackets", "male", 209, 212) + addNewVariation("jackets", "male", 210, 211) + addNewVariation("jackets", "male", 217, 218) + addNewVariation("jackets", "male", 229, 230) + addNewVariation("jackets", "male", 232, 233) + addNewVariation("jackets", "male", 235, 236) + addNewVariation("jackets", "male", 241, 242) + addNewVariation("jackets", "male", 251, 253) + addNewVariation("jackets", "male", 256, 261) + addNewVariation("jackets", "male", 262, 263) + addNewVariation("jackets", "male", 265, 266) + addNewVariation("jackets", "male", 267, 268) + addNewVariation("jackets", "male", 279, 280) + addNewVariation("jackets", "male", 292, 293) + addNewVariation("jackets", "male", 294, 295) + addNewVariation("jackets", "male", 296, 297) + addNewVariation("jackets", "male", 300, 303) + addNewVariation("jackets", "male", 301, 302) + addNewVariation("jackets", "male", 305, 306) + addNewVariation("jackets", "male", 311, 312) + addNewVariation("jackets", "male", 300, 303) + addNewVariation("jackets", "male", 301, 302) + addNewVariation("jackets", "male", 305, 306) + addNewVariation("jackets", "male", 311, 312) + addNewVariation("jackets", "male", 314, 315) + addNewVariation("jackets", "male", 316, 317) + addNewVariation("jackets", "male", 318, 319) + addNewVariation("jackets", "male", 321, 322) + addNewVariation("jackets", "male", 330, 331) + addNewVariation("jackets", "male", 336, 337) + addNewVariation("jackets", "male", 339, 126) + addNewVariation("jackets", "male", 340, 341) + addNewVariation("jackets", "male", 343, 344) + addNewVariation("jackets", "male", 346, 234) + addNewVariation("jackets", "male", 347, 260) + addNewVariation("jackets", "male", 348, 349) + addNewVariation("jackets", "male", 352, 353) + addNewVariation("jackets", "male", 354, 355) + addNewVariation("jackets", "male", 359, 360) + -- female Top/Jacket variations + addNewVariation("jackets", "female", 53, 52) + addNewVariation("jackets", "female", 57, 58) + addNewVariation("jackets", "female", 62, 63) + addNewVariation("jackets", "female", 84, 85) + addNewVariation("jackets", "female", 90, 91) + addNewVariation("jackets", "female", 92, 93) + addNewVariation("jackets", "female", 94, 95) + addNewVariation("jackets", "female", 117, 118) + addNewVariation("jackets", "female", 120, 121) + addNewVariation("jackets", "female", 128, 129) + addNewVariation("jackets", "female", 187, 186) + addNewVariation("jackets", "female", 190, 191) + addNewVariation("jackets", "female", 196, 197) + addNewVariation("jackets", "female", 198, 199) + addNewVariation("jackets", "female", 200, 201) + addNewVariation("jackets", "female", 202, 205) + addNewVariation("jackets", "female", 204, 207) + addNewVariation("jackets", "female", 210, 211) + addNewVariation("jackets", "female", 213, 216) + addNewVariation("jackets", "female", 214, 215) + addNewVariation("jackets", "female", 225, 226) + addNewVariation("jackets", "female", 227, 228) + addNewVariation("jackets", "female", 239, 240) + addNewVariation("jackets", "female", 242, 243) + addNewVariation("jackets", "female", 244, 364) + addNewVariation("jackets", "female", 245, 246) + addNewVariation("jackets", "female", 249, 250) + addNewVariation("jackets", "female", 259, 261) + addNewVariation("jackets", "female", 265, 270) + addNewVariation("jackets", "female", 271, 272) + addNewVariation("jackets", "female", 274, 275) + addNewVariation("jackets", "female", 276, 277) + addNewVariation("jackets", "female", 280, 281) + addNewVariation("jackets", "female", 292, 293) + addNewVariation("jackets", "female", 305, 306) + addNewVariation("jackets", "female", 307, 308) + addNewVariation("jackets", "female", 311, 314) + addNewVariation("jackets", "female", 312, 313) + addNewVariation("jackets", "female", 316, 317) + addNewVariation("jackets", "female", 325, 326) + addNewVariation("jackets", "female", 327, 328) + addNewVariation("jackets", "female", 329, 330) + addNewVariation("jackets", "female", 332, 333) + addNewVariation("jackets", "female", 339, 340) + addNewVariation("jackets", "female", 345, 346) + addNewVariation("jackets", "female", 351, 352) + addNewVariation("jackets", "female", 354, 121) + addNewVariation("jackets", "female", 355, 356) + addNewVariation("jackets", "female", 357, 359) + addNewVariation("jackets", "female", 358, 360) + addNewVariation("jackets", "female", 362, 363) + addNewVariation("jackets", "female", 366, 367) + addNewVariation("jackets", "female", 365, 269) + addNewVariation("jackets", "female", 370, 371) + addNewVariation("jackets", "female", 372, 373) + addNewVariation("jackets", "female", 378, 379) +end) + +local drawables = { + ["Top"] = { + Drawable = 11, + Table = variations.jackets, + Emote = {Dict = "missmic4", Anim = "michael_tux_fidget", Move = 51, Dur = 1500} + }, + ["Gloves"] = { + Drawable = 3, + Table = variations.gloves, + Remember = true, + Emote = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200} + }, + ["Shoes"] = { + Drawable = 6, + Table = {Standalone = true, male = 34, female = 35}, + Emote = {Dict = "random@domestic", Anim = "pickup_low", Move = 0, Dur = 1200} + }, + ["Neck"] = { + Drawable = 7, + Table = {Standalone = true, male = 0, female = 0 }, + Emote = {Dict = "clothingtie", Anim = "try_tie_positive_a", Move = 51, Dur = 2100} + }, + ["Vest"] = { + Drawable = 9, + Table = {Standalone = true, male = 0, female = 0 }, + Emote = {Dict = "clothingtie", Anim = "try_tie_negative_a", Move = 51, Dur = 1200} + }, + ["Bag"] = { + Drawable = 5, + Table = variations.bags, + Emote = {Dict = "anim@heists@ornate_bank@grab_cash", Anim = "intro", Move = 51, Dur = 1600} + }, + ["Mask"] = { + Drawable = 1, + Table = {Standalone = true, male = 0, female = 0 }, + Emote = {Dict = "mp_masks@standard_car@ds@", Anim = "put_on_mask", Move = 51, Dur = 800} + }, + ["Hair"] = { + Drawable = 2, + Table = variations.hair, + Remember = true, + Emote = {Dict = "clothingtie", Anim = "check_out_a", Move = 51, Dur = 2000} + }, +} + +local Extras = { + ["Shirt"] = { + Drawable = 11, + Table = { + Standalone = true, male = 252, female = 74, + Extra = { + {Drawable = 8, Id = 15, Tex = 0, Name = "Extra Undershirt"}, + {Drawable = 3, Id = 15, Tex = 0, Name = "Extra Gloves"}, + {Drawable = 10, Id = 0, Tex = 0, Name = "Extra Decals"}, + } + }, + Emote = {Dict = "clothingtie", Anim = "try_tie_negative_a", Move = 51, Dur = 1200} + }, + ["Pants"] = { + Drawable = 4, + Table = {Standalone = true, male = 61, female = 14}, + Emote = {Dict = "re@construction", Anim = "out_of_breath", Move = 51, Dur = 1300} + }, + ["Bagoff"] = { + Drawable = 5, + Table = {Standalone = true, male = 0, female = 0}, + Emote = {Dict = "clothingtie", Anim = "try_tie_negative_a", Move = 51, Dur = 1200} + }, +} + +local Props = { + ["Visor"] = { + Prop = 0, + Variants = variations.visor, + Emote = { + On = {Dict = "mp_masks@standard_car@ds@", Anim = "put_on_mask", Move = 51, Dur = 600}, + Off = {Dict = "missheist_agency2ahelmet", Anim = "take_off_helmet_stand", Move = 51, Dur = 1200} + } + }, + ["Hat"] = { + Prop = 0, + Emote = { + On = {Dict = "mp_masks@standard_car@ds@", Anim = "put_on_mask", Move = 51, Dur = 600}, + Off = {Dict = "missheist_agency2ahelmet", Anim = "take_off_helmet_stand", Move = 51, Dur = 1200} + } + }, + ["Glasses"] = { + Prop = 1, + Emote = { + On = {Dict = "clothingspecs", Anim = "take_off", Move = 51, Dur = 1400}, + Off = {Dict = "clothingspecs", Anim = "take_off", Move = 51, Dur = 1400} + } + }, + ["Ear"] = { + Prop = 2, + Emote = { + On = {Dict = "mp_cp_stolen_tut", Anim = "b_think", Move = 51, Dur = 900}, + Off = {Dict = "mp_cp_stolen_tut", Anim = "b_think", Move = 51, Dur = 900} + } + }, + ["Watch"] = { + Prop = 6, + Emote = { + On = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200}, + Off = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200} + } + }, + ["Bracelet"] = { + Prop = 7, + Emote = { + On = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200}, + Off = {Dict = "nmt_3_rcm-10", Anim = "cs_nigel_dual-10", Move = 51, Dur = 1200} + } + }, +} + +LastEquipped = {} +Cooldown = false + +local function PlayToggleEmote(e, cb) + if cache.vehicle then e.Move = 51 end + lib.playAnim(cache.ped, e.Dict, e.Anim, 3.0, 3.0, e.Dur, e.Move, 0, false, false, false) + local Pause = e.Dur - 500 + Pause = Pause < 500 and 500 or Pause + IncurCooldown(Pause) + Wait(Pause) -- Lets wait for the emote to play for a bit then do the callback. + cb() +end + +function ResetClothing(anim) + if type(anim) == "table" then + anim = true + end + local e = drawables.Top.Emote + if anim then TaskPlayAnim(cache.ped, e.Dict, e.Anim, 3.0, 3.0, 3000, e.Move, 0, false, false, false) end + for _, v in pairs(LastEquipped) do + if v then + if v.Drawable then SetPedComponentVariation(cache.ped, v.Id, v.Drawable, v.Texture, 0) + elseif v.Prop then ClearPedProp(cache.ped, v.Id) SetPedPropIndex(cache.ped, v.Id, v.Prop, v.Texture, true) end + end + end + LastEquipped = {} +end + +RegisterNetEvent('qb-radialmenu:ResetClothing', ResetClothing) + +function ToggleClothing(data) + local which = data.id or data[1] + local extra = data.extra + if which == "Shirt" or which == "Pants" or which == "Bagoff" then + extra = true + end + if Cooldown then return end + local Toggle = drawables[which] + if extra then Toggle = Extras[which] end + local Cur = { -- Lets check what we are currently wearing. + Drawable = GetPedDrawableVariation(cache.ped, Toggle.Drawable), + Id = Toggle.Drawable, + Ped = cache.ped, + Texture = GetPedTextureVariation(cache.ped, Toggle.Drawable), + } + local Gender = IsMpPed(cache.ped) + if which ~= "Mask" then + if not Gender then Notify(locale("info.wrong_ped")) return false end -- We cancel the command here if the person is not using a multiplayer model. + end + local Table = Toggle.Table[Gender] + if not Toggle.Table.Standalone then -- "Standalone" is for things that dont require a variant, like the shoes just need to be switched to a specific drawable. Looking back at this i should have planned ahead, but it all works so, meh! + for k,v in pairs(Table) do + if not Toggle.Remember then + if k == Cur.Drawable then + PlayToggleEmote(Toggle.Emote, function() SetPedComponentVariation(cache.ped, Toggle.Drawable, v, Cur.Texture, 0) end) return true + end + else + if not LastEquipped[which] then + if k == Cur.Drawable then + PlayToggleEmote(Toggle.Emote, function() LastEquipped[which] = Cur SetPedComponentVariation(cache.ped, Toggle.Drawable, v, Cur.Texture, 0) end) return true + end + else + local Last = LastEquipped[which] + PlayToggleEmote(Toggle.Emote, function() SetPedComponentVariation(cache.ped, Toggle.Drawable, Last.Drawable, Last.Texture, 0) LastEquipped[which] = false end) return true + end + end + end + Notify(locale("info.no_variants")) return + else + if not LastEquipped[which] then + if Cur.Drawable ~= Table then + PlayToggleEmote(Toggle.Emote, function() + LastEquipped[which] = Cur + SetPedComponentVariation(cache.ped, Toggle.Drawable, Table, 0, 0) + if Toggle.Table.Extra then + local extraToggled = Toggle.Table.Extra + for _, v in pairs(extraToggled) do + local ExtraCur = {Drawable = GetPedDrawableVariation(cache.ped, v.Drawable), Texture = GetPedTextureVariation(cache.ped, v.Drawable), Id = v.Drawable} + SetPedComponentVariation(cache.ped, v.Drawable, v.Id, v.Tex, 0) + LastEquipped[v.Name] = ExtraCur + end + end + end) + return true + end + else + local Last = LastEquipped[which] + PlayToggleEmote(Toggle.Emote, function() + SetPedComponentVariation(cache.ped, Toggle.Drawable, Last.Drawable, Last.Texture, 0) + LastEquipped[which] = false + if Toggle.Table.Extra then + local extraToggled = Toggle.Table.Extra + for _, v in pairs(extraToggled) do + if LastEquipped[v.Name] then + Last = LastEquipped[v.Name] + SetPedComponentVariation(cache.ped, Last.Id, Last.Drawable, Last.Texture, 0) + LastEquipped[v.Name] = false + end + end + end + end) + return true + end + end + Notify(locale("info.already_wearing")) return false +end + +RegisterNetEvent('qb-radialmenu:ToggleClothing', ToggleClothing) + +function ToggleProps(id) + if Cooldown then return end + local Prop = Props[id] or Props[id[1]] + local Cur = { -- Lets get out currently equipped prop. + Id = Prop.Prop, + Ped = cache.ped, + Prop = GetPedPropIndex(cache.ped, Prop.Prop), + Texture = GetPedPropTextureIndex(cache.ped, Prop.Prop), + } + if not Prop.Variants then + if Cur.Prop ~= -1 then -- If we currently are wearing this prop, remove it and save the one we were wearing into the LastEquipped table. + PlayToggleEmote(Prop.Emote.Off, function() LastEquipped[id] = Cur ClearPedProp(cache.ped, Prop.Prop) end) return true + else + local Last = LastEquipped[id] -- Detect that we have already taken our prop off, lets put it back on. + if Last then + PlayToggleEmote(Prop.Emote.On, function() SetPedPropIndex(cache.ped, Prop.Prop, Last.Prop, Last.Texture, true) end) LastEquipped[id] = false return true + end + end + Notify(locale("info.nothing_to_remove")) return false + else + local Gender = IsMpPed(cache.ped) + if not Gender then Notify(locale("info.wrong_ped")) return false end -- We dont really allow for variants on ped models, Its possible, but im pretty sure 95% of ped models dont really have variants. + variations = Prop.Variants[Gender] + for k,v in pairs(variations) do + if Cur.Prop == k then + PlayToggleEmote(Prop.Emote.On, function() SetPedPropIndex(cache.ped, Prop.Prop, v, Cur.Texture, true) end) return true + end + end + Notify(locale("info.no_variants")) return false + end +end + +RegisterNetEvent('qb-radialmenu:ToggleProps', ToggleProps) + +for k,v in pairs(config.clothingCommands) do + RegisterCommand(k, v.Func, false) + --log("Created /"..k.." ("..v.Desc..")") -- Useful for translation checking. + TriggerEvent("chat:addSuggestion", "/"..k, v.Desc) +end + +AddEventHandler('onResourceStop', function(resource) -- Mostly for development, restart the resource and it will put all the clothes back on. + if resource == GetCurrentResourceName() then + ResetClothing() + end +end) + +function IncurCooldown(ms) + CreateThread(function() + Cooldown = true Wait(ms) Cooldown = false + end) +end + +function Notify(message, color) -- However you want your notifications to be shown, you can switch it up here. + exports.qbx_core:Notify(message, color) +end + +function IsMpPed(ped) + local male = `mp_m_freemode_01` local female = `mp_f_freemode_01` + local CurrentModel = GetEntityModel(ped) + if CurrentModel == male then return "male" elseif CurrentModel == female then return "female" else return false end +end + +RegisterNetEvent('dpc:EquipLast', function() + for _, v in pairs(LastEquipped) do + if v then + if v.Drawable then SetPedComponentVariation(cache.ped, v.ID, v.Drawable, v.Texture, 0) + elseif v.Prop then ClearPedProp(cache.ped, v.ID) SetPedPropIndex(cache.ped, v.ID, v.Prop, v.Texture, true) end + end + end + LastEquipped = {} +end) + +RegisterNetEvent('dpc:ResetClothing', function() + LastEquipped = {} +end) diff --git a/client/trunk.lua b/client/trunk.lua index b0f930b..e065ec5 100644 --- a/client/trunk.lua +++ b/client/trunk.lua @@ -110,8 +110,7 @@ RegisterNetEvent('qb-trunk:client:KidnapGetIn', function(veh) y = config.trunkClasses[vehClass].y, z = config.trunkClasses[vehClass].z, } - lib.requestAnimDict("fin_ext_p1-7") - TaskPlayAnim(cache.ped, "fin_ext_p1-7", "cs_devin_dual-7", 8.0, 8.0, -1, 1, 999.0, false, false, false) + lib.playAnim(cache.ped, "fin_ext_p1-7", "cs_devin_dual-7", 8.0, 8.0, -1, 1, 999.0, false, false, false) AttachEntityToEntity(cache.ped, closestVehicle, 0, offset.x, offset.y, offset.z, 0, 0, 40.0, true, true, true, true, 1, true) TriggerServerEvent('qb-trunk:server:setTrunkBusy', plate, true) inTrunk = true @@ -170,8 +169,7 @@ RegisterNetEvent('qb-trunk:client:GetIn', function() y = config.trunkClasses[vehClass].y, z = config.trunkClasses[vehClass].z, } - lib.requestAnimDict("fin_ext_p1-7") - TaskPlayAnim(cache.ped, "fin_ext_p1-7", "cs_devin_dual-7", 8.0, 8.0, -1, 1, 999.0, false, false, false) + lib.playAnim(cache.ped, "fin_ext_p1-7", "cs_devin_dual-7", 8.0, 8.0, -1, 1, 999.0, false, false, false) AttachEntityToEntity(cache.ped, closestVehicle, 0, offset.x, offset.y, offset.z, 0, 0, 40.0, true, true, true, true, 1, true) TriggerServerEvent('qb-trunk:server:setTrunkBusy', plate, true) inTrunk = true