Jump to content

Recommended Posts

Posted

Creating a Counter-Strike Server

 

Page 2.

 

Now that we've covered the basic on what you need to run a server we can start on getting familiar with a basic server configuration.

 

Getting Started

Before creating a server, it is a good idea to familiarize yourself with the cvars you will need to properly configure your server to your likings. We are going to cover the basic cvars, more advanced can be found on our cvarlist page. Starting with the basic:

•// hostname - Set the name of your server

hostname "My Counter-Strike Server"

 

// rcon_password - This allows you to control your server remotely, things like changing maps, kick/ban clients, etc.

rcon_password "specialpassword"

 

// mp_buytime <seconds> - The amount of time to allow purchasing weapons/equipment on round start

mp_buytime 0.45

 

// mp_startmoney <money> - Specify how much money players start off with

mp_startmoney 800

 

// mp_c4timer <seconds> - How long before the c4 explodes

mp_c4timer 45

 

// mp_timelimit <minutes> - How long each map should be played before switching levels

mp_timelimit 25

 

// mp_freezetime <seconds> - How long players are unable to move during round starts

mp_freezetime 5

 

// sv_cheats <0/1> - Whether to allow game cheat commands to be used by clients. 0 = off | 1 = on

sv_cheats 0

 

// sv_maxrate <1000-25000> - The maximum bandwidth rate the server is allowed to transmit to clients

sv_maxrate 10000

 

// sv_pausable <0/1> - Whether to allow clients to pause the server. 0 = off | 1 = on

sv_pausable 0

 

// sv_contact <email/web address> Contact email for server admin

sv_contact "admin@domain.com"

 

// sv_region <1-7> - The region of the world to report the server in.

// region codes can be found on this page.

sv_region 0

 

You may download this basic server.cfg here. For Counter-Strike, the server.cfg goes in the cstrike directory and for Counter-Strike: Source extract to the cstrike/cfg directory.

 

 

Page 3.

 

Now that we've covered the basic commands we can start installing Counter-Strike. On the next page we'll cover a CS Source Install on Windows, if you wish to install Counter-Strike 1.6 skip to page 4 for Windows or page 6 for Linux.

 

Windows: Install CS Source

On this page we will cover the installtion process of Counter-Strike: Source on the Windows XP operating system. First, you will need to download and install the windows hldsupdatetool (local download). The default install path is C:\Program Files\Valve\HLServer which is fine in most cases. Your drive letter may differ than above. Be sure you run the hldsupdatetool installer with administrator privileges. Once you've installed the hldsupdatetool, continue reading.

 

 

Installing Counter-Strike: Source (SRCDS)

 

On Windows, click start, then select run and type cmd then, in the DOS window type:

code:

cd C:\Program Files\Valve\HLServerNow, lets update and install Counter-Strike: Source, run the following command:

code:

HldsUpdateTool.exe -command update -game "Counter-Strike Source" -dir . Note the period after -dir - Make sure not to leave it out.

 

Installation will take around 30-60 minutes (~800MB). After the "HLDS installation up to date" message, setup is now complete and you are ready to start the server.

 

 

Starting the server

 

There are two ways to start the server, either by using the fancy Steam GUI or the Console:

 

t1-6.jpg

 

 

Which method you choose to start the server depend on the type of server. If it will be a temporary server then use the GUI for easy setup, otherwise, stick with the console, it uses less resources. Select one of the two options:

 

1. Starting CS Source Server via GUI

If you want to use the Steam GUI browse to C:\Program Files\Valve\HLServer find and double click srcds.exe, a menu will open and everything else should be self explanatory. If you choose the Steam GUI there is no need to read any further, you have successfully installed Steam, simply select your server start-up options using the GUI tabs. To start the server using the console method, continue reading.

 

2. Starting CS Source Server via Console

Browse to C:\Program Files\Valve\HLServer find and right click srcds.exe and select Create Shortcut. Now you should have a shortcut icon of srcds.exe. Right click that newly created shortcut and select Properties

 

By now, You should be in the shortcut properties window.

 

t1-10.jpg

 

Counter-Strike command line options

 

Below are a list of commands you can enter in the target field to start the server.

 

-console

Initializes console mode

 

-autoupdate

Automatically update the server when Steam updates are released

 

-game <game name>

The HLDS mod you want to run

 

+maxplayers <number of players>

Amount of players to allow

 

+map <map name>

The map to start the server with

 

+port <port number>

The port number the server should run on. Can be left out if you plan on using the default port (27015).

 

Under the shortcut target field is where you will need to enter some options. See above for current -flags you can use, we want to start our server with a limit of 20 players and on cs_italy so our shortcut target field will look like this:

 

 

code:

"C:\Program Files\Valve\HLServer\srcds.exe" -console -game cstrike -autoupdate +maxplayers 20 +map cs_italy Note the quotes around the path, they are required if the path contains a space.

 

Now we click OK on the Shortcut window. To start the server we simply double click the shortcut we created and the server will start up with the options we added to the target area. Our server is now running:

 

t1-11.jpg

 

You can also start the server without creating a shortcut: Click on Start, Run, then type cmd now in the DOS prompt window, type:

code:

cd C:\Program Files\Valve\HLServerthen type:

code:

srcds.exe -console -game cstrike -autoupdate +maxplayers 20 +map cs_italyHowever, we recommend creating the shortcut so you do not have to type the commands each and every time you want start the server.

 

Eventually, you will want to alter the server hostname, and other cvars for the server. To do this, use our SRCDS cfgmaker, It can generate a configuration file, even if you have very little knowledge.

 

 

Part 3.

 

On the next page, we will guide you step-by-step on installing Counter-Strike 1.6. The steps are almost identical as installing Counter-Strike: Source, with the exception of the -game prefix and a few other changes.

 

Windows: Install CS 1.6

Ok, so you want to install Counter-Strike 1.6 instead of CS Source. The process is similar to installing CS Source, First, you will need to download and install the windows hldsupdatetool (local download). The default install path is C:\Program Files\Valve\HLServer which is fine in most cases. Your drive letter may differ than above. Be sure you run the hldsupdatetool installer with administrator privileges. Once you've installed the hldsupdatetool, continue reading.

 

 

Installing Counter-Strike 1.6 (HLDS)

 

Now that you have installed the hldsupdatetool, On Windows, click on start then select run and type cmd in the run box. The Windows DOS prompt should now be on your screen, now type:

 

code:

cd C:\Program Files\Valve\HLServerThe DOS prompt should appear like so:

 

t1-3.jpg

 

Now we're ready to install Counter-Strike, type:

code:

HldsUpdateTool.exe -command update -game cstrike -dir . Note the period after -dir - Make sure not to leave it out.

 

 

If all goes well, the install process will begin and you should now see a bunch of lines scroll on the DOS cmd prompt window.

 

t1-4.jpg

 

The installer will recognize it is a new install and proceed to download and update Counter-Strike. Leave the window alone! Be patient this may take a while, so go grab something to munch on while you wait, the installer takes roughly 20-30 minutes to download all files (~300MB) on a 6Mbit connection. After it is finished, you will see a "HLDS installation up to date" message.

 

t1-5.jpg

 

Starting the server

 

There are two ways to start the server, either by using the fancy Steam GUI or the Console.

 

t1-6.jpg

 

Which method you choose depend on the type of server. If it will be a temporary server then use the GUI for easy setup, otherwise, stick with the console, it uses less resources. Select one of the two options:

 

1. Starting via Steam GUI

Browse to C:\Program Files\Valve\HLServer and double click the hlds.exe icon. A menu will open and everything else should be self explanatory. If you choose the Steam GUI there is no need to read any further, you have successfully installed Steam, simply select your server start-up options using the GUI tabs. To start the server using the console method, continue reading.

 

t1-9.jpg

 

2. Starting via Console

Browse to C:\Program Files\Valve\HLServer and right click hlds.exe then select Create Shortcut now right click that new Shortcut you just created and select Properties

 

t1-7.jpg

 

Counter-Strike command line options

 

Below are a list of commands you can enter in the target field to start the server.

 

-console

Initializes console mode

 

-autoupdate

Automatically update the server when Steam updates are released

 

-game <game name>

The HLDS mod you want to run

 

+maxplayers <number of players>

Amount of players to allow

 

+map <map name>

The map to start the server with

 

-port <port number>

The port number the server should run on. Can be left out if you plan on using the default port (27015).

 

-ip <ipaddress>

Useful if you have multiple IPs and want to assign a particular IP to the server.

 

Example, you want to start the server with 12 players and the map de_aztec your target field should look like this:

 

code:

"C:\Program Files\Valve\HLServer\hlds.exe" -console -game cstrike -autoupdate +maxplayers 12 +map de_aztec

Note the quotes around the path, they are required if the path contains a space.

 

After you've entered that in the target field, click OK then double click the shortcut icon and the server should now be starting up:

 

t1-8.jpg

 

Each time you want to start the server, all you do now is double click the Shortcut icon with the saved Target parameter.

 

You can also start the server without creating a shortcut: Click on Start, Run, then type cmd now in the DOS prompt window, type:

code:

cd C:\Program Files\Valve\HLServerthen type:

code:

hlds.exe -console -game cstrike -autoupdate +maxplayers 12 +map de_aztecHowever, we recommend creating the shortcut so you do not have to type the commands each and every time you want start the server.

 

 

Page 5.

 

On the next page, we will guide you on installing Counter-Strike: Source on Linux.

 

Linux: Install CS Source

On this page we will explain how to install Counter-Strike and Counter-Strike: Source. We assume you have some Linux knowledge. We will start with Counter-Strike: Source first, If you want to install Counter-Strike 1.6 skip to Page 6 'Linux: Install CS 1.6'

 

 

Installing Counter-Strike: Source (SRCDS)

 

First, lets create a directory where we will run the hldsupdatetool, run the following command:

code:

mkdir srcdsNow we switch to the srcds we just created and download the hldsupdatetool.bin

code:

cd srcds

wget http://www.cstrike-planet.com/dls/hldsupdatetool.binIf all goes well you should now have the hldsupdatetool.bin in the srcds directory. Now we change the permission of hldsupdatetool.bin so we can execute it and extract the contents from hldsupdatetool.bin

code:

chmod +x hldsupdatetool.bin

./hldsupdatetool.bin Note: after you run ./hldsupdatetool.bin you will get a prompt to agree with the terms and conditions, simply type yes and hit enter.

 

If all goes well, you should now have two files in the srcds directory, the hldsupdatetool.bin which we downloaded earlier, and a steam file the hldsupdatetool generated, this is the file we will use to install Counter-Strike: Source.

 

Note: if you receive a 'uncompress: command not found' message it means your server does not have uncompress installed. You have two options to easily work around this, try the following while logged-in as root:

 

code:

ln -s /bin/gunzip /bin/uncompressThen try to run ./hldsupdatetool.bin again. If that does not work, or you do not have root privileges you can download the binary file we have available:

 

code:

wget http://www.cstrike-planet.com/dls/steam

 

Now that you have the steam binary file, Type the following command to begin installing CS Source

 

code:

chmod +x steam

./steam -command update -game "Counter-Strike Source" -dir . Note the period after -dir

 

By now, the Counter-Strike Source install should have started:

 

t1-12.jpg

 

Install times will vary anywhere between 30-60 minutes depending on your server connection speed and how congested the Steam network is. Once setup has finished it will display a "HLDS installation up to date" message. Now we are ready to start the server.

 

 

Counter-Strike command line options

 

Below is a list of options you can use when starting up the server.

 

-console

Initializes console mode

 

-autoupdate

Automatically update the server when Steam updates are released

 

-game <game name>

The HLDS mod you want to run

 

+maxplayers <number of players>

Amount of players to allow

 

+map <map name>

The map to start the server with

 

-port <port number>

The port number the server should run on. Can be left out if you plan on using the default port (27015).

 

-ip <ipaddress>

Useful if you have multiple IPs and want to assign a particular IP to the server.

 

There are a couple of ways to start the server; for simplicity we will go the easy way. We want the server to run in the background, so we issue the following command:

 

code:

./srcds_run -game cstrike -autoupdate +maxplayers 20 +map de_aztec > /dev/null 2>&1 &If you are wondering what > /dev/null is; this will send no output, and the ending '&' will run the server in the background. This would be the most common way to start the server. Sometimes we like to see what is happening while the server is running, mostly for debugging purposes:

code:

./srcds_run -game cstrike -autoupdate +maxplayers 20 +map de_aztec > srcds.log 2>&1 &The above will start the server, send all output (logging) to a file called srcds.log and run in the background. Everything the server generates will be sent to srcds.log, very useful if you want to see any errors that are happening while the server is running.

 

Note: if you choose to send output to a file, remember to periodically delete the file, it can grow quite large on an active server. Keep in mind this should be used mostly for debugging and not for a production server.

 

 

 

Page 6.

 

On the next page we'll cover CS 1.6 on Linux.

 

Linux: Install CS 1.6

On this page we will explain how to install Counter-Strike on Linux. We assume you have some Linux knowledge.

 

 

Installing Counter-Strike 1.6 (HLDS)

 

First, lets create a directory where we will run the hldsupdatetool, run the following command:

code:

mkdir hldsNow we switch to the hlds we just created and download the hldsupdatetool.bin

code:

cd hlds

wget http://www.cstrike-planet.com/dls/hldsupdatetool.binIf all goes well you should now have the hldsupdatetool.bin in the srcds directory. Now we change the permission of hldsupdatetool.bin so we can execute it and extract the contents from hldsupdatetool.bin

code:

chmod +x hldsupdatetool.bin

./hldsupdatetool.bin Note: after you run ./hldsupdatetool.bin you will get a prompt to agree with the terms and conditions, simply type yes and hit enter.

 

If all goes well, you should not have two files in the srcds directory, the hldsupdatetool.bin which we downloaded earlier, and a steam file the updatetool generated, this is the file we will use to install Counter-Strike: Source.

 

Note: if you receive a 'uncompress: command not found' message it means your server does not have uncompress installed. You have two options to easily work around this, try the following while logged-in as root:

 

code:

ln -s /bin/gunzip /bin/uncompressThen try to run ./hldsupdatetool.bin again. If that does not work, or you do not have root privileges you can download the binary file we have available:

 

code:

wget http://www.cstrike-planet.com/dls/steam

 

Now that you have the steam binary file, Type the following command to begin installing CS 1.6

 

code:

chmod +x steam

./steam -command update -game cstrike -dir . Note the period after -dir

 

By now, the Counter-Strike 1.6 install should have started:

 

t1-13.jpg

 

Install times will vary anywhere between 15-30 minutes (~300MB) depending on your server connection speed and how congested the Steam network is. Once setup has finished it will display a "HLDS installation up to date" message. Now we are ready to start the server.

 

 

Counter-Strike command line options

 

Below is a list of options you can use when starting up the server.

 

-console

Initializes console mode

 

-autoupdate

Automatically update the server when Steam updates are released

 

-game <game name>

The HLDS mod you want to run

 

+maxplayers <number of players>

Amount of players to allow

 

+map <map name>

The map to start the server with

 

-port <port number>

The port number the server should run on. Can be left out if you plan on using the default port (27015).

 

-ip <ipaddress>

Useful if you have multiple IPs and want to assign a particular IP to the server.

 

There are a couple of ways to start the server; for simplicity we will start the server the easy way. We want the server to run in the background, so we issue the following command:

 

code:

./hlds_run -game cstrike -autoupdate +maxplayers 20 +map de_aztec > /dev/null 2>&1 &If you are wondering what > /dev/null is; this will send no output, and the ending '&' will run the server in the background. This would be the most common way to start the server. Sometimes we like to see what is happening while the server is running, mostly for debugging purposes:

code:

./hlds_run -game cstrike -autoupdate +maxplayers 20 +map de_aztec > hlds.log 2>&1 &The above will start the server, send all output (logging) to a file called hlds.log and run in the background. Everything the server generates will be sent to hlds.log, very useful if you want to see any errors that are happening while the server is running.

 

Note: if you choose to send output to a file, remember to periodically delete the file, it can grow quite large on an active server. Keep in mind this should be used mostly for debugging and not for a production server.

 

 

Conclusion

We hope you've found this guide helpful and have learned how to create a Counter-Strike server with little effort. Starting up a server is just the beginning as there is many more things you can do to make your server an enjoyable gaming experience for you and those playing on it.

 

There are literally hundreds of addons, scripts and tools to customize your server to the next level. Have a look at our download section for all types of tools and addons for your server.

 

If you have any questions or need further help with your server, post in the forums where many are willing to give you a hand.

 

Remember, a server is only as good as you make it. Have fun!

 

 

Posted

Creating a Counter-Strike Server

 

Page 2.???

This is the hidden content, please
[/hide] stop the leeching and give some credits...

 

anyway thanks for share is very usefull but next time try to make this more small is too long and if someone try to make cs server will give up if he start read that(too big).

Posted

-1 karma because you not give credits!

Also the topic is a fail, incomplete, images sucks and is a c/p without credits.

 

locked.

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