Jump to content
  • 0

Question

Posted

Something went wrong in VoteBase::getApiResponse

 

 

can some one help me solve this? every time i write .vote comand its says somthing whent wrong need to vote again. and in logs i see this

 

Something went wrong in VoteBase::getApiResponse

 

can some one help?

13 answers to this question

Recommended Posts

  • 0
Posted
Something went wrong in VoteBase::getApiResponse

java.io.IOException: Server returned HTTP response code: 403 for URL: https://api.l2topzone.com/v1/vote?token=5e14bd08d6ef4a9f42fed190db6f27b2&ip=85.206.147.64

at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1876)

at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)

at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)

at handler.voicecommands.RewardVote.getApiResponse(RewardVote.java:472)

at handler.voicecommands.RewardVote.hasVoted(RewardVote.java:436)

at handler.voicecommands.RewardVote.useVoicedCommand(RewardVote.java:217)

at l2f.gameserver.network.clientpackets.Say2C.runImpl(Say2C.java:154)

at l2f.gameserver.network.clientpackets.L2GameClientPacket.run(L2GameClientPacket.java:49)

at l2f.commons.net.nio.impl.MMOExecutableQueue.run(MMOExecutableQueue.java:39)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:748)

java.lang.NullPointerException

at handler.voicecommands.RewardVote.tryParseBool(RewardVote.java:446)

at handler.voicecommands.RewardVote.hasVoted(RewardVote.java:437)

at handler.voicecommands.RewardVote.useVoicedCommand(RewardVote.java:217)

at l2f.gameserver.network.clientpackets.Say2C.runImpl(Say2C.java:154)

at l2f.gameserver.network.clientpackets.L2GameClientPacket.run(L2GameClientPacket.java:49)

at l2f.commons.net.nio.impl.MMOExecutableQueue.run(MMOExecutableQueue.java:39)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:748)

 

 

its full error , i tryed google iit but i cant solve it.... can u help me?
  • 0
Posted

See imports its acis :P

 

On scale 1 to 10 how sexy and dumb you're? 

l2f is aCis import? 

 

About topic owner, let us smell our nails.. SSSSSS so nice smell.. Good now i smell my cute nails i can fix ur code.. 

GTFO and post your code on the requested file and line the error says...

  • 0
Posted

On scale 1 to 10 how sexy and dumb you're? 

l2f is aCis import? 

 

About topic owner, let us smell our nails.. SSSSSS so nice smell.. Good now i smell my cute nails i can fix ur code.. 

GTFO and post your code on the requested file and line the error says...

Uh yes i thought was net.sf :D..

Then its sunrise or something h5

  • 0
Posted

Uh yes i thought was net.sf :D..

Then its sunrise or something h5

On scale 10 to 10, How nab are you? It's one of the shared L2World sources that the idiot guy lately shared along with tale's one.

This guy simply try open a l2tales server. simple as fuck.

  • 0
Posted
package handler.voicecommands;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

 

import l2f.commons.util.Rnd;

import l2f.gameserver.Config;

import l2f.gameserver.ThreadPoolManager;

import l2f.gameserver.database.DatabaseFactory;

import l2f.gameserver.handler.voicecommands.IVoicedCommandHandler;

import l2f.gameserver.handler.voicecommands.VoicedCommandHandler;

import l2f.gameserver.model.GameObjectsStorage;

import l2f.gameserver.model.Player;

import l2f.gameserver.network.serverpackets.Say2;

import l2f.gameserver.network.serverpackets.components.ChatType;

import l2f.gameserver.scripts.Functions;

import l2f.gameserver.scripts.ScriptFile;

import l2f.gameserver.utils.BatchStatement;

import l2f.gameserver.vote.VoteRead;

 

public class RewardVote implements IVoicedCommandHandler, ScriptFile

{

private static enum ValueType

{

ACCOUNT_NAME,

IP_ADRESS,

HWID

}

 

private static final String[] COMMANDS_LIST = new String[] { "vote", "getreward", "getvote", "votereward", "voteme", "fuckvote", "rewardget", "reward", "votereward"};

 

// Rewards

private static final int[][] BLESSED_ENCHANTS_CATEGORY = { { 6673, 1 } };

 

private static final int[] PERMANENT_CATEGORY = { 37004, // Vote Rune

   1 };

 

 private static final int[][] MISC_CATEGORY = { { 37007, 1 }, { 37007, 2 },  { 37007, 3 } };

 private static final double[][] RANDOM_CATEGORY = { { 6577,// 1 Blessed Enchant Weapon S

   1,

   0.05 }, { 6578,// 1 Blessed Enchant Armor S

   1,

   0.05 }, { 13071,// 1 Red Soul Crystal - Stage 16

   1,

   0.05 }, { 13072,// 1 Blue Soul Crystal - Stage 16

   1,

   0.05 }, { 13073,// 1 Green Soul Crystal - Stage 16

   1,

   0.155 }, { 10480,// 1 Red Soul Crystal - Stage 15

   1,

   0.155 }, { 10481,// 1 Blue Soul Crystal - Stage 15

   1,

   0.155 }, { 10482,// 1 Green Soul Crystal - Stage 15

   1,

   0.566 }, { 14169,// 1 Top Life Stone Level 84

   1,

   1.25 }, { 14168,// 1 High Life Stone Level 84

   1,

   2.0 }, { 13073,// 1 Giant's Codex - Mastery

   1,

   3.333 }, { 959,// 1 Enchant Weapon S

   1,

   3.0 }, { 6622,// 1 Giant's Codex

   3,

   8.0 }, { 960,// 1 Enchant Armor S

   1,

   8.0 }, { 9552,// 1 Fire Crystal

   1,

   8.0 }, { 9553,// 1 Water Crystal

   1,

   8.0 }, { 9556,// 1 Dark Crystal

   1,

   8.0 }, { 9557,// 1 Holy Crystal

   1,

   8.0 }, { 9554,// 1 Earth Crystal

   1,

   8.0 }, { 9555,// 1 Wind Crystal

   1,

   8.0 }, { 9546,// 1 Fire Stone

   2,

   20.0 }, { 9547,// 1 Water Stone

   2,

   20.0 }, { 9548,// 1 Earth Stone

   2,

   20.0 }, { 9549,// 1 Wind Stone

   2,

   20.0 }, { 9550,// 1 Dark Stone

   2,

   20.0 }, { 9551,// 1 Holy Stone

   2,

   100.0 }, };

 

private static final long VOTE_COMMAND_REUSE = 5 * 60 * 1000L; // 5 Minutes

private static final long VOTE_PENALTY = 12 * 60 * 60 * 1000L; // 12 Hours

 

public static final Map<Integer, Long> _votePlayerReuses = new ConcurrentHashMap<Integer, Long>();

public static final Map<String, Long> _accountPenalties = new ConcurrentHashMap<String, Long>();

public static final Map<String, Long> _ipPenalties = new ConcurrentHashMap<String, Long>();

public static final Map<String, Long> _hwidPenalties = new ConcurrentHashMap<String, Long>();

 

public RewardVote()

{

// If there is a set vote reward message, schedule it

if(!Config.VOTE_REWARD_MSG.isEmpty())

ThreadPoolManager.getInstance().scheduleAtFixedRate(new VoteAnnounceTask(), 5 * 60 * 1000, Config.ANNOUNCE_VOTE_DELAY * 1000);

 

// Restore from the db all the penalties of the votes, it doesn't matter if its 0. So we can do it only once at start

Connection con = null;

PreparedStatement statement = null;

ResultSet rset = null;

try

{

con = DatabaseFactory.getInstance().getConnection();

statement = con.prepareStatement("SELECT * FROM vote_system");

 

rset = statement.executeQuery();

while(rset.next())

{

final String value = rset.getString("value");

final long time = rset.getLong("penalty_time");

 

switch(rset.getInt("value_type"))

{

// Account Name

case 0:

{

_accountPenalties.put(value, time);

break;

}

// Ip Address

case 1:

{

_ipPenalties.put(value, time);

break;

}

// Hwid

case 2:

{

_hwidPenalties.put(value, time);

break;

}

}

}

}

catch(Exception e)

{}

}

 

@Override

public boolean useVoicedCommand(String command, Player activeChar, String params)

{

if(command.equalsIgnoreCase("vote"))

{

try

{

// No connection, no vote

if(activeChar.getNetConnection() == null)

return false;

 

if(!Config.ENABLE_VOTE)

{

activeChar.sendMessage("Voting is currently disabled!");

return false;

}

 

// Min lvl 40

if(activeChar.getLevel() < 40)

{

activeChar.sendMessage("You need to be at least level 40 to use this command.");

return false;

}

 

final long currentTime = System.currentTimeMillis();

 

// Synerge - Check if voting is not blocked. If a web connection ocurrs, then the vote will be block for everyone for 15 minutes

if(VoteRead._siteBlockTime >= currentTime)

{

activeChar.sendMessage("There are problems with the connection to the vote site, so it has been disabled for some minutes. Try again later");

return false;

}

 

// Check player vote reuse

if(activeChar.getAccessLevel() < 1 && _votePlayerReuses.containsKey(activeChar.getObjectId()))

{

if(_votePlayerReuses.get(activeChar.getObjectId()) > currentTime)

{

activeChar.sendMessage("You can use this command only once every 5 minutes.");

return false;

}

}

 

_votePlayerReuses.put(activeChar.getObjectId(), currentTime + VOTE_COMMAND_REUSE);

 

// Getting IP of client, here we will have to check for HWID when we have LAMEGUARD

final String IPClient = activeChar.getIP();

final String HWID = (activeChar.getHWID() != null ? activeChar.getHWID() : "");

 

// Check the penalties of the player to see if he can vote again

if(!checkPlayerPenalties(activeChar, IPClient, HWID, true))

return false;

 

// Return 0 if he didnt voted. Date when he voted on website

/*final long dateHeVotedOnWebsite = VoteRead.checkVotedIP(IPClient);

if(dateHeVotedOnWebsite < 1)

{

activeChar.sendMessage("To claim reward, you need to vote on all banners!");

return false;

}*/

 

if (!hasVoted(activeChar)) {

                    activeChar.sendMessage("To claim reward, you need to vote!");

                    return false;

                }

 

 

// Add the vote penalty to the player

addNewPlayerPenalty(activeChar, IPClient, HWID);

 

// Give the rewards

giveRewards(activeChar);

activeChar.sendMessage("Successfully rewarded.");

 

return true;

}

catch(Exception e)

{

e.printStackTrace();

}

}

return false;

}

 

// Thread to send to all players that didn't voted yet to vote for the server

protected static class VoteAnnounceTask implements Runnable

{

@Override

public void run()

{

if(Config.VOTE_REWARD_MSG.isEmpty())

return;

 

final Say2 announce = new Say2(0, ChatType.ANNOUNCEMENT, "", Config.VOTE_REWARD_MSG);

 

final Iterable<Player> world = GameObjectsStorage.getAllPlayersForIterate();

for(Player player : world)

{

if(player == null || player.getNetConnection() == null)

continue;

 

// No offline or store mode

if(player.isInStoreMode())

continue;

 

// If the player has an active penalty means that he already voted

if(!checkPlayerPenalties(player, player.getIP(), player.getHWID(), false))

continue;

 

player.sendPacket(announce);

}

}

}

 

/**

* Gives to the player all the vote rewards

*

* @param player

*/

protected static void giveRewards(Player player)

{

// First give the permanent item

Functions.addItem(player, PERMANENT_CATEGORY[0], PERMANENT_CATEGORY[1], "VoteReward Permanent");

 

// First give the vote main random reward

final int[] reward = getReward();

Functions.addItem(player, reward[0], reward[1], "VoteReward Main");

 

// Then give some random rewards

for(double[] item : RANDOM_CATEGORY)

{

if(Rnd.chance(item[2]))

{

Functions.addItem(player, (int) item[0], (long) item[1], "Vote Random Reward");

return;

}

}

}

 

/**

* Puts new penalties for the account name, ip and hwid of the player after he succesfully voted

*

* @param activeChar

* @param IPClient

* @param HWID

*/

protected static void addNewPlayerPenalty(Player activeChar, String IPClient, String HWID)

{

final long newPenalty = System.currentTimeMillis() + VOTE_PENALTY;

_accountPenalties.put(activeChar.getAccountName(), newPenalty);

_ipPenalties.put(IPClient, newPenalty);

_hwidPenalties.put(HWID, newPenalty);

 

// Also store the penalties in the db

Connection con = null;

PreparedStatement statement = null;

try

{

con = DatabaseFactory.getInstance().getConnection();

statement = BatchStatement.createPreparedStatement(con, "REPLACE INTO vote_system(value_type, value, penalty_time) VALUES (?, ?, ?)");

final String[] values = new String[] { activeChar.getAccountName(), IPClient, HWID };

for(ValueType type : ValueType.values())

{

statement.setInt(1, type.ordinal());

statement.setString(2, values[type.ordinal()]);

statement.setLong(3, newPenalty);

statement.addBatch();

}

 

statement.executeBatch();

}

catch(Exception e)

{}

}

 

/**

* @param activeChar

* @param IPClient

* @param HwID

* @param sendMessage

* @return Returns true if the player doesn't have an active penalty after voting

*/

protected static boolean checkPlayerPenalties(Player activeChar, String IPClient, String HwID, boolean sendMessage)

{

final long accountPenalty = checkPenalty(ValueType.ACCOUNT_NAME, activeChar.getAccountName());

final long ipPenalty = checkPenalty(ValueType.IP_ADRESS, IPClient);

final long hwidPenalty = checkPenalty(ValueType.HWID, HwID);

 

final int penalty = (int) ((Math.max(accountPenalty, Math.max(ipPenalty, hwidPenalty)) - System.currentTimeMillis()) / (60 * 1000L));

 

if(penalty > 0)

{

if(sendMessage)

{

if(penalty > 60)

{

activeChar.sendMessage("You can vote only once every 12 hours. You still have to wait " + (penalty / 60) + " hours " + (penalty % 60) + " minutes.");

}

else

{

activeChar.sendMessage("You can vote only once every 12 hours. You still have to wait " + penalty + " minutes.");

}

}

return false;

}

return true;

}

 

/**

* @param type

* @param value

* @return Returns the penalty of a particular type and value if it exists

*/

private static long checkPenalty(ValueType type, String value)

{

switch(type)

{

case ACCOUNT_NAME:

{

if(_accountPenalties.containsKey(value))

return _accountPenalties.get(value);

break;

}

case IP_ADRESS:

{

if(_ipPenalties.containsKey(value))

return _ipPenalties.get(value);

break;

}

case HWID:

{

if(_hwidPenalties.containsKey(value))

return _hwidPenalties.get(value);

break;

}

}

 

return 0;

}

 

public static int[] getReward()

{

return MISC_CATEGORY[Rnd.get(MISC_CATEGORY.length)];

}

 

@Override

public void onLoad()

{

VoicedCommandHandler.getInstance().registerVoicedCommandHandler(this);

}

 

@Override

public void onReload()

{

//

}

 

@Override

public void onShutdown()

{

//

}

 

@Override

public String[] getVoicedCommandList()

{

return COMMANDS_LIST;

}

 

// New Topzone Vote Reward System (API)

 

public String getApiEndpoint(Player player) {

        return String.format("https://api.l2topzone.com/v1/vote?token=%s&ip=%s", Config.VOTE_TOPZONE_APIKEY, player.getIP());

    }

 

    public boolean hasVoted(Player player) {

        try {

            String endpoint = getApiEndpoint(player);

            if (endpoint.startsWith("err"))

                return false;

            String voted = grabValue(getApiResponse(endpoint), "\"isVoted\":", ",\"serverTime\"");

            return tryParseBool(voted);

        } catch (Exception e) {

            player.sendMessage("Something went wrong. Please try again later.");

            e.printStackTrace();

        }

        return false;

    }

 

    public boolean tryParseBool(String bool) {

        if (bool.startsWith("1"))

            return true;

 

        CharSequence cs = "voteTime";

        if (bool.contains(cs)) {

            //System.out.println("Contains \"voteTime\"");

            String newbool = bool.substring(0, 4);

            //System.out.println("Bool to pass: " + newbool);

            return Boolean.parseBoolean(newbool);

        }

 

        return Boolean.parseBoolean(bool.trim());

    }

 

    public String getApiResponse(String endpoint) {

        StringBuilder stringBuilder = new StringBuilder();

 

        try {

            URL url = new URL(endpoint);

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.addRequestProperty("User-Agent", "Mozilla/4.76");

            connection.setRequestMethod("GET");

 

            connection.setReadTimeout(5 * 1000);

            connection.connect();

 

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {

                String line = null;

                while ((line = reader.readLine()) != null) {

                    stringBuilder.append(line + "\n");

                }

            }

            connection.disconnect();

            System.out.println(stringBuilder.toString());//

            return stringBuilder.toString();

        } catch (Exception e) {

            System.out.println("Something went wrong in VoteBase::getApiResponse");

            e.printStackTrace();

            return "err";

        }

    }

 

private static String grabValue(String str, String open, String close) {

        final int INDEX_NOT_FOUND = -1;

        if (str == null || open == null || close == null) {

            return null;

        }

        int start = str.indexOf(open);

        if (start != INDEX_NOT_FOUND) {

            int end = str.indexOf(close, start + open.length());

            if (end != INDEX_NOT_FOUND) {

                return str.substring(start + open.length(), end);

            }

        }

        return null;

    }

}

 

 

 

 

 

 

its this file for votes

  • 0
Posted (edited)

Hello, 

the error is found in the second line of your error...

 

java.io.IOException: Server returned HTTP response code: 403 for URL: https://api.l2topzon...p=85.206.147.64

 

Contact xzone on l2topzone.com and you will solve the problem.

 

PS. problem was already solved. Topic can be close

Edited by xzone

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • When you say bots allowed, it means we are allowed to use adrenaline ?
    • https://l2mayhem.ru/   The Mayhem Server is designed for players who want to enjoy the game without unnecessary stress or steep barriers. We focus on a comfortable gaming experience: the mechanics are adapted so that even newcomers can get up to speed quickly, while veterans will be happy to return to the beloved universe. On the server, character progression and content difficulty are well balanced: your character develops steadily, without the need to spend huge amounts of time on repetitive tasks. For players’ convenience, we’ve implemented autofarm - it lets you complete daily tasks efficiently. Moreover, bots are officially allowed on the server: they help automate routine actions, so you can focus on the most exciting parts of the game - sieges, PvP, clan wars, and crafting. The server’s atmosphere is friendly: the active community is always ready to offer advice, and the administration ensures order and fairness. Whether you’re looking for a relaxed leveling and world‑exploration experience or want to take part in intense events, everyone can find their own pace and playstyle here. Right now, the server features new activities: we’ve added new instances and locations with unique mechanics and rewards, as well as rare items that can only be obtained in these zones. This is a great chance to get powerful gear and stand out among other players.   Rates: - Grind: EXP/SP x3 (Raid Bosses: x3). - Loot: Drop/Spoil/Adena x3; Raid/Epic Raid drops x3. - Quests: All rewards x1.   Gameplay: - Accounts are created automatically. - Mammons is located in the Town of Giran. - Each character has access to the unlimited Auto Farm function. - Mass party functions activated by the party leader. - A pre-installed shortcut panel is provided for each new character. - The full list of chat commands is available on the Community Board. - Players have a x25 weight limit and an increased inventory capacity. - All buffs, dances, and songs last for 2 hours. - Spawn protection lasts 10 seconds after teleporting. - Treasure Chests have been removed from spawns. - Cursed Weapons have been removed from drops. - Common items can no longer be purchased or obtained as drops. - Mobs and Raid Bosses no longer use Cancel skill. - Equipment up to the Dynasty can be purchased with adena. - Shots up to S grade and consumables are available in the Community Board. - Offline shops are supported: simply set up a shop and type the .offline command in chat. - No drop penalty on Raid Bosses unless the player is over 5 levels higher than the boss; otherwise, the drop chance is reduced. - Mana Potions restore 1500 MP and have a 10‑second reuse time. Newbie Mana Potions restore 500 MP. - The Vitality, Nevit, and Recommendations systems have been disabled. - The store now offers a lower buy price for player‑sold items. - NPC Victor visits Town of Giran on Wednesdays and Saturdays for gear/doll upgrades and elemental exchange. - Once you hit level 40, every mob can drop one of three medals: Bronze, Silver, or Gold.   Premium: - +35% to EXP/SP, Adena, Seal Stones, Element Stones, and Epaulette drops. - Buffs, dances, and songs last 3 hours. - With Premium, players can get 3‑hour buffs by purchasing them from other players.   Enchanting: - The chance to successfully enchant gear is 65%. Safe enchantment is up to +3; the maximum enchant level is +20. - Elemental Stones: 50% chance. Elemental Crystals: 30% chance.   Skills: - Auto‑learn all skills and Forgotten Skills. - 30 buff slots, 12 Dance/Song slots. - Subclass max level raised to 85.   Quests: - 25 000 Adena is required to obtain the 1st class; 250 000 Adena for the 2nd class; 10 000 000 Adena for the 3rd class. - The subclass quest is not required. - The Freya quest is not required. - The Hard Freya quest is not required. - Access to Frintezza is granted only after completing the quest or upon having the purchased quest item. - Access to Baium is granted only after completing the quest or upon having the purchased quest item. - Access to Antharas is granted only after completing the quest or upon having the purchased quest item. - Access to Valakas is granted only after completing the quest or upon having the purchased quest item. - Hellbound progression is at level 1.   Olympiad: - Olympiads are held monthly. - Enchantment limit is +6. - Starting Olympiad requires 6 characters. - You need 15 battles to receive a reward. - Only non‑class battles are available.   Sieges/Territory Wars: - Flags are returned to their owners at the start of each Territory War, which occurs every 2 weeks. - A clan’s maximum number of captured flags in TW is 3.   Raid Bosses/Epic Bosses/Instance Features: - RB status is available on the Community Board. - Freya - 6-27 chars to enter. - Hard Freya - 6-27 chars to enter. - Frintezza - 6-45 chars to enter. - Ultra Daytime Zaken - 6-9 chars to enter. - Daytime Zaken - 6-9 chars to enter. - Nightly Zaken - 6-450 chars to enter. - Tiat - 9-45 chars to enter. - Beleth - 9 chars to enter. - Day/night restrictions for all Zaken instances have been removed. - Level‑limited zones: Ant Nest (levels 1–45), Sea of Spores (levels 1–56), Core (levels 1–56). - Almost all Raid Bosses listed in the Community Board drop an Enchanting Box with a 100% chance. - New Raid Bosses and their jewelry have been added. Teleport to these bosses via NPC Mirelle in Town of Giran. - New Instances: dolls, timed epic jewelry, and upgrade item for cloaks, bracelets, and accessories. Enter via NPC Ancient Portal in Town of Giran; 6-9 chars to enter.
    • Estou procurando cloacks do classic adaptadas para cliente interlude.
    • 10 Raid Bosses. PvP every 3 hours. Zero donations.   Welcome to L2 Empire. Interlude. x1000. Pure PvP. No donation shop. Not even "cosmetics only". Nothing. Everything in this game drops, gets farmed, or gets taken from someone else. Before we open the gates, we want real players to try to break it.   ⚔️ WHAT'S WAITING FOR YOU - Level 80 from the start, gear from the Starter Voucher, free buffs - Soulshots, spiritshots and potions: free, forever - 10 Raid Bosses on a fixed schedule, 4 arenas, everyone around them flagged - PvP Zone every 3 hours, Team vs Team, 1v1 Tournament, Olympiad, Sieges - Revenge: someone killed you? Get him within 10 minutes for double coins - Solo Dungeon, Player Market, weekly rankings, Hall of Fame - Our own anti cheat. One client per PC. Bots get nothing but a ban.   📡 A DISCORD CONNECTED TO THE GAME Our Discord is not just a chat. It lives with the server: - Live Raid Boss board: which boss is up, where, and when the next one comes - Every event on a countdown, shown in YOUR own time zone - Kill streaks, raid kills and weekly rankings posted live from the game - Link your character and get your PvP rank as a Discord role - The weekly PvP King, crowned on Discord - Your own stats with one command - Support tickets in English, Greek, Spanish and Portuguese - Development updates and sneak peeks before anyone else   🛠️ WHY WE NEED YOU The server is still being built, and we won't pretend otherwise. We want the bugs found now, not on launch night. We want clan leaders to tell us what their clan needs. We want to hear what you always hated on other servers, so it's not here.   🎖️ WHAT YOU GET Every tester gets an exclusive Beta Hero armor skin, forever. Keep the stats of your own armor, wear the look nobody else can ever get. You'll be the ones everyone recognizes as the first of L2 Empire.   👉 JOIN US: https://discord.gg/kQjk9md7fX Testers are picked on the Discord. See you in Giran. L2 Empire
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..