Jump to content

[REL] Darhal's Gate System


darhal

Recommended Posts

Introduction :

Last time I upload mod text bar script and I don't get so much downloads so I decide to upload this script to community

this script allows you to create and use programmable doors/gates in-game

Script features :

- gate creator ingame /addgate modelID (For managers only)

- you can delete gate at any time using /delgate (For managers only)

- You can choose between a list of gates models not only one

- SQL saving system

- Much more....

How it work ? :

You can use /addgate modelID to add the gate ingame (Only managers)

A window will appear you add group name and movement type then click save/close button

Then use 2, 4, 6, 8 to move it and 7, 9, +, -, 1, 3 to rotate

if you find that's ok do /gsave to save it

To delete a gate just stand near it and do /delgate

Settings :

the resources is linked bt default to ahmedfef group system (download link below)

Also you can link it to your resource too to do that open s_settings.lua file and edit it (DETAILS ARE IN THE FILE)

Download Link :

Well the resource is compiled (So bad news) but the good news are if I get 300 downloads I will upload de-compiled version

Darhal Gate system : https://community.multitheftauto.com/in ... s&id=11866

Ahmedfef Group system :https://community.multitheftauto.com/index.php?p=resources&s=details&id=8036

Link to comment
  • 1 month later...
  • 1 year later...

script not working when i do /addgate 980 it wont give any error or didnot show anything and not add the gate too no panel appears and nothing happends..
 

it is c_setting...

--- GATE SYSTEM BY DARHAL ---

moveSpeed = 0.1 -- HOW MUCH GATE SHOULD MOVE WHEN CONTROLING IT
angleSpeed = 1 -- THE ROTATION SPEED WHEN ROTATING THE GATE
mvtValue = 7 -- THE DISTANCE THAT THE GATE MOVE WHEN SOMEONE IS NEARBY IT

it is s_Setting....

--- GATE SYSTEM BY DARHAL ---




--RESOURCE SETTINGS
--HERE CHANGE THE RESOURCE NAME TO THE GROUPS SYSTEM THAT YOU USE
local GROUPS_RESOURCE_NAME = "group-system" -- CHANGE THAT LINE TO YOUR GROUP SYSTEM NAME

miniDistance = 4 -- MINI DISTANCE WHEN U WANT TO DELETE THE GATE

function GPG(plr)
	if plr and getACC(plr) then
		return exports[GROUPS_RESOURCE_NAME]:getAccountGang(getACC(plr)) -- CHANGE THE  FUNCTION 'getAccountGang' TO YOUR GROUP RESOURCE FUNCTION THAT RETURN THE PLAYER GROUP FOR EG: getPlayerGroup
	end
end

-- GATE MANAGERS LIST (ACCOUNT NAME)
managers = { 
	--[[YOU CAN ADD ANY ACCOUNT BY SIMPLY ADDING THIS LINE : 
	"account name", 
	To the list above--]]
	"shashankrajput",
}

-- ALLOWED OBJECTS THAT MANAGERS CAN USE TO PLACE GATE
allowedModels = {
	980 , 
	967 ,
	16773 ,
	10829 ,
	10832,
	2990 ,
	2933 ,
	971 ,
	9042 ,
	8957,
	3089,
	2955 ,
	2947 ,
	2924 , 
	2911 , 
	1491 , 
	1504 ,
	1505 ,
	1507 , 
	1523 , 
	1557 , 
}


this is gate...

----Gate System By Omar(aka.Darhal)----
----       All Right Reserved      	---



local currentEditingGate
local controling
local label = {}
local movingDoor = {}
local movingDoorAccess = {}
local accGrpColumn

function centerWindow (center_window)
    local screenW, screenH = guiGetScreenSize()
    local windowW, windowH = guiGetSize(center_window, false)
    local x, y = (screenW - windowW) /2,(screenH - windowH) /2
    guiSetPosition(center_window, x, y, false)
end

function placeGate(model)
	local x, y, z = getElementPosition(localPlayer)
	local rx, ry, rz = getElementRotation(localPlayer)
	currentEditingGate = createObject(model, x+1, y+1, z, rx, ry, rz)
	addEventHandler("onClientKey", root, onClientKey)
	addEventHandler("onClientRender", root, controlGate)
	guiSetVisible(gateWindow, true)
	guiGridListClear(accessToOpenGrid)
	showCursor(true)
end
addEvent("CUPgates.placeGate", true)
addEventHandler("CUPgates.placeGate", root, placeGate)

function saveGateData()
	if currentEditingGate then
		local groups = movingDoorAccess[currentEditingGate]
		local mvtType = movingDoor[currentEditingGate]
		local x, y, z = getElementPosition(currentEditingGate)
		local rx, ry, rz = getElementRotation(currentEditingGate)
		triggerServerEvent("CUPgates.sendGateData", localPlayer, groups, mvtType, {x, y, z}, {rx, ry, rz}, getElementModel(currentEditingGate))
		movingDoorAccess[currentEditingGate] = nil
		movingDoor[currentEditingGate] = nil
		destroyElement(currentEditingGate)
		currentEditingGate = nil
	end
end
addCommandHandler("gsave", saveGateData)

function getPositionFromElementOffset(element,offX,offY,offZ)
    local m = getElementMatrix ( element )  -- Get the matrix
    local x = offX * m[1][1] + offY * m[2][1] + offZ * m[3][1] + m[4][1]  -- Apply transform
    local y = offX * m[1][2] + offY * m[2][2] + offZ * m[3][2] + m[4][2]
    local z = offX * m[1][3] + offY * m[2][3] + offZ * m[3][3] + m[4][3]
    return x, y, z                               -- Return the transformed point
end


function onClientKey(button, press)
	if press then
		pressedButton = button
	else
		pressedButton = nil
	end
end


addEventHandler("onClientResourceStart", resourceRoot,
    function()
        gateWindow = guiCreateWindow(288, 53, 260, 464, "CUP - Doors/Gates Management", false)
		centerWindow (gateWindow)
		guiWindowSetSizable(gateWindow, false)
		hideGUI(gateWindow) 
        saveGateData = guiCreateButton(149, 428, 100, 26, "Save/Close", false, gateWindow)
        mvtLeft = guiCreateRadioButton(10, 47, 251, 18, "Move to left", false, gateWindow)
        mvtRight = guiCreateRadioButton(10, 71, 250, 18, "Move to right", false, gateWindow)
        mvtUp = guiCreateRadioButton(9, 95, 251, 18, "Move upside", false, gateWindow)
        mvtDown = guiCreateRadioButton(9, 123, 251, 18, "Move down", false, gateWindow)
        label[1] = guiCreateLabel(10, 26, 268, 15, "Possible gate/door moves :", false, gateWindow)
        label[2] = guiCreateLabel(15, 145, 263, 18, "Door/Gate access management :", false, gateWindow)
        accessToOpenGrid = guiCreateGridList(10, 180, 238, 189, false, gateWindow)
		accGrpColumn = guiGridListAddColumn(accessToOpenGrid, "Group", 0.9)
        accGrpEdit = guiCreateEdit(10, 393, 135, 26, "", false, gateWindow)
        addToAccessListBtn = guiCreateButton(149, 392, 94, 26, "Add", false, gateWindow)
        removeFromAccessListBtn = guiCreateButton(10, 428, 129, 26, "Remove", false, gateWindow)
        label[3] = guiCreateLabel(10, 374, 233, 18, "GROUP NAME:", false, gateWindow)    
		
		addEventHandler("onClientGUIClick", saveGateData, closeDoorGUI, false)
		addEventHandler("onClientGUIClick", addToAccessListBtn, addToAccessList, false)
		addEventHandler("onClientGUIClick", removeFromAccessListBtn, removeFromAccessList, false)
    end
)

function addToAccessList()
	local accountOrGroup = guiGetText(accGrpEdit)
	local givenAccessType = "Group"
	if accGrpEdit and accGrpEdit ~= "" then
		if not movingDoorAccess[currentEditingGate] then movingDoorAccess[currentEditingGate] = {}  end
		for i, v in pairs(movingDoorAccess[currentEditingGate]) do
			if v.accGrp == accountOrGroup then
				exports.CUPtexts:output("This "..givenAccessType.." name ("..accountOrGroup..") already exsit in the list !", 255, 0, 0)
				return
			end
		end
		table.insert(movingDoorAccess[currentEditingGate], {accGrp=accountOrGroup})
		updateDoorAccessGrid()
	end
end

function hideGUI(wnd)
	guiSetVisible(wnd, false)
end

function closeDoorGUI() 
	local mvtType
	if guiRadioButtonGetSelected(mvtLeft) then
		mvtType = "mvtLeft"
	elseif guiRadioButtonGetSelected(mvtRight) then
		mvtType = "mvtRight"
	elseif guiRadioButtonGetSelected(mvtUp) then
		mvtType = "mvtUp"
	elseif guiRadioButtonGetSelected(mvtDown) then
		mvtType = "mvtDown"
	end
	local x, y, z = getElementPosition(currentEditingGate)
	local radius
	mvtValue = 7
	movingDoor[currentEditingGate] = mvtType
	hideGUI(gateWindow) 
	showCursor(false) 
end

function updateDoorAccessGrid()
	if movingDoorAccess[currentEditingGate] then
		guiGridListClear(accessToOpenGrid)
		for i, v in pairs(movingDoorAccess[currentEditingGate]) do
			local row = guiGridListAddRow ( accessToOpenGrid )
			guiGridListSetItemText ( accessToOpenGrid, row, accGrpColumn, v.accGrp, false, false)
		end
	end
end

function removeFromAccessList(button)
	if button ~= "left" then return end
    local row = guiGridListGetSelectedItem(accessToOpenGrid)
    if (not row or row == -1) then return end
	local accGrp = guiGridListGetItemText(accessToOpenGrid, row, accGrpColumn)
	for i, v in pairs(movingDoorAccess[currentEditingGate]) do
		if v.accGrp == accGrp then
			table.remove(movingDoorAccess[currentEditingGate], i)
			updateDoorAccessGrid()
			return
		end
	end
end

function getGateCorrectMVT(mvtType, id, door)
	local nx, ny, nz
	if mvtType == "mvtRight" then
		nx, ny, nz = getPositionFromElementOffset(door,0-mvtValue,0,0)
	elseif mvtType == "mvtLeft" then
		nx, ny, nz = getPositionFromElementOffset(door,mvtValue,0,0)
	elseif mvtType == "mvtUp" then
		nx, ny, nz = getPositionFromElementOffset(door,0, 0, 0-mvtValue)
	elseif mvtType == "mvtDown" then
		nx, ny, nz = getPositionFromElementOffset(door,0,0,mvtValue)
	end
	moveObject(door, 1000, nx, ny, nz)
end
addEvent("CUPgates.moveGate", true)
addEventHandler("CUPgates.moveGate", root, getGateCorrectMVT)

function getGateCorrectMVT(pos, id, door)
	local nx, ny, nz = pos[1], pos[2], pos[3]
	moveObject(door, 1000, nx, ny, nz)
	setTimer(setElementData, 1000, 1, door, "gateIsMoving", false)
end
addEvent("CUPgates.moveGateBack", true)
addEventHandler("CUPgates.moveGateBack", root, getGateCorrectMVT)

function controlGate()
	for k, v in ipairs(getElementsByType("gui-window", resourceRoot)) do
		if (guiGetVisible(v)) then
			return
		end
	end
	if isChatBoxInputActive () or not isElement(currentEditingGate) then return end
    local camera = getCamera ()
	if not currentEditingGate or not (camera) then return end
    local cameraX,cameraY,cameraZ = getElementPosition(camera)
    local objectX,objectY,objectZ = getElementPosition(currentEditingGate)
    local x,y,z
    if pressedButton == "num_8" then      
        x,y,z = getPositionFromElementOffset(camera,0,moveSpeed,0)
		controling = true
		cameraZ = z
    elseif pressedButton == "num_2" then      
        x,y,z = getPositionFromElementOffset(camera,0,0-moveSpeed,0)
		controling = true
		cameraZ = z
    elseif pressedButton == "num_6" then  
        x,y,z = getPositionFromElementOffset(camera,moveSpeed,0,0)
		controling = true
		cameraZ = z
    elseif pressedButton == "num_4" then  
        x,y,z = getPositionFromElementOffset(camera,0-moveSpeed,0,0)
		controling = true
		cameraZ = z
    elseif pressedButton == "pgup" then
        x,y,z = getPositionFromElementOffset(camera,0,0, moveSpeed)
		controling = true
    elseif pressedButton == "pgdn" then
        x,y,z = getPositionFromElementOffset(camera,0,0, 0-moveSpeed)
		controling = true
	elseif pressedButton == "num_add" then	
		rx, ry, rz = getElementRotation(currentEditingGate)
		setElementRotation(currentEditingGate, rx, ry, rz+angleSpeed)
		controling = true
	elseif pressedButton == "num_sub" then	
		rx, ry, rz = getElementRotation(currentEditingGate)
		setElementRotation(currentEditingGate, rx, ry, rz-angleSpeed)
		controling = true
	elseif pressedButton == "num_7" then	
		rx, ry, rz = getElementRotation(currentEditingGate)
		setElementRotation(currentEditingGate, rx+angleSpeed, ry, rz)
		controling = true
	elseif pressedButton == "num_9" then	
		rx, ry, rz = getElementRotation(currentEditingGate)
		setElementRotation(currentEditingGate, rx-angleSpeed, ry, rz)
		controling = true
	elseif pressedButton == "num_1" then	
		rx, ry, rz = getElementRotation(currentEditingGate)
		setElementRotation(currentEditingGate, rx, ry+angleSpeed, rz)
		controling = true
	elseif pressedButton == "num_3" then	
		rx, ry, rz = getElementRotation(currentEditingGate)
		setElementRotation(currentEditingGate, rx, ry-angleSpeed, rz)
		controling = true
	else 
		controling = false
	end
    if x then
        setElementPosition(currentEditingGate, objectX+(x-cameraX),objectY+(y-cameraY),objectZ+(z-cameraZ))
	end
end

this is s_gate...

----Gate System By Omar(aka.Darhal)----
----       All Right Reserved      	---


--RESOURCE VARRIABLES
local gates = {}
local lastGatePos = {}


-----SQL FUNCTIONS-----

local DB_LOCATION = ":/gates.db" -- The location where the database file is stored default is ":/gates.db" (<MTA installation>/server/mods/deathmatch/databases/global) Just copy gates.db to there and it will work fine
dbc = dbConnect("sqlite", DB_LOCATION) -- To use MySQL you'll only need to change just this line.
dbExec(dbc, "CREATE TABLE IF NOT EXISTS gates (pos TEXT, rot TEXT, model INT, groups TEXT, mvt TEXT)")

function onStop()
	dbExec(dbc, "DELETE FROM gates")
	for i, v in pairs(gates) do
		local x, y, z = v.pos[1], v.pos[2],v.pos[3]
		local rx, ry, rz = v.rot[1], v.rot[2],v.rot[3]
		local pos = x..", "..y..", "..z
		local rot =  rx..", "..ry..", "..rz
		local groupsJSON = toJSON (v.groups)
		dbExec ( dbc, "INSERT INTO gates (pos, rot, model, groups, mvt)  VALUES ( ?, ?, ?, ?, ?)", pos, rot, getElementModel(v.gate), groupsJSON, v.mvt)
	end
end
addEventHandler("onResourceStop", resourceRoot, onStop)

function onStart()
	local mnew = dbQuery ( dbc, "SELECT * FROM gates")
	local mresult = dbPoll ( mnew, - 1 )
	for i, v in pairs(mresult) do
		local x, y, z = unpack(split(v.pos, ","))
		local rx, ry, rz = unpack(split(v.rot, ","))
		local groups = fromJSON(v.groups)
		local cordTbl = {x, y, z}
		local rotTbl = {rx, ry, rz}
		createGate(cordTbl, rotTbl, groups, v.mvt, v.model)
	end
end
addEventHandler("onResourceStart", resourceRoot, onStart)

--------CORE-----------
-----------------------
--    MAIN SCRIPT    --

function getACC(plr)
	if plr and isElement(plr) then
		return getAccountName(getPlayerAccount(plr)) or nil
	end
end

function reciveDataAndCreateGtae(groups, mvtType, pos, rot, model)
	createGate(pos, rot, groups,mvtType,model)
end
addEvent("CUPgates.sendGateData", true)
addEventHandler("CUPgates.sendGateData", root, reciveDataAndCreateGtae)

function createGate(cordTbl, rotTbl, groups, mvt, model)
	local gate = createObject(model, cordTbl[1], cordTbl[2], cordTbl[3], rotTbl[1], rotTbl[2], rotTbl[3])
	local marker = createMarker (cordTbl[1], cordTbl[2], cordTbl[3] , "cylinder", 4.0, 0, 0, 0, 0)
	setElementData(gate, "gateIsMoving", false)
	table.insert(gates, {gate=gate, marker=marker, pos=cordTbl, rot=rotTbl, groups=groups, mvt=mvt})
	addEventHandler("onMarkerHit", marker, openGate)
	addEventHandler("onMarkerLeave", marker, closeGate)
end

function closeGate(plr, sdim)
	if plr and getElementType(plr) == "player" and sdim then
		for i=1, #gates do
			if gates[i].marker == source and getElementData(gates[i].gate, "gateIsMoving") then
				triggerClientEvent("CUPgates.moveGateBack", plr, lastGatePos[gates[i].gate], i, gates[i].gate)
				break
			end
		end
	end
end

function openGate(plr, sdim)
	if plr and getElementType(plr) == "player" and sdim then
		for i=1, #gates do
			if gates[i].marker == source and not getElementData(gates[i].gate, "gateIsMoving") then
				for k, group in pairs( gates[i].groups) do
					if group.accGrp == GPG(plr) then
						setElementData(gates[i].gate, "gateIsMoving", true)
						local x, y, z = getElementPosition(gates[i].gate)
						lastGatePos[gates[i].gate] = {x, y, z}
						triggerClientEvent("CUPgates.moveGate", plr, gates[i].mvt, i, gates[i].gate)
						break
					end
				end
				break
			end
		end
	end
end

function toggleGateDelete(plr, cmd)
	if plr then
		local access = false
		for i=1, #managers do
			if managers[i] == getACC(plr) then
				access = true
				--triggerClientEvent(plr, "CUPgates.placeGate", plr)
			end
		end
		if access  then
			for i, v in pairs(gates) do
				local gx, gy, gz = getElementPosition(v.gate)
				local x, y, z = getElementPosition(plr)
				if getDistanceBetweenPoints3D ( gx, gy, gz, x, y, z ) < miniDistance then
					destroyElement(v.gate)
					destroyElement(v.marker)
					table.remove(gates, i)
					break
				end
			end
		end
	end
end
addCommandHandler("delgate", toggleGateDelete)

function toggleGateCreation(plr, cmd, model)
	if plr then
		local access = false
		for i=1, #managers do
			if managers[i] == getACC(plr) then
				access = true
				--triggerClientEvent(plr, "CUPgates.placeGate", plr)
			end
		end
		if access  then
			bool = false
			for i=1, #allowedModels do
				if allowedModels[i] == tonumber(model) then
					bool = true
				end
			end	
			if bool then
				triggerClientEvent(plr, "CUPgates.placeGate", plr, tonumber(model))
			else
				outputChatBox("Invalid Gate ID ! ", plr, 255, 0, 0)
			end
		end
	end
end
addCommandHandler("addgate", toggleGateCreation)

 

Edited by Blackhat1264
Link to comment
  • 2 months later...
  • 2 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...