Jump to content

Recommended Posts

Posted

Fortresses: Basic Informations, Sieges, Residence Skills & Benefits

 

A fortress is a small residential clan area, similar to a clan hall. It can be acquired by winning a fortress siege. Depending on their location, fortresses are either border or territory fortresses, large or small.

 

One or two fortresses are located in each territory. Each fortress can choose to be politically involved with, or independent from, the castle(s) in that territory.

Each fortress on the map has a colored flag next to it. A blue flag denotes a territory fortress, and a red flag denotes a border fortress.

General fortress information can be accessed by clicking on the World Info portion of the Map (Alt+M), located in the upper right hand corner of the window. Clicking on this button will display a slide-out window with tabs. Clicking on the Fortress Info tab will show a complete list of all fortresses, including their name, occupying clan, current status and time held.

Clicking on any name in the list will show the fortress location on the map. A red and white checkered shield will pinpoint the location. Hoovering over this shield with your cursor will show quick information, including whether the property is at war or at peace, and the name of the owning clan. If you hoover over the map icon during a siege, the shield will display how many camps have been taken.

 

Basic Rules

 

Similar to clan halls, fortresses serve as a clan residence. A clan that owns a fortress can register to siege castles and other fortresses, and can claim ownership of them if they win. If the clan owns an existing fortress, their previous residence becomes inhabited and controlled by NPCs upon claiming ownership of the new fortress.

One clan can own either a castle or a fortress (but not both). A clan that owns a castle or the fortress may also own a clan hall at the same time.

A clan that owns a fortress can establish a political connection with the clan that owns the castle in that territory.

A Blood Oath can be obtained through the occupation of a fortress. The Blood Oath can raise the clan’s reputation and level.

While a clan’s fortress is under a siege, the clan cannot acquire ownership of other fortresses, even if they capture another fortress’s flag.

Seventy-five hours after you take possession of a fortress, possession will be lost to the rebel army.

You cannot register for the fortress siege 2 hours prior to rebel army attack.

The fortress foreman has been changed to show the remaining time until the rebel army invades, information about the fortress, and the contract situation with the area harvest.

 

Siege

 

General fortress siege rules are similar to castle siege rules. Participants are classified into three groups: friendly party, enemy party, and nonpartisan.

For attackers, the alliance and the clan members are classified as part of the friendly party. All other members that signed up for the siege are classified as part of the nonpartisan group.

Once a fortress siege starts, defenders are indicated by a shield icon over their head, while attackers has are indicated by a sword icon.

Players can attack enemies and nonpartisan without holding down the Control Key. Attacking friendly members is not allowed.

 

A fortress siege lasts for one hour, and can occur as often as every four hours, for 24 hours a day.

Once the Combat Flag is raised on a flag pole, the fortress siege ends.

A fortress siege begins 60 minutes after the first clan registers.

 

Siege Registration

 

The fortress siege registration procedure is similar to castle siege registration. A clan that is level 4 or higher can sign up to siege a fortress by talking to the Suspicious Merchant NPC near that fortress.

 

The first clan that signs up to siege a fortress must pay a participation fee of 250,000. Once this fee is paid, any other clans that wish to participate in the siege do not have to pay the participation fee.

 

After the participation fee is paid, all other clans that wish to participate have 50 minutes to sign up.

 

The siege registration can be canceled within 50 minutes of the initial siege sign-up.

 

Once the 50-minute time period for sign-ups has elapsed, the Suspicious Merchant will disappear. A 10-minute countdown will begin, after which the fortress siege will start.

 

If the fortress under siege is owned by a clan, that clan is automatically registered as defenders.

 

Siege Start

 

When a fortress siege begins, the area around the fortress will change to a combat field. Registered clans can establish a headquarters on that combat field. When the siege begins, all fortress doors close and designated guard NPCs are placed.

If a fortress is owned by a clan, the level of the guard NPCs and various defending functions are affected by the Fortress Defense Level. Also, a Mercenary Captain NPC will appear outside the fortress. This NPC must be protected by the attacking clans.

 

There are three to five NPC camps (depending on the fortress size) located inside the fortress. The five camps include the Officer’s Barracks, Control Room, Archer Unit, Guard Camp and Support Unit. The Command Barracks will be located in the center of the various camps.

If all of the camps are captured within 10 minutes of capturing the first camp, the Command Barrack ’s door will automatically open. To capture a camp, you must kill each camp’s Commander NPC. In a large fortress, you must shut off the power in the Control Room.

 

A clan can use Ballista Bombs to destroy the ballista inside the fortress; destroying ballistas will gain the attacking clan a certain amount of clan reputation.

 

After the capture of the first camp, if the attackers fail to capture the other camps within 10 minutes, each camp’s Commander NPC will reappear and the players must kill the Commander NPCs all over again.

 

If all the camps are successfully captured within the time limit, the door to the Command Barracks will open and the Combat Flags will appear inside of the camp.

 

If the fortress is owned by a clan, the Mercenary Captain must survive until all the camps are successfully captured in order for the Combat Flags to appear. A total of three Combat Flags will appear. When a player acquires one of the Combat Flags, it is automatically equipped. If a character who is holding a flag dies, that flag will be returned to its original location.

Once players acquire the Combat Flags, their speed and various combat stats will be reduced. They will also automatically receive an active skill that allows them to place the Combat Flag in the flag pole. The flag pole is located at the top of the Command Camp. If the clan succeeds in raising the Combat Flag by using the Display Flag skill, that clan will win the siege and claim the fortress.

 

When a fortress is claimed, a Special Envoy from that territory’s castle will appear inside of the Command Camp. For territory fortresses, only a Special Envoy from that territory’s castle appears. If the fortress is a border fortress, Special Envoys from all of the neighboring territory’s castles will appear. Once a clan gains ownership of a Territorial Fortress, the clan leader can choose to either swear fealty to that territory’s castle or declare their independence.

A clan that claims ownership of a border fortress may only declare independence.

 

Control Room

 

In addition to placing Combat Flags, the other way to claim a fortress is to shut down the Control Room. In large fortresses, you must shut down the Control Room, defeat all barrack Captains, and place the flag. Once you place the flag, the victory is yours! (Only large fortresses have a Control Room.)

After shutting down all of the Sub Power Systems around the Control Room, a member with the Access Card can open the Control Room door.

The Access Card can be obtained from Dwarven Gunnery Sergeants around the Control Room.

The attempt to shut down a Sub Power System must be made when the system’s HP is low. Only Maestros and Warsmiths can shut down the Sub Power Systems. A three-digit password is required to activate the controls in the Control Room. Any class can enter a password, but Maestros and Warsmiths can find the password easier. If an incorrect password is entered a certain number of times, the controls will be temporarily disabled.

Once all of the Sub Power System are shut down, and the main power has been shut off in the Control Room, the clan must only defete the barrack Captains and place to flag in order to claim the fortress.

 

Political Activities

 

Nonpartisan State

 

At the time of victory, the Special Envoy NPC(s) will appear and wait up to one hour for the clan leader’s decision. During this waiting period, the fortress is considered to be in a nonpartisan state.

When a fortress is in a non-partisan state, the fortress defense-related features and instanced dungeon can not be used; however, some other features can be used and reputation benefits can be obtained from the Foreman NPC.

 

Independent State

 

A fortress will shift into an independent state when the fortress-owning clan leader decides to declare independence, or if no decision is made during the one hour that the Special Envoy NPC is present.

When a fortress is in an independent state, it is possible for a castle-owning clan in the same territory to register a siege upon that fortress.

Fortresses that are independant cannot upgrade the fortress defense features by speaking to the Guard Captain NPC.

When a fortress is independent, the ability to monitor the fortress defense status by speaking to the Logistics Officer NPC is restricted.

When a fortress is independent, supply items from the territory’s castle will be unavailable (not earned).

An independent fortress can enter their Fortress Dungeon by speaking to the Detention Camp Warden.

 

Contracted State

 

A fortress enters a contracted state when the fortress-owning clan decides to swear fealty to the territory’s castle by speaking to the Special Envoy NPC.

When a fortress becomes contracted, the fortress-owning clan must pay a tax to the territory’s castle every six hours. The taxes are automatically deducted from the Clan Warehouse.

If the fortress-owning clan does not have enough Adena in their Clan Warehouse, the state of the fortress automatically switches from contracted to independant.

When a fortress is contracted, all of the fortress-management features can be used; however, entry into the instanced dungeon will be restricted.

When a fortress is contracted, the fortress-owning clan can receive supply items by speaking to the Logistics Officer NPC. The supply items level will be increased every six hours when taxes are paid.

For every supply item delivery, two Clan Reputation Points will be deducted from the castle-owning clan.

If the castle-owning clan’s Reputation Points drop below two points, the supply item level will stop increasing and the leader of the fortress-owning clan will be notified by the system message.

The supply items level can increase up to level six.

If the fortress-owning clan receives Supply Items from the Logistic Officer NPC, the supply items level resets to zero.

The castle-owning clan can use the instanced dungeon within their castle if there is a fortress in their territory that they are in a contracted state with.

 

Fortress Features

 

Recovery, teleport, and support magic features can be activated by talking to the Foreman NPC. The Clan Warehouse can also be accessed from this NPC.

Various items such as Shirts, Talismans and Bracelets can be purchased from the Supply Unit Captain. Knight’s Epaulettes are used to purchase these items. Sub units skills are also acquired through this NPC.

Regardless of the political status (sworn fealty or independence) of the fortress, the fortress-owning clan receives Blood Oathes from the Logistics Officer NPC for every six hours that the fortress is owned.

If a fortress swears fealty to a castle, additional defense-related functions can be activated by talking to the Guard Captain NPC.

If a fortress swears fealty to a castle, the fortress-defending NPCs can be strengthened and supplies can be purchased from the Logistics Officer NPC.

Independent fortresses (those that have not sworn fealty to any castle) can enter an underground prison (instanced dungeon) by talking to the Detention Camp Warden NPC.

 

Fortress Prison (Instanced Dungeon)

 

When a fortress is independent, the Detention Camp Warden NPC can grant access to the Fortress Dungeon. Regardless of political status (sworn fealty or independent), the Warden can also issue a special Fortress Dungeon-related quest. In order for a party to enter, each member must have this quest.

The Fortress Dungeon can be entered by a party consisting of more than two members. The entrance request must be made by the party leader. The party leader must belong to the fortress controlling clan.

The Fortress Dungeon can be entered every four hours and cannot be entered by more than one party at the same time.

If a character restarts or logs out inside of the Fortress Dungeon, that character is moved back out to the entrance NPC.

The Raid Bosses inside of the Fortress Dungeon will disappear if they are not attacked by the players within 10 minutes of entering the instanced dungeon.

If the Fortress Dungeon Raid Boss is successfully defeated, the party will receive the Dungeon Leader Mark item which then can be traded for a Knight’s Epaulettes.

 

Rewards

 

When a clan succeeds at taking over a fortress, that clan earns 100 Clan Reputation Points. Losing ownership of a fortress does not result in any loss of Clan Reputation Points.

Once a clan claims a fortress, the clan’s Reputation Level will increase every six hours. Also the “Blood Oath” can be obtained from the Logistics Officer NPC.

During a fortress siege, Knight’s Epaulettes can be obtained from a Defender NPC or a Commander NPC.

If Blood Alliance, Blood Oath, or Knights Epaulette are taken to Clan Merchants Ilia or Hulia, they can be traded for a certain amount of clan reputation points.

 

Residential Skills

 

A fortress owner obtains residential skills automatically. Residential skills are applied to all clan units except the clan Academy.

Upon winning a fortress, two residential skills are automatically acquired, and for the Western Fortress a total of three residential skills can be obtained.

When a clan loses a fortress, the acquired residential skills will disappear.

 

Aaru Fortress - Small Border Fortress

Skills: Max MP, MP Regeneration

Town Teleports: Giran, Heine

Other Ports: Dragon Valley, Tanor Canyon, Garden of Eva, Center of Alligator Island

 

Antharas’ Fortress - Large Border Fortress

Skills: Matk, Advanced Shield

Town Teleports:

Other Ports:

 

Archaic Fortress - Small Territory Fortress

Skills: Max HP, Resist Sleep

Town Teleports: Schuttgart

Other Ports: Crypts of Disgrace, Plunderous Plains, Den of Evil, Frozen Labyrinth

 

Bayou Fortress - Large Territory Fortress

Skills: Might, Matk

Town Teleports: Aden

Other Ports: Ancient Battlegrounds, Blazing Swamp, Enchanted Valley North & South

 

Borderland Fortress - Large Territory Fortress

Skills: Clan Luck, Max CP

Town Teleports:

Other Ports:

 

Cloud Mountain Fortress - Large Border Fortress

Skills: Clan Luck, ???

Town Teleports:

Other Ports:

 

Demon Fortress - Small Border Fortress

Skills: Max CP, CP Regeneration

Town Teleports: Goddard, Rune

Other Ports: Wall of Argos, Forge of the Gods Entrance, Swamp of Screams, Vally of Saints

 

Dragonspine Fortress - Small Border Fortress

Skills: MDef, Resist Water/Wind

Town Teleports: Dion, Oren

Other Ports: Ant Nest, Windawood Manor, Sea of Spores, Ancient Battlegrounds

 

Floran Fortress - Large Border Fortress

Skills:

Town Teleports:

Other Ports:

 

Hive Fortress - Small Territory Fortress

Skills: Evasion, Resist Fire/Earth

Town Teleports:

Other Ports:

 

Hunter’s Fortress - Large Border Fortress

Skills: Evasion, PAtk

Town Teleports: Aden, Giran

Other Ports: Enchanted Valley North, Blazing Swamp, Dragon Valley, Tanor Canyon

 

Ivory Fortress - Small Territory Fortress

Skills: CP Regeneration, Resist Hold

Town Teleports: Oren

Other Ports: Sea of Spores, Ancient Battlegrounds, Enchanted Valley North & South

 

Monastic Fortress - Small Border Fortress

Skills: Max HP, HP Regeneration

Town Teleports:

Other Ports:

 

Narsell Fortress - Small Territory Fortress

Skills: Max HP, Resist Sleep

Town Teleports:

Other Ports:

 

Shanty Fortress - Small Territory Fortress

Skills: Max HP, Advanced Block

Town Teleports: Gludio

Other Ports: Runes of Agony, Runes of Despair, Ant Nest, Windawood Manor

 

Southern Fortress - Large Territory Fortress

Skills: Resist Wind/Water, Advanced Block

Town Teleports: Gludio

Other Ports: Ruins of Agony & Despair, Ant Nest, Windawood Manor

 

Swamp Fortress - Large Territory Fortress

Skills: Guidance, PDef

Town Teleports: Rune

Other Ports: Vallay of Saints, Swamp of Screams, Forrest of the Dead, WildBeast Pastures

 

Tanor Fortress - Small Border Fortress

Skills: Movement, Resist Fire & Earth

Town Teleports: Giran, Dion

Other Ports: Ant Nest, Windawood Manor, Dragon Valley, Tanor Canyon

 

Valley Fortress - Large Territory Fortress

Skills: MP Regeneration, Resist Stun

Town Teleports: Giran

Other Ports: Devils Isle, Breka Stronghold, Dragon Valley, Tanor Canyon

 

Western Fortress - Large Border Fortress

Skills: Clan Luck, PDef, Advanced Shield

Town Teleports:

Other Ports:

 

White Sands Fortress - Small Territory Fortress

Skills: Max MP, MDef

Town Teleports: Heine

Other Ports: Fields of Silence (West) & Whispers (East), Center of Alligator Island, Inside Garden of Eva

 

thnx u again!I hope u like and this my giude! :D

  • 1 month later...
Posted

nice, but pasted from lineage2.com

thnx u again!I hope u like and this my giude! :D

 

Its funny , really! I love to see failed kiddos like you claiming guides for their own when they didn't even read it xD.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • 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...