diff --git a/L2J_Mobius_Helios/dist/game/config/Custom/VoteReward.ini b/L2J_Mobius_Helios/dist/game/config/Custom/VoteReward.ini new file mode 100644 index 0000000000..23ced521d1 --- /dev/null +++ b/L2J_Mobius_Helios/dist/game/config/Custom/VoteReward.ini @@ -0,0 +1,56 @@ +# Vote reward for Network. +AllowNetworkVoteReward = False +# Vote reward server link. (IMPORTANT!!!! Always add .html at the end of the link) +NetworkServerLink = +# Votes for next reward needed. +NetworkVotesDifference = 4 +# Minutes between rewards. +# Eg. You put 5 it checks every 5 minutes for reward. +NetworkRewardCheckTime = 5 +# Reward(s). +NetworkReward = 3481,5; +# Network reward max dual boxes reward. +# For example if you put 2 and someone has 3 boxes open 2 will be rewarded. +NetworkDuaboxesAllowed = 1 +# Game server console report. +# If set to true, game server console will get a report of +# current vote count, votes needed for next reward and votes needed for first page. +AllowNetworkGameServerReport = False + +# Vote reward for Topzone. +AllowTopzoneVoteReward = False +# Vote reward server link. (IMPORTANT!!!! Always add .html at the end of the link) +TopzoneServerLink = +# Votes for next reward needed. +TopzoneVotesDifference = 4 +# Minutes between rewards. +# Eg. You put 5 it checks every 5 minutes for reward. +TopzoneRewardCheckTime = 5 +# Reward(s). +TopzoneReward = 3481,5; +# Topzone reward max dual boxes reward. +# For example if you put 2 and someone has 3 boxes open 2 will be rewarded. +TopzoneDuaboxesAllowed = 1 +# Game server console report. +# If set to true, game server console will get a report of +# current vote count, votes needed for next reward and votes needed for first page. +AllowTopzoneGameServerReport = False + +# Vote reward for Hopzone. +AllowHopzoneVoteReward = False +# Vote reward server link. (IMPORTANT!!!! Always add .html at the end of the link) +HopzoneServerLink = +# Votes for next reward needed. +HopzoneVotesDifference = 4 +# Minutes between rewards. +# Eg. You put 5 it checks every 5 minutes for reward. +HopzoneRewardCheckTime = 5 +# Reward(s). +HopzoneReward = 3481,5; +# Topzone reward max dual boxes reward. +# For example if you put 2 and someone has 3 boxes open 2 will be rewarded. +HopzoneDuaboxesAllowed = 1 +# Game server console report. +# If set to true, game server console will get a report of +# current vote count, votes needed for next reward and votes needed for first page. +AllowHopzoneGameServerReport = False diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/Config.java b/L2J_Mobius_Helios/java/com/l2jmobius/Config.java index 3ccb4618e8..b177972810 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/Config.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/Config.java @@ -80,6 +80,7 @@ public final class Config // -------------------------------------------------- public static final String EOL = System.lineSeparator(); + // -------------------------------------------------- // Config File Definitions // -------------------------------------------------- public static final String CHARACTER_CONFIG_FILE = "./config/Character.ini"; @@ -105,7 +106,10 @@ public final class Config public static final String EMAIL_CONFIG_FILE = "./config/Email.ini"; public static final String CH_SIEGE_FILE = "./config/ConquerableHallSiege.ini"; public static final String GEODATA_FILE = "./config/GeoData.ini"; + + // -------------------------------------------------- // Custom Config File Definitions + // -------------------------------------------------- public static final String CUSTOM_ALLOWED_PLAYER_RACES_CONFIG_FILE = "./config/Custom/AllowedPlayerRaces.ini"; public static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini"; public static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini"; @@ -129,7 +133,9 @@ public final class Config public static final String CUSTOM_SELL_BUFFS_CONFIG_FILE = "./config/Custom/SellBuffs.ini"; public static final String CUSTOM_SERVER_TIME_CONFIG_FILE = "./config/Custom/ServerTime.ini"; public static final String CUSTOM_STARTING_LOCATION_CONFIG_FILE = "./config/Custom/StartingLocation.ini"; + public static final String CUSTOM_VOTE_REWARD_CONFIG_FILE = "./config/Custom/VoteReward.ini"; public static final String CUSTOM_WALKER_BOT_PROTECTION_CONFIG_FILE = "./config/Custom/WalkerBotProtection.ini"; + // -------------------------------------------------- // Variable Definitions // -------------------------------------------------- @@ -1110,6 +1116,27 @@ public final class Config public static long SELLBUFF_MIN_PRICE; public static long SELLBUFF_MAX_PRICE; public static int SELLBUFF_MAX_BUFFS; + public static boolean ALLOW_NETWORK_VOTE_REWARD; + public static String NETWORK_SERVER_LINK; + public static int NETWORK_VOTES_DIFFERENCE; + public static int NETWORK_REWARD_CHECK_TIME; + public static Map NETWORK_REWARD = new HashMap<>(); + public static int NETWORK_DUALBOXES_ALLOWED; + public static boolean ALLOW_NETWORK_GAME_SERVER_REPORT; + public static boolean ALLOW_TOPZONE_VOTE_REWARD; + public static String TOPZONE_SERVER_LINK; + public static int TOPZONE_VOTES_DIFFERENCE; + public static int TOPZONE_REWARD_CHECK_TIME; + public static Map TOPZONE_REWARD = new HashMap<>(); + public static int TOPZONE_DUALBOXES_ALLOWED; + public static boolean ALLOW_TOPZONE_GAME_SERVER_REPORT; + public static boolean ALLOW_HOPZONE_VOTE_REWARD; + public static String HOPZONE_SERVER_LINK; + public static int HOPZONE_VOTES_DIFFERENCE; + public static int HOPZONE_REWARD_CHECK_TIME; + public static Map HOPZONE_REWARD = new HashMap<>(); + public static int HOPZONE_DUALBOXES_ALLOWED; + public static boolean ALLOW_HOPZONE_GAME_SERVER_REPORT; /** * This class initializes all global variables for configuration.
@@ -2636,6 +2663,49 @@ public final class Config CUSTOM_STARTING_LOC_Y = StartingLocation.getInt("CustomStartingLocY", 186527); CUSTOM_STARTING_LOC_Z = StartingLocation.getInt("CustomStartingLocZ", -3625); + // Load VoteReward config file (if exists) + final PropertiesParser VoteReward = new PropertiesParser(CUSTOM_VOTE_REWARD_CONFIG_FILE); + + ALLOW_NETWORK_VOTE_REWARD = VoteReward.getBoolean("AllowNetworkVoteReward", false); + NETWORK_SERVER_LINK = VoteReward.getString("NetworkServerLink", ""); + NETWORK_VOTES_DIFFERENCE = VoteReward.getInt("NetworkVotesDifference", 5); + NETWORK_REWARD_CHECK_TIME = VoteReward.getInt("NetworkRewardCheckTime", 5); + String NETWORK_SMALL_REWARD_VALUE = VoteReward.getString("NetworkReward", "57,100000000;"); + String[] NETWORK_small_reward_splitted_1 = NETWORK_SMALL_REWARD_VALUE.split(";"); + for (String i : NETWORK_small_reward_splitted_1) + { + String[] NETWORK_small_reward_splitted_2 = i.split(","); + NETWORK_REWARD.put(Integer.parseInt(NETWORK_small_reward_splitted_2[0]), Integer.parseInt(NETWORK_small_reward_splitted_2[1])); + } + NETWORK_DUALBOXES_ALLOWED = VoteReward.getInt("NetworkDualboxesAllowed", 1); + ALLOW_NETWORK_GAME_SERVER_REPORT = VoteReward.getBoolean("AllowNetworkGameServerReport", false); + ALLOW_TOPZONE_VOTE_REWARD = VoteReward.getBoolean("AllowTopzoneVoteReward", false); + TOPZONE_SERVER_LINK = VoteReward.getString("TopzoneServerLink", ""); + TOPZONE_VOTES_DIFFERENCE = VoteReward.getInt("TopzoneVotesDifference", 5); + TOPZONE_REWARD_CHECK_TIME = VoteReward.getInt("TopzoneRewardCheckTime", 5); + String TOPZONE_SMALL_REWARD_VALUE = VoteReward.getString("TopzoneReward", "57,100000000;"); + String[] topzone_small_reward_splitted_1 = TOPZONE_SMALL_REWARD_VALUE.split(";"); + for (String i : topzone_small_reward_splitted_1) + { + String[] topzone_small_reward_splitted_2 = i.split(","); + TOPZONE_REWARD.put(Integer.parseInt(topzone_small_reward_splitted_2[0]), Integer.parseInt(topzone_small_reward_splitted_2[1])); + } + TOPZONE_DUALBOXES_ALLOWED = VoteReward.getInt("TopzoneDualboxesAllowed", 1); + ALLOW_TOPZONE_GAME_SERVER_REPORT = VoteReward.getBoolean("AllowTopzoneGameServerReport", false); + ALLOW_HOPZONE_VOTE_REWARD = VoteReward.getBoolean("AllowHopzoneVoteReward", false); + HOPZONE_SERVER_LINK = VoteReward.getString("HopzoneServerLink", ""); + HOPZONE_VOTES_DIFFERENCE = VoteReward.getInt("HopzoneVotesDifference", 5); + HOPZONE_REWARD_CHECK_TIME = VoteReward.getInt("HopzoneRewardCheckTime", 5); + String HOPZONE_SMALL_REWARD_VALUE = VoteReward.getString("HopzoneReward", "57,100000000;"); + String[] hopzone_small_reward_splitted_1 = HOPZONE_SMALL_REWARD_VALUE.split(";"); + for (String i : hopzone_small_reward_splitted_1) + { + String[] hopzone_small_reward_splitted_2 = i.split(","); + HOPZONE_REWARD.put(Integer.parseInt(hopzone_small_reward_splitted_2[0]), Integer.parseInt(hopzone_small_reward_splitted_2[1])); + } + HOPZONE_DUALBOXES_ALLOWED = VoteReward.getInt("HopzoneDualboxesAllowed", 1); + ALLOW_HOPZONE_GAME_SERVER_REPORT = VoteReward.getBoolean("AllowHopzoneGameServerReport", false); + // Load WalkerBotProtection config file (if exists) final PropertiesParser WalkerBotProtection = new PropertiesParser(CUSTOM_WALKER_BOT_PROTECTION_CONFIG_FILE); diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java index 92485a5949..5ede3e1bda 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java @@ -141,6 +141,7 @@ import com.l2jmobius.gameserver.model.L2World; import com.l2jmobius.gameserver.model.entity.Hero; import com.l2jmobius.gameserver.model.events.EventDispatcher; import com.l2jmobius.gameserver.model.olympiad.Olympiad; +import com.l2jmobius.gameserver.model.votereward.VoteSystem; import com.l2jmobius.gameserver.network.ClientNetworkManager; import com.l2jmobius.gameserver.network.loginserver.LoginServerNetworkManager; import com.l2jmobius.gameserver.network.telnet.TelnetServer; @@ -376,6 +377,7 @@ public class GameServer } MonsterRace.getInstance(); + VoteSystem.initialize(); TaskManager.getInstance(); AntiFeedManager.getInstance().registerEvent(AntiFeedManager.GAME_ID); diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java new file mode 100644 index 0000000000..03c1b0f1af --- /dev/null +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java @@ -0,0 +1,83 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import com.l2jmobius.Config; + +/** + * @author Anarchy + */ +public class Hopzone extends VoteSystem +{ + public Hopzone(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + super(votesDiff, allowReport, boxes, rewards, checkMins); + } + + @Override + public void run() + { + reward(); + } + + @Override + public int getVotes() + { + InputStreamReader isr = null; + BufferedReader br = null; + + try + { + URLConnection con = new URL(Config.HOPZONE_SERVER_LINK).openConnection(); + con.addRequestProperty("User-Agent", "Mozilla/5.0"); + isr = new InputStreamReader(con.getInputStream()); + br = new BufferedReader(isr); + + String line; + while ((line = br.readLine()) != null) + { + if (line.contains("
  • ")[2].replace(". + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import com.l2jmobius.Config; + +/** + * @author Anarchy + */ +public class Network extends VoteSystem +{ + public Network(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + super(votesDiff, allowReport, boxes, rewards, checkMins); + } + + @Override + public void run() + { + reward(); + } + + @Override + public int getVotes() + { + InputStreamReader isr = null; + BufferedReader br = null; + + try + { + URLConnection con = new URL(Config.NETWORK_SERVER_LINK).openConnection(); + con.addRequestProperty("User-Agent", "Mozilla/5.0"); + isr = new InputStreamReader(con.getInputStream()); + br = new BufferedReader(isr); + + String line; + while ((line = br.readLine()) != null) + { + if (line.contains("
    ")[2].replace(". + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import com.l2jmobius.Config; + +/** + * @author Anarchy + */ +public class Topzone extends VoteSystem +{ + public Topzone(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + super(votesDiff, allowReport, boxes, rewards, checkMins); + } + + @Override + public void run() + { + reward(); + } + + @Override + public int getVotes() + { + InputStreamReader isr = null; + BufferedReader br = null; + + try + { + URLConnection con = new URL(Config.TOPZONE_SERVER_LINK).openConnection(); + con.addRequestProperty("User-Agent", "L2TopZone"); + isr = new InputStreamReader(con.getInputStream()); + br = new BufferedReader(isr); + + String line; + while ((line = br.readLine()) != null) + { + int votes = Integer.valueOf(line); + return votes; + } + + br.close(); + isr.close(); + } + catch (Exception e) + { + e.printStackTrace(); + System.out.println("Error while getting server vote count from " + getSiteName() + "."); + } + + return -1; + } + + @Override + public String getSiteName() + { + return "Topzone"; + } +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java new file mode 100644 index 0000000000..e7040e454d --- /dev/null +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java @@ -0,0 +1,184 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.ThreadPoolManager; +import com.l2jmobius.gameserver.enums.ChatType; +import com.l2jmobius.gameserver.model.L2World; +import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.network.serverpackets.CreatureSay; +import com.l2jmobius.gameserver.util.Broadcast; + +/** + * @author Anarchy + */ +public abstract class VoteSystem implements Runnable +{ + private static List voteSystems = new ArrayList<>(); + + protected int votesDiff; + protected boolean allowReport; + protected int boxes; + protected Map rewards; + protected int checkMins; + protected int lastVotes = 0; + private final Map playerIps = new HashMap<>(); + + public static void initialize() + { + System.out.println("Vote reward system initialized."); + if (Config.ALLOW_NETWORK_VOTE_REWARD) + { + voteSystems.add(new Network(Config.NETWORK_VOTES_DIFFERENCE, Config.ALLOW_NETWORK_GAME_SERVER_REPORT, Config.NETWORK_DUALBOXES_ALLOWED, Config.NETWORK_REWARD, Config.NETWORK_REWARD_CHECK_TIME)); + } + if (Config.ALLOW_TOPZONE_VOTE_REWARD) + { + voteSystems.add(new Topzone(Config.TOPZONE_VOTES_DIFFERENCE, Config.ALLOW_TOPZONE_GAME_SERVER_REPORT, Config.TOPZONE_DUALBOXES_ALLOWED, Config.TOPZONE_REWARD, Config.TOPZONE_REWARD_CHECK_TIME)); + } + if (Config.ALLOW_HOPZONE_VOTE_REWARD) + { + voteSystems.add(new Hopzone(Config.HOPZONE_VOTES_DIFFERENCE, Config.ALLOW_HOPZONE_GAME_SERVER_REPORT, Config.HOPZONE_DUALBOXES_ALLOWED, Config.HOPZONE_REWARD, Config.HOPZONE_REWARD_CHECK_TIME)); + } + } + + public static VoteSystem getVoteSystem(String name) + { + for (VoteSystem vs : voteSystems) + { + if (vs.getSiteName().equals(name)) + { + return vs; + } + } + + return null; + } + + public VoteSystem(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + this.votesDiff = votesDiff; + this.allowReport = allowReport; + this.boxes = boxes; + this.rewards = rewards; + this.checkMins = checkMins; + + ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(this, checkMins * 1000 * 60, checkMins * 1000 * 60); + } + + protected void reward() + { + int currentVotes = getVotes(); + + if (currentVotes == -1) + { + System.out.println("There was a problem on getting server votes."); + return; + } + + if (lastVotes == 0) + { + lastVotes = currentVotes; + announce(getSiteName() + ": Current vote count is " + currentVotes + "."); + announce(getSiteName() + ": We need " + ((lastVotes + votesDiff) - currentVotes) + " vote(s) for reward."); + if (allowReport) + { + System.out.println("Server votes on " + getSiteName() + ": " + currentVotes); + System.out.println("Votes needed for reward: " + ((lastVotes + votesDiff) - currentVotes)); + } + return; + } + + if (currentVotes >= (lastVotes + votesDiff)) + { + Collection pls = L2World.getInstance().getPlayers(); + if (allowReport) + { + System.out.println("Server votes on " + getSiteName() + ": " + currentVotes); + System.out.println("Votes needed for next reward: " + ((currentVotes + votesDiff) - currentVotes)); + } + announce(getSiteName() + ": Everyone has been rewarded."); + announce(getSiteName() + ": Current vote count is " + currentVotes + "."); + announce(getSiteName() + ": We need " + votesDiff + " vote(s) for next reward."); + for (L2PcInstance p : pls) + { + if ((p.getClient() == null) || p.getClient().isDetached()) + { + continue; + } + + boolean canReward = false; + String pIp = p.getClient().getConnectionAddress().getHostAddress(); + if (playerIps.containsKey(pIp)) + { + int count = playerIps.get(pIp); + if (count < boxes) + { + playerIps.remove(pIp); + playerIps.put(pIp, count + 1); + canReward = true; + } + } + else + { + canReward = true; + playerIps.put(pIp, 1); + } + if (canReward) + { + for (int i : rewards.keySet()) + { + p.addItem("Vote reward.", i, rewards.get(i), p, true); + } + } + else + { + p.sendMessage("Already " + boxes + " character(s) of your ip have been rewarded, so this character won't be rewarded."); + } + } + playerIps.clear(); + + lastVotes = currentVotes; + } + else + { + if (allowReport) + { + System.out.println("Server votes on " + getSiteName() + ": " + currentVotes); + System.out.println("Votes needed for next reward: " + ((lastVotes + votesDiff) - currentVotes)); + } + announce(getSiteName() + ": Current vote count is " + currentVotes + "."); + announce(getSiteName() + ": We need " + ((lastVotes + votesDiff) - currentVotes) + " vote(s) for reward."); + } + } + + private static void announce(String msg) + { + CreatureSay cs = new CreatureSay(0, ChatType.CRITICAL_ANNOUNCE, "", msg); + Broadcast.toAllOnlinePlayers(cs); + } + + public abstract int getVotes(); + + public abstract String getSiteName(); +} \ No newline at end of file diff --git a/L2J_Mobius_Underground/dist/game/config/Custom/VoteReward.ini b/L2J_Mobius_Underground/dist/game/config/Custom/VoteReward.ini new file mode 100644 index 0000000000..23ced521d1 --- /dev/null +++ b/L2J_Mobius_Underground/dist/game/config/Custom/VoteReward.ini @@ -0,0 +1,56 @@ +# Vote reward for Network. +AllowNetworkVoteReward = False +# Vote reward server link. (IMPORTANT!!!! Always add .html at the end of the link) +NetworkServerLink = +# Votes for next reward needed. +NetworkVotesDifference = 4 +# Minutes between rewards. +# Eg. You put 5 it checks every 5 minutes for reward. +NetworkRewardCheckTime = 5 +# Reward(s). +NetworkReward = 3481,5; +# Network reward max dual boxes reward. +# For example if you put 2 and someone has 3 boxes open 2 will be rewarded. +NetworkDuaboxesAllowed = 1 +# Game server console report. +# If set to true, game server console will get a report of +# current vote count, votes needed for next reward and votes needed for first page. +AllowNetworkGameServerReport = False + +# Vote reward for Topzone. +AllowTopzoneVoteReward = False +# Vote reward server link. (IMPORTANT!!!! Always add .html at the end of the link) +TopzoneServerLink = +# Votes for next reward needed. +TopzoneVotesDifference = 4 +# Minutes between rewards. +# Eg. You put 5 it checks every 5 minutes for reward. +TopzoneRewardCheckTime = 5 +# Reward(s). +TopzoneReward = 3481,5; +# Topzone reward max dual boxes reward. +# For example if you put 2 and someone has 3 boxes open 2 will be rewarded. +TopzoneDuaboxesAllowed = 1 +# Game server console report. +# If set to true, game server console will get a report of +# current vote count, votes needed for next reward and votes needed for first page. +AllowTopzoneGameServerReport = False + +# Vote reward for Hopzone. +AllowHopzoneVoteReward = False +# Vote reward server link. (IMPORTANT!!!! Always add .html at the end of the link) +HopzoneServerLink = +# Votes for next reward needed. +HopzoneVotesDifference = 4 +# Minutes between rewards. +# Eg. You put 5 it checks every 5 minutes for reward. +HopzoneRewardCheckTime = 5 +# Reward(s). +HopzoneReward = 3481,5; +# Topzone reward max dual boxes reward. +# For example if you put 2 and someone has 3 boxes open 2 will be rewarded. +HopzoneDuaboxesAllowed = 1 +# Game server console report. +# If set to true, game server console will get a report of +# current vote count, votes needed for next reward and votes needed for first page. +AllowHopzoneGameServerReport = False diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/Config.java b/L2J_Mobius_Underground/java/com/l2jmobius/Config.java index 3ccb4618e8..b177972810 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/Config.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/Config.java @@ -80,6 +80,7 @@ public final class Config // -------------------------------------------------- public static final String EOL = System.lineSeparator(); + // -------------------------------------------------- // Config File Definitions // -------------------------------------------------- public static final String CHARACTER_CONFIG_FILE = "./config/Character.ini"; @@ -105,7 +106,10 @@ public final class Config public static final String EMAIL_CONFIG_FILE = "./config/Email.ini"; public static final String CH_SIEGE_FILE = "./config/ConquerableHallSiege.ini"; public static final String GEODATA_FILE = "./config/GeoData.ini"; + + // -------------------------------------------------- // Custom Config File Definitions + // -------------------------------------------------- public static final String CUSTOM_ALLOWED_PLAYER_RACES_CONFIG_FILE = "./config/Custom/AllowedPlayerRaces.ini"; public static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini"; public static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini"; @@ -129,7 +133,9 @@ public final class Config public static final String CUSTOM_SELL_BUFFS_CONFIG_FILE = "./config/Custom/SellBuffs.ini"; public static final String CUSTOM_SERVER_TIME_CONFIG_FILE = "./config/Custom/ServerTime.ini"; public static final String CUSTOM_STARTING_LOCATION_CONFIG_FILE = "./config/Custom/StartingLocation.ini"; + public static final String CUSTOM_VOTE_REWARD_CONFIG_FILE = "./config/Custom/VoteReward.ini"; public static final String CUSTOM_WALKER_BOT_PROTECTION_CONFIG_FILE = "./config/Custom/WalkerBotProtection.ini"; + // -------------------------------------------------- // Variable Definitions // -------------------------------------------------- @@ -1110,6 +1116,27 @@ public final class Config public static long SELLBUFF_MIN_PRICE; public static long SELLBUFF_MAX_PRICE; public static int SELLBUFF_MAX_BUFFS; + public static boolean ALLOW_NETWORK_VOTE_REWARD; + public static String NETWORK_SERVER_LINK; + public static int NETWORK_VOTES_DIFFERENCE; + public static int NETWORK_REWARD_CHECK_TIME; + public static Map NETWORK_REWARD = new HashMap<>(); + public static int NETWORK_DUALBOXES_ALLOWED; + public static boolean ALLOW_NETWORK_GAME_SERVER_REPORT; + public static boolean ALLOW_TOPZONE_VOTE_REWARD; + public static String TOPZONE_SERVER_LINK; + public static int TOPZONE_VOTES_DIFFERENCE; + public static int TOPZONE_REWARD_CHECK_TIME; + public static Map TOPZONE_REWARD = new HashMap<>(); + public static int TOPZONE_DUALBOXES_ALLOWED; + public static boolean ALLOW_TOPZONE_GAME_SERVER_REPORT; + public static boolean ALLOW_HOPZONE_VOTE_REWARD; + public static String HOPZONE_SERVER_LINK; + public static int HOPZONE_VOTES_DIFFERENCE; + public static int HOPZONE_REWARD_CHECK_TIME; + public static Map HOPZONE_REWARD = new HashMap<>(); + public static int HOPZONE_DUALBOXES_ALLOWED; + public static boolean ALLOW_HOPZONE_GAME_SERVER_REPORT; /** * This class initializes all global variables for configuration.
    @@ -2636,6 +2663,49 @@ public final class Config CUSTOM_STARTING_LOC_Y = StartingLocation.getInt("CustomStartingLocY", 186527); CUSTOM_STARTING_LOC_Z = StartingLocation.getInt("CustomStartingLocZ", -3625); + // Load VoteReward config file (if exists) + final PropertiesParser VoteReward = new PropertiesParser(CUSTOM_VOTE_REWARD_CONFIG_FILE); + + ALLOW_NETWORK_VOTE_REWARD = VoteReward.getBoolean("AllowNetworkVoteReward", false); + NETWORK_SERVER_LINK = VoteReward.getString("NetworkServerLink", ""); + NETWORK_VOTES_DIFFERENCE = VoteReward.getInt("NetworkVotesDifference", 5); + NETWORK_REWARD_CHECK_TIME = VoteReward.getInt("NetworkRewardCheckTime", 5); + String NETWORK_SMALL_REWARD_VALUE = VoteReward.getString("NetworkReward", "57,100000000;"); + String[] NETWORK_small_reward_splitted_1 = NETWORK_SMALL_REWARD_VALUE.split(";"); + for (String i : NETWORK_small_reward_splitted_1) + { + String[] NETWORK_small_reward_splitted_2 = i.split(","); + NETWORK_REWARD.put(Integer.parseInt(NETWORK_small_reward_splitted_2[0]), Integer.parseInt(NETWORK_small_reward_splitted_2[1])); + } + NETWORK_DUALBOXES_ALLOWED = VoteReward.getInt("NetworkDualboxesAllowed", 1); + ALLOW_NETWORK_GAME_SERVER_REPORT = VoteReward.getBoolean("AllowNetworkGameServerReport", false); + ALLOW_TOPZONE_VOTE_REWARD = VoteReward.getBoolean("AllowTopzoneVoteReward", false); + TOPZONE_SERVER_LINK = VoteReward.getString("TopzoneServerLink", ""); + TOPZONE_VOTES_DIFFERENCE = VoteReward.getInt("TopzoneVotesDifference", 5); + TOPZONE_REWARD_CHECK_TIME = VoteReward.getInt("TopzoneRewardCheckTime", 5); + String TOPZONE_SMALL_REWARD_VALUE = VoteReward.getString("TopzoneReward", "57,100000000;"); + String[] topzone_small_reward_splitted_1 = TOPZONE_SMALL_REWARD_VALUE.split(";"); + for (String i : topzone_small_reward_splitted_1) + { + String[] topzone_small_reward_splitted_2 = i.split(","); + TOPZONE_REWARD.put(Integer.parseInt(topzone_small_reward_splitted_2[0]), Integer.parseInt(topzone_small_reward_splitted_2[1])); + } + TOPZONE_DUALBOXES_ALLOWED = VoteReward.getInt("TopzoneDualboxesAllowed", 1); + ALLOW_TOPZONE_GAME_SERVER_REPORT = VoteReward.getBoolean("AllowTopzoneGameServerReport", false); + ALLOW_HOPZONE_VOTE_REWARD = VoteReward.getBoolean("AllowHopzoneVoteReward", false); + HOPZONE_SERVER_LINK = VoteReward.getString("HopzoneServerLink", ""); + HOPZONE_VOTES_DIFFERENCE = VoteReward.getInt("HopzoneVotesDifference", 5); + HOPZONE_REWARD_CHECK_TIME = VoteReward.getInt("HopzoneRewardCheckTime", 5); + String HOPZONE_SMALL_REWARD_VALUE = VoteReward.getString("HopzoneReward", "57,100000000;"); + String[] hopzone_small_reward_splitted_1 = HOPZONE_SMALL_REWARD_VALUE.split(";"); + for (String i : hopzone_small_reward_splitted_1) + { + String[] hopzone_small_reward_splitted_2 = i.split(","); + HOPZONE_REWARD.put(Integer.parseInt(hopzone_small_reward_splitted_2[0]), Integer.parseInt(hopzone_small_reward_splitted_2[1])); + } + HOPZONE_DUALBOXES_ALLOWED = VoteReward.getInt("HopzoneDualboxesAllowed", 1); + ALLOW_HOPZONE_GAME_SERVER_REPORT = VoteReward.getBoolean("AllowHopzoneGameServerReport", false); + // Load WalkerBotProtection config file (if exists) final PropertiesParser WalkerBotProtection = new PropertiesParser(CUSTOM_WALKER_BOT_PROTECTION_CONFIG_FILE); diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java index 92485a5949..5ede3e1bda 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java @@ -141,6 +141,7 @@ import com.l2jmobius.gameserver.model.L2World; import com.l2jmobius.gameserver.model.entity.Hero; import com.l2jmobius.gameserver.model.events.EventDispatcher; import com.l2jmobius.gameserver.model.olympiad.Olympiad; +import com.l2jmobius.gameserver.model.votereward.VoteSystem; import com.l2jmobius.gameserver.network.ClientNetworkManager; import com.l2jmobius.gameserver.network.loginserver.LoginServerNetworkManager; import com.l2jmobius.gameserver.network.telnet.TelnetServer; @@ -376,6 +377,7 @@ public class GameServer } MonsterRace.getInstance(); + VoteSystem.initialize(); TaskManager.getInstance(); AntiFeedManager.getInstance().registerEvent(AntiFeedManager.GAME_ID); diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java new file mode 100644 index 0000000000..03c1b0f1af --- /dev/null +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java @@ -0,0 +1,83 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import com.l2jmobius.Config; + +/** + * @author Anarchy + */ +public class Hopzone extends VoteSystem +{ + public Hopzone(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + super(votesDiff, allowReport, boxes, rewards, checkMins); + } + + @Override + public void run() + { + reward(); + } + + @Override + public int getVotes() + { + InputStreamReader isr = null; + BufferedReader br = null; + + try + { + URLConnection con = new URL(Config.HOPZONE_SERVER_LINK).openConnection(); + con.addRequestProperty("User-Agent", "Mozilla/5.0"); + isr = new InputStreamReader(con.getInputStream()); + br = new BufferedReader(isr); + + String line; + while ((line = br.readLine()) != null) + { + if (line.contains("
  • ")[2].replace(". + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import com.l2jmobius.Config; + +/** + * @author Anarchy + */ +public class Network extends VoteSystem +{ + public Network(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + super(votesDiff, allowReport, boxes, rewards, checkMins); + } + + @Override + public void run() + { + reward(); + } + + @Override + public int getVotes() + { + InputStreamReader isr = null; + BufferedReader br = null; + + try + { + URLConnection con = new URL(Config.NETWORK_SERVER_LINK).openConnection(); + con.addRequestProperty("User-Agent", "Mozilla/5.0"); + isr = new InputStreamReader(con.getInputStream()); + br = new BufferedReader(isr); + + String line; + while ((line = br.readLine()) != null) + { + if (line.contains("
    ")[2].replace(". + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; + +import com.l2jmobius.Config; + +/** + * @author Anarchy + */ +public class Topzone extends VoteSystem +{ + public Topzone(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + super(votesDiff, allowReport, boxes, rewards, checkMins); + } + + @Override + public void run() + { + reward(); + } + + @Override + public int getVotes() + { + InputStreamReader isr = null; + BufferedReader br = null; + + try + { + URLConnection con = new URL(Config.TOPZONE_SERVER_LINK).openConnection(); + con.addRequestProperty("User-Agent", "L2TopZone"); + isr = new InputStreamReader(con.getInputStream()); + br = new BufferedReader(isr); + + String line; + while ((line = br.readLine()) != null) + { + int votes = Integer.valueOf(line); + return votes; + } + + br.close(); + isr.close(); + } + catch (Exception e) + { + e.printStackTrace(); + System.out.println("Error while getting server vote count from " + getSiteName() + "."); + } + + return -1; + } + + @Override + public String getSiteName() + { + return "Topzone"; + } +} diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java new file mode 100644 index 0000000000..e7040e454d --- /dev/null +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java @@ -0,0 +1,184 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.model.votereward; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.ThreadPoolManager; +import com.l2jmobius.gameserver.enums.ChatType; +import com.l2jmobius.gameserver.model.L2World; +import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.network.serverpackets.CreatureSay; +import com.l2jmobius.gameserver.util.Broadcast; + +/** + * @author Anarchy + */ +public abstract class VoteSystem implements Runnable +{ + private static List voteSystems = new ArrayList<>(); + + protected int votesDiff; + protected boolean allowReport; + protected int boxes; + protected Map rewards; + protected int checkMins; + protected int lastVotes = 0; + private final Map playerIps = new HashMap<>(); + + public static void initialize() + { + System.out.println("Vote reward system initialized."); + if (Config.ALLOW_NETWORK_VOTE_REWARD) + { + voteSystems.add(new Network(Config.NETWORK_VOTES_DIFFERENCE, Config.ALLOW_NETWORK_GAME_SERVER_REPORT, Config.NETWORK_DUALBOXES_ALLOWED, Config.NETWORK_REWARD, Config.NETWORK_REWARD_CHECK_TIME)); + } + if (Config.ALLOW_TOPZONE_VOTE_REWARD) + { + voteSystems.add(new Topzone(Config.TOPZONE_VOTES_DIFFERENCE, Config.ALLOW_TOPZONE_GAME_SERVER_REPORT, Config.TOPZONE_DUALBOXES_ALLOWED, Config.TOPZONE_REWARD, Config.TOPZONE_REWARD_CHECK_TIME)); + } + if (Config.ALLOW_HOPZONE_VOTE_REWARD) + { + voteSystems.add(new Hopzone(Config.HOPZONE_VOTES_DIFFERENCE, Config.ALLOW_HOPZONE_GAME_SERVER_REPORT, Config.HOPZONE_DUALBOXES_ALLOWED, Config.HOPZONE_REWARD, Config.HOPZONE_REWARD_CHECK_TIME)); + } + } + + public static VoteSystem getVoteSystem(String name) + { + for (VoteSystem vs : voteSystems) + { + if (vs.getSiteName().equals(name)) + { + return vs; + } + } + + return null; + } + + public VoteSystem(int votesDiff, boolean allowReport, int boxes, Map rewards, int checkMins) + { + this.votesDiff = votesDiff; + this.allowReport = allowReport; + this.boxes = boxes; + this.rewards = rewards; + this.checkMins = checkMins; + + ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(this, checkMins * 1000 * 60, checkMins * 1000 * 60); + } + + protected void reward() + { + int currentVotes = getVotes(); + + if (currentVotes == -1) + { + System.out.println("There was a problem on getting server votes."); + return; + } + + if (lastVotes == 0) + { + lastVotes = currentVotes; + announce(getSiteName() + ": Current vote count is " + currentVotes + "."); + announce(getSiteName() + ": We need " + ((lastVotes + votesDiff) - currentVotes) + " vote(s) for reward."); + if (allowReport) + { + System.out.println("Server votes on " + getSiteName() + ": " + currentVotes); + System.out.println("Votes needed for reward: " + ((lastVotes + votesDiff) - currentVotes)); + } + return; + } + + if (currentVotes >= (lastVotes + votesDiff)) + { + Collection pls = L2World.getInstance().getPlayers(); + if (allowReport) + { + System.out.println("Server votes on " + getSiteName() + ": " + currentVotes); + System.out.println("Votes needed for next reward: " + ((currentVotes + votesDiff) - currentVotes)); + } + announce(getSiteName() + ": Everyone has been rewarded."); + announce(getSiteName() + ": Current vote count is " + currentVotes + "."); + announce(getSiteName() + ": We need " + votesDiff + " vote(s) for next reward."); + for (L2PcInstance p : pls) + { + if ((p.getClient() == null) || p.getClient().isDetached()) + { + continue; + } + + boolean canReward = false; + String pIp = p.getClient().getConnectionAddress().getHostAddress(); + if (playerIps.containsKey(pIp)) + { + int count = playerIps.get(pIp); + if (count < boxes) + { + playerIps.remove(pIp); + playerIps.put(pIp, count + 1); + canReward = true; + } + } + else + { + canReward = true; + playerIps.put(pIp, 1); + } + if (canReward) + { + for (int i : rewards.keySet()) + { + p.addItem("Vote reward.", i, rewards.get(i), p, true); + } + } + else + { + p.sendMessage("Already " + boxes + " character(s) of your ip have been rewarded, so this character won't be rewarded."); + } + } + playerIps.clear(); + + lastVotes = currentVotes; + } + else + { + if (allowReport) + { + System.out.println("Server votes on " + getSiteName() + ": " + currentVotes); + System.out.println("Votes needed for next reward: " + ((lastVotes + votesDiff) - currentVotes)); + } + announce(getSiteName() + ": Current vote count is " + currentVotes + "."); + announce(getSiteName() + ": We need " + ((lastVotes + votesDiff) - currentVotes) + " vote(s) for reward."); + } + } + + private static void announce(String msg) + { + CreatureSay cs = new CreatureSay(0, ChatType.CRITICAL_ANNOUNCE, "", msg); + Broadcast.toAllOnlinePlayers(cs); + } + + public abstract int getVotes(); + + public abstract String getSiteName(); +} \ No newline at end of file