diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Custom/VoteReward.ini b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Custom/VoteReward.ini new file mode 100644 index 0000000000..c9d6624225 --- /dev/null +++ b/L2J_Mobius_CT_2.6_HighFive/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. +NetworkDualboxesAllowed = 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. +TopzoneDualboxesAllowed = 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. +HopzoneDualboxesAllowed = 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_CT_2.6_HighFive/java/com/l2jmobius/Config.java b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/Config.java index 0d1e9a5053..342f808403 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/Config.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/Config.java @@ -128,6 +128,7 @@ public final class Config 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_TVT_CONFIG_FILE = "./config/Custom/TeamVersusTeam.ini"; + public static final String CUSTOM_VOTE_REWARD_CONFIG_FILE = "./config/Custom/VoteReward.ini"; public static final String CUSTOM_WAREHOUSE_SORTING_CONFIG_FILE = "./config/Custom/WarehouseSorting.ini"; public static final String CUSTOM_WEDDING_CONFIG_FILE = "./config/Custom/Wedding.ini"; public static final String CUSTOM_MULTILANGUAL_SUPPORT_CONFIG_FILE = "./config/Custom/MultilingualSupport.ini"; @@ -1296,6 +1297,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.
@@ -3201,6 +3223,49 @@ public final class Config } } + // 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_CT_2.6_HighFive/java/com/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/GameServer.java index 6911b8fdab..6ea6aef546 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/GameServer.java @@ -134,6 +134,7 @@ import com.l2jmobius.gameserver.model.entity.Hero; import com.l2jmobius.gameserver.model.entity.TvTManager; 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; @@ -325,6 +326,7 @@ public class GameServer FourSepulchersManager.getInstance().init(); DimensionalRiftManager.getInstance(); RaidBossSpawnManager.getInstance(); + VoteSystem.initialize(); printSection("Siege"); SiegeManager.getInstance().getSieges(); diff --git a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/model/votereward/Hopzone.java new file mode 100644 index 0000000000..ce1f6a299a --- /dev/null +++ b/L2J_Mobius_CT_2.6_HighFive/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(); + LOGGER.warning("VoteSystem: Error while getting server vote count from " + getSiteName() + "."); + } + + return -1; + } + + @Override + public String getSiteName() + { + return "Topzone"; + } +} diff --git a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java new file mode 100644 index 0000000000..bccb1a9fdb --- /dev/null +++ b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/model/votereward/VoteSystem.java @@ -0,0 +1,209 @@ +/* + * 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 java.util.logging.Logger; + +import com.l2jmobius.Config; +import com.l2jmobius.commons.concurrent.ThreadPool; +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 +{ + protected static final Logger LOGGER = Logger.getLogger(VoteSystem.class.getName()); + + 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() + { + if (Config.ALLOW_NETWORK_VOTE_REWARD || Config.ALLOW_TOPZONE_VOTE_REWARD || Config.ALLOW_HOPZONE_VOTE_REWARD) + { + LOGGER.info("VoteSystem: 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)); + LOGGER.info("VoteSystem: Network votes enabled."); + } + else + { + LOGGER.info("VoteSystem: Network votes disabled."); + } + 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)); + LOGGER.info("VoteSystem: Topzone votes enabled."); + } + else + { + LOGGER.info("VoteSystem: Topzone votes disabled."); + } + 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)); + LOGGER.info("VoteSystem: Hopzone votes enabled."); + } + else + { + LOGGER.info("VoteSystem: Hopzone votes disabled."); + } + } + else + { + LOGGER.info("VoteSystem: Disabled."); + } + } + + 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; + + ThreadPool.scheduleAtFixedRate(this, checkMins * 1000 * 60, checkMins * 1000 * 60); + } + + protected void reward() + { + int currentVotes = getVotes(); + + if (currentVotes == -1) + { + LOGGER.info("VoteSystem: 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) + { + LOGGER.info("VoteSystem: Server votes on " + getSiteName() + ": " + currentVotes); + LOGGER.info("VoteSystem: Votes needed for reward: " + ((lastVotes + votesDiff) - currentVotes)); + } + return; + } + + if (currentVotes >= (lastVotes + votesDiff)) + { + Collection pls = L2World.getInstance().getPlayers(); + if (allowReport) + { + LOGGER.info("VoteSystem: Server votes on " + getSiteName() + ": " + currentVotes); + LOGGER.info("VoteSystem: 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) + { + LOGGER.info("VoteSystem: Server votes on " + getSiteName() + ": " + currentVotes); + LOGGER.info("VoteSystem: 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