Jump to content

[Guide]Creating fireballs and explosions


Coolis®

Recommended Posts

image_final.jpg

 

In this tutorial, you’ll learn how to transform a fairly typical road-trip image – with a big blue sky and wide-open spaces – into an apocalyptic battle scene, complete with tanks, guns, parachutists and a hail of incoming missiles.

 

Of course, changing the colour of the sky and pasting in tanks and other elements is the easy bit: things get trickier when it comes to creating the smoke and explosions.

 

Here, Fabio Sasso shows you how to create custom brushes that recreate smoke and fireballs convincingly. You can use a background image of your own, or if you want to use the same image as Fabio, you can buy it from http://www.istockphoto.com/file_closeup.php?id= 000004942141. You’ll also need images of tanks, guns and parachutists.

 

Step_1.jpg

 

Step_1_1.jpg

 

01. In Photoshop, open your landscape image. Search for images of guns and tanks similar to those I’ve used here, and place them onto new layers. Duplicate the tank layer and make the new one smaller, as though they’re in formation. Next, change the saturation of the road image: go to Image > Adjustments > Hue/Saturation, use -40 for the Saturation. Now go to the gun layer and again select Image > Adjustments > Hue/ Saturation. This time use: Hue 35, Saturation 25, Lightness: 0, and select Colorize.

 

Step%202.jpg

 

02. For the smoke we will create two brushes. Start by creating a new layer, with a white background and a black foreground. Then go to Filter > Render > Clouds. Then with the Lasso Tool (L), use a Feather of 40 pixels and create a marquee selection then select Edit > Define Brush Preset. Name it ‘Smoke 1’

 

step3.jpg

 

03. Select the Brush Tool (B) and go to the Brush Engine (Window > Brushes). Select the ‘Smoke 1’ brush, and activate the following settings: for Brush Tip Shape, select 25% Spacing. For Shape Dynamics use 100% for the Size Jitter, 75% for the Minimum Diameter, and select Flip X Jitter and Flip Y Jitter. For Scattering, use 135% for the Scatter and select Both Axis, use 10 for the Counter and 60% for the Counter Jitter. Select Color Dynamics and use 92% for the Foreground/Background Jitter, then 50% for the Hue, Saturation, and Brightness Jitter. For Purity use 100%. Finally, select Other Dynamics and use 20% for the Opacity Jitter.

 

Step%204.jpg

 

04. Create a smoke column with the new brush, using a 50% grey for the foreground and black for the background colours. Then select Layer > Layer Styles > Inner Shadow. Use Color Burn for the Blend Mode, 30% Opacity, 50 pixels distance, 0 Choke, Size 10 pixels. Next, select Gradient Overlay, use Color Dodge for the Blend Mode, 100% Opacity and Style Radial. For the colours, use black and a brown (R: 188, G: 135, B: 8). Move the gradient to the bottom of the column to create the fireball effect. Finally, go to Filter > Blur > Motion Blur, use 90º Angle and 30 pixels distance

 

Step%205.jpg

 

05. Rotate the column to make it fall at a 30º angle. Then create more fireballs by repeating the previous step. Use different brush sizes and blurs.

 

Step%206.jpg

 

06. Create the second brush, which we’ll use for bigger plumes of smoke. To do this, repeat the steps we use to create the first brush, however when you use the Lasso tool, use a Feather of 100 pixels instead of 40 pixels, and make a different marquee selection. Name it ‘Smoke 2’.

 

step%207.jpg

 

07. To create the dense smoke, select the ‘Smoke 2’ brush with 50% grey and black colours. Start painting at a very small size, then start increasing the brush size as you move upwards. Reduce the size again to add more details to the smoke. To make it darker, add a Color Overlay with the Layer Styles. You can use black with Normal Blend mode. Create two black columns of smoke.

 

step%208.jpg

 

08. For explosions and fires, we will use two layers. For the first, use the ‘Smoke 1’ brush at 200 pixels for the size and create a small cloud in front of the fireball. Then select Layer > Layer Styles > Select Gradient Overlay. Use Color Dodge for the Blend Mode, 100% Opacity, Style Radial and for the colours use yellow (R: 255, G: 192, B: 0) and brown (R: 127, G: 92, B: 23).

 

Step%209.jpg

 

09. On the second layer, use the same brush but at a smaller size (roughly 50 pixels). For the Layer Styles, change the colours to White and a dark brown (R: 61, G: 37, B: 17). Repeat this several times to create the explosions.

 

Step%2010.jpg

 

10. Add more smoke plumes and dust using the same process but changing the Layer Styles. For the smoke, select the Color Overlay, with the Blend Mode Normal set to normal. Create some sand around the tanks using a sand colour. With the Elliptical Marquee Tool (M) create an ellipse, and using the ‘Smoke 1’ brush, create the wave of air surrounding the explosion on the ground.

 

Step%2011.jpg

 

11. Search for an image of parachutists, and place it. Use Multiply for the Blend mode, and create a new layer. Then select the Smoke 2 brush and with the Brush Tool (B), create another column of smoke, repeating the steps we use to create the other dark columns of the air. This time, however, use purple for the colour, set the Blend Mode to Screen on the Color Overlay settings.

 

Step%2012.jpg

 

12. Create a layer on top of the others, select the ‘Smoke 2’ brush at a very big size, use a light grey for the colour and paint some smoke in. Change the layer’s Blend Mode to Linear Light. Then add a new layer and in front of the previous one and paint a few more plumes of smoke. This time set the Blend Mode to Screen. Adding some smoke in front of the machine gun will give an extra touch of realism to the scene.

 

Step%2013.jpg

 

13. Now adjust the image. Go to Layer > New Adjustment Layer > Photo Filter, use Deep Yellow for the Filter with Luminosity at 60%. Then select Layer > New Adjustment Layer > Gradient Fill again, select black and brown (R: 174, G: 110, B: 47) for the colours, and Radial for the style. The brown part of the gradient has to be in the middle of the big explosion. These two adjustment layers have to be beneath the smoke that is in front of the machine gun.

 

Step%2014.jpg

 

14. To make the scene more realistic, add a motion blur on the first tank. Select the ‘Tanks’ layer and go to Filter > Blur > Motion Blur, use 0º for the angle and 30 pixels for the distance.

 

Credits: Digital Art

Link to comment
Share on other sites

  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Posts

    • UPDATE: Today I received 3 emails from PayPal stating the case was in my favor and I successfully got the full payment back from these scammers.   A warning to all - do NOT deal with this Unsimple as there are way more options out there that are honest and actually professional. Feel free to DM me if you have any more info about Unsimple and their shady practices or want advice.
    • i would like to add this option into Autofarm, if anyone have it or know someone, let me know thanks.
    • DISCORD : utchiha_market telegram : https://t.me/utchiha_market SELLIX STORE : https://utchihamkt.mysellix.io/ Join our server for more products : https://discord.gg/bDVQYKMUb3 https://campsite.bio/utchihaamkt
    • Hello guys who know what me need to change in code to use buff with cast animation like this:       package net.sf.l2j.gameserver.model.actor.instance; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import net.sf.l2j.commons.lang.StringUtil; import net.sf.l2j.commons.math.MathUtil; import net.sf.l2j.Config; import net.sf.l2j.gameserver.data.SkillTable; import net.sf.l2j.gameserver.data.manager.BufferManager; import net.sf.l2j.gameserver.data.manager.BufferManager.BufferSchemeType; import net.sf.l2j.gameserver.model.actor.Creature; import net.sf.l2j.gameserver.model.actor.Player; import net.sf.l2j.gameserver.model.actor.Summon; import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.skills.L2Skill; public class SchemeBuffer extends Folk { private static final int PAGE_LIMIT = 6; public SchemeBuffer(int objectId, NpcTemplate template) { super(objectId, template); } @Override public void onBypassFeedback(Player player, String command) { StringTokenizer st = new StringTokenizer(command, " "); String currentCommand = st.nextToken(); if (currentCommand.startsWith("menu")) { final NpcHtmlMessage html = new NpcHtmlMessage(0); html.setFile(getHtmlPath(player, getNpcId(), 0)); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } else if (currentCommand.startsWith("cleanup")) { player.stopAllEffectsExceptThoseThatLastThroughDeath(); final Summon summon = player.getSummon(); if (summon != null) summon.stopAllEffectsExceptThoseThatLastThroughDeath(); final NpcHtmlMessage html = new NpcHtmlMessage(0); html.setFile(getHtmlPath(player, getNpcId(), 0)); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } else if (currentCommand.startsWith("heal")) { player.getStatus().setMaxCpHpMp(); final Summon summon = player.getSummon(); if (summon != null) summon.getStatus().setMaxHpMp(); final NpcHtmlMessage html = new NpcHtmlMessage(0); html.setFile(getHtmlPath(player, getNpcId(), 0)); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } else if (currentCommand.startsWith("support")) showGiveBuffsWindow(player); else if (currentCommand.startsWith("getscheme")) BufferManager.getInstance().getSchemeSkills(BufferSchemeType.valueOf(st.nextToken().toUpperCase())).forEach(buffId -> getEffect(player, buffId)); else if (currentCommand.startsWith("getbuff")) { final int skillId = Integer.parseInt(st.nextToken()); final int skillLevel = Integer.parseInt(st.nextToken()); List<L2Skill> list = new ArrayList<>(); list.add(SkillTable.getInstance().getInfo(skillId, skillLevel)); int cost = getFee(list); if (cost == 0 || player.reduceAdena("NPC Buffer", cost, this, true)) list.forEach(buffId -> getEffect(player, buffId)); } else if (currentCommand.startsWith("singlebuff")) showSingleBuffSelectionWindow(player, st.nextToken(), Integer.parseInt(st.nextToken())); else if (currentCommand.startsWith("givebuffs")) { final String schemeName = st.nextToken(); final int cost = Integer.parseInt(st.nextToken()); Creature target = null; if (st.hasMoreTokens()) { final String targetType = st.nextToken(); if (targetType != null && targetType.equalsIgnoreCase("pet")) target = player.getSummon(); } else target = player; if (target == null) player.sendMessage("You don't have a pet."); else if (cost == 0 || player.reduceAdena("NPC Buffer", cost, this, true)) BufferManager.getInstance().applySchemeEffects(this, target, player.getObjectId(), schemeName); } else if (currentCommand.startsWith("editschemes")) showEditSchemeWindow(player, st.nextToken(), st.nextToken(), Integer.parseInt(st.nextToken())); else if (currentCommand.startsWith("skill")) { final String groupType = st.nextToken(); final String schemeName = st.nextToken(); final int skillId = Integer.parseInt(st.nextToken()); final int skillLevel = Integer.parseInt(st.nextToken()); final int page = Integer.parseInt(st.nextToken()); L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLevel); final List<L2Skill> skills = BufferManager.getInstance().getScheme(player.getObjectId(), schemeName); premiumSkills(player, skills); if (currentCommand.startsWith("skillselect") && !schemeName.equalsIgnoreCase("none")) { if (skills.size() < player.getMaxBuffCount()) skills.add(skill); else player.sendMessage("This scheme has reached the maximum amount of buffs."); } else if (currentCommand.startsWith("skillunselect")) skills.remove(skill); showEditSchemeWindow(player, groupType, schemeName, page); } else if (currentCommand.startsWith("createscheme")) { try { final String schemeName = st.nextToken(); if (schemeName.length() > 14) { player.sendMessage("Scheme's name must contain up to 14 chars. Spaces are trimmed."); return; } final Map<String, ArrayList<L2Skill>> schemes = BufferManager.getInstance().getPlayerSchemes(player.getObjectId()); if (schemes != null) { if (schemes.size() == Config.BUFFER_MAX_SCHEMES) { player.sendMessage("Maximum schemes amount is already reached."); return; } if (schemes.containsKey(schemeName)) { player.sendMessage("The scheme name already exists."); return; } } BufferManager.getInstance().setScheme(player.getObjectId(), schemeName.trim(), new ArrayList<>()); showGiveBuffsWindow(player); } catch (Exception e) { player.sendMessage("Scheme's name must contain up to 14 chars. Spaces are trimmed."); } } else if (currentCommand.startsWith("deletescheme")) { try { final String schemeName = st.nextToken(); final Map<String, ArrayList<L2Skill>> schemes = BufferManager.getInstance().getPlayerSchemes(player.getObjectId()); if (schemes != null && schemes.containsKey(schemeName)) schemes.remove(schemeName); } catch (Exception e) { player.sendMessage("This scheme name is invalid."); } showGiveBuffsWindow(player); } super.onBypassFeedback(player, command); } private void getEffect(Player player, L2Skill buff) { buff.getEffects(this, player); } @Override public String getHtmlPath(Player player, int npcId, int val) { String filename = ""; if (val == 0) filename = "" + npcId; else filename = npcId + "-" + val; return player.isLang() + "mods/buffer/" + filename + ".htm"; } /** * Send an html packet to the {@link Player} set a parameter with Give Buffs menu info for player and pet, depending on targetType parameter {player, pet}. * @param player : The {@link Player} to make checks on. */ private void showGiveBuffsWindow(Player player) { final StringBuilder sb = new StringBuilder(200); final Map<String, ArrayList<L2Skill>> schemes = BufferManager.getInstance().getPlayerSchemes(player.getObjectId()); if (schemes == null || schemes.isEmpty()) sb.append("<font color=\"LEVEL\">You haven't defined any scheme.</font>"); else { for (Map.Entry<String, ArrayList<L2Skill>> scheme : schemes.entrySet()) { final int cost = getFee(scheme.getValue()); StringUtil.append(sb, "<font color=\"LEVEL\">", scheme.getKey(), " [", scheme.getValue().size(), " / ", player.getMaxBuffCount(), "]", ((cost > 0) ? " - cost: " + StringUtil.formatNumber(cost) : ""), "</font><br1>"); StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_givebuffs ", scheme.getKey(), " ", cost, "\">Use on Me</a>&nbsp;|&nbsp;"); StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_givebuffs ", scheme.getKey(), " ", cost, " pet\">Use on Pet</a>&nbsp;|&nbsp;"); StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_editschemes Buffs ", scheme.getKey(), " 1\">Edit</a>&nbsp;|&nbsp;"); StringUtil.append(sb, "<a action=\"bypass npc_%objectId%_deletescheme ", scheme.getKey(), "\">Delete</a><br>"); } } final NpcHtmlMessage html = new NpcHtmlMessage(0); html.setFile(getHtmlPath(player, getNpcId(), 1)); html.replace("%schemes%", sb.toString()); html.replace("%max_schemes%", Config.BUFFER_MAX_SCHEMES); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } /** * Send an html packet to the {@link Player} set as parameter with Edit Scheme Menu info. This allows the {@link Player} to edit each created scheme (add/delete skills) * @param player : The {@link Player} to make checks on. * @param groupType : The group of skills to select. * @param schemeName : The scheme to make check. * @param page : The current checked page. */ private void showEditSchemeWindow(Player player, String groupType, String schemeName, int page) { final NpcHtmlMessage html = new NpcHtmlMessage(0); final List<L2Skill> schemeSkills = BufferManager.getInstance().getScheme(player.getObjectId(), schemeName); premiumSkills(player, schemeSkills); html.setFile(getHtmlPath(player, getNpcId(), 2)); html.replace("%schemename%", schemeName); html.replace("%count%", schemeSkills.size() + " / " + player.getMaxBuffCount()); html.replace("%typesframe%", getTypesFrame(player, groupType, schemeName, false)); html.replace("%skilllistframe%", getGroupSkillList(player, groupType, schemeName, false, page)); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } private void showSingleBuffSelectionWindow(Player player, String groupType, int page) { final NpcHtmlMessage html = new NpcHtmlMessage(0); html.setFile(getHtmlPath(player, getNpcId(), 3)); html.replace("%typesframe%", getTypesFrame(player, groupType, "", true)); html.replace("%skilllistframe%", getGroupSkillList(player, groupType, "", true, page)); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } /** * @param player : The {@link Player} to make checks on. * @param groupType : The group of skills to select. * @param schemeName : The scheme to make check. * @param singleSelection : Indicate if it's single buff selection or not. * @param page : The current checked page. * @return A {@link String} representing skills available for selection for a given groupType. */ private String getGroupSkillList(Player player, String groupType, String schemeName, boolean singleSelection, int page) { // Retrieve the entire skills list based on group type. List<L2Skill> skills = BufferManager.getInstance().getSkillsIdsByType(groupType); premiumSkills(player, skills); if (skills.isEmpty()) return "That group doesn't contain any skills."; // Calculate page number. final int max = MathUtil.countPagesNumber(skills.size(), PAGE_LIMIT); if (page > max) page = max; // Cut skills list up to page number. skills = skills.subList((page - 1) * PAGE_LIMIT, Math.min(page * PAGE_LIMIT, skills.size())); final List<L2Skill> schemeSkills = BufferManager.getInstance().getScheme(player.getObjectId(), schemeName); final StringBuilder sb = new StringBuilder(skills.size() * 150); int row = 0; for (L2Skill skill : skills) { int skillId = skill.getId(); int skillLevel = skill.getLevel(); sb.append(((row % 2) == 0 ? "<table width=\"280\" bgcolor=\"000000\"><tr>" : "<table width=\"280\"><tr>")); if (singleSelection) StringUtil.append(sb, "<td height=40 width=40><button action=\"bypass npc_" + getObjectId() + "_getbuff ", skillId, " ", skillLevel, " ", "\" width=32 height=32 back=\"", skill.getIcon(), "\" fore=\"", skill.getIcon(), "\" /></td><td width=190>", SkillTable.getInstance().getInfo(skillId, 1).getName(), "<br1><font color=\"B09878\">", BufferManager.getInstance().getAvailableBuff(skill).getDescription(), "</font></td>"); else { if (schemeSkills.contains(skill)) StringUtil.append(sb, "<td height=40 width=40><img src=\"", skill.getIcon(), "\" width=32 height=32></td><td width=190>", SkillTable.getInstance().getInfo(skillId, 1).getName(), "<br1><font color=\"B09878\">", BufferManager.getInstance().getAvailableBuff(skill).getDescription(), "</font></td><td><button action=\"bypass npc_%objectId%_skillunselect ", groupType, " ", schemeName, " ", skillId, " ", skillLevel, " ", page, "\" width=32 height=32 back=\"L2UI_CH3.mapbutton_zoomout2\" fore=\"L2UI_CH3.mapbutton_zoomout1\"></td>"); else StringUtil.append(sb, "<td height=40 width=40><img src=\"", skill.getIcon(), "\" width=32 height=32></td><td width=190>", SkillTable.getInstance().getInfo(skillId, 1).getName(), "<br1><font color=\"B09878\">", BufferManager.getInstance().getAvailableBuff(skill).getDescription(), "</font></td><td><button action=\"bypass npc_%objectId%_skillselect ", groupType, " ", schemeName, " ", skillId, " ", skillLevel, " ", page, "\" width=32 height=32 back=\"L2UI_CH3.mapbutton_zoomin2\" fore=\"L2UI_CH3.mapbutton_zoomin1\"></td>"); } sb.append("</tr></table><img src=\"L2UI.SquareGray\" width=280 height=1>"); row++; } for (int i = PAGE_LIMIT; i > row; i--) StringUtil.append(sb, "<img height=41>"); // Build page footer. sb.append("<br><img src=\"L2UI.SquareGray\" width=280 height=1><table width=\"100%\" bgcolor=000000><tr>"); if (page > 1) { if (singleSelection) StringUtil.append(sb, "<td align=left width=70><a action=\"bypass npc_" + getObjectId() + "_singlebuff ", groupType, " ", page - 1, "\">Previous</a></td>"); else StringUtil.append(sb, "<td align=left width=70><a action=\"bypass npc_" + getObjectId() + "_editschemes ", groupType, " ", schemeName, " ", page - 1, "\">Previous</a></td>"); } else StringUtil.append(sb, "<td align=left width=70>Previous</td>"); StringUtil.append(sb, "<td align=center width=100>Page ", page, "</td>"); if (page < max) { if (singleSelection) StringUtil.append(sb, "<td align=right width=70><a action=\"bypass npc_" + getObjectId() + "_singlebuff ", groupType, " ", page + 1, "\">Next</a></td>"); else StringUtil.append(sb, "<td align=right width=70><a action=\"bypass npc_" + getObjectId() + "_editschemes ", groupType, " ", schemeName, " ", page + 1, "\">Next</a></td>"); } else StringUtil.append(sb, "<td align=right width=70>Next</td>"); sb.append("</tr></table><img src=\"L2UI.SquareGray\" width=280 height=1>"); return sb.toString(); } /** * @param player * @param groupType : The group of skills to select. * @param schemeName : The scheme to make check. * @param singleSelection : Indicate if it's single buff selection or not. * @return A {@link String} representing all groupTypes available. The group currently on selection isn't linkable. */ private static String getTypesFrame(Player player, String groupType, String schemeName, boolean singleSelection) { final StringBuilder sb = new StringBuilder(500); sb.append("<table>"); int count = 0; for (String type : BufferManager.getInstance().getSkillTypes()) { if (player.getPremiumService() == 0) { if (Config.PREMIUM_BUFFS_CATEGORY.isEmpty()) continue; } if (count == 0) sb.append("<tr>"); if (groupType.equalsIgnoreCase(type)) StringUtil.append(sb, "<td width=65>", type, "</td>"); else { if (singleSelection) StringUtil.append(sb, "<td width=65><a action=\"bypass npc_%objectId%_singlebuff ", type, " 1\">", type, "</a></td>"); else StringUtil.append(sb, "<td width=65><a action=\"bypass npc_%objectId%_editschemes ", type, " ", schemeName, " 1\">", type, "</a></td>"); } count++; if (count == 4) { sb.append("</tr>"); count = 0; } } if (!sb.toString().endsWith("</tr>")) sb.append("</tr>"); sb.append("</table>"); return sb.toString(); } /** * @param list : A {@link List} of skill ids. * @return a global fee for all skills contained in the {@link List}. */ private static int getFee(List<L2Skill> list) { if (Config.BUFFER_STATIC_BUFF_COST > 0) return list.size() * Config.BUFFER_STATIC_BUFF_COST; int fee = 0; for (L2Skill sk : list) fee += BufferManager.getInstance().getAvailableBuff(sk).getPrice(); return fee; } private void premiumSkills(Player player, List<L2Skill> skills) { if (player.getPremiumService() == 0) skills.removeIf(skill -> Config.BUFFS_CATEGORY.contains(BufferManager.getInstance().getAvailableBuff(skill).getType())); } }
    • We've worked hard for 14 years to gather all the information for your preferred type of game server - we've put together your ideas, your suggestions, information and researches from different knowledge bases and we've made a lot of tests to make the project as good as you love it. Our goal is to create a masterpiece that everyone can enjoy. We are one of the best server and we will be forever. There are many things we did damn right in the past and we will do more in future! Because of that - you're going to see many things you have not seen before on any other servers! Our team knows what you want and what we should do! You value quality and technical excellence? You need safety and exceptional security? You seek true adventures, unique game world, exquisite and eventful game? It means you are in right place! Welcome to L2Blaze, only here you will find and enjoy real game! X150 WARFIRE INTERLUDE NEW SEASON 2024 SEPTEMBER 27th! Opening time: 19:00 UTC+3 Poland opening time: 18:00 UTC+2 Norway opening time: 18:00 UTC+2 UK opening time: 17:00 UTC+1 Brazil opening time: 11:00 UTC-3 OPENING BONUS Opening bonus for first 100 players who will reach 3rd class will receive VIP Coin as bonus! Automatic registration on game login window, unnecessary to register in website! Do you want stability? Lagless and bugless game? Instant support? Daily PVP? Long-Term playing? You are in the right place, time to start! How to connect STEP BY STEP: 1. Install clear Lineage2 Interlude client 2. Download our patch, delete old system folder and add our 3. Delete, turn off anti virus or add our system folder to anti virus exceptions 4. Run l2.exe from Lineage2/system 5. Enter data on login window and enjoy the game! * You have to remove, turn off or use exceptions of antivirus because of our security protection. It is not a virus. * If you have connection issues with Windows 8 or 10, press right mouse button on l2.exe icon, press Properties, choose compatibility and unmark compatibility mode. Hearts of War EVENT! Collect War Hearts from Hot Springs monsters: Yeti, Buffalo, Antelope, Bandersnatch, Atroxspawn, Flava, Nepenthes, Grendel (3%), Atrox with (6%) and Heart Breaker Boss in Hot Springs Stage 2! You can trade it, sell it or spend in shop! Raid Boss Heart Breaker spawn every 4 hours (+4 hours random) Custom Raid Boss drop list: - Raid Boss Horus, Ember and Brakki, Nakondas: 1 VIP COIN (25%) | Korim (70%). - Raid Boss Apepi, Shacram, Atraiban, Korim: 1 BEWS (10%). - Raid Boss Glaki, Olkuth: 1-2 BEAS (40%). - Raid Boss Golkonda, Galaxia: 1-3 BEAS (60%). - Raid Boss Shyeed: 1-3 BEWS (30%) | 1-7 BEAS (40%) | 1-5 TOP LS 76 (50%). - Raid Boss Shuriel: 1-7 TOP LS 76 (50%) | 1-4 BEAS (60%). - Raid Boss Ashakiel: 1-2 BEWS (30%) | 1-7 TOP LS 76 (50%) | 1-4 BEAS (75%). - Raid Boss Antharas Priest Cloe: 1-3 BEWS (30%) | 1-7 TOP LS 76 (70%). ------------------------------------------------ - Hestia: Demon Splinters / Forgotten Blande (30%). - Ember: Arcana Mace / Draconic Bow (30%). - Galaxia: Angel Slayer / Heaven's Divider (30%) Take your friends, clan, alliance, enemys, sharp your sword, clean your armors and meet your destiny at 2024 SEPTEMBER 27th! WEBSITE: http://WWW.L2BLAZE.NET
  • Topics

×
×
  • Create New...