Cindy Posted February 3, 2017 Share Posted February 3, 2017 Hi I need help for a system I would like that instead of all the required components such as: wooden wooden wood it is necessary to have only 10 wooden stack for each of the objects Its a system open source. Server.lua : Quote --[[ Author: CiBeR Version: 0.1 Copyright: DayZ Gamemode. All rights reserved to Developers Info: MTA:DayZ Base Creation Addon Current Devs: Lawliet, CiBeR, Jboy, Remi, Renkon ]]-- local db local count = 0 local DoorsTable = {} function onStart() if not fileExists("db/bases.db") then local h = fileCreate("db/bases.db") if h then fileClose(h) outputDebugString("[DayZ] Bases database not found, creating...") end db = dbConnect( "sqlite", "db/bases.db" ) outputDebugString("[DayZ] Inserting tables into database...") dbExec(db, "CREATE TABLE IF NOT EXISTS base_objects(id INT AUTO_INCREMENT, model INT, owner VARCHAR, x FLOAT, y FLOAT, z FLOAT, rx FLOAT, ry FLOAT, rz FLOAT, health FLOAT, encampment VARCHAR)") outputDebugString("[DayZ] Tables inserted.") else db = dbConnect( "sqlite", "db/bases.db" ) local qh = dbQuery( db, "SELECT * FROM base_objects" ) local result = dbPoll( qh, 10000 ) for i, ob in ipairs(result) do local tOb = createObject(ob['model'], ob['x'], ob['y'], ob['z'], ob['rx'], ob['ry'], ob['rz']) setTimer(function() if ob['health'] > 0 then triggerClientEvent("setTheObjectUnbreakable",root,tOb) end end,1000,1,tOb) setElementData(tOb, "bc.creator", ob['owner']) setElementData(tOb, "bc.ID", ob['id']) if ob['model'] == 3093 or ob['model'] == 3029 then setupDoor(tOb,ob['encampment']) end setElementData(tOb,"object.health",ob['health']) if getElementData(tOb,"object.health") <= 0 then if getElementData(tOb,"parent") then destroyElement(getElementData(tOb,"parent")) end destroyElement(tOb) end count = count + 1 end outputDebugString("[DayZ] Base objects loaded. TOTAL: "..tostring(count)) end end addEventHandler("onResourceStart", resourceRoot, onStart) function newObject(model,x,y,z,rx,ry,rz,health) if model and x and y and z and rx and ry and rz then local ob = createObject(model, x, y, z, rx, ry, rz) local acName = getAccountName(getPlayerAccount(client)) setElementData(ob, "bc.creator", acName) setElementData(ob,"object.health",health) triggerClientEvent("setTheObjectUnbreakable",root,ob) local encampment = getElementData(client,"Group") if model == 3093 or model == 3029 then setupDoor(ob,encampment) end if ob then local x,y,z = getElementPosition(ob) local rx,ry,rz = getElementRotation(ob) local model = getElementModel(ob) count = count+1 dbExec(db, "INSERT INTO base_objects VALUES (?,?,?,?,?,?,?,?,?,?,?)", count, model, acName, x, y, z, rx, ry, rz, health, tostring(encampment)) end end end addEvent("addon.basecreator:newObject", true) addEventHandler("addon.basecreator:newObject", root, newObject) function onObjectDamage(object,health,id) if object then dbExec(db,'UPDATE base_objects SET health=? WHERE id=?',health,id) end end addEvent("onObjectDamage",true) addEventHandler("onObjectDamage",root,onObjectDamage) function onObjectDestroy(object,id) if object then dbExec(db,"DELETE FROM base_objects WHERE id=?",id) if getElementData(object,"parent") then destroyElement(getElementData(object,"parent")) end destroyElement(object) count = count-1 end end addEvent("onObjectDestroy",true) addEventHandler("onObjectDestroy",root,onObjectDestroy) function setupDoor(object,encampment) local x,y,z = getElementPosition(object) local rx,ry,rz = getElementRotation(object) local col = createColSphere(x,y,z,2) setElementData(object,"parent",col) setElementData(col,"parent",object) DoorsTable[col] = {pos = {x = x,y = y,z = z}, rot= {x = rx,y = ry,z = rz}, col = col, camp = encampment, door = object} end function closeDoorForReal(doorCol) local data = DoorsTable[doorCol] setElementRotation(data.door,data.rot.x,data.rot.y,data.rot.z) end function closeDoor(doorCol) local data = DoorsTable[doorCol] moveObject(data.door,2000,data.pos.x,data.pos.y,data.pos.z,0,0,-90) setTimer(closeDoorForReal,2050,1,doorCol) end function openDoor(hitElement) local data = DoorsTable[source] if data == nil then return end local rx,ry,rz=getElementRotation(data["door"]) if getElementData(hitElement,"Group") == data["camp"] or data.camp == "false" or not data["camp"] then moveObject(data["door"],2000,data.pos.x,data.pos.y,data.pos.z,0,0,90) setTimer(closeDoor,5000,1,source) end end addEventHandler("onColShapeHit",resourceRoot,openDoor) Client.lua : Quote --[[ Author: CiBeR Version: 0.1 Copyright: DayZ Gamemode. All rights reserved to Developers Info: MTA:DayZ Base Creation Addon Current Devs: Lawliet, CiBeR, Jboy, Remi, Renkon ]]-- baseCPanel = { edit = {}, button = {}, window = {}, label = {}, column = {}, gridlist = {}, tabpanel = {}, tab = {}, } objectTable = { -- Hatchet is a dummy item, in case you need less parts than expected -- DIY (Wood) or DIY (Metal) must always be the first item that is needed {"Wooden Base", 3260, 30, "Wood", "DIY (Wood)","Log","Stone","Hatchet",1,1,2,0}, {"Wood Fence", 1460, 30, "Wood", "DIY (Wood)", "Log","Stone","Hatchet",1,1,1,0}, {"Wooden Door", 3093, 30, "Wood", "DIY (Wood)", "Log", "Stone","Hatchet",1,1,1,0}, {"Wood Structure", 16404, 30, "Wood", "DIY (Wood)", "Log", "Plank", "Nails",1,1,3,5}, {"Metal Fence", 1412, 100, "Metal", "DIY (Metal)","RSJ","Stone","Hatchet",1,1,2,0}, {"Metal Door", 3029, 100, "Metal", "DIY (Metal)","RSJ","Nails","Hatchet",1,2,2,0}, {"Shack", 1457, 100, "Metal", "DIY (Metal)","Metal Sheet (Rusted)","Plank","Hatchet",1,2,2,0} } function render() baseCPanel.window[1] = guiCreateWindow(0.00, 0.37, 0.57, 0.61, "", true) guiWindowSetSizable(baseCPanel.window[1], false) guiSetVisible(baseCPanel.window[1], false) baseCPanel.tabpanel[1] = guiCreateTabPanel(0.03, 0.07, 0.95, 0.90, true, baseCPanel.window[1]) baseCPanel.tab[1] = guiCreateTab("Wood", baseCPanel.tabpanel[1]) baseCPanel.gridlist[1] = guiCreateGridList(0.01, 0.03, 0.36, 0.94, true, baseCPanel.tab[1]) baseCPanel.column[1] = guiGridListAddColumn(baseCPanel.gridlist[1], "Item", 0.9) baseCPanel.label[1] = guiCreateLabel(0.39, 0.04, 0.25, 0.06, "Item:", true, baseCPanel.tab[1]) baseCPanel.label[2] = guiCreateLabel(0.39, 0.10, 0.25, 0.06, "Durability:", true, baseCPanel.tab[1]) baseCPanel.label[3] = guiCreateLabel(0.59, 0.04, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[4] = guiCreateLabel(0.59, 0.10, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[5] = guiCreateLabel(0.39, 0.16, 0.25, 0.06, "Requires:", true, baseCPanel.tab[1]) baseCPanel.label[6] = guiCreateLabel(0.39, 0.22, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[7] = guiCreateLabel(0.39, 0.28, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[8] = guiCreateLabel(0.39, 0.34, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[9] = guiCreateLabel(0.39, 0.40, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[10] = guiCreateLabel(0.39, 0.46, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[11] = guiCreateLabel(0.39, 0.52, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.label[12] = guiCreateLabel(0.39, 0.68, 0.25, 0.06, "", true, baseCPanel.tab[1]) baseCPanel.button[1] = guiCreateButton(0.86, 0.88, 0.12, 0.08, "Place", true, baseCPanel.tab[1]) baseCPanel.tab[2] = guiCreateTab("Metal", baseCPanel.tabpanel[1]) baseCPanel.gridlist[2] = guiCreateGridList(0.01, 0.03, 0.36, 0.94, true, baseCPanel.tab[2]) baseCPanel.column[2] = guiGridListAddColumn(baseCPanel.gridlist[2], "Item", 0.9) baseCPanel.label[13] = guiCreateLabel(0.39, 0.04, 0.25, 0.06, "Item:", true, baseCPanel.tab[2]) baseCPanel.label[14] = guiCreateLabel(0.39, 0.10, 0.25, 0.06, "Durability:", true, baseCPanel.tab[2]) baseCPanel.label[15] = guiCreateLabel(0.59, 0.04, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[16] = guiCreateLabel(0.59, 0.10, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[17] = guiCreateLabel(0.39, 0.16, 0.25, 0.06, "Requires:", true, baseCPanel.tab[2]) baseCPanel.label[18] = guiCreateLabel(0.39, 0.22, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[19] = guiCreateLabel(0.39, 0.29, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[20] = guiCreateLabel(0.39, 0.35, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[21] = guiCreateLabel(0.39, 0.41, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[22] = guiCreateLabel(0.39, 0.48, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[23] = guiCreateLabel(0.39, 0.54, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.label[25] = guiCreateLabel(0.39, 0.60, 0.25, 0.06, "", true, baseCPanel.tab[2]) baseCPanel.button[2] = guiCreateButton(0.86, 0.88, 0.12, 0.08, "Place", true, baseCPanel.tab[2]) baseCPanel.tab[3] = guiCreateTab("Help", baseCPanel.tabpanel[1]) local row = 0 local row2 = 0 local name = "" local name2 = "" for i, item in ipairs(objectTable) do if item[4] == "Wood" then name = item[1] row = guiGridListAddRow (baseCPanel.gridlist[1]) end if item[4] == "Metal" then name2 = item[1] row2 = guiGridListAddRow(baseCPanel.gridlist[2]) end guiGridListSetItemText ( baseCPanel.gridlist[1], row, baseCPanel.column[1], name, false, false ) guiGridListSetItemText ( baseCPanel.gridlist[2], row2, baseCPanel.column[2], name2, false, false ) end addEventHandler("onClientGUIClick", baseCPanel.gridlist[1], function() getRequiredItems(1) end, false) addEventHandler("onClientGUIClick", baseCPanel.gridlist[2], function() getRequiredItems(2) end, false) end render() active = false function togPanel() if active then return end if isPedInVehicle(localPlayer) then return end guiSetVisible(baseCPanel.window[1], not guiGetVisible ( baseCPanel.window[1] )) showCursor(not isCursorShowing()) end bindKey ("F6", "down", togPanel) tempOb = {} dep = 5 multip = 1 local health = 0 --[[ function updatePos() local ob = tempOb[localPlayer] if ob then local x, y = getCursorPosition() local cX, cY, cZ = getCameraMatrix() if getKeyState("lshift") then multip = 4 else multip = 1 end if getKeyState("arrow_u") then dep = dep + .1 * multip outputChatBox("Dep = "..tostring(dep)) elseif getKeyState("arrow_d") then dep = dep - .1 * multip end local nX, nY, nZ = getWorldFromScreenPosition(x*cX, y*cY, dep) local aX, aY, aZ = getElementPosition(ob) if (aX ~= nX) or (aY ~= nY) or (aZ ~= nZ) then setElementPosition(ob, nX, nY, nZ) end end end ]] function updatePos() local object = tempOb[localPlayer] if object then local screenX, screenY = guiGetScreenSize() local x,y = getCursorPosition() local x,y = x*screenX,y*screenY local sX,sY,sZ = getWorldFromScreenPosition(x,y,0) local sX2,sY2,sZ2 = getWorldFromScreenPosition(x,y,20) local hit,oX,oY,oZ = processLineOfSight(sX,sY,sZ,sX2,sY2,sZ2,true,false,false,true,false,true,false,false,object) if not hit then return end setElementPosition(object,oX,oY,oZ + getElementDistanceFromCentreOfMassToBaseOfModel(object)) end end local rotationAxis = "z" function setRotationOfObject(button,state) local object = tempOb[localPlayer] if button == "arrow_u" or button == "arrow_d" then if state then rotationAxis="y" else rotationAxis="z" end elseif button == "arrow_r" or button == "arrow_l" then if state then rotationAxis="x" else rotationAxis="z" end end if not state then return end if button == "mouse_wheel_up" or button == "pgup" then if rotationAxis == "z" then local x,y,z = getElementRotation(object) setElementRotation(object,x,y,z+5) elseif rotationAxis == "y" then local x,y,z = getElementRotation(object) setElementRotation(object,x,y+5,z) elseif rotationAxis == "x" then local x,y,z = getElementRotation(object) setElementRotation(object,x+5,y,z) end elseif button == "mouse_wheel_down" or button == "pgdn" then if rotationAxis == "z" then local x,y,z = getElementRotation(object) setElementRotation(object,x,y,z-5) elseif rotationAxis == "y" then local x,y,z = getElementRotation(object) setElementRotation(object,x,y-5,z) elseif rotationAxis == "x" then local x,y,z = getElementRotation(object) setElementRotation(object,x-5,y,z) end end end isGui = false addEventHandler( "onClientMouseEnter", root, function () isGui = true end) addEventHandler( "onClientMouseLeave", root, function () isGui = false end) function checkClick(bt, state) if bt == "left" and state == "down" and tempOb[localPlayer] and not isGui then local x, y, z = getElementPosition(tempOb[localPlayer]) local rx, ry, rz = getElementRotation(tempOb[localPlayer]) local model = getElementModel(tempOb[localPlayer]) removeEventHandler("onClientRender", root, updatePos) destroyElement(tempOb[localPlayer]) tempOb[localPlayer] = nil triggerServerEvent("addon.basecreator:newObject", localPlayer, model, x, y, z, rx, ry, rz, health ) active = false removeEventHandler("onClientClick", root, checkClick) removeEventHandler("onClientKey",root,setRotationOfObject) removeEventHandler("onClientClick", root, handleObDelete) takeItemsFromPlayer(model) end end local gridlistnumber = 0 function handleObSpawn(_, state, x, y) if state == "up" and not tempOb[localPlayer] then local theObjectName = guiGridListGetItemText ( baseCPanel.gridlist[gridlistnumber], guiGridListGetSelectedItem ( baseCPanel.gridlist[gridlistnumber] ), 1 ) if theObjectName then for i, item in ipairs(objectTable) do if item[1] == theObjectName then if getElementData(localPlayer,item[5]) and getElementData(localPlayer,item[5]) >= item[9] then if getElementData(localPlayer,item[6]) and getElementData(localPlayer,item[6]) >= item[10] then if getElementData(localPlayer,item[7]) and getElementData(localPlayer,item[7]) >= item[11] then if getElementData(localPlayer,item[8]) and getElementData(localPlayer,item[8]) >= item[12] then local id = item[2] local pX,pY,pZ = getElementPosition(localPlayer) tempOb[localPlayer] = createObject(id, pX+2, pY+2, pZ, 0, 0, 0) health = item[3] if tempOb[localPlayer] then addEventHandler("onClientRender", root, updatePos) addEventHandler("onClientClick", root, checkClick) addEventHandler("onClientKey",root,setRotationOfObject) addEventHandler("onClientClick", root, handleObDelete) active = true setElementCollisionsEnabled(tempOb[localPlayer], false) setElementAlpha(tempOb[localPlayer],150) end else outputChatBox("You need "..item[8].." to build this!",255,0,0) return end else outputChatBox("You need "..item[7].." to build this!",255,0,0) return end else outputChatBox("You need "..item[6].." to build this!",255,0,0) return end else outputChatBox("You need "..item[5].." to build this!",255,0,0) return end end end end end end function handleObDelete(button, state) if button == "right" then removeEventHandler("onClientRender", root, updatePos) if tempOb[localPlayer] then destroyElement(tempOb[localPlayer]) end removeEventHandler("onClientClick", root, checkClick) removeEventHandler("onClientKey",root, setRotationOfObject) tempOb[localPlayer] = nil active = false removeEventHandler("onClientClick", root, handleObDelete) end end function getRequiredItems(number) local clickedItem = guiGridListGetItemText(baseCPanel.gridlist[number], guiGridListGetSelectedItem (baseCPanel.gridlist[number]),1) for i, item in ipairs(objectTable) do if clickedItem == item[1] then if number == 1 then guiSetText(baseCPanel.label[3],tostring(item[1])) guiSetText(baseCPanel.label[4],tostring(item[3])) guiSetText(baseCPanel.label[6],tostring(item[5]).." x"..tostring(item[9])) guiSetText(baseCPanel.label[7],tostring(item[6]).." x"..tostring(item[10])) guiSetText(baseCPanel.label[8],tostring(item[7]).." x"..tostring(item[11])) guiSetText(baseCPanel.label[9],tostring(item[8]).." x"..tostring(item[12])) elseif number == 2 then guiSetText(baseCPanel.label[15],tostring(item[1])) guiSetText(baseCPanel.label[16],tostring(item[3])) guiSetText(baseCPanel.label[18],tostring(item[5]).." x"..tostring(item[9])) guiSetText(baseCPanel.label[19],tostring(item[6]).." x"..tostring(item[10])) guiSetText(baseCPanel.label[20],tostring(item[7]).." x"..tostring(item[11])) guiSetText(baseCPanel.label[21],tostring(item[8]).." x"..tostring(item[12])) end end end gridlistnumber = number end function setTheObjectUnbreakable(object) setObjectBreakable(object,false) end addEvent("setTheObjectUnbreakable",true) addEventHandler("setTheObjectUnbreakable",root,setTheObjectUnbreakable) function takeItemsFromPlayer(theModel) for i, item in ipairs(objectTable) do if theModel == item[2] then setElementData(localPlayer,item[6],getElementData(localPlayer,item[6])-item[10]) setElementData(localPlayer,item[7],getElementData(localPlayer,item[7])-item[11]) setElementData(localPlayer,item[8],getElementData(localPlayer,item[8])-item[12]) end end end function setObjectDamage(weapon,_,_,hitX,hitY,hitZ,hitElement) if weapon ~= 0 then if hitElement and getElementType(hitElement) == "object" then for i, object in ipairs(objectTable) do if getElementModel(hitElement) == object[2] then setElementData(hitElement,"object.health",getElementData(hitElement,"object.health")-1) triggerServerEvent("onObjectDamage",root,hitElement,getElementData(hitElement,"object.health"),getElementData(hitElement,"bc.ID")) outputChatBox("Health = "..tostring(getElementData(hitElement,"object.health"))) end end if getElementData(hitElement,"object.health") <= 0 then triggerServerEvent("onObjectDestroy",root,hitElement,getElementData(hitElement,"bc.ID")) end end end end addEventHandler("onClientPlayerWeaponFire",root,setObjectDamage) --[[Events]]-- addEventHandler ( "onClientGUIClick", baseCPanel.button[1], handleObSpawn, false ) addEventHandler ( "onClientGUIClick", baseCPanel.button[2], handleObSpawn, false ) --addEventHandler ( "onClientGUIClick", baseCPanel.button[2], handleObDelete, false ) Download the system : https://mega.nz/#!TFEilASA!YaCfVBOTrwR6cqJccqNkujsZ_OrJjJ9seX_zKw5lUX4 Link to comment
Hoffmann Posted February 3, 2017 Share Posted February 3, 2017 Nobody will make it for free. This forum is for helping newbies. Try to make it yourself and we will help you, fix your mistakes and etc. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now