浏览代码

Core support for new custom tables.
Fix for pet shots.

JIV 15 年之前
父节点
当前提交
3d8a5776f4

+ 2 - 0
L2_GameServer/java/com/l2jserver/Config.java

@@ -540,6 +540,7 @@ public final class Config
 	public static boolean CUSTOM_TELEPORT_TABLE;
 	public static boolean CUSTOM_DROPLIST_TABLE;
 	public static boolean CUSTOM_MERCHANT_TABLES;
+	public static boolean CUSTOM_NPCBUFFER_TABLES;
 
 
 	//--------------------------------------------------
@@ -1713,6 +1714,7 @@ public final class Config
 					CUSTOM_TELEPORT_TABLE = Boolean.valueOf(General.getProperty("CustomTeleportTable", "false"));
 					CUSTOM_DROPLIST_TABLE = Boolean.valueOf(General.getProperty("CustomDroplistTable", "false"));
 					CUSTOM_MERCHANT_TABLES = Boolean.valueOf(General.getProperty("CustomMerchantTables", "false"));
+					CUSTOM_NPCBUFFER_TABLES = Boolean.valueOf(General.getProperty("CustomNpcBufferTables", "false"));
 				}
 				catch (Exception e)
 				{

+ 81 - 37
L2_GameServer/java/com/l2jserver/gameserver/datatables/NpcBufferTable.java

@@ -28,6 +28,8 @@ public class NpcBufferTable
 {
 	protected static Logger _log = Logger.getLogger(NpcBufferTable.class.getName());
 	
+	private TIntObjectHashMap<NpcBufferSkills> _buffers = new TIntObjectHashMap<NpcBufferSkills>();
+	
 	private class NpcBufferSkills
 	{
 		private int _npcId = 0;
@@ -69,9 +71,7 @@ public class NpcBufferTable
 			return _npcId;
 		}
 	}
-	
-	private TIntObjectHashMap<NpcBufferSkills> _buffers = new TIntObjectHashMap<NpcBufferSkills>();
-	
+
 	private NpcBufferTable()
 	{
 		Connection con = null;
@@ -79,46 +79,91 @@ public class NpcBufferTable
 		
 		try
 		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			
-			PreparedStatement statement = con.prepareStatement("SELECT `npc_id`,`skill_id`,`skill_level`,`skill_fee_id`,`skill_fee_amount`,`buff_group` FROM `npc_buffer` ORDER BY `npc_id` ASC");
-			ResultSet rset = statement.executeQuery();
-			
-			int lastNpcId = 0;
-			NpcBufferSkills skills = null;
-			
-			while (rset.next())
+			try
 			{
-				int npcId = rset.getInt("npc_id");
-				int skillId = rset.getInt("skill_id");
-				int skillLevel = rset.getInt("skill_level");
-				int skillFeeId = rset.getInt("skill_fee_id");
-				int skillFeeAmount = rset.getInt("skill_fee_amount");
-				int buffGroup = rset.getInt("buff_group");
+				con = L2DatabaseFactory.getInstance().getConnection();
+				
+				PreparedStatement statement = con.prepareStatement("SELECT `npc_id`,`skill_id`,`skill_level`,`skill_fee_id`,`skill_fee_amount`,`buff_group` FROM `npc_buffer` ORDER BY `npc_id` ASC");
+				ResultSet rset = statement.executeQuery();
+				
+				int lastNpcId = 0;
+				NpcBufferSkills skills = null;
 				
-				if (npcId != lastNpcId)
+				while (rset.next())
 				{
-					if (lastNpcId != 0)
-						_buffers.put(lastNpcId, skills);
+					int npcId = rset.getInt("npc_id");
+					int skillId = rset.getInt("skill_id");
+					int skillLevel = rset.getInt("skill_level");
+					int skillFeeId = rset.getInt("skill_fee_id");
+					int skillFeeAmount = rset.getInt("skill_fee_amount");
+					int buffGroup = rset.getInt("buff_group");
 					
-					skills = new NpcBufferSkills(npcId);
-					skills.addSkill(skillId, skillLevel, skillFeeId, skillFeeAmount, buffGroup);
+					if (npcId != lastNpcId)
+					{
+						if (lastNpcId != 0)
+							_buffers.put(lastNpcId, skills);
+						
+						skills = new NpcBufferSkills(npcId);
+						skills.addSkill(skillId, skillLevel, skillFeeId, skillFeeAmount, buffGroup);
+					}
+					else
+						skills.addSkill(skillId, skillLevel, skillFeeId, skillFeeAmount, buffGroup);
+					
+					lastNpcId = npcId;
+					skillCount++;
 				}
-				else
-					skills.addSkill(skillId, skillLevel, skillFeeId, skillFeeAmount, buffGroup);
 				
-				lastNpcId = npcId;
-				skillCount++;
+				if (lastNpcId != 0)
+					_buffers.put(lastNpcId, skills);
+				rset.close();
+				statement.close();
+			}
+			catch (Exception e)
+			{
+				_log.log(Level.SEVERE, "NpcBufferTable: Error reading npc_buffer table: " + e.getMessage(), e);
 			}
 			
-			_buffers.put(lastNpcId, skills);
-			rset.close();
-			statement.close();
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.SEVERE, "NpcBufferSkillIdsTable: Error reading npc_buffer table: "
-			        + e.getMessage(), e);
+			try
+			{
+				PreparedStatement statement = con.prepareStatement("SELECT `npc_id`,`skill_id`,`skill_level`,`skill_fee_id`,`skill_fee_amount`,`buff_group` FROM `custom_npc_buffer` ORDER BY `npc_id` ASC");
+				ResultSet rset = statement.executeQuery();
+				
+				int lastNpcId = 0;
+				NpcBufferSkills skills = null;
+				
+				while (rset.next())
+				{
+					int npcId = rset.getInt("npc_id");
+					int skillId = rset.getInt("skill_id");
+					int skillLevel = rset.getInt("skill_level");
+					int skillFeeId = rset.getInt("skill_fee_id");
+					int skillFeeAmount = rset.getInt("skill_fee_amount");
+					int buffGroup = rset.getInt("buff_group");
+					
+					if (npcId != lastNpcId)
+					{
+						if (lastNpcId != 0)
+							_buffers.put(lastNpcId, skills);
+						
+						skills = new NpcBufferSkills(npcId);
+						skills.addSkill(skillId, skillLevel, skillFeeId, skillFeeAmount, buffGroup);
+					}
+					else
+						skills.addSkill(skillId, skillLevel, skillFeeId, skillFeeAmount, buffGroup);
+					
+					lastNpcId = npcId;
+					skillCount++;
+				}
+				
+				if (lastNpcId != 0)
+					_buffers.put(lastNpcId, skills);
+				rset.close();
+				statement.close();
+			}
+			catch (Exception e)
+			{
+				_log.log(Level.SEVERE, "NpcBufferTable: Error reading custom_npc_buffer table: " + e.getMessage(), e);
+			}
 		}
 		finally
 		{
@@ -131,8 +176,7 @@ public class NpcBufferTable
 			}
 		}
 		
-		_log.info("NpcBufferSkillIdsTable: Loaded " + _buffers.size() + " buffers and "
-		        + skillCount + " skills.");
+		_log.info("NpcBufferSkillIdsTable: Loaded " + _buffers.size() + " buffers and " + skillCount + " skills.");
 	}
 	
 	public static NpcBufferTable getInstance()

+ 59 - 5
L2_GameServer/java/com/l2jserver/gameserver/datatables/NpcTable.java

@@ -97,7 +97,6 @@ public class NpcTable
 			{
 				try
 				{
-					con = L2DatabaseFactory.getInstance().getConnection();
 					PreparedStatement statement;
 					statement = con.prepareStatement("SELECT "
 							+ L2DatabaseFactory.getInstance().safetyString(new String[] { "id", "idTemplate", "name", "serverSideName",
@@ -119,7 +118,6 @@ public class NpcTable
 			}
 			try
 			{
-				con = L2DatabaseFactory.getInstance().getConnection();
 				PreparedStatement statement = con.prepareStatement("SELECT npcid, skillid, level FROM npcskills");
 				ResultSet npcskills = statement.executeQuery();
 				L2NpcTemplate npcDat = null;
@@ -308,8 +306,7 @@ public class NpcTable
 			
 			try 
 			{
-				PreparedStatement statement10 = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[] 
-				                                                                                                                         {"npc_id", "primary_attack","skill_chance","canMove","soulshot","spiritshot","sschance","spschance","minrangeskill","minrangechance","maxrangeskill","maxrangechance","ischaos","clan","clan_range","enemyClan","enemyRange","ai_type","dodge"}) + " FROM npcAIData ORDER BY npc_id");
+				PreparedStatement statement10 = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[] {"npc_id", "primary_attack","skill_chance","canMove","soulshot","spiritshot","sschance","spschance","minrangeskill","minrangechance","maxrangeskill","maxrangechance","ischaos","clan","clan_range","enemyClan","enemyRange","ai_type","dodge"}) + " FROM npcAIData ORDER BY npc_id");
 				ResultSet NpcAIDataTable = statement10.executeQuery();
 				L2NpcAIData npcAIDat = null;
 				L2NpcTemplate npcDat = null;
@@ -357,10 +354,67 @@ public class NpcTable
 				statement10.close();
 				_log.config("NPC AI Data Table: Loaded " + cont + " AI Data.");
 			} 
-			catch (Exception e) {
+			catch (Exception e) 
+			{
 				_log.severe("NPCTable: Error reading NPC AI Data: " + e);
 			}
 			
+			if (Config.CUSTOM_NPC_TABLE)
+			{
+				try
+				{
+					PreparedStatement statement = con.prepareStatement("SELECT " + L2DatabaseFactory.getInstance().safetyString(new String[] { "npc_id", "primary_attack", "skill_chance", "canMove", "soulshot", "spiritshot", "sschance", "spschance", "minrangeskill", "minrangechance", "maxrangeskill", "maxrangechance", "ischaos", "clan", "clan_range", "enemyClan", "enemyRange", "ai_type", "dodge" }) + " FROM custom_npcAIData ORDER BY npc_id");
+					ResultSet NpcAIDataTable = statement.executeQuery();
+					L2NpcAIData npcAIDat = null;
+					L2NpcTemplate npcDat = null;
+					int cont = 0;
+					while (NpcAIDataTable.next())
+					{
+						int npc_id = NpcAIDataTable.getInt("npc_id");
+						npcDat = _npcs.get(npc_id);
+						if (npcDat == null)
+						{
+							_log.severe("NPCTable: Custom AI Data Error with id : " + npc_id);
+							continue;
+						}
+						npcAIDat = new L2NpcAIData();
+						
+						npcAIDat.setPrimaryAttack(NpcAIDataTable.getInt("primary_attack"));
+						npcAIDat.setSkillChance(NpcAIDataTable.getInt("skill_chance"));
+						npcAIDat.setCanMove(NpcAIDataTable.getInt("canMove"));
+						npcAIDat.setSoulShot(NpcAIDataTable.getInt("soulshot"));
+						npcAIDat.setSpiritShot(NpcAIDataTable.getInt("spiritshot"));
+						npcAIDat.setSoulShotChance(NpcAIDataTable.getInt("sschance"));
+						npcAIDat.setSpiritShotChance(NpcAIDataTable.getInt("spschance"));
+						npcAIDat.setIsChaos(NpcAIDataTable.getInt("ischaos"));
+						npcAIDat.setShortRangeSkill(NpcAIDataTable.getInt("minrangeskill"));
+						npcAIDat.setShortRangeChance(NpcAIDataTable.getInt("minrangechance"));
+						npcAIDat.setLongRangeSkill(NpcAIDataTable.getInt("maxrangeskill"));
+						npcAIDat.setLongRangeChance(NpcAIDataTable.getInt("maxrangechance"));
+						//npcAIDat.setSwitchRangeChance(NpcAIDataTable.getInt("rangeswitchchance"));
+						npcAIDat.setClan(NpcAIDataTable.getString("clan"));
+						npcAIDat.setClanRange(NpcAIDataTable.getInt("clan_range"));
+						npcAIDat.setEnemyClan(NpcAIDataTable.getString("enemyClan"));
+						npcAIDat.setEnemyRange(NpcAIDataTable.getInt("enemyRange"));
+						npcAIDat.setDodge(NpcAIDataTable.getInt("dodge"));
+						npcAIDat.setAi(NpcAIDataTable.getString("ai_type"));
+						//npcAIDat.setBaseShldRate(NpcAIDataTable.getInt("baseShldRate"));
+						//npcAIDat.setBaseShldDef(NpcAIDataTable.getInt("baseShldDef"));
+						
+						//npcDat.addAIData(npcAIDat);
+						npcDat.setAIData(npcAIDat);
+						cont++;
+					}
+					
+					NpcAIDataTable.close();
+					statement.close();
+					_log.config("NPC AI Data Table: Loaded " + cont + " Custom AI Data.");
+				}
+				catch (Exception e)
+				{
+					_log.severe("NPCTable: Error reading NPC Custom AI Data: " + e);
+				}
+			}
 		}
 		finally
 		{

+ 2 - 2
L2_GameServer/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -881,7 +881,7 @@ public abstract class L2Character extends L2Object
         // Verify if soulshots are charged.
         boolean wasSSCharged;
 
-        if (this instanceof L2Summon && !(this instanceof L2PetInstance))
+        if (this instanceof L2Summon && !(this instanceof L2PetInstance && weaponInst != null))
             wasSSCharged = (((L2Summon)this).getChargedSoulShot() != L2ItemInstance.CHARGED_NONE);
         else
             wasSSCharged = (weaponInst != null && weaponInst.getChargedSoulshot() != L2ItemInstance.CHARGED_NONE);
@@ -958,7 +958,7 @@ public abstract class L2Character extends L2Object
              */
 
             // If we didn't miss the hit, discharge the shoulshots, if any
-            if (this instanceof L2Summon && !(this instanceof L2PetInstance))
+            if (this instanceof L2Summon && !(this instanceof L2PetInstance && weaponInst != null))
                 ((L2Summon)this).setChargedSoulShot(L2ItemInstance.CHARGED_NONE);
             else
                 if (weaponInst != null)

+ 3 - 0
L2_GameServer/java/config/General.properties

@@ -651,6 +651,9 @@ CustomDroplistTable = False
 # Default: False
 CustomMerchantTables = False
 
+# Default: False
+CustomNpcBufferTables = False
+
 
 # ---------------------------------------------------------------------------
 # Developer Settings