Browse Source

BETA: Reworking a bit StaticObjects now Fortress flags will be loaded from staticObjects.xml instead of fort_staticobjects as before.

Rumen Nikiforov 13 năm trước cách đây
mục cha
commit
389468cedc

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/GameServer.java

@@ -262,9 +262,9 @@ public class GameServer
 		NpcTable.getInstance();
 		NpcWalkerRoutesTable.getInstance();
 		WalkingManager.getInstance();
+		StaticObjects.getInstance();
 		ZoneManager.getInstance();
 		DoorTable.getInstance();
-		StaticObjects.getInstance();
 		ItemAuctionManager.getInstance();
 		CastleManager.getInstance().loadInstances();
 		FortManager.getInstance().loadInstances();

+ 58 - 120
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/StaticObjects.java

@@ -14,152 +14,90 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import gnu.trove.map.hash.TIntObjectHashMap;
-
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.LineNumberReader;
-import java.util.StringTokenizer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
 
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.engines.DocumentParser;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.instance.L2StaticObjectInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate;
 
-public class StaticObjects
+/**
+ * This class loads and holds all static object data.
+ * @author UnAfraid
+ */
+public final class StaticObjects extends DocumentParser
 {
-	private static Logger _log = Logger.getLogger(StaticObjects.class.getName());
-	
-	private TIntObjectHashMap<L2StaticObjectInstance> _staticObjects;
-	
-	public static StaticObjects getInstance()
-	{
-		return SingletonHolder._instance;
-	}
+	private static final Map<Integer, L2StaticObjectInstance> _staticObjects = new HashMap<>();
 	
 	private StaticObjects()
 	{
-		_staticObjects = new TIntObjectHashMap<L2StaticObjectInstance>();
-		parseData();
+		_staticObjects.clear();
+		parseFile(new File(Config.DATAPACK_ROOT, "data/staticObjects.xml"));
 		_log.info("StaticObject: Loaded " + _staticObjects.size() + " StaticObject Templates.");
 	}
 	
-	private void parseData()
+	@Override
+	protected void parseDocument(Document doc)
 	{
-		LineNumberReader lnr = null;
-		try
-		{
-			File doorData = new File(Config.DATAPACK_ROOT, "data/staticobjects.csv");
-			lnr = new LineNumberReader(new BufferedReader(new FileReader(doorData)));
-			
-			String line = null;
-			while ((line = lnr.readLine()) != null)
-			{
-				if (line.trim().length() == 0 || line.startsWith("#"))
-					continue;
-				
-				L2StaticObjectInstance obj = parse(line);
-				_staticObjects.put(obj.getStaticObjectId(), obj);
-			}
-		}
-		catch (FileNotFoundException e)
-		{
-			_log.warning("staticobjects.csv is missing in data folder");
-		}
-		catch (Exception e)
+		NamedNodeMap attrs;
+		Node att;
+		StatsSet set;
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
 		{
-			_log.log(Level.WARNING, "Error while creating StaticObjects table " + e.getMessage(), e);
-		}
-		finally
-		{
-			try
-			{
-				lnr.close();
-			}
-			catch (Exception e)
+			if ("list".equalsIgnoreCase(n.getNodeName()))
 			{
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+				{
+					if ("object".equalsIgnoreCase(d.getNodeName()))
+					{
+						attrs = d.getAttributes();
+						set = new StatsSet();
+						for (int i = 0; i < attrs.getLength(); i++)
+						{
+							att = attrs.item(i);
+							set.set(att.getNodeName(), att.getNodeValue());
+						}
+						addObject(set);
+					}
+				}
 			}
 		}
 	}
 	
-	public static L2StaticObjectInstance parse(String line)
+	/**
+	 * Initialize an static object based on the stats set and add it to the map.
+	 * @param set the stats set to add.
+	 */
+	private void addObject(StatsSet set)
+	{
+		L2StaticObjectInstance obj = new L2StaticObjectInstance(IdFactory.getInstance().getNextId(), new L2CharTemplate(new StatsSet()), set.getInteger("id"));
+		obj.setType(set.getInteger("type", 0));
+		obj.setName(set.getString("name"));
+		obj.setMap(set.getString("texture", "none"), set.getInteger("map_x", 0), set.getInteger("map_y", 0));
+		obj.spawnMe(set.getInteger("x"), set.getInteger("y"), set.getInteger("z"));
+		_staticObjects.put(obj.getObjectId(), obj);
+	}
+	
+	/**
+	 * @return a collection of static objects.
+	 */
+	public Collection<L2StaticObjectInstance> getStaticObjects()
 	{
-		StringTokenizer st = new StringTokenizer(line, ";");
-		
-		st.nextToken(); //Pass over static object name (not used in server)
-		
-		int id = Integer.parseInt(st.nextToken());
-		int x = Integer.parseInt(st.nextToken());
-		int y = Integer.parseInt(st.nextToken());
-		int z = Integer.parseInt(st.nextToken());
-		int type = Integer.parseInt(st.nextToken());
-		String texture = st.nextToken();
-		int map_x = Integer.parseInt(st.nextToken());
-		int map_y = Integer.parseInt(st.nextToken());
-		
-		StatsSet npcDat = new StatsSet();
-		npcDat.set("npcId", id);
-		npcDat.set("level", 0);
-		npcDat.set("jClass", "staticobject");
-		
-		npcDat.set("baseSTR", 0);
-		npcDat.set("baseCON", 0);
-		npcDat.set("baseDEX", 0);
-		npcDat.set("baseINT", 0);
-		npcDat.set("baseWIT", 0);
-		npcDat.set("baseMEN", 0);
-		
-		npcDat.set("baseShldDef", 0);
-		npcDat.set("baseShldRate", 0);
-		npcDat.set("baseAccCombat", 38);
-		npcDat.set("baseEvasRate", 38);
-		npcDat.set("baseCritRate", 38);
-		
-		//npcDat.set("name", "");
-		npcDat.set("collision_radius", 10);
-		npcDat.set("collision_height", 10);
-		npcDat.set("sex", "male");
-		npcDat.set("type", "");
-		npcDat.set("baseAtkRange", 0);
-		npcDat.set("baseMpMax", 0);
-		npcDat.set("baseCpMax", 0);
-		npcDat.set("rewardExp", 0);
-		npcDat.set("rewardSp", 0);
-		npcDat.set("basePAtk", 0);
-		npcDat.set("baseMAtk", 0);
-		npcDat.set("basePAtkSpd", 0);
-		npcDat.set("aggroRange", 0);
-		npcDat.set("baseMAtkSpd", 0);
-		npcDat.set("rhand", 0);
-		npcDat.set("lhand", 0);
-		npcDat.set("armor", 0);
-		npcDat.set("baseWalkSpd", 0);
-		npcDat.set("baseRunSpd", 0);
-		npcDat.set("name", "");
-		npcDat.set("baseHpMax", 1);
-		npcDat.set("baseHpReg", 3.e-3f);
-		npcDat.set("baseMpReg", 3.e-3f);
-		npcDat.set("basePDef", 1);
-		npcDat.set("baseMDef", 1);
-		
-		L2CharTemplate template = new L2CharTemplate(npcDat);
-		L2StaticObjectInstance obj = new L2StaticObjectInstance(IdFactory.getInstance().getNextId(), template, id);
-		obj.setType(type);
-		obj.setXYZ(x, y, z);
-		obj.setMap(texture, map_x, map_y);
-		obj.spawnMe();
-		
-		return obj;
+		return _staticObjects.values();
 	}
 	
-	public void putObject(L2StaticObjectInstance obj)
+	public static StaticObjects getInstance()
 	{
-		_staticObjects.put(obj.getStaticObjectId(), obj);
+		return SingletonHolder._instance;
 	}
 	
 	@SuppressWarnings("synthetic-access")

+ 25 - 25
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2CharTemplate.java

@@ -97,31 +97,31 @@ public class L2CharTemplate
 	public L2CharTemplate(StatsSet set)
 	{
 		// Base stats
-		_baseSTR = set.getInteger("baseSTR");
-		_baseCON = set.getInteger("baseCON");
-		_baseDEX = set.getInteger("baseDEX");
-		_baseINT = set.getInteger("baseINT");
-		_baseWIT = set.getInteger("baseWIT");
-		_baseMEN = set.getInteger("baseMEN");
-		_baseHpMax = set.getFloat("baseHpMax");
-		_baseCpMax = set.getFloat("baseCpMax");
-		_baseMpMax = set.getFloat("baseMpMax");
-		_baseHpReg = set.getFloat("baseHpReg");
-		_baseMpReg = set.getFloat("baseMpReg");
-		_basePAtk = set.getInteger("basePAtk");
-		_baseMAtk = set.getInteger("baseMAtk");
-		_basePDef = set.getInteger("basePDef");
-		_baseMDef = set.getInteger("baseMDef");
-		_basePAtkSpd = set.getInteger("basePAtkSpd");
-		_baseMAtkSpd = set.getInteger("baseMAtkSpd");
+		_baseSTR = set.getInteger("baseSTR", 0);
+		_baseCON = set.getInteger("baseCON", 0);
+		_baseDEX = set.getInteger("baseDEX", 0);
+		_baseINT = set.getInteger("baseINT", 0);
+		_baseWIT = set.getInteger("baseWIT", 0);
+		_baseMEN = set.getInteger("baseMEN", 0);
+		_baseHpMax = set.getFloat("baseHpMax", 0);
+		_baseCpMax = set.getFloat("baseCpMax", 0);
+		_baseMpMax = set.getFloat("baseMpMax", 0);
+		_baseHpReg = set.getFloat("baseHpReg", 0);
+		_baseMpReg = set.getFloat("baseMpReg", 0);
+		_basePAtk = set.getInteger("basePAtk", 0);
+		_baseMAtk = set.getInteger("baseMAtk", 0);
+		_basePDef = set.getInteger("basePDef", 0);
+		_baseMDef = set.getInteger("baseMDef", 0);
+		_basePAtkSpd = set.getInteger("basePAtkSpd", 0);
+		_baseMAtkSpd = set.getInteger("baseMAtkSpd", 0);
 		_baseMReuseRate = set.getFloat("baseMReuseDelay", 1.f);
-		_baseShldDef = set.getInteger("baseShldDef");
-		_baseAtkRange = set.getInteger("baseAtkRange");
-		_baseShldRate = set.getInteger("baseShldRate");
-		_baseCritRate = set.getInteger("baseCritRate");
+		_baseShldDef = set.getInteger("baseShldDef", 0);
+		_baseAtkRange = set.getInteger("baseAtkRange", 0);
+		_baseShldRate = set.getInteger("baseShldRate", 0);
+		_baseCritRate = set.getInteger("baseCritRate", 0);
 		_baseMCritRate = set.getInteger("baseMCritRate", 80); // CT2: The magic critical rate has been increased to 10 times.
-		_baseWalkSpd = set.getInteger("baseWalkSpd");
-		_baseRunSpd = set.getInteger("baseRunSpd");
+		_baseWalkSpd = set.getInteger("baseWalkSpd", 0);
+		_baseRunSpd = set.getInteger("baseRunSpd", 0);
 		
 		// SpecialStats
 		_baseBreath = set.getInteger("baseBreath", 100);
@@ -159,8 +159,8 @@ public class L2CharTemplate
 		_baseHpConsumeRate = set.getInteger("baseHpConsumeRate", 0);
 		
 		// Geometry
-		_fCollisionHeight = set.getDouble("collision_height");
-		_fCollisionRadius = set.getDouble("collision_radius");
+		_fCollisionHeight = set.getDouble("collision_height", 0);
+		_fCollisionRadius = set.getDouble("collision_radius", 0);
 		_collisionRadius = (int) _fCollisionRadius;
 		_collisionHeight = (int) _fCollisionHeight;
 	}

+ 12 - 23
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Fort.java

@@ -70,7 +70,6 @@ public class Fort
 	private List<L2DoorInstance> _doors = new FastList<L2DoorInstance>();
 	private L2StaticObjectInstance _flagPole = null;
 	private List<String> _doorDefault = new FastList<String>();
-	private List<String> _flagPoleStats = new FastList<String>();
 	private String _name = "";
 	private FortSiege _siege = null;
 	private Calendar _siegeDate;
@@ -828,35 +827,19 @@ public class Fort
 		}
 	}
 	
-	// This method loads fort flagpoles data from database
 	private void loadFlagPoles()
 	{
-		Connection con = null;
-		try
+		for(L2StaticObjectInstance obj : StaticObjects.getInstance().getStaticObjects())
 		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT * FROM fort_staticobjects WHERE fortId = ? AND objectType = ?");
-			statement.setInt(1, getFortId());
-			statement.setInt(2, 1);
-			ResultSet rs = statement.executeQuery();
-			while (rs.next())
+			if (obj.getType() == 3 && obj.getName().startsWith(_name))
 			{
-				//Create list of the door default for use when respawning dead doors
-				_flagPoleStats.add(rs.getString("name") + ";" + rs.getInt("id") + ";" + rs.getInt("x") + ";" + rs.getInt("y") + ";"
-						+ rs.getInt("z") + ";3;none;0;0");
-				_flagPole = StaticObjects.parse(_flagPoleStats.get(_flagPoleStats.size() - 1));
-				StaticObjects.getInstance().putObject(_flagPole);
+				_flagPole = obj;
+				break;
 			}
-			rs.close();
-			statement.close();
 		}
-		catch (Exception e)
+		if (_flagPole == null)
 		{
-			_log.log(Level.WARNING, "Exception: loadFlagPoles(): " + e.getMessage(), e);
-		}
-		finally
-		{
-			L2DatabaseFactory.close(con);
+			throw new NullPointerException("Can't find flagpole for Fort " + this);
 		}
 	}
 	
@@ -1499,4 +1482,10 @@ public class Fort
 			return true;
 		}
 	}
+	
+	@Override
+	public String toString()
+	{
+		return _name + "(" + _fortId + ")";
+	}
 }