From 3a4a9a1997d8258a2fe42853691da3930e993199 Mon Sep 17 00:00:00 2001 From: Adry_85 <Adrya85@hotmail.it> Date: Wed, 26 Feb 2014 22:30:59 +0000 Subject: [PATCH] BETA: Reworking '''Sow''' effect. Reviewed by: Nos, !UnAfraid --- .../scripts/handlers/EffectMasterHandler.java | 1 + .../data/scripts/handlers/MasterHandler.java | 2 - .../scripts/handlers/effecthandlers/Sow.java | 140 +++++++++++++++ .../scripts/handlers/skillhandlers/Sow.java | 170 ------------------ .../game/data/stats/skills/02000-02099.xml | 4 +- 5 files changed, 144 insertions(+), 173 deletions(-) create mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Sow.java delete mode 100644 L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Sow.java 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 2c487742a5..bcb1f6abba 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/EffectMasterHandler.java @@ -157,6 +157,7 @@ public final class EffectMasterHandler Sleep.class, SoulBlow.class, SoulEating.class, + Sow.class, Spoil.class, StaticDamage.class, StealAbnormal.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 e3bb8d80d6..a94ae1ae63 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java @@ -206,7 +206,6 @@ import handlers.punishmenthandlers.ChatBanHandler; import handlers.punishmenthandlers.JailHandler; import handlers.skillhandlers.DeluxeKey; import handlers.skillhandlers.Dummy; -import handlers.skillhandlers.Sow; import handlers.skillhandlers.Unlock; import handlers.targethandlers.Area; import handlers.targethandlers.AreaCorpseMob; @@ -492,7 +491,6 @@ public class MasterHandler // Skill Handlers DeluxeKey.class, Dummy.class, - Sow.class, Unlock.class, }, { diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Sow.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Sow.java new file mode 100644 index 0000000000..c173c8d15f --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Sow.java @@ -0,0 +1,140 @@ +/* + * 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.ai.CtrlIntention; +import com.l2jserver.gameserver.datatables.ManorData; +import com.l2jserver.gameserver.enums.QuestSound; +import com.l2jserver.gameserver.model.StatsSet; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance; +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.skills.BuffInfo; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.util.Rnd; + +/** + * Sow effect implementation. + * @author Adry_85, l3x + */ +public class Sow extends AbstractEffect +{ + public Sow(Condition attachCond, Condition applyCond, StatsSet set, StatsSet params) + { + super(attachCond, applyCond, set, params); + } + + @Override + public boolean isInstant() + { + return true; + } + + @Override + public void onStart(BuffInfo info) + { + if (!info.getEffector().isPlayer() || !info.getEffected().isMonster()) + { + return; + } + + final L2PcInstance player = info.getEffector().getActingPlayer(); + final L2MonsterInstance target = (L2MonsterInstance) info.getEffected(); + + if (target.isDead() || (!target.getTemplate().canBeSown()) || target.isSeeded() || (target.getSeederId() != player.getObjectId())) + { + return; + } + + final int seedId = target.getSeedType(); + if (seedId == 0) + { + return; + } + + // Consuming used seed + if (!player.destroyItemByItemId("Consume", seedId, 1, target, false)) + { + return; + } + + final SystemMessage sm; + if (calcSuccess(player, target, seedId)) + { + player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket()); + target.setSeeded(player.getActingPlayer()); + sm = SystemMessage.getSystemMessage(SystemMessageId.THE_SEED_WAS_SUCCESSFULLY_SOWN); + } + else + { + sm = SystemMessage.getSystemMessage(SystemMessageId.THE_SEED_WAS_NOT_SOWN); + } + + if (player.getParty() == null) + { + player.sendPacket(sm); + } + else + { + player.getParty().broadcastPacket(sm); + } + + // TODO: Mob should not aggro on player, this way doesn't work really nice + target.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + } + + private boolean calcSuccess(L2Character activeChar, L2Character target, int seedId) + { + // TODO: check all the chances + int basicSuccess = (ManorData.getInstance().isAlternative(seedId) ? 20 : 90); + final int minlevelSeed = ManorData.getInstance().getSeedMinLevel(seedId); + final int maxlevelSeed = ManorData.getInstance().getSeedMaxLevel(seedId); + final int levelPlayer = activeChar.getLevel(); // Attacker Level + final int levelTarget = target.getLevel(); // target Level + + // seed level + if (levelTarget < minlevelSeed) + { + basicSuccess -= 5 * (minlevelSeed - levelTarget); + } + if (levelTarget > maxlevelSeed) + { + basicSuccess -= 5 * (levelTarget - maxlevelSeed); + } + + // 5% decrease in chance if player level + // is more than +/- 5 levels to _target's_ level + int diff = (levelPlayer - levelTarget); + if (diff < 0) + { + diff = -diff; + } + if (diff > 5) + { + basicSuccess -= 5 * (diff - 5); + } + + // chance can't be less than 1% + Math.max(basicSuccess, 1); + return Rnd.nextInt(99) < basicSuccess; + } +} diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Sow.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Sow.java deleted file mode 100644 index 29449afb30..0000000000 --- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/Sow.java +++ /dev/null @@ -1,170 +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 java.util.logging.Logger; - -import com.l2jserver.Config; -import com.l2jserver.gameserver.ai.CtrlIntention; -import com.l2jserver.gameserver.datatables.ManorData; -import com.l2jserver.gameserver.enums.QuestSound; -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.L2MonsterInstance; -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; -import com.l2jserver.gameserver.network.serverpackets.SystemMessage; -import com.l2jserver.util.Rnd; - -/** - * @author l3x - */ -public class Sow implements ISkillHandler -{ - private static Logger _log = Logger.getLogger(Sow.class.getName()); - - private static final L2SkillType[] SKILL_IDS = - { - L2SkillType.SOW - }; - - @Override - public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets) - { - if (!activeChar.isPlayer()) - { - return; - } - - final L2Object[] targetList = skill.getTargetList(activeChar); - if ((targetList == null) || (targetList.length == 0)) - { - return; - } - - if (Config.DEBUG) - { - _log.info("Casting sow"); - } - - L2MonsterInstance target; - - for (L2Object tgt : targetList) - { - if (!tgt.isMonster()) - { - continue; - } - - target = (L2MonsterInstance) tgt; - if (target.isDead() || target.isSeeded() || (target.getSeederId() != activeChar.getObjectId())) - { - activeChar.sendPacket(ActionFailed.STATIC_PACKET); - continue; - } - - final int seedId = target.getSeedType(); - if (seedId == 0) - { - activeChar.sendPacket(ActionFailed.STATIC_PACKET); - continue; - } - - // Consuming used seed - if (!activeChar.destroyItemByItemId("Consume", seedId, 1, target, false)) - { - activeChar.sendPacket(ActionFailed.STATIC_PACKET); - return; - } - - SystemMessage sm; - if (calcSuccess(activeChar, target, seedId)) - { - activeChar.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket()); - target.setSeeded(activeChar.getActingPlayer()); - sm = SystemMessage.getSystemMessage(SystemMessageId.THE_SEED_WAS_SUCCESSFULLY_SOWN); - } - else - { - sm = SystemMessage.getSystemMessage(SystemMessageId.THE_SEED_WAS_NOT_SOWN); - } - - if (activeChar.getParty() == null) - { - activeChar.sendPacket(sm); - } - else - { - activeChar.getParty().broadcastPacket(sm); - } - - // TODO: Mob should not aggro on player, this way doesn't work really nice - target.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); - } - } - - private boolean calcSuccess(L2Character activeChar, L2Character target, int seedId) - { - // TODO: check all the chances - int basicSuccess = (ManorData.getInstance().isAlternative(seedId) ? 20 : 90); - final int minlevelSeed = ManorData.getInstance().getSeedMinLevel(seedId); - final int maxlevelSeed = ManorData.getInstance().getSeedMaxLevel(seedId); - final int levelPlayer = activeChar.getLevel(); // Attacker Level - final int levelTarget = target.getLevel(); // target Level - - // seed level - if (levelTarget < minlevelSeed) - { - basicSuccess -= 5 * (minlevelSeed - levelTarget); - } - if (levelTarget > maxlevelSeed) - { - basicSuccess -= 5 * (levelTarget - maxlevelSeed); - } - - // 5% decrease in chance if player level - // is more than +/- 5 levels to _target's_ level - int diff = (levelPlayer - levelTarget); - if (diff < 0) - { - diff = -diff; - } - if (diff > 5) - { - basicSuccess -= 5 * (diff - 5); - } - - // chance can't be less than 1% - if (basicSuccess < 1) - { - basicSuccess = 1; - } - - return Rnd.nextInt(99) < basicSuccess; - } - - @Override - public L2SkillType[] getSkillIds() - { - return SKILL_IDS; - } -} diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/02000-02099.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/02000-02099.xml index 26a7f82e1f..83949670eb 100644 --- a/L2J_DataPack_BETA/dist/game/data/stats/skills/02000-02099.xml +++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/02000-02099.xml @@ -1274,8 +1274,10 @@ <set name="nextActionAttack" val="true" /> <set name="operateType" val="A1" /> <set name="reuseDelay" val="10000" /> - <set name="skillType" val="SOW" /> <set name="targetType" val="ONE" /> + <for> + <effect name="Sow" /> + </for> </skill> <skill id="2098" levels="1" name="Harvesting"> <!-- Confirmed CT2.5 --> -- GitLab