Ver código fonte

BETA: Fix for NPE while restoring clan wars
* Methods that listeners was located in are used only to restore data now they are moved where they belong.
* Moving initial equipment from CharTemplateTable its not required to be there :)
* Removing 'this' from L2Effect

Rumen Nikiforov 13 anos atrás
pai
commit
5ca69ed615

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/CharTemplateTable.java

@@ -95,7 +95,7 @@ public final class CharTemplateTable
 				set.set("collision_radius_female", rset.getDouble("f_col_r"));
 				set.set("collision_height_female", rset.getDouble("f_col_h"));
 				
-				final L2PcTemplate ct = new L2PcTemplate(set, InitialEquipmentData.getInstance().getEquipmentList(cId));
+				final L2PcTemplate ct = new L2PcTemplate(set);
 				_charTemplates.put(ClassId.getClassId(cId), ct);
 			}
 			rset.close();

+ 97 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ClanTable.java

@@ -18,12 +18,13 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javolution.util.FastMap;
+import javolution.util.FastList;
 
 import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
@@ -50,6 +51,9 @@ import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListAll;
 import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListUpdate;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.gameserver.network.serverpackets.UserInfo;
+import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarEvent;
+import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script.EventStage;
+import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanWarListener;
 import com.l2jserver.gameserver.util.Util;
 
 /**
@@ -60,8 +64,9 @@ import com.l2jserver.gameserver.util.Util;
 public class ClanTable
 {
 	private static Logger _log = Logger.getLogger(ClanTable.class.getName());
+	private static List<ClanWarListener> clanWarListeners = new FastList<ClanWarListener>().shared();
 	
-	private final Map<Integer, L2Clan> _clans;
+	private final Map<Integer, L2Clan> _clans = new HashMap<>();
 	
 	public static ClanTable getInstance()
 	{
@@ -79,7 +84,6 @@ public class ClanTable
 		if (Config.COMMUNITY_TYPE > 0)
 			ForumsBBSManager.getInstance().initRoot();
 		
-		_clans = new FastMap<Integer, L2Clan>();
 		L2Clan clan;
 		Connection con = null;
 		try
@@ -371,6 +375,12 @@ public class ClanTable
 	{
 		L2Clan clan1 = ClanTable.getInstance().getClan(clanId1);
 		L2Clan clan2 = ClanTable.getInstance().getClan(clanId2);
+		
+		if (!fireClanWarStartListeners(clan1, clan2))
+		{
+			return;
+		}
+		
 		clan1.setEnemyClan(clan2);
 		clan2.setAttackerClan(clan1);
 		clan1.broadcastClanStatus();
@@ -413,6 +423,12 @@ public class ClanTable
 	{
 		L2Clan clan1 = ClanTable.getInstance().getClan(clanId1);
 		L2Clan clan2 = ClanTable.getInstance().getClan(clanId2);
+		
+		if (!fireClanWarEndListeners(clan1, clan2))
+		{
+			return;
+		}
+		
 		clan1.deleteEnemyClan(clan2);
 		clan2.deleteAttackerClan(clan1);
 		clan1.broadcastClanStatus();
@@ -472,6 +488,10 @@ public class ClanTable
 		}
 		if (count == clan1.getMembers().length - 1)
 		{
+			if (!fireClanWarEndListeners(clan1, clan2))
+			{
+				return;
+			}
 			clan1.deleteEnemyClan(clan2);
 			clan2.deleteEnemyClan(clan1);
 			deleteclanswars(clan1.getClanId(), clan2.getClanId());
@@ -485,7 +505,7 @@ public class ClanTable
 		try
 		{
 			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT clan1, clan2, wantspeace1, wantspeace2 FROM clan_wars");
+			PreparedStatement statement = con.prepareStatement("SELECT clan1, clan2 FROM clan_wars");
 			ResultSet rset = statement.executeQuery();
 			while (rset.next())
 			{
@@ -555,6 +575,79 @@ public class ClanTable
 			clan.updateClanScoreInDB();
 	}
 	
+	/**
+	 * Fires all the ClanWarListener.onWarStart() methods<br>
+	 * Returns true if the clan war is allowed
+	 * @param clan1
+	 * @param clan2
+	 * @return
+	 */
+	private boolean fireClanWarStartListeners(L2Clan clan1, L2Clan clan2)
+	{
+		if (!clanWarListeners.isEmpty() && clan1 != null && clan2 != null)
+		{
+			ClanWarEvent event = new ClanWarEvent();
+			event.setClan1(clan1);
+			event.setClan2(clan2);
+			event.setStage(EventStage.START);
+			for (ClanWarListener listener : clanWarListeners)
+			{
+				if (!listener.onWarStart(event))
+				{
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * Fires all the ClanWarListener.onWarEnd() methods<br>
+	 * Returns true if the clan war end is allowed
+	 * @param clan1
+	 * @param clan2
+	 * @return
+	 */
+	private boolean fireClanWarEndListeners(L2Clan clan1, L2Clan clan2)
+	{
+		if (!clanWarListeners.isEmpty() && clan1 != null && clan2 != null)
+		{
+			ClanWarEvent event = new ClanWarEvent();
+			event.setClan1(clan1);
+			event.setClan2(clan2);
+			event.setStage(EventStage.END);
+			for (ClanWarListener listener : clanWarListeners)
+			{
+				if (!listener.onWarEnd(event))
+				{
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * Adds a clan war listener
+	 * @param listener
+	 */
+	public static void addClanWarListener(ClanWarListener listener)
+	{
+		if (!clanWarListeners.contains(listener))
+		{
+			clanWarListeners.add(listener);
+		}
+	}
+	
+	/**
+	 * Removes a clan war listener
+	 * @param listener
+	 */
+	public static void removeClanWarListener(ClanWarListener listener)
+	{
+		clanWarListeners.remove(listener);
+	}
+	
 	private static class SingletonHolder
 	{
 		protected static final ClanTable _instance = new ClanTable();

+ 2 - 89
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Clan.java

@@ -69,11 +69,8 @@ import com.l2jserver.gameserver.scripting.scriptengine.events.ClanJoinEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLeaderChangeEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLeaveEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ClanLevelUpEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarEvent;
-import com.l2jserver.gameserver.scripting.scriptengine.impl.L2Script.EventStage;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanCreationListener;
 import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanMembershipListener;
-import com.l2jserver.gameserver.scripting.scriptengine.listeners.clan.ClanWarListener;
 import com.l2jserver.gameserver.util.Util;
 
 /**
@@ -85,9 +82,8 @@ public class L2Clan
 {
 	private static final Logger _log = Logger.getLogger(L2Clan.class.getName());
 	
-	private static FastList<ClanCreationListener> clanCreationListeners = new FastList<ClanCreationListener>().shared();
-	private static FastList<ClanMembershipListener> clanMembershipListeners = new FastList<ClanMembershipListener>().shared();
-	private static FastList<ClanWarListener> clanWarListeners = new FastList<ClanWarListener>().shared();
+	private static List<ClanCreationListener> clanCreationListeners = new FastList<ClanCreationListener>().shared();
+	private static List<ClanMembershipListener> clanMembershipListeners = new FastList<ClanMembershipListener>().shared();
 	
 	private String _name;
 	private int _clanId;
@@ -1497,20 +1493,12 @@ public class L2Clan
 	
 	public void setEnemyClan(L2Clan clan)
 	{
-		if (!fireClanWarStartListeners(clan))
-		{
-			return;
-		}
 		Integer id = clan.getClanId();
 		_atWarWith.add(id);
 	}
 	
 	public void setEnemyClan(Integer clan)
 	{
-		if (!fireClanWarStartListeners(ClanTable.getInstance().getClan(clan)))
-		{
-			return;
-		}
 		_atWarWith.add(clan);
 	}
 	
@@ -1527,10 +1515,6 @@ public class L2Clan
 	
 	public void deleteEnemyClan(L2Clan clan)
 	{
-		if (!fireClanWarEndListeners(clan))
-		{
-			return;
-		}
 		Integer id = clan.getClanId();
 		_atWarWith.remove(id);
 	}
@@ -3013,56 +2997,6 @@ public class L2Clan
 		return true;
 	}
 	
-	/**
-	 * Fires all the ClanWarListener.onWarStart() methods<br>
-	 * Returns true if the clan war is allowed
-	 * @param clan -> the new enemy clan
-	 * @return
-	 */
-	private boolean fireClanWarStartListeners(L2Clan clan)
-	{
-		if (!clanWarListeners.isEmpty() && clan != null)
-		{
-			ClanWarEvent event = new ClanWarEvent();
-			event.setClan1(this);
-			event.setClan2(clan);
-			event.setStage(EventStage.START);
-			for (ClanWarListener listener : clanWarListeners)
-			{
-				if (!listener.onWarStart(event))
-				{
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * Fires all the ClanWarListener.onWarEnd() methods<br>
-	 * Returns true if the clan war end is allowed
-	 * @param clan -> the enemy clan
-	 * @return
-	 */
-	private boolean fireClanWarEndListeners(L2Clan clan)
-	{
-		if (!clanWarListeners.isEmpty() && clan != null)
-		{
-			ClanWarEvent event = new ClanWarEvent();
-			event.setClan1(this);
-			event.setClan2(clan);
-			event.setStage(EventStage.END);
-			for (ClanWarListener listener : clanWarListeners)
-			{
-				if (!listener.onWarEnd(event))
-				{
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-	
 	/**
 	 * Fires all the ClanCreationListener.onClanLevelUp() methods, if any<br>
 	 * Blocks the level up if it returns false
@@ -3127,25 +3061,4 @@ public class L2Clan
 	{
 		clanMembershipListeners.remove(listener);
 	}
-	
-	/**
-	 * Adds a clan war listener
-	 * @param listener
-	 */
-	public static void addClanWarListener(ClanWarListener listener)
-	{
-		if (!clanWarListeners.contains(listener))
-		{
-			clanWarListeners.add(listener);
-		}
-	}
-	
-	/**
-	 * Removes a clan war listener
-	 * @param listener
-	 */
-	public static void removeClanWarListener(ClanWarListener listener)
-	{
-		clanWarListeners.remove(listener);
-	}
 }

+ 3 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2PcTemplate.java

@@ -16,6 +16,7 @@ package com.l2jserver.gameserver.model.actor.templates;
 
 import java.util.List;
 
+import com.l2jserver.gameserver.datatables.InitialEquipmentData;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.base.ClassId;
 import com.l2jserver.gameserver.model.base.ClassInfo;
@@ -53,7 +54,7 @@ public class L2PcTemplate extends L2CharTemplate
 	
 	private final List<PcItemTemplate> _initialEquipment;
 	
-	public L2PcTemplate(StatsSet set, List<PcItemTemplate> initialEquipment)
+	public L2PcTemplate(StatsSet set)
 	{
 		super(set);
 		_classId = ClassId.getClassId(set.getInteger("classId"));
@@ -80,7 +81,7 @@ public class L2PcTemplate extends L2CharTemplate
 		
 		_fallHeight = 333; // TODO: Unhardcode it.
 		
-		_initialEquipment = initialEquipment;
+		_initialEquipment = InitialEquipmentData.getInstance().getEquipmentList(_classId);
 	}
 	
 	/**

+ 11 - 11
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/L2Effect.java

@@ -116,7 +116,7 @@ public abstract class L2Effect implements IChanceSkillTrigger
 			{
 				_periodFirstTime = 0;
 				_periodStartTicks = GameTimeController.getGameTicks();
-				L2Effect.this.scheduleEffect();
+				scheduleEffect();
 			}
 			catch (Exception e)
 			{
@@ -390,7 +390,7 @@ public abstract class L2Effect implements IChanceSkillTrigger
 	 */
 	public final void exit()
 	{
-		this.exit(false);
+		exit(false);
 	}
 	
 	public final void exit(boolean preventUpdate)
@@ -640,15 +640,15 @@ public abstract class L2Effect implements IChanceSkillTrigger
 	public boolean canBeStolen()
 	{
 		if(!effectCanBeStolen()
-				|| this.getEffectType() == L2EffectType.TRANSFORMATION
-				|| this.getSkill().isPassive()
-				|| this.getSkill().isToggle()
-				|| this.getSkill().isDebuff()
-				|| this.getSkill().isHeroSkill()
-				|| this.getSkill().isGMSkill()
-				|| (this.getSkill().isPotion() && (this.getSkill().getId() != 2274 && this.getSkill().getId() != 2341)) // Hardcode for now :<
-				|| this.isHerbEffect()
-				|| !this.getSkill().canBeDispeled())
+				|| getEffectType() == L2EffectType.TRANSFORMATION
+				|| getSkill().isPassive()
+				|| getSkill().isToggle()
+				|| getSkill().isDebuff()
+				|| getSkill().isHeroSkill()
+				|| getSkill().isGMSkill()
+				|| (getSkill().isPotion() && (getSkill().getId() != 2274 && getSkill().getId() != 2341)) // Hardcode for now :<
+				|| isHerbEffect()
+				|| !getSkill().canBeDispeled())
 			return false;
 		return true;
 	}

+ 3 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/scripting/scriptengine/listeners/clan/ClanWarListener.java

@@ -14,7 +14,7 @@
  */
 package com.l2jserver.gameserver.scripting.scriptengine.listeners.clan;
 
-import com.l2jserver.gameserver.model.L2Clan;
+import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.scripting.scriptengine.events.ClanWarEvent;
 import com.l2jserver.gameserver.scripting.scriptengine.impl.L2JListener;
 
@@ -46,12 +46,12 @@ public abstract class ClanWarListener extends L2JListener
 	@Override
 	public void register()
 	{
-		L2Clan.addClanWarListener(this);
+		ClanTable.addClanWarListener(this);
 	}
 	
 	@Override
 	public void unregister()
 	{
-		L2Clan.removeClanWarListener(this);
+		ClanTable.removeClanWarListener(this);
 	}
 }