Jump to content

[Tutorial]Basic Java| Variables | Loops | Conditionals | Methods | Classes


Recommended Posts

Posted

What Is Java?

 

Java is a programming language originally developed by James Gosling. The language derives much of its syntax from C and C++ but has a simpler object model and fewer low-level facilities. Java applications are typically compiled to bytecode (class file) that can run on any Java Virtual Machine (JVM) regardless of computer architecture. Java is a general-purpose, concurrent, class-based, object-oriented language that is specifically designed to have as few implementation dependencies as possible.

Read more here.

 

Hello World (code)


public class HelloWorld{

public static void main(String[] args) {
System.out.println("Hello World!");
}
}

Hello World Explained

 

Let's look at the code line by line.


  •  
  • public class HelloWorld{
     

    •  
  • This line defines the class name. The syntax of defining classes is: AccessType class ClassName { Notice the line ends with an opening bracket. Every time you define a class, you have to use opening and closing brackets.
     
  • When saving a Java file, the name of the file must be the ClassName. So the HelloWorld class above must be saves as HelloWorld.java
     
     

 

[*] public static void main(String[] args) {

 


  •  
  • This line is the header of the main method. Every main method has a header like this. Methods will be covered in detail later on.
     
     

 

[*] System.out.println("Hello World!");

 


  •  
  • This line is what says what's going to happen. System.out has many different type of print mehtods. I'll discuss two of them here.
         

    •      
  • The System.out.println method prints the parameter (what's in the parenthesis) on a new line in the console. This method can also be used without any parameter and that will make the console print an empty line. System.out.println() is useful to print new lines in the console.
         
  • The System.out.print method is similar to the println method, but this doesn't print a new line. This method will print something on an existing line in the console. Because of this, if you don't put anything in the parameter, unlike the println method, you'll get a Syntax error (an error which won't let you compile the code).
         

      [*] You can change what gets printed by changing the parameter. If you'd like to print Hey, Saad you'd use: System.out.println("Hey, Saad"); If you are printing a number, you don't need the quotation marks. However if you want to print a string (set of characters) you must use parenthesis.

      [*] Most statements in Java need to end in a semicolon except methods, conditionals, and class declarations.

 

 

 

[*] }

  • Remember this rule: Every bracket which is opened must be closed.
    The first parenthesis is closing the main method. The second parenthesis is closing the class. Not including any of these parentheses will result in a Parsing Syntax Error.
     

I'll be covering classes and methods in more detail later on.

 

 

Defining Variables

 

A variable is an object that can hold a specific type of data. So you can basically assign a value a name and get the value by using the name instead of the value. There are many types of variables and you can also create your own types of variables. (Will be discussed later on). Here are the most common variable types:

  • int - An int is an integer which can hold whole numbers under 2.17 billion in size.
  • long - A long is just like an integer but it can hold whole numbers larger then 2.17 million.
  • double - A double can contain numbers with decimal values.
  • boolean A boolean holds only two values, true or false (0 or 1).
  • String - A string holds more than one character which can include numbers, symbols and characters. When assigned a value it needs to be assigned with quotation marks before and after the value ("").
  • char - A char holds only one character. When assigned a value it needs to be assigned with a apostrophe before and after the value(').

Defining variables is easy. There are two ways you can instantiate a variable. The first way is to declare it and assign it at the same time. For example:


int num = 1;

Here we are making an int with the name num and it contains the value 1. The default way to make these types of variables is:


type name = value;

Here the type is the object type (int, double, String etc). The name is any name you want. However, you can define two variables with the same name. The value is the data that is assigned to the name.

Now what if you want to declare a variable but use it later?

Well you can define a variable and set it later. For example:


int num;
//other code (this is a one line comment, this will not be read by the compiler).
num = 1;

Here you are declaring the variable, but setting it later. If you try to use the variable without assigning it a value, you'll get a syntax error.

 

You can also assign one variable the value of another. For example:


int a = 1;
int b = a;

Here b will also be equal to 1.

 

Basic Scope

 

Variables made in the main method will only be able to be used there. If you decide to make a different method and use variables in the main method in the other method, you'll get a syntax error. (Methods will be discussed later on). To fix this, you can define global variables. Global variables can be accessed any where in the class. When declaring global variables you can set the access level. The access level is how your variable can be accessed, meaning can other classes see it or not (classes will be covered later on).

The two common access levels are:

  • public: The access level public means that other classes can see it.
  • private: Other classes cannot see a variable with access type of private.

This is where you would declare global variables:


public class HelloWorld{

public int a = 1;
public int b;

public static void main(String[] args) {

}
}

 

Using Variables

 

There are many uses for variables. You can use them to add. For example:


int a = 1;
int b = 2;
int c = a + b;

Here c  will be equal to 3 because 1 + 2 = 3.

 

Here are some operators which can be used with ints, floats, doubles, and longs in Java:

  • +: This is the addition operator.
  • -: This is the subtraction operator.
  • /: This is the division operator.
  • *: This is the multiplication operator.
  • %: This is the modulus operator. This will give you the remainder of two numbers. E.g 5 % 2 = 1 because when dividing 5 by 2 you have a remainder of 1.
  • ++: This is the increment operator. This will increase the value by 1. E.g If we have a variable x with the value 2, after x++ the value will be 3.
  • --: This is the decrement operator. This will decrease the value by 1. E.g If we have a variable x with the value 2, after x++ the value will be 1.

 

Another important thing you can do with variables is print them.


String abc = "Hey";
int num = 3;
System.out.println(abc);
System.out.println(num);

This will print:


Hey
3

 

Conditional Statements

 

Conditional statements basically say that if a condition is met, only then will a piece of code get executed. There are three types of conditional statements.

  • The if statement
    • This basically means that if a condition is true then the code will get executed. If the condition isn't true, nothing will happen. For example:


int num = 1;
if(num == 1){
System.out.println("Num = 1");
}

Here if num is assigned to be 1, there will be a print statement saying num is 1. If not nothing will happen. Now notice how the if statement is worded:


if(VariableNameOrValue == AnotherVariableNameOrValue) {
//code to be executed if the statement is true.
}

Notice the two equal signs. You have to have the two equal signs or you'll get an error.

[*] The if else statement

  • This lets you execute one piece of code if something is true and another if it isn't. For example (I'll use booleans since I have shown you how to define them):

    boolean a = false;
    if(a == false){
    System.out.println("A is false");
    } else{
    System.out.println("A isn't false.");
    }
    //you can also use this with numbers. For example:
    int b = 2;
    if(b == 2){
    System.out.println("B is 2");
    } else{
    System.out.println("B isn't 2");
    }
    
    


[*] The if elseif Statement

  • The if elseif Statement goes through two or more statements one by one and if any of them is true, it executes the code in the statement and stops. For example:

    int b = 2;
    if(b == 1){
    System.out.println("B is 1");
    } else if(b == 2) {
    System.out.println("B is 2");
    }else if(b == 3) {
    System.out.println("B is 3");
    }else {
    System.out.println("B isn't 1, 2 or 3");
    }
    
    


      • Notice how you can use else statements with an else if statement.

Other operators

Now what if you don't want to see if something is equal. What if you want to check is something is bigger then something else? Well there are more operators you can use to compare two values.

  • >: This is the greater than operator. This will be true if the left value is greater than the right.
  • <: This is the less than operator. This will be true if the left value is smaller than the right.
  • <=: This is the less than or equal to operator. This will be true if the left value is smaller than or equal to the right.
  • >=: This is the more than or equal to operator. This will be true if the left value is bigger than or equal then the right.
  • !: This is the not operator. This will be true if the value isn't something.
  • .equals(""): This is the equals operator for strings. YOU CAN'T DO == WITH STRINGS. You have to use .equals().

Here's how you use some of these operators:


int b = 2;
if(b > 1){  //true
if(b < 1){  //false
if(b >= 1){  //true
if(b <= 1){  //false
if(b != 1){  //true
String a = "Saad";
String b = "a";
if(a.equals(b)){//if a equals b  -- False
if(!a.equals(b)){//if a does not equal b -- True

 

Loop Statements

 

A loop is a statement which allows code to be repeatedly executed. There are three types of loops. I'll be covering two types and the third type later on.

  • The While Loop
    • The while loop goes on till the condition inside it becomes false. Typically we use a counter or a boolean to control loops. Here is an example:


int counter = 0;
while(counter <= 10){
System.out.println(counter);
counter++;
}

//Heres a loop controlled by a boolean

boolean b = false;
int a = 0;
while(b == false){
System.out.println(a);
if(a == 10){
b = true;
}
}

These two loops are exactly the same thing and they both will print the numbers 0 to 10, each on a new line. Here's how most loops are formatted:


int counter = 0;
while(conditional which usually involves counter){
//code
//change counter so we don't result in an infinite loop.
}

An infinite loop goes on forever and will eventually slow down your computer.

[*] The For Loop

  • The for loop is just like a while loop but here you make the counter, add the condition and change it in one line. It's basically a way to write a while loop horizontally instead of vertically. Here's the basic syntax:

    for( create counter; condition; change counter ){
    //do code
    }
    
    


    Here's how you'd print numbers from 0 to on using a for loop instead of a while:


    for(int counter = 0; counter <= 10; counter++ ){
    System.out.println(counter);
    }
    
    


Some tips:

- Anything variable declared in the loop will only be accessible inside the loop. It will also be reset after the loop increments. The way to avoid this is to not declare variables inside the loop but declare it before the loop.

 

Methods

 

Suppose you want to do the same logic of code many times but with different values. Let's say you want to add two different values but the values will be different most of the time (like in a calculator). To do this you use methods. Methods have to be placed outside the main method but inside the class: For example:


public class HelloWorld{

public static void main(String[] args) {
System.out.println("Hello World!");
}
//method 1
//method 2
}

Methods can be classified into two types.

  • void: This type of method does not return any value. It only changes existing values. Here's how void methods look like:


AccessLevel void name(Parameters){
//code
}

Here's a completed method which displays numbers from 0 to 10 and how you can call the mehtod.


public class HelloWorld{

public static void main(String[] args) {
displayNumbers();
}

public void displayNumbers(){
for(int counter = 0; counter <= 10; counter++ ){
System.out.println(counter);
}
}
}

This code will display numbers from 0 to 10. Notice this method has no parameter. A parameter is a way of giving our method values to use.

Let's say you wanted a method to print numbers from 0 till x, where x can be any number. Here's how the method would look like:


public class HelloWorld{

public static void main(String[] args) {
displayNumbers(12);
}

public void displayNumbers(int x){
for(int counter = 0; counter <= x; counter++ ){
System.out.println(counter);
}
}
}

Notice three things here.

  • I now have something inside the parenthesis when calling the method. I have to have a number inside the parenthesis because the method has an int parameter. If I try to do displayNumbers("String"); I'll get a syntax error. I have to have an int inside the parenthesis.
  • The second thing is that I have included a parameter when defining a method. To add a parameter you have to add Type name in the parenthesis. To add multiple parameters you separate them with commas.
  • The third thing which I changed is the 10 in the counter. The 10 is now x meaning the loop will go on till counter is equal to x.

Here's a method which displays numbers from a to b. Where a and b are parameters and can be anything.


public class HelloWorld{

public static void main(String[] args) {
displayNumbers(1, 12);
}

public void displayNumbers(int a, int b){
for(int counter = a; counter <= b; counter++ ){
System.out.println(counter);
}
}
}

The return statement

The return statement can be used in void methods to stop a method early. It's optional but it can come in handy. For example let's say you want a parameter to be more then 0. So to implement this you can add a if statemenet and if it's true you can add a return statement. Here's an example of how you'd check to see if the parameter a is less than 0 and if it is how to stop it.


public class HelloWorld{

public static void main(String[] args) {
displayNumbers(1, 12);
}

public void displayNumbers(int a, int b){
if(a < 0){
return;
}
for(int counter = a; counter <= b; counter++ ){
System.out.println(counter);
}
}
}

[*] Methods that return something

You can also use methods to get values. Here's the basic syntax of defining return methods:


AccessLevel returnType name(Parameters){
returnType a = ...;
return a;
}

The return type can be any variable type. It can be a String, int, double or any type of variable. Notice how I have a variable (it can also be a value) after the return statement.

The return statement basically stops the method and sends a value/object back to the caller. (You'll understand later on with examples).

You have to have a return statement in a method that isn't a void method.

 

For example if you wanted to get what a + b is you'd make a method like this:


public int add(int a, int b){
int c = a + b;
return c;
}

See how I'm returning c? You can assign returned values to a variable of the same type. For example:


public class HelloWorld{

public static void main(String[] args) {
int c = add(1, 12);//here c will be 13
}

public int add(int a, int b){
int c = a + b;
return c;
}
}


This is just a beginner's guide to methods. Methods can get more complex and there are many types of methods (recursive, overloaded, overridden etc) which I may cover in a later tutorial.


Classes

 

Classes in Java is the last thing I'll be covering today. Classes are basically object types in Java. Remember how I said you can make your own variable types? Well this is how. You can have many classes in your program, but usually only one has a main method.

Classes are made to keep similar methods in one place or to make a new object type.

Classes are made like this:


accessType class NameOfClass{

}

Classes are made to keep similar methods in one place or to make a new object type.

  • Here's a class which has similiar methods together.


public class MathOps{
public static int add(int num1, int num2){
int answer = num1 + num2;
return answer;
}
public static int subtract(int num1, int num2){
int answer = num1 - num2;
return answer;
}
}

Here you see a new word: static. static methods can be used from other classes without making an instance of the class.  (You'll understand better when I show you the other type of class).

To use these methods from another class you'd do: MathOps.add(1, 2);

For example:


public class HelloWorld{

public static void main(String[] args) {
int c = MathOps.add(1, 12);//here c will be 13
}
}

[*] Classes which can be instantiated.

Here's an example of a class which can be instantiated:


public class Car{
private String make;
private String model;

public Car(String m, String m2){
make = m;
model = m2;
}
public void Drive(){
//drive code
}

}

Here you'll notice something that should ring bells in your brain. I HAVE A METHOD WITH NO RETURN TYPE? WHAT???

Well, notice how it has the same name as the class name. This is a constructor. A constructor is like a method but it doesn't have a return type.

It allows you make an instance of the object. You can have as many constructors as you want (they have to have different parameters) and ususally the parameters are assigned to the global variables (which are usually private).

To create instances of objects you use the following syntax:


ObjectType name = new ObjectType(Parameters if any);

 

Here's how you'd make a new Car object in another class.


public class HelloWorld{

public static void main(String[] args) {
Car a = new Car("BMW", "X5");
}
}

Basically that's making a new car.

I can make as many cars as I want:


public class HelloWorld{

public static void main(String[] args) {
Car a = new Car("BMW", "X5");
Car a = new Car("Mercedes", "S550");
Car a = new Car("Lexus", "RX400");
}
}

Back to the car class. Notice I have a drive method there. The drive method isn't static. That means I can't do Car.drive();

I can however do this:


public class HelloWorld{

public static void main(String[] args) {
Car a = new Car("BMW", "X5");
a.drive();
}
}


  • If I had a static method in the Car class, doing a.staticMethod would give me an error. I'd have to do Car.staticMethod

 

Well that's the end of the tutorial.

Have a good start on Java, Nicolás™

 

Posted

axax Sex +1

 

Off:

[9:38:23 μμ] Nicolas™: pineis tpt re mlka? xD

[9:38:47 μμ] kOzA barney: Ligw xorto opos panda

[9:38:54 μμ] Nicolas™: x0ax0a

[9:38:54 μμ] Nicolas™: xD

Nicolas™

  • 2 weeks later...

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