Welcome to MaxCheaters.com

Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads

Search the Community

Showing results for tags 'Guide'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


  • General Zone
    • Announcements and News
    • Newbies Introduce Urself
    • Maxcheaters Competitions & Events
    • Votes/Polls Area
    • Report Section
    • Downloads Section
    • Suggestions/Feedback Board
  • 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
    • Buy Advertising Link #1
    • Private Servers
    • Buy Advertising Link #2
    • [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
    • Grand Theft Auto V: FiveM
    • League of Legends
    • Other Multiplayer Games
  • General Section
    • General Marketplace
    • Webmasters Zone
    • Hacking/Coding Zone
  • Graphics/GFX Zone
    • Graphics/GFX General Discussion
    • Graphics/GFX Showcase
    • Graphics/GFX Resources/Tools
  • Premium Zone
    • General Discussion [Premium]
    • Lineage II [Premium]
    • GFX Area [Premium]
  • MaxCheaters Corner
    • Tech/World News
    • Off-Topics
    • Spam Topics
  • L2Classic Club's Just trying this thing out
  • Lineage 2 Revolution Club's Discussions
  • Lineage 2 Revolution Club's Tutorials
  • Lineage 2 Revolution Club's Request Help
  • DenArt Designs's Hello and welcome to my club!
  • DenArt Designs's News

Product Groups

  • Advertisements
  • Old Vips
  • Premium Member

Find results in...

Find results that contain...

Date Created

  • Start


Last Updated

  • Start


Filter by number of...


  • Start





Website URL







  1. Hello MaxCheaters, i made the decision to show you a simple way to make a VPS as Proxy for your lineage 2 server using Lucera Files. Step 1: First you need to buy VPS in the location you need for example if you need to make Proxy in Russia you must buy VPS From Russia Federation. Step 2: Install Debian Operation System in your VPS. Step 3: Connect to your VPS with Bitvise SSH Client Add your VPS Details . Step 4: Use New Terminal Console button. Step 5: Now you have to paste in console the code bellow. (Don't forget to replace the localhost ip with the main host meaning your IP from your dedicated server that you hosting your L2 server). sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'; sudo iptables -t nat -A PREROUTING -p tcp --dport 7777 -j DNAT --to-destination; sudo iptables -t nat -A PREROUTING -p udp --dport 7777 -j DNAT --to-destination; sudo iptables -t nat -A POSTROUTING -j MASQUERADE; Step 6: Make the VPS (PROXY) IP Whitelisted in your ddos protection. Step 7: Now go to "Lucera3\authserver\config\proxyservers.xml" open it and add your proxy ip port etc. origId="Your Main Server ID" proxyId="The Server ID You Need To Use As Proxy" proxyHost="The IP From Your VPS (Proxy)" proxyPort="Game Server Port (7777)" EXAMPLE: <proxyServer origId="1" proxyId="2" proxyHost="" proxyPort="7777" />
  2. I bring you a simple guide to create / add an image at the beginning of the lobby. something like this: resolution of 3004x2152 I do not know to what extent the game can support but we are going to make a texture of 4096x4096 First of all you will need Photoshop to create the image, then some compiler for the Interface.u and xdateditor for .xdat and the unreal to save the image. First they look for their image, I will use this https://www.wallpaperbetter.com/es/hd-wallpaper-gbrse then go to Photoshop and create a new layer of 4096x4096 resolution 72, it would be approx. 60mb and within that layer we would paste the image then would have something like this: clarify that my image was 7680x4320 and with paint I made it to 3004x2152 after all that they save the image in targa format, resolution 32bits, without compressing rle. Then we go to the Unreal2Runtime, and we create a texture by importing the one we have. Then we compress the texture to DXT1 and save, then to the .utx file we have to encrypt it to the L2 121 version. we can not compress DXT1 and leave the textures as imported, go to the properties of the textures and in quality put the two options in true so that the game does not alter the quality with the ALT + P or from the config of lower detail. But when making the minimum 4096x4096 texture, they lost approx. 60mb of weight, technically it is not efficient and when compressing with DXT1 they were compressed to approx. 10mb. I clarify that the size of the image, in my case 3004x2152, is important that we know, since that will be what we will tell the client to visualize. Basically in the .xdat we will make 4096x4096 visualize our image of 3004x2152 Now we will go to our interface compiler. When we have the compiler we will have the interface folder, system, nwindow. Inside interface, in the subfolder called Classes we create a file called "LoginMenuWnd.uc" .uc will be the file format. Inside we will stick the following: class LoginMenuWnd extends UICommonAPI; function OnLoad() { RegisterState("LoginMenuWnd","LoginState"); } defaultproperties { } We go to the system folder and compile with UIScript.exe the interface.u file will be created, that is pasted in the interlude system. Then we go to xdateditor and we do the following: we select the version, interlude in this case, and then the .xdat of the system. In the search brings write something random so that you can wipe the list this is in Russian and that says create a new window "add component" then we create a new folder with the window option would have to say: null [Window] Then copy The following and with CTRL + S save the changes then we go to the search engine and we write "Login" so that single element appears, if we realize it has a sub option saying "children" They right-click it and do the following: then we copy the following configuration in null [Texture] Now comes the important thing In file we will add the path of the texture. In type we put it stretch In layout in normal In uSize and vSize they will have to put the size of the image, in my case, the 4096x4096 it would be 3004x2152 After all this we save the configuration, enter the interlude and enjoy what has come out Compiler Interface.u Download xDatEditor: Download Password EmuDev Author: @Piaro
  3. Hey, this thread is about using SpecialCamera function. It is particurarly useful if you're interested in providing a quality custom raid boss. The final result can be further enchanced with proper client editing. The function consists of 12 arguments. 1st argument: The npcthat the camera effects will work in relation to. If your npc will be moving while the camera effect is taking place, I would advise to use a dummy npc for the camera so that it works as a global coordinate system. 2nd argument: Distance from the npc. 3rd argument: Yaw angle. 4th argument: Pitch angle. 5th argument: The timeframe that the camera effect must reach its specified values (which means it affects the "acceleration" of the effect). Though I've noticed it doesn't work properly all the time. 6th argument: The radius in which it will affect the players. 7th argument: The time that the camera will be in place and thus not allowing players to do any moves. 8th argument: It's kinda responsible for horizontal translation 9th argument: Responsible for vertical translation 10th argument: Whether or not you'd like the black frames up and down shown in the image. 11th argument: It kind of mirrors the camera effect (if set to 1), the exact opposite stated effect takes place. 12th argument: Haven't figured it out. Here's a draft video of what I came up with for a specific zombie event.
  4. Hello Lineage 2 Fans! I've created a Excel file to make it easier to craft Items in L2. For now this file only has Draconic Bow craft. I want to know if it helps anyone and I should add the other S weapons or it's a total waste. 🙂 As you can see in the file, DON'T Edit the fields with RED on YELLOW color. You should only edit/write in the purple fields. In the left top corner written in green "CRAFT" you just add the number of weapons you wish to craft and it will populate the first column with the necessary materials. On the second column, upper part (base materials) just add now many materials you have from each type and next to them it will tell you how many you are missing overall. Add how many of the High materials you have in lower part. If you have more then necessary then type the exact number needed for your craft. For example: for 1 Draconic Bow you need 385 M.alloy so if you have 500, just type that you have 385 otherwise it will mess with the base materials. In the 3rd column, once you have all materials ( 2nd column shows negative numbers or 0 ) it will tell you what else you need to craft and how many materials are necessary . in the 4th column it will tell you how much the craft costs depending on the market prices. The lower part will display the High materials price depending on the basic materials price. To use this file, click the link below, and from File - > Email send it to your email or google drive. I use this directly from Google Drive and I can access anywhere. https://docs.google.com/spreadsheets/d/1WF4DmUIXb53QKDQUfUmdIUaUYNxaFT9PU3w9CoFHblc/edit?usp=sharing
  5. Hello everyone, This is will be a very short guide. FEEDBACK It does matters sometimes... However, this is a grey area. If dude A haven't scammed dude B, that doesn't mean he/she will not scam you. People are unpredictable sometimes. GET TO KNOW THEM Get to know the person you're trading with. I personally don't do business with people I know nothing about. There's probably a lower chance that a scammer will share personal information with you. Try to get as much information as possible from them - where are they from, what else are they selling, when did they start it, with who else was he/she; is he/she working with. Check for common friends or business partners/L2 servers. LEARN HOW A TRADE WORKS If you're buying L2 services and you're the buyer - 1st test what you've asked for, 2nd pay for it and 3rd get the product. If it's about trading items in L2, I'd personally push for the items first before money - in-game items are less valuable. Would be nice for the buyer to provide a proof that he/she has the money. MIDDLEMAN This is perhaps the best option to go with. Only use very trusted persons that are doing this for a long time. If you're trading items in-game - this is very easy and it needs no explanation. If you're using a middleman for L2 services, chances are the middleman will not delete the code/product he got from the seller after he trade. If you care so much about this as seller, then use a middleman which has less interest for L2 scene. Same rule apply to other services. VOICE You can try to have a voice-chat with the person you're trading with. Hearing each other is the most human thing you can do. Don't you think? RUSH Be aware! Scammers are mostly rushing, want to have it done as soon as possible. SUSPICIOUS? Is the person you wanna trade with suspicious? Abort it! There are other persons you can trade with. He/she is not the only one.
  6. Since I see people asking for this every now and then I thought I'd code it and share it. L2Proxy is a simple MITM proxy for your L2 server. It comes in two parts The Java side The L2Proxy service The Java side can be used on any pack and with any proxy configuration without needing the app. If however you don't wanna mess with proxy configuration you can also use the L2Proxy service which runs a MITM proxy for your players. It is fully cross platform and will run fine on any VPS as long as you have the network bandwidth needed. It adds some extra functionality that you might find handy. Proxies with Gameserver invisibility turned on Features Gameserver invisibility option - You are able to hide your server behind the proxies and keep your real server IP secret RealIP - Usually with MITM proxies, since the traffic is funnelled from one server, you normally lose the real IP of the player which limits a lot of the functionality that you might have implemented. L2Proxy allows the LoginServer to pass the real IP of the used to the Gameserver during the Login->Gameserver player handoff An API - You can use the API in L2Proxy to check the stats of your Proxies, see the active connections to it and even disconnect a specific use IP or blacklist it IP Blacklist - You can blacklist a specific IP its connection will be rejected on the proxy level before it ever gets to the gameserver. This includes malicious connections. You can also use the API to blacklist someone and get them instantly disconnected. Multiple Proxies from one app - No real reason for this to exist but I added it anyway Proxy health detection. If the proxy goes down the proxy listings will appear as down as well. (This feature requires the L2Proxy service). Validation can be turned off by setting the "validateHealth" option to false. Unhealthy proxy fallback. If all proxies are down and the "fallbackToGameserver" setting is set to true then even if you've chosen to hide the gameserver, it will appear as a fallback so people can still login when the proxies are down. MaxConnections on each proxy. Once the limit is met, no more connections can be made to the gameserver via the proxy. -1 means unlimited API Actions To make actions you need to set the x-api-key header to equal to the API Key setting in L2Proxy. The default is "changeit". Get all proxies - GET http://localhost:6969/api/proxies Get proxy by IP and Port - GET http://localhost:6969/api/proxies/ (IP is the proxy ip and 7778 is the proxy port) Disconnect an active connection - DELETE http://localhost:6969/api/proxies/ (First IP is the proxy IP, second ip is the client ip, first port is the proxy port and second port is a client port) Get all blacklisted IPs - GET http://localhost:6969/api/blacklist Check if IP is blacklisted - GET http://localhost:6969/api/blacklist/ (The IP is the user IP) Blacklist an IP and disconnect used - POST http://localhost:6969/api/blacklist/ (The IP is the user IP) Removed an IP from the blacklist - DELETE http://localhost:6969/api/blacklist/ (The IP is the user IP) proxy.xml <?xml version='1.0' encoding='utf-8'?> <list> <config /> <!-- serverId: The true id of the gameserver hide: When enabled, the true gameserver will not appear in the server list fallbackToGameserver: When the proxy server is down, when true, the real gameserver will appear proxyServerId: The gameserver id that the proxy will use to be listed in the server list proxyHost: The host of the proxy proxyPort: The port of the proxy apiPort: The port of the API for the proxy apiKey: The api key for the proxy api --> <gameserver serverId="1" hide="true" fallbackToGameserver="false"> <proxy proxyServerId="2" proxyHost="" proxyPort="7778" validateHealth="true" apiPort="6969" apiKey="changeit"/> <proxy proxyServerId="3" proxyHost="" proxyPort="7779" validateHealth="true" apiPort="6969" apiKey="changeit"/> </gameserver> </list> Here is a diagram explaining the initial login flow. Once you login the loginserver goes away and you connect directly to the proxies or gameserver depending on your configuration. Features I might add (don't bet on it) Max connection limit Make calls to the API to let the gameserver know the proxy status and make proxy level action Proxy service discovery to propagate proxy actions to all running proxies Automatic proxy suggestion based on proxy load You currently need to blacklist the IP on each proxy API since the data is not shared Download link and executables of latest version: https://github.com/Elfocrash/L2Proxy/releases/tag/v0.2.0 If you run the framework dependent version you need .NET 5 CLR installed. If you run the standalone versions you don't need anything preinstalled. Will upload a video of the thing at some point. It's late. Enjoy
  7. Hello there.. Here is my buffer from my old server.. (Main html made by protoftw) What's inside? Mage | Fighter set [config] Buffs/Dance/Song/Extra etc one by one Special buffs + Malaria Vote buff [If you want it, you can enable it, config] Scheme Buffer Code Preview > pastebin Code/HTML/XML > Download
  8. I decided to do a lesson, it seems there is on the Internet. And people still don't understand how to use it. I will show you on the example of the Olympiad card, cutting the pillars. To do this, you need: 1) Unreal Editor. 2) Umodel 3) 3DS MAX - MAX ACTOR. 4) L2SMR. 5) Dev.Mode l2 - optional. All of the above software is on the Internet, use Google. 1) Go to Umodel, unpack our Static Mesh pack - In this case, on the map we will cut the pillars from the pack - Refine_colosseum. Select it, click Export. 2) After unpacking, we are given a list of unpacked meshes. 3) Oh yes, I forgot, how do we know the pack? This is where the first point should have been. Launch L2SMR - Launch Map 17_10.unr and see all possible Static Mesh. After we find the one we need, we remember the name. And unpack it into Umodel. 4) After all the manipulations done, open the 3DS MAX - I have it in 2010. With plugin ActorX Importer You will find it on the Gildor Website. Click IMPORT PSK ... Select the directory where Umodel, unpacked your Mesh We open. And we get Our Mesh - Only without textures. Next In the Front window - Cut off the Pillars, Why is there? Yes, because it is more convenient to highlight them there. Well, I also deleted the squares naturally. For the dull it is here! Cut it out, save it in .ase format Set the checkboxes, like mine. In fact, we have done 50% of this shit, open up the unreal editor. Importing our Static Mesh - No matter how you call it "In My case, it will be Corasonobject." By the way, one Unreal is better placed in the root folder with Lineage II - we will open two copies, since we will have to apply textures to it. Opened our static mesh without textures, We push the second copy of the unreal into the game folder, and open it. And open the Refine_colosseum_S pack - which is original. After opening. We find it, and we begin to copy the lines with the materials, we transfer them from the original to our done one. Highlighted in red which texture pack powers our static mesh. open our sculpting, and select two texture packs there. Textures are selected from the root folder of the game and named Textures. Now, Ctrl + c - ctrl + v works. After the done work in 20 textures, we get the finished product and save it to the Static Mesh folder - the root folder of the game, which will be powered by L2SMR - to add the static mesh to the map. Open L2 SMR and map 17_10.UNR add a new static mesh. After that, it will appear at the very end of our meshes. In the meantime, we turn to the original, remember its data. by X, Y, Z - write it down in a notebook. And then naturally we take it away from the map by changing the coordinates. We go to the very end to our mesh, enter the coordinates that were on the original. Next, press the Set button. That's it, a static mesh on the map, now open dev_mode.ini (it's not clear to anyone, my ini for starting the devmode. I put the starting map 17_10.unr). Ready option. it's a long Guide maybe I made somewhere a mistake if someone notice he can correct it Thanks to Corason
  9. Hello to everyone, The idea is to have a usable and stable Classic project, and best of all: open source! Discord https://discord.com/invite/UfPf2XZ About the project: At the beginning, the project was only for testing personal implementations, basically to keep myself updated with Java due to the adopted semiannual update policy. The project has been active for about a year, with daily updates. There are 3 direct collaborators in the project, and a few more indirect ones. Today we are supporting protocol 272 and 286 (not stable yet), the current version of NA servers. REQUIREMENTS: Java 16 MySql 8 Client protocol (Classic 272 / 286 / 306 / 311) (Essence EU 306 Sylph and new Frost Lord 311) Features Open source project under GPL 3 license; Available at https://github.com/L2jOrg/L2jOrg Daily updates, Monthly Releases L2 classic kamael protocol 272 / 286 / 306 / 311 L2 Essence 306 and 311 All AI working according to classic kamael patch notes (Giant cave, ketra, varkas, TOI, limited hunting zone, LOA, DV, Alligator Island, Call Of spirits) All quests working according to classic kamael Datapack up to date to kamael classic, skills, npcs, areas L coin shop and store up to date Custom community board with buffer, donation shop and gm shop available Imperial Tomb, Elemental Bosses Ability points Retail VIP system Retail rank system Retail Revenge system Retail dimensional merchant Come and test on our test server ! Community participation is essential for the development of any project. I know that many people, even today, have a somewhat disturbed view of open source projects, so I will list some projects as a reference that an open source project can be as good or better than a private project: Java https://github.com/openjdk; MySql https://github.com/mysql; Hirakicp https://github.com/brettwooldridge/HikariCP; EhCache https://github.com/ehcache/ehcache3; Log4J https://github.com/apache/logging-log4j2; and last but not least: async-mmocore https://github.com/JoeAlisson/async-mmocore Of course there are many other relevant ones, but I restrict myself to listing projects that are used as a dependency on the L2j ORG. Client Download Client (272 protocol) Download client (286 protocol not stable yet) Releases https://github.com/L2jOrg/L2jOrg Regards,
  10. Hello, I'd like to share with you a list of the most famous programming languages and their frameworks. I hope that I will help you with your searches. I know that I miss a lot of them but you are more than to free replay above that you know and I will update the first post. Java (Documentation) Spring Framework (Documentation) Vert-X Framework (Documentation) C# (Documentation) .NET Framework (Documentation) C++ (Documentation) C (Documentation) JavaScript (Documentation) React.js (Library) (Documentation) Angular.js (Documentation) PHP (Documentation) Laravel (Documentation) Python (Documentation) CherryPy (Documentation) CubicWeb (Documentation) Dash (Documentation) Django (Documentation) Falcon (Documentation) Flask (Documentation) Kotlin (Documentation) Swift (Documentation) HTML (Documentation) CSS (Documentation) SQL (Documentation)
  11. 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 -
  12. This thread is about first stage Scarlet Van Halisha ( on foot -NPCID: 29046, class: follower_of_frintessa). Many think that the walking boss is two different NPCs, but it's actually one. It simply has two sets of animations, one set without wings on its back, and one set with wings. How the boss utilizes the different sets of animations Frst of all, we inspect lineagemonster3.int: [follower_of_frintessa] Animations ending with _1HS are the ones without wings, whereas Animations ending with _2HS have the wings sticking out. Animations with [0] index are used when the boss doesn't hold any weapon (I think). Animations with [1] index are used when the boss holds a weapon with handess =1 Animations with [2] index are used when the boss holds a weapon with handess = 2 The initial weapon that the boss is holding (slot_rhand=[follower_of_frintessa_calibur]) has 8204 ID and has indeed handess = 1 Through AI the boss changes weapon: EquipItem (@sword_of_frintessa). This weapon has 7903 ID and as expected, handess = 2. How the boss gets bigger through the transition In AI we can see the following line: AddUseSkillDesire(myself.sm, @s_frintessa_daemon_morph1, @ST_HEAL, @AMT_MOVE_TO_TARGET, 1000000); s_frintessa_daemon_morph1 has a skill ID of 5017. In mobskillanimgrp.dat we can find the following: 29046 5017 social02 a,s_frintessa_daemon_morph1\0 a,follower_of_frintessa\0 a,LineageMonster3.follower_of_frintessa\0 Studying this specific animation with l2editor, we can see that it uses the bonescale animnotify. Photo How the boss utilizes the rush/charge skill The boss normally has a forward charge skill (ID: 5015, effect: {i_fly_self;straight;pull;400} ) that consists of 3 phases: Initial animation, boss disappearance and lastly landing animation. In skillgrp.dat we can see that the animation letter that is asigned to skill 5015 is "A". This means the following: combo_begin name=[A] anim0=[CastShortAnimName] anim1=[CastEndAnimName] anim2=[MagicNoTargetAnimName] loop=1 combo_end We can observe the 3 stages that were described before. The names of these animations correspond to the animations in lineagemonster3.int, so basically: SpAtk01_2HS, AtkWait_2HS and SpAtk02_2HS. In order to make the boss disappear in the second part of the animation (AtkWait_2HS), bhidden unrealscipt variable is used in the npc's class. Here's the full class script so you can study it yourselves: [follower_of_frintessa] What about the debris falling after the raid ended? Interestingly the teleport cube is responsible for this. Here's its script:
  13. Hello MaxCheaters, today i will show you how you can work with Intellij IDEA import existing source and build ant. Download: Intellij Video Guide: Enjoy!
  14. Any one know the best way to make a trade between a potential banneable account and the target account untraceable by the admins in their logs? I assume throwing items to the ground and picking them up is still traceable? Private store too, right? Thank you!
  15. Well Hello, today i decide to create my first LineageII Guide. Well the following guide is related with Trickster Class as you read before. Well, Trickster is the archer class of Kamael race and due of her skills in most servers where tricksters aren't edited is better than an acher. Play Style: The Female Kamael Soldier has less stamina and attack power than the Male Kamael Soldier, but she has greater attack speed. As her level increases, the Female Kamael Soldier is also able to learn a skill that enables them to see and remove traps. Restrictions on soul absorption, resistance to healing magic, and armor are the same as that of the Male Kamael Soldiers. Trickster Classes: Warder > Arbalester > Trickster Dyes: Basic Status: INT 28 | STR 39 | CON 30 | MEN 27 | DEX 35 | WIT 11 As Trickster I use the following dyes: Str +4 Con -4 Areas you should exp: 1-20 > Elven Ruins 20-30 > Ruins of Despair 30-45 > Cruma Tower 47-61 > Dragon Valley 61-70 > Wall of Argos 70-80 > Hot Springs 80-85 > Monastery of Silence Weapons: Level: 40-53 Level: 53-61 Level: 61-76 Level: 76-80 Level: 80-84 Level: 84-85 Armors: Level: 20-40 Level: 40-53 Level: 53-61 Level: 61-76 Level: 76-80 Level: 80-84 You can use Dynasty Armor Leather too (If you aren't playing in Freya Server) Level: 84-85 You can use also S84 Vorpal which gives you Resistance to Paralayze attacks +50% or even Vesper Skills: Passives: Crossbow Mastery: Increases P. Atk. when using a crossbow. (Enchatable) Increase Range: Increases crossbow range. Light Armor Mastery: Increases P. Def. when wearing light armor. (Enchatable) Magic Immunity: Increase M.Def. (Enchatable) Soul Mastery: Absorbs souls. 294 or more Exp. is needed to absorb a soul. There is a 15 percent chance of absorbing an additional soul on a critical hit. Maximum of 12 souls can be absorbed. Critical Sense: Increase critical rate by 25% and critical power by 460. Actives: Curses Real Target: Temporarily decreases resistance to bow/crossbow attacks. Effect 1. (Enchtable: My suggestion: Enchant to Decrease P.Defence) Soul Shock: Attacks the enemy with 2192 power added to P.Atk. and causes fear for (x) seconds (X beacuse I have enchanted to +30 Time and I don't remember the default value (Enchatable). Imbue Dark Seed: Sow a dark seed into the body of an enemy, eating up health and eventually paralyzing the enemy when it is fully grown. Consumes 1 Dark Seed. Imbue Seed of Destruction: Plants a Seed of Destruction in the enemy's body. The seed grows inside the body, sucking up the enemy's mana, and blocks the enemy's skill use when it becomes fully grown. Consumes 1 Dark Seed. Bleeding Shot: Shoots a sharp bolt that causes the enemy to bleed. Requires a crossbow. Consumes 5 Souls and a Special Bolt. Over-hit is possible. Power 1951. (Enchatable) Binding Trap: Summon a trap to ensnare the enemy. (Enchatable) Flash Trap: Summons a trap that stuns nearby targets with a blindingly strong flash of light. (Enchtable) Slow Trap: Summon a trap that slows down nearby enemies. (Enchatable) Betrayal Mark: Stamp Mark of Betrayal on the enemy. When attacking enemy that has the mark, there is a chance that you will inflict damage to the enemy's party. Death Mark: Stigmatize target with darkness. Effect 1. (Enchatable in Soul Hounds) Actives: General Change Weapon: Changes a general weapon to a Kamael exclusive weapon. The weapon can be reverted back to a general weapon. Penetrating Shot: Fires a powerful bolt at a distant enemy. Consumes 5 souls. Over-hit is possible. Requires a crossbow. Power 194. (Enchatable) Erase Mark: Removes Death Mark Warp: Teleports you to the battlefront Dark Armor: Increase Dark Ressistance by 7 Life to Soul: Increase your soul by (X) (X beacuse its enchatable so if it will be enchated to +30 power will increase you up +21 your Soul) Soul Gathering: Increase your soul by 40 (Max) (Enchatable. My Suggestion? Recycle) Twin Shot: For me, this is one of the best skills of Trickster. Launches 2 bolts in rapid succession. Critical hit is possible. Over-hit is possible. Requires a crossbow. Power 4870. If will be enchated to Duel his power in PvP will be 7424. Create Special bolt: Creates a bolt to be used with a special skill. Decoy: Summon a mirror image that distracts the enemy. (Enchatable) Ultimate Escape: Greatly increases own Evasion rate and speed instantly. Rising Shot: Shoot a bolt that rises from the ground. Requires a crossbow. Over-hit is possible. Power 1547 (Enchatable) Fast Shot: Temporarily increases your crossbow attack speed. (Enchatable) Sharpshooting: Temporarily increases accuracy, range, P. Atk., and Critical attack rate. Requires a crossbow. Immobilized while in effect. (Enchatable) Create Dark Seed: Transform a soul into a seed of darkness. Consumes 1 Soul. Cure Dark Seed: Removes Dark Seed Deadly Roulette: The best skill of trickster class. Can be used when HP is below 10 percent. Lethal strike is possible. Requires a crossbow. Consumes 1 Special Bolt. (Enchatable) Soul Cleanse: Cancel up to 3 de-buffs. Can only be used within the same race. Prahnah: Increase M.Def by 3000. (Enchatable My Suggestion Enchant it to time since Trickster got Soul Barrier and increase M.Def by 100%) Focus Skill Mastery: Significantly increases excellent skill rate triggered by Skill Mastery. Consumes MP continuously. Hard March: Increases own speed. Consumes 1 Soul. MP continually decreases. Soul Barrier: Increase Arrow resistance and M. Def by 100% (Enchatable) Certification Skills Counter Barrier Resist Mental Counter Haste Tactics Againt Other Classes: Trickster against Mages: Trickster can easily kill Mages. 1) Open Soul Barrier and Prahnah 2) Use Real Target to decrease his P.Def Arrow Resistance 3) Use Imbue Dark Seed and Seed Of Destruction to block his skills. (Imbue Dark Seed will para him SoD will block his skills) Trickster Vs Tanks As all we know tanks can pwn easily archers beacuse of Reflect Arrow BUT! Trickster got also Real target which decrease their Resist Arrow so... 1) Open Soul Barrier in case of tank will use bow. 2) Use Real Target to decrease his P.Def and Arrow Resistance 3) Use your Dark Seed and Seed Of Destruction to paralyze him and block him. 4) Use ALWAYS warp to get away from him. 5) Spawn Traps to Stun, Paralyze and Slow him and also spawn Decoy so it will lose his target. 6) Use always the tactic Run N' Hit 7) Also use Ultimate Escape to increase your speed & Evasion Trickster Vs Daggers Due of high Dagger evasion Archer classes can die easily BUT thats why trickster got Ultimate Escape & Real Target. 1) Open Ultimate Escape to increase your evasion so attacks will fail. 2) Open Sharpshooting to increase your acuracy, p.attack. I know that Sharpshooting won't allow you to move but against daggers is useless to running. 3) Spawn Decoy to remove his target 4) Use your Seeds to Paralyze & block his skills. And Also use traps. 5) Use always Real Target to decrease their high evasion and their P.Def Trickster Vs Archers Archers and mage are the most easy enemies for trickster. 1) Use Real Target to decrease his P.Def and Evasion 2) Use Soul Barrier to increase your Arrow Resistance. 3) When Soul Barrier will end his duration and the archer will stop your cast when you are going to re-use it then open Ultimate Escape to increase your Evasion. 4) If Archer uses Snipe then open sharpshooting. Your range will increase and all of your stats so you can pwn him. Thats all about Tricksters. I hope i helped many of you with my guide. Credits to me! Regards, BonJovi®
  16. here is a batch file that checks ur ping (ms) towards LoL EUNE Gameserver/ www.mediafire.com/file/4wne81jgy4gyz4j/LoL_Ping_Check.bat PS: to check the code just right click and edit Dont know if its shared again
  17. Contents: Introduction Downloads Security Scrapping Cracking Checking Gifting Q and A Dumps Introduction: Hello people , since the i shared some cracked accounts , too many people were asking about a tutorial on to how crack some accounts on their own. This tutorial has everything you need , but if you still got more questions just send me a pm. Downloads: All in One (Mega | Mediafire) LoL Scrapper (Mega | Mediafire) LoL Cracker (Mega | Mediafire) LoL Checker (Here) Open Vpn (Official | Mega | Mediafire) Security: I am recommending Open Vpn because how fast and effective it is. Just make yourself an account and don't forget to press the connect button. Well you could always use your own vpn server or any other program. File included on download section with the official download link. Before you login to any of cracked accounts, make sure to use the Vpn. Scrapping: This is the process where you get yourself some good 50K fresh combos! First open league scrapper select a server. Now for the start point you will have to open your league client and find match history. Click one of the game and copy any enemy summoner name and paste it on the application. Let it run, when the process status = finished, press save. Now you can locate all the combo on the application root folder under the server you selected. It will divide the combo in 3-4 files. Cracking: Open the LoL cracker and select your server, press the proxy tab and grab some proxy. Now after you are done grabbing proxy, set the thread value of your choice. The higher you set it, faster it gets. If you have a shitty computer or internet, use 300-500. If you have good one you could go 600-1000. There's a option "More Lvl 30" will get you more level 30 accounts. Press start with your own combo, then find the file you scrapped with scrapper. There should be more than 2 files, so you could combine them or crack twice etc. Keep it running and it should give you some result which will be saved on root file of this program named "accounts". Checking: Open up the program named checker and press accounts - > import -> Find the "accounts" from LoL cracker folder. Select your server and keep it running. In no time, it should send ya some values. If you are trying to gift RP to your main account and you didn't find any accounts with good RP. Don't worry, there's more to it. If you see accounts with more than 8-9 skins, login and check if you could refund anything. If so, refund RP and add him to your friend list. Now if you don't have refund and man has some skins, just check for RP purchase history. If any transaction made with Cards, try buying RP from the store using the card method. If you are lucky you will find a credit/debit saved. Use that to buy whatever the shit you want. Gifting: Now you found the account and added them, you can wait 24 hours to send champs/skins/icon or you could play a bot game and get a skin/mystery skin right away. Make sure to always use proxy/vpn before you do so. No you can't send Gift to NA from EUW stfu. Q and A: Dumps: Format: username:pass NA (One - Two) EUW (One - Two) EUNE (One - Two) As i mentioned above, for any more questions send me a pm. I am not cracking accounts at the moment so stop asking for them. Hope this guide helped you. Full credits for the guide goes to: Maximum5
  18. I share this guide with you to be able to use the Smart Crypt Decrypt code that is used to decrypt the client's files (utx, ukx and u).The programs that you will need is Microsoft Visual Studio (in my case I will use the 2013 version, you can use other versions) and CFF Explorer.Microsoft Visual Studio 2013: https://www.youtube.com/watch?v=VWYLqKtAXzUCFF Explorer: https://ntcore.com/?page_id=388 Smart Crypt Decryptor Code: https://pastebin.com/ShgmywrsOnce they have these programs installed, let's continue.First of all we open the Microsoft Visual Studio and let's FILE> New> Project or in another faster way Ctrl + Shift + N It will show us the following We select Visual C ++ thenWin32 Console Application and we end withOK the name is put or not, the only thing it will do is give a name to the solution, that is, if you put "juanito" when compiling the DLL it will have a name of "juanito.dll" Then another window does not appear we give Next we select DLL and we mark Empty project and Finish It should show us the following: We right click on Header Files> Add> New item ...Another window appears, with two optionsC ++ File (.cpp) and Header File (.h) select C ++ File and then OK] in this case the name is also optional to add, we are not creating a NASA program to worry about references and / or names.We copy the code that you leave above https://pastebin.com/Shgmywrs and save it (it is also optional, I usually do it)Once done, with Ctrl + Shift + B we compile the projectWe should get the following message========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========That says everything went well.We go to where the projects are saved by default, in my case:c: \ users \ user \ documents \ visual studio 2013 \ Projectsinside a folder was created with the default name or the one that we add in my case is ConsoleApplication1 we go inside and then to the Debug folder and our DLL ConsoleApplication1.dll should be We copy and paste it into the system and we are done with this.Then we go to l2.exe(before we make a copy of the exe) right click, and if they installed the CFF Explorer, Open With CFF Explorer should appear and if not, they go to the program and open it from there.They go to the Import Adder part then Add and we look for the dll that we create and copy into the system. Once the DLL has been added, the following appears: We select _DllMain @ 12 >> Import By Name and then Rebuild Import Table . There is no sign saying Import Table correctly rebuilt. and we finish saving the l2.exe with the changes made. Then it is only to open the L2 and within the system "Interface.decrypted.u" will be createdfor you. To be able to decrypt other files (ukx or utx) you will have to change something in the code and it is the following appLoadFileToArray(TArray, L"..\\System\\Interface.u", *((int *)GetProcAddress(GetModuleHandleA("Core.dll"), "?GFileManager@@3PAVFFileManager@@A"))); appSaveArrayToFile(TArray, L"..\\System\\Interface.decrypted.u", *((int *)GetProcAddress(GetModuleHandleA("Core.dll"), "?GFileManager@@3PAVFFileManager@@A"))); for example, if you want to decrypt a texture, copy the .utx into the system, changing the extension to .u (I think it's not necessary, but never try) and in the code change the following: appLoadFileToArray(TArray, L"..\\System\\Textura_que_quiero_desencryptar.u", *((int *)GetProcAddress(GetModuleHandleA("Core.dll"), "?GFileManager@@3PAVFFileManager@@A"))); [background=#2a2e31]appSaveArrayToFile(TArray, L"..\\System\\Textura_que_quiero_desencryptar.decrypted.u", *((int *)GetProcAddress(GetModuleHandleA("Core.dll"), "?GFileManager@@3PAVFFileManager@@A"))); compile the dll again and copy it into the system and voila, open l2 and create the Texture_que_want_desencryptar.decrypted.u then with the umodel you can extract the textures. Decryptor for * u files encrypted by Smart Crypt of early revisions.By default, for Interface.u, however, using the source below and the C / C ++ compiler,you can use this method for other files as well. Place decrypt files in the System folder Place encrypted files in the System folder ( interface.u ) Run L2.exe Now there are decrypted files in the System folder ( Interface.decrypted.u ) Our portal is not the developer of this program and does not provide advice on its work. Source is in the public domain and provided below. Smart Crypt Decrypt code: #include <windows.h> void DumpFile() { typedef void (__cdecl *f_appLoadFileToArray)(char *, wchar_t *, int); typedef void (__cdecl *f_appSaveArrayToFile)(char *, wchar_t *, int); f_appLoadFileToArray appLoadFileToArray = (f_appLoadFileToArray)GetProcAddress(GetModuleHandleA("Core.dll"), "?appLoadFileToArray@@YAHAAV?$TArray@E@@PBGPAVFFileManager@@@Z"); f_appSaveArrayToFile appSaveArrayToFile = (f_appSaveArrayToFile)GetProcAddress(GetModuleHandleA("Core.dll"), "?appSaveArrayToFile@@YAHABV?$TArray@E@@PBGPAVFFileManager@@@Z"); char TArray[0x14]; memset(TArray,0,0x14); appLoadFileToArray(TArray, L"..\\System\\Interface.u", *((int *)GetProcAddress(GetModuleHandleA("Core.dll"), "?GFileManager@@3PAVFFileManager@@A"))); appSaveArrayToFile(TArray, L"..\\System\\Interface.decrypted.u", *((int *)GetProcAddress(GetModuleHandleA("Core.dll"), "?GFileManager@@3PAVFFileManager@@A"))); } bool dumped = false; void StartCheck() { // wait until WinDrv is loaded just so we know everything we need is initialized correctly if (GetModuleHandleA("WinDrv.dll") != NULL) { if (!dumped) { DumpFile(); dumped = true; } } } __declspec(dllexport) BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: StartCheck(); case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } Downloads: https://drive.google.com/file/d/12Ea_0L7GuZEXeXtBalzJG72GgDrXTn44/view Password: [Hidden Content]
  19. this guide will go over how to create costumes for interlude and provide the resources necessary to do so [Hidden Content]
  20. People, I do this post to share details of how to start a l2off server, it is useful for any chronicle there are very few differences. In this case I am going to show how to build an OFF / PTS Interlude server (Extend Vanganth Crack for me). Pack Interlude: L2DandiarenaPackIL.zip Update Files Extender Crack - DandiaExt 1.2Video Extender: https://www.youtube.com/watch?v=krP80CIatAYVideo Create server: https://www.youtube.com/watch?v=F8knW9yh_6YWEB: http://l2dandiarena.com/FANPAGE: https://www.facebook.com/l2dandiarenaGRUPO DISCORD: https://discord.gg/Jh4KvAMb3m If need help in ENG, chat me. sorry.
  21. Hello there.. Here is my Epic Boss Manager from my old server. Nothing special, but some of you may need it. What's inside? Works only with retail Grandbosses. [No retail zaken id] Inform you about the status of Grandboss. Inform you about respawn time. Date/Time. Enable/Disable it on configs. # Announce Grandboss status. # Ex: If status for Antharas/Valakas/Frintezza change to 2 player get announce: # Grandboss>name is engaged in battle. # If status changed to 3: Grandbossname has been killed. Type .epic for details! # For Baium if status change to 1 - Baium is awake and fighting. # All Grandboses respawned - Grandbossname is spawned in the world! AnnounceGrandBossStatus = True Pastebin
  22. Follows UEngine::Exec decompiled function from Engine.dll i posted here all available builder's client commands. Maybe it will useful for someone. ///flush ///stat [anim|default|reset|fps|render|hardware|game|histograph|xboxmem|matinee|audio|net|packetcount|expacketcount|all|none|console|l2|mem|thread|script|scriptr] ///crackurl ///packetcountstart ///packetcountstop ///expacketcountstart ///expacketcountstop ///reload ///replaysave [start|end] ///replayload [replay name, e.g. Rep00000] ///buildlevel ///releaselevel ///fakeitem Raw (C language) function for the most curious: int __userpurge UEngine::Exec@<eax>(UEngine *this@<ecx>, double a2@<st0>, const wchar_t *a3, struct FOutputDevice *a4) { UEngine *v4; // esi struct FOutputDevice *v5; // edi int v6; // ecx int v7; // eax int v8; // ecx int result; // eax BOOL v10; // eax int v11; // ecx _DWORD *v12; // esi _DWORD *v13; // eax int v14; // eax int v15; // eax int i; // ebx int v17; // eax int v18; // eax void *v19; // eax int v20; // eax int v21; // ecx int v22; // ecx int v23; // ecx int v24; // ecx int v25; // esi int v26; // eax int *v27; // esi int v28; // edx FL2ReplayManager *v29; // ecx int v30; // eax int v31; // eax int v32; // [esp-Ch] [ebp-A8h] int v33; // [esp-8h] [ebp-A4h] int *v34; // [esp-4h] [ebp-A0h] int v35; // [esp+0h] [ebp-9Ch] int v36; // [esp+Ch] [ebp-90h] int v37; // [esp+18h] [ebp-84h] int v38; // [esp+24h] [ebp-78h] int v39; // [esp+28h] [ebp-74h] int v40; // [esp+34h] [ebp-68h] int v41; // [esp+38h] [ebp-64h] int v42; // [esp+40h] [ebp-5Ch] int v43; // [esp+4Ch] [ebp-50h] int v44; // [esp+50h] [ebp-4Ch] char v45; // [esp+68h] [ebp-34h] int v46; // [esp+74h] [ebp-28h] char v47; // [esp+78h] [ebp-24h] int v48; // [esp+7Ch] [ebp-20h] int v49; // [esp+88h] [ebp-14h] int *v50; // [esp+8Ch] [ebp-10h] int v51; // [esp+98h] [ebp-4h] v50 = &v35; v4 = this; v51 = 0; v5 = a4; if ( *(_DWORD *)GSys && (**(int (__stdcall ***)(const wchar_t *, struct FOutputDevice *))(*(_DWORD *)GSys + 52))(a3, a4) ) { return 1; } if ( UObject::StaticExec(a3, v5) || FMemCache::Exec(&GCache, a3, v5) || *(_DWORD *)GExec && (***(int (__stdcall ****)(const wchar_t *, struct FOutputDevice *))GExec)(a3, v5) ) { return 1; } v6 = *((_DWORD *)v4 + 9); if ( v6 ) { if ( (*(int (__stdcall **)(const wchar_t *, struct FOutputDevice *))(*(_DWORD *)v6 + 136))(a3, v5) ) return 1; } v7 = *((_DWORD *)v4 + 10); if ( v7 ) { if ( (**(int (__stdcall ***)(const wchar_t *, struct FOutputDevice *))(v7 + 52))(a3, v5) ) return 1; } if ( dword_2077ED44 && sub_20414540((int)a3) ) return 1; v8 = *((_DWORD *)v4 + 15); if ( v8 ) { if ( (*(int (__stdcall **)(const wchar_t *))(*(_DWORD *)v8 + 1588))(a3) ) return 1; } if ( ParseCommand(&a3, L"FLUSH") ) { (*(void (__stdcall **)(signed int))(*((_DWORD *)v4 - 13) + 120))(1); FOutputDevice::Log(v5, L"Flushed engine caches"); return 1; } if ( ParseCommand(&a3, L"STAT") ) { if ( ParseCommand(&a3, L"ANIM") ) { *((_DWORD *)v4 + 24) = *((_DWORD *)v4 + 24) == 0; return 1; } if ( ParseCommand(&a3, L"DEFAULT") || ParseCommand(&a3, L"RESET") ) { *((_DWORD *)v4 + 24) = 0; *((_DWORD *)v4 + 20) = 0; *((_DWORD *)v4 + 21) = 0; *((_DWORD *)v4 + 27) = 0; *((_DWORD *)v4 + 22) = 0; *((_DWORD *)v4 + 28) = 0; *((_DWORD *)v4 + 23) = 0; *((_DWORD *)v4 + 25) = 0; *((_DWORD *)v4 + 30) = 0; *((_DWORD *)v4 + 31) = 0; *((_DWORD *)v4 + 32) = 0; *((_DWORD *)v4 + 33) = 0; *((_DWORD *)v4 + 34) = 0; *((_DWORD *)v4 + 35) = 0; *((_DWORD *)v4 + 36) = 0; return 1; } if ( ParseCommand(&a3, L"FPS") ) { *((_DWORD *)v4 + 19) = *((_DWORD *)v4 + 19) == 0; return 1; } if ( ParseCommand(&a3, L"RENDER") ) { *((_DWORD *)v4 + 20) = *((_DWORD *)v4 + 20) == 0; return 1; } if ( ParseCommand(&a3, L"HARDWARE") ) { *((_DWORD *)v4 + 21) = *((_DWORD *)v4 + 21) == 0; return 1; } if ( ParseCommand(&a3, L"GAME") ) { *((_DWORD *)v4 + 22) = *((_DWORD *)v4 + 22) == 0; return 1; } if ( ParseCommand(&a3, L"HISTOGRAPH") ) { *((_DWORD *)v4 + 25) = *((_DWORD *)v4 + 25) == 0; return 1; } if ( ParseCommand(&a3, L"XBOXMEM") ) { *((_DWORD *)v4 + 26) = *((_DWORD *)v4 + 26) == 0; return 1; } if ( ParseCommand(&a3, L"MATINEE") ) { *((_DWORD *)v4 + 27) = *((_DWORD *)v4 + 27) == 0; return 1; } if ( ParseCommand(&a3, L"AUDIO") ) { *((_DWORD *)v4 + 28) = *((_DWORD *)v4 + 28) == 0; return 1; } if ( ParseCommand(&a3, L"NET") ) { *((_DWORD *)v4 + 23) = *((_DWORD *)v4 + 23) == 0; return 1; } if ( ParseCommand(&a3, L"PACKETCOUNT") ) { *((_DWORD *)v4 + 32) = *((_DWORD *)v4 + 32) == 0; return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNT") ) { *((_DWORD *)v4 + 33) = *((_DWORD *)v4 + 33) == 0; return 1; } if ( ParseCommand(&a3, L"ALL") ) { result = 1; *((_DWORD *)v4 + 19) = 1; *((_DWORD *)v4 + 20) = 1; *((_DWORD *)v4 + 21) = 1; *((_DWORD *)v4 + 27) = 1; *((_DWORD *)v4 + 22) = 1; *((_DWORD *)v4 + 28) = 1; *((_DWORD *)v4 + 23) = 1; *((_DWORD *)v4 + 30) = 1; *((_DWORD *)v4 + 31) = 1; *((_DWORD *)v4 + 34) = 1; *((_DWORD *)v4 + 35) = 1; return result; } if ( ParseCommand(&a3, L"NONE") ) { v10 = 0; *((_DWORD *)v4 + 24) = 0; *((_DWORD *)v4 + 19) = 0; *((_DWORD *)v4 + 20) = 0; *((_DWORD *)v4 + 21) = 0; *((_DWORD *)v4 + 27) = 0; *((_DWORD *)v4 + 22) = 0; *((_DWORD *)v4 + 28) = 0; *((_DWORD *)v4 + 23) = 0; *((_DWORD *)v4 + 30) = 0; *((_DWORD *)v4 + 31) = 0; *((_DWORD *)v4 + 32) = 0; *((_DWORD *)v4 + 33) = 0; *((_DWORD *)v4 + 34) = 0; LABEL_48: *((_DWORD *)v4 + 35) = v10; return 1; } if ( ParseCommand(&a3, L"CONSOLE") ) { *((_DWORD *)v4 + 49) = *((_DWORD *)v4 + 49) == 0; return 1; } if ( ParseCommand(&a3, L"L2") ) { *((_DWORD *)v4 + 30) = *((_DWORD *)v4 + 30) == 0; return 1; } if ( ParseCommand(&a3, L"MEM") ) { *((_DWORD *)v4 + 31) = *((_DWORD *)v4 + 31) == 0; return 1; } if ( ParseCommand(&a3, L"Thread") ) { *((_DWORD *)v4 + 34) = *((_DWORD *)v4 + 34) == 0; return 1; } if ( ParseCommand(&a3, L"Script") ) { v10 = *((_DWORD *)v4 + 35) == 0; goto LABEL_48; } if ( ParseCommand(&a3, L"ScriptR") ) { sub_200DE330(&v45); LOBYTE(v51) = 1; sub_200DE3C0(v11, (int *)&v47); v12 = UObject::GObjObjects; while ( v48 < v12[1] ) { v13 = *(_DWORD **)(*v12 + 4 * v48); if ( v13 ) { v13[40] = 0; v13[41] = 0; v13[42] = 0; v13[43] = 0; v12 = UObject::GObjObjects; } sub_20005C90(0, (int *)&v47); } LOBYTE(v51) = 0; sub_200DE370((int)&v45); return 1; } } else { if ( ParseCommand(&a3, L"CRACKURL") ) { FURL::FURL((FURL *)&v36, 0, (int)a3, 0); LOBYTE(v51) = 2; if ( v43 ) { v14 = FString::operator*(&v36); FOutputDevice::Logf(v5, (const char *)L" Protocol: %s", v14); v15 = FString::operator*(&v37); FOutputDevice::Logf(v5, (const char *)L" Host: %s", v15); FOutputDevice::Logf(v5, (const char *)L" Port: %i", v38); v34 = (int *)FString::operator*(&v39); FOutputDevice::Logf(v5, (const char *)L" Map: %s", v34); FOutputDevice::Logf(v5, (const char *)L" NumOptions: %i", v41); for ( i = 0; ; ++i ) { v49 = i; if ( i >= v41 ) break; v17 = FString::operator*(v40 + 12 * i); FOutputDevice::Logf(v5, (const char *)L" Option %i: %s", i, v17); } v18 = FString::operator*(&v42); FOutputDevice::Logf(v5, (const char *)L" Portal: %s", v18); v19 = FURL::String(&v36, &v45, 0); LOBYTE(v51) = 3; v20 = FString::operator*(v19); FOutputDevice::Logf(v5, (const char *)L" String: '%s'", v20); LOBYTE(v51) = 2; FString::~FString(&v45); LOBYTE(v51) = 0; FURL::~FURL((FURL *)&v36); } else { FOutputDevice::Logf(v5, L"BAD URL"); LOBYTE(v51) = 0; FURL::~FURL((FURL *)&v36); } return 1; } if ( ParseCommand(&a3, L"PACKETCOUNTSTART") ) { v21 = *((_DWORD *)v4 + 13); if ( v21 ) { (*(void (**)(void))(*(_DWORD *)v21 + 116))(); *((_DWORD *)v4 + 32) = 1; } return 1; } if ( ParseCommand(&a3, L"PACKETCOUNTSTOP") ) { v22 = *((_DWORD *)v4 + 13); if ( v22 ) { (*(void (**)(void))(*(_DWORD *)v22 + 120))(); *((_DWORD *)v4 + 32) = 0; } return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNTSTART") ) { v23 = *((_DWORD *)v4 + 13); if ( v23 ) { (*(void (**)(void))(*(_DWORD *)v23 + 124))(); *((_DWORD *)v4 + 33) = 1; } return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNTSTOP") ) { v24 = *((_DWORD *)v4 + 13); if ( v24 ) { (*(void (**)(void))(*(_DWORD *)v24 + 128))(); *((_DWORD *)v4 + 33) = 0; } return 1; } if ( ParseCommand(&a3, L"RELOAD") ) { v25 = *((_DWORD *)v4 + 13); if ( v25 ) (*(void (__thiscall **)(int))(*(_DWORD *)v25 + 1180))(v25); return 1; } if ( ParseCommand(&a3, L"REPLAYSAVE") ) { if ( *((_DWORD *)v4 + 13) && *((_DWORD *)v4 + 92) ) { if ( ParseCommand(&a3, L"START") ) { if ( !*(_DWORD *)(*((_DWORD *)v4 + 92) + 23904) ) { FString::FString(&v46); LOBYTE(v51) = 4; v26 = ParseToken(&v45, &a3, 0); LOBYTE(v51) = 5; FString::operator=(&v46, v26); LOBYTE(v51) = 4; FString::~FString(&v45); *(_DWORD *)(*((_DWORD *)v4 + 92) + 24020) = 0; a4 = (struct FOutputDevice *)&v32; FString::FString(&v32, &v46); LOBYTE(v51) = 4; FL2ReplayManager::PrepareSave(*((_DWORD **)v4 + 92), v32, v33, (int)v34); L2ParamStack::L2ParamStack(&v44, 10); LOBYTE(v51) = 7; L2ParamStack::PushBack(&v44, L"reload", (signed int)L"reload" >> 31); v27 = (int *)*((_DWORD *)v4 + 13); v28 = *v27; v34 = &v44; (*(void (__thiscall **)(int *, int *))(v28 + 688))(v27, &v44); LOBYTE(v51) = 4; L2ParamStack::~L2ParamStack(&v44); LOBYTE(v51) = 0; FString::~FString(&v46); return 1; } } else if ( ParseCommand(&a3, L"END") ) { v29 = (FL2ReplayManager *)*((_DWORD *)v4 + 92); if ( *((_DWORD *)v29 + 5976) == 2 ) { FL2ReplayManager::Save(v29, (int)ParseCommand, a2); FL2ReplayManager::Clear(*((FL2ReplayManager **)v4 + 92), -1); result = 1; *(_DWORD *)(*((_DWORD *)v4 + 92) + 24020) = 1; return result; } } } } else if ( ParseCommand(&a3, L"REPLAYLOAD") ) { if ( *((_DWORD *)v4 + 13) ) { v30 = *((_DWORD *)v4 + 92); if ( v30 ) { if ( !*(_DWORD *)(v30 + 23904) ) { FString::FString(&v46); LOBYTE(v51) = 8; v31 = ParseToken(&v45, &a3, 0); LOBYTE(v51) = 9; FString::operator=(&v46, v31); LOBYTE(v51) = 8; FString::~FString(&v45); if ( FL2ReplayManager::SetSceneName(*((FL2ReplayManager **)v4 + 92), (const struct FString *)&v46) ) { FL2ReplayManager::SetState(*((FL2ReplayManager **)v4 + 92), 3); LOBYTE(v51) = 0; FString::~FString(&v46); return 1; } LOBYTE(v51) = 0; FString::~FString(&v46); } } } } else { if ( ParseCommand(&a3, L"BuildLevel") || ParseCommand(&a3, L"ReleaseLevel") ) { v34 = (int *)9; debugf(L"L2 Release Level = %d"); return 1; } if ( ParseCommand(&a3, L"FAKEITEM") ) { *(_DWORD *)GL2CheckFakeItem = *(_DWORD *)GL2CheckFakeItem == 0; return 1; } } } return 0; } This is the small list of client commands. The full list you can find inside UInput::Exec function. https://pastebin.com/Uu1ayPW3 P.S. Some funny commands: ///bighead - enable big head for self; ///firecracker - make a firework for target; ///observer [on|off] - show hide the player texture and names.
  23. this guide will go over how to adapt effects and skills from higher chronicles and import them through interlude - static meshes will only work if they are saved using postal editor - save static meshes (.usx) in static mesh, not animation. i only do that because my l2 loads it from my folder which is in animations - EditPackages is the list of 'packages' that ucc will read/save - you need to use this unreal (not postal, second link) i posted to compile nSkillProjectile - name of your new effect file should be the same amount of characters as the original (L I N E A G E E F F E C T), which is 13 - 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 Normal Unreal (for sounds textures etc) Hex Workshop l2 encdec l2decrypt UTPT UMODEL ActorX Unpacked Effect Scripts (skill usk and helios effect) L2PE ASE Export Properties UCC Compile Script @echo ucc.exe make pause L2EncDec script l2encdec -e 121 testsound.uax Sample Files if you get this problem try and delete EditPackages=UnrealEd EditPackages=IpDrv EditPackages=UWeb EditPackages=GamePlay EditPackages=GUI EditPackages=Runtime EditPackages=RTInterface
  24. 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
  25. Basics: <html><body>Content of the page</body></html> It is not required to add <html><body> tags. - NoScrollBar (Not available in INTERLUDE) Default: No Scroll Bar: <html noscrollbar> - IMGSRC <html imgsrc="l2ui_ch3.tutorial_img10"> - Title <title>Text</text> - BR Text Line 1<br1> Text Line 2<br> Text Line 3 Changing Text - You can change the color <font color="882323">Red Text</font> Number 882323 is Html Color Code, you can use this web to get them: http://html-color-codes.info/ - You can change the font (Not available in INTERLUDE) <font name="hs16">Big Text</font> List of all possible fonts in H5: - You can change both <font name="__SystemEditBoxFont" color="666666">Text</font> Buttons and Action: - Normal Bypass <a action="bypass -h npc_%objectId%_Chat 1">Normal</a> <font color="b31a1a"><a action="bypass -h npc_%objectId%_Chat 1">Colored</a></font> - Bypass to Website (Not available in INTERLUDE) <a action="url !2265">Go to Web</a> Note: 2265 is Id in sysstring-e.dat containing Web Page that will open. Just Ids 2265, 2266 and 2267 are available - Buttons <button value="Button Name" action="bypass -h npc_%objectId%_Chat 1" width=100 height=30 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"> fore - Image of the button that shows up when mouse cursor is away back - Image that shows when player clicks on the button What about image that shows when cursor is on image, but it's not clicked? Game Client is taking content of fore and adds "_over" at the end. For example "L2UI_CT1.Button_DF_Over". It's NOT possible to change that path. Adding "over="blabla"" will not work. - Action Prefix There are 3 types of prefixes for action="" tag: 1. "Bypass -h" - Use it in Npc Window(it closes page upon click). It can also be used in Community Board, but NOT IN INTERLUDE! 2. "Bypass" - Use it in Npc Window or Community Board 3. "link" - Use it in Tutorial Window Setting bypass/link in action will trigger RequestBypassToServer or RequestTutorialLinkHtml packet upon click. Simple Image: <img src="L2UI_CH3.map_Moon" width=32 height=32> Tables <table width=300> <tr> <td width=100> Text 1 </td> <td width=100> Text 2 </td> <td width=100> Text 3 </td> </tr> <tr> <td width=100> Text 4 </td> <td width=100> Text 5 </td> <td width=100> Text 6 </td> </tr> </table> <tr> - New Line <td> - New Column - Sizes Width Fixwidth - Simple text will not resize the table in width Height - Bgcolor (Only following colors are available in INTERLUDE: 000000, ffffff, ff0000, ff00ff, ffff00, 00ff00, 00ffff, 0000ff) <table bgcolor=b31a1a> <tr> <td> Some text </td> </tr> </table> Value of bgcolor is HTML color code, you can get them from Gimp, Photoshop or this web: https://html-color-codes.info/ - Background (Not available in INTERLUDE) <table cellspacing=0 cellpadding=0 background="icon.skill0226"> <tr> <td> <button value="" action="bypass -h npc_%objectId%_Chat 1" width=34 height=34 back="L2UI_CH3.menu_outline_Down" fore="L2UI_CH3.menu_outline"> </td> </tr> </table> Value of Background is image from Game Client UTX or U files. You can also use Server Side image if you have PledgeCrest addon. - Align <td width=100 align=right> Text 1 </td> <td width=100 align=left> Text 2 </td> <td width=100> <center> Text 3 </center> </td> - Cellspacing(it is set to "2" by default) <table cellspacing=10 bgcolor=ffffff>