rendered paste bodyIndex: C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/model/actor/instance/L2MonsterInstance.java===================================================================--- C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/model/actor/instance/L2MonsterInstance.java (revision 1363)+++ C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/model/actor/instance/L2MonsterInstance.java (working copy)@@ -18,6 +18,7 @@ */ package net.sf.l2j.gameserver.model.actor.instance; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random;@@ -28,6 +29,7 @@ import net.sf.l2j.gameserver.model.L2Attackable; import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.actor.monster.MonsterKnownList;+import net.sf.l2j.gameserver.script.fscript.AIScriptManager; import net.sf.l2j.gameserver.templates.L2NpcTemplate; import net.sf.l2j.gameserver.util.MinionList; @@ -100,6 +102,10 @@ public void OnSpawn() {+ ArrayList<Object> args = new ArrayList<Object>();+ args.add(getObjectId()); // self+ AIScriptManager.getInstance().callFunc(getAiClass(),"onEventSpawned",args);+ super.OnSpawn(); try {@@ -199,11 +205,21 @@ public void notifyMinionDied(L2MinionInstance minion) {+ ArrayList<Object> args = new ArrayList<Object>();+ args.add(getObjectId()); // self+ args.add(minion.getObjectId());+ AIScriptManager.getInstance().callFunc(getAiClass(),"onEventMinionDied",args);+ minionList.removeSpawnedMinion(minion); } public void notifyMinionSpawned(L2MinionInstance minion) {+ ArrayList<Object> args = new ArrayList<Object>();+ args.add(getObjectId()); // self+ args.add(minion.getObjectId());+ AIScriptManager.getInstance().callFunc(getAiClass(),"onEventMinionSpawned",args);+ minionList.addSpawnedMinion(minion); } Index: C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminAdmin.java===================================================================--- C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminAdmin.java (revision 1363)+++ C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminAdmin.java (working copy)@@ -28,6 +28,8 @@ import net.sf.l2j.gameserver.model.L2Multisell; import net.sf.l2j.gameserver.model.L2World; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;+import net.sf.l2j.gameserver.model.geodata.GeoParser;+import net.sf.l2j.gameserver.script.fscript.AIScriptManager; import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage; import net.sf.l2j.gameserver.serverpackets.PlaySound; import net.sf.l2j.gameserver.serverpackets.ServerBasePacket;@@ -47,7 +49,7 @@ private static String[] _adminCommands = {"admin_admin","admin_play_sounds","admin_play_sound", "admin_gmliston","admin_gmlistoff","admin_silence", "admin_atmosphere","admin_diet","admin_tradeoff",- "admin_reload"};+ "admin_reload","admin_geo"}; private static final int REQUIRED_LEVEL = Config.GM_MENU; public boolean useAdminCommand(String command, L2PcInstance activeChar) {@@ -176,6 +178,25 @@ activeChar.sendMessage("tradeoff currently disabled"); } }+ else if(command.startsWith("admin_geo"))+ {+ int cx = activeChar.getX();+ int cy = activeChar.getY();+ int cz = activeChar.getZ();+ + int gZ = GeoParser.getInstance().getBlockHeight(cx,cy);+ int gT = GeoParser.getInstance().getBlockType(cx,cy);+ + activeChar.sendMessage("======= debug world =======");+ activeChar.sendMessage("clientX: "+cx);+ activeChar.sendMessage("clientY: "+cy);+ activeChar.sendMessage("clientZ: "+cz);+ activeChar.sendMessage("serverZ: "+gZ);+ activeChar.sendMessage("blockType: "+gT);+ activeChar.sendMessage("movement flag: "+0); //TODO+ activeChar.sendMessage("floor flag: "+0); //TODO+ activeChar.sendMessage("======= report end =======");+ } else if(command.startsWith("admin_reload")) { StringTokenizer st = new StringTokenizer(command);@@ -200,10 +221,15 @@ NpcTable.getInstance().reloadAllNpc(); activeChar.sendMessage("npcs reloaded"); }+ else if(type.equals("ai"))+ {+ AIScriptManager.getInstance().init();+ activeChar.sendMessage("AI reloaded");+ } } catch(Exception e) {- activeChar.sendMessage("Usage: //reload <multisell|skill|npc>");+ activeChar.sendMessage("Usage: //reload <multisell|skill|npc|ai>"); } } Index: C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/GameServer.java===================================================================--- C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/GameServer.java (revision 1363)+++ C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/GameServer.java (working copy)@@ -34,6 +34,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;@@ -66,9 +67,9 @@ import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRepairChar; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRes; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRideWyvern;-import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSiege; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminShop; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminShutdown;+import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSiege; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSkill; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSpawn; import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminTarget;@@ -130,10 +131,11 @@ import net.sf.l2j.gameserver.model.AutoChatHandler; import net.sf.l2j.gameserver.model.AutoSpawnHandler; import net.sf.l2j.gameserver.model.L2World;+import net.sf.l2j.gameserver.model.geodata.GeoParser; import net.sf.l2j.gameserver.model.quest.Quest; import net.sf.l2j.gameserver.script.faenor.FaenorScriptEngine;+import net.sf.l2j.gameserver.taskmanager.TaskManager; import net.sf.l2j.status.Status;-import net.sf.l2j.gameserver.taskmanager.TaskManager; /** * This class ...@@ -376,6 +378,7 @@ _adminCommandHandler.registerAdminCommandHandler(new AdminLogin()); _adminCommandHandler.registerAdminCommandHandler(new AdminCache()); _adminCommandHandler.registerAdminCommandHandler(new AdminZone());+ _adminCommandHandler.registerAdminCommandHandler(new AdminAI()); //_adminCommandHandler.registerAdminCommandHandler(new AdminRadar()); _log.config("AdminCommandHandler: Loaded " + _adminCommandHandler.size() + " handlers.");@@ -426,6 +429,8 @@ e.printStackTrace(); } + GeoParser.getInstance();+ _log.config("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size()); System.gc();Index: C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java===================================================================--- C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java (revision 1363)+++ C:/eclipse/workspace/L2_GameServer_c4/java/net/sf/l2j/gameserver/ai/L2AttackableAI.java (working copy)@@ -22,6 +22,7 @@ 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.Collection; import java.util.Random; import java.util.concurrent.Future;@@ -44,6 +45,7 @@ import net.sf.l2j.gameserver.model.actor.instance.L2MonsterInstance; import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;+import net.sf.l2j.gameserver.script.fscript.AIScriptManager; /**@@ -258,6 +260,11 @@ */ protected void onIntentionAttack(L2Character target) {+ ArrayList<Object> args = new ArrayList<Object>();+ args.add(_accessor.getActor().getObjectId()); // self+ args.add(target.getObjectId()); // attack target+ AIScriptManager.getInstance().callFunc(_accessor.getActor().getAiClass(),"onIntentionAttack",args);+ // Calculate the attack timeout _attack_timeout = MAX_ATTACK_TIMEOUT + GameTimeController.getGameTicks(); @@ -376,7 +383,7 @@ if (_actor instanceof L2GuardInstance) { // Order to the L2GuardInstance to return to its home location because there's no target to attack- ((L2GuardInstance)_actor).returnHome();+ //((L2GuardInstance)_actor).returnHome(); } // If this is a festival monster, then it remains in the same location.@@ -695,6 +702,11 @@ */ protected void onEvtAttacked(L2Character attacker) {+ ArrayList<Object> args = new ArrayList<Object>();+ args.add(_accessor.getActor().getObjectId()); // self+ args.add(attacker.getObjectId()); // attacker+ AIScriptManager.getInstance().callFunc(_accessor.getActor().getAiClass(),"onEventAttacked",args);+ // Calculate the attack timeout _attack_timeout = MAX_ATTACK_TIMEOUT + GameTimeController.getGameTicks(); @@ -737,6 +749,13 @@ { L2Attackable me = (L2Attackable)_actor; + ArrayList<Object> args = new ArrayList<Object>();+ args.add(_accessor.getActor().getObjectId()); // self+ args.add(target.getObjectId()); // potential victim :)+ args.add(aggro); // aggression rate+ AIScriptManager.getInstance().callFunc(_accessor.getActor().getAiClass(),"onEventAggression",args);++ // Add the target to the actor _aggroList or update hate if already present me.addDamageHate(target, 0, aggro); Index: C:/eclipse/workspace/L2_GameServer_c4/build.xml===================================================================--- C:/eclipse/workspace/L2_GameServer_c4/build.xml (revision 1363)+++ C:/eclipse/workspace/L2_GameServer_c4/build.xml (working copy)@@ -41,6 +41,7 @@ <include name="bsh-2.0.jar"/> <include name="jython.jar"/> <include name="javolution.jar"/>+ <include name="FScript.jar"/> </fileset> </path> Index: C:/eclipse/workspace/L2_GameServer_c4/.classpath===================================================================--- C:/eclipse/workspace/L2_GameServer_c4/.classpath (revision 1363)+++ C:/eclipse/workspace/L2_GameServer_c4/.classpath (working copy)@@ -11,5 +11,6 @@ <classpathentry kind="lib" path="lib/mysql-connector-java-3.1.10-bin.jar"/> <classpathentry kind="lib" path="lib/javolution.jar"/> <classpathentry kind="lib" path="lib/sqljdbc.jar"/>+ <classpathentry kind="lib" path="lib/FScript.jar"/> <classpathentry kind="output" path="bin"/> </classpath>called by gameserver(ai script should provide that functions):onEventMinionDied(self,minion)onEventMinionSpawned(self,minion)onIntentionAttack(self,target)onEventSpawned(self)onEventAggression(self,target,aggro)onEventAttacked(self,attacker)onEventSeeCreature(self,creature,dist) // dist are always < 1000onEventSeeSpell(/*notdone*/)exported by AI engine(can be called from ai script):getStat(actor,stat) // stat are 0,1,2,3,4,5(hp,mp,cp,lvl,name,race(0-4 - player, 5 - mob))sayMessage(actor,type,msg)useSkill(actor,skillid,skillLevel,hitTime,reuseTime)spawnCreature(npcid,count,x,y,z)moveToLocation(actor,x,y,z)teleToLocation(actor,x,y,z)setFlag(actor,flag_name,flag_value)getFlagString(actor,flag_name)getFlagInteger(actor,flag_name)calcRandom(range)setTimer(/*notdone*/)//reload ai//setai <ai>