Jump to content

Recommended Posts

Posted

Hey there..Just look that amazing share that will give u many kill points on theese maps!

 

Teh Start ^^

 

 

 

                                                            Good Snipers

 

The scout

scout_a.jpg

 

"Buy, Rifles, Scout."

 

Most people don�t follow this routine when they play CS. Instead, they often go for the $4700 AWP. Those who press 4, then 6 are blind to the power of the Scout. I'll list some reasons why the Scout is a considerable choice as a weapon.

 

» Cost - You can get it at under 3000 bucks, and sometimes within the second round of the game. Bullets are cheaper compared to the AWP bullets, which cost $125.

 

» Mobility - You can run fast with it. Ever hold an AWP while running? You move like a slug, and your accuracy decreases as well. With the Scout, you run much faster and it�s still pretty accurate at medium range.

 

» Power - The Scout isn�t a one-hit kill like the AWP, but it does nail someone down within two shots. Suppose each shot takes 50. A tactic that would be useful is temporary camping. This may sound bad, but camp until half of your team and half of the other team is dead. Usually around this time, most of the enemies have 60 - 40 health left. What does this mean? This means the scout is like an AWP now. One shot kill. And you save money!

 

» Accuracy - The Scout isnt that accurate, but its not that inaccurate either. Its effective on maps where you can snipe the enemy, but not using the zoom feature. Zooming with the Scout isnt much of an advantage, since it doesn't kill in one hit, and it simply wastes time. I never zoom with it. You might miss, but since the scout reloads fast, you can quickly get another shot.

 

Enough praising the Scout. I'll get to the point: How do you use it? From my experience, I beleive that you should use the scout like an AWP and a shotgun. If you are good with the M3 Super90 shotgun, chances are you'll do well with the scout, since they are similar: two shot kills and you can still run fast with them.

 

How do you use it effectively? Be Smart. If you see a bunch of Ts or CTs running at you, don't try to run up and face them. Be a pansy and pick them off one by one. Higher ground tends to help, since the Scout can take someone out with one headshot. One tip everyone stresses is to STAY CALM. If you startle and jerk your mouse around your loyal Scout won't be of any help. For beginners, I would advise you to practice with the M3 first. When I use the Scout, I pretty much just use it like the shotgun. Get used to hit-and-run tactics, and you'll become a Scout master within a couple of rounds.

 

Some Other Advantages of the Scout:

 

» Backup fire - Help your teammates by taking someone down to 40-50 health and letting them finish your opponent off.

 

» Stealing frags - If youre a good sniper, follow your teammates and hang around a battle until people are reloading or are halfdead, then run out and finish them off.

 

» Silenced fire - Even though the Scout doesn't physically have a silencer, it still is quiet, especially when other people are blasting off their rifles and grenades. If you kill someone with a Scout and have sufficent cover, chances are they wouldn't even know where the bullet came from.

 

» Ammo - With the Scout you get 60 ammo, which is plenty to mess around with. You could shoot the chickens and the radio in Italy and still have ammo to kill people with. You also reload very quickly with the Scout.

 

                                                                    G3-Sg-1

 

SG-1+Precision+Sniper+Rifle+(Terrorist+Only)

 

The G3/SG-1, which is for terrorists only, is the only support weapon in the game that can get kills consistently.

 

I have only had a little experience with the new G3/SG-1 (CS 1.5), however, based on that and my extensive experience with the old G3, I can safely say that the new G3/SG-1 no longer has the weird 'phantom bullet' bug where some shots are inaccurate for no reason. The G3/SG-1 is the perfect gun for defending an area and slaughtering hordes of attacking or defending enemies in fire-fights. However, unless you have very good reactions, I do not recommend using this against an AWP. However, if you are up to it, there are two situations where this gun is most useful. One is when they are in the open, and cannot hide behind a box to reload, while you are tracking and shooting them. The second is when you are defending an area and are already zoomed in (and standing in a non 'instant aim' area, which is when you are in a spot where the enemy will be aiming immediately after strafing around a corner).

 

Now for the features of the G3. It takes 2-3 bullets to kill someone with this gun. The damage varies between that of a Scout and that of a DEagle. The accuracy when un-zoomed [and fired fully-auto] is (surprisingly) better than a spread of buck-shot, which, considering it's damage, makes it almost as good as a XM1014 when out of zoom. However, you will be walking very slowly, the same speed as an AWP user, so it isn't a good idea to rely on this, especially since the gun only has a rate of fire of 4 rounds/sec compared to something like 11 or so with the AK. The only real advantage of this is that you will be able to defend yourself without having to waste time pulling out your pistol if you are surprised from behind.

The accuracy of the gun (in full-auto and to a lesser extent, single shot) is affected by the level of zoom, so it is more accurate at x6 zoom than at x2.5 zoom.

 

The correct way to fire this gun is to take single aimed shots at the chest with small pauses in between. Patience is key with this gun, in many respects it is like a beefed up Scout. The tolerance for taking shots while moving is somewhat in between that of the Scout and the AWP. When firing you should try to be stationary (if possible) and nail the target with your first shot and then follow up with a second shot to finish him off. After making a kill, try to move into cover to prep a grenade or simply to vary your position and block fire from small arms and sniper rifles. Then pop out and repeat the process. Should you fail to hit an enemy with your first shot, get behind cover while they return fire, then go back and try again. Do not crouch in a fire-fight unless you are certain that there are no AWP users; it's not necessary as you get more than adequate accuracy with this gun while standing.

 

Some finer points on usage:

» Don't go fully auto at long range if you are alone, this will get you killed.

 

» Don't Reload unless you have less than 8 rounds. The roughly 4.5 second reload is quite long and leaves you far too vulnerable as a sniper.

 

» The USP is the ideal sidearm for this, it is accurate over long ranges on the move and has good damage dealing capabilities for the skilled player.

 

» Stay in the middle or back of your group in fire-fights, that way you will be able to concentrate better on getting kills.

 

» Unless you're running down a narrow corridor or the like, always travel with your G3 out and un-zoomed.

 

» Remember, by picking your ground you can pick your engagement range, try to get in an area where you have good cover and the enemy will need to expose themselves to attack you. This does not necessarily mean that they cannot take cover, merely that you will have breathing space and time to kill them.

 

» Leading is very important if you want to master this gun, with practice you can build up your reactions so that you will only require a short lead to aim effectively at a target.

 

» Remember, apart from the weight, this gun is basically a beefed up Scout, great for counter-sniping if you are skilled enough.

 

The G3 is THE decisive factor in big fire-fights. Forget the AWP, this gun can score one shot kills on injured opponents. It also has a much faster rate of fire, being able to snap off 5 fully auto shots or 2-3 single shots in the time the AWP takes to fire 1 round. Also, this gun is not bolt-action, so you do not zoom out when you fire.

 

Finally, like Kevlar, using the G3/SG-1 gives you a second chance should you make a slip-up, which cannot be said of missing your first shot with an AWP or Scout (or even M3 Super, for that matter!). Stay calm, and you will come out on top with the help of your trusty G3.

 

Posted

                                                              as_oilrig

First, and most obvious, is the sniper tower as a T. The pictures below depicts a great lookout over most of the topside map. I recommend using an AWP not a wimpy scout. Bigger is better!

as_oilrig0000.jpg

as_oilrig0001.jpg

 

Secondly we come to the various rooftop camping spots, good views from all sides, again the AWP should be used unless you are a scout god.

as_oilrig0002.jpg

as_oilrig0003.jpg

as_oilrig0004.jpg

as_oilrig0005.jpg

Being a sniper under the rig's super structure provides you with a few good places.

as_oilrig0008.jpg

as_oilrig0009.jpg

 

On the main deck there is a spot that is perfect for jumping the VIP and wiping him out. Under the far building with the duct access by the heli-ramp...but it's further down near the other side of the building under the second story window. Hide behind the crate in the shadows, the VIP won't even see it comin'!

as_oilrig0011.jpg

 

                                                        cs_italy

The bridge. The bridge going into the apartment has a very tricky and very good sniping access. Jump up on the guard rail, and then on the oil drum. Finally, jump-duck up on to the tippy-top of the door and finish the ascent onto the top platform. Great, great sniping

cs_italy0000.jpg

cs_italy0001.jpg

Tarzan. Have a buddy boost you up onto the boxes to your left as you peer down the tunnel. The vines hanging from the ceiling make it difficult to spot danger.

cs_italy0004.jpg

Below two entrances with crates: CT entrance to apartment (left), stairs entrance to the wine cellar (right).

cs_italy0011.jpg

cs_italy0015.jpg

Campsite. Camp the house and the rest of the T spawn to keep the doughnut eaters from rescuing the hosties. Self explanatory.

cs_italy0018.jpg

cs_italy0019.jpg

 

                                      More 4 Maps coming..When i finish my work (w8 3 hours :D)

                       

Posted

                                                                De_Dust

The Overseer. Look out over the causeway to bombsite B at CT spawn. Nothing within view will survive if you are good enough.

de_dust0000.jpg

de_dust0001.jpg

 

The obvious sniper's nest, useful for covering the double doors, catwalk, and underpass.

de_dust0002.jpg

de_dust0003.jpg

 

Get boosted onto the box stacked in the tunnel. C or CT. Doesn't matter.

de_dust0008.jpg

de_dust0009.jpg

 

The Toll Bridge. The balcony overlooking the underpass is a great place to watch the inside of the tunnel and do the cleanup duties for the survivors left over underneath.

de_dust0010.jpg

de_dust0011.jpg

 

The Traffic Cop. Control the flowing of traffic under the bridge by camping these two great positions. Just watch the wall in front of you.

de_dust0012.jpg

de_dust0013.jpg

 

                                                            De_Dust2

The Shortcut. Drop down the darkside passage right at the T spawn and jump the gun on the enemy. These spot can cover the two sets of double doors and the catwalk.

de_dust20001.jpg

de_dust20000.jpg

 

Typical T spawn campsites.

de_dust20005.jpg

de_dust20004.jpg

de_dust20003.jpg

 

The Fortress. Hold off bombsite B from either side, either way its a task for any sniper. The more the merrier on this one ladies and gentlemen.

de_dust20011.jpg

de_dust20012.jpg

de_dust20010.jpg

 

Shadowmaster. The darkened nooks behind the boxes at CT spawn can get you a few frags.

de_dust20013.jpg

 

Catch bombsite A offguard from this position. Great view of the bomb target and some of its defenders.

de_dust20016.jpg

Posted

                                                                    De_Aztec

Snipe the T's who rush through the double doors to make it to bombsite A. Because of the immense wide open space, it is tough to defend yourself while sniping.

de_aztec0000.jpg

 

The Waterways. Make T or CT lives a living hell from the numerous sniper posts that are on the waterfront.

de_aztec0001.jpg

de_aztec0002.jpg

de_aztec0003.jpg

 

Camp the T waterfront stairwell, T rop-bridge access and bombsite A double doors from this common sniper spot.

de_aztec0005.jpg

 

Mess up the CT's guarding bombsite A, or cap the T bastard planting the bomb...we don't need anymore bombings in the world for Christ's sake. ALSO: You can get a clear view of the back waterfront stairs and the far twin bombsite B/rope bridge openings.

de_aztec0007.jpg

 

Mirror Image. On either end of the rope bridge, the sniper points are heavily used, yet still extremely effective and damaging.

de_aztec0008.jpg

de_aztec0009.jpg

de_aztec0010.jpg

de_aztec0011.jpg

 

Bombsite B. Camp behind the largest box while planting the bomb next to you. Come and get biatches.

de_aztec0012.jpg

 

The L. A sniper panoramic cover zone in the shape of an L. Original, eh?

de_aztec0013.jpg

 

                                                      De_Train coming at 40 mins!

Posted
[*DeVx*][" post=447489" timestamp="1243861998]

BTW write the source that you c/p

Nice Share

it was a site,i don't remember the name..

And of course i not think u expect that i wrote all that -.-

  • 2 weeks later...
  • 1 month later...
Posted

Not bad but seriously some spots really suck hard for awp users. Imho merging the cout/AWP/hiding spots topics is the best option making 84275825 threads regarding the same topic is just stupid.

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