Jump to content

Recommended Posts

Posted

Καθημερινά τα upload μας στους hosting server (rapidshare, gigasize etc) "πέφτουν" θύματα κάποιον επιτήδειων που θέλουν να βλάψουν το forum και τη δουλειά μας.

 

Καθημερινώς ψάχνουμε να βρούμε την καλύτερη λύση για να προστατέψουμε το υλικό μας και να μην χρειάζονται αυτά τα μαζικά upload.

 

Λύση στο πρόβλημα μας έρχονται να δώσουν τα container files τα οποία αποτελούν πακέτα από links τα οποία αποκρύπτουν το πλήρες download url το οποίο δίνουμε στους χρήστες για να κατεβάσουν τα αρχεία μας.

 

Σε αυτό εδώ τον οδηγό θα δούμε σε πρώτο στάδιο τι ρυθμίσεις πρέπει να κάνουμε στο πρόγραμμα ώστε να εισάγουμε τα premium στοιχεία του λογαριασμού μας και να κατεβάζουμε με τα ανάλογα δικαιώματα. Σε δεύτερο στάδιο θα παρουσιάσουμε πως μπορούμε να εισάγουμε link καθώς και container .dlc files για download στην ουρά. Και τέλος θα δούμε πως μπορούμε να δημιουργήσουμε τα δικά μας container .dlc files για να προστατέψουμε τα link μας.

 

Το πρόγραμμα JDownloader είναι freeware και μπορείτε να το κατεβάσετε από εδώ:

 

Επίσημο site:

 

http://jdownloader.org/download/index

 

Σημείωση: Το πρόγραμμα για να τρέξει απαιτεί κάποιο java runtime environment (jre ή jdk) σε έκδοση 1.5 ή μεγαλύτερη. Εάν δεν υπάρχει στο σύστημα μας θα σας γίνει η ανάλογη παραπομπή κατά την πρώτη εκκίνηση του προγράμματος.

 

Το πρόγραμμα δεν χρειάζεται κάποια εγκατάσταση απλά τρέχετε το .exe αρχείο που περιέχεται στο φάκελο που μόλις κατεβάσατε.

 

Έχουμε κατεβάσει λοιπόν το πρόγραμμα μας και το τρέχουμε για πρώτη φορά κατά την οποία ίσως μας ζητηθεί να κάνουμε κάποια update τα οποία είναι μεν προαιρετικά αλλά καλό είναι να γίνουν.

 

Επίσης να αναφέρουμε κάποια βασικά για το πρόγραμμα πριν εξηγήσουμε την διαδικασία του download. Το πρόγραμμα δουλεύει τόσο για premium όσο και για free χρήστες (φυσικά οι free χρήστες αντιμετωπίζουν και τους ανάλογους περιορισμούς που έχουν τεθεί από κάθε hoster). Από τις ρυθμίσεις μπορείτε να δώσετε τα premium στοιχεία του παροχέα που είστε κάτοχος για να αποφύγετε τους περιορισμούς. Επίσης από τις ρυθμίσεις μπορείτε να ορίσετε το download directory όπου θα κατεβαίνουν τα αρχεία (by default είναι ο φάκελος που περιέχει το πρόγραμμα).

1. Εισαγωγή rapidshare premium στοιχείων στο πρόγραμμα.

 

Αρχικά εφόσον τρέξουμε το εκτελέσιμο αρχείο και ανοίξει το πρόγραμμα θα δούμε την εξής εικόνα:

40532316.jpg

Στη συνέχεια αριστερά στην μπάρα εργαλείων επιλέγουμε Configuration -> Hosts

75634770.jpg

Κάνουμε διπλό click πάνω στο όνομα του rapidshare.com και μας ανοίγει στο κάτω μέρος του προγράμματος ένα παράθυρο για τις ρυθμίσεις του host. Πάμε στο πεδίο Premium Settings και εισάγουμε τα στοιχεία μας στα ανάλογα πεδία. Εάν όλα είναι οκ τότε θα επιβεβαιωθούν από ένα Status Ok message. Επίσης όπως μπορείτε να δείτε μπορείτε να εισάγετε στοιχεία για παραπάνω από έναν λογαριασμούς για απαιτητικούς χρήστες με πολλαπλά account.

57893159.jpg

2. Download ξεχωριστών αρχείων και container .dlc αρχείων.

 

 

Αρχικά ας δούμε πως μπορούμε να εισάγουμε τα ξεχωριστά link.

 

Επιλέγουμε-μαρκάρουμε όλα τα part του υλικού που θέλουμε να κατεβάσουμε και πατάμε αντιγραφή. Πάμε στη συνέχεια στο πρόγραμμα και αριστερά στην μπάρα εργαλείων επιλέγουμε τον LinkGrabber. Παρατηρούμε λοιπόν ότι έχει εισαχθεί ένα νέο πακέτο με όλα τα part καθώς και κάποιες πληροφορίες για αυτά. Προσοχή: Απαραίτητη προϋπόθεση για να εισαχθούν τα link στον LinkGrabber είναι να έχετε ενεργοποιημένη την επιτήρηση προχείρου. Ο έλεγχος της επιτήρησης του προχείρου γίνεται από 4ο εικονίδιο στην πάνω μπάρα του προγράμματος. Πρόκειται για το εικονίδιο με το τετράδιο. Φροντίστε να έχει γίνει ticked ώστε να είναι ενεργοποιημένο το monitor του clipboard.

96970351.jpg

Στη συνέχεια πατάμε δεξή click στο πακέτο ή πάμε στο ανάλογο πεδίο αριστερά στην μπάρα και επιλέγουμε Add Selected Packages. Εναλλακτικά μπορούμε να επιλέξουμε και Add All Packages σε περίπτωση που θέλουμε να βάλουμε για download όλα τα αρχεία.

44414664.jpg

Εάν τώρα από τις επιλογές του LinkGrabber έχετε επιλέξει να ξεκινάει αυτόματα το download μόλις γίνουν add τα αρχεία, θα έχει ξεκινήσει το κατέβασμα. Διαφορετικά πάμε αριστερά από την μπάρα στο Downloads και από το πρώτο εικονίδιο με σχήμα τριγώνου επιλέγουμε να ξεκινήσει το download.

 

 

Τώρα ας δούμε πως μπορούμε να κατεβάσουμε κάνοντας χρήση των container file.

 

Κατεβάζουμε το container file (το οποίο σε περίπτωση συμπίεσης πρέπει να αποσυμπιεστεί με το winrar) από το rapidshare.

 

Οπότε τώρα έχουμε στον υπολογιστή μας το container file.

 

Έχουμε ανοίξει το πρόγραμμα και από την αριστερή μπάρα πάμε πάλι στον LinkGrabber και επιλέγουμε Open Containers.

38820551.jpg

 

Ανοίγει έναν directory broswer οπότε βρίσκουμε τη διαδρομή του .dlc αρχείου και επιλέγουμε Open. Στη συνέχεια μεταφερόμαστε πάλι στον LinkGrabber οπότε ακολουθώντας την προηγούμενη διαδικασία κάνουμε add τα επιθυμητά πακέτα και ξεκινάμε το download τους.

 

Σημείωση: Για ακόμα μεγαλύτερη ευκολία μπορείτε να επιλέξετε να κατεβάσετε το .dlc αρχείο με τον JDownloader οπότε στον LinkGrabber θα σας εμφανιστούν κατευθείαν τα αρχεία του πακέτου για να τα προσθέσετε για download. Προσοχή το .dlc container file δεν πρέπει να είναι συμπιεσμένο διαφορετικά δεν δουλεύει.

English Translation

Often files we upload at hosting servers such as rapidshare, gigasize etc, are been deleted be certain people as an attempt to damage our work.

 

Constantly we were looking for a way to protect the files we upload in order to prevent them from been erased and re-uploaded again.

 

The solution for our problem is found at the container files which are packages that contain the links inside them, without giving any vital information about the actual links. In this way no one can erase them.

 

At the first stage we will see the steps we have to follow in order to add premium accounts to the program and by doing so be able to download with the privileges the premium users have. At the second stage we will see how to add regular links and container files (dlc) to the application in order to download them. At the end there are instruction how someone can create a container file to protect his/her own links.

 

JDownloader is a freeware and can be downloaded from here:

 

Official site:

http://jdownloader.org/download/index

 

Note: In order for the application to run there has to be installed at your system java runtime environment (jre or jdk), 1.5 edition or earlier. If there isn’t, when you run the application for the first time, it will prompt you to download and install it.

 

JDownloader needs no installation. You simply run the .exe file from the files you have downloaded.

 

At the first time you run the application you may be asked to perform some updates to the application. The updates are optional, but it’s a good idea to allow the application to perform this updates.

 

Let’s mention some basics about the application first. Jdownloader can download files from free users as well as premium users (however free users have to face the limitations each host has). At the configuration of the application you can add the premium account you may have at any free host to avoid this limitations. From the configuration of the application you can set the directory at which the files will be stored after download (by default it’s the folder that contains the application).

1. Adding rapidshare premium account.

 

At the first face, once we run the application we see the following screen:

40532316.jpg

Next at the left we choose Configuration -> Hosts

75634770.jpg

 

Double click at the rapidshare.com and it will open at the bottom of the application a new window with the settings of the host. At the field Premium Settings we enter our account(login and password) at the corresponding fields. If everything is OK then we will get a confirmation be the message  Account is Ok. Also if you have more than one account you may add them here by adding new account

 

57893159.jpg

2. Download separate files and container files .dlc

 

First let’s see how we can add separated links.

 

Select all the links we want to download and copy them. Then back to the application we go to the LinkGrabber which is located to the bar at the left. We can observe that the files have been added there with some information about the links.

Attention: In order for the links to be added automatically you need to have checked the option of clipboard observer. You can check it by the forth icon at the tools bar, the icon with the clip board on it. Make sure it has a teak on it in order for the application to “catch” the links on it’s own.

96970351.jpg

 

Next right click on the package, or from the bar at the left, we press Add Selected Packages. Or we can press Add All Packages in case we want all the packages to be added to the download list.

23i7att.jpg

Now if from the options of the LinkGrabber you have chosen to start the download automatically after the files have been added to the list, the application will start the download on its own. Otherwise, from the left bar we move to Downloads and from the first icon from the tools we press start button to begin downloading the files.

85808218.jpg

 

Now let’s see how we can download with container files.

 

We download the container file .dlc (in case it’s compressed in a rar file we need to extract it first with the winrar application) from the rapidshare (how you can download from rapidshare see here).

 

Now we have at our machine the container file

 

Again from the application left bar we go to LinkGrabber and choose Open Containers.

38820551.jpg

From the new window we find the folder with the dlc file and we open it. Next we are been brought back to LinkGrabber and by following the previews instruction we add the packages we want to download.

 

Note: For more simplicity if the dlc file is not compressed in a rar file, you can download it from the jdownloader. Automatically it will open the file after the download and put the links in LinkGrabber.

 

3. Creating container file .dlc

 

 

First we have to upload our files to a free host of our choosing. We copy the download links and automatically they will be added to the application and at LinkGrabber. If the links are not checked automatically by the application then we press the Continue button to create a package with the links.

 

28349197.jpg

 

Next we add the selected package and we move to Downloads field. There we will find your package. Right click on it and choose  Create DLC in order to save the new file.

98887392.jpg

 

At the new window we enter the name we want for the container file and the location to save it.

 

 

Note: The application offers many more options (such as reconnect for some router models, anticatpcha for some free hosts etc) which you can find easily from the settings of the application. For any other questions you can open a new thread to the appropriate help sections.

 

Credits: www.rulebreakers.net

Posted

[gr] mexri kapote to eixa kai dn mporesa na bgalo akri kai etsi to petaksa tora me afto to guide leo na to ksanadokimaso

 

ty gia to guide magaki!

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

    • [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!!! 🙂
    • Thank you for sharing. You are a capable and skilled person. Thank you again for your selfless dedication, Guytis🫡
    • he kept his promise! i think it's a good idea to unban his old account. he shares files with the community and could help both new and veteran l2off users! good job, Guytis!
  • Topics

×
×
  • Create New...