소스 검색

Duel packets optimization: not broadcast status update if changes too low (as for party and olympiad).
MP update broadcasted only with HP or CP.

_DS_ 15 년 전
부모
커밋
0fb15346a9

+ 23 - 10
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java

@@ -4327,7 +4327,10 @@ public final class L2PcInstance extends L2Playable
 		final boolean needCpUpdate = needCpUpdate(352);
 		final boolean needHpUpdate = needHpUpdate(352);
 		// Check if a party is in progress and party window update is usefull
-		if (isInParty() && (needCpUpdate || needHpUpdate || needMpUpdate(352)))
+		if (isInParty()
+				&& (needCpUpdate
+						|| needHpUpdate
+						|| needMpUpdate(352)))
 		{
 			if (Config.DEBUG)
 				_log.fine("Send status for party window of " + getObjectId() + "(" + getName() + ") to his party. CP: " + getCurrentCp() + " HP: " + getCurrentHp() + " MP: " + getCurrentMp());
@@ -4336,26 +4339,34 @@ public final class L2PcInstance extends L2Playable
 			getParty().broadcastToPartyMembers(this, update);
 		}
 
-        if (isInOlympiadMode() && isOlympiadStart() && (needCpUpdate || needHpUpdate))
+        if (isInOlympiadMode()
+        		&& isOlympiadStart()
+        		&& (needCpUpdate || needHpUpdate))
         {
-        	ExOlympiadUserInfo olyInfo = new ExOlympiadUserInfo(this, 2);
+        	Collection<L2PcInstance> players = getKnownList().getKnownPlayers().values();
 
         	//synchronized (getKnownList().getKnownPlayers())
-        	if (Olympiad.getInstance().getPlayers(_olympiadGameId) != null)
+        	if (players != null && !players.isEmpty())
 			{
-				for (L2PcInstance player : Olympiad.getInstance().getPlayers(_olympiadGameId))
+            	ExOlympiadUserInfo olyInfo = new ExOlympiadUserInfo(this, 2);
+
+            	for (L2PcInstance player : players)
 				{
-					if (player != null && player != this)
+					if (player != null
+							&& player.isInOlympiadMode()
+							&& player.getOlympiadGameId() == _olympiadGameId)
 					{
 						player.sendPacket(olyInfo);
 					}
 				}
 			}
-            if(Olympiad.getInstance().getSpectators(_olympiadGameId) != null)
+
+        	players = Olympiad.getInstance().getSpectators(_olympiadGameId);
+            if(players != null && !players.isEmpty())
             {
-            	olyInfo = new ExOlympiadUserInfo(this, getOlympiadSide());
+            	ExOlympiadUserInfo olyInfo = new ExOlympiadUserInfo(this, getOlympiadSide());
 
-            	for(L2PcInstance spectator : Olympiad.getInstance().getSpectators(_olympiadGameId))
+            	for(L2PcInstance spectator : players)
                 {
                     if (spectator == null)
                     	continue;
@@ -4363,7 +4374,9 @@ public final class L2PcInstance extends L2Playable
                 }
             }
         }
-        if (isInDuel())
+        // In duel MP updated only with CP or HP
+        if (isInDuel()
+        		&& (needCpUpdate || needHpUpdate))
         {
         	ExDuelUpdateUserInfo update = new ExDuelUpdateUserInfo(this);
         	DuelManager.getInstance().broadcastToOppositTeam(this, update);

+ 7 - 5
L2_GameServer/java/net/sf/l2j/gameserver/model/entity/Duel.java

@@ -30,6 +30,7 @@ import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
 import net.sf.l2j.gameserver.network.serverpackets.ExDuelEnd;
 import net.sf.l2j.gameserver.network.serverpackets.ExDuelReady;
 import net.sf.l2j.gameserver.network.serverpackets.ExDuelStart;
+import net.sf.l2j.gameserver.network.serverpackets.ExDuelUpdateUserInfo;
 import net.sf.l2j.gameserver.network.serverpackets.L2GameServerPacket;
 import net.sf.l2j.gameserver.network.serverpackets.PlaySound;
 import net.sf.l2j.gameserver.network.serverpackets.SocialAction;
@@ -370,16 +371,16 @@ public class Duel
 				temp.cancelActiveTrade();
 				temp.setIsInDuel(_duelId);
 				temp.setTeam(1);
-				temp.broadcastStatusUpdate();
 				temp.broadcastUserInfo();
+				broadcastToTeam2(new ExDuelUpdateUserInfo(temp));
 			}
 			for (L2PcInstance temp : _playerB.getParty().getPartyMembers())
 			{
 				temp.cancelActiveTrade();
 				temp.setIsInDuel(_duelId);
 				temp.setTeam(2);
-				temp.broadcastStatusUpdate();
 				temp.broadcastUserInfo();
+				broadcastToTeam1(new ExDuelUpdateUserInfo(temp));
 			}
 			
 			// Send duel Start packets
@@ -407,9 +408,10 @@ public class Duel
 			broadcastToTeam2(ready);
 			broadcastToTeam1(start);
 			broadcastToTeam2(start);
-			
-			_playerA.broadcastStatusUpdate();
-			_playerB.broadcastStatusUpdate();
+
+			broadcastToTeam1(new ExDuelUpdateUserInfo(_playerB));
+			broadcastToTeam2(new ExDuelUpdateUserInfo(_playerA));
+
 			_playerA.broadcastUserInfo();
 			_playerB.broadcastUserInfo();
 		}