· 6 years ago · May 01, 2019, 03:56 AM
1local scriptName = 'npc_promo'
2
3local charactersSQL = [[
4 CREATE TABLE IF NOT EXISTS `promociones_entregadas` (
5 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
6 `promocion_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
7 `personaje_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
8 `cuenta_id` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
9 `ip` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0.0.0.0' ,
10 `fecha` INT(10) UNSIGNED NOT NULL DEFAULT '0',
11 PRIMARY KEY (`id`)
12 ) ENGINE = InnoDB;
13]]
14CharDBQuery(charactersSQL)
15
16local worldSQL = [[
17 CREATE TABLE IF NOT EXISTS `promociones` (
18 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
19 `nombre` VARCHAR(999) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
20 `unica_personaje` TINYINT(1) NOT NULL DEFAULT '0' ,
21 `unica_cuenta` TINYINT(1) NOT NULL DEFAULT '0' ,
22 `unica_ip` TINYINT(1) NOT NULL DEFAULT '0' ,
23 `promo_padre` INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
24 PRIMARY KEY (`id`)
25 ) ENGINE = InnoDB;
26]]
27WorldDBQuery(worldSQL)
28
29worldSQL = [[
30 CREATE TABLE IF NOT EXISTS `promocion_requerimientos` (
31 `promo_id` INT(20) UNSIGNED NOT NULL ,
32 `clase` TINYINT(3) NOT NULL DEFAULT '0' ,
33 `raza` TINYINT(3) NOT NULL DEFAULT '0' ,
34 `nivel` TINYINT(3) NOT NULL DEFAULT '0' ,
35 `nivel_gm` TINYINT(2) NOT NULL DEFAULT '0' ,
36 `oro` INT(20) NOT NULL DEFAULT '0' ,
37 `puntos_honor` INT(20) NOT NULL DEFAULT '0' ,
38 `puntos_arena` INT(20) NOT NULL DEFAULT '0' ,
39 `logro_1` INT(20) NOT NULL DEFAULT '0' ,
40 `logro_2` INT(20) NOT NULL DEFAULT '0' ,
41 `logro_3` INT(20) NOT NULL DEFAULT '0' ,
42 PRIMARY KEY (`promo_id`)
43 ) ENGINE = InnoDB;
44]]
45WorldDBQuery(worldSQL)
46
47worldSQL = [[
48 CREATE TABLE IF NOT EXISTS `promocion_recompensas` (
49 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
50 `promocion_id` INT(10) UNSIGNED NOT NULL ,
51 `tipo_recompensa` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'item' ,
52 `valor` INT(20) NOT NULL DEFAULT '0' ,
53 PRIMARY KEY (`id`), INDEX (`promocion_id`)
54 ) ENGINE = InnoDB;
55]]
56WorldDBQuery(worldSQL)
57
58worldSQL = [[
59 CREATE TABLE IF NOT EXISTS `npc_lua` (
60 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
61 `npc_entry` INT(10) UNSIGNED NOT NULL ,
62 `lua_script` VARCHAR(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ,
63 PRIMARY KEY (`id`)
64 ) ENGINE = InnoDB;
65]]
66WorldDBQuery(worldSQL)
67
68
69local maxLevelServer = 80
70
71
72function OnGossipHello(event, player, creature)
73 reset()
74 player:GossipClearMenu() -- required for player gossip
75
76 local contador = 1
77 local promociones = WorldDBQuery( "SELECT `id`, `nombre`, `unica_personaje`, `unica_cuenta`, `unica_ip` FROM `promociones`;" )
78 if (promociones) then
79 repeat
80 local promocion_id = promociones:GetUInt32(0)
81 local nombre = promociones:GetString(1)
82 local unica_personaje = promociones:GetUInt32(2)
83 local unica_cuenta = promociones:GetUInt32(3)
84 local unica_ip = promociones:GetUInt32(4)
85
86 local correcto = true
87
88 local player_guid = 0
89 local player_name = player:GetName()
90 personaje = CharDBQuery( "SELECT `guid` FROM `characters` WHERE UPPER(`name`) = UPPER('"..player_name.."');" )
91 if (personaje) then
92 repeat
93 player_guid = personaje:GetUInt32(0)
94 until not personaje:NextRow()
95 end
96
97 local player_account_id = player:GetAccountId()
98 local player_ip = player:GetPlayerIP()
99
100
101 -- Comprobamos si la promo ya ha sido entregada
102
103 if(unica_ip == 1) then
104 promocion_entregada = CharDBQuery( "SELECT * FROM `promociones_entregadas` WHERE `promocion_id` = '"..promocion_id.."' AND (`personaje_id` = '"..player_guid.."' OR `cuenta_id` = '"..player_account_id.."' OR `ip` = '"..player_ip.."');" )
105 if (promocion_entregada) then
106 repeat
107 correcto = false
108 until not promocion_entregada:NextRow()
109 end
110 end
111
112 if(unica_cuenta == 1) then
113 promocion_entregada = CharDBQuery( "SELECT * FROM `promociones_entregadas` WHERE `promocion_id` = '"..promocion_id.."' AND (`personaje_id` = '"..player_guid.."' OR `cuenta_id` = '"..player_account_id.."');" )
114 if (promocion_entregada) then
115 repeat
116 correcto = false
117 until not promocion_entregada:NextRow()
118 end
119 end
120
121 if(unica_personaje == 1) then
122 promocion_entregada = CharDBQuery( "SELECT * FROM `promociones_entregadas` WHERE `promocion_id` = '"..promocion_id.."' AND (`personaje_id` = '"..player_guid.."');" )
123 if (promocion_entregada) then
124 repeat
125 correcto = false
126 until not promocion_entregada:NextRow()
127 end
128 end
129
130
131
132 -- Comprobamos si se cumplen los requisitos para la promo
133
134 promocion_requerimientos = WorldDBQuery( "SELECT `clase`, `raza`, `nivel`, `nivel_gm`, `oro`, `puntos_honor`, `puntos_arena`, `logro_1`, `logro_2`, `logro_3` FROM `promocion_requerimientos` WHERE `promo_id` = '"..promocion_id.."';" )
135 if (promocion_requerimientos) then
136 repeat
137
138 local req_clase = promocion_requerimientos:GetUInt32(0)
139 local req_raza = promocion_requerimientos:GetUInt32(1)
140 local req_nivel = promocion_requerimientos:GetUInt32(2)
141 local req_nivel_gm = promocion_requerimientos:GetUInt32(3)
142 local req_oro = promocion_requerimientos:GetUInt32(4)
143 local req_puntos_honor = promocion_requerimientos:GetUInt32(5)
144 local req_puntos_arena = promocion_requerimientos:GetUInt32(6)
145 local req_logro_1 = promocion_requerimientos:GetUInt32(7)
146 local req_logro_2 = promocion_requerimientos:GetUInt32(8)
147 local req_logro_3 = promocion_requerimientos:GetUInt32(9)
148
149 if(req_clase ~= 0) then
150 if(player:GetClass() ~= req_clase) then
151 correcto = false
152 end
153 end
154
155 if(req_raza ~= 0) then
156 if(player:GetRace() ~= req_raza) then
157 correcto = false
158 end
159 end
160
161 if(req_nivel ~= 0) then
162 if(player:GetLevel() < req_nivel) then
163 correcto = false
164 end
165 end
166
167 if(req_nivel_gm ~= 0) then
168 if(player:GetGMRank() < req_nivel_gm) then
169 correcto = false
170 end
171 end
172
173 if(req_oro ~= 0) then
174 if(player:GetCoinage() < req_oro) then
175 correcto = false
176 end
177 end
178
179 if(req_puntos_honor ~= 0) then
180 if(player:GetHonorPoints() < req_puntos_honor) then
181 correcto = false
182 end
183 end
184
185 if(req_puntos_arena ~= 0) then
186 if(player:GetArenaPoints() < req_puntos_arena) then
187 correcto = false
188 end
189 end
190
191 if(req_logro_1 ~= 0) then
192 if(player:HasAchieved(req_logro_1) == false) then
193 correcto = false
194 end
195 end
196
197 if(req_logro_2 ~= 0) then
198 if(player:HasAchieved(req_logro_2) == false) then
199 correcto = false
200 end
201 end
202
203 if(req_logro_3 ~= 0) then
204 if(player:HasAchieved(req_logro_3) == false) then
205 correcto = false
206 end
207 end
208
209 until not promocion_requerimientos:NextRow()
210 end
211
212
213
214 -- Si es correcto añadimos la promo a la lista
215
216 if(correcto == true) then
217 player:GossipMenuAddItem(0, nombre, 1, contador)
218 end
219
220
221 contador = contador + 1
222
223
224
225 until not promociones:NextRow()
226 end
227
228
229 player:GossipMenuAddItem(0, "No quiero nada...", 1,0)
230 player:GossipSendMenu(1, creature, MenuId) -- MenuId required for player gossip
231end
232
233function OnGossipSelect(event, player, creature, sender, intid, code, menuid)
234 if (intid == 0) then
235 player:GossipComplete()
236 end
237
238 local contador = 1
239 local promociones = WorldDBQuery( "SELECT `id`, `nombre`, `unica_personaje`, `unica_cuenta`, `unica_ip` FROM `promociones`;" )
240 if (promociones) then
241 repeat
242 local promo_id = promociones:GetUInt32(0)
243 local nombre = promociones:GetString(1)
244 local unica_personaje = promociones:GetUInt32(2)
245 local unica_cuenta = promociones:GetUInt32(3)
246 local unica_ip = promociones:GetUInt32(4)
247
248 if (intid == contador) then
249 local recompensas = WorldDBQuery( "SELECT `tipo_recompensa`, `valor` FROM `promocion_recompensas` WHERE `promocion_id` = '"..promo_id.."';" )
250 if (recompensas) then
251 repeat
252 local tipo_recompensa = recompensas:GetString(0)
253 local valor = recompensas:GetUInt32(1)
254
255 if(tipo_recompensa == 'item') then
256 player:AddItem(valor, 1)
257 end
258
259 if(tipo_recompensa == 'oro') then
260 player:ModifyMoney(valor)
261 end
262
263 if(tipo_recompensa == 'honor') then
264 player:ModifyHonorPoints(valor)
265 end
266
267 if(tipo_recompensa == 'arena') then
268 player:ModifyArenaPoints(valor)
269 end
270
271 if(tipo_recompensa == 'titulo') then
272 player:SetKnownTitle(valor)
273 end
274
275 if(tipo_recompensa == 'nivel') then
276 player:SetLevel(player:GetLevel() + valor)
277 if(player:GetLevel() > maxLevelServer) then
278 player:SetLevel(maxLevelServer)
279 end
280 end
281
282 if(tipo_recompensa == 'spell') then
283 player:LearnSpell(valor)
284 end
285
286 until not recompensas:NextRow()
287 end
288
289 local player_name = player:GetName()
290 personaje = CharDBQuery( "SELECT `guid` FROM `characters` WHERE UPPER(`name`) = UPPER('"..player_name.."');" )
291 local player_guid = 0
292 if (personaje) then
293 repeat
294 player_guid = personaje:GetUInt32(0)
295 until not personaje:NextRow()
296 end
297 local player_account_id = player:GetAccountId()
298 local player_ip = player:GetPlayerIP()
299 local timestamp = os.time()
300
301 CharDBQuery( "INSERT INTO `promociones_entregadas` (`promocion_id`, `personaje_id`, `cuenta_id`, `ip`, `fecha`) VALUES ('"..promo_id.."', '"..player_guid.."', '"..player_account_id.."', '"..player_ip.."', '"..timestamp.."')" )
302
303
304 player:GossipComplete()
305 end
306
307 contador = contador + 1
308
309 until not promociones:NextRow()
310 end
311
312end
313
314
315
316local events = WorldDBQuery( "SELECT `npc_entry`, `lua_script` FROM `npc_lua` WHERE UPPER(`lua_script`) = UPPER('"..scriptName.."')" )
317if (events) then
318 repeat
319 local npc_entry = events:GetUInt32(0)
320 --RegisterCreatureGossipEvent(npc_entry, 1, OnGossipHello)
321 --RegisterCreatureGossipEvent(npc_entry, 2, OnGossipSelect)
322 until not events:NextRow()
323end