View difference between Paste ID: 6L7wpndf and GTH4zTf8
SHOW: | | - or go back to the newest paste.
1
diff --git a/config/CustomMods/Classes/ClassesDamages.ini b/config/CustomMods/Classes/ClassesDamages.ini
2
new file mode 100644
3
index 0000000..e284c65
4
--- /dev/null
5
+++ b/config/CustomMods/Classes/ClassesDamages.ini
6
@@ -0,0 +1,180 @@
7
+#====================================================
8
+#[PT] 3° JOB DANOS CAUSADOS EM TODOS OS FIGHTERS
9
+#[EN] 3° JOB Damages to Fighters
10
+#====================================================
11
+Duelist__ToFighter=1.0
12
+DreadNought__ToFighter=1.0
13
+Phoenix_Knight__ToFighter=1.0
14
+Hell_Knight__ToFighter=1.0
15
+Sagittarius__ToFighter=1.0
16
+Adventurer__ToFighter=1.0
17
+Archmage__ToFighter=1.0
18
+Soultaker__ToFighter=1.0
19
+Arcana_Lord__ToFighter=1.0
20
+Cardinal__ToFighter=1.0
21
+Hierophant__ToFighter=1.0
22
+Eva_Templar__ToFighter=1.0
23
+Sword_Muse__ToFighter=1.0
24
+Wind_Rider__ToFighter=1.0
25
+Moonlight_Sentinel__ToFighter=1.0
26
+Mystic_Muse__ToFighter=1.0
27
+Elemental_Master__ToFighter=1.0
28
+Eva_s_Saint__ToFighter=1.0
29
+Shillien_Templar__ToFighter=1.0
30
+Spectral_Dancer__ToFighter=1.0
31
+Ghost_Hunter__ToFighter=1.0
32
+Ghost_Sentinel__ToFighter=1.0
33
+Storm_Screamer__ToFighter=1.0
34
+Spectral_Master__ToFighter=1.0
35
+Shillien_Saint__ToFighter=1.0
36
+Titan__ToFighter=1.0
37
+Grand_Khauatari__ToFighter=1.0
38
+Dominator__ToFighter=1.0
39
+Doomcryer__ToFighter=1.0
40
+Fortune_Seeker__ToFighter=1.0
41
+Maestro__ToFighter=1.0
42
+#====================================================
43
+#[PT]3° JOB DANOS CAUSADOS EM TODOS OS MAGOS
44
+#[EN]3° JOB Damages to Mage
45
+#====================================================
46
+Duelist__ToMage=1.1
47
+DreadNought__ToMage=1.0
48
+Phoenix_Knight__ToMage=1.0
49
+Hell_Knight__ToMage=1.0
50
+Sagittarius__ToMage=1.0
51
+Adventurer__ToMage=1.0
52
+Archmage__ToMage=1.0
53
+Soultaker__ToMage=1.0
54
+Arcana_Lord__ToMage=1.0
55
+Cardinal__ToMage=1.0
56
+Hierophant__ToMage=1.0
57
+Eva_Templar__ToMage=1.0
58
+Sword_Muse__ToMage=1.0
59
+Wind_Rider__ToMage=1.0
60
+Moonlight_Sentinel__ToMage=1.0
61
+Mystic_Muse__ToMage=1.0
62
+Elemental_Master__ToMage=1.0
63
+Eva_s_Saint__ToMage=1.0
64
+Shillien_Templar__ToMage=1.0
65
+Spectral_Dancer__ToMage=1.0
66
+Ghost_Hunter__ToMage=1.0
67
+Ghost_Sentinel__ToMage=1.0
68
+Storm_Screamer__ToMage=1.0
69
+Spectral_Master__ToMage=1.0
70
+Shillien_Saint__ToMage=1.0
71
+Titan__ToMage=1.0
72
+Grand_Khauatari__ToMage=1.0
73
+Dominator__ToMage=0.95
74
+Doomcryer__ToMage=0.95
75
+Fortune_Seeker__ToMage=1.0
76
+Maestro__ToMage=1.0
77
+#====================================================
78
+#[PT]3° JOB DANOS DOS FIGHTERS EM DETERMINADA CLASSE
79
+#[EN]3° JOB Damages Fighter per class
80
+#====================================================
81
+Duelist__ByFighter=1.0
82
+DreadNought__ByFighter=1.0
83
+Phoenix_Knight__ByFighter=1.0
84
+Hell_Knight__ByFighter=1.0
85
+Sagittarius__ByFighter1.0
86
+Adventurer__ByFighter=1.0
87
+Archmage__ByFighter=1.0
88
+Soultaker__ByFighter=1.0
89
+Arcana_Lord__ByFighter=1.0
90
+Cardinal__ByFighter=1.0
91
+Hierophant__ByFighter=1.0
92
+Eva_Templar__ByFighter=1.0
93
+Sword_Muse__ByFighter=1.0
94
+Wind_Rider__ByFighter=1.0
95
+Moonlight_Sentinel__ByFighter=1.0
96
+Mystic_Muse__ByFighter=1.0
97
+Elemental_Master__ByFighter=1.0
98
+Eva_s_Saint__ByFighter=1.0
99
+Shillien_Templar__ByFighter=1.0
100
+Spectral_Dancer__ByFighter=1.0
101
+Ghost_Hunter__ByFighter=1.0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
102
+Ghost_Sentinel__ByFighter=1.0
103
+Storm_Screamer__ByFighter=1.0
104
+Spectral_Master__ByFighter=1.0
105
+Shillien_Saint__ByFighter=1.0
106
+Titan__ByFighter=1.0
107
+Grand_Khauatari__ByFighter=1.0
108
+Dominator__ByFighter=1.0
109
+Doomcryer__ByFighter=1.0
110
+Fortune_Seeker__ByFighter=1.0
111
+Maestro__ByFighter=1.0
112
+#====================================================
113
+#[PT]3° JOB DANOS DOS MAGOS EM DETERMINADA CLASSE
114
+#[EN]3° JOB Damages Fighter per class
115
+#====================================================
116
+Duelist__ByMage=1.0
117
+DreadNought__ByMage=1.0
118
+Phoenix_Knight__ByMage=1.0
119
+Hell_Knight__ByMage=1.0
120
+Sagittarius__ByMage=1.0
121
+Adventurer__ByMage=1.0
122
+Archmage__ByMage=1.0
123
+Soultaker__ByMage=1.0
124
+Arcana_Lord__ByMage=1.0
125
+Cardinal__ByMage=1.0
126
+Hierophant__ByMage=1.0
127
+Eva_Templar__ByMage=1.0
128
+Sword_Muse__ByMage=1.0
129
+Wind_Rider__ByMage=1.0
130
+Moonlight_Sentinel__ByMage=1.0
131
+Mystic_Muse__ByMage=1.0
132
+Elemental_Master__ByMage=1.0
133
+Eva_s_Saint__ByMage=1.0
134
+Shillien_Templar__ByMage=1.0
135
+Spectral_Dancer__ByMage=1.0
136
+Ghost_Hunter__ByMage=1.0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
137
+Ghost_Sentinel__ByMage=1.0
138
+Storm_Screamer__ByMage=1.0
139
+Spectral_Master__ByMage=1.0
140
+Shillien_Saint__ByMage=1.0
141
+Titan__ByMage=1.0
142
+Grand_Khauatari__ByMage=1.0
143
+Dominator__ByMage=1.0
144
+Doomcryer__ByMage=1.0
145
+Fortune_Seeker__ByMage=1.0
146
+Maestro__ByMage=1.0
147
+#====================================================
148
+#[PT]1° e 2° Job DANOS CAUSADOS EM TODOS OS MAGOS
149
+#[EN]1° and 2° Job Damages to Mages
150
+#====================================================
151
+Human_Mystic__ToMage=1.0
152
+Human_Wizard__ToMage=1.0
153
+Sorceror__ToMage=1.0
154
+Necromancer__ToMage=1.0
155
+Warlock__ToMage=1.0
156
+Elven_Mystic__ToMage=1.0
157
+Elven_Wizard__ToMage=1.0
158
+Spellsinger__ToMage=1.0
159
+Dark_Elven_Mystic__ToMage=1.0
160
+Dark_Elven_Wizard__ToMage=1.0
161
+Spellhowler__ToMage=1.0
162
+Phantom_Summoner__ToMage=1.0
163
+Orc_Figther__ToMage=1.0
164
+Orc_Mystic__ToMage=1.0
165
+Orc_Shaman__ToMage=1.0
166
+Ovelord__ToMage=1.0
167
+#====================================================
168
+#[PT]1° e 2° Job DANOS CAUSADOS EM TODOS OS FIGHTERS
169
+#[EN]1° and 2° Job Damages to Fighters
170
+#====================================================
171
+Human_Mystic__ToFighter=1.0
172
+Human_Wizard__ToFighter=1.0
173
+Sorceror__ToFighter=1.0
174
+Necromancer__ToFighter=1.0
175
+Warlock__ToFighter=1.0
176
+Elven_Mystic__ToFighter=1.0
177
+Elven_Wizard__ToFighter=1.0
178
+Spellsinger__ToFighter=1.0
179
+Dark_Elven_Mystic__ToFighter=1.0
180
+Dark_Elven_Wizard__ToFighter=1.0
181
+Spellhowler__ToFighter=1.0
182
+Phantom_Summoner__ToFighter=1.0
183
+Orc_Figther__ToFighter=1.0
184
+Orc_Mystic__ToFighter=1.0
185
+Orc_Shaman__ToFighter=1.0
186
+Ovelord__ToFighter=1.0
187
diff --git a/config/CustomMods/Classes/ClassesDamagesOly.ini b/config/CustomMods/Classes/ClassesDamagesOly.ini
188
new file mode 100644
189
index 0000000..5ca94ba
190
--- /dev/null
191
+++ b/config/CustomMods/Classes/ClassesDamagesOly.ini
192
@@ -0,0 +1,70 @@
193
+#====================================================
194
+#[PT] 3° Job DANOS CAUSADOS EM TODOS OS FIGHTERS
195
+#[EN] 3° Job Damages to Fighters
196
+#====================================================
197
+Duelist__ToFighter=1.4
198
+DreadNought__ToFighter=1.1
199
+Phoenix_Knight__ToFighter=2.2
200
+Hell_Knight__ToFighter=2.3
201
+Sagittarius__ToFighter=1.2
202
+Adventurer__ToFighter=1.3
203
+Archmage__ToFighter=0.55
204
+Soultaker__ToFighter=0.3
205
+Arcana_Lord__ToFighter=1.3
206
+Cardinal__ToFighter=1.4
207
+Hierophant__ToFighter=1.4
208
+Eva_Templar__ToFighter=1.2
209
+Sword_Muse__ToFighter=1.4
210
+Wind_Rider__ToFighter=1.35
211
+Moonlight_Sentinel__ToFighter=1.2
212
+Mystic_Muse__ToFighter=0.55
213
+Elemental_Master__ToFighter=1.4
214
+Eva_s_Saint__ToFighter=1.4
215
+Shillien_Templar__ToFighter=1.4
216
+Spectral_Dancer__ToFighter=1.4
217
+Ghost_Hunter__ToFighter=1.35
218
+Ghost_Sentinel__ToFighter=1.2
219
+Storm_Screamer__ToFighter=0.3
220
+Spectral_Master__ToFighter=1.4
221
+Shillien_Saint__ToFighter=1.4
222
+Titan__ToFighter=1.5
223
+Grand_Khauatari__ToFighter=0.7
224
+Dominator__ToFighter=0.35
225
+Doomcryer__ToFighter=0.35
226
+Fortune_Seeker__ToFighter=2.0
227
+Maestro__ToFighter=2.0
228
+#====================================================
229
+#[PT]3° JOB DANOS CAUSADOS EM TODOS OS MAGOS
230
+#[EN]3° JOB Damages to Mage
231
+#====================================================
232
+Duelist__ToMage=1.4
233
+DreadNought__ToMage=1.1
234
+Phoenix_Knight__ToMage=2.2
235
+Hell_Knight__ToMage=2.3
236
+Sagittarius__ToMage=1.2
237
+Adventurer__ToMage=1.3
238
+Archmage__ToMage=0.55
239
+Soultaker__ToMage=0.3
240
+Arcana_Lord__ToMage=1.3
241
+Cardinal__ToMage=1.4
242
+Hierophant__ToMage=1.4
243
+Eva_Templar__ToMage=1.2
244
+Sword_Muse__ToMage=1.4
245
+Wind_Rider__ToMage=1.35
246
+Moonlight_Sentinel__ToMage=1.2
247
+Mystic_Muse__ToMage=0.55
248
+Elemental_Master__ToMage=1.4
249
+Eva_s_Saint__ToMage=1.4
250
+Shillien_Templar__ToMage=1.4
251
+Spectral_Dancer__ToMage=1.4
252
+Ghost_Hunter__ToMage=1.35
253
+Ghost_Sentinel__ToMage=1.2
254
+Storm_Screamer__ToMage=0.3
255
+Spectral_Master__ToMage=1.4
256
+Shillien_Saint__ToMage=1.4
257
+Titan__ToMage=1.5
258
+Grand_Khauatari__ToMage=0.7
259
+Dominator__ToMage=0.35
260
+Doomcryer__ToMage=0.35
261
+Fortune_Seeker__ToMage=2.0
262
+Maestro__ToMage=2.0
263
diff --git a/config/CustomMods/SpecialMods.ini b/config/CustomMods/SpecialMods.ini
264
index 3110294..e9c2e61 100644
265
--- a/config/CustomMods/SpecialMods.ini
266
+++ b/config/CustomMods/SpecialMods.ini
267
@@ -54,3 +54,11 @@
268
 # Arrows IDS = 1341,1342,1343,1344,1345
269
 AutoLootExcludeItems = 1341,1342,1343,1344,1345,57
270
 
271
+#====================================================
272
+#               OLLY SETTINGS
273
+#====================================================
274
+# Enable Class Damages Settings
275
+EnableClassDamagesSettings = True
276
+EnableClassDamagesLogger = False
277
+EnableClassDamagesSettingsInOly = True
278
+
279
diff --git a/java/net/sf/l2j/Config.java b/java/net/sf/l2j/Config.java
280
index 39cb5b7..94de39e 100644
281
--- a/java/net/sf/l2j/Config.java
282
+++ b/java/net/sf/l2j/Config.java
283
@@ -55,6 +55,9 @@
284
 	// Clans settings
285
 	// --------------------------------------------------
286
 	/** Clans */
287
+	public static boolean ENABLE_CLASS_DAMAGES;
288
+	public static boolean ENABLE_CLASS_DAMAGES_IN_OLY;
289
+	public static boolean ENABLE_CLASS_DAMAGES_LOGGER;
290
 	public static boolean ENABLE_ENCHANT_ANNOUNCE;
291
 	public static int ENCHANT_ANNOUNCE_LEVEL;
292
 	public static boolean ALT_GAME_VIEWNPC;
293
@@ -1510,6 +1513,9 @@
294
 	private static final void loadSpecial()
295
 	{
296
 		final ExProperties Special = initProperties(SPECIAL_MODS);
297
+		ENABLE_CLASS_DAMAGES = Special.getProperty("EnableClassDamagesSettings", true);
298
+		ENABLE_CLASS_DAMAGES_IN_OLY = Special.getProperty("EnableClassDamagesSettingsInOly", true);
299
+		ENABLE_CLASS_DAMAGES_LOGGER = Special.getProperty("EnableClassDamagesLogger", true);
300
 		ENABLE_ENCHANT_ANNOUNCE = Boolean.parseBoolean(Special.getProperty("EnableEnchantAnnounce", "False"));
301
 		ENCHANT_ANNOUNCE_LEVEL = Integer.parseInt(Special.getProperty("EnchantAnnounceLevel", "16"));
302
 		ALT_GAME_VIEWNPC = Boolean.parseBoolean(Special.getProperty("AltGameViewNpc", "False"));
303
diff --git a/java/net/sf/l2j/gameserver/GameServer.java b/java/net/sf/l2j/gameserver/GameServer.java
304
index 3cfc5b7..22b0419 100644
305
--- a/java/net/sf/l2j/gameserver/GameServer.java
306
+++ b/java/net/sf/l2j/gameserver/GameServer.java
307
@@ -27,6 +27,7 @@
308
 import net.sf.l2j.gameserver.data.manager.CastleManager;
309
 import net.sf.l2j.gameserver.data.manager.CastleManorManager;
310
 import net.sf.l2j.gameserver.data.manager.ClanHallManager;
311
+import net.sf.l2j.gameserver.data.manager.ClassDamageManager;
312
 import net.sf.l2j.gameserver.data.manager.CoupleManager;
313
 import net.sf.l2j.gameserver.data.manager.CursedWeaponManager;
314
 import net.sf.l2j.gameserver.data.manager.DayNightManager;
315
@@ -38,6 +39,7 @@
316
 import net.sf.l2j.gameserver.data.manager.GrandBossManager;
317
 import net.sf.l2j.gameserver.data.manager.HeroManager;
318
 import net.sf.l2j.gameserver.data.manager.LotteryManager;
319
+import net.sf.l2j.gameserver.data.manager.OlympiadDamageManager;
320
 import net.sf.l2j.gameserver.data.manager.PartyMatchRoomManager;
321
 import net.sf.l2j.gameserver.data.manager.PartyZoneReward;
322
 import net.sf.l2j.gameserver.data.manager.PetitionManager;
323
@@ -171,6 +173,15 @@
324
 		AnnouncementData.getInstance();
325
 		ServerMemoTable.getInstance();
326
 		
327
+		StringUtil.printSection("Classes Damages");
328
+		if (Config.ENABLE_CLASS_DAMAGES)
329
+			ClassDamageManager.loadConfig();
330
+		
331
+		if (Config.ENABLE_CLASS_DAMAGES_IN_OLY)
332
+			OlympiadDamageManager.loadConfig();
333
+		else
334
+			LOGGER.info("Game Server Info is disabled.");
335
+		
336
 		StringUtil.printSection("Skills");
337
 		SkillTable.getInstance();
338
 		SkillTreeData.getInstance();
339
diff --git a/java/net/sf/l2j/gameserver/data/manager/ClassDamageManager.java b/java/net/sf/l2j/gameserver/data/manager/ClassDamageManager.java
340
new file mode 100644
341
index 0000000..fa2966d
342
--- /dev/null
343
+++ b/java/net/sf/l2j/gameserver/data/manager/ClassDamageManager.java
344
@@ -0,0 +1,191 @@
345
+package net.sf.l2j.gameserver.data.manager;
346
+
347
+import java.io.File;
348
+import java.io.FileInputStream;
349
+import java.io.IOException;
350
+import java.io.InputStream;
351
+import java.util.Hashtable;
352
+import java.util.Properties;
353
+import java.util.Set;
354
+import java.util.logging.Logger;
355
+
356
+import net.sf.l2j.Config;
357
+import net.sf.l2j.gameserver.data.xml.PlayerData;
358
+import net.sf.l2j.gameserver.model.actor.Player;
359
+
360
+public class ClassDamageManager
361
+{
362
+	private static final Logger _log = Logger.getLogger(ClassDamageManager.class.getName());
363
+	private static Hashtable<Integer, Double> damage_to_mage = new Hashtable<>();
364
+	private static Hashtable<Integer, Double> damage_to_fighter = new Hashtable<>();
365
+	private static Hashtable<Integer, Double> damage_by_mage = new Hashtable<>();
366
+	private static Hashtable<Integer, Double> damage_by_fighter = new Hashtable<>();
367
+	private static Hashtable<Integer, String> id_to_name = new Hashtable<>();
368
+	private static Hashtable<String, Integer> name_to_id = new Hashtable<>();
369
+	public static void loadConfig()
370
+	{
371
+		String STATUS_FILE = "./config/CustomMods/Classes/ClassesDamages.ini";
372
+		@SuppressWarnings("resource")
373
+		InputStream is = null;
374
+		File file = null;
375
+		try
376
+		{
377
+			Properties scriptSetting = new Properties();
378
+			file = new File(STATUS_FILE);
379
+			is = new FileInputStream(file);
380
+			scriptSetting.load(is);
381
+			
382
+			Set<Object> key_set = scriptSetting.keySet();
383
+			for (Object key : key_set)
384
+			{
385
+				String key_string = (String) key;
386
+				
387
+				String[] class_and_type = key_string.split("__");
388
+				
389
+				String class_name = class_and_type[0].replace("_", " ");
390
+				if (class_name.equals("Eva s Saint"))
391
+				{
392
+					class_name = "Eva's Saint";
393
+				}
394
+				String type = class_and_type[1];
395
+				
396
+				Integer class_id = Integer.valueOf(PlayerData.getClassIdByName(class_name) - 1);
397
+				
398
+				id_to_name.put(class_id, class_name);
399
+				name_to_id.put(class_name, class_id);
400
+				if (type.equals("ToFighter"))
401
+				{
402
+					damage_to_fighter.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
403
+				}
404
+				else if (type.equals("ToMage"))
405
+				{
406
+					damage_to_mage.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
407
+				}
408
+				else if (type.equals("ByFighter"))
409
+				{
410
+					damage_by_fighter.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
411
+				}
412
+				else if (type.equals("ByMage"))
413
+				{
414
+					damage_by_mage.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
415
+				}
416
+			}
417
+			_log.info("Loaded " + id_to_name.size() + " classes Damages configurations");
418
+			return;
419
+		}
420
+		catch (Exception e)
421
+		{
422
+			e.printStackTrace();
423
+		}
424
+		finally
425
+		{
426
+			if (is != null)
427
+			{
428
+				try
429
+				{
430
+					is.close();
431
+				}
432
+				catch (IOException e)
433
+				{
434
+					e.printStackTrace();
435
+				}
436
+			}
437
+		}
438
+	}
439
+	
440
+	public static double getClassDamageToMage(int id)
441
+	{
442
+		Double multiplier = damage_to_mage.get(Integer.valueOf(id));
443
+		if (multiplier != null)
444
+		{
445
+			return multiplier.doubleValue();
446
+		}
447
+		return 1.0D;
448
+	}
449
+	
450
+	public static double getClassDamageToFighter(int id)
451
+	{
452
+		Double multiplier = damage_to_fighter.get(Integer.valueOf(id));
453
+		if (multiplier != null)
454
+		{
455
+			return multiplier.doubleValue();
456
+		}
457
+		return 1.0D;
458
+	}
459
+	
460
+	public static double getClassDamageByMage(int id)
461
+	{
462
+		Double multiplier = damage_by_mage.get(Integer.valueOf(id));
463
+		if (multiplier != null)
464
+		{
465
+			return multiplier.doubleValue();
466
+		}
467
+		return 1.0D;
468
+	}
469
+	
470
+	public static double getClassDamageByFighter(int id)
471
+	{
472
+		Double multiplier = damage_by_fighter.get(Integer.valueOf(id));
473
+		if (multiplier != null)
474
+		{
475
+			return multiplier.doubleValue();
476
+		}
477
+		return 1.0D;
478
+	}
479
+	
480
+	public static int getIdByName(String name)
481
+	{
482
+		Integer id = name_to_id.get(name);
483
+		if (id != null)
484
+		{
485
+			return id.intValue();
486
+		}
487
+		return 0;
488
+	}
489
+	
490
+	public static String getNameById(int id)
491
+	{
492
+		String name = id_to_name.get(Integer.valueOf(id));
493
+		if (name != null)
494
+		{
495
+			return name;
496
+		}
497
+		return "";
498
+	}
499
+	
500
+	public static double getDamageMultiplier(Player attacker, Player attacked)
501
+	{
502
+		if ((attacker == null) || (attacked == null))
503
+		{
504
+			return 1.0D;
505
+		}
506
+		double attackerMulti = 1.0D;
507
+		if (attacked.isMageClass())
508
+		{
509
+			attackerMulti = getClassDamageToMage(attacker.getClassId().getId());
510
+		}
511
+		else
512
+		{
513
+			attackerMulti = getClassDamageToFighter(attacker.getClassId().getId());
514
+		}
515
+		double attackedMulti = 1.0D;
516
+		if (attacker.isMageClass())
517
+		{
518
+			attackedMulti = getClassDamageByMage(attacked.getClassId().getId());
519
+		}
520
+		else
521
+		{
522
+			attackedMulti = getClassDamageByFighter(attacked.getClassId().getId());
523
+		}
524
+		double output = attackerMulti * attackedMulti;
525
+		if (Config.ENABLE_CLASS_DAMAGES_LOGGER)
526
+		{
527
+			_log.info("ClassDamageManager -");
528
+			_log.info("ClassDamageManager - Attacker: " + attacker.getName() + " Class: " + getNameById(attacker.getClassId().getId()) + " ClassId: " + attacker.getClassId().getId() + " isMage: " + attacker.isMageClass() + " mult: " + attackerMulti);
529
+			_log.info("ClassDamageManager - Attacked: " + attacked.getName() + " Class: " + getNameById(attacked.getClassId().getId()) + " ClassId: " + attacked.getClassId().getId() + " isMage: " + attacked.isMageClass() + " mult: " + attackedMulti);
530
+			_log.info("ClassDamageManager - FinalMultiplier: " + output);
531
+			_log.info("ClassDamageManager -");
532
+		}
533
+		return output;
534
+	}
535
+}
536
diff --git a/java/net/sf/l2j/gameserver/data/manager/OlympiadDamageManager.java b/java/net/sf/l2j/gameserver/data/manager/OlympiadDamageManager.java
537
new file mode 100644
538
index 0000000..274e5cf
539
--- /dev/null
540
+++ b/java/net/sf/l2j/gameserver/data/manager/OlympiadDamageManager.java
541
@@ -0,0 +1,192 @@
542
+package net.sf.l2j.gameserver.data.manager;
543
+
544
+import java.io.File;
545
+import java.io.FileInputStream;
546
+import java.io.IOException;
547
+import java.io.InputStream;
548
+import java.util.Hashtable;
549
+import java.util.Properties;
550
+import java.util.Set;
551
+import java.util.logging.Logger;
552
+
553
+import net.sf.l2j.Config;
554
+import net.sf.l2j.gameserver.data.xml.PlayerData;
555
+import net.sf.l2j.gameserver.model.actor.Player;
556
+
557
+public class OlympiadDamageManager
558
+{
559
+	private static final Logger _log = Logger.getLogger(OlympiadDamageManager.class.getName());
560
+	private static Hashtable<Integer, Double> damage_to_mage = new Hashtable<>();
561
+	private static Hashtable<Integer, Double> damage_to_fighter = new Hashtable<>();
562
+	private static Hashtable<Integer, Double> damage_by_mage = new Hashtable<>();
563
+	private static Hashtable<Integer, Double> damage_by_fighter = new Hashtable<>();
564
+	private static Hashtable<Integer, String> id_to_name = new Hashtable<>();
565
+	private static Hashtable<String, Integer> name_to_id = new Hashtable<>();
566
+	
567
+	public static void loadConfig()
568
+	{
569
+		String STATUS_FILE = "./config/CustomMods/Classes/ClassesDamagesOly.ini";
570
+		@SuppressWarnings("resource")
571
+		InputStream is = null;
572
+		File file = null;
573
+		try
574
+		{
575
+			Properties scriptSetting = new Properties();
576
+			file = new File(STATUS_FILE);
577
+			is = new FileInputStream(file);
578
+			scriptSetting.load(is);
579
+			
580
+			Set<Object> key_set = scriptSetting.keySet();
581
+			for (Object key : key_set)
582
+			{
583
+				String key_string = (String) key;
584
+				
585
+				String[] class_and_type = key_string.split("__");
586
+				
587
+				String class_name = class_and_type[0].replace("_", " ");
588
+				if (class_name.equals("Eva s Saint"))
589
+				{
590
+					class_name = "Eva's Saint";
591
+				}
592
+				String type = class_and_type[1];
593
+				
594
+				Integer class_id = Integer.valueOf(PlayerData.getClassIdByName(class_name) - 1);
595
+				
596
+				id_to_name.put(class_id, class_name);
597
+				name_to_id.put(class_name, class_id);
598
+				if (type.equals("ToFighter"))
599
+				{
600
+					damage_to_fighter.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
601
+				}
602
+				else if (type.equals("ToMage"))
603
+				{
604
+					damage_to_mage.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
605
+				}
606
+				else if (type.equals("ByFighter"))
607
+				{
608
+					damage_by_fighter.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
609
+				}
610
+				else if (type.equals("ByMage"))
611
+				{
612
+					damage_by_mage.put(class_id, Double.valueOf(Double.parseDouble(scriptSetting.getProperty(key_string))));
613
+				}
614
+			}
615
+			_log.info("Loaded " + id_to_name.size() + " Olympiad Damages configurations");
616
+			return;
617
+		}
618
+		catch (Exception e)
619
+		{
620
+			e.printStackTrace();
621
+		}
622
+		finally
623
+		{
624
+			if (is != null)
625
+			{
626
+				try
627
+				{
628
+					is.close();
629
+				}
630
+				catch (IOException e)
631
+				{
632
+					e.printStackTrace();
633
+				}
634
+			}
635
+		}
636
+	}
637
+	
638
+	public static double getClassDamageToMage(int id)
639
+	{
640
+		Double multiplier = damage_to_mage.get(Integer.valueOf(id));
641
+		if (multiplier != null)
642
+		{
643
+			return multiplier.doubleValue();
644
+		}
645
+		return 1.0D;
646
+	}
647
+	
648
+	public static double getClassDamageToFighter(int id)
649
+	{
650
+		Double multiplier = damage_to_fighter.get(Integer.valueOf(id));
651
+		if (multiplier != null)
652
+		{
653
+			return multiplier.doubleValue();
654
+		}
655
+		return 1.0D;
656
+	}
657
+	
658
+	public static double getClassDamageByMage(int id)
659
+	{
660
+		Double multiplier = damage_by_mage.get(Integer.valueOf(id));
661
+		if (multiplier != null)
662
+		{
663
+			return multiplier.doubleValue();
664
+		}
665
+		return 1.0D;
666
+	}
667
+	
668
+	public static double getClassDamageByFighter(int id)
669
+	{
670
+		Double multiplier = damage_by_fighter.get(Integer.valueOf(id));
671
+		if (multiplier != null)
672
+		{
673
+			return multiplier.doubleValue();
674
+		}
675
+		return 1.0D;
676
+	}
677
+	
678
+	public static int getIdByName(String name)
679
+	{
680
+		Integer id = name_to_id.get(name);
681
+		if (id != null)
682
+		{
683
+			return id.intValue();
684
+		}
685
+		return 0;
686
+	}
687
+	
688
+	public static String getNameById(int id)
689
+	{
690
+		String name = id_to_name.get(Integer.valueOf(id));
691
+		if (name != null)
692
+		{
693
+			return name;
694
+		}
695
+		return "";
696
+	}
697
+	
698
+	public static double getDamageMultiplier(Player attacker, Player attacked)
699
+	{
700
+		if ((attacker == null) || (attacked == null))
701
+		{
702
+			return 1.0D;
703
+		}
704
+		double attackerMulti = 1.0D;
705
+		if (attacked.isMageClass())
706
+		{
707
+			attackerMulti = getClassDamageToMage(attacker.getClassId().getId());
708
+		}
709
+		else
710
+		{
711
+			attackerMulti = getClassDamageToFighter(attacker.getClassId().getId());
712
+		}
713
+		double attackedMulti = 1.0D;
714
+		if (attacker.isMageClass())
715
+		{
716
+			attackedMulti = getClassDamageByMage(attacked.getClassId().getId());
717
+		}
718
+		else
719
+		{
720
+			attackedMulti = getClassDamageByFighter(attacked.getClassId().getId());
721
+		}
722
+		double output = attackerMulti * attackedMulti;
723
+		if (Config.ENABLE_CLASS_DAMAGES_LOGGER)
724
+		{
725
+			_log.info("ClassDamageManager -");
726
+			_log.info("ClassDamageManager - Attacker: " + attacker.getName() + " Class: " + getNameById(attacker.getClassId().getId()) + " ClassId: " + attacker.getClassId().getId() + " isMage: " + attacker.isMageClass() + " mult: " + attackerMulti);
727
+			_log.info("ClassDamageManager - Attacked: " + attacked.getName() + " Class: " + getNameById(attacked.getClassId().getId()) + " ClassId: " + attacked.getClassId().getId() + " isMage: " + attacked.isMageClass() + " mult: " + attackedMulti);
728
+			_log.info("ClassDamageManager - FinalMultiplier: " + output);
729
+			_log.info("ClassDamageManager -");
730
+		}
731
+		return output;
732
+	}
733
+}
734
diff --git a/java/net/sf/l2j/gameserver/data/xml/PlayerData.java b/java/net/sf/l2j/gameserver/data/xml/PlayerData.java
735
index ef70a32..5d7a71a 100644
736
--- a/java/net/sf/l2j/gameserver/data/xml/PlayerData.java
737
+++ b/java/net/sf/l2j/gameserver/data/xml/PlayerData.java
738
@@ -93,7 +93,141 @@
739
 	{
740
 		return SingletonHolder.INSTANCE;
741
 	}
742
-	
743
+	private static final String[] CHAR_CLASSES =
744
+	{
745
+		"Human Fighter",
746
+		"Warrior",
747
+		"Gladiator",
748
+		"Warlord",
749
+		"Human Knight",
750
+		"Paladin",
751
+		"Dark Avenger",
752
+		"Rogue",
753
+		"Treasure Hunter",
754
+		"Hawkeye",
755
+		"Human Mystic",
756
+		"Human Wizard",
757
+		"Sorceror",
758
+		"Necromancer",
759
+		"Warlock",
760
+		"Cleric",
761
+		"Bishop",
762
+		"Prophet",
763
+		"Elven Fighter",
764
+		"Elven Knight",
765
+		"Temple Knight",
766
+		"Swordsinger",
767
+		"Elven Scout",
768
+		"Plainswalker",
769
+		"Silver Ranger",
770
+		"Elven Mystic",
771
+		"Elven Wizard",
772
+		"Spellsinger",
773
+		"Elemental Summoner",
774
+		"Elven Oracle",
775
+		"Elven Elder",
776
+		"Dark Fighter",
777
+		"Palus Knight",
778
+		"Shillien Knight",
779
+		"Bladedancer",
780
+		"Assassin",
781
+		"Abyss Walker",
782
+		"Phantom Ranger",
783
+		"Dark Elven Mystic",
784
+		"Dark Elven Wizard",
785
+		"Spellhowler",
786
+		"Phantom Summoner",
787
+		"Shillien Oracle",
788
+		"Shillien Elder",
789
+		"Orc Fighter",
790
+		"Orc Raider",
791
+		"Destroyer",
792
+		"Orc Monk",
793
+		"Tyrant",
794
+		"Orc Mystic",
795
+		"Orc Shaman",
796
+		"Overlord",
797
+		"Warcryer",
798
+		"Dwarven Fighter",
799
+		"Dwarven Scavenger",
800
+		"Bounty Hunter",
801
+		"Dwarven Artisan",
802
+		"Warsmith",
803
+		"dummyEntry1",
804
+		"dummyEntry2",
805
+		"dummyEntry3",
806
+		"dummyEntry4",
807
+		"dummyEntry5",
808
+		"dummyEntry6",
809
+		"dummyEntry7",
810
+		"dummyEntry8",
811
+		"dummyEntry9",
812
+		"dummyEntry10",
813
+		"dummyEntry11",
814
+		"dummyEntry12",
815
+		"dummyEntry13",
816
+		"dummyEntry14",
817
+		"dummyEntry15",
818
+		"dummyEntry16",
819
+		"dummyEntry17",
820
+		"dummyEntry18",
821
+		"dummyEntry19",
822
+		"dummyEntry20",
823
+		"dummyEntry21",
824
+		"dummyEntry22",
825
+		"dummyEntry23",
826
+		"dummyEntry24",
827
+		"dummyEntry25",
828
+		"dummyEntry26",
829
+		"dummyEntry27",
830
+		"dummyEntry28",
831
+		"dummyEntry29",
832
+		"dummyEntry30",
833
+		"Duelist",
834
+		"DreadNought",
835
+		"Phoenix Knight",
836
+		"Hell Knight",
837
+		"Sagittarius",
838
+		"Adventurer",
839
+		"Archmage",
840
+		"Soultaker",
841
+		"Arcana Lord",
842
+		"Cardinal",
843
+		"Hierophant",
844
+		"Eva Templar",
845
+		"Sword Muse",
846
+		"Wind Rider",
847
+		"Moonlight Sentinel",
848
+		"Mystic Muse",
849
+		"Elemental Master",
850
+		"Eva's Saint",
851
+		"Shillien Templar",
852
+		"Spectral Dancer",
853
+		"Ghost Hunter",
854
+		"Ghost Sentinel",
855
+		"Storm Screamer",
856
+		"Spectral Master",
857
+		"Shillien Saint",
858
+		"Titan",
859
+		"Grand Khauatari",
860
+		"Dominator",
861
+		"Doomcryer",
862
+		"Fortune Seeker",
863
+		"Maestro"
864
+	};
865
+	public static final int getClassIdByName(String className)
866
+	{
867
+		int currId = 1;
868
+		for (String name : CHAR_CLASSES)
869
+		{
870
+			if (name.equalsIgnoreCase(className))
871
+			{
872
+				break;
873
+			}
874
+			currId++;
875
+		}
876
+		return currId;
877
+	}
878
 	private static class SingletonHolder
879
 	{
880
 		protected static final PlayerData INSTANCE = new PlayerData();
881
diff --git a/java/net/sf/l2j/gameserver/skills/Formulas.java b/java/net/sf/l2j/gameserver/skills/Formulas.java
882
index 82b3d77..1599ec6 100644
883
--- a/java/net/sf/l2j/gameserver/skills/Formulas.java
884
+++ b/java/net/sf/l2j/gameserver/skills/Formulas.java
885
@@ -8,6 +8,7 @@
886
 import net.sf.l2j.Config;
887
 import net.sf.l2j.gameserver.data.manager.CastleManager;
888
 import net.sf.l2j.gameserver.data.manager.ClanHallManager;
889
+import net.sf.l2j.gameserver.data.manager.ClassDamageManager;
890
 import net.sf.l2j.gameserver.data.manager.ZoneManager;
891
 import net.sf.l2j.gameserver.data.xml.PlayerLevelData;
892
 import net.sf.l2j.gameserver.enums.SiegeSide;
893
@@ -480,7 +481,7 @@
894
 		final double critVuln = target.getStatus().calcStat(Stats.CRIT_VULN, 1, target, skill);
895
 		final double daggerVuln = target.getStatus().calcStat(Stats.DAGGER_WPN_VULN, 1, target, null);
896
 		
897
-		final double damage = ((attackPower + skillPower) * critDamMul * rndMul * critDamPosMul * posMul * pvpMul * critVuln * daggerVuln + addCritPower) * ((isPvP) ? 70. : 77.) / defence;
898
+		double damage = ((attackPower + skillPower) * critDamMul * rndMul * critDamPosMul * posMul * pvpMul * critVuln * daggerVuln + addCritPower) * ((isPvP) ? 70. : 77.) / defence;
899
 		
900
 		if (Config.DEVELOPER)
901
 		{
902
@@ -491,6 +492,25 @@
903
 			LOGGER.info("Vulnerabilities: criticalVuln: {}, daggerVuln: {}", critVuln, daggerVuln);
904
 			LOGGER.info("Final blow damage: {}", damage);
905
 		}
906
+		if (Config.ENABLE_CLASS_DAMAGES && attacker instanceof Player && target instanceof Player)
907
+		{
908
+			
909
+			if (((Player) attacker).isInOlympiadMode() && ((Player) target).isInOlympiadMode())
910
+			{
911
+				
912
+				if (Config.ENABLE_CLASS_DAMAGES_IN_OLY)
913
+				{
914
+					damage = damage * ClassDamageManager.getDamageMultiplier((Player) attacker, (Player) target);
915
+				}
916
+				
917
+			}
918
+			else
919
+			{
920
+				
921
+				damage = damage * ClassDamageManager.getDamageMultiplier((Player) attacker, (Player) target);
922
+				
923
+			}
924
+		}
925
 		return Math.max(1, damage);
926
 	}
927
 	
928
@@ -586,7 +606,25 @@
929
 			else
930
 				damage *= attacker.getStatus().calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);
931
 		}
932
-		
933
+		if (Config.ENABLE_CLASS_DAMAGES && attacker instanceof Player && target instanceof Player)
934
+		{
935
+			
936
+			if (((Player) attacker).isInOlympiadMode() && ((Player) target).isInOlympiadMode())
937
+			{
938
+				
939
+				if (Config.ENABLE_CLASS_DAMAGES_IN_OLY)
940
+				{
941
+					damage = damage * ClassDamageManager.getDamageMultiplier((Player) attacker, (Player) target);
942
+				}
943
+				
944
+			}
945
+			else
946
+			{
947
+				
948
+				damage = damage * ClassDamageManager.getDamageMultiplier((Player) attacker, (Player) target);
949
+				
950
+			}
951
+		}
952
 		// Weapon elemental damages
953
 		damage += calcElemental(attacker, target, null);
954
 		
955
@@ -662,7 +700,25 @@
956
 			else
957
 				damage *= attacker.getStatus().calcStat(Stats.PVP_PHYS_SKILL_DMG, 1, null, null);
958
 		}
959
-		
960
+		if (Config.ENABLE_CLASS_DAMAGES && attacker instanceof Player && target instanceof Player)
961
+		{
962
+			
963
+			if (((Player) attacker).isInOlympiadMode() && ((Player) target).isInOlympiadMode())
964
+			{
965
+				
966
+				if (Config.ENABLE_CLASS_DAMAGES_IN_OLY)
967
+				{
968
+					damage = damage * ClassDamageManager.getDamageMultiplier((Player) attacker, (Player) target);
969
+				}
970
+				
971
+			}
972
+			else
973
+			{
974
+				
975
+				damage = damage * ClassDamageManager.getDamageMultiplier((Player) attacker, (Player) target);
976
+				
977
+			}
978
+		}
979
 		damage *= calcElemental(attacker, target, skill);
980
 		
981
 		return damage;
982