Jump to content

khyle650

Members
  • Posts

    40
  • Joined

  • Last visited

  • Days Won

    4

Everything posted by khyle650

  1. Use this example script npc: Orb Refine by Skorn rathena-orb-refine.mp4
  2. - 2020-04-01bRagexe - 2020-07-15bRagexe - 2021-01-07aRagexeRE - 2021-11-03_Ragexe_1635926200 - 2022-03-30_Ragexe_1648110506 - 2022-04-06_Ragexe Exes.7z
  3. Use this example: create npc script. - script Enchant Expert -1,{ //------------------------------------------------------------------------------------- // Enchant UI (RagExe 2021-11-03 or newer.) if ( countitem( 2375 ) || countitem( 2433 ) || countitem( 5808 ) || countitem( 2537 ) || countitem( 2729 ) || countitem( 2374 ) ) { item_enchant 68; end; } //------------------------------------------------------------------------------------- } // Duplicates //============================================================ prt_in,28,73,4 duplicate(Enchant Expert) Enchant Expert#prt VH_H_HUNTER_EV Add enchant in DB: rathena\db\import\item_enchant.yml # This file is a part of rAthena. # Copyright(C) 2022 rAthena Development Team # https://rathena.org - https://github.com/rathena # # 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/>. # ########################################################################### # Item Enchant Database ########################################################################### # # Item Enchant Settings # ########################################################################### # - Id Client side LUA index. # TargetItems: List of possible target items. # <item name> Item name of possible target item. # MinimumRefine Minimum refine of the target item. (Default: 0) # MinimumEnchantgrade Minimum enchant grade of the target item. (Default: 0) # AllowRandomOptions Enable random options in the target item. (Default: true) # Reset: Reset options. (Default: null) # Chance Chance of successful reset. (Default: 0) # Price Price for resetting enchants. (Default: 0) # Materials: Items required for resetting enchants. (Default: null) # - Material Item name of the required item. # Amount Amount of the required item. (Default: 1) # Order: Order in which the slots can be enchanted. # Overwriting via import will clear the currently defined order. # - Slot Number of the slot (0-3). # Slots: Enchant options. # - Slot Number of the slot (0-3). # Price Price required for the normal enchant process. (Default: 0) # Materials: Items required for the normal enchant process. (Default: null) # - Material Item name of the required item. # Amount Amount of the required item. (Default: 1) # Chance Base chance for the normal enchant process. (Default: 100000) # EnchantgradeBonus: Additional bonus chance increase per enchant grade. (Default: null) # - Enchantgrade Enchant grade required for the bonus. # Chance Additional chance that is added to the base chance. # Enchants: Available enchants for the normal enchant process per enchant grade. (Default: null) # - Enchantgrade Enchant grade of the item to be enchanted. # Items: Available enchants for the normal enchant process on the given enchant grade. (Default: null) # - Item Item name of the available enchant item. # Chance Chance to get this specific enchant item. # PerfectEnchants: Available perfect enchants (100% chance + selectable) for this slot. (Default: null) # - Item Item name of the available enchant item. # Price Price required for this perfect enchant. (Default: 0) # Materials: Items required for this perfect enchant. (Default: null) # - Material Item name of the required item. # Amount Amount of the required item. (Default: 1) # Upgrades: Available enchant upgrades for this slot. (Default: null) # - Enchant Item name of the enchant item available for upgrade. # Upgrade Item name of the enchant it can be upgrade to. # Price Price required for this enchant upgrade. (Default: 0) # Materials: Items required for this enchant upgrade (Default: null) # - Material Item name of the required item. # Amount Amount of the required item. (Default: 1) ########################################################################### Header: Type: ITEM_ENCHANT_DB Version: 1 Body: - Id: 68 TargetItems: Diabolus_Armor: true Diabolus_Boots: true Diabolus_Helmet: true Diabolus_Manteau: true Diabolus_Ring: true Diabolus_Robe: true Reset: Chance: 100000 Price: 3000000 Order: - Slot: 3 - Slot: 2 - Slot: 1 Slots: - Slot: 3 Price: 100000 Enchants: - Enchantgrade: 0 Items: - Item: Strength1 Chance: 12460 - Item: Inteligence1 Chance: 12470 - Item: Agility1 Chance: 12470 - Item: Vitality1 Chance: 12470 - Item: Luck1 Chance: 12460 - Item: Dexterity1 Chance: 12470 - Item: Strength2 Chance: 3500 - Item: Inteligence2 Chance: 3500 - Item: Agility2 Chance: 3500 - Item: Vitality2 Chance: 3500 - Item: Luck2 Chance: 3500 - Item: Dexterity2 Chance: 3500 - Item: Strength3 Chance: 700 - Item: Inteligence3 Chance: 700 - Item: Agility3 Chance: 700 - Item: Vitality3 Chance: 700 - Item: Luck3 Chance: 700 - Item: Dexterity3 Chance: 700 PerfectEnchants: - Item: Strength1 Price: 500000 - Item: Inteligence1 Price: 500000 - Item: Agility1 Price: 500000 - Item: Vitality1 Price: 500000 - Item: Luck1 Price: 500000 - Item: Dexterity1 Price: 500000 - Item: Strength2 Price: 1000000 - Item: Inteligence2 Price: 1000000 - Item: Agility2 Price: 1000000 - Item: Vitality2 Price: 1000000 - Item: Luck2 Price: 1000000 - Item: Dexterity2 Price: 1000000 - Item: Strength3 Price: 3000000 - Item: Inteligence3 Price: 3000000 - Item: Agility3 Price: 3000000 - Item: Vitality3 Price: 3000000 - Item: Luck3 Price: 3000000 - Item: Dexterity3 Price: 3000000 Upgrades: - Enchant: Strength1 Upgrade: Strength2 Price: 500000 - Enchant: Strength2 Upgrade: Strength3 Price: 1000000 - Enchant: Inteligence1 Upgrade: Inteligence2 Price: 500000 - Enchant: Inteligence2 Upgrade: Inteligence3 Price: 1000000 - Enchant: Agility1 Upgrade: Agility2 Price: 500000 - Enchant: Agility2 Upgrade: Agility3 Price: 1000000 - Enchant: Vitality1 Upgrade: Vitality2 Price: 500000 - Enchant: Vitality2 Upgrade: Vitality3 Price: 1000000 - Enchant: Luck1 Upgrade: Luck2 Price: 500000 - Enchant: Luck2 Upgrade: Luck3 Price: 1000000 - Enchant: Dexterity1 Upgrade: Dexterity2 Price: 500000 - Enchant: Dexterity2 Upgrade: Dexterity3 Price: 1000000 - Slot: 2 Price: 200000 Enchants: - Enchantgrade: 0 Items: - Item: Strength1 Chance: 12460 - Item: Inteligence1 Chance: 12470 - Item: Agility1 Chance: 12470 - Item: Vitality1 Chance: 12470 - Item: Luck1 Chance: 12460 - Item: Dexterity1 Chance: 12470 - Item: Strength2 Chance: 3500 - Item: Inteligence2 Chance: 3500 - Item: Agility2 Chance: 3500 - Item: Vitality2 Chance: 3500 - Item: Luck2 Chance: 3500 - Item: Dexterity2 Chance: 3500 - Item: Strength3 Chance: 700 - Item: Inteligence3 Chance: 700 - Item: Agility3 Chance: 700 - Item: Vitality3 Chance: 700 - Item: Luck3 Chance: 700 - Item: Dexterity3 Chance: 700 PerfectEnchants: - Item: Strength1 Price: 500000 - Item: Inteligence1 Price: 500000 - Item: Agility1 Price: 500000 - Item: Vitality1 Price: 500000 - Item: Luck1 Price: 500000 - Item: Dexterity1 Price: 500000 - Item: Strength2 Price: 1000000 - Item: Inteligence2 Price: 1000000 - Item: Agility2 Price: 1000000 - Item: Vitality2 Price: 1000000 - Item: Luck2 Price: 1000000 - Item: Dexterity2 Price: 1000000 - Item: Strength3 Price: 3000000 - Item: Inteligence3 Price: 3000000 - Item: Agility3 Price: 3000000 - Item: Vitality3 Price: 3000000 - Item: Luck3 Price: 3000000 - Item: Dexterity3 Price: 3000000 Upgrades: - Enchant: Strength1 Upgrade: Strength2 Price: 500000 - Enchant: Strength2 Upgrade: Strength3 Price: 1000000 - Enchant: Inteligence1 Upgrade: Inteligence2 Price: 500000 - Enchant: Inteligence2 Upgrade: Inteligence3 Price: 1000000 - Enchant: Agility1 Upgrade: Agility2 Price: 500000 - Enchant: Agility2 Upgrade: Agility3 Price: 1000000 - Enchant: Vitality1 Upgrade: Vitality2 Price: 500000 - Enchant: Vitality2 Upgrade: Vitality3 Price: 1000000 - Enchant: Luck1 Upgrade: Luck2 Price: 500000 - Enchant: Luck2 Upgrade: Luck3 Price: 1000000 - Enchant: Dexterity1 Upgrade: Dexterity2 Price: 500000 - Enchant: Dexterity2 Upgrade: Dexterity3 Price: 1000000 - Slot: 1 Price: 300000 Enchants: - Enchantgrade: 0 Items: - Item: Strength1 Chance: 12460 - Item: Inteligence1 Chance: 12470 - Item: Agility1 Chance: 12470 - Item: Vitality1 Chance: 12470 - Item: Luck1 Chance: 12460 - Item: Dexterity1 Chance: 12470 - Item: Strength2 Chance: 3500 - Item: Inteligence2 Chance: 3500 - Item: Agility2 Chance: 3500 - Item: Vitality2 Chance: 3500 - Item: Luck2 Chance: 3500 - Item: Dexterity2 Chance: 3500 - Item: Strength3 Chance: 700 - Item: Inteligence3 Chance: 700 - Item: Agility3 Chance: 700 - Item: Vitality3 Chance: 700 - Item: Luck3 Chance: 700 - Item: Dexterity3 Chance: 700 PerfectEnchants: - Item: Strength1 Price: 500000 - Item: Inteligence1 Price: 500000 - Item: Agility1 Price: 500000 - Item: Vitality1 Price: 500000 - Item: Luck1 Price: 500000 - Item: Dexterity1 Price: 500000 - Item: Strength2 Price: 1000000 - Item: Inteligence2 Price: 1000000 - Item: Agility2 Price: 1000000 - Item: Vitality2 Price: 1000000 - Item: Luck2 Price: 1000000 - Item: Dexterity2 Price: 1000000 - Item: Strength3 Price: 3000000 - Item: Inteligence3 Price: 3000000 - Item: Agility3 Price: 3000000 - Item: Vitality3 Price: 3000000 - Item: Luck3 Price: 3000000 - Item: Dexterity3 Price: 3000000 Upgrades: - Enchant: Strength1 Upgrade: Strength2 Price: 500000 - Enchant: Strength2 Upgrade: Strength3 Price: 1000000 - Enchant: Inteligence1 Upgrade: Inteligence2 Price: 500000 - Enchant: Inteligence2 Upgrade: Inteligence3 Price: 1000000 - Enchant: Agility1 Upgrade: Agility2 Price: 500000 - Enchant: Agility2 Upgrade: Agility3 Price: 1000000 - Enchant: Vitality1 Upgrade: Vitality2 Price: 500000 - Enchant: Vitality2 Upgrade: Vitality3 Price: 1000000 - Enchant: Luck1 Upgrade: Luck2 Price: 500000 - Enchant: Luck2 Upgrade: Luck3 Price: 1000000 - Enchant: Dexterity1 Upgrade: Dexterity2 Price: 500000 - Enchant: Dexterity2 Upgrade: Dexterity3 Price: 1000000 You need add item in Data\luafiles514\lua files\ItemDBNameTbl.lub and enchant in Data\luafiles514\lua files\Enchant\EnchantList.lub Example: ItemDBNameTbl.lub: F_Ein_Weapon_Hammer = 102124, Diabolus_Armor = 2375, Diabolus_Boots = 2433, Diabolus_Helmet = 5808, Diabolus_Manteau = 2537, Diabolus_Ring = 2729, Diabolus_Robe = 2374 EnchantList.lub: Table[68] = CreateEnchantInfo() Table[68]:SetSlotOrder(3, 2, 1) Table[68]:AddTargetItem("Diabolus_Armor") Table[68]:AddTargetItem("Diabolus_Boots") Table[68]:AddTargetItem("Diabolus_Helmet") Table[68]:AddTargetItem("Diabolus_Manteau") Table[68]:AddTargetItem("Diabolus_Ring") Table[68]:AddTargetItem("Diabolus_Robe") Table[68]:SetCondition(0, 0) Table[68]:ApproveRandomOption(true) Table[68]:SetReset(true, 100000, 3000000) Table[68]:SetCaution("Diabolus Set Enchantment\nSuccess Chance: 100%\nReset Chance: 100%, will not be destroyed on failure") Table[68].Slot[3]:SetRequire(100000) Table[68].Slot[3]:SetSuccessRate(100000) Table[68].Slot[3]:SetGradeBonus(1, 0) Table[68].Slot[3]:SetGradeBonus(2, 0) Table[68].Slot[3]:SetGradeBonus(3, 0) Table[68].Slot[3]:SetGradeBonus(4, 0) Table[68].Slot[3]:SetEnchant(0, "Èû1", 12460) Table[68].Slot[3]:SetEnchant(0, "ÀÎÆ®1", 12470) Table[68].Slot[3]:SetEnchant(0, "¾îÁú1", 12470) Table[68].Slot[3]:SetEnchant(0, "¹ÙÅ»1", 12470) Table[68].Slot[3]:SetEnchant(0, "·°1", 12460) Table[68].Slot[3]:SetEnchant(0, "µ¦1", 12470) Table[68].Slot[3]:SetEnchant(0, "Èû2", 3500) Table[68].Slot[3]:SetEnchant(0, "ÀÎÆ®2", 3500) Table[68].Slot[3]:SetEnchant(0, "¾îÁú2", 3500) Table[68].Slot[3]:SetEnchant(0, "¹ÙÅ»2", 3500) Table[68].Slot[3]:SetEnchant(0, "·°2", 3500) Table[68].Slot[3]:SetEnchant(0, "µ¦2", 3500) Table[68].Slot[3]:SetEnchant(0, "Èû3", 700) Table[68].Slot[3]:SetEnchant(0, "ÀÎÆ®3", 700) Table[68].Slot[3]:SetEnchant(0, "¾îÁú3", 700) Table[68].Slot[3]:SetEnchant(0, "¹ÙÅ»3", 700) Table[68].Slot[3]:SetEnchant(0, "·°3", 700) Table[68].Slot[3]:SetEnchant(0, "µ¦3", 700) Table[68].Slot[3]:AddPerfectEnchant("Èû1", 500000) Table[68].Slot[3]:AddPerfectEnchant("ÀÎÆ®1", 500000) Table[68].Slot[3]:AddPerfectEnchant("¾îÁú1", 500000) Table[68].Slot[3]:AddPerfectEnchant("¹ÙÅ»1", 500000) Table[68].Slot[3]:AddPerfectEnchant("·°1", 500000) Table[68].Slot[3]:AddPerfectEnchant("µ¦1", 500000) Table[68].Slot[3]:AddPerfectEnchant("Èû2", 1000000) Table[68].Slot[3]:AddPerfectEnchant("ÀÎÆ®2", 1000000) Table[68].Slot[3]:AddPerfectEnchant("¾îÁú2", 1000000) Table[68].Slot[3]:AddPerfectEnchant("¹ÙÅ»2", 1000000) Table[68].Slot[3]:AddPerfectEnchant("·°2", 1000000) Table[68].Slot[3]:AddPerfectEnchant("µ¦2", 1000000) Table[68].Slot[3]:AddPerfectEnchant("Èû3", 3000000) Table[68].Slot[3]:AddPerfectEnchant("ÀÎÆ®3", 3000000) Table[68].Slot[3]:AddPerfectEnchant("¾îÁú3", 3000000) Table[68].Slot[3]:AddPerfectEnchant("¹ÙÅ»3", 3000000) Table[68].Slot[3]:AddPerfectEnchant("·°3", 3000000) Table[68].Slot[3]:AddPerfectEnchant("µ¦3", 3000000) Table[68].Slot[3]:AddUpgradeEnchant("Èû1", "Èû2", 500000) Table[68].Slot[3]:AddUpgradeEnchant("Èû2", "Èû3", 1000000) Table[68].Slot[3]:AddUpgradeEnchant("ÀÎÆ®1", "ÀÎÆ®2", 500000) Table[68].Slot[3]:AddUpgradeEnchant("ÀÎÆ®2", "ÀÎÆ®3", 1000000) Table[68].Slot[3]:AddUpgradeEnchant("¾îÁú1", "¾îÁú2", 500000) Table[68].Slot[3]:AddUpgradeEnchant("¾îÁú2", "¾îÁú3", 1000000) Table[68].Slot[3]:AddUpgradeEnchant("¹ÙÅ»1", "¹ÙÅ»2", 500000) Table[68].Slot[3]:AddUpgradeEnchant("¹ÙÅ»2", "¹ÙÅ»3", 1000000) Table[68].Slot[3]:AddUpgradeEnchant("·°1", "·°2", 500000) Table[68].Slot[3]:AddUpgradeEnchant("·°2", "·°3", 1000000) Table[68].Slot[3]:AddUpgradeEnchant("µ¦1", "µ¦2", 500000) Table[68].Slot[3]:AddUpgradeEnchant("µ¦2", "µ¦3", 1000000) Table[68].Slot[2]:SetRequire(200000) Table[68].Slot[2]:SetSuccessRate(100000) Table[68].Slot[2]:SetGradeBonus(1, 0) Table[68].Slot[2]:SetGradeBonus(2, 0) Table[68].Slot[2]:SetGradeBonus(3, 0) Table[68].Slot[2]:SetGradeBonus(4, 0) Table[68].Slot[2]:SetEnchant(0, "Èû1", 12460) Table[68].Slot[2]:SetEnchant(0, "ÀÎÆ®1", 12470) Table[68].Slot[2]:SetEnchant(0, "¾îÁú1", 12470) Table[68].Slot[2]:SetEnchant(0, "¹ÙÅ»1", 12470) Table[68].Slot[2]:SetEnchant(0, "·°1", 12460) Table[68].Slot[2]:SetEnchant(0, "µ¦1", 12470) Table[68].Slot[2]:SetEnchant(0, "Èû2", 3500) Table[68].Slot[2]:SetEnchant(0, "ÀÎÆ®2", 3500) Table[68].Slot[2]:SetEnchant(0, "¾îÁú2", 3500) Table[68].Slot[2]:SetEnchant(0, "¹ÙÅ»2", 3500) Table[68].Slot[2]:SetEnchant(0, "·°2", 3500) Table[68].Slot[2]:SetEnchant(0, "µ¦2", 3500) Table[68].Slot[2]:SetEnchant(0, "Èû3", 700) Table[68].Slot[2]:SetEnchant(0, "ÀÎÆ®3", 700) Table[68].Slot[2]:SetEnchant(0, "¾îÁú3", 700) Table[68].Slot[2]:SetEnchant(0, "¹ÙÅ»3", 700) Table[68].Slot[2]:SetEnchant(0, "·°3", 700) Table[68].Slot[2]:SetEnchant(0, "µ¦3", 700) Table[68].Slot[2]:AddPerfectEnchant("Èû1", 500000) Table[68].Slot[2]:AddPerfectEnchant("ÀÎÆ®1", 500000) Table[68].Slot[2]:AddPerfectEnchant("¾îÁú1", 500000) Table[68].Slot[2]:AddPerfectEnchant("¹ÙÅ»1", 500000) Table[68].Slot[2]:AddPerfectEnchant("·°1", 500000) Table[68].Slot[2]:AddPerfectEnchant("µ¦1", 500000) Table[68].Slot[2]:AddPerfectEnchant("Èû2", 1000000) Table[68].Slot[2]:AddPerfectEnchant("ÀÎÆ®2", 1000000) Table[68].Slot[2]:AddPerfectEnchant("¾îÁú2", 1000000) Table[68].Slot[2]:AddPerfectEnchant("¹ÙÅ»2", 1000000) Table[68].Slot[2]:AddPerfectEnchant("·°2", 1000000) Table[68].Slot[2]:AddPerfectEnchant("µ¦2", 1000000) Table[68].Slot[2]:AddPerfectEnchant("Èû3", 3000000) Table[68].Slot[2]:AddPerfectEnchant("ÀÎÆ®3", 3000000) Table[68].Slot[2]:AddPerfectEnchant("¾îÁú3", 3000000) Table[68].Slot[2]:AddPerfectEnchant("¹ÙÅ»3", 3000000) Table[68].Slot[2]:AddPerfectEnchant("·°3", 3000000) Table[68].Slot[2]:AddPerfectEnchant("µ¦3", 3000000) Table[68].Slot[2]:AddUpgradeEnchant("Èû1", "Èû2", 500000) Table[68].Slot[2]:AddUpgradeEnchant("Èû2", "Èû3", 1000000) Table[68].Slot[2]:AddUpgradeEnchant("ÀÎÆ®1", "ÀÎÆ®2", 500000) Table[68].Slot[2]:AddUpgradeEnchant("ÀÎÆ®2", "ÀÎÆ®3", 1000000) Table[68].Slot[2]:AddUpgradeEnchant("¾îÁú1", "¾îÁú2", 500000) Table[68].Slot[2]:AddUpgradeEnchant("¾îÁú2", "¾îÁú3", 1000000) Table[68].Slot[2]:AddUpgradeEnchant("¹ÙÅ»1", "¹ÙÅ»2", 500000) Table[68].Slot[2]:AddUpgradeEnchant("¹ÙÅ»2", "¹ÙÅ»3", 1000000) Table[68].Slot[2]:AddUpgradeEnchant("·°1", "·°2", 500000) Table[68].Slot[2]:AddUpgradeEnchant("·°2", "·°3", 1000000) Table[68].Slot[2]:AddUpgradeEnchant("µ¦1", "µ¦2", 500000) Table[68].Slot[2]:AddUpgradeEnchant("µ¦2", "µ¦3", 1000000) Table[68].Slot[1]:SetRequire(300000) Table[68].Slot[1]:SetSuccessRate(100000) Table[68].Slot[1]:SetGradeBonus(1, 0) Table[68].Slot[1]:SetGradeBonus(2, 0) Table[68].Slot[1]:SetGradeBonus(3, 0) Table[68].Slot[1]:SetGradeBonus(4, 0) Table[68].Slot[1]:SetEnchant(0, "Èû1", 12460) Table[68].Slot[1]:SetEnchant(0, "ÀÎÆ®1", 12470) Table[68].Slot[1]:SetEnchant(0, "¾îÁú1", 12470) Table[68].Slot[1]:SetEnchant(0, "¹ÙÅ»1", 12470) Table[68].Slot[1]:SetEnchant(0, "·°1", 12460) Table[68].Slot[1]:SetEnchant(0, "µ¦1", 12470) Table[68].Slot[1]:SetEnchant(0, "Èû2", 3500) Table[68].Slot[1]:SetEnchant(0, "ÀÎÆ®2", 3500) Table[68].Slot[1]:SetEnchant(0, "¾îÁú2", 3500) Table[68].Slot[1]:SetEnchant(0, "¹ÙÅ»2", 3500) Table[68].Slot[1]:SetEnchant(0, "·°2", 3500) Table[68].Slot[1]:SetEnchant(0, "µ¦2", 3500) Table[68].Slot[1]:SetEnchant(0, "Èû3", 700) Table[68].Slot[1]:SetEnchant(0, "ÀÎÆ®3", 700) Table[68].Slot[1]:SetEnchant(0, "¾îÁú3", 700) Table[68].Slot[1]:SetEnchant(0, "¹ÙÅ»3", 700) Table[68].Slot[1]:SetEnchant(0, "·°3", 700) Table[68].Slot[1]:SetEnchant(0, "µ¦3", 700) Table[68].Slot[1]:AddPerfectEnchant("Èû1", 500000) Table[68].Slot[1]:AddPerfectEnchant("ÀÎÆ®1", 500000) Table[68].Slot[1]:AddPerfectEnchant("¾îÁú1", 500000) Table[68].Slot[1]:AddPerfectEnchant("¹ÙÅ»1", 500000) Table[68].Slot[1]:AddPerfectEnchant("·°1", 500000) Table[68].Slot[1]:AddPerfectEnchant("µ¦1", 500000) Table[68].Slot[1]:AddPerfectEnchant("Èû2", 1000000) Table[68].Slot[1]:AddPerfectEnchant("ÀÎÆ®2", 1000000) Table[68].Slot[1]:AddPerfectEnchant("¾îÁú2", 1000000) Table[68].Slot[1]:AddPerfectEnchant("¹ÙÅ»2", 1000000) Table[68].Slot[1]:AddPerfectEnchant("·°2", 1000000) Table[68].Slot[1]:AddPerfectEnchant("µ¦2", 1000000) Table[68].Slot[1]:AddPerfectEnchant("Èû3", 3000000) Table[68].Slot[1]:AddPerfectEnchant("ÀÎÆ®3", 3000000) Table[68].Slot[1]:AddPerfectEnchant("¾îÁú3", 3000000) Table[68].Slot[1]:AddPerfectEnchant("¹ÙÅ»3", 3000000) Table[68].Slot[1]:AddPerfectEnchant("·°3", 3000000) Table[68].Slot[1]:AddPerfectEnchant("µ¦3", 3000000) Table[68].Slot[1]:AddUpgradeEnchant("Èû1", "Èû2", 500000) Table[68].Slot[1]:AddUpgradeEnchant("Èû2", "Èû3", 1000000) Table[68].Slot[1]:AddUpgradeEnchant("ÀÎÆ®1", "ÀÎÆ®2", 500000) Table[68].Slot[1]:AddUpgradeEnchant("ÀÎÆ®2", "ÀÎÆ®3", 1000000) Table[68].Slot[1]:AddUpgradeEnchant("¾îÁú1", "¾îÁú2", 500000) Table[68].Slot[1]:AddUpgradeEnchant("¾îÁú2", "¾îÁú3", 1000000) Table[68].Slot[1]:AddUpgradeEnchant("¹ÙÅ»1", "¹ÙÅ»2", 500000) Table[68].Slot[1]:AddUpgradeEnchant("¹ÙÅ»2", "¹ÙÅ»3", 1000000) Table[68].Slot[1]:AddUpgradeEnchant("·°1", "·°2", 500000) Table[68].Slot[1]:AddUpgradeEnchant("·°2", "·°3", 1000000) Table[68].Slot[1]:AddUpgradeEnchant("µ¦1", "µ¦2", 500000) Table[68].Slot[1]:AddUpgradeEnchant("µ¦2", "µ¦3", 1000000)
  4. 1. rathena/src/map/script.hpp Search: HAT_EF_MAX Replace: /* Custom Hateffects */ HAT_EF_arcane_aura_A, HAT_EF_arcane_aura_B, HAT_EF_gluttony_aura_A, HAT_EF_gluttony_aura_B, HAT_EF_MAX = 9999 2. rathena/src/map/script_constants.hpp Search: export_constant(HAT_EF_EFST_C_20TH_ANNIVERSARY_HAT); Replace: export_constant(HAT_EF_EFST_C_20TH_ANNIVERSARY_HAT); /* Custom Hateffects */ export_constant(HAT_EF_arcane_aura_A); export_constant(HAT_EF_arcane_aura_B); export_constant(HAT_EF_gluttony_aura_A); export_constant(HAT_EF_gluttony_aura_B); 3. Compile you Server. 4. Copy in you Data/texture/effect/(arcane_aura) and (gluttony_aura) Data(Example_Auras).zip 5. Data/luafiles514/lua files/hateffectinfo/hateffectinfo.lub Search: HAT_EF_efst_C_20th_Anniversary_Hat = 176 } Replace: HAT_EF_efst_C_20th_Anniversary_Hat = 176, HAT_EF_arcane_aura_A = 177, HAT_EF_arcane_aura_B = 178, HAT_EF_gluttony_aura_A = 179, HAT_EF_gluttony_aura_B = 180 } resourceFileName: route effect(Data/effect/name you effect folder/name you str file.str) IsIgnoreRiding: if true when mounting a mount or asking for hateffect will not go up, it will ignore this action isRenderBeforeCharacter: If true when using hateffect it will be over the character. hatEffectPos: Position the Y anchor (up and down) of the hateffect hatEffectPosX: Positions hateffect X anchor (left right) isAdjustPositionWhenShrinkState: always true isAdjustSizeWhenShrinkState: always true Search: [HatEFID.HAT_EF_efst_C_20th_Anniversary_Hat] = { resourceFileName = "efst_C_20th_Anniversary_Hat\\20th_f.str", hatEffectPos = -6, hatEffectPosX = 0, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true } } Replace: [HatEFID.HAT_EF_efst_C_20th_Anniversary_Hat] = { resourceFileName = "efst_C_20th_Anniversary_Hat\\20th_f.str", hatEffectPos = -6, hatEffectPosX = 0, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_arcane_aura_A] = { resourceFileName = "arcane_aura\\arcane_aura_particle.str", hatEffectPos = -1, hatEffectPosX = 0, isRenderBeforeCharacter = false, isIgnoreRiding = false, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_arcane_aura_B] = { resourceFileName = "arcane_aura\\arcane_aura.str", hatEffectPos = -2, hatEffectPosX = 0.2, isRenderBeforeCharacter = true, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_gluttony_aura_A] = { resourceFileName = "gluttony_aura\\gluttony_aura_particle.str", hatEffectPos = -1, hatEffectPosX = 0, isRenderBeforeCharacter = false, isIgnoreRiding = false, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true }, [HatEFID.HAT_EF_gluttony_aura_B] = { resourceFileName = "gluttony_aura\\gluttony_aura.str", hatEffectPos = -2, hatEffectPosX = 0.2, isRenderBeforeCharacter = true, isIgnoreRiding = true, isAdjustPositionWhenShrinkState = true, isAdjustSizeWhenShrinkState = true } } 6. Add Script NPC: rathena\npc\custom\hateffect.txt (Use command @efc in game) - script HATEFFECT -1,{ OnHatEffect: if(getgmlevel()>= 80){ input [email protected]; if ([email protected] < 1) end; if ([email protected] >= 301) end; for([email protected] = 1; [email protected] < 300; [email protected]) hateffect [email protected],false; hateffect [email protected],true; end; } OnInit: bindatcmd "efc",strnpcinfo(3)+"::OnHatEffect"; end; } 7. Add npc in rathena\npc\scripts_custom.conf npc: npc/custom/hateffect.txt 8. (OPTIONAL) Add Hateffect in item: Example: - Id: 2301 AegisName: Cotton_Shirt Name: Cotton Shirt Type: Armor Buy: 10 Weight: 100 Defense: 1 Locations: Armor: true ArmorLevel: 1 Refineable: true Script: | hateffect HAT_EF_arcane_aura_A,true; hateffect HAT_EF_arcane_aura_B,true; UnEquipScript: | hateffect HAT_EF_arcane_aura_A,false; hateffect HAT_EF_arcane_aura_B,false; Gluttony Aura: Arcane Aura: Credits: LCDTheOG Frost
  5. This bonus is for increase damage in skill. 2% by refine level. bonus2 bSkillAtk,"SKILL NAME",2+getrefine(); For increase elemental damage try: bonus2 bMagicAtkEle,Ele_Holy,2+getrefine();
  6. With Notepad++ Search: mes " > Replace: mes ">
  7. In new client no use in script npc "space" at first. Exemple. No: mes " Hello my name is."; mes " Khyle."; Yes: mes "Hello my name is."; mmes"Khyle";
  8. Use this Guide for add new Hateffects and my example aura. In rathena/src/map/Script.hpp change: EF_MAX for EF_MAX = 9999 HAT_EF_MAX for HAT_EF_MAX = 9999 and compile you server.
  9. Cards in db/re(or pre-re)/item_db_etc.yml import/item_db.yml use for you add items custom(Equip/Etc/Usable).
  10. Use STR Editor and add image in .bmp or .tga. This example is Aura Compilation Data(ExampleAura).7z
  11. Create as HatEffect: (Exemple)
  12. Change: MaxRandom: 1 Random: For: MaxRandom: 1 Random: Repect space. item_randomopt_group.yml
  13. Try. Create Script: function script F_SpecialBonus { OnPCLoginEvent: if (readparam(bDex)>=99) { bonus bDelayRate,-100; bonus bVariableCastrate,-100; } end; } If no work fuction change: function script F_SpecialBonus { for - script Special_Bonus -1, { Too try in conf/battle/skill.conf for instant cast: // Does the delay time depend on the caster's DEX and/or AGI? (Note 1) // Note: On Official servers, neither Dex nor Agi affect delay time delay_dependon_dex: yes delay_dependon_agi: yes
  14. Create script: function script F_SpecialBonus { if (readparam(bDex)>=99) { bonus bDelayRate,-100; bonus bVariableCastrate,-100; } } Call in item_db.yml: Script: | callfunc "F_SpecialBonus";
  15. Try. (Instant Cast) Script: | if (readparam(bDex)>=99) { bonus bDelayRate,-100; bonus bVariableCastrate,-100; }
  16. Try. Script: | if (readparam(bAgi)>=99) { bonus bAllStats,100; } Instant Cast: Script: | if (readparam(bAgi)>=99) { bonus bDelayRate,-100; bonus bVariableCastrate,-100; }
  17. Use Class == Job... Check for more bonus: here
  18. Delete folder Ragnarok Online/savedata
  19. @Bodystyle for all Class, change in src/map/atcommand.cpp Search: if ( (sd->class_ & JOBL_FOURTH) || !(sd->class_ & JOBL_THIRD) || (sd->class_ & MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E || (sd->class_ & MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || (sd->class_ & MAPID_THIRDMASK) == MAPID_SOUL_REAPER) { clif_displaymessage(fd, msg_txt(sd,740)); // This job has no alternate body styles. return -1; } Replace: /*if ( (sd->class_ & JOBL_FOURTH) || !(sd->class_ & JOBL_THIRD) || (sd->class_ & MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E || (sd->class_ & MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || (sd->class_ & MAPID_THIRDMASK) == MAPID_SOUL_REAPER) { clif_displaymessage(fd, msg_txt(sd,740)); // This job has no alternate body styles. return -1; }*/ Pallete color for bodystyle 1 copy in Data/palette/¸ö/costume_1: Example Paladin: copy pallete Royal Guard and change name for sprite Paladin. Male: Basic + Mount Lion Æȶóµò_³²_0_1.pal Æȶóµò_³²_1_1.pal Æȶóµò_³²_2_1.pal Æȶóµò_³²_3_1.pal Female: Basic + Mount Lion Æȶóµò_¿©_0_1.pal Æȶóµò_¿©_1_1.pal Æȶóµò_¿©_2_1.pal Æȶóµò_¿©_3_1.pal Male: Peco Mount ÆäÄÚÆȶóµò_³²_0_1.pal ÆäÄÚÆȶóµò_³²_1_1.pal ÆäÄÚÆȶóµò_³²_2_1.pal ÆäÄÚÆȶóµò_³²_3_1.pal Female: Peco Mount ÆäÄÚÆȶóµò_¿©_0_1.pal ÆäÄÚÆȶóµò_¿©_1_1.pal ÆäÄÚÆȶóµò_¿©_2_1.pal ÆäÄÚÆȶóµò_¿©_3_1.pal Name Sprite Bible
  20. Script: | bonus bInt,3; bonus bMatkRate,15; if (class == Job_Soul_Linker){ bonus2 bSkillAtk,"SL_SMA",25; bonus2 bSkillAtk,"SL_STUN",25;} if (class == Job_High_Wizard){ bonus2 bSkillAtk," ",25; bonus2 bSkillAtk," ",25;} if (class == Job_High_Priest){ bonus2 bSkillAtk," ",25;}
  21. Use: (Example) EquipScript: | changebase Job_Baby_Rune_Knight; UnEquipScript: | changebase Class;
  22. Use this metod: https://github.com/llchrisll/rAthena-Scripts/tree/master/requests/Rebirth Job Suits
  23. Jobmaster change for Zeny: - First Job: 15.000z - Second Job: 250.000z - Third Job: 1.000.000z - Rebirth: 1.285.000z + Heroic Stone. Change price: setarray .cost, // Cost for Jobchange 15000, // To First Job 250000, // To Second Job 1000000, // To Third Job 1285000; // To Rebirth setarray .rebirthRequiredItemId[0],7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825; // Item Requeriment for Rebirth. Change for Pre-Renewal: // Settings .ThirdClass = false; // Enable third classes? .RebirthClass = true; // Enable rebirth classes? .SecondExpanded = false; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion? .BabyNovice = true; // Enable Baby novice classes? Disable it if you like player must have parent to get job baby. .BabyClass = true; // Enable Baby classes? .BabyThird = false; // Enable Baby third classes? .BabyExpanded = false; // Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc. .BabySummoner = false; // Enable Baby Summoner? .LastJob = true; // Enforce linear class changes? .SkillPointCheck = true; // Force player to use up all skill points? .Platinum = false; // Get platinum skills automatically? .GetJobEquip = true; // Get job equipment (mostly weapons) on job change? Change for Renewal: // Settings .ThirdClass = true; // Enable third classes? .RebirthClass = true; // Enable rebirth classes? .SecondExpanded = true; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion? .BabyNovice = true; // Enable Baby novice classes? Disable it if you like player must have parent to get job baby. .BabyClass = true; // Enable Baby classes? .BabyThird = true; // Enable Baby third classes? .BabyExpanded = true; // Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc. .BabySummoner = true; // Enable Baby Summoner? .LastJob = true; // Enforce linear class changes? .SkillPointCheck = true; // Force player to use up all skill points? .Platinum = false; // Get platinum skills automatically? .GetJobEquip = true; // Get job equipment (mostly weapons) on job change? //===== rAthena Script ======================================= //= Job Master //===== Description: ========================================= //= A fully functional job changer. //===== Additional Comments: ================================= //= 1.0 Initial script. [Euphy] //= 1.1 Fixed reset on Baby job change. //= 1.2 Added Expanded Super Novice support and initial Kagerou/Oboro support. //= 1.3 Kagerou/Oboro added. //= 1.4 Rebellion added. //= 1.5 Added option to disable RebirthClass. [mazvi] //= 1.6 Added option to get job related equipment on change. [Braniff] //= 1.7 Readability changes. Also added BabyExpanded and BabySummoner classes. [Jey] //= 1.8 Added option to disable Baby Novice Only but Baby Class can be Enabled [mazvi] //= 1.9 Migrate/Integrate to Global Functions Platinum Skills. [mazvi] //============================================================ prontera,153,193,6 script Job Master 123,{ function Get_Job_Equip; // Checks if the Player has the required level. // closes if not, returns if yes function Require_Level { if (BaseLevel < getarg(0) || JobLevel < getarg(1)) { [email protected] = getarg(0) - BaseLevel; [email protected] = getarg(1) - JobLevel; mes "Level requirement:"; mes ((getarg(0)>1)? "^bb0000"+getarg(0)+"^000000 (^bb0000Base^000000) / ":"")+"^00bb00"+ getarg(1)+"^000000 (^00bb00Job^000000)"; mes "You need " + (([email protected] > 0) ? "^bb0000"[email protected]+"^000000 more base levels " + (([email protected] > 0) ? "and " : "") : "") + (([email protected] > 0) ? "^00bb00"[email protected]+"^000000 more job levels " : "") + "to continue."; close; } return; } // Checks if the given eac is a baby class function Is_Baby { return ((getarg(0, eaclass())&EAJL_BABY)>0); } // Checks if the player can change to third class. // Note: This does not include the level checks. function Can_Change_Third { // To change to third class you either need to be: // * Second Class // * Transcendent Second Class // * Baby Second Class if( !.ThirdClass ) return false; // Third job change disabled if( !(eaclass()&EAJL_2) ) return false; // Not second Class if( eaclass()&EAJL_THIRD ) return false; // Already Third Class if( roclass(eaclass()|EAJL_THIRD) < 0 ) return false; // Job has no third Class if( (eaclass()&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE ) return false; // Exp. Super Novice equals 3rd Cls, but has it's own case if( Is_Baby() && (!.BabyClass || !.BabyThird) ) return false; // No Baby (Third) change allowed return true; } function Can_Rebirth { // To rebirth, you need to be: // * Second Class if( !.RebirthClass ) return false; // Rebirth disabled if( !(eaclass()&EAJL_2) ) return false; // Not second Class if( eaclass()&(EAJL_UPPER|EAJL_THIRD) ) return false; // Already Rebirthed/ Third Class if( roclass(eaclass()|EAJL_UPPER) < 0 ) return false; // Job has no transcended class if( Is_Baby() && !.BabyClass ) return false; // No Baby changes allowed return true; } // Checks if the given eac is a first class function Is_First_Cls { return (getarg(0) <= EAJ_TAEKWON); } function Check_Riding { // Note: Why we should always check for Riding: // Mounts are considered as another class, which // would make this NPC bigger just to handle with // those special cases. if (checkfalcon() || checkcart() || checkriding() || ismounting()) { mes "Please remove your ^ff0000" + ((checkfalcon()) ? "falcon" : "") + ((checkcart()) ? "cart" : "") + ((checkriding()) ? "Peco" : "") + ((ismounting()) ? "mount" : "") + "^000000 before proceeding."; close; } return; } function Check_SkillPoints { if (.SkillPointCheck && SkillPoint) { mes "Please use all your ^ff0000skill points^000000 before proceeding."; close; } return; } // addJobOptions is essentially the same like // setarray [email protected][getarraysize([email protected])],opt1,opt2,...; // It's just easier to read, since we're using it very often function Job_Options { [email protected]argcount = getargcount(); [email protected]_size = getarraysize(getarg(0)); for( [email protected] = 1; [email protected] < [email protected]; [email protected]++) { setarray getelementofarray(getarg(0), [email protected]_size++),getarg([email protected]); } } // Begin of the NPC mes .NPCName$; Check_Riding(); Check_SkillPoints(); // initialisation [email protected] = eaclass(); [email protected]_possible = Can_Change_Third(); [email protected]_possible = Can_Rebirth(); [email protected]_eac = [email protected]&EAJ_BASEMASK; [email protected]_eac = [email protected]&EAJ_UPPERMASK; // Note: These are already set in pc.cpp // BaseClass = roclass([email protected]&EAJ_BASEMASK) which is the players First Class // BaseJob = roclass([email protected]&EAJ_UPPERMASK) which is the players Second Class //dispbottom "Debug: eac ("[email protected]+"), third ("[email protected]_possible+"), rebirth("[email protected]_possible+"), BaseClass ("+BaseClass+"), BaseJob ("+BaseJob+")"; // From here on the jobmaster checks the current class // and fills the the array `[email protected]_opt` with possible // job options for the player. if( [email protected]_possible ) { // Rebirth option (displayed on the top of the menu) Require_Level(.Req_Rebirth[0], .Req_Rebirth[1]); Job_Options([email protected]_opt, Job_Novice_High); } if( [email protected]_possible ) { // Third Job change (displayed below rebirth) Require_Level(.Req_Third[0], .Req_Third[1]); Job_Options([email protected]_opt, roclass([email protected]|EAJL_THIRD)); } if (.SecondExpanded && ([email protected]&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE && // is Super Novice !(eaclass()&EAJL_THIRD) ) { // not already Expanded SN // (Baby) Super Novice to Expanded (Baby) Super Novice if( !Is_Baby([email protected]) || (.BabyClass && .BabyExpanded) ) { // .BabyClass & .BabyExpanded must be enabled if the is a baby Require_Level(.Req_Exp_SNOVI[0], .Req_Exp_SNOVI[1]); Job_Options([email protected]_opt,roclass([email protected]|EAJL_THIRD)); // Expanded SN is "third" cls } } if (.SecondExpanded && (([email protected]&(~EAJL_BABY)) == EAJ_NINJA || // is (Baby) Ninja ([email protected]&(~EAJL_BABY)) == EAJ_GUNSLINGER)) { // is (Baby) Gunslinger // (Baby) Ninja to (Baby) Kagerou / Oboro // (Baby) Gunslinger to (Baby) Rebellion if( !Is_Baby([email protected]) || (.BabyClass && .BabyExpanded) ) { // .BabyClass & .BabyExpanded must be enabled if the is a baby Require_Level(.Req_Exp_NJ_GS[0], .Req_Exp_NJ_GS[1]); // Kagerou, Oboro, Rebellion are considered as a 2-1 class Job_Options([email protected]_opt, roclass([email protected]|EAJL_2_1)); } } // Player is Job_Novice, Job_Novice_High or Job_Baby if ([email protected]_eac == EAJ_NOVICE && [email protected]_eac != EAJ_SUPER_NOVICE) { // MAPID_NOVICE, MAPID_SUPER_NOVICE, MAPID_NOVICE_HIGH, MAPID_BABY Require_Level(.Req_First[0], .Req_First[1]); switch(Class) { case Job_Novice: // First job change Job_Options([email protected]_opt,Job_Swordman, Job_Mage, Job_Archer, Job_Acolyte, Job_Merchant, Job_Thief, Job_Super_Novice, Job_Taekwon, Job_Gunslinger, Job_Ninja); if( .BabyNovice ) Job_Options([email protected]_opt, Job_Baby); break; case Job_Novice_High: // Job change after rebirth if( .LastJob && lastJob ) Job_Options([email protected]_opt, roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER)); else Job_Options([email protected]_opt, Job_Swordman_High, Job_Mage_High, Job_Archer_High, Job_Acolyte_High, Job_Merchant_High, Job_Thief_High); break; case Job_Baby: if( !.BabyClass ) break; // First job change as a baby Job_Options([email protected]_opt, Job_Baby_Swordman, Job_Baby_Mage, Job_Baby_Archer,Job_Baby_Acolyte, Job_Baby_Merchant, Job_Baby_Thief); if( .BabyExpanded ) Job_Options([email protected]_opt, Job_Super_Baby, Job_Baby_Taekwon, Job_Baby_Gunslinger, Job_Baby_Ninja); if( .BabySummoner ) Job_Options([email protected]_opt, Job_Baby_Summoner); break; default: mes "An error has occurred."; close; } } else if( Is_First_Cls([email protected]) || // First Class Is_First_Cls([email protected]&(~EAJL_UPPER)) || // Trans. First Cls (.BabyClass && Is_First_Cls([email protected]&(~EAJL_BABY))) ) { // Baby First Cls // Player is First Class (not Novice) // most jobs should have two options here (2-1 and 2-2) [email protected] = roclass([email protected]|EAJL_2_1); // 2-1 [email protected] = roclass([email protected]|EAJL_2_2); // 2-2 // dispbottom "Debug: Classes: class1 ("[email protected]+"), class2 ("[email protected]+")"; if(.LastJob && lastJob && ([email protected]&EAJL_UPPER)) { // Player is rebirth Cls and linear class changes are enforced Require_Level(.Req_Second[0], .Req_Second[1]); Job_Options([email protected]_opt, lastJob + Job_Novice_High); } else { // Class is not enforced, player can decide. if( [email protected] > 0 ) { // 2-1 Require_Level(.Req_Second[0], .Req_Second[1]); Job_Options([email protected]_opt, [email protected]); } if( [email protected] > 0 ) { // 2-2 Require_Level(.Req_Second[0], .Req_Second[1]); Job_Options([email protected]_opt, [email protected]); } } } // Displaying the Job Menu defined by [email protected]_opt. // [email protected]_opt should not be changed below this line. function Job_Menu; Job_Menu([email protected]_opt); close; // Displays the job menu function Job_Menu { function Confirm_Change; while(true) { mes "I can train you to get stronger ^008aff"+strcharinfo(0)+"^000000!."; mes "You don't even have to complete a quest!"; mes "..."; next; mes .NPCName$; mes "Prices:^ff0000$^000000"; mes "- First Class = ^ff0000"+.cost[0]+"^000000z"; mes "- Second Class = ^ff0000"+.cost[1]+"^000000z"; mes "- Third Class = ^ff0000"+.cost[2]+"^000000z"; mes "- Rebirth = ^ff0000"+getitemname(.rebirthRequiredItemId[0])+"^000000 & ^ff0000"+.cost[3]+"^000000z."; next; Check_Riding(); Check_SkillPoints(); // getarg(0) is the [email protected]_opt array holding all available job changes. [email protected]_cnt = getarraysize(getarg(0)); if( [email protected]_cnt <= 0 ) { mes .NPCName$; mes "No more jobs are available."; close; } [email protected] = 0; // Just a single job class given, no select needed if ([email protected]_cnt > 1) { // Multiple job classes given. Select one and save it to [email protected] // After that confirm [email protected] mes .NPCName$; mes "Select a job."; [email protected]$ = ""; for ([email protected] = 0; [email protected] < [email protected]_cnt; [email protected]++) { if( getelementofarray(getarg(0), [email protected]) == Job_Novice_High) [email protected]$ = "^0055FFRebirth^000000"; else [email protected]$ = jobname(getelementofarray(getarg(0), [email protected])); [email protected]$ = [email protected]$ + .bcor$+" " + [email protected]$ + ":"; } [email protected]$ = [email protected]$+ .rcor$+" ^777777Cancel^000000"; [email protected] = select([email protected]$) - 1; if( [email protected] < 0 || [email protected] >= [email protected]_cnt ) close; next; } [email protected] = getelementofarray(getarg(0), [email protected]); if (([email protected] == Job_Super_Novice || [email protected] == Job_Super_Baby) && BaseLevel < .SNovice) { // Special Level Requirement because Super Novice and // Super Baby can both be selected in one of the first class // changes. That's why the Level Requirement is after and not before // the selection. mes .NPCName$; mes "A base level of ^ff0000" + .SNovice + "^000000 is required to turn into a ^008aff" + jobname([email protected]) + "^000000."; return; } // Confirm the Class Confirm_Change([email protected], [email protected]_cnt > 1); next; mes .NPCName$; } return; } // Executes the actual jobchange and closes. function Job_Change { [email protected]_class = Class; [email protected]_cls = getarg(0); if ( ([email protected]_cls >= Job_Swordman && [email protected]_cls <= Job_Thief) || ([email protected]_cls >= Job_Gunslinger && [email protected]_cls <= Job_Ninja) || [email protected]_cls == Job_Taekwon || ([email protected]_cls >= Job_Swordman_High && [email protected]_cls <= Job_Thief_High) || ([email protected]_cls >= Job_Baby && [email protected]_cls <= Job_Baby_Thief) || [email protected]_cls == Job_Baby_Gunslinger || [email protected]_cls == Job_Baby_Ninja || [email protected]_cls == Job_Baby_Taekwon ) { .costamount = .cost[0]; } else if ( ([email protected]_cls >= Job_Knight && [email protected]_cls <= Job_Crusader2) || ([email protected]_cls >= Job_Lord_Knight && [email protected]_cls <= Job_Paladin2) || ([email protected]_cls >= Job_Star_Gladiator && [email protected]_cls <= Job_Soul_Linker) || ([email protected]_cls >= Job_Kagerou && [email protected]_cls <= Job_Rebellion) || [email protected]_cls == Job_SuperNovice || ([email protected]_cls >= Job_Baby_Knight && [email protected]_cls <= Job_Super_Baby) ) { .costamount = .cost[1]; } else { .costamount = .cost[2]; } if ( ([email protected]_cls == Job_Novice_High && .LastJob) ) { .costamount = .cost[3]; } if ( Zeny < .costamount ) { next; mes .NPCName$; mes "You don't have ^ff0000"+.costamount+"^000000 Zeny!"; close; } next; mes .NPCName$; mes "You are now ^008aff" + callfunc("F_InsertArticle", jobname([email protected]_cls)) + "^000000!"; if ([email protected]_cls == Job_Novice_High && .LastJob) { lastJob = Class; // Saves the lastJob for rebirth } Zeny -= .costamount; jobchange [email protected]_cls; if ([email protected]_cls == Job_Novice_High) resetlvl(1); else if ([email protected]_cls == Job_Baby) { resetstatus; resetskill; set SkillPoint,0; } specialeffect2 EF_ANGEL2; specialeffect2 EF_ELECTRIC; if ([email protected]_class != Class) { if (.Platinum) callfunc "F_GetPlatinumSkills"; if (.GetJobEquip) Get_Job_Equip(); } close; // Always closes after the change } function Confirm_Change { // Player confirms he want to change into [email protected] [email protected] = getarg(0, -1); [email protected] = getarg(1, false); if( [email protected] < 0 || eaclass([email protected]) == -1 ) { mes .NPCName$; mes "Unknown Class Error."; close; } mes .NPCName$; mes "Do you want to change into ^0055FF"+jobname([email protected])+"^000000 class?"; [email protected]_option$ = .bcor$+" Change into ^0055FF"+jobname([email protected])+"^000000 class"; if( [email protected] == Job_Novice_High) [email protected]_option$ = .bcor$+" ^0055FFRebirth^000000"; if (select([email protected]_option$+ ":" + (([email protected]) ?.rcor$+"^777777Go back^000000" : .rcor$+"^777777Cancel^000000") + "") == 1) { if( [email protected] == Job_Novice_High) { if(getarraysize(.rebirthRequiredItemId) > (Class - 7)) //check if required item id have been provided { if ( Zeny < .cost[3] ) { next; mes .NPCName$; mes "You don't have ^ff0000" + callfunc("F_InsertComma",.cost[3]) + "^000000z!"; close; } if(countitem(.rebirthRequiredItemId[Class - 7]) > 0) { next; mes .NPCName$; mes "I see if you have ^ff0000" + getitemname(.rebirthRequiredItemId[0]) + "^000000 + ^ff0000" + callfunc("F_InsertComma",.cost[3]) + "^000000z. ^0055FFGood^000000."; delitem .rebirthRequiredItemId[Class - 7], 1; Job_Change([email protected]); } else { next; mes .NPCName$; mes "You don't have ^ff0000" + getitemname(.rebirthRequiredItemId[0]) + "^000000. Come back with it before asking for ^0055FFRebirth^000000."; close; } } } Job_Change([email protected]); } if ([email protected]) close; // "Cancel" pressed return; } // Function which gives a job related item to the player // the items are the rewards from the original job change quests function Get_Job_Equip { // Note: The item is dropping, when the player can't hold it. // But that's better than not giving the item at all. [email protected] = eaclass(); if( [email protected]&EAJL_THIRD ) { // Third Class Items getitem 2795,1; // Green Apple Ring for every 3rd Class switch(BaseJob) { // BaseJob of Third Cls // For Normal Third, Baby Third and Transcended Third Cls case Job_Knight: getitem 5746,1; break; // Rune Circlet [1] case Job_Wizard: getitem 5753,1; break; // Magic Stone Hat [1] case Job_Hunter: getitem 5748,1; break; // Sniper Goggle [1] case Job_Priest: getitem 5747,1; break; // Mitra [1] case Job_Blacksmith: getitem 5749,1; break; // Driver Band [1] case Job_Assassin: getitem 5755,1; break; // Silent Executor [1] case Job_Crusader: getitem 5757,1; break; // Dip Schmidt Helm [1] case Job_Sage: getitem 5756,1; break; // Wind Whisper [1] case Job_Bard: getitem 5751,1; break; // Maestro Song's Hat [1] case Job_Dancer: getitem 5758,1; break; // Dying Swan [1] case Job_Monk: getitem 5754,1; break; // Blazing Soul [1] case Job_Alchemist: getitem 5752,1; break; // Midas Whisper[1] case Job_Rogue: getitem 5750,1; // Shadow Handicraft [1] getitem 6121,1; // Makeover Brush getitem 6122,1; break; // Paint Brush } } else if ( !([email protected]&EAJL_2) && !([email protected]&EAJL_UPPER) ) { // Not Second Job AND not Rebirth/Third if ( ([email protected]&EAJ_UPPERMASK) == EAJ_SWORDMAN ) { getitem 1101,1; getitem 2101,1; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_MAGE ) { getitem 1601,1; getitem 2101,1; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_ARCHER ) { getitem 1701,1; getitem 1750,500; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_ACOLYTE ) { getitem 1501,1; getitem 2101,1; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_MERCHANT ) { getitem 1301,1; getitem 2101,1; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_THIEF ) { getitem 1201,1; getitem 2101,1; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_GUNSLINGER ) { getitem 13100,1; getitem 13200,500; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_NINJA ) { getitem 13010,1; getitem 2101,1; } else if ( ([email protected]&EAJ_UPPERMASK) == EAJ_TAEKWON ) { getitem 2101,1; } } return; } OnInit: // Initialisation, do not edit these .NPCName$ = "^FF7F00[ Job Master ]^000000"; .bcor$ = "^008aff[>]^000000 "; // Option Button Symbol; .rcor$ = "^ff0000[>]^000000 "; // Cancel button symbol; // Settings .ThirdClass = false; // Enable third classes? .RebirthClass = true; // Enable rebirth classes? .SecondExpanded = false; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion? .BabyNovice = true; // Enable Baby novice classes? Disable it if you like player must have parent to get job baby. .BabyClass = true; // Enable Baby classes? .BabyThird = false; // Enable Baby third classes? .BabyExpanded = false; // Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc. .BabySummoner = false; // Enable Baby Summoner? .LastJob = true; // Enforce linear class changes? .SkillPointCheck = true; // Force player to use up all skill points? .Platinum = false; // Get platinum skills automatically? .GetJobEquip = true; // Get job equipment (mostly weapons) on job change? // Level Requirements setarray .Req_First[0],1,10; // Minimum base level, job level to turn into 1st class setarray .Req_Second[0],1,40; // Minimum base level, job level to turn into 2nd class setarray .Req_Rebirth[0],99,50; // Minimum base level, job level to rebirth setarray .Req_Third[0],99,50; // Minimum base level, job level to change to third class setarray .Req_Exp_NJ_GS[0],99,70; // Minimum base level, job level to turn into Expanded Ninja and Gunslinger setarray .Req_Exp_SNOVI[0],99,99; // Minimum base level, job level to turn into Expanded Super Novice .SNovice = 45; // Minimum base level to turn into Super Novice setarray .cost, // Cost for Jobchange 15000, // To First Job 250000, // To Second Job 1000000, // To Third Job 1285000; // To Rebirth setarray .rebirthRequiredItemId[0],7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825,7825; // Item Requeriment for Rebirth. // Setting adjustments by PACKETVER if( PACKETVER < 20161207 ) { if( .BabyExpanded ) debugmes "jobmaster: BabyExpanded is disabled due to outdated PACKETVER."; if( .BabySummoner ) debugmes "jobmaster: BabySummoner is disabled due to outdated PACKETVER."; .BabyExpanded = false; .BabySummoner = false; } end; } jobmaster.txt
×
×
  • Create New...