View difference between Paste ID: CBC402yx and 1Wq6GZPs
SHOW: | | - or go back to the newest paste.
1
diff --git a/aCis_gameserver/config/votesystem.properties b/aCis_gameserver/config/votesystem.properties
2
new file mode 100644
3
index 0000000..10f1f93
4
--- /dev/null
5
+++ b/aCis_gameserver/config/votesystem.properties
6
@@ -0,0 +1,95 @@
7
+EnableVoteSystem = True
8
+
9
+EnableGlobalVote = True
10
+
11
+EnableIndividualVote = True
12
+
13
+## Time to Update table totalVotes from DB
14
+NextTimeToAutoUpdateTotalVote = 2
15
+
16
+## Time to update table individualVotes
17
+NextTimeToAutoUpdateIndividualVotes = 2
18
+
19
+NextTimeToAutoCleanInnecesaryVotes = 30
20
+
21
+NextTimeToCheckAutoGlobalVotesReward = 1
22
+
23
+IntervalToNextVote = 12
24
+
25
+GlobalVotesAmountToNextReward = 1
26
+
27
+EnableVotingCommand = True
28
+
29
+VotingCommand = .getreward
30
+
31
+## l2.topgameserver.net
32
+VoteLinkTgs = http://l2.topgameserver.net/lineage/VoteApi/
33
+
34
+TgsApiKey = 
35
+
36
+## l2top.co
37
+VoteLinkTopCo = https://l2top.co/reward/
38
+
39
+TopCoSrvId = 
40
+
41
+## ITopz.com
42
+VoteLinkItopz = https://itopz.com/check/
43
+
44
+ItopzZpiKey = 
45
+
46
+ItopzSrvId = 
47
+
48
+## l2votes.com
49
+VoteLinkVts = https://l2votes.com/
50
+
51
+VtsApiKey = 
52
+
53
+VtsSid = 
54
+
55
+## Hopzone.net
56
+VoteLinkHz = https://api.hopzone.net/lineage2/
57
+
58
+HzApiKey = 
59
+
60
+## l2network.eu
61
+VoteNetworkLink = https://l2network.eu/api.php
62
+
63
+VoteNetworkUserName = 
64
+
65
+VoteNetworkApiKey = 
66
+
67
+## L2TopServer.com
68
+VoteLinkTss = https://l2topservers.com/votes?
69
+
70
+TssApiToken = 
71
+
72
+TsSrvId = 453
73
+
74
+TsDomainName= l2catgang
75
+
76
+## top.l2jbrasil.com
77
+BrasilVoteLink = https://top.l2jbrasil.com/votesystem/index.php?
78
+
79
+BrasilUserName = julioguzman
80
+
81
+## Mmotop.eu
82
+VoteLinkMmotop = https://l2jtop.com/api/
83
+
84
+MmotopApiKey = 
85
+
86
+## L2TopZone.com
87
+VoteLinkTz = https://api.l2topzone.com/v1/
88
+
89
+TzApiKey = 
90
+
91
+## L2Servers.com
92
+VoteLinkServers = https://www.l2servers.com/api/
93
+
94
+ServersHashCode = 
95
+
96
+ServersSrvId = 
97
+
98
+
99
+## for localhost test if your project is live, put the word off or leave it blank
100
+TestIp = 
101
+
102
diff --git a/aCis_gameserver/java/net/sf/l2j/Config.java b/aCis_gameserver/java/net/sf/l2j/Config.java
103
index 4b7181f..800de1e 100644
104
--- a/aCis_gameserver/java/net/sf/l2j/Config.java
105
+++ b/aCis_gameserver/java/net/sf/l2j/Config.java
106
107
	import java.util.Properties;
108
+	import java.util.concurrent.TimeUnit;
109
	import java.util.logging.Level;
110
111
@@ -35,6 +35,7 @@
112
 	public static final String PLAYERS_FILE = "./config/players.properties";
113
 	public static final String SERVER_FILE = "./config/server.properties";
114
 	public static final String SIEGE_FILE = "./config/siege.properties";
115
+        public static final String VOTE_SYSTEM_FILE = "./config/votesystem.properties";
116
 	
117
 	// --------------------------------------------------
118
 	// Clans settings
119
@@ -461,6 +462,52 @@
120
 	public static int MAX_DEFENDERS_NUMBER;
121
 	public static int ATTACKERS_RESPAWN_DELAY;
122
 	
123
+        
124
+        //---------------------------------------------------
125
+	// VOTE SYSTEM
126
+	//---------------------------------------------------
127
+	public static boolean ENABLE_VOTE_SYSTEM;
128
+	public static boolean ENABLE_INDIVIDUAL_VOTE;
129
+	public static boolean ENABLE_GLOBAL_VOTE;
130
+	public static long NEXT_TIME_TO_AUTO_UPDATE_TOTAL_VOTE;
131
+	public static long NEXT_TIME_TO_AUTO_UPDATE_INDIVIDUAL_VOTES;
132
+	public static long NEXT_TIME_TO_AUTO_CLEAN_INECESARY_VOTES;
133
+	public static long NEXT_TIME_TO_CHECK_AUTO_GLOBAL_VOTES_REWARD;
134
+	public static long INTERVAL_TO_NEXT_VOTE;
135
+	public static int GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD;
136
+	public static boolean ENABLE_VOTING_COMMAND; 
137
+	public static String VOTING_COMMAND;
138
+	public static String VOTE_LINK_TGS;
139
+	public static String TGS_API_KEY;
140
+	public static String VOTE_LINK_TOP_CO;
141
+	public static String TOP_CO_SRV_ID;
142
+	public static String VOTE_LINK_ITOPZ;
143
+	public static String ITOPZ_API_KEY;
144
+	public static String ITOPZ_SRV_ID;
145
+	public static String VOTE_LINK_VTS;
146
+	public static String VTS_API_KEY;
147
+	public static String VTS_SID;
148
+	public static String VOTE_LINK_HZ;
149
+	public static String HZ_API_KEY;
150
+	public static String VOTE_NETWORK_LINK;
151
+	public static String VOTE_NETWORK_USER_NAME;
152
+	public static String VOTE_NETWORK_API_KEY;
153
+	public static String VOTE_LINK_TSS;
154
+	public static String TSS_API_TOKEN;
155
+        public static String TS_SRV_ID;
156
+        public static String TS_DOMAIN_NAME;
157
+	public static String BRASIL_VOTE_LINK;
158
+	public static String BRASIL_USER_NAME;
159
+	public static String VOTE_LINK_MMOTOP;
160
+	public static String MMOTOP_API_KEY;
161
+	public static String VOTE_LINK_TZ;
162
+	public static String TZ_API_KEY;
163
+	public static String VOTE_LINK_SERVERS;
164
+	public static String SERVERS_HASH_CODE;
165
+	public static String SERVERS_SRV_ID;
166
+        public static String TEST_IP;
167
+        
168
+        
169
 	// --------------------------------------------------
170
 	// Server
171
 	// --------------------------------------------------
172
@@ -1102,6 +1149,52 @@
173
 		ATTACKERS_RESPAWN_DELAY = sieges.getProperty("AttackerRespawn", 10000);
174
 	}
175
 	
176
+        private static final void loadVoteSystem() 
177
+	{
178
+		final ExProperties votesystem = initProperties(Config.VOTE_SYSTEM_FILE);
179
+		
180
+		ENABLE_VOTE_SYSTEM = votesystem.getProperty("EnableVoteSystem", true);
181
+		ENABLE_INDIVIDUAL_VOTE = votesystem.getProperty("EnableIndividualVote", true);
182
+		ENABLE_GLOBAL_VOTE = votesystem.getProperty("EnableGlobalVote", true);
183
+		NEXT_TIME_TO_AUTO_UPDATE_TOTAL_VOTE = TimeUnit.MINUTES.toMillis(votesystem.getProperty("NextTimeToAutoUpdateTotalVote", 60));// -> minutes
184
+		NEXT_TIME_TO_AUTO_UPDATE_INDIVIDUAL_VOTES = TimeUnit.MINUTES.toMillis(votesystem.getProperty("NextTimeToAutoUpdateIndividualVotes", 60));// -> minutes
185
+		NEXT_TIME_TO_AUTO_CLEAN_INECESARY_VOTES = TimeUnit.MINUTES.toMillis(votesystem.getProperty("NextTimeToAutoCleanInnecesaryVotes", 30));// -> minutes
186
+		NEXT_TIME_TO_CHECK_AUTO_GLOBAL_VOTES_REWARD = TimeUnit.MINUTES.toMillis(votesystem.getProperty("NextTimeToCheckAutoGlobalVotesReward", 5));// -> minutes
187
+		INTERVAL_TO_NEXT_VOTE = TimeUnit.HOURS.toMillis(votesystem.getProperty("IntervalTimeToNextVote", 12)); // -> hours
188
+		GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD = votesystem.getProperty("GlobalVotesAmountToNextReward",50);
189
+		ENABLE_VOTING_COMMAND = votesystem.getProperty("EnableVotingCommand",true);
190
+		VOTING_COMMAND = votesystem.getProperty("VotingCommand","getreward");
191
+		VOTE_LINK_TGS = votesystem.getProperty("VoteLinkTgs","");
192
+		TGS_API_KEY = votesystem.getProperty("TgsApiKey","");
193
+		VOTE_LINK_TOP_CO = votesystem.getProperty("VoteLinkTopCo","");
194
+		TOP_CO_SRV_ID = votesystem.getProperty("TopCoSrvId","");
195
+		VOTE_LINK_ITOPZ = votesystem.getProperty("VoteLinkItopz","");
196
+		ITOPZ_API_KEY = votesystem.getProperty("ItopzZpiKey","");
197
+		ITOPZ_SRV_ID = votesystem.getProperty("ItopzSrvId","");
198
+		VOTE_LINK_VTS = votesystem.getProperty("VoteLinkVts","");
199
+		VTS_API_KEY = votesystem.getProperty("VtsApiKey","");
200
+		VTS_SID = votesystem.getProperty("VtsSid","");
201
+		VOTE_LINK_HZ = votesystem.getProperty("VoteLinkHz","");
202
+		HZ_API_KEY = votesystem.getProperty("HzApiKey","");
203
+		VOTE_NETWORK_LINK = votesystem.getProperty("VoteNetworkLink","");
204
+		VOTE_NETWORK_USER_NAME = votesystem.getProperty("VoteNetworkUserName","");
205
+		VOTE_NETWORK_API_KEY = votesystem.getProperty("VoteNetworkApiKey","");
206
+		VOTE_LINK_TSS = votesystem.getProperty("VoteLinkTss","");
207
+		TSS_API_TOKEN = votesystem.getProperty("TssApiToken","");
208
+                TS_SRV_ID = votesystem.getProperty("TsSrvId","");
209
+                TS_DOMAIN_NAME = votesystem.getProperty("TsDomainName","");
210
+		BRASIL_VOTE_LINK = votesystem.getProperty("BrasilVoteLink","");
211
+		BRASIL_USER_NAME = votesystem.getProperty("BrasilUserName","");
212
+		VOTE_LINK_MMOTOP = votesystem.getProperty("VoteLinkMmotop","");
213
+		MMOTOP_API_KEY = votesystem.getProperty("MmotopApiKey","");
214
+		VOTE_LINK_TZ = votesystem.getProperty("VoteLinkTz","");
215
+		TZ_API_KEY = votesystem.getProperty("TzApiKey","");
216
+		VOTE_LINK_SERVERS = votesystem.getProperty("VoteLinkServers","");
217
+		SERVERS_HASH_CODE = votesystem.getProperty("ServersHashCode","");
218
+		SERVERS_SRV_ID = votesystem.getProperty("ServersSrvId","");
219
+                TEST_IP = votesystem.getProperty("TestIp","");
220
+	}
221
+        
222
 	/**
223
 	 * Loads gameserver settings.<br>
224
 	 * IP addresses, database, rates, feature enabled/disabled, misc.
225
@@ -1309,6 +1402,9 @@
226
 		
227
 		// server settings
228
 		loadServer();
229
+		
230
+		//vote settings
231
+		loadVoteSystem();
232
 	}
233
 	
234
 	public static final void loadLoginServer()
235
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
236
index 41a9f92..da97fd2 100644
237
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
238
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
239
@@ -99,6 +99,8 @@
240
 import net.sf.l2j.gameserver.taskmanager.RandomAnimationTaskManager;
241
 import net.sf.l2j.gameserver.taskmanager.ShadowItemTaskManager;
242
 import net.sf.l2j.gameserver.taskmanager.WaterTaskManager;
243
+import net.sf.l2j.gameserver.votesystem.Handler.voteManager;
244
+import net.sf.l2j.gameserver.votesystem.VoteUtil.VoteSiteXml;
245
 import net.sf.l2j.util.DeadLockDetector;
246
 import net.sf.l2j.util.IPv4Filter;
247
 
248
@@ -194,6 +196,15 @@
249
 		CrestCache.getInstance();
250
 		ClanTable.getInstance();
251
 		
252
+                StringUtil.printSection("Vote System");
253
+		if(Config.ENABLE_VOTE_SYSTEM) {
254
+			voteManager.getInatance();
255
+			LOGGER.info("======================Vote System Enabled=========================");
256
+			VoteSiteXml.getInstance();
257
+		}else {
258
+			LOGGER.info("======================Vote System Disabled=========================");
259
+		}
260
+                
261
 		StringUtil.printSection("Geodata & Pathfinding");
262
 		GeoEngine.getInstance();
263
 		
264
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/Shutdown.java b/aCis_gameserver/java/net/sf/l2j/gameserver/Shutdown.java
265
index 88a3dc4..8443463 100644
266
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/Shutdown.java
267
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/Shutdown.java
268
@@ -27,6 +27,7 @@
269
 import net.sf.l2j.gameserver.network.serverpackets.ServerClose;
270
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
271
 import net.sf.l2j.gameserver.taskmanager.ItemsOnGroundTaskManager;
272
+import net.sf.l2j.gameserver.votesystem.Handler.voteManager;
273
 
274
 /**
275
  * This class provides functions for shutting down and restarting the server. It closes all client connections and saves data.
276
@@ -146,6 +147,10 @@
277
 				LOGGER.info("CoupleManager data has been saved.");
278
 			}
279
 			
280
+                        //Save global and individual votes
281
+			voteManager.getInatance().Shutdown();
282
+			LOGGER.info("Vote data has been saved");
283
+                        
284
 			// Save server memos.
285
 			ServerMemoTable.getInstance().storeMe();
286
 			LOGGER.info("ServerMemo data has been saved.");
287
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/handler/CustomCommandsHandler.java b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/CustomCommandsHandler.java
288
new file mode 100644
289
index 0000000..aca915c
290
--- /dev/null
291
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/CustomCommandsHandler.java
292
@@ -0,0 +1,42 @@
293
+package net.sf.l2j.gameserver.handler;
294
+
295
+import java.util.Map;
296
+
297
+import net.sf.l2j.gameserver.handler.customcommandHandler.VoteCommandHandler;
298
+
299
+import java.util.HashMap;
300
+
301
+/**
302
+ * @author l2.topgameserver.net
303
+ *
304
+ */
305
+public class CustomCommandsHandler {
306
+	private final Map<Integer, ICustomCommandsHandler> _datatable = new HashMap<>();
307
+
308
+
309
+
310
+	protected CustomCommandsHandler() {
311
+		registerCustomCommandHandler(new VoteCommandHandler());
312
+	}
313
+
314
+	public void registerCustomCommandHandler(ICustomCommandsHandler handler) {
315
+		for (String id : handler.getCustomCommandList())
316
+			_datatable.put(id.hashCode(), handler);
317
+	}
318
+
319
+	public ICustomCommandsHandler getCustomCommandHandler(String customCommand) {
320
+		return _datatable.get(customCommand.hashCode());
321
+	}
322
+
323
+	public int size() {
324
+		return _datatable.size();
325
+	}
326
+
327
+	public static CustomCommandsHandler getInstance() {
328
+		return SingletonHolder._instance;
329
+	}
330
+	
331
+	private static class SingletonHolder {
332
+		protected static final CustomCommandsHandler _instance = new CustomCommandsHandler();
333
+	}
334
+}
335
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/handler/ICustomCommandsHandler.java b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/ICustomCommandsHandler.java
336
new file mode 100644
337
index 0000000..5b4fda9
338
--- /dev/null
339
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/ICustomCommandsHandler.java
340
@@ -0,0 +1,13 @@
341
+package net.sf.l2j.gameserver.handler;
342
+
343
+import net.sf.l2j.gameserver.model.actor.Player;
344
+
345
+/**
346
+ * @author l2.topgameserver.net
347
+ *
348
+ */
349
+public interface ICustomCommandsHandler
350
+{
351
+	void useCustomCommand(String command, Player activeChar);
352
+	public String[] getCustomCommandList();
353
+}
354
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/handler/customcommandHandler/VoteCommandHandler.java b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/customcommandHandler/VoteCommandHandler.java
355
new file mode 100644
356
index 0000000..36d318c
357
--- /dev/null
358
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/customcommandHandler/VoteCommandHandler.java
359
@@ -0,0 +1,71 @@
360
+package net.sf.l2j.gameserver.handler.customcommandHandler;
361
+
362
+import net.sf.l2j.Config;
363
+import net.sf.l2j.gameserver.handler.ICustomCommandsHandler;
364
+import net.sf.l2j.gameserver.model.actor.Player;
365
+import net.sf.l2j.gameserver.votesystem.DB.individualVoteDB;
366
+import net.sf.l2j.gameserver.votesystem.Enum.voteSite;
367
+import net.sf.l2j.gameserver.votesystem.Handler.voteManager;
368
+
369
+/**
370
+ * @author l2.topgameserver.net
371
+ *
372
+ */
373
+public class VoteCommandHandler implements ICustomCommandsHandler
374
+{
375
+
376
+	@Override
377
+	public void useCustomCommand(String command, Player player)
378
+	{
379
+		
380
+		if (command.equalsIgnoreCase(Config.VOTING_COMMAND))
381
+		{	
382
+			if(player.isInJail()) {
383
+				player.sendMessage("You cannot use this function while you are jailed");
384
+				return;
385
+			}
386
+			if(!Config.ENABLE_VOTE_SYSTEM) {
387
+				player.sendMessage("The rewards system has been disabled by your administrator");
388
+				return;
389
+			}
390
+			if(!Config.ENABLE_INDIVIDUAL_VOTE) {
391
+				player.sendMessage("The individual reward system is disabled");
392
+				return;
393
+			}
394
+			if(!Config.ENABLE_VOTING_COMMAND) {
395
+				player.sendMessage("Voting command reward is disabled");
396
+				return;
397
+			}
398
+			
399
+			for(voteSite vs : voteSite.values()) {
400
+				new Thread(()->{
401
+					voteManager.getInatance().getReward(player, vs.ordinal());
402
+				}).start();
403
+			}
404
+			
405
+		}
406
+		if(player.isGM() && command.equalsIgnoreCase(".reloadinvotes")) {
407
+			individualVoteDB.getInstance().loadVotes();
408
+			player.sendMessage("All individual votes has been recharged");
409
+		}
410
+	}
411
+	
412
+	
413
+	@Override
414
+	public String[] getCustomCommandList()
415
+	{
416
+		return new String[]
417
+		{
418
+			Config.VOTING_COMMAND,
419
+			".reloadinvotes",
420
+		};
421
+	}
422
+	public static VoteCommandHandler getInstance() 
423
+	{
424
+		return SingletonHolder._instance;
425
+	}
426
+	private static class SingletonHolder
427
+	{
428
+		protected static final VoteCommandHandler _instance = new VoteCommandHandler();
429
+	}
430
+}
431
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/NpcVote.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/NpcVote.java
432
new file mode 100644
433
index 0000000..d4bf57f
434
--- /dev/null
435
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/NpcVote.java
436
@@ -0,0 +1,87 @@
437
+package net.sf.l2j.gameserver.model.actor.instance;
438
+
439
+import net.sf.l2j.Config;
440
+import net.sf.l2j.gameserver.data.ItemTable;
441
+import net.sf.l2j.gameserver.model.actor.Player;
442
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
443
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
444
+import net.sf.l2j.gameserver.votesystem.Enum.voteSite;
445
+import net.sf.l2j.gameserver.votesystem.Handler.voteManager;
446
+import net.sf.l2j.gameserver.votesystem.Model.Reward;
447
+import net.sf.l2j.gameserver.votesystem.VoteUtil.VoteSiteXml;
448
+
449
+/**
450
+ * @author l2.topgameserver.net
451
+ *
452
+ */
453
+public class NpcVote extends Folk
454
+{
455
+
456
+	/**
457
+	 * @param objectId
458
+	 * @param template
459
+	 */
460
+	public NpcVote(int objectId, NpcTemplate template)
461
+	{
462
+		super(objectId, template);
463
+		// TODO Auto-generated constructor stub
464
+	}
465
+	
466
+	@Override
467
+	public void onBypassFeedback(Player player, String command)
468
+	{
469
+		if(command == null) {
470
+			return;
471
+		}
472
+		int Ordinalsite = Integer.parseInt(command);
473
+		voteManager.getInatance().getReward(player, Ordinalsite);
474
+		showChatWindow(player,0);
475
+		super.onBypassFeedback(player, command);
476
+	}
477
+	
478
+	@Override
479
+	public void showChatWindow(Player player, int val) {
480
+		final NpcHtmlMessage html = new NpcHtmlMessage(0);
481
+		StringBuilder sb = new StringBuilder();
482
+		html.setFile(getHtmlPath(getNpcId(), 0));
483
+		for(voteSite vs : voteSite.values()) {
484
+				sb.append("<table bgcolor=000000 width=280><tr>");
485
+				sb.append("<td width=42><img src=\"icon.etc_treasure_box_i08\" width=32 height=32></td>");
486
+				sb.append("<td width=220><table width=220>");
487
+			    sb.append("<tr><td><table width=220><tr><td width=145>On "+String.format("%s",VoteSiteXml.getInstance().getSiteName(vs.ordinal()))+"</td>");
488
+			    if(voteManager.getInatance().checkIndividualAvailableVote(player, vs.ordinal())) {
489
+				sb.append("<td width=75>"+String.format("<button value=\"Get reward\" action=\"bypass -h vote_%s_site %s\" height=17 width=64 back=\"sek.cbui94\" fore=\"sek.cbui92\">",getObjectId(),vs.ordinal())+"</td>");
490
+			    }else {
491
+			    sb.append(String.format("<td width=75 align=center><font color=C68E00>%s</font></td>", voteManager.getInatance().getTimeRemainingWithSampleFormat(player, vs.ordinal())));
492
+			    }
493
+				sb.append("</tr></table></td></tr>");
494
+				sb.append("<tr><td><table width=220><tr>");
495
+				int i=0;
496
+				for(Reward r : VoteSiteXml.getInstance().getRewards(vs.ordinal())) {
497
+					sb.append(String.format("<td width=110 height=32 align=center><font color=BFAF00>%s x%s</font></td>",ItemTable.getInstance().getTemplate(r.getItemId()).getName(), r.getItemCount()));
498
+					i++;
499
+						if(i%2==0) {
500
+							sb.append("</tr><tr>");
501
+						}
502
+				}
503
+				sb.append("</tr></table></td></tr></table></td></tr></table><br>");
504
+		}
505
+				html.replace("%everyXtime%",Config.INTERVAL_TO_NEXT_VOTE/(3600*1000));
506
+				html.replace("%enablevote%", sb.toString());
507
+				html.replace("%accountName%",player.getName());
508
+				player.sendPacket(html);
509
+	}
510
+	
511
+	@Override
512
+	public String getHtmlPath(int npcId, int val)
513
+	{
514
+		String filename = "";
515
+		if (val == 0)
516
+			filename = "" + npcId;
517
+		else
518
+			filename = npcId + "-" + val;
519
+		
520
+		return "data/html/mods/votesystem/" + filename + ".html";
521
+	}
522
+	
523
+}
524
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
525
index cfd76fa..773eee2 100644
526
--- a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
527
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java
528
@@ -99,6 +99,23 @@
529
 			html.disableValidation();
530
 			player.sendPacket(html);
531
 		}
532
+                else if(_command.startsWith("vote_")) {
533
+			if (!player.validateBypass(_command))
534
+				return;
535
+			
536
+			int endOfId = _command.indexOf('_', 6);
537
+			String id;
538
+			if (endOfId > 0)
539
+				id = _command.substring(5, endOfId);
540
+			else
541
+				id = _command.substring(5);
542
+			
543
+			if(_command.split(" ")[1].toString() != null) {
544
+				final WorldObject object = World.getInstance().getObject(Integer.parseInt(id));
545
+				if (object != null && object instanceof Npc && endOfId > 0 && ((Npc) object).canInteract(player))
546
+				((Npc) object).onBypassFeedback(player, _command.split(" ")[1].toString());
547
+			}
548
+		}
549
 		else if (_command.startsWith("npc_"))
550
 		{
551
 			if (!player.validateBypass(_command))
552
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/DB/globalVoteDB.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/DB/globalVoteDB.java
553
new file mode 100644
554
index 0000000..43865e9
555
--- /dev/null
556
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/DB/globalVoteDB.java
557
@@ -0,0 +1,104 @@
558
+package net.sf.l2j.gameserver.votesystem.DB;
559
+
560
+import java.sql.Connection;
561
+import java.sql.PreparedStatement;
562
+import java.sql.ResultSet;
563
+import java.sql.SQLException;
564
+import java.sql.Statement;
565
+
566
+import net.sf.l2j.commons.logging.CLogger;
567
+
568
+import net.sf.l2j.L2DatabaseFactory;
569
+import net.sf.l2j.gameserver.votesystem.Enum.voteSite;
570
+import net.sf.l2j.gameserver.votesystem.Model.globalVote;
571
+
572
+
573
+/**
574
+ * @author l2.topgameserver.net
575
+ *
576
+ */
577
+public class globalVoteDB
578
+{
579
+	public static final CLogger LOGGER = new CLogger(globalVoteDB.class.getName());
580
+	private Statement st;
581
+	private Connection con;
582
+	private globalVote[] _globalVotes;
583
+	private globalVoteDB() {
584
+		_globalVotes = new globalVote[voteSite.values().length];
585
+		loadGlobalVotes();
586
+	}
587
+	
588
+	public void loadGlobalVotes() {
589
+		con = L2DatabaseFactory.getInstance().getConnection();
590
+		try(PreparedStatement ps = con.prepareStatement("Select voteSite,lastRewardVotes from globalvotes");
591
+			ResultSet rs = ps.executeQuery();){
592
+			if(rs.getRow() == 0){
593
+                for(voteSite vs : voteSite.values()){
594
+                    globalVote gv = new globalVote();
595
+                         gv.setVoteSite(vs.ordinal());
596
+                         gv.setVotesLastReward(0);
597
+                         _globalVotes[gv.getVoyeSite()] = gv;
598
+                }
599
+                return;
600
+            }
601
+			while(rs.next()) {
602
+				globalVote gv = new globalVote();
603
+				gv.setVoteSite(rs.getInt("voteSite"));
604
+				gv.setVotesLastReward(rs.getInt("lastRewardVotes"));
605
+				_globalVotes[gv.getVoyeSite()] = gv;
606
+			}
607
+			ps.close();
608
+			con.close();
609
+			
610
+		}catch(SQLException e) {
611
+			e.printStackTrace();
612
+		}
613
+	}
614
+	public void saveGlobalVote(globalVote gb) {
615
+		try(Connection con = L2DatabaseFactory.getInstance().getConnection();PreparedStatement ps = con.prepareStatement("INSERT INTO globalvotes(voteSite,lastRewardVotes) VALUES(?,?)"
616
+			+ "ON DUPLICATE KEY UPDATE voteSite = VALUES(voteSite), lastRewardVotes = VALUES(lastRewardVotes)"))
617
+		
618
+		{
619
+			ps.setInt(1, gb.getVoyeSite());
620
+			ps.setInt(2, gb.getVotesLastReward());
621
+			ps.executeUpdate();
622
+			
623
+			ps.close();
624
+			con.close();
625
+			
626
+		}catch(SQLException e) {
627
+			e.printStackTrace();
628
+		}
629
+	}
630
+	
631
+	public void saveGlobalVotes(globalVote[] globalVotes) {
632
+		try(Connection con = L2DatabaseFactory.getInstance().getConnection();PreparedStatement ps = con.prepareStatement("INSERT INTO globalvotes(voteSite,lastRewardVotes) VALUES(?,?)"
633
+			+ "ON DUPLICATE KEY UPDATE voteSite = VALUES(voteSite), lastRewardVotes = VALUES(lastRewardVotes)"))
634
+		
635
+		{
636
+			for(voteSite vs : voteSite.values()) {
637
+			globalVote gb = globalVotes[vs.ordinal()];
638
+			ps.setInt(1, gb.getVoyeSite());
639
+			ps.setInt(2, gb.getVotesLastReward());
640
+			ps.addBatch();
641
+			}
642
+			ps.executeBatch();
643
+			
644
+			ps.close();
645
+			con.close();
646
+			
647
+		}catch(SQLException e) {
648
+			e.printStackTrace();
649
+		}
650
+	}
651
+	
652
+	public globalVote[] getGlobalVotes() {
653
+		return _globalVotes;
654
+	}
655
+	public static final globalVoteDB  getInstance() {
656
+		return SingleHolder.INSTANCE;
657
+	}
658
+	private static final class SingleHolder {
659
+		protected static final globalVoteDB INSTANCE = new globalVoteDB();
660
+	}
661
+}
662
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/DB/individualVoteDB.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/DB/individualVoteDB.java
663
new file mode 100644
664
index 0000000..2cf9522
665
--- /dev/null
666
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/DB/individualVoteDB.java
667
@@ -0,0 +1,160 @@
668
+package net.sf.l2j.gameserver.votesystem.DB;
669
+
670
+
671
+import java.sql.Connection;
672
+import java.sql.PreparedStatement;
673
+import java.sql.ResultSet;
674
+import java.sql.SQLException;
675
+import java.sql.Statement;
676
+import java.util.HashMap;
677
+import java.util.HashSet;
678
+import java.util.Map;
679
+import java.util.logging.Logger;
680
+import net.sf.l2j.L2DatabaseFactory;
681
+import net.sf.l2j.gameserver.votesystem.Enum.voteSite;
682
+
683
+
684
+import net.sf.l2j.gameserver.votesystem.Model.individualVote;
685
+
686
+/**
687
+ * @author l2.topgameserver.net
688
+ *
689
+ */
690
+public class individualVoteDB
691
+{
692
+	private static final Logger LOGGER = Logger.getLogger(individualVoteDB.class.getName());
693
+	private Map<String,individualVote[]> _votes;
694
+	private Statement st;
695
+	private Connection con;
696
+	
697
+	
698
+	private individualVoteDB() {
699
+		_votes = new HashMap<>();
700
+		loadVotes();
701
+	}
702
+	
703
+	public void loadVotes() {
704
+		
705
+		_votes.clear();
706
+		try(Connection con = L2DatabaseFactory.getInstance().getConnection();PreparedStatement ps = con.prepareStatement("SELECT voterIp,voteSite,diffTime,votingTimeSite,alreadyRewarded FROM individualvotes");
707
+			ResultSet rs = ps.executeQuery();)
708
+		{
709
+			individualVote[] ivs = new individualVote[voteSite.values().length];
710
+			while(rs.next()) {
711
+				individualVote iv = new individualVote();
712
+				iv.setVoterIp(rs.getString("voterIp"));
713
+				iv.setVoteSite(rs.getInt("voteSite"));
714
+				iv.setDiffTime(rs.getLong("diffTime"));
715
+				iv.setVotingTimeSite(rs.getLong("votingTimeSite"));
716
+				iv.setAlreadyRewarded(rs.getBoolean("alreadyRewarded"));
717
+				
718
+				if(_votes.containsKey(iv.getVoterIp())) {
719
+					if(_votes.get(iv.getVoterIp())[iv.getVoteSite()] == null) {
720
+						ivs[iv.getVoteSite()] = iv;
721
+						_votes.replace(iv.getVoterIp(), ivs);
722
+					}
723
+				}else {
724
+					ivs[iv.getVoteSite()] = iv;
725
+					_votes.put(iv.getVoterIp(), ivs);
726
+					
727
+					
728
+				}
729
+			}
730
+			
731
+		}
732
+		catch (SQLException e)
733
+		{
734
+			e.printStackTrace();
735
+		}
736
+		
737
+	}
738
+	
739
+	public void SaveVotes(Map<String,individualVote[]> votes) {
740
+		
741
+		if(votes == null)
742
+			return;
743
+		if(votes.size() == 0) {
744
+			return;
745
+		}
746
+			try(Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement ps = con.prepareStatement("INSERT INTO individualvotes(voterIp,voteSite,diffTime,votingTimeSite,alreadyRewarded) VALUES(?,?,?,?,?) ON DUPLICATE KEY UPDATE "
747
+				+ "voterIp = VALUES(voterIp), voteSite = VALUES(voteSite), diffTime = VALUES(diffTime), votingTimeSite = VALUES(votingTimeSite),alreadyRewarded = VALUES(alreadyRewarded)");)
748
+			{
749
+				
750
+				for(Map.Entry<String, individualVote[]> ivm : votes.entrySet()) {
751
+					for(individualVote iv : ivm.getValue()) {
752
+						if(iv == null)
753
+							continue;
754
+					ps.setString(1, iv.getVoterIp());
755
+					ps.setInt(2, iv.getVoteSite());
756
+					ps.setLong(3, iv.getDiffTime());
757
+					ps.setLong(4, iv.getVotingTimeSite());
758
+					ps.setBoolean(5, iv.getAlreadyRewarded());
759
+					ps.addBatch();
760
+					}
761
+				}
762
+				ps.executeBatch();
763
+			}
764
+			catch (SQLException e)
765
+			{
766
+				e.printStackTrace();
767
+			}
768
+	}
769
+	
770
+		public void SaveVote(individualVote vote) {
771
+		
772
+		if(vote == null)
773
+			return;
774
+		
775
+			try(Connection con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement ps = con.prepareStatement("INSERT INTO individualvotes(voterIp,voteSite,diffTime,votingTimeSite,alreadyRewarded) VALUES(?,?,?,?,?) ON DUPLICATE KEY UPDATE"
776
+				+ "voterIp = VALUES(voterIp), voteSite = VALUES(voteSite), diffTime = VALUES(diffTime), votingTimeSite = VALUES(votingTimeSite), alreadyRewarded = VALUES(alreadyRewarded)");)
777
+			{
778
+					ps.setString(1, vote.getVoterIp());
779
+					ps.setInt(2, vote.getVoteSite());
780
+					ps.setLong(3, vote.getDiffTime());
781
+					ps.setLong(4, vote.getVotingTimeSite());
782
+					ps.setBoolean(5, vote.getAlreadyRewarded());
783
+					ps.executeUpdate();
784
+			}
785
+			catch (SQLException e)
786
+			{
787
+				e.printStackTrace();
788
+			}
789
+	}
790
+
791
+	public void DeleteVotes(HashSet<individualVote> deleteVotes) {
792
+		if(deleteVotes == null) {
793
+			return;
794
+		}
795
+		if(deleteVotes.size() == 0) {
796
+			return;
797
+		}
798
+		try {
799
+			con = L2DatabaseFactory.getInstance().getConnection();
800
+			st = con.createStatement();
801
+			for(individualVote iv : deleteVotes) {
802
+			String sql = String.format("Delete from individualvotes where voterIp = '%s' AND voteSite = %s", iv.getVoterIp(),iv.getVoteSite());
803
+			st.addBatch(sql);
804
+			}
805
+			int[] result = st.executeBatch();
806
+			st.close();
807
+			con.close();
808
+			LOGGER.info(result.length+" Innecesary votes has been deleted");
809
+			
810
+		}catch(SQLException e) {
811
+			e.printStackTrace();
812
+		}
813
+	}
814
+	
815
+	public Map<String,individualVote[]> getVotesDB(){
816
+		return _votes;
817
+	}
818
+
819
+	public static final individualVoteDB getInstance()
820
+	{
821
+		return SingleHolder.INSTANCE;
822
+	}
823
+	
824
+	private static final class SingleHolder {
825
+		protected static final individualVoteDB INSTANCE = new individualVoteDB();
826
+	}
827
+}
828
\ No newline at end of file
829
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Enum/voteSite.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Enum/voteSite.java
830
new file mode 100644
831
index 0000000..4ce2a5d
832
--- /dev/null
833
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Enum/voteSite.java
834
@@ -0,0 +1,20 @@
835
+package net.sf.l2j.gameserver.votesystem.Enum;
836
+
837
+/**
838
+ * @author l2.topgameserver.net
839
+ *
840
+ */
841
+public enum voteSite
842
+{
843
+	L2TOPGAMESERVER,//0
844
+	ITOPZ,//1
845
+	L2TOPCO,//2
846
+	L2VOTES,//3
847
+	HOPZONE,//4
848
+	L2NETWORK,//5
849
+	L2TOPSERVERS,//6
850
+	TOPL2JBRASIL,//7
851
+	MMOTOP,//8
852
+	TOPZONE,//9
853
+	L2SERVERS,//10
854
+}
855
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Handler/voteHandler.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Handler/voteHandler.java
856
new file mode 100644
857
index 0000000..8d0eb07
858
--- /dev/null
859
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Handler/voteHandler.java
860
@@ -0,0 +1,488 @@
861
+package net.sf.l2j.gameserver.votesystem.Handler;
862
+
863
+import java.io.BufferedReader;
864
+import java.io.DataOutputStream;
865
+import java.io.InputStreamReader;
866
+import java.net.HttpURLConnection;
867
+import java.net.URL;
868
+import java.nio.charset.Charset;
869
+import java.text.ParseException;
870
+import java.text.SimpleDateFormat;
871
+import java.util.logging.Logger;
872
+
873
+import net.sf.l2j.Config;
874
+import net.sf.l2j.gameserver.votesystem.Enum.voteSite;
875
+import net.sf.l2j.gameserver.votesystem.Model.individualVoteResponse;
876
+import net.sf.l2j.gameserver.votesystem.VoteUtil.VoteSiteXml;
877
+import net.sf.l2j.gameserver.votesystem.VoteUtil.VoteUtil;
878
+
879
+/**
880
+ * @author l2.topgameserver.net
881
+ *
882
+ */
883
+public class voteHandler {
884
+   public static final Logger LOGGER = Logger.getLogger(voteHandler.class.getName());
885
+   
886
+	protected static String getNetWorkResponse(String URL,int ordinal) {
887
+		if ((ordinal == voteSite.L2NETWORK.ordinal()) && ("".equals(Config.VOTE_NETWORK_API_KEY) || "".equals(Config.VOTE_NETWORK_LINK) || "".equals(Config.VOTE_NETWORK_USER_NAME)))
888
+		{
889
+			return "";
890
+		}
891
+				
892
+				StringBuffer response = new StringBuffer();
893
+				try {
894
+				String API_URL = Config.VOTE_NETWORK_LINK;
895
+				String detail = URL;
896
+				String postParameters = "";
897
+				postParameters +="apiKey="+VoteUtil.between("apiKey=", detail, "&type=");
898
+				postParameters += "&type="+VoteUtil.between("&type=", detail, "&player");
899
+				String beginIndexPlayer = "&player=";
900
+				String player = detail.substring(detail.indexOf(beginIndexPlayer)+beginIndexPlayer.length());
901
+				
902
+				if (player != null && !player.equals(""))
903
+					postParameters += "&player=" + player;
904
+
905
+				byte[] postData = postParameters.getBytes(Charset.forName("UTF-8"));
906
+				URL url = new URL(API_URL);
907
+				HttpURLConnection con = (HttpURLConnection)url.openConnection();
908
+				con.setConnectTimeout(5000);
909
+				con.setRequestMethod("POST");
910
+				con.setRequestProperty("Content-Length", Integer.toString(postData.length));
911
+				con.setRequestProperty("User-Agent", "Mozilla/5.0");
912
+				con.setDoOutput(true);
913
+				
914
+				DataOutputStream os = new DataOutputStream(con.getOutputStream());
915
+				os.write(postData);
916
+				os.flush();
917
+				os.close();
918
+				
919
+				BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
920
+				String inputLine;
921
+				
922
+				while ((inputLine = in.readLine()) != null) {
923
+					response.append(inputLine);
924
+				}
925
+				in.close();
926
+					
927
+					return response.toString();
928
+					
929
+				} catch (Exception e) {
930
+				LOGGER.warning(VoteUtil.Sites[ordinal]+ " Say: An error ocurred "+ e.getCause());
931
+				return "";
932
+				}
933
+	}
934
+	
935
+	protected static String getResponse(String Url, int ordinal) 
936
+	{
937
+		if ((ordinal == voteSite.L2NETWORK.ordinal()) && ("".equals(Config.VOTE_NETWORK_API_KEY) || "".equals(Config.VOTE_NETWORK_LINK) || "".equals(Config.VOTE_NETWORK_USER_NAME)))
938
+		{
939
+			return "";
940
+		}
941
+                
942
+		try
943
+		  {
944
+			int responseCode = 0;
945
+			URL objUrl = new URL(Url);
946
+			HttpURLConnection con = (HttpURLConnection) objUrl.openConnection();
947
+			con.setRequestMethod("GET");
948
+			con.setRequestProperty("User-Agent", "Mozilla/5.0");
949
+			con.setConnectTimeout(5000);
950
+			responseCode = con.getResponseCode();
951
+			if (responseCode == HttpURLConnection.HTTP_OK) {
952
+				String inputLine;
953
+				StringBuffer response = new StringBuffer();
954
+				BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
955
+				while ((inputLine = in.readLine()) != null) {
956
+					response.append(inputLine);
957
+				}
958
+				in.close();
959
+				return response.toString();
960
+			} 
961
+		
962
+		  }
963
+		       catch (Exception e)
964
+		       {
965
+		    	   LOGGER.warning(VoteSiteXml.getInstance().getSiteName(ordinal)+" Say: An error ocurred "+e.getCause());
966
+		           return "";
967
+		       }
968
+
969
+		return "";
970
+	}
971
+	
972
+	
973
+	public static individualVoteResponse getIndividualVoteResponse(int ordinal,String ip, String AccountName) 
974
+	{
975
+		String response = "";
976
+		boolean isVoted = false;
977
+		long voteSiteTime = 0L, diffTime = 0L;
978
+		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
979
+		individualVoteResponse ivr = new individualVoteResponse();
980
+		
981
+			switch(ordinal) 
982
+			{
983
+				case 0:
984
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
985
+					isVoted = (response == "") ? false : Boolean.parseBoolean(VoteUtil.between("\"already_voted\":", response, ",\"vote_time\""));
986
+						if(isVoted) {
987
+                           try
988
+							{
989
+								voteSiteTime = format.parse(VoteUtil.between("\"vote_time\":\"", response, "\",\"server_time\"")).getTime();
990
+								diffTime = System.currentTimeMillis() - format.parse(VoteUtil.between("\"server_time\":\"", response, "\"}")).getTime();
991
+							}
992
+							catch (ParseException e)
993
+							{
994
+								e.printStackTrace();
995
+							}					
996
+						}
997
+						break;
998
+						
999
+				case 1:
1000
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1001
+					isVoted = (response == "") ? false : Boolean.parseBoolean(VoteUtil.between("\"isvoted\":", response.toString().toLowerCase().replaceAll("\n", "").replaceAll(" ", ""), ",\"votetime").replaceAll("\"", ""));
1002
+					if(isVoted) {
1003
+						try
1004
+						{
1005
+							voteSiteTime = (Long.parseLong(VoteUtil.between("\"votetime\":", response.toString().toLowerCase().replaceAll("\n", "").replaceAll(" ", ""), ",\"servertime")))*1000;
1006
+							diffTime = System.currentTimeMillis() - (Long.parseLong(VoteUtil.between("\"servertime\":", response.toLowerCase().replaceAll("\n", "").replaceAll(" ", ""), "}")))*1000;
1007
+						}
1008
+						catch (Exception e)
1009
+						{
1010
+							e.printStackTrace();
1011
+						}
1012
+					}
1013
+					break;
1014
+						
1015
+				case 2:
1016
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1017
+					isVoted = (response == "") ? false :Boolean.parseBoolean(response);
1018
+					if(isVoted) {
1019
+							voteSiteTime = System.currentTimeMillis();
1020
+							diffTime = 0;
1021
+					}
1022
+					break;
1023
+					
1024
+				case 3:
1025
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1026
+					isVoted = (VoteUtil.between("\"status\":\"", response, "\",\"date\"") != "" && Integer.parseInt(VoteUtil.between("\"status\":\"", response, "\",\"date\"")) == 1) ?  true : false;
1027
+					if(isVoted) {
1028
+							String dateString = VoteUtil.between("\"date\":\"", response, "\"}]");
1029
+							try
1030
+							{
1031
+								voteSiteTime = System.currentTimeMillis();
1032
+								diffTime = 0;
1033
+							}
1034
+							catch (Exception e)
1035
+							{
1036
+								e.printStackTrace();
1037
+							}
1038
+							
1039
+					}
1040
+					break;
1041
+				
1042
+				case 4:
1043
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1044
+					isVoted = (response == "") ? false : Boolean.parseBoolean(VoteUtil.between("\"voted\":", response, ",\"voteTime\""));
1045
+					if(isVoted) {
1046
+					try
1047
+					{
1048
+						voteSiteTime = format.parse(VoteUtil.between("\"voteTime\":\"", response, "\",\"hopzoneServerTime\"")).getTime();
1049
+						diffTime = System.currentTimeMillis() - format.parse(VoteUtil.between("\"hopzoneServerTime\":\"", response, "\",\"status_code\":")).getTime();
1050
+					}
1051
+					catch (ParseException e)
1052
+					{
1053
+						e.printStackTrace();
1054
+					}
1055
+				}
1056
+					break;
1057
+					
1058
+				case 5:
1059
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1060
+					isVoted = (!"".equals(response) && Integer.parseInt(response) == 1) ? true : false;
1061
+					if(isVoted) {
1062
+					voteSiteTime = System.currentTimeMillis();
1063
+					diffTime = 0;
1064
+					}
1065
+					break;
1066
+					
1067
+				case 6:
1068
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1069
+					isVoted = ("".equals(response)) ? false : Boolean.parseBoolean(VoteUtil.between("\"voted\":", response, ",\"voteTime\""));
1070
+					if(isVoted) {
1071
+						try
1072
+						{
1073
+							voteSiteTime = System.currentTimeMillis();
1074
+							diffTime = 0;
1075
+						}
1076
+						catch (Exception e)
1077
+						{
1078
+							e.printStackTrace();
1079
+						}
1080
+						
1081
+					}
1082
+					break;
1083
+					
1084
+				case 7:
1085
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1086
+					isVoted = (VoteUtil.between("\"status\":\"", response, "\",\"server_time\"") != "" && Integer.parseInt(VoteUtil.between("\"status\":\"", response, "\",\"server_time\"")) == 1) ? true : false;
1087
+					if(isVoted) {
1088
+							try
1089
+							{
1090
+								voteSiteTime = System.currentTimeMillis();
1091
+								diffTime = 0;
1092
+							}
1093
+							catch (Exception e)
1094
+							{
1095
+								e.printStackTrace();
1096
+							}
1097
+					}
1098
+					break;
1099
+					
1100
+				case 8:
1101
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1102
+					isVoted = (response == "") ? false : Boolean.parseBoolean(VoteUtil.between("\"is_voted\":", response, ",\"vote_time\""));
1103
+					if(isVoted) {
1104
+						try
1105
+						{
1106
+							voteSiteTime = (Long.parseLong(VoteUtil.between("\"vote_time\":", response, ",\"server_time\"")))*1000;
1107
+							diffTime = System.currentTimeMillis() - Long.parseLong(VoteUtil.between("\"server_time\":",response,"}}"))*1000;
1108
+						}
1109
+						catch (Exception e)
1110
+						{
1111
+							e.printStackTrace();
1112
+						}
1113
+					}
1114
+					break;
1115
+					
1116
+				case 9:
1117
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1118
+					isVoted = (response == "") ? false : Boolean.parseBoolean(VoteUtil.between("\"isVoted\": ", response, ",\"voteTime\""));
1119
+					if(isVoted) {
1120
+						voteSiteTime = Long.parseLong(VoteUtil.between("\"voteTime\": \"", response, "\",\"serverTime\""))*1000;
1121
+						diffTime = System.currentTimeMillis() - Long.parseLong(VoteUtil.between("\"serverTime\": ",response,"}}"))*1000;
1122
+					}
1123
+					break;
1124
+					
1125
+				case 10:
1126
+					response = getResponse(getIndividualUrl(ordinal,ip,null),ordinal);
1127
+					isVoted = (response == "") ? false : Boolean.parseBoolean(response);
1128
+					if(isVoted) {
1129
+							voteSiteTime = System.currentTimeMillis();
1130
+							diffTime = 0;
1131
+					}
1132
+					break;
1133
+					
1134
+			}
1135
+				if(!response.equals("")) {
1136
+				ivr.setIsVoted(isVoted);
1137
+				ivr.setDiffTime(diffTime);
1138
+				ivr.setVoteSiteTime(voteSiteTime);
1139
+				return ivr;
1140
+				}
1141
+				return null;
1142
+	}
1143
+	
1144
+	public int getGlobalVotesResponse(int ordinal) 
1145
+	{
1146
+		
1147
+		String response = "";
1148
+		int totalVotes = 0;
1149
+		
1150
+		switch(ordinal) 
1151
+		{
1152
+			case 0:
1153
+				response = getResponse(getGlobalUrl(ordinal), ordinal);
1154
+				response = VoteUtil.between("\"getVotes\":",response,"}");
1155
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1156
+				break;
1157
+				
1158
+			case 1:
1159
+				response = getResponse(getGlobalUrl(ordinal), ordinal);
1160
+				response = VoteUtil.between("server_votes\":",response.replace(" ", ""),",\"server_rank");
1161
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1162
+				break;
1163
+				
1164
+			case 2:
1165
+				response = getResponse(getGlobalUrl(ordinal), ordinal);
1166
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1167
+				break;
1168
+				
1169
+			case 3:
1170
+				response = VoteUtil.getResponse(getGlobalUrl(ordinal), ordinal);
1171
+				response = VoteUtil.between("Votes:</th><th><a class='votes'>", response, "</a></th></tr><tr><th>Clicks:");
1172
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1173
+				break;
1174
+				
1175
+			case 4:
1176
+				response = getResponse(getGlobalUrl(ordinal), ordinal);
1177
+				response = VoteUtil.between("\"totalvotes\":",response,",\"status_code\"");
1178
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1179
+				break;
1180
+				
1181
+			case 5:
1182
+				String responseNetwork = getNetWorkResponse(getGlobalUrl(ordinal),ordinal);
1183
+				totalVotes = (!"".equals(responseNetwork)) ? Integer.parseInt(responseNetwork) : -1;
1184
+				break;
1185
+				
1186
+			case 6:
1187
+				response = VoteUtil.getResponse(getGlobalUrl(ordinal), ordinal);
1188
+				response = VoteUtil.between("VOTE <span>", response.toString().replaceAll("\n", ""), "</span>");
1189
+				
1190
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1191
+				break;
1192
+				
1193
+			case 7:
1194
+				response = VoteUtil.getResponse(getGlobalUrl(ordinal), ordinal);
1195
+				response = VoteUtil.between("nicas:</b> ", response, "<br /><br />");
1196
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1197
+				break;
1198
+				
1199
+			case 8:
1200
+				response = getResponse(getGlobalUrl(ordinal), ordinal);
1201
+				response = VoteUtil.between("\"monthly_votes\":",response,"}}");
1202
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1203
+				break;
1204
+				
1205
+			case 9:
1206
+			  	response = getResponse(getGlobalUrl(ordinal), ordinal);
1207
+			  	response = VoteUtil.between("\"totalVotes\":\"", response, "\",\"serverRank\"");
1208
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1209
+				break;
1210
+				
1211
+			case 10:
1212
+				response = getResponse(getGlobalUrl(ordinal), ordinal);
1213
+				totalVotes = (!"".equals(response)) ? Integer.parseInt(response) : -1;
1214
+				break;
1215
+		}
1216
+		
1217
+		
1218
+		return totalVotes;
1219
+	}
1220
+	
1221
+	public static String getIndividualUrl(int ordinal,String ip,String AccountName) 
1222
+	{
1223
+		String url = "";
1224
+		ip = (Config.TEST_IP.equalsIgnoreCase("off") || Config.TEST_IP.equalsIgnoreCase("") ) ? ip : Config.TEST_IP;
1225
+		switch(ordinal) {
1226
+			case 0:
1227
+			    //l2.topgameserver.net
1228
+				url =  String.format("%sAPI_KEY=%s/getData/%s", Config.VOTE_LINK_TGS, Config.TGS_API_KEY,ip); 
1229
+				break;
1230
+				
1231
+			case 1:
1232
+				//itopz.com
1233
+				url = String.format("%s%s/%s/%s", Config.VOTE_LINK_ITOPZ,Config.ITOPZ_API_KEY,Config.ITOPZ_SRV_ID,ip); 
1234
+				break;
1235
+				
1236
+			case 2:
1237
+				//l2top.co
1238
+				url = String.format("%sVoteCheck.php?id=%s&ip=%s", Config.VOTE_LINK_TOP_CO,Config.TOP_CO_SRV_ID,ip); 
1239
+				break;
1240
+				
1241
+			case 3:
1242
+				//l2votes.com
1243
+				url = String.format("%sapi.php?apiKey=%s&ip=%s", Config.VOTE_LINK_VTS,Config.VTS_API_KEY,ip); 
1244
+				break;
1245
+				
1246
+			case 4:
1247
+				//hopzone.net
1248
+				url = String.format("%svote?token=%s&ip_address=%s",Config.VOTE_LINK_HZ,Config.HZ_API_KEY,ip);
1249
+				break;
1250
+				
1251
+			case 5:
1252
+				//l2network.eu
1253
+				url = String.format("https://l2network.eu/index.php?a=in&u=%s&ipc=%s", Config.VOTE_NETWORK_USER_NAME,ip);
1254
+				break;
1255
+				
1256
+			case 6:
1257
+				//l2topservers.com
1258
+				url = String.format("%stoken=%s&ip=%s", Config.VOTE_LINK_TSS,Config.TSS_API_TOKEN,ip); 
1259
+				break;
1260
+				
1261
+			case 7:
1262
+				//top.l2jbrasil.com
1263
+				url = String.format("%susername=%s&ip=%s&type=json",Config.BRASIL_VOTE_LINK,Config.BRASIL_USER_NAME,ip); 
1264
+				break;
1265
+				
1266
+			case 8:
1267
+				//mmotop
1268
+				url = String.format("%s%s/ip/%s", Config.VOTE_LINK_MMOTOP, Config.MMOTOP_API_KEY, ip);
1269
+				break;
1270
+				
1271
+			case 9:
1272
+				//topzone.com
1273
+				url = String.format("%svote?token=%s&ip=%s", Config.VOTE_LINK_TZ,Config.TZ_API_KEY,ip); 
1274
+				break;
1275
+				
1276
+			case 10:
1277
+				//l2servers.com
1278
+				url = String.format("%scheckip.php?hash=%s&server_id=%s&ip=%s", Config.VOTE_LINK_SERVERS,Config.SERVERS_HASH_CODE,Config.SERVERS_SRV_ID,ip); 
1279
+				break;
1280
+		}
1281
+		
1282
+		return url;
1283
+	}
1284
+	
1285
+	public String getGlobalUrl(int ordinal) 
1286
+	{
1287
+		String url = "";
1288
+		
1289
+		switch(ordinal) {
1290
+			case 0:
1291
+			    //l2.topgameserver.net
1292
+				url = String.format("%sAPI_KEY=%s/getData", Config.VOTE_LINK_TGS, Config.TGS_API_KEY);
1293
+				break;
1294
+			
1295
+			case 1:
1296
+				//itopz.com
1297
+				url = String.format("%s%s/%s", Config.VOTE_LINK_ITOPZ,Config.ITOPZ_API_KEY,Config.ITOPZ_SRV_ID); 
1298
+				break;
1299
+
1300
+			case 2:
1301
+				//l2top.co
1302
+				url = String.format("%sVoteCheck_Total.php?id=%s", Config.VOTE_LINK_TOP_CO,Config.TOP_CO_SRV_ID); 
1303
+				break;
1304
+				
1305
+			case 3:
1306
+				//l2votes.com
1307
+				url = String.format("%sserverPage.php?sid=%s",Config.VOTE_LINK_VTS,Config.VTS_SID); 
1308
+				break;
1309
+				
1310
+			case 4:
1311
+				//hopzone.net
1312
+				url = String.format("%svotes?token=%s", Config.VOTE_LINK_HZ,Config.HZ_API_KEY);
1313
+				break;
1314
+				
1315
+			case 5:
1316
+				//l2network.eu
1317
+				url = String.format("apiKey=%s&type=%s&player=",Config.VOTE_NETWORK_API_KEY,1);
1318
+				break;
1319
+				
1320
+			case 6:
1321
+				//l2topservers
1322
+				url = String.format("https://l2topservers.com/l2top/%s/%s", Config.TS_SRV_ID,Config.TS_DOMAIN_NAME); 
1323
+				break;
1324
+								
1325
+			case 7:
1326
+				//top.l2jbrasil.com
1327
+				url = String.format("https://top.l2jbrasil.com/index.php?a=stats&u=%s",Config.BRASIL_USER_NAME); 
1328
+				break;
1329
+				
1330
+			case 8:
1331
+				//mmotop.eu/l2/
1332
+				url = String.format("%s%s/info/", Config.VOTE_LINK_MMOTOP,Config.MMOTOP_API_KEY); 
1333
+				break;
1334
+				
1335
+			case 9:
1336
+				//l2topzone.com
1337
+				url = String.format("%sserver_%s/getServerData", Config.VOTE_LINK_TZ,Config.TZ_API_KEY); 
1338
+				break;
1339
+			
1340
+			case 10:
1341
+				//l2servers.com
1342
+				url = String.format("%syearlyvotes.php?server_id=%s", Config.VOTE_LINK_SERVERS,Config.SERVERS_SRV_ID);
1343
+				break;
1344
+		}
1345
+		
1346
+		return url;
1347
+	}
1348
+}
1349
\ No newline at end of file
1350
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Handler/voteManager.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Handler/voteManager.java
1351
new file mode 100644
1352
index 0000000..aec398b
1353
--- /dev/null
1354
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Handler/voteManager.java
1355
@@ -0,0 +1,328 @@
1356
+package net.sf.l2j.gameserver.votesystem.Handler;
1357
+
1358
+import java.util.HashSet;
1359
+import java.util.Map;
1360
+import java.util.concurrent.ConcurrentHashMap;
1361
+import java.util.concurrent.ScheduledFuture;
1362
+
1363
+import net.sf.l2j.Config;
1364
+import net.sf.l2j.commons.concurrent.ThreadPool;
1365
+import net.sf.l2j.gameserver.model.World;
1366
+import net.sf.l2j.gameserver.model.actor.Player;
1367
+import net.sf.l2j.gameserver.network.GameClient;
1368
+import net.sf.l2j.gameserver.network.SystemMessageId;
1369
+import net.sf.l2j.gameserver.network.serverpackets.ItemList;
1370
+import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
1371
+import net.sf.l2j.gameserver.votesystem.DB.globalVoteDB;
1372
+import net.sf.l2j.gameserver.votesystem.DB.individualVoteDB;
1373
+import net.sf.l2j.gameserver.votesystem.Enum.voteSite;
1374
+import net.sf.l2j.gameserver.votesystem.Model.Reward;
1375
+import net.sf.l2j.gameserver.votesystem.Model.globalVote;
1376
+import net.sf.l2j.gameserver.votesystem.Model.individualVote;
1377
+import net.sf.l2j.gameserver.votesystem.Model.individualVoteResponse;
1378
+import net.sf.l2j.gameserver.votesystem.VoteUtil.VoteSiteXml;
1379
+import net.sf.l2j.gameserver.votesystem.VoteUtil.VoteUtil;
1380
+
1381
+/**
1382
+ * @author l2.topgameserver.net
1383
+ *
1384
+ */
1385
+public final class voteManager extends voteHandler{
1386
+       private ScheduledFuture<?> _saveGlobalVotes;
1387
+	private ScheduledFuture<?> _updateIndividualVotes;
1388
+	private ScheduledFuture<?> _autoGlobalVotesReward;
1389
+	
1390
+	private HashSet<individualVote> _votes;
1391
+	private Map<String,individualVote[]> _foundVoters;
1392
+	private globalVote[] _globalVotes = new globalVote[voteSite.values().length];
1393
+	
1394
+	public voteManager() {
1395
+		_foundVoters = new ConcurrentHashMap<>();
1396
+		loadVotes();
1397
+		loadGlobalVotes();
1398
+		checkAllResponseGlobalVotes();
1399
+		stopAutoTasks();
1400
+		
1401
+		if(Config.ENABLE_INDIVIDUAL_VOTE && Config.ENABLE_VOTE_SYSTEM) {
1402
+			_updateIndividualVotes = ThreadPool.scheduleAtFixedRate(new AutoUpdateIndividualVotesTask(), 30000, 	Config.NEXT_TIME_TO_AUTO_UPDATE_INDIVIDUAL_VOTES);
1403
+		}
1404
+		if(Config.ENABLE_GLOBAL_VOTE && Config.ENABLE_VOTE_SYSTEM) {
1405
+			_autoGlobalVotesReward = ThreadPool.scheduleAtFixedRate(new AutoGlobalVoteRewardTask(), 10000, Config.NEXT_TIME_TO_CHECK_AUTO_GLOBAL_VOTES_REWARD);
1406
+			_saveGlobalVotes = ThreadPool.scheduleAtFixedRate(new AutoSaveGlobalVotesTask(), 30000, Config.NEXT_TIME_TO_AUTO_UPDATE_TOTAL_VOTE);		
1407
+		}
1408
+	}
1409
+	
1410
+	private void stopAutoTasks() {
1411
+		if(_saveGlobalVotes != null) {
1412
+			_saveGlobalVotes.cancel(true);
1413
+			_saveGlobalVotes = null;
1414
+		}
1415
+		if(_updateIndividualVotes != null) {
1416
+			_updateIndividualVotes.cancel(true);
1417
+			_updateIndividualVotes = null;
1418
+		}
1419
+		if(_autoGlobalVotesReward != null) {
1420
+			_autoGlobalVotesReward.cancel(true);
1421
+			_autoGlobalVotesReward = null;
1422
+		}
1423
+	}
1424
+	
1425
+	public void getReward(Player player, int ordinalSite) {
1426
+		String ip = existIp(player);
1427
+			if(ip == null) {
1428
+				return;
1429
+			}
1430
+			individualVoteResponse ivr = getIndividualVoteResponse(ordinalSite,ip,player.getAccountName());
1431
+			if(ivr == null) {
1432
+				player.sendMessage("We were unable to verify your vote with: "+VoteSiteXml.getInstance().getSiteName(ordinalSite)+", please try again");
1433
+				return;
1434
+			}
1435
+
1436
+		if (getTimeRemaining(new individualVote(ip, ivr.getVoteSiteTime(), ordinalSite, false)) < 0)
1437
+		{
1438
+			player.sendMessage("We were unable to verify your vote with: " + VoteSiteXml.getInstance().getSiteName(ordinalSite) + ", please try again");
1439
+			return;
1440
+		}
1441
+			if(!ivr.getIsVoted()) {
1442
+				player.sendMessage(String.format("You haven't vote on %s yet!", VoteSiteXml.getInstance().getSiteName(ordinalSite)));
1443
+				return;
1444
+		}
1445
+			if(!checkIndividualAvailableVote(player,ordinalSite)) {
1446
+				player.sendMessage(String.format("You can get the reward again on %s at %s", VoteSiteXml.getInstance().getSiteName(ordinalSite),getTimeRemainingWithSampleFormat(player,ordinalSite)));
1447
+				return;
1448
+			}
1449
+			individualVote iv = new individualVote(ip,ivr.getDiffTime(),ivr.getVoteSiteTime(),ordinalSite,false);
1450
+
1451
+			individualVote[] aiv;
1452
+			if(!_foundVoters.containsKey(ip)) {
1453
+				 aiv = new individualVote[voteSite.values().length];
1454
+				 iv.setAlreadyRewarded(true);
1455
+				 aiv[ordinalSite] = iv;
1456
+				_foundVoters.put(ip, aiv);
1457
+				for(Reward reward : VoteSiteXml.getInstance().getRewards(ordinalSite)) {
1458
+					player.getInventory().addItem("VoteSystem", reward.getItemId(), reward.getItemCount(), player, null);
1459
+					player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S).addItemName(reward.getItemId()).addNumber(reward.getItemCount()));
1460
+					}
1461
+					player.sendMessage(String.format("%s: Thank you for voting for our server, your reward has been delivered.", VoteSiteXml.getInstance().getSiteName(ordinalSite)));
1462
+					player.sendPacket(new ItemList(player, true));
1463
+			}else {
1464
+				aiv = _foundVoters.get(ip);
1465
+				iv.setAlreadyRewarded(true);
1466
+				aiv[ordinalSite] = iv;
1467
+				_foundVoters.replace(ip, aiv);
1468
+				for(Reward reward : VoteSiteXml.getInstance().getRewards(ordinalSite)) {
1469
+					player.getInventory().addItem("VoteSystem", reward.getItemId(), reward.getItemCount(), player, null);
1470
+					player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S).addItemName(reward.getItemId()).addNumber(reward.getItemCount()));
1471
+					}
1472
+					player.sendMessage(String.format("%s: Thank you for voting for our server, your reward has been delivered.", VoteSiteXml.getInstance().getSiteName(ordinalSite)));
1473
+					player.sendPacket(new ItemList(player, true));
1474
+			}
1475
+	}
1476
+
1477
+	public boolean checkIndividualAvailableVote(Player player, int ordinalSite) {
1478
+		String ip = existIp(player);
1479
+		if(_foundVoters.containsKey(ip)) {
1480
+			individualVote[] ivs=_foundVoters.get(ip);
1481
+			if(ivs[ordinalSite] == null) {
1482
+				return true;
1483
+			}
1484
+			if(ivs[ordinalSite] != null) {
1485
+				individualVote iv = ivs[ordinalSite];
1486
+				if(getTimeRemaining(iv)<0) {
1487
+					return true;
1488
+				}
1489
+			}
1490
+		}else {
1491
+			return true;
1492
+		}
1493
+
1494
+		return false;
1495
+	}
1496
+	
1497
+	public long getTimeRemaining(individualVote iv)
1498
+	{
1499
+		long timeRemaining = 0L;
1500
+		timeRemaining = ((iv.getVotingTimeSite() + Config.INTERVAL_TO_NEXT_VOTE) - ((iv.getDiffTime() > 0) ? (System.currentTimeMillis() + iv.getDiffTime()) : (System.currentTimeMillis() - iv.getDiffTime())));
1501
+		return timeRemaining;
1502
+	}
1503
+	
1504
+	public String getTimeRemainingWithSampleFormat(Player player, int ordinalSite) {
1505
+		String ip = existIp(player);
1506
+		String timeRemainingWithSampleFormat ="";
1507
+		if(_foundVoters.containsKey(ip)) {
1508
+			individualVote[] ivs=_foundVoters.get(ip);
1509
+			if(ivs[ordinalSite] != null) {
1510
+				individualVote iv = ivs[ordinalSite];
1511
+				long timeRemaining = getTimeRemaining(iv); 
1512
+				if(timeRemaining>0) {
1513
+					timeRemainingWithSampleFormat = CalculateTimeRemainingWithSampleDateFormat(timeRemaining);
1514
+					return timeRemainingWithSampleFormat;
1515
+				}
1516
+			}
1517
+		}
1518
+		return timeRemainingWithSampleFormat;
1519
+	}
1520
+	
1521
+	public String CalculateTimeRemainingWithSampleDateFormat(long timeRemaining) {
1522
+		long t = timeRemaining/1000;
1523
+		int hours = Math.round((t/3600%24));
1524
+		 int minutes = Math.round((t/60)%60);
1525
+		 int seconds = Math.round(t%60);
1526
+		 return String.format("%sH:%sm:%ss", hours,minutes,seconds);
1527
+	}
1528
+	
1529
+	public String existIp(Player p) {
1530
+		 
1531
+		 GameClient client = p.getClient();
1532
+		 if(client.getConnection() != null && client.getPlayer() != null && !client.isDetached()) {
1533
+		 try
1534
+		{
1535
+			 return client.getConnection().getInetAddress().getHostAddress();
1536
+		}
1537
+		catch (Exception e)
1538
+		{
1539
+				e.printStackTrace();
1540
+		}
1541
+	}
1542
+		return null;
1543
+		 
1544
+	 }
1545
+	
1546
+	public final void loadVotes() {
1547
+		_foundVoters = individualVoteDB.getInstance().getVotesDB();
1548
+	}
1549
+	protected void loadGlobalVotes(){
1550
+		_globalVotes = globalVoteDB.getInstance().getGlobalVotes();
1551
+	}
1552
+	public void saveVotes() {
1553
+		individualVoteDB.getInstance().SaveVotes(_foundVoters);
1554
+	}
1555
+	
1556
+	protected void AutoGlobalVoteReward() {
1557
+		HashSet<String> ipList = new HashSet<>();
1558
+		for(voteSite vs : voteSite.values()) {
1559
+			
1560
+			new Thread(() -> {
1561
+				checkNewUpdate(vs.ordinal());
1562
+				if(_globalVotes[vs.ordinal()].getCurrentVotes() >= _globalVotes[vs.ordinal()].getVotesLastReward() + (vs.ordinal() == voteSite.L2SERVERS.ordinal() ? 25*Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD : Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD)) {
1563
+					_globalVotes[vs.ordinal()].setVotesLastReward(_globalVotes[vs.ordinal()].getVotesLastReward() + (vs.ordinal() == voteSite.L2SERVERS.ordinal() ? 25*Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD : Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD));
1564
+					for(Player player : World.getInstance().getPlayers()) {
1565
+						String ip = existIp(player);
1566
+						if(ip == null) {
1567
+							continue;
1568
+						}
1569
+						if(ipList.contains(ip)) {
1570
+							continue;
1571
+						}
1572
+						for(Reward reward : VoteSiteXml.getInstance().getRewards(11)) {
1573
+							player.getInventory().addItem("VoteSystem: ", reward.getItemId(), reward.getItemCount(), player, null);
1574
+							player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S).addItemName(reward.getItemId()).addNumber(reward.getItemCount()));
1575
+						}
1576
+						ipList.add(ip);
1577
+						player.sendPacket(new ItemList(player, true));
1578
+					}
1579
+					World.announceToOnlinePlayers(VoteUtil.Sites[vs.ordinal()]+": All players has been rewarded, please check your inventory", true);
1580
+				}else {
1581
+					String encourage =""; 
1582
+					int nextReward = _globalVotes[vs.ordinal()].getVotesLastReward() + (vs.ordinal() == voteSite.L2SERVERS.ordinal() ? 25*Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD : Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD);
1583
+					encourage = String.format("Vote for %s current Votes: %s, next quantity of votes to reward : %s, need votes to next reward: %s", VoteUtil.Sites[vs.ordinal()], _globalVotes[vs.ordinal()].getCurrentVotes(),nextReward, nextReward-_globalVotes[vs.ordinal()].getCurrentVotes() );
1584
+					World.announceToOnlinePlayers(encourage, true);
1585
+			}
1586
+			}).start();
1587
+			
1588
+		}
1589
+	}
1590
+	
1591
+	protected void AutoSaveGlobalVotes() {
1592
+		globalVoteDB.getInstance().saveGlobalVotes(_globalVotes);
1593
+	}
1594
+	
1595
+	protected synchronized void  AutoUpdateIndividualVotes() {
1596
+		AutoCleanInnecesaryIndividualVotes();
1597
+		individualVoteDB.getInstance().SaveVotes(_foundVoters);
1598
+	}
1599
+	
1600
+	protected synchronized void AutoCleanInnecesaryIndividualVotes() {
1601
+		HashSet<individualVote> removeVotes= new HashSet<>();
1602
+		for(Map.Entry<String, individualVote[]> ivs : _foundVoters.entrySet()) {
1603
+			for(individualVote individualvote : ivs.getValue()) {
1604
+				if(individualvote == null)
1605
+					continue;
1606
+				if(getTimeRemaining(individualvote) < 0) {
1607
+					removeVotes.add(individualvote);
1608
+					if(_foundVoters.containsKey(individualvote.getVoterIp())) {
1609
+						if(_foundVoters.get(individualvote.getVoterIp())[individualvote.getVoteSite()] != null) {
1610
+							_foundVoters.get(individualvote.getVoterIp())[individualvote.getVoteSite()] = null;
1611
+						}
1612
+					}
1613
+				}
1614
+			}
1615
+		}
1616
+		individualVoteDB.getInstance().DeleteVotes(removeVotes);
1617
+	}
1618
+	
1619
+	public void checkAllResponseGlobalVotes() {
1620
+		for(voteSite vs : voteSite.values()) {
1621
+			new Thread(()-> {
1622
+				checkNewUpdate(vs.ordinal());
1623
+			});
1624
+		}
1625
+	}
1626
+	
1627
+	public void checkNewUpdate(int ordinalSite) {
1628
+			int globalVotesResponse = getGlobalVotesResponse(ordinalSite); 
1629
+			if(globalVotesResponse == -1) {
1630
+				return;
1631
+			}
1632
+			_globalVotes[ordinalSite].setCurrentVotes(globalVotesResponse);
1633
+			int last = globalVotesResponse - (ordinalSite == voteSite.L2SERVERS.ordinal() ? 25 * Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD : Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD);
1634
+			if(last <0 ) {
1635
+				_globalVotes[ordinalSite].setVotesLastReward(0);
1636
+				return;
1637
+			} 
1638
+			if((_globalVotes[ordinalSite].getVotesLastReward() + (ordinalSite == voteSite.L2SERVERS.ordinal() ? 25 * Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD : Config.GLOBAL_VOTES_AMOUNT_TO_NEXT_REWARD)) < globalVotesResponse) {
1639
+				_globalVotes[ordinalSite].setVotesLastReward(globalVotesResponse);
1640
+				return;
1641
+			}
1642
+	}
1643
+	
1644
+	public void Shutdown() {
1645
+		AutoSaveGlobalVotes();
1646
+		AutoCleanInnecesaryIndividualVotes();
1647
+		AutoUpdateIndividualVotes();
1648
+	}
1649
+
1650
+	protected class AutoGlobalVoteRewardTask implements Runnable {
1651
+
1652
+		@Override
1653
+		public void run()
1654
+		{
1655
+			AutoGlobalVoteReward();
1656
+			
1657
+		}
1658
+		
1659
+	}
1660
+	
1661
+	protected class AutoSaveGlobalVotesTask implements Runnable {
1662
+		
1663
+		@Override
1664
+		public void run()
1665
+		{
1666
+			AutoSaveGlobalVotes();
1667
+			
1668
+		}
1669
+	
1670
+	}
1671
+	
1672
+	protected class AutoUpdateIndividualVotesTask implements Runnable {
1673
+
1674
+		@Override
1675
+		public void run()
1676
+		{
1677
+			AutoUpdateIndividualVotes();
1678
+			
1679
+		}
1680
+		
1681
+	}
1682
+	
1683
+	public static voteManager getInatance() {
1684
+		return SingleHolder.INSTANCE;
1685
+	}
1686
+	
1687
+	private static class SingleHolder {
1688
+		protected static final voteManager INSTANCE = new voteManager();
1689
+	}
1690
+}
1691
\ No newline at end of file
1692
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/Reward.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/Reward.java
1693
new file mode 100644
1694
index 0000000..2ca11e8
1695
--- /dev/null
1696
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/Reward.java
1697
@@ -0,0 +1,33 @@
1698
+package net.sf.l2j.gameserver.votesystem.Model;
1699
+
1700
+
1701
+import net.sf.l2j.commons.util.StatsSet;
1702
+
1703
+/**
1704
+ * @author l2.topgameserver.net
1705
+ *
1706
+ */
1707
+public class Reward
1708
+{
1709
+	private int _itemId;
1710
+	private int _itemCount;
1711
+	
1712
+	public Reward(StatsSet set)
1713
+	{
1714
+		_itemId = set.getInteger("itemId");
1715
+		_itemCount = set.getInteger("itemCount");
1716
+	}
1717
+
1718
+	public void setItemId(int itemId) {
1719
+		_itemId = itemId;
1720
+	}
1721
+	public void setItemCount(int itemCount) {
1722
+		_itemCount = itemCount;
1723
+	}
1724
+	public int getItemId() {
1725
+		return _itemId;
1726
+	}
1727
+	public int getItemCount() {
1728
+		return _itemCount;
1729
+	}
1730
+}
1731
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/VoteSite.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/VoteSite.java
1732
new file mode 100644
1733
index 0000000..e2c23ac
1734
--- /dev/null
1735
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/VoteSite.java
1736
@@ -0,0 +1,38 @@
1737
+package net.sf.l2j.gameserver.votesystem.Model;
1738
+
1739
+import java.util.ArrayList;
1740
+import java.util.List;
1741
+
1742
+/**
1743
+ * @author l2.topgameserver.net
1744
+ *
1745
+ */
1746
+public class VoteSite
1747
+{
1748
+	private int _siteOrdinal;
1749
+	private String _siteName;
1750
+	private List<Reward> _rewards = new ArrayList<>();
1751
+	public VoteSite() {
1752
+		
1753
+	}
1754
+	public void setSiteOrdinal(int siteOrdinal) {
1755
+		_siteOrdinal = siteOrdinal;
1756
+	}
1757
+	public void setSiteName(String siteName) {
1758
+		_siteName = siteName;
1759
+	}
1760
+	public void setRewardList(List<Reward> rewards) {
1761
+		for(Reward r : rewards) 
1762
+			_rewards.add(r);
1763
+	}
1764
+	public int getSiteOrdinal() {
1765
+		return _siteOrdinal;
1766
+	}
1767
+	public String getSiteName() {
1768
+		return _siteName;
1769
+	}
1770
+	public List<Reward> getRewardList(){
1771
+		return _rewards;
1772
+	}
1773
+	
1774
+}
1775
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/globalVote.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/globalVote.java
1776
new file mode 100644
1777
index 0000000..ca5d979
1778
--- /dev/null
1779
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/globalVote.java
1780
@@ -0,0 +1,45 @@
1781
+package net.sf.l2j.gameserver.votesystem.Model;
1782
+
1783
+/**
1784
+ * @author l2.topgameserver.net
1785
+ *
1786
+ */
1787
+public class globalVote
1788
+{
1789
+	private int _voteSite;
1790
+	private int _votesLastReward;
1791
+	private int _currentVotes;
1792
+	public globalVote() {
1793
+		
1794
+	}
1795
+	
1796
+	public globalVote(int voteSite, int votesLastReward) {
1797
+		_voteSite = voteSite;
1798
+		_votesLastReward = votesLastReward;
1799
+	}
1800
+	
1801
+	public void setVoteSite(int voteSite) {
1802
+		_voteSite = voteSite;
1803
+	}
1804
+	
1805
+	public void setVotesLastReward(int votesLastReward) {
1806
+		_votesLastReward = votesLastReward;
1807
+	}
1808
+	
1809
+	public void setCurrentVotes(int currentVotes) {
1810
+		_currentVotes = currentVotes;
1811
+	}
1812
+	
1813
+	public int getVoyeSite() {
1814
+		return _voteSite;
1815
+	}
1816
+	
1817
+	public int getVotesLastReward() {
1818
+		return _votesLastReward;
1819
+	}
1820
+	
1821
+	public int getCurrentVotes() {
1822
+		return _currentVotes;
1823
+	}
1824
+	
1825
+}
1826
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/individualVote.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/individualVote.java
1827
new file mode 100644
1828
index 0000000..7d24d7f
1829
--- /dev/null
1830
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/individualVote.java
1831
@@ -0,0 +1,69 @@
1832
+package net.sf.l2j.gameserver.votesystem.Model;
1833
+
1834
+
1835
+/**
1836
+ * @author l2.topgameserver.net
1837
+ *
1838
+ */
1839
+public class individualVote
1840
+{
1841
+	private String _voterIp;
1842
+	private long _diffTime;
1843
+	private long _votingTimeSite;
1844
+	private int _voteSite;
1845
+	private boolean _alreadyRewarded;
1846
+	
1847
+	
1848
+	public individualVote(String voterIp, long diffTime, long votingTimeSite, int voteSite, boolean alreadyRewarded){
1849
+		_voterIp = voterIp;
1850
+		_diffTime = diffTime;
1851
+		_votingTimeSite = votingTimeSite;
1852
+		_voteSite = voteSite;
1853
+		_alreadyRewarded = alreadyRewarded;
1854
+	}
1855
+	
1856
+	public individualVote(){
1857
+		
1858
+	}
1859
+	
1860
+	public void setVoterIp(String voterIp) {
1861
+		_voterIp = voterIp;
1862
+	}
1863
+	
1864
+	public void setDiffTime(long diffTime) {
1865
+		_diffTime = diffTime;
1866
+	}
1867
+	
1868
+	public void setVotingTimeSite(long votingTimeSite) {
1869
+		_votingTimeSite = votingTimeSite;
1870
+	}
1871
+	
1872
+	public void setVoteSite(int voteSite) {
1873
+		_voteSite = voteSite;
1874
+	}
1875
+	
1876
+	public void setAlreadyRewarded(boolean alreadyRewarded) {
1877
+		_alreadyRewarded = alreadyRewarded;
1878
+	}
1879
+	
1880
+	public String getVoterIp() {
1881
+		return _voterIp;
1882
+	}
1883
+	
1884
+	public long getDiffTime() {
1885
+		return _diffTime;
1886
+	}
1887
+	
1888
+	public long  getVotingTimeSite() {
1889
+		return _votingTimeSite;
1890
+	}
1891
+	
1892
+	public int getVoteSite() {
1893
+		return _voteSite;
1894
+	}
1895
+	
1896
+	public boolean getAlreadyRewarded() {
1897
+		return _alreadyRewarded;
1898
+	}
1899
+	
1900
+}
1901
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/individualVoteResponse.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/individualVoteResponse.java
1902
new file mode 100644
1903
index 0000000..14b7625
1904
--- /dev/null
1905
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/Model/individualVoteResponse.java
1906
@@ -0,0 +1,36 @@
1907
+package net.sf.l2j.gameserver.votesystem.Model;
1908
+
1909
+/**
1910
+ * @author l2.topgameserver.net
1911
+ *
1912
+ */
1913
+public class individualVoteResponse
1914
+{
1915
+	private boolean _isVoted;
1916
+	private long _diffTime;
1917
+	private long _voteSiteTime;
1918
+	
1919
+	public individualVoteResponse() {
1920
+		
1921
+	}
1922
+	
1923
+	public void setIsVoted(boolean isVoted) {
1924
+		_isVoted = isVoted;
1925
+	}
1926
+	public void setDiffTime(long diffTime) {
1927
+		_diffTime = diffTime;
1928
+	}
1929
+	public void setVoteSiteTime(long voteSiteTime) {
1930
+		_voteSiteTime = voteSiteTime;
1931
+	}
1932
+	
1933
+	public boolean getIsVoted() {
1934
+		return _isVoted;
1935
+	}
1936
+	public long getDiffTime() {
1937
+		return  _diffTime;
1938
+	}
1939
+	public long getVoteSiteTime() {
1940
+		return _voteSiteTime;
1941
+	}
1942
+}
1943
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/VoteUtil/VoteSiteXml.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/VoteUtil/VoteSiteXml.java
1944
new file mode 100644
1945
index 0000000..d943fb8
1946
--- /dev/null
1947
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/VoteUtil/VoteSiteXml.java
1948
@@ -0,0 +1,69 @@
1949
+package net.sf.l2j.gameserver.votesystem.VoteUtil;
1950
+
1951
+import java.nio.file.Path;
1952
+import java.util.Collection;
1953
+import java.util.HashMap;
1954
+import java.util.Map;
1955
+
1956
+import net.sf.l2j.commons.data.xml.IXmlReader;
1957
+import net.sf.l2j.gameserver.votesystem.Model.Reward;
1958
+import net.sf.l2j.gameserver.votesystem.Model.VoteSite;
1959
+
1960
+import org.w3c.dom.Document;
1961
+import org.w3c.dom.NamedNodeMap;
1962
+
1963
+/**
1964
+ * @author l2.topgameserver.net
1965
+ *
1966
+ */
1967
+public class VoteSiteXml implements IXmlReader
1968
+{
1969
+
1970
+	private final Map<Integer,VoteSite> _voteSites = new HashMap<>();
1971
+	
1972
+	protected VoteSiteXml() {
1973
+		load();
1974
+	}
1975
+	
1976
+	@Override
1977
+	public void load()
1978
+	{
1979
+		parseFile("./data/xml/votesystem.xml");
1980
+		LOGGER.info("Loaded {} reward sites", _voteSites.size());
1981
+	}
1982
+
1983
+
1984
+	@Override
1985
+	public void parseDocument(Document doc, Path path)
1986
+	{
1987
+		forEach(doc, "list", listNode -> {
1988
+			forEach(listNode, "votesite", votesiteNode -> {
1989
+				final VoteSite votesite = new VoteSite();
1990
+				final NamedNodeMap attrs = votesiteNode.getAttributes();
1991
+				votesite.setSiteOrdinal(parseInteger(attrs,"ordinal"));
1992
+				votesite.setSiteName(parseString(attrs,"name"));
1993
+				forEach(votesiteNode,"items", itemsNode -> forEach(itemsNode,"item",itemNode -> votesite.getRewardList().add(new Reward(parseAttributes(itemNode)))));
1994
+				_voteSites.put(votesite.getSiteOrdinal(),votesite);
1995
+			});
1996
+		});
1997
+	}
1998
+	
1999
+	public String getSiteName(int ordinal) {
2000
+		return _voteSites.get(ordinal).getSiteName();
2001
+	}
2002
+	
2003
+	public Collection<Reward> getRewards(int ordinal){
2004
+		return _voteSites.get(ordinal).getRewardList();
2005
+	}
2006
+	
2007
+	public static final VoteSiteXml getInstance()
2008
+	{
2009
+		return SingletonHolder.INSTANCE;
2010
+	}
2011
+	
2012
+	private static final class SingletonHolder
2013
+	{
2014
+		protected static final VoteSiteXml INSTANCE = new VoteSiteXml();
2015
+	}
2016
+	
2017
+}
2018
diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/VoteUtil/VoteUtil.java b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/VoteUtil/VoteUtil.java
2019
new file mode 100644
2020
index 0000000..a555b85
2021
--- /dev/null
2022
+++ b/aCis_gameserver/java/net/sf/l2j/gameserver/votesystem/VoteUtil/VoteUtil.java
2023
@@ -0,0 +1,132 @@
2024
+package net.sf.l2j.gameserver.votesystem.VoteUtil;
2025
+
2026
+import java.io.BufferedReader;
2027
+import java.io.InputStreamReader;
2028
+import java.net.HttpURLConnection;
2029
+import java.net.URL;
2030
+import java.time.LocalDateTime;
2031
+import java.time.ZoneId;
2032
+import java.time.ZonedDateTime;
2033
+
2034
+import net.sf.l2j.commons.logging.CLogger;
2035
+
2036
+
2037
+/**
2038
+ * @author l2.topgameserver.net
2039
+ *
2040
+ */
2041
+public final class VoteUtil
2042
+{
2043
+	public static final CLogger LOGGER = new CLogger(VoteUtil.class.getName());
2044
+	
2045
+	private static String voteTimeZones[] = {
2046
+		"topgameserver.net=Europe/Berlin",
2047
+		"itopz.com=America/New_York",
2048
+		"l2top.co=Europe/London",
2049
+		"l2votes.com=GMT",
2050
+		"hopzone.net=Europe/Athens",
2051
+		"l2network.eu=America/Chicago",
2052
+		"l2topservers.com=Europe/Athens",
2053
+		"top.l2jbrasil.com=America/Sao_Paulo",
2054
+		"mmotop.eu=America/Chicago",
2055
+		"l2topzone.com=America/Chicago",
2056
+		"l2servers.com=America/Chicago",
2057
+		};
2058
+		
2059
+		public static final long getTimeVotingSite(int ordinalSite) {
2060
+			LocalDateTime ldt = LocalDateTime.now(ZoneId.of(voteTimeZones[ordinalSite].split("=")[1]));
2061
+		    ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
2062
+		    long millis = zdt.toInstant().toEpochMilli();
2063
+		    return millis;
2064
+		}
2065
+		
2066
+		public static final String Sites[] =
2067
+		{
2068
+			"L2.TopGameServer.net",
2069
+			"ITopZ.com",
2070
+			"L2Top.co",
2071
+			"L2Votes.com",
2072
+			"L2.Hopzone.net",
2073
+			"L2Network.eu",
2074
+			"L2TopServers.com",
2075
+			"top.l2jbrasil.com",
2076
+			"MMOTOP.eu",
2077
+			"L2Topzone.com",
2078
+			"L2Servers.com"
2079
+		};
2080
+		
2081
+		public static final String getResponse(String Url, int ordinal) 
2082
+		{
2083
+			
2084
+			try
2085
+			  {
2086
+				int responseCode = 0;
2087
+				URL objUrl = new URL(Url);
2088
+				HttpURLConnection con = (HttpURLConnection) objUrl.openConnection();
2089
+				con.setRequestMethod("GET");
2090
+				con.setRequestProperty("User-Agent", "Mozilla/5.0");
2091
+				con.setConnectTimeout(5000);
2092
+				responseCode = con.getResponseCode();
2093
+				if (responseCode == HttpURLConnection.HTTP_OK) {
2094
+					
2095
+					String inputLine;
2096
+					StringBuffer response = new StringBuffer();
2097
+					BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
2098
+					while ((inputLine = in.readLine()) != null) {
2099
+						if(ordinal == 3) {
2100
+							if(inputLine.contains("Votes:")) {
2101
+								response.append(inputLine);
2102
+								break;
2103
+							}
2104
+						}
2105
+						if(ordinal == 7){
2106
+							if(inputLine.contains("<b>Entradas ")) {
2107
+								response.append(inputLine);
2108
+							break;
2109
+							}
2110
+						}
2111
+					}
2112
+					in.close();
2113
+					return response.toString();
2114
+				} 
2115
+			
2116
+			  }
2117
+			       catch (Exception e)
2118
+			       {
2119
+			    	   LOGGER.error(VoteUtil.Sites[ordinal]+ " Say: An error ocurred ", e.getMessage());
2120
+			           return "";
2121
+			       }
2122
+
2123
+			return "";
2124
+		}
2125
+	
2126
+		public static final String between(String p1, String str, String p2){
2127
+	        String returnValue = "";
2128
+	        int i1 = str.indexOf(p1);
2129
+	        int i2 = str.indexOf(p2);
2130
+	        if(i1 != -1 && i2 != -1){
2131
+	            i1 = i1+p1.length();
2132
+	            returnValue = str.substring(i1,i2);
2133
+	        }
2134
+	        return returnValue;
2135
+	    }
2136
+		
2137
+		public static void goToVoteSite(String urlSiiteVotation) {
2138
+			/*try
2139
+			{
2140
+				URL url = new URL(urlSiiteVotation);
2141
+				try
2142
+				{
2143
+					Desktop.getDesktop().browse(url.toURI());
2144
+				}
2145
+				catch (IOException | URISyntaxException e)
2146
+				{
2147
+					e.printStackTrace();
2148
+				}
2149
+			}
2150
+			catch (MalformedURLException e)
2151
+			{
2152
+				e.printStackTrace();
2153
+			}*/
2154
+		}
2155
+}
2156
2157
2158
==============================================DATAPACK=======================================
2159
2160
diff --git a/aCis_datapack/data/html/mods/votesystem/100005.html b/aCis_datapack/data/html/mods/votesystem/50009.html
2161
new file mode 100644
2162
index 0000000..d7d938a
2163
--- /dev/null
2164
+++ b/aCis_datapack/data/html/mods/votesystem/50009.html
2165
@@ -0,0 +1,19 @@
2166
+<html>
2167
+<title>Voting panel</title>
2168
+<body><center>
2169
+	<br><img src="L2UI_CH3.herotower_deco" width=256 height=32><br>
2170
+	<table cellpadding=2 width=280>
2171
+		<tr><td width="280">Hello <font color="C6AF00">%accountName%</font>, welcome to the voting rewards dashboard, please help us by voting by server every <font color="C6AF00">%everyXtime% hours</font> in all voting sites.</td></tr>
2172
+	</table>
2173
+	<table width="290"><tr><td width="290" align="center">You can vote: </td></tr></table>
2174
+	<br><img src="l2ui.SquareWhite" width=290 height=1><br>
2175
+
2176
+	%enablevote%
2177
+
2178
+	<br>
2179
+	<img src="l2ui.SquareWhite" width=290 height=1><br>
2180
+
2181
+
2182
+
2183
+</center></body>
2184
+</html>
2185
\ No newline at end of file
2186
diff --git a/aCis_datapack/data/xml/npcs/50000-50999.xml b/aCis_datapack/data/xml/npcs/50000-50999.xml
2187
index 1a21b51..0e9b37f 100644
2188
--- a/aCis_datapack/data/xml/npcs/50000-50999.xml
2189
+++ b/aCis_datapack/data/xml/npcs/50000-50999.xml
2190
@@ -1,114 +1,153 @@
2191
2192
	</npc>
2193
	
2194
+	<npc id="50009" idTemplate="30519" name="Kaaya" title="Vote System">
2195
+		<set name="usingServerSideName" val="true"/>
2196
+		<set name="usingServerSideTitle" val="true"/>
2197
+		<set name="level" val="70"/>
2198
+		<set name="radius" val="7"/>
2199
+		<set name="height" val="18"/>
2200
+		<set name="rHand" val="0"/>
2201
+		<set name="lHand" val="0"/>
2202
+		<set name="type" val="NpcVote"/>
2203
+		<set name="exp" val="0"/>
2204
+		<set name="sp" val="0"/>
2205
+		<set name="hp" val="2444.46819"/>
2206
+		<set name="mp" val="1345.8"/>
2207
+		<set name="hpRegen" val="7.5"/>
2208
+		<set name="mpRegen" val="2.7"/>
2209
+		<set name="pAtk" val="688.86373"/>
2210
+		<set name="pDef" val="295.91597"/>
2211
+		<set name="mAtk" val="470.40463"/>
2212
+		<set name="mDef" val="216.53847"/>
2213
+		<set name="crit" val="4"/>
2214
+		<set name="atkSpd" val="253"/>
2215
+		<set name="str" val="40"/>
2216
+		<set name="int" val="21"/>
2217
+		<set name="dex" val="30"/>
2218
+		<set name="wit" val="20"/>
2219
+		<set name="con" val="43"/>
2220
+		<set name="men" val="20"/>
2221
+		<set name="corpseTime" val="7"/>
2222
+		<set name="walkSpd" val="50"/>
2223
+		<set name="runSpd" val="120"/>
2224
+		<set name="dropHerbGroup" val="0"/>
2225
+		<ai type="DEFAULT" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" canMove="true" seedable="false"/>
2226
+		<skills>
2227
+			<skill id="4045" level="1"/>
2228
+			<skill id="4416" level="18"/>
2229
+		</skills>
2230
+	</npc>
2231
+	
2232
 </list>
2233
\ No newline at end of file
2234
diff --git a/aCis_datapack/data/xml/votesystem.xml b/aCis_datapack/data/xml/votesystem.xml
2235
new file mode 100644
2236
index 0000000..f254f8c
2237
--- /dev/null
2238
+++ b/aCis_datapack/data/xml/votesystem.xml
2239
@@ -0,0 +1,75 @@
2240
+<?xml version="1.0" encoding="UTF-8"?>
2241
+<list>
2242
+	<votesite name="l2.topgameserver.net" ordinal="0">
2243
+		<items>
2244
+		<item itemId="57" itemCount="10000000" />
2245
+		<item itemId="6673" itemCount="1"/>
2246
+		</items>
2247
+	</votesite>
2248
+	<votesite name="ItopZ.com" ordinal="1">
2249
+		<items>
2250
+		<item itemId="57" itemCount="10000000" />
2251
+		<item itemId="6673" itemCount="1"/>
2252
+		</items>
2253
+	</votesite>
2254
+	<votesite name="L2Top.co" ordinal="2">
2255
+		<items>
2256
+		<item itemId="57" itemCount="10000000" />
2257
+		<item itemId="6673" itemCount="1"/>
2258
+		</items>
2259
+	</votesite>
2260
+	<votesite name="L2Votes.com" ordinal="3">
2261
+		<items>
2262
+		<item itemId="57" itemCount="10000000" />
2263
+		<item itemId="6673" itemCount="1"/>
2264
+		</items>
2265
+	</votesite>
2266
+	<votesite name="Hopzone.net" ordinal="4">
2267
+		<items>
2268
+		<item itemId="57" itemCount="10000000" />
2269
+		<item itemId="6673" itemCount="1"/>
2270
+		</items>
2271
+	</votesite>
2272
+	<votesite name="L2Network.eu" ordinal="5">
2273
+		<items>
2274
+		<item itemId="57" itemCount="10000000" />
2275
+		<item itemId="6673" itemCount="1"/>
2276
+		</items>
2277
+	</votesite>
2278
+	<votesite name="L2Topservers.com" ordinal="6">
2279
+		<items>
2280
+		<item itemId="57" itemCount="10000000" />
2281
+		<item itemId="6673" itemCount="1"/>
2282
+		</items>
2283
+	</votesite>
2284
+	<votesite name="top.l2jbrasil.com" ordinal="7">
2285
+		<items>
2286
+		<item itemId="57" itemCount="10000000" />
2287
+		<item itemId="6673" itemCount="1"/>
2288
+		</items>
2289
+	</votesite>
2290
+	<votesite name="MMOTOP.eu" ordinal="8">
2291
+		<items>
2292
+		<item itemId="57" itemCount="10000000" />
2293
+		<item itemId="6673" itemCount="1"/>
2294
+		</items>
2295
+	</votesite>
2296
+	<votesite name="L2Topzone.com" ordinal="9">
2297
+		<items>
2298
+		<item itemId="57" itemCount="10000000" />
2299
+		<item itemId="6673" itemCount="1"/>
2300
+		</items>
2301
+	</votesite>
2302
+	<votesite name="L2Servers.com" ordinal="10">
2303
+		<items>
2304
+		<item itemId="57" itemCount="10000000" />
2305
+		<item itemId="6673" itemCount="1"/>
2306
+		</items>
2307
+	</votesite>
2308
+	<votesite name="globalVotes" ordinal="11">
2309
+		<items>
2310
+		<item itemId="57" itemCount="10000000" />
2311
+		<item itemId="6673" itemCount="1"/>
2312
+		</items>
2313
+	</votesite>
2314
+</list>
2315
\ No newline at end of file
2316
2317
2318
SET NAMES utf8mb4;
2319
SET FOREIGN_KEY_CHECKS = 0;
2320
2321
-- ----------------------------
2322
-- Table structure for globalvotes
2323
-- ----------------------------
2324
DROP TABLE IF EXISTS `globalvotes`;
2325
CREATE TABLE `globalvotes`  (
2326
  `voteSite` tinyint(2) NOT NULL,
2327
  `lastRewardVotes` int(11) NULL DEFAULT NULL,
2328
  PRIMARY KEY (`voteSite`) USING BTREE
2329
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
2330
2331
-- ----------------------------
2332
-- Records of globalvotes
2333
-- ----------------------------
2334
INSERT INTO `globalvotes` VALUES (0, 13);
2335
INSERT INTO `globalvotes` VALUES (1, 68);
2336
INSERT INTO `globalvotes` VALUES (2, 0);
2337
INSERT INTO `globalvotes` VALUES (3, 3);
2338
INSERT INTO `globalvotes` VALUES (4, 2);
2339
INSERT INTO `globalvotes` VALUES (5, 0);
2340
INSERT INTO `globalvotes` VALUES (6, 0);
2341
INSERT INTO `globalvotes` VALUES (7, 2);
2342
INSERT INTO `globalvotes` VALUES (8, 3);
2343
INSERT INTO `globalvotes` VALUES (9, 0);
2344
INSERT INTO `globalvotes` VALUES (10, 75);
2345
2346
-- ----------------------------
2347
-- Table structure for individualvotes
2348
-- ----------------------------
2349
DROP TABLE IF EXISTS `individualvotes`;
2350
CREATE TABLE `individualvotes`  (
2351
  `voterIp` varchar(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
2352
  `voteSite` tinyint(3) NOT NULL,
2353
  `diffTime` bigint(20) NULL DEFAULT NULL,
2354
  `votingTimeSite` bigint(20) NULL DEFAULT NULL,
2355
  `alreadyRewarded` tinyint(3) NULL DEFAULT NULL,
2356
  PRIMARY KEY (`voterIp`, `voteSite`) USING BTREE
2357
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
2358
2359
-- ----------------------------
2360
-- Records of individualvotes
2361
-- ----------------------------
2362
INSERT INTO `individualvotes` VALUES ('127.0.0.1', 0, 1588703279833, 1588702011000, 1);
2363
INSERT INTO `individualvotes` VALUES ('127.0.0.1', 3, 1588704503248, 1588703396000, 1);
2364
INSERT INTO `individualvotes` VALUES ('127.0.0.1', 5, 1588692835993, 1588692823000, 1);
2365
2366
SET FOREIGN_KEY_CHECKS = 1;