Jump to content

MarGaZeaS

Members
  • Posts

    1,288
  • Joined

  • Last visited

  • Days Won

    27
  • Feedback

    0%

Posts posted by MarGaZeaS

  1. 6 hours ago, TheDarknessFear said:

    Server owners,

    Top.MaxCheaters.com is now live and accepting Lineage 2 server listings.

    There is no voting, no rankings manipulation, and no paid advantages. Visibility is clean and equal, and early listings naturally appear at the top while the platform grows.

    If your server is active, it should already be listed.

    Submit here

    👉https://Top.MaxCheaters.com

    This platform is part of the MaxCheaters.com network and is being built as a long-term reference point for the Lineage 2 community.


    MaxCheaters.com Team

    already added thanks you 🙂

    • Like 1
  2. reg-your-discord.png

    🏰 Clan Donations System – Power Through Unity
    This system allows clan members to support their clan directly through donations, turning contribution into strength.

     

    How it works:
    Every donation made by a clan member is automatically listed in the clan donation panel.
    Each donation is permanently linked to the clan — no loss, no reset.
    The Clan Leader manages rewards manually for full transparency.

     

    🎁 Clan Donation Rewards
    For every donation:
    The clan receives 5% Real Money or 10% Donate Coins
    (Leader chooses how the reward is given)

     

    📌 After the reward is delivered, the donation is marked as PAID in the system.
    🧾 Full Transparency
    Player name
    Donation amount
    Reward value (Real / Donate Coins)
    Date & status (Pending / Paid)

     

    Everything is visible.
    Everything is tracked.
    Nothing is forgotten.

     

    ⚔️ Support your clan. Strengthen your alliance.
    Power is built — not given.

     

    https://www.l2dead.com/

    https://discord.gg/TGnATuZmdt

  3. 🎉 L2Dead StuckSub - GRAND OPENING 14 February 2026🎉


    After beta, testing, mistakes, laughs and a lot of PvP, the moment has finally come.
    L2Dead StuckSub is officially opening its gates on 14 February 2026.

     

    ⚔️What to expect:
    ✦Main Class +6 Stuck Sub system
    ✦Balanced PvP & custom party farm areas
    ✦Custom events, bosses and strong rewards
    ✦Competitive clan scene with castle rewards

     

    📌Until the opening:
    ✦Create your clans and register them in the Clan-Register channel
    ✦Invite your friends / old parties / CPs
    ✦Stay tuned for more information (rates, events, siege times, etc.)

     

    Get your setups ready, prepare your macros and your Discord/voice.
    On 14 February 2026 20:00 GMT+2, we write the first chapter of L2Dead together. 🔥

    https://www.l2dead.com/

    https://discord.gg/TGnATuZmdt

    spacer.png

  4. 🎉 L2NeverPain StuckSub - GRAND OPENING 12 December 2025🎉


    After beta, testing, mistakes, laughs and a lot of PvP, the moment has finally come.
    L2NeverPain StuckSub is officially opening its gates on 12 December 2025.

     

    ⚔️What to expect:
    ✦Main Class +2 Stuck Sub system
    ✦Balanced PvP & custom party farm areas
    ✦Custom events, bosses and strong rewards
    ✦Competitive clan scene with castle rewards

     

    📌Until the opening:
    ✦Create your clans and register them in the Clan-Register channel
    ✦Invite your friends / old parties / CPs
    ✦Stay tuned for more information (rates, events, siege times, etc.)

     

    Get your setups ready, prepare your macros and your Discord/voice.
    On 12 December 2025 20:00 GMT+2, we write the first chapter of NeverPain together. 🔥

    https://l2neverpain.com/
    https://discord.gg/kNP3UXgkmN

    spacer.png

  5. 55 minutes ago, cheto45 said:
    package custom.events.RandomZoneEvent;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.concurrent.ScheduledFuture;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    
    import org.l2jmobius.commons.threads.ThreadPool;
    import org.l2jmobius.commons.time.SchedulingPattern;
    import org.l2jmobius.commons.time.TimeUtil;
    import org.l2jmobius.commons.util.IXmlReader;
    import org.l2jmobius.gameserver.managers.ZoneManager;
    import org.l2jmobius.gameserver.model.StatSet;
    import org.l2jmobius.gameserver.model.actor.Creature;
    import org.l2jmobius.gameserver.model.actor.Npc;
    import org.l2jmobius.gameserver.model.actor.Player;
    import org.l2jmobius.gameserver.model.quest.Event;
    import org.l2jmobius.gameserver.model.zone.ZoneId;
    import org.l2jmobius.gameserver.model.zone.ZoneType;
    import org.l2jmobius.gameserver.model.zone.type.RandomZone;
    import org.l2jmobius.gameserver.util.Broadcast;
    
    /**
     * Random Zone Event - Activates one random PvP zone temporarily. No modifica la clase de la zona: usa flags PvP en runtime.
     * @author Juan
     */
    public class RandomZoneEvent extends Event
    {
    	private static final String CONFIG_FILE = "data/scripts/custom/events/RandomZoneEvent/config.xml";
    	
    	private static int EVENT_DURATION_MINUTES = 15;
    	
    	private static boolean _isActive = false;
    	private ScheduledFuture<?> _eventTask = null;
    	
    	private final List<ZoneType> _availableZones = new ArrayList<>();
    	private ZoneType _activeZone = null;
    	
    	public RandomZoneEvent()
    	{
    		loadConfig();
    		loadZones();
    		registerZoneListeners();
    	}
    	
    	/**
    	 * Registra listeners a TODAS LAS ZONAS random
    	 */
    	private void registerZoneListeners()
    	{
    		for (ZoneType zone : _availableZones)
    		{
    			addEnterZoneId(zone.getId());
    			addExitZoneId(zone.getId());
    			LOGGER.info("[RandomZoneEvent] Registered listener for zone: " + zone.getName());
    		}
    	}
    	
    	private void loadConfig()
    	{
    		new IXmlReader()
    		{
    			@Override
    			public void load()
    			{
    				parseDatapackFile(CONFIG_FILE);
    			}
    			
    			@Override
    			public void parseDocument(Document doc, File file)
    			{
    				forEach(doc, "event", eventNode ->
    				{
    					final StatSet att = new StatSet(parseAttributes(eventNode));
    					final String name = att.getString("name");
    					
    					for (Node node = eventNode.getFirstChild(); node != null; node = node.getNextSibling())
    					{
    						if ("schedule".equals(node.getNodeName()))
    						{
    							final StatSet attributes = new StatSet(parseAttributes(node));
    							final String pattern = attributes.getString("pattern");
    							final SchedulingPattern schedulingPattern = new SchedulingPattern(pattern);
    							
    							final StatSet params = new StatSet();
    							params.set("Name", name);
    							params.set("SchedulingPattern", pattern);
    							
    							final long delay = schedulingPattern.getDelayToNextFromNow();
    							getTimers().addTimer("Schedule_" + name, params, delay + 5000, null, null);
    							LOGGER.info("[RandomZoneEvent] Event " + name + " scheduled at " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay));
    						}
    					}
    				});
    			}
    		}.load();
    	}
    	
    	private void loadZones()
    	{
    		for (ZoneType zone : ZoneManager.getInstance().getAllZones(RandomZone.class))
    		{
    			if ((zone.getName() != null) && zone.getName().toLowerCase().startsWith("random_zone"))
    			{
    				_availableZones.add(zone);
    				LOGGER.info("[RandomZoneEvent] Loaded zone: " + zone.getName() + " (id=" + zone.getId() + ")");
    			}
    		}
    		
    		LOGGER.info("[RandomZoneEvent] Total random zones loaded: " + _availableZones.size());
    	}
    	
    	@Override
    	public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
    	{
    		if (event.startsWith("Schedule_"))
    		{
    			eventStart(null);
    			
    			final SchedulingPattern schedulingPattern = new SchedulingPattern(params.getString("SchedulingPattern"));
    			final long delay = schedulingPattern.getDelayToNextFromNow();
    			
    			getTimers().addTimer(event, params, delay + 5000, null, null);
    			
    			LOGGER.info("[RandomZoneEvent] Rescheduled for " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay));
    		}
    	}
    	
    	@Override
    	public boolean eventStart(Player eventMaker)
    	{
    		if (_isActive)
    		{
    			if (eventMaker != null)
    			{
    				eventMaker.sendMessage("RandomZoneEvent already active.");
    			}
    			return false;
    		}
    		
    		if (_availableZones.isEmpty())
    		{
    			Broadcast.toAllOnlinePlayers("[RandomZoneEvent] No zones configured.");
    			return false;
    		}
    		
    		_isActive = true;
    		Broadcast.toAllOnlinePlayers(" Random Zone Event has started!");
    		
    		_eventTask = ThreadPool.schedule(this::activateRandomZone, 5_000);
    		return true;
    	}
    	
    	private void activateRandomZone()
    	{
    		_activeZone = _availableZones.get(new Random().nextInt(_availableZones.size()));
    		
    		_activeZone.setEnabled(true);
    		
    		Broadcast.toAllOnlinePlayers(" Random Zone Event: " + _activeZone.getName() + " is now PvP for " + EVENT_DURATION_MINUTES + " minutes!");
    		
    		_eventTask = ThreadPool.schedule(this::eventStop, EVENT_DURATION_MINUTES * 60 * 1000L);
    	}
    	
    	@Override
    	public boolean eventStop()
    	{
    		if (!_isActive)
    		{
    			return false;
    		}
    		
    		_isActive = false;
    		
    		if (_eventTask != null)
    		{
    			_eventTask.cancel(true);
    			_eventTask = null;
    		}
    		
    		if (_activeZone != null)
    		{
    			_activeZone.setEnabled(false);
    			Broadcast.toAllOnlinePlayers(" Random Zone Event ended. " + _activeZone.getName() + " is back to normal.");
    			_activeZone = null;
    		}
    		else
    		{
    			Broadcast.toAllOnlinePlayers(" Random Zone Event ended.");
    		}
    		
    		return true;
    	}
    	
    	@Override
    	public void onEnterZone(Creature creature, ZoneType zone)
    	{
    		if (!_isActive || (_activeZone == null))
    		{
    			return;
    		}
    		
    		if ((zone == _activeZone) && creature.isPlayable())
    		{
    			creature.setInsideZone(ZoneId.PVP, true);
    			
    			if (creature.isPlayer())
    			{
    				creature.sendMessage("Esta zona está en modo PvP temporalmente.");
    			}
    		}
    	}
    	
    	@Override
    	public void onExitZone(Creature creature, ZoneType zone)
    	{
    		if (!_isActive || (_activeZone == null))
    		{
    			return;
    		}
    		
    		if ((zone == _activeZone) && creature.isPlayable())
    		{
    			creature.setInsideZone(ZoneId.PVP, false);
    			
    			if (creature.isPlayer())
    			{
    				creature.sendMessage("Abandonaste la zona PvP temporal.");
    			}
    		}
    	}
    	
    	@Override
    	public boolean eventBypass(Player player, String bypass)
    	{
    		return true;
    	}
    	
    	@Override
    	public String onEvent(String event, Npc npc, Player player)
    	{
    		return super.onEvent(event, npc, player);
    	}
    	
    	@Override
    	public String onFirstTalk(Npc npc, Player player)
    	{
    		return null;
    	}
    	
    	public static void main(String[] args)
    	{
    		new RandomZoneEvent();
    	}
    }



    i have this but its not working

    what pack you use 
    send me on discord for it

  6. skill_image.png Client: Interlude
    improved.png Gameplay: Custom PvP With Special Bosses/PartyFarm/SoloZone etc
    transfer.png Class changes 1st, 2nd, 3rd: Free.
    improved.png Nobless: Barakiel or by item ->Barakiel Card
    members_pt.png Buffs 2 Hours
    pc.png Maximum clients per PC:Unlimited.
    learn.png Skill learning: Automatic.
    The server rates have been carefully adjusted to provide a balanced and competitive PvP experience. Farming and gearing up are streamlined to ensure players can focus on intense battles without excessive grinding. Drops, enchant rates, and economy are optimized to maintain fairness and keep the action engaging. Whether you prefer solo fights, mass PvP, or organized clan wars, the system is designed to keep the adrenaline high and the competition fierce!

    Rates Generales

    elemental.png Exp/Sp: PvP x9999 Start Lv80
    adena.png Adena: x9999(Custom)
    scroll.png
    Rates By Scrolls
    Enchant Level
    Success rate
    +0 → +4
    100% (Normal)
    +4 → +12
    75% (Blessed)
    +12 → +16
    Read Green Note (Crystal)
    Crystal -> +13 75% +14 70% +15 65% +16 50%
    Premium users have 5% more chance
    Ex: If +14 failed for +15, return +14
    We have an automatic events system that can be registered within the game using the .join for register and .leave for unregister or use npc in main town
    Only one character can be registered per PC.
    tvt.jpg

    Team Vs Team

    first.png Winner Team: 10 Event Card
    2nd.png Lost Team: 5 Event Card
    time.png TvT Times: 01:00 10:00 16:30 22:00
    korean.jpg

    Capture The Flag

    first.png Winner Team: 10 Event Card
    2nd.png Lost Team: 5 Event Card
    time.png CTF Times: 03:00 13:00 18:00 23:00
    dm.jpg

    Deathmatch

    first.png Winner: 20 Event Card
    time.png DM Times: 06:00 15:00 21:00 23:30
    The raid boss system of L2NeverPain is custom, and each boss respawns at a specific time based on the moment it is defeated
    rbs.jpg

    Grand Bosses

    valakas.png Grand Bosses: Respawn 8 Hours.
     

    Raid Bosses

    necklace.jpg Raids: Respawn: 1 Hours (All Grandbosses or Raidbosses zone is Flagzone)
    barakiel.jpg Barakiel: Respawn: 3 Hours (Bless your party with Noblesse)
    heroboss.png Hero Boss: Respawn: 3 Hours (Bless your party with Hero Stauts for 2 Hours)

    Drop System

    valakas.png Grand Bosses: 100% Ryknos Armor+Icarus Weapon Part/Agathion/Farm Coin/Adena/GB/LS/BOG/Custom Hat/Raid Token/Skin Token
    raidboss.png Raid Bosses: Farm Coin/Adena/GB/LS/Bog/Custom Hat/Raid Token
     
    Premium System
    Info Premium
    premium.jpg
    xp.png Exp/Sp (XP): x2
    sp.png Enchant Boost: +5%
    adena.png Drops: x2
    box.jpg Autofarm: .autofarm or by interface
    Premium users have access to change color name from community board (alt b)
    OLYMPIAD
    Olympiad Information
    Win the most battles of your class and proclaim yourself Hero!
    oly.jpg

    Olympiad Information

    • Weekly Olympiad
    • Heroes are announced every saturnday 24:00
    • The battles will take place from 18:00 p.m. to 24:00 p.m.
    • The minimum participant requirement to start a fight is 4 players

    Balance Information

    • A Grade Olympiad +6 (Automatic enchant gear +6)

     

     

     

    https://l2neverpain.com/

    https://discord.gg/kNP3UXgkmN

  7.  

    [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

    • Like 1
    • Thanks 2
  8. 3 hours ago, ShadowNetwork said:

     

    It's not really that deep mate, just something fun to play on for the people that aren't able to do it themselves. If people use it and report any issues found, cool, I'll likely update the files when issues are resolved. Otherwise, I'll continue working on it myself & having fun in the process.

    Couldn't care less about money, especially within the L2 scene.

    Hope this clears things up for you & anyone else with the same thought pattern.

    Very nice work, will you give source in the future?

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