Search the Community

Showing results for tags 'Guide'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Categories

  • Lineage II Server Packs [Java]
  • Lineage II Server Packs [PTS]
  • Lineage II Server Scripts
  • Lineage II Client Scripts
  • Lineage II Items & Chars
  • Website Templates

Categories

  • Articles

Forums

  • General Zone
    • Announcements and News
    • Newbies Introduce Urself
    • Maxcheaters Competitions & Events
    • Votes/Polls Area
    • Report Section
    • Downloads Section
  • Lineage II General Section
    • General Discussion [English]
    • Request Support [English]
  • Lineage II Hacks,Cheats and Bots
    • Hacks & Cheats [English]
    • Request Hacks & Cheats [English]
    • Botting [English]
    • Request Botting [English]
  • Lineage II Private Servers
    • LineZeus.GR - Η Επιστροφή!
    • Private Servers
    • [Previews] L2 Private Servers
    • Clans and Alliances
  • Lineage II Marketplace
    • Marketplace [Items & Chars]
    • Marketplace [L2Packs & Files]
    • Marketplace [Powerlvl & Support]
  • Lineage II OFF Server Development
    • Server Development Discussion [L2OFF]
    • Request Server Development Help [L2OFF]
    • Server Shares & Files [L2OFF]
  • Lineage II Java Server Development
    • Server Development Discussion [L2J]
    • Request Server Development Help [L2J]
    • Server Shares & Files [L2J]
    • Private Projects [L2J]
  • Lineage II Client Development
    • Client Development Discussion
  • MMO Games
    • League of Legends
    • World Of Warcraft Area
    • Other Multiplayer Games
  • General Section
    • General Marketplace
    • Consoles/Mobiles/PDA Gaming Zone
    • Webmasters Zone
    • Hacking/Coding Zone
  • Graphics/GFX Zone
    • Graphics/GFX General Discussion
    • Graphics/GFX Showcase
    • Graphics/GFX Resources/Tools
  • VIP/SVIP/Donators Zone
    • VIPs/Donators Discussion
    • VIPs Lineage II
    • VIPs [GFX] Zone
    • VIPs Download Area
  • MaxCheaters Corner
    • Tech/World News
    • Off-Topics
    • Spam Topics
  • Gaming Expiriance's Topics

Found 28 results

  1. Whether you are a tanky Templar, or a skilled Assassin, getting Aion Kinah takes a lot of time. Time that many of you don't have. PlayerAuctions knows this which is why we offer cheap Aion Kinah to players. Buy Aion Kinah and save time and effort! With a full pocket, your character can get all items it needs while you have more free time. Have more Aion Kinah than you know what to do with? Why not sell it on https://gold.raiditem.com/game/aion-us-kinah/49? With 1 million members, there are always players waiting to buy Aion Kinah. You also get to set the prices in our marketplace. Best of all, regardless of price, you get all the profit. We'll help you earn real money with your digital treasures! Trading Aion Kinah safely Transacting with other players through the gold.raiditem marketplace is safe and secure. Thanks to our team, we ensure that all Aion Kinah offers are genuine and that each purchase has been delivered before disbursement is issued. There are so many reasons why trading at PlayerAuctions makes perfect sense. We offer the best prices for Aion Kinah US and provide our friendly community with multiple payment options and 24 x 7 Customer Support. We have been keeping our members 0ag&dg*1 and their trades safe since 1999 and are a BBB accredited company. If you have questions, concerns or suggestions, please do not hesitate to contact us. You can reach us through our 24x7 Customer Support, email, or fax. Happy trading! Read More news at https://gold.raiditem.com/
  2. Secrets of the Clockwork City, an explosive Templar build, leveling tips, and more await in our latest Elder Scrolls Online Community Guides article. Enjoy this month's Community Guides!
  3. Hi everyone, apart of L2, I also work on many different things and I'd like to share one example I wrote (because it's not so easy finding out how to do it properly). When you need to render some text that requires more complex rendering than Latin - for example Hebrew, Arabic and Devanagari (Hindi) - you'll have to do some text shaping. It's not so difficult for Hebrew and Arabic (if you don't mind sometimes wrong niqqud, you can implement subset of OpenType and use fribidi) but for Devanagari it's almost impossible to implement again (too much work). If you're on Windows platform only, you can use Microsoft's Uniscribe which works perfectly, on OS X/iOS you can use Apple's Coretext which works very well too. But what if you need it to be platform agnostic? Then you can use FreeType and HarfBuzz :) Also, HarfBuzz can use native (Uniscribe/Coretext) shapers on given platform (depends how you compile it) instead of it's own shaper. So the example here, as for fonts, you can download them from Google, if you want to see output without compiling, scroll down. #include <iostream> #include <harfbuzz/hb.h> #include <harfbuzz/hb-ft.h> #include <ft2build.h> #include <freetype.h> // Input texts in UTF-8 (without Byte Order Mask) static const char *texts[] = { "\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\xa2\xd7\x95\xd7\x9c\xd7\x9d", "\xd9\x85\xd8\xb1\xd8\xad\xd8\xa8\xd8\xa7 \xd8\xa8\xd8\xa7\xd9\x84\xd8\xb9\xd8\xa7\xd9\x84\xd9\x85", "\xe0\xa4\xa8\xe0\xa4\xae\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5\x87 \xe0\xa4\xa6\xe0\xa5\x81\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xbe" }; // Font sizes in points static const size_t fontSizes[] = { 16, 16, 16 }; // Font filenames static const char *fontFiles[] = { "NotoSansHebrew-Regular.ttf", "NotoSansArabic-Regular.ttf", "NotoSansDevanagari-Regular.ttf" }; int main(int argc, char **argv) { // Freetype library handle FT_Library library; // Initialize FreeType if (FT_Init_FreeType(&library)) { std::cerr << "Can't initialize FreeType" << std::endl; return 1; } // Go through all input texts for (size_t textIndex = 0 ; textIndex < sizeof(texts) / sizeof(texts[0]) ; ++textIndex) { // Current input text const char *text = texts[textIndex]; const size_t fontSize = fontSizes[textIndex]; const char *fontFile = fontFiles[textIndex]; // FreeType font face handle FT_Face face; // Load font if (FT_New_Face(library, fontFile, 0, &face)) { std::cerr << "Can't load font " << fontFile << std::endl; return 1; } // Set character size if (FT_Set_Char_Size(face, fontSize << 6, fontSize << 6, 0, 0)) { std::cerr << "Can't set character size" << std::endl; return 1; } // Set no transform (identity) FT_Set_Transform(face, 0, 0); // Load font into HarfBuzz hb_font_t *hbFont = hb_ft_font_create(face, 0); // Create buffer for our text hb_buffer_t *hbBuffer = hb_buffer_create(); // Add our text to buffer hb_buffer_add_utf8(hbBuffer, text, -1, 0, -1); // Detect direction etc hb_buffer_guess_segment_properties(hbBuffer); // Shape our text hb_shape(hbFont, hbBuffer, 0, 0); // Shaped text info unsigned int len = hb_buffer_get_length(hbBuffer); hb_glyph_info_t *info = hb_buffer_get_glyph_infos(hbBuffer, 0); hb_glyph_position_t *pos = hb_buffer_get_glyph_positions(hbBuffer, 0); // Compute text width and origin (from min and max X and Y drawing coordinate) int originX = 0, originY = 0; int minX = INT_MAX, maxX = INT_MIN, minY = INT_MAX, maxY = INT_MIN; // Go through all glyphs and find minimum and maximum X and Y coordinate for (size_t i = 0 ; i < len ; ++i) { // Load glyph if (FT_Load_Glyph(face, info[i].codepoint, FT_LOAD_RENDER)) { std::cerr << "Can't load glyph " << info[i].codepoint << std::endl; return 1; } // Glyph data FT_GlyphSlot slot = face->glyph; // Get X and Y offset int offsetX = ((pos[i].x_offset + slot->metrics.horiBearingX) >> 6); int offsetY = ((pos[i].y_offset + slot->metrics.horiBearingY) >> 6); // Compute minimum and maximum X and Y for this glyph int glyphMinX = originX + offsetX; int glyphMaxX = originX + slot->bitmap.width + offsetX; int glyphMinY = originY - slot->bitmap.rows + offsetY; int glyphMaxY = originY + offsetY; // Update minimum and maximum X and Y for text if (glyphMinX < minX) minX = glyphMinX; if (glyphMaxX > maxX) maxX = glyphMaxX; if (glyphMinY < minY) minY = glyphMinY; if (glyphMaxY > maxY) maxY = glyphMaxY; // Advance originX += pos[i].x_advance >> 6; } // Text will start on 0 originX = -minX; originY = -minY; // Compute width and height size_t width = maxX - minX + 1; size_t height = maxY - minY + 1; // Allocate buffer for image unsigned char *image = new unsigned char[width * height]; // Clear image bufer memset(image, 0, width * height); // Go through glyphs and draw them for (size_t i = 0 ; i < len ; ++i) { // Load glyph if (FT_Load_Glyph(face, info[i].codepoint, FT_LOAD_RENDER)) { std::cerr << "Can't load glyph " << info[i].codepoint << std::endl; return 1; } // Glyph data FT_GlyphSlot slot = face->glyph; // Pointer to bitmap data unsigned char *ptr = slot->bitmap.buffer; // Get real offset int drawX = originX + ((pos[i].x_offset + slot->metrics.horiBearingX) >> 6); int drawY = originY + ((pos[i].y_offset + slot->metrics.horiBearingY) >> 6); // Copy bitmap for (size_t y = 0 ; y < slot->bitmap.rows ; ++y) { // Copy row for (size_t x = 0 ; x < slot->bitmap.width ; ++x) { if (drawX + x < 0) { std::cerr << "drawX (" << drawX << ") + x (" << x << ") < 0" << std::endl; abort(); } if (drawX + x >= width) { std::cerr << "drawX (" << drawX << ") + x (" << x << ") > width (" << width << ")" << std::endl; abort(); } if (drawY - y < 0) { std::cerr << "drawY (" << drawY << ") - y (" << y << ") < 0" << std::endl; abort(); } if (drawY - y >= height) { std::cerr << "drawY (" << drawY << ") - y (" << y << ") > height (" << height << ")" << std::endl; abort(); } image[(drawY - y) * width + drawX + x] = ptr[x]; } // Advance pointer ptr += slot->bitmap.pitch; } // Advance originX += pos[i].x_advance >> 6; } // Output rendered text for (size_t y = 0 ; y < height ; ++y) { for (size_t x = 0 ; x < width ; ++x) { unsigned char value = image[(height - y - 1) * width + x]; if (value >= 0x80) { std::cout << "XX"; // if it's 128+ } else if (value >= 0x40) { std::cout << ".."; // if it's 64+ } else { std::cout << " "; // if its under 64 } } std::cout << std::endl; } std::cout << std::endl; // Delete image buffer delete [] image; // Destroy buffer for text hb_buffer_destroy(hbBuffer); // Destroy HarfBuzz font hb_font_destroy(hbFont); // Destroy FreeType font FT_Done_Face(face); } // Destroy FreeType FT_Done_FreeType(library); return 0; } XXXX XXXX XXXX XXXX XXXX XXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXX XXXX XX XXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXX..XX XXXX XXXX XXXX........XXXX ............XX.. XXXX XXXX ..XX XXXX........XXXX XXXX ............XX.. XX XXXX XXXX XXXX ..XX ..XX XXXX ..XX ..XX XXXX ..XX XXXX ..XX XX.. XX.. XXXX XXXX ..XX XXXX XXXX XX.. XXXX XXXX ..XX XXXX XXXX XX.. ..XX XX.. XXXX ..XX XX.. XXXX XXXX XXXX XXXX ..XX XXXX XX.. XXXXXXXXXX XX.. XXXX ..XX XXXX XXXX XXXX XXXX XXXX ..XX XXXX XXXX XXXXXX XXXX XXXX ..XX XXXX XXXX ..XX XXXX XXXX ..XX XXXX XXXX XXXX ..XXXX XXXX........XXXX ..XX XXXX ....XXXXXXXX.. XXXX........XXXX XXXX ..XX XXXX......XXXXXX XXXXXXXXXXXXXXXX XXXX XXXX XXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXX XXXX XXXXXXXXXXXX.. ..XX XX.. ..XX XX.. XX.. ..XX XXXX ..XX XXXX XXXX ..XX XXXX ..XX XXXX XXXX ..XX XXXX ..XX XXXX XXXX ..XX XXXX XXXXXXXX.. ..XX XXXX .. XXXX ..XXXX.. XX XXXX XXXX....XXXX XX XXXX ..XX XXXX XXXXXXXX.. .. XXXXXX XXXX..XXXX XX XXXX XX.. XX XX XXXX XX.. XXXX .... ......XXXXXX ..XX ..XX..XXXX XXXX XX.. XX XXXX ..XX.. XXXX XX XXXX XX.. XXXX XXXX XX XXXX XX.. XX.. XXXXXX XXXX XX XXXX ..XXXXXX XX XXXX XX.. XXXX XX.. ..XXXX ..XX ..XX XX.. XXXX XXXX..XXXX..XXXX ..XXXX....XXXXXXXXXX....XXXX ..XXXX....XX ..XXXX..XXXXXX......XXXXXX.. ..XXXX..XXXXXX....XX XXXX XXXXXXXXXXXX.. XXXXXXXXXX.. XXXXXXXXXX.. XXXXXXXX.. XXXXXXXX..XXXXXXXXXX.. XXXXXXXXXX XXXXXXXX XX.. ..XX XXXX ..XX.. XXXX ..XX ..XX XXXX.. ..XX .. XX XX.. ..XXXXXX XXXXXXXXXX.. XX.. XXXX.. ..XXXXXX ..XX XX XXXX XX XX.. XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .. XX.. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.. XXXX XX.. ..XX.. XXXX XXXX ..XX XXXX XXXX XXXX XXXX XXXX XX.. XX.. XX XXXX XXXX ..XX XXXX XX.. ..XX ..XX XXXX XX.. XX.. XX XXXX XXXX XXXXXXXX XXXX XX.. XXXX ..XX XXXX ..XXXXXXXXXXXX.. XX.. XX ..XXXXXX.. ..XXXXXXXXXXXX XXXX.. XXXX ..XXXXXXXXXXXX.. XXXX.. ..XX XXXX XXXX.. XX....XXXXXXXXXXXXXX XXXXXXXXXX XXXX XXXX XX XXXX XXXX.. XX.. XX.. XXXX XXXX ..XX XX.. XXXX.. XX ..XX XX XXXX XX XXXX XXXX ..XX XX.. XXXX ..XXXX XXXX XX.. XX XX XXXX XX.. XXXX XXXX XXXX.. XXXX XX.. XXXXXXXXXXXX XXXX XX.. XX XXXX ..XX.. XXXX XXXXXXXXXX XXXX XX.. ..XX XXXX XX.. XX XXXX ..XX XXXX XX XXXX XX.. ..XX XXXX XXXXXX.. ..XX ..XX XXXX.. XXXX ..XXXXXXXX
  4. HOWTO - L2 server with (transparent) proxies DISCLAIMER: I wrote this HOWTO without really testing it (I've configured it for my server more than year ago), so if you find any mistake, feel free to comment/ask, I'll try to update this HOWTO appropriately. Purpose of using proxies The standard old way of setting up L2off server involves one Windows Server that is connected directly to internet and players connect directly to it's IP address. While it's enough for a small server, it may bring few problems: If someone wants to DDoS your server, he just pays for some attack to your IP address. You're screwed. There may be players who experience lags because route from their network to your server isn't perfect (because of bad peering between player's ISP and your datacenter etc). You can't just tell those players "Try better ISP". Players from foreign countries may have good ping to datacenters in their country but not to your data center. Some of these problems can be mitigated by using proxies for your server: When someone buys DDoS attack to your login server on first proxy, you can just change IP address in your DNS and let your players login on your second proxy (you need to have domain name instead of IP address in your l2.ini). When someone buys DDoS attack to your game server on first proxy, players can still play on second proxy. When player has bad ping on first proxy, login will be bit slower but player can select second proxy with better ping and play on it You can also do the same with your website, just replace ports 2106 and 7777 with 80 and 443... What will you need Some basic knowledge about L2off, Linux and networking. Also you'll have to read few manuals. Linux router between your L2 server and internet, you can do it two ways (of course it must be configured to forward IPv4 traffic): real physical Linux router between them Linux as main operating system on your server hardware + L2 server in virtual machine (kvm-qemu). Linux servers (1 core & 512 MB RAM is usually enough) for proxies Copy of patched hauthd - READ INSTRUCTIONS THERE Script that will be able to restart hauthd when L2 server crashes/exits How to do it I will use following IP networks and addresses in this example: Networks: Local network 10.0.0.0/24 between Linux router and Windows VM Virtual network 10.0.1.0/24 between Linux router and proxies Addresses: 1.2.3.4 on Linux router eth0 2.3.4.5 on first proxy eth0 3.4.5.6 on second proxy eth0 4.5.6.7 on third proxy eth0 10.0.0.1 on Linux router eth1 (for physical router) or tap0 (for kvm-qemu variant) 10.0.0.2 on Windows server Local network interface 10.0.1.1 on Linux router tun0 (OpenVPN server 1) 10.0.2.1 on Linux router tun1 (OpenVPN server 2) 10.0.3.1 on Linux router tun2 (OpenVPN server 3) 10.0.1.2 on first proxy tun0 (OpenVPN client) 10.0.2.2 on second proxy tun0 (OpenVPN client) 10.0.3.2 on third proxy tun0 (OpenVPN client) Physical network: Logical network: Now proceed with installation and configuration: ROUTER + PROXIES: Install OpenVPN ROUTER: For each proxy, configure one instance of OpenVPN server with static key (it will have to run on different ports, for example 1194, 1195, 1196) PROXY: Copy static key from router, configure OpenVPN client WINDOWS: Make sure windows server can ping linux router (ping 10.0.0.1) PROXY: Make sure proxies can ping server (ping 10.0.1.1 / ping 10.0.2.1 / ping 10.0.3.1) PROXY: Setup NAT (find some way how to run it on every start!) iptables -t nat -A PREROUTING -m tcp -p tcp --dport 2106 -j DNAT --to-destination 10.0.0.2:2106 iptables -t nat -A PREROUTING -m tcp -p tcp --dport 7777 -j DNAT --to-destination 10.0.0.2:7777 You need this to make proxies forward traffic on ports 2106 and 7777 to windows server. ROUTER: Setup connmark (find some way how to run it on every start! If it's physical router, use eth1 instead of tap0!): iptables -t mangle -A PREROUTING -i tun0 -p tcp -m tcp --dport 7777 -j CONNMARK --set-mark 100 iptables -t mangle -A PREROUTING -i tun1 -p tcp -m tcp --dport 2106 -j CONNMARK --set-mark 101 iptables -t mangle -A PREROUTING -i tun1 -p tcp -m tcp --dport 7777 -j CONNMARK --set-mark 101 iptables -t mangle -A PREROUTING -i tun2 -p tcp -m tcp --dport 2106 -j CONNMARK --set-mark 101 iptables -t mangle -A PREROUTING -i tun2 -p tcp -m tcp --dport 7777 -j CONNMARK --set-mark 101 iptables -t mangle -i tap0 -p tcp -m tcp --sport 2106 -j CONNMARK --restore-mark iptables -t mangle -i tap0 -p tcp -m tcp --sport 7777 -j CONNMARK --restore-mark You need this to mark connections so you know where they came from. ROUTER: Setup policy-based routing (find some way how to run it on every start!): ip rule add fwmark 100 table 100 ip route add default via 10.0.1.2 table 100 ip rule add fwmark 101 table 101 ip route add default via 10.0.2.2 table 101 ip rule add fwmark 102 table 102 ip route add default via 10.0.3.2 table 102 You need this to make packets go back through the right proxy. Otherwise you'll send those packets out via your router public interface which won't work. WINDOWS: Setup hauthd to use multiple proxies and add servers appropriately to dbo.server table WINDOWS: Make sure hauthd restarts every time L2 server restarts Useful resources Patched hauthd with basic instructions OpenVPN Static Key Mini-HOWTO Linux Advanced Routing & Traffic Control HOWTO - Rules - routing policy database Linux Advanced Routing & Traffic Control HOWTO - Netfilter & iproute - marking packets
  5. Remember to activate the English subtitles https://youtu.be/AiEI3he-9sc
  6. Hello once again, My Apologies for being away for sometime, at this tutorial we gonna discuss working with Linux as Hosting OS for your L2J Server an we will be talking about the advantages of using Linux. so let’s cut this off and get started. Table of Contents : – Who can use this tutorial ? – What is Linux ? – Which Distribution to use ? – Installing Linux on Personal PC or Virtual Machine – Getting familiar with Linux Command Line { Terminal } – Connect to Linux Server with through SSH Remotely – Learn to Manage Users, Group and Access Control – Repositories and Software – Installing and Configuring MySQL Server – Connect and Install Your Server Database – Installing and Configuring Oracle Java – Move and Setup your Server Files to Linux Server – Run and Stop Server – Installing and Configuring Apache2 – Host your Site and Domain - Ports and Firewall > To be Added – Manage Processes and Services > To Be Added – Advanced and Helpful Commands > To Be Added – What’s Next with Linux …. > To Be Added In the beginning i would like to answer some frequently asked questions . Who can use this Tutorial ? This Guide is meant to be for non System Administrators , so it basically will be a Step by Step guide to help those didn’t worked with Linux before, so if you have no experience at all with Linux then don’t worry you’ll get familiar with it today . What is Linux ? Well, Linux as a name refers to multiple things but mainly it refers to OS Kernel that spreading more and more everyday and guess what most likely you’re using Linux too , Huh ?? oh yes actually Android is based on Linux Kernel. For some people Linux is a monster, and actually it is a monster but a monster that fights you , or fighting in your side if you can deal with it Linux is not that thing you can go download and get like that (Ofc you can but this needs alot of advanced skills), instead it comes as packages called Linux Distributions and can be called Linux Distro, this distributions are usable packages for Linux packed with some tools and software and some of them comes with a GUI as well, and actually there are many Distributions out there, for example : Ubuntu, Fedora, CentOS, BackTrack, Kali …. etc Which Distribution to use ? Well there are actually many good distributes but as an advice if you good or moderate with Linux then use Ubuntu Server Distribute if you are not a command line guy/girl then use something with GUI like Ubuntu Desktop, Kubuntu, Fedora. Also you may need a UI to make changes and stuff , but if you’re an experienced or a command line lover then u wont need this GUI, since everything can be done via Terminal. Most likely when you buy your dedicated or VPS your hoster will ask your for which Distribute you want to be installed and this options are widely available in most if not all hosting providers like OVH which i recommend. In this Guide i’ll use Ubuntu Desktop and Kubuntu Installing Linux on Personal PC or Virtual Machine I don’t like to repeat what’s already done, since there are alot of good tutorials out there , here is one of the good guides, also i’ll add a detailed guide about this later – Getting familiar with Linux Command Line { Terminal } First i expect now you have a clean install of Linux, i have also a clean install of Ubuntu Desktop, so let’s login with your password created in installing process or provided by your host, Type your password and hit Enter Once you logged in Click on the Ubuntu Icon on left top corner then type “terminal” in search and click on terminal icon Now we have our terminal up and running so we can start playing around with commands Great, Let’s try same on another distribution ? Okay let’s go to Kubuntu Distribution Login with your username and password Then Click on Kubuntu Logo on the bottom left corner and type terminal in search then click on Konsole icon Here we go again with our terminal Now it’s the time to run some commands and get familiar with the new environment List files in current Directory : To see files in current working directory you can use command ls Here we can see all files and folders in current directory, but actually this is not all files and folders since by default the “ls” command wont show the hidden files, and to show all files including hidden files we can add options “-a” which stands for “list all” ls -a as you may notice in Linux hidden files and folders are those who starting with a dot “.”, any file starting with “.” will be considered as a hidden file See the current directory : To get the path of the current directory you’re working with you can use the command “pwd” which stands for “Print Working Directory” pwd Clear Screen : To Clear Terminal screen you can use the command clear Yes it’s as simple as that Make a new Folder : first of all in Linux Community it’s usually called Directory not Folder, so in order to make a new directory u can use the command “mkdir”, which stands for “Make Directory” followed by Directory name, normally this command will return nothing but this is normal so getting nothing back doesn’t mean it’s not working mkdir mxc_directory Note : Linux is a case sensitive system unlike windows, so for example mxc directory is not Mxc directory since “m” is not “M” so you can have two directories in same directory with same name but different letter case Change Current Directory : Well in order to move to another directory you can simply use command “cd” which stands for “Change Directory” followed by the patch to go or directory name cd mxc_directory Go to Upper / Parent Folder cd .. If you wanna go to to the very top directory use “cd” without any path, and if you wanna go quickly to user directory you can use that command cd ~ Create a new Empty file : Creating a new files in linux is very simple, let’s go to mxc_directory and make a file in it called hello.txt, i think you know how to go to mxc_directory and then create the file using touch command cd mxc_directory touch hello.txt Edit File Content in Terminal : To edit a text based files in terminal you can use nano (available on many distributions, some have vim instead), for example nano hello.txt You’ll get GNU nano Editor like this Now you can type or edit whatever you want and to Save Press CTRL+O then confirm file path and hit Enter, To Exist Nano Editor Press CTRL+X Show File Content into Terminal : If you wanna show a text based file contents into Terminal for a fast review you can use command “cat” followed by file name cat hello.txt Print Text to Terminal : To show text to a screen or to print out a message you can use command “echo” followed by message or text quoted echo "My Secret Message" Useless huh ? , Well just stay with me for next trick Send Terminal Output to a file : If you have any terminal output that you want to save to a file instead of printing it to screen, like a log or something which you may need this when working with L2J to quickly redirect out errors to a file for later review then you can use output redirect command which is used by appending “>” followed by output file after any command that you expect an output from echo "My Secret Message" > secret.txt Copy file : To copy a file you can use “cp” command followed by original file name/path followed by new file name/path, you have to provide path if it’s not in current working directory also you need to provide the name of the file on the new location cp secret.txt copied.txt But how to copy a folder instead of just a single file ? , well it’s simple you can still use “cp” command but this time followed by option “-R” which means Recursive , so let’s try to go to upper folder and copy mxc_directory cd .. cp -R mxc_directory copied_directory Move File : Moving files means it will be copied to another location and deleted from original one, and to do this we can use “mv” command followed by original file followed by new location along with the new file name, so for example to move copied.text to the upper directory we can do so mv copied.text ../moved.txt If you wanna move a directory we do as we did in coping directory by adding “-R” option Delete / Remove a File : To delete a file you can use command “rm” which stands for “remove” followed by file name rm secret.txt Same for Deleting Directory you can add -R option but take care since this operation can’t be undone Connect to Linux Server with through SSH Remotely Considering that you have a Linux VPS or Dedicated you will have what’s called SSH (Secure Shell) access in this case you’ll be able to login and control in terminal mode, and to do this there are many ways to connect through SSH but i prefer to use a small application called PuTTY which is free and easy to use. Download PuTTY : Click Here After downloading and installing (Really easy to install not a big deal) you can run this application, you’ll get something like this Enter you VPS or Dedicated Host name of IP on selected input and by default port will be 22 and then hit “Open”, you’ll get a black window like command line and will ask u for a username, put the username u use to login to your Linux then will ask for your password and now you are logged and can issue Linux commands remotely Learn to Manage Users, Group and Access Control Learning how to manage users and groups is very important when dealing with Linux since learning this will save you from a lot of troubles. I’ll try to simplify this as possible. In Linux in order to login into the system you must have a user credentials just like windows, so you can have multiple users into a Linux system also this users can be grouped into “Groups”, and whenever a user create a file or something this file will be “Owned” by this user and this is the user who has full permission on this file. Talking about Permissions there are 3 permission on each file : Read , Write and Execute, each one of this permission has something like a code as follow : Read (4), Write (2) and Execute (1). so for example full permission will be 4 + 2 + 1 = 7 => 7 is the code for Full Permission, 5 means you can Read and Execute but you can’t edit or modify the file, 0 means no permissions at all. When you wanna set a permission for a file you have to set it also for 3 things in order : Owner, Group and Others. Owner : Is the user who create the file. Group : Is users in same group as owner or the group owns the file Others : Is anyone else So for example Setting Permission for a file as 777 means everyone has all permissions, 775 means Owner user and Owner Group has full permissions while others can only Read and Execute but not Write or Modify It’s Always preferable to do your stuff using non-root user, since root user have full permission over system files which may cause problems because it’s a “Super User”, which in shortened called “su” Creating Users : So Let’s create our user that we will use to sort our server, to create a new user you have to be on a “Super User” / Root , and we gonna use command “useradd” and we can specify some options for example : -m : this will automatically create user home directory if not exist for example > /home/samdev/ -M : this option is used to tell Linux to no create user home directory even if system automatically create home directories for new users -d : this will allow us to specify custom user home directory location -U : will create a group with same name of username and add the new user to it automatically -e : will allow us to set expiring date which will make the account auto expire at a specific date There are many more options you can use but let’s Start small to keep thing as simple as possible, we gonna now create a user with a username of maxcheaters but issue this command useradd -m maxcheaters If you are not on a root user then prefix command with “sudo” then it will ask you for a root password, prefixing any command with “sudo” means that run this command as a “Super User” sudo useradd -m maxcheaters Well it’s created, we can confirm this by listing our users by cat the file /etc/passwd cat /etc/passwd Also here is a trick to show only usernames by cutting each line by delimiter “:” and print first one only cut -d : -f 1 /etc/passwd Well we have our new user create but actually we didn’t set a password for it , so how we can set a password for a user ? . Simple .. we can use the command “passwd” which stands for Password, and also this needs to be ran as “Super User” so you can prefix with “sudo” if you are not on root sudo passwd maxcheaters Nice, it’s not asking you for the new password, just enter a password and hit enter. then confirm it again Note : you wont see what you are typing so make sure you are typing it right Switch Accounts : Now we want to switch to our newly created account, which can be done using command “su” which stands for “Switch User”, don’t get confused about “su” when talking about “Super User” or “Switch User” , when we talk about commands it’s “Switch User” when talking about Terms in Linux Community it’s “Super User”, so here is how to switch to another user su - maxcheaters It may ask you for the password, so enter it and hit Enter Now if we check our current working directory using “pwd” command we will see that we automatically switched to maxcheaters user home directory About Groups : Each user has two different types of groups, Primary one and Secondary Groups, The primary group is usually a group with same name as username it’s created automatically when user created, this doesn’t mean it can’t be change .. no you can change this primary group but in most cases you wont need to do this. Secondary Groups are the groups that user subscribed to it after being created (ah it makes sense ) , so you can have your group and subscribe to other groups as well. So first let’s see what groups our new user has by issuing command “id” followed by username id maxcheaters Now we can start working with groups but to do this we need to be on “Super User” mode so we can do things on root which is not very good choice for security concerns or we can give permissions to our new user. Sudo Permissions : To give a user on a Linux system a permission to run “sudo” commands all we need to do is to switch to root access and add our user to the “sudo” group, so first let’s switch to root, and enter required password su - root Now we need to add our user “maxcheaters” to “sudo” group using command “usermod” followed by option -a which means “Append” followed by “G” then group name “sudo” followed by user to add “maxcheaters” usermod -aG sudo maxcheaters Now let’s Switch back to “maxcheaters” user, i guess you know how … right ? su - maxcheaters Create Groups : Creating is as simple as creating users with the command “groupadd” followed by new group name, note that this command is needs to be executed via a super user and since we switched to non-super user “maxcheaters” then we prefix it with “sudo” to do it as super user, not that it may ask you for the “maxcheaters password sudo groupadd cheaters To get list of all available groups you can cat the file “/etc/group” cat /etc/group Add a User to Group : Huh ?? we already did this , cant you remember ? … well anyway you can add user to a group by modifying user with “usermod” command followed by -aG, followed by group name then user name, and this is also a super user command so you need to prefix with sudo sudo usermod -aG cheaters maxcheaters Remove user from a Group : To remove user from a group you can use command “deluser” yes it means delete user but no worries if you use it correctly it wont affect user itself, only remove it from a group, also it needs to be used with “sudo” sudo deluser maxcheaters cheaters Delete a Group : Well we deleted the user from the group but we didn’t deleted the group it self , it still exist so if we wanna to delete the group “cheaters” we can use command “groupdel” followed by group name, also it will delete the group from all users subscribed to it automatically sudo groupdel cheaters Repositories and Software Repositories are some kind of online sources for downloading and getting software, Linux distributions comes with some default repositories that contains most and commonly used software, so it helps you to download software easy and fast and your system will search available or registered repositories for the software you want to install and download it for you. Note : this part of guide is for Distributions that uses “apt” as packages manager which is very common, some others like for example ArchLinux using “pacman” as packages manager, so if you have a different package manager lemme know the Distribution you use and i’ll try to assist you though it Update APT Database : It’s always good to update your repositories and this means let your system scan registered repositories and see if anything added or changed, and we do this using command “apt-get” followed by “update” sudo apt-get update Install a Software : To install a software you know first to know it’s name (logically ), then you can use command “apt-get” followed by “install” then application name, but actually in Linux community it’s usually called Package instead of application and things like this . so let’s try by installing “unzip” to be able to unzip .zip files sudo apt-get install unzip Very simple isn’t , it’s just like that, no annoying pop ups and dialogs … etc Note : Some Packages during installing will ask you about something needs confirm and you’ll be able to answer by typing “Y” for yes, and “n” for no Uninstall a Package : Maybe at some point you want to uninstall / remove a package installed before, and it’s not hard to do all u need is same “apt-get” command followed by “remove” instead of “install” followed by package name to remove sudo apt-get remove unzip But wait a moment cause this is not best way all the times, it can be good at sometimes and not in some other cases, since this way you removing only the package it self ,but sometimes a packages comes with another package and configuration files so to remove it all we can use another way by using “purge” instead of “remove” sudo apt-get purge unzip Installing and Configuring MySQL Server Now it’s time to install MySQL server on our Linux Server, but installing package named “mysql-server” sudo apt-get install mysql-server Congratulations it’s installed, but hold on … it’s not the time to celebrate … we still need to configure it Currently if we tried to log into our database it will be with username “root” and no password (by default) so it’s time to harden our database security a bit. MySQL Security Hardening : First thing after installing mysql server on Linux is to harden its default security configurations and this can be done by running the command that comes with mysql installation “mysql_secure_installation” as a super user sudo mysql_secure_installation At this part you need to enter the current password of root username (which is none by default ) so just hit enter, then it will ask you if you want to set a password for the “root” username (root of mysql server not system), just answer with “Y” for Yes Now it will ask you to set a new password for the “root” user, write a password (it wont show so just type it carefully) and Confirm it again Done, and it’s asking you if you wanna remove anonymous users, Of course “Y” we don’t want anonymous access to our database The Good Question is here … Do you want to “Disallow” root user to be logged remotely ? well maybe you need remote access to manage your database from your pc or from any where and i also want that but it’s really a bad idea to allow remote access for “root” so i would say “Y”es Disallow root login remotely and later i’ll tell you how to make a good remote access without root. Do you want to remove test database and access to it ?? Hell yeah who needs a test database .. do you ? Now Let’s Reload Privileges ?? YES Now our MySQL Server has a better security . Login to MySQL Server We have our Database Server now ,why not trying to login via Linux , Let’s go for it … Note : this method is applicable to all Operating Systems since it’s related to MySQL it self not OS. How we gonna do this ? Simple use command “mysql” followed by -h (to identify host default is localhost) followed by host “localhost” followed by -u ( to identify user) followed by username (root is the only one we got now) followed by -p to identify that this username has a password mysql -h localhost -u root -p and it will ask you to enter the password just type it and hit Enter Now we can run any MySQL Queries / Commands for example let’s see the databases we have so far SHOW DATABASES; Note : All MySQL Queries and Commands ends with ; (semi-colon) Create a Database : Since in this Guide i’m planning to demonstrate using aCis Server pack so i’ll create a database called acis_db, using mysql command “CREATE DATABASE” followed by database name CREATE DATABASE acis_db; Succeed . Create a Database User : Isn’t the time to use another user for MySQL instead of root ?, i guess it’s good idea to create a new user with limited access using this MySQL Command CREATE USER 'USERNAME'@'HOST' IDENTIFIED BY 'PASSWORD'; USERNAME : is the username you want to create HOST : This is really important since by default this is “localhost” but doing this wont allow you to connect remotely with this user, since connection from this user will be accepted only if it’s from “localhost” or same machine , so if you want to allow remote access from anywhere you can set it to (%), or even set it to a specific host if you wanna a very specific security layers PASSWORD : is where you put this user password Now just Hit Enter after you customize this command as you need … and your new user will be created Give Access on Database : You successfully create a database user, but actually this user by default will have no access on any database so it’s time to give this user access on our “acis_db” database, using “GRANT” command GRANT ALL ON acis_db.* TO 'maxcheaters'@'%' IDENTIFIED BY 'PASSWORD'; This line of MySQL command means : Give All Permission on the Database “acis_db” including All (*) Tables to the user “maxcheaters” that have remote access and password of “PASSWORD” Amazing , But to be honest with you this wont affect database instantly , we need to force MySQL server to reload permissions and access by issuing this command FLUSH PRIVILEGES; Maintain Remote Access : We Created our user with remote access , so let’s try to connect to the host with your favorite MySQL Database App, most L2 Admins uses Navicat but i hate that Application so i use an application called HeidiSQL , so just connect with whatever you want … Oh Come on, we created a user with remote access why it’s not working ? …… Actually we set this user to have remote access but MySQL Server it self is not yet configured to support remote access Support, so let’s Do this. but first quit MySQL Command Line by typing “exit” and hit Enter. First we need to modify MySQL configuration file which by default on location of /etc/mysql/my.cnf , so i’ll use nano editor for this, as we did before to edit files . sudo nano /etc/mysql/my.cnf Scroll down a lil bit using Keyboard Arrows til you find “bind-address” and set its value to your public ip or DNS Then Save it using CTRL+O, then Exit Editor using CTRL+X, and to make this changes has effect we need to restart MySQL Server or Service using this command sudo service mysql restart Now it should work if we test again … Yes it does …. Note : it you may can’t login to your database server remotely also if your firewall blocked 3306 port, if that’s the case, no worries we will take about Firewalls later. Connect and Install Your Server Database Well i guess you already connected not it’s time to export your database and import it into your new database server. To do so on HeidiSQL, right click on your local database and click on Export Database as SQL Now Select your Exporting Preferences and Export Location then click on Export After SQL File Exported Now back to your Remote MySQL Session and Select “acis_db” database and activate “Query” Tab On “Query” Tab Script Area Right Click and Choose “Load SQL File…” and check where you saved the exported SQL Script and then Hit Run Icon Now your Server Database Installed, Congratulations so far Installing and Configuring Oracle Java Since you have your database up and running we still need Java to be installed on our Linux System to be able to run GameServer and LoginServer, so let’s learn how to install “Oracle” Java successfully . First some Linux Distributions comes with java already but “Open”JDK not “Oracle” JDK and we need to install Oracle JDK to run without problems, so we can use “apt-get” command as before but the problem is Oracle JDK is not always available on Default Repositories so we may need to add that Repository contains Oracle Java. Adding a Repository : Adding a Repository is just a 1 line command that self explanatory using command “add-apt-repository” followed by repository identifier, and the repository that contains Oracle Java is “ppa:webupd8team/java” , so let’s add this sudo add-apt-repository ppa:webupd8team/java It May ask you for Confirming just Hit Enter Since we added a new Repository so we may need to update our APT database as we learned before sudo apt-get update Install Required Packages : Before Proceeding with installing java we need to install a required package to avoid further errors, this is the “python-software-properties” software sudo apt-get install python-software-properties Accept Oracle License : Usually if this is your first time installing Oracle Java then you’ll get Error with exit code of -1, and this is happens since you’re required to accept Oracle License before installing Java, and to do this via Terminal is very easy , i’ll give you the solution, just run this command once echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections Install Java 8 : Now we can Proceed with Installation normally with “apt-get” command to install the package “oracle-java8-installer” sudo apt-get install oracle-java8-installer It may ask you for some confirmations just answer with “Y” for Yes Well it’s Installed Successfully Set Default Java : By default Java 8 will set it self as default but if you have multiple java installation you can change default one using command “update-alternatives” followed by option “–config” to set what you wanna configure followed by “java” sudo update-alternatives --config java Here you can type the number of which installation to be default, or leave blank to keep settings as is, and i can see java 8 is selected by default so i’ll keep it as is. Also you can confirm this by running java version command java -version Move and Setup your Server Files Now things getting more excited .. so let’s stay focused til the end Uploading Files : Since you need to upload your server so let’s zip our “compiled” server, and now to upload it actually you have many ways it’s all about your taste 1st : Using Files Hosting This way is very simple all you need is just upload to a Files Hosting Service , i prefer mega.nz , or you can use any Hosting you want and go to your Linux Desktop and download it with Firefox (Default Browser for many Linux Distributions) but this way considering that you have Remote Desktop Access to the Linux Server, and you can’t simply use “Windows Remote Desktop” directly since it’s for Windows Only. Note : You can make “Windows Remote Desktop” able to access a Linux Desktop but installing a package called “xrdp”, but actually it’s very bad and slow So if you have a way to remotely access your Linux Desktop go for it , if not then i’ll tell you how you can do this using VNC. Installing VNC Server : VNC Server is a good way to remotely connect to a Linux Desktop and it’s much faster than XRDP, so let’s start installing it sudo apt-get install tightvncserver Once installed let’s start it by issuing this command tightvncserver At First time it will ask you for a password, enter the password and hit Enter Note : VNC support only 8 characters length for password, so even if you entered more than 8 characters it will use only first 8 characters Then it will ask you if you want a view-only password which means with this view only password you can only see the desktop but not interact Now you need to download and install VNC Viewer on your machine to connect to VNC Server where you can Download Here . Once Downloaded and Install, Run it will you get this window, where you want to add your Linux IP or DNS followed by ( :: ) then default port of 590x then click Connect, where x is the id of your Session ID you got in your Linux when started VNC, for Example “SamDev:1” means port is 5901, SamDev:2 means port is 5902 . After Clicking Connect, it will ask you for the Password you set for this Session , Enter it and Click Ok Now you are finally Connected So lets start downloading our Server Zip file By Default it will be Downloaded to the Current Logged User Downloads Folder Note : More way will be added soon Let’s go to User Directory and Downloads Folder cd ~/Downloads Do you still have “unzip” installed ? np if you removed it install it again sudo apt-get install unzip Unzipping a Zipped File : To unzip a file using unzip package it’s really easy unzip ACIS_Live.zip Rename File/Directory : Do you need to rename this folder to L2Server for example ? no problem we didn’t mentioned this but it’s very simple since there is no direct command for renaming but instead we use the moving command “mv” mv Live L2Server Create Starting Shells [OPTIONAL] : Well this Step is optional but i prefer to do it like this since original Shell Scripts are running automatically running with no-hup ( No Hanging Up ), which is really good but actually i prefer to do this manually and to have default Shell Scripts beside the custom HUP Scripts specially in development Level. So let’s Create our Shell for GameServer, First head to “gameserver” directory cd ~/Downloads/L2Server/gameserver and then i’ll use nano to create and edit a new Shell Script file . Note : Shell Files should end with .sh extension nano StartGame.sh Then Add this Script #!/bin/bash java -Xmx2G -cp ./libs/*:l2jserver.jar net.sf.l2j.gameserver.GameServer Now Save and Exit : CTRL + O > CTRL + X Let’s Head to login Directory and do almost same cd ../login And Create our Login Shell nano StartLogin.sh and Add this Script #!/bin/bash nice -n -2 java -Xmx512m -cp ./libs/*:l2jserver.jar net.sf.l2j.loginserver.L2LoginServer Save and Exit Again : CTRL+O > CTRL+X Configure Server : Now you need to Configure your server Database Information, which is located in Login : login/config/loginserver.properties GameServer : gameserver/config/server.properties Configure Game Server : Change Directory to Game Server Config Folder cd ~/Downloads/L2Server/gameserver/config Then i’ll use Nano to Edit server.properties nano server.properties Locate this Configs and Change them with your database name , username and password When you done > CTRL + O to Save, CTRL + X to Exit Configure Login : Change Directory to Game Server Config Folder cd ~/Downloads/L2Server/login/config Then i’ll use Nano to Edit loginserver.properties nano loginserver.properties Locate this Configs and Change them with your database name , username and password When you done > CTRL + O to Save, CTRL + X to Exit Allow Shells to be Executable : Before you start server you need to know that in Linux you need to run .sh scripts instead of .bat, and by default .sh has no permission to run so we need to give those files permission to run using command “chmod” followed by permissions followed by file name, but changing each file would be time consuming so here is a trick to set a permission for all .sh files in one line by adding a wildcard in file name (*), so let’s first go to gameserver directory cd ~/Downloads/L2Server/gameserver Then we change permissions for .sh files sudo chmod -R a+x *.sh Now our .sh files turned Green which means it’s executable. So let’s do Same with login directory cd ../login sudo chmod -R a+x *.sh Congratulations i think your server now is well configured. Run and Stop Server Well let’s log to our server via VNC as we learned before , remember ? then open your terminal Note : if you wanna do this via SSH, you can use a package called Screen , Find more Run Login Server First we need to go to our login folder of the server cd ~/Downloads/L2Server/login Now we need to execute our Shell Script, you can execute original one or our created one depends on the situation and stability level of your server, so it’s all up to you sudo ./StartLogin.sh Great, Login Server is Running, now time for Game Server. Run Game Server Open a New Terminal or a new Tab, File > new Tab or CTRL + SHIFT + T on the New Tab go to gameserver Directory location cd ../gameserver Now time to start gameserver sudo ./StartGame.sh You L2 Server is not up and running Close Game / Login Server : To Close either Login or Game Server just close the terminal or click CTRL+C to close but keep Terminal open. Installing and Configuring Apache2 To get Apache Server or a Web Hosting Server you can simply install LAMPP , it’s full package of Apache, PHP and MySQL together, but personally i don’t like to go this way, since i always prefer to go with non-preconfigured stuff to be able to have full control over every little detail, also it will be good for you to know how everything work and how they linked smoothly together. Install Apache2 : Installing Apache2 is same as installing any package we did before sudo apt-get install apache2 Apache2 Installed Successfully now let’s Install PHP as well . Install PHP 7 : In this Guide i’ll install PHP 7, but you can install older versions if you want, it’s just same procedures .. First we need to add the Repository that has what we need sudo add-apt-repository ppa:ondrej/php Now let’s Update our Repositories Database sudo apt-get update After that we gonna install PHP 7 along with some PHP Extensions needed commonly : sudo apt-get install php7.0 php7.0-cli php7.0-common libapache2-mod-php7.0 php7.0-mysql php7.0-fpm php7.0-curl php7.0-gd php7.0-bz2 Here i’m installing PHP 7.0 with some extra PHP library all in one command, then we need to host our site… Host your Site and Domain First of all you need to have your domain which can be bought from any provider, i would suggest GoDaddy.com , very good services, skilled support team and really fast orders and problems processing. For this guide we will try to host the domain “lineage.ninja” on our Linux Server, so first go to your domain provider panel , in this case it’s GoDaddy, so go to your domains and click “DNS” : Now we need to modify the “A” record When you get into edit mode, add your server IPv4 into Value/Points to. then save. Sometimes this modification takes time to propagate but in GoDaddy as i been using it for many years i found that it’s one of the fastest, most of times it takes less than 10 seconds to take effect. so let’s see if our domain working and connected to our server Yeah, as it says “It works!” … But why it show the main page of server, we need it to have a separate content … well then let’s do this Create Apache2 Host : To Create an Apache2 Host we need to follow few step, by creating the directory that will contain our site files, then we create a configuration file for this site to tell Apache how this site will work and where its files located, then we have to enable it. So First let’s create a directory that will host our site , by default Apache look in files inside Directory /var/www , so i’ll create a directory on the path of /var/www/lineage.ninja/public_html , and in this case we gonna use the command “mkdir” to make a directory with option “-p” to automatically create all parent directories required for us. sudo mkdir -p /var/www/lineage.ninja/public_html Maybe now we need to change Owner and Permission to avoid further problems sudo chown -R $USER:$USER /var/www/lineage.ninja/public_html sudo chmod -R 755 /var/www/lineage.ninja/public_html Now we need to create the configuration file, so let’s start by copy the default configuration file. sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/lineage.ninja.conf We need now to edit that configuration file … sudo nano /etc/apache2/sites-available/lineage.ninja.conf Note : All Lines starting with ( # ) is just a comments, so it wont affect anything, you can remove it or leave it , doesn’t matter At this moment we need to modify this file to look like this CTRL+O to Save, CTRL+X to Exit … One more step to go .. we need now to Enable our new site using command a2ensite (Apache2 Enable Site). sudo a2ensite lineage.ninja.conf To Take Effect we need to restart our Apache2 Server sudo service apache2 restart Let’s Create a simple php file to test … sudo echo "<?php echo 'Greetings from PHP';?>" > /var/www/lineage.ninja/public_html/index.php So time to test … Yes, it's working :) Thanks for taking a look into this guide and i hope it's useful for someone out there ... lemme know if you got question and i'll update this topic soon with more parts Thanks and Regard,
  7. Hey guyz, i'd like to tell you a trick on how to fool low skilled adms/gms and gain gm status on your char. You gonna laugh since its too funny also. Tested and worked,and also proved how unskilled todays admins/gms are. Required: 1) - n00b-low skilled adms/gms. 2) - quick reactions (Targeting, Typing) Log 2 characters in game and go to a place alone (example wh or blacksmith). Hide ur 2nd char behind a wall, or near the area,to a range that is possible to target him. Pm any online adm/gm and tell him that u want to show him a bug for coins or smth like that. Tell him in order to show him the bug, to delevel you to level 1, using command //changelvl 1 - (Exactly! Most admins/gms don't know what this command do) When he use that command,you'll gain gm status on your char,now you need fast reaction. Fast /target 2ndchar , and use the same command (//changelvl 1). Then restart your second char fast He'll probably ban/kick u in first 5-10 seconds,so u have to act fast.(Don't try log 1st char again...) That's it,u now have Gm status on ur second char. Log when Adms/Gms are offline,and have fun pk everyone :D Magic? Nope. Just low skilled Gms everywhere :)
  8. If something is missing report it. Last update: 11/21/2017 This list isn't finished yet. ====================================================== [ Codes ] Code Olympiad End Console ========================== [ tazerman2 ] Code Announce Enchant Success ======================= [ ThelwHelpRePaidia ] Code Faction code for l2jacis 365 ======================= [ PaRaNoiC*] Code Facebook Like System =========================== [ melron] Code Ex-Guard Test ================================= [ pirama ] Code [Reshare] Champion Aura For L2Jfrozen ============== [ FastCow ] Code User Panel [H5] ================================ [ `NeverMore ] Code Feanor For Acis 100% ============================ [ l2jkain ] Code L2Jfrozen //augment Command ==================== [ PaRaNoiC* ] Code Vip System + Vip Manager[Npc] ==================== [ 'Baggos' ] Code Multi Shop [Services/donate Npc] + Vip System ======== [ 'Baggos' ] Code Tvt Event Reworked. (.tvtjoin / .tvtleave / .tvtstatus) ===== [ 'Baggos' ] Code Multifunctionzone ============================== [ ^Wyatt ] Code Improved Buffs ================================= [ Sinister Smile ] Code TvT , Ctf and Dm for aCis ========================== [ l2jkain ] Code Vote Manager Npc V3 ============================ [ Reborn12 ] Code Interlude Auction Shop =========================== [ An4rchy ] Code Donate Manager Npc ============================= [ PaRaNoiC* ] Code Bots Prevention _V1.1 (Acis) ======================= [ Caparso ] Code Custom Cancel Task [L2Jfrozen] ===================== [ Designatix ] Code Acis Coupons + Redeem ========================== [ melron ] Code Acis Search For Item ============================= [ melron ] Code .dressme For Interlude. =========================== [ An4rchy ] Code AIO Buffer(Admin Command + Skills) ================= [ Prince* ] Code Teleportcustom (Voicedcommandhandlers) ============ [ tomalko ] Code Custom Enchant Skill List ========================== [ melron ] Code Lucky Pig Fixed + Update ========================== [ tomalko ] Code Captcha For L2Jacis ============================== [ Zacapa ] Code Pc Bang Point Event =========================== == [ Hi_Profile ] Code Custom Pvp Zone =============================== [ `NeverMore ] Code Automatic Potions Free Code For All L2J Packs! ========= [ numl0ckas ] Code Lifestone&bogs Stackable ========================= [ @Slash ] Code Ant Dual Box =================================== [ l2jkain ] Code Universal Scrolls ================================ [ Sinister Smile ] Code Individual Vote Reward System (By L2-Scripts) L2Network.eu [ L2Network.eu ] Code .combinetalismans ===============================[ Solomun ] Code Mini Reward System ============================= [ Sinister Smile ] Code Uber Cancellation. ================================[ An4rchy ] Code Vote Reminder ================================== [ melron ] Code Autovote Reward System Top/hop/net ================ [ Reborn12 ] Code .repair Character Voice Command ==================== [ Katherine ] Code Npc Crest ======================================[ Cronia ] Code L2Chaotic Zone With Change Maps =================== [ tazerman2 ] Code Voting Reward(Hopzone,topzone) ==================== [ StealthyS4m ] Code Instances ====================================== [ An4rchy ] Code Ls/bogs/scrolls Stackable Fully Working ================[ Handsome Banana ] Code Faction System [Unlimited Factions] ===================[ AccessDenied ] Code Interlude Antibot ================================= [ Inthedash6 ] Code Open Any Url To The Player's Pc ====================== [ .Elfocrash ] Code Clan Reward Manager ============================= [ Reborn12 ] Code Armorstats When Enchanted +12 And +16 ============= [ RpGiant ] Code Pvp Protection ===================================[ An4rchy ] Code Custom Race Starting Items ========================= [ iSparky ] Code Show Item Id ==================================== [ Red-Hair-Shanks ] Code Auto Announce Online Players. ======================= [ Dεbian ] Code Achievements Engine ============================== [ madarismenos ] Code Noblesse Killing Barakiel ============================ [ Reborn12 ] Code Newbies Helper Npc =============================== [ 'Baggos' ] Code Hero For Limited Time (No Need Restart Or Log Out) ======= [ AccessDenied ] Code Change Sex Item ================================== [ Reborn12 ] Code New Bypass For L2Teleporterinstance ================== [ Hugey ] Code Olympiad Everyweek ===============================[ Red-Hair-Shanks ] Code Shift+Click To Npcs ================================ [ Designatix ] Code Droplist And Stats Npc ==============================[ tazerman2 ] Code Hopzone/topzone/network Vote Reward [Re-Share] ======= [ An4rchy ] Code .geticon() Using Xml ================================[ newChar.needHelp() ] Code Starting Buffs ==================================== [ Gam3Master ] Code Balancer ======================================== [ te0x ] Code Quest change auto equip Armors-Weapons ============== [ AbSoLuTePoWeR ] Code Welcome To Me! ================================== [ Kraker ] Code Check Last Login Account =========================== [ madarismenos ] Code Olympiad Restriction Also Max Lvl 91 ===================[ te0x ] Code Survey System 2016 =============================== [ protoftw ] Code Anti Bot ======================================== [ Crazyboy* ] Code Casino Manager ================================== [ Crazyboy* ] Code Casinomanager,passwordchanger ===================== [ RaZoRॐ ] Code Fake Player Online (Real Time) ========================[ madarismenos ] Code Interlude Max Lvl 85 Fix... =========================== [ L2KingWorld ] Code Player Kd Code =================================== [ ganjaradio ] Code Augment Skill Olympiad Restrictions =================== [ madarismenos ] Code Auto Reward Hopzone/topzone ====================== [ Harut ] Code Noblesse Monsters ================================ [ ganjaradio ] Code Auto_Pvp_Killing_Spree_Announce =================== [ pirama ] Code My 'best Of...' ===================================== [ Kraker ] Code Killedbarakiel Setnobles Party =========================[ axcel2 ] Code /resurrection Char ================================= [ pirama ] Code Dropevent ======================================= [ João Vitor Barbosa ] Code Buy/sell/craft Zones ================================[ Gam3Master ] Code Custom Effects At Echant Armor And More.. ============== [ Admin@Abyssal ] Code Forbidden Names ================================== [ Gam3Master ] Code Nexus Engine ===================================== [ Cray-Z ] Code Npc With Aura ==================================== [ Gam3Master ] Code Special Share ===================================== [ Joniredbull ] ====================================================== [ Npc's ] Npc Redesigned Npc's (Protoftw) ======================== [ protoftw ] Npc Enchant Npc ==================================== [ Katherine ] Npc New Interlude Gm Shop {Stinkymadness} ============== [ StinkyMadness ] Npc VIP Clan Buffer / Donation Clan Buffer ================= [ Stewie ] Npc Gm Shop ======================================= [ 007florin ] Npc Raidboss Status Manager ===========================[ Caparso ] Npc Noblesse Manager ================================ [ Gladicek ] Npc Pvp/pk Ranking Manager =========================== [ g1org1os ] Npc Npc Buffer Adapt To Acis 365 ======================== [ TheMark147 ] Npc Donate Npc ===================================== [ protoftw ] Npc Custom Merchant / Item Market ====================== [ melron ] Npc Buffer V3 Updated ================================ [ g1org1os ] Npc Services Npc ==================================== [ te0x ] Npc L2 Facebook Npc (Showcase) ======================== [ protoftw ] Npc Built-In Global Gatekeeper ========================== [ AstroGG ] Npc Fancy Augmenter! ================================ [ protoftw ] Npc Donation Npc / Item Market ========================= [ claww ] Npc [Collection] All My Npc's ============================ [ `NeverMore ] Npc Buffer (Tryskell) ================================== [ melron ] Npc Gatekeeper V1.0 ================================= [ Cronia ] Npc Beautifull Npc Collection By Poytsomaxias ;-) ============ [ poytsomaxias ] Npc Yanbuffer - Scheme Buffer ========================== [ Luffy® ] Npc Augment V1.0 =================================== [ Cronia ] Npc Paysafe Donation Manager ========================= [ StalkerCoder ] Npc Vintage Gatekeeper And Buffer ====================== [ te0x ] Npc Ranking/statistics ================================ [ Caparso ] ====================================================== [ Sources ] Source L2Excess Source Files ========================== [ Handsome Banana ] Source L2Jgeo Premium Geodata Hi5 ==================== [ maneco ] Source H5 L2Mythras Files - Sources, Compiled, Geo, Patch. === [ Akar0 ] Source L2jSunrise Source 2017-10 ====================== [ proGenitor ] Source L2Cadmus Source Files ========================= [ djagripnos ] Source L2Junity Source =============================== [ UnAfraid ] Source L2Jfrozen Pack & Source & Backup ================= [ M@dara ] Source DataPack Faction + Custom Mods ================= [ Rumble ] Source L2 Acp (Account - Admin Control Panel) ============= [ .Elfocrash ] Source Mega Adapt Code Faction-J-Frozen ================= [ tazerman2 ] Source L2Jreunion Free Version ========================= [ `NeverMore ] Source L2Scripts - Underground ======================== [ proGenitor ] Source L2Arena Pack+Source By Kamex The Smartest. ======= [ @MaDaFTW ] Source L2Jwz Pack ================================== [ TheMark147 ] Source Epilogue L2 Optimal (Based On L2Dc) =============== [ thanosdk ] Source L2J Highfive Latest [No Gradle] ==================== [ AccessDenied ] Source L2 Acp 3.6 (Updated, Translated To Eng). ============= [ AstroGG ] Source L2-Scripts Owned By Mardok ===================== [ mardok ] Source L2 Classic Svn/geodata Files ====================== [ henrar ] Source L2J Nice Team (Classic) ========================== [ krauser12345 ] Source L2J-Event Engine ============================== [ u3games ] Source Open Votesites On Player's Pc ==================== [ .Elfocrash ] Source L2Jadmins C4 ================================= [ fissban ] ====================================================== [ Guides ] Guide Work with and Create Java NPCs =================== [ SamDev-Coder ] Guide Howto Fork And Keep It Updated =================== [ AndreiD ] Guide How L2Acp Works And How To Contribute ============ [ .Elfocrash ] Guide Java Guide / Java Data And Variables. ================ [ Sawadee ] Guide [ Pl/sql ] - Simple Pl/sql Statement. ================= [ Sawadee ] ====================================================== [ Tools ] Tool Updater Launcher - Dragonide Design ================== [ gaara ] Tool Decrypter And Encrypter ============================ [ ganjaradio ] Tool Lineage Ii Finder V1.5 [Update 5] ====================== [ XtreMpOweR ] Tool Easy Changer For Xp =============================== [ ganjaradio ] Tool Give Augments Using Navicat ======================== [ Reynald0 ]
  9. Kalhspera mages psaxnw gia ena hack gia interlude server c6 gia java serverr multiply items ++++ items sas parakalw poly voi8iste me oxi kai dn prokitai gia to phx
  10. Hello guys. I really need help with phoenix knight class on High rate H5 server. Buffs 32+4 slots, 16 dances All buffs available (except Kamael and Class Specific), weapon witch SA ,elementals, best auguments, certifications dyes and some tips, all for pvp. Thank´s you wery mutch.
  11. Remember to activate the English subtitles https://youtu.be/rYsT9t7Xp-c
  12. Remember to activate the English subtitles 1. Introduction to the shapes of the zones http://youtu.be/-dUPlOQaukQ 2. Locate zones in the datapack http://youtu.be/LbosqWoaSv4 3. Trace zone on Lineage 2 server http://youtu.be/0yB0FZ4nhVQ 4. Inspect zone in Lineage 2 http://youtu.be/uNYgTzB9m3o
  13. ΨΑΧΝΩ PAYPAL SYSTEM ΝΑ ΒΑΛΩ ΣΤΟΝ ΣΕΡΒΕΡ ΜΟΥ. ΕΥΧΑΡΙΣΤΩ.
  14. Hello all, Since I love to help people if my knowledge can provide the solution, I'm here to help you with your requests/problems about l2j. I'm usually on for 3-4 hours per day so don't expect fast respond. I'd love to create your idea and give you the code ready but get real, I wont spend hours for just one thing , so don't request something big Feel free to ask any thing you cant understand, blame is not allowed here :) I have no idea for anything related to client side. Atm I'm working on aCis project (feel free to ask something which is related to another project ). Finally, I want to do this because it will be useful (for some members) but for me too, I'm learning java and I would like to improve my skills so I found it great idea. If this post is in wrong section please a mod move it to the proper one :) Thank you!
  15. Hello MaxCheaters. Today I'm sharing with you my video guide on how to setup a DarkComet RAT. I this video you will learn: - How to portforward. - How to allow ports on firwall. - How to setup a noip DNS host. - How to setup the options of DarkComet. -No-IP link: http://www.noip.com/ -DarkComet 5.3.1 Download link: https://mega.nz/#!v4RARJ5C!Gw-gFMVYQ2yjYB-gaAJW7LcVafYTejmj36l3h8DHFPc All credits to me. Thank you
  16. Hi ! I have find no information about it and told the solution over a help topic so to help those who need it here a tiny guide to be able to use "Dimensional Merchan" aka Vitamin Manager. It is a feature that send item from SQL to player without any server reboot or commands needed. Al it need is a player restart if he/she were online when you executed SQL Command. (it does //premium_item command over SQL and for all player.) So let start, I assume in this guide that you start with a server shutdown.) :) Know Issue(s) : You can not send any non stackable items like full. Required : Gracia final and or highter (I can not tell if any other chronicle work !) MyExt. Now let enable that NPC to spawn and allow feature in "MyExt64.ini" ; Enables Vitamin Manager EnableVitaminManager = true ; Enables withdrawing of non-premium items through Vitamin Manager EnableVitaminManagerNonPremiumItems = true be sure to have these Enabled. Now let add the line to be able to retrieve item (in case you do no have it at base like me.) so for that open "e_premium_manager001.htm" (it was it for me.) And add this line : <a action="bypass -h menu_select?ask=1&reply=1"><font color="LEVEL">Retrieve a Dimensional Item</font></a><br> So in the end it look like that(Attention that totaly unofficial html but working one.) <html> <head> </head> <body> Dimensional Merchant:<br> Greetings, adventurer! I know I may look strange to you, but I have traveled through time and space, scouring the corners of reality, to bring you the finest wares in all the land. <br> My agents are collecting rarities, trinkets, and treasures the likes of which you have never seen. They have returned, with several unusual items, maybe some have been shared to you. <br> <a action="bypass -h menu_select?ask=1&reply=1"><font color="LEVEL">Retrieve a Dimensional Item</font></a><br> <a action="bypass -h menu_select?ask=2&reply=1">Exchange a Minion Coupon for a Minion pet</a><br> <a action="link e_premium_manager009.htm">Exchange a Premium Minion Coupon for a Premium Minion pet</a><br> </body> </html> now here my AI section for this npc in case you do not have it but it is not modified, it was not required at all on Gracia final) Now your server should be able to receive Item from SQL So try to launch it with npc and while it boot we will "fix" SQL table "user_premium_item" to auto increment warehouse_no field. if your already does and you have populated it you can skip to next step. If not make a backup of your SQL database and drop "user_premium_item" and execute this mssql script (it will re-create user_premium_item with auto increment field :)) : IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[user_premium_item]') AND type in (N'U')) BEGIN CREATE TABLE [dbo].[user_premium_item]( [warehouse_no] [bigint] NOT NULL IDENTITY, [buyer_id] [int] NOT NULL, [buyer_char_id] [int] NULL, [buyer_char_name] [nvarchar](50) NULL, [recipient_id] [int] NOT NULL, [recipient_char_id] [int] NULL, [recipient_char_name] [nvarchar](50) NULL, [server_receive_date] [datetime] NOT NULL CONSTRAINT [DF_premium_service_server_receive_date] DEFAULT (getdate()), [item_id] [int] NOT NULL, [item_amount] [bigint] NOT NULL, [item_remain] [bigint] NOT NULL, [ibserver_delete_date] [datetime] NULL, CONSTRAINT [PK_user_premium_item] PRIMARY KEY CLUSTERED ( [warehouse_no] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] END GO now that you got proper Database and server that just wait you. We will first try it on your builder character. So execute this code but pay attention you 4 id to change and 1 string ! INSERT INTO user_premium_item (buyer_id, buyer_char_id, buyer_char_name, recipient_id, recipient_char_id, recipient_char_name, item_id, item_amount, item_remain, ibserver_delete_date) SELECT Builder Account ID, Builder Character ID of the accound ID, 'Name of the character', Account ID that will receive the item, 0 <- leave it to zero any character from accound can receive it, null <- if 0 leave to null. , 8659 <- Item ID, 5 <- Quantity sent, 5 <- Remaining quantity, null <- Delete item Date (null to keep it for ever) GO here an example I made. builder account id is 13 character id on this account is 65 it's name is LineageTwo This character sent 8685 (a sweet chest :D) 5 time to it's account. INSERT INTO user_premium_item (buyer_id, buyer_char_id, buyer_char_name, recipient_id, recipient_char_id, recipient_char_name, item_id, item_amount, item_remain, ibserver_delete_date) SELECT 13, 65, 'LineageTwo', 13, 0, null, 8659, 5, 5, null GO Now it should look like that : Now to send an item too all we just need to mode a tiny bit. INSERT INTO user_premium_item (buyer_id, buyer_char_id, buyer_char_name, recipient_id, recipient_char_id, recipient_char_name, item_id, item_amount, item_remain, ibserver_delete_date) SELECT Builder Account ID, Builder Character ID of the accound ID, 'Name of the character', uid, <- leave it that way, it will fetch all uid from user_account table. 0, <- same as before it is to all character from the account to get it null, <- not required if no id as character as be provided. 8659, <- Item ID 5, <- Item Quantity 5, <- Item Quantity remaing null <- delete item at the date provided. FROM lin2db.dbo.user_account so for a working example with same builder account and id + name than previous example here it is : INSERT INTO user_premium_item (buyer_id, buyer_char_id, buyer_char_name, recipient_id, recipient_char_id, recipient_char_name, item_id, item_amount, item_remain, ibserver_delete_date) SELECT 13, 65, 'LineageTwo', uid, 0, null, 8659, 5, 5, null FROM lin2db.dbo.user_account It will look like the previous screenshot but for all players. So in short with this method you can easly send item to all character from SQLwithout needing to reboot server. I can be userfull for reward from a game over php page, a donation system and many many things :) Hope you enjoy
  17. Hello mates, Since all my previous posts was for H5 Chronicle so i think i’ll start post some content for Interlude Chronicle, so here is my first Interlude guide, but after all Java is Java, no matter Interlude, H5, … etc all are just Java files The Server Pack i’m gonna use in this guide will be ( aCis Rev.360 [Free Version] ), and for the IDE will use NetBeans, of course you can use Eclipse it’s just personal preferences. ---------------------------------------------------------------------------------- Requirements : – I expect that you have aCis Source Pack Installed on your computer or server – We won’t go through the process of installing and starting server, since there are a lot of good guides about this here. – You need a Java IDE (Eclipse, Netbeans, IntelliJ or any else) i’ll use NetBeans but you can use Any. – Stay Relaxed, No Stress, Coding is just Entertaining. ---------------------------------------------------------------------------------- – How things happen in Game ? Well In Lineage 2 Every thing has two sides (Client and Server), whatever you do in Client (Game) it will automatically send a request to server, then server analyze this request, start processing it and response with a response . That data the fly between Client and Server called Packets , This Packets can be a Request Packet or Response Packet, and each Packet has special code or identifier, if you click here you will find the main Packets for Interlude. For Example : You Click on Community or ALT+B, your game client will send a packet to server called RequestShowboardwith code 57, this is sent from Client to Server, so it’s ClientPacket. So if we want to do any special thing when Player try to show the community board we need to find this packet code which since it’s a ClientPacket then it will be in that package : net.sf.l2j.gameserver.network.clientpackets When Server Analyze that request and see things like if it’s enabled … etc it will reply with another Packet which is ShowBoard with code 6E (if board enabled ofc), and this is sent from Server to Client, so it’s a ServerPacket, and since it’s a ServerPacket so we can find it in that package : net.sf.l2j.gameserver.network.serverpackets , and we can expect that this class or java file will be responsible for what will be shown on the board. By now we know how to find where magic happens, but what about more power ? ---------------------------------------------------------------------------------- What is Bypass and how it works ? Whenever you click on a button or a link for an NPC or even in Community Board this buttons and links meant to do something when a player click on it, but how it happens ? and how server knows which button player clicked and what should happen after that ? Well if you try to show the code of any l2j html file that contain a link or a button, for example i’ll view source code of aCis main buffer by @Tryskell, which located in gamserver/data/html/mods/buffer/50008.htm <html><body> <center><img src="L2UI_CH3.herotower_deco" width=256 height=32 /></center><br> Hello stranger!<br> I'm Tryskell. Yup, you're right, I created an avatar of myself and decided to share some of my powerful buffs in order to improve your pew-pew-bum-zap abilities.<br> What can I do for you ? Do you want to hear <font color="LEVEL"><a action="bypass -h npc_%objectId%_Chat 9">my story</a></font> ?<br> <center> <a action="bypass -h npc_%objectId%_support player">Magic support</a><br> <a action="bypass -h npc_%objectId%_manageschemes">Manage my schemes</a><br1> <a action="bypass -h npc_%objectId%_editschemes none none">Edit my schemes</a><br> <a action="bypass -h npc_%objectId%_heal">Heal me and my pet</a><br1> <a action="bypass -h npc_%objectId%_cleanup">Cleanup all effects on me and my pet</a> </center> </body></html> Here you can see the attribute action contains something like : let’s split this action in parts and see what every part do : bypass : tells your client to send a packet RequestBypassToServer with OP Code 0x21 (0x identify a hex decimal > a numeric base 16 value ) -h : tells your client to hide the window on click event npc_%objectId%_Chat 9 : is the command that will be bypassed to server So if we wanna make a bypass to server we just wanna set the action of the link (<a>) or button to something like : “bypass -h command” or just “bypass command” But actually we still dunno what commands already available or if we can create a new custom ….. ----------------------------------------------------------- Track the Bypass down : I can just give you a list of possible bypass commands but i hate limitations, so i’ll give you a quick guide about how to find them and learn about what they do all on your own and then will give you some examples, also this will help you work with almost any pack or chronicle, so let’s see how it works. First packets sent to server will be sent to a class called L2GamePacketHandler.java, which in aCis it’s located at : net.sf.l2j.gameserver.network , and then this class will redirect that packet to the proper Handler or class depending on the received packet OPCode, and since we know that RequestBypassToServer have the OPCode of 0x21 so what about search about this in that Java File : As we can see it call a class called RequestBypassToServer, if we click on this class name : For Netbeans : Right Click > Navigate > Declaration (or CTRL+B) For Eclipse : Right Click > Go To > Declaration It will open that file we will find a part of the code like this (i removed some part just to be easier to read) : if (_command.startsWith("admin_")) { .... } else if (_command.startsWith("player_help ")) { .... } else if (_command.startsWith("npc_")) { .... } else if (_command.startsWith("manor_menu_select?")) { .... } else if (_command.startsWith("bbs_") || _command.startsWith("_bbs") || _command.startsWith("_friend") || _command.startsWith("_mail") || _command.startsWith("_block")) { .... } else if (_command.startsWith("Quest ")) { .... } else if (_command.startsWith("_match")) { .... } else if (_command.startsWith("_diary")) { .... } else if (_command.startsWith("arenachange")) { .... } So as we can see the current supported bypasses are commands that started with : Of course you can add another main custom command by adding another “else if” statement or even create a bypass handler or replace this one with an extended one. Why we don’t go further and inspect how this npc_ thing work ….. here the code of that section : else if (_command.startsWith("npc_")) { if (!activeChar.validateBypass(_command)) return; int endOfId = _command.indexOf('_', 5); String id; if (endOfId > 0) id = _command.substring(4, endOfId); else id = _command.substring(4); try { final L2Object object = L2World.getInstance().getObject(Integer.parseInt(id)); if (object != null && object instanceof L2Npc && endOfId > 0 && ((L2Npc) object).canInteract(activeChar)) ((L2Npc) object).onBypassFeedback(activeChar, _command.substring(endOfId + 1)); activeChar.sendPacket(ActionFailed.STATIC_PACKET); } catch (NumberFormatException nfe) { } } The first part can be lil confusing if you’re not very familiar with java, so lemme explain it to you . That part looking for a number that comes after npc_ that followed by an “_” for example : npc_123456 , and before we saw that command npc_%objectId%_Chat 9 , so here we expect that %objectId% is a number and yes it is since server will automatically replace %objectId% with a unique numeric identifier for the NPC you’re talking to, and it’s not the id you use to spawn it, since you may spawn that npc multiple times so server needs to identify each one of them. So for now we know that command is used like this : Later in this code we will find that part : final L2Object object = L2World.getInstance().getObject(Integer.parseInt(id)); if (object != null && object instanceof L2Npc && endOfId > 0 && ((L2Npc) object).canInteract(activeChar)) ((L2Npc) object).onBypassFeedback(activeChar, _command.substring(endOfId + 1)); activeChar.sendPacket(ActionFailed.STATIC_PACKET); Also let me explain this for you, this code will search the L2World for something with that unique identifier and if found it will use it as L2Npc object and call the method onBypassFeedback to process the command in our case the command will be Chat 9. So Lets Go to declaration of that L2Npc class (as we learned how before), and lets see what this onBypassFeedback do we will find something like this : if (command.equalsIgnoreCase("TerritoryStatus")) { .... } else if (command.startsWith("Quest")) { .... } else if (command.startsWith("Chat")) { .... } else if (command.startsWith("Link")) { .... } else if (command.startsWith("Loto")) { .... } else if (command.startsWith("CPRecovery")) { .... } else if (command.startsWith("SupportMagic")) { .... } else if (command.startsWith("multisell")) { .... } else if (command.startsWith("exc_multisell")) { .... } else if (command.startsWith("Augment")) { .... } else if (command.startsWith("EnterRift")) { .... } else if (command.startsWith("ChangeRiftRoom")) { .... } else if (command.startsWith("ExitRift")) { .... } As we can see we can now expect that we can use npc_ commands as follow : But in the previous example there were number 9 in the end as npc_%objectId%_Chat 9, what this would mean ? well here is the code of Chat command : else if (command.startsWith("Chat")) { int val = 0; try { val = Integer.parseInt(command.substring(5)); } catch (IndexOutOfBoundsException ioobe) {} catch (NumberFormatException nfe) {} showChatWindow(player, val); } As we can see here it will look for that number (9 in our case) and pass it to a method called showChatWindow , which will look for an htm file with same npc id ended with -9 for example this npc id is 50008 so it will looks for 50008-9.htm , and yes it’s right : Now we know how to track things down but one thing left, which is what if you found an bypass in an npc which you cannot find in L2Npc Class, well some npc don’t directly based on L2Npc type but sometimes it’s based on something else that based on L2Npc, for example this NPC in our example has a bypass like : this “heal” command not exist but if we go to our npcs folder in path of gameserver/data/xml/npcs , and we opened the file 50000-50099.xml since our npc id is 50008 and look into that npc definition you will find this : As you can see it’s based on L2Buffer, not L2Npc directly, so we can expect that this class called L2Buffer will contain a method called onBypassFeedback and it will contain an implementation for this “heal” command, but wait a second … you’ll never find a class called L2Buffer, simply because in aCis Packs L2Buffer will redirect to a class called L2BufferInstance and L2BlaBla will redirect to L2BlaBlaInstance, it’s just how aCis simplify things, so just keep that in mind we looking for L2BufferInstance … If we go to that class which is located in the package of : net.sf.l2j.gameserver.model.actor.instance (btw this package contains a lot of interesting stuff) we will find that part inside the onBypassFeedback method : Yay , it’s here, so if we want to use this command on another npc we have 3 options : – Add this code to the main RequestBypassToServer – Set the NPC type to L2Buffer – Create a new NPC instance and implement this on it Or we can even add it to community board :D ------------------------------------------------------------------- Do you learned something from this guide ? Personally i don’t learn any thing without getting my hands into it in real action, so why not create something real, like a multi function npc and as a bonus we will create a new NPC type as well, also we can work a bit with Community Board . . . let’s go friends ------------------------------------------------------------------- 1.1 : Create a new NPC Type : Let’s Create a new Class in the package net.sf.l2j.gameserver.model.actor.instance, and i’ll call it L2MultiFunctionInstance (Name it whatever u want but don’t forget suffix it with Instance) , Just right click on the package and New > Java Class : Now i’ll make it extends the L2NpcInstance or you can use L2Npc class only, but L2NpcInstance has cool implementation so i’ll go for it, and now Server will know it’s an NPC, but you may want for example extends L2BufferInstance to take benefit of Buffer commands or anything else that considered as NPC, but i’ll go pure in this guide , and to simplify thing and to not go off topic i’ll create a simple class code for you which you can use it and i’ll highlight the important parts : //TODO: Add your Custom Bypasses Here At this place we can add our custom bypass commands “data/html/custom/multifunction/” this is where our .htm files will be located for npcs with this type ------------------------------------------------------------- 1.1 Create the Actual NPC So First let’s create our NPC, i’ll add it Below Tryskell NPC so it will be in file 50000-50099.xml : <npc id="50009" idTemplate="31324" name="Relina" title="Multifunction NPC"> <set name="level" val="70"/> <set name="radius" val="8"/> <set name="height" val="23"/> <set name="rHand" val="316"/> <set name="lHand" val="0"/> <set name="type" val="L2MultiFunction"/> <set name="exp" val="0"/> <set name="sp" val="0"/> <set name="hp" val="2444.46819"/> <set name="mp" val="1345.8"/> <set name="hpRegen" val="7.5"/> <set name="mpRegen" val="2.7"/> <set name="pAtk" val="688.86373"/> <set name="pDef" val="295.91597"/> <set name="mAtk" val="470.40463"/> <set name="mDef" val="216.53847"/> <set name="crit" val="4"/> <set name="atkSpd" val="253"/> <set name="str" val="40"/> <set name="int" val="21"/> <set name="dex" val="30"/> <set name="wit" val="20"/> <set name="con" val="43"/> <set name="men" val="20"/> <set name="corpseTime" val="7"/> <set name="walkSpd" val="50"/> <set name="runSpd" val="120"/> <set name="dropHerbGroup" val="0"/> <ai type="DEFAULT" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" canMove="true" seedable="false"/> <skills> <skill id="4045" level="1"/> <skill id="4416" level="16"/> </skills> </npc> Note that it has id of 50009 and type of L2MultiFunction (without Instance) ------------------------------------------------------------ 1.2 Create the html files Now the html part, we gonna create a folder called custom inside html folder and inside it will create multifunction folder which it’s where we gonna have our html files, First we need the main htm which will be on our created folder with name 50009.htm : <html> <body> <br> <center> <img src="L2UI_CH3.herotower_deco" width=256 height=32 /> <font color="D5C003">Hello Player</font><br> <font color="DDDEC0">I'm the Multi Function NPC with Awesome Customs</font><br> <button value="Open Another Chat" action="bypass -h npc_%objectId%_Chat 1" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <button value="Show a Multi Sell" action="bypass -h npc_%objectId%_multisell 50009" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <button value="Multisell [Inv.Maintain]" action="bypass -h npc_%objectId%_exc_multisell 50009" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <button value="Community Board" action="bypass _bbshome" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <button value="Acumen Buff - No Close" action="bypass npc_%objectId%_giveAcumen" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <button value="Teleport To Giran" action="bypass -h npc_%objectId%_gotogiran" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <button value="Augment" action="bypass -h npc_%objectId%_Augment 1" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <button value="Warehouse" action="bypass npc_%objectId%_warehouse_deposit" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <img src="L2UI_CH3.herotower_deco" width=256 height=32 /> </center> </body> </html> Thanks to @Sinister Smile for the buttons, and to make it work, you need to have this file > Download Also we will need another htm file for testing which will be named 50009-1.htm : <html> <body> <br> <center> <img src="L2UI_CH3.herotower_deco" width=256 height=32 /><br > <font color="D5C003">Hello Once Again</font><br> <font color="DDDEC0">This is another Chat of me</font><br> <button value="Back to Main" action="bypass -h npc_%objectId%_Chat 0" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> <img src="L2UI_CH3.herotower_deco" width=256 height=32 /> </center> </body> </html> ----------------------------------------------------------------- 1.3 Create the Multisell File I’ll Create a multisell file with name 50009.xml in multisell folder : <?xml version='1.0' encoding='utf-8'?> <list maintainEnchantment="true"> <item> <production id="6608" count="1"/> <ingredient id="6579" count="1" /> </item> <item> <production id="5643" count="1" /> <ingredient id="151" count="1"/> </item> </list> --------------------------------------------------------------- 1.4 Start Server (If not Yet) and let’s Test Each one Open Another Chat : Action : bypass -h npc_%objectId%_Chat 1 This will Open the htm file called 50009-1.htm Show Multi Sell : Action : bypass -h npc_%objectId%_multisell 50009 This will Show a Multisell with id of 50009, and will show all items even items player can’t buy Multi Sell [Inv.Maintain] : Action : bypass -h npc_%objectId%_exc_multisell 50009 This will Show a Multisell with id of 50009, and will show only items player can buy (have the required items for it) Community Board : Action : bypass _bbshome Will Show Community Board if enabled, you can also use : Augment : Action : bypass -h npc_%objectId%_Augment 1 Will Show Augment Panel, also you can use bypass -h npc_%objectId%_Augment 2, to show Remove Augment Panel ----------------------------------------------------------- 1.5 Implement Missed Bypasses : So Now we need to add our custom bypasses to the NPC Type which are : giveAcument, gotogiran, warehouse_deposit Let’s get back to Java and inside onBypassFeedback in the Class we just created we will add this : if(command.equalsIgnoreCase("giveAcumen")) { SkillTable.getInstance().getInfo(1085, SkillTable.getInstance().getMaxLevel(1085)).getEffects(player, player); } else if(command.equalsIgnoreCase("gotogiran")) { player.teleToLocation(82698,148638,-3473,0); } else if(command.equalsIgnoreCase("warehouse_deposit")) { player.sendPacket(ActionFailed.STATIC_PACKET); player.setActiveWarehouse(player.getWarehouse()); player.tempInventoryDisable(); player.sendPacket(new WarehouseDepositList(player, WarehouseDepositList.PRIVATE)); } else { super.onBypassFeedback(player, command); } ------------------------------------------------------------------ 1.6 Let’s Test this When we test this everything will be find except one thing, which is Warehouse, it will show deposit window, but when you confirm, it will not move items to warehouse, since in client packet of SendWareHouseDepositList it will check if the last npc was a Warehouse and our npc is not warehouse : And to Fix this it simple, just we can add another method to our custom NPC class which will make it pretend as being warehouse : @Override public boolean isWarehouse() { return true; } So we end up with this code : package net.sf.l2j.gameserver.model.actor.instance; import net.sf.l2j.gameserver.cache.HtmCache; import net.sf.l2j.gameserver.datatables.SkillTable; import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; import net.sf.l2j.gameserver.network.serverpackets.WarehouseDepositList; /** * Multi Function NPC Instance * * Made for MxC Bypasses Guide * * @author Sam Dev */ public class L2MultiFunctionInstance extends L2NpcInstance { public L2MultiFunctionInstance(int objectId, NpcTemplate template) { super(objectId, template); } @Override public void onBypassFeedback(L2PcInstance player, String command) { if(command.equalsIgnoreCase("giveAcumen")) { SkillTable.getInstance().getInfo(1085, SkillTable.getInstance().getMaxLevel(1085)).getEffects(player, player); } else if(command.equalsIgnoreCase("gotogiran")) { player.teleToLocation(82698,148638,-3473,0); } else if(command.equalsIgnoreCase("warehouse_deposit")) { player.sendPacket(ActionFailed.STATIC_PACKET); player.setActiveWarehouse(player.getWarehouse()); player.tempInventoryDisable(); player.sendPacket(new WarehouseDepositList(player, WarehouseDepositList.PRIVATE)); } else { super.onBypassFeedback(player, command); } } @Override public boolean isWarehouse() { return true; } @Override public String getHtmlPath(int npcId, int val) { String filename = "data/html/custom/multifunction/" + npcId + ((val == 0) ? "" : "-"+ val ) + ".htm"; return (HtmCache.getInstance().isLoadable(filename)) ? filename : "data/html/npcdefault.htm"; } } By Now we have our Multi Function NPC, But Guess what .... we have a Bonus in this Guide . ----------------------------------------------------------------- 2.0 The Bonus : How to Open a Multisell in Community Board Well i’m sure it’s easy for you now, all we need to do is to add another command to CommunityBoard since we can’t use npc_%objectId% stuff here ----------------------------------------------------------------- 2.1 Add the Command to the CommunityBoard.java You can find it in the package : net.sf.l2j.gameserver.communitybbs , Then we gonna add this code after the _bbshome code else if(command.startsWith("_bbsmultisell")) {MultisellData.getInstance().separateAndSend(command.substring(13).trim(), activeChar, null, false);} To look like : ----------------------------------------------------- 2.1 Add the Mutlisell Button to the Community Board Home Go to : data/html/CommunityBoard/top/Index.htm, and add this code any where you like it to appear : <br> <center> <button value="Multisell In Community" action="bypass _bbsmultisell 50009" width=150 height=22 back="TutorialBut.fortut" fore="TutorialBut.fortut"> </center> ------------------------------------------------------- 2.2 Now Build your Server Core and Restart Server to Test Now Guess What ?? it’s Working and we have Multisell in Community Board At the End i hope you learned something new, and i wish it’s useful to anyone Thanks and Regards
  18. The Asylum Sanctorium is an isolated section of Clockwork City created by Sotha Sil to sequester three Saints after it became clear that his experiments made them unstable. Not all of Sotha Sil's experiments go as planned. Face the Clockwork God's most dangerous creations in the Asylum Sanctorium, the Clockwork City DLC game pack's new Trial, coming soon for ESO Plus members and to the Crown Store.
  19. Hello , i would like to help me in setting up a interlude server, if any1 can provide me a detail guide, include any pack of interlude , preferable l2gold. Im newbie just want to play a bit with database to have some fun. I will really appreciate if any1 could help me ;) Thanks in advance!
  20. i need a walker working on an interlude server pvp craft x70 if possible can you tell me
  21. Hello mates, here we back again with a new guide, in this tutorial we will go beyond the rules (not forums rules lol), it could be useful for someone, useless for someone else, but .. i like to share things with you mates xD. Oh God someone shut me up to cut this off and get started …. It’s Really boring, don’t you think so ? Well Lineage is getting old, same play style, same aspects, it needs a little refreshment, or maybe a rebirth, people keeps changing servers wishing for something to entertain them, so why not adapt few things from other games ?, actually let’s be more straight and honest LETS STEAL SOME IDEAS :D, but hold on for a second … there are some talented people already adapted some styles and armors and weapons …. etc, and some adapted some events or stuff…. why not you ? you can also adapt things it’s not that hard or impossible if we just thought out of the box . In my opinion i’ll categorize adapting into two categories : 1. Client Adaption : Armors, Effects, Weapons, Interfaces …. etc . and i will not talk about this since it needs a good modeler and designer and i’m not 2. Features Adaption : Like Events, Items, Play style …. etc. and this is what we will be learning, it’s just needs few things to get familiar with. ------------------------------------------------------------------------------------------------------------- How to Get Started : Well it’s Simple, but to get better understanding we need an example to apply what we learn on . so we gonna adapt an idea from another game in this guide. There is a game called “Continent of Ninth Seal” , they keeps updating and adding new items and weapons every time , and one day they added a very good weapons, but some people was complaining about this, since after they got their weapons well enchanted and this is really hard to get, now they need to start over and enchant the new weapons from beginning ….. so they made a new feature which is Enchant Extraction. here is the link for the feature we gonna adapt : Transfer the Enhancement How the Feature Works : For example you have a weapon +16, and you need to change weapons, all you need to do is take your old weapon along with an item called “Weapon Enhancement Extraction Scroll” then go to blacksmith and put your old enhanced weapon with the scroll and you press a button, then your enhanced item will be destroyed and you will get what called “Transcendent Stone +16”, then u enhance the other weapon with this stone which will make it instantly +16 without fail. Note : later they added update to lower the stone with 2 levels means +16 items will make +14 stone. because people started to enhance low items and when get ++++ then extract and add it to high item. also this feature made them sell very well since the Extraction Scroll is for about 7 Dollars. ------------------------------------------------------------------------------------------------------------- The Game : Adapting such a feature is just a game that we gonna play together now,The Game of Thieves, we will play as thieves, oh you laughing at me now …. come on and trust me i’ll tell you how to be a good thief. First let’s make a party and go in our mission….. ------------------------------------------------------------------------------------------------------------- The Mission ( Prove Yourself ) : Hello new thief .. in order to join the Adaption Mafia you have to prove yourself by Proving yourself as a skilled thief . Your first mission is : Our Gaming Spies confirmed that the developers of C9 is working on a new technology which will allow their players to extract their enhancements and contain the enhancement power into some kind of magic stone called “Transcendent Stone” , and with this stone they will be able to put this contained power on another weapon .. we don’t have much info about this technology .. and it is your mission to steal their papers and implement this feature to the mother of games “Lineage” .. Our Spies was able to get into their game and was able to take 2 screenshot regarding the feature… use them wisely. ----------------------------------------------------------------------------------------------------------------------- Oh , what we gonna do ? “Start Small, Progress More” It looks like tough mission, but let’s calm down and break this down into simpler steps, what this feature is about or what things that makes it : – Enhancement Panel : we already got this in our game – Extraction Panel or window : well we don’t have this too, and if we made it like an html with some bypasses it will looks so static, no real on screen interactions …. – Transcendent Stone : well we can easily create an Etc Item, but if it’s done this way we’ll have to create many of this since one for +1, another for +2, +3 …… etc . and this will so much we need a smarter way. well what about create one Etc item and save it’s enhancement level somewhere in server or database … pfff but how players will know if it’s +12 or +10, it will has same name showing on the screen they can fool each others and sell a +1 stone as if it’s +100 stone, oh no we need another way. – Extraction Scroll : this could be the easier part all we need is to create an Etc Item – Being able to move the enhancement from the Transcendent Stone to another weapon . What about quit and say we can’t do this ? ----------------------------------------------------------------------------------------------------------------------- Investigation : “Use what you already have” Before we start we need to make some investigation and see what tools we have and what we can make use of. What things in lineage that “look like” this, this is the first thing you need to think about when you adapting anything to anything, not only Lineage but any software or system you develop, it’s like one of the basic rules in Software Development career is to use what you already have. – Extraction Panel : we need some kind of panel where player put two things, the weapon and the extraction scroll …. think, think, think ….. oh we have two things like this , Enchant panel and augment panel … i think we can use one of them – Transcendent Stone : we need an item with dynamic name to be like ” +6 Transcendent Stone or +10 Transcendent Stone”, hmmmmmmmmmm …. let’s do some brain storming … what items that part of it’s name controlled by server not the client …. why we didn’t thought about this ???? all armors, weapons and jewels has this feature they all can have the +xx thing – Extraction Scroll : it’s just an item man, nothing easier than this … wait wait wait .. i think about something, what about making this as a special enchant scroll, so when user click on it it will automatically pop up a window to select a weapon. – Enhance Back with Transcendent Stone : well we can just make it as enhancement scroll, but ….. we said we gonna make it like armors and weapon, how it can be for example a weapon and scroll in same time . well we need a bit of analyzing , weapon when used they get equipped, scrolls when used they get an enhancement panel …. can’t we check on Equip Request that if it’s our stone then it override the equipping procedure and instead run the enhancement procedure ?? i think we can find a way around. ----------------------------------------------------------------------------------------------------------------------- The Plan : “Going random is the best way to fail” Our plan will split on multi tasks so we can work on one by one as follow Stage .1 : (Preparation) – Create a new UTX File containing the icons for our two items (Transcendent Stone and Extraction Scroll) – Add Items to Itemname-e.dat file with proper names – Add Transcendent Stone to Armorgrp.dat as accessory or something – Add Extraction Scroll to EtcItemgrp.dat – Add both Items to proper XML file in server data files – Estimate current Stage Progress and Check if all work as expected Stage .2 : (Think out of the Box) – Handle player’s Equip action with Transcendent Stone to be forbidden and instead open Enhancement Panel – Handle Enhance panel acceptance for our Transcendent Stone as Enhancement Scroll instead of Armor Part – Handle Player’s Request of Confirming Enhance Process with Transcendent Stone – Handle Usage of Extraction item differently than enhance scroll to extract Enhancement instead of Enhancing – Clean up and Estimate current Stage Progress to Check if all work as expected ----------------------------------------------------------------------------------------------------------------------- ~*- Challenge Accepted -*~ ----------------------------------------------------------------------------------------------------------------------- Stage .1 : – Create a new UTX File containing the icons for our two items (Transcendent Stone and Extraction Scroll) Note : there are many tutorial on this forum about this thing so we will cover it fast. Okay boss we’re on it … at this point we will need to use the screen shots from our spies to get the icons of both and crop them on any image processor, i’ll use Photoshop, also we will need to resize them to 32 by 32 pixels, and i’ll set my crop aspects on Photoshop to be 1×1 to avoid any ratio problems After that we do same for the other one then we resize, in Photoshop i use shortcut CTRL+ALT+I Now we will save both of them as TGA files, i don’t have the DDS plugin installed so i’ll save as TGA, and will name them as transcendent_stone_icon.tga and enhancement_extract_scroll.tga then will close photoshop and go to open Unreal Editor and create new UTX File, will name MxCMission, then import the two TGA files we made (Take care of what highlighted Thanks to @Sinister Smile for helping with this) Let’s Save this file and encrypt it. I’ll use L2Ninja to Encrypt as L2 UTX file Now we add this file to our SysTextures Folder and Task Completed ----------------------------------------------------------------------------------------------------------- – Add Items to Itemname-e.dat file with proper names I’ll use L2Ninja Again to edit this file (you can use any editor) and add both items with ids 85850 and 85851, just any the id you want but be unique and make sure you remember them ----------------------------------------------------------------------------------------------------------- – Add Transcendent Stone to Armorgrp.dat as accessory or something After some investigations i found most armor items express their type for example Baium under it’s name you will see the word “Ring” and same for most armor items except ….. Belts, so because i’m a lazy coder i’ll copy any armorgrp belt code and modify it then add it again to armorgrp.dat, i wont write it from scratch it’s so dam long mate xD So here is the code i copied and modified with our new item id and icon, so i used id of 85851 and icon MxCMission.transcendent_stone_icon ----------------------------------------------------------------------------------------------------------- – Add Extraction Scroll to EtcItemgrp.dat What about doing the same, i’ll just copy anything from that file and change id and icon xD , we can adjust this later . ----------------------------------------------------------------------------------------------------------- – Add both Items to proper XML file in server data files Now we need to add this items to Server XML files, so i’ll create an xml in data/stats/item and will name it mission.xml, then will add the proper code of both item <?xml version="1.0" encoding="UTF-8"?> <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/items.xsd"> <item id="85851" type="Armor" name="Transcendent Stone"> <set name="icon" val="MxCMission.transcendent_stone_icon" /> <set name="default_action" val="EQUIP" /> <set name="armor_type" val="LIGHT" /> <set name="bodypart" val="waist" /> <set name="immediate_effect" val="true" /> <set name="crystal_count" val="30" /> <set name="crystal_type" val="A" /> <set name="material" val="CLOTH" /> <set name="weight" val="440" /> <set name="price" val="371300" /> <set name="enchant_enabled" val="1" /> </item> <item id="85850" type="EtcItem" name="Enhancement Extraction Scroll"> <set name="icon" val="MxCMission.enhancement_extract_scoll" /> <set name="default_action" val="SKILL_REDUCE" /> <set name="immediate_effect" val="true" /> <set name="material" val="PAPER" /> <set name="weight" val="120" /> <set name="is_oly_restricted" val="true" /> <set name="handler" val="EnchantScrolls" /> </item> </list> ----------------------------------------------------------------------------------------------------------- – Estimate current Stage Progress and Check if all work as expected Let’s Start our server and check the items we created …. Yeaaah it’s working and even when we use the Extraction scroll it opens the Enhancement Panel … this is a great start ----------------------------------------------------------------------------------------------------------------------- ~*- Stage 1 Completed with Pleasure -*~ ----------------------------------------------------------------------------------------------------------------------- Stage .2 : (Think out of the Box) JAVA TIME ….. this where things get more exciting but it can be messy so let me tell how things working in L2J so we can have better understanding about the process. I’ll give you a little Hint about how to be on the right path without keep looking on internet or asking … Please Focus on this Part … Everything in Lineage is based on something called Packets. Consider a Packet as an Envelop that contain a letter being send from your Game Client as player to the Game Server and vice versa From Game Server to Game Client, this letters or packets can contain a request or information like for example You wanna Equip a Weapon so you double click on it : Game Client > Game Server : Oh ! Hey Server i want to equip a weapon that has id 9999 Game Server > Game Client : Well, it’s looks fine and allowed for me, Okay No Problem Equip It. Game Client > Game Server : Thank you mate, i have Equiped it, can you tell me my stats after Equip Game Server > Game Client : Yes, Sure thing . Here is your stats ……………. This Sentences between client and server is pack , and we will talk about Two Types of Packets in L2J ServerPackets and ClientPackets. Client Packets : Are the Packets that sent from Client to Server, which located at java/com/l2jserver/gameserver/network/clientpackets Server Packets : Are the Packets that sent from Server to Client, which located at java/com/l2jserver/gameserver/network/serverpackets At This two locations all the magic starts to happen, you can really explore them and see where the code starts at every in-game action for example when we right clicked on “Enhancement Extraction Scroll” it sends a Client Packets called UseItem, so server will try to process this packets and see if it’s allowed or not and what this item about, it will say “Oh i see in my XML files that this items is EnchantScroll so let’s Open Enchant Panel” , this response from server is also a packet which is ChooseInventoryItem Packet, Then Player try to put his weapon into enchant item slot but it needs a permission so it send to server a Client Packet called RequestExTryToPutEnchantTargetItem, saying “Hello i wanna select this weapon as the Target item to Enchant, is this allowed ?” , At this point we can think of this Packet Java file maybe is the one responsible for accepting or refusing , Let’s take a look and see if something useful , yes i found something interesting in this file : Looks like the Yellow Area is just a normal checks, Red Area is where Server Refuse an Item, Green Area is where Server Accept an Item … Try also to Explore more in the Packets Packages that i have mentioned their locations before, at least read files names, it’s very useful to know what in there. So Let’s Start ----------------------------------------------------------------------------------------------------------- – Handle Usage of Extraction item differently than enhance scroll to extract Enhancement instead of Enhancing I Guess you know where we can go .. Yes RequestExTryToPutEnchantTargetItem.java and we need to make it not refuse our Extraction Scroll since if we try now to add any item to enhance with this scroll it will just refuse it, since it’s refusing the scroll it self . so here is the modifications i made, replace : if ( (scrollTemplate == null) || !scrollTemplate.isValid(item, null)) with this : if ( ((scrollTemplate == null) || !scrollTemplate.isValid(item, null)) && scroll.getId() != 85850 ) and then we need to add this after the if statement block to check if the target item is good : //Extraction Scroll else if (scroll.getId() == 85850) { boolean validProcess = true; if(!item.isWeapon()) { activeChar.sendMessage("You Can only Extract Enhancement From a Weapon"); validProcess = false; } else if (item.getEnchantLevel() <= 0) { activeChar.sendMessage("There is no Enhancement on this Item to Extract."); validProcess = false; } //Finally if it's not valid for any Reason then Fail the process if(!validProcess) { activeChar.sendPacket(SystemMessageId.DOES_NOT_FIT_SCROLL_CONDITIONS); activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE); activeChar.sendPacket(new ExPutEnchantTargetItemResult(0)); return; } } So here what we have done : --------------------------------------------------------------------------------------------------- – Handle player’s Equip action with Transcendent Stone to be forbidden and instead open Enhancement Panel – Handle Enhance panel acceptance for our Transcendent Stone as Enhancement Scroll instead of Armor Part We will do those steps together so instead of equip we will send a different packet and to do this we gonna modify UseItem.java Client Packet, so after if (item == null) { return; } We gonna add this check if it’s our Transcendent Stone, then don’t Equip and instead start enchanting with it : //Forbidden to Equip Transcedent Stone if(item.getId() == 85851) { if (activeChar.isCastingNow()) { return; } if (activeChar.isEnchanting()) { activeChar.sendPacket(SystemMessageId.ENCHANTMENT_ALREADY_IN_PROGRESS); return; } activeChar.setActiveEnchantItemId(item.getObjectId()); activeChar.sendPacket(new ChooseInventoryItem(item.getId())); return; } Well it’s should pop up the Enchant Window, but it wont accept any item since it’s not an instance of EnchantScroll so we will need to make it able to accept weapons as target items like what we did with Extraction Scroll, so let’s Modify the code of RequestExTryToPutEnchantTargetItem Packet again and do another else if, and add the item id to the main if as we did before, so again we replace : if ( ((scrollTemplate == null) || !scrollTemplate.isValid(item, null)) && scroll.getId() != 85850 ) with if ( ((scrollTemplate == null) || !scrollTemplate.isValid(item, null)) && scroll.getId() != 85850 && scroll.getId() != 85851) now we need to add another Else if after the one we added before : //Transcendent Stone else if(scroll.getId() == 85851) { if(!item.isWeapon()) { activeChar.sendMessage("Transcendent Stones are available only to be used with Weapons"); activeChar.setActiveEnchantItemId(L2PcInstance.ID_NONE); activeChar.sendPacket(new ExPutEnchantTargetItemResult(0)); return; } } --------------------------------------------------------------------------------------- – Handle Player’s Request of Confirming Enhance Process with Transcendent Stone When a player use an Enchant item and then he add the Target item it’s time to press Start which will send the packet RequestEnchantItem, and since it’s sent by Client then it’s in ClientPackets , so let’s look at it’s code and see what trouble we can get through when we use this fake belt Transcendent Stone as Enchant Scroll : 1st : in this part it wont work since it’s not real scroll so wont have Template : // template for scroll final EnchantScroll scrollTemplate = EnchantItemData.getInstance().getEnchantScroll(scroll); // scroll not found in list if (scrollTemplate == null) { return; } So we need to modify the if statement to be : if (scrollTemplate == null && scroll.getId() != 85851) Also later down we will find this code which will make our fake scroll not work, and will cause an Null Pointer Exception Error since it will try to validate the target item against the scrollTemplate, and actually scrollTemplate is null since this is not a scroll and we skipped this check for being null before : // first validation check if (!scrollTemplate.isValid(item, supportTemplate)) So we need here to do this check only if it’s not Null, since it’s not null then it’s not our fake scroll, logically, so we replace it with : if (scrollTemplate != null &&!scrollTemplate.isValid(item, supportTemplate)) Later if we scroll down, we will see something like this : final EnchantResultType resultType = scrollTemplate.calculateSuccess(activeChar, item, supportTemplate); switch (resultType) Here we will notice few things as follow : – First it lands EnchantResultType into resultType, so we need to land something of same type incase it’s our scroll and if you Right Click on EnchantResultType and choose Go To Definition (i guess this is it in Eclipse) or as i use NetBeans it’s CTRL+B, you will find that EnchantResultType has possible 3 values as enum (ERROR, SUCCESS, FAILURE), so maybe we will need to add another value to that enum for example TRANSCENDENT to be like this : – Second it uses scrollTemplate and it maybe null so it will cause error so we need to check if it’s null or it’s our fake enchant item, and if it’s not null we do the regular procedure and if null and it’s our fake stone then we return TRANSCENDET value that we added , in this case i’ll use Ternary Operator : final EnchantResultType resultType = (scrollTemplate == null) ? EnchantResultType.TRANSCENDENT : scrollTemplate.calculateSuccess(activeChar, item, supportTemplate); – Thirdly there is a switch statement which iterate through possible EnchantResultType values and we just add our new one so we need to add at the begging of the switch the case of TRANSCENDENT , which in this part the magic happens and where we will move enchant from stone to the item , but Oops we forgot a little thing, by reaching this line it means that our stone already destroyed, so we dunno about the enchant level of it, so we need to save it anywhere before this line // attempting to destroy scroll scroll = activeChar.getInventory().destroyItem("Enchant", scroll.getObjectId(), 1, activeChar, item); we will add : int transcendentLevel = scroll.getEnchantLevel(); then we back to our switch statement and implement the enchant level replacement by adding another case at the beginning like this : case TRANSCENDENT: { if(transcendentLevel > 1 ) { item.setEnchantLevel(transcendentLevel); item.updateDatabase(); activeChar.sendMessage("Transcendent Stone Power can be felt now on your " + item.getName()); activeChar.sendPacket(new EnchantResult(0, 0, 0)); } else {activeChar.sendMessage("This is an Empty Stone, it's just useless to have it.");} break; } ----------------------------------------------------------------------------------------------- – Handle Usage of Extraction item differently than enhance scroll to extract Enhancement instead of Enhancing In this case we gonna do same of what we did with Transcendent Stone, so again we replace this : // scroll not found in list if (scrollTemplate == null && scroll.getId() != 85851) with this : if (scrollTemplate == null && scroll.getId() != 85851 && scroll.getId() != 85850) And we add another EnchantResultType to be like this : Then we gonna replace the resultType Ternary operator we made before with a nested ternary operator : final EnchantResultType resultType = (scrollTemplate == null) ? (scroll.getId() == 85850) ? EnchantResultType.EXTRACTION : EnchantResultType.TRANSCENDENT : scrollTemplate.calculateSuccess(activeChar, item, supportTemplate); Now we need EXTRACTION case into the Switch Statement : case EXTRACTION : { L2ItemInstance stone = new L2ItemInstance(85851); stone.setEnchantLevel(item.getEnchantLevel()); activeChar.getInventory().destroyItem("Extraction", item, activeChar, activeChar); activeChar.getInventory().addItem("Extraction", stone, activeChar, activeChar); activeChar.sendPacket(new EnchantResult(1, 85851, 1)); break; } ------------------------------------------------------------------------------------------------------ – Clean up and Estimate current Stage Progress to Check if all work as expected Let’s Build our Server and restart it and check if it’s working Oh it’s working !!!!!!!! ----------------------------------------------------------------------------------------------------------- Notes : - You can do it better by implementing a new Item Type, but as you can see the guide is already long so i tried to make it as simple as possible - With same Concept of Investigation and Planning you can implement almost any feature ------------------------------------------------------------------------------------------------------------ Conclusion : - Investigate more and more into sources - Have a Good Plan, never go Random - Start small and progress more - Don't Seek Perfection at the first time, make it work then make it work better ------------------------------------------------------------------------------------------------------------ I hope you like it and i wish it's useful to anyone, and if you have any questions or need help just let me know :)
  22. Are there any hacks for glids or items on Gracia final j custom servers? Like on L2 pride style servers? Ty
  23. this guide will go over how to create a new effect for l2 and how to attach it to a npc - static meshes will only work if they are saved using postal editor - EditPackages is the list of 'packages' that ucc will read/save - name your .int the same as your script .u (save as 111 for int) - attaching to bone is not necessary, unless it's a small effect and you want it on a specific part like RESOURCES - Unreal (Postal version) - REQUIRED TO WORK WITH STATIC MESH Unreal (UCC) - REQUIRED TO COMPILE PROPERLY UMODEL ActorX Unpacked Effect Scripts L2PE ASE Export Properties DDS Properties UCC Compile Script @echo ucc.exe make pause Scripts created other cool things you can do -
  24. Balance is what Lineage actually is. Elf relying on his DEXterity, and other advantages that come with race. The world itself "balance" is misinterpreted. It is not about having an equal chance in PvP. This is how a custom-pvp server should be made. 99% of the servers never got it. You have to be careful with skills' chance. You can not have a custom armor that gives 50% stun resistance, while the resist buff already gives enough resistance for a balanced gameplay. You need to balance things a bit. This can be done by nerfing the resist buff - transferring a big percentage to the item. If both of them give insanse stats (item and buff resistance), your resistance will be above logic - having a higher percentage of 99%. What have you done? You theoretically replaced a resist buff with an item - literally added a new item, and you haven't changed the stats in-game. Pretty cool, isn't? (the same trick must be applied to all stats) Make sure you review classes' accuracy and evasion. You should miss no matter what, player or mob. If your custom items have huge defense stats. Don't freaking do it! Keep low stats in-game. Most of the chronicles are not designed/supposed to support huge values. Your enchant system should be decent. Enchanted items above +8/16 are just insane. Don't do it! Do not listen to players. They can only open your eyes to review things. Test everything by yourself, and then apply changes. Do not make hasty changes. You should have an imaginary map in your head, like a pattern. Once you make random changes, you'll lose it.