diff --git a/resources/dpemotes-master/NativeUI.lua b/resources/dpemotes-master/NativeUI.lua new file mode 100644 index 000000000..3fa972771 --- /dev/null +++ b/resources/dpemotes-master/NativeUI.lua @@ -0,0 +1,3875 @@ +UIResRectangle = setmetatable({}, UIResRectangle) +UIResRectangle.__index = UIResRectangle +UIResRectangle.__call = function() return "Rectangle" end + +UIResText = setmetatable({}, UIResText) +UIResText.__index = UIResText +UIResText.__call = function() return "Text" end + +Sprite = setmetatable({}, Sprite) +Sprite.__index = Sprite +Sprite.__call = function() return "Sprite" end + +UIMenuItem = setmetatable({}, UIMenuItem) +UIMenuItem.__index = UIMenuItem +UIMenuItem.__call = function() return "UIMenuItem", "UIMenuItem" end + +UIMenuCheckboxItem = setmetatable({}, UIMenuCheckboxItem) +UIMenuCheckboxItem.__index = UIMenuCheckboxItem +UIMenuCheckboxItem.__call = function() return "UIMenuItem", "UIMenuCheckboxItem" end + +UIMenuListItem = setmetatable({}, UIMenuListItem) +UIMenuListItem.__index = UIMenuListItem +UIMenuListItem.__call = function() return "UIMenuItem", "UIMenuListItem" end + +UIMenuSliderItem = setmetatable({}, UIMenuSliderItem) +UIMenuSliderItem.__index = UIMenuSliderItem +UIMenuSliderItem.__call = function() return "UIMenuItem", "UIMenuSliderItem" end + +UIMenuColouredItem = setmetatable({}, UIMenuColouredItem) +UIMenuColouredItem.__index = UIMenuColouredItem +UIMenuColouredItem.__call = function() return "UIMenuItem", "UIMenuColouredItem" end + +UIMenuProgressItem = setmetatable({}, UIMenuProgressItem) +UIMenuProgressItem.__index = UIMenuProgressItem +UIMenuProgressItem.__call = function() return "UIMenuItem", "UIMenuProgressItem" end + +UIMenuHeritageWindow = setmetatable({}, UIMenuHeritageWindow) +UIMenuHeritageWindow.__index = UIMenuHeritageWindow +UIMenuHeritageWindow.__call = function() return "UIMenuWindow", "UIMenuHeritageWindow" end + +UIMenuGridPanel = setmetatable({}, UIMenuGridPanel) +UIMenuGridPanel.__index = UIMenuGridPanel +UIMenuGridPanel.__call = function() return "UIMenuPanel", "UIMenuGridPanel" end + +UIMenuColourPanel = setmetatable({}, UIMenuColourPanel) +UIMenuColourPanel.__index = UIMenuColourPanel +UIMenuColourPanel.__call = function() return "UIMenuPanel", "UIMenuColourPanel" end + +UIMenuPercentagePanel = setmetatable({}, UIMenuPercentagePanel) +UIMenuPercentagePanel.__index = UIMenuPercentagePanel +UIMenuPercentagePanel.__call = function() return "UIMenuPanel", "UIMenuPercentagePanel" end + +UIMenu = setmetatable({}, UIMenu) +UIMenu.__index = UIMenu +UIMenu.__call = function() return "UIMenu" end + +MenuPool = setmetatable({}, MenuPool) +MenuPool.__index = MenuPool + +NativeUI = {} + +CharacterMap = { [' '] = 6, ['!'] = 6, ['"'] = 6, ['#'] = 11, ['$'] = 10, ['%'] = 17, ['&'] = 13, ['\\'] = 4, ['('] = 6, [')'] = 6, ['*'] = 7, ['+'] = 10, [','] = 4, ['-'] = 6, ['.'] = 4, ['/'] = 7, ['0'] = 12, ['1'] = 7, ['2'] = 11, ['3'] = 11, ['4'] = 11, ['5'] = 11, ['6'] = 12, ['7'] = 10, ['8'] = 11, ['9'] = 11, [':'] = 5, [';'] = 4, ['<'] = 9, ['='] = 9, ['>'] = 9, ['?'] = 10, ['@'] = 15, ['A'] = 12, ['B'] = 13, ['C'] = 14, ['D'] = 14, ['E'] = 12, ['F'] = 12, ['G'] = 15, ['H'] = 14, ['I'] = 5, ['J'] = 11, ['K'] = 13, ['L'] = 11, ['M'] = 16, ['N'] = 14, ['O'] = 16, ['P'] = 12, ['Q'] = 15, ['R'] = 13, ['S'] = 12, ['T'] = 11, ['U'] = 13, ['V'] = 12, ['W'] = 18, ['X'] = 11, ['Y'] = 11, ['Z'] = 12, ['['] = 6, [']'] = 6, ['^'] = 9, ['_'] = 18, ['`'] = 8, ['a'] = 11, ['b'] = 12, ['c'] = 11, ['d'] = 12, ['e'] = 12, ['f'] = 5, ['g'] = 13, ['h'] = 11, ['i'] = 4, ['j'] = 4, ['k'] = 10, ['l'] = 4, ['m'] = 18, ['n'] = 11, ['o'] = 12, ['p'] = 12, ['q'] = 12, ['r'] = 7, ['s'] = 9, ['t'] = 5, ['u'] = 11, ['v'] = 10, ['w'] = 14, ['x'] = 9, ['y'] = 10, ['z'] = 9, ['{'] = 6, ['|'] = 3, ['}'] = 6 } + +BadgeStyle = { None = 0, BronzeMedal = 1, GoldMedal = 2, SilverMedal = 3, Alert = 4, Crown = 5, Ammo = 6, Armour = 7, Barber = 8, Clothes = 9, Franklin = 10, Bike = 11, Car = 12, Gun = 13, Heart = 14, Makeup = 15, Mask = 16, Michael = 17, Star = 18, Tattoo = 19, Trevor = 20, Lock = 21, Tick = 22 } + +BadgeTexture = { + [0] = function() return "" end, + [1] = function() return "mp_medal_bronze" end, + [2] = function() return "mp_medal_gold" end, + [3] = function() return "medal_silver" end, + [4] = function() return "mp_alerttriangle" end, + [5] = function() return "mp_hostcrown" end, + [6] = function(Selected) if Selected then return "shop_ammo_icon_b" else return "shop_ammo_icon_a" end end, + [7] = function(Selected) if Selected then return "shop_armour_icon_b" else return "shop_armour_icon_a" end end, + [8] = function(Selected) if Selected then return "shop_barber_icon_b" else return "shop_barber_icon_a" end end, + [9] = function(Selected) if Selected then return "shop_clothing_icon_b" else return "shop_clothing_icon_a" end end, + [10] = function(Selected) if Selected then return "shop_franklin_icon_b" else return "shop_franklin_icon_a" end end, + [11] = function(Selected) if Selected then return "shop_garage_bike_icon_b" else return "shop_garage_bike_icon_a" end end, + [12] = function(Selected) if Selected then return "shop_garage_icon_b" else return "shop_garage_icon_a" end end, + [13] = function(Selected) if Selected then return "shop_gunclub_icon_b" else return "shop_gunclub_icon_a" end end, + [14] = function(Selected) if Selected then return "shop_health_icon_b" else return "shop_health_icon_a" end end, + [15] = function(Selected) if Selected then return "shop_makeup_icon_b" else return "shop_makeup_icon_a" end end, + [16] = function(Selected) if Selected then return "shop_mask_icon_b" else return "shop_mask_icon_a" end end, + [17] = function(Selected) if Selected then return "shop_michael_icon_b" else return "shop_michael_icon_a" end end, + [18] = function() return "shop_new_star" end, + [19] = function(Selected) if Selected then return "shop_tattoos_icon_b" else return "shop_tattoos_icon_a" end end, + [20] = function(Selected) if Selected then return "shop_trevor_icon_b" else return "shop_trevor_icon_a" end end, + [21] = function() return "shop_lock" end, + [22] = function() return "shop_tick_icon" end, +} + +BadgeDictionary = { + [0] = function(Selected) + if Selected then + return "commonmenu" + else + return "commonmenu" + end + end, +} + +BadgeColour = { + [5] = function(Selected) if Selected then return 0, 0, 0, 255 else return 255, 255, 255, 255 end end, + [21] = function(Selected) if Selected then return 0, 0, 0, 255 else return 255, 255, 255, 255 end end, + [22] = function(Selected) if Selected then return 0, 0, 0, 255 else return 255, 255, 255, 255 end end, +} + +Colours = { + PureWhite = { 255, 255, 255, 255 }, + White = { 240, 240, 240, 255 }, + Black = { 0, 0, 0, 255 }, + Grey = { 155, 155, 155, 255 }, + GreyLight = { 205, 205, 205, 255 }, + GreyDark = { 77, 77, 77, 255 }, + Red = { 224, 50, 50, 255 }, + RedLight = { 240, 153, 153, 255 }, + RedDark = { 112, 25, 25, 255 }, + Blue = { 93, 182, 229, 255 }, + BlueLight = { 174, 219, 242, 255 }, + BlueDark = { 47, 92, 115, 255 }, + Yellow = { 240, 200, 80, 255 }, + YellowLight = { 254, 235, 169, 255 }, + YellowDark = { 126, 107, 41, 255 }, + Orange = { 255, 133, 85, 255 }, + OrangeLight = { 255, 194, 170, 255 }, + OrangeDark = { 127, 66, 42, 255 }, + Green = { 114, 204, 114, 255 }, + GreenLight = { 185, 230, 185, 255 }, + GreenDark = { 57, 102, 57, 255 }, + Purple = { 132, 102, 226, 255 }, + PurpleLight = { 192, 179, 239, 255 }, + PurpleDark = { 67, 57, 111, 255 }, + Pink = { 203, 54, 148, 255 }, + RadarHealth = { 53, 154, 71, 255 }, + RadarArmour = { 93, 182, 229, 255 }, + RadarDamage = { 235, 36, 39, 255 }, + NetPlayer1 = { 194, 80, 80, 255 }, + NetPlayer2 = { 156, 110, 175, 255 }, + NetPlayer3 = { 255, 123, 196, 255 }, + NetPlayer4 = { 247, 159, 123, 255 }, + NetPlayer5 = { 178, 144, 132, 255 }, + NetPlayer6 = { 141, 206, 167, 255 }, + NetPlayer7 = { 113, 169, 175, 255 }, + NetPlayer8 = { 211, 209, 231, 255 }, + NetPlayer9 = { 144, 127, 153, 255 }, + NetPlayer10 = { 106, 196, 191, 255 }, + NetPlayer11 = { 214, 196, 153, 255 }, + NetPlayer12 = { 234, 142, 80, 255 }, + NetPlayer13 = { 152, 203, 234, 255 }, + NetPlayer14 = { 178, 98, 135, 255 }, + NetPlayer15 = { 144, 142, 122, 255 }, + NetPlayer16 = { 166, 117, 94, 255 }, + NetPlayer17 = { 175, 168, 168, 255 }, + NetPlayer18 = { 232, 142, 155, 255 }, + NetPlayer19 = { 187, 214, 91, 255 }, + NetPlayer20 = { 12, 123, 86, 255 }, + NetPlayer21 = { 123, 196, 255, 255 }, + NetPlayer22 = { 171, 60, 230, 255 }, + NetPlayer23 = { 206, 169, 13, 255 }, + NetPlayer24 = { 71, 99, 173, 255 }, + NetPlayer25 = { 42, 166, 185, 255 }, + NetPlayer26 = { 186, 157, 125, 255 }, + NetPlayer27 = { 201, 225, 255, 255 }, + NetPlayer28 = { 240, 240, 150, 255 }, + NetPlayer29 = { 237, 140, 161, 255 }, + NetPlayer30 = { 249, 138, 138, 255 }, + NetPlayer31 = { 252, 239, 166, 255 }, + NetPlayer32 = { 240, 240, 240, 255 }, + SimpleBlipDefault = { 159, 201, 166, 255 }, + MenuBlue = { 140, 140, 140, 255 }, + MenuGreyLight = { 140, 140, 140, 255 }, + MenuBlueExtraDark = { 40, 40, 40, 255 }, + MenuYellow = { 240, 160, 0, 255 }, + MenuYellowDark = { 240, 160, 0, 255 }, + MenuGreen = { 240, 160, 0, 255 }, + MenuGrey = { 140, 140, 140, 255 }, + MenuGreyDark = { 60, 60, 60, 255 }, + MenuHighlight = { 30, 30, 30, 255 }, + MenuStandard = { 140, 140, 140, 255 }, + MenuDimmed = { 75, 75, 75, 255 }, + MenuExtraDimmed = { 50, 50, 50, 255 }, + BriefTitle = { 95, 95, 95, 255 }, + MidGreyMp = { 100, 100, 100, 255 }, + NetPlayer1Dark = { 93, 39, 39, 255 }, + NetPlayer2Dark = { 77, 55, 89, 255 }, + NetPlayer3Dark = { 124, 62, 99, 255 }, + NetPlayer4Dark = { 120, 80, 80, 255 }, + NetPlayer5Dark = { 87, 72, 66, 255 }, + NetPlayer6Dark = { 74, 103, 83, 255 }, + NetPlayer7Dark = { 60, 85, 88, 255 }, + NetPlayer8Dark = { 105, 105, 64, 255 }, + NetPlayer9Dark = { 72, 63, 76, 255 }, + NetPlayer10Dark = { 53, 98, 95, 255 }, + NetPlayer11Dark = { 107, 98, 76, 255 }, + NetPlayer12Dark = { 117, 71, 40, 255 }, + NetPlayer13Dark = { 76, 101, 117, 255 }, + NetPlayer14Dark = { 65, 35, 47, 255 }, + NetPlayer15Dark = { 72, 71, 61, 255 }, + NetPlayer16Dark = { 85, 58, 47, 255 }, + NetPlayer17Dark = { 87, 84, 84, 255 }, + NetPlayer18Dark = { 116, 71, 77, 255 }, + NetPlayer19Dark = { 93, 107, 45, 255 }, + NetPlayer20Dark = { 6, 61, 43, 255 }, + NetPlayer21Dark = { 61, 98, 127, 255 }, + NetPlayer22Dark = { 85, 30, 115, 255 }, + NetPlayer23Dark = { 103, 84, 6, 255 }, + NetPlayer24Dark = { 35, 49, 86, 255 }, + NetPlayer25Dark = { 21, 83, 92, 255 }, + NetPlayer26Dark = { 93, 98, 62, 255 }, + NetPlayer27Dark = { 100, 112, 127, 255 }, + NetPlayer28Dark = { 120, 120, 75, 255 }, + NetPlayer29Dark = { 152, 76, 93, 255 }, + NetPlayer30Dark = { 124, 69, 69, 255 }, + NetPlayer31Dark = { 10, 43, 50, 255 }, + NetPlayer32Dark = { 95, 95, 10, 255 }, + Bronze = { 180, 130, 97, 255 }, + Silver = { 150, 153, 161, 255 }, + Gold = { 214, 181, 99, 255 }, + Platinum = { 166, 221, 190, 255 }, + Gang1 = { 29, 100, 153, 255 }, + Gang2 = { 214, 116, 15, 255 }, + Gang3 = { 135, 125, 142, 255 }, + Gang4 = { 229, 119, 185, 255 }, + SameCrew = { 252, 239, 166, 255 }, + Freemode = { 45, 110, 185, 255 }, + PauseBg = { 0, 0, 0, 255 }, + Friendly = { 93, 182, 229, 255 }, + Enemy = { 194, 80, 80, 255 }, + Location = { 240, 200, 80, 255 }, + Pickup = { 114, 204, 114, 255 }, + PauseSingleplayer = { 114, 204, 114, 255 }, + FreemodeDark = { 22, 55, 92, 255 }, + InactiveMission = { 154, 154, 154, 255 }, + Damage = { 194, 80, 80, 255 }, + PinkLight = { 252, 115, 201, 255 }, + PmMitemHighlight = { 252, 177, 49, 255 }, + ScriptVariable = { 0, 0, 0, 255 }, + Yoga = { 109, 247, 204, 255 }, + Tennis = { 241, 101, 34, 255 }, + Golf = { 214, 189, 97, 255 }, + ShootingRange = { 112, 25, 25, 255 }, + FlightSchool = { 47, 92, 115, 255 }, + NorthBlue = { 93, 182, 229, 255 }, + SocialClub = { 234, 153, 28, 255 }, + PlatformBlue = { 11, 55, 123, 255 }, + PlatformGreen = { 146, 200, 62, 255 }, + PlatformGrey = { 234, 153, 28, 255 }, + FacebookBlue = { 66, 89, 148, 255 }, + IngameBg = { 0, 0, 0, 255 }, + Darts = { 114, 204, 114, 255 }, + Waypoint = { 164, 76, 242, 255 }, + Michael = { 101, 180, 212, 255 }, + Franklin = { 171, 237, 171, 255 }, + Trevor = { 255, 163, 87, 255 }, + GolfP1 = { 240, 240, 240, 255 }, + GolfP2 = { 235, 239, 30, 255 }, + GolfP3 = { 255, 149, 14, 255 }, + GolfP4 = { 246, 60, 161, 255 }, + WaypointLight = { 210, 166, 249, 255 }, + WaypointDark = { 82, 38, 121, 255 }, + PanelLight = { 0, 0, 0, 255 }, + MichaelDark = { 72, 103, 116, 255 }, + FranklinDark = { 85, 118, 85, 255 }, + TrevorDark = { 127, 81, 43, 255 }, + ObjectiveRoute = { 240, 200, 80, 255 }, + PausemapTint = { 0, 0, 0, 255 }, + PauseDeselect = { 100, 100, 100, 255 }, + PmWeaponsPurchasable = { 45, 110, 185, 255 }, + PmWeaponsLocked = { 240, 240, 240, 255 }, + ScreenBg = { 0, 0, 0, 255 }, + Chop = { 224, 50, 50, 255 }, + PausemapTintHalf = { 0, 0, 0, 255 }, + NorthBlueOfficial = { 0, 71, 133, 255 }, + ScriptVariable2 = { 0, 0, 0, 255 }, + H = { 33, 118, 37, 255 }, + HDark = { 37, 102, 40, 255 }, + T = { 234, 153, 28, 255 }, + TDark = { 225, 140, 8, 255 }, + HShard = { 20, 40, 0, 255 }, + ControllerMichael = { 48, 255, 255, 255 }, + ControllerFranklin = { 48, 255, 0, 255 }, + ControllerTrevor = { 176, 80, 0, 255 }, + ControllerChop = { 127, 0, 0, 255 }, + VideoEditorVideo = { 53, 166, 224, 255 }, + VideoEditorAudio = { 162, 79, 157, 255 }, + VideoEditorText = { 104, 192, 141, 255 }, + HbBlue = { 29, 100, 153, 255 }, + HbYellow = { 234, 153, 28, 255 }, + VideoEditorScore = { 240, 160, 1, 255 }, + VideoEditorAudioFadeout = { 59, 34, 57, 255 }, + VideoEditorTextFadeout = { 41, 68, 53, 255 }, + VideoEditorScoreFadeout = { 82, 58, 10, 255 }, + HeistBackground = { 37, 102, 40, 255 }, + VideoEditorAmbient = { 240, 200, 80, 255 }, + VideoEditorAmbientFadeout = { 80, 70, 34, 255 }, + Gb = { 255, 133, 85, 255 }, + G = { 255, 194, 170, 255 }, + B = { 255, 133, 85, 255 }, + LowFlow = { 240, 200, 80, 255 }, + LowFlowDark = { 126, 107, 41, 255 }, + G1 = { 247, 159, 123, 255 }, + G2 = { 226, 134, 187, 255 }, + G3 = { 239, 238, 151, 255 }, + G4 = { 113, 169, 175, 255 }, + G5 = { 160, 140, 193, 255 }, + G6 = { 141, 206, 167, 255 }, + G7 = { 181, 214, 234, 255 }, + G8 = { 178, 144, 132, 255 }, + G9 = { 0, 132, 114, 255 }, + G10 = { 216, 85, 117, 255 }, + G11 = { 30, 100, 152, 255 }, + G12 = { 43, 181, 117, 255 }, + G13 = { 233, 141, 79, 255 }, + G14 = { 137, 210, 215, 255 }, + G15 = { 134, 125, 141, 255 }, + Adversary = { 109, 34, 33, 255 }, + DegenRed = { 255, 0, 0, 255 }, + DegenYellow = { 255, 255, 0, 255 }, + DegenGreen = { 0, 255, 0, 255 }, + DegenCyan = { 0, 255, 255, 255 }, + DegenBlue = { 0, 0, 255, 255 }, + DegenMagenta = { 255, 0, 255, 255 }, + Stunt1 = { 38, 136, 234, 255 }, + Stunt2 = { 224, 50, 50, 255 }, +} + +--[[ + Utils.lua + Utilities +--]] + +function GetResolution() + local W, H = GetActiveScreenResolution() + if (W / H) > 3.5 then + return GetScreenResolution() + else + return W, H + end +end + +function FormatXWYH(Value, Value2) + return Value / 1920, Value2 / 1080 +end + +function math.round(num, numDecimalPlaces) + return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)) +end + +function tobool(input) + if input == "true" or tonumber(input) == 1 or input == true then + return true + else + return false + end +end + +function string.split(inputstr, sep) + if sep == nil then + sep = "%s" + end + local t = {}; + i = 1 + for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do + t[i] = str + i = i + 1 + end + + return t +end + +function string.starts(String, Start) + return string.sub(String, 1, string.len(Start)) == Start +end + +function IsMouseInBounds(X, Y, Width, Height) + local MX, MY = math.round(GetControlNormal(0, 239) * 1920), math.round(GetControlNormal(0, 240) * 1080) + MX, MY = FormatXWYH(MX, MY) + X, Y = FormatXWYH(X, Y) + Width, Height = FormatXWYH(Width, Height) + return (MX >= X and MX <= X + Width) and (MY > Y and MY < Y + Height) +end + +function GetSafeZoneBounds() + local SafeSize = GetSafeZoneSize() + SafeSize = math.round(SafeSize, 2) + SafeSize = (SafeSize * 100) - 90 + SafeSize = 10 - SafeSize + + local W, H = 1920, 1080 + + return { X = math.round(SafeSize * ((W / H) * 5.4)), Y = math.round(SafeSize * 5.4) } +end + +function Controller() + return not IsInputDisabled(2) +end + +--[[ + UIResRectangle.lua + Elements +--]] + +function UIResRectangle.New(X, Y, Width, Height, R, G, B, A) + local _UIResRectangle = { + X = tonumber(X) or 0, + Y = tonumber(Y) or 0, + Width = tonumber(Width) or 0, + Height = tonumber(Height) or 0, + _Colour = { R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255 }, + } + return setmetatable(_UIResRectangle, UIResRectangle) +end + +function UIResRectangle:Position(X, Y) + if tonumber(X) and tonumber(Y) then + self.X = tonumber(X) + self.Y = tonumber(Y) + else + return { X = self.X, Y = self.Y } + end +end + +function UIResRectangle:Size(Width, Height) + if tonumber(Width) and tonumber(Height) then + self.Width = tonumber(Width) + self.Height = tonumber(Height) + else + return { Width = self.Width, Height = self.Height } + end +end + +function UIResRectangle:Colour(R, G, B, A) + if tonumber(R) or tonumber(G) or tonumber(B) or tonumber(A) then + self._Colour.R = tonumber(R) or 255 + self._Colour.B = tonumber(B) or 255 + self._Colour.G = tonumber(G) or 255 + self._Colour.A = tonumber(A) or 255 + else + return self._Colour + end +end + +function UIResRectangle:Draw() + local Position = self:Position() + local Size = self:Size() + Size.Width, Size.Height = FormatXWYH(Size.Width, Size.Height) + Position.X, Position.Y = FormatXWYH(Position.X, Position.Y) + DrawRect(Position.X + Size.Width * 0.5, Position.Y + Size.Height * 0.5, Size.Width, Size.Height, self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A) +end + +function DrawRectangle(X, Y, Width, Height, R, G, B, A) + X, Y, Width, Height = X or 0, Y or 0, Width or 0, Height or 0 + X, Y = FormatXWYH(X, Y) + Width, Height = FormatXWYH(Width, Height) + DrawRect(X + Width * 0.5, Y + Height * 0.5, Width, Height, tonumber(R) or 255, tonumber(G) or 255, tonumber(B) or 255, tonumber(A) or 255) +end + +--[[ + UIResText.lua + Elements +--]] + +function GetCharacterCount(str) + local characters = 0 + for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do + local a = c:byte(1, -1) + if a ~= nil then + characters = characters + 1 + end + end + return characters +end + +function GetByteCount(str) + local bytes = 0 + + for c in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do + local a, b, c, d = c:byte(1, -1) + if a ~= nil then + bytes = bytes + 1 + end + if b ~= nil then + bytes = bytes + 1 + end + if c ~= nil then + bytes = bytes + 1 + end + if d ~= nil then + bytes = bytes + 1 + end + end + return bytes +end + +function AddLongStringForAscii(str) + local maxbytelength = 99 + for i = 0, GetCharacterCount(str), 99 do + AddTextComponentSubstringPlayerName(string.sub(str, i, math.min(maxbytelength, GetCharacterCount(str) - i))) --needs changed + end +end + +function AddLongStringForUtf8(str) + local maxbytelength = 99 + local bytecount = GetByteCount(str) + + if bytecount < maxbytelength then + AddTextComponentSubstringPlayerName(str) + return + end + + local startIndex = 0 + + for i = 0, GetCharacterCount(str), 1 do + local length = i - startIndex + if GetByteCount(string.sub(str, startIndex, length)) > maxbytelength then + AddTextComponentSubstringPlayerName(string.sub(str, startIndex, length - 1)) + i = i - 1 + startIndex = startIndex + (length - 1) + end + end + AddTextComponentSubstringPlayerName(string.sub(str, startIndex, GetCharacterCount(str) - startIndex)) +end + +function AddLongString(str) + local bytecount = GetByteCount(str) + if bytecount == GetCharacterCount(str) then + AddLongStringForAscii(str) + else + AddLongStringForUtf8(str) + end +end + +function MeasureStringWidthNoConvert(str, font, scale) + BeginTextCommandWidth("STRING") + AddLongString(str) + SetTextFont(font or 0) + SetTextScale(1.0, scale or 0) + return EndTextCommandGetWidth(true) +end + +function MeasureStringWidth(str, font, scale) + return MeasureStringWidthNoConvert(str, font, scale) * 1920 +end + +function UIResText.New(Text, X, Y, Scale, R, G, B, A, Font, Alignment, DropShadow, Outline, WordWrap) + local _UIResText = { + _Text = tostring(Text) or "", + X = tonumber(X) or 0, + Y = tonumber(Y) or 0, + Scale = tonumber(Scale) or 0, + _Colour = { R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255 }, + Font = tonumber(Font) or 0, + Alignment = Alignment or nil, + DropShadow = Dropshadow or nil, + Outline = Outline or nil, + WordWrap = tonumber(WordWrap) or 0, + } + return setmetatable(_UIResText, UIResText) +end + +function UIResText:Position(X, Y) + if tonumber(X) and tonumber(Y) then + self.X = tonumber(X) + self.Y = tonumber(Y) + else + return { X = self.X, Y = self.Y } + end +end + +function UIResText:Colour(R, G, B, A) + if tonumber(R) and tonumber(G) and tonumber(B) and tonumber(A) then + self._Colour.R = tonumber(R) + self._Colour.B = tonumber(B) + self._Colour.G = tonumber(G) + self._Colour.A = tonumber(A) + else + return self._Colour + end +end + +function UIResText:Text(Text) + if tostring(Text) and Text ~= nil then + self._Text = tostring(Text) + else + return self._Text + end +end + +function UIResText:Draw() + local Position = self:Position() + Position.X, Position.Y = FormatXWYH(Position.X, Position.Y) + + SetTextFont(self.Font) + SetTextScale(1.0, self.Scale) + SetTextColour(self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A) + + if self.DropShadow then + SetTextDropShadow() + end + if self.Outline then + SetTextOutline() + end + + if self.Alignment ~= nil then + if self.Alignment == 1 or self.Alignment == "Center" or self.Alignment == "Centre" then + SetTextCentre(true) + elseif self.Alignment == 2 or self.Alignment == "Right" then + SetTextRightJustify(true) + SetTextWrap(0, Position.X) + end + end + + if tonumber(self.WordWrap) then + if tonumber(self.WordWrap) ~= 0 then + SetTextWrap(Position.X, Position.X + (tonumber(self.WordWrap) / Resolution.Width)) + end + end + + BeginTextCommandDisplayText("STRING") + AddLongString(self._Text) + EndTextCommandDisplayText(Position.X, Position.Y) +end + +function RenderText(Text, X, Y, Font, Scale, R, G, B, A, Alignment, DropShadow, Outline, WordWrap) + Text = tostring(Text) + X, Y = FormatXWYH(X, Y) + SetTextFont(Font or 0) + SetTextScale(1.0, Scale or 0) + SetTextColour(R or 255, G or 255, B or 255, A or 255) + + if DropShadow then + SetTextDropShadow() + end + if Outline then + SetTextOutline() + end + + if Alignment ~= nil then + if Alignment == 1 or Alignment == "Center" or Alignment == "Centre" then + SetTextCentre(true) + elseif Alignment == 2 or Alignment == "Right" then + SetTextRightJustify(true) + SetTextWrap(0, X) + end + end + + if tonumber(WordWrap) then + if tonumber(WordWrap) ~= 0 then + WordWrap, _ = FormatXWYH(WordWrap, 0) + SetTextWrap(WordWrap, X - WordWrap) + end + end + + BeginTextCommandDisplayText("STRING") + AddLongString(Text) + EndTextCommandDisplayText(X, Y) +end + +--[[ + Sprite.lua + Elements +--]] + +function Sprite.New(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A) + local _Sprite = { + TxtDictionary = tostring(TxtDictionary), + TxtName = tostring(TxtName), + X = tonumber(X) or 0, + Y = tonumber(Y) or 0, + Width = tonumber(Width) or 0, + Height = tonumber(Height) or 0, + Heading = tonumber(Heading) or 0, + _Colour = { R = tonumber(R) or 255, G = tonumber(G) or 255, B = tonumber(B) or 255, A = tonumber(A) or 255 }, + } + return setmetatable(_Sprite, Sprite) +end + +function Sprite:Position(X, Y) + if tonumber(X) and tonumber(Y) then + self.X = tonumber(X) + self.Y = tonumber(Y) + else + return { X = self.X, Y = self.Y } + end +end + +function Sprite:Size(Width, Height) + if tonumber(Width) and tonumber(Width) then + self.Width = tonumber(Width) + self.Height = tonumber(Height) + else + return { Width = self.Width, Height = self.Height } + end +end + +function Sprite:Colour(R, G, B, A) + if tonumber(R) or tonumber(G) or tonumber(B) or tonumber(A) then + self._Colour.R = tonumber(R) or 255 + self._Colour.B = tonumber(B) or 255 + self._Colour.G = tonumber(G) or 255 + self._Colour.A = tonumber(A) or 255 + else + return self._Colour + end +end + +function Sprite:Draw() + if not HasStreamedTextureDictLoaded(self.TxtDictionary) then + RequestStreamedTextureDict(self.TxtDictionary, true) + end + local Position = self:Position() + local Size = self:Size() + Size.Width, Size.Height = FormatXWYH(Size.Width, Size.Height) + Position.X, Position.Y = FormatXWYH(Position.X, Position.Y) + DrawSprite(self.TxtDictionary, self.TxtName, Position.X + Size.Width * 0.5, Position.Y + Size.Height * 0.5, Size.Width, Size.Height, self.Heading, self._Colour.R, self._Colour.G, self._Colour.B, self._Colour.A) +end + +function DrawTexture(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A) + if not HasStreamedTextureDictLoaded(tostring(TxtDictionary) or "") then + RequestStreamedTextureDict(tostring(TxtDictionary) or "", true) + end + X, Y, Width, Height = X or 0, Y or 0, Width or 0, Height or 0 + X, Y = FormatXWYH(X, Y) + Width, Height = FormatXWYH(Width, Height) + DrawSprite(tostring(TxtDictionary) or "", tostring(TxtName) or "", X + Width * 0.5, Y + Height * 0.5, Width, Height, tonumber(Heading) or 0, tonumber(R) or 255, tonumber(G) or 255, tonumber(B) or 255, tonumber(A) or 255) +end + +--[[ + StringMeasurer.lua + Elements +--]] + +function MeasureString(str) + local output = 0 + for i = 1, GetCharacterCount(str), 1 do + if CharacterMap[string.sub(str, i, i)] then + output = output + CharacterMap[string.sub(str, i, i)] + 1 + end + end + return output +end + +--[[ + Badge.lua + Elements +--]] + +function GetBadgeTexture(Badge, Selected) + if BadgeTexture[Badge] then + return BadgeTexture[Badge](Selected) + else + return "" + end +end + +function GetBadgeDictionary(Badge, Selected) + if BadgeDictionary[Badge] then + return BadgeDictionary[Badge](Selected) + else + return "commonmenu" + end +end + +function GetBadgeColour(Badge, Selected) + if BadgeColour[Badge] then + return BadgeColour[Badge](Selected) + else + return 255, 255, 255, 255 + end +end + +--[[ + Colours.lua + Elements +--]] + +--[[ + UIMenuItem.lua + Items +--]] + +function UIMenuItem.New(Text, Description) + _UIMenuItem = { + Rectangle = UIResRectangle.New(0, 0, 431, 38, 255, 255, 255, 20), + Text = UIResText.New(tostring(Text) or "", 8, 0, 0.33, 245, 245, 245, 255, 0), + _Description = tostring(Description) or ""; + SelectedSprite = Sprite.New("commonmenu", "gradient_nav", 0, 0, 431, 38), + LeftBadge = { Sprite = Sprite.New("commonmenu", "", 0, 0, 40, 40), Badge = 0 }, + RightBadge = { Sprite = Sprite.New("commonmenu", "", 0, 0, 40, 40), Badge = 0 }, + Label = { + Text = UIResText.New("", 0, 0, 0.35, 245, 245, 245, 255, 0, "Right"), + MainColour = { R = 255, G = 255, B = 255, A = 255 }, + HighlightColour = { R = 0, G = 0, B = 0, A = 255 }, + }, + _Selected = false, + _Hovered = false, + _Enabled = true, + _Offset = { X = 0, Y = 0 }, + ParentMenu = nil, + Panels = {}, + Activated = function(menu, item, panels) end, + ActivatedPanel = function(menu, item, panel, panelvalue) end, + } + return setmetatable(_UIMenuItem, UIMenuItem) +end + +function UIMenuItem:SetParentMenu(Menu) + if Menu ~= nil and Menu() == "UIMenu" then + self.ParentMenu = Menu + else + return self.ParentMenu + end +end + +function UIMenuItem:Selected(bool) + if bool ~= nil then + self._Selected = tobool(bool) + else + return self._Selected + end +end + +function UIMenuItem:Hovered(bool) + if bool ~= nil then + self._Hovered = tobool(bool) + else + return self._Hovered + end +end + +function UIMenuItem:Enabled(bool) + if bool ~= nil then + self._Enabled = tobool(bool) + else + return self._Enabled + end +end + +function UIMenuItem:Description(str) + if tostring(str) and str ~= nil then + self._Description = tostring(str) + else + return self._Description + end +end + +function UIMenuItem:Offset(X, Y) + if tonumber(X) or tonumber(Y) then + if tonumber(X) then + self._Offset.X = tonumber(X) + end + if tonumber(Y) then + self._Offset.Y = tonumber(Y) + end + else + return self._Offset + end +end + +function UIMenuItem:Position(Y) + if tonumber(Y) then + self.Rectangle:Position(self._Offset.X, Y + 144 + self._Offset.Y) + self.SelectedSprite:Position(0 + self._Offset.X, Y + 144 + self._Offset.Y) + self.Text:Position(8 + self._Offset.X, Y + 147 + self._Offset.Y) + self.LeftBadge.Sprite:Position(0 + self._Offset.X, Y + 142 + self._Offset.Y) + self.RightBadge.Sprite:Position(385 + self._Offset.X, Y + 142 + self._Offset.Y) + self.Label.Text:Position(420 + self._Offset.X, Y + 148 + self._Offset.Y) + end +end + +function UIMenuItem:RightLabel(Text, MainColour, HighlightColour) + if tostring(Text) and Text ~= nil then + if type(MainColour) == "table" then + self.Label.MainColour = MainColour + end + if type(HighlightColour) == "table" then + self.Label.HighlightColour = HighlightColour + end + self.Label.Text:Text(tostring(Text)) + else + return self.Label.Text:Text() + end +end + +function UIMenuItem:SetLeftBadge(Badge) + if tonumber(Badge) then + self.LeftBadge.Badge = tonumber(Badge) + end +end + +function UIMenuItem:SetRightBadge(Badge) + if tonumber(Badge) then + self.RightBadge.Badge = tonumber(Badge) + end +end + +function UIMenuItem:Text(Text) + if tostring(Text) and Text ~= nil then + self.Text:Text(tostring(Text)) + else + return self.Text:Text() + end +end + +function UIMenuItem:AddPanel(Panel) + if Panel() == "UIMenuPanel" then + table.insert(self.Panels, Panel) + Panel:SetParentItem(self) + end +end + +function UIMenuItem:RemovePanelAt(Index) + if tonumber(Index) then + if self.Panels[Index] then + table.remove(self.Panels, tonumber(Index)) + end + end +end + +function UIMenuItem:FindPanelIndex(Panel) + if Panel() == "UIMenuPanel" then + for Index = 1, #self.Panels do + if self.Panels[Index] == Panel then + return Index + end + end + end + return nil +end + +function UIMenuItem:FindPanelItem() + for Index = #self.Items, 1, -1 do + if self.Items[Index].Panel then + return Index + end + end + return nil +end + +function UIMenuItem:Draw() + self.Rectangle:Size(431 + self.ParentMenu.WidthOffset, self.Rectangle.Height) + self.SelectedSprite:Size(431 + self.ParentMenu.WidthOffset, self.SelectedSprite.Height) + + if self._Hovered and not self._Selected then + self.Rectangle:Draw() + end + + if self._Selected then + self.SelectedSprite:Draw() + end + + if self._Enabled then + if self._Selected then + self.Text:Colour(0, 0, 0, 255) + self.Label.Text:Colour(self.Label.HighlightColour.R, self.Label.HighlightColour.G, self.Label.HighlightColour.B, self.Label.HighlightColour.A) + else + self.Text:Colour(245, 245, 245, 255) + self.Label.Text:Colour(self.Label.MainColour.R, self.Label.MainColour.G, self.Label.MainColour.B, self.Label.MainColour.A) + end + else + self.Text:Colour(163, 159, 148, 255) + self.Label.Text:Colour(163, 159, 148, 255) + end + + if self.LeftBadge.Badge == BadgeStyle.None then + self.Text:Position(8 + self._Offset.X, self.Text.Y) + else + self.Text:Position(35 + self._Offset.X, self.Text.Y) + self.LeftBadge.Sprite.TxtDictionary = GetBadgeDictionary(self.LeftBadge.Badge, self._Selected) + self.LeftBadge.Sprite.TxtName = GetBadgeTexture(self.LeftBadge.Badge, self._Selected) + self.LeftBadge.Sprite:Colour(GetBadgeColour(self.LeftBadge.Badge, self._Selected)) + self.LeftBadge.Sprite:Draw() + end + + if self.RightBadge.Badge ~= BadgeStyle.None then + self.RightBadge.Sprite:Position(385 + self._Offset.X + self.ParentMenu.WidthOffset, self.RightBadge.Sprite.Y) + self.RightBadge.Sprite.TxtDictionary = GetBadgeDictionary(self.RightBadge.Badge, self._Selected) + self.RightBadge.Sprite.TxtName = GetBadgeTexture(self.RightBadge.Badge, self._Selected) + self.RightBadge.Sprite:Colour(GetBadgeColour(self.RightBadge.Badge, self._Selected)) + self.RightBadge.Sprite:Draw() + end + + if self.Label.Text:Text() ~= "" and string.len(self.Label.Text:Text()) > 0 then + self.Label.Text:Position(420 + self._Offset.X + self.ParentMenu.WidthOffset, self.Label.Text.Y) + self.Label.Text:Draw() + end + + self.Text:Draw() +end + +--[[ + UIMenuCheckboxItem.lua + Items +--]] + +function UIMenuCheckboxItem.New(Text, Check, Description) + local _UIMenuCheckboxItem = { + Base = UIMenuItem.New(Text or "", Description or ""), + CheckedSprite = Sprite.New("commonmenu", "shop_box_blank", 410, 95, 50, 50), + Checked = tobool(Check), + CheckboxEvent = function(menu, item, checked) end, + } + return setmetatable(_UIMenuCheckboxItem, UIMenuCheckboxItem) +end + +function UIMenuCheckboxItem:SetParentMenu(Menu) + if Menu() == "UIMenu" then + self.Base.ParentMenu = Menu + else + return self.Base.ParentMenu + end +end + +function UIMenuCheckboxItem:Position(Y) + if tonumber(Y) then + self.Base:Position(Y) + self.CheckedSprite:Position(380 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 138 + self.Base._Offset.Y) + end +end + +function UIMenuCheckboxItem:Selected(bool) + if bool ~= nil then + self.Base._Selected = tobool(bool) + else + return self.Base._Selected + end +end + +function UIMenuCheckboxItem:Hovered(bool) + if bool ~= nil then + self.Base._Hovered = tobool(bool) + else + return self.Base._Hovered + end +end + +function UIMenuCheckboxItem:Enabled(bool) + if bool ~= nil then + self.Base._Enabled = tobool(bool) + else + return self.Base._Enabled + end +end + +function UIMenuCheckboxItem:Description(str) + if tostring(str) and str ~= nil then + self.Base._Description = tostring(str) + else + return self.Base._Description + end +end + +function UIMenuCheckboxItem:Offset(X, Y) + if tonumber(X) or tonumber(Y) then + if tonumber(X) then + self.Base._Offset.X = tonumber(X) + end + if tonumber(Y) then + self.Base._Offset.Y = tonumber(Y) + end + else + return self.Base._Offset + end +end + +function UIMenuCheckboxItem:Text(Text) + if tostring(Text) and Text ~= nil then + self.Base.Text:Text(tostring(Text)) + else + return self.Base.Text:Text() + end +end + +function UIMenuCheckboxItem:SetLeftBadge() + error("This item does not support badges") +end + +function UIMenuCheckboxItem:SetRightBadge() + error("This item does not support badges") +end + +function UIMenuCheckboxItem:RightLabel() + error("This item does not support a right label") +end + +function UIMenuCheckboxItem:Draw() + self.Base:Draw() + self.CheckedSprite:Position(380 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.CheckedSprite.Y) + if self.Base:Selected() then + if self.Checked then + self.CheckedSprite.TxtName = "shop_box_tickb" + else + self.CheckedSprite.TxtName = "shop_box_blankb" + end + else + if self.Checked then + self.CheckedSprite.TxtName = "shop_box_tick" + else + self.CheckedSprite.TxtName = "shop_box_blank" + end + end + self.CheckedSprite:Draw() +end + +--[[ + UIMenuListItem.lua + Items +--]] + +function UIMenuListItem.New(Text, Items, Index, Description) + if type(Items) ~= "table" then Items = {} end + if Index == 0 then Index = 1 end + local _UIMenuListItem = { + Base = UIMenuItem.New(Text or "", Description or ""), + Items = Items, + LeftArrow = Sprite.New("commonmenu", "arrowleft", 110, 105, 30, 30), + RightArrow = Sprite.New("commonmenu", "arrowright", 280, 105, 30, 30), + ItemText = UIResText.New("", 290, 104, 0.35, 255, 255, 255, 255, 0, "Right"), + _Index = tonumber(Index) or 1, + Panels = {}, + OnListChanged = function(menu, item, newindex) end, + OnListSelected = function(menu, item, newindex) end, + } + return setmetatable(_UIMenuListItem, UIMenuListItem) +end + +function UIMenuListItem:SetParentMenu(Menu) + if Menu ~= nil and Menu() == "UIMenu" then + self.Base.ParentMenu = Menu + else + return self.Base.ParentMenu + end +end + +function UIMenuListItem:Position(Y) + if tonumber(Y) then + self.LeftArrow:Position(300 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y) + self.RightArrow:Position(400 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y) + self.ItemText:Position(300 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 147 + Y + self.Base._Offset.Y) + self.Base:Position(Y) + end +end + +function UIMenuListItem:Selected(bool) + if bool ~= nil then + self.Base._Selected = tobool(bool) + else + return self.Base._Selected + end +end + +function UIMenuListItem:Hovered(bool) + if bool ~= nil then + self.Base._Hovered = tobool(bool) + else + return self.Base._Hovered + end +end + +function UIMenuListItem:Enabled(bool) + if bool ~= nil then + self.Base._Enabled = tobool(bool) + else + return self.Base._Enabled + end +end + +function UIMenuListItem:Description(str) + if tostring(str) and str ~= nil then + self.Base._Description = tostring(str) + else + return self.Base._Description + end +end + +function UIMenuListItem:Offset(X, Y) + if tonumber(X) or tonumber(Y) then + if tonumber(X) then + self.Base._Offset.X = tonumber(X) + end + if tonumber(Y) then + self.Base._Offset.Y = tonumber(Y) + end + else + return self.Base._Offset + end +end + +function UIMenuListItem:Text(Text) + if tostring(Text) and Text ~= nil then + self.Base.Text:Text(tostring(Text)) + else + return self.Base.Text:Text() + end +end + +function UIMenuListItem:Index(Index) + if tonumber(Index) then + if tonumber(Index) > #self.Items then + self._Index = 1 + elseif tonumber(Index) < 1 then + self._Index = #self.Items + else + self._Index = tonumber(Index) + end + else + return self._Index + end +end + +function UIMenuListItem:ItemToIndex(Item) + for i = 1, #self.Items do + if type(Item) == type(self.Items[i]) and Item == self.Items[i] then + return i + elseif type(self.Items[i]) == "table" and (type(Item) == type(self.Items[i].Name) or type(Item) == type(self.Items[i].Value)) and (Item == self.Items[i].Name or Item == self.Items[i].Value) then + return i + end + end +end + +function UIMenuListItem:IndexToItem(Index) + if tonumber(Index) then + if tonumber(Index) == 0 then Index = 1 end + if self.Items[tonumber(Index)] then + return self.Items[tonumber(Index)] + end + end +end + +function UIMenuListItem:SetLeftBadge() + error("This item does not support badges") +end + +function UIMenuListItem:SetRightBadge() + error("This item does not support badges") +end + +function UIMenuListItem:RightLabel() + error("This item does not support a right label") +end + +function UIMenuListItem:AddPanel(Panel) + if Panel() == "UIMenuPanel" then + table.insert(self.Panels, Panel) + Panel:SetParentItem(self) + end +end + +function UIMenuListItem:RemovePanelAt(Index) + if tonumber(Index) then + if self.Panels[Index] then + table.remove(self.Panels, tonumber(Index)) + end + end +end + +function UIMenuListItem:FindPanelIndex(Panel) + if Panel() == "UIMenuPanel" then + for Index = 1, #self.Panels do + if self.Panels[Index] == Panel then + return Index + end + end + end + return nil +end + +function UIMenuListItem:FindPanelItem() + for Index = #self.Items, 1, -1 do + if self.Items[Index].Panel then + return Index + end + end + return nil +end + +function UIMenuListItem:Draw() + self.Base:Draw() + + if self:Enabled() then + if self:Selected() then + self.ItemText:Colour(0, 0, 0, 255) + self.LeftArrow:Colour(0, 0, 0, 255) + self.RightArrow:Colour(0, 0, 0, 255) + else + self.ItemText:Colour(245, 245, 245, 255) + self.LeftArrow:Colour(245, 245, 245, 255) + self.RightArrow:Colour(245, 245, 245, 255) + end + else + self.ItemText:Colour(163, 159, 148, 255) + self.LeftArrow:Colour(163, 159, 148, 255) + self.RightArrow:Colour(163, 159, 148, 255) + end + + local Text = (type(self.Items[self._Index]) == "table") and tostring(self.Items[self._Index].Name) or tostring(self.Items[self._Index]) + local Offset = MeasureStringWidth(Text, 0, 0.35) + + self.ItemText:Text(Text) + self.LeftArrow:Position(378 - Offset + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.LeftArrow.Y) + + if self:Selected() then + self.LeftArrow:Draw() + self.RightArrow:Draw() + self.ItemText:Position(403 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.ItemText.Y) + else + self.ItemText:Position(418 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, self.ItemText.Y) + end + + self.ItemText:Draw() +end + +--[[ + UIMenuSliderItem.lua + Items +--]] + +function UIMenuSliderItem.New(Text, Items, Index, Description, Divider) + if type(Items) ~= "table" then Items = {} end + if Index == 0 then Index = 1 end + local _UIMenuSliderItem = { + Base = UIMenuItem.New(Text or "", Description or ""), + Items = Items, + ShowDivider = tobool(Divider), + LeftArrow = Sprite.New("commonmenutu", "arrowleft", 0, 105, 15, 15), + RightArrow = Sprite.New("commonmenutu", "arrowright", 0, 105, 15, 15), + Background = UIResRectangle.New(0, 0, 150, 9, 4, 32, 57, 255), + Slider = UIResRectangle.New(0, 0, 75, 9, 57, 116, 200, 255), + Divider = UIResRectangle.New(0, 0, 2.5, 20, 245, 245, 245, 255), + _Index = tonumber(Index) or 1, + OnSliderChanged = function(menu, item, newindex) end, + OnSliderSelected = function(menu, item, newindex) end, + } + return setmetatable(_UIMenuSliderItem, UIMenuSliderItem) +end + +function UIMenuSliderItem:SetParentMenu(Menu) + if Menu() == "UIMenu" then + self.Base.ParentMenu = Menu + else + return self.Base.ParentMenu + end +end + +function UIMenuSliderItem:Position(Y) + if tonumber(Y) then + self.Background:Position(250 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 158.5 + self.Base._Offset.Y) + self.Slider:Position(250 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 158.5 + self.Base._Offset.Y) + self.Divider:Position(323.5 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, Y + 153 + self.Base._Offset.Y) + self.LeftArrow:Position(235 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 155.5 + Y + self.Base._Offset.Y) + self.RightArrow:Position(400 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 155.5 + Y + self.Base._Offset.Y) + self.Base:Position(Y) + end +end + +function UIMenuSliderItem:Selected(bool) + if bool ~= nil then + self.Base._Selected = tobool(bool) + else + return self.Base._Selected + end +end + +function UIMenuSliderItem:Hovered(bool) + if bool ~= nil then + self.Base._Hovered = tobool(bool) + else + return self.Base._Hovered + end +end + +function UIMenuSliderItem:Enabled(bool) + if bool ~= nil then + self.Base._Enabled = tobool(bool) + else + return self.Base._Enabled + end +end + +function UIMenuSliderItem:Description(str) + if tostring(str) and str ~= nil then + self.Base._Description = tostring(str) + else + return self.Base._Description + end +end + +function UIMenuSliderItem:Offset(X, Y) + if tonumber(X) or tonumber(Y) then + if tonumber(X) then + self.Base._Offset.X = tonumber(X) + end + if tonumber(Y) then + self.Base._Offset.Y = tonumber(Y) + end + else + return self.Base._Offset + end +end + +function UIMenuSliderItem:Text(Text) + if tostring(Text) and Text ~= nil then + self.Base.Text:Text(tostring(Text)) + else + return self.Base.Text:Text() + end +end + +function UIMenuSliderItem:Index(Index) + if tonumber(Index) then + if tonumber(Index) > #self.Items then + self._Index = 1 + elseif tonumber(Index) < 1 then + self._Index = #self.Items + else + self._Index = tonumber(Index) + end + else + return self._Index + end +end + +function UIMenuSliderItem:ItemToIndex(Item) + for i = 1, #self.Items do + if type(Item) == type(self.Items[i]) and Item == self.Items[i] then + return i + end + end +end + +function UIMenuSliderItem:IndexToItem(Index) + if tonumber(Index) then + if tonumber(Index) == 0 then Index = 1 end + if self.Items[tonumber(Index)] then + return self.Items[tonumber(Index)] + end + end +end + +function UIMenuSliderItem:SetLeftBadge() + error("This item does not support badges") +end + +function UIMenuSliderItem:SetRightBadge() + error("This item does not support badges") +end + +function UIMenuSliderItem:RightLabel() + error("This item does not support a right label") +end + +function UIMenuSliderItem:Draw() + self.Base:Draw() + + if self:Enabled() then + if self:Selected() then + self.LeftArrow:Colour(0, 0, 0, 255) + self.RightArrow:Colour(0, 0, 0, 255) + else + self.LeftArrow:Colour(245, 245, 245, 255) + self.RightArrow:Colour(245, 245, 245, 255) + end + else + self.LeftArrow:Colour(163, 159, 148, 255) + self.RightArrow:Colour(163, 159, 148, 255) + end + + local Offset = ((self.Background.Width - self.Slider.Width) / (#self.Items - 1)) * (self._Index - 1) + + self.Slider:Position(250 + self.Base._Offset.X + Offset + self.Base.ParentMenu.WidthOffset, self.Slider.Y) + + if self:Selected() then + self.LeftArrow:Draw() + self.RightArrow:Draw() + end + + self.Background:Draw() + self.Slider:Draw() + if self.ShowDivider then + self.Divider:Draw() + end +end + +--[[ + UIMenuColouredItem.lua + Items +--]] + +function UIMenuColouredItem.New(Text, Description, MainColour, HighlightColour) + if type(Colour) ~= "table" then Colour = { R = 0, G = 0, B = 0, A = 255 } end + if type(HighlightColour) ~= "table" then Colour = { R = 255, G = 255, B = 255, A = 255 } end + local _UIMenuColouredItem = { + Base = UIMenuItem.New(Text or "", Description or ""), + Rectangle = UIResRectangle.New(0, 0, 431, 38, MainColour.R, MainColour.G, MainColour.B, MainColour.A), + MainColour = MainColour, + HighlightColour = HighlightColour, + Activated = function(menu, item) end, + } + _UIMenuColouredItem.Base.SelectedSprite:Colour(HighlightColour.R, HighlightColour.G, HighlightColour.B, HighlightColour.A) + return setmetatable(_UIMenuColouredItem, UIMenuColouredItem) +end + +function UIMenuColouredItem:SetParentMenu(Menu) + if Menu() == "UIMenu" then + self.Base.ParentMenu = Menu + else + return self.Base.ParentMenu + end +end + +function UIMenuColouredItem:Position(Y) + if tonumber(Y) then + self.Base:Position(Y) + self.Rectangle:Position(self.Base._Offset.X, Y + 144 + self.Base._Offset.Y) + end +end + +function UIMenuColouredItem:Selected(bool) + if bool ~= nil then + self.Base._Selected = tobool(bool) + else + return self.Base._Selected + end +end + +function UIMenuColouredItem:Hovered(bool) + if bool ~= nil then + self.Base._Hovered = tobool(bool) + else + return self.Base._Hovered + end +end + +function UIMenuColouredItem:Enabled(bool) + if bool ~= nil then + self.Base._Enabled = tobool(bool) + else + return self.Base._Enabled + end +end + +function UIMenuColouredItem:Description(str) + if tostring(str) and str ~= nil then + self.Base._Description = tostring(str) + else + return self.Base._Description + end +end + +function UIMenuColouredItem:Offset(X, Y) + if tonumber(X) or tonumber(Y) then + if tonumber(X) then + self.Base._Offset.X = tonumber(X) + end + if tonumber(Y) then + self.Base._Offset.Y = tonumber(Y) + end + else + return self.Base._Offset + end +end + +function UIMenuColouredItem:Text(Text) + if tostring(Text) and Text ~= nil then + self.Base.Text:Text(tostring(Text)) + else + return self.Base.Text:Text() + end +end + +function UIMenuColouredItem:RightLabel(Text, MainColour, HighlightColour) + if tostring(Text) and Text ~= nil then + if type(MainColour) == "table" then + self.Base.Label.MainColour = MainColour + end + if type(HighlightColour) == "table" then + self.Base.Label.HighlightColour = HighlightColour + end + self.Base.Label.Text:Text(tostring(Text)) + else + return self.Base.Label.Text:Text() + end +end + +function UIMenuColouredItem:SetLeftBadge(Badge) + if tonumber(Badge) then + self.Base.LeftBadge.Badge = tonumber(Badge) + end +end + +function UIMenuColouredItem:SetRightBadge(Badge) + if tonumber(Badge) then + self.Base.RightBadge.Badge = tonumber(Badge) + end +end + +function UIMenuColouredItem:Draw() + self.Rectangle:Size(431 + self.ParentMenu.WidthOffset, self.Rectangle.Height) + self.Rectangle:Draw() + self.Base:Draw() +end + +--[[ + UIMenuProgressItem.lua + Items +--]] + +function UIMenuProgressItem.New(Text, Items, Index, Description, Counter) + if type(Items) ~= "table" then Items = {} end + if Index == 0 then Index = 1 end + local _UIMenuProgressItem = { + Base = UIMenuItem.New(Text or "", Description or ""), + Data = { + Items = Items, + Counter = tobool(Counter), + Max = 407.5, + Index = tonumber(Index) or 1, + }, + Background = UIResRectangle.New(0, 0, 415, 20), + Bar = UIResRectangle.New(0, 0, 407.5, 12.5), + OnProgressChanged = function(menu, item, newindex) end, + OnProgressSelected = function(menu, item, newindex) end, + } + + _UIMenuProgressItem.Base.Rectangle.Height = 60 + _UIMenuProgressItem.Base.SelectedSprite.Height = 60 + + if _UIMenuProgressItem.Data.Counter then + _UIMenuProgressItem.Base:RightLabel(_UIMenuProgressItem.Data.Index .. "/" .. #_UIMenuProgressItem.Data.Items) + else + _UIMenuProgressItem.Base:RightLabel((type(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index]) == "table") and tostring(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index].Name) or tostring(_UIMenuProgressItem.Data.Items[_UIMenuProgressItem.Data.Index])) + end + + _UIMenuProgressItem.Bar.Width = _UIMenuProgressItem.Data.Index / #_UIMenuProgressItem.Data.Items * _UIMenuProgressItem.Data.Max + + return setmetatable(_UIMenuProgressItem, UIMenuProgressItem) +end + +function UIMenuProgressItem:SetParentMenu(Menu) + if Menu() == "UIMenu" then + self.Base.ParentMenu = Menu + else + return self.Base.ParentMenu + end +end + +function UIMenuProgressItem:Position(Y) + if tonumber(Y) then + self.Base:Position(Y) + self.Background:Position(8 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 177 + Y + self.Base._Offset.Y) + self.Bar:Position(11.75 + self.Base._Offset.X + self.Base.ParentMenu.WidthOffset, 180.75 + Y + self.Base._Offset.Y) + end +end + +function UIMenuProgressItem:Selected(bool) + if bool ~= nil then + self.Base._Selected = tobool(bool) + else + return self.Base._Selected + end +end + +function UIMenuProgressItem:Hovered(bool) + if bool ~= nil then + self.Base._Hovered = tobool(bool) + else + return self.Base._Hovered + end +end + +function UIMenuProgressItem:Enabled(bool) + if bool ~= nil then + self.Base._Enabled = tobool(bool) + else + return self.Base._Enabled + end +end + +function UIMenuProgressItem:Description(str) + if tostring(str) and str ~= nil then + self.Base._Description = tostring(str) + else + return self.Base._Description + end +end + +function UIMenuProgressItem:Offset(X, Y) + if tonumber(X) or tonumber(Y) then + if tonumber(X) then + self.Base._Offset.X = tonumber(X) + end + if tonumber(Y) then + self.Base._Offset.Y = tonumber(Y) + end + else + return self.Base._Offset + end +end + +function UIMenuProgressItem:Text(Text) + if tostring(Text) and Text ~= nil then + self.Base.Text:Text(tostring(Text)) + else + return self.Base.Text:Text() + end +end + +function UIMenuProgressItem:Index(Index) + if tonumber(Index) then + if tonumber(Index) > #self.Data.Items then + self.Data.Index = 1 + elseif tonumber(Index) < 1 then + self.Data.Index = #self.Data.Items + else + self.Data.Index = tonumber(Index) + end + + if self.Data.Counter then + self.Base:RightLabel(self.Data.Index .. "/" .. #self.Data.Items) + else + self.Base:RightLabel((type(self.Data.Items[self.Data.Index]) == "table") and tostring(self.Data.Items[self.Data.Index].Name) or tostring(self.Data.Items[self.Data.Index])) + end + + self.Bar.Width = self.Data.Index / #self.Data.Items * self.Data.Max + else + return self.Data.Index + end +end + +function UIMenuProgressItem:ItemToIndex(Item) + for i = 1, #self.Data.Items do + if type(Item) == type(self.Data.Items[i]) and Item == self.Data.Items[i] then + return i + elseif type(self.Data.Items[i]) == "table" and (type(Item) == type(self.Data.Items[i].Name) or type(Item) == type(self.Data.Items[i].Value)) and (Item == self.Data.Items[i].Name or Item == self.Data.Items[i].Value) then + return i + end + end +end + +function UIMenuProgressItem:IndexToItem(Index) + if tonumber(Index) then + if tonumber(Index) == 0 then Index = 1 end + if self.Data.Items[tonumber(Index)] then + return self.Data.Items[tonumber(Index)] + end + end +end + +function UIMenuProgressItem:SetLeftBadge() + error("This item does not support badges") +end + +function UIMenuProgressItem:SetRightBadge() + error("This item does not support badges") +end + +function UIMenuProgressItem:RightLabel() + error("This item does not support a right label") +end + +function UIMenuProgressItem:CalculateProgress(CursorX) + local Progress = CursorX - self.Bar.X + self:Index(math.round(#self.Data.Items * (((Progress >= 0 and Progress <= self.Data.Max) and Progress or ((Progress < 0) and 0 or self.Data.Max)) / self.Data.Max))) +end + +function UIMenuProgressItem:Draw() + self.Base:Draw() + + if self.Base._Selected then + self.Background:Colour(table.unpack(Colours.Black)) + self.Bar:Colour(table.unpack(Colours.White)) + else + self.Background:Colour(table.unpack(Colours.White)) + self.Bar:Colour(table.unpack(Colours.Black)) + end + + self.Background:Draw() + self.Bar:Draw() +end + +--[[ + UIMenuHeritageWindow.lua + Windows +--]] + +function UIMenuHeritageWindow.New(Mum, Dad) + if not tonumber(Mum) then Mum = 0 end + if not (Mum >= 0 and Mum <= 21) then Mum = 0 end + if not tonumber(Dad) then Dad = 0 end + if not (Dad >= 0 and Dad <= 23) then Dad = 0 end + _UIMenuHeritageWindow = { + Background = Sprite.New("pause_menu_pages_char_mom_dad", "mumdadbg", 0, 0, 431, 228), -- Background is required, must be a sprite or a rectangle. + MumSprite = Sprite.New("char_creator_portraits", ((Mum < 21) and "female_" .. Mum or "special_female_" .. (tonumber(string.sub(Mum, 2, 2)) - 1)), 0, 0, 228, 228), + DadSprite = Sprite.New("char_creator_portraits", ((Dad < 21) and "male_" .. Dad or "special_male_" .. (tonumber(string.sub(Dad, 2, 2)) - 1)), 0, 0, 228, 228), + Mum = Mum, + Dad = Dad, + _Offset = { X = 0, Y = 0 }, -- required + ParentMenu = nil, -- required + } + return setmetatable(_UIMenuHeritageWindow, UIMenuHeritageWindow) +end + +function UIMenuHeritageWindow:SetParentMenu(Menu) -- required + if Menu() == "UIMenu" then + self.ParentMenu = Menu + else + return self.ParentMenu + end +end + +function UIMenuHeritageWindow:Offset(X, Y) -- required + if tonumber(X) or tonumber(Y) then + if tonumber(X) then + self._Offset.X = tonumber(X) + end + if tonumber(Y) then + self._Offset.Y = tonumber(Y) + end + else + return self._Offset + end +end + +function UIMenuHeritageWindow:Position(Y) -- required + if tonumber(Y) then + self.Background:Position(self._Offset.X, 144 + Y + self._Offset.Y) + self.MumSprite:Position(self._Offset.X + (self.ParentMenu.WidthOffset / 2) + 25, 144 + Y + self._Offset.Y) + self.DadSprite:Position(self._Offset.X + (self.ParentMenu.WidthOffset / 2) + 195, 144 + Y + self._Offset.Y) + end +end + +function UIMenuHeritageWindow:Index(Mum, Dad) + if not tonumber(Mum) then Mum = self.Mum end + if not (Mum >= 0 and Mum <= 21) then Mum = self.Mum end + if not tonumber(Dad) then Dad = self.Dad end + if not (Dad >= 0 and Dad <= 23) then Dad = self.Dad end + + self.Mum = Mum + self.Dad = Dad + + self.MumSprite.TxtName = ((self.Mum < 21) and "female_" .. self.Mum or "special_female_" .. (tonumber(string.sub(Mum, 2, 2)) - 1)) + self.DadSprite.TxtName = ((self.Dad < 21) and "male_" .. self.Dad or "special_male_" .. (tonumber(string.sub(Dad, 2, 2)) - 1)) +end + +function UIMenuHeritageWindow:Draw() -- required + self.Background:Size(431 + self.ParentMenu.WidthOffset, 228) + self.Background:Draw() + self.DadSprite:Draw() + self.MumSprite:Draw() +end + +--[[ + UIMenuGridPanel.lua + Panels +--]] + +UIMenuGridPanel = setmetatable({}, UIMenuGridPanel) +UIMenuGridPanel.__index = UIMenuGridPanel +UIMenuGridPanel.__call = function() return "UIMenuPanel", "UIMenuGridPanel" end + +function UIMenuGridPanel.New(TopText, LeftText, RightText, BottomText) + _UIMenuGridPanel = { + Data = { + Enabled = true, + }, + Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 275), + Grid = Sprite.New("pause_menu_pages_char_mom_dad", "nose_grid", 0, 0, 200, 200, 0), + Circle = Sprite.New("mpinventory", "in_world_circle", 0, 0, 20, 20, 0), + Audio = { Slider = "CONTINUOUS_SLIDER", Library = "HUD_FRONTEND_DEFAULT_SOUNDSET", Id = nil }, + ParentItem = nil, + Text = { + Top = UIResText.New(TopText or "Top", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + Left = UIResText.New(LeftText or "Left", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + Right = UIResText.New(RightText or "Right", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + Bottom = UIResText.New(BottomText or "Bottom", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + }, + } + return setmetatable(_UIMenuGridPanel, UIMenuGridPanel) +end + +function UIMenuGridPanel:SetParentItem(Item) -- required + if Item() == "UIMenuItem" then + self.ParentItem = Item + else + return self.ParentItem + end +end + +function UIMenuGridPanel:Enabled(Enabled) + if type(Enabled) == "boolean" then + self.Data.Enabled = Enabled + else + return self.Data.Enabled + end +end + +function UIMenuGridPanel:CirclePosition(X, Y) + if tonumber(X) and tonumber(Y) then + self.Circle.X = (self.Grid.X + 20) + ((self.Grid.Width - 40) * ((X >= 0.0 and X <= 1.0) and X or 0.0)) - (self.Circle.Width / 2) + self.Circle.Y = (self.Grid.Y + 20) + ((self.Grid.Height - 40) * ((Y >= 0.0 and Y <= 1.0) and Y or 0.0)) - (self.Circle.Height / 2) + else + return math.round((self.Circle.X - (self.Grid.X + 20) + (self.Circle.Width / 2)) / (self.Grid.Width - 40), 2), math.round((self.Circle.Y - (self.Grid.Y + 20) + (self.Circle.Height / 2)) / (self.Grid.Height - 40), 2) + end +end + +function UIMenuGridPanel:Position(Y) -- required + if tonumber(Y) then + local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset + + self.Background:Position(ParentOffsetX, Y) + self.Grid:Position(ParentOffsetX + 115.5 + (ParentOffsetWidth / 2), 37.5 + Y) + self.Text.Top:Position(ParentOffsetX + 215.5 + (ParentOffsetWidth / 2), 5 + Y) + self.Text.Left:Position(ParentOffsetX + 57.75 + (ParentOffsetWidth / 2), 120 + Y) + self.Text.Right:Position(ParentOffsetX + 373.25 + (ParentOffsetWidth / 2), 120 + Y) + self.Text.Bottom:Position(ParentOffsetX + 215.5 + (ParentOffsetWidth / 2), 240 + Y) + + if not self.CircleLocked then + self.CircleLocked = true + self:CirclePosition(0.5, 0.5) + end + end +end + +function UIMenuGridPanel:UpdateParent(X, Y) + local _, ParentType = self.ParentItem() + if ParentType == "UIMenuListItem" then + local PanelItemIndex = self.ParentItem:FindPanelItem() + if PanelItemIndex then + self.ParentItem.Items[PanelItemIndex].Value[self.ParentItem:FindPanelIndex(self)] = { X = X, Y = Y } + self.ParentItem:Index(PanelItemIndex) + self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + else + local PanelIndex = self.ParentItem:FindPanelIndex(self) + for Index = 1, #self.ParentItem.Items do + if type(self.ParentItem.Items[Index]) == "table" then + if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end + self.ParentItem.Items[Index].Panels[PanelIndex] = { X = X, Y = Y } + else + self.ParentItem.Items[Index] = { Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = { [PanelIndex] = { X = X, Y = Y } } } + end + end + self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + end + elseif ParentType == "UIMenuItem" then + self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, { X = X, Y = Y }) + end +end + +function UIMenuGridPanel:Functions() + local SafeZone = { X = 0, Y = 0 } + if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then + SafeZone = GetSafeZoneBounds() + end + + if IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) then + if IsDisabledControlJustPressed(0, 24) then + if not self.Pressed then + self.Pressed = true + Citizen.CreateThread(function() + self.Audio.Id = GetSoundId() + PlaySoundFrontend(self.Audio.Id, self.Audio.Slider, self.Audio.Library, 1) + while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) do + Citizen.Wait(0) + local CursorX, CursorY = math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X - (self.Circle.Width / 2), math.round(GetControlNormal(0, 240) * 1080) - SafeZone.Y - (self.Circle.Height / 2) + + self.Circle:Position(((CursorX > (self.Grid.X + 10 + self.Grid.Width - 40)) and (self.Grid.X + 10 + self.Grid.Width - 40) or ((CursorX < (self.Grid.X + 20 - (self.Circle.Width / 2))) and (self.Grid.X + 20 - (self.Circle.Width / 2)) or CursorX)), ((CursorY > (self.Grid.Y + 10 + self.Grid.Height - 40)) and (self.Grid.Y + 10 + self.Grid.Height - 40) or ((CursorY < (self.Grid.Y + 20 - (self.Circle.Height / 2))) and (self.Grid.Y + 20 - (self.Circle.Height / 2)) or CursorY))) + end + StopSound(self.Audio.Id) + ReleaseSoundId(self.Audio.Id) + self.Pressed = false + end) + Citizen.CreateThread(function() + while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.Grid.X + 20 + SafeZone.X, self.Grid.Y + 20 + SafeZone.Y, self.Grid.Width - 40, self.Grid.Height - 40) do + Citizen.Wait(75) + local ResultX, ResultY = math.round((self.Circle.X - (self.Grid.X + 20) + (self.Circle.Width / 2)) / (self.Grid.Width - 40), 2), math.round((self.Circle.Y - (self.Grid.Y + 20) + (self.Circle.Height / 2)) / (self.Grid.Height - 40), 2) + + self:UpdateParent((((ResultX >= 0.0 and ResultX <= 1.0) and ResultX or ((ResultX <= 0) and 0.0) or 1.0) * 2) - 1, (((ResultY >= 0.0 and ResultY <= 1.0) and ResultY or ((ResultY <= 0) and 0.0) or 1.0) * 2) - 1) + end + end) + end + end + end +end + +function UIMenuGridPanel:Draw() -- required + if self.Data.Enabled then + self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 275) + + self.Background:Draw() + self.Grid:Draw() + self.Circle:Draw() + self.Text.Top:Draw() + self.Text.Left:Draw() + self.Text.Right:Draw() + self.Text.Bottom:Draw() + self:Functions() + end +end + +--[[ + UIMenuColourPanel.lua + Panels +--]] + +UIMenuColourPanel = setmetatable({}, UIMenuColourPanel) +UIMenuColourPanel.__index = UIMenuColourPanel +UIMenuColourPanel.__call = function() return "UIMenuPanel", "UIMenuColourPanel" end + +function UIMenuColourPanel.New(Title, Colours) + _UIMenuColourPanel = { + Data = { + Pagination = { + Min = 1, + Max = 8, + Total = 8, + }, + Index = 1000, + Items = Colours, + Title = Title or "Title", + Enabled = true, + Value = 1, + }, + Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 112), + Bar = {}, + LeftArrow = Sprite.New("commonmenu", "arrowleft", 0, 0, 30, 30), + RightArrow = Sprite.New("commonmenu", "arrowright", 0, 0, 30, 30), + SelectedRectangle = UIResRectangle.New(0, 0, 44.5, 8), + Text = UIResText.New(Title .. " (1 of " .. #Colours .. ")" or "Title" .. " (1 of " .. #Colours .. ")", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + ParentItem = nil, + } + + for Index = 1, #Colours do + if Index < 10 then + table.insert(_UIMenuColourPanel.Bar, UIResRectangle.New(0, 0, 44.5, 44.5, table.unpack(Colours[Index]))) + else + break + end + end + + if #_UIMenuColourPanel.Data.Items ~= 0 then + _UIMenuColourPanel.Data.Index = 1000 - (1000 % #_UIMenuColourPanel.Data.Items) + _UIMenuColourPanel.Data.Pagination.Max = _UIMenuColourPanel.Data.Pagination.Total + 1 + _UIMenuColourPanel.Data.Pagination.Min = 0 + end + return setmetatable(_UIMenuColourPanel, UIMenuColourPanel) +end + +function UIMenuColourPanel:SetParentItem(Item) -- required + if Item() == "UIMenuItem" then + self.ParentItem = Item + else + return self.ParentItem + end +end + +function UIMenuColourPanel:Enabled(Enabled) + if type(Enabled) == "boolean" then + self.Data.Enabled = Enabled + else + return self.Data.Enabled + end +end + +function UIMenuColourPanel:Position(Y) -- required + if tonumber(Y) then + local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset + + self.Background:Position(ParentOffsetX, Y) + for Index = 1, #self.Bar do + self.Bar[Index]:Position(15 + (44.5 * (Index - 1)) + ParentOffsetX + (ParentOffsetWidth / 2), 55 + Y) + end + self.SelectedRectangle:Position(15 + (44.5 * ((self:CurrentSelection() - self.Data.Pagination.Min) - 1)) + ParentOffsetX + (ParentOffsetWidth / 2), 47 + Y) + self.LeftArrow:Position(7.5 + ParentOffsetX + (ParentOffsetWidth / 2), 15 + Y) + self.RightArrow:Position(393.5 + ParentOffsetX + (ParentOffsetWidth / 2), 15 + Y) + self.Text:Position(215.5 + ParentOffsetX + (ParentOffsetWidth / 2), 15 + Y) + end +end + +function UIMenuColourPanel:CurrentSelection(value, PreventUpdate) + if tonumber(value) then + if #self.Data.Items == 0 then + self.Data.Index = 0 + end + + self.Data.Index = 1000000 - (1000000 % #self.Data.Items) + tonumber(value) + + if self:CurrentSelection() > self.Data.Pagination.Max then + self.Data.Pagination.Min = self:CurrentSelection() - (self.Data.Pagination.Total + 1) + self.Data.Pagination.Max = self:CurrentSelection() + elseif self:CurrentSelection() < self.Data.Pagination.Min then + self.Data.Pagination.Min = self:CurrentSelection() - 1 + self.Data.Pagination.Max = self:CurrentSelection() + (self.Data.Pagination.Total + 1) + end + + self:UpdateSelection(PreventUpdate) + else + if #self.Data.Items == 0 then + return 1 + else + if self.Data.Index % #self.Data.Items == 0 then + return 1 + else + return self.Data.Index % #self.Data.Items + 1 + end + end + end +end + +function UIMenuColourPanel:UpdateParent(Colour) + local _, ParentType = self.ParentItem() + if ParentType == "UIMenuListItem" then + local PanelItemIndex = self.ParentItem:FindPanelItem() + local PanelIndex = self.ParentItem:FindPanelIndex(self) + if PanelItemIndex then + self.ParentItem.Items[PanelItemIndex].Value[PanelIndex] = Colour + self.ParentItem:Index(PanelItemIndex) + self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + else + for Index = 1, #self.ParentItem.Items do + if type(self.ParentItem.Items[Index]) == "table" then + if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end + self.ParentItem.Items[Index].Panels[PanelIndex] = Colour + else + self.ParentItem.Items[Index] = { Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = { [PanelIndex] = Colour } } + end + end + self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + end + elseif ParentType == "UIMenuItem" then + self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, Colour) + end +end + +function UIMenuColourPanel:UpdateSelection(PreventUpdate) + local CurrentSelection = self:CurrentSelection() + if not PreventUpdate then + self:UpdateParent(CurrentSelection) + end + self.SelectedRectangle:Position(15 + (44.5 * ((CurrentSelection - self.Data.Pagination.Min) - 1)) + self.ParentItem:Offset().X, self.SelectedRectangle.Y) + for Index = 1, 9 do + self.Bar[Index]:Colour(table.unpack(self.Data.Items[self.Data.Pagination.Min + Index])) + end + self.Text:Text(self.Data.Title .. " (" .. CurrentSelection .. " of " .. #self.Data.Items .. ")") +end + +function UIMenuColourPanel:Functions() + + local SafeZone = { X = 0, Y = 0 } + if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then + SafeZone = GetSafeZoneBounds() + end + + + if IsMouseInBounds(self.LeftArrow.X + SafeZone.X, self.LeftArrow.Y + SafeZone.Y, self.LeftArrow.Width, self.LeftArrow.Height) then + if IsDisabledControlJustPressed(0, 24) then + if #self.Data.Items > self.Data.Pagination.Total + 1 then + if self:CurrentSelection() <= self.Data.Pagination.Min + 1 then + if self:CurrentSelection() == 1 then + self.Data.Pagination.Min = #self.Data.Items - (self.Data.Pagination.Total + 1) + self.Data.Pagination.Max = #self.Data.Items + self.Data.Index = 1000 - (1000 % #self.Data.Items) + self.Data.Index = self.Data.Index + (#self.Data.Items - 1) + self:UpdateSelection() + else + self.Data.Pagination.Min = self.Data.Pagination.Min - 1 + self.Data.Pagination.Max = self.Data.Pagination.Max - 1 + self.Data.Index = self.Data.Index - 1 + self:UpdateSelection() + end + else + self.Data.Index = self.Data.Index - 1 + self:UpdateSelection() + end + else + self.Data.Index = self.Data.Index - 1 + self:UpdateSelection() + end + end + end + + if IsMouseInBounds(self.RightArrow.X + SafeZone.X, self.RightArrow.Y + SafeZone.Y, self.RightArrow.Width, self.RightArrow.Height) then + if IsDisabledControlJustPressed(0, 24) then + if #self.Data.Items > self.Data.Pagination.Total + 1 then + if self:CurrentSelection() >= self.Data.Pagination.Max then + if self:CurrentSelection() == #self.Data.Items then + self.Data.Pagination.Min = 0 + self.Data.Pagination.Max = self.Data.Pagination.Total + 1 + self.Data.Index = 1000 - (1000 % #self.Data.Items) + self:UpdateSelection() + else + self.Data.Pagination.Max = self.Data.Pagination.Max + 1 + self.Data.Pagination.Min = self.Data.Pagination.Max - (self.Data.Pagination.Total + 1) + self.Data.Index = self.Data.Index + 1 + self:UpdateSelection() + end + else + self.Data.Index = self.Data.Index + 1 + self:UpdateSelection() + end + else + self.Data.Index = self.Data.Index + 1 + self:UpdateSelection() + end + end + end + + for Index = 1, #self.Bar do + if IsMouseInBounds(self.Bar[Index].X + SafeZone.X, self.Bar[Index].Y + SafeZone.Y, self.Bar[Index].Width, self.Bar[Index].Height) then + if IsDisabledControlJustPressed(0, 24) then + self:CurrentSelection(self.Data.Pagination.Min + Index - 1) + end + end + end +end + +function UIMenuColourPanel:Draw() -- required + if self.Data.Enabled then + self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 112) + + self.Background:Draw() + self.LeftArrow:Draw() + self.RightArrow:Draw() + self.Text:Draw() + self.SelectedRectangle:Draw() + for Index = 1, #self.Bar do + self.Bar[Index]:Draw() + end + self:Functions() + end +end + +--[[ + UIMenuPercentagePanel.lua + Panels +--]] + +UIMenuPercentagePanel = setmetatable({}, UIMenuPercentagePanel) +UIMenuPercentagePanel.__index = UIMenuPercentagePanel +UIMenuPercentagePanel.__call = function() return "UIMenuPanel", "UIMenuPercentagePanel" end + +function UIMenuPercentagePanel.New(MinText, MaxText) + _UIMenuPercentagePanel = { + Data = { + Enabled = true, + }, + Background = Sprite.New("commonmenu", "gradient_bgd", 0, 0, 431, 76), + ActiveBar = UIResRectangle.New(0, 0, 413, 10, 245, 245, 245, 255), + BackgroundBar = UIResRectangle.New(0, 0, 413, 10, 87, 87, 87, 255), + Text = { + Min = UIResText.New(MinText or "0%", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + Max = UIResText.New("100%", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + Title = UIResText.New(MaxText or "Opacity", 0, 0, 0.35, 255, 255, 255, 255, 0, "Centre"), + }, + Audio = { Slider = "CONTINUOUS_SLIDER", Library = "HUD_FRONTEND_DEFAULT_SOUNDSET", Id = nil }, + ParentItem = nil, + } + + return setmetatable(_UIMenuPercentagePanel, UIMenuPercentagePanel) +end + +function UIMenuPercentagePanel:SetParentItem(Item) -- required + if Item() == "UIMenuItem" then + self.ParentItem = Item + else + return self.ParentItem + end +end + +function UIMenuPercentagePanel:Enabled(Enabled) + if type(Enabled) == "boolean" then + self.Data.Enabled = Enabled + else + return self.Data.Enabled + end +end + +function UIMenuPercentagePanel:Position(Y) -- required + if tonumber(Y) then + local ParentOffsetX, ParentOffsetWidth = self.ParentItem:Offset().X, self.ParentItem:SetParentMenu().WidthOffset + self.Background:Position(ParentOffsetX, Y) + self.ActiveBar:Position(ParentOffsetX + (ParentOffsetWidth / 2) + 9, 50 + Y) + self.BackgroundBar:Position(ParentOffsetX + (ParentOffsetWidth / 2) + 9, 50 + Y) + self.Text.Min:Position(ParentOffsetX + (ParentOffsetWidth / 2) + 25, 15 + Y) + self.Text.Max:Position(ParentOffsetX + (ParentOffsetWidth / 2) + 398, 15 + Y) + self.Text.Title:Position(ParentOffsetX + (ParentOffsetWidth / 2) + 215.5, 15 + Y) + end +end + +function UIMenuPercentagePanel:Percentage(Value) + if tonumber(Value) then + local Percent = ((Value < 0.0) and 0.0) or ((Value > 1.0) and 1.0 or Value) + self.ActiveBar:Size(self.BackgroundBar.Width * Percent, self.ActiveBar.Height) + else + local SafeZone = { X = 0, Y = 0 } + if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then + SafeZone = GetSafeZoneBounds() + end + + local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X + return math.round(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413)) / self.BackgroundBar.Width, 2) + end +end + +function UIMenuPercentagePanel:UpdateParent(Percentage) + local _, ParentType = self.ParentItem() + if ParentType == "UIMenuListItem" then + local PanelItemIndex = self.ParentItem:FindPanelItem() + if PanelItemIndex then + self.ParentItem.Items[PanelItemIndex].Value[self.ParentItem:FindPanelIndex(self)] = Percentage + self.ParentItem:Index(PanelItemIndex) + self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + else + local PanelIndex = self.ParentItem:FindPanelIndex(self) + for Index = 1, #self.ParentItem.Items do + if type(self.ParentItem.Items[Index]) == "table" then + if not self.ParentItem.Items[Index].Panels then self.ParentItem.Items[Index].Panels = {} end + self.ParentItem.Items[Index].Panels[PanelIndex] = Percentage + else + self.ParentItem.Items[Index] = { Name = tostring(self.ParentItem.Items[Index]), Value = self.ParentItem.Items[Index], Panels = { [PanelIndex] = Percentage } } + end + end + self.ParentItem.Base.ParentMenu.OnListChange(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + self.ParentItem.OnListChanged(self.ParentItem.Base.ParentMenu, self.ParentItem, self.ParentItem._Index) + end + elseif ParentType == "UIMenuItem" then + self.ParentItem.ActivatedPanel(self.ParentItem.ParentMenu, self.ParentItem, self, Percentage) + end +end + +function UIMenuPercentagePanel:Functions() + + local SafeZone = { X = 0, Y = 0 } + if self.ParentItem:SetParentMenu().Settings.ScaleWithSafezone then + SafeZone = GetSafeZoneBounds() + end + + if IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) then + if IsDisabledControlJustPressed(0, 24) then + if not self.Pressed then + self.Pressed = true + Citizen.CreateThread(function() + self.Audio.Id = GetSoundId() + PlaySoundFrontend(self.Audio.Id, self.Audio.Slider, self.Audio.Library, 1) + while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) do + Citizen.Wait(0) + local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X + self.ActiveBar:Size(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413)), self.ActiveBar.Height) + end + StopSound(self.Audio.Id) + ReleaseSoundId(self.Audio.Id) + self.Pressed = false + end) + Citizen.CreateThread(function() + while IsDisabledControlPressed(0, 24) and IsMouseInBounds(self.BackgroundBar.X + SafeZone.X, self.BackgroundBar.Y - 4 + SafeZone.Y, self.BackgroundBar.Width, self.BackgroundBar.Height + 8) do + Citizen.Wait(75) + local Progress = (math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) - self.ActiveBar.X + self:UpdateParent(math.round(((Progress >= 0 and Progress <= 413) and Progress or ((Progress < 0) and 0 or 413)) / self.BackgroundBar.Width, 2)) + end + end) + end + end + end +end + +function UIMenuPercentagePanel:Draw() -- required + if self.Data.Enabled then + self.Background:Size(431 + self.ParentItem:SetParentMenu().WidthOffset, 76) + self.Background:Draw() + self.BackgroundBar:Draw() + self.ActiveBar:Draw() + self.Text.Min:Draw() + self.Text.Max:Draw() + self.Text.Title:Draw() + self:Functions() + end +end + +--[[ + UIMenu.lua + Menus +--]] + +function UIMenu.New(Title, Subtitle, X, Y, TxtDictionary, TxtName) + local X, Y = tonumber(X) or 0, tonumber(Y) or 0 + if Title ~= nil then Title = tostring(Title) or "" else Title = "" end + if Subtitle ~= nil then Subtitle = tostring(Subtitle) or "" else Subtitle = "" end + if TxtDictionary ~= nil then TxtDictionary = tostring(TxtDictionary) or "commonmenu" else TxtDictionary = "commonmenu" end + if TxtName ~= nil then TxtName = tostring(TxtName) or "interaction_bgd" else TxtName = "interaction_bgd" end + local _UIMenu = { + Logo = Sprite.New(TxtDictionary, TxtName, 0 + X, 0 + Y, 431, 107), + Banner = nil, + Title = UIResText.New(Title, 215 + X, 20 + Y, 1.15, 255, 255, 255, 255, 1, 1), + Subtitle = { ExtraY = 0 }, + WidthOffset = 0, + Position = { X = X, Y = Y }, + Pagination = { Min = 0, Max = 9, Total = 9 }, + PageCounter = { PreText = "" }, + Extra = {}, + Description = {}, + Items = {}, + Windows = {}, + Children = {}, + Controls = { + Back = { + Enabled = true, + }, + Select = { + Enabled = true, + }, + Left = { + Enabled = true, + }, + Right = { + Enabled = true, + }, + Up = { + Enabled = true, + }, + Down = { + Enabled = true, + }, + }, + ParentMenu = nil, + ParentItem = nil, + _Visible = false, + ActiveItem = 1000, + Dirty = false; + ReDraw = true, + InstructionalScaleform = RequestScaleformMovie("INSTRUCTIONAL_BUTTONS"), + InstructionalButtons = {}, + OnIndexChange = function(menu, newindex) end, + OnListChange = function(menu, list, newindex) end, + OnSliderChange = function(menu, slider, newindex) end, + OnProgressChange = function(menu, progress, newindex) end, + OnCheckboxChange = function(menu, item, checked) end, + OnListSelect = function(menu, list, index) end, + OnSliderSelect = function(menu, slider, index) end, + OnProgressSelect = function(menu, progress, index) end, + OnItemSelect = function(menu, item, index) end, + OnMenuChanged = function(menu, newmenu, forward) end, + OnMenuClosed = function(menu) end, + Settings = { + InstructionalButtons = true, + MultilineFormats = true, + ScaleWithSafezone = true, + ResetCursorOnOpen = false, + MouseControlsEnabled = false, + MouseEdgeEnabled = false, + ControlDisablingEnabled = true, + Audio = { + Library = "HUD_FRONTEND_DEFAULT_SOUNDSET", + UpDown = "NAV_UP_DOWN", + LeftRight = "NAV_LEFT_RIGHT", + Select = "SELECT", + Back = "BACK", + Error = "ERROR", + }, + EnabledControls = { + Controller = { + { 0, 2 }, -- Look Up and Down + { 0, 1 }, -- Look Left and Right + { 0, 25 }, -- Aim + { 0, 24 }, -- Attack + }, + Keyboard = { + { 0, 0 }, -- Camera + { 0, 1 }, -- Look Left and Right + { 0, 2 }, -- Look Up and Down + { 0, 8 }, -- Fly Up and Down + { 0, 9 }, -- Fly Left and Right + { 0, 21 }, -- Sprint + { 0, 22 }, -- Jump + { 0, 23 }, -- Enter + { 0, 24 }, -- Attack + { 0, 25 }, -- Aim + { 0, 26 }, -- C + { 0, 30 }, -- Move Left and Right + { 0, 31 }, -- Move Up and Down + { 0, 47 }, -- G + { 0, 59 }, -- Move Vehicle Left and Right + { 0, 71 }, -- Accelerate Vehicle + { 0, 72 }, -- Vehicle Brake + { 0, 73 }, -- X + { 0, 75 }, -- Exit Vehicle + { 0, 76 }, -- Vehicle Handbrake + { 0, 89 }, -- Fly Yaw Left + { 0, 90 }, -- Fly Yaw Right + { 0, 108 }, -- Num Pad 4 + { 0, 109 }, -- Num Pad 6 + { 0, 110 }, -- Num Pad 5 + { 0, 111 }, -- Num Pad 8 + { 0, 117 }, -- Num Pad 7 + { 0, 118 }, -- Num Pad 9 + { 0, 171 }, -- CAPSLOCK + { 0, 187 }, -- Down + { 0, 188 }, -- Up + { 0, 189 }, -- Left + { 0, 190 }, -- Right + { 0, 195 }, -- X axis + { 0, 196 }, -- Y axis + { 0, 201 }, -- Select + { 0, 202 }, -- Back + { 0, 203 }, -- Spacebar? + { 0, 217 }, -- Select + { 0, 239 }, -- Cursor X + { 0, 240 }, -- Cursor Y + { 0, 241 }, -- Scroll up + { 0, 242 }, -- Scroll down + { 0, 249 }, -- N + { 0, 305 }, -- B + { 0, 306 }, -- N + }, + } + } + } + + if Subtitle ~= "" and Subtitle ~= nil then + _UIMenu.Subtitle.Rectangle = UIResRectangle.New(0 + _UIMenu.Position.X, 107 + _UIMenu.Position.Y, 431, 37, 0, 0, 0, 255) + _UIMenu.Subtitle.Text = UIResText.New(Subtitle, 8 + _UIMenu.Position.X, 110 + _UIMenu.Position.Y, 0.35, 245, 245, 245, 255, 0) + _UIMenu.Subtitle.BackupText = Subtitle + _UIMenu.Subtitle.Formatted = false + if string.starts(Subtitle, "~") then + _UIMenu.PageCounter.PreText = string.sub(Subtitle, 1, 3) + end + _UIMenu.PageCounter.Text = UIResText.New("", 425 + _UIMenu.Position.X, 110 + _UIMenu.Position.Y, 0.35, 245, 245, 245, 255, 0, "Right") + _UIMenu.Subtitle.ExtraY = 37 + end + + _UIMenu.ArrowSprite = Sprite.New("commonmenu", "shop_arrows_upanddown", 190 + _UIMenu.Position.X, 147 + 37 * (_UIMenu.Pagination.Total + 1) + _UIMenu.Position.Y - 37 + _UIMenu.Subtitle.ExtraY, 50, 50) + _UIMenu.Extra.Up = UIResRectangle.New(0 + _UIMenu.Position.X, 144 + 38 * (_UIMenu.Pagination.Total + 1) + _UIMenu.Position.Y - 37 + _UIMenu.Subtitle.ExtraY, 431, 18, 0, 0, 0, 200) + _UIMenu.Extra.Down = UIResRectangle.New(0 + _UIMenu.Position.X, 144 + 18 + 38 * (_UIMenu.Pagination.Total + 1) + _UIMenu.Position.Y - 37 + _UIMenu.Subtitle.ExtraY, 431, 18, 0, 0, 0, 200) + + _UIMenu.Description.Bar = UIResRectangle.New(_UIMenu.Position.X, 123, 431, 4, 0, 0, 0, 255) + _UIMenu.Description.Rectangle = Sprite.New("commonmenu", "gradient_bgd", _UIMenu.Position.X, 127, 431, 30) + _UIMenu.Description.Text = UIResText.New("Description", _UIMenu.Position.X + 5, 125, 0.35) + + _UIMenu.Background = Sprite.New("commonmenu", "gradient_bgd", _UIMenu.Position.X, 144 + _UIMenu.Position.Y - 37 + _UIMenu.Subtitle.ExtraY, 290, 25) + + Citizen.CreateThread(function() + if not HasScaleformMovieLoaded(_UIMenu.InstructionalScaleform) then + _UIMenu.InstructionalScaleform = RequestScaleformMovie("INSTRUCTIONAL_BUTTONS") + while not HasScaleformMovieLoaded(_UIMenu.InstructionalScaleform) do + Citizen.Wait(0) + end + end + end) + return setmetatable(_UIMenu, UIMenu) +end + +function UIMenu:SetMenuWidthOffset(Offset) + if tonumber(Offset) then + self.WidthOffset = math.floor(tonumber(Offset)) + self.Logo:Size(431 + self.WidthOffset, 107) + self.Title:Position(((self.WidthOffset + 431) / 2) + self.Position.X, 20 + self.Position.Y) + if self.Subtitle.Rectangle ~= nil then + self.Subtitle.Rectangle:Size(431 + self.WidthOffset + 100, 37) + self.PageCounter.Text:Position(425 + self.Position.X + self.WidthOffset, 110 + self.Position.Y) + end + if self.Banner ~= nil then + self.Banner:Size(431 + self.WidthOffset, 107) + end + end +end + +function UIMenu:DisEnableControls(bool) + if bool then + EnableAllControlActions(2) + else + DisableAllControlActions(2) + end + + if bool then + return + else + if Controller() then + for Index = 1, #self.Settings.EnabledControls.Controller do + EnableControlAction(self.Settings.EnabledControls.Controller[Index][1], self.Settings.EnabledControls.Controller[Index][2], true) + end + else + for Index = 1, #self.Settings.EnabledControls.Keyboard do + EnableControlAction(self.Settings.EnabledControls.Keyboard[Index][1], self.Settings.EnabledControls.Keyboard[Index][2], true) + end + end + end +end + +function UIMenu:InstructionalButtons(bool) + if bool ~= nil then + self.Settings.InstrucitonalButtons = tobool(bool) + end +end + +function UIMenu:SetBannerSprite(Sprite, IncludeChildren) + if Sprite() == "Sprite" then + self.Logo = Sprite + self.Logo:Size(431 + self.WidthOffset, 107) + self.Logo:Position(self.Position.X, self.Position.Y) + self.Banner = nil + if IncludeChildren then + for Item, Menu in pairs(self.Children) do + Menu.Logo = Sprite + Menu.Logo:Size(431 + self.WidthOffset, 107) + Menu.Logo:Position(self.Position.X, self.Position.Y) + Menu.Banner = nil + end + end + end +end + +function UIMenu:SetBannerRectangle(Rectangle, IncludeChildren) + if Rectangle() == "Rectangle" then + self.Banner = Rectangle + self.Banner:Size(431 + self.WidthOffset, 107) + self.Banner:Position(self.Position.X, self.Position.Y) + self.Logo = nil + if IncludeChildren then + for Item, Menu in pairs(self.Children) do + Menu.Banner = Rectangle + Menu.Banner:Size(431 + self.WidthOffset, 107) + Menu:Position(self.Position.X, self.Position.Y) + Menu.Logo = nil + end + end + end +end + +function UIMenu:CurrentSelection(value) + if tonumber(value) then + if #self.Items == 0 then + self.ActiveItem = 0 + end + + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = 1000000 - (1000000 % #self.Items) + tonumber(value) + + if self:CurrentSelection() > self.Pagination.Max then + self.Pagination.Min = self:CurrentSelection() - self.Pagination.Total + self.Pagination.Max = self:CurrentSelection() + elseif self:CurrentSelection() < self.Pagination.Min then + self.Pagination.Min = self:CurrentSelection() + self.Pagination.Max = self:CurrentSelection() + self.Pagination.Total + end + else + if #self.Items == 0 then + return 1 + else + if self.ActiveItem % #self.Items == 0 then + return 1 + else + return self.ActiveItem % #self.Items + 1 + end + end + end +end + +function UIMenu:CalculateWindowHeight() + local Height = 0 + for i = 1, #self.Windows do + Height = Height + self.Windows[i].Background:Size().Height + end + return Height +end + +function UIMenu:CalculateItemHeightOffset(Item) + if Item.Base then + return Item.Base.Rectangle.Height + else + return Item.Rectangle.Height + end +end + +function UIMenu:CalculateItemHeight() + local ItemOffset = 0 + self.Subtitle.ExtraY - 37 + for i = self.Pagination.Min + 1, self.Pagination.Max do + local Item = self.Items[i] + if Item ~= nil then + ItemOffset = ItemOffset + self:CalculateItemHeightOffset(Item) + end + end + return ItemOffset +end + +function UIMenu:RecalculateDescriptionPosition() + local WindowHeight = self:CalculateWindowHeight() + self.Description.Bar:Position(self.Position.X, 149 + self.Position.Y + WindowHeight) + self.Description.Rectangle:Position(self.Position.X, 149 + self.Position.Y + WindowHeight) + self.Description.Text:Position(self.Position.X + 8, 155 + self.Position.Y + WindowHeight) + + self.Description.Bar:Size(431 + self.WidthOffset, 4) + self.Description.Rectangle:Size(431 + self.WidthOffset, 30) + + self.Description.Bar:Position(self.Position.X, self:CalculateItemHeight() + ((#self.Items > (self.Pagination.Total + 1)) and 37 or 0) + self.Description.Bar:Position().Y) + self.Description.Rectangle:Position(self.Position.X, self:CalculateItemHeight() + ((#self.Items > (self.Pagination.Total + 1)) and 37 or 0) + self.Description.Rectangle:Position().Y) + self.Description.Text:Position(self.Position.X + 8, self:CalculateItemHeight() + ((#self.Items > (self.Pagination.Total + 1)) and 37 or 0) + self.Description.Text:Position().Y) +end + +function UIMenu:CaclulatePanelPosition(HasDescription) + local Height = self:CalculateWindowHeight() + 149 + self.Position.Y + + if HasDescription then + Height = Height + self.Description.Rectangle:Size().Height + 5 + end + + return self:CalculateItemHeight() + ((#self.Items > (self.Pagination.Total + 1)) and 37 or 0) + Height +end + +function UIMenu:AddWindow(Window) + if Window() == "UIMenuWindow" then + Window:SetParentMenu(self) + Window:Offset(self.Position.X, self.Position.Y) + table.insert(self.Windows, Window) + self.ReDraw = true + self:RecalculateDescriptionPosition() + end +end + +function UIMenu:RemoveWindowAt(Index) + if tonumber(Index) then + if self.Windows[Index] then + table.remove(self.Windows, Index) + self.ReDraw = true + self:RecalculateDescriptionPosition() + end + end +end + +function UIMenu:AddItem(Item) + if Item() == "UIMenuItem" then + local SelectedItem = self:CurrentSelection() + Item:SetParentMenu(self) + Item:Offset(self.Position.X, self.Position.Y) + Item:Position((#self.Items * 25) - 37 + self.Subtitle.ExtraY) + table.insert(self.Items, Item) + self:RecalculateDescriptionPosition() + self:CurrentSelection(SelectedItem) + end +end + +function UIMenu:RemoveItemAt(Index) + if tonumber(Index) then + if self.Items[Index] then + local SelectedItem = self:CurrentSelection() + if #self.Items > self.Pagination.Total and self.Pagination.Max == #self.Items - 1 then + self.Pagination.Min = self.Pagination.Min - 1 + self.Pagination.Max = self.Pagination.Max + 1 + end + table.remove(self.Items, tonumber(Index)) + self:RecalculateDescriptionPosition() + self:CurrentSelection(SelectedItem) + end + end +end + +function UIMenu:RefreshIndex() + if #self.Items == 0 then + self.ActiveItem = 1000 + self.Pagination.Max = self.Pagination.Total + 1 + self.Pagination.Min = 0 + return + end + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = 1000 - (1000 % #self.Items) + self.Pagination.Max = self.Pagination.Total + 1 + self.Pagination.Min = 0 + self.ReDraw = true +end + +function UIMenu:Clear() + self.Items = {} + self.ReDraw = true + self:RecalculateDescriptionPosition() +end + +function UIMenu:MultilineFormat(str) + if tostring(str) then + + local PixelPerLine = 425 + self.WidthOffset + local AggregatePixels = 0 + local output = "" + local words = string.split(tostring(str), " ") + + for i = 1, #words do + local offset = MeasureStringWidth(words[i], 0, 0.35) + AggregatePixels = AggregatePixels + offset + if AggregatePixels > PixelPerLine then + output = output .. "\n" .. words[i] .. " " + AggregatePixels = offset + MeasureString(" ") + else + output = output .. words[i] .. " " + AggregatePixels = AggregatePixels + MeasureString(" ") + end + end + return output + end +end + +function UIMenu:DrawCalculations() + local WindowHeight = self:CalculateWindowHeight() + + if self.Settings.MultilineFormats then + if self.Subtitle.Rectangle and not self.Subtitle.Formatted then + self.Subtitle.Formatted = true + self.Subtitle.Text:Text(self:MultilineFormat(self.Subtitle.Text:Text())) + + local Linecount = #string.split(self.Subtitle.Text:Text(), "\n") + self.Subtitle.ExtraY = ((Linecount == 1) and 37 or ((Linecount + 1) * 22)) + self.Subtitle.Rectangle:Size(431 + self.WidthOffset, self.Subtitle.ExtraY) + end + elseif self.Subtitle.Formatted then + self.Subtitle.Formatted = false + self.Subtitle.ExtraY = 37 + self.Subtitle.Rectangle:Size(431 + self.WidthOffset, self.Subtitle.ExtraY) + self.Subtitle.Text:Text(self.Subtitle.BackupText) + end + + self.Background:Size(431 + self.WidthOffset, self:CalculateItemHeight() + WindowHeight + ((self.Subtitle.ExtraY > 0) and 0 or 37)) + + self.Extra.Up:Size(431 + self.WidthOffset, 18) + self.Extra.Down:Size(431 + self.WidthOffset, 18) + + self.Extra.Up:Position(self.Position.X, 144 + self:CalculateItemHeight() + self.Position.Y + WindowHeight) + self.Extra.Down:Position(self.Position.X, 144 + 18 + self:CalculateItemHeight() + self.Position.Y + WindowHeight) + + if self.WidthOffset > 0 then + self.ArrowSprite:Position(190 + self.Position.X + (self.WidthOffset / 2), 137 + self:CalculateItemHeight() + self.Position.Y + WindowHeight) + else + self.ArrowSprite:Position(190 + self.Position.X + self.WidthOffset, 137 + self:CalculateItemHeight() + self.Position.Y + WindowHeight) + end + + self.ReDraw = false + + if #self.Items ~= 0 and self.Items[self:CurrentSelection()]:Description() ~= "" then + self:RecalculateDescriptionPosition() + + local description = self.Items[self:CurrentSelection()]:Description() + if self.Settings.MultilineFormats then + self.Description.Text:Text(self:MultilineFormat(description)) + else + self.Description.Text:Text(description) + end + + local Linecount = #string.split(self.Description.Text:Text(), "\n") + self.Description.Rectangle:Size(431 + self.WidthOffset, ((Linecount == 1) and 37 or ((Linecount + 1) * 22))) + end +end + +function UIMenu:Visible(bool) + if bool ~= nil then + self._Visible = tobool(bool) + self.JustOpened = tobool(bool) + self.Dirty = tobool(bool) + self:UpdateScaleform() + if self.ParentMenu ~= nil or tobool(bool) == false then + return + end + if self.Settings.ResetCursorOnOpen then + local W, H = GetScreenResolution() + SetCursorLocation(W / 2, H / 2) + SetCursorSprite(1) + end + else + return self._Visible + end +end + +function UIMenu:ProcessControl() + if not self._Visible then + return + end + + if self.JustOpened then + self.JustOpened = false + return + end + + if self.Controls.Back.Enabled and (IsDisabledControlJustReleased(0, 177) or IsDisabledControlJustReleased(1, 177) or IsDisabledControlJustReleased(2, 177) or IsDisabledControlJustReleased(0, 199) or IsDisabledControlJustReleased(1, 199) or IsDisabledControlJustReleased(2, 199)) then + self:GoBack() + end + + if #self.Items == 0 then + return + end + + if not self.UpPressed then + if self.Controls.Up.Enabled and (IsDisabledControlJustPressed(0, 172) or IsDisabledControlJustPressed(1, 172) or IsDisabledControlJustPressed(2, 172) or IsDisabledControlJustPressed(0, 241) or IsDisabledControlJustPressed(1, 241) or IsDisabledControlJustPressed(2, 241) or IsDisabledControlJustPressed(2, 241)) then + Citizen.CreateThread(function() + self.UpPressed = true + if #self.Items > self.Pagination.Total + 1 then + self:GoUpOverflow() + else + self:GoUp() + end + self:UpdateScaleform() + Citizen.Wait(120) + while self.Controls.Up.Enabled and (IsDisabledControlPressed(0, 172) or IsDisabledControlPressed(1, 172) or IsDisabledControlPressed(2, 172) or IsDisabledControlPressed(0, 241) or IsDisabledControlPressed(1, 241) or IsDisabledControlPressed(2, 241) or IsDisabledControlPressed(2, 241)) do + if #self.Items > self.Pagination.Total + 1 then + self:GoUpOverflow() + else + self:GoUp() + end + self:UpdateScaleform() + Citizen.Wait(50) + end + self.UpPressed = false + end) + end + end + + if not self.DownPressed then + if self.Controls.Down.Enabled and (IsDisabledControlJustPressed(0, 173) or IsDisabledControlJustPressed(1, 173) or IsDisabledControlJustPressed(2, 173) or IsDisabledControlJustPressed(0, 242) or IsDisabledControlJustPressed(1, 242) or IsDisabledControlJustPressed(2, 242)) then + Citizen.CreateThread(function() + self.DownPressed = true + if #self.Items > self.Pagination.Total + 1 then + self:GoDownOverflow() + else + self:GoDown() + end + self:UpdateScaleform() + Citizen.Wait(120) + while self.Controls.Down.Enabled and (IsDisabledControlPressed(0, 173) or IsDisabledControlPressed(1, 173) or IsDisabledControlPressed(2, 173) or IsDisabledControlPressed(0, 242) or IsDisabledControlPressed(1, 242) or IsDisabledControlPressed(2, 242)) do + if #self.Items > self.Pagination.Total + 1 then + self:GoDownOverflow() + else + self:GoDown() + end + self:UpdateScaleform() + Citizen.Wait(50) + end + self.DownPressed = false + end) + end + end + + if not self.LeftPressed then + if self.Controls.Left.Enabled and (IsDisabledControlPressed(0, 174) or IsDisabledControlPressed(1, 174) or IsDisabledControlPressed(2, 174)) then + Citizen.CreateThread(function() + self.LeftPressed = true + self:GoLeft() + Citizen.Wait(175) + while self.Controls.Left.Enabled and (IsDisabledControlPressed(0, 174) or IsDisabledControlPressed(1, 174) or IsDisabledControlPressed(2, 174)) do + self:GoLeft() + Citizen.Wait(125) + end + self.LeftPressed = false + end) + end + end + + if not self.RightPressed then + if self.Controls.Right.Enabled and (IsDisabledControlPressed(0, 175) or IsDisabledControlPressed(1, 175) or IsDisabledControlPressed(2, 175)) then + Citizen.CreateThread(function() + self.RightPressed = true + self:GoRight() + Citizen.Wait(175) + while self.Controls.Right.Enabled and (IsDisabledControlPressed(0, 175) or IsDisabledControlPressed(1, 175) or IsDisabledControlPressed(2, 175)) do + self:GoRight() + Citizen.Wait(125) + end + self.RightPressed = false + end) + end + end + + if self.Controls.Select.Enabled and (IsDisabledControlJustPressed(0, 201) or IsDisabledControlJustPressed(1, 201) or IsDisabledControlJustPressed(2, 201)) then + self:SelectItem() + end +end + +function UIMenu:GoUpOverflow() + if #self.Items <= self.Pagination.Total + 1 then + return + end + + if self:CurrentSelection() <= self.Pagination.Min + 1 then + if self:CurrentSelection() == 1 then + self.Pagination.Min = #self.Items - (self.Pagination.Total + 1) + self.Pagination.Max = #self.Items + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = 1000 - (1000 % #self.Items) + self.ActiveItem = self.ActiveItem + (#self.Items - 1) + self.Items[self:CurrentSelection()]:Selected(true) + else + self.Pagination.Min = self.Pagination.Min - 1 + self.Pagination.Max = self.Pagination.Max - 1 + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = self.ActiveItem - 1 + self.Items[self:CurrentSelection()]:Selected(true) + end + else + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = self.ActiveItem - 1 + self.Items[self:CurrentSelection()]:Selected(true) + end + PlaySoundFrontend(-1, self.Settings.Audio.UpDown, self.Settings.Audio.Library, true) + self.OnIndexChange(self, self:CurrentSelection()) + self.ReDraw = true +end + +function UIMenu:GoUp() + if #self.Items > self.Pagination.Total + 1 then + return + end + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = self.ActiveItem - 1 + self.Items[self:CurrentSelection()]:Selected(true) + PlaySoundFrontend(-1, self.Settings.Audio.UpDown, self.Settings.Audio.Library, true) + self.OnIndexChange(self, self:CurrentSelection()) + self.ReDraw = true +end + +function UIMenu:GoDownOverflow() + if #self.Items <= self.Pagination.Total + 1 then + return + end + + if self:CurrentSelection() >= self.Pagination.Max then + if self:CurrentSelection() == #self.Items then + self.Pagination.Min = 0 + self.Pagination.Max = self.Pagination.Total + 1 + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = 1000 - (1000 % #self.Items) + self.Items[self:CurrentSelection()]:Selected(true) + else + self.Pagination.Max = self.Pagination.Max + 1 + self.Pagination.Min = self.Pagination.Max - (self.Pagination.Total + 1) + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = self.ActiveItem + 1 + self.Items[self:CurrentSelection()]:Selected(true) + end + else + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = self.ActiveItem + 1 + self.Items[self:CurrentSelection()]:Selected(true) + end + PlaySoundFrontend(-1, self.Settings.Audio.UpDown, self.Settings.Audio.Library, true) + self.OnIndexChange(self, self:CurrentSelection()) + self.ReDraw = true +end + +function UIMenu:GoDown() + if #self.Items > self.Pagination.Total + 1 then + return + end + + self.Items[self:CurrentSelection()]:Selected(false) + self.ActiveItem = self.ActiveItem + 1 + self.Items[self:CurrentSelection()]:Selected(true) + PlaySoundFrontend(-1, self.Settings.Audio.UpDown, self.Settings.Audio.Library, true) + self.OnIndexChange(self, self:CurrentSelection()) + self.ReDraw = true +end + +function UIMenu:GoLeft() + local type, subtype = self.Items[self:CurrentSelection()]() + if subtype ~= "UIMenuListItem" and subtype ~= "UIMenuSliderItem" and subtype ~= "UIMenuProgressItem" then + return + end + + if not self.Items[self:CurrentSelection()]:Enabled() then + PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true) + return + end + + if subtype == "UIMenuListItem" then + local Item = self.Items[self:CurrentSelection()] + Item:Index(Item._Index - 1) + self.OnListChange(self, Item, Item._Index) + Item.OnListChanged(self, Item, Item._Index) + PlaySoundFrontend(-1, self.Settings.Audio.LeftRight, self.Settings.Audio.Library, true) + elseif subtype == "UIMenuSliderItem" then + local Item = self.Items[self:CurrentSelection()] + Item:Index(Item._Index - 1) + self.OnSliderChange(self, Item, Item:Index()) + Item.OnSliderChanged(self, Item, Item._Index) + PlaySoundFrontend(-1, self.Settings.Audio.LeftRight, self.Settings.Audio.Library, true) + elseif subtype == "UIMenuProgressItem" then + local Item = self.Items[self:CurrentSelection()] + Item:Index(Item.Data.Index - 1) + self.OnProgressChange(self, Item, Item.Data.Index) + Item.OnProgressChanged(self, Item, Item.Data.Index) + PlaySoundFrontend(-1, self.Settings.Audio.LeftRight, self.Settings.Audio.Library, true) + end +end + +function UIMenu:GoRight() + local type, subtype = self.Items[self:CurrentSelection()]() + if subtype ~= "UIMenuListItem" and subtype ~= "UIMenuSliderItem" and subtype ~= "UIMenuProgressItem" then + return + end + + if not self.Items[self:CurrentSelection()]:Enabled() then + PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true) + return + end + + if subtype == "UIMenuListItem" then + local Item = self.Items[self:CurrentSelection()] + Item:Index(Item._Index + 1) + self.OnListChange(self, Item, Item._Index) + Item.OnListChanged(self, Item, Item._Index) + PlaySoundFrontend(-1, self.Settings.Audio.LeftRight, self.Settings.Audio.Library, true) + elseif subtype == "UIMenuSliderItem" then + local Item = self.Items[self:CurrentSelection()] + Item:Index(Item._Index + 1) + self.OnSliderChange(self, Item, Item:Index()) + Item.OnSliderChanged(self, Item, Item._Index) + PlaySoundFrontend(-1, self.Settings.Audio.LeftRight, self.Settings.Audio.Library, true) + elseif subtype == "UIMenuProgressItem" then + local Item = self.Items[self:CurrentSelection()] + Item:Index(Item.Data.Index + 1) + self.OnProgressChange(self, Item, Item.Data.Index) + Item.OnProgressChanged(self, Item, Item.Data.Index) + PlaySoundFrontend(-1, self.Settings.Audio.LeftRight, self.Settings.Audio.Library, true) + end +end + +function UIMenu:SelectItem() + if not self.Items[self:CurrentSelection()]:Enabled() then + PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true) + return + end + local Item = self.Items[self:CurrentSelection()] + local type, subtype = Item() + if subtype == "UIMenuCheckboxItem" then + Item.Checked = not Item.Checked + PlaySoundFrontend(-1, self.Settings.Audio.Select, self.Settings.Audio.Library, true) + self.OnCheckboxChange(self, Item, Item.Checked) + Item.CheckboxEvent(self, Item, Item.Checked) + elseif subtype == "UIMenuListItem" then + PlaySoundFrontend(-1, self.Settings.Audio.Select, self.Settings.Audio.Library, true) + self.OnListSelect(self, Item, Item._Index) + Item.OnListSelected(self, Item, Item._Index) + elseif subtype == "UIMenuSliderItem" then + PlaySoundFrontend(-1, self.Settings.Audio.Select, self.Settings.Audio.Library, true) + self.OnSliderSelect(self, Item, Item._Index) + Item.OnSliderSelected(Item._Index) + elseif subtype == "UIMenuProgressItem" then + PlaySoundFrontend(-1, self.Settings.Audio.Select, self.Settings.Audio.Library, true) + self.OnProgressSelect(self, Item, Item.Data.Index) + Item.OnProgressSelected(Item.Data.Index) + else + PlaySoundFrontend(-1, self.Settings.Audio.Select, self.Settings.Audio.Library, true) + self.OnItemSelect(self, Item, self:CurrentSelection()) + Item.Activated(self, Item) + if not self.Children[Item] then + return + end + self:Visible(false) + self.Children[Item]:Visible(true) + self.OnMenuChanged(self, self.Children[self.Items[self:CurrentSelection()]], true) + end +end + +function UIMenu:GoBack() + PlaySoundFrontend(-1, self.Settings.Audio.Back, self.Settings.Audio.Library, true) + self:Visible(false) + if self.ParentMenu ~= nil then + self.ParentMenu:Visible(true) + self.OnMenuChanged(self, self.ParentMenu, false) + if self.Settings.ResetCursorOnOpen then + local W, H = GetActiveScreenResolution() + SetCursorLocation(W / 2, H / 2) + end + end + self.OnMenuClosed(self) +end + +function UIMenu:BindMenuToItem(Menu, Item) + if Menu() == "UIMenu" and Item() == "UIMenuItem" then + Menu.ParentMenu = self + Menu.ParentItem = Item + self.Children[Item] = Menu + end +end + +function UIMenu:ReleaseMenuFromItem(Item) + if Item() == "UIMenuItem" then + if not self.Children[Item] then + return false + end + self.Children[Item].ParentMenu = nil + self.Children[Item].ParentItem = nil + self.Children[Item] = nil + return true + end +end + +function UIMenu:Draw() + if not self._Visible then + return + end + + HideHudComponentThisFrame(19) + + if self.Settings.ControlDisablingEnabled then + self:DisEnableControls(false) + end + + if self.Settings.InstructionalButtons then + DrawScaleformMovieFullscreen(self.InstructionalScaleform, 255, 255, 255, 255, 0) + end + + if self.Settings.ScaleWithSafezone then + ScreenDrawPositionBegin(76, 84) + ScreenDrawPositionRatio(0, 0, 0, 0) + end + + if self.ReDraw then + self:DrawCalculations() + end + + if self.Logo then + self.Logo:Draw() + elseif self.Banner then + self.Banner:Draw() + end + + self.Title:Draw() + + if self.Subtitle.Rectangle then + self.Subtitle.Rectangle:Draw() + self.Subtitle.Text:Draw() + end + + if #self.Items ~= 0 or #self.Windows ~= 0 then + self.Background:Draw() + end + + if #self.Windows ~= 0 then + local WindowOffset = 0 + for index = 1, #self.Windows do + if self.Windows[index - 1] then + WindowOffset = WindowOffset + self.Windows[index - 1].Background:Size().Height + end + local Window = self.Windows[index] + Window:Position(WindowOffset + self.Subtitle.ExtraY - 37) + Window:Draw() + end + end + + if #self.Items == 0 then + if self.Settings.ScaleWithSafezone then + ScreenDrawPositionEnd() + end + return + end + + local CurrentSelection = self:CurrentSelection() + self.Items[CurrentSelection]:Selected(true) + + if self.Items[CurrentSelection]:Description() ~= "" then + self.Description.Bar:Draw() + self.Description.Rectangle:Draw() + self.Description.Text:Draw() + end + + if self.Items[CurrentSelection].Panels ~= nil then + if #self.Items[CurrentSelection].Panels ~= 0 then + local PanelOffset = self:CaclulatePanelPosition(self.Items[CurrentSelection]:Description() ~= "") + for index = 1, #self.Items[CurrentSelection].Panels do + if self.Items[CurrentSelection].Panels[index - 1] then + PanelOffset = PanelOffset + self.Items[CurrentSelection].Panels[index - 1].Background:Size().Height + 5 + end + self.Items[CurrentSelection].Panels[index]:Position(PanelOffset) + self.Items[CurrentSelection].Panels[index]:Draw() + end + end + end + + local WindowHeight = self:CalculateWindowHeight() + + if #self.Items <= self.Pagination.Total + 1 then + local ItemOffset = self.Subtitle.ExtraY - 37 + WindowHeight + for index = 1, #self.Items do + Item = self.Items[index] + Item:Position(ItemOffset) + Item:Draw() + ItemOffset = ItemOffset + self:CalculateItemHeightOffset(Item) + end + else + local ItemOffset = self.Subtitle.ExtraY - 37 + WindowHeight + for index = self.Pagination.Min + 1, self.Pagination.Max, 1 do + if self.Items[index] then + Item = self.Items[index] + Item:Position(ItemOffset) + Item:Draw() + ItemOffset = ItemOffset + self:CalculateItemHeightOffset(Item) + end + end + + self.Extra.Up:Draw() + self.Extra.Down:Draw() + self.ArrowSprite:Draw() + + if self.PageCounter.Text ~= nil then + local Caption = self.PageCounter.PreText .. CurrentSelection .. " / " .. #self.Items + self.PageCounter.Text:Text(Caption) + self.PageCounter.Text:Draw() + end + end + + if self.Settings.ScaleWithSafezone then + ScreenDrawPositionEnd() + end +end + +function UIMenu:ProcessMouse() + if not self._Visible or self.JustOpened or #self.Items == 0 or tobool(Controller()) or not self.Settings.MouseControlsEnabled then + EnableControlAction(0, 2, true) + EnableControlAction(0, 1, true) + EnableControlAction(0, 25, true) + EnableControlAction(0, 24, true) + if self.Dirty then + for _, Item in pairs(self.Items) do + if Item:Hovered() then + Item:Hovered(false) + end + end + end + return + end + + local SafeZone = { X = 0, Y = 0 } + local WindowHeight = self:CalculateWindowHeight() + if self.Settings.ScaleWithSafezone then + SafeZone = GetSafeZoneBounds() + end + + local Limit = #self.Items + local ItemOffset = 0 + + ShowCursorThisFrame() + + if #self.Items > self.Pagination.Total + 1 then + Limit = self.Pagination.Max + end + + if IsMouseInBounds(0, 0, 30, 1080) and self.Settings.MouseEdgeEnabled then + SetGameplayCamRelativeHeading(GetGameplayCamRelativeHeading() + 5) + SetCursorSprite(6) + elseif IsMouseInBounds(1920 - 30, 0, 30, 1080) and self.Settings.MouseEdgeEnabled then + SetGameplayCamRelativeHeading(GetGameplayCamRelativeHeading() - 5) + SetCursorSprite(7) + elseif self.Settings.MouseEdgeEnabled then + SetCursorSprite(1) + end + + for i = self.Pagination.Min + 1, Limit, 1 do + local X, Y = self.Position.X + SafeZone.X, self.Position.Y + 144 - 37 + self.Subtitle.ExtraY + ItemOffset + SafeZone.Y + WindowHeight + local Item = self.Items[i] + local Type, SubType = Item() + local Width, Height = 431 + self.WidthOffset, self:CalculateItemHeightOffset(Item) + + if IsMouseInBounds(X, Y, Width, Height) then + Item:Hovered(true) + if not self.Controls.MousePressed then + if IsDisabledControlJustPressed(0, 24) then + Citizen.CreateThread(function() + local _X, _Y, _Width, _Height = X, Y, Width, Height + self.Controls.MousePressed = true + if Item:Selected() and Item:Enabled() then + if SubType == "UIMenuListItem" then + if IsMouseInBounds(Item.LeftArrow.X + SafeZone.X, Item.LeftArrow.Y + SafeZone.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then + self:GoLeft() + elseif not IsMouseInBounds(Item.RightArrow.X + SafeZone.X, Item.RightArrow.Y + SafeZone.Y, Item.RightArrow.Width, Item.RightArrow.Height) then + self:SelectItem() + end + if IsMouseInBounds(Item.RightArrow.X + SafeZone.X, Item.RightArrow.Y + SafeZone.Y, Item.RightArrow.Width, Item.RightArrow.Height) then + self:GoRight() + elseif not IsMouseInBounds(Item.LeftArrow.X + SafeZone.X, Item.LeftArrow.Y + SafeZone.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then + self:SelectItem() + end + elseif SubType == "UIMenuSliderItem" then + if IsMouseInBounds(Item.LeftArrow.X + SafeZone.X, Item.LeftArrow.Y + SafeZone.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then + self:GoLeft() + elseif not IsMouseInBounds(Item.RightArrow.X + SafeZone.X, Item.RightArrow.Y + SafeZone.Y, Item.RightArrow.Width, Item.RightArrow.Height) then + self:SelectItem() + end + if IsMouseInBounds(Item.RightArrow.X + SafeZone.X, Item.RightArrow.Y + SafeZone.Y, Item.RightArrow.Width, Item.RightArrow.Height) then + self:GoRight() + elseif not IsMouseInBounds(Item.LeftArrow.X + SafeZone.X, Item.LeftArrow.Y + SafeZone.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then + self:SelectItem() + end + elseif SubType == "UIMenuProgressItem" then + if IsMouseInBounds(Item.Bar.X + SafeZone.X, Item.Bar.Y + SafeZone.Y - 12, Item.Data.Max, Item.Bar.Height + 24) then + Item:CalculateProgress(math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) + self.OnProgressChange(self, Item, Item.Data.Index) + Item.OnProgressChanged(self, Item, Item.Data.Index) + else + self:SelectItem() + end + else + self:SelectItem() + end + elseif not Item:Selected() then + self:CurrentSelection(i - 1) + PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true) + self.OnIndexChange(self, self:CurrentSelection()) + self.ReDraw = true + self:UpdateScaleform() + elseif not Item:Enabled() and Item:Selected() then + PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true) + end + Citizen.Wait(175) + while IsDisabledControlPressed(0, 24) and IsMouseInBounds(_X, _Y, _Width, _Height) do + if Item:Selected() and Item:Enabled() then + if SubType == "UIMenuListItem" then + if IsMouseInBounds(Item.LeftArrow.X + SafeZone.X, Item.LeftArrow.Y + SafeZone.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then + self:GoLeft() + end + if IsMouseInBounds(Item.RightArrow.X + SafeZone.X, Item.RightArrow.Y + SafeZone.Y, Item.RightArrow.Width, Item.RightArrow.Height) then + self:GoRight() + end + elseif SubType == "UIMenuSliderItem" then + if IsMouseInBounds(Item.LeftArrow.X + SafeZone.X, Item.LeftArrow.Y + SafeZone.Y, Item.LeftArrow.Width, Item.LeftArrow.Height) then + self:GoLeft() + end + if IsMouseInBounds(Item.RightArrow.X + SafeZone.X, Item.RightArrow.Y + SafeZone.Y, Item.RightArrow.Width, Item.RightArrow.Height) then + self:GoRight() + end + elseif SubType == "UIMenuProgressItem" then + if IsMouseInBounds(Item.Bar.X + SafeZone.X, Item.Bar.Y + SafeZone.Y - 12, Item.Data.Max, Item.Bar.Height + 24) then + Item:CalculateProgress(math.round(GetControlNormal(0, 239) * 1920) - SafeZone.X) + self.OnProgressChange(self, Item, Item.Data.Index) + Item.OnProgressChanged(self, Item, Item.Data.Index) + else + self:SelectItem() + end + end + elseif not Item:Selected() then + self:CurrentSelection(i - 1) + PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true) + self.OnIndexChange(self, self:CurrentSelection()) + self.ReDraw = true + self:UpdateScaleform() + elseif not Item:Enabled() and Item:Selected() then + PlaySoundFrontend(-1, self.Settings.Audio.Error, self.Settings.Audio.Library, true) + end + Citizen.Wait(125) + end + self.Controls.MousePressed = false + end) + end + end + else + Item:Hovered(false) + end + ItemOffset = ItemOffset + self:CalculateItemHeightOffset(Item) + end + + local ExtraX, ExtraY = self.Position.X + SafeZone.X, 144 + self:CalculateItemHeight() + self.Position.Y + SafeZone.Y + WindowHeight + + if #self.Items <= self.Pagination.Total + 1 then return end + + if IsMouseInBounds(ExtraX, ExtraY, 431 + self.WidthOffset, 18) then + self.Extra.Up:Colour(30, 30, 30, 255) + if not self.Controls.MousePressed then + if IsDisabledControlJustPressed(0, 24) then + Citizen.CreateThread(function() + local _ExtraX, _ExtraY = ExtraX, ExtraY + self.Controls.MousePressed = true + if #self.Items > self.Pagination.Total + 1 then + self:GoUpOverflow() + else + self:GoUp() + end + Citizen.Wait(175) + while IsDisabledControlPressed(0, 24) and IsMouseInBounds(_ExtraX, _ExtraY, 431 + self.WidthOffset, 18) do + if #self.Items > self.Pagination.Total + 1 then + self:GoUpOverflow() + else + self:GoUp() + end + Citizen.Wait(125) + end + self.Controls.MousePressed = false + end) + end + end + else + self.Extra.Up:Colour(0, 0, 0, 200) + end + + if IsMouseInBounds(ExtraX, ExtraY + 18, 431 + self.WidthOffset, 18) then + self.Extra.Down:Colour(30, 30, 30, 255) + if not self.Controls.MousePressed then + if IsDisabledControlJustPressed(0, 24) then + Citizen.CreateThread(function() + local _ExtraX, _ExtraY = ExtraX, ExtraY + self.Controls.MousePressed = true + if #self.Items > self.Pagination.Total + 1 then + self:GoDownOverflow() + else + self:GoDown() + end + Citizen.Wait(175) + while IsDisabledControlPressed(0, 24) and IsMouseInBounds(_ExtraX, _ExtraY + 18, 431 + self.WidthOffset, 18) do + if #self.Items > self.Pagination.Total + 1 then + self:GoDownOverflow() + else + self:GoDown() + end + Citizen.Wait(125) + end + self.Controls.MousePressed = false + end) + end + end + else + self.Extra.Down:Colour(0, 0, 0, 200) + end +end + +function UIMenu:AddInstructionButton(button) + if type(button) == "table" and #button == 2 then + table.insert(self.InstructionalButtons, button) + end +end + +function UIMenu:RemoveInstructionButton(button) + if type(button) == "table" then + for i = 1, #self.InstructionalButtons do + if button == self.InstructionalButtons[i] then + table.remove(self.InstructionalButtons, i) + break + end + end + else + if tonumber(button) then + if self.InstructionalButtons[tonumber(button)] then + table.remove(self.InstructionalButtons, tonumber(button)) + end + end + end +end + +function UIMenu:AddEnabledControl(Inputgroup, Control, Controller) + if tonumber(Inputgroup) and tonumber(Control) then + table.insert(self.Settings.EnabledControls[(Controller and "Controller" or "Keyboard")], { Inputgroup, Control }) + end +end + +function UIMenu:RemoveEnabledControl(Inputgroup, Control, Controller) + local Type = (Controller and "Controller" or "Keyboard") + for Index = 1, #self.Settings.EnabledControls[Type] do + if Inputgroup == self.Settings.EnabledControls[Type][Index][1] and Control == self.Settings.EnabledControls[Type][Index][2] then + table.remove(self.Settings.EnabledControls[Type], Index) + break + end + end +end + +function UIMenu:UpdateScaleform() + if not self._Visible or not self.Settings.InstructionalButtons then + return + end + + PushScaleformMovieFunction(self.InstructionalScaleform, "CLEAR_ALL") + PopScaleformMovieFunction() + + PushScaleformMovieFunction(self.InstructionalScaleform, "TOGGLE_MOUSE_BUTTONS") + PushScaleformMovieFunctionParameterInt(0) + PopScaleformMovieFunction() + + PushScaleformMovieFunction(self.InstructionalScaleform, "CREATE_CONTAINER") + PopScaleformMovieFunction() + + PushScaleformMovieFunction(self.InstructionalScaleform, "SET_DATA_SLOT") + PushScaleformMovieFunctionParameterInt(0) + PushScaleformMovieFunctionParameterString(GetControlInstructionalButton(2, 176, 0)) + PushScaleformMovieFunctionParameterString("Select") + PopScaleformMovieFunction() + + if self.Controls.Back.Enabled then + PushScaleformMovieFunction(self.InstructionalScaleform, "SET_DATA_SLOT") + PushScaleformMovieFunctionParameterInt(1) + PushScaleformMovieFunctionParameterString(GetControlInstructionalButton(2, 177, 0)) + PushScaleformMovieFunctionParameterString("Back") + PopScaleformMovieFunction() + end + + local count = 2 + + for i = 1, #self.InstructionalButtons do + if self.InstructionalButtons[i] then + if #self.InstructionalButtons[i] == 2 then + PushScaleformMovieFunction(self.InstructionalScaleform, "SET_DATA_SLOT") + PushScaleformMovieFunctionParameterInt(count) + PushScaleformMovieFunctionParameterString(self.InstructionalButtons[i][1]) + PushScaleformMovieFunctionParameterString(self.InstructionalButtons[i][2]) + PopScaleformMovieFunction() + count = count + 1 + end + end + end + + PushScaleformMovieFunction(self.InstructionalScaleform, "DRAW_INSTRUCTIONAL_BUTTONS") + PushScaleformMovieFunctionParameterInt(-1) + PopScaleformMovieFunction() +end + +--[[ + MenuPool.lua + Menus +--]] + +function MenuPool.New() + local _MenuPool = { + Menus = {} + } + return setmetatable(_MenuPool, MenuPool) +end + +function MenuPool:AddSubMenu(Menu, Text, Description, KeepPosition, KeepBanner) + if Menu() == "UIMenu" then + local Item = UIMenuItem.New(tostring(Text), Description or "") + Menu:AddItem(Item) + local SubMenu + if KeepPosition then + SubMenu = UIMenu.New(Menu.Title:Text(), Text, Menu.Position.X, Menu.Position.Y) + else + SubMenu = UIMenu.New(Menu.Title:Text(), Text) + end + if KeepBanner then + if Menu.Logo ~= nil then + SubMenu.Logo = Menu.Logo + else + SubMenu.Logo = nil + SubMenu.Banner = Menu.Banner + end + end + self:Add(SubMenu) + Menu:BindMenuToItem(SubMenu, Item) + return SubMenu + end +end + +function MenuPool:Add(Menu) + if Menu() == "UIMenu" then + table.insert(self.Menus, Menu) + end +end + +function MenuPool:Clear() + self = { + Menus = {} + } +end + +function MenuPool:Remove() + self = nil +end + +function MenuPool:MouseEdgeEnabled(bool) + if bool ~= nil then + for _, Menu in pairs(self.Menus) do + Menu.Settings.MouseEdgeEnabled = tobool(bool) + end + end +end + +function MenuPool:ControlDisablingEnabled(bool) + if bool ~= nil then + for _, Menu in pairs(self.Menus) do + Menu.Settings.ControlDisablingEnabled = tobool(bool) + end + end +end + +function MenuPool:ResetCursorOnOpen(bool) + if bool ~= nil then + for _, Menu in pairs(self.Menus) do + Menu.Settings.ResetCursorOnOpen = tobool(bool) + end + end +end + +function MenuPool:MultilineFormats(bool) + if bool ~= nil then + for _, Menu in pairs(self.Menus) do + Menu.Settings.MultilineFormats = tobool(bool) + end + end +end + +function MenuPool:Audio(Attribute, Setting) + if Attribute ~= nil and Setting ~= nil then + for _, Menu in pairs(self.Menus) do + if Menu.Settings.Audio[Attribute] then + Menu.Settings.Audio[Attribute] = Setting + end + end + end +end + +function MenuPool:WidthOffset(offset) + if tonumber(offset) then + for _, Menu in pairs(self.Menus) do + Menu:SetMenuWidthOffset(tonumber(offset)) + end + end +end + +function MenuPool:CounterPreText(str) + if str ~= nil then + for _, Menu in pairs(self.Menus) do + Menu.PageCounter.PreText = tostring(str) + end + end +end + +function MenuPool:DisableInstructionalButtons(bool) + if bool ~= nil then + for _, Menu in pairs(self.Menus) do + Menu.Settings.InstructionalButtons = tobool(bool) + end + end +end + +function MenuPool:MouseControlsEnabled(bool) + if bool ~= nil then + for _, Menu in pairs(self.Menus) do + Menu.Settings.MouseControlsEnabled = tobool(bool) + end + end +end + +function MenuPool:RefreshIndex() + for _, Menu in pairs(self.Menus) do + Menu:RefreshIndex() + end +end + +function MenuPool:ProcessMenus() + self:ProcessControl() + self:ProcessMouse() + self:Draw() +end + +function MenuPool:ProcessControl() + for _, Menu in pairs(self.Menus) do + if Menu:Visible() then + Menu:ProcessControl() + end + end +end + +function MenuPool:ProcessMouse() + for _, Menu in pairs(self.Menus) do + if Menu:Visible() then + Menu:ProcessMouse() + end + end +end + +function MenuPool:Draw() + for _, Menu in pairs(self.Menus) do + if Menu:Visible() then + Menu:Draw() + end + end +end + +function MenuPool:IsAnyMenuOpen() + local open = false + for _, Menu in pairs(self.Menus) do + if Menu:Visible() then + open = true + break + end + end + return open +end + +function MenuPool:CloseAllMenus() + for _, Menu in pairs(self.Menus) do + if Menu:Visible() then + Menu:Visible(false) + Menu.OnMenuClosed(Menu) + end + end +end + +function MenuPool:SetBannerSprite(Sprite) + if Sprite() == "Sprite" then + for _, Menu in pairs(self.Menus) do + Menu:SetBannerSprite(Sprite) + end + end +end + +function MenuPool:SetBannerRectangle(Rectangle) + if Rectangle() == "Rectangle" then + for _, Menu in pairs(self.Menus) do + Menu:SetBannerRectangle(Rectangle) + end + end +end + +function MenuPool:TotalItemsPerPage(Value) + if tonumber(Value) then + for _, Menu in pairs(self.Menus) do + Menu.Pagination.Total = Value - 1 + end + end +end + +--[[ + Wrappers +--]] + +function NativeUI.CreatePool() + return MenuPool.New() +end + +function NativeUI.CreateMenu(Title, Subtitle, X, Y, TxtDictionary, TxtName) + return UIMenu.New(Title, Subtitle, X, Y, TxtDictionary, TxtName) +end + +function NativeUI.CreateItem(Text, Description) + return UIMenuItem.New(Text, Description) +end + +function NativeUI.CreateColouredItem(Text, Description, MainColour, HighlightColour) + return UIMenuColouredItem.New(Text, Description, MainColour, HighlightColour) +end + +function NativeUI.CreateCheckboxItem(Text, Check, Description) + return UIMenuCheckboxItem.New(Text, Check, Description) +end + +function NativeUI.CreateListItem(Text, Items, Index, Description) + return UIMenuListItem.New(Text, Items, Index, Description) +end + +function NativeUI.CreateSliderItem(Text, Items, Index, Description, Divider) + return UIMenuSliderItem.New(Text, Items, Index, Description, Divider) +end + +function NativeUI.CreateProgressItem(Text, Items, Index, Description, Counter) + return UIMenuProgressItem.New(Text, Items, Index, Description, Counter) +end + +function NativeUI.CreateHeritageWindow(Mum, Dad) + return UIMenuHeritageWindow.New(Mum, Dad) +end + +function NativeUI.CreateGridPanel(TopText, LeftText, RightText, BottomText) + return UIMenuGridPanel.New(TopText, LeftText, RightText, BottomText) +end + +function NativeUI.CreateColourPanel(Title, Colours) + return UIMenuColourPanel.New(Title, Colours) +end + +function NativeUI.CreatePercentagePanel(MinText, MaxText) + return UIMenuPercentagePanel.New(MinText, MaxText) +end + +function NativeUI.CreateSprite(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A) + return Sprite.New(TxtDictionary, TxtName, X, Y, Width, Height, Heading, R, G, B, A) +end + +function NativeUI.CreateRectangle(X, Y, Width, Height, R, G, B, A) + return UIResRectangle.New(X, Y, Width, Height, R, G, B, A) +end + +function NativeUI.CreateText(Text, X, Y, Scale, R, G, B, A, Font, Alignment, DropShadow, Outline, WordWrap) + return UIResText.New(Text, X, Y, Scale, R, G, B, A, Font, Alignment, DropShadow, Outline, WordWrap) +end diff --git a/resources/dpemotes-master/README.md b/resources/dpemotes-master/README.md new file mode 100644 index 000000000..75a08d9ed --- /dev/null +++ b/resources/dpemotes-master/README.md @@ -0,0 +1,215 @@ +# DpEmotes 🏋️ + +Emotes / Animations for FiveM with human, animal and prop support 🐩 + +# Available in: + +* Brazilian Portuguese 🇧🇷 + +* Czech 🇨🇿 + +* Danish 🇩🇰 + +* Dutch 🇳🇱 + +* English 🇬🇧 + +* Finnish 🇫🇮 + +* French 🇫🇷 + +* German 🇩🇪 + +* Italian 🇮🇹 + +* Spanish 🇪🇸 + +* Swedish 🇸🇪 + +All languages were either translated using Google Translate or contributed by you, the community. + +If you happen to find any incorrect translations or would like to add more languages, please feel free to provide an "issue" with the correct / additional translations. + +Languages can be selected and/or added in config.lua. + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +# Ragdoll 🥴 + +* To enable ragdoll, change `RagdollEnabled = false,` to true in config.lua. + +* To change which key is responsible for ragdoll, `RagdollKeybind = 303` is currently set to `U` by default., -- Get the button number [here](https://docs.fivem.net/game-references/controls/) + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +# Menu Keybind 🎛️ + +**Important Note:** + +The keybind uses RegisterKeyMapping. By default, the server owner configured keybind in the *initial* config.lua will be the default key, however once the keybind is set for a user, it'll stay with this new value. Editing the config keybind will change it for new players only. + +* Menu key:* F5 + +F3 and F4 clash with [Menyoo](https://github.com/MAFINS/MenyooSP) and controllers 🎮 + +Server owners can change this in the `config.lua`; + +```lua +MenuKeybind = 'F5', -- Get the button string here https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ +``` + +Alternatively, the player base can set their own menu keybind to open DpEmotes + +```lua +Esc > settings > keybinds > fivem > dpemotes +``` + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +# Keybinds and SQL 🎛️ + +The original dpemotes uses mysql-async which was then changed to ghmattimysql. Unfortunately, they are no longer maintained. + +To use the SQL features, install the [oxmysql](https://github.com/overextended/oxmysql) resource. If you do not want to use the SQL features, comment out the `oxmysql` region in fxmanifest.lua. + + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +# Screenshots 📸 + + + +| | | | +|-|-|-| +| | | | +| | | | +| | | | +| | | +| | + + + +----------------------------------------------------------------------------------------------------------------------------------------------------- + + +# Installation Instructions ⚙️: + +* add DpEmotes to your `server.cfg` + +* [Enforce gamebuild to latest build](https://forum.cfx.re/t/tutorial-forcing-gamebuild-to-casino-cayo-perico-or-tuners-update/4784977) for all emotes and props to work correctly + +* start dpemotes + + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +# Shared emotes 👩🏻‍❤️‍💋‍👨🏼 + +Emotes will work with either `SyncOffsetFront` or `Attachto`. + +- If it is with `SyncOffsetFront`, then the offset used is the one of the emote the player started.
+For example, if player one starts the emote `handshake`, then player one will have the SyncOffsetFront but not the other player. + + +- If it is with `Attachto`, then it'll either be player one's data used for attaching, or the player two's data.
+For example, if player one start the emote carry, then the other player will be attached but not the player one because Attachto is set in `carry2` and not `carry`.
+- If player one starts the emote `carry2`, then player one will be attached and not the other player. +it's the player who start the animation who will in most cases be moved + + +*Special case, if both emote have the `Attachto` then only the player who started the emote will be attached.* + +You can find a list of ped bones to attach the other player here: [Ped Bones](https://wiki.rage.mp/index.php?title=Bones) + +Using the website provided above, enter the bone ID, ie `1356` and not 111, which is the Bone Index. + + + + +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +# Add-Ons 🛠️ + +* Fixed an issue with the clipboard and adds textures to paper (/e clipboard) + +* Changes umbrella texture to black (/e umbrella) + +# Optional Add-Ons 🛠️ + +* Adds textures to the mugshot prop (/e mugshot) + +* Retextured protest sign (can be changed using Texture Toolkit: https://www.gta5-mods.com/tools/texture-toolkit) + +**Grab it here:** + +[Add-Ons For DpEmotes](https://github.com/TayMcKenzieNZ/addonsfordpemotes) + + +-------------------------------------------------------- + + +# Additional Instructions ⚙️ + +[Please check the fivem forum thread](https://forum.fivem.net/t/dpemotes-356ish-emotes-usable-while-walking-props-and-more/843105) + + + +---------------------- + +# Police Badge 👮 + +- Custom LSPD police badge by [LSPDFR member Sam](https://www.lcpdfr.com/downloads/gta5mods/misc/23386-lspd-police-badge/) + +- LSPD reskinned badge by [GTA5Mods user Sladus_Slawonkus](https://www.gta5-mods.com/misc/lspd-police-badge-replace-sladus_slawonkus) + + +---------------------- + +# FAQs 🗨️ + +**Q: Why do some emotes not work with females?** + +**A:** Blame Rockstar Games. I've done my best to replicate animations to work with females, however some male scenarios have sound effects and particles, of which I am unfamiliar with and syncing particles is out of my expertise. + +---------------------- + +**Q: Why do some emotes not work at all?** + +**A:** Check the Installation Instructions above as you need to be on the highest FiveM gamebuild. + +---------------------- + +**Q: Why do I see particle effects but other players don't?** + +**A:** Dullpear and I can't figure out how to sync particles. If you know how, feel free to inform me. + +---------------------- + +**Q: I bought this script off someone and notice it had a lot of the same animations. Can you help me?** + +**A:** You got scammed and that's your fault. Dpemotes is and always will be **FREE**. + +---------------------- + +**Q: Can I add my own emotes to this?** + +**A:** Of course, see my in depth [tutorial](https://forum.cfx.re/t/how-to-menyoo-to-dpemotes-conversion/4775018) for using Menyoo and converting them to work with dpemotes. + +You may sell ***custom made*** animations, however the menu must remain free. + +---------------------- + +**Q: I bought a pack of custom animations, how can I add them to your fork of dpemotes?** + +**A:** Usually the person who created them will provide code snippets for adding animations to dpemotes. If for whatever reason they haven't, you should contact them. + +---------------------- + +**Q: How do I reset the SQL keybinds?** + +**A:** No idea, but apparently only the server owner can 🤷🏻‍♂️ Google exist; Maybe contact the creator. + +---------------------- + + diff --git a/resources/dpemotes-master/client/AnimationList.lua b/resources/dpemotes-master/client/AnimationList.lua new file mode 100644 index 000000000..e6ab0db46 --- /dev/null +++ b/resources/dpemotes-master/client/AnimationList.lua @@ -0,0 +1,4016 @@ +-- DPEmotes forked by TayMcKenzieNZ requires you to be on the latest FiveM Gamebuild for all emotes to function. +-- If an emote does not work, you may be on an older gamebuild. +-- To get a higher gamebuild, see ReadMe on github repositorty +DP = {} + +-- EXPRESSIONS -- + +DP.Expressions = { + ["Angry"] = { "Expression", "mood_angry_1" }, + ["Drunk"] = { "Expression", "mood_drunk_1" }, + ["Dumb"] = { "Expression", "pose_injured_1" }, + ["Electrocuted"] = { "Expression", "electrocuted_1" }, + ["Grumpy"] = { "Expression", "effort_1" }, + ["Grumpy2"] = { "Expression", "mood_drivefast_1" }, + ["Grumpy3"] = { "Expression", "pose_angry_1" }, + ["Happy"] = { "Expression", "mood_happy_1" }, + ["Injured"] = { "Expression", "mood_injured_1" }, + ["Joyful"] = { "Expression", "mood_dancing_low_1" }, + ["Mouthbreather"] = { "Expression", "smoking_hold_1" }, + ["Never Blink"] = { "Expression", "pose_normal_1" }, + ["One Eye"] = { "Expression", "pose_aiming_1" }, + ["Shocked"] = { "Expression", "shocked_1" }, + ["Shocked2"] = { "Expression", "shocked_2" }, + ["Sleeping"] = { "Expression", "mood_sleeping_1" }, + ["Sleeping2"] = { "Expression", "dead_1" }, + ["Sleeping3"] = { "Expression", "dead_2" }, + ["Smug"] = { "Expression", "mood_smug_1" }, + ["Speculative"] = { "Expression", "mood_aiming_1" }, + ["Stressed"] = { "Expression", "mood_stressed_1" }, + ["Sulking"] = { "Expression", "mood_sulk_1" }, + ["Weird"] = { "Expression", "effort_2" }, + ["Weird2"] = { "Expression", "effort_3" }, +} + + +--- WALKSTYLES --- + + +DP.Walks = { + ["Alien"] = { "move_m@alien" }, + ["Armored"] = { "anim_group_move_ballistic" }, + ["Arrogant"] = { "move_f@arrogant@a" }, + ["Brave"] = { "move_m@brave" }, + ["Casual"] = { "move_m@casual@a" }, + ["Casual 2"] = { "move_m@casual@b" }, + ["Casual 3"] = { "move_m@casual@c" }, + ["Casual 4"] = { "move_m@casual@d" }, + ["Casual 5"] = { "move_m@casual@e" }, + ["Casual 6"] = { "move_m@casual@f" }, + ["Chichi"] = { "move_f@chichi" }, + ["Confident"] = { "move_m@confident" }, + ["Cop"] = { "move_m@business@a" }, + ["Cop 2"] = { "move_m@business@b" }, + ["Cop 3"] = { "move_m@business@c" }, + ["Default Female"] = { "move_f@multiplayer" }, + ["Default Male"] = { "move_m@multiplayer" }, + ["Drunk"] = { "move_m@drunk@a" }, + ["Drunk"] = { "move_m@drunk@slightlydrunk" }, + ["Drunk 2"] = { "move_m@buzzed" }, + ["Drunk 3"] = { "move_m@drunk@verydrunk" }, + ["Femme"] = { "move_f@femme@" }, + ["Fire"] = { "move_characters@franklin@fire" }, + ["Fire2"] = { "move_characters@michael@fire" }, + ["Fire3"] = { "move_m@fire" }, + ["Flee"] = { "move_f@flee@a" }, + ["Franklin"] = { "move_p_m_one" }, + ["Gangster"] = { "move_m@gangster@generic" }, + ["Gangster 2"] = { "move_m@gangster@ng" }, + ["Gangster 3"] = { "move_m@gangster@var_e" }, + ["Gangster 4"] = { "move_m@gangster@var_f" }, + ["Gangster 5"] = { "move_m@gangster@var_i" }, + ["Grooving"] = { "anim@move_m@grooving@" }, + ["Guard"] = { "move_m@prison_gaurd" }, + ["Handcuffs"] = { "move_m@prisoner_cuffed" }, + ["Heels"] = { "move_f@heels@c" }, + ["Heels 2"] = { "move_f@heels@d" }, + ["Hiking"] = { "move_m@hiking" }, + ["Hipster"] = { "move_m@hipster@a" }, + ["Hobo"] = { "move_m@hobo@a" }, + ["Hurry"] = { "move_f@hurry@a" }, + ["Janitor"] = { "move_p_m_zero_janitor" }, + ["Janitor 2"] = { "move_p_m_zero_slow" }, + ["Jog"] = { "move_m@jog@" }, + ["Lemar"] = { "anim_group_move_lemar_alley" }, + ["Lester"] = { "move_heist_lester" }, + ["Lester 2"] = { "move_lester_caneup" }, + ["Maneater"] = { "move_f@maneater" }, + ["Michael"] = { "move_ped_bucket" }, + ["Money"] = { "move_m@money" }, + ["Muscle"] = { "move_m@muscle@a" }, + ["Posh"] = { "move_m@posh@" }, + ["Posh 2"] = { "move_f@posh@" }, + ["Quick"] = { "move_m@quick" }, + ["Runner"] = { "female_fast_runner" }, + ["Sad"] = { "move_m@sad@a" }, + ["Sassy"] = { "move_m@sassy" }, + ["Sassy 2"] = { "move_f@sassy" }, + ["Scared"] = { "move_f@scared" }, + ["Sexy"] = { "move_f@sexy@a" }, + ["Shady"] = { "move_m@shadyped@a" }, + ["Slow"] = { "move_characters@jimmy@slow@" }, + ["Swagger"] = { "move_m@swagger" }, + ["Tough"] = { "move_m@tough_guy@" }, + ["Tough 2"] = { "move_f@tough_guy@" }, + ["Trash"] = { "clipset@move@trash_fast_turn" }, + ["Trash 2"] = { "missfbi4prepp1_garbageman" }, + ["Trevor"] = { "move_p_m_two" }, + ["Wide"] = { "move_m@bag" }, + ["Chubby Male"] = { "move_chubby" }, --male + ["Chubby Female"] = { "move_f@chubby@a" }, --female + ["Depressed"] = { "move_m@depressed@a" }, + ["Depressed 2"] = { "move_m@depressed@b" }, + + + + + -- I cant get these to work for some reason, if anyone knows a fix, let me know + + + + + -- ["Caution"] = {"move_m@caution"}, -- breaks menu + --["Chubby"] = {"anim@move_m@chubby@a"},-- breaks menu + -- ["Crazy"] = {"move_m@crazy"},-- breaks menu + -- ["Joy"] = {"move_m@joy@a"},-- breaks menu + -- ["Power"] = {"move_m@power"},-- breaks menu + -- ["Wading"] = {"move_m@wading"} -- breaks menu + -- ["Depressed 3"] = { "move_m@depressed@c" }, -- breaks menu + -- ["Depressed 4"] = { "move_m@depressed@d" }, -- breaks menu + -- ["Caution"] = { "move_m@caution" },-- breaks menu + -- ["Crazy"] = { "move_m@crazy" }, -- breaks menu + -- ["Joy"] = { "move_m@joy@a" }, -- breaks menu + -- ["Power"] = { "move_m@power" }, -- breaks menu + -- ["Power Walk"] = { "move_m@powerwalk" }, -- breaks menu + -- ["Tired"] = { "move_m@tired" }, -- breaks menu + -- --["Wading"] = {"move_m@wading"},-- breaks menu +} + + +--- SHARED EMOTES --- I can not figue these out and would love to get custom emotes shared. DullPear doesn't answer his DMs. RIP. + +DP.Shared = { + --[emotename] = {dictionary, animation, displayname, targetemotename, additionalanimationoptions} + -- you dont have to specify targetemoteanem, if you do dont it will just play the same animation on both. + -- targetemote is used for animations that have a corresponding animation to the other player. + ["handshake"] = { "mp_ped_interaction", "handshake_guy_a", "Handshake", "Handshake2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000, + SyncOffsetFront = 0.9 + }}, + ["handshake2"] = { "mp_ped_interaction", "handshake_guy_b", "Handshake 2", "handshake", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000 + }}, + ["hug"] = { "mp_ped_interaction", "kisses_guy_a", "Hug", "hug2", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 5000, + SyncOffsetFront = 1.05, + }}, + ["hug2"] = { "mp_ped_interaction", "kisses_guy_b", "Hug 2", "hug", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 5000, + SyncOffsetFront = 1.13 + }}, + ["hug3"] = { "misscarsteal2chad_goodbye", "chad_armsaround_chad", "Hug 3", "hug4", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + SyncOffsetFront = 0.05, + }}, + ["hug4"] = { "misscarsteal2chad_goodbye", "chad_armsaround_girl", "Hug 4", "hug3", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + SyncOffsetFront = 0.13 + }}, + ["kiss"] = { "mp_ped_interaction", "kisses_guy_a", "Kiss", "kiss2", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 5000, + SyncOffsetFront = 1.05, + }}, + ["kiss2"] = { "mp_ped_interaction", "kisses_guy_b", "Kiss 2", "kiss", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 5000, + SyncOffsetFront = 1.13 + }}, + ["bro"] = { "mp_ped_interaction", "hugs_guy_a", "Bro", "bro2", AnimationOptions = { + SyncOffsetFront = 1.14 + }}, + ["bro2"] = { "mp_ped_interaction", "hugs_guy_b", "Bro 2", "bro", AnimationOptions = { + SyncOffsetFront = 1.14 + }}, + ["give"] = { "mp_common", "givetake1_a", "Give", "give2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 2000 + }}, + ["give2"] = { "mp_common", "givetake1_b", "Give 2", "give", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 2000 + }}, + ["baseball"] = { "anim@arena@celeb@flat@paired@no_props@", "baseball_a_player_a", "Baseball", "baseballthrow" }, + ["baseballthrow"] = { "anim@arena@celeb@flat@paired@no_props@", "baseball_a_player_b", "Baseball Throw", "baseball" }, + ["stickup"] = { "random@countryside_gang_fight", "biker_02_stickup_loop", "Stick Up", "stickupscared", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["stickupscared"] = { "missminuteman_1ig_2", "handsup_base", "Stickup Scared", "stickup", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["punch"] = { "melee@unarmed@streamed_variations", "plyr_takedown_rear_lefthook", "Punch", "punched" }, + ["punched"] = { "melee@unarmed@streamed_variations", "victim_takedown_front_cross_r", "Punched", "punch" }, + ["headbutt"] = { "melee@unarmed@streamed_variations", "plyr_takedown_front_headbutt", "Headbutt", "headbutted" }, + ["headbutted"] = { "melee@unarmed@streamed_variations", "victim_takedown_front_headbutt", "Headbutted", "headbutt" }, + ["slap2"] = { "melee@unarmed@streamed_variations", "plyr_takedown_front_backslap", "Slap 2", "slapped2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + EmoteDuration = 2000, + }}, + ["slap"] = { "melee@unarmed@streamed_variations", "plyr_takedown_front_slap", "Slap", "slapped", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + EmoteDuration = 2000, + }}, + ["slapped"] = { "melee@unarmed@streamed_variations", "victim_takedown_front_slap", "Slapped", "slap" }, + ["slapped2"] = { "melee@unarmed@streamed_variations", "victim_takedown_front_backslap", "Slapped 2", "slap2" }, + ["receiveblowjob"] = { "misscarsteal2pimpsex", "pimpsex_punter", "Receive Blowjob", "giveblowjob", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 30000, + SyncOffsetFront = 0.63 + }}, + ["giveblowjob"] = { "misscarsteal2pimpsex", "pimpsex_hooker", "Give Blowjob", "receiveblowjob", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 30000, + SyncOffsetFront = 0.63 + }}, + ["streetsexmale"] = { "misscarsteal2pimpsex", "shagloop_pimp", "Street Sex Male", "streetsexfemale", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + SyncOffsetFront = 0.50 + }}, + ["streetsexfemale"] = { "misscarsteal2pimpsex", "shagloop_hooker", "Street Sex Female", "streetsexmale", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + SyncOffsetFront = 0.50 + }}, + ["carry"] = { "missfinale_c2mcs_1", "fin_c2_mcs_1_camman", "Carry", "carry2", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + } }, + ["carry2"] = { "nm", "firemans_carry", "Be carried", "carry", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + Attachto = true, + bone = 0, + xPos = 0.27, + yPos = 0.10, + zPos = 0.60, + xRot = 0.0, + yRot = 0.0, + zRot = 10.0, + } }, +} + + +--- DANCING EMOTES, SOME WITH PROPS --- + + +DP.Dances = { + ["dance"] = { "anim@amb@nightclub@dancers@podium_dancers@", "hi_dance_facedj_17_v2_male^5", "Dance", AnimationOptions = { + EmoteLoop = true, + }}, + ["dance2"] = { "anim@amb@nightclub@mini@dance@dance_solo@male@var_b@", "high_center_down", "Dance 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["dance3"] = { "anim@amb@nightclub@mini@dance@dance_solo@male@var_a@", "high_center", "Dance 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["dance4"] = { "anim@amb@nightclub@mini@dance@dance_solo@male@var_b@", "high_center_up", "Dance 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["dance5"] = { "anim@amb@casino@mini@dance@dance_solo@female@var_a@", "med_center", "Dance 5", AnimationOptions = { + EmoteLoop = true + }}, + ["dance6"] = { "misschinese2_crystalmazemcs1_cs", "dance_loop_tao", "Dance 6", AnimationOptions = { + EmoteLoop = true, + }}, + ["dance7"] = { "misschinese2_crystalmazemcs1_ig", "dance_loop_tao", "Dance 7", AnimationOptions = { + EmoteLoop = true, + }}, + ["dance8"] = { "missfbi3_sniping", "dance_m_default", "Dance 8", AnimationOptions = { + EmoteLoop = true, + }}, + ["dance9"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_a@", "med_center_up", "Dance 9", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancef"] = { "anim@amb@nightclub@dancers@solomun_entourage@", "mi_dance_facedj_17_v1_female^1", "Dance F", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancef2"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_a@", "high_center", "Dance F2", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancef3"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_a@", "high_center_up", "Dance F3", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancef4"] = { "anim@amb@nightclub@dancers@crowddance_facedj@hi_intensity", "hi_dance_facedj_09_v2_female^1", "Dance F4", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancef5"] = { "anim@amb@nightclub@dancers@crowddance_facedj@hi_intensity", "hi_dance_facedj_09_v2_female^3", "Dance F5", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancef6"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_a@", "high_center_up", "Dance F6", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclub"] = { "anim@amb@nightclub_island@dancers@beachdance@", "hi_idle_a_m03", "Dance Club", AnimationOptions = { + EmoteLoop = true + }}, + ["danceclubb"] = { "anim@amb@nightclub_island@dancers@beachdance@", "hi_idle_a_m05", "Dance Club 2", AnimationOptions = { + EmoteLoop = true + }}, + ["danceclubc"] = { "anim@amb@nightclub_island@dancers@beachdance@", "hi_idle_a_m02", "Dance Club 3", AnimationOptions = { + EmoteLoop = true + }}, + ["danceclubd"] = { "anim@amb@nightclub_island@dancers@beachdance@", "hi_idle_b_f01", "Dance Club 4", AnimationOptions = { + EmoteLoop = true + }}, + ["danceclube"] = { "anim@amb@nightclub_island@dancers@club@", "hi_idle_a_f02", "Dance Club 5", AnimationOptions = { + EmoteLoop = true + }}, + ["danceclubf"] = { "anim@amb@nightclub_island@dancers@club@", "hi_idle_b_m03", "Dance Club 6", AnimationOptions = { + EmoteLoop = true + }}, + ["danceclubg"] = { "anim@amb@nightclub_island@dancers@club@", "hi_idle_d_f01", "Dance Club 7", AnimationOptions = { + EmoteLoop = true + }}, + ["danceclubh"] = { "anim@amb@nightclub_island@dancers@crowddance_facedj@", "mi_dance_facedj_17_v2_male^4", "Dance Club 8 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubi"] = { "anim@amb@nightclub_island@dancers@crowddance_single_props@", "mi_dance_prop_13_v1_male^3", "Dance Club 9 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubj"] = { "anim@amb@nightclub_island@dancers@crowddance_groups@groupd@", "mi_dance_crowd_13_v2_male^1", "Dance Club 10 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubk"] = { "anim@amb@nightclub_island@dancers@crowddance_facedj@", "mi_dance_facedj_15_v2_male^4", "Dance Club 11 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubl"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_a@", "high_center_up", "Dance Club 12", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubm"] = { "anim@amb@nightclub_island@dancers@crowddance_facedj@", "hi_dance_facedj_hu_15_v2_male^5", "Dance Club 13 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubn"] = { "anim@amb@nightclub_island@dancers@crowddance_facedj@", "hi_dance_facedj_hu_17_male^5", "Dance Club 14 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubo"] = { "anim@amb@nightclub@mini@dance@dance_solo@shuffle@", "high_center", "Dance Club 15 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceclubp"] = { "anim@amb@nightclub@mini@dance@dance_solo@shuffle@", "high_left_down", "Dance Club 16 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancedrink"] = { "anim@amb@nightclub_island@dancers@beachdanceprop@", "mi_idle_c_m01", "Dance Drink (Beer)", AnimationOptions = { + Prop = 'prop_beer_amopen', + PropBone = 28422, + PropPlacement = { 0.0, 0.00, 0.0, 0.0, 0.0, 20.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancedrink2"] = { "anim@amb@nightclub_island@dancers@beachdanceprop@", "mi_loop_f1", "Dance Drink 2 (Wine)", AnimationOptions = { + Prop = 'p_wine_glass_s', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0900, 0.0, 0.0, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancedrink3"] = { "anim@amb@nightclub_island@dancers@beachdanceprop@", "mi_loop_m04", "Dance Drink 3 (Whiskey)", AnimationOptions = { + Prop = 'ba_prop_battle_whiskey_opaque_s', + PropBone = 28422, + PropPlacement = { -0.0100, 0.00, 0.0, 0.0, 0.0, 10.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancedrink4"] = { "anim@amb@nightclub_island@dancers@beachdanceprops@male@", "mi_idle_b_m04", "Dance Drink 4 (Whiskey)", AnimationOptions = { + Prop = 'ba_prop_battle_whiskey_opaque_s', + PropBone = 28422, + PropPlacement = { -0.0100, 0.00, 0.0, 0.0, 0.0, 10.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancedrink5"] = { "anim@amb@nightclub_island@dancers@crowddance_single_props@", "hi_dance_prop_09_v1_female^3", "Dance Drink 5 (Wine)", AnimationOptions = { + Prop = 'p_wine_glass_s', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0900, 0.0, 0.0, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancedrink6"] = { "anim@amb@nightclub_island@dancers@crowddance_single_props@", "hi_dance_prop_09_v1_male^3", "Dance Drink 6 (Beer)", AnimationOptions = { + Prop = 'prop_beer_logopen', + PropBone = 28422, + PropPlacement = { 0.0090, 0.0010, -0.0310, 180.0, 180.0, -69.99 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancedrink7"] = { "anim@amb@nightclub_island@dancers@crowddance_single_props@", "hi_dance_prop_11_v1_female^3", "Dance Drink 7 (Wine)", AnimationOptions = { + Prop = 'p_wine_glass_s', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0900, 0.0, 0.0, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancedrink8"] = { "anim@amb@nightclub_island@dancers@crowddance_single_props@", "hi_dance_prop_11_v1_female^1", "Dance Drink 8 (Wine)", AnimationOptions = { + Prop = 'p_wine_glass_s', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0900, 0.0, 0.0, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["danceslow2"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_a@", "low_center", "Dance Slow 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceslow3"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_a@", "low_center_down", "Dance Slow 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceslow4"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_b@", "low_center", "Dance Slow 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceupper"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_b@", "high_center", "Dance Upper", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["danceupper2"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_b@", "high_center_up", "Dance Upper 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["danceshy"] = { "anim@amb@nightclub@mini@dance@dance_solo@male@var_a@", "low_center", "Dance Shy", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceshy2"] = { "anim@amb@nightclub@mini@dance@dance_solo@female@var_b@", "low_center_down", "Dance Shy 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["danceslow"] = { "anim@amb@nightclub@mini@dance@dance_solo@male@var_b@", "low_center", "Dance Slow", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly9"] = { "rcmnigel1bnmt_1b", "dance_loop_tyler", "Dance Silly 9", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly"] = { "special_ped@mountain_dancer@monologue_3@monologue_3a", "mnt_dnc_buttwag", "Dance Silly", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly2"] = { "move_clown@p_m_zero_idles@", "fidget_short_dance", "Dance Silly 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly3"] = { "move_clown@p_m_two_idles@", "fidget_short_dance", "Dance Silly 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly4"] = { "anim@amb@nightclub@lazlow@hi_podium@", "danceidle_hi_11_buttwiggle_b_laz", "Dance Silly 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly5"] = { "timetable@tracy@ig_5@idle_a", "idle_a", "Dance Silly 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly6"] = { "timetable@tracy@ig_8@idle_b", "idle_d", "Dance Silly 6", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancesilly7"] = { "anim@amb@casino@mini@dance@dance_solo@female@var_b@", "med_center", "Dance Silly 7", AnimationOptions = { + EmoteLoop = true + }}, + ["dancesilly8"] = { "anim@amb@casino@mini@dance@dance_solo@female@var_b@", "high_center", "Dance Silly 8", AnimationOptions = { + EmoteLoop = true + }}, + ["dancesilly9"] = { "anim@mp_player_intcelebrationfemale@the_woogie", "the_woogie", "Dance Silly 9", AnimationOptions = { + EmoteLoop = true + }}, + ["danceglowstick"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_13_mi_hi_sexualgriding_laz", "Dance Glowsticks", AnimationOptions = { + Prop = 'ba_prop_battle_glowstick_01', + PropBone = 28422, + PropPlacement = { 0.0700, 0.1400, 0.0, -80.0, 20.0 }, + SecondProp = 'ba_prop_battle_glowstick_01', + SecondPropBone = 60309, + SecondPropPlacement = { 0.0700, 0.0900, 0.0, -120.0, -20.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["danceglowstick2"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_12_mi_hi_bootyshake_laz", "Dance Glowsticks 2", AnimationOptions = { + Prop = 'ba_prop_battle_glowstick_01', + PropBone = 28422, + PropPlacement = { 0.0700, 0.1400, 0.0, -80.0, 20.0 }, + SecondProp = 'ba_prop_battle_glowstick_01', + SecondPropBone = 60309, + SecondPropPlacement = { 0.0700, 0.0900, 0.0, -120.0, -20.0 }, + EmoteLoop = true, + }}, + ["danceglowstick3"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Glowsticks 3", AnimationOptions = { + Prop = 'ba_prop_battle_glowstick_01', + PropBone = 28422, + PropPlacement = { 0.0700, 0.1400, 0.0, -80.0, 20.0 }, + SecondProp = 'ba_prop_battle_glowstick_01', + SecondPropBone = 60309, + SecondPropPlacement = { 0.0700, 0.0900, 0.0, -120.0, -20.0 }, + EmoteLoop = true, + }}, + ["dancehorse"] = { "anim@amb@nightclub@lazlow@hi_dancefloor@", "dancecrowd_li_15_handup_laz", "Dance Horse", AnimationOptions = { + Prop = "ba_prop_battle_hobby_horse", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["dancehorse2"] = { "anim@amb@nightclub@lazlow@hi_dancefloor@", "crowddance_hi_11_handup_laz", "Dance Horse 2", AnimationOptions = { + Prop = "ba_prop_battle_hobby_horse", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["dancehorse3"] = { "anim@amb@nightclub@lazlow@hi_dancefloor@", "dancecrowd_li_11_hu_shimmy_laz", "Dance Horse 3", AnimationOptions = { + Prop = "ba_prop_battle_hobby_horse", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["dj"] = { "anim@amb@nightclub@djs@dixon@", "dixn_dance_cntr_open_dix", "DJ", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["dj2"] = { "anim@amb@nightclub@djs@solomun@", "sol_idle_ctr_mid_a_sol", "DJ 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj3"] = { "anim@amb@nightclub@djs@solomun@", "sol_dance_l_sol", "DJ 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj4"] = { "anim@amb@nightclub@djs@black_madonna@", "dance_b_idle_a_blamadon", "DJ 4", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj5"] = { "anim@amb@nightclub@djs@dixon@", "dixn_end_dix", "DJ 5", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj5"] = { "anim@amb@nightclub@djs@dixon@", "dixn_idle_cntr_a_dix", "DJ 5", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj6"] = { "anim@amb@nightclub@djs@dixon@", "dixn_idle_cntr_b_dix", "DJ 6", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj7"] = { "anim@amb@nightclub@djs@dixon@", "dixn_idle_cntr_g_dix", "DJ 7", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj8"] = { "anim@amb@nightclub@djs@dixon@", "dixn_idle_cntr_gb_dix", "DJ 8", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dj9"] = { "anim@amb@nightclub@djs@dixon@", "dixn_sync_cntr_j_dix", "DJ 9", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["twerk"] = { "switch@trevor@mocks_lapdance", "001443_01_trvs_28_idle_stripper", "Twerk", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdance"] = { "mp_safehouse", "lap_dance_girl", "Lapdance" }, + ["lapdance2"] = { "mini@strip_club@private_dance@idle", "priv_dance_idle", "Lapdance 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdance3"] = { "mini@strip_club@private_dance@part1", "priv_dance_p1", "Lapdance 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdance4"] = { "mini@strip_club@private_dance@part2", "priv_dance_p2", "Lapdance 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdance5"] = { "mini@strip_club@private_dance@part3", "priv_dance_p3", "Lapdance 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdance6"] = { "oddjobs@assassinate@multi@yachttarget@lapdance", "yacht_ld_f", "Lapdance 6", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdancewith"] = { "mini@strip_club@lap_dance_2g@ld_2g_p3", "ld_2g_p3_s2", "Lapdance With", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdancewith2"] = { "mini@strip_club@lap_dance_2g@ld_2g_p2", "ld_2g_p2_s2", "Lapdance With2", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapdancewith3"] = { "mini@strip_club@lap_dance_2g@ld_2g_p1", "ld_2g_p1_s2", "Lapdance With3", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapchair"] = { "mini@strip_club@lap_dance@ld_girl_a_song_a_p1", "ld_girl_a_song_a_p1_f", "Lap Chair", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapchair2"] = { "mini@strip_club@lap_dance@ld_girl_a_song_a_p2", "ld_girl_a_song_a_p2_f", "Lap Chair2", AnimationOptions = { + EmoteLoop = true, + }}, + ["lapchair3"] = { "mini@strip_club@lap_dance@ld_girl_a_song_a_p3", "ld_girl_a_song_a_p3_f", "Lap Chair3", AnimationOptions = { + EmoteLoop = true, + }}, + ["salsa"] = { "anim@mp_player_intuppersalsa_roll", "idle_a", "Salso Roll", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancecrankdat"] = { "anim@amb@nightclub@mini@dance@dance_solo@shuffle@", "high_right_up", "Dance Crank Dat", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancecrankdat2"] = { "anim@amb@nightclub@mini@dance@dance_solo@shuffle@", "high_right_down", "Dance Crank Dat 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancemonkey"] = { "anim@amb@nightclub@mini@dance@dance_solo@techno_monkey@", "high_center", "Monkey Dance ", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancemonkey2"] = { "anim@amb@nightclub@mini@dance@dance_solo@techno_monkey@", "high_center_down", "Monkey Dance 2 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancemonkey3"] = { "anim@amb@nightclub@mini@dance@dance_solo@techno_monkey@", "med_center_down", "Monkey Dance 3 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["boxdance"] = { "anim@amb@nightclub@mini@dance@dance_solo@beach_boxing@", "med_right_down", "Boxing Dance Solo ", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancehiphop"] = { "anim@amb@nightclub@mini@dance@dance_paired@dance_d@", "ped_a_dance_idle", "Hip Hop Dance ", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancehiphop2"] = { "anim@amb@nightclub@mini@dance@dance_paired@dance_b@", "ped_a_dance_idle", "Hip Hop Dance 2 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancehiphop3"] = { "anim@amb@nightclub@mini@dance@dance_paired@dance_a@", "ped_a_dance_idle", "Hip Hop Dance 3 ", AnimationOptions = { + EmoteLoop = true, + }}, + ["dancepride"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride A", AnimationOptions = { + Prop = 'lilprideflag1', --- Rainbow + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag1', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["danceprideb"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride B - LGBTQIA", AnimationOptions = { + Prop = 'lilprideflag2', --- LGBTQIA + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag2', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancepridec"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride C - Bisexual", AnimationOptions = { + Prop = 'lilprideflag3', --- Bisexual + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag3', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancepridec"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride C - Lesbian", AnimationOptions = { + Prop = 'lilprideflag4', --- Lesbian + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag4', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["danceprided"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride D - Pansexual", AnimationOptions = { + Prop = 'lilprideflag5', --- Pansexual + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag5', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancepridee"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride E - Transexual", AnimationOptions = { + Prop = 'lilprideflag6', --- Transexual + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag6', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dancepridef"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride F - Non Binary", AnimationOptions = { + Prop = 'lilprideflag7', --- Lesbian + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag7', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["danceprideg"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride G - Asexual", AnimationOptions = { + Prop = 'lilprideflag8', --- Asexual + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag8', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["danceprideh"] = { "anim@amb@nightclub@lazlow@hi_railing@", "ambclub_09_mi_hi_bellydancer_laz", "Dance Pride H - Straight Ally", AnimationOptions = { + Prop = 'lilprideflag9', --- Straight Ally + PropBone = 18905, + PropPlacement = { 0.0900, 0.0000, 0.0300, -39.911, 93.9166, -5.8062 }, + SecondProp = 'lilprideflag9', + SecondPropBone = 57005, + SecondPropPlacement = { 0.0900, -0.0200, -0.0300, -90.2454, 5.7068, -28.7797 }, + EmoteLoop = true, + EmoteMoving = false, + }}, +} + + +---- ANIMAL EMOTES ---- +---- BIG DOG ---- + +DP.AnimalEmotes = { + ["bdogbark"] = { "creatures@rottweiler@amb@world_dog_barking@idle_a", "idle_a", "Bark (big dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["bdogbeg"] = { "creatures@rottweiler@tricks@", "beg_loop", "Beg (big dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["bdogbeg2"] = { "creatures@rottweiler@tricks@", "paw_right_loop", "Beg 2 (big dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["bdogdump"] = { "creatures@rottweiler@move", "dump_loop", "Dump (big dog)", AnimationOptions = { + Prop = 'prop_big_shit_02', + PropBone = 51826, + PropPlacement = { 0.0, 0.2000, -0.4600, 0.0, -20.00, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogitch"] = { "creatures@rottweiler@amb@world_dog_sitting@idle_a", "idle_a", "Itch (big dog)", AnimationOptions = { + EmoteDuration = 2000 + }}, + ["bdogsleep"] = { "creatures@rottweiler@amb@sleep_in_kennel@", "sleep_in_kennel", "Sleep (big dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["bdogsit"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit (big dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["bdogpee"] = { "creatures@rottweiler@move", "pee_left_idle", "Pee (big dog)", AnimationOptions = { + EmoteLoop = false + }}, + ["bdogpee2"] = { "creatures@rottweiler@move", "pee_right_idle", "Pee 2 (big dog)", AnimationOptions = { + EmoteLoop = false + }}, + ["sdogbark"] = { "creatures@pug@amb@world_dog_barking@idle_a", "idle_a", "Bark (small dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["bdogglowa"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "nill", "Glow Stick (big dog)", AnimationOptions = { + Prop = 'ba_prop_battle_glowstick_01', + PropBone = 31086, + PropPlacement = { 0.2000, 0.000, -0.0600, 90.00, 0.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["bdogglowb"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Glow Stick Sitting (big dog)", AnimationOptions = { + Prop = 'ba_prop_battle_glowstick_01', + PropBone = 31086, + PropPlacement = { 0.2000, 0.000, -0.0600, 90.00, 0.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogpridea"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride A (big dog)", AnimationOptions = { + Prop = 'lilprideflag1', ---Rainbow + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag1', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogprideb"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride B - LGBTQIA (big dog)", AnimationOptions = { + Prop = 'lilprideflag2', --LGBTQIA + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag2', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogpridec"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride C - Bisexual (big dog)", AnimationOptions = { + Prop = 'lilprideflag3', --Bisexual + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag3', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogprided"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride D - Lesbian (big dog)", AnimationOptions = { + Prop = 'lilprideflag4', --Lesbian + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag4', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogpridee"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride E - Pansexual (big dog)", AnimationOptions = { + Prop = 'lilprideflag5', --Pansexual + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag5', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogpridef"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride F - Transexual (big dog)", AnimationOptions = { + Prop = 'lilprideflag6', --Transexual + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag6', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogprideg"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride G - Non Binary (big dog)", AnimationOptions = { + Prop = 'lilprideflag7', --Non Binary + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag7', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogprideh"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride H - Asexual (big dog)", AnimationOptions = { + Prop = 'lilprideflag8', --Non Binary + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag8', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bdogpridei"] = { "creatures@rottweiler@amb@world_dog_sitting@base", "base", "Sit Pride I - Straight Ally (big dog)", AnimationOptions = { + Prop = 'lilprideflag9', --Straight Ally + PropBone = 31086, + PropPlacement = { 0.1900, 0.0000, -0.0500, 100.0000, 90.0000, 0.0000 }, + SecondProp = 'lilprideflag9', + SecondPropBone = 31086, + SecondPropPlacement = { 0.1940, 0.020, -0.0500, -90.0000, -90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + + +---- ANIMAL EMOTES ---- +---- SMALL DOG ---- + + + }}, + ["sdogitch"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_a", "Itch (small dog)", AnimationOptions = { + EmoteDuration = 2000 + }}, + ["sdogsit"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Sit (small dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["sdogld"] = { "misssnowie@little_doggy_lying_down", "base", "Lay Down (small dog)", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogshake"] = { "creatures@pug@amb@world_dog_barking@idle_a", "idle_c", "Shake (small dog)", AnimationOptions = { + EmoteLoop = true + }}, + ["sdogdance"] = { "creatures@pug@move", "idle_turn_0", "Dance (small dog)", AnimationOptions = { + Prop = 'ba_prop_battle_glowstick_01', + PropBone = 31086, + PropPlacement = { 0.1500, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdance2"] = { "creatures@pug@move", "idle_turn_0", "Dance 2 (small dog)", AnimationOptions = { + Prop = 'ba_prop_battle_glowstick_01', + PropBone = 31086, + PropPlacement = { 0.1500, -0.0300, 0.0, 0.0, 0.0 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdancepridea"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride A (small dog)", AnimationOptions = { + Prop = 'lilprideflag1', + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdanceprideb"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride B - LGBTQIA (small dog)", AnimationOptions = { + Prop = 'lilprideflag2', --LGBTQIA + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdancepridec"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride C - Bisexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag3', --Bisexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdanceprided"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride D - Lesbian (small dog)", AnimationOptions = { + Prop = 'lilprideflag4', --Lesbian + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdancepridee"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride E - Pansexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag5', --Pansexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdancepridef"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride F - Transexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag6', --Transexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdanceprideg"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride G - Non Binary (small dog)", AnimationOptions = { + Prop = 'lilprideflag7', --Non Binary + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdanceprideh"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride H - Asexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag8', --Asexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdancepridei"] = { "creatures@pug@move", "idle_turn_0", "Dance Pride I - Straight Ally (small dog)", AnimationOptions = { + Prop = 'lilprideflag9', --Straight Ally + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + SecondProp = 'prop_cs_sol_glasses', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogbb"] = { "creatures@pug@move", "nill", "Baseball (small dog)", AnimationOptions = { + Prop = 'w_am_baseball', + PropBone = 31086, + PropPlacement = { 0.1500, -0.0500, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogburger"] = { "creatures@pug@move", "nill", "Burger (small dog)", AnimationOptions = { + Prop = 'prop_cs_burger_01', + PropBone = 31086, + PropPlacement = { 0.1500, -0.0400, 0.0000, -90.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogcontroller"] = { "creatures@pug@move", "nill", "Controller (small dog)", AnimationOptions = { + Prop = 'prop_controller_01', + PropBone = 31086, + PropPlacement = { 0.1800, -0.0300, 0.0000, -180.000, 90.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdolla"] = { "creatures@pug@move", "nill", "Dollar Bill (small dog)", AnimationOptions = { + Prop = 'p_banknote_onedollar_s', + PropBone = 31086, + PropPlacement = { 0.1700, -0.0100, 0.0000, 90.0000, 0.0000, 0.000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdolla2"] = { "creatures@pug@move", "nill", "Dollar Bill Scrunched (small dog)", AnimationOptions = { + Prop = 'bkr_prop_scrunched_moneypage', + PropBone = 31086, + PropPlacement = { 0.1700, 0.000, 0.0000, 90.0000, 00.0000, 00.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdolla3"] = { "creatures@pug@move", "nill", "Money Stack (small dog)", AnimationOptions = { + Prop = 'bkr_prop_money_wrapped_01', + PropBone = 31086, + PropPlacement = { 0.1700, -0.0100, 0.0000, 90.0000, 0.0000, 0.000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogdolla4"] = { "creatures@pug@move", "nill", "Money Bag (small dog)", AnimationOptions = { + Prop = 'ch_prop_ch_moneybag_01a', + PropBone = 31086, + PropPlacement = { 0.1200, -0.2000, 0.0000, -79.9999997, 90.00, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogmic"] = { "creatures@pug@move", "nill", "Microphone (small dog)", AnimationOptions = { + Prop = 'p_ing_microphonel_01', + PropBone = 31086, + PropPlacement = { 0.1500, -0.0170, 0.0300, 0.000, 0.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogteddy"] = { "creatures@pug@move", "nill", "Teddy (small dog)", AnimationOptions = { + Prop = 'v_ilev_mr_rasberryclean', + PropBone = 31086, + PropPlacement = { 0.1500, -0.1100, -0.23, 0.000, 0.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogteddy2"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Teddy 2 (small dog)", AnimationOptions = { + Prop = 'v_ilev_mr_rasberryclean', + PropBone = 31086, + PropPlacement = { 0.1500, -0.1100, -0.23, 0.000, 0.0000, 0.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogtennis"] = { "creatures@pug@move", "nill", "Tennis Ball (small dog)", AnimationOptions = { + Prop = 'prop_tennis_ball', + PropBone = 31086, + PropPlacement = { 0.1500, -0.0600, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogtennisr"] = { "creatures@pug@move", "nill", "Tennis Racket (small dog)", AnimationOptions = { + Prop = 'prop_tennis_rack_01', + PropBone = 31086, + PropPlacement = { 0.1500, -0.0200, 0.00, 0.000, 0.0000, -28.0000 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogrose"] = { "creatures@pug@move", "nill", "Rose (small dog)", AnimationOptions = { + Prop = 'prop_single_rose', + PropBone = 12844, + PropPlacement = { 0.1090, -0.0140, 0.0500, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogrose2"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Rose Sit (small dog)", AnimationOptions = { + Prop = 'prop_single_rose', + PropBone = 12844, + PropPlacement = { 0.1090, -0.0140, 0.0500, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogggun"] = { "creatures@pug@move", "nill", "Gun Gold (small dog)", AnimationOptions = { + Prop = 'w_pi_pistol_luxe', + PropBone = 12844, + PropPlacement = { 0.2010, -0.0080, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoggun2"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Gun Gold Sit (small dog)", AnimationOptions = { + Prop = 'w_pi_pistol_luxe', + PropBone = 12844, + PropPlacement = { 0.2010, -0.0080, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogstun"] = { "creatures@pug@move", "nill", "Stun Gun (small dog)", AnimationOptions = { + Prop = 'w_pi_stungun', + PropBone = 12844, + PropPlacement = { 0.1400, -0.0100, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + PtfxAsset = "core", + PtfxName = "blood_stungun", + PtfxPlacement = { 0.208, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }, + PtfxInfo = Config.Languages[Config.MenuLanguage]['stun'], + PtfxWait = 200, + }}, + ["sdoggl1"] = { "creatures@pug@move", "nill", "Aviators (small dog)", AnimationOptions = { + Prop = 'prop_aviators_01', + PropBone = 31086, + PropPlacement = { 0.0500, 0.0400, 0.000, -90.00, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoggl2"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Aviators Sitting (small dog)", AnimationOptions = { + Prop = 'prop_aviators_01', + PropBone = 31086, + PropPlacement = { 0.0500, 0.0400, 0.000, -90.00, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoggl3"] = { "creatures@pug@move", "nill", "Sunglasses (small dog)", AnimationOptions = { + Prop = 'prop_cs_sol_glasses', + PropBone = 31086, + PropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoggl4"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Sunglasses Sitting (small dog)", AnimationOptions = { + Prop = 'prop_cs_sol_glasses', + PropBone = 31086, + PropPlacement = { 0.0500, 0.0300, 0.000, -100.0000003, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoghd1"] = { "creatures@pug@move", "nill", "Hot Dog (small dog)", AnimationOptions = { + Prop = 'prop_cs_hotdog_01', + PropBone = 31086, + PropPlacement = { 0.1300, -0.0250, 0.000, -88.272053, -9.8465858, -0.1488562 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoghd2"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Hot Dog Sitting (small dog)", AnimationOptions = { + Prop = 'prop_cs_hotdog_01', + PropBone = 31086, + PropPlacement = { 0.1300, -0.0250, 0.000, -88.272053, -9.8465858, -0.1488562 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoghlmt1"] = { "creatures@pug@move", "nill", "Helmet 1 (small dog)", AnimationOptions = { + Prop = 'ba_prop_battle_sports_helmet', + PropBone = 31086, + PropPlacement = { 0.00, -0.0200, 0.000, -90.00, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoghlmt2"] = { "creatures@pug@move", "nill", "Helmet 2 (small dog)", AnimationOptions = { + Prop = 'prop_hard_hat_01', + PropBone = 31086, + PropPlacement = { 0.00, 0.1300, 0.000, -90.00, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoghat"] = { "creatures@pug@move", "nill", "Hat 1 (small dog)", AnimationOptions = { + Prop = 'prop_proxy_hat_01', + PropBone = 31086, + PropPlacement = { 0.0, 0.1200, 0.000, -99.8510766, 80.1489234, 1.7279411 }, + SecondProp = 'prop_aviators_01', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0400, 0.000, -90.00, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdoghat2"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Hat 2 Sitting (small dog)", AnimationOptions = { + Prop = 'prop_proxy_hat_01', + PropBone = 31086, + PropPlacement = { 0.0, 0.1200, 0.000, -99.8510766, 80.1489234, 1.7279411 }, + SecondProp = 'prop_aviators_01', + SecondPropBone = 31086, + SecondPropPlacement = { 0.0500, 0.0400, 0.000, -90.00, 90.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogsteak"] = { "creatures@pug@move", "nill", "Steak (small dog)", AnimationOptions = { + Prop = 'prop_cs_steak', + PropBone = 31086, + PropPlacement = { 0.1800, -0.0200, 0.000, 90.00, 0.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogsteak2"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_c", "Steak 2 Lay Down (small dog)", AnimationOptions = { + Prop = 'prop_cs_steak', + PropBone = 31086, + PropPlacement = { 0.1800, -0.0200, 0.000, 90.00, 0.00, 0.00 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridea"] = { "creatures@pug@move", "nill", "Pride A (small dog)", AnimationOptions = { + Prop = 'lilprideflag1', + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogprideb"] = { "creatures@pug@move", "nill", "Pride B - LGBTQIA (small dog)", AnimationOptions = { + Prop = 'lilprideflag2',--LGBTQIA + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridec"] = { "creatures@pug@move", "nill", "Pride C - Bisexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag3',--Bisexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogprided"] = { "creatures@pug@move", "nill", "Pride D - Lesbian (small dog)", AnimationOptions = { + Prop = 'lilprideflag4',--Lesbian + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridee"] = { "creatures@pug@move", "nill", "Pride E - Pansexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag5',--Pansexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridef"] = { "creatures@pug@move", "nill", "Pride F - Transexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag6',--Transexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridef"] = { "creatures@pug@move", "nill", "Pride F - Transexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag6',--Transexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogprideg"] = { "creatures@pug@move", "nill", "Pride G - Non Binary (small dog)", AnimationOptions = { + Prop = 'lilprideflag6',--Non Binary + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogprideh"] = { "creatures@pug@move", "nill", "Pride H - Non Binary (small dog)", AnimationOptions = { + Prop = 'lilprideflag7',--Non Binary + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridei"] = { "creatures@pug@move", "nill", "Pride I - Asexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag8',--Asexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesita"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride A Sit (small dog)", AnimationOptions = { + Prop = 'lilprideflag1', + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesitb"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride B Sit LGBTQIA (small dog)", AnimationOptions = { + Prop = 'lilprideflag2', --LGBTQIA + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesitc"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride C Sit Bisexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag3', --Bisexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesitd"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride D Sit Lesbian (small dog)", AnimationOptions = { + Prop = 'lilprideflag4', --Lesbian + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesite"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride E Sit Pansexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag5', --Pansexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesitf"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride F Sit Transexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag6', --Transexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesitg"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride G Sit Non Binary (small dog)", AnimationOptions = { + Prop = 'lilprideflag7', --Non Binary + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesith"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride H Sit Asexual (small dog)", AnimationOptions = { + Prop = 'lilprideflag8', --Asexual + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["sdogpridesiti"] = { "creatures@pug@amb@world_dog_sitting@idle_a", "idle_b", "Pride I Sit Straight Ally (small dog)", AnimationOptions = { + Prop = 'lilprideflag9', --Straight Ally + PropBone = 31086, + PropPlacement = { 0.1240, -0.0080, 0.000, 0.0, 0.0, -74.6999 }, + EmoteLoop = true, + EmoteMoving = false, + }}, +} + + + +--- EMOTES NO PROPS --- + +DP.Emotes = { + + ["beast"] = { "anim@mp_fm_event@intro", "beast_transform", "Beast", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 5000, + }}, + ["chill"] = { "switch@trevor@scares_tramp", "trev_scares_tramp_idle_tramp", "Chill", AnimationOptions = { + EmoteLoop = true, + }}, + ["cloudgaze"] = { "switch@trevor@annoys_sunbathers", "trev_annoys_sunbathers_loop_girl", "Cloudgaze", AnimationOptions = { + EmoteLoop = true, + }}, + ["cloudgaze2"] = { "switch@trevor@annoys_sunbathers", "trev_annoys_sunbathers_loop_guy", "Cloudgaze 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["prone"] = { "missfbi3_sniping", "prone_dave", "Prone", AnimationOptions = { + EmoteLoop = true, + }}, + ["pullover"] = { "misscarsteal3pullover", "pull_over_right", "Pullover", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1300, + }}, + ["idle"] = { "anim@heists@heist_corona@team_idles@male_a", "idle", "Idle", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle8"] = { "amb@world_human_hang_out_street@male_b@idle_a", "idle_b", "Idle 8" }, + ["idle9"] = { "friends@fra@ig_1", "base_idle", "Idle 9", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle10"] = { "mp_move@prostitute@m@french", "idle", "Idle 10", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["idle11"] = { "random@countrysiderobbery", "idle_a", "Idle 11", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle2"] = { "anim@heists@heist_corona@team_idles@female_a", "idle", "Idle 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle3"] = { "anim@heists@humane_labs@finale@strip_club", "ped_b_celebrate_loop", "Idle 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle4"] = { "anim@mp_celebration@idles@female", "celebration_idle_f_a", "Idle 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle5"] = { "anim@mp_corona_idles@female_b@idle_a", "idle_a", "Idle 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle6"] = { "anim@mp_corona_idles@male_c@idle_a", "idle_a", "Idle 6", AnimationOptions = { + EmoteLoop = true, + }}, + ["idle7"] = { "anim@mp_corona_idles@male_d@idle_a", "idle_a", "Idle 7", AnimationOptions = { + EmoteLoop = true, + }}, + ["idledrunk"] = { "random@drunk_driver_1", "drunk_driver_stand_loop_dd1", "Idle Drunk", AnimationOptions = { + EmoteLoop = true, + }}, + ["idledrunk2"] = { "random@drunk_driver_1", "drunk_driver_stand_loop_dd2", "Idle Drunk 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["idledrunk3"] = { "missarmenian2", "standing_idle_loop_drunk", "Idle Drunk 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["airguitar"] = { "anim@mp_player_intcelebrationfemale@air_guitar", "air_guitar", "Air Guitar" }, + ["airsynth"] = { "anim@mp_player_intcelebrationfemale@air_synth", "air_synth", "Air Synth" }, + ["argue"] = { "misscarsteal4@actor", "actor_berating_loop", "Argue", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["argue2"] = { "oddjobs@assassinate@vice@hooker", "argue_a", "Argue 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["bartender"] = { "anim@amb@clubhouse@bar@drink@idle_a", "idle_a_bartender", "Bartender", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["blowkiss"] = { "anim@mp_player_intcelebrationfemale@blow_kiss", "blow_kiss", "Blow Kiss" }, + ["blowkiss2"] = { "anim@mp_player_intselfieblow_kiss", "exit", "Blow Kiss 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 2000 + + }}, + ["curtsy"] = { "anim@mp_player_intcelebrationpaired@f_f_sarcastic", "sarcastic_left", "Curtsy" }, + ["bringiton"] = { "misscommon@response", "bring_it_on", "Bring It On", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000 + }}, + ["comeatmebro"] = { "mini@triathlon", "want_some_of_this", "Come at me bro", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 2000 + }}, + ["cop2"] = { "anim@amb@nightclub@peds@", "rcmme_amanda1_stand_loop_cop", "Cop 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["cop3"] = { "amb@code_human_police_investigate@idle_a", "idle_b", "Cop 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["crossarms"] = { "amb@world_human_hang_out_street@female_arms_crossed@idle_a", "idle_a", "Crossarms", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["crossarms2"] = { "amb@world_human_hang_out_street@male_c@idle_a", "idle_b", "Crossarms 2", AnimationOptions = { + EmoteMoving = true, + }}, + ["crossarms3"] = { "anim@heists@heist_corona@single_team", "single_team_loop_boss", "Crossarms 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["crossarms4"] = { "random@street_race", "_car_b_lookout", "Crossarms 4", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["crossarms5"] = { "anim@amb@nightclub@peds@", "rcmme_amanda1_stand_loop_cop", "Crossarms 5", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foldarms2"] = { "anim@amb@nightclub@peds@", "rcmme_amanda1_stand_loop_cop", "Fold Arms 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["crossarms6"] = { "random@shop_gunstore", "_idle", "Crossarms 6", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foldarms"] = { "anim@amb@business@bgen@bgen_no_work@", "stand_phone_phoneputdown_idle_nowork", "Fold Arms", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["crossarmsside"] = { "rcmnigel1a_band_groupies", "base_m2", "Crossarms Side", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["damn"] = { "gestures@m@standing@casual", "gesture_damn", "Damn", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1000 + }}, + ["damn2"] = { "anim@am_hold_up@male", "shoplift_mid", "Damn 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1000 + }}, + ["pointdown"] = { "gestures@f@standing@casual", "gesture_hand_down", "Point Down", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1000 + }}, + ["surrender"] = { "random@arrests@busted", "idle_a", "Surrender", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["surrender2"] = { "mp_bank_heist_1", "f_cower_02", "Surrender 2", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["surrender3"] = { "mp_bank_heist_1", "m_cower_01", "Surrender 3", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["surrender4"] = { "mp_bank_heist_1", "m_cower_02", "Surrender 4", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["surrender5"] = { "random@arrests", "kneeling_arrest_idle", "Surrender 5", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["surrender6"] = { "rcmbarry", "m_cower_01", "Surrender 6", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["facepalm2"] = { "anim@mp_player_intcelebrationfemale@face_palm", "face_palm", "Facepalm 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 8000 + }}, + ["facepalm"] = { "random@car_thief@agitated@idle_a", "agitated_idle_a", "Facepalm", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 8000 + }}, + ["facepalm3"] = { "missminuteman_1ig_2", "tasered_2", "Facepalm 3", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 8000 + }}, + ["facepalm4"] = { "anim@mp_player_intupperface_palm", "idle_a", "Facepalm 4", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["fallover"] = { "random@drunk_driver_1", "drunk_fall_over", "Fall Over" }, + ["fallover2"] = { "mp_suicide", "pistol", "Fall Over 2" }, + ["fallover3"] = { "mp_suicide", "pill", "Fall Over 3" }, + ["fallover4"] = { "friends@frf@ig_2", "knockout_plyr", "Fall Over 4" }, + ["fallover5"] = { "anim@gangops@hostage@", "victim_fail", "Fall Over 5" }, + ["fallasleep"] = { "mp_sleep", "sleep_loop", "Fall Asleep", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["fightme"] = { "anim@deathmatch_intros@unarmed", "intro_male_unarmed_c", "Fight Me" }, + ["fightme2"] = { "anim@deathmatch_intros@unarmed", "intro_male_unarmed_e", "Fight Me 2" }, + ["finger"] = { "anim@mp_player_intselfiethe_bird", "idle_a", "Finger", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["finger2"] = { "anim@mp_player_intupperfinger", "idle_a_fp", "Finger 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["handshake"] = { "mp_ped_interaction", "handshake_guy_a", "Handshake", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000 + }}, + ["handshake2"] = { "mp_ped_interaction", "handshake_guy_b", "Handshake 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000 + }}, + ["wait"] = { "random@shop_tattoo", "_idle_a", "Wait", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitb"] = { "missbigscore2aig_3", "wait_for_van_c", "Wait B", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitc"] = { "amb@world_human_hang_out_street@female_hold_arm@idle_a", "idle_a", "Wait C", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitd"] = { "amb@world_human_hang_out_street@Female_arm_side@idle_a", "idle_a", "Wait D", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waite"] = { "missclothing", "idle_storeclerk", "Wait E", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitf"] = { "timetable@amanda@ig_2", "ig_2_base_amanda", "Wait F", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitg"] = { "rcmnigel1cnmt_1c", "base", "Wait G", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waith"] = { "rcmjosh1", "idle", "Wait H", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waiti"] = { "rcmjosh2", "josh_2_intp1_base", "Wait I", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitj"] = { "timetable@amanda@ig_3", "ig_3_base_tracy", "Wait J", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitk"] = { "misshair_shop@hair_dressers", "keeper_base", "Wait K", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitl"] = { "rcmjosh1", "keeper_base", "Wait L", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["waitm"] = { "rcmnigel1a", "base", "Wait M", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["hiking"] = { "move_m@hiking", "idle", "Hiking", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["hug"] = { "mp_ped_interaction", "kisses_guy_a", "Hug" }, + ["hug2"] = { "mp_ped_interaction", "kisses_guy_b", "Hug 2" }, + ["hug3"] = { "mp_ped_interaction", "hugs_guy_a", "Hug 3" }, + ["inspect"] = { "random@train_tracks", "idle_e", "Inspect" }, + ["jazzhands"] = { "anim@mp_player_intcelebrationfemale@jazz_hands", "jazz_hands", "Jazzhands", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 6000, + }}, + ["jog2"] = { "amb@world_human_jog_standing@male@idle_a", "idle_a", "Jog 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["jog3"] = { "amb@world_human_jog_standing@female@idle_a", "idle_a", "Jog 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["jog4"] = { "amb@world_human_power_walker@female@idle_a", "idle_a", "Jog 4", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["jog5"] = { "move_m@joy@a", "walk", "Jog 5", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["jumpingjacks"] = { "timetable@reunited@ig_2", "jimmy_getknocked", "Jumping Jacks", AnimationOptions = { + EmoteLoop = true, + }}, + ["kneel2"] = { "rcmextreme3", "idle", "Kneel 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["kneel3"] = { "amb@world_human_bum_wash@male@low@idle_a", "idle_a", "Kneel 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["knock"] = { "timetable@jimmy@doorknock@", "knockdoor_idle", "Knock", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["knock2"] = { "missheistfbi3b_ig7", "lift_fibagent_loop", "Knock 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["knucklecrunch"] = { "anim@mp_player_intcelebrationfemale@knuckle_crunch", "knuckle_crunch", "Knuckle Crunch", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["lean2"] = { "amb@world_human_leaning@female@wall@back@hand_up@idle_a", "idle_a", "Lean 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["lean3"] = { "amb@world_human_leaning@female@wall@back@holding_elbow@idle_a", "idle_a", "Lean 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["lean4"] = { "amb@world_human_leaning@male@wall@back@foot_up@idle_a", "idle_a", "Lean 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["lean5"] = { "amb@world_human_leaning@male@wall@back@hands_together@idle_b", "idle_b", "Lean 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["leanflirt"] = { "random@street_race", "_car_a_flirt_girl", "Lean Flirt", AnimationOptions = { + EmoteLoop = true, + }}, + ["leanbar2"] = { "amb@prop_human_bum_shopping_cart@male@idle_a", "idle_c", "Lean Bar 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["leanbar3"] = { "anim@amb@nightclub@lazlow@ig1_vip@", "clubvip_base_laz", "Lean Bar 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["leanbar4"] = { "anim@heists@prison_heist", "ped_b_loop_a", "Lean Bar 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["leanhigh"] = { "anim@mp_ferris_wheel", "idle_a_player_one", "Lean High", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["leanhigh2"] = { "anim@mp_ferris_wheel", "idle_a_player_two", "Lean High 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["leanside"] = { "timetable@mime@01_gc", "idle_a", "Leanside", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["leanside2"] = { "misscarstealfinale", "packer_idle_1_trevor", "Leanside 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["leanside3"] = { "misscarstealfinalecar_5_ig_1", "waitloop_lamar", "Leanside 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["leanside4"] = { "misscarstealfinalecar_5_ig_1", "waitloop_lamar", "Leanside 4", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["leanside5"] = { "rcmjosh2", "josh_2_intp1_base", "Leanside 5", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["me"] = { "gestures@f@standing@casual", "gesture_me_hard", "Me", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1000 + }}, + ["mechanic"] = { "mini@repair", "fixing_a_ped", "Mechanic", AnimationOptions = { + EmoteLoop = true, + }}, + ["mechanic2"] = { "mini@repair", "fixing_a_player", "Mechanic 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["mechanic3"] = { "amb@world_human_vehicle_mechanic@male@base", "base", "Mechanic 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["mechanic4"] = { "anim@amb@clubhouse@tutorial@bkr_tut_ig3@", "machinic_loop_mechandplayer", "Mechanic 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["mechanic5"] = { "amb@prop_human_movie_bulb@idle_a", "idle_b", "Mechanic 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["medic2"] = { "amb@medic@standing@tendtodead@base", "base", "Medic 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["meditate"] = { "rcmcollect_paperleadinout@", "meditiate_idle", "Meditiate", AnimationOptions = { -- CHANGE ME + EmoteLoop = true, + }}, + ["meditate2"] = { "rcmepsilonism3", "ep_3_rcm_marnie_meditating", "Meditiate 2", AnimationOptions = { -- CHANGE ME + EmoteLoop = true, + }}, + ["meditate3"] = { "rcmepsilonism3", "base_loop", "Meditiate 3", AnimationOptions = { -- CHANGE ME + EmoteLoop = true, + }}, + ["metal"] = { "anim@mp_player_intincarrockstd@ps@", "idle_a", "Metal", AnimationOptions = { -- CHANGE ME + EmoteLoop = true, + EmoteMoving = true, + }}, + ["no"] = { "anim@heists@ornate_bank@chat_manager", "fail", "No", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["no2"] = { "mp_player_int_upper_nod", "mp_player_int_nod_no", "No 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["nosepick"] = { "anim@mp_player_intcelebrationfemale@nose_pick", "nose_pick", "Nose Pick", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["noway"] = { "gestures@m@standing@casual", "gesture_no_way", "No Way", AnimationOptions = { + EmoteDuration = 1500, + EmoteMoving = true, + }}, + ["ok"] = { "anim@mp_player_intselfiedock", "idle_a", "OK", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["dock"] = { "anim@mp_player_intincardockstd@rds@", "idle_a", "Dock", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["outofbreath"] = { "re@construction", "out_of_breath", "Out of Breath", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["pickup"] = { "random@domestic", "pickup_low", "Pickup" }, + ["push"] = { "missfinale_c2ig_11", "pushcar_offcliff_f", "Push", AnimationOptions = { + EmoteLoop = true, + }}, + ["push2"] = { "missfinale_c2ig_11", "pushcar_offcliff_m", "Push 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["point"] = { "gestures@f@standing@casual", "gesture_point", "Point", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["pushup"] = { "amb@world_human_push_ups@male@idle_a", "idle_d", "Pushup", AnimationOptions = { + EmoteLoop = true, + }}, + ["countdown"] = { "random@street_race", "grid_girl_race_start", "Countdown", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["pointright"] = { "mp_gun_shop_tut", "indicate_right", "Point Right", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["salute"] = { "anim@mp_player_intincarsalutestd@ds@", "idle_a", "Salute", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["salute2"] = { "anim@mp_player_intincarsalutestd@ps@", "idle_a", "Salute 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["salute3"] = { "anim@mp_player_intuppersalute", "idle_a", "Salute 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["scared"] = { "random@domestic", "f_distressed_loop", "Scared", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["scared2"] = { "random@homelandsecurity", "knees_loop_girl", "Scared 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["screwyou"] = { "misscommon@response", "screw_you", "Screw You", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["shakeoff"] = { "move_m@_idles@shake_off", "shakeoff_1", "Shake Off", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3500, + }}, + ["shot"] = { "random@dealgonewrong", "idle_a", "Shot", AnimationOptions = { + EmoteLoop = true, + }}, + ["sleep"] = { "timetable@tracy@sleep@", "idle_c", "Sleep", AnimationOptions = { + EmoteLoop = true, + }}, + ["shrug"] = { "gestures@f@standing@casual", "gesture_shrug_hard", "Shrug", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1000, + }}, + ["shrug2"] = { "gestures@m@standing@casual", "gesture_shrug_hard", "Shrug 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1000, + }}, + ["sit"] = { "anim@amb@business@bgen@bgen_no_work@", "sit_phone_phoneputdown_idle_nowork", "Sit", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit2"] = { "rcm_barry3", "barry_3_sit_loop", "Sit 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit3"] = { "amb@world_human_picnic@male@idle_a", "idle_a", "Sit 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit4"] = { "amb@world_human_picnic@female@idle_a", "idle_a", "Sit 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit5"] = { "anim@heists@fleeca_bank@ig_7_jetski_owner", "owner_idle", "Sit 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit6"] = { "timetable@jimmy@mics3_ig_15@", "idle_a_jimmy", "Sit 6", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit7"] = { "anim@amb@nightclub@lazlow@lo_alone@", "lowalone_base_laz", "Sit 7", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit8"] = { "timetable@jimmy@mics3_ig_15@", "mics3_15_base_jimmy", "Sit 8", AnimationOptions = { + EmoteLoop = true, + }}, + ["sit9"] = { "amb@world_human_stupor@male@idle_a", "idle_a", "Sit 9", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitlow"] = { "anim@veh@lowrider@std@ds@arm@base", "sit_low_lowdoor", "Sit Lowrider", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitlean"] = { "timetable@tracy@ig_14@", "ig_14_base_tracy", "Sit Lean", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitsad"] = { "anim@amb@business@bgen@bgen_no_work@", "sit_phone_phoneputdown_sleeping-noworkfemale", "Sit Sad", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitscared"] = { "anim@heists@ornate_bank@hostages@hit", "hit_loop_ped_b", "Sit Scared", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitscared2"] = { "anim@heists@ornate_bank@hostages@ped_c@", "flinch_loop", "Sit Scared 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitscared3"] = { "anim@heists@ornate_bank@hostages@ped_e@", "flinch_loop", "Sit Scared 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitdrunk"] = { "timetable@amanda@drunk@base", "base", "Sit Drunk", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitchair2"] = { "timetable@ron@ig_5_p3", "ig_5_p3_base", "Sit Chair 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitchair3"] = { "timetable@reunited@ig_10", "base_amanda", "Sit Chair 3 (Female)", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitchair4"] = { "timetable@ron@ig_3_couch", "base", "Sit Chair 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitchair5"] = { "timetable@jimmy@mics3_ig_15@", "mics3_15_base_tracy", "Sit Chair Legs Crossed", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitchair6"] = { "timetable@maid@couch@", "base", "Sit Chair Lean Back", AnimationOptions = { + EmoteLoop = true, + }}, + ["sitchairside"] = { "timetable@ron@ron_ig_2_alt1", "ig_2_alt1_base", "Sit Chair Side", AnimationOptions = { + EmoteLoop = true, + }}, + ["situp"] = { "amb@world_human_sit_ups@male@idle_a", "idle_a", "Sit Up", AnimationOptions = { + EmoteLoop = true, + }}, + ["clapangry"] = { "anim@arena@celeb@flat@solo@no_props@", "angry_clap_a_player_a", "Clap Angry", AnimationOptions = { + EmoteLoop = true, + }}, + ["slowclap3"] = { "anim@mp_player_intupperslow_clap", "idle_a", "Slow Clap 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["clap"] = { "amb@world_human_cheering@male_a", "base", "Clap", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["slowclap"] = { "anim@mp_player_intcelebrationfemale@slow_clap", "slow_clap", "Slow Clap", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["slowclap2"] = { "anim@mp_player_intcelebrationmale@slow_clap", "slow_clap", "Slow Clap 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["smell"] = { "move_p_m_two_idles@generic", "fidget_sniff_fingers", "Smell", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["stickup"] = { "random@countryside_gang_fight", "biker_02_stickup_loop", "Stick Up", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["stumble"] = { "misscarsteal4@actor", "stumble", "Stumble", AnimationOptions = { + EmoteLoop = true, + }}, + ["stunned"] = { "stungun@standing", "damage", "Stunned", AnimationOptions = { + EmoteLoop = true, + }}, + ["sunbathe"] = { "amb@world_human_sunbathe@male@back@base", "base", "Sunbathe", AnimationOptions = { + EmoteLoop = true, + }}, + ["sunbathe2"] = { "amb@world_human_sunbathe@female@back@base", "base", "Sunbathe 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["t"] = { "missfam5_yoga", "a2_pose", "T", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["t2"] = { "mp_sleep", "bind_pose_180", "T 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["think5"] = { "mp_cp_welcome_tutthink", "b_think", "Think 5", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 2000, + }}, + ["think"] = { "misscarsteal4@aliens", "rehearsal_base_idle_director", "Think", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["think3"] = { "timetable@tracy@ig_8@base", "base", "Think 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + + ["think2"] = { "missheist_jewelleadinout", "jh_int_outro_loop_a", "Think 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["thumbsup3"] = { "anim@mp_player_intincarthumbs_uplow@ds@", "enter", "Thumbs Up 3", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000, + }}, + ["thumbsup2"] = { "anim@mp_player_intselfiethumbs_up", "idle_a", "Thumbs Up 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["thumbsup"] = { "anim@mp_player_intupperthumbs_up", "idle_a", "Thumbs Up", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["type"] = { "anim@heists@prison_heiststation@cop_reactions", "cop_b_idle", "Type", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["type2"] = { "anim@heists@prison_heistig1_p1_guard_checks_bus", "loop", "Type 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["type3"] = { "mp_prison_break", "hack_loop", "Type 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["type4"] = { "mp_fbi_heist", "loop", "Type 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["warmth"] = { "amb@world_human_stand_fire@male@idle_a", "idle_a", "Warmth", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave4"] = { "random@mugging5", "001445_01_gangintimidation_1_female_idle_b", "Wave 4", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000, + }}, + ["wave2"] = { "anim@mp_player_intcelebrationfemale@wave", "wave", "Wave 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave3"] = { "friends@fra@ig_1", "over_here_idle_a", "Wave 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave"] = { "friends@frj@ig_1", "wave_a", "Wave", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave5"] = { "friends@frj@ig_1", "wave_b", "Wave 5", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave6"] = { "friends@frj@ig_1", "wave_c", "Wave 6", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave7"] = { "friends@frj@ig_1", "wave_d", "Wave 7", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave8"] = { "friends@frj@ig_1", "wave_e", "Wave 8", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wave9"] = { "gestures@m@standing@casual", "gesture_hello", "Wave 9", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["whistle"] = { "taxi_hail", "hail_taxi", "Whistle", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 1300, + }}, + ["whistle2"] = { "rcmnigel1c", "hailing_whistle_waive_a", "Whistle 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 2000, + }}, + ["yeah"] = { "anim@mp_player_intupperair_shagging", "idle_a", "Yeah", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["lift"] = { "random@hitch_lift", "idle_f", "Lift", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["lol"] = { "anim@arena@celeb@flat@paired@no_props@", "laugh_a_player_b", "LOL", AnimationOptions = { + EmoteLoop = true, + }}, + ["lol2"] = { "anim@arena@celeb@flat@solo@no_props@", "giggle_a_player_b", "LOL 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["statue2"] = { "fra_0_int-1", "cs_lamardavis_dual-1", "Statue 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["statue3"] = { "club_intro2-0", "csb_englishdave_dual-0", "Statue 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["gangsign"] = { "mp_player_int_uppergang_sign_a", "mp_player_int_gang_sign_a", "Gang Sign", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["gangsign2"] = { "mp_player_int_uppergang_sign_b", "mp_player_int_gang_sign_b", "Gang Sign 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["passout"] = { "missarmenian2", "drunk_loop", "Passout", AnimationOptions = { + EmoteLoop = true, + }}, + ["passout2"] = { "missarmenian2", "corpse_search_exit_ped", "Passout 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["passout3"] = { "anim@gangops@morgue@table@", "body_search", "Passout 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["passout4"] = { "mini@cpr@char_b@cpr_def", "cpr_pumpchest_idle", "Passout 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["passout5"] = { "random@mugging4", "flee_backward_loop_shopkeeper", "Passout 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["petting"] = { "creatures@rottweiler@tricks@", "petting_franklin", "Petting", AnimationOptions = { + EmoteLoop = true, + }}, + ["crawl"] = { "move_injured_ground", "front_loop", "Crawl", AnimationOptions = { + EmoteLoop = true, + }}, + ["flip2"] = { "anim@arena@celeb@flat@solo@no_props@", "cap_a_player_a", "Flip 2" }, + ["flip"] = { "anim@arena@celeb@flat@solo@no_props@", "flip_a_player_a", "Flip" }, + ["slide"] = { "anim@arena@celeb@flat@solo@no_props@", "slide_a_player_a", "Slide" }, + ["slide2"] = { "anim@arena@celeb@flat@solo@no_props@", "slide_b_player_a", "Slide 2" }, + ["slide3"] = { "anim@arena@celeb@flat@solo@no_props@", "slide_c_player_a", "Slide 3" }, + ["slugger"] = { "anim@arena@celeb@flat@solo@no_props@", "slugger_a_player_a", "Slugger" }, + ["flipoff"] = { "anim@arena@celeb@podium@no_prop@", "flip_off_a_1st", "Flip Off", AnimationOptions = { + EmoteMoving = true, + }}, + ["flipoff2"] = { "anim@arena@celeb@podium@no_prop@", "flip_off_c_1st", "Flip Off 2", AnimationOptions = { + EmoteMoving = true, + }}, + ["bow"] = { "anim@arena@celeb@podium@no_prop@", "regal_c_1st", "Bow", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["bow2"] = { "anim@arena@celeb@podium@no_prop@", "regal_a_1st", "Bow 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["keyfob"] = { "anim@mp_player_intmenu@key_fob@", "fob_click", "Key Fob", AnimationOptions = { + EmoteLoop = false, + EmoteMoving = true, + EmoteDuration = 1000, + }}, + ["reaching"] = { "move_m@intimidation@cop@unarmed", "idle", "Reaching", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["slap"] = { "melee@unarmed@streamed_variations", "plyr_takedown_front_slap", "Slap", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + EmoteDuration = 2000, + }}, + ["headbutt"] = { "melee@unarmed@streamed_variations", "plyr_takedown_front_headbutt", "Headbutt" }, + ["fishdance"] = { "anim@mp_player_intupperfind_the_fish", "idle_a", "Fish Dance", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peace"] = { "mp_player_int_upperpeace_sign", "mp_player_int_peace_sign", "Peace", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peace2"] = { "anim@mp_player_intupperpeace", "idle_a", "Peace 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peace3"] = { "anim@mp_player_intupperpeace", "idle_a_fp", "Peace 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peace4"] = { "anim@mp_player_intincarpeacestd@ds@", "idle_a", "Peace 4", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peace5"] = { "anim@mp_player_intincarpeacestd@ds@", "idle_a_fp", "Peace 5", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peace6"] = { "anim@mp_player_intincarpeacebodhi@ds@", "idle_a", "Peace 6", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peace7"] = { "anim@mp_player_intincarpeacebodhi@ds@", "idle_a_fp", "Peace 7", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peacef"] = { "anim@mp_player_intcelebrationfemale@peace", "peace", "Peace Female", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["cpr"] = { "mini@cpr@char_a@cpr_str", "cpr_pumpchest", "CPR", AnimationOptions = { + EmoteLoop = true, + }}, + ["cpr2"] = { "mini@cpr@char_a@cpr_str", "cpr_pumpchest", "CPR 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ledge"] = { "missfbi1", "ledge_loop", "Ledge", AnimationOptions = { + EmoteLoop = true, + }}, + ["airplane"] = { "missfbi1", "ledge_loop", "Air Plane", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["peek"] = { "random@paparazzi@peek", "left_peek_a", "Peek", AnimationOptions = { + EmoteLoop = true, + }}, + ["cough"] = { "timetable@gardener@smoking_joint", "idle_cough", "Cough", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["stretch"] = { "mini@triathlon", "idle_e", "Stretch", AnimationOptions = { + EmoteLoop = true, + }}, + ["stretch2"] = { "mini@triathlon", "idle_f", "Stretch 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["stretch3"] = { "mini@triathlon", "idle_d", "Stretch 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["stretch4"] = { "rcmfanatic1maryann_stretchidle_b", "idle_e", "Stretch 4", AnimationOptions = { + EmoteLoop = true, + }}, + ["celebrate"] = { "rcmfanatic1celebrate", "celebrate", "Celebrate", AnimationOptions = { + EmoteLoop = true, + }}, + ["punching"] = { "rcmextreme2", "loop_punching", "Punching", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["superhero"] = { "rcmbarry", "base", "Superhero", AnimationOptions = { + EmoteLoop = true, + }}, + ["superhero2"] = { "rcmbarry", "base", "Superhero 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["mindcontrol"] = { "rcmbarry", "mind_control_b_loop", "Mind Control", AnimationOptions = { + EmoteLoop = true, + }}, + ["mindcontrol2"] = { "rcmbarry", "bar_1_attack_idle_aln", "Mind Control 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["clown"] = { "rcm_barry2", "clown_idle_0", "Clown", AnimationOptions = { + EmoteLoop = true, + }}, + ["clown2"] = { "rcm_barry2", "clown_idle_1", "Clown 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["clown3"] = { "rcm_barry2", "clown_idle_2", "Clown 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["clown4"] = { "rcm_barry2", "clown_idle_3", "Clown 4", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["clown5"] = { "rcm_barry2", "clown_idle_6", "Clown 5", AnimationOptions = { + EmoteLoop = true, + }}, + ["tryclothes"] = { "mp_clothing@female@trousers", "try_trousers_neutral_a", "Try Clothes", AnimationOptions = { + EmoteLoop = true, + }}, + ["tryclothes2"] = { "mp_clothing@female@shirt", "try_shirt_positive_a", "Try Clothes 2", AnimationOptions = { + EmoteLoop = true, + }}, + ["tryclothes3"] = { "mp_clothing@female@shoes", "try_shoes_positive_a", "Try Clothes 3", AnimationOptions = { + EmoteLoop = true, + }}, + ["nervous2"] = { "mp_missheist_countrybank@nervous", "nervous_idle", "Nervous 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["nervous"] = { "amb@world_human_bum_standing@twitchy@idle_a", "idle_c", "Nervous", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["nervous3"] = { "rcmme_tracey1", "nervous_loop", "Nervous 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["uncuff"] = { "mp_arresting", "a_uncuff", "Uncuff", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["namaste"] = { "timetable@amanda@ig_4", "ig_4_base", "Namaste", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["threaten"] = { "random@atmrobberygen", "b_atm_mugging", "Threaten", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["radio"] = { "random@arrests", "generic_radio_chatter", "Radio", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["pull"] = { "random@mugging4", "struggle_loop_b_thief", "Pull", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["bird"] = { "random@peyote@bird", "wakeup", "Bird" }, + ["chicken"] = { "random@peyote@chicken", "wakeup", "Chicken", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["bark"] = { "random@peyote@dog", "wakeup", "Bark" }, + ["rabbit"] = { "random@peyote@rabbit", "wakeup", "Rabbit" }, + ["spiderman"] = { "missexile3", "ex03_train_roof_idle", "Spider-Man", AnimationOptions = { + EmoteLoop = true, + }}, + ["boi"] = { "special_ped@jane@monologue_5@monologue_5c", "brotheradrianhasshown_2", "BOI", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 3000, + }}, + ["adjust"] = { "missmic4", "michael_tux_fidget", "Adjust", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 4000, + }}, + ["handsup"] = { "missminuteman_1ig_2", "handsup_base", "Hands Up", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["handsup2"] = { "anim@mp_player_intuppersurrender", "idle_a_fp", "Hands Up 2", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["valet"] = { "anim@amb@casino@valet_scenario@pose_a@", "base_a_m_y_vinewood_01", "Valet", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["valet2"] = { "anim@amb@casino@valet_scenario@pose_b@", "base_a_m_y_vinewood_01", "Valet 2", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = false, + }}, + ["valet3"] = { "anim@amb@casino@valet_scenario@pose_d@", "base_a_m_y_vinewood_01", "Valet 3", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tighten"] = { "timetable@denice@ig_1", "idle_b", "Tigten (Yoga)", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["fspose"] = { "missfam5_yoga", "c2_pose", "F Sex Pose", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["fspose2"] = { "missfam5_yoga", "c6_pose", "F Sex Pose 2", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["fspose4"] = { "anim@amb@carmeet@checkout_car@", "female_c_idle_d", "F Sex Pose 4", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["showerf"] = { "mp_safehouseshower@female@", "shower_enter_into_idle", "Shower Enter Female", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["showerf2"] = { "mp_safehouseshower@female@", "shower_idle_a", "Shower Female", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["showerf3"] = { "mp_safehouseshower@female@", "shower_idle_b", "Shower Female 2", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["showerm"] = { "mp_safehouseshower@male@", "male_shower_idle_a", "Shower Enter Male", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["showerm2"] = { "mp_safehouseshower@male@", "male_shower_idle_b", "Shower Male 2", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["showerm3"] = { "mp_safehouseshower@male@", "male_shower_idle_c", "Shower Male 3", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["showerm4"] = { "mp_safehouseshower@male@", "male_shower_idle_d", "Shower Male 4", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["picklock"] = { "missheistfbisetup1", "hassle_intro_loop_f", "Picklock", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["cleanhands"] = { "missheist_agency3aig_23", "urinal_sink_loop", "Clean Them Filthy Hands", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["cleanface"] = { "switch@michael@wash_face", "loop_michael", "Clean Your Face", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["buzz"] = { "anim@apt_trans@buzzer", "buzz_reg", "Buzz Door", AnimationOptions = { + EmoteLoop = false, + EmoteMoving = false, + }}, + ["piss"] = { "missbigscore1switch_trevor_piss", "piss_loop", "Piss (Male)", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + }}, + ["grieve"] = { "anim@miss@low@fin@vagos@", "idle_ped05", "Grieve The Dead", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true, + }}, + ["respect"] = { "anim@mp_player_intcelebrationmale@respect", "respect", "Respect Male", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = false, + }}, + ["respectf"] = { "anim@mp_player_intcelebrationfemale@respect", "respect", "Respect Female", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = false, + }}, + ["bang"] = { "anim@mp_player_intcelebrationfemale@bang_bang", "bang_bang", "Bang Bang ", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 2500, + }}, + ["checkcar"] = { "anim@amb@carmeet@checkout_car@male_a@idles", "idle_b", "Check Out · Female ", AnimationOptions = { + EmoteLoop = true, + }}, + ["checkcar2"] = { "anim@amb@carmeet@checkout_car@male_c@idles", "idle_a", "Check Out 2 · Male ", AnimationOptions = { + EmoteLoop = true, + }}, + ["showboobs"] = { "mini@strip_club@backroom@", "stripper_b_backroom_idle_b", "Show Boobs ", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 6000, + }}, + ["showboobs2"] = { "mini@strip_club@idles@stripper", "stripper_idle_05", "Show Boobs 2", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 6000, + }}, + ["watchstripper"] = { "amb@world_human_strip_watch_stand@male_c@idle_a", "idle_b", "Watch Stripper ", AnimationOptions = { + EmoteMoving = false, + EmoteDuration = 6000, + }}, + ["hhands"] = { "misssnowie@hearthands", "base", "Heart Hands", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + + + + ----------------------------------------------------------------------------------------------------------- + ------ The male and female 'interaction menu' emotes from GTA Online can be found under the following animation directories: + ------ + ------ Male: anim@mp_player_intcelebrationmale + ------ + ------ Female: anim@mp_player_intcelebrationfemale + + ----------------------------------------------------------------------------------------------------------- + + + + + ----------------------------------------------------------------------------------------------------------- + ------ These are Scenarios, some of these dont work on women and some other issues, but still good to have. + ----------------------------------------------------------------------------------------------------------- + + + ["atm"] = { "Scenario", "PROP_HUMAN_ATM", "ATM" }, + ["bbq"] = { "MaleScenario", "PROP_HUMAN_BBQ", "BBQ" }, + ["bumbin"] = { "Scenario", "PROP_HUMAN_BUM_BIN", "Bum Bin" }, + ["bumsleep"] = { "Scenario", "WORLD_HUMAN_BUM_SLUMPED", "Bum Sleep" }, + ["cheer"] = { "Scenario", "WORLD_HUMAN_CHEERING", "Cheer" }, + ["chinup"] = { "Scenario", "PROP_HUMAN_MUSCLE_CHIN_UPS", "Chinup" }, + ["cop"] = { "Scenario", "WORLD_HUMAN_COP_IDLES", "Cop" }, + ["drill"] = { "Scenario", "WORLD_HUMAN_CONST_DRILL", "Construction Drilling" }, + ["filmshocking"] = { "Scenario", "WORLD_HUMAN_MOBILE_FILM_SHOCKING", "Film Shocking" }, + ["flex"] = { "Scenario", "WORLD_HUMAN_MUSCLE_FLEX", "Flex" }, + ["guard"] = { "Scenario", "WORLD_HUMAN_GUARD_STAND", "Guard" }, + ["garden"] = { "Scenario", "WORLD_HUMAN_GARDENER_PLANT", "Gardening" }, + ["hammer"] = { "Scenario", "WORLD_HUMAN_HAMMERING", "Hammer" }, + ["hangout"] = { "Scenario", "WORLD_HUMAN_HANG_OUT_STREET", "Hangout" }, + ["impatient"] = { "Scenario", "WORLD_HUMAN_STAND_IMPATIENT", "Impatient" }, + ["janitor"] = { "Scenario", "WORLD_HUMAN_JANITOR", "Janitor" }, + ["jog"] = { "Scenario", "WORLD_HUMAN_JOG_STANDING", "Jog" }, + ["kneel"] = { "Scenario", "CODE_HUMAN_MEDIC_KNEEL", "Kneel" }, + ["lean"] = { "Scenario", "WORLD_HUMAN_LEANING", "Lean" }, + ["leanbar"] = { "Scenario", "PROP_HUMAN_BUM_SHOPPING_CART", "Lean Bar" }, + ["lookout"] = { "Scenario", "CODE_HUMAN_CROSS_ROAD_WAIT", "Lookout" }, + ["maid"] = { "Scenario", "WORLD_HUMAN_MAID_CLEAN", "Maid" }, + ["medic"] = { "Scenario", "CODE_HUMAN_MEDIC_TEND_TO_DEAD", "Medic" }, + ["musician"] = { "MaleScenario", "WORLD_HUMAN_MUSICIAN", "Musician" }, -- Ambient Music Doesn't Seem To Work For Female, Hence It's Male Only + ["notepad2"] = { "Scenario", "CODE_HUMAN_MEDIC_TIME_OF_DEATH", "Notepad 2" }, + ["parkingmeter"] = { "Scenario", "PROP_HUMAN_PARKING_METER", "Parking Meter" }, + ["party"] = { "Scenario", "WORLD_HUMAN_PARTYING", "Party" }, + ["texting"] = { "Scenario", "WORLD_HUMAN_STAND_MOBILE", "Texting" }, + ["prosthigh"] = { "Scenario", "WORLD_HUMAN_PROSTITUTE_HIGH_CLASS", "Prostitue High" }, + ["prostlow"] = { "Scenario", "WORLD_HUMAN_PROSTITUTE_LOW_CLASS", "Prostitue Low" }, + ["puddle"] = { "Scenario", "WORLD_HUMAN_BUM_WASH", "Puddle" }, + ["record"] = { "Scenario", "WORLD_HUMAN_MOBILE_FILM_SHOCKING", "Record" }, + + + -- Sitchair is a litte special, since you want the player to be seated correctly. + -- So we set it as "ScenarioObject" and do TaskStartScenarioAtPosition() instead of "AtPlace" + + ["sitchair"] = { "ScenarioObject", "PROP_HUMAN_SEAT_CHAIR_MP_PLAYER", "Sit Chair" }, + ["smoke"] = { "Scenario", "WORLD_HUMAN_SMOKING", "Smoke" }, + ["smokeweed"] = { "MaleScenario", "WORLD_HUMAN_DRUG_DEALER", "Smoke Weed (Male)" }, -- Male + ["smokepot"] = { "Scenario", "WORLD_HUMAN_SMOKING_POT", "Smoke Weed (Female)" }, -- Female + ["statue"] = { "Scenario", "WORLD_HUMAN_HUMAN_STATUE", "Statue" }, + ["sunbathe3"] = { "Scenario", "WORLD_HUMAN_SUNBATHE", "Sunbathe 3" }, + ["sunbatheback"] = { "Scenario", "WORLD_HUMAN_SUNBATHE_BACK", "Sunbathe Back" }, + ["weld"] = { "Scenario", "WORLD_HUMAN_WELDING", "Weld" }, + ["windowshop"] = { "Scenario", "WORLD_HUMAN_WINDOW_SHOP_BROWSE", "Window Shop" }, + ["yoga"] = { "Scenario", "WORLD_HUMAN_YOGA", "Yoga" }, + + + -- CASINO DLC EMOTES (Requires gamebuild 2060 or higher) + + + ["karate"] = { "anim@mp_player_intcelebrationfemale@karate_chops", "karate_chops", "Karate" }, + ["karate2"] = { "anim@mp_player_intcelebrationmale@karate_chops", "karate_chops", "Karate 2" }, + ["cutthroat"] = { "anim@mp_player_intcelebrationmale@cut_throat", "cut_throat", "Cut Throat" }, + ["cutthroat2"] = { "anim@mp_player_intcelebrationfemale@cut_throat", "cut_throat", "Cut Throat 2" }, + ["mindblown"] = { "anim@mp_player_intcelebrationmale@mind_blown", "mind_blown", "Mind Blown", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 4000 + }}, + ["mindblown2"] = { "anim@mp_player_intcelebrationfemale@mind_blown", "mind_blown", "Mind Blown 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 4000 + }}, + ["boxing"] = { "anim@mp_player_intcelebrationmale@shadow_boxing", "shadow_boxing", "Boxing", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 4000 + }}, + ["boxing2"] = { "anim@mp_player_intcelebrationfemale@shadow_boxing", "shadow_boxing", "Boxing 2", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 4000 + }}, + ["stink"] = { "anim@mp_player_intcelebrationfemale@stinker", "stinker", "Stink", AnimationOptions = { + EmoteMoving = true, + EmoteLoop = true + }}, + ["think4"] = { "anim@amb@casino@hangout@ped_male@stand@02b@idles", "idle_a", "Think 4", AnimationOptions = { + EmoteLoop = true, + EmoteMoving = true, + }}, + ["adjusttie"] = { "clothingtie", "try_tie_positive_a", "Adjust Tie", AnimationOptions = { + EmoteMoving = true, + EmoteDuration = 5000 + }}, +} + + +--- EMOTES WITH 1 OR 2 PROPS --- + +DP.PropEmotes = { + ["umbrella"] = { "amb@world_human_drinking@coffee@male@base", "base", "Umbrella", AnimationOptions = { + Prop = "p_amb_brolly_01", + PropBone = 57005, + PropPlacement = { 0.15, 0.005, 0.0, 87.0, -20.0, 180.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['umbrella2'] = { 'rcmnigel1d', 'base_club_shoulder', 'Umbrella 2', AnimationOptions = { + Prop = 'p_amb_brolly_01', + PropBone = 28422, + PropPlacement = { 0.0700, 0.0100, 0.1100, 2.3402393, -150.9605721, 57.3374916 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + + ----------------------------------------------------------------------------------------------------- + ------ This is an example of an emote with 2 props, pretty simple! ---------------------------------- + ----------------------------------------------------------------------------------------------------- + + ["notepad"] = { "missheistdockssetup1clipboard@base", "base", "Notepad", AnimationOptions = { + Prop = 'prop_notepad_01', + PropBone = 18905, + PropPlacement = { 0.1, 0.02, 0.05, 10.0, 0.0, 0.0 }, + SecondProp = 'prop_pencil_01', + SecondPropBone = 58866, + SecondPropPlacement = { 0.11, -0.02, 0.001, -120.0, 0.0, 0.0 }, + -- EmoteLoop is used for emotes that should loop, its as simple as that. + -- Then EmoteMoving is used for emotes that should only play on the upperbody. + -- The code then checks both values and sets the MovementType to the correct one + EmoteLoop = true, + EmoteMoving = true, + }}, + ["box"] = { "anim@heists@box_carry@", "idle", "Box", AnimationOptions = { + Prop = "hei_prop_heist_box", + PropBone = 60309, + PropPlacement = { 0.025, 0.08, 0.255, -145.0, 290.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["rose"] = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "Rose", AnimationOptions = { + Prop = "prop_single_rose", + PropBone = 18905, + PropPlacement = { 0.13, 0.15, 0.0, -100.0, 0.0, -20.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["smoke2"] = { "amb@world_human_aa_smoke@male@idle_a", "idle_c", "Smoke 2", AnimationOptions = { + Prop = 'prop_cs_ciggy_01', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["smoke3"] = { "amb@world_human_aa_smoke@male@idle_a", "idle_b", "Smoke 3", AnimationOptions = { + Prop = 'prop_cs_ciggy_01', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["smoke4"] = { "amb@world_human_smoking@female@idle_a", "idle_b", "Smoke 4", AnimationOptions = { + Prop = 'prop_cs_ciggy_01', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["bong"] = { "anim@safehouse@bong", "bong_stage3", "Bong", AnimationOptions = { + Prop = 'hei_heist_sh_bong_01', + PropBone = 18905, + PropPlacement = { 0.10, -0.25, 0.0, 95.0, 190.0, 180.0 }, + }}, + ["fishing1"] = { "amb@world_human_stand_fishing@idle_a", "idle_a", "Fishing 1", AnimationOptions = { + Prop = 'prop_fishing_rod_01', + PropBone = 60309, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["fishing2"] = { "amb@world_human_stand_fishing@idle_a", "idle_b", "Fishing 2", AnimationOptions = { + Prop = 'prop_fishing_rod_01', + PropBone = 60309, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["fishing3"] = { "amb@world_human_stand_fishing@idle_a", "idle_c", "Fishing 3", AnimationOptions = { + Prop = 'prop_fishing_rod_01', + PropBone = 60309, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["suitcase"] = { "move_weapon@jerrycan@generic", "idle", "Suitcase", AnimationOptions = { + Prop = "prop_ld_suitcase_01", + PropBone = 57005, + PropPlacement = { 0.35, 0.0, 0.0, 0.0, 266.0, 90.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["suitcase2"] = { "move_weapon@jerrycan@generic", "idle", "Suitcase 2", AnimationOptions = { + Prop = "prop_security_case_01", + PropBone = 57005, + PropPlacement = { 0.13, 0.0, -0.01, 0.0, 280.0, 90.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["boombox"] = { "move_weapon@jerrycan@generic", "idle", "Boombox", AnimationOptions = { + Prop = "prop_boombox_01", + PropBone = 57005, + PropPlacement = { 0.27, 0.0, 0.0, 0.0, 263.0, 58.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["toolbox"] = { "move_weapon@jerrycan@generic", "idle", "Toolbox", AnimationOptions = { + Prop = "prop_tool_box_04", + PropBone = 28422, + PropPlacement = { 0.3960, 0.0410, -0.0030, -90.00, 0.0, 90.00 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["toolbox2"] = { "move_weapon@jerrycan@generic", "idle", "Toolbox 2", AnimationOptions = { + Prop = "imp_prop_tool_box_01a", + PropBone = 28422, + PropPlacement = { 0.3700, 0.0200, 0.0, 90.00, 0.0, -90.00 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["gbag"] = { "missfbi4prepp1", "_idle_garbage_man", "Garbage Bag", AnimationOptions = { + Prop = "prop_cs_street_binbag_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0400, -0.0200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beerbox"] = { "move_weapon@jerrycan@generic", "idle", "Beer Box 1", AnimationOptions = { + Prop = "v_ret_ml_beerdus", + PropBone = 57005, + PropPlacement = { 0.22, 0.0, 0.0, 0.0, 266.0, 48.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beerbox2"] = { "move_weapon@jerrycan@generic", "idle", "Beer Box 2", AnimationOptions = { + Prop = "v_ret_ml_beeram", + PropBone = 57005, + PropPlacement = { 0.22, 0.0, 0.0, 0.0, 266.0, 48.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beerbox3"] = { "move_weapon@jerrycan@generic", "idle", "Beer Box 3", AnimationOptions = { + Prop = "v_ret_ml_beerpride", + PropBone = 57005, + PropPlacement = { 0.22, 0.0, 0.0, 0.0, 266.0, 48.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beerbox4"] = { "move_weapon@jerrycan@generic", "idle", "Beer Box 4", AnimationOptions = { + Prop = "v_ret_ml_beerbar", + PropBone = 57005, + PropPlacement = { 0.22, 0.0, 0.0, 0.0, 266.0, 60.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["mugshot"] = { "mp_character_creation@customise@male_a", "loop", "Mugshot", AnimationOptions = { + Prop = 'prop_police_id_board', + PropBone = 58868, + PropPlacement = { 0.12, 0.24, 0.0, 5.0, 0.0, 70.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["coffee"] = { "amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Coffee", AnimationOptions = { + Prop = 'p_amb_coffeecup_01', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["whiskey"] = { "amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Whiskey", AnimationOptions = { + Prop = 'prop_drink_whisky', + PropBone = 28422, + PropPlacement = { 0.01, -0.01, -0.06, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["whiskeyb"] = { "amb@world_human_drinking@beer@male@idle_a", "idle_a", "Whiskey Bottle", AnimationOptions = { + Prop = 'ba_prop_battle_whiskey_bottle_2_s', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.05, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beer"] = { "amb@world_human_drinking@beer@male@idle_a", "idle_c", "Beer", AnimationOptions = { + Prop = 'prop_amb_beer_bottle', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.06, 0.0, 15.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["whiskeyb2"] = { "amb@world_human_drinking@beer@male@idle_a", "idle_a", "Whiskey Bottle 2", AnimationOptions = { + Prop = 'ba_prop_battle_whiskey_bottle_2_s', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.05, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beer2"] = { "amb@world_human_drinking@beer@male@idle_a", "idle_c", "Beer 2", AnimationOptions = { + Prop = 'prop_amb_beer_bottle', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.06, 0.0, 15.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["whiskeyb3"] = { "amb@world_human_drinking@beer@male@idle_a", "idle_a", "Whiskey Bottle 3", AnimationOptions = { + Prop = 'ba_prop_battle_whiskey_bottle_2_s', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.05, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["beerf"] = { "amb@world_human_drinking@beer@female@idle_a", "idle_a", "Beer Female", AnimationOptions = { + Prop = 'prop_amb_beer_bottle', + PropBone = 28422, + PropPlacement = { 0.0, -0.0, 0.05, 15.0, 15.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wine2"] = { "amb@world_human_drinking@beer@female@idle_a", "idle_e", "Wine 2 - Bottle", AnimationOptions = { + Prop = 'prop_wine_rose', + PropBone = 28422, + PropPlacement = { -0.0, 0.04, -0.19, 10.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + --- PropPlacement = {-0.0, 0.03, -0.20, 5.0, 0.0, 0.0}, + --- F&B L&R U&D R.F&B + }}, + ["beerf3"] = { "amb@world_human_drinking@beer@female@idle_a", "idle_a", "Beer Female 3", AnimationOptions = { + Prop = 'prop_amb_beer_bottle', + PropBone = 28422, + PropPlacement = { 0.0, -0.0, 0.05, 15.0, 15.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["wine3"] = { "amb@world_human_drinking@beer@female@idle_a", "idle_e", "Wine 3 - Bottle", AnimationOptions = { + Prop = 'prop_wine_rose', + PropBone = 28422, + PropPlacement = { -0.0, 0.04, -0.19, 10.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + --- PropPlacement = {-0.0, 0.03, -0.20, 5.0, 0.0, 0.0}, + --- F&B L&R U&D R.F&B + }}, + ["cup"] = { "amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Cup", AnimationOptions = { + Prop = 'prop_plastic_cup_02', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["donut"] = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Donut", AnimationOptions = { + Prop = 'prop_amb_donut', + PropBone = 18905, + PropPlacement = { 0.13, 0.05, 0.02, -50.0, 16.0, 60.0 }, + EmoteMoving = true, + }}, + ["burger"] = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Burger", AnimationOptions = { + Prop = 'prop_cs_burger_01', + PropBone = 18905, + PropPlacement = { 0.13, 0.05, 0.02, -50.0, 16.0, 60.0 }, + EmoteMoving = true, + }}, + ["sandwich"] = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Sandwich", AnimationOptions = { + Prop = 'prop_sandwich_01', + PropBone = 18905, + PropPlacement = { 0.13, 0.05, 0.02, -50.0, 16.0, 60.0 }, + EmoteMoving = true, + }}, + ["soda"] = { "amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Soda", AnimationOptions = { + Prop = 'prop_ecola_can', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 130.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["water"] = { "amb@world_human_drinking@coffee@male@idle_a", "idle_c", "Water", AnimationOptions = { + Prop = 'ba_prop_club_water_bottle', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.090, 0.0, 0.0, 130.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["egobar"] = { "mp_player_inteat@burger", "mp_player_int_eat_burger", "Ego Bar", AnimationOptions = { + Prop = 'prop_choc_ego', + PropBone = 60309, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteMoving = true, + }}, + ["candy"] = { "mp_player_inteat@pnq", "loop", "Candy", AnimationOptions = { + Prop = 'prop_candy_pqs', + PropBone = 60309, + PropPlacement = { -0.0300, 0.0180, 0.0, 180.0, 180.0, -88.099 }, + EmoteMoving = true, + }}, + ["wine"] = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "Wine", AnimationOptions = { + Prop = 'prop_drink_redwine', + PropBone = 18905, + PropPlacement = { 0.10, -0.03, 0.03, -100.0, 0.0, -10.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["flute"] = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "Flute", AnimationOptions = { + Prop = 'prop_champ_flute', + PropBone = 18905, + PropPlacement = { 0.10, -0.03, 0.03, -100.0, 0.0, -10.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["champagne"] = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "Champagne", AnimationOptions = { + Prop = 'prop_drink_champ', + PropBone = 18905, + PropPlacement = { 0.10, -0.03, 0.03, -100.0, 0.0, -10.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["cigar"] = { "amb@world_human_smoking@male@male_a@enter", "enter", "Cigar", AnimationOptions = { + Prop = 'prop_cigar_02', + PropBone = 47419, + PropPlacement = { 0.010, 0.0, 0.0, 50.0, 0.0, -80.0 }, + EmoteMoving = true, + EmoteDuration = 2600 + }}, + ["cigar2"] = { "amb@world_human_smoking@male@male_a@enter", "enter", "Cigar 2", AnimationOptions = { + Prop = 'prop_cigar_01', + PropBone = 47419, + PropPlacement = { 0.010, 0.0, 0.0, 50.0, 0.0, -80.0 }, + EmoteMoving = true, + EmoteDuration = 2600 + }}, + ["guitar"] = { "amb@world_human_musician@guitar@male@idle_a", "idle_b", "Guitar", AnimationOptions = { + Prop = 'prop_acc_guitar_01', + PropBone = 24818, + PropPlacement = { -0.1, 0.31, 0.1, 0.0, 20.0, 150.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["guitar2"] = { "switch@trevor@guitar_beatdown", "001370_02_trvs_8_guitar_beatdown_idle_busker", "Guitar 2", AnimationOptions = { + Prop = 'prop_acc_guitar_01', + PropBone = 24818, + PropPlacement = { -0.05, 0.31, 0.1, 0.0, 20.0, 150.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["guitarelectric"] = { "amb@world_human_musician@guitar@male@idle_a", "idle_b", "Guitar Electric", AnimationOptions = { + Prop = 'prop_el_guitar_01', + PropBone = 24818, + PropPlacement = { -0.1, 0.31, 0.1, 0.0, 20.0, 150.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["guitarelectric2"] = { "amb@world_human_musician@guitar@male@idle_a", "idle_b", "Guitar Electric 2", AnimationOptions = { + Prop = 'prop_el_guitar_03', + PropBone = 24818, + PropPlacement = { -0.1, 0.31, 0.1, 0.0, 20.0, 150.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["book"] = { "cellphone@", "cellphone_text_read_base", "Book", AnimationOptions = { + Prop = 'prop_novel_01', + PropBone = 6286, + PropPlacement = { 0.15, 0.03, -0.065, 0.0, 180.0, 90.0 }, -- This positioning isnt too great, was to much of a hassle + EmoteMoving = true, + EmoteLoop = true + }}, + ["bouquet"] = { "impexp_int-0", "mp_m_waremech_01_dual-0", "Bouquet", AnimationOptions = { + Prop = 'prop_snow_flower_02', + PropBone = 24817, + PropPlacement = { -0.29, 0.40, -0.02, -90.0, -90.0, 0.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["teddy"] = { "impexp_int-0", "mp_m_waremech_01_dual-0", "Teddy", AnimationOptions = { + Prop = 'v_ilev_mr_rasberryclean', + PropBone = 24817, + PropPlacement = { -0.20, 0.46, -0.016, -180.0, -90.0, 0.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["backpack"] = { "move_p_m_zero_rucksack", "nill", "Backpack", AnimationOptions = { + Prop = 'p_michael_backpack_s', + PropBone = 24818, + PropPlacement = { 0.07, -0.11, -0.05, 0.0, 90.0, 175.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["clipboard"] = { "missfam4", "base", "Clipboard", AnimationOptions = { + Prop = 'p_amb_clipboard_01', + PropBone = 36029, + PropPlacement = { 0.16, 0.08, 0.1, -130.0, -50.0, 0.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["map"] = { "amb@world_human_tourist_map@male@base", "base", "Map", AnimationOptions = { + Prop = 'prop_tourist_map_01', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteMoving = true, + EmoteLoop = true + }}, + ["map2"] = { "amb@code_human_in_bus_passenger_idles@female@tablet@idle_a", "idle_a", "Map 2", AnimationOptions = { + Prop = "prop_tourist_map_01", + PropBone = 28422, + PropPlacement = { -0.05, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beg"] = { "amb@world_human_bum_freeway@male@base", "base", "Beg", AnimationOptions = { + Prop = 'prop_beggers_sign_03', + PropBone = 58868, + PropPlacement = { 0.19, 0.18, 0.0, 5.0, 0.0, 40.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["makeitrain"] = { "anim@mp_player_intupperraining_cash", "idle_a", "Make It Rain", AnimationOptions = { + Prop = 'prop_anim_cash_pile_01', + PropBone = 60309, + PropPlacement = { 0.0, 0.0, 0.0, 180.0, 0.0, 70.0 }, + EmoteMoving = true, + EmoteLoop = true, + PtfxAsset = "scr_xs_celebration", + PtfxName = "scr_xs_money_rain", + PtfxPlacement = { 0.0, 0.0, -0.09, -80.0, 0.0, 0.0, 1.0 }, + PtfxInfo = Config.Languages[Config.MenuLanguage]['makeitrain'], + PtfxWait = 500, + }}, + ["camera"] = { "amb@world_human_paparazzi@male@base", "base", "Camera", AnimationOptions = { + Prop = 'prop_pap_camera_01', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + PtfxAsset = "scr_bike_business", + PtfxName = "scr_bike_cfid_camera_flash", + PtfxPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 }, + PtfxInfo = Config.Languages[Config.MenuLanguage]['camera'], + PtfxWait = 200, + }}, + ["champagnespray"] = { "anim@mp_player_intupperspray_champagne", "idle_a", "Champagne Spray", AnimationOptions = { + Prop = 'ba_prop_battle_champ_open', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteMoving = true, + EmoteLoop = true, + PtfxAsset = "scr_ba_club", + PtfxName = "scr_ba_club_champagne_spray", + PtfxPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + PtfxInfo = Config.Languages[Config.MenuLanguage]['spraychamp'], + PtfxWait = 500, + }}, + ["joint"] = { "amb@world_human_smoking@male@male_a@enter", "enter", "Joint", AnimationOptions = { + Prop = 'p_cs_joint_02', + PropBone = 47419, + PropPlacement = { 0.015, -0.009, 0.003, 55.0, 0.0, 110.0 }, + EmoteMoving = true, + EmoteDuration = 2600 + }}, + ["cig"] = { "amb@world_human_smoking@male@male_a@enter", "enter", "Cig", AnimationOptions = { + Prop = 'prop_amb_ciggy_01', + PropBone = 47419, + PropPlacement = { 0.015, -0.009, 0.003, 55.0, 0.0, 110.0 }, + EmoteMoving = true, + EmoteDuration = 2600 + }}, + ["brief"] = { "move_weapon@jerrycan@generic", "idle", "Briefcase", AnimationOptions = { + Prop = "prop_ld_case_01", + PropBone = 57005, + PropPlacement = { 0.12, 0.0, 0.0, 0.0, 255.0, 80.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tablet"] = { "amb@world_human_tourist_map@male@base", "base", "Tablet", AnimationOptions = { + Prop = "prop_cs_tablet", + PropBone = 28422, + PropPlacement = { 0.0, -0.03, 0.0, 20.0, -90.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tablet2"] = { "amb@code_human_in_bus_passenger_idles@female@tablet@idle_a", "idle_a", "Tablet 2", AnimationOptions = { + Prop = "prop_cs_tablet", + PropBone = 28422, + PropPlacement = { -0.05, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["phonecall"] = { "cellphone@", "cellphone_call_listen_base", "Phone Call", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["phonecall2"] = { "random@kidnap_girl", "ig_1_girl_on_phone_loop", "Phone Call 2", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["wt"] = { "cellphone@", "cellphone_text_read_base", "Walkie Talkie", AnimationOptions = { + Prop = "prop_cs_hand_radio", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["clean"] = { "timetable@floyd@clean_kitchen@base", "base", "Clean", AnimationOptions = { + Prop = "prop_sponge_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.01, 90.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["clean2"] = { "amb@world_human_maid_clean@", "base", "Clean 2", AnimationOptions = { + Prop = "prop_sponge_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.01, 90.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["protest"] = { "rcmnigel1d", "base_club_shoulder", "Protest", AnimationOptions = { + Prop = "prop_cs_protest_sign_01", + PropBone = 57005, + PropPlacement = { 0.1820, 0.2400, 0.0600, -69.3774235, 5.9142048, -13.9572354 }, + -- + EmoteLoop = true, + EmoteMoving = true, + }}, + ["protest2"] = { "rcmnigel1d", "base_club_shoulder", "Protest 2 - Pride ", AnimationOptions = { + Prop = "pride_sign_01", + PropBone = 57005, + PropPlacement = { 0.1820, 0.2400, 0.0600, -69.3774235, 5.9142048, -13.9572354 }, + -- + EmoteLoop = true, + EmoteMoving = true, + }}, + ["binoculars"] = { "amb@world_human_binoculars@male@idle_b", "idle_f", "Binoculars", AnimationOptions = { + Prop = "prop_binoc_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + -- + EmoteLoop = true, + EmoteMoving = true, + }}, + ["binoculars2"] = { "amb@world_human_binoculars@male@idle_a", "idle_c", "Binoculars 2", AnimationOptions = { + Prop = "prop_binoc_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tennisplay"] = { "move_weapon@jerrycan@generic", "idle", "Tennis Play", AnimationOptions = { + Prop = "prop_tennis_bag_01", + PropBone = 57005, + PropPlacement = { 0.27, 0.0, 0.0, 91.0, 0.0, -82.9999951 }, + SecondProp = 'prop_tennis_rack_01', + SecondPropBone = 60309, + SecondPropPlacement = { 0.0800, 0.0300, 0.0, -130.2907295, 3.8782324, 6.588224 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["weights"] = { "amb@world_human_muscle_free_weights@male@barbell@base", "base", "Weights", AnimationOptions = { + Prop = "prop_curl_bar_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["weights2"] = { "amb@world_human_muscle_free_weights@male@barbell@idle_a", "idle_d", "Weights 2", AnimationOptions = { + Prop = "prop_curl_bar_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["fuel"] = { "weapons@misc@jerrycan@", "fire", "Fuel", AnimationOptions = { + Prop = "w_am_jerrycan", + PropBone = 57005, + PropPlacement = { 0.1800, 0.1300, -0.2400, -165.8693883, -11.2122753, -32.9453021 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["fuel2"] = { "weapons@misc@jerrycan@franklin", "idle", "Fuel 2 (Carry)", AnimationOptions = { + Prop = "w_am_jerrycan", + PropBone = 28422, + PropPlacement = { 0.26, 0.050, 0.0300, 80.00, 180.000, 79.99 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["hitchhike"] = { "random@hitch_lift", "idle_f", "Hitchhike", AnimationOptions = { + Prop = "w_am_jerrycan", + PropBone = 18905, + PropPlacement = { 0.32, -0.0100, 0.0, -162.423, 74.83, 58.79 }, + SecondProp = 'prop_michael_backpack', + SecondPropBone = 40269, + SecondPropPlacement = { -0.07, -0.21, -0.11, -144.93, 117.358, -6.16 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign"] = { "rcmnigel1d", "base_club_shoulder", "Steal Stop Sign ", AnimationOptions = { + Prop = "prop_sign_road_01a", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign2"] = { "rcmnigel1d", "base_club_shoulder", "Steal Yield Sign ", AnimationOptions = { + Prop = "prop_sign_road_02a", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign3"] = { "rcmnigel1d", "base_club_shoulder", "Steal Hospital Sign ", AnimationOptions = { + Prop = "prop_sign_road_03d", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign4"] = { "rcmnigel1d", "base_club_shoulder", "Steal Parking Sign ", AnimationOptions = { + Prop = "prop_sign_road_04a", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign5"] = { "rcmnigel1d", "base_club_shoulder", "Steal Parking Sign 2 ", AnimationOptions = { + Prop = "prop_sign_road_04w", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign6"] = { "rcmnigel1d", "base_club_shoulder", "Steal Pedestrian Sign ", AnimationOptions = { + Prop = "prop_sign_road_05a", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign7"] = { "rcmnigel1d", "base_club_shoulder", "Steal Street Sign ", AnimationOptions = { + Prop = "prop_sign_road_05t", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign8"] = { "rcmnigel1d", "base_club_shoulder", "Steal Freeway Sign ", AnimationOptions = { + Prop = "prop_sign_freewayentrance", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["ssign9"] = { "rcmnigel1d", "base_club_shoulder", "Steal Stop Sign Snow ", AnimationOptions = { + Prop = "prop_snow_sign_road_01a", + PropBone = 60309, + PropPlacement = { -0.1390, -0.9870, 0.4300, -67.3315314, 145.0627869, -4.4318885 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["conehead"] = { "move_m@drunk@verydrunk_idles@", "fidget_07", "Cone Head ", AnimationOptions = { + Prop = "prop_roadcone02b", + PropBone = 31086, + PropPlacement = { 0.0500, 0.0200, -0.000, 30.0000004, 90.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtraya"] = { "anim@heists@box_carry@", "idle", "Food Tray", AnimationOptions = { + Prop = "prop_food_bs_tray_03", + PropBone = 28422, + PropPlacement = { 0.0100, -0.0400, -0.1390, 20.0000007, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayb"] = { "anim@heists@box_carry@", "idle", "Food Tray B", AnimationOptions = { + Prop = "prop_food_bs_tray_02", + PropBone = 28422, + PropPlacement = { 0.0100, -0.0400, -0.1390, 20.0000007, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayc"] = { "anim@heists@box_carry@", "idle", "Food Tray C", AnimationOptions = { + Prop = "prop_food_cb_tray_02", + PropBone = 28422, + PropPlacement = { 0.0100, -0.0400, -0.1390, 20.0000007, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayd"] = { "anim@heists@box_carry@", "idle", "Food Tray D", AnimationOptions = { + Prop = "prop_food_tray_02", + PropBone = 28422, + PropPlacement = { 0.0100, -0.0400, -0.1390, 20.0000007, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtraye"] = { "anim@heists@box_carry@", "idle", "Food Tray E", AnimationOptions = { + Prop = "prop_food_tray_03", + PropBone = 28422, + PropPlacement = { 0.0100, -0.0400, -0.1390, 20.0000007, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayf"] = { "anim@heists@box_carry@", "idle", "Food Tray F", AnimationOptions = { + Prop = "prop_food_bs_tray_02", + PropBone = 57005, + PropPlacement = { 0.2500, 0.1000, 0.0700, -110.5483936, 73.3529273, -16.338362 }, + SecondProp = 'prop_food_bs_tray_03', + SecondPropBone = 18905, + SecondPropPlacement = { 0.2200, 0.1300, -0.1000, -127.7725487, 110.2074758, -3.5886263 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayg"] = { "anim@heists@box_carry@", "idle", "Food Tray G", AnimationOptions = { + Prop = "prop_food_cb_tray_02", + PropBone = 57005, + PropPlacement = { 0.2500, 0.1000, 0.0700, -110.5483936, 73.3529273, -16.338362 }, + SecondProp = 'prop_food_cb_tray_02', + SecondPropBone = 18905, + SecondPropPlacement = { 0.2200, 0.1300, -0.1000, -127.7725487, 110.2074758, -3.5886263 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayh"] = { "anim@heists@box_carry@", "idle", "Food Tray H", AnimationOptions = { + Prop = "prop_food_tray_02", + PropBone = 57005, + PropPlacement = { 0.2500, 0.1000, 0.0700, -110.5483936, 73.3529273, -16.338362 }, + SecondProp = 'prop_food_tray_03', + SecondPropBone = 18905, + SecondPropPlacement = { 0.2200, 0.1300, -0.1000, -127.7725487, 110.2074758, -3.5886263 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayi"] = { "anim@heists@box_carry@", "idle", "Food Tray I", AnimationOptions = { + Prop = "prop_food_tray_02", + PropBone = 57005, + PropPlacement = { 0.2500, 0.1000, 0.0700, -110.5483936, 73.3529273, -16.338362 }, + SecondProp = 'prop_food_tray_02', + SecondPropBone = 18905, + SecondPropPlacement = { 0.2200, 0.1300, -0.1000, -127.7725487, 110.2074758, -3.5886263 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayj"] = { "anim@move_f@waitress", "idle", "Food Tray J", AnimationOptions = { + Prop = "prop_food_bs_tray_02", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayk"] = { "anim@move_f@waitress", "idle", "Food Tray K", AnimationOptions = { + Prop = "prop_food_bs_tray_02", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayl"] = { "anim@move_f@waitress", "idle", "Food Tray L", AnimationOptions = { + Prop = "prop_food_bs_tray_03", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtraym"] = { "anim@move_f@waitress", "idle", "Food Tray M", AnimationOptions = { + Prop = "prop_food_cb_tray_02", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayn"] = { "anim@move_f@waitress", "idle", "Food Tray N", AnimationOptions = { + Prop = "prop_food_tray_02", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["foodtrayo"] = { "anim@move_f@waitress", "idle", "Food Tray O", AnimationOptions = { + Prop = "prop_food_tray_02", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["carrypizza"] = { "anim@heists@box_carry@", "idle", "Carry Pizza Box", AnimationOptions = { + Prop = "prop_pizza_box_02", + PropBone = 28422, + PropPlacement = { 0.0100, -0.1000, -0.1590, 20.0000007, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["carryfoodbag"] = { "move_weapon@jerrycan@generic", "idle", "Carry Food Bag", AnimationOptions = { + Prop = "prop_food_bs_bag_01", + PropBone = 57005, + PropPlacement = { 0.3300, 0.0, -0.0300, 0.0017365, -79.9999997, 110.0651988 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["carryfoodbag2"] = { "move_weapon@jerrycan@generic", "idle", "Carry Food Bag 2", AnimationOptions = { + Prop = "prop_food_cb_bag_01", + PropBone = 57005, + PropPlacement = { 0.3800, 0.0, -0.0300, 0.0017365, -79.9999997, 110.0651988 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["carryfoodbag3"] = { "move_weapon@jerrycan@generic", "idle", "Carry Food Bag 3", AnimationOptions = { + Prop = "prop_food_bag1", + PropBone = 57005, + PropPlacement = { 0.3800, 0.0, -0.0300, 0.0017365, -79.9999997, 110.0651988 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tag"] = { "anim@scripted@freemode@postertag@graffiti_spray@male@", "shake_can_male", "Tagging Shake Can Male", AnimationOptions = { + Prop = "prop_cs_spray_can", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0700, 0.0017365, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tag2"] = { "anim@scripted@freemode@postertag@graffiti_spray@heeled@", "shake_can_female", "Tagging Shake Can Female", AnimationOptions = { + Prop = "prop_cs_spray_can", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0700, 0.0017365, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tag3"] = { "anim@scripted@freemode@postertag@graffiti_spray@male@", "spray_can_var_01_male", "Tagging Male 1", AnimationOptions = { + Prop = "prop_cs_spray_can", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0700, 0.0017365, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tag4"] = { "anim@scripted@freemode@postertag@graffiti_spray@male@", "spray_can_var_02_male", "Tagging Male 2", AnimationOptions = { + Prop = "prop_cs_spray_can", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0700, 0.0017365, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tag5"] = { "anim@scripted@freemode@postertag@graffiti_spray@heeled@", "spray_can_var_01_female", "Tagging Female 1", AnimationOptions = { + Prop = "prop_cs_spray_can", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0700, 0.0017365, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["tag6"] = { "anim@scripted@freemode@postertag@graffiti_spray@heeled@", "spray_can_var_02_female", "Tagging Female 2", AnimationOptions = { + Prop = "prop_cs_spray_can", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0700, 0.0017365, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["beans"] = { "anim@scripted@island@special_peds@pavel@hs4_pavel_ig5_caviar_p1", "base_idle", "Beans", AnimationOptions = { + Prop = "h4_prop_h4_caviar_tin_01a", + PropBone = 60309, + PropPlacement = { 0.0, 0.0300, 0.0100, 0.0, 0.0, 0.0 }, + SecondProp = 'h4_prop_h4_caviar_spoon_01a', + SecondPropBone = 28422, + SecondPropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["newscam"] = { "missfinale_c2mcs_1", "fin_c2_mcs_1_camman", "News Camera", AnimationOptions = { + Prop = "prop_v_cam_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0300, 0.0100, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["newsmic"] = { "anim@heists@humane_labs@finale@keycards", "ped_a_enter_loop", "News Microphone", AnimationOptions = { + Prop = "p_ing_microphonel_01", + PropBone = 4154, + PropPlacement = { -0.00, -0.0200, 0.1100, 0.00, 0.0, 60.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["newsbmic"] = { "missfra1", "mcs2_crew_idle_m_boom", "News Boom Microphone", AnimationOptions = { + Prop = "prop_v_bmike_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["leafblower"] = { "amb@world_human_gardener_leaf_blower@base", "base", "Leaf Blower", AnimationOptions = { + Prop = "prop_leaf_blower_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["bbqf"] = { "amb@prop_human_bbq@male@idle_a", "idle_b", "BBQ (Female)", AnimationOptions = { + Prop = "prop_fish_slice_01", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["pump"] = { "missfbi4prepp1", "idle", "Pumpkin", AnimationOptions = { + Prop = "prop_veg_crop_03_pump", + PropBone = 28422, + PropPlacement = { 0.0200, 0.0600, -0.1200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["pump2"] = { "anim@heists@box_carry@", "idle", "Pumpkin 2", AnimationOptions = { + Prop = "prop_veg_crop_03_pump", + PropBone = 28422, + PropPlacement = { 0.0100, -0.16000, -0.2100, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["mop"] = { "missfbi4prepp1", "idle", "Mop", AnimationOptions = { + Prop = "prop_cs_mop_s", + PropBone = 28422, + PropPlacement = { -0.0200, -0.0600, -0.2000, -13.377, 10.3568, 17.9681 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["mop2"] = { "move_mop", "idle_scrub_small_player", "Mop 2", AnimationOptions = { + Prop = "prop_cs_mop_s", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.1200, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["jerkf"] = { "switch@trevor@jerking_off", "trev_jerking_off_loop", "JerkOff! Female", AnimationOptions = { + Prop = 'prop_cs_dildo_01', + PropBone = 28422, + PropPlacement = { 0.09, 0.05, -0.03, 90.0, 80.0, 30.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["rake"] = { "anim@amb@drug_field_workers@rake@male_a@base", "base", "Rake", AnimationOptions = { + Prop = "prop_tool_rake", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["rake2"] = { "anim@amb@drug_field_workers@rake@male_a@idles", "idle_b", "Rake 2", AnimationOptions = { + Prop = "prop_tool_rake", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["rake3"] = { "anim@amb@drug_field_workers@rake@male_b@base", "base", "Rake 3", AnimationOptions = { + Prop = "prop_tool_rake", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["rake4"] = { "anim@amb@drug_field_workers@rake@male_b@idles", "idle_d", "Rake 4", AnimationOptions = { + Prop = "prop_tool_rake", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["broom"] = { "anim@amb@drug_field_workers@rake@male_a@base", "base", "Broom", AnimationOptions = { + Prop = "prop_tool_broom", + PropBone = 28422, + PropPlacement = { -0.0100, 0.0400, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["broom2"] = { "anim@amb@drug_field_workers@rake@male_a@idles", "idle_b", "Broom 2", AnimationOptions = { + Prop = "prop_tool_broom", + PropBone = 28422, + PropPlacement = { -0.0100, 0.0400, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["broom3"] = { "anim@amb@drug_field_workers@rake@male_b@base", "base", "Broom 3", AnimationOptions = { + Prop = "prop_tool_broom", + PropBone = 28422, + PropPlacement = { -0.0100, 0.0400, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["broom4"] = { "anim@amb@drug_field_workers@rake@male_b@idles", "idle_d", "Broom 4", AnimationOptions = { + Prop = "prop_tool_broom", + PropBone = 28422, + PropPlacement = { -0.0100, 0.0400, -0.0300, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + }}, + ["champw"] = { "anim@move_f@waitress", "idle", "Champagne Waiter", AnimationOptions = { + Prop = "vw_prop_vw_tray_01a", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0100, 0.0, 0.0, 0.0 }, + SecondProp = 'prop_champ_cool', + SecondPropBone = 28422, + SecondPropPlacement = { 0.0, 0.0, 0.010, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["shit"] = { "missfbi3ig_0", "shit_loop_trev", "Shit", AnimationOptions = { + Prop = "prop_toilet_roll_01", + PropBone = 28422, + PropPlacement = { 0.0700, -0.02000, -0.2100, 0, 0, 0.0, 0.0 }, + SecondProp = 'prop_big_shit_01', + SecondPropBone = 0, + SecondPropPlacement = { -0.0100, 0.0600, -0.1550, 101.3015175, 7.3512213, -29.2665794 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["selfie"] = { "anim@mp_player_intuppertake_selfie", "idle_a", "Selfie", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 60309, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["selfie2"] = { "cellphone@self@franklin@", "peace", "Selfie 2", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["selfie3"] = { "cellphone@self@franklin@", "west_coast", "Selfie 3 - West Side", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["selfie4"] = { "cellphone@self@trevor@", "aggressive_finger", "Selfie 4 - Finger", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["selfie5"] = { "cellphone@self@trevor@", "proud_finger", "Selfie 5 - Finger 2", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["selfie6"] = { "cellphone@self@trevor@", "throat_slit", "Selfie 6 - Throat Slit", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["selfie7"] = { "cellphone@self@franklin@", "chest_bump", "Selfie 7 - Chest Bump", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["sittv"] = { "anim@heists@heist_safehouse_intro@variations@male@tv", "tv_part_one_loop", "Sit TV", AnimationOptions = { + Prop = "v_res_tre_remote", + PropBone = 57005, + PropPlacement = { 0.0990, 0.0170, -0.0300, -64.760, -109.544, 18.717 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["dig"] = { "random@burial", "a_burial", "Dig", AnimationOptions = { + Prop = "prop_tool_shovel", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.24, 0, 0, 0.0, 0.0 }, + SecondProp = 'prop_ld_shovel_dirt', + SecondPropBone = 28422, + SecondPropPlacement = { 0.0, 0.0, 0.24, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["bongos"] = { "amb@world_human_musician@bongos@male@base", "base", "Bongo Drums", AnimationOptions = { + Prop = "prop_bongos_01", + PropBone = 60309, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["medbag"] = { "move_weapon@jerrycan@generic", "idle", "Medic Bag", AnimationOptions = { + Prop = "xm_prop_x17_bag_med_01a", + PropBone = 57005, + PropPlacement = { 0.3900, -0.0600, -0.0600, -100.00, -180.00, -78.00 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["dufbag"] = { "move_weapon@jerrycan@generic", "idle", "Duffel Bag", AnimationOptions = { + Prop = "bkr_prop_duffel_bag_01a", + PropBone = 28422, + PropPlacement = { 0.2600, 0.0400, 0.00, 90.00, 0.00, -78.99 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["shopbag"] = { "move_weapon@jerrycan@generic", "idle", "Shopping Bag", AnimationOptions = { + Prop = "vw_prop_casino_shopping_bag_01a", + PropBone = 28422, + PropPlacement = { 0.24, 0.03, -0.04, 0.00, -90.00, 10.00 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["shopbag2"] = { "move_weapon@jerrycan@generic", "idle", "Shopping Bag 2", AnimationOptions = { + Prop = "prop_shopping_bags02", + PropBone = 28422, + PropPlacement = { 0.05, 0.02, 0.00, 178.80, 91.19, 9.97 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["shopbag3"] = { "move_weapon@jerrycan@generic", "idle", "Shopping Bag 3", AnimationOptions = { + Prop = "prop_cs_shopping_bag", + PropBone = 28422, + PropPlacement = { 0.24, 0.03, -0.04, 0.00, -90.00, 10.00 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["idcard"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 1", AnimationOptions = { + Prop = "prop_franklin_dl", + PropBone = 57005, + PropPlacement = { 0.1000, 0.0200, -0.0300, -90.000, 170.000, 78.999 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["idcardb"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 2 - FIB", AnimationOptions = { + Prop = "prop_fib_badge", + PropBone = 28422, + PropPlacement = { 0.0600, 0.0210, -0.0400, -90.00, -180.00, 78.999 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["idcardc"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 3", AnimationOptions = { + Prop = "prop_michael_sec_id", + PropBone = 28422, + PropPlacement = { 0.1000, 0.0200, -0.0300, -90.00, -180.00, 78.999 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["idcardd"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 4", AnimationOptions = { + Prop = "prop_trev_sec_id", + PropBone = 28422, + PropPlacement = { 0.1000, 0.0200, -0.0300, -90.00, -180.00, 78.999 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["idcarde"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 5", AnimationOptions = { + Prop = "p_ld_id_card_002", + PropBone = 28422, + PropPlacement = { 0.1000, 0.0200, -0.0300, -90.00, -180.00, 78.999 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["idcardf"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 6", AnimationOptions = { + Prop = "prop_cs_r_business_card", + PropBone = 28422, + PropPlacement = { 0.1000, 0.0200, -0.0300, -90.00, -180.00, 78.999 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["idcardg"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 7", AnimationOptions = { + Prop = "prop_michael_sec_id", + PropBone = 28422, + PropPlacement = { 0.1000, 0.0200, -0.0300, -90.00, -180.00, 78.999 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["idcardh"] = { "paper_1_rcm_alt1-8", "player_one_dual-8", "ID Card 8", AnimationOptions = { + Prop = "prop_cop_badge", + PropBone = 28422, + PropPlacement = { 0.0800, -0.0120, -0.0600, -90.00, 180.00, 69.99 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["sms"] = { "cellphone@", "cellphone_text_read_base", "SMS", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["sms2"] = { "cellphone@female", "cellphone_text_read_base", "SMS 2", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.00, 0.00, 0.0301, 0.000, 00.00, 00.00 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["sms3"] = { "cellphone@female", "cellphone_email_read_base", "SMS 3", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { -0.0190, -0.0240, 0.0300, 18.99, -72.07, 6.39 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["sms4"] = { "cellphone@female", "cellphone_text_read_base_cover_low", "SMS 4", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { -0.0190, -0.0250, 0.0400, 19.17, -78.50, 14.97 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["sms5"] = { "amb@code_human_wander_texting_fat@male@base", "static", "SMS 6", AnimationOptions = { + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { -0.0200, -0.0100, 0.00, 2.309, 88.845, 29.979 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["tire"] = { "anim@heists@box_carry@", "idle", "Tire", AnimationOptions = { + Prop = "prop_wheel_tyre", + PropBone = 60309, + PropPlacement = { -0.05, 0.16, 0.32, -130.0, -55.0, 150.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["register"] = { "anim@heists@box_carry@", "idle", "Register", AnimationOptions = { + Prop = "v_ret_gc_cashreg", + PropBone = 60309, + PropPlacement = { 0.138, 0.2, 0.2, -50.0, 290.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["weedbrick"] = { "impexp_int-0", "mp_m_waremech_01_dual-0", "Weed Brick", AnimationOptions = { + Prop = "prop_weed_block_01", + PropBone = 60309, + PropPlacement = { 0.1, 0.1, 0.05, 0.0, -90.0, 90.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["weedbrick2"] = { "anim@heists@box_carry@", "idle", "Weed Brick BIG", AnimationOptions = { + Prop = "bkr_prop_weed_bigbag_01a", + PropBone = 60309, + PropPlacement = { 0.158, -0.05, 0.23, -50.0, 290.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["potplant"] = { "anim@heists@box_carry@", "idle", "Pot Plant (Small)", AnimationOptions = { + Prop = "bkr_prop_weed_01_small_01c", + PropBone = 60309, + PropPlacement = { 0.138, -0.05, 0.23, -50.0, 290.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["potplant2"] = { "anim@heists@box_carry@", "idle", "Pot Plant (Medium)", AnimationOptions = { + Prop = "bkr_prop_weed_01_small_01b", + PropBone = 60309, + PropPlacement = { 0.138, -0.05, 0.23, -50.0, 290.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["potplant3"] = { "anim@heists@box_carry@", "idle", "Pot Plant (Large)", AnimationOptions = { + Prop = "bkr_prop_weed_lrg_01b", + PropBone = 60309, + PropPlacement = { 0.138, -0.05, 0.23, -50.0, 290.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["lawnchair"] = { "timetable@ron@ig_5_p3", "ig_5_p3_base", "Lawnchair", AnimationOptions = { + Prop = "prop_skid_chair_02", + PropBone = 0, + PropPlacement = { 0.025, -0.2, -0.1, 45.0, -5.0, 180.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["lawnchair2"] = { "timetable@reunited@ig_10", "base_amanda", "Lawnchair 2", AnimationOptions = { + Prop = "prop_skid_chair_02", + PropBone = 0, + PropPlacement = { 0.025, -0.15, -0.1, 45.0, 5.0, 180.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["lawnchair3"] = { "timetable@ron@ig_3_couch", "base", "Lawnchair 3", AnimationOptions = { + Prop = "prop_skid_chair_02", + PropBone = 0, + PropPlacement = { -0.05, 0.0, -0.2, 5.0, 0.0, 180.0 }, + EmoteLoop = true, + EmoteMoving = false, + }}, + ["rose2"] = { "missheistdocksprep1hold_cellphone", "static", "Rose 2 (Male)", AnimationOptions = { + Prop = "prop_single_rose", + PropBone = 31086, + PropPlacement = { -0.0140, 0.1030, 0.0620, -2.932, 4.564, 39.910 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["rose3"] = { "missheistdocksprep1hold_cellphone", "static", "Rose 3 (Female)", AnimationOptions = { + Prop = "prop_single_rose", + PropBone = 31086, + PropPlacement = { -0.0140, 0.1070, 0.0720, 0.00, 0.00, 2.99 }, + EmoteLoop = false, + EmoteMoving = true, + }}, + ["cbbox"] = { "anim@heists@box_carry@", "idle", "Carry Beer Box", AnimationOptions = { + Prop = "v_ret_ml_beerben1", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["cbbox2"] = { "anim@heists@box_carry@", "idle", "Carry Beer Box 2", AnimationOptions = { + Prop = "v_ret_ml_beerbla1", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["cbbox3"] = { "anim@heists@box_carry@", "idle", "Carry Beer Box 3", AnimationOptions = { + Prop = "v_ret_ml_beerjak1", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["cbbox4"] = { "anim@heists@box_carry@", "idle", "Carry Beer Box 4", AnimationOptions = { + Prop = "v_ret_ml_beerlog1", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["cbbox5"] = { "anim@heists@box_carry@", "idle", "Carry Beer Box 5", AnimationOptions = { + Prop = "v_ret_ml_beerpis1", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["cbbox6"] = { "anim@heists@box_carry@", "idle", "Carry Beer Box 6", AnimationOptions = { + Prop = "prop_beer_box_01", + PropBone = 28422, + PropPlacement = { 0.0200, -0.0600, -0.1200, -180.00, -180.00, 1.99 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["gbin"] = { "anim@heists@box_carry@", "idle", "Garbage Bin", AnimationOptions = { + Prop = "prop_bin_08open", + PropBone = 28422, + PropPlacement = { 0.00, -0.420, -1.290, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["gbin2"] = { "anim@heists@box_carry@", "idle", "Garbage Bin 2", AnimationOptions = { + Prop = "prop_cs_bin_01", + PropBone = 28422, + PropPlacement = { 0.00, -0.420, -1.290, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["gbin3"] = { "anim@heists@box_carry@", "idle", "Garbage Bin 3", AnimationOptions = { + Prop = "prop_cs_bin_03", + PropBone = 28422, + PropPlacement = { 0.00, -0.420, -1.290, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["gbin4"] = { "anim@heists@box_carry@", "idle", "Garbage Bin 4", AnimationOptions = { + Prop = "prop_bin_08a", + PropBone = 28422, + PropPlacement = { 0.00, -0.420, -1.290, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["gbin5"] = { "anim@heists@box_carry@", "idle", "Garbage Bin 5", AnimationOptions = { + Prop = "prop_bin_07d", + PropBone = 28422, + PropPlacement = { -0.0100, -0.2200, -0.8600, 0.0, 0.0, 0.0 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag - Rainbow', AnimationOptions = { + Prop = 'prideflag1', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag2'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 2 - LGBTQ', AnimationOptions = { + Prop = 'prideflag2', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag3'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 3 - Bisexual ', AnimationOptions = { + Prop = 'prideflag3', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag4'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 4 - Lesbian ', AnimationOptions = { + Prop = 'prideflag4', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag5'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 5 - Pansexual ', AnimationOptions = { + Prop = 'prideflag5', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag6'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 6 - Transexual ', AnimationOptions = { + Prop = 'prideflag6', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag7'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 7 - Non Binary ', AnimationOptions = { + Prop = 'prideflag7', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag8'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 8 - Asexual ', AnimationOptions = { + Prop = 'prideflag8', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['pflag9'] = { 'rcmnigel1d', 'base_club_shoulder', 'Pride Flag 9 - Straight Ally ', AnimationOptions = { + Prop = 'prideflag9', + PropBone = 18905, + PropPlacement = { 0.0800, -0.2090, 0.0900, -82.6677, -141.2988, 12.3308 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['old'] = { 'missbigscore2aleadinout@bs_2a_2b_int', 'lester_base_idle', 'Old Man Walking Stick', AnimationOptions = { + Prop = 'prop_cs_walking_stick', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + SecondProp = 'prop_phone_ing', + SecondPropBone = 60309, + SecondPropPlacement = { 0.0800, 0.0300, 0.0100, -107.9999, 0.0, -4.6003 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['digiscan'] = { 'weapons@misc@digi_scanner', 'aim_med_loop', 'Digiscan 1 ', AnimationOptions = { + Prop = 'w_am_digiscanner', + PropBone = 28422, + PropPlacement = { 0.0480, 0.0780, 0.0040, -81.6893, 2.5616, -15.7909 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['digiscan2'] = { 'weapons@misc@digi_scanner', 'aim_low_loop', 'Digiscan 2 ', AnimationOptions = { + Prop = 'w_am_digiscanner', + PropBone = 28422, + PropPlacement = { 0.0480, 0.0780, 0.0040, -81.6893, 2.5616, -15.7909 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ['digiscan3'] = { 'weapons@misc@digi_scanner', 'aim_high_loop', 'Digiscan 3 ', AnimationOptions = { + Prop = 'w_am_digiscanner', + PropBone = 28422, + PropPlacement = { 0.0480, 0.0780, 0.0040, -81.6893, 2.5616, -15.7909 }, + EmoteLoop = true, + EmoteMoving = true, + }}, + ["cop4"] = { "amb@world_human_car_park_attendant@male@base", "base", "Cop 4", AnimationOptions = { + Prop = "prop_parking_wand_01", + PropBone = 57005, + PropPlacement = { 0.12, 0.05, 0.0, 80.0, -20.0, 180.0 }, + EmoteLoop = true, + EmoteMoving = true, + } }, + ["leanphone"] = { "amb@world_human_leaning@male@wall@back@mobile@base", "base", "Leaning With Phone", AnimationOptions = { + EmoteMoving = false, + EmoteLoop = true, + Prop = "prop_phone_ing", + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + } }, + ["piss"] = { "misscarsteal2peeing", "peeing_loop", "Piss", AnimationOptions = { + EmoteStuck = true, + PtfxAsset = "scr_amb_chop", + PtfxName = "ent_anim_dog_peeing", + PtfxNoProp = true, + PtfxPlacement = { -0.05, 0.3, 0.0, 0.0, 90.0, 90.0, 1.0 }, + PtfxInfo = Config.Languages[Config.MenuLanguage]['pee'], + PtfxWait = 3000, + } }, + ["hump"] = { "timetable@trevor@skull_loving_bear", "skull_loving_bear", "Hump (Bear)", AnimationOptions = { + Prop = 'prop_mr_raspberry_01', + PropBone = 28422, + PropPlacement = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, + EmoteMoving = false, + EmoteLoop = true, + } }, +} diff --git a/resources/dpemotes-master/client/Emote.lua b/resources/dpemotes-master/client/Emote.lua new file mode 100644 index 000000000..cc0164c18 --- /dev/null +++ b/resources/dpemotes-master/client/Emote.lua @@ -0,0 +1,451 @@ +-- You probably shouldnt touch these. +local AnimationDuration = -1 +local ChosenAnimation = "" +local ChosenDict = "" +local IsInAnimation = false +local MostRecentChosenAnimation = "" +local MostRecentChosenDict = "" +local MovementType = 0 +local PlayerGender = "male" +local PlayerHasProp = false +local PlayerProps = {} +local PlayerParticles = {} +local SecondPropEmote = false +local lang = Config.MenuLanguage +local PtfxNotif = false +local PtfxPrompt = false +local PtfxWait = 500 +local PtfxNoProp = false + +Citizen.CreateThread(function() + while true do + if IsPedShooting(PlayerPedId()) and IsInAnimation then + EmoteCancel() + end + + if PtfxPrompt then + if not PtfxNotif then + SimpleNotify(PtfxInfo) + PtfxNotif = true + end + if IsControlPressed(0, 47) then + PtfxStart() + Wait(PtfxWait) + PtfxStop() + end + end + + if Config.EnableXtoCancel then if IsControlPressed(0, 73) then EmoteCancel() end end + Citizen.Wait(1) + end +end) + +if Config.MenuKeybindEnabled then + RegisterKeyMapping("emotemenu", "Open dpemotes menu", "keyboard", Config.MenuKeybind) +end + +----------------------------------------------------------------------------------------------------- +-- Commands / Events -------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------- + +Citizen.CreateThread(function() + TriggerEvent('chat:addSuggestion', '/e', 'Play an emote', { { name = "emotename", help = "dance, camera, sit or any valid emote." } }) + TriggerEvent('chat:addSuggestion', '/emote', 'Play an emote', { { name = "emotename", help = "dance, camera, sit or any valid emote." } }) + if Config.SqlKeybinding then + TriggerEvent('chat:addSuggestion', '/emotebind', 'Bind an emote', { { name = "key", help = "num4, num5, num6, num7. num8, num9. Numpad 4-9!" }, { name = "emotename", help = "dance, camera, sit or any valid emote." } }) + TriggerEvent('chat:addSuggestion', '/emotebinds', 'Check your currently bound emotes.') + end + TriggerEvent('chat:addSuggestion', '/emotemenu', 'Open dpemotes menu (F5) by default.') + TriggerEvent('chat:addSuggestion', '/emotes', 'List available emotes.') + TriggerEvent('chat:addSuggestion', '/walk', 'Set your walkingstyle.', { { name = "style", help = "/walks for a list of valid styles" } }) + TriggerEvent('chat:addSuggestion', '/walks', 'List available walking styles.') +end) + +RegisterCommand('e', function(source, args, raw) EmoteCommandStart(source, args, raw) end) +RegisterCommand('emote', function(source, args, raw) EmoteCommandStart(source, args, raw) end) +if Config.SqlKeybinding then + RegisterCommand('emotebind', function(source, args, raw) EmoteBindStart(source, args, raw) end) + RegisterCommand('emotebinds', function(source, args, raw) EmoteBindsStart(source, args, raw) end) +end +RegisterCommand('emotemenu', function(source, args, raw) OpenEmoteMenu() end) +RegisterCommand('emotes', function(source, args, raw) EmotesOnCommand() end) +RegisterCommand('walk', function(source, args, raw) WalkCommandStart(source, args, raw) end) +RegisterCommand('walks', function(source, args, raw) WalksOnCommand() end) + +AddEventHandler('onResourceStop', function(resource) + if resource == GetCurrentResourceName() then + local ply = PlayerPedId() + DestroyAllProps() + ClearPedTasksImmediately(ply) + DetachEntity(ply, true, false) + ResetPedMovementClipset(ply) + end +end) + +----------------------------------------------------------------------------------------------------- +------ Functions and stuff -------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------- + +function EmoteCancel() + local ply = PlayerPedId() + if ChosenDict == "MaleScenario" and IsInAnimation then + ClearPedTasksImmediately(ply) + IsInAnimation = false + DebugPrint("Forced scenario exit") + elseif ChosenDict == "Scenario" and IsInAnimation then + ClearPedTasksImmediately(ply) + IsInAnimation = false + DebugPrint("Forced scenario exit") + end + + PtfxNotif = false + PtfxPrompt = false + + if IsInAnimation then + PtfxStop() + ClearPedTasks(ply) + DetachEntity(ply, true, false) + CancelSharedEmote(ply) + DestroyAllProps() + IsInAnimation = false + end +end + +function EmoteChatMessage(args) + if args == display then + TriggerEvent("chatMessage", "^5Help^0", { 0, 0, 0 }, string.format("")) + else + TriggerEvent("chatMessage", "^5Help^0", { 0, 0, 0 }, string.format("" .. args .. "")) + end +end + +function DebugPrint(args) + if Config.DebugDisplay then + print(args) + end +end + +function PtfxStart() + if PtfxNoProp then + PtfxAt = PlayerPedId() + else + PtfxAt = prop + end + UseParticleFxAssetNextCall(PtfxAsset) + Ptfx = StartNetworkedParticleFxLoopedOnEntityBone(PtfxName, PtfxAt, Ptfx1, Ptfx2, Ptfx3, Ptfx4, Ptfx5, Ptfx6, GetEntityBoneIndexByName(PtfxName, "VFX"), 1065353216, 0, 0, 0, 1065353216, 1065353216, 1065353216, 0) + SetParticleFxLoopedColour(Ptfx, 1.0, 1.0, 1.0) + table.insert(PlayerParticles, Ptfx) +end + +function PtfxStop() + for a, b in pairs(PlayerParticles) do + DebugPrint("Stopped PTFX: " .. b) + StopParticleFxLooped(b, false) + table.remove(PlayerParticles, a) + end +end + +function EmotesOnCommand(source, args, raw) + local EmotesCommand = "" + for a in pairsByKeys(DP.Emotes) do + EmotesCommand = EmotesCommand .. "" .. a .. ", " + end + EmoteChatMessage(EmotesCommand) + EmoteChatMessage(Config.Languages[lang]['emotemenucmd']) +end + +function pairsByKeys(t, f) + local a = {} + for n in pairs(t) do + table.insert(a, n) + end + table.sort(a, f) + local i = 0 -- iterator variable + local iter = function() -- iterator function + i = i + 1 + if a[i] == nil then + return nil + else + return a[i], t[a[i]] + end + end + return iter +end + +function EmoteMenuStart(args, hard) + local name = args + local etype = hard + + if etype == "dances" then + if DP.Dances[name] ~= nil then + if OnEmotePlay(DP.Dances[name]) then end + end + elseif etype == "animals" then + if DP.AnimalEmotes[name] ~= nil then + if OnEmotePlay(DP.AnimalEmotes[name]) then end + end + elseif etype == "props" then + if DP.PropEmotes[name] ~= nil then + if OnEmotePlay(DP.PropEmotes[name]) then end + end + elseif etype == "emotes" then + if DP.Emotes[name] ~= nil then + if OnEmotePlay(DP.Emotes[name]) then end + else + if name ~= "🕺 Dance Emotes" then end + end + elseif etype == "expression" then + if DP.Expressions[name] ~= nil then + if OnEmotePlay(DP.Expressions[name]) then end + end + end +end + +function EmoteCommandStart(source, args, raw) + if #args > 0 then + local name = string.lower(args[1]) + if name == "c" then + if IsInAnimation then + EmoteCancel() + else + EmoteChatMessage(Config.Languages[lang]['nocancel']) + end + return + elseif name == "help" then + EmotesOnCommand() + return + end + + if DP.Emotes[name] ~= nil then + if OnEmotePlay(DP.Emotes[name]) then end + return + elseif DP.Dances[name] ~= nil then + if OnEmotePlay(DP.Dances[name]) then end + return + elseif DP.AnimalEmotes[name] ~= nil then + if OnEmotePlay(DP.AnimalEmotes[name]) then end + return + elseif DP.PropEmotes[name] ~= nil then + if OnEmotePlay(DP.PropEmotes[name]) then end + return + else + EmoteChatMessage("'" .. name .. "' " .. Config.Languages[lang]['notvalidemote'] .. "") + end + end +end + +function LoadAnim(dict) + if not DoesAnimDictExist(dict) then + return false + end + + while not HasAnimDictLoaded(dict) do + RequestAnimDict(dict) + Wait(10) + end + + return true +end + +function LoadPropDict(model) + while not HasModelLoaded(GetHashKey(model)) do + RequestModel(GetHashKey(model)) + Wait(10) + end +end + +function PtfxThis(asset) + while not HasNamedPtfxAssetLoaded(asset) do + RequestNamedPtfxAsset(asset) + Wait(10) + end + UseParticleFxAssetNextCall(asset) +end + +function DestroyAllProps() + for _, v in pairs(PlayerProps) do + DeleteEntity(v) + end + PlayerHasProp = false + DebugPrint("Destroyed Props") +end + +function AddPropToPlayer(prop1, bone, off1, off2, off3, rot1, rot2, rot3) + local Player = PlayerPedId() + local x, y, z = table.unpack(GetEntityCoords(Player)) + + if not HasModelLoaded(prop1) then + LoadPropDict(prop1) + end + + prop = CreateObject(GetHashKey(prop1), x, y, z + 0.2, true, true, true) + AttachEntityToEntity(prop, Player, GetPedBoneIndex(Player, bone), off1, off2, off3, rot1, rot2, rot3, true, true, false, true, 1, true) + table.insert(PlayerProps, prop) + PlayerHasProp = true + SetModelAsNoLongerNeeded(prop1) +end + +----------------------------------------------------------------------------------------------------- +-- V -- This could be a whole lot better, i tried messing around with "IsPedMale(ped)" +-- V -- But i never really figured it out, if anyone has a better way of gender checking let me know. +-- V -- Since this way doesnt work for ped models. +-- V -- in most cases its better to replace the scenario with an animation bundled with prop instead. +----------------------------------------------------------------------------------------------------- + +function CheckGender() + local hashSkinMale = GetHashKey("mp_m_freemode_01") + local hashSkinFemale = GetHashKey("mp_f_freemode_01") + + if GetEntityModel(PlayerPedId()) == hashSkinMale then + PlayerGender = "male" + elseif GetEntityModel(PlayerPedId()) == hashSkinFemale then + PlayerGender = "female" + end + DebugPrint("Set gender as = (" .. PlayerGender .. ")") +end + +----------------------------------------------------------------------------------------------------- +------ This is the major function for playing emotes! ----------------------------------------------- +----------------------------------------------------------------------------------------------------- + +function OnEmotePlay(EmoteName) + InVehicle = IsPedInAnyVehicle(PlayerPedId(), true) + if not Config.AllowedInCars and InVehicle == 1 then + return + end + + if not DoesEntityExist(PlayerPedId()) then + return false + end + + if Config.DisarmPlayer then + if IsPedArmed(PlayerPedId(), 7) then + SetCurrentPedWeapon(PlayerPedId(), GetHashKey('WEAPON_UNARMED'), true) + end + end + + ChosenDict, ChosenAnimation, ename = table.unpack(EmoteName) + AnimationDuration = -1 + + if PlayerHasProp then + DestroyAllProps() + end + + if ChosenDict == "Expression" then + SetFacialIdleAnimOverride(PlayerPedId(), ChosenAnimation, 0) + return + end + + if ChosenDict == "MaleScenario" or "Scenario" then + CheckGender() + if ChosenDict == "MaleScenario" then if InVehicle then return end + if PlayerGender == "male" then + ClearPedTasks(PlayerPedId()) + TaskStartScenarioInPlace(PlayerPedId(), ChosenAnimation, 0, true) + DebugPrint("Playing scenario = (" .. ChosenAnimation .. ")") + IsInAnimation = true + else + EmoteChatMessage(Config.Languages[lang]['maleonly']) + end + return + elseif ChosenDict == "ScenarioObject" then if InVehicle then return end + BehindPlayer = GetOffsetFromEntityInWorldCoords(PlayerPedId(), 0.0, 0 - 0.5, -0.5); + ClearPedTasks(PlayerPedId()) + TaskStartScenarioAtPosition(PlayerPedId(), ChosenAnimation, BehindPlayer['x'], BehindPlayer['y'], BehindPlayer['z'], GetEntityHeading(PlayerPedId()), 0, 1, false) + DebugPrint("Playing scenario = (" .. ChosenAnimation .. ")") + IsInAnimation = true + return + elseif ChosenDict == "Scenario" then if InVehicle then return end + ClearPedTasks(PlayerPedId()) + TaskStartScenarioInPlace(PlayerPedId(), ChosenAnimation, 0, true) + DebugPrint("Playing scenario = (" .. ChosenAnimation .. ")") + IsInAnimation = true + return + end + end + + if not LoadAnim(ChosenDict) then + EmoteChatMessage("'" .. ename .. "' " .. Config.Languages[lang]['notvalidemote'] .. "") + return + end + + if EmoteName.AnimationOptions then + if EmoteName.AnimationOptions.EmoteLoop then + MovementType = 1 + if EmoteName.AnimationOptions.EmoteMoving then + MovementType = 51 + end + + elseif EmoteName.AnimationOptions.EmoteMoving then + MovementType = 51 + elseif EmoteName.AnimationOptions.EmoteMoving == false then + MovementType = 0 + elseif EmoteName.AnimationOptions.EmoteStuck then + MovementType = 50 + end + + else + MovementType = 0 + end + + if InVehicle == 1 then + MovementType = 51 + end + + if EmoteName.AnimationOptions then + if EmoteName.AnimationOptions.EmoteDuration == nil then + EmoteName.AnimationOptions.EmoteDuration = -1 + AttachWait = 0 + else + AnimationDuration = EmoteName.AnimationOptions.EmoteDuration + AttachWait = EmoteName.AnimationOptions.EmoteDuration + end + + if EmoteName.AnimationOptions.PtfxAsset then + PtfxAsset = EmoteName.AnimationOptions.PtfxAsset + PtfxName = EmoteName.AnimationOptions.PtfxName + if EmoteName.AnimationOptions.PtfxNoProp then + PtfxNoProp = EmoteName.AnimationOptions.PtfxNoProp + else + PtfxNoProp = false + end + Ptfx1, Ptfx2, Ptfx3, Ptfx4, Ptfx5, Ptfx6, PtfxScale = table.unpack(EmoteName.AnimationOptions.PtfxPlacement) + PtfxInfo = EmoteName.AnimationOptions.PtfxInfo + PtfxWait = EmoteName.AnimationOptions.PtfxWait + PtfxNotif = false + PtfxPrompt = true + PtfxThis(PtfxAsset) + else + DebugPrint("Ptfx = none") + PtfxPrompt = false + end + end + + TaskPlayAnim(PlayerPedId(), ChosenDict, ChosenAnimation, 2.0, 2.0, AnimationDuration, MovementType, 0, false, false, false) + RemoveAnimDict(ChosenDict) + IsInAnimation = true + MostRecentDict = ChosenDict + MostRecentAnimation = ChosenAnimation + + if EmoteName.AnimationOptions then + if EmoteName.AnimationOptions.Prop then + PropName = EmoteName.AnimationOptions.Prop + PropBone = EmoteName.AnimationOptions.PropBone + PropPl1, PropPl2, PropPl3, PropPl4, PropPl5, PropPl6 = table.unpack(EmoteName.AnimationOptions.PropPlacement) + if EmoteName.AnimationOptions.SecondProp then + SecondPropName = EmoteName.AnimationOptions.SecondProp + SecondPropBone = EmoteName.AnimationOptions.SecondPropBone + SecondPropPl1, SecondPropPl2, SecondPropPl3, SecondPropPl4, SecondPropPl5, SecondPropPl6 = table.unpack(EmoteName.AnimationOptions.SecondPropPlacement) + SecondPropEmote = true + else + SecondPropEmote = false + end + Wait(AttachWait) + AddPropToPlayer(PropName, PropBone, PropPl1, PropPl2, PropPl3, PropPl4, PropPl5, PropPl6) + if SecondPropEmote then + AddPropToPlayer(SecondPropName, SecondPropBone, SecondPropPl1, SecondPropPl2, SecondPropPl3, SecondPropPl4, SecondPropPl5, SecondPropPl6) + end + end + end + return true +end diff --git a/resources/dpemotes-master/client/EmoteMenu.lua b/resources/dpemotes-master/client/EmoteMenu.lua new file mode 100644 index 000000000..f405f46e4 --- /dev/null +++ b/resources/dpemotes-master/client/EmoteMenu.lua @@ -0,0 +1,327 @@ +TriggerServerEvent("dp:CheckVersion") + +rightPosition = { x = 1450, y = 100 } +leftPosition = { x = 0, y = 100 } +menuPosition = { x = 0, y = 200 } + +if Config.MenuPosition then + if Config.MenuPosition == "left" then + menuPosition = leftPosition + elseif Config.MenuPosition == "right" then + menuPosition = rightPosition + end +end + +if Config.CustomMenuEnabled then + local RuntimeTXD = CreateRuntimeTxd('Custom_Menu_Head') + local Object = CreateDui(Config.MenuImage, 512, 128) + _G.Object = Object + local TextureThing = GetDuiHandle(Object) + local Texture = CreateRuntimeTextureFromDuiHandle(RuntimeTXD, 'Custom_Menu_Head', TextureThing) + Menuthing = "Custom_Menu_Head" +else + Menuthing = "shopui_title_sm_hangar" +end + +_menuPool = NativeUI.CreatePool() +mainMenu = NativeUI.CreateMenu("Tay's Emote Menu", "", menuPosition["x"], menuPosition["y"], Menuthing, Menuthing) +_menuPool:Add(mainMenu) + +function ShowNotification(text) + SetNotificationTextEntry("STRING") + AddTextComponentString(text) + DrawNotification(false, false) +end + +local EmoteTable = {} +local FavEmoteTable = {} +local KeyEmoteTable = {} +local DanceTable = {} +local AnimalTable = {} +local PropETable = {} +local WalkTable = {} +local FaceTable = {} +local ShareTable = {} +local FavoriteEmote = "" + +if Config.FavKeybindEnabled then + Citizen.CreateThread(function() + while true do + if IsControlPressed(0, Config.FavKeybind) then + if not IsPedSittingInAnyVehicle(PlayerPedId()) then + if FavoriteEmote ~= "" then + EmoteCommandStart(nil, { FavoriteEmote, 0 }) + Wait(3000) + end + end + end + Citizen.Wait(1) + end + end) +end + +lang = Config.MenuLanguage + +function AddEmoteMenu(menu) + local submenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['emotes'], "", "", Menuthing, Menuthing) + local dancemenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['danceemotes'], "", "", Menuthing, Menuthing) + local animalmenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['animalemotes'], "", "", Menuthing, Menuthing) + local propmenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['propemotes'], "", "", Menuthing, Menuthing) + table.insert(EmoteTable, Config.Languages[lang]['danceemotes']) + table.insert(EmoteTable, Config.Languages[lang]['danceemotes']) + table.insert(EmoteTable, Config.Languages[lang]['animalemotes']) + + if Config.SharedEmotesEnabled then + sharemenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['shareemotes'], Config.Languages[lang]['shareemotesinfo'], "", Menuthing, Menuthing) + shareddancemenu = _menuPool:AddSubMenu(sharemenu, Config.Languages[lang]['sharedanceemotes'], "", "", Menuthing, Menuthing) + table.insert(ShareTable, 'none') + table.insert(EmoteTable, Config.Languages[lang]['shareemotes']) + end + + if not Config.SqlKeybinding then + unbind2item = NativeUI.CreateItem(Config.Languages[lang]['rfavorite'], Config.Languages[lang]['rfavorite']) + unbinditem = NativeUI.CreateItem(Config.Languages[lang]['prop2info'], "") + favmenu = _menuPool:AddSubMenu(submenu, Config.Languages[lang]['favoriteemotes'], Config.Languages[lang]['favoriteinfo'], "", Menuthing, Menuthing) + favmenu:AddItem(unbinditem) + favmenu:AddItem(unbind2item) + table.insert(FavEmoteTable, Config.Languages[lang]['rfavorite']) + table.insert(FavEmoteTable, Config.Languages[lang]['rfavorite']) + table.insert(EmoteTable, Config.Languages[lang]['favoriteemotes']) + else + table.insert(EmoteTable, "keybinds") + keyinfo = NativeUI.CreateItem(Config.Languages[lang]['keybinds'], Config.Languages[lang]['keybindsinfo'] .. " /emotebind [~y~num4-9~w~] [~g~emotename~w~]") + submenu:AddItem(keyinfo) + end + + for a, b in pairsByKeys(DP.Emotes) do + x, y, z = table.unpack(b) + emoteitem = NativeUI.CreateItem(z, "/e (" .. a .. ")") + submenu:AddItem(emoteitem) + table.insert(EmoteTable, a) + if not Config.SqlKeybinding then + favemoteitem = NativeUI.CreateItem(z, Config.Languages[lang]['set'] .. z .. Config.Languages[lang]['setboundemote']) + favmenu:AddItem(favemoteitem) + table.insert(FavEmoteTable, a) + end + end + + for a, b in pairsByKeys(DP.Dances) do + x, y, z = table.unpack(b) + danceitem = NativeUI.CreateItem(z, "/e (" .. a .. ")") + sharedanceitem = NativeUI.CreateItem(z, "") + dancemenu:AddItem(danceitem) + if Config.SharedEmotesEnabled then + shareddancemenu:AddItem(sharedanceitem) + end + table.insert(DanceTable, a) + end + + for a, b in pairsByKeys(DP.AnimalEmotes) do + x, y, z = table.unpack(b) + animalitem = NativeUI.CreateItem(z, "/e (" .. a .. ")") + animalmenu:AddItem(animalitem) + table.insert(AnimalTable, a) + end + + if Config.SharedEmotesEnabled then + for a, b in pairsByKeys(DP.Shared) do + x, y, z, otheremotename = table.unpack(b) + if otheremotename == nil then + shareitem = NativeUI.CreateItem(z, "/nearby (~g~" .. a .. "~w~)") + else + shareitem = NativeUI.CreateItem(z, "/nearby (~g~" .. a .. "~w~) " .. Config.Languages[lang]['makenearby'] .. " (~y~" .. otheremotename .. "~w~)") + end + sharemenu:AddItem(shareitem) + table.insert(ShareTable, a) + end + end + + for a, b in pairsByKeys(DP.PropEmotes) do + x, y, z = table.unpack(b) + propitem = NativeUI.CreateItem(z, "/e (" .. a .. ")") + propmenu:AddItem(propitem) + table.insert(PropETable, a) + if not Config.SqlKeybinding then + propfavitem = NativeUI.CreateItem(z, Config.Languages[lang]['set'] .. z .. Config.Languages[lang]['setboundemote']) + favmenu:AddItem(propfavitem) + table.insert(FavEmoteTable, a) + end + end + + if not Config.SqlKeybinding then + favmenu.OnItemSelect = function(sender, item, index) + if FavEmoteTable[index] == Config.Languages[lang]['rfavorite'] then + FavoriteEmote = "" + ShowNotification(Config.Languages[lang]['rfavorite'], 2000) + return + end + if Config.FavKeybindEnabled then + FavoriteEmote = FavEmoteTable[index] + ShowNotification("~o~" .. firstToUpper(FavoriteEmote) .. Config.Languages[lang]['newsetemote']) + end + end + end + + dancemenu.OnItemSelect = function(sender, item, index) + EmoteMenuStart(DanceTable[index], "dances") + end + + animalmenu.OnItemSelect = function(sender, item, index) + EmoteMenuStart(AnimalTable[index], "animals") + end + + if Config.SharedEmotesEnabled then + sharemenu.OnItemSelect = function(sender, item, index) + if ShareTable[index] ~= 'none' then + target, distance = GetClosestPlayer() + if (distance ~= -1 and distance < 3) then + _, _, rename = table.unpack(DP.Shared[ShareTable[index]]) + TriggerServerEvent("ServerEmoteRequest", GetPlayerServerId(target), ShareTable[index]) + SimpleNotify(Config.Languages[lang]['sentrequestto'] .. GetPlayerName(target)) + else + SimpleNotify(Config.Languages[lang]['nobodyclose']) + end + end + end + + shareddancemenu.OnItemSelect = function(sender, item, index) + target, distance = GetClosestPlayer() + if (distance ~= -1 and distance < 3) then + _, _, rename = table.unpack(DP.Dances[DanceTable[index]]) + TriggerServerEvent("ServerEmoteRequest", GetPlayerServerId(target), DanceTable[index], 'Dances') + SimpleNotify(Config.Languages[lang]['sentrequestto'] .. GetPlayerName(target)) + else + SimpleNotify(Config.Languages[lang]['nobodyclose']) + end + end + end + + propmenu.OnItemSelect = function(sender, item, index) + EmoteMenuStart(PropETable[index], "props") + end + + submenu.OnItemSelect = function(sender, item, index) + if EmoteTable[index] ~= Config.Languages[lang]['favoriteemotes'] then + EmoteMenuStart(EmoteTable[index], "emotes") + end + end +end + +function AddCancelEmote(menu) + local newitem = NativeUI.CreateItem(Config.Languages[lang]['cancelemote'], Config.Languages[lang]['cancelemoteinfo']) + menu:AddItem(newitem) + menu.OnItemSelect = function(sender, item, checked_) + if item == newitem then + EmoteCancel() + DestroyAllProps() + end + end +end + +function AddWalkMenu(menu) + local submenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['walkingstyles'], "", "", Menuthing, Menuthing) + + walkreset = NativeUI.CreateItem(Config.Languages[lang]['normalreset'], Config.Languages[lang]['resetdef']) + submenu:AddItem(walkreset) + table.insert(WalkTable, Config.Languages[lang]['resetdef']) + + WalkInjured = NativeUI.CreateItem("Injured", "") + submenu:AddItem(WalkInjured) + table.insert(WalkTable, "move_m@injured") + + for a, b in pairsByKeys(DP.Walks) do + x = table.unpack(b) + walkitem = NativeUI.CreateItem(a, "") + submenu:AddItem(walkitem) + table.insert(WalkTable, x) + end + + submenu.OnItemSelect = function(sender, item, index) + if item ~= walkreset then + WalkMenuStart(WalkTable[index]) + else + ResetPedMovementClipset(PlayerPedId()) + end + end +end + +function AddFaceMenu(menu) + local submenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['moods'], "", "", Menuthing, Menuthing) + + facereset = NativeUI.CreateItem(Config.Languages[lang]['normalreset'], Config.Languages[lang]['resetdef']) + submenu:AddItem(facereset) + table.insert(FaceTable, "") + + for a, b in pairsByKeys(DP.Expressions) do + x, y, z = table.unpack(b) + faceitem = NativeUI.CreateItem(a, "") + submenu:AddItem(faceitem) + table.insert(FaceTable, a) + end + + submenu.OnItemSelect = function(sender, item, index) + if item ~= facereset then + EmoteMenuStart(FaceTable[index], "expression") + else + ClearFacialIdleAnimOverride(PlayerPedId()) + end + end +end + +function AddInfoMenu(menu) + if not UpdateAvailable then + infomenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['infoupdate'], "Huge Thank You ❤️", "", Menuthing, Menuthing) + else + infomenu = _menuPool:AddSubMenu(menu, Config.Languages[lang]['infoupdateav'], Config.Languages[lang]['infoupdateavtext'], "", Menuthing, Menuthing) + end + contact = NativeUI.CreateItem(Config.Languages[lang]['suggestions'], Config.Languages[lang]['suggestionsinfo']) + u170 = NativeUI.CreateItem("Thanks", "DullPear for the original dpemotes ❤️") + u165 = NativeUI.CreateItem("Thanks", "AvaN0x for assisting with the formatting of the code.") + u160 = NativeUI.CreateItem("Thanks", "SMGMissy for the custom pride flags 🏳️‍🌈.") + u151 = NativeUI.CreateItem("Thanks", "Kibook for the addition of Animal Emotes 🐩.") + u150 = NativeUI.CreateItem("Thanks", "To you, the community for helping me keep this menu alive ❤️.") + infomenu:AddItem(contact) + infomenu:AddItem(u170) + infomenu:AddItem(u165) + infomenu:AddItem(u160) + infomenu:AddItem(u151) + infomenu:AddItem(u150) +end + +function OpenEmoteMenu() + mainMenu:Visible(not mainMenu:Visible()) +end + +function firstToUpper(str) + return (str:gsub("^%l", string.upper)) +end + +AddEmoteMenu(mainMenu) +AddCancelEmote(mainMenu) +if Config.WalkingStylesEnabled then + AddWalkMenu(mainMenu) +end +if Config.ExpressionsEnabled then + AddFaceMenu(mainMenu) +end + +_menuPool:RefreshIndex() + +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + _menuPool:ProcessMenus() + end +end) + +RegisterNetEvent("dp:Update") +AddEventHandler("dp:Update", function(state) + UpdateAvailable = state + AddInfoMenu(mainMenu) + _menuPool:RefreshIndex() +end) + +RegisterNetEvent("dp:RecieveMenu") -- For opening the emote menu from another resource. +AddEventHandler("dp:RecieveMenu", function() + OpenEmoteMenu() +end) diff --git a/resources/dpemotes-master/client/Keybinds.lua b/resources/dpemotes-master/client/Keybinds.lua new file mode 100644 index 000000000..2994d60d5 --- /dev/null +++ b/resources/dpemotes-master/client/Keybinds.lua @@ -0,0 +1,126 @@ +if Config.SqlKeybinding then + local emob1 = "" + local emob2 = "" + local emob3 = "" + local emob4 = "" + local emob5 = "" + local emob6 = "" + local keyb1 = "" + local keyb2 = "" + local keyb3 = "" + local keyb4 = "" + local keyb5 = "" + local keyb6 = "" + local Initialized = false + + ----------------------------------------------------------------------------------------------------- + -- Commands / Events -------------------------------------------------------------------------------- + ----------------------------------------------------------------------------------------------------- + + Citizen.CreateThread(function() + while true do + if NetworkIsPlayerActive(PlayerId()) and not Initialized then + if not Initialized then + TriggerServerEvent("dp:ServerKeybindExist") + Wait(5000) + end + end + + if not IsPedSittingInAnyVehicle(PlayerPedId()) then + for k, v in pairs(Config.KeybindKeys) do + if IsControlJustReleased(0, v) then + if k == keyb1 then if emob1 ~= "" then EmoteCommandStart(nil, { emob1, 0 }) end end + if k == keyb2 then if emob2 ~= "" then EmoteCommandStart(nil, { emob2, 0 }) end end + if k == keyb3 then if emob3 ~= "" then EmoteCommandStart(nil, { emob3, 0 }) end end + if k == keyb4 then if emob4 ~= "" then EmoteCommandStart(nil, { emob4, 0 }) end end + if k == keyb5 then if emob5 ~= "" then EmoteCommandStart(nil, { emob5, 0 }) end end + if k == keyb6 then if emob6 ~= "" then EmoteCommandStart(nil, { emob6, 0 }) end end + Wait(1000) + end + end + end + Citizen.Wait(1) + end + end) + + RegisterNetEvent("dp:ClientKeybindExist") + AddEventHandler("dp:ClientKeybindExist", function(does) + if does then + TriggerServerEvent("dp:ServerKeybindGrab") + else + TriggerServerEvent("dp:ServerKeybindCreate") + end + end) + + RegisterNetEvent("dp:ClientKeybindGet") + AddEventHandler("dp:ClientKeybindGet", function(k1, e1, k2, e2, k3, e3, k4, e4, k5, e5, k6, e6) + keyb1 = k1 + emob1 = e1 + keyb2 = k2 + emob2 = e2 + keyb3 = k3 + emob3 = e3 + keyb4 = k4 + emob4 = e4 + keyb5 = k5 + emob5 = e5 + keyb6 = k6 + emob6 = e6 + Initialized = true + end) + + RegisterNetEvent("dp:ClientKeybindGetOne") + AddEventHandler("dp:ClientKeybindGetOne", function(key, e) + SimpleNotify(Config.Languages[lang]['bound'] .. "~y~" .. e .. "~w~ " .. Config.Languages[lang]['to'] .. " ~g~" .. firstToUpper(key) .. "~w~") + if key == "num4" then emob1 = e + keyb1 = "num4" + elseif key == "num5" then emob2 = e + keyb2 = "num5" + elseif key == "num6" then emob3 = e + keyb3 = "num6" + elseif key == "num7" then emob4 = e + keyb4 = "num7" + elseif key == "num8" then emob5 = e + keyb5 = "num8" + elseif key == "num9" then emob6 = e + keyb6 = "num9" + end + end) + + ----------------------------------------------------------------------------------------------------- + ------ Functions and stuff -------------------------------------------------------------------------- + ----------------------------------------------------------------------------------------------------- + + function EmoteBindsStart() + EmoteChatMessage(Config.Languages[lang]['currentlyboundemotes'] .. "\n" + .. firstToUpper(keyb1) .. " = '^2" .. emob1 .. "^7'\n" + .. firstToUpper(keyb2) .. " = '^2" .. emob2 .. "^7'\n" + .. firstToUpper(keyb3) .. " = '^2" .. emob3 .. "^7'\n" + .. firstToUpper(keyb4) .. " = '^2" .. emob4 .. "^7'\n" + .. firstToUpper(keyb5) .. " = '^2" .. emob5 .. "^7'\n" + .. firstToUpper(keyb6) .. " = '^2" .. emob6 .. "^7'\n") + end + + function EmoteBindStart(source, args, raw) + if #args > 0 then + local key = string.lower(args[1]) + local emote = string.lower(args[2]) + if (Config.KeybindKeys[key]) ~= nil then + if DP.Emotes[emote] ~= nil then + TriggerServerEvent("dp:ServerKeybindUpdate", key, emote) + elseif DP.Dances[emote] ~= nil then + TriggerServerEvent("dp:ServerKeybindUpdate", key, emote) + elseif DP.PropEmotes[emote] ~= nil then + TriggerServerEvent("dp:ServerKeybindUpdate", key, emote) + else + EmoteChatMessage("'" .. emote .. "' " .. Config.Languages[lang]['notvalidemote'] .. "") + end + else + EmoteChatMessage("'" .. key .. "' " .. Config.Languages[lang]['notvalidkey']) + end + else + print("invalid") + end + end + +end diff --git a/resources/dpemotes-master/client/Ragdoll.lua b/resources/dpemotes-master/client/Ragdoll.lua new file mode 100644 index 000000000..8352435f2 --- /dev/null +++ b/resources/dpemotes-master/client/Ragdoll.lua @@ -0,0 +1,24 @@ +local isInRagdoll = false + +Citizen.CreateThread(function() + while true do + Citizen.Wait(10) + if isInRagdoll then + SetPedToRagdoll(PlayerPedId(), 1000, 1000, 0, 0, 0, 0) + end + end +end) + +Citizen.CreateThread(function() + while true do + Citizen.Wait(0) + if IsControlJustPressed(2, Config.RagdollKeybind) and Config.RagdollEnabled and IsPedOnFoot(PlayerPedId()) then + if isInRagdoll then + isInRagdoll = false + else + isInRagdoll = true + Wait(500) + end + end + end +end) diff --git a/resources/dpemotes-master/client/Syncing.lua b/resources/dpemotes-master/client/Syncing.lua new file mode 100644 index 000000000..f925acd96 --- /dev/null +++ b/resources/dpemotes-master/client/Syncing.lua @@ -0,0 +1,236 @@ +local isRequestAnim = false +local requestedemote = '' +local targetPlayerId = '' + +-- Some of the work here was done by Super.Cool.Ninja / rubbertoe98 +-- https://forum.fivem.net/t/release-nanimstarget/876709 + +----------------------------------------------------------------------------------------------------- +-- Commands / Events -------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------- +if Config.SharedEmotesEnabled then + RegisterCommand('nearby', function(source, args, raw) + if #args > 0 then + local emotename = string.lower(args[1]) + target, distance = GetClosestPlayer() + if (distance ~= -1 and distance < 3) then + if DP.Shared[emotename] ~= nil then + dict, anim, ename = table.unpack(DP.Shared[emotename]) + TriggerServerEvent("ServerEmoteRequest", GetPlayerServerId(target), emotename) + SimpleNotify(Config.Languages[lang]['sentrequestto'] .. + GetPlayerName(target) .. " ~w~(~g~" .. ename .. "~w~)") + else + EmoteChatMessage("'" .. emotename .. "' " .. Config.Languages[lang]['notvalidsharedemote'] .. "") + end + else + SimpleNotify(Config.Languages[lang]['nobodyclose']) + end + else + MearbysOnCommand() + end + end, false) +end + +RegisterNetEvent("SyncPlayEmote") +AddEventHandler("SyncPlayEmote", function(emote, player) + EmoteCancel() + Wait(300) + targetPlayerId = player + -- wait a little to make sure animation shows up right on both clients after canceling any previous emote + if DP.Shared[emote] ~= nil then + if DP.Shared[emote].AnimationOptions and DP.Shared[emote].AnimationOptions.Attachto then + -- We do not want to attach the player if the target emote already is attached to player + -- this would cause issue where both player would be attached to each other and fall under the map + local targetEmote = DP.Shared[emote][4] + if not targetEmote or not DP.Shared[targetEmote] or not DP.Shared[targetEmote].AnimationOptions or + not DP.Shared[targetEmote].AnimationOptions.Attachto then + local plyServerId = GetPlayerFromServerId(player) + local pedInFront = GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer()) + local bone = DP.Shared[emote].AnimationOptions.bone or 11816 -- SKEL_Pelvis + local xPos = DP.Shared[emote].AnimationOptions.xPos or 0.0 + local yPos = DP.Shared[emote].AnimationOptions.yPos or 0.0 + local zPos = DP.Shared[emote].AnimationOptions.zPos or 0.0 + local xRot = DP.Shared[emote].AnimationOptions.xRot or 0.0 + local yRot = DP.Shared[emote].AnimationOptions.yRot or 0.0 + local zRot = DP.Shared[emote].AnimationOptions.zRot or 0.0 + AttachEntityToEntity(PlayerPedId(), pedInFront, bone, xPos, yPos, zPos, xRot, yRot, zRot, false, false, + false, false, 2, false) + end + end + + if OnEmotePlay(DP.Shared[emote]) then end + return + elseif DP.Dances[emote] ~= nil then + if OnEmotePlay(DP.Dances[emote]) then end + return + end +end) + +RegisterNetEvent("SyncPlayEmoteSource") +AddEventHandler("SyncPlayEmoteSource", function(emote, player) + -- Thx to Poggu for this part! + local ply = PlayerPedId() + local plyServerId = GetPlayerFromServerId(player) + local pedInFront = GetPlayerPed(plyServerId ~= 0 and plyServerId or GetClosestPlayer()) + + local heading = GetEntityHeading(pedInFront) + local coords = GetOffsetFromEntityInWorldCoords(pedInFront, 0.0, 1.0, 0.0) + if (DP.Shared[emote] and DP.Shared[emote].AnimationOptions) then + local SyncOffsetFront = DP.Shared[emote].AnimationOptions.SyncOffsetFront + if SyncOffsetFront then + coords = GetOffsetFromEntityInWorldCoords(pedInFront, 0.0, SyncOffsetFront, 0.0) + end + + -- There is a priority to the source attached, if it is not set, it will use the target + if (DP.Shared[emote].AnimationOptions.Attachto) then + local bone = DP.Shared[emote].AnimationOptions.bone or 11816 -- SKEL_Pelvis + local xPos = DP.Shared[emote].AnimationOptions.xPos or 0.0 + local yPos = DP.Shared[emote].AnimationOptions.yPos or 0.0 + local zPos = DP.Shared[emote].AnimationOptions.zPos or 0.0 + local xRot = DP.Shared[emote].AnimationOptions.xRot or 0.0 + local yRot = DP.Shared[emote].AnimationOptions.yRot or 0.0 + local zRot = DP.Shared[emote].AnimationOptions.zRot or 0.0 + AttachEntityToEntity(ply, pedInFront, bone, xPos, yPos, zPos, xRot, yRot, zRot, false, false, false, false, + 2, false) + end + end + SetEntityHeading(ply, heading - 180.1) + SetEntityCoordsNoOffset(ply, coords.x, coords.y, coords.z, 0) + EmoteCancel() + Wait(300) + targetPlayerId = player + if DP.Shared[emote] ~= nil then + if OnEmotePlay(DP.Shared[emote]) then end + return + elseif DP.Dances[emote] ~= nil then + if OnEmotePlay(DP.Dances[emote]) then end + return + end +end) + +RegisterNetEvent("SyncCancelEmote") +AddEventHandler("SyncCancelEmote", function(player) + if targetPlayerId and targetPlayerId == player then + targetPlayerId = nil + EmoteCancel() + end +end) + +function CancelSharedEmote(ply) + if targetPlayerId then + TriggerServerEvent("ServerEmoteCancel", targetPlayerId) + targetPlayerId = nil + end +end + +RegisterNetEvent("ClientEmoteRequestReceive") +AddEventHandler("ClientEmoteRequestReceive", function(emotename, etype) + isRequestAnim = true + requestedemote = emotename + + if etype == 'Dances' then + _, _, remote = table.unpack(DP.Dances[requestedemote]) + else + _, _, remote = table.unpack(DP.Shared[requestedemote]) + end + + PlaySound(-1, "NAV", "HUD_AMMO_SHOP_SOUNDSET", 0, 0, 1) + SimpleNotify(Config.Languages[lang]['doyouwanna'] .. remote .. "~w~)") +end) + +Citizen.CreateThread(function() + while true do + Citizen.Wait(5) + if IsControlJustPressed(1, 246) and isRequestAnim then + target, distance = GetClosestPlayer() + if (distance ~= -1 and distance < 3) then + if DP.Shared[requestedemote] ~= nil then + _, _, _, otheremote = table.unpack(DP.Shared[requestedemote]) + elseif DP.Dances[requestedemote] ~= nil then + _, _, _, otheremote = table.unpack(DP.Dances[requestedemote]) + end + if otheremote == nil then otheremote = requestedemote end + TriggerServerEvent("ServerValidEmote", GetPlayerServerId(target), requestedemote, otheremote) + isRequestAnim = false + else + SimpleNotify(Config.Languages[lang]['nobodyclose']) + end + elseif IsControlJustPressed(1, 182) and isRequestAnim then + SimpleNotify(Config.Languages[lang]['refuseemote']) + isRequestAnim = false + end + end +end) + +----------------------------------------------------------------------------------------------------- +------ Functions and stuff -------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------- + +function GetPlayerFromPed(ped) + for _, player in ipairs(GetActivePlayers()) do + if GetPlayerPed(player) == ped then + return player + end + end + return -1 +end + +function GetPedInFront() + local player = PlayerId() + local plyPed = GetPlayerPed(player) + local plyPos = GetEntityCoords(plyPed, false) + local plyOffset = GetOffsetFromEntityInWorldCoords(plyPed, 0.0, 1.3, 0.0) + local rayHandle = StartShapeTestCapsule(plyPos.x, plyPos.y, plyPos.z, plyOffset.x, plyOffset.y, plyOffset.z, 10.0, 12 + , plyPed, 7) + local _, _, _, _, ped2 = GetShapeTestResult(rayHandle) + return ped2 +end + +function MearbysOnCommand(source, args, raw) + local NearbysCommand = "" + for a in pairsByKeys(DP.Shared) do + NearbysCommand = NearbysCommand .. "" .. a .. ", " + end + EmoteChatMessage(NearbysCommand) + EmoteChatMessage(Config.Languages[lang]['emotemenucmd']) +end + +function SimpleNotify(message) + SetNotificationTextEntry("STRING") + AddTextComponentString(message) + DrawNotification(0, 1) +end + +function GetClosestPlayer() + local players = GetPlayers() + local closestDistance = -1 + local closestPlayer = -1 + local ply = PlayerPedId() + local plyCoords = GetEntityCoords(ply, 0) + + for index, value in ipairs(players) do + local target = GetPlayerPed(value) + if (target ~= ply) then + local targetCoords = GetEntityCoords(GetPlayerPed(value), 0) + local distance = GetDistanceBetweenCoords(targetCoords["x"], targetCoords["y"], targetCoords["z"], + plyCoords["x"], plyCoords["y"], plyCoords["z"], true) + if (closestDistance == -1 or closestDistance > distance) then + closestPlayer = value + closestDistance = distance + end + end + end + return closestPlayer, closestDistance +end + +function GetPlayers() + local players = {} + + for i = 0, 255 do + if NetworkIsPlayerActive(i) then + table.insert(players, i) + end + end + + return players +end diff --git a/resources/dpemotes-master/client/Walk.lua b/resources/dpemotes-master/client/Walk.lua new file mode 100644 index 000000000..e5f1e6750 --- /dev/null +++ b/resources/dpemotes-master/client/Walk.lua @@ -0,0 +1,41 @@ +function WalkMenuStart(name) + RequestWalking(name) + SetPedMovementClipset(PlayerPedId(), name, 0.2) + RemoveAnimSet(name) +end + +function RequestWalking(set) + RequestAnimSet(set) + while not HasAnimSetLoaded(set) do + Citizen.Wait(1) + end +end + +function WalksOnCommand(source, args, raw) + local WalksCommand = "" + for a in pairsByKeys(DP.Walks) do + WalksCommand = WalksCommand .. "" .. string.lower(a) .. ", " + end + EmoteChatMessage(WalksCommand) + EmoteChatMessage("To reset do /walk reset") +end + +function WalkCommandStart(source, args, raw) + local name = firstToUpper(args[1]) + + if name == "Reset" then + ResetPedMovementClipset(PlayerPedId()) + return + end + + if tableHasKey(DP.Walks, name) then + local name2 = table.unpack(DP.Walks[name]) + WalkMenuStart(name2) + else + EmoteChatMessage("'" .. name .. "' is not a valid walk") + end +end + +function tableHasKey(table, key) + return table[key] ~= nil +end diff --git a/resources/dpemotes-master/config.lua b/resources/dpemotes-master/config.lua new file mode 100644 index 000000000..7cb88fd94 --- /dev/null +++ b/resources/dpemotes-master/config.lua @@ -0,0 +1,589 @@ +Config = { + -- Change the language of the menu here!. + -- Note fr and de are google translated, if you would like to help out with translations, feel free to send me an 'issue' on Github. + -- Thank you to those who provided translations. + -- + + MenuLanguage = 'en', + -- Set this to true to enable some extra prints + DebugDisplay = false, + -- Set this to false if you have something else on X, and then just use /e c to cancel emotes. + EnableXtoCancel = true, + -- Set this to true if you want to disarm the player when they play an emote. + DisarmPlayer = false, + -- Set this if you really wanna disable emotes in cars, as of 1.7.2 they only play the upper body part if in vehicle + AllowedInCars = true, + -- You can disable the menu here / change the keybind. It is currently set to F3 + MenuKeybindEnabled = true, + MenuKeybind = 'DELETE', -- Get the button string here https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/ + -- You can disable the Favorite emote keybinding here. + FavKeybindEnabled = true, + FavKeybind = 256, -- Get the button number here https://docs.fivem.net/game-references/controls/ + -- You can change the header image for the menu here + -- Use a 512 x 128 image! + -- Note this might cause an issue of the image getting stuck on peoples screens + CustomMenuEnabled = true, + MenuImage = "https://i.imgur.com/IRzHWb3.png", ----[Custom banner imgur URLs go here ]--- + -- You can change the menu image by pasting a link above. It must be the same width and length + -- + -- You can change the menu position here + MenuPosition = "right", -- (left, right) + -- You can enable or disable the Ragdoll keybinding here. + RagdollEnabled = false, + RagdollKeybind = 303, -- Get the button number here https://docs.fivem.net/game-references/controls/ + -- You can disable the Facial Expressions menu here. + ExpressionsEnabled = true, + -- You can disable the Walking Styles menu here. + WalkingStylesEnabled = true, + -- You can disable the Shared Emotes here. + SharedEmotesEnabled = true, + CheckForUpdates = true, + -- If you have the SQL imported enable this to turn on keybinding. + SqlKeybinding = false, +} + +Config.KeybindKeys = { + ['num4'] = 108, + ['num5'] = 110, + ['num6'] = 109, + ['num7'] = 117, + ['num8'] = 111, + ['num9'] = 118 +} + +Config.Languages = { + ['en'] = { -- English 🇬🇧 + ['emotes'] = 'Emotes 🎬', + ['danceemotes'] = "🕺 Dance Emotes", + ['animalemotes'] = "🐩 Animal Emotes", + ['propemotes'] = "📦 Prop Emotes", + ['favoriteemotes'] = "🌟 Favorite", + ['favoriteinfo'] = "Select an emote here to set it as your favorite.", + ['rfavorite'] = "Reset favorite", + ['prop2info'] = "❓ Prop Emotes can be located at the end", + ['set'] = "Set (", + ['setboundemote'] = ") to be your bound emote?", + ['newsetemote'] = "~w~ is now your bound emote, press ~g~CapsLock~w~ to use it.", + ['cancelemote'] = "Cancel Emote 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Cancels the currently playing emote", + ['walkingstyles'] = "Walking Styles 🚶🏻‍♂️", + ['resetdef'] = "Reset to default", + ['normalreset'] = "Normal (Reset)", + ['moods'] = "Moods 😒", + ['infoupdate'] = "Credits & Suggestions 🙏🏻", + ['infoupdateav'] = "Information (Update available)", + ['infoupdateavtext'] = "An update is available, get the latest version from ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Suggestions?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' on FiveM forums for any feature/emote suggestions! ✉️", + ['notvaliddance'] = "is not a valid dance.", + ['notvalidemote'] = "is not a valid emote.", + ['nocancel'] = "No emote to cancel.", + ['maleonly'] = "This emote is male only, sorry!", + ['emotemenucmd'] = "Do /emotemenu for a menu.", + ['shareemotes'] = "👫 Shared Emotes", + ['shareemotesinfo'] = "Invite a nearby person to emote", + ['sharedanceemotes'] = "🕺 Shared Dances", + ['notvalidsharedemote'] = "is not a valid shared emote.", + ['sentrequestto'] = "Sent request to ~y~", + ['nobodyclose'] = "Nobody ~r~close~w~ enough.", + ['doyouwanna'] = "~y~Y~w~ to accept, ~r~L~w~ to refuse (~g~", + ['refuseemote'] = "Emote refused.", + ['makenearby'] = "makes the nearby player play", + ['camera'] = "Press ~y~G~w~ to use camera flash.", + ['makeitrain'] = "Press ~y~G~w~ to make it rain.", + ['pee'] = "Hold ~y~G~w~ to pee.", + ['spraychamp'] = "Hold ~y~G~w~ to spray champagne", + ['stun'] = "Press ~y~G~w~ to 'use' stun gun.", + ['bound'] = "Bound ", + ['to'] = "to", + ['currentlyboundemotes'] = " Currently bound emotes:", + ['notvalidkey'] = "is not a valid key.", + ['keybinds'] = "🔢 Keybinds", + ['keybindsinfo'] = "Use" + }, + ['cs'] = { -- Czech 🇨🇿 + ['emotes'] = 'Animace 🎬', + ['danceemotes'] = "🕺 Taneční Animace", + ['animalemotes'] = "🐩 zvířecí Animace", + ['propemotes'] = "📦 Animace s předměty", + ['favoriteemotes'] = "🌟 Oblíbené", + ['favoriteinfo'] = "Vyberte si animaci a nastavte ji jako svou oblíbenou.", + ['rfavorite'] = "Obnovit oblíbené", + ['prop2info'] = "❓ Pomůcky se mohou nacházet na konci", + ['set'] = "Nastavit", + ['setboundemote'] = "Nastavit jako vaši animaci?", + ['newsetemote'] = "~w~ je nyní vaší novou nastavenou animací. Chcete-li jej použít, stiskněte ~g~CapsLock~w~.", + ['cancelemote'] = "Zrušit animaci 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Zruší aktuálně přehrávanou animaci", + ['walkingstyles'] = "Styly chůze 🚶🏻‍♂️", + ['resetdef'] = "Obnovit do základního nastavení", + ['normalreset'] = "Neutrální výraz", + ['moods'] = "Výrazy 😒", + ['infoupdate'] = "Kredity a nápady 🙏🏻", + ['infoupdateav'] = "Informace (aktualizace dostupná)", + ['infoupdateavtext'] = "Je k dispozici aktualizace, stáhněte si nejnovější verzi z ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Nápady?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' na FiveM forums je pro jakýkoliv návrh! ✉️", + ['notvaliddance'] = "Není platný tanec.", + ['notvalidemote'] = "Není platná animace.", + ['nocancel'] = "Žádné animace ke zrušení.", + ['maleonly'] = "Tato emoce je pouze pro muže, omlouvám se!", + ['emotemenucmd'] = "Použíj /emotemenu pro otevření menu.", + ['shareemotes'] = "👫 Sdílené animace", + ['shareemotesinfo'] = "Pozvěte osobu v okolí, k tanci", + ['sharedanceemotes'] = "🕺 Sdílený tanece", + ['notvalidsharedemote'] = "Není platný Sdílený tanec.", + ['sentrequestto'] = "Odeslal jsi ~y~ žádost o tanec ", + ['nobodyclose'] = "Nikdo ~r~není~w~ v dostatečné blízkosti.", + ['doyouwanna'] = "~y~Y~w~ pro příjmutí, ~r~L~w~ pro odmitnutí (~g~", + ['refuseemote'] = "Emote odmítnut.", + ['makenearby'] = "nechat hráče poblíž hrát", + ['camera'] = "Stiskni ~y~G~w~ pro použítí blesku u fotoaparátu.", + ['makeitrain'] = "Stiskni ~y~G~w~ pro spuštení deště.", + ['pee'] = "Podrž ~y~G~w~ pro čůraní.", + ['spraychamp'] = "Podrž ~y~G~w~ pro stříkaní šampaňského", + ['stun'] = "Stiskni ~y~G~w~ pro 'použití' paralyzéru.", + ['bound'] = "Bound ", + ['to'] = "na", + ['currentlyboundemotes'] = "Momentálně nastavené animace:", + ['notvalidkey'] = "Není platná klávesa.", + ['keybinds'] = "🔢 Klávesové Zkratky", + ['keybindsinfo'] = "Use" + }, + ['fr'] = { -- French 🇫🇷 + ['emotes'] = 'Emotes 🎬', + ['danceemotes'] = "🕺 Danses", + ['animalemotes'] = "🐩 Emotes d'animaux", + ['propemotes'] = "📦 Emotes objet", + ['favoriteemotes'] = "🌟 Favori", + ['favoriteinfo'] = "Définir une emote comme favori.", + ['rfavorite'] = "Réinitialiser le favori.", + ['prop2info'] = "❓ Les emotes d'objet peuvent être à la fin", + ['set'] = "Mettre (", + ['setboundemote'] = ") en emote favorite?", + ['newsetemote'] = "~w~ est maintenant votre emote favorite, appuyez sur ~g~CapsLock~w~ pour l'utiliser.", + ['cancelemote'] = "Annuler Emote 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Annule l'emote en cours", + ['walkingstyles'] = "Styles de marche 🚶🏻‍♂️", + ['resetdef'] = "Réinitialiser aux valeurs par défaut", + ['normalreset'] = "Normal (réinitialiser)", + ['moods'] = "Humeurs 😒", + ['infoupdate'] = "Crédits et suggestions 🙏🏻", + ['infoupdateav'] = "Information (Mise à jour disponible)", + ['infoupdateavtext'] = "Une mise à jour est disponible ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Suggestions?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' sur les forums FiveM pour toutes les suggestions! ✉️", + ['notvaliddance'] = "n'est pas une danse valide", + ['notvalidemote'] = "n'est pas une emote valide", + ['nocancel'] = "Pas d'emote à annuler", + ['maleonly'] = "Cet emote est réservé aux hommes, désolé!", + ['emotemenucmd'] = "Fait /emotemenu pour ouvrir le menu", + ['shareemotes'] = "👫 Emotes partagées", + ['shareemotesinfo'] = "Invite une personne proche à faire une emote avec toi", + ['sharedanceemotes'] = "🕺 Dances partagées", + ['notvalidsharedemote'] = "n'est pas un emote partagée valide.", + ['sentrequestto'] = "Demande envoyée à ~g~", + ['nobodyclose'] = "Personne n'esst assez proche.", + ['doyouwanna'] = "~y~Y~w~ accepter, ~r~L~w~ refuser (~g~", + ['refuseemote'] = "Emote refusée.", + ['makenearby'] = "fait jouer le joueur à proximité", + ['camera'] = "Presse ~y~G~w~ pour utiliser le flash de l'appareil.", + ['makeitrain'] = "Presse ~y~G~w~ pour jeter de l'argent.", + ['pee'] = "Tenir ~y~G~w~ pour faire pipi.", + ['spraychamp'] = "Tenir ~y~G~w~ pour vaporiser du champagne.", + ['bound'] = "Liée ", + ['to'] = "à", + ['currentlyboundemotes'] = " Emotes actuellement liées:", + ['notvalidkey'] = "n'est pas une clé valide.", + ['keybinds'] = "🔢 Raccourcis clavier", + ['keybindsinfo'] = "Utilise" + }, + ['de'] = { -- German 🇩🇪 + ['emotes'] = 'Emotes 🎬', + ['danceemotes'] = "🕺 Tanz-Emotes", + ['animalemotes'] = "🐩 Animal Emotes", + ['propemotes'] = "📦 Prop-Emotes", + ['favoriteemotes'] = "🌟 Favorit", + ['favoriteinfo'] = "Wählen Sie hier ein Emote aus, um es als gebundenes Emote festzulegen.", + ['rfavorite'] = "Keybind zurücksetzen", + ['prop2info'] = "❓ Prop-Emotes können am Ende platziert werden", + ['set'] = "Set (", + ['setboundemote'] = ") soll dein gebundenes Emote sein?", + ['newsetemote'] = "~w~ ist jetzt dein gebundenes Emote, drücke ~g~CapsLock~w~, um es zu verwenden.", + ['cancelemote'] = "Emote abbrechen 🚷", + ['cancelemoteinfo'] = "~r~ X ~w~ Bricht das aktuell wiedergegebene Emote ab", + ['walkingstyles'] = "Gehstile 🚶🏻‍♂️", + ['resetdef'] = "Auf Standard zurücksetzen", + ['normalreset'] = "Normal (Zurücksetzen)", + ['moods'] = "Stimmungen 😒", + ['infoupdate'] = "Credits und Dank 🙏🏻", + ['infoupdateav'] = "Information (Update verfügbar)", + ['infoupdateavtext'] = "Eine Aktualisierung ist verfügbar ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Vorschläge?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' in FiveM-Foren für alle Feature- / Emote-Vorschläge! ✉️", + ['notvaliddance'] = "ist kein gültiger Tanz", + ['notvalidemote'] = "ist kein gültiges Emote", + ['nocancel'] = "Kein Emote zum Abbrechen", + ['maleonly'] = "Dieses Emote ist nur männlich, sorry!", + ['emotemenucmd'] = "Do /emotemenu für ein Menü", + ['shareemotes'] = "👫 Geteilte Emotes", + ['shareemotesinfo'] = "Laden Sie eine Person in Ihrer Nähe zum Emoten ein", + ['sharedanceemotes'] = "🕺 Geteilte Tänze", + ['notvalidsharedemote'] = "ist kein gültiges geteiltes Emote.", + ['sentrequestto'] = "Gesendete Anfrage an ~g~", + ['nobodyclose'] = "Niemand ist nah genug dran.", + ['doyouwanna'] = "~y~Z~w~ zu akzeptieren, ~r~L~w~ zu verweigern (~g~", + ['refuseemote'] = "Emote abgelehnt.", + ['makenearby'] = "Lässt den Spieler in der Nähe spielen", + ['camera'] = "Drücken ~y~G~w~ Kamerablitz verwenden.", + ['makeitrain'] = "Drücken ~y~G~w~ Geld werfen.", + ['pee'] = "Halt ~y~G~w~ urinieren.", + ['spraychamp'] = "Halt ~y~G~w~ champagner sprühen", + ['bound'] = "Gebunden ", + ['to'] = "zu", + ['currentlyboundemotes'] = " Derzeit gebundene Emotes:", + ['notvalidkey'] = "ist kein gültiger schlüssel.", + ['keybinds'] = "🔢 Tastenkombinationen", + ['keybindsinfo'] = "verwenden" + }, + ['sv'] = { -- Swedish 🇸🇪 + ['emotes'] = 'Emotes 🎬', + ['danceemotes'] = "🕺 Dans Emotes", + ['animalemotes'] = "🐩 Animal Emotes", + ['propemotes'] = "📦 Objekt Emotes", + ['favoriteemotes'] = "🌟 Favorit", + ['favoriteinfo'] = "Välj en emote här för att ställa in den som din favorit emote.", + ['rfavorite'] = "Återställ favorit.", + ['prop2info'] = "❓ Objekt Emotes finns längst ner i listan.", + ['set'] = "Sätt (", + ['setboundemote'] = ") till din favorit emote?", + ['newsetemote'] = "~w~ är nu din favorit emote, tryck ~g~CapsLock~w~ för att använda den.", + ['cancelemote'] = "Avbryt Emote 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Avbryter det emote som för närvarande används.", + ['walkingstyles'] = "Walking Stil 🚶🏻‍♂️", + ['resetdef'] = "Återställ till standard", + ['normalreset'] = "Normal (Återställ)", + ['moods'] = "Humör 😒", + ['infoupdate'] = "Krediter Och Förslag 🙏🏻", + ['infoupdateav'] = "Information (Uppdatering tillgänglig)", + ['infoupdateavtext'] = "En uppdatering är tillgänglig ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Förslag?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' på FiveM-forum för alla funktioner/emote-förslag! ✉️", + ['notvaliddance'] = "är inte en giltig dans", + ['notvalidemote'] = "är inte en giltig emote", + ['nocancel'] = "Ingen emote att avbryta", + ['maleonly'] = "Den här emoten är endast för män, ledsen!", + ['emotemenucmd'] = "Gör /emotemenu för en meny", + ['shareemotes'] = "👫 Delade Emotes", + ['shareemotesinfo'] = "Bjud in en någon nära för en emote", + ['sharedanceemotes'] = "🕺 Delade Danser", + ['notvalidsharedemote'] = "är inte en giltig delad emote.", + ['sentrequestto'] = "Skickad förfrågan till ~g~", + ['nobodyclose'] = "Ingen ~r~nära~w~ tillräckligt.", + ['doyouwanna'] = "~y~Y~w~ för att acceptera, ~r~L~w~ för att vägra (~g~", + ['refuseemote'] = "Emote vägrades.", + ['makenearby'] = "andra personen spelar", + ['camera'] = "Tryck ~y~G~w~ för att använda blixt.", + ['makeitrain'] = "Tryck ~y~G~w~ för att kasta pengar.", + ['pee'] = "Håll ~y~G~w~ att kissa.", + ['spraychamp'] = "Håll ~y~G~w~ för att spraya champagne.", + ['bound'] = "Bunde ", + ['to'] = "till", + ['currentlyboundemotes'] = " För närvarande bundna emotes:", + ['notvalidkey'] = "är inte en giltig tangent.", + ['keybinds'] = "🔢 Keybinds", + ['keybindsinfo'] = "Använd" + }, + ['es'] = { -- Spanish 🇪🇸 + ['emotes'] = "Animaciones 🎬", + ['danceemotes'] = "🕺 Bailes", + ['animalemotes'] = "🐩 Emotes de animales", + ['propemotes'] = "📦 Objetos", + ['favoriteemotes'] = "🌟 Favoritos", + ['favoriteinfo'] = "Seleccione un emoticón aquí para configurarlo como su favorito.", + ['rfavorite'] = "Restablecer favorito", + ['prop2info'] = "❓ Prop Emotes se pueden ubicar al final", + ['set'] = "Elegir (", + ['setboundemote'] = ") como tu animacion favorita?", + ['newsetemote'] = "~w~ es ahora tu animacion favorita, presiona ~g~[CapsLock]~w~ para usarla.", + ['cancelemote'] = "Cancelar animacion 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Cancela la animacion actual.", + ['walkingstyles'] = "Formas de caminar 🚶🏻‍♂️", + ['resetdef'] = "Reiniciar a por defecto", + ['normalreset'] = "Normal (Reiniciar)", + ['moods'] = "Estados de animo 😒", + ['infoupdate'] = "Créditos Y Sugerencias 🙏🏻", + ['infoupdateav'] = "Informacion (Actualizacion disponible)", + ['infoupdateavtext'] = "Una actualizacion esta disponible, para conseguir la ultima version ingresa a ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Sugerencias?", + ['suggestionsinfo'] = "TayMcKenzieNZ' en el foro de FiveM para cualquier sugerencia! ✉️", + ['notvaliddance'] = "no es un baile valido.", + ['notvalidemote'] = "no es una animacion valida.", + ['nocancel'] = "No hay animacion para cancelar.", + ['maleonly'] = "Esta animacion es solo de hombre!", + ['emotemenucmd'] = "Escribe /emotemenu para abrir el menu.", + ['shareemotes'] = "👫 Animaciones compartidas", + ['shareemotesinfo'] = "Invita a una persona cercana para la animacion.", + ['sharedanceemotes'] = "🕺 Bailes compartidos", + ['notvalidsharedemote'] = "no es una animacion compartida valida.", + ['sentrequestto'] = "Solicitud enviada ~y~", + ['nobodyclose'] = "Nadie ~r~cerca~w~.", + ['doyouwanna'] = "~y~Y~w~ para aceptar, ~r~L~w~ para rechazar (~g~", + ['refuseemote'] = "Animacion rechazada.", + ['makenearby'] = "hacer que el jugador cercano juegue", + ['camera'] = "Presione ~y~G~w~ para usar el flash de la camara.", + ['makeitrain'] = "Presiona ~y~G~w~ para hacer llover.", + ['pee'] = "Mantiene ~y~G~w~ para mear.", + ['spraychamp'] = "Mantiene ~y~G~w~ rociar champán.", + ['bound'] = "Unida ", + ['to'] = "a", + ['currentlyboundemotes'] = " Emotes vinculados actualmente:", + ['notvalidkey'] = "no es una clave válida.", + ['keybinds'] = "🔢 Keybinds", + ['keybindsinfo'] = "Utilizar" + }, + ['nl'] = { -- Dutch 🇳🇱 + ['emotes'] = 'Animaties 🎬', + ['danceemotes'] = "🕺 Dans Animaties", + ['animalemotes'] = "🐩 Dier Animaties", + ['propemotes'] = "📦 Prop Animaties", + ['favoriteemotes'] = "🌟 Favorieten", + ['favoriteinfo'] = "Selecteer hier een animatie om deze als favoriete in te stellen.", + ['rfavorite'] = "Reset Favorieten", + ['prop2info'] = "❓ Prop animaties staan aan het einde.", + ['set'] = "Maak (", + ['setboundemote'] = ") je toegewezen animatie?", + ['newsetemote'] = "~w~ is nu je toegewezen animatie, druk op ~g~CapsLock~w~ om hem te gebruiken.", + ['cancelemote'] = "Stop Animatie 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Stopt je huidige animatie", + ['walkingstyles'] = "Loopjes 🚶🏻‍♂️", + ['resetdef'] = "Reset naar standaard", + ['normalreset'] = "Normaal (Reset)", + ['moods'] = "Stemmingen 😒", + ['infoupdate'] = "Credits en bedankt 🙏🏻", + ['infoupdateav'] = "Informatie (Update beschikbaar)", + ['infoupdateavtext'] = "Een update is beschikbaar, download de laatste versie via ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Suggesties?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' op de FiveM forums om suggesties in te dienen! ✉️", + ['notvaliddance'] = "Is geen geldige dans.", + ['notvalidemote'] = "Is geen geldige animatie.", + ['nocancel'] = "Er is geen animatie om te annuleren.", + ['maleonly'] = "Deze animatie is alleen voor mannen, sorry!", + ['emotemenucmd'] = "Doe /emotemenu voor het animatiemenu.", + ['shareemotes'] = "👫 Gedeelde Animaties", + ['shareemotesinfo'] = "Nodig een persoon in de buurt uit om een animatie te doen.", + ['sharedanceemotes'] = "🕺 Gedeelde Dansjes", + ['notvalidsharedemote'] = "Is geen geldige gedeelde animatie.", + ['sentrequestto'] = "Verzoek gestuurd naar ~y~", + ['nobodyclose'] = "Er is niemand ~r~dichtbij~w~ genoeg.", + ['doyouwanna'] = "~y~Y~w~ om te accepteren, ~r~L~w~ om te weigeren (~g~", + ['refuseemote'] = "Animatie geweigerd.", + ['makenearby'] = "laat de dichtstbijzijnde persoon de animatie doen", + ['camera'] = "Druk op ~y~G~w~ om de flitser te gebruiken..", + ['makeitrain'] = "Druk op ~y~G~w~ om geld te gooien.", + ['pee'] = "Druk op ~y~G~w~ om te plassen.", + ['spraychamp'] = "Druk op ~y~G~w~ om batra's te spuiten.", + ['stun'] = "Druk op ~y~G~w~ om de taser te 'gebruiken'.", + ['bound'] = "Gebonden ", + ['to'] = "aan", + ['currentlyboundemotes'] = " Huidig gebonden animaties:", + ['notvalidkey'] = "Is geen geldige knop.", + ['keybinds'] = "🔢 Keybinds", + ['keybindsinfo'] = "Gebruik" + }, + ['pt'] = { -- Brazilian Portuguese 🇧🇷 + ['emotes'] = 'Emotes 🎬', + ['danceemotes'] = "🕺 Emotes de Danças", + ['animalemotes'] = "🐩 Emotes de Animais", + ['propemotes'] = "📦 Emotes com Props", + ['favoriteemotes'] = "🌟 Favoritos", + ['favoriteinfo'] = "Selecione um emote para colocá-lo nos seus favoritos", + ['rfavorite'] = "Limpar favoritos", + ['prop2info'] = "❓ Emotes de props podem ser localizados no fim", + ['set'] = "Set (", + ['setboundemote'] = ") para ser seu emote vinculado?", + ['newsetemote'] = "~w~ é o seu emote vinculado, pressione ~g~CapsLock~w~ para usá-lo", + ['cancelemote'] = "Cancelar emote 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Cancela os emotes rodando atualmente", + ['walkingstyles'] = "Estilos de Caminhada 🚶🏻‍♂️", + ['resetdef'] = "Resetar para o padrão", + ['normalreset'] = "Normal (Resetar)", + ['moods'] = "Humores 😒", + ['infoupdate'] = "Crédito e agradecimento 🙏🏻", + ['infoupdateav'] = "Informação (Atualização disponível)", + ['infoupdateavtext'] = "Uma atualização disponível, veja ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~ para pegar", + ['suggestions'] = "Sugestões?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' no fórum do FiveM para qualquer sugestão de recurso/emotes! ✉️", + ['notvaliddance'] = "não é uma dança válida.", + ['notvalidemote'] = "não é um emote válido.", + ['nocancel'] = "Nenhum emote para cancelar", + ['maleonly'] = "Este emote é para homens, desculpe!", + ['emotemenucmd'] = "Faça /emotemenu para abrir o menu.", + ['shareemotes'] = "👫 Emotes compartilhados", + ['shareemotesinfo'] = "Convide uma pessoa próxima para para realizar a animação", + ['sharedanceemotes'] = "🕺 Danças compartilhadas", + ['notvalidsharedemote'] = "não é um emote compartilhado válido.", + ['sentrequestto'] = "Enviar solicitação para ~y~", + ['nobodyclose'] = "Ninguém próximo o ~r~rsuficiente~w~.", + ['doyouwanna'] = "~y~Y~w~ para aceitar, ~r~L~w~ para recursar (~g~", + ['refuseemote'] = "Emote recursado", + ['makenearby'] = "Faz o jogador próximo participar", + ['camera'] = "Pressione ~y~G~w~ para usar o flash da câmera", + ['makeitrain'] = "Pressione ~y~G~w~ para fazer chover.", + ['pee'] = "Mantenha pressionado ~y~G~w~ para fazer xixi.", + ['spraychamp'] = "Mantenha pressionado ~y~G~w~ jogar champagne", + ['stun'] = "Press ~y~G~w~ to 'use' stun gun.", + ['bound'] = "Vinculado ", + ['to'] = "para", + ['currentlyboundemotes'] = "Emotes atualmente vinculados: ", + ['notvalidkey'] = "isto não é uma chave válida", + ['keybinds'] = "🔢 Keybinds", + ['keybindsinfo'] = "Usar" + }, + ['it'] = { -- Italian 🇮🇹 + ['emotes'] = 'Animazioni 🎬', + ['danceemotes'] = "🕺 Animazioni Di Danza", + ['animalemotes'] = "🐩 Animazioni Di Animali", + ['propemotes'] = "📦 Animazioni Prop", + ['favoriteemotes'] = "🌟 Emote preferite", + ['favoriteinfo'] = "Seleziona un'animazione per metterla nei preferiti.", + ['rfavorite'] = "Rimuovi preferito", + ['prop2info'] = "❓ Le animazioni Prop possono essere trovate in fondo.", + ['set'] = "Imposta (", + ['setboundemote'] = ") come tua animazione corrente?", + ['newsetemote'] = "~w~ è ora la tua animazione corrente, premi ~g~CapsLock~w~ per usarla.", + ['cancelemote'] = "Annulla animazione 🚷", + ['cancelemoteinfo'] = "~r~X~w~ Cancella l'animazione in corso.", + ['walkingstyles'] = "Stili di camminata 🚶🏻‍♂️", + ['resetdef'] = "Ripristina predefiniti", + ['normalreset'] = "Normale (Reset)", + ['moods'] = "Umori 😒", + ['infoupdate'] = "Crediti e grazie 🙏🏻", + ['infoupdateav'] = "Informazioni (Aggiornamento disponibile)", + ['infoupdateavtext'] = "Un aggiornamento è disponibile, ottieni l'ulima versione qui ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Suggerimenti?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' nei forum di FiveM per suggerimenti su funzionalitá/animazioni! ✉️", + ['notvaliddance'] = "non è un ballo valido.", + ['notvalidemote'] = "non è un'animazione valida.", + ['nocancel'] = "Nessun'animazione da cancellare.", + ['maleonly'] = "Quest'animazione è solo maschile!", + ['emotemenucmd'] = "Esegui /emotemenu per aprire il menù.", + ['shareemotes'] = "👫 Animazioni di coppia", + ['shareemotesinfo'] = "Invita un giocatore vicino ad un'animazione", + ['sharedanceemotes'] = "🕺 Balli di coppia", + ['notvalidsharedemote'] = "non è un'animazione di coppia valida.", + ['sentrequestto'] = "Richiesta mandata a ~y~", + ['nobodyclose'] = "Nessun giocatore abbastanza ~r~vicino~w~.", + ['doyouwanna'] = "~y~Y~w~ per accettare, ~r~L~w~ per rifiutare (~g~", + ['refuseemote'] = "Animazione rifiutata.", + ['makenearby'] = "fa eseguire l'animazione al giocatore vicino", + ['camera'] = "Premi ~y~G~w~ per usare il flash della fotocamera.", + ['makeitrain'] = "Premi ~y~G~w~ per far piovere.", + ['pee'] = "Tieni premuto ~y~G~w~ per urinare.", + ['spraychamp'] = "Tieni premuto ~y~G~w~ per spruzzare champagne", + ['stun'] = "Premi ~y~G~w~ per 'usare' la pistola stordente.", + ['bound'] = "É stato impostato ", + ['to'] = "per", + ['currentlyboundemotes'] = " Animazioni correnti:", + ['notvalidkey'] = "non è una chiave valida.", + ['keybinds'] = "🔢 Tasti", + ['keybindsinfo'] = "Utilizza" + }, + ['da'] = { -- Danish 🇩🇰 + ['emotes'] = 'Animationer', + ['danceemotes'] = "🕺 Danse Animationer", + ['animalemotes'] = "🐩 Dyr Animationer", + ['propemotes'] = "📦 Rekvisit Animationer", + ['favoriteemotes'] = "🌟 Favorit", + ['favoriteinfo'] = "Vælge en animationer her for at sætte den som din favorit.", + ['rfavorite'] = "Nulstil Favorit", + ['prop2info'] = "❓ Rekvisit emotes findes i slutningen", + ['set'] = "Sæt (", + ['setboundemote'] = ") til din favorit animationer?", + ['newsetemote'] = "~w~ Er nu din favorit animationer, tryk ~g~CapsLock~w~ for at anvende den.", + ['cancelemote'] = "Afbryd animationer", + ['cancelemoteinfo'] = "~r~X~w~ Anullere din igangværende animationer.", + ['walkingstyles'] = "Gågange", + ['resetdef'] = "Nulstil til standard", + ['normalreset'] = "Normal (Nulstil)", + ['moods'] = "Humør 😒", + ['infoupdate'] = "Info / opdateringer", + ['infoupdateav'] = "Information (Opdatering available)", + ['infoupdateavtext'] = "En opdatering er tilgænglig, hent den nyeste version fra ~y~https://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Forslag?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' på FiveM-forum for alle funktioner/emote-forslag! ✉️", + ['notvaliddance'] = "er ikke en gyldig dans", + ['notvalidemote'] = "er ikke en gyldig emote", + ['nocancel'] = "Ingen animationer afspilles lige nu", + ['maleonly'] = "Denne animationer virker desværre kun til mænd!", + ['emotemenucmd'] = "Skriv /emotemenu for animationer menuen", + ['shareemotes'] = "👫 Delte animationer", + ['shareemotesinfo'] = "Invitere en spillere i nærheden for afspille animationer", + ['sharedanceemotes'] = "🕺 Delete Danse", + ['notvalidsharedemote'] = "er ikke en gyldig delt animationer.", + ['sentrequestto'] = "Anmodning sendt til ~y~", + ['nobodyclose'] = "Ingen ~r~tæt~w~ nok.", + ['doyouwanna'] = "~y~Y~w~ for at acceptere, ~r~L~w~ for at nægte (~g~", + ['refuseemote'] = "Animationer nægtede.", + ['makenearby'] = "får den nærliggende spiller til at spille", + ['camera'] = "Tryk ~y~G~w~ for at bruge kamera kameraets blitz.", + ['makeitrain'] = "Tryk ~y~G~w~ for at regne med penge.", + ['pee'] = "Hold ~y~G~w~ for at tisse.", + ['spraychamp'] = "Hold ~y~G~w~ for at sprøjte med champagnen", + ['stun'] = "tryk på ~y~G~w~ for at bruge elektrisk pistol.", + ['bound'] = "Bundet ", + ['to'] = "til", + ['currentlyboundemotes'] = " Keybind animationer:", + ['notvalidkey'] = "er ikke en gyldigt nøgle.", + ['keybinds'] = "🔢 Keybinds", + ['keybindsinfo'] = "Brug" + }, + ['fi'] = { -- Finnish 🇫🇮 + ['emotes'] = 'Emotet 🎬', + ['danceemotes'] = "🕺 Tanssi Emotet", + ['animalemotes'] = "🐩 Eläin Emotet", + ['propemotes'] = "📦 Esine Emotet", + ['favoriteemotes'] = "🌟 Suosikit", + ['favoriteinfo'] = " Valitse emote täältä laittaaksesi sen suosikiksi.", + ['rfavorite'] = "Resettaa Suosikin.", + ['prop2info'] = "❓ Esine Emotet voivat sijaita lopussa", + ['set'] = "Aseta (", + ['setboundemote'] = ") on sinun bindattu emote ?", + ['newsetemote'] = "w on nyt bindattuna emotesi, paina gCapsLockw käyttääksesi", + ['cancelemote'] = "Peru emote 🚷", + ['cancelemoteinfo'] = "rXw Peruu meneillään olevan emoten ", + ['walkingstyles'] = "Kävelytyylit🚶🏻‍♂️", + ['resetdef'] = "Resettaa oletuksen", + ['normalreset'] = "Normaali (Reseettaa)", + ['moods'] = "Mielitilat😒", + ['infoupdate'] = "Krediitit & Ehdotukset 🙏🏻", + ['infoupdateav'] = "Informaatio (Päivitys Saatavilla)", + ['infoupdateavtext'] = " Uusin versio saatavilla täältä yhttps://github.com/TayMcKenzieNZ/dpemotes~w~", + ['suggestions'] = "Ehdotukset?", + ['suggestionsinfo'] = "'TayMcKenzieNZ' Fivem foormueilta mitä vain fiituria/emote ehdotusta! ✉️", + ['notvaliddance'] = "Ei ole tanssi.", + ['notvalidemote'] = "Ei ole emote.", + ['nocancel'] = "Ei ole emotea peruutettavaksi.", + ['maleonly'] = "Tämä emote on miehille ainostaan, anteeksi!", + ['emotemenucmd'] = "Tee /emotemenu avataksesi emote menun", + ['shareemotes'] = "👫 Yhteiset Emotet", + ['shareemotesinfo'] = "Kutsu lähin hahmo emoteen ", + ['sharedanceemotes'] = "🕺 Yhteiset Tanssit", + ['notvalidsharedemote'] = "Ei ole yhteinen tanssi emote.", + ['sentrequestto'] = "Lähetä kutsu y", + ['nobodyclose'] = "Ei ketään rlähelläw sinua.", + ['doyouwanna'] = "yYw hyväksyyksesi, rLw kieltäytyäksesi (g", + ['refuseemote'] = "Emote peruutettu.", + ['makenearby'] = "tekee lähimmän pelaaja osallistumaan ", + ['camera'] = "Paina yGw käyttääksesi kameran salamaa.", + ['makeitrain'] = "Paina yGw heittääksesi rahaa.", + ['pee'] = "Pidä yGw pissaksesi.", + ['spraychamp'] = "Pidä yGw suihkutaaksesi shamppaniaa", + ['stun'] = "Paina yGw to 'käytä' etälamautinta.", + ['bound'] = "Bindata", + ['to'] = 'lle', + ['currentlyboundemotes'] = " On jo bindattuna emotehin :", + ['notvalidkey'] = "Ei ole käytettävä näppäin.", + ['keybinds'] = "🔢 Pikanäppäimet", + ['keybindsinfo'] = "Käytä", +}} diff --git a/resources/dpemotes-master/fxmanifest.lua b/resources/dpemotes-master/fxmanifest.lua new file mode 100644 index 000000000..91c859b5e --- /dev/null +++ b/resources/dpemotes-master/fxmanifest.lua @@ -0,0 +1,36 @@ +--- DPEmotes by andristum --- +--- Forked by TayMcKenzieNZ --- +--- Check for updates at https://github.com/TayMcKenzieNZ/dpemotes --- + +fx_version 'adamant' + +game 'gta5' + +-- Comment the following linnes if you don't want to use the SQL keybinds +--#region oxmysql +-- dependency 'oxmysql' +-- server_script "@oxmysql/lib/MySQL.lua" +--#endregion oxmysql + +shared_scripts { + 'config.lua', +} + +server_scripts { + 'printer.lua', + 'server/*.lua' +} + +client_scripts { + 'NativeUI.lua', + 'client/*.lua' +} + + +data_file "DLC_ITYP_REQUEST" "badge1.ytyp" + +data_file "DLC_ITYP_REQUEST" "copbadge.ytyp" + +data_file "DLC_ITYP_REQUEST" "prideprops_ytyp" + +data_file "DLC_ITYP_REQUEST" "lilflags_ytyp" diff --git a/resources/dpemotes-master/printer.lua b/resources/dpemotes-master/printer.lua new file mode 100644 index 000000000..0584813a6 --- /dev/null +++ b/resources/dpemotes-master/printer.lua @@ -0,0 +1 @@ +print("DpEmotes forked by TayMcKenzieNZ loaded sucessfully.") diff --git a/resources/dpemotes-master/screenshots/boop.jpg b/resources/dpemotes-master/screenshots/boop.jpg new file mode 100644 index 000000000..c10ae15c3 Binary files /dev/null and b/resources/dpemotes-master/screenshots/boop.jpg differ diff --git a/resources/dpemotes-master/screenshots/cb_before.jpg b/resources/dpemotes-master/screenshots/cb_before.jpg new file mode 100644 index 000000000..742c67038 Binary files /dev/null and b/resources/dpemotes-master/screenshots/cb_before.jpg differ diff --git a/resources/dpemotes-master/screenshots/cp_after.jpg b/resources/dpemotes-master/screenshots/cp_after.jpg new file mode 100644 index 000000000..c695b734d Binary files /dev/null and b/resources/dpemotes-master/screenshots/cp_after.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag1.jpg b/resources/dpemotes-master/screenshots/flag1.jpg new file mode 100644 index 000000000..9375e12b3 Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag1.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag2.jpg b/resources/dpemotes-master/screenshots/flag2.jpg new file mode 100644 index 000000000..5b250a28d Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag2.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag3.jpg b/resources/dpemotes-master/screenshots/flag3.jpg new file mode 100644 index 000000000..04a1ef0cc Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag3.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag4.jpg b/resources/dpemotes-master/screenshots/flag4.jpg new file mode 100644 index 000000000..81daad413 Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag4.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag5.jpg b/resources/dpemotes-master/screenshots/flag5.jpg new file mode 100644 index 000000000..bea8571ab Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag5.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag6.jpg b/resources/dpemotes-master/screenshots/flag6.jpg new file mode 100644 index 000000000..2efdde64b Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag6.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag7.jpg b/resources/dpemotes-master/screenshots/flag7.jpg new file mode 100644 index 000000000..fb57c13c1 Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag7.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag8.jpg b/resources/dpemotes-master/screenshots/flag8.jpg new file mode 100644 index 000000000..309182f14 Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag8.jpg differ diff --git a/resources/dpemotes-master/screenshots/flag9.jpg b/resources/dpemotes-master/screenshots/flag9.jpg new file mode 100644 index 000000000..0f9a872ee Binary files /dev/null and b/resources/dpemotes-master/screenshots/flag9.jpg differ diff --git a/resources/dpemotes-master/screenshots/menu.jpg b/resources/dpemotes-master/screenshots/menu.jpg new file mode 100644 index 000000000..729e02ab7 Binary files /dev/null and b/resources/dpemotes-master/screenshots/menu.jpg differ diff --git a/resources/dpemotes-master/screenshots/umbrella.jpg b/resources/dpemotes-master/screenshots/umbrella.jpg new file mode 100644 index 000000000..402963e58 Binary files /dev/null and b/resources/dpemotes-master/screenshots/umbrella.jpg differ diff --git a/resources/dpemotes-master/server/Server.lua b/resources/dpemotes-master/server/Server.lua new file mode 100644 index 000000000..0a3472a0a --- /dev/null +++ b/resources/dpemotes-master/server/Server.lua @@ -0,0 +1,125 @@ +----------------------------------------------------------------------------------------------------- +-- Shared Emotes Syncing --------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------- + +RegisterServerEvent("ServerEmoteRequest") +AddEventHandler("ServerEmoteRequest", function(target, emotename, etype) + TriggerClientEvent("ClientEmoteRequestReceive", target, emotename, etype) +end) + +RegisterServerEvent("ServerValidEmote") +AddEventHandler("ServerValidEmote", function(target, requestedemote, otheremote) + TriggerClientEvent("SyncPlayEmote", source, otheremote, target) + TriggerClientEvent("SyncPlayEmoteSource", target, requestedemote, source) +end) + +RegisterServerEvent("ServerEmoteCancel") +AddEventHandler("ServerEmoteCancel", function(target) + TriggerClientEvent("SyncCancelEmote", target, source) +end) + +----------------------------------------------------------------------------------------------------- +-- Keybinding -------------------------------------------------------------------------------------- +----------------------------------------------------------------------------------------------------- + +local function addKeybindEventHandlers() + RegisterServerEvent("dp:ServerKeybindExist") + AddEventHandler('dp:ServerKeybindExist', function() + local src = source + local srcid = GetPlayerIdentifier(source) + MySQL.query('SELECT * FROM dpkeybinds WHERE `id`=@id;', { id = srcid }, function(dpkeybinds) + if dpkeybinds[1] then + TriggerClientEvent("dp:ClientKeybindExist", src, true) + else + TriggerClientEvent("dp:ClientKeybindExist", src, false) + end + end) + end) + + -- This is my first time doing SQL stuff, and after i finished everything i realized i didnt have to store the keybinds in the database at all. + -- But remaking it now is a little pointless since it does it job just fine! + + RegisterServerEvent("dp:ServerKeybindCreate") + AddEventHandler("dp:ServerKeybindCreate", function() + local src = source + local srcid = GetPlayerIdentifier(source) + MySQL.insert('INSERT INTO dpkeybinds (`id`, `keybind1`, `emote1`, `keybind2`, `emote2`, `keybind3`, `emote3`, `keybind4`, `emote4`, `keybind5`, `emote5`, `keybind6`, `emote6`) VALUES (@id, @keybind1, @emote1, @keybind2, @emote2, @keybind3, @emote3, @keybind4, @emote4, @keybind5, @emote5, @keybind6, @emote6);', + { id = srcid, keybind1 = "num4", emote1 = "", keybind2 = "num5", emote2 = "", keybind3 = "num6", emote3 = "", keybind4 = "num7", emote4 = "", keybind5 = "num8", emote5 = "", keybind6 = "num9", emote6 = "" }, function(created) print("[dp] ^2" .. GetPlayerName(src) .. "^7 got created!") TriggerClientEvent("dp:ClientKeybindGet", src, "num4", "", "num5", "", "num6", "", "num7", "", "num8", "", "num8", "") end) + end) + + RegisterServerEvent("dp:ServerKeybindGrab") + AddEventHandler("dp:ServerKeybindGrab", function() + local src = source + local srcid = GetPlayerIdentifier(source) + MySQL.query('SELECT keybind1, emote1, keybind2, emote2, keybind3, emote3, keybind4, emote4, keybind5, emote5, keybind6, emote6 FROM `dpkeybinds` WHERE `id` = @id' + , + { ['@id'] = srcid }, function(kb) + if kb[1].keybind1 ~= nil then + TriggerClientEvent("dp:ClientKeybindGet", src, kb[1].keybind1, kb[1].emote1, kb[1].keybind2, kb[1].emote2 , kb[1].keybind3, kb[1].emote3, kb[1].keybind4, kb[1].emote4, kb[1].keybind5, kb[1].emote5, kb[1].keybind6, kb[1].emote6) + else + TriggerClientEvent("dp:ClientKeybindGet", src, "num4", "", "num5", "", "num6", "", "num7", "", "num8", "", "num8", "") + end + end) + end) + + RegisterServerEvent("dp:ServerKeybindUpdate") + AddEventHandler("dp:ServerKeybindUpdate", function(key, emote) + local src = source + local myid = GetPlayerIdentifier(source) + if key == "num4" then chosenk = "keybind1" + elseif key == "num5" then chosenk = "keybind2" + elseif key == "num6" then chosenk = "keybind3" + elseif key == "num7" then chosenk = "keybind4" + elseif key == "num8" then chosenk = "keybind5" + elseif key == "num9" then chosenk = "keybind6" + end + if chosenk == "keybind1" then + MySQL.update("UPDATE dpkeybinds SET emote1=@emote WHERE id=@id", { id = myid, emote = emote }, + function() TriggerClientEvent("dp:ClientKeybindGetOne", src, key, emote) end) + elseif chosenk == "keybind2" then + MySQL.update("UPDATE dpkeybinds SET emote2=@emote WHERE id=@id", { id = myid, emote = emote }, + function() TriggerClientEvent("dp:ClientKeybindGetOne", src, key, emote) end) + elseif chosenk == "keybind3" then + MySQL.update("UPDATE dpkeybinds SET emote3=@emote WHERE id=@id", { id = myid, emote = emote }, + function() TriggerClientEvent("dp:ClientKeybindGetOne", src, key, emote) end) + elseif chosenk == "keybind4" then + MySQL.update("UPDATE dpkeybinds SET emote4=@emote WHERE id=@id", { id = myid, emote = emote }, + function() TriggerClientEvent("dp:ClientKeybindGetOne", src, key, emote) end) + elseif chosenk == "keybind5" then + MySQL.update("UPDATE dpkeybinds SET emote5=@emote WHERE id=@id", { id = myid, emote = emote }, + function() TriggerClientEvent("dp:ClientKeybindGetOne", src, key, emote) end) + elseif chosenk == "keybind6" then + MySQL.update("UPDATE dpkeybinds SET emote6=@emote WHERE id=@id", { id = myid, emote = emote }, + function() TriggerClientEvent("dp:ClientKeybindGetOne", src, key, emote) end) + end + end) +end + +if Config.SqlKeybinding and MySQL then + MySQL.update( + [[ + CREATE TABLE IF NOT EXISTS `dpkeybinds` ( + `id` varchar(50) NULL DEFAULT NULL, + `keybind1` varchar(50) NULL DEFAULT "num4", + `emote1` varchar(255) NULL DEFAULT "", + `keybind2` varchar(50) NULL DEFAULT "num5", + `emote2` varchar(255) NULL DEFAULT "", + `keybind3` varchar(50) NULL DEFAULT "num6", + `emote3` varchar(255) NULL DEFAULT "", + `keybind4` varchar(50) NULL DEFAULT "num7", + `emote4` varchar(255) NULL DEFAULT "", + `keybind5` varchar(50) NULL DEFAULT "num8", + `emote5` varchar(255) NULL DEFAULT "", + `keybind6` varchar(50) NULL DEFAULT "num9", + `emote6` varchar(255) NULL DEFAULT "" + ) ENGINE=InnoDB COLLATE=latin1_swedish_ci; + ]], {}, function(success) + if success then + addKeybindEventHandlers() + else + print("[dp] ^3Error connecting to DB^7") + end + end) +else + print("[dp] ^3Sql Keybinding^7 is turned ^1off^7, if you want to enable /emotebind, set ^3SqlKeybinding = ^2true^7 in config.lua and uncomment oxmysql lines in fxmanifest.lua.") +end diff --git a/resources/dpemotes-master/server/Updates.lua b/resources/dpemotes-master/server/Updates.lua new file mode 100644 index 000000000..9ae344f1d --- /dev/null +++ b/resources/dpemotes-master/server/Updates.lua @@ -0,0 +1,33 @@ +if Config.CheckForUpdates then + Citizen.CreateThread(function() + updatePath = "/TayMcKenzieNZ/dpemotes" + resourceName = "dp Emotes (" .. GetCurrentResourceName() .. ")" + PerformHttpRequest("https://raw.githubusercontent.com" .. updatePath .. "/master/version", checkVersion, "GET") + end) +end + +RegisterServerEvent("dp:CheckVersion") +AddEventHandler("dp:CheckVersion", function() + if updateavail then + TriggerClientEvent("dp:Update", source, true) + else + TriggerClientEvent("dp:Update", source, false) + end +end) + +function checkVersion(err, responseText, headers) + curVersion = LoadResourceFile(GetCurrentResourceName(), "version") + + if curVersion ~= responseText and tonumber(curVersion) < tonumber(responseText) then + updateavail = true + print("\n^1----------------------------------------------------------------------------------^7") + print(resourceName .. " is outdated, latest version is: ^2" .. responseText .. "^7, installed version: ^1" .. curVersion .. "^7!\nupdate from https://github.com" .. updatePath .. "") + print("^1----------------------------------------------------------------------------------^7") + elseif tonumber(curVersion) > tonumber(responseText) then + print("\n^3----------------------------------------------------------------------------------^7") + print(resourceName .. " git version is: ^2" .. responseText .. "^7, installed version: ^1" .. curVersion .. "^7!") + print("^3----------------------------------------------------------------------------------^7") + else + print("\n" .. resourceName .. " is up to date. (^2" .. curVersion .. "^7)") + end +end diff --git a/resources/dpemotes-master/stream/[Custom Emotes]/MissSnowieEmotes/misssnowie@hearthands.ycd b/resources/dpemotes-master/stream/[Custom Emotes]/MissSnowieEmotes/misssnowie@hearthands.ycd new file mode 100644 index 000000000..ac54ea5a0 Binary files /dev/null and b/resources/dpemotes-master/stream/[Custom Emotes]/MissSnowieEmotes/misssnowie@hearthands.ycd differ diff --git a/resources/dpemotes-master/stream/[Custom Emotes]/MissSnowieEmotes/misssnowie@little_doggy_lying_down.ycd b/resources/dpemotes-master/stream/[Custom Emotes]/MissSnowieEmotes/misssnowie@little_doggy_lying_down.ycd new file mode 100644 index 000000000..facefec62 Binary files /dev/null and b/resources/dpemotes-master/stream/[Custom Emotes]/MissSnowieEmotes/misssnowie@little_doggy_lying_down.ycd differ diff --git a/resources/dpemotes-master/stream/[Props]/FixedClipboard/p_cs_clipboard.ydr b/resources/dpemotes-master/stream/[Props]/FixedClipboard/p_cs_clipboard.ydr new file mode 100644 index 000000000..512ae8531 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/FixedClipboard/p_cs_clipboard.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:447dc8cf2e84d383adabfa895d4927c5fb4cf744fb79602c1f45c062a05a87c2 +size 33056 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/_manifestlilflags.ymf b/resources/dpemotes-master/stream/[Props]/Pride Props/_manifestlilflags.ymf new file mode 100644 index 000000000..def0e4c34 Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/Pride Props/_manifestlilflags.ymf differ diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/_manifestprideprops.ymf b/resources/dpemotes-master/stream/[Props]/Pride Props/_manifestprideprops.ymf new file mode 100644 index 000000000..7116df2b4 Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/Pride Props/_manifestprideprops.ymf differ diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilflags_ytyp.ytyp b/resources/dpemotes-master/stream/[Props]/Pride Props/lilflags_ytyp.ytyp new file mode 100644 index 000000000..18a8f586b Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/Pride Props/lilflags_ytyp.ytyp differ diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag1.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag1.ydr new file mode 100644 index 000000000..9961ae2e9 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag1.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abec5d0b0fb32f68aed6fe4f7e70e3b2d0f95ac17cf028349a9231b8c3110f1c +size 173731 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag2.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag2.ydr new file mode 100644 index 000000000..80e7cf5ff --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag2.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:872e7c40cbe9ee19c4999196d2161df17341ddd1aeb418d963bfd1297eeed537 +size 180571 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag3.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag3.ydr new file mode 100644 index 000000000..3b6dfe148 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag3.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffcbefd2c00e3094f6f7ae3e7486449afd2be8791c793b320f15089d028630e2 +size 173296 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag4.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag4.ydr new file mode 100644 index 000000000..5b5b006d6 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag4.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5aa6d9d46c3a7afa2c82ba11941622b2dadc93b55915b930e810a7b24bdca0d9 +size 173676 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag5.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag5.ydr new file mode 100644 index 000000000..a9cb55e84 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag5.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9894339446f09b13b88d3a56c5b734b5c29400ef6e384996f4c701cf350049bb +size 173039 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag6.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag6.ydr new file mode 100644 index 000000000..1ca90962f --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag6.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537a69a4ea2422b87e1ec9c44ca51af6b4c1c830e8a897aa6cedd2aa86325779 +size 173556 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag7.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag7.ydr new file mode 100644 index 000000000..638479c82 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag7.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e34a4115adaad3434afea11a5ff0b47c07e13d373f598da2770ddf21f06ce9e +size 173187 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag8.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag8.ydr new file mode 100644 index 000000000..d687f2b87 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag8.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82b9e66e77eb14555075fa77c0858e996de781674b6b1a1d2039d1cdac1dcfd6 +size 173561 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag9.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag9.ydr new file mode 100644 index 000000000..1e53b3d6f --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/lilprideflag9.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f80abff9d7f41f5a8df8549b2375c2a7095d150b6b0598f838ea25edfed7927e +size 177142 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/pride_sign_01.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/pride_sign_01.ydr new file mode 100644 index 000000000..3acd10be9 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/pride_sign_01.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a61487681b38e538b49641896230cadb2f4a45533d1170727cf9031d57bde8b +size 61490 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag1.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag1.ydr new file mode 100644 index 000000000..351977cd2 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag1.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3241aefd9b8c3d70d33c657f5fc2b0c8fbfcc2da311e17d2177dd958f7df71d +size 61859 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag2.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag2.ydr new file mode 100644 index 000000000..fbaabf965 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag2.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b241e1989c909a79b0aaba4cb1f0b747ebf12c0187255dba8bc589d2dbadb42 +size 56998 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag3.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag3.ydr new file mode 100644 index 000000000..48b0cbbe2 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag3.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d35090a649edeea6234d508481ec3a9ea0fe11e899630774b5f065a3c94d927 +size 52859 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag4.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag4.ydr new file mode 100644 index 000000000..0fc48851d --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag4.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a3c87711bc1a17ba880fec0d0a774a72e9596be8664aa6e00a0300bf6268f9e +size 53427 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag5.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag5.ydr new file mode 100644 index 000000000..08303044f --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag5.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:442a8681acf3ec3482995fbbf5d120c64e08349d7c70c7ed41595d3536aaa11c +size 53035 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag6.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag6.ydr new file mode 100644 index 000000000..b8dc0568a --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag6.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a9e0ad7cdc671d6b12a81a0302740ff65c5b78ed69ececa465ae4f0c009b057b +size 53500 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag7.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag7.ydr new file mode 100644 index 000000000..dfaf54dd9 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag7.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d417651cd1a247be8f61bf5822cd6b3fce2281070b078e256e402c648957f4e +size 53005 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag8.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag8.ydr new file mode 100644 index 000000000..fa7bcb636 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag8.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc7c0c3f31e7f842d3de4067e7fbe4f5fcb04f8e8e155dd256e0222a44f117e4 +size 53012 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag9.ydr b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag9.ydr new file mode 100644 index 000000000..51c406836 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Pride Props/prideflag9.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8594bae78af278554eac81c0937a1c42b0c2c24f22de46fbcd01888fad0a050d +size 55202 diff --git a/resources/dpemotes-master/stream/[Props]/Pride Props/prideprops_ytyp.ytyp b/resources/dpemotes-master/stream/[Props]/Pride Props/prideprops_ytyp.ytyp new file mode 100644 index 000000000..44c70060d Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/Pride Props/prideprops_ytyp.ytyp differ diff --git a/resources/dpemotes-master/stream/[Props]/Umbrella/p_amb_brolly_01.ydr b/resources/dpemotes-master/stream/[Props]/Umbrella/p_amb_brolly_01.ydr new file mode 100644 index 000000000..e00c174ec --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/Umbrella/p_amb_brolly_01.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:359f5b0bc023fa96b349f6676b54906be9fd3129cbd46cc0ade0072aa38fb3e7 +size 65045 diff --git a/resources/dpemotes-master/stream/[Props]/badge1/_manifest.ymf b/resources/dpemotes-master/stream/[Props]/badge1/_manifest.ymf new file mode 100644 index 000000000..4d5d00184 Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/badge1/_manifest.ymf differ diff --git a/resources/dpemotes-master/stream/[Props]/badge1/badge1.ytyp b/resources/dpemotes-master/stream/[Props]/badge1/badge1.ytyp new file mode 100644 index 000000000..c7d24462b Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/badge1/badge1.ytyp differ diff --git a/resources/dpemotes-master/stream/[Props]/badge1/prop_lspd_badge+hidr.ytd b/resources/dpemotes-master/stream/[Props]/badge1/prop_lspd_badge+hidr.ytd new file mode 100644 index 000000000..b6e89da8d --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/badge1/prop_lspd_badge+hidr.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f72e629cb58832d41a6f4ed24c0d28670a103cd9fbc615b21ea7d9d3420a34e4 +size 34420 diff --git a/resources/dpemotes-master/stream/[Props]/badge1/prop_lspd_badge.ydr b/resources/dpemotes-master/stream/[Props]/badge1/prop_lspd_badge.ydr new file mode 100644 index 000000000..bf3ea224d --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/badge1/prop_lspd_badge.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6739705b75136f72aaed00fa572e917c6b7096fca88b78400e2c1b5ad9b2452 +size 77072 diff --git a/resources/dpemotes-master/stream/[Props]/badge2/_manifest.ymf b/resources/dpemotes-master/stream/[Props]/badge2/_manifest.ymf new file mode 100644 index 000000000..4d5d00184 Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/badge2/_manifest.ymf differ diff --git a/resources/dpemotes-master/stream/[Props]/badge2/copbadge.ytyp b/resources/dpemotes-master/stream/[Props]/badge2/copbadge.ytyp new file mode 100644 index 000000000..7b2aa47d9 Binary files /dev/null and b/resources/dpemotes-master/stream/[Props]/badge2/copbadge.ytyp differ diff --git a/resources/dpemotes-master/stream/[Props]/badge2/prop_cop_badge+hidr.ytd b/resources/dpemotes-master/stream/[Props]/badge2/prop_cop_badge+hidr.ytd new file mode 100644 index 000000000..9f7650932 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/badge2/prop_cop_badge+hidr.ytd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:892fb7313bb6c4a6a6eba5ecce4ededb42b037f2fa81939f4c373e3188dbd975 +size 26836 diff --git a/resources/dpemotes-master/stream/[Props]/badge2/prop_cop_badge.ydr b/resources/dpemotes-master/stream/[Props]/badge2/prop_cop_badge.ydr new file mode 100644 index 000000000..a07ead0a9 --- /dev/null +++ b/resources/dpemotes-master/stream/[Props]/badge2/prop_cop_badge.ydr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5b626e4c755647215742eb3afd6164c05587260e541e647191850c19e9ac4e2 +size 61624 diff --git a/resources/dpemotes-master/version b/resources/dpemotes-master/version new file mode 100644 index 000000000..bea0d09c4 --- /dev/null +++ b/resources/dpemotes-master/version @@ -0,0 +1 @@ +207 \ No newline at end of file diff --git a/server.cfg b/server.cfg index 9f8e0fc69..f45051407 100644 --- a/server.cfg +++ b/server.cfg @@ -72,7 +72,7 @@ start Heli-Cam start Weaponry start StreetLabel start EGRP-HUD -start EmoteMenu +//start EmoteMenu start enhancedcamera start FiveM-Vote start Lightbars-Menu @@ -173,6 +173,7 @@ start EGRP-Notifications //start AI-Vehiclelock start firehose start firehook +start dpemotes-master #[-----Discord Perms-----] start discord_perms