Adapted Chests AI to java.
No problems found during my tests.
Feel free to make suggestions on how to improve the code.
scripts.cfg
../group_template/TreasureChests.java
No problems found during my tests.
Feel free to make suggestions on how to improve the code.
scripts.cfg
- Code:
Index: scripts.cfg
===================================================================
--- scripts.cfg (revision 627)
+++ scripts.cfg (working copy)
@@ -8,7 +8,6 @@
# AI Section
ai/group_template/polymorphing_onAttack.py
-ai/group_template/chests.py
ai/group_template/devils_isle.py
ai/group_template/feedable_beasts.py
ai/group_template/FairyTrees.java
@@ -18,6 +17,7 @@
ai/group_template/PlainsOfDion.java
ai/group_template/SearchingMaster.java
ai/group_template/TowerOfInsolence.java
+ai/group_template/TreasureChests.java
ai/group_template/ValleyOfSaints.java
../group_template/TreasureChests.java
- Code:
/*
* 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 ai.group_template;
import net.sf.l2j.gameserver.ai.CtrlIntention;
import net.sf.l2j.gameserver.model.L2Object;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.L2Character;
import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2ChestInstance;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.network.serverpackets.SocialAction;
import net.sf.l2j.gameserver.util.Util;
import net.sf.l2j.util.Rnd;
/**
* Treasure Chest AI
* By Karakan for L2JLisvus
*/
public class TreasureChests extends Quest
{
//Deluxe Key skill
private static final int SKILL_DELUXE_KEY = 2229;
//Base chance for BOX to be opened
private static final int BASE_CHANCE = 100;
// Percent to decrease base chance when grade of DELUXE key not match
private static final int LEVEL_DECREASE = 40;
// Chance for a chest to actually be a BOX (as opposed to being a mimic).
private static final int IS_BOX = 40;
private static final int[] NPC_IDS =
{ 13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114,13115,13116,13117,13118,13119,13120,13121,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,
1671,1694,1717,1740,1763,1786,13213,13215,13217,13219,13221,13223,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822
};
public TreasureChests(int questId, String name, String descr)
{
super(questId, name, descr);
this.registerMobs(NPC_IDS);
}
@Override
public String onSkillSee(L2NpcInstance npc, L2PcInstance caster, L2Skill skill, L2Object[] targets, boolean isPet)
{
if (npc instanceof L2ChestInstance)
{
// this behavior only runs when the target of skill is the passed npc (chest)
// i.e. when the player is attempting to open the chest using a skill
if (!Util.contains(targets,npc))
{
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
final L2ChestInstance chest = ((L2ChestInstance) npc);
final int npcId = chest.getNpcId();
final int skillId = skill.getId();
final int skillLevel = skill.getLevel();
if (!Util.contains(NPC_IDS, npcId))
{
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
// if this has already been interacted, no further ai decisions are needed
// if it's the first interaction, check if this is a box or mimic
if (!chest.isInteracted())
{
chest.setInteracted();
if (Rnd.get(100) < IS_BOX)
{
// if it's a box, either it will be successfully opened by a proper key, or instantly disappear
if (skillId == SKILL_DELUXE_KEY)
{
// check the chance to open the box
int keyLevelNeeded = chest.getLevel() / 10;
keyLevelNeeded -= skillLevel;
if (keyLevelNeeded < 0)
keyLevelNeeded *= -1;
final int chance = BASE_CHANCE - keyLevelNeeded * LEVEL_DECREASE;
// success, pretend-death with rewards
if (Rnd.get(100) < chance)
{
caster.broadcastPacket(new SocialAction(caster.getObjectId(), 3));
chest.setMustRewardExpSp(false);
chest.setSpecialDrop();
chest.reduceCurrentHp(99999999, caster, false, false);
return null;
}
}
// used a skill other than chest-key, or used a chest-key but failed to open: disappear with no rewards
caster.broadcastPacket(new SocialAction(caster.getObjectId(), 13));
npc.onDecay();
}
else
{
final L2Character originalCaster = isPet ? caster.getPet() : caster;
chest.setRunning();
chest.addDamageHate(originalCaster, 0, 999);
chest.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalCaster);
}
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
@Override
public String onAttack(L2NpcInstance npc, L2PcInstance attacker, int damage, boolean isPet)
{
if (npc instanceof L2ChestInstance)
{
final L2ChestInstance chest = ((L2ChestInstance) npc);
final int npcId = chest.getNpcId();
// check if the chest and skills used are valid for this script. Exit if invalid.
if (!Util.contains(NPC_IDS, npcId))
{
return super.onAttack(npc, attacker, damage, isPet);
}
// if this was a mimic, set the target, start the skills and become aggro
if (!chest.isInteracted())
{
chest.setInteracted();
if (Rnd.get(100) < IS_BOX)
{
chest.getSpawn().decreaseCount(chest);
chest.deleteMe();
}
else
{
// if this weren't a box, upon interaction start the mimic behaviors...
// todo: perhaps a self-buff (skill id 4245) with random chance goes here?
final L2Character originalAttacker = isPet ? attacker.getPet() : attacker;
chest.setRunning();
chest.addDamageHate(originalAttacker, 0, (damage * 100) / (chest.getLevel() + 7));
chest.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
}
}
}
return super.onAttack(npc, attacker, damage, isPet);
}
public static void main(String[] args)
{
// now call the constructor (starts up the ai)
new TreasureChests(-1, "treasurechests", "ai");
}
}
Last edited by Karakan on 28th July 2019, 13:02; edited 1 time in total