diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java index 182dcd22149754eb06f1033b0faba5c6f06a4641..e8e27a0dfe5f5824b95418ff2f0a91fd60f1746a 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -88,6 +88,7 @@ public final class EffectMasterHandler FakeDeath.class, FatalBlow.class, Fear.class, + Fishing.class, FocusEnergy.class, Flag.class, FocusMaxEnergy.class, @@ -134,10 +135,12 @@ public final class EffectMasterHandler PhysicalAttackMute.class, PhysicalMute.class, PhysicalSoulAttack.class, + Pumping.class, ProtectionBlessing.class, RandomizeHate.class, RebalanceHP.class, Recovery.class, + Reeling.class, RefuelAirship.class, Relax.class, ResistSkill.class, diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java index 83669013731502ae88fd464b904281add52c46e4..b42ecb7184433a8b59fb9952d165428037f521d8 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java @@ -207,8 +207,6 @@ import handlers.punishmenthandlers.JailHandler; import handlers.skillhandlers.DeluxeKey; import handlers.skillhandlers.Detection; import handlers.skillhandlers.Dummy; -import handlers.skillhandlers.Fishing; -import handlers.skillhandlers.FishingSkill; import handlers.skillhandlers.NornilsPower; import handlers.skillhandlers.Sow; import handlers.skillhandlers.Trap; @@ -498,8 +496,6 @@ public class MasterHandler DeluxeKey.class, Detection.class, Dummy.class, - Fishing.class, - FishingSkill.class, NornilsPower.class, Sow.class, Trap.class, diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Fishing.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Fishing.java similarity index 86% rename from L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Fishing.java rename to L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Fishing.java index 8db5fa589a83ee8cbb5f1789848aed0cd8ce492f..6e93ec80bc1af615af8b51ecb9dd222b3a4040ad 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Fishing.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Fishing.java @@ -16,23 +16,24 @@ * 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 handlers.skillhandlers; +package handlers.effecthandlers; import com.l2jserver.Config; import com.l2jserver.gameserver.GeoData; -import com.l2jserver.gameserver.handler.ISkillHandler; import com.l2jserver.gameserver.instancemanager.ZoneManager; -import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.PcCondOverride; +import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.conditions.Condition; +import com.l2jserver.gameserver.model.effects.AbstractEffect; +import com.l2jserver.gameserver.model.effects.L2EffectType; import com.l2jserver.gameserver.model.itemcontainer.Inventory; import com.l2jserver.gameserver.model.items.L2Weapon; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.model.items.type.L2EtcItemType; import com.l2jserver.gameserver.model.items.type.L2WeaponType; -import com.l2jserver.gameserver.model.skills.L2Skill; -import com.l2jserver.gameserver.model.skills.L2SkillType; +import com.l2jserver.gameserver.model.skills.BuffInfo; import com.l2jserver.gameserver.model.zone.L2ZoneType; import com.l2jserver.gameserver.model.zone.ZoneId; import com.l2jserver.gameserver.model.zone.type.L2FishingZone; @@ -41,64 +42,36 @@ import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.util.Util; import com.l2jserver.util.Rnd; -public final class Fishing implements ISkillHandler +/** + * @author UnAfraid + */ +public class Fishing extends AbstractEffect { private static final int MIN_BAIT_DISTANCE = 90; private static final int MAX_BAIT_DISTANCE = 250; - private static final L2SkillType[] SKILL_IDS = + public Fishing(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) { - L2SkillType.FISHING - }; + super(attachCond, applyCond, set, params); + } - /** - * Computes the Z of the bait. - * @param player the player - * @param baitX the bait x - * @param baitY the bait y - * @param fishingZone the fishing zone - * @param waterZone the water zone - * @return the bait z or {@link Integer#MIN_VALUE} when you cannot fish here - */ - private int computeBaitZ(final L2PcInstance player, final int baitX, final int baitY, final L2FishingZone fishingZone, final L2WaterZone waterZone) + @Override + public boolean isInstant() { - if ((fishingZone == null)) - { - return Integer.MIN_VALUE; - } - - if ((waterZone == null)) - { - return Integer.MIN_VALUE; - } - - // always use water zone, fishing zone high z is high in the air... - int baitZ = waterZone.getWaterZ(); - - if (!GeoData.getInstance().canSeeTarget(player.getX(), player.getY(), player.getZ(), baitX, baitY, baitZ)) - { - return Integer.MIN_VALUE; - } - - if (GeoData.getInstance().hasGeo(baitX, baitY)) - { - if (GeoData.getInstance().getHeight(baitX, baitY, baitZ) > baitZ) - { - return Integer.MIN_VALUE; - } - - if (GeoData.getInstance().getHeight(baitX, baitY, player.getZ()) > baitZ) - { - return Integer.MIN_VALUE; - } - } - - return baitZ; + return true; + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.FISHING_START; } @Override - public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets) + public void onStart(BuffInfo info) { + super.onStart(info); + final L2Character activeChar = info.getEffector(); if (!activeChar.isPlayer()) { return; @@ -252,9 +225,48 @@ public final class Fishing implements ISkillHandler player.startFishing(baitX, baitY, baitZ); } - @Override - public L2SkillType[] getSkillIds() + /** + * Computes the Z of the bait. + * @param player the player + * @param baitX the bait x + * @param baitY the bait y + * @param fishingZone the fishing zone + * @param waterZone the water zone + * @return the bait z or {@link Integer#MIN_VALUE} when you cannot fish here + */ + private int computeBaitZ(final L2PcInstance player, final int baitX, final int baitY, final L2FishingZone fishingZone, final L2WaterZone waterZone) { - return SKILL_IDS; + if ((fishingZone == null)) + { + return Integer.MIN_VALUE; + } + + if ((waterZone == null)) + { + return Integer.MIN_VALUE; + } + + // always use water zone, fishing zone high z is high in the air... + int baitZ = waterZone.getWaterZ(); + + if (!GeoData.getInstance().canSeeTarget(player.getX(), player.getY(), player.getZ(), baitX, baitY, baitZ)) + { + return Integer.MIN_VALUE; + } + + if (GeoData.getInstance().hasGeo(baitX, baitY)) + { + if (GeoData.getInstance().getHeight(baitX, baitY, baitZ) > baitZ) + { + return Integer.MIN_VALUE; + } + + if (GeoData.getInstance().getHeight(baitX, baitY, player.getZ()) > baitZ) + { + return Integer.MIN_VALUE; + } + } + + return baitZ; } -} \ No newline at end of file +} diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Pumping.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Pumping.java new file mode 100644 index 0000000000000000000000000000000000000000..9d35689598f1b578fc2b1371209e8aa126bd397d --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Pumping.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2004-2014 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack 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. + * + * L2J DataPack 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 handlers.effecthandlers; + +import com.l2jserver.gameserver.datatables.FishingRodsData; +import com.l2jserver.gameserver.enums.ShotType; +import com.l2jserver.gameserver.model.StatsSet; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.conditions.Condition; +import com.l2jserver.gameserver.model.effects.AbstractEffect; +import com.l2jserver.gameserver.model.effects.L2EffectType; +import com.l2jserver.gameserver.model.fishing.L2Fishing; +import com.l2jserver.gameserver.model.fishing.L2FishingRod; +import com.l2jserver.gameserver.model.items.L2Weapon; +import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; +import com.l2jserver.gameserver.model.skills.BuffInfo; +import com.l2jserver.gameserver.model.stats.Stats; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ActionFailed; + +/** + * @author UnAfraid + */ +public class Pumping extends AbstractEffect +{ + private final double _power; + + public Pumping(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) + { + super(attachCond, applyCond, set, params); + if ((params == null) || (params.getString("power", null) == null)) + { + throw new IllegalArgumentException(getClass().getSimpleName() + ": effect without power!"); + } + _power = params.getDouble("power"); + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.FISHING; + } + + @Override + public void onStart(BuffInfo info) + { + super.onStart(info); + final L2Character activeChar = info.getEffector(); + if (!activeChar.isPlayer()) + { + return; + } + + final L2PcInstance player = activeChar.getActingPlayer(); + final L2Fishing fish = player.getFishCombat(); + if (fish == null) + { + // Pumping skill is available only while fishing + player.sendPacket(SystemMessageId.CAN_USE_PUMPING_ONLY_WHILE_FISHING); + player.sendPacket(ActionFailed.STATIC_PACKET); + return; + } + final L2Weapon weaponItem = player.getActiveWeaponItem(); + final L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance(); + if ((weaponInst == null) || (weaponItem == null)) + { + return; + } + int SS = 1; + int pen = 0; + if (activeChar.isChargedShot(ShotType.FISH_SOULSHOTS)) + { + SS = 2; + } + final L2FishingRod fishingRod = FishingRodsData.getInstance().getFishingRod(weaponItem.getId()); + final double gradeBonus = fishingRod.getFishingRodLevel() * 0.1; // TODO: Check this formula (is guessed) + int dmg = (int) ((fishingRod.getFishingRodDamage() + player.calcStat(Stats.FISHING_EXPERTISE, 1, null, null) + _power) * gradeBonus * SS); + // Penalty 5% less damage dealt + if (player.getSkillLevel(1315) <= (info.getSkill().getLevel() - 2)) // 1315 - Fish Expertise + { + player.sendPacket(SystemMessageId.REELING_PUMPING_3_LEVELS_HIGHER_THAN_FISHING_PENALTY); + pen = (int) (dmg * 0.05); + dmg = dmg - pen; + } + if (SS > 1) + { + weaponInst.setChargedShot(ShotType.FISH_SOULSHOTS, false); + } + + fish.usePumping(dmg, pen); + } +} diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Reeling.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Reeling.java new file mode 100644 index 0000000000000000000000000000000000000000..c2e9936faac61e758e0fdfe5662a71dadde3e5a6 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Reeling.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2004-2014 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack 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. + * + * L2J DataPack 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 handlers.effecthandlers; + +import com.l2jserver.gameserver.datatables.FishingRodsData; +import com.l2jserver.gameserver.enums.ShotType; +import com.l2jserver.gameserver.model.StatsSet; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.conditions.Condition; +import com.l2jserver.gameserver.model.effects.AbstractEffect; +import com.l2jserver.gameserver.model.effects.L2EffectType; +import com.l2jserver.gameserver.model.fishing.L2Fishing; +import com.l2jserver.gameserver.model.fishing.L2FishingRod; +import com.l2jserver.gameserver.model.items.L2Weapon; +import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; +import com.l2jserver.gameserver.model.skills.BuffInfo; +import com.l2jserver.gameserver.model.stats.Stats; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ActionFailed; + +/** + * @author UnAfraid + */ +public class Reeling extends AbstractEffect +{ + private final double _power; + + public Reeling(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) + { + super(attachCond, applyCond, set, params); + if ((params == null) || (params.getString("power", null) == null)) + { + throw new IllegalArgumentException(getClass().getSimpleName() + ": effect without power!"); + } + _power = params.getDouble("power"); + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public L2EffectType getEffectType() + { + return L2EffectType.FISHING; + } + + @Override + public void onStart(BuffInfo info) + { + super.onStart(info); + final L2Character activeChar = info.getEffector(); + if (!activeChar.isPlayer()) + { + return; + } + + final L2PcInstance player = activeChar.getActingPlayer(); + final L2Fishing fish = player.getFishCombat(); + if (fish == null) + { + // Reeling skill is available only while fishing + player.sendPacket(SystemMessageId.CAN_USE_REELING_ONLY_WHILE_FISHING); + player.sendPacket(ActionFailed.STATIC_PACKET); + return; + } + final L2Weapon weaponItem = player.getActiveWeaponItem(); + final L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance(); + if ((weaponInst == null) || (weaponItem == null)) + { + return; + } + int SS = 1; + int pen = 0; + if (activeChar.isChargedShot(ShotType.FISH_SOULSHOTS)) + { + SS = 2; + } + final L2FishingRod fishingRod = FishingRodsData.getInstance().getFishingRod(weaponItem.getId()); + final double gradeBonus = fishingRod.getFishingRodLevel() * 0.1; // TODO: Check this formula (is guessed) + int dmg = (int) ((fishingRod.getFishingRodDamage() + player.calcStat(Stats.FISHING_EXPERTISE, 1, null, null) + _power) * gradeBonus * SS); + // Penalty 5% less damage dealt + if (player.getSkillLevel(1315) <= (info.getSkill().getLevel() - 2)) // 1315 - Fish Expertise + { + player.sendPacket(SystemMessageId.REELING_PUMPING_3_LEVELS_HIGHER_THAN_FISHING_PENALTY); + pen = (int) (dmg * 0.05); + dmg = dmg - pen; + } + if (SS > 1) + { + weaponInst.setChargedShot(ShotType.FISH_SOULSHOTS, false); + } + + fish.useReeling(dmg, pen); + } +} diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/FishingSkill.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/FishingSkill.java deleted file mode 100644 index 741cce0756c192f3013a852bab2aedb285b6a248..0000000000000000000000000000000000000000 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/FishingSkill.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2004-2014 L2J DataPack - * - * This file is part of L2J DataPack. - * - * L2J DataPack 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. - * - * L2J DataPack 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 handlers.skillhandlers; - -import com.l2jserver.gameserver.datatables.FishingRodsData; -import com.l2jserver.gameserver.datatables.SkillTable; -import com.l2jserver.gameserver.enums.ShotType; -import com.l2jserver.gameserver.handler.ISkillHandler; -import com.l2jserver.gameserver.model.L2Object; -import com.l2jserver.gameserver.model.actor.L2Character; -import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; -import com.l2jserver.gameserver.model.fishing.L2Fishing; -import com.l2jserver.gameserver.model.fishing.L2FishingRod; -import com.l2jserver.gameserver.model.items.L2Weapon; -import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; -import com.l2jserver.gameserver.model.skills.L2Skill; -import com.l2jserver.gameserver.model.skills.L2SkillType; -import com.l2jserver.gameserver.network.SystemMessageId; -import com.l2jserver.gameserver.network.serverpackets.ActionFailed; - -public class FishingSkill implements ISkillHandler -{ - private static final L2SkillType[] SKILL_IDS = - { - L2SkillType.PUMPING, - L2SkillType.REELING - }; - - @Override - public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets) - { - if (!activeChar.isPlayer()) - { - return; - } - - L2PcInstance player = activeChar.getActingPlayer(); - - L2Fishing fish = player.getFishCombat(); - if (fish == null) - { - if (skill.getSkillType() == L2SkillType.PUMPING) - { - // Pumping skill is available only while fishing - player.sendPacket(SystemMessageId.CAN_USE_PUMPING_ONLY_WHILE_FISHING); - } - else if (skill.getSkillType() == L2SkillType.REELING) - { - // Reeling skill is available only while fishing - player.sendPacket(SystemMessageId.CAN_USE_REELING_ONLY_WHILE_FISHING); - } - player.sendPacket(ActionFailed.STATIC_PACKET); - return; - } - L2Weapon weaponItem = player.getActiveWeaponItem(); - L2ItemInstance weaponInst = activeChar.getActiveWeaponInstance(); - if ((weaponInst == null) || (weaponItem == null)) - { - return; - } - int SS = 1; - int pen = 0; - if (activeChar.isChargedShot(ShotType.FISH_SOULSHOTS)) - { - SS = 2; - } - L2FishingRod fishingRod = FishingRodsData.getInstance().getFishingRod(weaponItem.getId()); - double gradeBonus = fishingRod.getFishingRodLevel() * 0.1; // TODO: Check this formula (is guessed) - final L2Skill expertiseSkill = SkillTable.getInstance().getInfo(1315, player.getSkillLevel(1315)); - int dmg = (int) ((fishingRod.getFishingRodDamage() + expertiseSkill.getPower() + skill.getPower()) * gradeBonus * SS); - // Penalty 5% less damage dealt - if (player.getSkillLevel(1315) <= (skill.getLevel() - 2)) // 1315 - Fish Expertise - { - player.sendPacket(SystemMessageId.REELING_PUMPING_3_LEVELS_HIGHER_THAN_FISHING_PENALTY); - pen = (int) (dmg * 0.05); - dmg = dmg - pen; - } - if (SS > 1) - { - weaponInst.setChargedShot(ShotType.FISH_SOULSHOTS, false); - } - if (skill.getSkillType() == L2SkillType.REELING) - { - fish.useReeling(dmg, pen); - } - else - { - fish.usePumping(dmg, pen); - } - } - - @Override - public L2SkillType[] getSkillIds() - { - return SKILL_IDS; - } -} diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/01300-01399.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/01300-01399.xml index e36409cf4d0f9486db6e5e132474ae0d0d85bdaf..718317319cb7c0db934f3fbca08c57b165f654c9 100644 --- a/L2J_DataPack_BETA/dist/game/data/stats/skills/01300-01399.xml +++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/01300-01399.xml @@ -368,12 +368,14 @@ <set name="magicLvl" val="1" /> <set name="mpConsume" val="1" /> <set name="operateType" val="A1" /> - <set name="skillType" val="FISHING" /> <set name="targetType" val="SELF" /> <!-- TODO: Missing condition for "op_fishing_cast" --> <cond msgId="113" addName="1"> <using kind="Rod" /> </cond> + <for> + <effect name="Fishing" /> + </for> </skill> <skill id="1313" levels="27" name="Pumping"> <!-- Confirmed CT2.5 --> @@ -383,14 +385,17 @@ <set name="magicLvl" val="1" /> <set name="mpConsume" val="2" /> <set name="operateType" val="A1" /> - <set name="power" val="#power" /> <set name="reuseDelay" val="2000" /> - <set name="skillType" val="PUMPING" /> <set name="targetType" val="SELF" /> <!-- TODO: Missing condition for "op_fishing_pumping" --> <cond msgId="113" addName="1"> <using kind="Rod" /> </cond> + <for> + <effect name="Pumping"> + <param power="#power" /> + </effect> + </for> </skill> <skill id="1314" levels="27" name="Reeling"> <!-- Confirmed CT2.5 --> @@ -400,23 +405,29 @@ <set name="magicLvl" val="1" /> <set name="mpConsume" val="2" /> <set name="operateType" val="A1" /> - <set name="power" val="#power" /> <set name="reuseDelay" val="2000" /> - <set name="skillType" val="REELING" /> <set name="targetType" val="SELF" /> <!-- TODO: Missing condition for "op_fishing_reeling" --> <cond msgId="113" addName="1"> <using kind="Rod" /> </cond> + <for> + <effect name="Reeling"> + <param power="#power" /> + </effect> + </for> </skill> <skill id="1315" levels="27" name="Fishing Expertise"> - <!-- TODO: Require Support --> <table name="#power"> 0.66 0.9375 1.26 1.55 1.7 1.85 2 2.15 2.3 2.45 2.6 2.75 2.9 3.05 3.2 3.35 3.5 3.65 3.8 3.95 4.1 4.25 4.4 4.55 4.7 4.85 5 </table> <set name="icon" val="icon.skill1315" /> <set name="magicLvl" val="1" /> <set name="operateType" val="P" /> - <set name="power" val="#power" /> <set name="targetType" val="SELF" /> + <for> + <effect name="Buff"> + <set order="0x08" stat="fishingExpertise" val="#power" /> + </effect> + </for> </skill> <skill id="1316" levels="1" name="Fishing Expertise: C Grade"> <!-- Confirmed CT2.5 -->