rendered paste bodyclass file1:package net.sf.l2j.gameserver;import java.io.FileReader;import java.util.ArrayList;import java.util.logging.Logger;import net.sf.l2j.Config;import net.sf.l2j.fscript.L2JAIExtension;public class AIScript{ private static Logger _log = Logger.getLogger(AIScript.class.getName()); private static L2JAIExtension fs; private static AIScript _instance; private static final int AIVersion=100; public boolean _debug; public AIScript() { fs = new L2JAIExtension(); reload(); } public static AIScript getInstance() { if(_instance == null) _instance = new AIScript(); return _instance; } public void reload() { try { _log.info("AIScript: loading script..."); fs.reset(); fs.load( new FileReader(Config.DATAPACK_ROOT+"/data/ai.obj")); _log.info("AIScript: executing..."); fs.run(); _debug = false; if((Integer)(fs.getScriptVar("L2JAIVersion")) != AIVersion) { _log.warning("Invalid ai.obj version!"); } if((Integer)(fs.getScriptVar("L2JAIDebug")) == 1) { _log.info("AIScript: debugging enabled"); _debug = true; } } catch(Exception e) { _log.warning("Error loading ai.obj: "+e); e.printStackTrace(); } } /** * Handle interrupt issued by AbstractAI onEvent handler * @param handler - handler name * @param params - params array * first param are always reference to 'self' - caller ObjectID * @return - ai handler output value, <b>CAN BE NULL</b> */ public Object handleInterrupt(String handler,ArrayList params) { Object result = null; if(params == null) { params = new ArrayList<Integer>(); } try { result = fs.callScriptFunction(handler,params); } catch(Exception e) { _log.warning("AIScript: ERROR WHILE HANDLING INTERRUPT! "+e); } return result; }}class file2:package net.sf.l2j.fscript;import java.util.ArrayList;import net.sf.l2j.gameserver.AIScript;import net.sf.l2j.gameserver.model.L2Character;import net.sf.l2j.gameserver.model.L2NpcInstance;import net.sf.l2j.gameserver.model.L2PcInstance;import net.sf.l2j.gameserver.model.L2World;import net.sf.l2j.gameserver.serverpackets.CreatureSay;public class L2JAIExtension extends FScript{ private Object files[]; /**Constructor*/ public L2JAIExtension() { super(); files=new Object[25]; } public Object callFunction(String name,ArrayList param) throws FSException { if (name.equals("dbgprint")) { if(AIScript.getInstance()._debug) { String s=""; for(int n=0;n<param.size();n++) { s=s+param.get(n); } System.out.println(s); } } else if(name.equals("GetPlayerName")) { Integer objectId = (Integer)param.get(0); L2PcInstance player = (L2PcInstance)L2World.getInstance().findObject(objectId); if(player != null) return player.getName(); } else if(name.equals("Say")) { Integer objectId = (Integer)param.get(0); String s=""; for(int n=1;n<param.size();n++) { s=s+param.get(n); } L2Character npc = (L2Character)L2World.getInstance().findObject(objectId); if(npc != null) npc.broadcastPacket(new CreatureSay(objectId,0,npc.getName(),s)); } else if(name.equals("GetHP")) { Integer objectId = (Integer)param.get(0); L2Character npc = (L2Character)L2World.getInstance().findObject(objectId); if(npc != null) return npc.getCurrentHp(); } else if(name.equals("GetMP")) { Integer objectId = (Integer)param.get(0); L2Character npc = (L2Character)L2World.getInstance().findObject(objectId); if(npc != null) return npc.getCurrentMp(); } else if(name.equals("GetNpcClass")) { Integer objectId = (Integer)param.get(0); L2NpcInstance npc = (L2NpcInstance)L2World.getInstance().findObject(objectId); if(npc != null) return npc.getTemplate().type; } else if(name.equals("GetNpcFaction")) { Integer objectId = (Integer)param.get(0); L2NpcInstance npc = (L2NpcInstance)L2World.getInstance().findObject(objectId); if(npc != null) return npc.getTemplate().factionId; } else { super.callFunction(name,param); } return new Integer(0); }}patch:Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/GameServer.java===================================================================--- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/GameServer.java (revision 1250)+++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/GameServer.java (working copy)@@ -30,6 +30,7 @@ import net.sf.l2j.gameserver.handler.SkillHandler; import net.sf.l2j.gameserver.handler.UserCommandHandler; import net.sf.l2j.gameserver.handler.VoicedCommandHandler;+import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminAI; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminAdmin; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminAnnouncements; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminBan;@@ -409,6 +410,7 @@ _adminCommandHandler.registerAdminCommandHandler(new AdminMammon()); _adminCommandHandler.registerAdminCommandHandler(new AdminUnblockIp()); _adminCommandHandler.registerAdminCommandHandler(new AdminPledge());+ _adminCommandHandler.registerAdminCommandHandler(new AdminAI()); //_adminCommandHandler.registerAdminCommandHandler(new AdminRadar()); _log.config("AdminCommandHandler: Loaded " + _adminCommandHandler.size() + " handlers.");Index: C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java===================================================================--- C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java (revision 1250)+++ C:/eclipse-31m7/workspace/c4/L2_GameServer/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java (working copy)@@ -22,11 +22,13 @@ import static net.sf.l2j.gameserver.ai.CtrlIntention.AI_INTENTION_ATTACK; import static net.sf.l2j.gameserver.ai.CtrlIntention.AI_INTENTION_IDLE; +import java.util.ArrayList; import java.util.Random; import java.util.concurrent.Future; import java.util.logging.Logger; import net.sf.l2j.Config;+import net.sf.l2j.gameserver.AIScript; import net.sf.l2j.gameserver.ClientScheduler; import net.sf.l2j.gameserver.GameTimeController; import net.sf.l2j.gameserver.Territory;@@ -94,7 +96,6 @@ { // Launch actions corresponding to the Event Think onEvtThink();- } /**@@ -676,6 +677,11 @@ */ protected void onEvtAttacked(L2Character attacker) {+ ArrayList<Object> args = new ArrayList<Object>();+ args.add(_actor.getObjectId());+ args.add(attacker.getObjectId());+ AIScript.getInstance().handleInterrupt("onEventAttacked",args);+ // Calculate the attack timeout _attack_timeout = MAX_ATTACK_TIMEOUT + GameTimeController.getGameTicks(); admin handler:package net.sf.l2j.gameserver.handler.admincommandhandlers;import net.sf.l2j.gameserver.AIScript;import net.sf.l2j.gameserver.handler.IAdminCommandHandler;import net.sf.l2j.gameserver.model.L2PcInstance;public class AdminAI implements IAdminCommandHandler{ private static String[] _adminCommands = {"admin_ai_reload"}; public boolean useAdminCommand(String command, L2PcInstance activeChar) { if (command.equals("admin_ai_reload")) { AIScript.getInstance().reload(); } return true; } public String[] getAdminCommandList() { return _adminCommands; }}ai.obj:int L2JAIVersion=100int L2JAIDebug=1func onIdle(int objectId) dbgprint("idle")endfunc########################################### real events goes here##########################################func onEventThink(int self) dbgprint("handling event: Think ")endfuncfunc onEventAttacked(int self, int attacker) dbgprint("handling event: Attacked, by oid: "+attacker) string playerName=getPlayerName(attacker) #dbgprint(playerName) double currentHp=GetHP(self) Say(self,"OMFG! I'm attacked by "+playerName+"! My hp are: "+currentHp) string class=GetNpcClass(self) dbgprint("class: "+class)endfuncfunc onEventAggression(int self, int target, int value) dbgprint("handling event: Aggression")endfuncfunc onEventReady(int self) dbgprint("handling event: ready")endfuncfunc onEventArrived(int self) dbgprint("handling event: Arrived")endfuncfunc onEventDead(int self) dbgprint("handling event: Dead")endfunc