Index: 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 args = new ArrayList(); + args.add(getObjectId()); // self + AIScriptManager.getInstance().callFunc(getAiClass(),"onEventSpawned",args); + super.OnSpawn(); try { @@ -199,11 +205,21 @@ public void notifyMinionDied(L2MinionInstance minion) { + ArrayList args = new ArrayList(); + args.add(getObjectId()); // self + args.add(minion.getObjectId()); + AIScriptManager.getInstance().callFunc(getAiClass(),"onEventMinionDied",args); + minionList.removeSpawnedMinion(minion); } public void notifyMinionSpawned(L2MinionInstance minion) { + ArrayList args = new ArrayList(); + 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 "); + activeChar.sendMessage("Usage: //reload "); } } 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 args = new ArrayList(); + 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 args = new ArrayList(); + 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 args = new ArrayList(); + 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 @@ + 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 @@ + 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 < 1000 onEventSeeSpell(/*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