Jump to content

Recommended Posts

Posted (edited)

Hello,
Here is a tool created by me witch I want to share with you to get a more easy work on your l2off database management and player control. Here are the option from it:

Eidt: Modify settings.ini with you MSSQL info and CacheD_IP.ini, CacheD_Port,ini with your cached info and run aplication.
 

ALWAYS MAKE A BACK UP OF YOUR DATABASE FIRST

 

Change Log:
 

Option v4.7.1

-Fixed log read error at app start in Server Controler.

Option v4.7

- Added to 'Server Controler' following options:
. Option to create daily log file in log folder ( format: yyyyMMdd.txt) 
. Option to save in log files: starting/killing/restarting all applications with current date and time
. Option to open log files by name and log folder
- added excel header view to 'inventory view' excel export

Option v4.6

-added to 'Settings Button' option to add firewall rules (block/allow local ports)
-added to 'Iventory view' option to export to excel
-fixed at 'Server Creator' the update option

Option v4.5

-Fixed "Save NASC" option in GF AI Editor to correct format
-Fixed PCH Maker for GF (click 'C4 Format' for c4 ai (interlude) and leave blank for GF)
-Added Option to export in EXCEL at following at following viewrs:
+ Item Management> Search Item by unique id
+ Item Management> View Items Highes Amount By Item ID
+ Item Management> Top Item List> View Weapons/Armor Highest Enchant By item ID
-Aranged by categories main form button:
+Server Management Editor
+Account/Character SQL Options
+Char Iitem-Skills/Siege/Olympiad SQL edit and Client
 
Option v4.4.1

-Fixed odbc buttons. Was inverted.

Option v4.4

- added button 'Account Create GF' in Account Creator for Gracia final retail lin2db
- added options to AI seletion to close after AI editor is opened

Option v4.3

- added option to update account password from Account Creator
- added file ac_update.sql(This is for fix lin_createaccount error. Vanganth files has this included.)
- added option to Settings Editor to open odbc  x32 and 64
- Added to Cached the button 'Check Online Status' for verify if a character is offline or online
- added the AIEditorUI tool for Gracia final ai.obj Advext Compiler/decompiler  at button AI Editors with followint options:
1 load/save ai
2 read decompiled ai
3 read/save nasc file
4 compile nasc
5 search the code
REMEMBER: ADVEXT FILES ARE NOT SHARED WITH THIS . FOR THE FILES YOU NEED TO CONTACT THEM.
- updated settins.ini for new Gracia Final ai editor
- added highlighted buttons when started to Server Controler 
- fixed alot of crash bugs on some forms

Option v4.2

- Fixed at server controler the l2npc killer button. (When accessed returned on "Start" status the l2auth and not l2npc.) 
- Added L2 File Edit by Be3geBJIa3 with chronicle support from c4 to H5 (Was request by a friend.)
- Added to 'Server Creator' Option to updated a curent server by id.
- Fxied some minor gliches on some forms.
- Diasbled 'C1 Smeli section' till future tests on cached options.

Option v4.1

- Renamed button "CharNameEdit" to "Character Manager" and added the following options
1. View character PK/PVP points by name (requires server reboot)
2. Edit character PK/PVP points by name (requires server reboot)
- Added to button "Server Controler" the following options
1. Two more custom application console with killer by application name(for any kind of application). 
2. Added to settings.ini the new applications line
-Fixed in Ai editor:
1. File>New Class -  now works correct
2. Insert New Class - now closes after insert 

Option v4.0

-Renamed button "Process Killer" to "Server Controler" and added the following options:
1. Option to run sevrer files(hauthd, cached, l2logd, l2server, l2npc, l2com, petition)
You can set the folder path in the settings.ini for every file in part for auto load in application.
2. Option to self run server files if one or more files crashes . 
You can set time(in milliseconds) for auto restart if one or more files crash and save it in settings.ini
INFO: If you want to stop the auto restart just use the buttons up for process kill.

Option v3.9

-fixed pch issue for skilldata and npcdata for GF (I added manual_pch in DB folder so
 now you can copy skilldata/itemdata/npcdata in same forlder with the panel and settings )
-fixed AI crash issue (tested copy/inject/decompile/compile etc by me and works)

Option v3.8

-added at 'CharNameEdt' Option to view character name by char ID
-added to 'Item Managemet' option to view item enchant, amount , type by uniquie item_id (located in user_item)

Option v3.7

-added to button 'Account Create' following options:
1.Update exsiting account builder.

Option v3.6

-added option to upload the BanChar.html renamed:
. after you edit BanChar.html you can rename it and add it in settings.ini at HtmlName
. html editor still works on standard name: BanChar.html (don't modify inner structure)
-added status informer after every new char added in html (so you know if html is eddited without opening)
-added message informer after upload with filename you uploaded and ftp server (so you know if file is uploaded)

Option v3.5

-added in settins.ini FTP options
-added in CacheD->Character Ban option to make html with baned chars:
1. After ban fill the textboxes with your info.
2. Click button Save to be added in the BanChar.Html 
(INFO: do NOT edit the lines in the html , only the one you added)
3. Fill FTP info and click to upload in your FTP server

Option v3.4

-added button 'l2server.ini' with following options:
1.edit Conection settings (ip and port of: cached, auth,petition, logd, l2comm)
2.edit Rates (adena amount, item, spoil, exp, party exp)

Option v3.3

-fixed Cached option 'Add item to char' parameters (now should be displayed ok)
-Renamed 'Script Viewer' to 'Script Manager' and added following option:
1. Recipe maker with HTML maker for recipes

Option v3.2

-added viwer for itemdata.txt Freya/H5
-info: skilldata.txt and npcdata.txt viewer for Gracia Final works for Freya/H5 too (seems to be same script)

Option v3.1.1

-fixed siege time convertor
-added to 'Cached Option' - delete item from character
-fixed errors on skilldata viewer (interlude/gracia final)

Option v3.1

- added L2NPC killer at Process Killer section (was not in  v3.0 becasue some code issue that is fixed now)
- added at section 'Script View' the option:
1. view Interlude Npcdata.txt
2. view Gracia Fianl Npcdata.txt
1. view Interlude Skilldata.txt
2. view Gracia Fianl Skillata.txt
- added back at 'Account Creator' Builder Level 0 (for create normal chars)

Option v3.0
- added L2NPC killer at Process Killer section
- added siege time make in Siege Section
- added button 'Script View' with follwoing options:
1. view Interlude Itemdata.txt
2. view Gracia Fianl itemdata.txt
-added PCH maker for Item/Skill/Npcdata.txt (Interlude/Gracia Final)

Option V2.9

-fixed antivirus detection (is no virus but some of them detect some conection strings as virus)
-removed all ini files and added just one for all options "settings.ini"
-renamed "MSSQL Connection" button to "Settings Editor" with following options:
1. View/Modify MSSQL Connection options in ini file
2. View/Modify CacheD Connection options in ini file
-added Ai Editor (recoded by me) with following options:
1. Search Ai
2. View/Edit AI
3. Compile/DeCompile AI
4. Inject
5. Split
6. Find And Replace

Option v2.8

-fixed SA on item search
-added SuperPoint.bin Editor

Option v2.7

- Added new section " Npc/Skill/Item ID search" with option to search npc/skill/item id by name(updated from H5 retail)
- Added to "CacheD Options" follwoning proprieties:
1.Change Clan Level ( added to window option to view Clan Info by Clan name)
2. Move item to other Character( added to window option to view Account Name/ID and Chard ID by char name)
3. Character Punishment ( added to window option to view Account Name/ID and Chard ID by char name and all punised chars by name/type punish)

Option v2.6

-Removed Char Ban from "Ban Manager" section (is added to cached option)
-Renamed "Ban Manager" to "Ban Account"
-Added to "CacheD Options" the following options:
.Character Ban with following optons:
1. View all baned chars
2. View all eternal ban chars
3. Window option to view Account Name/ID and Chard ID by char name
4. Char Ban by hours (add 0 Hours for unban)
.Add Item to Character ( added to window option to view Account Name/ID and Chard ID by char name)
.Move Character to other Account ( added to window option to view Account Name/ID and Chard ID by char name)

Option v2.5
-Fixed char ban at " Ban Manager " section (now char gets ban correctly)
-Added to "Clan Manager" section option to view clan info for Gracia final servers and edit clan points.
-Added to "CacheD Options" the following options:
.Disable Character ( added to window option to view Account Name/ID and Chard ID by char name)
.Enable Character ( added to window option to view Account Name/ID and Chard ID by char name)
.Set Account Builder ( added to window option to view Account Name/ID and Chard ID by char name)
.Sell All Skills on Character ( added to window option to view Account Name/ID and Chard ID by char name)
.Add Skill on character ( added to window option to view Account Name/ID and Chard ID by char name)
.Delete skill from character ( added to window option to view Account Name/ID and Chard ID by char name)
.Eternal Character BAN ( added to window option to view Account Name/ID and Chard ID by char name)
.Delete Quest From Char ( added to window option to view Account Name/ID and Chard ID by char name and Quest view)

Option v2.4 
1. Added Button "CacheD Options" with following options:
- Announcement
- Kick Online Player
- Change Character Name (character must be offline)
- Send Home Character
- Delete Character (character must be offline)

Option V2.3.1

-Fixed clan hall owner change (now you can add clan hall to a clan by clan name and clan hall id)
-Added option to view/edit clan ruler
-Added option to view castle id (in Siege Manager Section)
-Added option to add castle to a clan by castle ID


Option v2.3

- At Siege Manager added option to view Castle ID too.

*Added button "Clan Manager" with following options:
-View/Edit Clan: Name/ID(view only)/Points/Castle(view only)/Level 
-View/Edit Clan Hall owner by clan ID.

Option v2.2
-Added button "Siege Manager" with following options:
1. View Next time siege
3. Castel owner
4. Tax rate 
5. Shop Income
6. Change Next siege time by castle name
- Changed "About" form
- Added "Lineaege II" logo for more friendly design

Option v2.1

-Added option to manage olympiad (added button "Olympiad Manager")
1. Option to view current heroes
2. Option to edit points and matches for current olympiad players

- Added button "Top List Items" with following options:

1. Option to view by item id the bigest amount in server
2. Option to view bigest enchant in server by item id

Option v2.0

- button "Item Search By ID" is renamed to " Item Management" and added folowing options:
1. Delete Item from character by char ID
2. Delete Item from World by item id

- Added butto " Delete Character"
1. Option to delete character data from lin2world DB by table where data is saved

Option v1.9

- removed MSSQL connection test from Ban Manager ( is already a option for that in app)
- optimised forms for a better look and a easeyer way to work

Option v1.8

1. Added button " Procees Killer"
-option that kills following proces to avoid looking for it in Task Manager:
* L2Server
* CacheD
* L2Comm
* PetitionD
* L2Log


Option v1.7

1.Added button "Account Creator"
- option to create account with builder status (value between: 0-9)

Option v1.6:

1.Added button "Server Creator"
- option to create server in lin2db ('server' table)
- option to view all created servers in lin2db ('server' table)

Option v1.5:

1.added to button "Account Manager" the options:
-view Email by account name
-change Email by account name

Option v1.4:

-removed MSSQL connection test from main window
-added button for MSSQL Connection Test
-added character name view in "Character Name Change" option
-upgraded to NET Framework 4.0 ( Works with win 2003/ too. I upgraded to have more options to add at compilation for you :) ) 

Options v1.3.1:

-fixed NET Framework 3.5 run compatibility

Options v1.3:

- button "Character search by account name" renamed to "Account Manager"
- added to button "Account Manager" : delete accounts by last login 
(it deletes the characters with last login less then you seted on calented in application)
- Changed NET Framework to 3.5 (for win2k3 users)

Options v1.2:

-added Character search by account name
-fixed language mistakes
-optimised some forms

Options v1.1:

-added last login by ip at: find ip otions
-added options for Item search on a char by amount or just Item ID

Options v1:

- MSSQL concetion test
- char ban
- account ban
- item enchanter
- skill enchanter
- item amount change
- iventory view by char name
- find ip by account
- find char id
- change builder (GM power)
- change char name

 
 

Donators till now  (and Thank you very much) are: xryskom, ericvini, PARADISE, kelviow2, Vagrancy™, Sighed, Justice.Anarchy, tatwizard

 

Testers(thank you): , PARADISE

 

INFO:  Donators please PM/Mail me with your paypal email/name and mxc nick after donation to be added at list. Thank you!

Contact:

Skype: xel121

Mail: l2xguard@live.com

 

Thank you!

Best Regards

Hope you like it and is useful for you.
Thank you!

 

Download: https://mega.nz/#!zopQkaoa!T51fo1XgmRTqN1MnnMBFxMmzZVeo7QId1gbdk70XqmA

 

 

Need for run: Net Framework 4.0

Screen

tSfGRS8.jpg

n7t5.jpg
 

Screenshot_1.png

Edited by xeL
Update
  • Like 1
  • Thanks 1
  • Upvote 9
Posted

very nice share i like !you can add more feautures !

keep going!

 

Thx. I will in new update.

Posted

New update released , v1.3. 

(since I can't edit my post i post here)

Download: http://www.4shared.com/zip/VTl15ewu/L2OFFGMPanel_v13.html?

 

Change log:

 

 

Options v1.3:
 
- button "Character search by account name" renamed to "Account Manager"
- added to button "Account Manager" : delete characters by last login 
(it deletes the characters with last login less then you seted on calented in application)

 

- Changed NET Framework to 3.5 (for win2k3 users)
Posted

 

New update released , v1.3. 

(since I can't edit my post i post here)

Download: http://www.4shared.com/zip/VTl15ewu/L2OFFGMPanel_v13.html?

 

Change log:

 

 

Options v1.3:
 
- button "Character search by account name" renamed to "Account Manager"
- added to button "Account Manager" : delete characters by last login 
(it deletes the characters with last login less then you seted on calented in application)

 

- Changed NET Framework to 3.5 (for win2k3 users)

 

- added to button "Account Manager" : delete accounts by last login 

Posted

Version 1.3 - NET Framework 3.5 Win 2k3 x64

 

Does`t even start

Thx for report. I will look over it.

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