· 5 years ago · Mar 18, 2020, 05:52 PM
1local data = {}
2local timeRemaining = {}
3local intervals = {
4 60000,
5 100000,
6 300000,
7 500000,
8 1000000
9}
10local intervals = {
11 60000
12}
13local defaultTurfs = {
14 {
15 owner = "Revolutionary Soldiers",
16 name = "Area-51",
17
18 dimensions = {
19 turfX = 97.3376,
20 turfY = 1795,
21 turfW = 180,
22 turfH = 150,
23 },
24
25 color = {
26 r = 200,
27 g = 0,
28 b = 0
29 },
30
31 markerDimensions = {
32 markerX = 213.32997131348,
33 markerY = 1822.8697509766,
34 markerZ = 5.5,
35 },
36
37 doors = {
38 {
39 doorID = 16773,
40 doorX = 214.03,
41 doorY = 1875.2221679688,
42 doorZ = 12,
43 doorZdown = 8,
44 doorRX = 0,
45 doorRY = 0,
46 doorRZ = 0,
47
48 markerOUX = 213.80026245117,
49 markerOUY = 879.0366210938,
50 markerOUZ = 13.2,
51
52 markerISX = 213.86863708496,
53 markerISY = 1871.3275146484,
54 markerISZ = 13.2,
55
56 markerSize = 3,
57 time = 3000,
58 },
59 },
60
61 respawnPoints = {
62 {259.17199707031, 1854.6473388672, 8.7578125},
63 {242.01116943359, 1845.0062255859, 8.7578125},
64 {260.47387695313, 1845.5625, 8.4965896606445},
65 }
66 },
67}
68local resName = getResourceName(getThisResource())
69local cred1, cred2, cred3, cred4, cred5 = call(getResourceFromName("Core"), "getDatabaseCreds")
70local connection = dbConnect(cred1, cred2, cred3, cred4, cred5)
71dbExec(connection, "CREATE TABLE IF NOT EXISTS turfs (id INT NOT NULL AUTO_INCREMENT, owner TEXT, name TEXT, dimensions TEXT, markerDimensions TEXT, color TEXT, doors TEXT, respawnPoints TEXT, PRIMARY KEY (id))")
72
73local query = dbQuery(connection, "SELECT * FROM turfs")
74local poll = dbPoll(query, -1)
75dbFree(query)
76
77if (#poll <= 0) then
78 for index,value in ipairs(defaultTurfs) do
79 local owner = value.owner
80 local name = value.name
81 local dimensions = toJSON(value.dimensions)
82 local markerDimensions = toJSON(value.markerDimensions)
83 local color = toJSON(value.color)
84 local doors = toJSON(value.doors)
85 local respawnPoints = toJSON(value.respawnPoints)
86
87 dbExec(
88 connection,
89 "INSERT INTO turfs (owner, name, dimensions, markerDimensions, color, doors, respawnPoints) VALUES(?, ?, ?, ?, ?, ?, ?)",
90 owner,
91 name,
92 dimensions,
93 markerDimensions,
94 color,
95 doors,
96 respawnPoints
97 )
98 end
99end
100
101function checkPlayer(player, colshape)
102 if not isElement(player) then
103 return stopCapture(colshape)
104 end
105 local isInvincible = getElementData(player, "invincible")
106 local isAFK = getElementData(player, "Activity") == "AFK"
107 local dead = isPedDead(player)
108 local hasTeam = getPlayerTeam(player)
109
110 if (isInvincible or isAFK or isDead or not hasTeam) then
111 stopCapture(colshape)
112 end
113end
114
115function stopCapture(colshape)
116 local child = getElementChild(colshape, 0)
117 local name = getElementData(colshape, "name")
118 local theTimer = data[name].timer
119
120 setRadarAreaFlashing(child, false)
121
122 if isTimer(theTimer) then
123 killTimer(theTimer)
124 end
125
126 setElementData(colshape, "captureProgress", 100)
127 removeElementData(colshape, "beingCaptured")
128end
129
130function finishCapture(colshape, player)
131 local playerTeam = getPlayerTeam(player)
132
133 if playerTeam then
134 local teamName = getTeamName(playerTeam)
135 local teamR, teamG, teamB = getTeamColor(playerTeam)
136 local color = toJSON(
137 {
138 r = teamR,
139 g = teamG,
140 b = teamB
141 }
142 )
143 local name = getElementData(colshape, "name")
144
145 dbExec(connection, "UPDATE turfs SET owner=?, color=? WHERE name=?", teamName, color, name)
146 data[name].owner = teamName
147
148 for index,value in ipairs(getElementsWithinColShape(data[name].colSphere, "player")) do
149 local team = getPlayerTeam(value)
150
151 if (team == playerTeam) then
152 triggerEvent("EXP:ADD", value, 5000)
153 end
154 end
155 local radarArea = getElementChild(colshape, 0)
156 local captureMarker = getElementChild(colshape, 1)
157
158 setRadarAreaFlashing(radarArea, false)
159 setRadarAreaColor(radarArea, teamR, teamG, teamB, 100)
160 setMarkerColor(captureMarker, teamR, teamG, teamB, 150)
161
162 setElementData(colshape, "owner", teamName)
163 setElementData(colshape, "ownerHex", call(getResourceFromName("Core"), "rgbToHex", teamR, teamG, teamB))
164
165 removeElementData(colshape, "beingCaptured")
166 setElementData(colshape, "captureProgress", 100)
167
168 outputChatBox("• #ffffff"..name.." #4dff00is now owned by #ffffff"..teamName, root, 77, 255, 0, true)
169 else
170 outputChatBox("TRF_CPTR_ERR[PLR_TEAM=NULL]")
171
172 local radarArea = getElementChild(colshape, 0)
173 local captureMarker = getElementChild(colshape, 1)
174
175 setRadarAreaFlashing(radarArea, false)
176
177 removeElementData(colshape, "beingCaptured")
178 setElementData(colshape, "captureProgress", 100)
179 end
180end
181
182function startCapture(name, player, owner, colshape)
183 local name = getElementData(colshape, "name")
184 local radarArea = getElementChild(colshape, 0)
185
186 setElementData(colshape, "beingCaptured", player)
187 setRadarAreaFlashing(radarArea, true)
188 data[name].timer = setTimer(
189 function(name, player, colshape)
190 local oldProgress = getElementData(colshape, "captureProgress")
191 local newProgress = oldProgress - 1
192
193 setElementData(colshape, "captureProgress", newProgress)
194
195 checkPlayer(player, colshape)
196 if (newProgress <= 0) then
197 finishCapture(colshape, player)
198 end
199 end,
200 500,
201 100,
202 name,
203 player,
204 colshape
205 )
206end
207
208function init()
209 local query = dbQuery(connection, "SELECT * FROM turfs")
210 local poll = dbPoll(query, -1)
211 dbFree(query)
212
213 for index,value in ipairs(poll) do
214 local owner = value.owner
215 local name = value.name
216 local dimensions = fromJSON(value.dimensions)
217 local markerDimensions = fromJSON(value.markerDimensions)
218 local color = fromJSON(value.color)
219 local jsonDoors = fromJSON(value.doors)
220 local respawnPoints = fromJSON(value.respawnPoints)
221
222 local turfX = dimensions.turfX
223 local turfY = dimensions.turfY
224 local turfWidth = dimensions.turfW
225 local turfHeight = dimensions.turfH
226
227 local markerX = markerDimensions.markerX
228 local markerY = markerDimensions.markerY
229 local markerZ = markerDimensions.markerZ
230
231 local turfR = color.r
232 local turfG = color.g
233 local turfB = color.b
234
235 data[name] = {
236 owner = owner,
237 name = name,
238 colSphere = createColRectangle(turfX, turfY, turfWidth, turfHeight),
239 radarArea = createRadarArea(turfX, turfY, turfWidth, turfHeight, turfR, turfG, turfB, 150),
240 captureMarker = createMarker(markerX, markerY, markerZ, "cylinder", 1, turfR, turfG, turfB, 100),
241 timer = false,
242 doors = {},
243 openTimer = false
244 }
245
246 local randomInterval = intervals[math.random(1, #intervals)]
247
248 data[name].openTimer = setTimer(
249 function(colshape)
250 local name = getElementData(colshape, "name")
251 setElementData(colshape, "state", "Open")
252
253 outputChatBox("• #ffffff"..name.." #4dff00is now open!", root, 77, 255, 0, true)
254
255 for index3,value3 in ipairs(data[name]["doors"]) do
256 local object = value3.doorObject
257 local doorZDown = value3.doorDownPosition
258 local x, y, z = getElementPosition(object)
259
260 moveObject(object, 3000, x, y, 8)
261 end
262 end,
263 randomInterval,
264 1,
265 data[name].colSphere
266 )
267
268 setElementParent(data[name].radarArea, data[name].colSphere)
269 setElementParent(data[name].captureMarker, data[name].colSphere)
270 setElementData(data[name].colSphere, "name", name)
271 setElementData(data[name].colSphere, "owner", owner)
272 setElementData(data[name].colSphere, "ownerHex", call(getResourceFromName("Core"), "rgbToHex", turfR, turfG, turfB))
273 setElementData(data[name].colSphere, "state", "Closed")
274 setElementData(data[name].colSphere, "captureProgress", 100)
275
276 setTimer(
277 function()
278 for index,value in ipairs(getElementsWithinColShape(data[name].colSphere, "player")) do
279 triggerClientEvent(value, resName..":showTurfGUI", value, data[name].colSphere)
280 end
281 end,
282 1000,
283 1
284 )
285
286 addEventHandler("onColShapeHit", data[name].colSphere,
287 function(element, sameDimensionAsElement)
288 if sameDimensionAsElement then
289 local type = getElementType(element)
290
291 if (type == "player") then
292 triggerClientEvent(element, resName..":showTurfGUI", element, data[name].colSphere)
293 end
294 end
295 end
296 )
297
298 addEventHandler("onColShapeLeave", data[name].colSphere,
299 function(element, sameDimensionAsElement)
300 if sameDimensionAsElement then
301 local type = getElementType(element)
302
303 if (type == "player") then
304 triggerClientEvent(element, resName..":hideTurfGUI", element)
305 end
306 end
307 end
308 )
309
310 addEventHandler("onMarkerHit", data[name].captureMarker,
311 function(element, sameDimensionAsElement)
312 if sameDimensionAsElement then
313 local type = getElementType(element)
314
315 if (type == "player") then
316 local isPlayerInvincible = getElementData(element, "invincible")
317
318 if (not invincible) then
319 local team = getPlayerTeam(element)
320
321 if team then
322 local teamName = getTeamName(team)
323 local parent = getElementParent(source)
324 local turfName = getElementData(parent, "name")
325 local owner = data[turfName].owner
326
327 if (teamName ~= owner) then
328 local isAlreadyCapturing = getElementData(parent, "beingCaptured")
329 local isOpen = getElementData(parent, "state") == "Open"
330
331 if (not isAlreadyCapturing and isOpen) then
332 startCapture(name, element, owner, parent)
333 end
334 end
335 end
336 end
337 end
338 end
339 end
340 )
341
342 addEventHandler("onMarkerLeave", data[name].captureMarker,
343 function(element, sameDimensionAsElement)
344 if sameDimensionAsElement then
345 local parent = getElementParent(source)
346 local isAlreadyCapturing = getElementData(parent, "beingCaptured")
347
348 if (isAlreadyCapturing == element) then
349 stopCapture(parent)
350 end
351 end
352 end
353 )
354
355 for index2,value2 in ipairs(jsonDoors) do
356 local modelID = value2.doorID
357 local doorX, doorY, doorZ = value2.doorX, value2.doorY, value2.doorZ
358 local doorZDown = value2.doorZDown
359 local doorRX, doorRY, doorRZ = value2.doorRX, value2.doorRY, value2.doorRZ
360
361 local markerOUX, markerOUY, markerOUZ = value2.markerOUX, value2.markerOUY, value2.markerOUZ
362 local markerISX, markerISY, markerISZ = value2.markerISX, value2.markerISY, value2.markerISZ
363
364 local markerSize = value2.markerSize
365 local timeToMove = value2.time
366
367 data[name]["doors"][index2] = {}
368 data[name]["doors"][index2]["doorObject"] = createObject(modelID, doorX, doorY, doorZ)
369 data[name]["doors"][index2]["doorZDown"] = doorZdown
370 setElementRotation(data[name]["doors"][index2]["doorObject"], doorRX, doorRY, doorRZ)
371 setElementParent(data[name]["doors"][index2]["doorObject"], data[name].colSphere)
372 data[name]["doors"][index2]["markerOutside"] = createMarker(markerOUX, markerOUY, markerOUZ, "cylinder", markerSize, 255, 0, 0, 200)
373 data[name]["doors"][index2]["markerInside"] = createMarker(markerISX, markerISY, markerISZ, "cylinder", markerSize, 255, 0, 0, 200)
374 setElementParent(data[name]["doors"][index2]["markerOutside"], data[name]["doors"][index2]["doorObject"])
375 setElementParent(data[name]["doors"][index2]["markerInside"], data[name]["doors"][index2]["doorObject"])
376
377 addEventHandler("onMarkerHit", data[name]["doors"][index2]["markerOutside"],
378 function(element, sameDimensionAsElement)
379 if sameDimensionAsElement then
380 local team = getPlayerTeam(element)
381 local parent = getElementParent(source)
382 local parentOfParent = getElementParent(parent)
383 local owner = getElementData(parentOfParent, "owner")
384 local name = getElementData(parentOfParent, "name")
385
386 if team then
387 local teamName = getTeamName(team)
388
389 if (teamName == owner) then
390 local closed = getElementData(parentOfParent, "state") == "Closed"
391
392 if closed then
393 local x, y, z = getElementPosition(parent)
394 local doorZDown = data[name]["doors"][index2]["doorZdown"]
395
396 moveObject(parent, timeToMove, x, y, doorZDown)
397 end
398 end
399 end
400 end
401 end
402 )
403
404 addEventHandler("onMarkerLeave", data[name]["doors"][index2]["markerOutside"],
405 function(element, sameDimensionAsElement)
406 if sameDimensionAsElement then
407 local team = getPlayerTeam(element)
408
409 local teamName = getTeamName(team)
410
411 if (teamName == data[name].owner) then
412 local closed = getElementData(data[name].colSphere, "state") == "Closed"
413
414 if closed then
415 moveObject(data[name]["doors"][index2]["doorObject"], timeToMove, doorX, doorY, doorZ)
416 end
417 end
418 end
419 end
420 )
421
422 addEventHandler("onMarkerHit", data[name]["doors"][index2]["markerInside"],
423 function(element, sameDimensionAsElement)
424 if sameDimensionAsElement then
425 local team = getPlayerTeam(element)
426 local parent = getElementParent(source)
427 local parentOfParent = getElementParent(parent)
428 local owner = getElementData(parentOfParent, "owner")
429 local name = getElementData(parentOfParent, "name")
430
431 if team then
432 local teamName = getTeamName(team)
433
434 if (teamName == owner) then
435 local closed = getElementData(parentOfParent, "state") == "Closed"
436
437 if closed then
438 local x, y, z = getElementPosition(parent)
439 local doorZDown = data[name]["doors"][index2]["doorZdown"]
440
441 moveObject(parent, timeToMove, x, y, doorZDown)
442 end
443 end
444 end
445 end
446 end
447 )
448
449 addEventHandler("onMarkerLeave", data[name]["doors"][index2]["markerInside"],
450 function(element, sameDimensionAsElement)
451 if sameDimensionAsElement then
452 local team = getPlayerTeam(element)
453
454 if (teamName == data[name].owner) then
455 local closed = getElementData(data[name].colSphere, "state") == "Closed"
456
457 if closed then
458 moveObject(data[name]["doors"][index2]["doorObject"], timeToMove, doorX, doorY, doorZ)
459 end
460 end
461 end
462 end
463 )
464 end
465 end
466 setTimer(
467 function()
468 for index,value in ipairs(getElementsByType("player")) do
469 for index2,value2 in pairs(data) do
470 local name = value2.name
471
472 timeRemaining[name] = getTimerDetails(value2.openTimer)
473 end
474 triggerClientEvent(value, resName..":recieveTurfData", value, data, timeRemaining)
475 end
476 end,
477 1000,
478 1
479 )
480end
481addEventHandler("onResourceStart", resourceRoot, init)