From a284a69e98269cfc1900beb48ab63917a48f8926 Mon Sep 17 00:00:00 2001 From: ChronosX88 Date: Mon, 6 Jan 2020 22:33:35 +0400 Subject: [PATCH] Implement basic team/skin selection and spawning player on team base --- .vscode/settings.json | 38 ++++++++++ client.lua | 171 ++++++++++++++++++++++++++++++++++++++++++ enums.lua | 5 ++ gui/dxbutton.lua | 63 ++++++++++++++++ meta.xml | 11 +++ server.lua | 43 +++++++++++ team.lua | 6 ++ util/class.lua | 43 +++++++++++ util/color.lua | 44 +++++++++++ 9 files changed, 424 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 client.lua create mode 100644 enums.lua create mode 100644 gui/dxbutton.lua create mode 100644 meta.xml create mode 100644 server.lua create mode 100644 team.lua create mode 100644 util/class.lua create mode 100644 util/color.lua diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..74e1084 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,38 @@ +{ + "Lua.diagnostics.globals": [ + "addEventHandler", + "getRootElement", + "outputChatBox", + "source", + "spawnPlayer", + "setCameraMatrix", + "fadeCamera", + "toggleAllControls", + "showCursor", + "setPlayerHudComponentVisible", + "guiGetScreenSize", + "root", + "dxDrawText", + "dxDrawRectangle", + "tocolor", + "guiCreateLabel", + "resourceRoot", + "guiGetText", + "guiSetAlpha", + "bitExtract", + "destroyElement", + "removeEventHandler", + "outputDebugString", + "addEvent", + "triggerClientEvent", + "aclGetGroup", + "aclGroupAddObject", + "setElementModel", + "localPlayer", + "bindKey", + "setCameraTarget" + ], + "Lua.diagnostics.disable": [ + "lowercase-global" + ] +} diff --git a/client.lua b/client.lua new file mode 100644 index 0000000..59c0962 --- /dev/null +++ b/client.lua @@ -0,0 +1,171 @@ +local screenW, screenH = guiGetScreenSize() + +SkinSelectionMenu = class(function(menu) + menu.isTeamFull = false + menu.policeSkins = {280, 281, 282, 283, 284, 285, 288, 265, 266, 267} + menu.secretServiceSkins = {163, 164, 165, 166, 194} + menu.terroristsSkins = {124, 125, 126, 127, 111, 112} + menu._selectSecretService = function() + menu.teamSelected = Teams.SECRET_SERVICE + setElementModel(localPlayer, menu.secretServiceSkins[1]) + menu._currentSkinIndex = 1 + menu._currentSkinArray = menu.secretServiceSkins + end + menu._selectPolice = function() + menu.teamSelected = Teams.POLICE + setElementModel(localPlayer, menu.policeSkins[1]) + menu._currentSkinIndex = 1 + menu._currentSkinArray = menu.policeSkins + end + menu._selectTerrorists = function() + menu.teamSelected = Teams.TERRORISTS + setElementModel(localPlayer, menu.terroristsSkins[1]) + menu._currentSkinIndex = 1 + menu._currentSkinArray = menu.terroristsSkins + end +end) + +function SkinSelectionMenu:showSkinSelectionDxLabels() + dxDrawText("Protect The President", (screenW * 0.2870) - 1, (screenH * 0.0528) - 1, (screenW * 0.6734) - 1, (screenH * 0.1176) - 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Protect The President", (screenW * 0.2870) + 1, (screenH * 0.0528) - 1, (screenW * 0.6734) + 1, (screenH * 0.1176) - 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Protect The President", (screenW * 0.2870) - 1, (screenH * 0.0528) + 1, (screenW * 0.6734) - 1, (screenH * 0.1176) + 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Protect The President", (screenW * 0.2870) + 1, (screenH * 0.0528) + 1, (screenW * 0.6734) + 1, (screenH * 0.1176) + 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Protect The President", screenW * 0.2870, screenH * 0.0528, screenW * 0.6734, screenH * 0.1176, tocolor(255, 255, 255, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + + dxDrawText("Select the team:", (screenW * 0.0896) - 1, (screenH * 0.2685) - 1, (screenW * 0.3693) - 1, (screenH * 0.3250) - 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Select the team:", (screenW * 0.0896) + 1, (screenH * 0.2685) - 1, (screenW * 0.3693) + 1, (screenH * 0.3250) - 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Select the team:", (screenW * 0.0896) - 1, (screenH * 0.2685) + 1, (screenW * 0.3693) - 1, (screenH * 0.3250) + 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Select the team:", (screenW * 0.0896) + 1, (screenH * 0.2685) + 1, (screenW * 0.3693) + 1, (screenH * 0.3250) + 1, tocolor(0, 0, 0, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + dxDrawText("Select the team:", screenW * 0.0896, screenH * 0.2685, screenW * 0.3693, screenH * 0.3250, tocolor(255, 255, 255, 255), 2.00, "bankgothic", "left", "top", false, false, false, false, false) + + dxDrawText("You can change skin via left & right arrow buttons. When you are done - click Space", screenW * 0.3089, screenH * 0.8111, screenW * 0.6896, screenH * 0.9185, tocolor(255, 255, 255, 255), 3.00, "arial", "left", "top", false, true, false, false, false) + if self.isTeamFull then + dxDrawText("Team is full!", (screenW * 0.6896) + 1, (screenH * 0.5630) + 1, (screenW * 0.7984) + 1, (screenH * 0.6139) + 1, tocolor(0, 0, 0, 255), 3.00, "arial", "left", "top", false, false, false, false, false) + dxDrawText("Team is full!", screenW * 0.6896, screenH * 0.5630, screenW * 0.7984, screenH * 0.6139, tocolor(241, 6, 0, 254), 3.00, "arial", "left", "top", false, false, false, false, false) + end +end + +function SkinSelectionMenu:showSkinSelectionButtons() + self.secretServiceTeamButton = DxButton( + "secret_service", + 0.0896, + 0.3574, + 0.2786, + 0.0481, + tocolor(29, 253, 0, 200), + "Secret Service", + "pricedown", + 2.0, + tocolor(255, 255, 255, 255), + true, + self._selectSecretService + ) + + self.policeTeamButton = DxButton( + "police", + 0.0891, + 0.4278, + 0.2792, + 0.0454, + tocolor(0, 23, 252, 200), + "Police", + "pricedown", + 2.0, + tocolor(255, 255, 255, 255), + true, + self._selectPolice + ) + + self.terroristsTeamButton = DxButton( + "terrorists", + 0.0891, + 0.4917, + 0.2792, + 0.0472, + tocolor(251, 0, 0, 200), + "Terrorists", + "pricedown", + 2.0, + tocolor(255, 255, 255, 255), + true, + self._selectTerrorists + ) + + self.secretServiceTeamButton:show() + self.policeTeamButton:show() + self.terroristsTeamButton:show() +end + +function SkinSelectionMenu:hideSkinSelectionButtons() + self.secretServiceTeamButton:hide() + self.policeTeamButton:hide() + self.terroristsTeamButton:hide() +end + +function SkinSelectionMenu:switchSkin(key) + if not self.teamSelected then + outputChatBox("Please select the team!") + return + end + if key == "arrow_r" then + if self._currentSkinIndex + 1 > #self._currentSkinArray then + self._currentSkinIndex = 1 + setElementModel(localPlayer, self._currentSkinArray[self._currentSkinIndex]) + return + else + self._currentSkinIndex = self._currentSkinIndex + 1 + setElementModel(localPlayer, self._currentSkinArray[self._currentSkinIndex]) + return + end + elseif key == "arrow_l" then + if self._currentSkinIndex - 1 < 1 then + self._currentSkinIndex = #self._currentSkinArray + setElementModel(localPlayer, self._currentSkinArray[self._currentSkinIndex]) + return + else + self._currentSkinIndex = self._currentSkinIndex - 1 + setElementModel(localPlayer, self._currentSkinArray[self._currentSkinIndex]) + return + end + end +end + +local function selectTeamAndSpawn(team, skin) + triggerServerEvent("onPlayerTeamSelected", localPlayer, team, skin) +end + +addEventHandler("onClientResourceStart", resourceRoot, function() + skinSelectionMenu = SkinSelectionMenu() + skinSelectionMenu:showSkinSelectionButtons() + skinSelectionMenu._showLabels = function() + skinSelectionMenu:showSkinSelectionDxLabels() + end + skinSelectionMenu._switchSkin = function(key) + skinSelectionMenu:switchSkin(key) + end + bindKey("arrow_l", "down", skinSelectionMenu._switchSkin) + bindKey("arrow_r", "down", skinSelectionMenu._switchSkin) + addEventHandler("onClientRender", root, skinSelectionMenu._showLabels) + function _selectTeamAndSpawn() + selectTeamAndSpawn(skinSelectionMenu.teamSelected, skinSelectionMenu._currentSkinArray[skinSelectionMenu._currentSkinIndex]) + end + bindKey("space", "down", _selectTeamAndSpawn) + skinSelectionMenu._selectSecretService() +end) + +addEvent("onPlayerTeamFull", true) +addEventHandler("onPlayerTeamFull", root, function() + skinSelectionMenu.isTeamFull = true + setTimer(function() + skinSelectionMenu.isTeamFull = false + end, 2000, 1) +end) + +addEvent("onPlayerTeamSelectedSuccessful", true) +addEventHandler("onPlayerTeamSelectedSuccessful", root, function() + unbindKey("arrow_l", "down", skinSelectionMenu._switchSkin) + unbindKey("arrow_r", "down", skinSelectionMenu._switchSkin) + unbindKey("space", "down", _selectTeamAndSpawn) + removeEventHandler("onClientRender", root, skinSelectionMenu._showLabels) + skinSelectionMenu:hideSkinSelectionButtons() +end) \ No newline at end of file diff --git a/enums.lua b/enums.lua new file mode 100644 index 0000000..01f34b6 --- /dev/null +++ b/enums.lua @@ -0,0 +1,5 @@ +Teams = { + SECRET_SERVICE = "secret_service", + POLICE = "police", + TERRORISTS = "terrorists" +} \ No newline at end of file diff --git a/gui/dxbutton.lua b/gui/dxbutton.lua new file mode 100644 index 0000000..14471f0 --- /dev/null +++ b/gui/dxbutton.lua @@ -0,0 +1,63 @@ +DxButton = class(function(button, button_id, startX, startY, width, height, bgColor, text, textFont, textScale, textColor, textShadowEnabled, onClickHandler) + local screenW, screenH = guiGetScreenSize() + button.button_id = button_id + button.startX = startX * screenW + button.startY = startY * screenH + button.width = width * screenW + button.height = height * screenH + button.bgColor = bgColor + button.text = text + button.textFont = textFont + button.textScale = textScale + button.textColor = textColor + button.textShadowEnabled = textShadowEnabled + button.onClickHandler = onClickHandler +end) + +function DxButton:show() + --self._invisibleLabel = guiCreateLabel(0.09, 0.36, 0.28, 0.05, self.button_id, true) + self._invisibleLabel = guiCreateLabel(self.startX, self.startY, self.width, self.height, self.button_id, false) + guiSetAlpha(self._invisibleLabel, 0.0) + + self._drawButton = function() + dxDrawRectangle(self.startX, self.startY, self.width, self.height, self.bgColor) + if self._currentButtonUnderCursor then + local red, green, blue, alpha = extractRgbFromColor(self.bgColor) + local lightRed, lightGreen, lightBlue = shadeColor(red, green, blue, 20) + dxDrawRectangle(self.startX, self.startY, self.width, self.height, tocolor(lightRed, lightGreen, lightBlue, alpha)) + end + if self.textShadowEnabled then + dxDrawText(self.text, self.startX + 1, self.startY + 1, self.width + 1, self.height + 1, tocolor(0, 0, 0, 255), self.textScale, self.textFont, "left", "top", false, false, false, false, false) + end + dxDrawText(self.text, self.startX, self.startY, self.width, self.height, self.textColor, self.textScale, self.textFont, "left", "top", false, false, false, false, false) + end + + self._handleMouseOverButton = function() + if guiGetText(source) == self.button_id then + self._currentButtonUnderCursor = true + end + end + + self._handleMouseLeaveButtonRectangle = function() + self._currentButtonUnderCursor = false + end + + self._handleClickOnLabel = function() + if guiGetText(source) == self.button_id then + self.onClickHandler() + end + end + + addEventHandler("onClientRender", root, self._drawButton) + addEventHandler("onClientMouseEnter", root, self._handleMouseOverButton) + addEventHandler("onClientMouseLeave", root, self._handleMouseLeaveButtonRectangle) + addEventHandler("onClientGUIClick", root, self._handleClickOnLabel) +end + +function DxButton:hide() + destroyElement(self._invisibleLabel) + removeEventHandler("onClientRender", root, self._drawButton) + removeEventHandler("onClientMouseEnter", root, self._handleMouseOverButton) + removeEventHandler("onClientMouseLeave", root, self._handleMouseLeaveButtonRectangle) + removeEventHandler("onClientGUIClick", root, self._handleClickOnLabel) +end \ No newline at end of file diff --git a/meta.xml b/meta.xml new file mode 100644 index 0000000..d2ea51e --- /dev/null +++ b/meta.xml @@ -0,0 +1,11 @@ + + +