Jump to content

Recommended Posts

Posted

Γεια σε όλους είχα κάνει παρόμοιο τόπικ πριν πολύ καιρό αλλά μιας και τώρα καταλαβαίνω τα πράγματα 1000 φορές καλύτερα είπα να ξανακάνω, άλλωστε αυτό θα περιέχει πιο πολλά πράγματα. Σήμερα θα μιλήσουμε συγκεκριμένα για το πώς μπορούμε να κάνουμε συνδέσεις στην database μέσω Java στο L2J και πώς μπορούμε να εκτελούμε εντολές και όλα τα σχετικά

 

Πότε και πού χρησιμοποιούμε SQL connections, σε τι είναι χρήσιμες?

Σίγουρα κάποιος πρώτη φορά θα το αναρωτηθεί. Λοιπόν καταρχάς συνδέσεις με database θα χρειαστόυμε σε περιπτώσεις που θέλουμε να πάρουμε στοιχεία απο την database (λογικό) από οποιοδήποτε table,column θέλουμε εμείς και σε περιπτώσεις που θέλουμε κάτι να περάσουμε μέσα στην database μας. Το καλό πράγμα σε όλη την ιστορία που χωρίς αυτό δεν θα είχε και νόημα,είναι ότι στην database τα πράγματα μας μένουν και μετά το restart του server μας , μένουν για πάντα αν το θελήσουμε! (ανάλογα βέβαια) Χαρακτηριστικά Παραδείγματα : donate system , nobless , pvp kills.

Και τα 3 παρατηρείτε ότι δεν διαλύονται με το rr του server , ένας donator είναι και μετά το rr donator, ένας nobless είναι Nobless και μετά το rr και ένας παίκτης μετά το rr του server έχει όσα pvp είχε πριν, δεν μηδενίζονται.

 

Πολλά λόγια , πάμε στο ψητό , ας αρχίσουμε

Θα προσπαθήσω να το εξηγήσω όσο καλύτερα μπορώ.

Καταρχάς κάνουμε Import για αρχή τα εξής

import java.sql.Connection;
import java.sql.PreparedStatement;
import net.sf.l2j.L2DatabaseFactory;

Όπως βλέπετε έχουμε κάνει Import την κλαση Connection και την κλάση PreparedStatement .

κλάση Connection: με αυτή θα δημιουργήσουμε την σύνδεση μας για να μπούμε στην database του server, το λέει και η λέξη , έτσι δεν είναι?(Connection=σύνδεση)

κλάση PreparedStatement: στην SQL εκτελόυμε συνέχεια statements ( προτάσεις - εντολές ).

π.χ ΚΑΝΕ ΟΛΟΥΣ ΤΟΥΣ ΠΕΚΤΕΣ ΝΟΒΛΕΣΣ

Αυτή είναι μια πρόταση που εκτελείται , βέβαια όχι έτσι αλλά στην SQL για να το κάνουμε αυτό γράφουμε

UPDATE characters SET nobless=1 WHERE accesslevel=0

πχ έτσι κάνουμε nobl τους παίκτες που δεν ειναι GM

Άρα αυτή η κλάση μας βοηθάει σε αυτό , να δημιουργήσουμε προτάσεις σε SQL μέσω Java.

 

Αφού πλέον γνωρίζουμε σε τι θα μας χρειαστούν αυτές οι 2 κλάσεις πάμε να τις χρησιμοποιήσουμε.

Καταρχάς δημιουργούμε ένα αντικείμενο για την καθεμία κλάση βάζοντας το τιμή null προς το παρόν δηλαδή άδεια τιμή , δεν θα περιέχει τίποτα.

Connection connection = null;
PreparedStatement state = null;

Τώρα καταλαβαίνετε και οι ίδιοι σας ότι η σύνδεση είναι δυνατόν να μην πετύχει 100% ειδικά αν έχει και προτάσεις μέσα λόγω λαθών στην σύνταξη του SQL ή ακόμα λόγω της μη-ύπαρξης της database άρα θα χρειαστούμε να περυκυκλώσουμε τον κώδικα μας με try/catch. Τα προσθέτουμε λοιπόν

try
   {
   }
catch(Exception e)
{
e.printStackTrace();
}

μέσα στα blocks του try θα είναι ο κύριος code. στο catch βλέπουμε πως βάλαμε την μέθοδο e.printStackTrace(); η οποία είναι καλή να την βάζετε γιατί αν εμφανιστεί οποιοδήποτε error θα σας το εμφανίζει στο GS και θα είναι πιο εύκολο να το fix.

Πάμε λοιπόν να δώσουμε ζωή στα αντικείμενα που δημιουργήσαμε νωρίτερα και μη ξεχάσαμε απο δω και πέρα ότι κάνουμε είναι μέσα στο try . Καταρχάς λέμε πως το αντικείμενο connection θα είναι μια σύνδεση η οποία συνδέεται με την database που τρέχει ο server, για να το κάνουμε αυτό γράφουμε

connection = L2DatabaseFactory.getInstance().getConnection();

Αυτό μονάχα,πλέον έχουμε σύνδεση στην database χρησιμοποιώντας το connection.Τώρα θα μπορούσαμε να κλείσουμε τη σύνδεση κάλλιστα , αλλά κανένας ο λόγος να δημιουργήσουμε σύνδεση χωρίς ουσιαστικό λόγο. Ήρθε η ώρα να χρησιμοποιήσουμε το άλλο μας αντικείμενο, το state . Αυτό απλά είναι αυτο που είπαμε, θα το κάνουμε να παίρνει μια πρόταση την οποία θα εκτελέσουμε αργότερα στην database . Ας πούμε ότι θέλω να κανω το name σε όλους τους GM, ADMINISTRATOR. Άχρηστο φυσικά γιατί μπορούμε να το κάνουμε και χωρίς connection(και πάλι άχρηστο) στην database αλλά είναι ένα παράδειγμα για να δείτε πως δουλεύει , γράφουμε

state = connection.prepareStatement("UPDATE characters SET char_name='ADMINISTRATOR' WHERE accesslevel>0");

Το update το χρησιμοποιούμε για να αλλάξουμε τιμές στην database σε υπάρχον πράγματα , εδώ αλλάξαμε το ονομα τον GMS.

Έτοιμο και το state , τώρα τι μένει? να εκτελέσουμε τη πρόταση(το state δηλαδή πλέον).

άρα έχουμε

state.execute();

το εκτελέσαμε , αυτό ήταν. και τώρα αυτό που δεν ξεχνάμε ποτέ να κάνουμε είναι να κλείσουμε τη σήνδεση αλλά και την πρόταση αλλιώς θα έχουμε έρρορς άρα πολύ απλά γράφουμε

connection.close();
state.close();

Αν βρει καποιο έρρορ παει κατευθείαν στο catch , τώρα προσθέτουμε και το εξής

finally
{
	  try
			{
			connection.close();
			}
		catch (SQLException e)
			{

			e.printStackTrace();
			}
		      }

Με το finally λέμε τι θα κάνει τελικά και αυτό που θέλουμε να κάνει τελικά στα σίγουρα , ειναι να κλείνει την σύνδεση , άρα έτσι εξηγείται το παραπάνω.

Αυτό ήταν ολόκληρος ο κώδικας θα είναι έτσι

Connection connection = null;
PreparedStatement state = null;
try
   {
       connection = L2DatabaseFactory.getInstance().getConnection();
      state = connection.prepareStatement("UPDATE characters SET char_name='ADMINISTRATOR' WHERE accesslevel>0");
      state.execute();
      connection.close();
      state.close();
   }
catch(Exception e)
{
e.printStackTrace();
}
finally
{
	  try
			{
			connection.close();
			}
		catch (Exception e)
			{

			e.printStackTrace();
			}
		      }

Αυτό ήταν ένα καθαρό εύκολο παράδειγμα για το πως ανανεώνουμε (UPDATE) υπάρχον στοιχεία στην database μας. Τώρα πάμε να δούμε πώς θα διαβάζουμε απο την database

Στο παράδειγμα θα διαβάσουμε πόσα pvp έχει ένας παίκτης με ονομα Unix για παράδειγμα.

αρχίζουμε πάλι το ίδιο γράφουμε τα ίδια:

Connection connection = null;
PreparedStatement state = null;
try
   {
      
   }
catch(Exception e)
{
e.printStackTrace();
}
finally
{
	  try
			{
			connection.close();
			}
		catch (Exception e)
			{

			e.printStackTrace();
			}
		      }

Και τώρα μέσα στο try πάμε για τον κύριο code, δεν εξηγώ τι κάνει το καθένα τώρα τα είπα παραπάνω.

Δημιουργουμε το connection

connection = L2DatabaseFactory.getInstance().getConnection();

Και τώρα το κύριο που αλλάζει είναι η πρόταση , το state . γράφουμε

state = connection.prepareStatement("SELECT pvpkills FROM characters WHERE char_name='Unix'");

Έτσι διαλέγουμε ( select ) τα pvpkills απο το table characters(FROM characters) όπου ονομα ισούται με Unix(char_name='Unix')

Τώρα δεν θα εκτελέσουμε τον κώδικα γιατί δεν έχει ουσία δε θα συμβεί τίποτα.

Δημιουργούμε μια μεταβλητή int στην οποία θα αποθηκεύονται το πόσα pvp έχει.

int pvps = 0

Τώρα για να πάρουμε το αποτέλεσμα της πρότασης (state) και να το αποθηκεύσουμε στην μεταβλητη pvps θα χρειαστεί να κάνουμε import μια νέα κλάσση με όνομα ResultSet

import java.sql.ResultSet;

η κλάση αυτή μας βοηθάει να πάρουμε το εκτελέσιμο αποτέλεσμα , εδώ συγκεκριμένα τα pvpkills του παίκτη Unix.

Τώρα πάμε κάτω απο το αντικείμενο connection και δημιουργούμε και ένα αντικείμενο ResultSet με άδεια τιμή προς το παρόν

ResultSet rset = null;

Μετά πάμε εκεί που είχαμε μείνει και δίνουμε αξία στο αντικείμενο rset , γράφουμε

rset = state.executeQuery();

Τώρα δώσαμε τιμή στο rset, με αυτην την εντολή λέμε στο rset να δωθεί στην ουσία το αποτέλεσμα της πρότασης (state)

Ωραία , τώρα πως δίνουμε το αποτέλεσμα που είναι τα pvp kills στην μεταβλητη pvps?

Γράφουμε

while(rset.next())
{
pvps = rset.getInt("pvpkills");
}

Λιγο περίπλοκο ε?Είναι απλό .

με το while(rset.next()) λέμε ουσιαστικά όσο το αντικείμενο rset ( που ειναι το αποτελεσμα ) έχει κάτι να μας δώσει, έχει ένα αποτέλεσμα (στην ουσία έχει 1 γιατί μονο απο 1 παικτη παιρνουμε τα pvps)

τότε η μεταβλητη pvps να ισούται με την μεταβλητή pvpkills του rset , to pvpkills είναι αυτό που γράψαμε στην πρόταση μας. SELECT pvpkills , έτσι παίρνουμε την τιμή του.

άρα τώρα αυτό ηταν, η μεταβλητή pvps δηλώνει πόσα pvps έχει ο παίκτης Unix.

άρα λοιπόν τώρα κλείνουμε ότι πριν αλλά και το rset

connection.close();
rset.close();
state.close();

 

 

Αυτά ήταν κάτι βασικά που πρέπει να ξέρετε, διαβάστε τα κάντε εξάσκηση και δέστε παραδείγματα απο διάφορα codes που χρησιμοποιούν συνδέσεις στην database, σίγουρα θα καταλαβαίνετε πολλά περισσότερα  :D

Posted

Poly kalo guide

+oti tha prepei na kseroun na ftiaxnoun sql queries kai episis poly simantiko kalo tha itan ta queries na ta ftiaxnete kai na ta dokimazete stin navicat apo to na kanete compile kai na deite meta oti exete sintaktiko lathos.

Posted

Fobero guide. Gj UnixCode.

thanks bro

Poly kalo guide

+oti tha prepei na kseroun na ftiaxnoun sql queries kai episis poly simantiko kalo tha itan ta queries na ta ftiaxnete kai na ta dokimazete stin navicat apo to na kanete compile kai na deite meta oti exete sintaktiko lathos.

euxaristw

  • 1 year later...
Posted (edited)

Ευχαριστώ πάρα πολύ ρε αδελφέ! Τώρα μπορώ να φτιάχνω τους δικούς μου κώδικες γρήγορα και εύκολα με της γνώσεις που έχω στο java!

Edited by BadSystem™
Posted

gtp einai ta code, outdated

 

twra apla vazeis try( )

                          {

 

                          }

 

kai den xriazete na kaneis close se finally pou merikes fores petane npe

Posted

gtp einai ta code, outdated

 

twra apla vazeis try( )

                          {

 

                          }

 

kai den xriazete na kaneis close se finally pou merikes fores petane npe

malon den prosekses oti lei oti ftiaxtike martio tou 2012 tote etsi itane 

Posted

malon den prosekses oti lei oti ftiaxtike martio tou 2012 tote etsi itane 

 

to try with resources vgike me tin java7 to 2011 trele, dld ena xrono peripou prin to guide

Posted (edited)

gtp einai ta code, outdated

 

twra apla vazeis try( )

{

 

}

 

kai den xriazete na kaneis close se finally pou merikes fores petane npe

++ Edited by Nightw0lf
  • 3 weeks later...
Posted

oraios odigos file mou den to exw xanadei prosopika egw ... Tha ithela na kanw mia erotisi tha mporousa na xrisimopoiisw auto ton tropo gia admin panel event live , diladi na kanw event live mesa ston server mou ? h tha ypirxe problima lags k.t.l?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • ## [1.5.5] - 2026-02-02   ### ✨ New Features - **Discord Login**: You can now sign in with your Discord account. Admins enable and configure Discord login in **cpadmin → Users** (Discord auth settings: Client ID, Client Secret, Redirect URI). If you already have an account with the same email (e.g. forum, Google, or legacy), signing in with Discord links to that account so you keep one profile. Discord login is available on Add Server, My Servers, Vote page, and Premium Ads booking. - **Setup Links**: In **cpadmin → Users**, both Google and Discord login settings now include direct links to their official developer portals (Google Cloud Console and Discord Developer Portal) for easier OAuth app setup.   ### 🔒 Security - **Email Required for Registration**: New user registration via OAuth (Forum, Google, Discord) now requires a valid email address. If the OAuth provider doesn't provide an email (e.g. unverified Discord email), registration is rejected with a clear message. This prevents anonymous accounts and ensures all users can receive important notifications.   ### 🔄 Improvements - **User Auth Badges**: In **cpadmin → Users**, the Registered Members table now shows auth method badges: **Forum**, **Google**, **Discord**, or **Legacy**. Users can have multiple badges if they've linked multiple login methods. - **Server Info Labels**: Translated server info labels (Owner Name, Language, Server Location) are now properly localized in all 5 languages (English, Spanish, Portuguese, Greek, Russian).   ---   ## [1.5.4] - 2026-02-01   ### ✨ New Features - **Google Login**: You can now sign in with your Google account. Admins enable and configure Google login in **cpadmin → Users** (Google auth settings: Client ID, Client Secret, Redirect URI). If you already have an account with the same email (e.g. forum or legacy), signing in with Google links to that account so you keep one profile. The login menu (navbar and login prompts) offers **Login with Forum Account**, **Login with Google** (when enabled), and **Create Forum Account**. Google login is available on Add Server, My Servers, Profile Settings, Vote page, and Premium Ads booking. - **Ban/Unban Members**: In **cpadmin → Users**, admins can ban or unban registered members. Banned users see a full-page message: "Sorry, you are banned from using this site." When a user is banned, all their servers are set to inactive. - **Moderator Activity Log**: **cpadmin → Moderators** now records when a moderator or admin enters the CPAdmin panel (e.g. "Moderator X entered CPAdmin panel at <time>") and when they change any cpadmin settings (only write actions are logged; read-only use is not). - **Clear Moderator Logs**: Admins can clear all moderator activity log entries via a **Clear logs** button with confirmation. Logs are shown at 100 per page with pagination. - **Filter by Moderator**: In the Moderator Activity Log, a **Filter by moderator** dropdown lets you view activity for a specific moderator or "All moderators." - **cpadmin → Users Tab**: New **Users** tab in the admin panel with Registered Members list (paginated), Google auth settings card, and per-user Ban/Unban and server links.   ### 🔄 Improvements - **cpadmin → Servers**: Each server name in the servers table is now clickable and opens that server’s info page. - **cpadmin → Users – Servers column**: The servers count/list is clickable and opens a small modal listing that user’s servers; each server name in the modal links to the server info page. - **cpadmin → Users – Search**: A search bar above the Registered Members table lets you search by **username**, **email**, or **server name**. Results are filtered on the server (paginated); clearing the search resets the list. - **Moderator Activity Log**: Pagination shows "Showing X–Y of Z" and "Page N of M" with Previous/Next when there are more than 100 entries. - **Login UI**: Login options (Forum, Google, Create account) are shown in a consistent dropdown and in modals (Add Server, My Servers, Vote, Premium Ads) for a clearer sign-in experience. - **Vote Page – Unauthenticated**: When you must log in to vote, the page now shows "Vote for [Server Name]" as the main heading and presents login options in a compact section.   ---   ## [1.5.3] - 2026-01-30   ### ✨ New Features - **File Logs in Admin Panel**: Admins can now view CodeIgniter PHP logs (api/writable/logs) directly in **cpadmin → Logs**. Select a date to view the log file, refresh to reload, or delete all log files to free up space.   ### 🔄 Improvements - **Cache System**: Full cache audit and improvements — when you clear cache in cpadmin, both backend and frontend caches are cleared. Server listings, My Servers, pricing, ad config, and chronicles all refresh with fresh data. New paid servers now appear in listings and My Servers immediately. - **Admin Panel – Server Rates**: Server rates in the admin servers table now display in compact format (e.g. x10000 → x10k, x100000 → x100k, x1000000 → x1m) for easier scanning. Hover to see the full value.
    • WTB High Five source running on Salvation/Fafurion client
    • MoMoProxy has updated more static residential proxies for USA location, anyone interested in can view: https://momoproxy.com/static-residential-proxies
    • Hello, i am selling a project that was going to open but at the end i have not the time to do it Its a c4 server ( scripts) with all the c5 changes played from Interlude Client    the server is 1:1 copy of the legendary 2007 L2Revenge server with some bits like events and some more sync stuff There is a lot of retail fixes included  , extender is vanganth and has a lot of mods but mostly fixes on the retail stuff.   Test server is available through discord , i offer client/patch/server/sources The price is 300 Euro and for testing the server you have to pm me at discord banshee1019 , dont really wanna let anybody log because some people are "bad"   Once you buy you also have free support for 1 year , that doesnt mean i will code all your ideas but support you if something comes up , and guide you to do simple edits
  • Topics

×
×
  • Create New...

Important Information

This community uses essential cookies to function properly. Non-essential cookies and third-party services are used only with your consent. Read our Privacy Policy and We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue..