SHOW:
|
|
- or go back to the newest paste.
1 | diff --git a/config/CustomMods/Donate.ini b/config/CustomMods/Donate.ini | |
2 | index e69de29..71feaed 100644 | |
3 | --- a/config/CustomMods/Donate.ini | |
4 | +++ b/config/CustomMods/Donate.ini | |
5 | @@ -0,0 +1,59 @@ | |
6 | +#============================================================= | |
7 | +# VIP System | |
8 | +#============================================================= | |
9 | +EnableVipSystem = True | |
10 | + | |
11 | +# Enable / Disable Name Color | |
12 | +AllowVipNameColor = True | |
13 | +VipNameColor = 88AA88 | |
14 | + | |
15 | +# Enable / Disable Title Color | |
16 | +AllowVipTitleColor = True | |
17 | +VipTitleColor = 88AA88 | |
18 | + | |
19 | +# VIP Xp/Sp Rate | |
20 | +VIPXpSpRate = 1.5 | |
21 | +# VIP Adena rate | |
22 | +VIPAdenaRate = 1.5 | |
23 | +# VIP drop rate | |
24 | +VIPDropRate = 1.5 | |
25 | +# VIP spoil rate | |
26 | +VIPSpoilRate = 1.5 | |
27 | + | |
28 | +#Mensagem vip ao entrar em game | |
29 | +ScreenVIPMessageText = voce e vip por: | |
30 | +#Tempo de mensagem na tela | |
31 | +ScreenVIPMessageTime = 4 | |
32 | + | |
33 | +#Mensagem quando acabar o periodo vip | |
34 | +ScreenVIPMessageExitText = seu periodo VIP terminou! | |
35 | +#Tempo de mensagem na tela Exit | |
36 | +ScreenVIPMessageTimeExit = 4 | |
37 | + | |
38 | +#============================================================= | |
39 | +# VIP Item 1 | |
40 | +#============================================================= | |
41 | +#registrar esse nome no item no xml abaixo | |
42 | +#<set name="handler" val="VipCoin" /> | |
43 | +#Item Coin 1 | |
44 | +VipCoin = 0 | |
45 | +VipCoinDays = 1 | |
46 | + | |
47 | +#============================================================= | |
48 | +# VIP Item 2 | |
49 | +#============================================================= | |
50 | +#registrar esse nome no item no xml abaixo | |
51 | +#<set name="handler" val="VipCoin" /> | |
52 | +#Item Coin 2 | |
53 | +VipCoin2 = 0 | |
54 | +VipCoinDays2 = 30 | |
55 | + | |
56 | +#============================================================= | |
57 | +# VIP Item 3 | |
58 | +#============================================================= | |
59 | +#registrar esse nome no item no xml abaixo | |
60 | +#<set name="handler" val="VipCoin" /> | |
61 | +#Item Coin 3 | |
62 | +VipCoin3 = 0 | |
63 | +VipCoinDays3 = 45 | |
64 | + | |
65 | diff --git a/java/net/sf/l2j/Config.java b/java/net/sf/l2j/Config.java | |
66 | index 53f4314..574f9e0 100644 | |
67 | --- a/java/net/sf/l2j/Config.java | |
68 | +++ b/java/net/sf/l2j/Config.java | |
69 | @@ -43,6 +43,7 @@ | |
70 | public static final String FLAGZONEMOD = "./config/CustomMods/FlagZone.ini"; | |
71 | public static final String OFFLINEMOD = "./config/CustomMods/OfflineShop.ini"; | |
72 | public static final String PROTECTION_MODS = "./config/CustomMods/ProtectionMods.ini"; | |
73 | + public static final String DONATEMODS = "./config/CustomMods/Donate.ini"; | |
74 | // -------------------------------------------------- | |
75 | // Clans settings | |
76 | // -------------------------------------------------- | |
77 | @@ -534,7 +535,25 @@ | |
78 | public static boolean SERVER_LIST_TESTSERVER; | |
79 | public static boolean SERVER_LIST_PVPSERVER; | |
80 | public static boolean SERVER_GMONLY; | |
81 | - | |
82 | + public static boolean ENABLE_VIP_SYSTEM; | |
83 | + public static boolean ALLOW_VIP_NCOLOR; | |
84 | + public static int VIP_NCOLOR; | |
85 | + public static boolean ALLOW_VIP_TCOLOR; | |
86 | + public static int VIP_TCOLOR; | |
87 | + public static float VIP_XP_SP_RATE; | |
88 | + public static float VIP_ADENA_RATE; | |
89 | + public static float VIP_DROP_RATE; | |
90 | + public static float VIP_SPOIL_RATE; | |
91 | + public static String MESSAGE_VIP_ENTER; | |
92 | + public static int MESSAGE_TIME_VIP; | |
93 | + public static String MESSAGE_VIP_EXIT; | |
94 | + public static int MESSAGE_EXIT_VIP_TIME; | |
95 | + public static int VIP_COIN_ID1; | |
96 | + public static int VIP_DAYS_ID1; | |
97 | + public static int VIP_COIN_ID2; | |
98 | + public static int VIP_DAYS_ID2; | |
99 | + public static int VIP_COIN_ID3; | |
100 | + public static int VIP_DAYS_ID3; | |
101 | /** clients related */ | |
102 | public static int DELETE_DAYS; | |
103 | public static int MAXIMUM_ONLINE_USERS; | |
104 | @@ -1188,6 +1207,30 @@ | |
105 | ||
106 | } | |
107 | ||
108 | + private static final void loadDonate() | |
109 | + { | |
110 | + final ExProperties Donate = initProperties(DONATEMODS); | |
111 | + ENABLE_VIP_SYSTEM = Boolean.parseBoolean(Donate.getProperty("EnableVipSystem", "True")); | |
112 | + ALLOW_VIP_NCOLOR = Boolean.parseBoolean(Donate.getProperty("AllowVipNameColor", "True")); | |
113 | + VIP_NCOLOR = Integer.decode("0x" + Donate.getProperty("VipNameColor", "88AA88")); | |
114 | + ALLOW_VIP_TCOLOR = Boolean.parseBoolean(Donate.getProperty("AllowVipTitleColor", "True")); | |
115 | + VIP_TCOLOR = Integer.decode("0x" + Donate.getProperty("VipTitleColor", "88AA88")); | |
116 | + VIP_XP_SP_RATE = Float.parseFloat(Donate.getProperty("VIPXpSpRate", "1.5")); | |
117 | + VIP_ADENA_RATE = Float.parseFloat(Donate.getProperty("VIPAdenaRate", "1.5")); | |
118 | + VIP_DROP_RATE = Float.parseFloat(Donate.getProperty("VIPDropRate", "1.5")); | |
119 | + VIP_SPOIL_RATE = Float.parseFloat(Donate.getProperty("VIPSpoilRate", "1.5")); | |
120 | + MESSAGE_VIP_ENTER = Donate.getProperty("ScreenVIPMessageText", "Forbidden to Use Enchant near the bank!"); | |
121 | + MESSAGE_TIME_VIP = Integer.parseInt(Donate.getProperty("ScreenVIPMessageTime", "6")) * 1000; | |
122 | + MESSAGE_VIP_EXIT = Donate.getProperty("ScreenVIPMessageExitText", "Forbidden to Use Enchant near the bank!"); | |
123 | + MESSAGE_EXIT_VIP_TIME = Integer.parseInt(Donate.getProperty("ScreenVIPMessageTimeExit", "6")) * 1000; | |
124 | + VIP_COIN_ID1 = Integer.parseInt(Donate.getProperty("VipCoin", "6392")); | |
125 | + VIP_DAYS_ID1 = Integer.parseInt(Donate.getProperty("VipCoinDays", "1")); | |
126 | + VIP_COIN_ID2 = Integer.parseInt(Donate.getProperty("VipCoin2", "6393")); | |
127 | + VIP_DAYS_ID2 = Integer.parseInt(Donate.getProperty("VipCoinDays2", "2")); | |
128 | + VIP_COIN_ID3 = Integer.parseInt(Donate.getProperty("VipCoin3", "5557")); | |
129 | + VIP_DAYS_ID3 = Integer.parseInt(Donate.getProperty("VipCoinDays3", "3")); | |
130 | + } | |
131 | + | |
132 | private static final void loadFlag() | |
133 | { | |
134 | final ExProperties flagzone = initProperties(FLAGZONEMOD); | |
135 | @@ -1652,6 +1695,7 @@ | |
136 | loadCommands(); | |
137 | loadScheme(); | |
138 | loadFlag(); | |
139 | + loadDonate(); | |
140 | loadBoss(); | |
141 | loadNewChar(); | |
142 | // players settings | |
143 | diff --git a/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java b/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java | |
144 | index 56beb09..99efa93 100644 | |
145 | --- a/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java | |
146 | +++ b/java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java | |
147 | @@ -34,6 +34,7 @@ | |
148 | import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTarget; | |
149 | import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTeleport; | |
150 | import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTest; | |
151 | +import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminVip; | |
152 | import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminZone; | |
153 | ||
154 | public class AdminCommandHandler | |
155 | @@ -42,6 +43,7 @@ | |
156 | ||
157 | protected AdminCommandHandler() | |
158 | { | |
159 | + registerHandler(new AdminVip()); | |
160 | registerHandler(new AdminAdmin()); | |
161 | registerHandler(new AdminAnnouncements()); | |
162 | registerHandler(new AdminBookmark()); | |
163 | diff --git a/java/net/sf/l2j/gameserver/handler/ItemHandler.java b/java/net/sf/l2j/gameserver/handler/ItemHandler.java | |
164 | index cf6ae07..dbc54c4 100644 | |
165 | --- a/java/net/sf/l2j/gameserver/handler/ItemHandler.java | |
166 | +++ b/java/net/sf/l2j/gameserver/handler/ItemHandler.java | |
167 | @@ -29,6 +29,7 @@ | |
168 | import net.sf.l2j.gameserver.handler.itemhandlers.SpecialXMas; | |
169 | import net.sf.l2j.gameserver.handler.itemhandlers.SpiritShots; | |
170 | import net.sf.l2j.gameserver.handler.itemhandlers.SummonItems; | |
171 | +import net.sf.l2j.gameserver.handler.itemhandlers.VipCoin; | |
172 | import net.sf.l2j.gameserver.model.item.kind.EtcItem; | |
173 | ||
174 | public class ItemHandler | |
175 | @@ -37,6 +38,7 @@ | |
176 | ||
177 | protected ItemHandler() | |
178 | { | |
179 | + registerHandler(new VipCoin()); | |
180 | registerHandler(new BeastSoulShots()); | |
181 | registerHandler(new BeastSpices()); | |
182 | registerHandler(new BeastSpiritShots()); | |
183 | diff --git a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminVip.java b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminVip.java | |
184 | new file mode 100644 | |
185 | index 0000000..6b957e3 | |
186 | --- /dev/null | |
187 | +++ b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminVip.java | |
188 | @@ -0,0 +1,213 @@ | |
189 | +/* | |
190 | + * This program is free software; you can redistribute it and/or modify | |
191 | + * it under the terms of the GNU General Public License as published by | |
192 | + * the Free Software Foundation; either version 2, or (at your option) | |
193 | + * any later version. | |
194 | + * | |
195 | + * This program is distributed in the hope that it will be useful, | |
196 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
197 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
198 | + * GNU General Public License for more details. | |
199 | + * | |
200 | + * You should have received a copy of the GNU General Public License | |
201 | + * along with this program; if not, write to the Free Software | |
202 | + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
203 | + * 02111-1307, USA. | |
204 | + * | |
205 | + * http://www.gnu.org/copyleft/gpl.html | |
206 | + */ | |
207 | +package net.sf.l2j.gameserver.handler.admincommandhandlers; | |
208 | + | |
209 | +import java.sql.Connection; | |
210 | +import java.sql.PreparedStatement; | |
211 | +import java.util.StringTokenizer; | |
212 | +import java.util.logging.Level; | |
213 | +import java.util.logging.Logger; | |
214 | + | |
215 | +import net.sf.l2j.commons.pool.ConnectionPool; | |
216 | + | |
217 | +import net.sf.l2j.Config; | |
218 | +import net.sf.l2j.gameserver.data.xml.AdminData; | |
219 | +import net.sf.l2j.gameserver.enums.SayType; | |
220 | +import net.sf.l2j.gameserver.handler.IAdminCommandHandler; | |
221 | +import net.sf.l2j.gameserver.model.World; | |
222 | +import net.sf.l2j.gameserver.model.WorldObject; | |
223 | +import net.sf.l2j.gameserver.model.actor.Player; | |
224 | +import net.sf.l2j.gameserver.network.serverpackets.CreatureSay; | |
225 | +/** | |
226 | + * | |
227 | + * @author Sarada | |
228 | + * | |
229 | + */ | |
230 | +public class AdminVip implements IAdminCommandHandler | |
231 | +{ | |
232 | + private static String[] _adminCommands = { "admin_setvip", "admin_removevip" }; | |
233 | + private final static Logger _log = Logger.getLogger(AdminVip.class.getName()); | |
234 | + | |
235 | + @Override | |
236 | + public void useAdminCommand(String command, Player activeChar) | |
237 | + { | |
238 | + if (command.startsWith("admin_setvip")) | |
239 | + { | |
240 | + StringTokenizer str = new StringTokenizer(command); | |
241 | + | |
242 | + WorldObject target = activeChar.getTarget(); | |
243 | + Player player = null; | |
244 | + | |
245 | + if (target != null && target instanceof Player) | |
246 | + player = (Player)target; | |
247 | + else | |
248 | + player = activeChar; | |
249 | + | |
250 | + try | |
251 | + { | |
252 | + str.nextToken(); | |
253 | + String time = str.nextToken(); | |
254 | + if (str.hasMoreTokens()) | |
255 | + { | |
256 | + String playername = time; | |
257 | + time = str.nextToken(); | |
258 | + player = World.getInstance().getPlayer(playername); | |
259 | + doVip(activeChar, player, playername, time); | |
260 | + } | |
261 | + else | |
262 | + { | |
263 | + String playername = player.getName(); | |
264 | + doVip(activeChar, player, playername, time); | |
265 | + } | |
266 | + } | |
267 | + catch(Exception e) | |
268 | + { | |
269 | + activeChar.sendMessage("Usage: //setvip <char_name> [time](in days)"); | |
270 | + } | |
271 | + | |
272 | + player.broadcastUserInfo(); | |
273 | + | |
274 | + if(player.isVip()) | |
275 | + return; | |
276 | + } | |
277 | + else if(command.startsWith("admin_removevip")) | |
278 | + { | |
279 | + StringTokenizer str = new StringTokenizer(command); | |
280 | + | |
281 | + WorldObject target = activeChar.getTarget(); | |
282 | + Player player = null; | |
283 | + | |
284 | + if (target instanceof Player) | |
285 | + player = (Player)target; | |
286 | + else | |
287 | + player = activeChar; | |
288 | + | |
289 | + try | |
290 | + { | |
291 | + str.nextToken(); | |
292 | + | |
293 | + if (str.hasMoreTokens()) | |
294 | + { | |
295 | + String playername = str.nextToken(); | |
296 | + player = World.getInstance().getPlayer(playername); | |
297 | + removeVip(activeChar, player, playername); | |
298 | + } | |
299 | + else | |
300 | + { | |
301 | + String playername = player.getName(); | |
302 | + removeVip(activeChar, player, playername); | |
303 | + } | |
304 | + } | |
305 | + catch(Exception e) | |
306 | + { | |
307 | + activeChar.sendMessage("Usage: //removevip <char_name>"); | |
308 | + } | |
309 | + | |
310 | + player.broadcastUserInfo(); | |
311 | + | |
312 | + if(player.isVip()) | |
313 | + return; | |
314 | + } | |
315 | + return; | |
316 | + } | |
317 | + | |
318 | + public void doVip(Player activeChar, Player _player, String _playername, String _time) | |
319 | + { | |
320 | + int days = Integer.parseInt(_time); | |
321 | + | |
322 | + if (_player == null) | |
323 | + { | |
324 | + activeChar.sendMessage("Character not found."); | |
325 | + return; | |
326 | + } | |
327 | + if (_player.isVip()) | |
328 | + { | |
329 | + activeChar.sendMessage("Player " + _playername + " is already an VIP."); | |
330 | + return; | |
331 | + } | |
332 | + | |
333 | + if(days > 0) | |
334 | + { | |
335 | + _player.setVip(true); | |
336 | + _player.setEndTime("vip", days); | |
337 | + _player.sendPacket(new CreatureSay(0,SayType.PARTYROOM_COMMANDER,"System","Dear player, you are now an VIP, congratulations.")); | |
338 | + | |
339 | + try (Connection con = ConnectionPool.getConnection()) | |
340 | + { | |
341 | + PreparedStatement statement = con.prepareStatement("UPDATE characters SET vip=1, vip_end=? WHERE obj_id=?"); | |
342 | + statement.setLong(1, _player.getVipEndTime()); | |
343 | + statement.setInt(2, _player.getObjectId()); | |
344 | + statement.execute(); | |
345 | + statement.close(); | |
346 | + | |
347 | + if(Config.ALLOW_VIP_NCOLOR) | |
348 | + _player.getAppearance().setNameColor(Config.VIP_NCOLOR); | |
349 | + | |
350 | + if(Config.ALLOW_VIP_TCOLOR) | |
351 | + _player.getAppearance().setTitleColor(Config.VIP_TCOLOR); | |
352 | + | |
353 | + _player.broadcastUserInfo(); | |
354 | + _player.sendSkillList(); | |
355 | + | |
356 | + AdminData.getInstance().broadcastMessageToGMs("GM "+ activeChar.getName()+ " set an VIP status for player "+ _playername + " for " + _time + " day(s)"); | |
357 | + } | |
358 | + catch (Exception e) | |
359 | + { | |
360 | + _log.log(Level.WARNING,"Something went wrong, check log folder for details", e); | |
361 | + } | |
362 | + } | |
363 | + } | |
364 | + | |
365 | + public void removeVip(Player activeChar, Player _player, String _playername) | |
366 | + { | |
367 | + if (!_player.isVip()) | |
368 | + { | |
369 | + activeChar.sendMessage("Player " + _playername + " is not an VIP."); | |
370 | + return; | |
371 | + } | |
372 | + | |
373 | + _player.setVip(false); | |
374 | + _player.setVipEndTime(0); | |
375 | + | |
376 | + try (Connection con = ConnectionPool.getConnection()) | |
377 | + { | |
378 | + PreparedStatement statement = con.prepareStatement("UPDATE characters SET Vip=0, Vip_end=0 WHERE obj_id=?"); | |
379 | + statement.setInt(1, _player.getObjectId()); | |
380 | + statement.execute(); | |
381 | + statement.close(); | |
382 | + | |
383 | + _player.getAppearance().setNameColor(0xFFFF77); | |
384 | + _player.getAppearance().setTitleColor(0xFFFF77); | |
385 | + _player.broadcastUserInfo(); | |
386 | + _player.sendSkillList(); | |
387 | + | |
388 | + AdminData.getInstance().broadcastMessageToGMs("GM "+activeChar.getName()+" removed Vip status of player "+ _playername); | |
389 | + } | |
390 | + catch (Exception e) | |
391 | + { | |
392 | + _log.log(Level.WARNING,"Something went wrong, check log folder for details", e); | |
393 | + } | |
394 | + } | |
395 | + | |
396 | + @Override | |
397 | + public String[] getAdminCommandList() | |
398 | + { | |
399 | + return _adminCommands; | |
400 | + } | |
401 | +} | |
402 | \ No newline at end of file | |
403 | diff --git a/java/net/sf/l2j/gameserver/handler/itemhandlers/VipCoin.java b/java/net/sf/l2j/gameserver/handler/itemhandlers/VipCoin.java | |
404 | new file mode 100644 | |
405 | index 0000000..c80e15a | |
406 | --- /dev/null | |
407 | +++ b/java/net/sf/l2j/gameserver/handler/itemhandlers/VipCoin.java | |
408 | @@ -0,0 +1,149 @@ | |
409 | +package net.sf.l2j.gameserver.handler.itemhandlers; | |
410 | + | |
411 | +import java.util.Calendar; | |
412 | + | |
413 | +import net.sf.l2j.Config; | |
414 | +import net.sf.l2j.gameserver.handler.IItemHandler; | |
415 | +import net.sf.l2j.gameserver.model.actor.Playable; | |
416 | +import net.sf.l2j.gameserver.model.actor.Player; | |
417 | +import net.sf.l2j.gameserver.model.item.instance.ItemInstance; | |
418 | +import net.sf.l2j.gameserver.network.serverpackets.EtcStatusUpdate; | |
419 | + | |
420 | +/** | |
421 | + * | |
422 | + * @author Sarada | |
423 | + * | |
424 | + */ | |
425 | +public class VipCoin implements IItemHandler | |
426 | +{ | |
427 | + private static final int ITEM_IDS[] = { Config.VIP_COIN_ID1, Config.VIP_COIN_ID2, Config.VIP_COIN_ID3}; | |
428 | + | |
429 | + @Override | |
430 | + public void useItem(Playable playable, ItemInstance item, boolean forceUse) | |
431 | + { | |
432 | + if (!(playable instanceof Player)) | |
433 | + return; | |
434 | + | |
435 | + Player activeChar = (Player)playable; | |
436 | + | |
437 | + int itemId = item.getItemId(); | |
438 | + | |
439 | + if (itemId == Config.VIP_COIN_ID1) | |
440 | + { | |
441 | + if (activeChar.isInOlympiadMode()) | |
442 | + { | |
443 | + activeChar.sendMessage("This item cannot be used on Olympiad Games."); | |
444 | + return; | |
445 | + } | |
446 | + else if (activeChar.isVip()) | |
447 | + { | |
448 | + activeChar.sendMessage("You Are Vip!."); | |
449 | + return; | |
450 | + } | |
451 | + if (activeChar.destroyItem("Consume", item.getObjectId(), 1, null, false)) | |
452 | + { | |
453 | + if (activeChar.isVip()) | |
454 | + { | |
455 | + long daysleft = (activeChar.getVipEndTime() - Calendar.getInstance().getTimeInMillis()) / 86400000L; | |
456 | + activeChar.setEndTime("vip", (int)(daysleft + Config.VIP_DAYS_ID1)); | |
457 | + activeChar.sendMessage("Congratulations, You just received another " + Config.VIP_DAYS_ID1 + " day of VIP."); | |
458 | + } | |
459 | + else | |
460 | + { | |
461 | + activeChar.setVip(true); | |
462 | + activeChar.setEndTime("vip", Config.VIP_DAYS_ID1); | |
463 | + activeChar.sendMessage("Congrats, you just became VIP per " + Config.VIP_DAYS_ID1 + " day."); | |
464 | + } | |
465 | + | |
466 | + if (Config.ALLOW_VIP_NCOLOR && activeChar.isVip()) | |
467 | + activeChar.getAppearance().setNameColor(Config.VIP_NCOLOR); | |
468 | + | |
469 | + if (Config.ALLOW_VIP_TCOLOR && activeChar.isVip()) | |
470 | + activeChar.getAppearance().setTitleColor(Config.VIP_TCOLOR); | |
471 | + | |
472 | + activeChar.broadcastUserInfo(); | |
473 | + activeChar.sendPacket(new EtcStatusUpdate(activeChar)); | |
474 | + } | |
475 | + } | |
476 | + | |
477 | + if (itemId == Config.VIP_COIN_ID2) | |
478 | + { | |
479 | + if (activeChar.isInOlympiadMode()) | |
480 | + { | |
481 | + activeChar.sendMessage("This item cannot be used on Olympiad Games."); | |
482 | + return; | |
483 | + } | |
484 | + else if (activeChar.isVip()) | |
485 | + { | |
486 | + activeChar.sendMessage("You Are Vip!."); | |
487 | + return; | |
488 | + } | |
489 | + if (activeChar.destroyItem("Consume", item.getObjectId(), 1, null, false)) | |
490 | + { | |
491 | + if (activeChar.isVip()) | |
492 | + { | |
493 | + long daysleft = (activeChar.getVipEndTime() - Calendar.getInstance().getTimeInMillis()) / 86400000L; | |
494 | + activeChar.setEndTime("vip", (int)(daysleft + Config.VIP_DAYS_ID2)); | |
495 | + activeChar.sendMessage("Congratulations, You just received another " + Config.VIP_DAYS_ID2 + " day of VIP."); | |
496 | + } | |
497 | + else | |
498 | + { | |
499 | + activeChar.setVip(true); | |
500 | + activeChar.setEndTime("vip", Config.VIP_DAYS_ID2); | |
501 | + activeChar.sendMessage("Congrats, you just became VIP per " + Config.VIP_DAYS_ID2 + " day."); | |
502 | + } | |
503 | + | |
504 | + if (Config.ALLOW_VIP_NCOLOR && activeChar.isVip()) | |
505 | + activeChar.getAppearance().setNameColor(Config.VIP_NCOLOR); | |
506 | + | |
507 | + if (Config.ALLOW_VIP_TCOLOR && activeChar.isVip()) | |
508 | + activeChar.getAppearance().setTitleColor(Config.VIP_TCOLOR); | |
509 | + | |
510 | + activeChar.broadcastUserInfo(); | |
511 | + activeChar.sendPacket(new EtcStatusUpdate(activeChar)); | |
512 | + } | |
513 | + } | |
514 | + | |
515 | + if (itemId == Config.VIP_COIN_ID3) | |
516 | + { | |
517 | + if (activeChar.isInOlympiadMode()) | |
518 | + { | |
519 | + activeChar.sendMessage("This item cannot be used on Olympiad Games."); | |
520 | + return; | |
521 | + } | |
522 | + else if (activeChar.isVip()) | |
523 | + { | |
524 | + activeChar.sendMessage("You Are Vip!."); | |
525 | + return; | |
526 | + } | |
527 | + if (activeChar.destroyItem("Consume", item.getObjectId(), 1, null, false)) | |
528 | + { | |
529 | + if (activeChar.isVip()) | |
530 | + { | |
531 | + long daysleft = (activeChar.getVipEndTime() - Calendar.getInstance().getTimeInMillis()) / 86400000L; | |
532 | + activeChar.setEndTime("vip", (int)(daysleft + Config.VIP_DAYS_ID3)); | |
533 | + activeChar.sendMessage("Congratulations, You just received another " + Config.VIP_DAYS_ID3 + " day of VIP."); | |
534 | + } | |
535 | + else | |
536 | + { | |
537 | + activeChar.setVip(true); | |
538 | + activeChar.setEndTime("vip", Config.VIP_DAYS_ID3); | |
539 | + activeChar.sendMessage("Congrats, you just became VIP per " + Config.VIP_DAYS_ID3 + " day."); | |
540 | + } | |
541 | + | |
542 | + if (Config.ALLOW_VIP_NCOLOR && activeChar.isVip()) | |
543 | + activeChar.getAppearance().setNameColor(Config.VIP_NCOLOR); | |
544 | + | |
545 | + if (Config.ALLOW_VIP_TCOLOR && activeChar.isVip()) | |
546 | + activeChar.getAppearance().setTitleColor(Config.VIP_TCOLOR); | |
547 | + | |
548 | + activeChar.broadcastUserInfo(); | |
549 | + activeChar.sendPacket(new EtcStatusUpdate(activeChar)); | |
550 | + } | |
551 | + } | |
552 | + } | |
553 | + public int[] getItemIds() | |
554 | + { | |
555 | + return ITEM_IDS; | |
556 | + } | |
557 | +} | |
558 | diff --git a/java/net/sf/l2j/gameserver/model/actor/Player.java b/java/net/sf/l2j/gameserver/model/actor/Player.java | |
559 | index de2c3e1..6c99cca 100644 | |
560 | --- a/java/net/sf/l2j/gameserver/model/actor/Player.java | |
561 | +++ b/java/net/sf/l2j/gameserver/model/actor/Player.java | |
562 | @@ -5,6 +5,7 @@ | |
563 | import java.sql.ResultSet; | |
564 | import java.util.ArrayList; | |
565 | import java.util.Arrays; | |
566 | +import java.util.Calendar; | |
567 | import java.util.Collection; | |
568 | import java.util.Comparator; | |
569 | import java.util.HashMap; | |
570 | @@ -237,7 +238,7 @@ | |
571 | private static final String DELETE_SKILL_SAVE = "DELETE FROM character_skills_save WHERE char_obj_id=? AND class_index=?"; | |
572 | ||
573 | private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,obj_Id,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,nobless,power_grade) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; | |
574 | - private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=? WHERE obj_id=?"; | |
575 | + private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,vip=?,vip_end=? WHERE obj_id=?"; | |
576 | private static final String RESTORE_CHARACTER = "SELECT * FROM characters WHERE obj_id=?"; | |
577 | ||
578 | private static final String RESTORE_CHAR_SUBCLASSES = "SELECT class_id,exp,sp,level,class_index FROM character_subclasses WHERE char_obj_id=? ORDER BY class_index ASC"; | |
579 | @@ -320,7 +321,9 @@ | |
580 | private int _mountNpcId; | |
581 | private int _mountLevel; | |
582 | private int _mountObjectId; | |
583 | - | |
584 | + /** VIP System */ | |
585 | + private boolean _isVip = false; | |
586 | + private long _vip_endTime = 0; | |
587 | protected int _throneId; | |
588 | ||
589 | private TeleportMode _teleportMode = TeleportMode.NONE; | |
590 | @@ -4344,6 +4347,8 @@ | |
591 | player.setAllianceWithVarkaKetra(rs.getInt("varka_ketra_ally")); | |
592 | ||
593 | player.setDeathPenaltyBuffLevel(rs.getInt("death_penalty_level")); | |
594 | + player.setVip(rs.getInt("vip") == 1 ? true : false); | |
595 | + player.setVipEndTime(rs.getLong("vip_end")); | |
596 | ||
597 | // Set the position of the Player. | |
598 | player.getPosition().set(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("heading")); | |
599 | @@ -4574,7 +4579,9 @@ | |
600 | ps.setLong(44, getClanCreateExpiryTime()); | |
601 | ps.setString(45, getName()); | |
602 | ps.setLong(46, getDeathPenaltyBuffLevel()); | |
603 | - ps.setInt(47, getObjectId()); | |
604 | + ps.setInt(47, isVip() ? 1 : 0); | |
605 | + ps.setLong(48, getVipEndTime()); | |
606 | + ps.setInt(49, getObjectId()); | |
607 | ||
608 | ps.execute(); | |
609 | } | |
610 | @@ -4705,7 +4712,25 @@ | |
611 | LOGGER.error("Couldn't store player effects.", e); | |
612 | } | |
613 | } | |
614 | + public boolean isVip() | |
615 | + { | |
616 | + return _isVip; | |
617 | + } | |
618 | ||
619 | + public void setVip(boolean val) | |
620 | + { | |
621 | + _isVip = val; | |
622 | + } | |
623 | + | |
624 | + public long getVipEndTime() | |
625 | + { | |
626 | + return _vip_endTime; | |
627 | + } | |
628 | + | |
629 | + public void setVipEndTime(long val) | |
630 | + { | |
631 | + _vip_endTime = val; | |
632 | + } | |
633 | /** | |
634 | * @return True if the Player is online. | |
635 | */ | |
636 | @@ -4713,7 +4738,22 @@ | |
637 | { | |
638 | return _isOnline; | |
639 | } | |
640 | - | |
641 | + /** | |
642 | + * Sets the end time. | |
643 | + * @param process the process | |
644 | + * @param val the val | |
645 | + */ | |
646 | + public void setEndTime(String process, int val) | |
647 | + { | |
648 | + Calendar calendar = Calendar.getInstance(); | |
649 | + calendar.add(Calendar.DAY_OF_MONTH, val); | |
650 | + long end_day = calendar.getTimeInMillis(); | |
651 | + | |
652 | + if(process.equals("vip")) | |
653 | + _vip_endTime = end_day; | |
654 | + /*if(process.equals("aio")) | |
655 | + _aio_endTime = end_day;*/ | |
656 | + } | |
657 | /** | |
658 | * @return an int interpretation of online status. | |
659 | */ | |
660 | diff --git a/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java b/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java | |
661 | index 51afb41..8663495 100644 | |
662 | --- a/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java | |
663 | +++ b/java/net/sf/l2j/gameserver/model/actor/instance/Monster.java | |
664 | @@ -70,6 +70,7 @@ | |
665 | super(objectId, template); | |
666 | } | |
667 | ||
668 | + @SuppressWarnings("cast") | |
669 | @Override | |
670 | protected void calculateRewards(Creature creature) | |
671 | { | |
672 | @@ -163,7 +164,16 @@ | |
673 | ||
674 | long exp = expSp[0]; | |
675 | int sp = expSp[1]; | |
676 | - | |
677 | + if (attacker instanceof Player) | |
678 | + { | |
679 | + Player a = (Player)attacker; | |
680 | + | |
681 | + if (a.isVip()) | |
682 | + { | |
683 | + exp *= Config.VIP_XP_SP_RATE; | |
684 | + sp *= Config.VIP_XP_SP_RATE; | |
685 | + } | |
686 | + } | |
687 | exp *= 1 - penalty; | |
688 | ||
689 | // Test over-hit. | |
690 | @@ -234,7 +244,16 @@ | |
691 | final int[] expSp = calculateExpAndSp(levelDiff, partyDmg, totalDamage); | |
692 | long exp = expSp[0]; | |
693 | int sp = expSp[1]; | |
694 | - | |
695 | + if (attacker instanceof Player) | |
696 | + { | |
697 | + Player a = (Player)attacker; | |
698 | + | |
699 | + if (a.isVip()) | |
700 | + { | |
701 | + exp *= Config.VIP_XP_SP_RATE; | |
702 | + sp *= Config.VIP_XP_SP_RATE; | |
703 | + } | |
704 | + } | |
705 | exp *= partyMul; | |
706 | sp *= partyMul; | |
707 | ||
708 | @@ -514,12 +533,13 @@ | |
709 | ||
710 | /** | |
711 | * Calculate the quantity for a specific drop. | |
712 | + * @param lastAttacker | |
713 | * @param drop : The {@link DropData} informations to use. | |
714 | * @param levelModifier : The level modifier (will be subtracted from drop chance). | |
715 | * @param isSweep : If True, use the spoil drop chance. | |
716 | * @return An {@link IntIntHolder} corresponding to the item id and count. | |
717 | */ | |
718 | - private IntIntHolder calculateRewardItem(DropData drop, int levelModifier, boolean isSweep) | |
719 | + private IntIntHolder calculateRewardItem(Player lastAttacker,DropData drop, int levelModifier, boolean isSweep) | |
720 | { | |
721 | // Get default drop chance | |
722 | double dropChance = drop.getChance(); | |
723 | @@ -547,11 +567,23 @@ | |
724 | // Applies Drop rates | |
725 | if (drop.getItemId() == 57) | |
726 | dropChance *= Config.RATE_DROP_ADENA; | |
727 | + if (lastAttacker.isVip()) | |
728 | + { | |
729 | + dropChance *= Config.VIP_ADENA_RATE; | |
730 | + } | |
731 | + | |
732 | else if (isSweep) | |
733 | dropChance *= Config.RATE_DROP_SPOIL; | |
734 | + if (lastAttacker.isVip()) | |
735 | + { | |
736 | + dropChance *= Config.VIP_SPOIL_RATE; | |
737 | + } | |
738 | else | |
739 | dropChance *= (isRaidBoss()) ? Config.RATE_DROP_ITEMS_BY_RAID : Config.RATE_DROP_ITEMS; | |
740 | - | |
741 | + if (lastAttacker.isVip()) | |
742 | + { | |
743 | + dropChance *= Config.VIP_DROP_RATE; | |
744 | + } | |
745 | // Set our limits for chance of drop | |
746 | if (dropChance < 1) | |
747 | dropChance = 1; | |
748 | @@ -589,11 +621,12 @@ | |
749 | * Calculate the quantity for a specific drop, according its {@link DropCategory}.<br> | |
750 | * <br> | |
751 | * Only a maximum of ONE item from a {@link DropCategory} is allowed to be dropped. | |
752 | + * @param lastAttacker | |
753 | * @param cat : The {@link DropCategory} informations to use. | |
754 | * @param levelModifier : The level modifier (will be subtracted from drop chance). | |
755 | * @return An {@link IntIntHolder} corresponding to the item id and count. | |
756 | */ | |
757 | - private IntIntHolder calculateCategorizedRewardItem(DropCategory cat, int levelModifier) | |
758 | + private IntIntHolder calculateCategorizedRewardItem(Player lastAttacker,DropCategory cat, int levelModifier) | |
759 | { | |
760 | if (cat == null) | |
761 | return null; | |
762 | @@ -641,9 +674,16 @@ | |
763 | double dropChance = drop.getChance(); | |
764 | if (drop.getItemId() == 57) | |
765 | dropChance *= Config.RATE_DROP_ADENA; | |
766 | + if (lastAttacker.isVip()) | |
767 | + { | |
768 | + dropChance *= Config.VIP_ADENA_RATE; | |
769 | + } | |
770 | else | |
771 | dropChance *= (isRaidBoss()) ? Config.RATE_DROP_ITEMS_BY_RAID : Config.RATE_DROP_ITEMS; | |
772 | - | |
773 | + if (lastAttacker.isVip()) | |
774 | + { | |
775 | + dropChance *= Config.VIP_DROP_RATE; | |
776 | + } | |
777 | if (dropChance < DropData.MAX_CHANCE) | |
778 | dropChance = DropData.MAX_CHANCE; | |
779 | ||
780 | @@ -838,7 +878,7 @@ | |
781 | { | |
782 | for (DropData drop : cat.getAllDrops()) | |
783 | { | |
784 | - holder = calculateRewardItem(drop, levelModifier, true); | |
785 | + holder = calculateRewardItem(player,drop, levelModifier, true); | |
786 | if (holder == null) | |
787 | continue; | |
788 | ||
789 | @@ -854,10 +894,10 @@ | |
790 | if (drop == null) | |
791 | continue; | |
792 | ||
793 | - holder = calculateRewardItem(drop, levelModifier, false); | |
794 | + holder = calculateRewardItem(player,drop, levelModifier, false); | |
795 | } | |
796 | else | |
797 | - holder = calculateCategorizedRewardItem(cat, levelModifier); | |
798 | + holder = calculateCategorizedRewardItem(player,cat, levelModifier); | |
799 | ||
800 | if (holder == null) | |
801 | continue; | |
802 | diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java b/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java | |
803 | index 3e30838..9f6addd 100644 | |
804 | --- a/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java | |
805 | +++ b/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java | |
806 | @@ -1,5 +1,7 @@ | |
807 | package net.sf.l2j.gameserver.network.clientpackets; | |
808 | ||
809 | +import java.util.Calendar; | |
810 | +import java.util.Date; | |
811 | import java.util.Map.Entry; | |
812 | ||
813 | import net.sf.l2j.Config; | |
814 | @@ -37,6 +39,7 @@ | |
815 | import net.sf.l2j.gameserver.network.serverpackets.Die; | |
816 | import net.sf.l2j.gameserver.network.serverpackets.EtcStatusUpdate; | |
817 | import net.sf.l2j.gameserver.network.serverpackets.ExMailArrived; | |
818 | +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage; | |
819 | import net.sf.l2j.gameserver.network.serverpackets.ExStorageMaxCount; | |
820 | import net.sf.l2j.gameserver.network.serverpackets.FriendList; | |
821 | import net.sf.l2j.gameserver.network.serverpackets.HennaInfo; | |
822 | @@ -241,6 +244,16 @@ | |
823 | player.sendMessage("I'm sorry, but multibox is not allowed here."); | |
824 | player.logout(true); | |
825 | } | |
826 | + | |
827 | + if(player.isVip()) | |
828 | + onEnterVip(player); | |
829 | + | |
830 | + if(Config.ALLOW_VIP_NCOLOR && player.isVip()) | |
831 | + player.getAppearance().setNameColor(Config.VIP_NCOLOR); | |
832 | + | |
833 | + if(Config.ALLOW_VIP_TCOLOR && player.isVip()) | |
834 | + player.getAppearance().setTitleColor(Config.VIP_TCOLOR); | |
835 | + | |
836 | // If the Player is a Dark Elf, check for Shadow Sense at night. | |
837 | if (player.getRace() == ClassRace.DARK_ELF && player.hasSkill(L2Skill.SKILL_SHADOW_SENSE)) | |
838 | player.sendPacket(SystemMessage.getSystemMessage((GameTimeTaskManager.getInstance().isNight()) ? SystemMessageId.NIGHT_S1_EFFECT_APPLIES : SystemMessageId.DAY_S1_EFFECT_DISAPPEARS).addSkillName(L2Skill.SKILL_SHADOW_SENSE)); | |
839 | @@ -320,7 +333,25 @@ | |
840 | { | |
841 | activeChar.sendMessage("Next Restart: " + Restart.getInstance().getRestartNextTime()); | |
842 | } | |
843 | - | |
844 | + private static void onEnterVip(Player activeChar) | |
845 | + { | |
846 | + long now = Calendar.getInstance().getTimeInMillis(); | |
847 | + long endDay = activeChar.getVipEndTime(); | |
848 | + if(now > endDay) | |
849 | + { | |
850 | + activeChar.setVip(false); | |
851 | + activeChar.setVipEndTime(0); | |
852 | + //activeChar.sendPacket(new CreatureSay(0,Say2.PARTY,"System","Your VIP period ends.")); | |
853 | + activeChar.sendPacket(new ExShowScreenMessage(Config.MESSAGE_VIP_EXIT, Config.MESSAGE_EXIT_VIP_TIME)); | |
854 | + } | |
855 | + else | |
856 | + { | |
857 | + Date dt = new Date(endDay); | |
858 | + if(activeChar.isVip()) | |
859 | + //activeChar.sendMessage("Your VIP period ends at: " + dt); | |
860 | + activeChar.sendPacket(new ExShowScreenMessage(Config.MESSAGE_VIP_ENTER + dt, Config.MESSAGE_TIME_VIP)); | |
861 | + } | |
862 | + } | |
863 | @Override | |
864 | protected boolean triggersOnActionRequest() | |
865 | { | |
866 | ||
867 | Colocar num bloco de notas e salvar como SQL e executar em seu navicat | |
868 | +ALTER TABLE `characters` ADD COLUMN `vip` decimal(1,0) NOT NULL DEFAULT 0 AFTER `death_penalty_level`; | |
869 | +ALTER TABLE `characters` ADD COLUMN `vip_end` decimal(20,0) NOT NULL DEFAULT 0 AFTER `vip`; | |
870 | ||
871 | Registrar admincomands no xml | |
872 | +<aCar name="admin_setvip" accessLevel="7" /> | |
873 | +<aCar name="admin_removevip" accessLevel="7" /> |