Jump to content

Recommended Posts

Posted (edited)

Hello Everyone,

 

 

I bring you not a PHP-based L2 server, not a full-fledged website, but a library that will revolutionize L2J web development.

 

Introduction


Many parallel projects have been developed over the years, and L2J today is divided into several distributions, each with a different database, whether by table name, fields, etc. A standard was never established for all banks to respect a specific nomenclature, sometimes they were developed by amateur developers, who despite being skilled, never studied and do not know good practices or follow some type of standard.   

This makes it difficult to develop compatible applications with so many revisions (L2jserver, l2jbrasil, dream, sunrise, frozen, etc.) and different game versions (Interlude, Gracia, Classic, etc.). 

The big challenge of all is,  How to create web applications, in php, that are compatible with the largest number of revisions possible?

 The answer to that is Data Harmonization.

 

 

Quote

Data Harmonization is the concept that you can create applications that interpret several different data sources and that act with a single input and output pattern.

 

 

 

And the best way to do that is to work on the Model layer, which passes to controllers a single known data format. It sounds complex, but isn't it that much ?

 

 

How it works?

 

First we have to define a set of constants:

 

<?php

//PROJECT DEFAULTS
define('L2JBR_DIST', "L2JSERVER"); //Wich distribuition?
define('L2JBR_L2VERSION', "Interlude"); //Game Version 

define('L2JBR_SALT', 'change_it_for_something_else'); //This constant will be used to encription and security in the future.



//DATABASE
define('L2JBR_DB_DRIVER', "mysql");
define('L2JBR_DB_HOST', "localhost");
define('L2JBR_DB_PORT', 3306);
define('L2JBR_DB_NAME', "l2jdb");
define('L2JBR_DB_USER', "root");
define('L2JBR_DB_PWD', "");

 

When configuring the application, it will be necessary to tell which version the Models will be used for. The standard model is the L2JSERVER, as it is the base project for 99% of the other projects, and Interlude, which is the most widespread version, which already increases the initial compatibility of the library.

But there you go, you must be asking "okay, but how does it all happen?", See the example below with the Model "Characters" responsible for manipulating a character's data:

 

<?php

$CharactersModel = \L2jBrasil\L2JPHP\ModelFactory::build('Players/Characters');

$CharactersModel->get('ID'); //Get Character by ID
$CharactersModel->update('ID', ["name"=> "Grundor"]); //Update character name given ID
$CharactersModel->ban('ID'); //Apply ban routines for an character
$CharactersModel->all(['name','level'],false,10,'level'); //Get Top 10 characters

//Advanced Example:
$CharactersModel->select(['character.id','account.name'])
    ->join(\L2jBrasil\L2JPHP\ModelFactory::build('Players/Account'))
    ->orderby('level')
    ->limit(100)
    ->query()
    ->FetchAll();

 

The secret is in this "ModelFactory" class. The build method returns the requested model instance, in this case, in the Player/Character namespace. But how does he do it?

It dynamically assembles the class instance based on the configuration of the DIST and L2JBR_L2VERSION and will throw an exception if it does not exist, 

So in the example above the call to "Build" would do the same thing as:

 

<?php

$CharactersModel = \L2jBrasil\L2JPHP\Models\Dist\Interlude\L2JSERVER\Players\Characters();
//...

 

 

Which can be used directly too, without problems, since they are all independent and instantiable classes.
 

Every model will have CRUD ( Create, Read, Update and Delete  in English)   and "listing (all)" operations. In addition, models implement interfaces, these interfaces will ensure that every model, for example "Characters", of all versions, has the same more standard methods (ban, move, changeProfession, changeLevel, cleanPK, etc.), in addition it will be dynamically allowed.

 

In order to maintain compatibility, a class is being developed that will set up the "where" conditions (second parameter of the all method (listing)) so that the conversion of column names is also applied dynamically by a "field map" that mantain compatibility among all diferent databases, so nomore problens with diferent l2j or l2off distribuitions. 

 

Take a look at Characters class

 

 

<?php
/**
 * Copyright (C) 2018 L2JBrasil
 * @autor Leonan Carvalho
 * @license MIT
 */

namespace L2jBrasil\L2JPHP\Models\Dist\Interlude\L2JSERVER\Players;


use L2jBrasil\L2JPHP\Models\AbstractBaseModel;

class Characters extends AbstractBaseModel implements \L2jBrasil\L2JPHP\Models\Interfaces\Players\Characters
{
    protected $_table = 'characters';
    protected $_primary = 'charId';
    protected $_tableMap = [
        "name" => "charName",
        "id" => "charId"
    ];

    public function ban($id)
    {
        // TODO: Implement ban() method.
    }

    public function getOnline()
    {
        $onlineCol = $this->translate('online');
        $where = "{$onlineCol}  = 1";
        return $this->count($where);
    }
}

 

 

 

 

 

 

How can you help?

 

There are several revisions, all of them will need and can be implemented,

  • you can write models compatible with the revisions so that it can be used to expand the compatibility of the applications developed using this framework.
  • You may help bulding websites or tools using these library, tools, painels and more web (php) based applications using this library, to expand its coverage.

 

 

 

 

Technical information

 

Licence: MIT

PHP version supported: 7.0+

Installation method:  composer

Namespace standard: "Autoloading Standard" ( PSR-0 ) (migrating to new PSR-4 since deprecation of PSR-0)

Status: Work in Progress

Repository and Versioning: GIT

Repository link:   https://github.com/L2jBrasil/L2JPHP

 

 

Edited by Grundor
  • 3 weeks later...
  • 1 month later...
Posted
On 10/1/2020 at 12:33 PM, iTopZ said:

sql injection? repeated post requests work or 'fixed'

All transactions are made by PDO, naturally sql-injection proof for most of cases.

 

Is nice to review all code, double-checks is never enougth.

 

https://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection

Posted
12 hours ago, iTopZ said:

 

SQL injection protection in most of case are implemented on input layer validation, for example:

 

<?php
$login = "a test or '1='1;";
$result = preg_replace('/[^[:alpha:]_]/', '',$login);
echo $result;

 

The L2JPHP handles the DataLayer its not intent to be a Controller, but some logics can be implemented.

 

The protection on L2JPHP is prepearing every transaction in a single statement, the data is sent in a single transaction, not two transaction, I prefer this way.

 

https://github.com/L2jBrasil/L2JPHP/blob/master/src/L2jBrasil/L2JPHP/Models/AbstractSQL.php#L108

 

If you try to send something like this will trigger an exception:

 

<?php


$dataInput = "grundor';Select * From accounts;"

$sql = "INSERT INTO accounts(login,pwd) VALUES('{$dataInput}','{$pwd}')";

 

 

 

Posted
On 11/7/2020 at 9:16 AM, xdem said:

oh no, please no

?

On 11/7/2020 at 11:49 AM, iTopZ said:

to late.

 

It's a open-source project, feel free to make your contribuition to improve its security.

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

    • L2 ASAGONIUM - High Five PvP/Craft Server [OPEN BETA] Website: http://l2asagonium.eu/ Hello everyone, After months of development, tuning and a lot of late nights, I'd like to introduce you to L2 Asagonium - a Lineage 2 High Five server built around one simple idea: a fair, long-lasting world where your time and skill matter more than your wallet. We are currently in OPEN BETA, which means the server is fully online, fully playable, and we are actively listening to feedback to polish the final experience before the official launch. ----------------------------------------------------------- ABOUT THE SERVER - Chronicle: High Five (Mobius) - Type: PvP / Craft hybrid with custom content - Status: Open Beta - join, test, shape the server - Mentality: No Pay-to-Win. Ever. ----------------------------------------------------------- WHAT MAKES ASAGONIUM DIFFERENT 1) Custom Armor & Weapon Sets We have introduced new tiers of equipment (Twilight, Cronos, Olympus, Exodus, Leviathan, Ixion, Assassin, Odyssey, Chaos, Immortal) with their own visuals, set bonuses and passive skills. Each set has a clear identity and a real role in the meta - no "one best set wins everything". https://l2asagonium.eu/gallery/videos/Video-Preview2.mp4 2) Custom Passive Skills New Asagonium passive skills (P.Atk, M.Atk, HP, Haste and more) tied to gear and progression, so character building has more depth than just stacking enchants. 3) Champion Monster Tiers Multiple tiers of champions across the world with different spawn rates, stat bonuses and rewards - so open-world farming actually stays interesting at every level. 4) Live Leaderboards on the Website This is the part I'm most proud of. Our website is connected directly to the game database in real time. You can browse all characters and see: - Level + exact % to next level - Online / Offline / Offline Farming status - "You Died" status (Dark Souls style, stays until next login) - Death counter per character - Total time played (days / hours / minutes) - Top Adena, Top PvP, Top PK - Max Enchant on equipped weapons - Hover a character name to see their passive skills with icons - Hover an enchant value to see the weapon name, P.Atk and set It updates live. Anyone can check the rankings without logging in. 5) Top Bar Online Counter The website permanently shows how many players are online + offline farming, on every page. Full transparency, no fake numbers. ----------------------------------------------------------- NO PAY-TO-WIN - SERIOUSLY I'm tired of servers that promise "balanced donations" and then sell the best items in the cash shop two weeks later. On Asagonium: - No donation items that affect gameplay balance. - No paid enchants, no paid stats, no paid gear. - No "VIP" buffs that make you stronger than free players. Donations (if/when they exist) will be strictly cosmetic and quality-of-life only. The goal is a server that survives because people enjoy playing it, not because a few whales fund it. ----------------------------------------------------------- OPEN BETA - WHY YOU SHOULD JOIN NOW - The server is fully online and stable. - Your feedback directly shapes the final balance. - You get to learn the custom content before everyone else. - Active development - bugs get fixed, ideas get tested fast. ----------------------------------------------------------- HOW TO JOIN 1. Go to http://l2asagonium.eu/ 2. Open "How to Connect" - it walks you through the client download, the 64-bit patch and the system config in 5 simple steps. 3. Create your account, log in and start playing. ----------------------------------------------------------- LINKS Website / Leaderboards / How to Connect: http://l2asagonium.eu/ ----------------------------------------------------------- Thanks for reading. If you give Asagonium a try during the beta, please drop your feedback - good or bad. That's exactly what this phase is for. See you in-game.
    • Please note:i will provide you with forum address for registration once buyer sends money(my commission) to forum guarantor's payment details. You can register on forum in any day and in any time,which are convenient for you,send code word in private message to forum guarantor(you will receive code word from buyer). If buyer does not purchase your product,you will need to wait private message(answer) from forum guarantor to compare code word. I will invite you in "forum deal". I will add your name,which you registered on forum,in "forum deal". Then you write in "forum deal": "buyer did not purchase product" and add code word(you will have this right according to clause in forum questionnaire). Forum guarantor will refund buyer((in full amount). If buyer purchases your product,buyer notifies forum guarantor and forum guarantor will send money to my payment details.   Sports exercise machines,jacuzzi,building materials,cosmetics,perfumes,shoes,clothing,furniture,bags,televisions,music centers,telephones,laptops,tablet computers,refrigerators,washing machines,microwaves,fans.  
    • Here is a L2JMobius Classic Interlude FULL server. The share includes full server source+datapack, patch, interface and the P110 client. The original build is L2JMobius. However it was bought from a user called "ClassicLude (https://classic-lude.org/)" which is also a huge scammer, selling free Mobius files for $500. I could not believe someone actually bought this, yet here we are.    Unfortunately the admin is a scammer and refused to pay his remaining balance of over $150 to me since he is too busy "working for Bill Gates" and opening the next big mega mall in ChatGPT city therefore not having enough money. The server itself garnered a massive 30 players so I can't really tell you if this is usable. Knowing its backstory and that it is Mobius based i can surmise that it is NOT suitable for serious users. This build is the result of typical AI slop and vibecode "admins" thinking they just "one shotted L2J" because they discovered how to prompt an agent.   I have made the following changes, some of which were regrettably butchered by the admin after he discovered how to download Cursor. Not much more was done due to the absolute displeasure and misery of having to work on a Mobius server.   - Updated files to JDK 22 - Added l2 reborn community board - Added preview system for skins including mounts/agathions - Added AIO npc (buffer/store/teleporter) - Added QuickVar system - Added Ranking system (pvp/pk/online/level and moar) - Added raid boss list on community board - Added drop search+shift click with itemtooltip on community board and npc - Added l2 reborn styled flash windows and window borders and L2UI_CT1 - Added custom donate coin icon in the store swf - Fixed some random bugs like Hot Springs monsters not giving the disease     Links Source+Datapack: https://drive.google.com/file/d/1uMaTzSxKtnLxXC-VoZyHYW_OXq7Oof5L/view?usp=sharing Interface+Compiler+Client tools: https://drive.google.com/file/d/14IJWyYSDOjMycHnJ749H9dRXuv2JeYK3/view?usp=sharing Full Client: https://drive.google.com/file/d/1P7Yd9wI0XcWlLMFDPSdfTZgWhW_9JEii/view?usp=sharing
  • 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..