View difference between Paste ID: KhzXNTKE and PV3f3Pde
SHOW: | | - or go back to the newest paste.
1
diff --git a/config/CustomMods/ProtectionMods.ini b/config/CustomMods/ProtectionMods.ini
2
index 24f5fbd..a429379 100644
3
--- a/config/CustomMods/ProtectionMods.ini
4
+++ b/config/CustomMods/ProtectionMods.ini
5
@@ -116,3 +116,12 @@
6
 AltDisableBow = False
7
 DisableBowForClasses = 89
8
 
9
+#=============================================================
10
+#                   Dual Box
11
+#=============================================================
12
+# Allow players to run multiple windows with a single IP address.
13
+# In the game you can use the command // find_dualbox
14
+AllowDualBox = True
15
+AllowedBoxes = 99
16
+AllowDualBoxInOly = False
17
+
18
diff --git a/java/net/sf/l2j/Config.java b/java/net/sf/l2j/Config.java
19
index a47fa13..7b84437 100644
20
--- a/java/net/sf/l2j/Config.java
21
+++ b/java/net/sf/l2j/Config.java
22
@@ -82,6 +82,9 @@
23
 	public static int MANOR_SAVE_PERIOD_RATE;
24
 	public static boolean ANNOUNCE_PK_KILL;
25
 	public static boolean ANNOUNCE_PVP_KILL;
26
+	public static boolean ALLOW_DUALBOX;
27
+	public static int ALLOWED_BOXES;
28
+	public static boolean ALLOW_DUALBOX_OLY;
29
 	/** Clan Hall function */
30
 	public static boolean PVP_SAME_IP;
31
     public static boolean PVP_SUMON;
32
@@ -1146,6 +1149,9 @@
33
          if(!class_id.equals(""))
34
          DISABLE_BOW_CLASSES.add(Integer.parseInt(class_id));
35
          }
36
+         ALLOW_DUALBOX_OLY = Boolean.parseBoolean(Protection.getProperty("AllowDualBoxInOly", "True"));
37
+         ALLOWED_BOXES = Integer.parseInt(Protection.getProperty("AllowedBoxes", "99"));
38
+         ALLOW_DUALBOX = Boolean.parseBoolean(Protection.getProperty("AllowDualBox", "True"));
39
 	}
40
 	
41
 	private static final void loadOff()
42
diff --git a/java/net/sf/l2j/gameserver/model/actor/Player.java b/java/net/sf/l2j/gameserver/model/actor/Player.java
43
index 2b2e9e2..de2c3e1 100644
44
--- a/java/net/sf/l2j/gameserver/model/actor/Player.java
45
+++ b/java/net/sf/l2j/gameserver/model/actor/Player.java
46
@@ -7527,5 +7527,128 @@
47
 	{
48
 		_gainXpSpEnable = value;
49
 	}
50
+	/** The _active_boxes. */
51
+	public int _active_boxes = -1;
52
 	
53
+	/** The active_boxes_characters. */
54
+	public List<String> active_boxes_characters = new ArrayList<>();
55
+	/**
56
+	 * check if local player can make multibox and also refresh local boxes instances number.
57
+	 * @return true, if successful
58
+	 */
59
+	public boolean checkMultiBox()
60
+	{
61
+		
62
+		boolean output = true;
63
+		
64
+		int boxes_number = 0; // this one
65
+		final List<String> active_boxes = new ArrayList<>();
66
+		
67
+		if (getClient() != null && getClient().getConnection() != null && !getClient().getConnection().isClosed() && getClient().getConnection().getInetAddress() != null)
68
+		{
69
+			
70
+			final String thisip = getClient().getConnection().getInetAddress().getHostAddress();
71
+			final Collection<Player> allPlayers = World.getInstance().getPlayers();
72
+			for (final Player player : allPlayers)
73
+			{
74
+				if (player != null)
75
+				{
76
+					if (player.isOnline() && player.getClient() != null && player.getClient().getConnection() != null && !player.getClient().getConnection().isClosed() && player.getClient().getConnection().getInetAddress() != null && !player.getName().equals(this.getName()))
77
+					{
78
+						
79
+						final String ip = player.getClient().getConnection().getInetAddress().getHostAddress();
80
+						if (thisip.equals(ip) && this != player)
81
+						{
82
+							if (!Config.ALLOW_DUALBOX)
83
+							{
84
+								
85
+								output = false;
86
+								break;
87
+								
88
+							}
89
+							
90
+							if (boxes_number + 1 > Config.ALLOWED_BOXES)
91
+							{ // actual count+actual player one
92
+								output = false;
93
+								break;
94
+							}
95
+							boxes_number++;
96
+							active_boxes.add(player.getName());
97
+						}
98
+					}
99
+				}
100
+			}
101
+		}
102
+		
103
+		if (output)
104
+		{
105
+			_active_boxes = boxes_number + 1; // current number of boxes+this one
106
+			if (!active_boxes.contains(this.getName()))
107
+			{
108
+				active_boxes.add(this.getName());
109
+				
110
+				this.active_boxes_characters = active_boxes;
111
+			}
112
+			refreshOtherBoxes();
113
+		}
114
+		/*
115
+		 * LOGGER.info("Player "+getName()+" has this boxes"); for(String name:active_boxes_characters){ LOGGER.info("*** "+name+" ***"); }
116
+		 */
117
+		return output;
118
+	}
119
+	/**
120
+	 * descrease active boxes number for local player and other boxer for same ip.
121
+	 */
122
+	public void decreaseBoxes()
123
+	{
124
+		
125
+		_active_boxes = _active_boxes - 1;
126
+		active_boxes_characters.remove(this.getName());
127
+		
128
+		refreshOtherBoxes();
129
+		/*
130
+		 * if(getClient()!=null && !getClient().getConnection().isClosed()){ String thisip = getClient().getConnection().getSocketChannel().socket().getInetAddress().getHostAddress(); Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers(); L2PcInstance[] players =
131
+		 * allPlayers.toArray(new L2PcInstance[allPlayers.size()]); for(L2PcInstance player : players) { if(player != null) { if(player.getClient()!=null && !player.getClient().getConnection().isClosed()){ String ip =
132
+		 * player.getClient().getConnection().getSocketChannel().socket().getInetAddress().getHostAddress(); if(thisip.equals(ip) && this != player && player != null) { player._active_boxes = _active_boxes; player.active_boxes_characters = active_boxes_characters;
133
+		 * LOGGER.info("Player "+player.getName()+" has this boxes"); for(String name:player.active_boxes_characters){ LOGGER.info("*** "+name+" ***"); } } } } } }
134
+		 */
135
+		/*
136
+		 * LOGGER.info("Player "+getName()+" has this boxes"); for(String name:active_boxes_characters){ LOGGER.info("*** "+name+" ***"); }
137
+		 */
138
+	}
139
+	/**
140
+	 * increase active boxes number for local player and other boxer for same ip.
141
+	 */
142
+	public void refreshOtherBoxes()
143
+	{
144
+		
145
+		if (getClient() != null && getClient().getConnection() != null && !getClient().getConnection().isClosed() && getClient().getConnection().getInetAddress() != null)
146
+		{
147
+			
148
+			final String thisip = getClient().getConnection().getInetAddress().getHostAddress();
149
+			final Collection<Player> allPlayers = World.getInstance().getPlayers();
150
+			final Player[] players = allPlayers.toArray(new Player[allPlayers.size()]);
151
+			
152
+			for (final Player player : players)
153
+			{
154
+				if (player != null && player.isOnline())
155
+				{
156
+					if (player.getClient() != null && player.getClient().getConnection() != null && !player.getClient().getConnection().isClosed() && !player.getName().equals(this.getName()))
157
+					{
158
+						
159
+						final String ip = player.getClient().getConnection().getInetAddress().getHostAddress();
160
+						if (thisip.equals(ip) && this != player)
161
+						{
162
+							player._active_boxes = _active_boxes;
163
+							player.active_boxes_characters = active_boxes_characters;
164
+							/*
165
+							 * LOGGER.info("Player "+player.getName()+" has this boxes"); for(String name:player.active_boxes_characters){ LOGGER.info("*** "+name+" ***"); }
166
+							 */
167
+						}
168
+					}
169
+				}
170
+			}
171
+		}
172
+		
173
+	}
174
 }
175
\ No newline at end of file
176
diff --git a/java/net/sf/l2j/gameserver/model/olympiad/OlympiadManager.java b/java/net/sf/l2j/gameserver/model/olympiad/OlympiadManager.java
177
index 1b329db..1c35a8b 100644
178
--- a/java/net/sf/l2j/gameserver/model/olympiad/OlympiadManager.java
179
+++ b/java/net/sf/l2j/gameserver/model/olympiad/OlympiadManager.java
180
@@ -10,6 +10,7 @@
181
 
182
 import net.sf.l2j.Config;
183
 import net.sf.l2j.gameserver.enums.OlympiadType;
184
+import net.sf.l2j.gameserver.model.World;
185
 import net.sf.l2j.gameserver.model.actor.Npc;
186
 import net.sf.l2j.gameserver.model.actor.Player;
187
 import net.sf.l2j.gameserver.network.SystemMessageId;
188
@@ -126,6 +127,22 @@
189
 			return false;
190
 		}
191
 		
192
+		// Olympiad dualbox protection
193
+		if (player._active_boxes > 1 && !Config.ALLOW_DUALBOX_OLY)
194
+		{
195
+			final List<String> players_in_boxes = player.active_boxes_characters;
196
+			
197
+			if (players_in_boxes != null && players_in_boxes.size() > 1)
198
+				for (final String character_name : players_in_boxes)
199
+				{
200
+					final Player activeChar = World.getInstance().getPlayer(character_name);
201
+					if (activeChar != null && (activeChar.getOlympiadGameId() > 0 || activeChar.isInOlympiadMode() || OlympiadManager.getInstance().isRegistered(activeChar)))
202
+					{
203
+						activeChar.sendMessage("You are already participating in Olympiad with another char!");
204
+						return false;
205
+					}
206
+				}
207
+		}
208
 		if (Olympiad.getInstance().getMillisToCompEnd() < 600000)
209
 		{
210
 			player.sendPacket(SystemMessageId.GAME_REQUEST_CANNOT_BE_MADE);
211
diff --git a/java/net/sf/l2j/gameserver/network/GameClient.java b/java/net/sf/l2j/gameserver/network/GameClient.java
212
index 860138d..c2c200e 100644
213
--- a/java/net/sf/l2j/gameserver/network/GameClient.java
214
+++ b/java/net/sf/l2j/gameserver/network/GameClient.java
215
@@ -112,6 +112,8 @@
216
 				
217
 				if (getPlayer().getSummon() != null)
218
 					getPlayer().getSummon().store();
219
+				if (_player._active_boxes != -1)
220
+					_player.decreaseBoxes();
221
 			}
222
 		}, 300000L, 900000L);
223
 	}
224
@@ -212,6 +214,9 @@
225
 				if (getPlayer() != null && !isDetached())
226
 				{
227
 					setDetached(true);
228
+					// Decrease boxes number
229
+					if (_player._active_boxes != -1)
230
+						_player.decreaseBoxes();
231
 					if (offlineMode(getPlayer()))
232
 					{
233
 						if (getPlayer().getParty() != null)
234
diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java b/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
235
index e0aaa70..b41537e 100644
236
--- a/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
237
+++ b/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
238
@@ -226,7 +226,12 @@
239
 		{
240
 			Olympiad.olympiadEnd(player);
241
 		} 
242
-		
243
+		// Means that it's not ok multiBox situation, so logout
244
+	if (!player.checkMultiBox())
245
+		{
246
+			player.sendPacket(new ExShowScreenMessage("I'm sorry, but multibox is not allowed here, Disconnect 5 Segunds", 5000));
247
+			ThreadPool.schedule(new Runnable()
248
+			{
249
+				@Override
250
+				public void run()
251
+				{					
252
+					player.logout(true);
253
+				}
254
+			}, 5000);
255
+		
256
+		}
257
 		// If the Player is a Dark Elf, check for Shadow Sense at night.
258
 		if (player.getRace() == ClassRace.DARK_ELF && player.hasSkill(L2Skill.SKILL_SHADOW_SENSE))
259
 			player.sendPacket(SystemMessage.getSystemMessage((GameTimeTaskManager.getInstance().isNight()) ? SystemMessageId.NIGHT_S1_EFFECT_APPLIES : SystemMessageId.DAY_S1_EFFECT_DISAPPEARS).addSkillName(L2Skill.SKILL_SHADOW_SENSE));
260
diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java b/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
261
index 3520e73..0a071c9 100644
262
--- a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
263
+++ b/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java
264
@@ -43,7 +43,11 @@
265
 			sendPacket(RestartResponse.valueOf(false));
266
 			return;
267
 		}
268
-		
269
+		// delete box from the world
270
+		if (player._active_boxes != -1)
271
+		{
272
+			player.decreaseBoxes();
273
+		}
274
 		if (player.isFestivalParticipant() && FestivalOfDarknessManager.getInstance().isFestivalInitialized())
275
 		{
276
 			player.sendPacket(SystemMessageId.NO_RESTART_HERE);
277