Jump to content

Recommended Posts

Posted

//admin

Brings up the admin menu.

 

//gm

Toggle GM status

 

//gmchat

Sends a global message that only GMs can see.

Usage: //gmchat Type message here.

 

//snoop

 

//gmliston

Register into gm list

 

//gmlistoff

Remove from gm list

 

//silence

(To enable/disable private message mode)

 

//saveolymp

Save olympiad

 

//manualhero

Manual select heroes

 

//atmosphere <signsky> <dawn|dusk>

Sets current sky to either Dawn or Dusk, as seen by members of the winning cabal.

 

//atmosphere <sky> <day|night>

Sets current sky to either day or night.

 

//diet

Current status of diet mode "Weight Restriction" for player.

 

//diet on

Enables diet mode, removing your "weight" restriction.

 

//diet off

Disables diet mode. restoring your "weight" restriction.

 

//play_sound

Brings up sounds page.

 

//edit_character

Opens menu to edit targetted player.

 

//current_player

Opens character list.

 

//character_list

Opens list of online players.

 

//show_characters

Opens list of online players.

 

//find_character

Opens the find player menu.

 

//save_modifications

Saves the edits done to the targetted player.

 

//nokarma

removes karma from target player

 

//setkarma <value>

sets karma of target player to value

 

//rec

Recommnend targeted player

 

//settitle

Set title of targeted player

 

//setname

Set name of targeted player

 

//setcolor

Set name color of targeted player

 

//fullfood

Full feed targeted pet

 

//invis

to hide your character

 

//invisible

to hide your character

 

//vis

to unhide your character

 

//visible

to unhide your character

 

//known on

to unhide your character from known list

 

//known off

to hide your character from known list

 

//earthquake <Intensity> <Duration>

Creates an earthquake

 

//para_all

Paralyzes all players}}

 

//unpara_all

Unparalyze all players

 

//para

Paralyze Target

 

//unpara

Unparalyze Target

 

//bighead

Gives target a big head

 

//shrinkhead

Returns targets head to normal size

 

//polymorph

character npc id

 

//polymorph

item id to poly target into id

 

//polyself <npc id>

Used to polymorph yourself into a mob

 

//unpolyself

Returns you to the normal state

 

//polymorph <itemid>

Polymorphs an item

 

//gmspeed <value>

Usage //gmspeed value = [0...4]

 

//changename <new_name>

Change name of targetted player

 

//add_exp_sp_to_character

Opens the xp sp menu of the targetted player.

 

//add_exp_sp

Adds xp sp to targetted player.

Usage: //add_exp_sp xp_number sp_number

 

//remove_exp_sp

Remove xp sp from targetted player.

Usage: //remove_exp_sp xp_number sp_number

 

//tradeoff

Current status of trading for player.

 

//tradeoff on

Enables trading with other players.

 

//tradeoff off

Disables trading with other players.

 

//reload

skill Reloads skill data.

 

//reload multisell

Reloads multisell data.

 

//reload teleport

Reloads teleport locations.

 

//reload npc

Reloads all npc.

 

//reload htm

Reloads htm files.

 

//reload item

Reloads item templates.

 

//reload instancemanager

Reloads instancemanager.

 

//announce_menu

Opens the announce menu.

 

//list_announcements

Lists the current announcements.

 

//reload_announcements

Reloads the announcement list.

 

//announce_announcements

Posts all announcements in list.

 

//add_announcement

Adds an announcement.

Usage: //add_announcement Your announcement here

 

//del_announcement

Deletes an announcement.

Usage: //del_announcement Your announcement here

 

//announce

Posts an announcement.

Usage: //announce Your announcement here

 

//ban

Used to kick and ban a named players account.

Usage: //ban kadar

 

//unban

Used to unban a named players account.

Usage: //unban kadar

 

//kick

Used to disconnect named player.

Usage: //kick kadar

 

//kick_non_gm

Used to disconnect all regular players

 

//kill

Kill targeted player/NPC

 

//jail

Used to jail named player for a number of minutes.

Usage: //jail kadar 10

 

//unjail

Used to unjail named player.

Usage: //unjail kadar

 

//banchat

Mutes a player.

Usage: //banchat kadar

 

//unbanchat

Unmutes a player.

Usage: //unbanchat kadar

 

//bbs

Brings up comunity board

 

//add_level

Add levels to target char.

Usage: //add_level 5

 

//set_level

Set level of targeted char.

Usage: //set_level 50

 

//heal

Heal target player or players in radius.

Usage: //heal 2000

 

//help

Opens help page

 

//invul

Turns invulnerability on/off

 

//target

Used to target a Mob or player.

Usage: //target kadar

 

//cache_htm_rebuild

Rebuilds and reloads the HTML cache.

 

//cache_htm_reload

Reloads the HTML cache.

 

//cache_reload_file

Reloads the HTML cache for a single file.

 

//cache_reload_path

Reloads the HTML cache for a specified directory.

 

//cache_crest_rebuild

Rebuilds the cache of pledge crests.

 

//cache_crest_reload

Reloads the cache of pledge crests.

 

//cache_crest_fix

Fixes problems with incorrect displaying of pledge crests.

 

//changelvl

Changes a targetted players access level.

Usage: //changelvl Access_level_number

 

//itemcreate

Opens the item creation menu.

 

//create_item

Creates an item.

Usage: //create_item item_id

 

//cw_infos

Get infos on cursed weapons

 

//cw_remove

Remove specified cursed weapon.

Usage: //cw_remove 8190

 

//cw_reload

Reloads cursed weapons

 

//delete

Used to remove a targetted NPC. NPC will not respawn.

 

//character_disconnect

Used to disconnect a targetted player.

 

//open

opens targetted door

 

//close

closes targetted door

 

//openall

opens all doors

 

//closeall

closes all doors

 

//edit_npc

Used to edit a NPCs stats.

Usage: //edit_npc npc_id

 

//save_npc

Saves the editted NPC info.

 

//recall_npc

Teleports targetted NPC to you.

 

//show_droplist

Shows the named NPCs drop list.

Usage: //show_droplist npc_id

 

//edit_drop

Edits the named NPCs droplist.

Usage: //edit_drop npc_id item_id [min max sweep chance]

 

//add_drop

Adds a drop to the named NPCs droplist.

Usage: //add_drop npc_id item_id [min max sweep chance]

 

//del_drop

Deletes a drop to the named NPCs droplist.

Usage: //del_drop npc_id item_id

 

//showShop

Shows a targetted vendors shoplist.

 

//showShopList

Shows a targetted vendors shoplist.

 

//addShopItem

Adds an item to a vendors shop.

Usage: //addShopItem Shop_ID item_id Price

 

//delShopItem

Deletes an item from a vendors shoplist.

Usage: //delShopItem Shop_ID item_id

 

//editShopItem

Edits an item in a vendors shoplist.

Usage: //editShopItem Shop_ID item_id Price

 

//box_access

with box targetted, shows access list

 

//box_access char1 char2

to add players to box

Usage: //box_access kadar !LadyPain

 

//box_access no char1

removes player from box access

Usage: //box_access !LadyPain no kadar

 

//clear_teams

 

//setteam_close <team_name>

Join players in radius 400 to specified team

 

//setteam <team_name>

Join targetted player to specified team

 

//enchant

Opens enchant menu

 

//seteh <enchant_level>

Set enchant level for head slot

 

//setec <enchant_level>

Set enchant level for chest slot

 

//seteg <enchant_level>

Set enchant level for gloves slot

 

//seteb <enchant_level>

Set enchant level for feet slot

 

//setel <enchant_level>

Set enchant level for legs slot

 

//setew <enchant_level>

Set enchant level for r_hand slot

 

//setes <enchant_level>

Set enchant level for l_hand slot

 

//setle <enchant_level>

Set enchant level for l_ear slot

 

//setre <enchant_level>

Set enchant level for r_ear slot

 

//setlf <enchant_level>

Set enchant level for l_finger slot

 

//setrf <enchant_level>

Set enchant level for r_finger slot

 

//seten <enchant_level>

Set enchant level for neck slot

 

//setun <enchant_level>

Set enchant level for under slot

 

//setba <enchant_level>

Set enchant level for back slot

 

//event

Opens event page

 

//event_new

Opens new event page

 

//event_choose

 

//event_store

 

//event_set

 

//event_change_teams_number

 

//event_announce

 

//event_panel

 

//event_control_begin

 

//event_control_teleport

 

//add

Add event

 

//event_see

List events

 

//event_del <event_name>

 

//delete_buffer

 

//event_control_sit

 

//event_name

 

//event_control_kill

 

//event_control_res

 

//event_control_poly

 

//event_control_unpoly

 

//event_control_prize

 

//event_control_chatban

 

//event_control_finish

 

//fight_calculator

Show fight calculator

 

//fight_calculator_show

Show fight calculator

 

//fcs

Show fight calculator

 

//geo_z

Get Geo_Z

 

//geo_type

Get Geotype

 

//geo_nswe

Get heading

 

//geo_los

Check line of sight

 

//geo_position

Get geo position

 

//geo_bug

Add bug comment

Usage: //admin_geo_bug you coments here

 

//geo_load

Usage: //admin_geo_load <regionX> <regionY>

 

//geo_unload

Usage: //admin_geo_unload <regionX> <regionY>

 

//geoeditor_connect

Usage: //geoeditor_connect <number>

 

//geoeditor_join

Join active char

 

//geoeditor_leave

 

//server_gm_only

Only GM can access server

 

//server_all

Public access server

 

//server_max_player <number>

Set max players value

 

//server_list_clock

Toggle clock displayed next to the server name

 

//server_login

Opens login server edit window

 

//mammon_find

Lists the current location (if any) of the Mammon NPCs

 

//mammon_respawn

Lists the current respawn times (if any) of the Mammon NPCs

 

//list_spawns <npcId> <teleIndex>

Teleports to the player based on the given spawn index (from using //list_spawns <npcId>).

 

//msg <ID>

Used for testing SystemMessage IDs

 

//char_manage

Opens characters manage page

 

//mobmenu

Opens mobgroup.htm

 

//admin_mobgroup_list

 

//mobgroup_create

 

//mobgroup_remove

 

//mobgroup_delete

 

//mobgroup_spawn

 

//mobgroup_unspawn

 

//mobgroup_kill

 

//mobgroup_idle

 

//mobgroup_attack

 

//mobgroup_rnd

 

//mobgroup_return

 

//mobgroup_follow

 

//mobgroup_casting

 

//mobgroup_nomove

 

//mobgroup_attackgrp

 

//mobgroup_invul

 

//mobinst

Opens mobgrouphelp.htm

 

//mons

Used to start the Monster Races.

 

//pn_info

Path node info

 

//show_path

 

//path_debug

 

//show_pn

 

//find_path

 

//view_petitions

View petitions list

 

//view_petition

View petition

 

//accept_petition

 

//reject_petition

 

//reset_petitions

clear the petition queue

 

//forge

 

//forge2

 

//forge3

 

//pledge <create|dismiss|setlevel><create|dismiss|setleve l>

 

//restore

Restores a broken player info.

 

//repair

Repairs a broken player info.

 

//res

Resurrect player

 

//res_monster

Resurrect monster

 

//ride_wyvern

Command used to summon and ride a wyvern.

 

//unride_wyvern

Command to dismount and unsummon a wyvern.

 

//ride_strider

Command used to summon and ride a strider.

 

//unride_strider

Command to dismount and unsummon a strider.

 

//buy

Opens the GMShop.

 

//gmshop

Opens the GMShop.

 

//server_shutdown

Starts the shutdown process.

Usage: //server_shutdown Number of seconds

 

//server_restart

Starts the restart process.

Usage: //server_restart Number of seconds

 

//server_abort

Stops the server shutdown.

 

//siege

 

//add_attacker

 

//add_defender

 

//add_guard

 

//list_siege_clans

 

//clear_siege_list

 

//move_defenders

 

//spawn_doors

 

//endsiege

 

//startsiege

 

//setcastle

 

//clanhall

 

//clanhallset

 

//clanhalldel

 

//clanhallopendoors

 

//clanhallclosedoors

 

//clanhallteleportsel

 

//show_skills

Lists targetted players skills.

 

//remove_skills

Removes the targetted players skills.

 

//skill_list

Opens skill menu.

 

//skill_index

Opens skill menu according to players stats.

 

//add_skill

Adds a skill to a targetted player.

Usage: //add_skill Skill_id level

 

//remove_skill

Removes a skill from a targetted player.

Usage: //remove_skill Skill_id

 

//get_skills

Temporarily gives you the skills of a targetted player.

 

//reset_skills

Restores your skills from before the get_skills command.

 

//admin_remove_all_skills

 

//admin_give_all_skills

 

//skill_test <skill_id>

Test a skill.

Usage: //skill_test 100

 

//st <skill_id>

Test a skill.

Usage: //st 100

 

//show_spawns

Opens spawn menu.

 

//spawn

Spawns a Mob on current target.

Usage: //spawn npc_id

 

//spawn_monster

Spawns a Mob on current target.

Usage: //spawn_monster npc_id

 

//spawn_index

Shows menu for monsters with respective level.

Usage: //spawn_index level

 

//unspawnall

 

//respawnall

 

//spawn_reload

 

//npc_index

 

//show_npcs

 

//teleport_reload

 

//spawnnight

 

//spawnday

 

//show_moves

Opens the teleport menu.

 

//show_moves_other

Opens the teleport menu named other.

 

//show_teleport

Opens the teleport menu.

 

//teleport_to_character

Teleports you to the named player.

Usage: //teleport_to_character kadar

 

//move_to

Teleports you to coordinates given.

 

//teleport_character

Teleports targetted player to coordinates given.

 

//recall

Summons a named player to you.

Usage: //recall kadar

 

//admin_walk

 

//explore

 

//admin_recall_npc

 

//gonorth

 

//gosouth

 

//goeast

 

//gowest

 

//goup

 

//godown

 

//teleshow

teleport window

 

//admin_failed

 

//test

These //test commands are for the universe mapping feature

 

//test uni flush

Save universe map

 

//test hash <number>

 

//test uni

Return universe size

 

//mp on

Start packet monitor

 

//mp off

Stop packet monitor

 

//mp dump

Save packet history

 

//known on

to unhide your character from known list

 

//known off

to hide your character from known list

 

//zone_check

 

//zone_reload

 

//tvt

tvt pannel

 

//dmevent

dmevent match pannel

 

//ctf

 

//vip

 

 

Soon  more commands comming.

Guest
This topic is now closed to further replies.


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