· 6 years ago · Jul 24, 2019, 05:18 PM
1
2-- module describing business system (company, money laundering)
3
4local cfg = module("cfg/business")
5local htmlEntities = module("lib/htmlEntities")
6local lang = vRP.lang
7
8local sanitizes = module("cfg/sanitizes")
9
10-- sql
11MySQL.createCommand("vRP/business_tables",[[
12CREATE TABLE IF NOT EXISTS vrp_user_business(
13 user_id INTEGER,
14 name VARCHAR(30),
15 description TEXT,
16 capital INTEGER,
17 laundered INTEGER,
18 reset_timestamp INTEGER,
19 CONSTRAINT pk_user_business PRIMARY KEY(user_id),
20 CONSTRAINT fk_user_business_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE
21);
22]])
23
24MySQL.createCommand("vRP/create_business","INSERT IGNORE INTO vrp_user_business(user_id,name,description,capital,laundered,reset_timestamp) VALUES(@user_id,@name,'',@capital,0,@time)")
25MySQL.createCommand("vRP/delete_business","DELETE FROM vrp_user_business WHERE user_id = @user_id")
26MySQL.createCommand("vRP/get_business","SELECT name,description,capital,laundered,reset_timestamp FROM vrp_user_business WHERE user_id = @user_id")
27MySQL.createCommand("vRP/add_capital","UPDATE vrp_user_business SET capital = capital + @capital WHERE user_id = @user_id")
28MySQL.createCommand("vRP/add_laundered","UPDATE vrp_user_business SET laundered = laundered + @laundered WHERE user_id = @user_id")
29MySQL.createCommand("vRP/get_business_page","SELECT user_id,name,description,capital FROM vrp_user_business ORDER BY capital DESC LIMIT @b,@n")
30MySQL.createCommand("vRP/reset_transfer","UPDATE vrp_user_business SET laundered = 0, reset_timestamp = @time WHERE user_id = @user_id")
31
32-- init
33MySQL.execute("vRP/business_tables")
34
35-- api
36
37-- cbreturn user business data or nil
38function vRP.getUserBusiness(user_id, cbr)
39 local task = Task(cbr)
40
41 if user_id ~= nil then
42 MySQL.query("vRP/get_business", {user_id = user_id}, function(rows, affected)
43 local business = rows[1]
44
45 -- when a business is fetched from the database, check for update of the laundered capital transfer capacity
46 if business and os.time() >= business.reset_timestamp+cfg.transfer_reset_interval*60 then
47 MySQL.execute("vRP/reset_transfer", {user_id = user_id, time = os.time()})
48 business.laundered = 0
49 end
50
51 task({business})
52 end)
53 else
54 task()
55 end
56end
57
58-- close the business of an user
59function vRP.closeBusiness(user_id)
60 MySQL.execute("vRP/delete_business", {user_id = user_id})
61end
62
63-- business interaction
64
65-- page start at 0
66local function open_business_directory(player,page) -- open business directory with pagination system
67 if page < 0 then page = 0 end
68
69 local menu = {name=lang.business.directory.title().." ("..page..")",css={top="75px",header_color="rgba(240,203,88,0.75)"}}
70
71 MySQL.query("vRP/get_business_page", {b = page*10, n = 10}, function(rows, affected)
72 local count = 0
73 for k,v in pairs(rows) do
74 count = count+1
75 local row = v
76
77 if row.user_id ~= nil then
78 -- get owner identity
79 vRP.getUserIdentity(row.user_id,function(identity)
80 if identity then
81 menu[htmlEntities.encode(row.name)] = {function()end, lang.business.directory.info({row.capital,htmlEntities.encode(identity.name),htmlEntities.encode(identity.firstname),identity.registration,identity.phone})}
82 end
83
84 -- check end, open menu
85 count = count-1
86 if count == 0 then
87 menu[lang.business.directory.dnext()] = {function() open_business_directory(player,page+1) end}
88 menu[lang.business.directory.dprev()] = {function() open_business_directory(player,page-1) end}
89
90 vRP.openMenu(player,menu)
91 end
92 end)
93 end
94 end
95 end)
96end
97
98local function business_enter()
99 local source = source
100
101 local user_id = vRP.getUserId(source)
102 if user_id ~= nil then
103 -- build business menu
104 local menu = {name=lang.business.title(),css={top="75px",header_color="rgba(240,203,88,0.75)"}}
105
106 vRP.getUserBusiness(user_id, function(business)
107 if business then -- have a business
108 -- business info
109 menu[lang.business.info.title()] = {function(player,choice)
110 end, lang.business.info.info({htmlEntities.encode(business.name), business.capital, business.laundered})}
111
112 -- add capital
113 menu[lang.business.addcapital.title()] = {function(player,choice)
114 vRP.prompt(player,lang.business.addcapital.prompt(),"",function(player,amount)
115 amount = parseInt(amount)
116 if amount > 0 then
117 if vRP.tryPayment(user_id,amount) then
118 MySQL.execute("vRP/add_capital", {user_id = user_id, capital = amount})
119 vRPclient.notify(player,{lang.business.addcapital.added({amount})})
120 else
121 vRPclient.notify(player,{lang.money.not_enough()})
122 end
123 else
124 vRPclient.notify(player,{lang.common.invalid_value()})
125 end
126 end)
127 end,lang.business.addcapital.description()}
128
129 -- money laundered
130 menu[lang.business.launder.title()] = {function(player,choice)
131 vRP.getUserBusiness(user_id, function(business) -- update business data
132 local launder_left = math.min(business.capital-business.laundered,vRP.getInventoryItemAmount(user_id,"dirty_money")) -- compute launder capacity
133 vRP.prompt(player,lang.business.launder.prompt({launder_left}),""..launder_left,function(player,amount)
134 amount = parseInt(amount)
135 if amount > 0 and amount <= launder_left then
136 if vRP.tryGetInventoryItem(user_id,"dirty_money",amount,false) then
137 -- add laundered amount
138 MySQL.execute("vRP/add_laundered", {user_id = user_id, laundered = amount})
139 -- give laundered money
140 vRP.giveMoney(user_id,amount)
141 vRPclient.notify(player,{lang.business.launder.laundered({amount})})
142 else
143 vRPclient.notify(player,{lang.business.launder.not_enough()})
144 end
145 else
146 vRPclient.notify(player,{lang.common.invalid_value()})
147 end
148 end)
149 end)
150 end,lang.business.launder.description()}
151 else -- doesn't have a business
152 menu[lang.business.open.title()] = {function(player,choice)
153 vRP.prompt(player,lang.business.open.prompt_name({30}),"",function(player,name)
154 if string.len(name) >= 2 and string.len(name) <= 30 then
155 name = sanitizeString(name, sanitizes.business_name[1], sanitizes.business_name[2])
156 vRP.prompt(player,lang.business.open.prompt_capital({cfg.minimum_capital}),""..cfg.minimum_capital,function(player,capital)
157 capital = parseInt(capital)
158 if capital >= cfg.minimum_capital then
159 if vRP.tryPayment(user_id,capital) then
160 MySQL.execute("vRP/create_business", {
161 user_id = user_id,
162 name = name,
163 capital = capital,
164 time = os.time()
165 })
166
167 vRPclient.notify(player,{lang.business.open.created()})
168 vRP.closeMenu(player) -- close the menu to force update business info
169 else
170 vRPclient.notify(player,{lang.money.not_enough()})
171 end
172 else
173 vRPclient.notify(player,{lang.common.invalid_value()})
174 end
175 end)
176 else
177 vRPclient.notify(player,{lang.common.invalid_name()})
178 end
179 end)
180 end,lang.business.open.description({cfg.minimum_capital})}
181 end
182
183 -- business list
184 menu[lang.business.directory.title()] = {function(player,choice)
185 open_business_directory(player,0)
186 end,lang.business.directory.description()}
187
188 -- open menu
189 vRP.openMenu(source,menu)
190 end)
191 end
192end
193
194local function business_leave()
195 vRP.closeMenu(source)
196end
197
198local function build_client_business(source) -- build the city hall area/marker/blip
199 local user_id = vRP.getUserId(source)
200 if user_id ~= nil then
201 for k,v in pairs(cfg.commerce_chambers) do
202 local x,y,z = table.unpack(v)
203
204 vRPclient.addBlip(source,{x,y,z,cfg.blip[1],cfg.blip[2],lang.business.title()})
205 vRPclient.addMarker(source,{x,y,z-1,0.7,0.7,0.5,0,255,125,125,150})
206
207 vRP.setArea(source,"vRP:business"..k,x,y,z,1,1.5,business_enter,business_leave)
208 end
209 end
210end
211
212
213AddEventHandler("vRP:playerSpawn",function(user_id, source, first_spawn)
214 -- first spawn, build business
215 if first_spawn then
216 build_client_business(source)
217 end
218end)