Jump to content
MMO Society

Search the Community

Showing results for tags 'acis'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • News and Announcements
    • News
  • General
    • Suggestions & Feedback
    • General Chat
    • GFX
    • VFX
  • MMO Hub
    • Gamer's Lounge
    • Member's Lounge
    • Developer Lounge
    • Premium Lounge
  • MMO Corner
    • World of Warcraft
    • Lineage 2
    • Minecraft
    • Host Listing
    • Server Listing
    • Server Recruitment
    • Server Reviews
    • The Underground
  • User Hub
    • Support
    • Report
    • Contact Staff
  • Merchant Corner
    • Marketplace
  • General Development Releases
  • Wasteland

Categories

  • Creative Corner
    • GFX Releases
    • VFX Releases
    • Resources
  • MMO and MMORPG
    • World of Warcraft
    • Lineage 2
    • Minecraft
  • Webmasters
    • Content Management Systems
    • Addons
    • Scripts
    • Designs
    • HTML
  • Applications
  • Marketplace
    • Marsh Designs
    • iDarts

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 8 results

  1. Hello LordCrafters. Here is a special gift created by 'Baggos'. Message from 'Baggos': View Config Files, Summary & Files: configs/customs/customs.properties #============================================================= # Customs #============================================================= # New Char Custom Title. NewCharTitle = L2World # Subclass Custom level SubclassLevel = 52 # PvP/Pk Color System AllowColorSystem = True # It works like: pvps,color;pvps,color, eg. 100,00FF00;200,FF0000;300,0000FF;. PvpsColors = 0,00FF00; # It works like: pks,color;pks,color, eg. 100,00FF00;200,FF0000;300,0000FF;. PksColors = 0,00FF00; # New players level AllowStartlLevel = true # For 80 lvl and 100% put 81 StartLevel = 81 # New players Spawn NewCharLoc = true X = 83278 Y = 148273 Z = -3408 # Subclass Everywhere in any Master. SubclassEverywhere = true #PvP Reward System. PvpRewardSystem = true PvpReward = 57,50; # PvP Count System. # This system count your kills without die. Auto Killing Spree like League of Legends. # Special Announce after 2/3/5/7/9/11/15 pvp kills in a row. PvpCountSystem = true #Starting Items System. (NOT FOR EQUIPPED ITEMS). StartingItemsSystem = true StartingItems = 3470,1; # Npc Party Teleporter # Enable the Character Killing Monuments # NPC Id NpcPtTeleporterId= 50018 # Teleport coordinates PtTeleportX = -56781 PtTeleportY = 140545 PtTeleportZ = -2629 # ZoneId NpcPtZoneID default: 911 # Select the id of your zone. # If you dont know how to find your zone id is simple. # Go to data/zones/(your zone file).xml and find your zone # E.g: <zone name="dion_monster_pvp" id="6" type="ArenaZone" shape="NPoly" minZ="-3596" maxZ="0"> NpcPtZoneID = 255 # Min party members NpcPtMinPartyMembers = 2 # Consume Item Id NpcPtConsumeItemId = 57 # Consume Item Quantity NpcPtConsumeItemQt = 100 # Show Inside players in zone NpcPtShowInsidePlayers = True # Show Inside Parties in zone NpcPtShowInsideParties = True # Enlabe NobleItem | If you change the ID, you should go to < Data/xml/items >. # Add in the end of the item's line ( <set name="handler" val="NobleItem" /> ). EnableNobleItem = True # Id NobleCustomItem NobleItemId = 3481 # Enlabe .online command OnlineCmd = true # Enable skip all items from Data/xml/skipping_items.xml out from droplist of all monsters. EnableSkippingItems = False configs/customs/flagzone.properties # --------------------------------------------------------------------------- # FLAG ZONE # --------------------------------------------------------------------------- # Set the spawn points where players will be teleported on respawn die. # example:150111,144740,-12248;143665,144418,-12022;144443,147685,-12139 SpawnLoc = 82273,148068,-3469; # Random respawn radius RespawnRadius = 250 Summary: Start Title Config. Start Level Config. New Player Spawn Config. Sub Class Level Config. Pvp Color System. Sub Class Everywhere. PvP Reward System. Anti Buff Shield. Blessed Scrolls Chance. Crystal Scrolls Chance. Max Enchant For Crystal Scrolls. Afk System. Auto Potions (CP/HP/MP). PvP Count System. # This system count your kills without die. Auto Killing Spree like League of Legends. # Special Announce after 2/3/5/7/9/11/15 pvp kills in a row. Starting Items System. (NOT FOR EQUIPPED ITEMS). Noble Item. .online .tvtjoin .tvtleave SkippingItems. # In <gameserver/data/xml> you will find the file skipping_items.xml You can put inside the items id who want to be skipped from droplist. Olympiad PvP Kills Limits. Global & Trade Chat with level Limits. Offlineshop. Bot Protection. Topzone/Hopzone/Network Vote Reward. PvP Zone. # In <gameserver/data/xml/zones> You will find the file FlagZone.xml. TvT Event. # You will find the settings of TvT Event in events.properties Gm Shop. Gatekeeper. Buffer. Party Teleporter Npc Raid Boss Manager CLAN MANAGER # You can register your clan for siege, lvl up your clan, add clan skills. TvT Event Npc Vote Manager # Hopzone/Topzone/Network [hide]SVN Link[/hide] [Tutorial]aCis Installation Stay tuned.. More custom mods coming after Christmas. I forgot to put some mods inside. I haven't the time today because I'm in vacations. I think I will create SVN for updates. It is somehow shitty right now. NOTICE: Use backup to get all necessary tables.
  2. Hello members of LordCraft, here is a custom NPC created by me. Images preview: Download: [hide] [/hide] Rar Passowrd: byPsyancy Download contains: Client Side files Server Side files (Inside xml folder you will find xml for the NPC for aCis projects and inside sql folder you will find sql for the NPC for L2JFrozen projects) Credits: Psyancy (My name on another forum)
  3. Hello Lordcrafters, Here is a custom enchant skill list. What this list contains? 100% safe enchant till enchant reach the config value If the enchant is higher than this value you have the retail chance If you fail to enchant and character is nobl ( nobl condition was for testing you have to change this with your condition ) the skill enchant will become -1 of the current enchant Its working for both conditions ( < 130 , < 170 ex. power,cost ) 2 configs ( no need more ) Video Preview: Code:[hide] ### Eclipse Workspace Patch 1.0 #P aCis_gameserver Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkillInfo.java =================================================================== --- java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkillInfo.java (revision 7) +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkillInfo.java (working copy) @@ -84,7 +84,9 @@ return; // Send ExEnchantSkillInfo packet. - ExEnchantSkillInfo esi = new ExEnchantSkillInfo(_skillId, _skillLevel, data.getCostSp(), data.getCostExp(), data.getRate(activeChar.getLevel())); + int fElem = 100 + Config.SAFE_ENCHANT; + int sElem = 140 + Config.SAFE_ENCHANT; + ExEnchantSkillInfo esi = new ExEnchantSkillInfo(_skillId, _skillLevel, data.getCostSp(), data.getCostExp(), (activeChar.isNoble() && ((_skillLevel > 130 && _skillLevel <= sElem) || (_skillLevel <= fElem))) ? 100 : data.getRate(activeChar.getLevel())); if (Config.ES_SP_BOOK_NEEDED) if (data.getItemId() != 0 && data.getItemCount() != 0) esi.addRequirement(4, data.getItemId(), data.getItemCount(), 0); Index: java/net/sf/l2j/Config.java =================================================================== --- java/net/sf/l2j/Config.java (revision 7) +++ java/net/sf/l2j/Config.java (working copy) @@ -52,6 +52,7 @@ public static final String SIEGE_FILE = "./config/siege.properties"; public static final String PARTY_EVENT_FILE = "./config/PartyEvent.properties"; public static final String VOTE_MANAGER_FILE = "./config/VoteManager.properties"; + public static final String ENCHANT_SKILL_FILE = "./config/CustomEnchantSkills.properties"; /** VoteManager Settings */ @@ -107,6 +108,10 @@ public static boolean ALT_MEMBERS_CAN_WITHDRAW_FROM_CLANWH; public static boolean REMOVE_CASTLE_CIRCLETS; + /** Enchant Skills */ + public static int SAFE_ENCHANT; + public static boolean REDUCE_BY_ONE; + /** Manor */ public static int ALT_MANOR_REFRESH_TIME; public static int ALT_MANOR_REFRESH_MIN; @@ -1056,6 +1061,12 @@ RED_RAID_MSG = ptEvent.getProperty("RedRaidMessage","And remember!! Your enemies are noobs! Go Go Go!"); } + private static final void loadEnchantSkills() + { + final ExProperties eSkills = initProperties(ENCHANT_SKILL_FILE); + SAFE_ENCHANT = eSkills.getProperty("SkillSafeEnchantMax", 15); + REDUCE_BY_ONE = eSkills.getProperty("ReduceEnchant", false); + } /** * Loads NPC settings.<br> * Such as champion monsters, NPC buffer, class master, wyvern, raid bosses and grand bosses, AI. @@ -1512,6 +1523,9 @@ // server settings loadServer(); + + // Enchant Skills + loadEnchantSkills(); } public static final void loadLoginServer() Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java =================================================================== --- java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java (revision 7) +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java (working copy) @@ -121,7 +121,9 @@ activeChar.removeExpAndSp(data.getCostExp(), data.getCostSp()); // Try to enchant skill. - if (Rnd.get(100) <= data.getRate(activeChar.getLevel())) + int fElem = 100 + Config.SAFE_ENCHANT; + int sElem = 140 + Config.SAFE_ENCHANT; + if ((activeChar.isNoble() && ((_skillLevel > 130 && _skillLevel <= sElem) || (_skillLevel <= fElem))) ? true : Rnd.get(100) <= data.getRate(activeChar.getLevel())) { activeChar.addSkill(skill, true); activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_SUCCEEDED_IN_ENCHANTING_THE_SKILL_S1).addSkillName(_skillId, _skillLevel)); @@ -131,7 +133,13 @@ activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_FAILED_TO_ENCHANT_THE_SKILL_S1).addSkillName(_skillId, _skillLevel)); if (_skillLevel > 100) { - _skillLevel = baseLvl; + if (Config.REDUCE_BY_ONE && activeChar.isNoble()) + { + if (_skillLevel > 140 || _skillLevel < 130) + _skillLevel-=2; + } + else + _skillLevel = baseLvl; activeChar.addSkill(SkillTable.getInstance().getInfo(_skillId, _skillLevel), true); } } [/hide] Config: [hide] # ================================================================ # Enchant Skills setting # ================================================================ #If the char meet the conditions will enchant with 100% success rate #Till the this value #default 15 SkillSafeEnchantMax = 10 #If this is true and the enchant will fail , the skill enchantment will lost 1 enchant ReduceEnchant = true [/hide] Credits: melron
  4. Hello members of LordCraft, here is a code for Name Change. How it works? An item that changes the name of the character. Don't worry, we made checks on retail conditions, as 16-character limit, ... Remeber, you have to set an item to be the handler of Name Change. You can do it by adding <set name="handler" val="NameChange" /> on XML of the item. Image Preview: Core part: [hide] Index: java/net/sf/l2j/gameserver/handler/ItemHandler.java =================================================================== --- java/net/sf/l2j/gameserver/handler/ItemHandler.java (revision 21) +++ java/net/sf/l2j/gameserver/handler/ItemHandler.java (working copy) @@ -31,6 +31,7 @@ import net.sf.l2j.gameserver.handler.itemhandlers.Keys; import net.sf.l2j.gameserver.handler.itemhandlers.Maps; import net.sf.l2j.gameserver.handler.itemhandlers.MercTicket; +import net.sf.l2j.gameserver.handler.itemhandlers.NameChange; import net.sf.l2j.gameserver.handler.itemhandlers.PaganKeys; import net.sf.l2j.gameserver.handler.itemhandlers.PetFood; import net.sf.l2j.gameserver.handler.itemhandlers.Recipes; @@ -70,6 +71,7 @@ registerItemHandler(new Keys()); registerItemHandler(new Maps()); registerItemHandler(new MercTicket()); + registerItemHandler(new NameChange()); registerItemHandler(new PaganKeys()); registerItemHandler(new PetFood()); registerItemHandler(new Recipes()); Index: java/net/sf/l2j/gameserver/handler/itemhandlers/NameChange.java =================================================================== --- java/net/sf/l2j/gameserver/handler/itemhandlers/NameChange.java (revision 0) +++ java/net/sf/l2j/gameserver/handler/itemhandlers/NameChange.java (working copy) @@ -0,0 +1,43 @@ +/* + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ +package net.sf.l2j.gameserver.handler.itemhandlers; + +import net.sf.l2j.gameserver.handler.IItemHandler; +import net.sf.l2j.gameserver.model.actor.L2Playable; +import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.model.item.instance.ItemInstance; +import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; +import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; + +/** + * @author rapfersan92 + */ +public class NameChange implements IItemHandler +{ + @Override + public void useItem(L2Playable playable, ItemInstance item, boolean forceUse) + { + if (!(playable instanceof L2PcInstance)) + return; + + final L2PcInstance activeChar = (L2PcInstance) playable; + activeChar.setNameChangeItemId(item.getItemId()); + + final NpcHtmlMessage html = new NpcHtmlMessage(0); + html.setFile("data/html/mods/NameChange.htm"); + activeChar.sendPacket(html); + activeChar.sendPacket(ActionFailed.STATIC_PACKET); + } +} \ No newline at end of file Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java =================================================================== --- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 21) +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -10705,4 +10705,16 @@ break; } } + + private int _nameChangeItemId = 0; + + public int getNameChangeItemId() + { + return _nameChangeItemId; + } + + public void setNameChangeItemId(int itemId) + { + _nameChangeItemId = itemId; + } } \ No newline at end of file Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java =================================================================== --- java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (revision 21) +++ java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (working copy) @@ -18,8 +18,10 @@ import java.util.logging.Level; import net.sf.l2j.Config; +import net.sf.l2j.commons.lang.StringUtil; import net.sf.l2j.gameserver.communitybbs.CommunityBoard; import net.sf.l2j.gameserver.datatables.AdminCommandAccessRights; +import net.sf.l2j.gameserver.datatables.CharNameTable; import net.sf.l2j.gameserver.handler.AdminCommandHandler; import net.sf.l2j.gameserver.handler.IAdminCommandHandler; import net.sf.l2j.gameserver.model.L2Object; @@ -31,7 +33,9 @@ import net.sf.l2j.gameserver.model.olympiad.OlympiadManager; import net.sf.l2j.gameserver.network.SystemMessageId; import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; +import net.sf.l2j.gameserver.network.serverpackets.ExShowScreenMessage; import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; +import net.sf.l2j.gameserver.network.serverpackets.PlaySound; import net.sf.l2j.gameserver.util.FloodProtectors; import net.sf.l2j.gameserver.util.FloodProtectors.Action; import net.sf.l2j.gameserver.util.GMAudit; @@ -181,6 +185,46 @@ final int arenaId = Integer.parseInt(_command.substring(12).trim()); activeChar.enterOlympiadObserverMode(arenaId); } + else if (_command.startsWith("name_change")) + { + try + { + String name = _command.substring(12); + if (name.length() > 16) + { + activeChar.sendMessage("The chosen name cannot exceed 16 characters in length."); + return; + } + + if (!StringUtil.isValidPlayerName(name)) + { + activeChar.sendMessage("The chosen name does not fit with the regex pattern."); + return; + } + + synchronized (CharNameTable.getInstance()) + { + if (CharNameTable.doesCharNameExist(name)) + { + activeChar.sendMessage("The chosen name already exists."); + return; + } + } + + if (activeChar.destroyItemByItemId("Name Change", activeChar.getNameChangeItemId(), 1, null, true)) + { + activeChar.setName(name); + activeChar.sendPacket(new ExShowScreenMessage("Congratulations. Your name has been changed.", 10000)); + activeChar.sendPacket(new PlaySound("ItemSound.quest_finish")); + activeChar.broadcastUserInfo(); + activeChar.store(); + } + } + catch (Exception e) + { + activeChar.sendMessage("Fill out the field correctly."); + } + } } catch (Exception e) { [/hide] Datapack Part: [hide] Index: data/html/mods/NameChange.htm =================================================================== --- data/html/mods/NameChange.htm (revision 0) +++ data/html/mods/NameChange.htm (working copy) @@ -0,0 +1,26 @@ +<html> + <body> + <center> + <table width="256"> + <tr><td width="256" align="center">Name Change</td></tr> + </table> + <br> + <table width="256"> + <tr><td width="256" align="left">The name change service allows you to change the name of your character as it appears in-game.</td></tr> + </table> + <br> + <table width="160" cellspacing="2"> + <tr><td width="160" align="center">Name</td></tr> + <tr><td width="160" align="center"><edit var="name" width="160" height="12"></td> + </table> + <br> + <table width="95" cellspacing="2"> + <tr><td width="95" align="center"><button action="bypass -h name_change $name" value="Change!" width="95" height="21" back="bigbutton_over" fore="bigbutton"></td></tr> + </table> + <br> + <table width="256"> + <tr><td width="256" align="center">L2jBrasil</td></tr> + </table> + </center> + </body> +</html> \ No newline at end of file [/hide] Credits: Kraker
  5. Hello guys, here is a code for Enchant Rates Config for Blessed and Crystal Scrolls for aCis. Go to: gameserver/network/clientpacket/AbstractEnchantPacket.java find this if (enchantItem.isArmor()) chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR, (enchantItem.getEnchantLevel() - 2)); // Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14. else if (enchantItem.isWeapon()) { if (((L2Weapon) enchantItem.getItem()).isMagical()) chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS : Config.ENCHANT_CHANCE_WEAPON_MAGIC; else chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC; } And replace it with this: [hide] if (isBlessed()) { if (enchantItem.isArmor()) chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR_BLESSED, (enchantItem.getEnchantLevel() - 2)); // Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14. else if (enchantItem.isWeapon()) { if (((Weapon) enchantItem.getItem()).isMagical()) chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_BLESSED : Config.ENCHANT_CHANCE_WEAPON_MAGIC_BLESSED; else chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_BLESSED : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_BLESSED; } } else if (isCrystal()) { if (enchantItem.isArmor()) chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR_CRYSTAL, (enchantItem.getEnchantLevel() - 2)); // Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14. else if (enchantItem.isWeapon()) { if (((Weapon) enchantItem.getItem()).isMagical()) chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_CRYSTAL : Config.ENCHANT_CHANCE_WEAPON_MAGIC_CRYSTAL; else chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_CRYSTAL : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_CRYSTAL; } } else { if (enchantItem.isArmor()) chance = Math.pow(Config.ENCHANT_CHANCE_ARMOR, (enchantItem.getEnchantLevel() - 2)); // Weapon formula is 70% for fighter weapon, 40% for mage weapon. Special rates after +14. else if (enchantItem.isWeapon()) { if (((Weapon) enchantItem.getItem()).isMagical()) chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS : Config.ENCHANT_CHANCE_WEAPON_MAGIC; else chance = (enchantItem.getEnchantLevel() > 14) ? Config.ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS : Config.ENCHANT_CHANCE_WEAPON_NONMAGIC; } } [/hide] And now the Configs: public static double ENCHANT_CHANCE_WEAPON_MAGIC; public static double ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS; public static double ENCHANT_CHANCE_WEAPON_NONMAGIC; public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS; +public static double ENCHANT_CHANCE_WEAPON_MAGIC_BLESSED; +public static double ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_BLESSED; +public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_BLESSED; +public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_BLESSED; +public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_CRYSTAL; +public static double ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_CRYSTAL; +public static double ENCHANT_CHANCE_WEAPON_MAGIC_CRYSTAL; +public static double ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_CRYSTAL; public static double ENCHANT_CHANCE_ARMOR; +public static double ENCHANT_CHANCE_ARMOR_BLESSED; +public static double ENCHANT_CHANCE_ARMOR_CRYSTAL; ENCHANT_CHANCE_WEAPON_MAGIC = players.getProperty("EnchantChanceMagicWeapon", 0.4); ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS = players.getProperty("EnchantChanceMagicWeapon15Plus", 0.2); ENCHANT_CHANCE_WEAPON_NONMAGIC = players.getProperty("EnchantChanceNonMagicWeapon", 0.7); ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS = players.getProperty("EnchantChanceNonMagicWeapon15Plus", 0.35); +ENCHANT_CHANCE_WEAPON_MAGIC_BLESSED = players.getProperty("EnchantChangeWeaponMagicBlessed", 0.35); +ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_BLESSED = players.getProperty("EnchantChangeWeaponMagic15PlusBlessed", 0.35); +ENCHANT_CHANCE_WEAPON_NONMAGIC_BLESSED = players.getProperty("EnchantChangeWeaponNonMagicBlessed", 0.35); +ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_BLESSED = players.getProperty("EnchantChangeWeaponNonMagic15PlusBlessed", 0.35); +ENCHANT_CHANCE_WEAPON_NONMAGIC_CRYSTAL = players.getProperty("EnchantChanceWeaponNonMagicCrystal", 0.35); +ENCHANT_CHANCE_WEAPON_NONMAGIC_15PLUS_CRYSTAL = players.getProperty("EnchantChanceWeaponNonMagic15PlusCrystal", 0.35); +ENCHANT_CHANCE_WEAPON_MAGIC_CRYSTAL = players.getProperty("EnchantChanceWeaponMagicCrystal", 0.35); +ENCHANT_CHANCE_WEAPON_MAGIC_15PLUS_CRYSTAL = players.getProperty("EnchantChanceWeaponMagic15PlusCrystal", 0.35); ENCHANT_CHANCE_ARMOR = players.getProperty("EnchantChanceArmor", 0.66); +ENCHANT_CHANCE_ARMOR_BLESSED = players.getProperty("EnchantChanceArmorBlessed", 0.66); +ENCHANT_CHANCE_ARMOR_CRYSTAL = players.getProperty("EnchantChanceArmorCrystal", 0.66); # % chance of success to enchant a non magic weapon with normal scroll EnchantChanceNonMagicWeapon = 0.55 EnchantChanceNonMagicWeapon15Plus = 0.55 + +# % chance of success to enchant a magic weapon with blessed scroll +EnchantChangeWeaponMagicBlessed = 0.75 +EnchantChangeWeaponMagic15PlusBlessed = 0.75 + +# % chance of success to enchant a non magic weapon with blessed scroll +EnchantChangeWeaponNonMagicBlessed = 0.75 +EnchantChangeWeaponNonMagic15PlusBlessed = 0.75 + +# % chance of success to enchant a magic weapon with crystal scroll +EnchantChanceWeaponMagicCrystal = 0.95 +EnchantChanceWeaponMagic15PlusCrystal = 0.95 + +# % chance of success to enchant a non magic weapon with crystal scroll +EnchantChanceWeaponNonMagicCrystal = 0.95 +EnchantChanceWeaponNonMagic15PlusCrystal = 0.95 + # % chance of success for normal scrolls to enchant an armor part (both jewelry or armor) EnchantChanceArmor = 0.66 + +# % chance of success for blessed scrolls to enchant an armor part (both jewelry or armor) +EnchantChanceArmorBlessed = 0.75 + +# % chance of success for crystal scrolls to enchant an armor part (both jewelry or armor) +EnchantChanceArmorCrystal = 0.95 # Enchant limit [default = 0] EnchantMaxWeapon = 0 EnchantMaxArmor = 0 Credits for the original code: Uknown, Credits for the fixes and update to last rev: Psyancy aka TehNeRD
  6. Images Preview: P.S. Preview Images are from the original code for H5 this code is adapted to aCis, it's tested and working! Core Part: [hide] diff --git config/custom.properties config/custom.properties +++ config/custom.properties @@ -0,0 +1,33 @@ +#============================================================= +# Npc Party Teleporter +#============================================================= +# Enable the Character Killing Monuments +# NPC Id +NpcPtTeleporterId= 36613 + +# Teleport coordinates +PtTeleportX = -56781 +PtTeleportY = 140545 +PtTeleportZ = -2629 + +# ZoneId NpcPtZoneID default: 911 +# Select the id of your zone. +# If you dont know how to find your zone id is simple. +# Go to data/zones/(your zone file).xml and find your zone +# E.g: <zone name="dion_monster_pvp" id="6" type="ArenaZone" shape="NPoly" minZ="-3596" maxZ="0"> +NpcPtZoneID = 255 + +# Min party members +NpcPtMinPartyMembers = 2 + +# Consume Item Id +NpcPtConsumeItemId = 57 + +# Consume Item Quantity +NpcPtConsumeItemQt = 100 + +# Show Inside players in zone +NpcPtShowInsidePlayers = True + +# Show Inside Parties in zone +NpcPtShowInsideParties = True \ No newline at end of file diff --git java/net/sf/l2j/Config.java java/net/sf/l2j/Config.java new file mode 100644 index 0000000..477b1a3 --- /dev/null +++ java/net/sf/l2j/Config.java @@ -0,0 +1,1513 @@ + public static final String CUSTOM_FILE = "./config/custom.properties"; + + // -------------------------------------------------- + // Custom settings + // -------------------------------------------------- + public static int NPC_ID_PT_TELEPORTER; + public static int NPC_PT_TELEPORTER_X; + public static int NPC_PT_TELEPORTER_Y; + public static int NPC_PT_TELEPORTER_Z; + public static int NPC_PT_ZONEID; + public static int NPC_PT_MINPT_MEMBERS; + public static int NPC_PT_ITEMCONSUME_ID; + public static int NPC_PT_ITEMCOMSUME_QT; + public static boolean NPC_PT_SHOWINSIDE_PLAYERS; + public static boolean NPC_PT_SHOWINSIDE_PARTIES; + FLOOD_PROTECTOR_SENDMAIL = new FloodProtectorConfig("SendMailFloodProtector"); FLOOD_PROTECTOR_CHARACTER_SELECT = new FloodProtectorConfig("CharacterSelectFloodProtector"); _log.info("Loading gameserver configuration files."); + // Custom settings + ExProperties custom = load(CUSTOM_FILE); + NPC_ID_PT_TELEPORTER = custom.getProperty("NpcPtTeleporterId", 36614); + NPC_PT_TELEPORTER_X = custom.getProperty("PtTeleportX", -56742); + NPC_PT_TELEPORTER_Y = custom.getProperty("PtTeleportY", 140569); + NPC_PT_TELEPORTER_Z = custom.getProperty("PtTeleportZ", -2625); + NPC_PT_ZONEID = custom.getProperty("NpcPtZoneID", 155); + NPC_PT_MINPT_MEMBERS = custom.getProperty("NpcPtMinPartyMembers", 2); + NPC_PT_ITEMCONSUME_ID = custom.getProperty("NpcPtConsumeItemId", 57); + NPC_PT_ITEMCOMSUME_QT = custom.getProperty("NpcPtConsumeItemQt", 100); + NPC_PT_SHOWINSIDE_PLAYERS = custom.getProperty("NpcPtShowInsidePlayers", true); + NPC_PT_SHOWINSIDE_PARTIES = custom.getProperty("NpcPtShowInsideParties", true); + // Clans settings ExProperties clans = load(CLANS_FILE); diff --git java/net/sf/l2j/gameserver/model/actor/instance/L2PartyTeleporterInstance.java java/net/sf/l2j/gameserver/model/actor/instance/L2PartyTeleporterInstance.java +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PartyTeleporterInstance.java @@ -0,0 +1,234 @@ +package net.sf.l2j.gameserver.model.actor.instance; + +import java.util.StringTokenizer; + +import net.sf.l2j.Config; +import net.sf.l2j.gameserver.datatables.ItemTable; +import net.sf.l2j.gameserver.instancemanager.ZoneManager; +import net.sf.l2j.gameserver.model.L2Party; +import net.sf.l2j.gameserver.model.actor.L2Character; +import net.sf.l2j.gameserver.model.actor.template.NpcTemplate; +import net.sf.l2j.gameserver.model.zone.L2ZoneType; +import net.sf.l2j.gameserver.network.serverpackets.ActionFailed; +import net.sf.l2j.gameserver.network.serverpackets.InventoryUpdate; +import net.sf.l2j.gameserver.network.serverpackets.ItemList; +import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage; +import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate; + + +/** + * @author `Heroin Adapter Gandalf PartyTeleporter, Lucas Fernandes + */ +public class L2PartyTeleporterInstance extends L2NpcInstance +{ + private static final int npcid = Config.NPC_ID_PT_TELEPORTER; // npc id + // ------------------------------------- + // Teleport Location Coordinates X,Y,Z. + // Use /loc command in game to find them. + private static final int locationX = Config.NPC_PT_TELEPORTER_X; // npc id + private static final int locationY = Config.NPC_PT_TELEPORTER_Y; // npc id + private static final int locationZ = Config.NPC_PT_TELEPORTER_Z; // npc id + // ------------------------------------- + // ------------------------------------- + // Select the id of your zone. + // If you dont know how to find your zone id is simple. + // Go to data/zones/(your zone file).xml and find your zone + // E.g: <zone name="dion_monster_pvp" id="6" type="ArenaZone" shape="NPoly" minZ="-3596" maxZ="0"> + /** The id of your zone is id="6" */ + /** --------------------------------------------------------------------------- */ + /** WARNING: If your zone does not have any id or your location is not on any zone in data/zones/ folder, you have to add one by your self */ // required to calculate parties & players + /** --------------------------------------------------------------------------- */ + private static final int ZoneId = Config.NPC_PT_ZONEID; // Here you have to set your zone Id + // ------------------------------------- + private static final int MinPtMembers = Config.NPC_PT_MINPT_MEMBERS; // Minimum Party Members Count For Enter on Zone. + private static final int ItemConsumeId = Config.NPC_PT_ITEMCONSUME_ID; // Item Consume id. + private static final int ItemConsumeNum = Config.NPC_PT_ITEMCOMSUME_QT; // Item Consume Am.ount. + private static final boolean ShowPlayersInside = Config.NPC_PT_SHOWINSIDE_PLAYERS; // If you set it true, NPC will show how many players are inside area. + private static final boolean ShowPartiesInside = Config.NPC_PT_SHOWINSIDE_PARTIES; // If you set it true, NPC will show how many parties are inside area. + private static String ItemName = ItemTable.getInstance().getTemplate(ItemConsumeId).getName(); // Item name, Dont Change this + private String htmContent; + + public L2PartyTeleporterInstance(int objectId, NpcTemplate template) + { + super(objectId, template); + } + + @Override + public void onBypassFeedback(L2PcInstance player, String command) + { + player.sendPacket(ActionFailed.STATIC_PACKET); + + StringTokenizer st = new StringTokenizer(command, " "); + String actualCommand = st.nextToken(); // Get actual command + + if (actualCommand.equalsIgnoreCase("partytp")) + { + TP(player); + } + super.onBypassFeedback(player, command); + } + + public int getPartiesInside(int zoneId)// Calculating parties inside party area. + { + int i = 0; + for (L2ZoneType zone : ZoneManager.getInstance().getZones(locationX, locationY, locationZ)) + { + if (zone.getId() == zoneId) + { + for (L2Character character : zone.getCharactersInside()) + { + if ((character instanceof L2PcInstance) && (!((L2PcInstance) character).getClient().isDetached()) && (((L2PcInstance) character).getParty() != null) && ((L2PcInstance) character).getParty().isLeader((L2PcInstance) character)) + { + i++; + } + } + } + } + return i; + } + + public int getPlayerInside(int zoneId)// Calculating players inside party area. + { + int i = 0; + for (L2ZoneType zone : ZoneManager.getInstance().getZones(locationX, locationY, locationZ)) + { + if (zone.getId() == zoneId) + { + for (L2Character character : zone.getCharactersInside()) + { + if ((character instanceof L2PcInstance) && (!((L2PcInstance) character).getClient().isDetached())) + { + i++; + } + } + } + } + return i; + } + + private static boolean PartyItemsOk(L2PcInstance player) + // Checks if all party members have the item in their inventory. + // If pt member has not enough items, party not allowed to enter. + { + try + { + for (L2PcInstance member : player.getParty().getPartyMembers()) + { + if (member.getInventory().getItemByItemId(ItemConsumeId) == null) + + { + player.sendMessage("Your party member " + member.getName() + " does not have enough items."); + return false; + } + if (member.getInventory().getItemByItemId(ItemConsumeId).getCount() < ItemConsumeNum) + { + player.sendMessage("Your party member " + member.getName() + " does not have enough items."); + return false; + } + } + return true; + + } + catch (Exception e) + { + player.sendMessage("Something went wrong try again."); + return true; + } + } + + private static void proccessTP(L2PcInstance player) // Teleporting party members to zone + { + for (L2PcInstance member : player.getParty().getPartyMembers()) + { + member.teleToLocation(locationX, locationY, locationZ, 1);// Location X, Y ,Z + } + } + + private static void TP(L2PcInstance player) // Teleport player & his party + { + try + { + L2Party pt = player.getParty(); + if (pt == null) + { + player.sendMessage("You are not currently on party."); + return; + } + if (!pt.isLeader(player)) + { + player.sendMessage("You are not party leader."); + return; + } + if (pt.getMemberCount() < MinPtMembers) + { + player.sendMessage("You are going to need a bigger party " + "in order to enter party area."); + return; + } + if (!PartyItemsOk(player)) + { + return; + } + proccessTP(player); + for (L2PcInstance ppl : pt.getPartyMembers()) + { + if (ppl.getObjectId() != player.getObjectId()) // Dont send this message to pt leader. + { + ppl.sendMessage("Your party leader asked to teleport on party area!");// Message only to party members + } + ppl.sendMessage(ItemConsumeNum + " " + ItemName + " have been dissapeared.");// Item delete from inventory message + ppl.getInventory().destroyItemByItemId("Party_Teleporter", ItemConsumeId, ItemConsumeNum, ppl, ppl);// remove item from inventory + ppl.sendPacket(new InventoryUpdate());// Update + ppl.sendPacket(new ItemList(ppl, false));// Update + ppl.sendPacket(new StatusUpdate(ppl));// Update + + } + // Sends message to party leader. + player.sendMessage((ItemConsumeNum * player.getParty().getMemberCount()) + " " + ItemName + " dissapeard from your party."); + + } + catch (Exception e) + { + player.sendMessage("Something went wrong try again."); + } + } + + @Override + public void showChatWindow(L2PcInstance player) + { + final int npcId = Config.NPC_ID_PT_TELEPORTER; + if (npcId == npcid) + { + htmContent = "data/html/mods/PartyTeleporter/PartyTeleporter.htm"; + if (htmContent != null) + { + final NpcHtmlMessage npcHtmlMessage = new NpcHtmlMessage(getObjectId()); + npcHtmlMessage.setHtml(htmContent); + npcHtmlMessage.replace("%objectId%", String.valueOf(getObjectId())); + npcHtmlMessage.replace("%player%", player.getName());// Replaces %player% with player name on html + npcHtmlMessage.replace("%itemname%", ItemName);// Item name replace on html + npcHtmlMessage.replace("%price%", player.getParty() != null ? "" + (ItemConsumeNum * player.getParty().getMemberCount()) + "" : "0");// Price calculate replace + npcHtmlMessage.replace("%minmembers%", "" + MinPtMembers);// Mimum entry party members replace + npcHtmlMessage.replace("%allowed%", isAllowedEnter(player) ? "<font color=00FF00>allowed</font>" : "<font color=FF0000>not allowed</font>");// Condition checker replace on html + npcHtmlMessage.replace("%parties%", ShowPartiesInside ? "<font color=FFA500>Parties Inside: " + getPartiesInside(ZoneId) + "</font><br>" : "");// Parties inside + npcHtmlMessage.replace("%players%", ShowPlayersInside ? "<font color=FFA500>Players Inside: " + getPlayerInside(ZoneId) + "</font><br>" : "");// Players Inside + player.sendPacket(npcHtmlMessage); + } + + player.sendPacket(ActionFailed.STATIC_PACKET); + } + } + + private static boolean isAllowedEnter(L2PcInstance player) // Checks if player & his party is allowed to teleport. + { + if (player.getParty() != null) + { + if ((player.getParty().getMemberCount() >= MinPtMembers) && PartyItemsOk(player)) // Party Length & Item Checker + { + return true; + } + return false; + } + return false; + } + +} \ No newline at end of file [/hide] DP Part: [hide] +++ data/html/mods/PartyTeleporter/PartyTeleporter.htm @@ -0,0 +1,21 @@ +<html> +<title>%player%</title> +<body><center> +<center> +You have to be a party leader in order to ask from me to teleport you and your party inside party area.<br> +Minimum number of members in party: <font color="LEVEL">%minmembers%</font>.<br> +You are currently %allowed% to enter party area with your party.<br> +Party teleport will cost you total: <font color="LEVEL">%price% %itemname%</font><br> +</center> +<center> +%parties% +%players% + +<table><tr> +<td><a action="bypass -h npc_%objectId%_partypt">Teleport me & My party!</td> +</tr></table> + + +<br><br> +<center> +</body></html> \ No newline at end of file diff --git data/xml/npcs/36000-36099.xml data/xml/npcs/36000-36099.xml +++ data/xml/npcs/36000-36099.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<list> + <npc id="36613" name="Hector" title=""> + <set name="level" val="67"/> + <set name="radius" val="8"/> + <set name="height" val="24"/> + <set name="rHand" val="128"/> + <set name="lHand" val="628"/> + <set name="type" val="L2PartyTeleporter"/> + <set name="exp" val="449"/> + <set name="sp" val="1"/> + <set name="hp" val="2295.48154"/> + <set name="mp" val="1251"/> + <set name="hpRegen" val="7.5"/> + <set name="mpRegen" val="2.7"/> + <set name="pAtk" val="624.93199"/> + <set name="pDef" val="281.55251"/> + <set name="mAtk" val="426.74754"/> + <set name="mDef" val="206.02791"/> + <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="195"/> + <set name="dropHerbGroup" val="0"/> + <set name="attackRange" val="40"/> + <ai type="default" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" clan="door_clan;mercenary_siege_clan" clanRange="1200" canMove="true" seedable="false"/> + <skills> + <skill id="4045" level="1"/> + <skill id="4416" level="23"/> + </skills> + </npc> + </list> \ No newline at end of file [hide] Credits for the original code `Heroin Adapter Gandalf PartyTeleporter, Lucas Fernandes Enjoy!
  7. Hello members of LordCraft, today i'm gonna share with you the best Interlude Project. About aCis: Introduction aCis (acronym for "another Crappy interlude server") is a Java emulator, based on L2J work, aiming Interlude chronicle. The project begun around december 2010, when at this time there wasn't anymore active project, and is still active. Goals aCis' goals is to deliver a fresh vision of what a pack developement must be ; understand we aim things differently than others packs devs. The "useless custom drop" policy allows you to make WHAT YOU REALLY WANT, avoiding any conflict between your customs and pack customs. As we don't busy about customs, that time is fully used to enhance retail behavior. The pack is under a freemium concept. Only people willing to help deserve the right to use sources. Read the How to get Access Section to understand the whole concept. Many reworks have been done : XMLization of numerous tables, rewritten scripts (340+ atm), and AIs. We got numerous "unique" features, like rewritten GBs such as Sailren, Baium, Antharas && Valakas, //bk system, movie maker, and so on. We're on the process to retail-izing everything. We begun with NPCs templates, scripts got retail chances and behavior, spawnlist is generated using L2OFF. A lot of work is still needed, but so far we already made a lot, fixing hundreds - if not thousands - issues. Join the community in order L2J world got one day a decent IL emulator. Links The mother forums : understand than 2/3 of overall forums is hidden, but reachable according your "trust" level. faCebook fan page : current WIP, when I manage to think about it (update rarely). crappy YouTube channel : showing features. How to get Access: Freemium is often used in MMO industry : it's the fact to give access to a free content for all, but locking some aspects of gameplay/features for subscribers. On aCis, the concept is similar, but there is a big difference in the term you can CONTRIBUTE and get updates for free. So yes, contributors got more powers than customers, which got themselves more powers than free users. In that topic you will find informations concerning : Types of groups Price Terms of Agreement TYPES OF GROUPS FREE USERS A free revision will be shared every 10 revisions steps (ex : I commit rev 300, I will share rev 290 for free). The free users got no support, nor hotfix. They use old sources with unfixed stuff, free to them to update sources themselves (based on next free sources or no), share in order to get free updates (and becoming an IC member), or pay in order to be up-to-date (customer). Free users can contribute to project using free sources, and be rewarded for their work (see contributor section). CUSTOMERS You will have access to latest sources and diff patches. Access to custom && FAQ boards. I will give support for any issue concerning the pack itself. I don't busy about your customs. You can evolve from customer to Outer/Inner Circle status if you're an active member, as free users can do aswell. You haven't access to SVN / Timeline. OUTER/INNER CIRCLE Free users as customers can reach that status sharing. New/old helpers are part of Outer Circle. It's a needed step in order to enter in Inner Circle. They got access to few internal boards. Main contributors are rewarded by Inner Circle status, they got access to SVN / Timeline, got access to all boards and don't pay any fee. That access is maintained until they stop to contribute or contribution amount becomes too low. PRICE A subscription begins during a revision "cycle" (a stack of 10 revisions, going from 0 to 9). Ppl who donate during a "cycle" will see either their subscription delayed to next cycle beginning, or activated to the beginning of the current cycle. The price is as following : 10 euros minimum (for 10 revs). I only accept multiples of 10 (10, 20, 30, 40...). Payed via Paypal, as a "gift" on that address : [email protected] If your country hasn't a "gift" button, you will have to pay Paypal tax for me : add 10% to the total amount you wanted to donate, and use either "goods" or "service" buttons. If your payment doesn't follow my conditions, your payment will be returned back. Once you donated, send me a PM on that forum or on MxC in order I agree to setup your forum account. TERMS OF AGREEMENT Using aCis, you accept the following : You can't sell a revision of aCis pack, customized or not. If you want to sell customs, sell diff patches. You can't sell aCis as a base for your pack. You can't freely share, as Customer/Inner Circle, any revision posterior to free revision share. aCis forks are allowed for following conditions and only for those conditions : Your pack stays open source (in order useful fixes can be used in the main pack). You use one of the free shared versions as base (aka no current cycle revision) and don't update your fork with posterior changesets of current free revision. A miss to one of those rules can lead to following punishements : As Customer/Inner Circle, an immediate forum rank drop. In case you donated, I won't refund your money either, as you made me lose money yourself. All your cookies will be probably stolen by others members to punish you ! In case I was supporting your server with hotfixes/testing, you're alone. In case you post on known forums, such as MxC, an immediate drop of the thread, with if you persist, dekarma sanctions. Latest Free Sources: Public sources of aCis SVN || Timeline || Site Changeset 1 aCis 310 Changeset 2 aCis 320 Changeset 3 aCis 330 Changeset 4 aCis 340 Changeset 5 aCis 350
  8. Hello members of LordCraft, here is a code for anti drain mobs. You can edit for mages or fighters (hits or spells). ### Eclipse Workspace Patch 1.0 #P Chr.6GMS Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java =================================================================== --- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 5263) +++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy) @@ -238,6 +238,8 @@ public static final int STORE_PRIVATE_BUY = 3; public static final int STORE_PRIVATE_MANUFACTURE = 5; public static final int STORE_PRIVATE_PACKAGE_SELL = 8; + + private int[] drainIds = {0,25,2}; /** The table containing all minimum level needed for each Expertise (None, D, C, B, A, S)*/ private static final int[] EXPERTISE_LEVELS = @@ -284,6 +286,21 @@ public void doCast(L2Skill skill) { super.doCast(skill); + + //--Cannot use drain skills in mobs-- + L2Object target = getTarget(); + L2MonsterInstance m = null; + if(target instanceof L2MonsterInstance) + m = (L2MonsterInstance) target; + if(m != null && getPvpFlag() > 0){ + for(int i=0; i < drainIds.length; i ++) + { + if(skill.getId() == drainIds[i]){ + sendMessage("You can't drain hp from mobs"); + return; + } + } + } // cancel the recent fake-death protection instantly if the player attacks or casts spells getPlayer().setRecentFakeDeath(false); Credits: Zeus
×
×
  • Create New...