Jump to content

Recommended Posts

Posted

THIS TEXT IS COPY PASTE FROM OFFICIAL LINEAGE PAGE http://www.lineage2.com/Knowledge/sevensigns.html AS I kNOW THAT, COPY PASTE IS NOT THE BEST, THIS GUIDE IS QUITE USEFULL AND MANY USERS MAY DIDNT FIND ITAT OFFCIAL L2 PAGE. SO I DECIDED TO POST IT HERE!

Greek Translation http://www.maxbastards.gr/forum/index.php?topic=5774.0 (translation not done by me )

 

Overview

As the Seven Seals that bind the power of Shilen, the goddess of death, are opened one by one, the world moves closer to the brink of chaos. Each Seal contains a great power that could cause the world to tremble. The one who opens the Seals can control the power contained within them. The Revolutionary Army of Dusk and the Lords of Dawn compete against each other toward this end. Players join one of these two cabals who vie for control over the power of the Seals.

 

 

An unlimited number of players can join the Seven Signs quest, which repeats in two-week intervals. Based on the results of the Seven Signs, players can change the status of their server.

 

Players participating in the Seven Signs gather their forces. The fight between the Cabals reflects the nature of the confrontation between those who hold a castle and those who do not. However, players who fail to make a second change of occupation fall into a "neutral group" and may participate in either the Dusk or Dawn side.

 

Seven Signs At A Glance

 

1. Choose Cabal

- Dusk

- Dawn2. Choose Seal

- Avarice

- Gnosis

- Strife3. Competiton Period

- Collecting Seal Stones

- Festival of DarknessVictory

- Enjoy Seal Effects Defeat

- Stats Accrue

 

Joining and Withdrawing from the Seven Signs Cabals

Players who want to participate in the Seven Signs must join one of the Cabals, either the Revolutionary Army of Dusk ("Dusk") or the Lords of Dawn ("Dawn") for a certain period of time. Once they join the Cabals, it is impossible for them to withdraw until a new Seven Signs starts after two weeks They must choose the Seal they want to possess when they join.

 

Players who have completed the second class transfer may join a cabal of the Seven Signs:

 

Lords of Dawn

 

Members of clans who own a castle and their alliances may join the Lords of Dawn. Also, players who are not members of the castle-holding clans or alliances but willing to pay 50,000 adena are able to choose Dawn through the Priests of Dawn in each village during the competition period. The Lord of each castle also has the privilege to allow an additional 300 characters to join. During the competition period, the Lords of the castles may purchase 300 of the Approval Certificates through the Chamberlain and transfer these Certificates to other characters.

 

Players who are not members of castle-owning clans need to get an Approval Certificate from the Lords to join Dawn, or pay 50,000 adena. The Approval Certificates will never expire and are valid for any event period of the Seven Signs. However, Approval Certificates will disappear after use.

 

Revolutionary Army of Dusk

 

Only players who are not members of the castle clans and guilds may join Dusk. During the registration period, they may join through the Priests of Dusk in each village.

 

Players who have completed the first class transfer but not the second may freely join either the Lords of Dawn or the Revolutionary Army of Dusk.

 

Players who have not completed the first class transfer may not participate in the Seven Signs.

 

Competition Period

Players who join the Cabals participate in the competition period from the first Monday (6:00 PM) until the Monday (6:00 PM) of the following week and compete to possess the Seals. Each Cabal may hunt the Lilim, Nephilim, Lilith, and Gigant within the Catacomb and Necropolis to acquire Seal Stones. They can participate in two kinds of competitions: acquiring the items necessary for their Cabal, and participating in the Festival of Darkness.

 

MondaySundaySaturdaySunday

 

Siege PeriodJoin Status InitializationCompetition Period

Dawn Join Period

Dusk Join Period Seal-effective period

End of Competition

The Seal is enabled based on victory or defeatSeal Initialization

Seal Stones

 

Each Cabal may hunt the monsters within the Catacomb and Necropolis to acquire Seal Stones. The items acquired in this way are entrusted to the Priest of each side, and then, based on the number of items, the scores contributed to Seven Signs by each player are accumulated and included in the total score of the whole Cabal.

 

Contribution points to the Cabal will be different based on stone color: Blue (1), Green (5), and Red (10). Seal Stones are items that can be exchanged among the players. If the seal stones are not entrusted to the Priest during the competition period, they do not disappear and can be used during the next competition period.

 

 

The Festival of Darkness

 

Overview

 

One chosen party participates in this challenge for the victory of the Cabal. Of the players participating in the Festival of Darkness, the party who recorded the best score in each grade will contribute some points to the Cabal it belongs to. The Festival of Darkness is divided by level and any players belonging to the Cabals of Dawn and Dusk can participate in it.

 

How to Participate

 

Players may participate only during the competition period. The party who wants to participate should pay Seal Stones to the Guide of the Festival in the Oracle. Priests in towns will teleport you to Oracle for free. The entry fee varies depending on the level and will be paid by party leaders.

 

The party must consist of minimum of 5 members belonging to the same Cabal, and the members of the party must correspond to the grade of the Festival they want to participate in. The characters who correspond to the level of the Festival, but have higher level skills than the party members may not participate. This happens when the character is de-leveled, but his skills learned from the previous higher level remain.

 

These challenges are always possible during the competition period and there is no limit in the number of challenges.

 

The Oracle

 

In the Oracle, where the Festival of Darkness occurs, experience loss is reduced to a quarter of the normal death penalty. If the competition is restarted within the Oracle, your party is moved to the nearby village when restarting. Within the center magic array in the Oracle, MP regenerates more quickly than normal. Players can be teleported to the Oracle and, when coming out, return to the place they left free of charge through the Priest of each village.

 

When players die, they will restart inside the room. Resurrection is not allowed within the Oracle. Archer monsters in the corners may pinpoint their attacks on healer classes.

 

 

 

Type of Challenges

 

The Festival of Darkness is divided into five grades as shown in the table below.

 

Level Blue Seal Stone Green Seal Stone Red Seal Stone

Below 32 900 540 270

Below 43 1500 900 450

Below 54 3000 1800 900

Below 65 4500 2700 1350

No Limit 6000 3600 1800

 

Process

 

Teleporting to the battle ground is possible only two minutes before the Festival of Darkness starts. Once the enrollment is completed through the Guide of the Festival, the party receives the Quest of the Festival of Darkness. The party is immediately teleported to The Oracle and, after two minutes, may begin the Festival.

 

The Festival of Darkness continues for 18 minutes, when each party can hunt the monsters to acquire the Blood of the Sacrificed. The number of this certificate corresponds to the performance score in the Festival of Darkness. All the Blood of the Sacrificed acquired is awarded to the party leader.

 

A party who wants to give up in the middle of the Festival can do so through the female shaman found in center of the room. If they think the Festival is too easy, they can request stronger monsters. The stronger the monsters they kill, the more Blood of the Sacrificed they can acquire. Please note that drop chances for Blood of the Sacrificed will be lowered when accompanied by pets.

 

Registering the Results

 

After the Festival ends, the leader of the party must register the results with the Guide of the Festival within 40 minutes. If the party fails to register within this time, the results will become invalid. If the registered result is lower than the previous highest record, the record is not updated. The players can confirm the participating members and score of the party who set the highest record for each grade through the guide of the Festival.

 

 

Prizes

 

After the competition period ends and their Cabal claims victory, the party members who set the highest record for each grade can receive Ancient Adena as compensation from the Guide of the Festival. After the entire amount of the entry fee is converted to Ancient Adena, the amount of compensation that is received is allocated to the winning parties.

 

Although a party may set the highest record in a specific grade, they cannot receive the prize if the Cabal they belong to loses.

 

The prize is paid only before the next competition period begins.

 

End of the Competition Period

 

Determining Victory and Defeat

 

The total of Seal Stones acquired by each Cabal and entrusted to the Priest and the scores for the victory in each grade of the Festival of Darkness is added at the end of the competition period. The side with the higher total score wins.

 

For the winner, the total score of the Cabal acquired during the competition period will disappear after winning, but for the loser, the score will be accumulated and remain until the party wins later.

 

 

 

Grade (level requirement)

Points

 

~ 32

70

 

~ 43

70

 

~ 54

80

 

~ 65

80

 

Unlimited

100

 

 

 

 

Ancient Adena

 

The Priest in the village exchanges the Seal Stones, entrusted as the contribution during the competition period, into Ancient Adena, and gives it to the winner.

 

If the winning Cabal did not entrust any Seal Stones during the competition period, they can bring them to exchange for Ancient Adena immediately. This way, the winner can receive compensation with Ancient Adena; however, the loser cannot receive compensation until they win in the competition. Seal Stones entrusted at the time of defeat may be compensated all together if they win in the next competition. If Ancient Adena was not transferred during the Seal Effective period, the transfer cannot be performed until the Cabal wins in the next competition. If they win, they can exchange all of their accumulated Seal Stones for Ancient Adena.

 

Purchasing Items

 

The winner can purchase a variety of items that cannot be purchased in the general stores by paying with Ancient Adena to the Priest of Dusk or Dawn.

 

Change in the Ownership of the Seal

 

The ownership of the Seal is changed based on the resulting victory or defeat and percentage of choice for the Seal.

 

- If a Seal was already closed or owned by the opponent and the new winner wants to assume ownership of the Seal, 35% or more of the members of the Cabal must have chosen the Seal. If they chose less than 35%, they cannot own the Seal.

 

- If the Seal was owned by the winner in the previous Seven Signs, they can retain that seal if 10% or more members have chosen it. If they want to possess a new Seal, at least 35% of the members of the Cabal must have chosen the new Seal.

 

Changes in the Sky

 

If Dawn wins, a solar eclipse occurs and the sky turns to a violet color, and if Dusk wins, an eye is created in the moon and the sky turns to a green color.

 

Entrance to Catacombs and Necropolis

 

The loser cannot enter the Catacombs and Necropolis. Only the Cabal who owns the Seal can enter. If there are any characters who do not own the Seal in the Catacombs and Necropolis, the monsters in the dungeon send the players back to the nearby village.

 

The Seals 

If a party owns each Seal, the following changes will occur.

 

Seal of Avarice

 

The teleport NPC at the entrance of the Necropolis moves only the winner inside the dungeon, and they can receive various kinds of buffs if they pay with Ancient Adena. If they don't own the Seal, they cannot enter.

Able to enter all 8 Necropolis freely.

In the Necropolis, monsters are generated for the winner to hunt.

They can meet Anakim or Lilith in the Disciples Necropolis.

The Trader of Mammon appears inside of the dungeon. They can purchase a variety of items that cannot be purchased in the general stores by paying with Ancient Adena. The Trader of Mammon is not staying in one place, but often moves around each dungeon.

Seal of Gnosis

 

The teleport NPC at the entrance of the Catacombs moves only the winner to the inside of the dungeon. If they don't own the Seal, they cannot enter.

Able to enter all 6 Catacombs.

The winner can be teleported to the hunting field by paying the priests of the village with Ancient Adena at a cheaper price.

A hostile NPC moves around each village (except the starting villages), and randomly casts various kinds of harmful magic onto members of the losing side.

A friendly NPC moves around each village (except the starting villages), and randomly casts various kinds of support magic to the winner's side.

The Blacksmith of Mammon appears inside the Catacombs. The Blacksmith of Mammon receives Ancient Adena for giving special abilities to A-grade weapons, removing the seal on armor, making it possible to upgrade weapons to higher-level weapons, and exchanging weapons free of charge with other kinds of weapons at the same level. The Blacksmith of Mammon also moves around each dungeon continuously.

Seal of Strife

 

If owned by Dawn:

 

At the time of siege warfare, it becomes possible to hire the elite and Dawn mercenaries, in addition to the existing mercenaries.

The cost required for the upgrade of the castle gates and walls is slightly reduced.

The defensive power of the castle gates and walls is slightly increased.

The maximum tax rate that the lord of each castle can establish is increased to 25%.

The Revolutionaries of Dusk cannot use any siege weapons (Siege Golem, Wild Hog Cannon, Swoop Cannon).

If owned by Dusk:

 

At the time of siege warfare, it becomes impossible to hire the existing mercenaries and possible to hire only low-level mercenaries.

The cost required for the upgrade of the castle gates and walls is greatly increased.

The defensive power of the castle gates and walls is greatly reduced.

The maximum tax rate that the lord of each castle can establish is decreased to 5%.

If Dusk controls the Seal of Strife or if there is no owner, siege weapons can be used during the siege. 

 

Catacombs, Necropolis, and Oracles 

The Oracle is the space to hold the Festival of Darkness, and, in the Catacomb and Necropolis, the players can hunt monsters and get Seal Stones necessary for the acquisition of the Seals. The Lilim and Nephilim drop Seal Stones but do not drop Ancient Adena. Access to these dungeons is limited based on the participation in the Cabal and ownership of the Seals.

 

Necropolis

 

Necropolis of Sacrifice: level 20-30 monsters appear and it is located on the southern seashore of the Gludio Territory.

Pilgrim's Necropolis: level 30-40 monsters appear and it is located near the Partisan's Hideaway in Dion Territory.

Necropolis of Worship : level 40-50 monsters appear and it is located near the Alligator Island in the Innadril Territory.

Patriot's Necropolis: level 50-60 monsters appear and it is located above the Gludio Castle in the Gludio Territory.

Necropolis of Devotion: level 60-70 monsters appear and it is located near the Altar of Rites in the Oren Territory.

Necropolis of Martyrdom : level 60-70 monsters appear and it is located near the Giran Castle in the Giran Territory.

Saint's Necropolis: level 70-80 monsters appear and it is located near the Field of Whispers in the Innadril Territory.

Disciple's Necropolis: level 70-80 monsters appear and it is located near the Devastated Castle in the Aden Territory. From here, the players can move to the place where Anakim or Lilith appear, based on the ownership of the Seals.

Catacomb

 

Catacomb of the Heretic : level 30-40 monsters appear and it is located near the Execution Ground in the Dion Territory.

Catacomb of the Branded: level 40-50 monsters appear and it is located near the Giran Port in the Giran Territory.

Catacomb of the Apostate: level 50-60 monsters appear and it is located near the Plains of the Lizardmen in the Oren Territory.

Catacomb of the Witch: level 60-70 monsters appear and it is located near the Forest of Mirrors in the Aden Territory.

Catacomb of Dark Omens: level 70-80 monsters appear and it is located near the Dark Elven Village in the Oren Territory.

Catacomb of the Forbidden Path: level 70-80 monsters appear and it is located near the Hunters Village in the Aden Territory.

Oracle

 

Oracle of Dawn: located near the Orc Barracks in the Gludio Territory.

Oracle of Dusk: located near the Windy Hill in the Gludio Territory.

Access to the Dungeons

 

During the competition period, any characters who joined a Cabal can access the dungeons. Characters that did not join a Cabal cannot access the dungeons. After the competition period is over, for the next week when the Seals are effective, only the Cabal who owns the appropriate Seal can have access. The loser, or even the winner who did not achieve the percentage necessary for the acquisition of the appropriate Seal, cannot access the dungeons for one week while the Seals are effective.

 

Monsters in the Dungeons

 

The Cabals can acquire seal stones by hunting the monsters in the dungeons. Nephilim drops stones necessary for Dusk and Lilim drops stones necessary for Dawn. In the Competition Period, the general monsters Lilim and Nephilim all appear, but if the players acquired the Seal during the Seal Effective Period, the general monsters and the monsters who drop only the items necessary for the winner appear.

 

Seven Signs Related Items and NPCs 

 

Seal Stones

 

Seal stones can be acquired by hunting Lilim, Nephilim, Gigant, or Nephilim in the Catacomb and Necropolis. The value of seal stones are higher in the order of Blue < Green < Red. If entrusted to Priests in town, it will add contribution points to your Cabal. Each blue, green, and red seal stone contributes points as much as 3, 5, and 10 respectively.

 

Ancient Adena

 

Ancient Adena is an item that can be acquired through Seal Stones, converted to regular adena by 1:1 through the Black Market Trader of Mammon, and used to purchase the items from the Priests of Dawn or Dusk, Blacksmith of Mammon and Trader of Mammon or utilize various kinds of functions.

 

The Record of Seven Signs

 

This is the item that allows you to see overall situations, main events and Seal states of the Seven Signs at a glance. Anyone can buy this item at 500 adena through the Priests of Dawn or Dusk.

 

Approval Certificates of the Lord

 

With this item, even the characters that are not members of castle-holding clans and completed the second change of occupation can join Dawn.

 

The Black Market Trader of Mammon

 

They exchange Seal Stones and also exchange Ancient Adena with Adena.

 

 

 

 

 

  • 2 weeks later...
Guest
This topic is now closed to further replies.


  • Posts

    • 🔥 L2Gold.co x15 Interlude Server 2025 – Grand Opening! 🔥 Join us today and be part of the legendary L2Gold community! 🎉 Grand Opening: 14 March 2025 🎉 ⏰ Time: 21:00 GMT +2 🌍 Server Type: EURO PTS/L2OFF 🌟 Why Play on L2Gold.co? 🌟 ✅ No Wipes – Keep Your Progress Forever! Your characters and progress are permanent. No resets! ✅ Balanced & Fun Gameplay! Experience x15 rates for a smooth and enjoyable progression. ✅ Solo or Party Play Use MP potions and NPC buffers for a great solo experience or team up with friends. ✅ Long-Term Stability Our server is built to last with no interruptions! 📊 Server Rates & Details 📊 Category Rate EXP/SP x15 (Official rate without rune or VIP) Adena x10 (Official rate without rune or VIP) Drop x10 (Official rate without rune or VIP) Spoil x10 (Official rate without rune or VIP) Raid Boss Drop x10 (Official rate without rune or VIP) 🚀 Exciting New Features! 🚀 🎟️ 💰 Weekly Lottery System! – Win rare items, in-game currency, and exclusive rewards! 🎁 More Events & Rewards! – Special in-game activities with exclusive items! 📈 Real-Time Stats! – Track your progress, achievements, and rankings live! ⚔️ New Items Weekly! – Discover rare gear and unique items every week! 🌍 A Growing Global Community 🌍 Players from Greece 🇬🇷, Brazil 🇧🇷, Spain 🇪🇸, and beyond! 🔗 Stay Connected 🔗 Follow us on social media to stay updated! 🌎 Website: L2Gold.co 🎙️ Discord: Server 📘 Facebook: Page | Group 🎥 YouTube:   Watch Videos 🎵 TikTok: Follow Us 🔥 Prepare for Battle! 🔥 📅 The adventure begins on 14 March 2025! Join L2Gold.co and Experience an Unforgettable Adventure! 🎮✨
    • y girate unos archivitos del powerclass dale..... sin encrypt
    • Hi, im looking for cardinal pvp script for auto cleanse/rez/nobles etc etc and guide on how to setup as well as what programms do i need to run such scripts as i have never used any helper or something before,
    • [Release] Solo PvP Zone System 🔹 Compatible with: aCis 401+ 📜 Features: ✅ Automatic Exit on Restart: Players are removed from the zone if a restart occurs or logout. ✅ Custom Exit Command: Players can exit the Solo Zone with the voice command .exit. ✅ Teleport NPC Command: new bypass solopvp for gatekeeper. ✅ Random Name Generator: Generates random names. ✅ PvP Flag: The players are flagged within this zone.   xml preview & java code backup code -> https://pastebin.com/974V2p2p   SoloZone.xml <?xml version="1.0" encoding="UTF-8"?> <list> <zone shape="NPoly" minZ="-5200" maxZ="-4680"><!-- Frintezza Solo Zone --> <stat name="name" val="Solo PvP Zone" /> <stat name="locs" val="174244,-89089,-5112;174260,-86881,-5112;173184,-88090,-5112;175309,-88018,-5112;174231,-88019,-5112;175136,-88828,-5104;174962,-87025,-5104;173149,-87142,-5104;173470,-88908,-5112" /> <stat name="restrictedClasses" val="15,16,97" /> <node x="172031" y="-90127"/> <node x="176428" y="-90089"/> <node x="176428" y="-74051"/> <node x="172057" y="-74108"/> </zone> </list> SoloZone Code: diff --git a/java/net/sf/l2j/gameserver/taskmanager/SoloZoneTaskManager.java b/java/net/sf/l2j/gameserver/taskmanager/SoloZoneTaskManager.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/taskmanager/SoloZoneTaskManager.java @@ -0,0 +1,98 @@ +package net.sf.l2j.gameserver.taskmanager; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.logging.Logger; + +import net.sf.l2j.commons.random.Rnd; + +import net.sf.l2j.gameserver.data.manager.ZoneManager; +import net.sf.l2j.gameserver.enums.ZoneId; +import net.sf.l2j.gameserver.handler.voicecommandhandlers.VoiceExitSoloZone; +import net.sf.l2j.gameserver.model.World; +import net.sf.l2j.gameserver.model.actor.Player; +import net.sf.l2j.gameserver.model.location.Location; +import net.sf.l2j.gameserver.model.zone.type.SoloZone; + + +/** + * @author MarGaZeaS + */ +public class SoloZoneTaskManager implements Runnable { + + private static final Location EXIT_LOCATION = VoiceExitSoloZone.getExitLocation(); // Λαμβάνουμε την έξοδο από το VoiceExitSoloZone + + @Override + public void run() + { + // Διασχίζουμε όλους τους παίκτες του κόσμου + for (Player player : World.getInstance().getPlayers()) + { + // Ελέγχουμε αν ο παίκτης είναι στο SoloZone + if (player.isInsideZone(ZoneId.SOLO)) + { + // Μεταφέρουμε τον παίκτη στην έξοδο + player.teleportTo(EXIT_LOCATION.getX(), EXIT_LOCATION.getY(), EXIT_LOCATION.getZ(), 0); + player.sendMessage("The server is restarting, you have been moved out of the Solo Zone."); + } + } + } + + private int _id; + + private static final Logger _log = Logger.getLogger(SoloZoneTaskManager.class.getName()); + private static final ArrayList<String> _rndNames = new ArrayList<>(); + private static final int RANDOM_NAMES = 500; + private static final String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + private int _playersInSoloZone = 0; + + public int getPlayersInside() { + return _playersInSoloZone; + } + + public void setPlayersInside(int val) { + _playersInSoloZone = val; + } + + public SoloZoneTaskManager() { + _log.info("Solo Zone System: Loading..."); + for (int i = 0; i < RANDOM_NAMES; i++) { + String name = generateName(); + _rndNames.add(name); + _log.info("Generated name: " + name); + } + _log.info("Solo Zone System: Loaded " + _rndNames.size() + " names."); + } + + public String getAName() { + if (_rndNames.isEmpty()) { + _log.warning("SoloZoneManager: No random names available."); + return "Unknown"; + } + return _rndNames.get(Rnd.get(5, RANDOM_NAMES - 5)); + } + + private static String generateName() { + SecureRandom rnd = new SecureRandom(); + StringBuilder sb = new StringBuilder(15); + for (int i = 0; i < 15; i++) { + sb.append(CHARS.charAt(rnd.nextInt(CHARS.length()))); + } + return sb.toString(); + } + + public int getZoneId() + { + return _id; + } + + public final static SoloZone getCurrentZone() { + return ZoneManager.getInstance().getAllZones(SoloZone.class) + .stream() + .findFirst() // Επιστρέφει την πρώτη SoloZone (αν υπάρχει μόνο μία) + .orElse(null); + } + + public static SoloZoneTaskManager getInstance() { + return SingletonHolder._instance; + } + + private static class SingletonHolder { + private static final SoloZoneTaskManager _instance = new SoloZoneTaskManager(); + } +} diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/taskmanager/PvpFlagTaskManager.java b/aCis_gameserver/java/net/sf/l2j/gameserver/taskmanager/PvpFlagTaskManager.java index a707ce5..d247e2e 100644 --- a/aCis_gameserver/java/net/sf/l2j/gameserver/taskmanager/PvpFlagTaskManager.java final Player player = entry.getKey(); final long timeLeft = entry.getValue(); + if(player.isInsideZone(ZoneId.SOLO)) + continue; if(player.isInsideZone(ZoneId.BOSS)) continue; // Time is running out, clear PvP flag and remove from list. if (currentTime > timeLeft) diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestCharacterCreate.java b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestCharacterCreate.java index a707ce5..d247e2e 100644 +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestCharacterCreate.java if (Config.ALLOW_FISH_CHAMPIONSHIP) FishingChampionshipManager.getInstance(); + if (Config.ENABLE_STARTUP) + StartupManager.getInstance(); diff --git a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminMaintenance.java b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminMaintenance.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminMaintenance.java if (!st.hasMoreTokens()) { sendHtmlForm(player); return; } try { switch (st.nextToken()) { case "shutdown": + SoloZoneTaskManager exitTask = new SoloZoneTaskManager(); + ThreadPool.schedule(exitTask, 0); Shutdown.getInstance().startShutdown(player, null, Integer.parseInt(st.nextToken()), false); break; case "restart": + exitTask = new SoloZoneTaskManager(); + ThreadPool.schedule(exitTask, 0); Shutdown.getInstance().startShutdown(player, null, Integer.parseInt(st.nextToken()), true); break; case "abort": Shutdown.getInstance().abort(player); break; diff --git a/java/net/sf/l2j/gameserver/handler/voicecommandhandlers/VoiceExitSoloZone.java b/java/net/sf/l2j/gameserver/handler/voicecommandhandlers/VoiceExitSoloZone.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/handler/voicecommandhandlers/VoiceExitSoloZone.java +package net.sf.l2j.gameserver.handler.voicecommandhandlers; + +import net.sf.l2j.commons.pool.ThreadPool; + +import net.sf.l2j.gameserver.enums.ZoneId; +import net.sf.l2j.gameserver.handler.IVoiceCommandHandler; +import net.sf.l2j.gameserver.model.actor.Player; +import net.sf.l2j.gameserver.model.location.Location; +import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse; + +/** + * Handles the voice command for exiting the Solo Zone with delay and effects. + * + * @author MarGaZeaS + */ +public class VoiceExitSoloZone implements IVoiceCommandHandler +{ + private static final String[] VOICE_COMMANDS = + { + "exit" + }; + + // Default location to teleport players when exiting the Solo Zone + private static final Location EXIT_LOCATION = new Location(81318, 148064, -3464); // Replace with your desired coordinates + + // Προσθήκη της μεθόδου για να πάρουμε την τοποθεσία εξόδου + public static Location getExitLocation() { + return EXIT_LOCATION; + } + + @Override + public void useVoiceCommand(Player player, String command) + { + if (command.equalsIgnoreCase("exit")) + { + if (!player.isInsideZone(ZoneId.SOLO)) + { + player.sendMessage("You are not inside the Solo Zone."); + return; + } + + // Notify the player about the delay + player.sendMessage("You will be teleported out of the Solo Zone in 2 seconds."); + + // Cast skill effect (Skill ID: 2100, Level: 1) + player.broadcastPacket(new MagicSkillUse(player, player, 2100, 1, 2000, 0)); + + // Schedule the teleportation after a 2-second delay + ThreadPool.schedule(() -> { + // Teleport the player to the designated exit location + player.teleportTo(EXIT_LOCATION.getX(), EXIT_LOCATION.getY(), EXIT_LOCATION.getZ(), 0); + + // Inform the player + player.sendMessage("You have exited the Solo Zone."); + }, 2000); // Delay in milliseconds (2000ms = 2 seconds) + } + } + + @Override + public String[] getVoiceCommandList() + { + return VOICE_COMMANDS; + } +} diff --git a/java/net/sf/l2j/gameserver/handler/VoiceCommandHandler.java b/java/net/sf/l2j/gameserver/handler/VoiceCommandHandler.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/handler/VoiceCommandHandler.java public class VoiceCommandHandler { private final Map<String, IVoiceCommandHandler> _entries = new HashMap<>(); protected VoiceCommandHandler() { ............ ............ + registerHandler(new VoiceExitSoloZone()); } public void registerHandler(IVoiceCommandHandler handler) { for (String command : handler.getVoiceCommandList()) _entries.put(command, handler); } diff --git a/java/net/sf/l2j/gameserver/model/actor/Npc.java b/java/net/sf/l2j/gameserver/model/actor/Npc.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/model/actor/Npc.java else if (command.startsWith("Chat")) { int val = 0; try { val = Integer.parseInt(command.substring(5)); } catch (final IndexOutOfBoundsException ioobe) { } catch (final NumberFormatException nfe) { } showChatWindow(player, val); + ) + else if (command.startsWith("solopvp")) + { + SoloZoneTaskManager.getInstance(); + player.teleportTo(SoloZoneTaskManager.getCurrentZone().getLoc(), 25); + } else if (command.startsWith("Link")) { final String path = command.substring(5).trim(); if (path.indexOf("..") != -1) return; final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); html.setFile("data/html/" + path); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestartPoint.java b/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestartPoint.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestartPoint.java // Fixed. - else if (_requestType == 4) - { - if (!player.isGM() && !player.isFestivalParticipant()) - return; - - loc = player.getPosition(); - } + if (_requestType == 4) + { + // Έλεγχος αν ο παίκτης δεν είναι GM, δεν είναι μέρος του φεστιβάλ και δεν είναι στην Solo Zone + if (!player.isGM() && !player.isFestivalParticipant() && !player.isInsideZone(ZoneId.SOLO)) + { + return; + } + + SoloZoneTaskManager.getInstance(); + SoloZone currentZone = SoloZoneTaskManager.getCurrentZone(); + if (currentZone != null && currentZone.getLoc() != null) + { + // Αν υπάρχει ζώνη και οι τοποθεσίες δεν είναι κενές, χρησιμοποιούμε τυχαία τοποθεσία από την ζώνη + loc = currentZone.getLoc(); + } else + { + // Διαφορετικά, κάνουμε respawn στην τρέχουσα θέση του παίκτη + loc = player.getPosition(); + } + } diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java b/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java if (player.isFestivalParticipant() && FestivalOfDarknessManager.getInstance().isFestivalInitialized()) { player.sendPacket(SystemMessageId.NO_RESTART_HERE); sendPacket(RestartResponse.valueOf(false)); return; } + if (player.isInsideZone(ZoneId.SOLO)) + { + player.sendMessage("You cannot restart your character while in Solo Zone. Use .exit to leave"); + player.setFakeName(null); + sendPacket(RestartResponse.valueOf(false)); + return; + } player.removeFromBossZone(); diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/Logout.java b/java/net/sf/l2j/gameserver/network/clientpackets/Logout.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/Logout.java player.removeFromBossZone(); player.logout(true); } } + + if (player.isInsideZone(ZoneId.SOLO)) + { + player.sendMessage("You cannot logout or restart your character while in Solo Zone. Use .exit to leave"); + player.setFakeName(null); + player.sendPacket(ActionFailed.STATIC_PACKET); + return; + } + player.removeFromBossZone(); player.logout(true); } } diff --git a/java/net/sf/l2j/gameserver/model/zone/type/SoloZone.java b/java/net/sf/l2j/gameserver/model/zone/type/SoloZone.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/model/zone/type/SoloZone.java +package net.sf.l2j.gameserver.model.zone.type; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.sf.l2j.commons.random.Rnd; + +import net.sf.l2j.Config; +import net.sf.l2j.gameserver.enums.MessageType; +import net.sf.l2j.gameserver.enums.ZoneId; +import net.sf.l2j.gameserver.handler.voicecommandhandlers.VoiceExitSoloZone; +import net.sf.l2j.gameserver.model.World; +import net.sf.l2j.gameserver.model.actor.Creature; +import net.sf.l2j.gameserver.model.actor.Player; +import net.sf.l2j.gameserver.model.location.Location; +import net.sf.l2j.gameserver.model.zone.type.subtype.ZoneType; +import net.sf.l2j.gameserver.network.SystemMessageId; +import net.sf.l2j.gameserver.network.serverpackets.EtcStatusUpdate; +import net.sf.l2j.gameserver.taskmanager.PvpFlagTaskManager; +import net.sf.l2j.gameserver.taskmanager.SoloZoneTaskManager; + +/** + * @author MarGaZeaS + * + */ +public class SoloZone extends ZoneType +{ + private String _name; + private List<Location> _locations = new ArrayList<>(); + + public SoloZone(int id) + { + super(id); + } + + @Override + public void setParameter(String name, String value) + { + if (name.equals("name")) + _name = value; + else if (name.equals("locs")) + { + for (String locs : value.split(";")) + { + String[] coordinates = locs.split(","); + if (coordinates.length == 3) + { + int x = Integer.parseInt(coordinates[0]); + int y = Integer.parseInt(coordinates[1]); + int z = Integer.parseInt(coordinates[2]); + _locations.add(new Location(x, y, z)); + } + else + { + LOGGER.warn("Invalid location format: " + locs); + } + } + } + } + + + @Override + protected void onEnter(Creature character) + { + if (character instanceof Player) + { + final Player player = (Player) character; + + if ((player.getClassId().getId() == 15 || player.getClassId().getId() == 16 || player.getClassId().getId() == 97)) + { + Location respawnLocation = VoiceExitSoloZone.getExitLocation(); + player.instantTeleportTo(respawnLocation, 20); + player.sendMessage("Your class is not allowed in this zone."); + return; + } + + String randomName = SoloZoneTaskManager.getInstance().getAName(); + if (randomName == null || randomName.isEmpty() || !isValidName(randomName)) + { + randomName = generateRandomName(); + } + if (isNameAlreadyTaken(randomName)) + { + randomName = generateRandomName(); + } + player.setFakeName(randomName); + player.sendMessage("Welcome to the Solo Zone, your random name is: " + randomName); + player.sendPacket(SystemMessageId.ENTERED_COMBAT_ZONE); + character.setInsideZone(ZoneId.SOLO, true); + character.setInsideZone(ZoneId.NO_STORE, true); + character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true); + + if (player.getParty() != null) + { + player.getParty().removePartyMember(player, MessageType.DISCONNECTED); + } + + if (player.getPvpFlag() > 0) + PvpFlagTaskManager.getInstance().remove(player, true); + + player.updatePvPStatus(); + player.broadcastUserInfo(); + } + } + + private static boolean isValidName(String name) { + return name.matches("[a-zA-Z0-9_]+"); + } + + private static String generateRandomName() { + Random rand = new Random(); + int nameLength = rand.nextInt(12) + 4; + StringBuilder nameBuilder = new StringBuilder(); + + for (int i = 0; i < nameLength; i++) { + char randomChar = (char) (rand.nextInt(26) + 'a'); + nameBuilder.append(randomChar); + } + + return nameBuilder.toString(); + } + + private static boolean isNameAlreadyTaken(String name) { + return World.getInstance().getPlayers().stream().anyMatch(player -> player.getFakeName().equals(name)); + } + + @Override + protected void onExit(Creature character) + { + character.setInsideZone(ZoneId.SOLO, false); // Solo zone + character.setInsideZone(ZoneId.NO_STORE, false); // Allow making a store + character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, false); // Allow summon + + if (character instanceof Player) + { + final Player player = (Player) character; + + if (player.getFakeName() != null) + { + player.setFakeName(null); + } + + player.sendPacket(SystemMessageId.LEFT_COMBAT_ZONE); + { + if(!player.isInObserverMode() && player.getPvpFlag() > 0) + PvpFlagTaskManager.getInstance().add(player, Config.PVP_NORMAL_TIME); + + player.sendPacket(new EtcStatusUpdate(player)); + player.broadcastUserInfo(); + } + } + } + + public String getName() + { + return _name; + } + + public Location getLoc() + { + if (_locations.isEmpty()) + { + return null; // Αν η λίστα είναι κενή, επιστρέφουμε null + } + return _locations.get(Rnd.get(0, _locations.size() - 1)); // Επιλέγουμε τυχαία τοποθεσία + } +} diff --git a/java/net/sf/l2j/gameserver/GameServer.java b/java/net/sf/l2j/gameserver/GameServer.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/GameServer.java if (Config.ALLOW_FISH_CHAMPIONSHIP) FishingChampionshipManager.getInstance(); + StringUtil.printSection("Custom Features"); + SoloZoneTaskManager.getInstance(); StringUtil.printSection("Handlers"); LOGGER.info("Loaded {} admin command handlers.", AdminCommandHandler.getInstance().size()); diff --git a/java/net/sf/l2j/gameserver/GameServer.java b/java/net/sf/l2j/gameserver/Shutdown.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/Shutdown.java // disconnect players try { disconnectAllPlayers(); LOGGER.info("All players have been disconnected."); } catch (Exception e) { // Silent catch. } + // Restore real names for players in SoloZone + restoreRealNamesInSoloZone(); // stop all threadpolls ThreadPool.shutdown(); try { LoginServerThread.getInstance().interrupt(); } catch (Exception e) { // Silent catch. } // avoids new players from logging in if (_secondsShut <= 60 && LoginServerThread.getInstance().getServerType() != ServerType.DOWN) LoginServerThread.getInstance().setServerType(ServerType.DOWN); _secondsShut--; Thread.sleep(1000); } } catch (InterruptedException e) { } } + // This method restores the real names of players in SoloZone + private static void restoreRealNamesInSoloZone() + { + for (Player player : World.getInstance().getPlayers()) + { + // Check if player is inside the SoloZone + if (player.isInsideZone(ZoneId.SOLO)) + { + // Restore the real name by removing the fake name + if (player.getFakeName() != null) + { + player.setFakeName(null); // Restore the real name + LOGGER.info("Player {}'s fake name has been removed and real name restored.", player.getName()); + } + } + } + } private static void sendServerQuit(int seconds) { World.toAllOnlinePlayers(SystemMessage.getSystemMessage(SystemMessageId.THE_SERVER_WILL_BE_COMING_DOWN_IN_S1_SECONDS).addNumber(seconds)); } diff --git a/java/net/sf/l2j/gameserver/enums/ZoneId.java b/java/net/sf/l2j/gameserver/enums/ZoneId.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/enums/ZoneId.java public enum ZoneId { PVP(0), PEACE(1), SIEGE(2), MOTHER_TREE(3), CLAN_HALL(4), NO_LANDING(5), WATER(6), JAIL(7), MONSTER_TRACK(8), CASTLE(9), SWAMP(10), NO_SUMMON_FRIEND(11), NO_STORE(12), TOWN(13), HQ(14), DANGER_AREA(15), CAST_ON_ARTIFACT(16), NO_RESTART(17), SCRIPT(18), - BOSS(19), + BOSS(19), + SOLO(20); private final int _id; private ZoneId(int id) { _id = id; } diff --git a/java/net/sf/l2j/gameserver/network/serverpackets/Die.java b/java/net/sf/l2j/gameserver/network/serverpackets/Die.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/serverpackets/Die.java if (creature instanceof Player) { Player player = (Player) creature; - _allowFixedRes = player.getAccessLevel().allowFixedRes(); + _allowFixedRes = player.getAccessLevel().allowFixedRes() || player.isInsideZone(ZoneId.SOLO); _clan = player.getClan(); } diff --git a/java/net/sf/l2j/gameserver/model/actor/Player.java b/java/net/sf/l2j/gameserver//model/actor/Player.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java // Attacker or spectator logging into a siege zone will be ported at town. if (player.isInsideZone(ZoneId.SIEGE) && player.getSiegeState() < 2) player.teleportTo(TeleportType.TOWN); + if (player.isInsideZone(ZoneId.SOLO)) + { + ThreadPool.schedule(() -> { + Location exitLocation = VoiceExitSoloZone.getExitLocation(); + + if (exitLocation != null) + { + player.teleportTo(exitLocation.getX(), exitLocation.getY(), exitLocation.getZ(), 0); + player.sendMessage("You have been moved to the exit of the SoloZone."); + } + }, 5000); // 5000 milliseconds (5sec) + } diff --git a/java/net/sf/l2j/gameserver/model/actor/Player.java b/java/net/sf/l2j/gameserver/model/actor/Player.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/model/actor/Player.java @Override public void doRevive() { super.doRevive(); stopEffects(EffectType.CHARM_OF_COURAGE); sendPacket(new EtcStatusUpdate(this)); getStatus().setCpHpMp(getStatus().getMaxCp(), getStatus().getMaxHp(), getStatus().getMaxMp()); _reviveRequested = 0; _revivePower = 0; if (isMounted()) startFeed(_mountNpcId); + if (isInsideZone(ZoneId.SOLO)) + { + // Give Nobless (1323 ID) + L2Skill no = SkillTable.getInstance().getInfo(1323, 1); + no.getEffects(this, this); + sendMessage("You have received the Nobless status in the Solo Zone."); + } + }   If anyone thinks the code is wrong, please make an update and upload it here so I can update the post. A part was edited with chatgpt
    • Always remember, when you buy files, just compare with my files that I publish for free. and you will know that you are being ripped off. Greetings to all community!!! 🙂
  • Topics

×
×
  • Create New...