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