· 7 years ago · Feb 24, 2019, 08:20 PM
1local lang = vRP.lang
2local cfg = module("cfg/homes")
3
4vRP.prepare("vRP/home_tables", [[
5CREATE TABLE IF NOT EXISTS vrp_user_homes(
6 user_id INTEGER,
7 home VARCHAR(100),
8 number INTEGER,
9 CONSTRAINT pk_user_homes PRIMARY KEY(user_id),
10 CONSTRAINT fk_user_homes_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE,
11 UNIQUE(home,number)
12);
13]])
14
15vRP.prepare("vRP/get_address","SELECT home, number FROM vrp_user_homes WHERE user_id = @user_id")
16vRP.prepare("vRP/get_home_owner","SELECT user_id FROM vrp_user_homes WHERE home = @home AND number = @number")
17vRP.prepare("vRP/rm_address","DELETE FROM vrp_user_homes WHERE user_id = @user_id")
18vRP.prepare("vRP/set_address","REPLACE INTO vrp_user_homes(user_id,home,number) VALUES(@user_id,@home,@number)")
19
20async(function()
21 vRP.execute("vRP/home_tables")
22end)
23
24local components = {}
25function vRP.getUserAddress(user_id, cbr)
26 local rows = vRP.query("vRP/get_address", {user_id = user_id})
27 return rows[1]
28end
29
30function vRP.setUserAddress(user_id,home,number)
31 vRP.execute("vRP/set_address", {user_id = user_id, home = home, number = number})
32end
33
34function vRP.removeUserAddress(user_id)
35 vRP.execute("vRP/rm_address", {user_id = user_id})
36end
37
38function vRP.getUserByAddress(home,number,cbr)
39 local rows = vRP.query("vRP/get_home_owner", {home = home, number = number})
40 if #rows > 0 then
41 return rows[1].user_id
42 end
43end
44
45function vRP.findFreeNumber(home,max,cbr)
46 local i = 1
47 while i <= max do
48 if not vRP.getUserByAddress(home,i) then
49 return i
50 end
51 i = i+1
52 end
53end
54
55function vRP.defHomeComponent(name, oncreate, ondestroy)
56 components[name] = {oncreate,ondestroy}
57end
58
59function vRP.getHomeSlotPlayers(stype, sid)
60end
61
62local uslots = {}
63for k,v in pairs(cfg.slot_types) do
64 uslots[k] = {}
65 for l,w in pairs(v) do
66 uslots[k][l] = {used=false}
67 end
68end
69
70function vRP.getHomeSlotPlayers(stype, sid)
71 local slot = uslots[stype][sid]
72 if slot and slot.used then
73 return slot.players
74 end
75end
76
77local function allocateSlot(stype)
78 local slots = cfg.slot_types[stype]
79 if slots then
80 local _uslots = uslots[stype]
81 for k,v in pairs(slots) do
82 if _uslots[k] and not _uslots[k].used then
83 _uslots[k].used = true
84 return k
85 end
86 end
87 end
88
89 return nil
90end
91
92local function freeSlot(stype, id)
93 local slots = cfg.slot_types[stype]
94 if slots then
95 uslots[stype][id] = {used = false}
96 end
97end
98
99local function getAddressSlot(home_name,number)
100 for k,v in pairs(uslots) do
101 for l,w in pairs(v) do
102 if w.home_name == home_name and tostring(w.home_number) == tostring(number) then
103 return k,l
104 end
105 end
106 end
107
108 return nil,nil
109end
110
111local function is_empty(table)
112 for k,v in pairs(table) do
113 return false
114 end
115
116 return true
117end
118
119local function leave_slot(user_id,player,stype,sid)
120 print(user_id.." leave slot "..stype.." "..sid)
121 local slot = uslots[stype][sid]
122 local home = cfg.homes[slot.home_name]
123 local tmp = vRP.getUserTmpTable(user_id)
124 if tmp then
125 tmp.home_stype = nil
126 tmp.home_sid = nil
127 end
128 vRPclient._teleport(player, table.unpack(home.entry_point))
129 slot.players[user_id] = nil
130 for k,v in pairs(cfg.slot_types[stype][sid]) do
131 local name,x,y,z = table.unpack(v)
132 if name == "entry" then
133 local nid = "vRP:home:slot"..stype..sid
134 vRPclient._removeNamedMarker(player,nid)
135 vRP.removeArea(player,nid)
136 else
137 local component = components[v[1]]
138 if component then
139 local data = slot.components[k]
140 if not data then
141 data = {}
142 slot.components[k] = data
143 end
144 component[2](slot.owner_id, stype, sid, k, v._config or {}, data, x, y, z, player)
145 end
146 end
147 end
148 if is_empty(slot.players) then
149 print("free slot "..stype.." "..sid)
150 freeSlot(stype,sid)
151 end
152end
153
154local function enter_slot(user_id,player,stype,sid)
155 print(user_id.." enter slot "..stype.." "..sid)
156 local slot = uslots[stype][sid]
157 local home = cfg.homes[slot.home_name]
158 local tmp = vRP.getUserTmpTable(user_id)
159 if tmp then
160 tmp.home_stype = stype
161 tmp.home_sid = sid
162 end
163 slot.players[user_id] = player
164 local menu = {name=slot.home_name,css={header_color="rgba(255,128,0,0.99)"}}
165 menu["Sair"] = {function(player,choice)
166 leave_slot(user_id,player,stype,sid)
167 end}
168 local address = vRP.getUserAddress(user_id)
169 if address and address.home == slot.home_name and tostring(address.number) == slot.home_number then
170 menu["Mandar todos embora"] = {function(player,choice)
171 local copy = {}
172 for k,v in pairs(slot.players) do
173 copy[k] = v
174 end
175 for k,v in pairs(copy) do
176 leave_slot(k,v,stype,sid)
177 end
178 end}
179 end
180 local function entry_enter(player,area)
181 vRP.openMenu(player,menu)
182 end
183 local function entry_leave(player,area)
184 vRP.closeMenu(player)
185 end
186 for k,v in pairs(cfg.slot_types[stype][sid]) do
187 local name,x,y,z = table.unpack(v)
188 if name == "entry" then
189 vRPclient._teleport(player, x,y,z)
190 local nid = "vRP:home:slot"..stype..sid
191 vRPclient._setNamedMarker(player,nid,x,y,z-1,0.7,0.7,0.5,0,255,125,125,150)
192 vRP.setArea(player,nid,x,y,z,1,1.5,entry_enter,entry_leave)
193 else
194 local component = components[v[1]]
195 if component then
196 local data = slot.components[k]
197 if not data then
198 data = {}
199 slot.components[k] = data
200 end
201 component[1](slot.owner_id, stype, sid, k, v._config or {}, data, x, y, z, player)
202 end
203 end
204 end
205end
206
207function vRP.accessHome(user_id, home, number)
208 local _home = cfg.homes[home]
209 local stype,slotid = getAddressSlot(home,number)
210 local player = vRP.getUserSource(user_id)
211
212 local owner_id = vRP.getUserByAddress(home,number)
213 if _home ~= nil and player ~= nil then
214 if stype == nil then
215 stype = _home.slot
216 slotid = allocateSlot(_home.slot)
217 if slotid ~= nil then
218 local slot = uslots[stype][slotid]
219 slot.home_name = home
220 slot.home_number = number
221 slot.owner_id = owner_id
222 slot.players = {}
223 slot.components = {}
224 end
225 end
226 if slotid ~= nil then
227 enter_slot(user_id,player,stype,slotid)
228 return true
229 end
230 end
231end
232
233local function build_entry_menu(user_id, home_name)
234 local home = cfg.homes[home_name]
235 local menu = {name=home_name,css={header_color="rgba(255,128,0,0.99)"}}
236 menu["Campainha"] = {function(player,choice)
237 local number = vRP.prompt(player, "Qual o número da residencia?", "")
238 number = parseInt(number)
239 local huser_id = vRP.getUserByAddress(home_name,number)
240 if huser_id then
241 if huser_id == user_id then
242 if not vRP.accessHome(user_id, home_name, number) then
243 TriggerClientEvent("pNotify:SendNotification", player, {
244 text = "Não disponivel",
245 type = "error",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
246 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
247 })
248 end
249 else
250 local hplayer = vRP.getUserSource(huser_id)
251 if hplayer ~= nil then
252 local who = vRP.prompt(player,"Quem está tocando a campainha?","")
253 TriggerClientEvent("pNotify:SendNotification", player, {
254 text = "Tocando campainha",
255 type = "info",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
256 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
257 })
258 if vRP.request(hplayer, who .. " está tocando sua campainha", 15) then
259 vRP.accessHome(user_id, home_name, number)
260 else
261 TriggerClientEvent("pNotify:SendNotification", player, {
262 text = "Sua entrada foi negada",
263 type = "alert",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
264 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
265 })
266 end
267 else
268 TriggerClientEvent("pNotify:SendNotification", player, {
269 text = "Sua entrada foi negada",
270 type = "alert",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
271 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
272 })
273 end
274 end
275 else
276 TriggerClientEvent("pNotify:SendNotification", player, {
277 text = "Não encontrado",
278 type = "error",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
279 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
280 })
281 end
282 end}
283
284 menu["Comprar Ãmovel"] = {function(player,choice)
285 local address = vRP.getUserAddress(user_id)
286 if address <=2 then
287 local number = vRP.findFreeNumber(home_name, home.max)
288 if number then
289 if vRP.tryPayment(user_id, home.buy_price) then
290 vRP.setUserAddress(user_id, home_name, number)
291 TriggerClientEvent("pNotify:SendNotification", player, {
292 text = "Você comprou este Ãmovel",
293 type = "success",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
294 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
295 })
296 else
297 TriggerClientEvent("pNotify:SendNotification", player, {
298 text = "Você não possui dinheiro suficiente",
299 type = "error",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
300 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
301 })
302 end
303 else
304 TriggerClientEvent("pNotify:SendNotification", player, {
305 text = "Este Ãmovel já está em sua capacidade máxima",
306 type = "alert",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
307 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
308 })
309 end
310 else
311 TriggerClientEvent("pNotify:SendNotification", player, {
312 text = "Você já possui uma casa",
313 type = "error",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
314 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
315 })
316 end
317 end, lang.home.buy.description({home.buy_price})}
318
319 menu["Vender Ãmovel"] = {function(player,choice)
320 local address = vRP.getUserAddress(user_id)
321 if address and address.home == home_name then
322 vRP.giveMoney(user_id, home.sell_price)
323 vRP.removeUserAddress(user_id)
324 TriggerClientEvent("pNotify:SendNotification", player, {
325 text = "Você vendeu este Ãmovel",
326 type = "success",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
327 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
328 })
329 else
330 TriggerClientEvent("pNotify:SendNotification", player, {
331 text = "Você não possui um Ãmovel",
332 type = "success",progressBar = false,timeout = 3000,layout = "nycolaaz",queue = "left",
333 animation = {open = "gta_effects_fade_in", close = "gta_effects_fade_out"}
334 })
335 end
336 end, lang.home.sell.description({home.sell_price})}
337 return menu
338end
339
340local function build_client_homes(source)
341 local user_id = vRP.getUserId(source)
342 if user_id then
343 for k,v in pairs(cfg.homes) do
344 local x,y,z = table.unpack(v.entry_point)
345 local function entry_enter(player,area)
346 local user_id = vRP.getUserId(player)
347 if user_id and vRP.hasPermissions(user_id,v.permissions or {}) then
348 vRP.openMenu(source,build_entry_menu(user_id, k))
349 end
350 end
351 local function entry_leave(player,area)
352 vRP.closeMenu(player)
353 end
354 vRPclient._addBlip(source,x,y,z,v.blipid,v.blipcolor,k)
355 vRPclient._addMarker(source,x,y,z-1,0.7,0.7,0.5,0,255,125,125,150)
356 vRP.setArea(source,"vRP:home"..k,x,y,z,1,1.5,entry_enter,entry_leave)
357 end
358 end
359end
360
361AddEventHandler("vRP:playerSpawn",function(user_id, source, first_spawn)
362 if first_spawn then
363 build_client_homes(source)
364 else
365 local tmp = vRP.getUserTmpTable(user_id)
366 if tmp and tmp.home_stype then
367 leave_slot(user_id, source, tmp.home_stype, tmp.home_sid)
368 end
369 end
370end)
371
372AddEventHandler("vRP:playerLeave",function(user_id, player)
373 local tmp = vRP.getUserTmpTable(user_id)
374 if tmp and tmp.home_stype then
375 leave_slot(user_id, player, tmp.home_stype, tmp.home_sid)
376 end
377end)